<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: kbd</title><link>https://news.ycombinator.com/user?id=kbd</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Thu, 23 Apr 2026 07:35:57 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=kbd" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by kbd in "Cherri – programming language that compiles to an Apple Shortuct"]]></title><description><![CDATA[
<p>What can you do on a Mac with Shortcuts vs AppleScript vs Hammerspoon?</p>
]]></description><pubDate>Mon, 30 Mar 2026 19:15:08 +0000</pubDate><link>https://news.ycombinator.com/item?id=47578493</link><dc:creator>kbd</dc:creator><comments>https://news.ycombinator.com/item?id=47578493</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47578493</guid></item><item><title><![CDATA[New comment by kbd in "Hammerspoon"]]></title><description><![CDATA[
<p>That's cool, I hadn't heard of Squint, thanks! Looks lightweight. Another compile-to-js option that seems good is Gleam.</p>
]]></description><pubDate>Tue, 17 Mar 2026 17:10:35 +0000</pubDate><link>https://news.ycombinator.com/item?id=47415489</link><dc:creator>kbd</dc:creator><comments>https://news.ycombinator.com/item?id=47415489</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47415489</guid></item><item><title><![CDATA[New comment by kbd in "Hammerspoon"]]></title><description><![CDATA[
<p>Hmm I already avoid Lua by writing in Fennel, I’ll probably avoid the JS by writing… what Lisp compiles to JS, ClojureScript?</p>
]]></description><pubDate>Sat, 14 Mar 2026 14:35:41 +0000</pubDate><link>https://news.ycombinator.com/item?id=47377128</link><dc:creator>kbd</dc:creator><comments>https://news.ycombinator.com/item?id=47377128</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47377128</guid></item><item><title><![CDATA[New comment by kbd in "How uv got so fast"]]></title><description><![CDATA[
<p>It's Rust vs Python in this case.</p>
]]></description><pubDate>Fri, 26 Dec 2025 20:38:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=46395980</link><dc:creator>kbd</dc:creator><comments>https://news.ycombinator.com/item?id=46395980</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46395980</guid></item><item><title><![CDATA[New comment by kbd in "iPhone Typos? It's Not Just You – The iOS Keyboard Is Broken [video]"]]></title><description><![CDATA[
<p>I type in Dvorak and frequently the iOS keyboard's <i>swipe</i> typing bugs out and acts as if the layout is in QWERTY. I kind of don't believe it will ever be fixed...</p>
]]></description><pubDate>Thu, 11 Dec 2025 22:33:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=46238236</link><dc:creator>kbd</dc:creator><comments>https://news.ycombinator.com/item?id=46238236</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46238236</guid></item><item><title><![CDATA[New comment by kbd in "Nimony (Nim 3.0) Design Principles"]]></title><description><![CDATA[
<p>When I was learning Nim and learned how imports work and that things stringify with a $ function that comes along with their types (since everything is splat imported) and $ is massively overloaded I went "oh that all makes sense and works together". The LSP can help figure it out. It still feels like it's in bad taste.<p>It's similar to how Ruby (which also has "unstructured" imports) and Python are similar in a lot of ways yet make many opposite choices. I think a lot of Ruby's choices are "wrong" even though they fit together within the language.</p>
]]></description><pubDate>Fri, 05 Dec 2025 17:38:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=46164523</link><dc:creator>kbd</dc:creator><comments>https://news.ycombinator.com/item?id=46164523</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46164523</guid></item><item><title><![CDATA[New comment by kbd in "Nimony (Nim 3.0) Design Principles"]]></title><description><![CDATA[
<p>The biggest thing I still don’t like about Nim is its imports:<p><pre><code>    import std/errorcodes

    proc p(x: int) {.raises.} =
      if x < 0:
        raise ErrorCode.RangeError
      use x
