<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: chriswarbo</title><link>https://news.ycombinator.com/user?id=chriswarbo</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Fri, 03 Jul 2026 10:12:31 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=chriswarbo" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by chriswarbo in "Ask HN: What is your opinion on TUI applications"]]></title><description><![CDATA[
<p>I tend to run all my terminals in Emacs, which TUIs tend to interfere with (e.g. providing their own keybindings which clash with those of Emacs; providing their own panes/scrollbars/etc. which don't have any of the functionality that Emacs provides; etc.).<p>I'd much rather have application functionality provided by a CLI, over stdin and stdout; and have Emacs provide its TUI-like layer on top.<p>I don't <i>mind</i> short-lived TUIs, like config wizards; but would still prefer a CLI that prints a few lines to stdout and reads text from stdin; rather than curses-like things that attempt to print whole "screens" at a time, and are driven by a mess of control characters and internal state.<p>The worst ones are those that (a) want to live for a long time, and (b) hammer the terminal with updates despite no user interaction taking place. These AI agent TUIs tend to be the most obnoxious; e.g. having a bunch of "spinners", which would traditionally be placed at the end and updated using backspace, but for some reason these AI companies have implemented by redrawing the entire screen, based on some HTML/DOM/React layout algorithm; with the result being a whole bunch of CPU & RAM spent, and a headache from staring at the flickering mess it draws.</p>
]]></description><pubDate>Wed, 24 Jun 2026 16:27:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=48662255</link><dc:creator>chriswarbo</dc:creator><comments>https://news.ycombinator.com/item?id=48662255</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48662255</guid></item><item><title><![CDATA[Ask HN: How to avoid LLMs struggling with Lisp parens?]]></title><description><![CDATA[
<p>LLMs seem to love certain languages (Python, Bash, etc.), but they all seem to struggle with Lisp (e.g. Racket or Emacs Lisp). I've tried various iterations of Claude, as well as cheaper models like DeepSeekV4, etc. and the pattern is the same: they'll make a few successful edits, but eventually they'll get some parentheses slightly wrong, then spiral into madness as they attempt to fix the syntax errors by counting and matching-up parentheses "manually" in a never-ending loop.<p>This is frustrating for two reasons:<p>Firstly, LLMs are famously bad at counting characters (e.g. the number of "r"s in "strawberry"), so it's no wonder this approach of generating and counting characters doesn't work very well.<p>Secondly, balancing parentheses is <i>trivial</i> for traditional, non-LLM algorithms; so it feels like an entirely avoidable problem (without resorting to larger, more-expensive models).<p>Is anyone using LLMs successfully on Lispy projects? If so, what workflows, tooling, etc. have you found to work well? I've tried guiding them to use Emacs `check-parens` rather than counting "manually"; but maybe inferring from indentation might work better? Perhaps tree-based generation/tools would avoid introducing such problems in the first place?</p>
<hr>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=48657691">https://news.ycombinator.com/item?id=48657691</a></p>
<p>Points: 4</p>
<p># Comments: 2</p>
]]></description><pubDate>Wed, 24 Jun 2026 10:22:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=48657691</link><dc:creator>chriswarbo</dc:creator><comments>https://news.ycombinator.com/item?id=48657691</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48657691</guid></item><item><title><![CDATA[New comment by chriswarbo in "What was nice about the UI of Windows 2000"]]></title><description><![CDATA[
<p>> I think the slider would be recognized as a toggle in its usual context of a settings screen by most people who have seen a settings screen before, but not that specific design for a toggle.<p>I've been using computers since the early 90s; we got our first home computer when I was four; I've used many different operating systems.<p>As a professional Web developer, it took me an embarrassingly long time to figure out what those slider widgets are supposed to mean. It's still very easy to get them wrong/confused (both as a user, and as the designer/dev making the form), e.g. when the affirmative state involves a negative setting, like "Mute" (does "on" mean "muted"; or does "on" refer to the audio, which I can use this to mute?)</p>
]]></description><pubDate>Thu, 18 Jun 2026 16:34:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=48587928</link><dc:creator>chriswarbo</dc:creator><comments>https://news.ycombinator.com/item?id=48587928</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48587928</guid></item><item><title><![CDATA[New comment by chriswarbo in "What was nice about the UI of Windows 2000"]]></title><description><![CDATA[
<p>> In Windows 95, those toolbar icons were still actual buttons. In Windows 2000, they are recognizable as a button when activated, but in their default state they're not and you have to hover over them:<p>This is something I've struggled with as toolkits change and old widget themes stop working. There are still some decent themes out there (e.g. Skulpture for Qt has been my default for many years), and with a little patching they can be dragged into working on the latest toolkit versions. Yet I can't seem to avoid this "you have to hover over to see that it's actually a button" behaviour. Very annoying!</p>
]]></description><pubDate>Thu, 18 Jun 2026 16:21:26 +0000</pubDate><link>https://news.ycombinator.com/item?id=48587752</link><dc:creator>chriswarbo</dc:creator><comments>https://news.ycombinator.com/item?id=48587752</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48587752</guid></item><item><title><![CDATA[New comment by chriswarbo in "The forge we deserve"]]></title><description><![CDATA[
<p>I've switched my git projects to push their objects into IPFS and their refs to pkkarr. That feels more distributed than the sorts of HTTP servers mentioned in TFA.<p>Anybody who cares about my repos potentially disappearing can contribute to their hosting by re-providing those repos from their own machines. (Note that only someone with the private key can create <i>new</i> records for a pkarr address).<p>That's mostly a side-benefit though: I mostly wanted something I can `git push` and `git pull`, that is self-hosted, and self-organises across a bunch of underpowered machines with unreliable network connections, with minimal coordination.</p>
]]></description><pubDate>Thu, 18 Jun 2026 11:59:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=48584026</link><dc:creator>chriswarbo</dc:creator><comments>https://news.ycombinator.com/item?id=48584026</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48584026</guid></item><item><title><![CDATA[New comment by chriswarbo in "SpaceX to buy Cursor for $60B"]]></title><description><![CDATA[
<p>> the same principles apply to US dollars<p>Currencies are a little different, since they are required to pay taxes; and payment of taxes is enforced (to varying degrees) by state violence.<p>Hence if you believe you will be taxed ("death and taxes" being the only certainties in life, etc.) then the currency associated with that tax has value, in that it avoids imprisonment, etc.</p>
]]></description><pubDate>Tue, 16 Jun 2026 16:21:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=48557701</link><dc:creator>chriswarbo</dc:creator><comments>https://news.ycombinator.com/item?id=48557701</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48557701</guid></item><item><title><![CDATA[New comment by chriswarbo in "Claude Fable is relentlessly proactive"]]></title><description><![CDATA[
<p>> Isn't Not Just Bikes some US expat/biking maximalist?<p>According to their videos, they prefer trams within cities; generally take trains between cities; and acknowledge that cars are very useful for places which aren't so well connected (e.g. places that are far apart which aren't on a train line). They think encouraging the use of cars within cities is a bad idea (dangerous, scales poorly, makes those areas less pleasant to be, etc.).<p>Not what I'd think of as a "biking maximalist".<p>They do show themselves cycling to places that are nearby. Does that make Youtubers who record videos in their car "driving maximalists"?</p>
]]></description><pubDate>Fri, 12 Jun 2026 10:57:00 +0000</pubDate><link>https://news.ycombinator.com/item?id=48502460</link><dc:creator>chriswarbo</dc:creator><comments>https://news.ycombinator.com/item?id=48502460</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48502460</guid></item><item><title><![CDATA[New comment by chriswarbo in "Test-case reducers are underappreciated debugging tools"]]></title><description><![CDATA[
<p>> I didn't want to read a whole ton of text and C code details<p>There's no C in there? It seems to be Python and shell scripts.</p>
]]></description><pubDate>Wed, 10 Jun 2026 10:23:39 +0000</pubDate><link>https://news.ycombinator.com/item?id=48474152</link><dc:creator>chriswarbo</dc:creator><comments>https://news.ycombinator.com/item?id=48474152</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48474152</guid></item><item><title><![CDATA[New comment by chriswarbo in "Age verification for social media, the beginning of the end for a free internet?"]]></title><description><![CDATA[
<p>I don't have any answers or strong opinions yet, but I feel like the legal/societal conversation should focus on "actions taken via XYZ" rather than "technology underlying XYZ". Similar to how GDPR, etc. cover actions like collection/storage of personal information, not specific technologies like cookies (despite what many believe!).<p>In particular, your examples bring these things to mind, which might be worth considering alongside:<p>- Any machine can host a server, with no third-party required except an ISP (if we're being pedantic, even that's not needed if use a mesh network, etc.). The main barrier to connectivity IME is NAT, but there are ways around that (e.g. make it a .onion service). I played with all of the above as a teenager, so it's not unrealistic.<p>- "Hosting a website" covers a lot of things, some of which are already illegal (e.g. CSAM). Just because we <i>can</i> spin up something without jumping through social media sign-up hoops, doesn't mean it can't/shouldn't be subject to legal questions.<p>- Hosting a website/blog/etc. does not come with the same questionable baggage as social media (algorithmic feeds, PII, tracking, identity verification, communication, etc.). We might <i>opt in</i> to such things, e.g. by accepting comments on posts, but I'd distinguish such two-way, "user generated" activity from merely "hosting a website". Technologically, such things require some dynamic system (usually a self-hosted or third-party backend), rather than "just" a static HTML server.<p>- There is no <i>technological</i> difference between a blog used like a personal diary, and a blog used to post reviews of Lego. Is there a <i>societal</i> difference? What about if they include photos?<p>- Posting things on a personal website/blog has an implicit understanding that it's being published and shared with the world (that feels like the whole point of a blog). Social media has muddied those waters, by claiming things like "privacy settings", which can give the impression that posts are <i>not</i> being published and shared with the world.<p>- When it comes to activities like receiving comments, two-way communication, unsolicited messages from anonymous strangers, etc. the more relevant "basic tech" feels like running a server for email, IRC, Jabber, etc. rather than a web site; since those place such "dangerous" aspects front-and-centre. Email is the most obvious, but I mention the others since getting external systems to trust a self-hosted email server is notoriously tricky!</p>
]]></description><pubDate>Tue, 02 Jun 2026 11:39:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=48368915</link><dc:creator>chriswarbo</dc:creator><comments>https://news.ycombinator.com/item?id=48368915</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48368915</guid></item><item><title><![CDATA[New comment by chriswarbo in "Local Git remotes"]]></title><description><![CDATA[
<p>> btw, Git also supports the HTTP protocol ...<p>In fact, Git supports <i>any</i> protocol! If you add a git remote like<p><pre><code>    git remote add my-remote my-super-duper-protocol::some-sort-of-address-thingy
</code></pre>
Then pushing/pulling `my-remote` will try to invoke a command called `git-remote-my-super-duper-protocol`, with `some-sort-of-address-thingy` in its arguments. You can implement that however you like.<p>I use remotes like "pkipfs::y5a9inx61aski4miz4sgmg55qgbazxhfwab3i6ee1ypa6rnumi8o", which invokes a custom git-remote-pkipfs command that pushes/pulls object data to IPFS and resolves/updates refs as subdomains of a specified pkarr address.</p>
]]></description><pubDate>Fri, 29 May 2026 17:10:25 +0000</pubDate><link>https://news.ycombinator.com/item?id=48326129</link><dc:creator>chriswarbo</dc:creator><comments>https://news.ycombinator.com/item?id=48326129</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48326129</guid></item><item><title><![CDATA[New comment by chriswarbo in "Fixing a 20-year-old bug in Enlightenment E16"]]></title><description><![CDATA[
<p>Whenever I try something else, I always seem to keep going back to E16. Back in the day, it worked well in Gnome 2.x; these days I tend to use it in XFCE, but it feels a bit less integrated.</p>
]]></description><pubDate>Wed, 15 Apr 2026 09:29:08 +0000</pubDate><link>https://news.ycombinator.com/item?id=47776707</link><dc:creator>chriswarbo</dc:creator><comments>https://news.ycombinator.com/item?id=47776707</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47776707</guid></item><item><title><![CDATA[New comment by chriswarbo in "jj – the CLI for Jujutsu"]]></title><description><![CDATA[
<p>Exactly the same thing happened when git showed up (alongside the same things for bzr, darcs, hg, etc. too!)</p>
]]></description><pubDate>Tue, 14 Apr 2026 16:28:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=47767772</link><dc:creator>chriswarbo</dc:creator><comments>https://news.ycombinator.com/item?id=47767772</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47767772</guid></item><item><title><![CDATA[New comment by chriswarbo in "jj – the CLI for Jujutsu"]]></title><description><![CDATA[
<p><a href="https://git-scm.com/docs/git-worktree" rel="nofollow">https://git-scm.com/docs/git-worktree</a></p>
]]></description><pubDate>Tue, 14 Apr 2026 16:18:35 +0000</pubDate><link>https://news.ycombinator.com/item?id=47767626</link><dc:creator>chriswarbo</dc:creator><comments>https://news.ycombinator.com/item?id=47767626</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47767626</guid></item><item><title><![CDATA[New comment by chriswarbo in "jj – the CLI for Jujutsu"]]></title><description><![CDATA[
<p>I suppose it depends what you mean by "horribly break things".<p>The only thing I've noticed is that `jj` will leave the git repo with either a detached HEAD, or with a funny `@` ref checked out.<p>I don't think that would trouble someone who's experienced with git and knows its "DAG of commits" model.<p>For someone who's less experienced, or only uses git for a set of branches with mostly linear history (like a sort of "fancy undo"), I could imagine getting a shock when trying to `git commit` and not seeing them on any of the branches!</p>
]]></description><pubDate>Tue, 14 Apr 2026 16:17:26 +0000</pubDate><link>https://news.ycombinator.com/item?id=47767613</link><dc:creator>chriswarbo</dc:creator><comments>https://news.ycombinator.com/item?id=47767613</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47767613</guid></item><item><title><![CDATA[New comment by chriswarbo in "jj – the CLI for Jujutsu"]]></title><description><![CDATA[
<p>> It wants me to start with the new and describe command<p>jj doesn't "want" anything.<p>I always <i>end</i> a piece of work with `new`: it puts an empty, description-less commit as the checked-out HEAD, and is my way of saying "I'm finished with those changes (for now); any subsequent changes to this directory should go in this (currently empty) commit"<p>The last thing I do to a commit, once all of its contents have settled into something reasonable, is describe it.<p>In fact, I mostly use `commit` (pressing `C` in majutsu), which combines those two things: it gives the current commit a description, and creates a new empty commit on top.</p>
]]></description><pubDate>Tue, 14 Apr 2026 15:59:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=47767389</link><dc:creator>chriswarbo</dc:creator><comments>https://news.ycombinator.com/item?id=47767389</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47767389</guid></item><item><title><![CDATA[New comment by chriswarbo in "jj – the CLI for Jujutsu"]]></title><description><![CDATA[
<p>> I often find that in the process of making one change, I have also made several other changes, and only recognize that they are distinct after following the ideas to their natural conclusion.<p>I do that all the time. With git, everything starts "unstaged", so I'd use magit to selectively stage some parts and turn those into a sequence of commits, one on top of another.<p>With jj I'd do it "backwards": everything starts off committed (with no commit message), so I'd open the diff (`D` in majutsu), selecting some parts and "split" (`S` in majutsu) to put those into a new commit <i>underneath</i> the remaining changes. Once the different changes are split into separate commits, I'd give each a relevant commit message.</p>
]]></description><pubDate>Tue, 14 Apr 2026 15:51:25 +0000</pubDate><link>https://news.ycombinator.com/item?id=47767267</link><dc:creator>chriswarbo</dc:creator><comments>https://news.ycombinator.com/item?id=47767267</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47767267</guid></item><item><title><![CDATA[New comment by chriswarbo in "More on Version Control"]]></title><description><![CDATA[
<p>Tooling can support both (e.g. don't assume all hashes have the length of a SHA1, etc.); but they can't be used together <i>in one repo</i>.</p>
]]></description><pubDate>Mon, 30 Mar 2026 15:26:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=47575530</link><dc:creator>chriswarbo</dc:creator><comments>https://news.ycombinator.com/item?id=47575530</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47575530</guid></item><item><title><![CDATA[New comment by chriswarbo in "Two studies in compiler optimisations"]]></title><description><![CDATA[
<p>Haskell has a package to make testing this sort of thing easier <a href="https://hackage.haskell.org/package/inspection-testing" rel="nofollow">https://hackage.haskell.org/package/inspection-testing</a></p>
]]></description><pubDate>Thu, 26 Mar 2026 13:25:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=47530190</link><dc:creator>chriswarbo</dc:creator><comments>https://news.ycombinator.com/item?id=47530190</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47530190</guid></item><item><title><![CDATA[New comment by chriswarbo in "Shell Tricks That Make Life Easier (and Save Your Sanity)"]]></title><description><![CDATA[
<p>Pipelines are usually built up step by step: we run some vague, general thing (e.g. a `find` command); the output looks sort of right, but needs to be narrowed down or processed further, so we press Up to get the previous command back, and add a pipe to the end. We run that, then add something else; and so on.<p>Now let's say the output looks wrong; e.g. we get nothing out. Weird, the previous command looked right, and it doesn't seem to be a problem with the filter we just put on the end. Maybe the filter we added part-way-through was discarding too much, so that the things we actually wanted weren't reaching the later stages; we didn't notice, because everything was being drowned-out by irrelevant stuff that that our latest filter has just gotten rid of.<p>Tricks like this `\#` let us turn off that earlier filter, without affecting anything else, so we can see if it was causing the problem as we suspect.<p>As for more general "why use CLI?", that's been debated for decades already; if you care to look it up :-)</p>
]]></description><pubDate>Thu, 26 Mar 2026 13:03:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=47529942</link><dc:creator>chriswarbo</dc:creator><comments>https://news.ycombinator.com/item?id=47529942</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47529942</guid></item><item><title><![CDATA[New comment by chriswarbo in "Shell Tricks That Make Life Easier (and Save Your Sanity)"]]></title><description><![CDATA[
<p>I'm confused; how is writing a shell command (using shortcuts like those in the article!) "wasting time", but describing what you want to an LLM, having it make a plan, reading the plan, editing it, and running it is somehow <i>not</i> a waste of time?<p>You also mention there being "little value", when your proposed approach costs literal money in form of API/token usage (when using hosted models).<p>> Now I've moved to coding in Haskell<p>You might like <a href="https://hackage.haskell.org/package/turtle" rel="nofollow">https://hackage.haskell.org/package/turtle</a> or <a href="http://nellardo.com/lang/haskell/hash/" rel="nofollow">http://nellardo.com/lang/haskell/hash/</a></p>
]]></description><pubDate>Thu, 26 Mar 2026 11:33:54 +0000</pubDate><link>https://news.ycombinator.com/item?id=47529209</link><dc:creator>chriswarbo</dc:creator><comments>https://news.ycombinator.com/item?id=47529209</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47529209</guid></item></channel></rss>