<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: nh2</title><link>https://news.ycombinator.com/user?id=nh2</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Thu, 29 Oct 2026 02:41:33 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=nh2" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by nh2 in "Someone behind the software"]]></title><description><![CDATA[
<p>> caring for design, and the user<p>Yet <a href="https://linear.app/Homepage" rel="nofollow">https://linear.app/Homepage</a> doesn't scroll without jank on mobile.</p>
]]></description><pubDate>Sun, 18 Oct 2026 18:12:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=50143728</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=50143728</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50143728</guid></item><item><title><![CDATA[New comment by nh2 in "Passkeys are a trap"]]></title><description><![CDATA[
<p>Among<p><pre><code>    Copyable vs Non-Copyable passkeys
    Transferable vs Non-Transferable passkeys
    Hardware-Backed vs Software-Backed passkeys
    User-Present vs Non-User-Present passkeys
    User-Verified vs Non-User-Verified passkeys
    Attested vs Non-Attested passkeys
</code></pre>
They forgot<p><pre><code>    Roaming vs Platform passkeys
</code></pre>
(roughly: movable vs device-bound).<p>This is what e.g. PayPal uses to prevent you from using your Yubikey as a passkey, while it works perfectly as a passkey on other providers (e.g. Wise bank)<p>It's checkable in the browser with e.g.:
`await PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable()`</p>
]]></description><pubDate>Fri, 16 Oct 2026 16:13:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=50120241</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=50120241</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50120241</guid></item><item><title><![CDATA[New comment by nh2 in "Comparing Chromium Development at Google and Igalia"]]></title><description><![CDATA[
<p>> I'm betting the Linux kernel actually tests their config combinations.<p>What makes you bet that?<p>As far as I know, the kernel doesn't have any official CI. People test as they feel like it. Some people/companies build some CI initiatives, others don't use them.<p><a href="https://lwn.net/Articles/972713/" rel="nofollow">https://lwn.net/Articles/972713/</a><p>Also the kernel has > 10000 Kconfig options. Somebody told me that 2^64 is a lot, and that 2^10000 is a lot more.</p>
]]></description><pubDate>Fri, 16 Oct 2026 09:52:35 +0000</pubDate><link>https://news.ycombinator.com/item?id=50116338</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=50116338</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50116338</guid></item><item><title><![CDATA[New comment by nh2 in "Redesigning source control at Anthropic"]]></title><description><![CDATA[
<p>I'd be interested in a blog post on what those problems are.<p>There are lots of cases of "we wrote our own X, here's how it works", but rarely the concrete internal knowledge shared about what existing Xs can't do and why.<p>When the motivation stops at "look, the naive thing wouldn't work" even before the "normal" thing everybody does (fetch), it leaves many open questions to which you probably have an answer already.</p>
]]></description><pubDate>Thu, 15 Oct 2026 09:43:23 +0000</pubDate><link>https://news.ycombinator.com/item?id=50101352</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=50101352</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50101352</guid></item><item><title><![CDATA[New comment by nh2 in "Passkeys are not a trap"]]></title><description><![CDATA[
<p>> for a tech-stupid person<p>> password doesn't show up you know there's a problem<p>Here is your contradiction.<p>The normal person will just assume that some tech isn't working today again.<p>A key point of passkeys seems to be that it guarantees to the site owner that the user cannot be phished, without having to make assumptions on whether the user is tech-stupid.</p>
]]></description><pubDate>Thu, 15 Oct 2026 01:42:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=50098095</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=50098095</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50098095</guid></item><item><title><![CDATA[New comment by nh2 in "Gemini 4 Argon for Robotics"]]></title><description><![CDATA[
<p>Put stones into a desktop PC until it weighs 30kg and drop it from 1.20 m height while its running, onto your parquet, a couple times, I guess, to know if you and whoever lives with or below you is up to robotics testing?</p>
]]></description><pubDate>Wed, 14 Oct 2026 00:01:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=50080666</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=50080666</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50080666</guid></item><item><title><![CDATA[New comment by nh2 in "Redesigning source control at Anthropic"]]></title><description><![CDATA[
<p>Makes sense. I wasn't suggesting that one should do a shallow clone though. If your company repo is 100 GB, it seems sensible to keep it cached locally on each machine once (100 GB isn't large for current NVMe disks), and `git fetch` the updates the normal way. Then checkouts don't fetch anything large.</p>
]]></description><pubDate>Tue, 13 Oct 2026 21:22:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=50078966</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=50078966</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50078966</guid></item><item><title><![CDATA[New comment by nh2 in "Redesigning source control at Anthropic"]]></title><description><![CDATA[
<p>No, of course not.<p>As the article explains, "over 600 PB" = 25M code checkouts * 25 GB "compressed working copy".<p>So "fetched naively" here means doing a full `git clone` on every need for `git checkout`, which of course nobody should do, nor does that refer to "code that needs changing daily".</p>
]]></description><pubDate>Tue, 13 Oct 2026 17:55:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=50075855</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=50075855</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50075855</guid></item><item><title><![CDATA[New comment by nh2 in "Making big downloads resumable in Firefox"]]></title><description><![CDATA[
<p>Pretty sure TCP is only linearly worsened by latency.</p>
]]></description><pubDate>Tue, 13 Oct 2026 11:15:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=50069872</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=50069872</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50069872</guid></item><item><title><![CDATA[New comment by nh2 in "Bitwarden Dual License Model"]]></title><description><![CDATA[
<p>For me, RSS 35 MB, SHR 23 MB. The vaultwarden executable is 38 MB (typical Rust executable that links Rust code statically, and only dynamically links libssl.so  and libc.so dynamically).<p>So probably its RSS usage is just mostly its own executable code?</p>
]]></description><pubDate>Sat, 10 Oct 2026 19:27:11 +0000</pubDate><link>https://news.ycombinator.com/item?id=50036276</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=50036276</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50036276</guid></item><item><title><![CDATA[New comment by nh2 in "No Man Is an Island"]]></title><description><![CDATA[
<p>Indeed in a weird way, one can also argue that this state is the ultimate copyleft.<p>If anybody can create any software anytime, everybody gets a lot of the Four Freedoms of Free Software (change it to make it do what you wish, distribute your modified version, etc), without even "having the source".<p>And all the programmers constantly feeding their new code into training is the contorted version of GPL'ing it.</p>
]]></description><pubDate>Fri, 09 Oct 2026 22:29:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=50027381</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=50027381</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50027381</guid></item><item><title><![CDATA[New comment by nh2 in "Making a GTK application in Haskell, part 1"]]></title><description><![CDATA[
<p>"better time" = the syntax highlighting is gone and the code is no longer monospace?<p>Anyway, the website seems to be fixed now, nice!</p>
]]></description><pubDate>Tue, 06 Oct 2026 00:09:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=49972490</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=49972490</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49972490</guid></item><item><title><![CDATA[New comment by nh2 in "Testing 12 different Zigbee temperature/humidity sensors"]]></title><description><![CDATA[
<p>> you absolutely must press the pairing button on the sensor first to wake it up before sending the new reporting configuration. Sending the payload while the device is asleep just gets ignored<p>This stuff is still so user unfriendly.<p>Why cannot the software just save the desired setting to set it when the device comes online next?
I feel like many things in zigbee2mqtt are like that: I click something, it fires off some message and it often isn't clear if that worked, if it'll work later, and so on.</p>
]]></description><pubDate>Tue, 06 Oct 2026 00:04:40 +0000</pubDate><link>https://news.ycombinator.com/item?id=49972447</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=49972447</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49972447</guid></item><item><title><![CDATA[New comment by nh2 in "Mold Linker Version 3.0.0 Release – Rewritten in Rust"]]></title><description><![CDATA[
<p>What _is_ your threat model?<p>If you can boostrap one version of stagex (so that its mold is trustworthy), I don't see why you can't use that to build another version of stagex.<p>As you say, you can rely on the cached binary because nothing in the old version's supply chain would change; it is pinned, and as long as you can build that, everything is fine.</p>
]]></description><pubDate>Mon, 05 Oct 2026 21:28:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=49971064</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=49971064</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49971064</guid></item><item><title><![CDATA[New comment by nh2 in "Making a GTK application in Haskell, part 1"]]></title><description><![CDATA[
<p>Indeed the scrolling performance is awful, makes reading it less enjoyable, especially when the topic is GUIs!</p>
]]></description><pubDate>Mon, 05 Oct 2026 17:05:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=49967483</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=49967483</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49967483</guid></item><item><title><![CDATA[New comment by nh2 in "Deutsche Bahn "joke" is no longer funny"]]></title><description><![CDATA[
<p>Just go to <a href="https://delaybahn.com/en" rel="nofollow">https://delaybahn.com/en</a> and build your opinion on the data.<p><a href="https://delaybahn.com/en/?fromId=A%3D1%40O%3DK%C3%B6ln+Hbf%40L%3D8000207%40&from=K%C3%B6ln+Hbf&toId=A%3D1%40O%3DM%C3%BCnchen+Hbf%40L%3D8098263%40&to=M%C3%BCnchen+Hbf&date=2026-09-29&time=14%3A02&window=30" rel="nofollow">https://delaybahn.com/en/?fromId=A%3D1%40O%3DK%C3%B6ln+Hbf%4...</a><p>Click the "+30 min (28/30 days)" tags to see the delays of the last month.</p>
]]></description><pubDate>Tue, 29 Sep 2026 01:10:40 +0000</pubDate><link>https://news.ycombinator.com/item?id=49886742</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=49886742</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49886742</guid></item><item><title><![CDATA[New comment by nh2 in "Go Concurrency Distilled"]]></title><description><![CDATA[
<p>I haven't found a Go concurrency thing yet that hasn't long-existed in Haskell before.<p>I also find Haskell's concurrency in practice much easier to reason about than Go's, let me do a pitch:<p>In Haskell you can just fork a thread and block till it's done. Threaded, "async" logic just looks like blocking serial code (but isn't blocking). I feel like in typical channel-based Go code I have to jump and scroll a lot in the code because of all the message-passing instead of block-scoped "blocking-style" variable use, and that this makes it hard to conclude whether the whole thing terminates or deadlocks.<p>In Haskell, channels are considered low-level concurrency primitives you should only use when you have no clean high-level primitives for it. This is because they are not "structured" concurrency: When you send something into a channel, it is gone out of your scope, and you now need to track in your brain where it is, and who should consume that thing in the right way ("message-passing").<p>For example, in Stolon, a high-availability Postgres orchestrator written in Go (<a href="https://github.com/sorintlab/stolon" rel="nofollow">https://github.com/sorintlab/stolon</a>), I found the logic for failover with multiple channels and various timeouts very difficult to reason about when investigating failover bugs. I'm pretty sure that would read much easier in Haskell (see below how).<p>In Haskell, you can start 2, or N, things in parallel, and easily wait till they are done. You can invoke parallel `map` easily.<p><pre><code>    results <- mapConcurrently f mylist
</code></pre>
If f throws on any element, the whole map throws, and other threads get cancelled automatically as expected.<p>You can get bounded, steaming parallelism, easily.<p>You can set time limits to function calls writing<p><pre><code>    timeout 1000 (myIoFunction ...)
</code></pre>
You can cancel any thread or computation, at any time. The same timeout function can cancel blocking IO operations, such as reading from the terminal or sockets, without having pass around `Context` objects like in Go (which, if you forget it, just makes things hang or deadlock).<p>You wrap the 2 words "timeout 1000" around your function and done.<p>Concurrency _composes_ in Haskell. You can write<p><pre><code>    res :: Maybe (Maybe a) < timeout a (timeout b (myIoFunction ...))
</code></pre>
and the returned type tells you cleanly at which level the cancellation occured (no mixing into the same `error` type.<p>You can build trees of parallel operations that live and die together.<p>And there are no data races (because mutability is a very explicit thing), and I'm not even mentioning STM here (which allows you to do database-style transactions across variables) because that's already pointed out in another post.<p>As a composed example, in Haskell you can write:<p><pre><code>    timeout 1000 (race (downloadUrl ...) (forever (putStrLn "Still loading ...")))
</code></pre>
and that will do exactly what you think it should, with correct Ctrl+C cancellability, and good developer ergonomics.<p>If you enjoy concurrency, give Haskell a shot!</p>
]]></description><pubDate>Sun, 27 Sep 2026 12:05:23 +0000</pubDate><link>https://news.ycombinator.com/item?id=49865959</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=49865959</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49865959</guid></item><item><title><![CDATA[New comment by nh2 in "Go Concurrency Distilled"]]></title><description><![CDATA[
<p>Haskell had preemptive M:N green-threading before Go was invented.<p>I believe Go didn't originally have it, and added it in 2020, 14 years after Haskell.</p>
]]></description><pubDate>Sun, 27 Sep 2026 10:56:20 +0000</pubDate><link>https://news.ycombinator.com/item?id=49865534</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=49865534</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49865534</guid></item><item><title><![CDATA[New comment by nh2 in "Evolving programming languages in the AI era"]]></title><description><![CDATA[
<p>Please do the world a favour:<p>> integer literals become i32, float literals become f32<p>Don't use the shitty small sizes that have introduced countless bugs over the last decades, as a language default.<p>Especially if you care about correctness.<p>i32 is all over the examples.<p>Use 64 bits, like Python and Haskell; even JavaScript and thus TypeScript got floats right defaulting to f64.</p>
]]></description><pubDate>Sun, 27 Sep 2026 10:31:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=49865381</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=49865381</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49865381</guid></item><item><title><![CDATA[New comment by nh2 in "PipePipe: NewPipe hard fork implementing SponsorBlock"]]></title><description><![CDATA[
<p>> Set a sleep timer for bedtime listening<p>Killer feature!</p>
]]></description><pubDate>Sat, 26 Sep 2026 18:07:36 +0000</pubDate><link>https://news.ycombinator.com/item?id=49859018</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=49859018</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49859018</guid></item></channel></rss>