</code></pre>
I can’t stand that there’s no direct connection between the thing you import and the names that wind up in your namespace.</p>
]]></description><pubDate>Fri, 05 Dec 2025 13:01:54 +0000</pubDate><link>https://news.ycombinator.com/item?id=46160712</link><dc:creator>kbd</dc:creator><comments>https://news.ycombinator.com/item?id=46160712</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46160712</guid></item><item><title><![CDATA[New comment by kbd in "Zig's new plan for asynchronous programs"]]></title><description><![CDATA[
<p>Thanks for taking the time to respond. I will now think of Channels as queue + [mutex/communication guarantee] and not just queue. So in Go's <i>unbuffered</i> case (only?) a Channel is more than a 1-item queue. Also, in Go's select, I now get that channels themselves are hooked up to notify the select when they are ready?</p>
]]></description><pubDate>Wed, 03 Dec 2025 16:36:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=46136562</link><dc:creator>kbd</dc:creator><comments>https://news.ycombinator.com/item?id=46136562</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46136562</guid></item><item><title><![CDATA[New comment by kbd in "Zig's new plan for asynchronous programs"]]></title><description><![CDATA[
<p>> channels aren't futures and futures aren't channels.<p>In my mind a queue.getOne ~= a <- on a Go channel. Idk how you wrap the getOne call in a Future to hand it to Zig's select but that seems like it would be a straightforward pattern once this is all done.<p>I really do appreciate you being strict about the semantics. Tbh the biggest thing I feel fuzzy on in all this is how go/zig actually go about finding the first completed future in a select, but other than that am I missing something?<p><a href="https://ziglang.org/documentation/master/std/#std.Io.Queue.getOne" rel="nofollow">https://ziglang.org/documentation/master/std/#std.Io.Queue.g...</a></p>
]]></description><pubDate>Tue, 02 Dec 2025 20:12:53 +0000</pubDate><link>https://news.ycombinator.com/item?id=46126197</link><dc:creator>kbd</dc:creator><comments>https://news.ycombinator.com/item?id=46126197</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46126197</guid></item><item><title><![CDATA[New comment by kbd in "Zig's new plan for asynchronous programs"]]></title><description><![CDATA[
<p>>  I don't know enough Zig to know whether you can write a bit of code that says "either pull from this queue or that queue when they are ready"; if so, then yes they are an adequate replacement, if not, no they are not.<p>Thanks for giving me a reason to peek into how Zig does things now.<p>Zig has a generic select function[1] that works with futures. As is common, Blub's language feature is Zig's comptime function. Then the io implementation has a select function[2] that "Blocks until one of the futures from the list has a result ready, such that awaiting it will not block. Returns that index." and the generic select switches on that and returns the result. Details unclear tho.<p>[1] <a href="https://ziglang.org/documentation/master/std/#std.Io.select" rel="nofollow">https://ziglang.org/documentation/master/std/#std.Io.select</a><p>[2] <a href="https://ziglang.org/documentation/master/std/#std.Io.VTable" rel="nofollow">https://ziglang.org/documentation/master/std/#std.Io.VTable</a></p>
]]></description><pubDate>Tue, 02 Dec 2025 17:47:20 +0000</pubDate><link>https://news.ycombinator.com/item?id=46124047</link><dc:creator>kbd</dc:creator><comments>https://news.ycombinator.com/item?id=46124047</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46124047</guid></item><item><title><![CDATA[New comment by kbd in "Zig's new plan for asynchronous programs"]]></title><description><![CDATA[
<p>One of the harms Go has done is to make people think its concurrency model is at all special. “Goroutines” are green threads and a “channel” is just a thread-safe queue, which Zig has in its stdlib <a href="https://ziglang.org/documentation/master/std/#std.Io.Queue" rel="nofollow">https://ziglang.org/documentation/master/std/#std.Io.Queue</a></p>
]]></description><pubDate>Tue, 02 Dec 2025 15:34:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=46122237</link><dc:creator>kbd</dc:creator><comments>https://news.ycombinator.com/item?id=46122237</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46122237</guid></item><item><title><![CDATA[New comment by kbd in "Async/Await is finally back in Zig"]]></title><description><![CDATA[
<p>I wrote my shell prompt in Zig years ago in part because I was interested to use its async/await to run all the git calls in parallel for the git status. My prompt is still fast despite never having parallelized things -- slightly slower now after adding Jujutsu status -- but I'm looking forward to getting to do the thing I originally wanted and have my super fast shell prompt.<p>To speak to the Zig feature: as a junior I kept bugging the seniors about unit testing and how you were supposed to test things that did IO. An explanation of "functional core imperative shell" would have been helpful, but their answer was: "wrap everything in your own classes, pass them everywhere, and provide mocks for testing". This is effectively what Zig is doing at a language level.<p>It always seemed <i>wrong</i> to me to have to wrap your language's system libraries so that you could use them the "right way" that is testable. It actually turns out that all languages until Zig have simply done it wrong, and IO <i>should be</i> a parameter you pass to any code that needs it to interact with the outside world.</p>
]]></description><pubDate>Sat, 01 Nov 2025 16:44:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=45783127</link><dc:creator>kbd</dc:creator><comments>https://news.ycombinator.com/item?id=45783127</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45783127</guid></item><item><title><![CDATA[New comment by kbd in "Trump pardons convicted Binance founder"]]></title><description><![CDATA[
<p>It doesn't <i>really</i> matter who is more egregious, but IMO a country's leader pardoning <i>his own family members</i> is about as banana republic as it gets.</p>
]]></description><pubDate>Thu, 23 Oct 2025 21:22:05 +0000</pubDate><link>https://news.ycombinator.com/item?id=45687377</link><dc:creator>kbd</dc:creator><comments>https://news.ycombinator.com/item?id=45687377</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45687377</guid></item><item><title><![CDATA[New comment by kbd in "Trump pardons convicted Binance founder"]]></title><description><![CDATA[
<p>The pardon power has been so abused these past few administrations that it's clear there should be constitutional changes in the pardon power, either congressional review, or strip it altogether.</p>
]]></description><pubDate>Thu, 23 Oct 2025 20:56:56 +0000</pubDate><link>https://news.ycombinator.com/item?id=45687020</link><dc:creator>kbd</dc:creator><comments>https://news.ycombinator.com/item?id=45687020</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45687020</guid></item><item><title><![CDATA[New comment by kbd in "The macOS LC_COLLATE hunt: Or why does sort order differently on macOS and Linux (2020)"]]></title><description><![CDATA[
<p>In my Zsh startup on Mac I had to worry about collation, as I expected ~ to sort last (I have a directory prefixed with ~ to load plugins that need to be loaded last). Idk why a locale of utf-8 has it sorting differently, but I needed LC_COLLATE=C to have it sort as expected:<p><pre><code>    # source all shell config
    export LC_COLLATE=C # ensure consistent sort, ~ at end
    for file in ~/bin/shell/**/*.(z|)sh; do
      source "$file";
    done</code></pre></p>
]]></description><pubDate>Mon, 20 Oct 2025 02:00:11 +0000</pubDate><link>https://news.ycombinator.com/item?id=45639605</link><dc:creator>kbd</dc:creator><comments>https://news.ycombinator.com/item?id=45639605</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45639605</guid></item><item><title><![CDATA[New comment by kbd in "Python 3.14 is here. How fast is it?"]]></title><description><![CDATA[
<p>I was soo excited when they announced this, but I've heard almost nothing since.</p>
]]></description><pubDate>Fri, 10 Oct 2025 14:50:31 +0000</pubDate><link>https://news.ycombinator.com/item?id=45539733</link><dc:creator>kbd</dc:creator><comments>https://news.ycombinator.com/item?id=45539733</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45539733</guid></item><item><title><![CDATA[New comment by kbd in "Simple Hotkey Daemon for macOS, Ported to Zig"]]></title><description><![CDATA[
<p>I gave it a glance at some point but don’t see why I’d use it. It’s just some dude’s config. I have my caps lock rebound to a “hyper” key so every important thing is one key combo away.</p>
]]></description><pubDate>Sun, 05 Oct 2025 02:30:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=45478431</link><dc:creator>kbd</dc:creator><comments>https://news.ycombinator.com/item?id=45478431</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45478431</guid></item><item><title><![CDATA[New comment by kbd in "Simple Hotkey Daemon for macOS, Ported to Zig"]]></title><description><![CDATA[
<p>I wonder how much of my Hammerspoon config I could replace with this...<p>Edit: upon reflection, not much actually: <a href="https://github.com/kbd/setup/blob/2eaeaecf76c22be3ecef5c85632a75e1f9c6f0bb/HOME/.hammerspoon/init.fnl#L277" rel="nofollow">https://github.com/kbd/setup/blob/2eaeaecf76c22be3ecef5c8563...</a></p>
]]></description><pubDate>Fri, 03 Oct 2025 20:21:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=45467353</link><dc:creator>kbd</dc:creator><comments>https://news.ycombinator.com/item?id=45467353</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45467353</guid></item><item><title><![CDATA[New comment by kbd in "Better Curl Saul: a lightweight API testing CLI focused on UX and simplicity"]]></title><description><![CDATA[
<p>curlie has had the best balance of ergonomics and power of all the cli tools I've tried. It's full curl underneath but provides a nice ergonomics layer that matches tools like httpie. <a href="https://github.com/rs/curlie" rel="nofollow">https://github.com/rs/curlie</a></p>
]]></description><pubDate>Wed, 24 Sep 2025 19:14:11 +0000</pubDate><link>https://news.ycombinator.com/item?id=45364757</link><dc:creator>kbd</dc:creator><comments>https://news.ycombinator.com/item?id=45364757</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45364757</guid></item><item><title><![CDATA[New comment by kbd in "Apple's Software Quality Crisis"]]></title><description><![CDATA[
<p>Figure I’ll add my own obscure bug that’s never fixed. Apple finally released a Dvorak keyboard for iOS. Except a lot of times it bugs out and stays in QWERTY mode just for <i>swipe typing</i> even when you’re in the Dvorak layout.</p>
]]></description><pubDate>Tue, 04 Mar 2025 08:37:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=43251999</link><dc:creator>kbd</dc:creator><comments>https://news.ycombinator.com/item?id=43251999</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43251999</guid></item></channel></rss>