<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>Wed, 09 Sep 2026 20:57:20 +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 "Terpstra Keyboard"]]></title><description><![CDATA[
<p>> oh, it seems that the lumatone is the commercialized version essentially<p>From the same makers or others?<p>On the website I can find no info whether this project is concluded or not.</p>
]]></description><pubDate>Sun, 06 Sep 2026 08:13:19 +0000</pubDate><link>https://news.ycombinator.com/item?id=49584358</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=49584358</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49584358</guid></item><item><title><![CDATA[New comment by nh2 in "The creator of Jujutsu has joined ERSC"]]></title><description><![CDATA[
<p>Thanks, the animation is gone now and the problems are gone as well.<p>Good choice in my opinion, as I hadn't even noticed the animation existed until I looked for something that might make the scrolling slow.</p>
]]></description><pubDate>Wed, 02 Sep 2026 09:11:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=49533747</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=49533747</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49533747</guid></item><item><title><![CDATA[New comment by nh2 in "The creator of Jujutsu has joined ERSC"]]></title><description><![CDATA[
<p>This website has unbearable scroll performance on mobile.<p>Is it the animation at the top?</p>
]]></description><pubDate>Tue, 01 Sep 2026 21:04:44 +0000</pubDate><link>https://news.ycombinator.com/item?id=49528182</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=49528182</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49528182</guid></item><item><title><![CDATA[New comment by nh2 in "Stripe said to abandon $50B pursuit of PayPal"]]></title><description><![CDATA[
<p>Justified fear. A former flat mate of mine reported an unexpected outgoing transfer to his UK bank and they blocked his account for 3 months. He was essentially unbanked. He had to pay his rent in cash after getting it from an ATM with a credit card (which cost a lot extra and hit limits). Resolving it took months even though we lived right next to a branch of that bank, where he went every day.</p>
]]></description><pubDate>Fri, 28 Aug 2026 09:03:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=49476165</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=49476165</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49476165</guid></item><item><title><![CDATA[New comment by nh2 in "We found a division by zero bug in FFmpeg with a vibecoded fuzzer"]]></title><description><![CDATA[
<p>In Haskell they are a little less annoying. It is just easier to reason about (including proving) pure functions.</p>
]]></description><pubDate>Thu, 27 Aug 2026 22:19:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=49472038</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=49472038</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49472038</guid></item><item><title><![CDATA[New comment by nh2 in "Maiao: Gerrit-style code review workflow for GitHub, GitLab, Gitea, others"]]></title><description><![CDATA[
<p>Code review tools should really compare with reviewable.io, which supports proper review of every-commit in a PR, with force pushes, making sure all changes get read, and comment sign-off and disposition, making sure no comment remains unaddressed.<p>In contrast to Gerrit and Phabricator, it needs not "Change IDs" inserted in your commits (easier workflow just using git) and "just works" to review whole branches.<p>It seems to me that "1 PR = 1 commit = 1 review" and "stacked PRs" workflows are just workarounds for not properly having implemented that as Reviewable has. Am I not seeing something?<p>Reviewable's main drawback is being for Github only and not open source.</p>
]]></description><pubDate>Wed, 26 Aug 2026 09:37:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=49446235</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=49446235</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49446235</guid></item><item><title><![CDATA[New comment by nh2 in "Malicious Rust crate Arrayref runs a build-time payload"]]></title><description><![CDATA[
<p>You have just reinvented "Safe Haskell" from 2012.<p>It guarantees that pure functions are pure.<p><a href="https://www.microsoft.com/en-us/research/publication/safe-haskell/" rel="nofollow">https://www.microsoft.com/en-us/research/publication/safe-ha...</a><p><a href="https://downloads.haskell.org/ghc/latest/docs/users_guide/exts/safe_haskell.html" rel="nofollow">https://downloads.haskell.org/ghc/latest/docs/users_guide/ex...</a></p>
]]></description><pubDate>Fri, 21 Aug 2026 12:03:50 +0000</pubDate><link>https://news.ycombinator.com/item?id=49386836</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=49386836</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49386836</guid></item><item><title><![CDATA[New comment by nh2 in "Stripe to Buy OpenRouter for $7B"]]></title><description><![CDATA[
<p>> Within certain limits and certain models<p>For those that hadn't read yet (on <a href="https://aws.amazon.com/service-terms/" rel="nofollow">https://aws.amazon.com/service-terms/</a>):<p>"Certain models" means "only AWS's own trained models" (Nova etc), so not e.g. Bedrock Claude or GPT.<p>"Certain limits" means they don't defent if the input to the model is the IP.</p>
]]></description><pubDate>Wed, 19 Aug 2026 21:13:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=49367289</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=49367289</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49367289</guid></item><item><title><![CDATA[New comment by nh2 in "A Preview of DuckDB v2.0"]]></title><description><![CDATA[
<p>If you merge PRs that have commit mesages like this, it's easy to arrive at 10000 commits in 6 months:<p><pre><code>    rename to NodePointer instead
    format
    Revert "format"
    Revert "rename to NodePointer instead"
    rename to OptionalNodePtr
    woops
    update comment
    slot renames
    more renames
</code></pre>
Source: <a href="https://github.com/duckdb/duckdb/pull/23605" rel="nofollow">https://github.com/duckdb/duckdb/pull/23605</a><p>If every Ctrl+S is a commit, it'll go up fast.<p>"woops"!</p>
]]></description><pubDate>Tue, 18 Aug 2026 00:03:31 +0000</pubDate><link>https://news.ycombinator.com/item?id=49339406</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=49339406</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49339406</guid></item><item><title><![CDATA[New comment by nh2 in "Self hosted email continues to steeply decline"]]></title><description><![CDATA[
<p>I agree Spam is the hardest. Setting up a mailserver is pretty easy today, e.g. with NixOS-simple-mailserver you can do it with a few lines and a few minutes of config in your DNS provider, and maintenance is minimal.<p>But I self-host email for ~20 years, and I have not managed to get rid of Spam without not also getting false positives.<p>I first used SpamAssistant, in later years Rspamd, but I feel like they are just not good enough. Also I find Rspamd config pretty incomprehensible.<p>Hosted email like also does not solve this, e.g. GMail filters way much (e.g. important company correspondence leading to orders almost being lost because they landed in our GMail spam, so I had to turn off the spam filter entirely).</p>
]]></description><pubDate>Mon, 17 Aug 2026 12:32:02 +0000</pubDate><link>https://news.ycombinator.com/item?id=49329810</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=49329810</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49329810</guid></item><item><title><![CDATA[New comment by nh2 in "Self hosted email continues to steeply decline"]]></title><description><![CDATA[
<p>Not in my experience.<p>My self-hosted email filters too little spam, while GMail etc filter too much (e.g. important company correspondence leading to orders almost being lost because they landed in our GMail spam).</p>
]]></description><pubDate>Mon, 17 Aug 2026 12:23:41 +0000</pubDate><link>https://news.ycombinator.com/item?id=49329723</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=49329723</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49329723</guid></item><item><title><![CDATA[New comment by nh2 in "Delta"]]></title><description><![CDATA[
<p>Are you sure you aren't off by 20 years and referring to "Archon Mode" introduced to Starcraft 2 in 2015?<p><a href="https://news.blizzard.com/en-us/article/19940901/teaming-up-exploring-archon-mode" rel="nofollow">https://news.blizzard.com/en-us/article/19940901/teaming-up-...</a></p>
]]></description><pubDate>Thu, 13 Aug 2026 02:38:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=49281209</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=49281209</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49281209</guid></item><item><title><![CDATA[New comment by nh2 in "Zig's Incremental Compilation Internals"]]></title><description><![CDATA[
<p>Can you point at what you mean?<p>If you changed a function implementation in the libc crate, not changing that function's signature, how much codegen would happen in downstream packages?<p>The maximally recompilation-avoiding effect would be: Only that one function gets codegenned. Everything else just gets relinked into their final executable or .so.</p>
]]></description><pubDate>Thu, 30 Jul 2026 11:58:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=49108817</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=49108817</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49108817</guid></item><item><title><![CDATA[New comment by nh2 in "Zig's Incremental Compilation Internals"]]></title><description><![CDATA[
<p>10 years ago, I commented on the Rust issue for "Incremental recompilation", where it was suggested that Rust could at least adopt Haskell GHC's model of incrementality, which is currently file-level:<p><a href="https://github.com/rust-lang/rust/issues/2369#issuecomment-128857193" rel="nofollow">https://github.com/rust-lang/rust/issues/2369#issuecomment-1...</a><p>This would already help a lot.<p>I recommend anybody who's interested in incremental recompilation to read what GHC does, because the effort to achieve that is relatively low.<p>Of course there's always desire for more:<p>GHC currently needs to parse+typecheck+codegen a file before it can process other files that import it. Codegen is slow. Thus, there's currently demand split compilation into "stages", so that the next file can be typechecked after its imports have been just typechecked (not codegenned).<p>I would also enjoy if recompilation avoidance were to happen at the function level, not the file level.<p>Macro systems are a key language feature that can destroy incremental recompilation. In theory, Haskell is well set up for that, as its macro system (TemplateHaskell) is fully AST based and _theoretically_ could distinguish "fully pure" macros from side-effectful macros (such as splicing the current git commit in as a string literal). But the recompilation avoidance system does not currently exploit such differences.</p>
]]></description><pubDate>Tue, 28 Jul 2026 17:10:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=49086956</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=49086956</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49086956</guid></item><item><title><![CDATA[New comment by nh2 in "Decathlon Germany adds Wero payment option to decathlon.de website"]]></title><description><![CDATA[
<p>Im a German with a German Postbank account, living in Switzerland.<p>Wero app Play Store page: "This item isn't available in your country."<p>Hard to cheer for a thing when it prevents you to access your own money, and promises to "easily pay" immediately fall flat.<p>Paypal is bad but at least it doesn't fail at step 0.</p>
]]></description><pubDate>Mon, 27 Jul 2026 19:45:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=49074672</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=49074672</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49074672</guid></item><item><title><![CDATA[New comment by nh2 in "Claude Opus 5"]]></title><description><![CDATA[
<p>I can confirm that within the first hour of using Opus 5, I already had to call out made-up PR URLs:<p><pre><code>    I made that PR number up — I have no evidence a PR `2492` exists.
    That was a fabrication and I should not have written it.
</code></pre>
No judgment so far on whether it does that _more_ than Opus 4.8, though.</p>
]]></description><pubDate>Sat, 25 Jul 2026 16:12:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=49048842</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=49048842</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49048842</guid></item><item><title><![CDATA[New comment by nh2 in "Android May Soon Restrict On-Device ADB"]]></title><description><![CDATA[
<p>Wise in the UK currently is good. You can use it completely  without a phone app.
It also has good support for passkeys, TOTP, and SMS OTP, allowing to add multiple of each as it should be. If you do choose the Wise app, it currently warns when you run a custom Android ROM, but let's you use it.<p>Our company also uses Revolut business, but that requires a phone app to verify online payments with cards. And Revolut recently changed the app so it now requires Google Play Integrity so it doesn't work with LineageOS anymore. So I'm looking to move all new things away from Revolut. I have little patience with companies that want to unbank my company, and decide what hardware or software we use.</p>
]]></description><pubDate>Sat, 25 Jul 2026 12:27:25 +0000</pubDate><link>https://news.ycombinator.com/item?id=49047030</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=49047030</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49047030</guid></item><item><title><![CDATA[New comment by nh2 in "Job queues are deceptively tricky"]]></title><description><![CDATA[
<p>The UNIX pipe has the (for many systems) undesirable negative property of losing data in the pipe when the receiving process terminates: Anything in the kernel buffer of the pipe gets lost.<p>Since the pipe is generally unidirectional, the sending process has no way of knowing whether the receiving process has received, or even more successfully processed, anything sent. For that, one needs to make a pipe in the opposite direction and that is not as easy anymore; it also requires building your own protocol to identify and acknowledge sent work items.</p>
]]></description><pubDate>Thu, 16 Jul 2026 12:55:23 +0000</pubDate><link>https://news.ycombinator.com/item?id=48933820</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=48933820</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48933820</guid></item><item><title><![CDATA[New comment by nh2 in "After 7 years in production, Scarf has reluctantly moved away from Haskell"]]></title><description><![CDATA[
<p>Another side remark:<p>LLMs removed some of the difficulty of Haskell, e.g. some interesting ideas to make things safer with sophisticated types or mechanisms like TemplateHaskell are now MUCH easier to implement in a few minutes. Also Haskell's general stance of breaking backwards compat in fundamental places if it's needed to make the language better, thus causing moderate amounds of upgrade grind, completely evaporated as a drawback because LLMs are extremely good at fixing type errors to bring code up to date with the latest changes.<p>The LLMs are very good at explaining Haskell compile errors.<p>Learning Haskell and maintaining projects in it is now easier than ever.</p>
]]></description><pubDate>Sat, 11 Jul 2026 05:21:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=48869004</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=48869004</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48869004</guid></item><item><title><![CDATA[New comment by nh2 in "After 7 years in production, Scarf has reluctantly moved away from Haskell"]]></title><description><![CDATA[
<p>Hey, we have a 10 year old Haskell/Python/C++/TypeScript/Nix codebase, and use all of them regularly.<p>Haskell compiles slowly, but we have not found that to significantly inhibit AI-supported dev so far. We use ghci with `-fobject-code`, and our largest leaf module (10k lines of webserver request handlers) takes 8 seconds to `:reload`. To run stuff in it, the agent pipes `:reload`, or other invocations, into `ghci`.<p>Working on parts parts that are early in the module chain, such as our Prelude, makes the whole-project `:reload` take 50 seconds. Much of that could be avoided if we didn't suffer from the TH recompilation problem (<a href="https://gist.github.com/nh2/14e653bcbdc7f40042da3755539e554a" rel="nofollow">https://gist.github.com/nh2/14e653bcbdc7f40042da3755539e554a</a>). Originally I made a small GHC patch to hack that out (what this conservative recompilation protects from cannot happen in our project), which made the reload much faster, but the logic was changed in recent GHC so that doesn't work anymore.<p>In C++, we have some individual files (and thus compilation units) that take 45 seconds to compile.<p>Python is of course the fastest to (build+run). However, Python also has some problems with repeated runs: Once you have many imports, just starting the program (e.g. `--help`) takes ~2 seconds resolving imports. Do `import pytorch`, add another 2 seconds. For repeated runs, this can be a pain; Haskell and C++ are much faster for that, so they win when you don't have to change the code but repeatedly use already-compiled tools in a different way.<p>In all 3 languages, getting things to typecheck is very fast, because the agent directly reads the vscode LSP typechecking errors which are < 1s feedback. Claude Opus 4.6-4.8 understand all 3 languages very well.<p>I agree that GHC devs should focus most of their efforts on compile speed, and real-world pain solving. Some parts of that are indeed being done (e.g. newest GHC can write bytecode to disk to make the above workflow much faster, and codegen is by far the slowest part of compilation). But I think the focus should be <i>even more</i> on that. I consider most important and unsolved:<p><pre><code>    * solving Generics being slow to compile, especially for types with many constructors
    * solving deriving classes being slow to compile
    * solving TemplateHaskell causing too much recompilation
    * doing staged compilation,
      so that the next module can typecheck as soon as its imports are typechecked,
      as opposed to waiting that codegen is done;
      this unlocks a large amount of parallel work availability
</code></pre>
All of these have open GHC tickets that I think should be the highest focus.<p>Other real-world production things are being solved quite nicely currently:<p><pre><code>    * The new Haskell debugger
    * Much better stacktraces
    * Much better runtime introspection to debug runtime hangs etc
</code></pre>
I get your general point that if iteration speed (as in change code + run, 100s of times a day) is your highest value, Python does quite well. We intentionally chose Python for the part of the codebase that's relatively simple data importing but from 50 different sources, count growing adding new sources all the time, and need just quickly iterate on each until we got it.<p>But I find it would not be a great language for the other parts. Its concurrency story is bad, its interpreter is very slow and immediately disqualifies Python when you need to do e.g. a line of code for every 1000 Bytes (say for streaming small data chunks), typing is very useful but bolted-on and not always correct.<p>Things where Haskell remains best-in-class is anything nontrivial-webservers, I/O, program correctness, the main "general purpose" programming, refactoring and long-term maintainability.</p>
]]></description><pubDate>Sat, 11 Jul 2026 05:19:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=48868992</link><dc:creator>nh2</dc:creator><comments>https://news.ycombinator.com/item?id=48868992</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48868992</guid></item></channel></rss>