<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: chrismorgan</title><link>https://news.ycombinator.com/user?id=chrismorgan</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Tue, 21 Apr 2026 10:56:23 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=chrismorgan" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by chrismorgan in "Six Levels of Dark Mode (2024)"]]></title><description><![CDATA[
<p>> <i>Dedicated files make sense if you do a lot of customization. The browser may ignore any CSS file that does not match the query, so there’ll be one less thing to download.</i><p>That’s not how it actually works: in practice, browsers download them all. They may prioritise them differently, but they’ll still download them all in the end.</p>
]]></description><pubDate>Mon, 20 Apr 2026 01:49:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=47829482</link><dc:creator>chrismorgan</dc:creator><comments>https://news.ycombinator.com/item?id=47829482</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47829482</guid></item><item><title><![CDATA[New comment by chrismorgan in "IETF draft-meow-mrrp-00"]]></title><description><![CDATA[
<p><a href="https://f.matdoes.dev/notice/B5MVd4KD0Oh5Rfwaoq" rel="nofollow">https://f.matdoes.dev/notice/B5MVd4KD0Oh5Rfwaoq</a>:<p>> <i>i wrote an internet standard <a href="https://www.ietf.org/archive/id/draft-meow-mrrp-00.html" rel="nofollow">https://www.ietf.org/archive/id/draft-meow-mrrp-00.html</a> (it's published on ietf.org so you know it's real and official and endorsed by the ietf)</i><p>Sounds like a reaction to the IPv8 draft, pointing out that anyone can publish anything there and it means nothing.</p>
]]></description><pubDate>Fri, 17 Apr 2026 16:30:26 +0000</pubDate><link>https://news.ycombinator.com/item?id=47807704</link><dc:creator>chrismorgan</dc:creator><comments>https://news.ycombinator.com/item?id=47807704</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47807704</guid></item><item><title><![CDATA[New comment by chrismorgan in "Discourse Is Not Going Closed Source"]]></title><description><![CDATA[
<p>Framing a business decision as a security imperative sure sounds like intent to mislead to me.</p>
]]></description><pubDate>Fri, 17 Apr 2026 05:06:20 +0000</pubDate><link>https://news.ycombinator.com/item?id=47802608</link><dc:creator>chrismorgan</dc:creator><comments>https://news.ycombinator.com/item?id=47802608</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47802608</guid></item><item><title><![CDATA[New comment by chrismorgan in "Discourse Is Not Going Closed Source"]]></title><description><![CDATA[
<p>> <i>I want to be fair to Cal.com here, because I don’t think they’re acting in bad faith. I just think the security argument is a convenient frame for decisions that are actually about something else. […] Framing a business decision as a security imperative does a disservice to the open-source ecosystem that helped Cal.com get to where they are.</i><p>That sure sounds like bad faith to me.</p>
]]></description><pubDate>Fri, 17 Apr 2026 04:15:17 +0000</pubDate><link>https://news.ycombinator.com/item?id=47802403</link><dc:creator>chrismorgan</dc:creator><comments>https://news.ycombinator.com/item?id=47802403</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47802403</guid></item><item><title><![CDATA[New comment by chrismorgan in "Discourse Is Not Going Closed Source"]]></title><description><![CDATA[
<p>> <i>Large parts of it are delivered straight into the user’s browser on every request: JavaScript, …</i><p>Ooh, now I want to try convincing people to return from JS-heavy single-page apps to multi-page apps using normal HTML forms and minimal JS only to enhance what already works without it—in the name of <i>security</i>.<p>(C’mon, let a bloke <i>dream</i>.)</p>
]]></description><pubDate>Fri, 17 Apr 2026 04:11:50 +0000</pubDate><link>https://news.ycombinator.com/item?id=47802387</link><dc:creator>chrismorgan</dc:creator><comments>https://news.ycombinator.com/item?id=47802387</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47802387</guid></item><item><title><![CDATA[New comment by chrismorgan in "Six Characters"]]></title><description><![CDATA[
<p>Also not mentioned, they’re not unique across time: six base-36 characters is only 2 billion possibilities, wouldn’t surprise me if the largest GDS would blow through the entire space within a year. <<a href="https://support.travelport.com/webhelp/smartpointcloud/Content/Learn/16History/RetrievePast.htm#:~:text=A%20booking,been%20purged%2E" rel="nofollow">https://support.travelport.com/webhelp/smartpointcloud/Conte...</a>> suggests they get purged after a week, and recycled.<p>I wonder what fraction of the space is occupied at any given time.</p>
]]></description><pubDate>Thu, 16 Apr 2026 16:57:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=47796259</link><dc:creator>chrismorgan</dc:creator><comments>https://news.ycombinator.com/item?id=47796259</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47796259</guid></item><item><title><![CDATA[New comment by chrismorgan in "Do you even need a database?"]]></title><description><![CDATA[
<p>> <i>The index format is simple: one line per record, exactly 58 bytes: <36-char UUID>:<20-digit byte offset in data file>\n.</i><p>It would be much better to write all of this as binary data, omitting separators.<p>• Since it’s fixed-width and simple, inspecting the data is still pretty easy—there are tools for working with binary data of declared schema, or you could write a few-liner to convert it yourself. You don’t lose much by departing ASCII.<p>• You <i>might</i> want to complicate it a little by writing a version tag at the start of the file or outside it so you can change the format more easily (e.g. if you ever add a third column). I will admit the explicit separators do make that easier. You can also leave that for later, it probably won’t hurt.<p>• UUID: 36 bytes → 16 bytes.<p>• Offset: 20 bytes (zero-padded base-ten integer) → 8 bytes.<p>• It removes one type of error altogether: now all bit patterns are syntactically valid.<p>• It’ll use less disk space, be cheaper to read, be cheaper to write, and probably take less code.<p>I also want to register alarm at the sample code given for func FindUserBinarySearch. To begin with, despite a return type of (*User, error), it always returns nil error—it swallows all I/O errors and ignores JSON decode errors. Then:<p><pre><code>  entryID := strings.TrimRight(string(buf[:36]), " ")
</code></pre>
That strings.TrimRight will only do anything if your data is corrupted.<p><pre><code>  cmp := strings.Compare(entryID, id)
</code></pre>
Not important when you control the writing, but worth noting that UUID string comparison is case-insensitive.<p><pre><code>  offsetStr := strings.TrimLeft(string(buf[37:57]), "0")
</code></pre>
Superfluous. ParseInt doesn’t mind leading zeroes, and it’ll probably skip them faster than a separate TrimLeft call.<p><pre><code>  dataOffset, _ := strconv.ParseInt(offsetStr, 10, 64)
</code></pre>
That’s <i>begging</i> to make data corruption difficult to debug. Most corruption will now become dataOffset 0. Congratulations! You are now root.</p>
]]></description><pubDate>Thu, 16 Apr 2026 02:58:54 +0000</pubDate><link>https://news.ycombinator.com/item?id=47788121</link><dc:creator>chrismorgan</dc:creator><comments>https://news.ycombinator.com/item?id=47788121</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47788121</guid></item><item><title><![CDATA[New comment by chrismorgan in "Servo is now available on crates.io"]]></title><description><![CDATA[
<p>Linux (GNU/Linux or whatever) doesn’t even have the <i>concept</i> of a system web view. The closest you might get to the notion is probably WebKitGTK which is perhaps the <i>GNOME</i> idea of a system web view, but it’s nothing like WebKit on macOS or WebView2 (or MSHTML in the past) on Windows for popularity or availability.<p>As a user of a desktop environment other than gnome-shell, I only have webkitgtk-6.0 installed because I chose to install Epiphany—it’s a good proxy for testing on Safari, which Apple makes ridiculously expensive.</p>
]]></description><pubDate>Mon, 13 Apr 2026 15:07:57 +0000</pubDate><link>https://news.ycombinator.com/item?id=47753117</link><dc:creator>chrismorgan</dc:creator><comments>https://news.ycombinator.com/item?id=47753117</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47753117</guid></item><item><title><![CDATA[New comment by chrismorgan in "I run multiple $10K MRR companies on a $20/month tech stack"]]></title><description><![CDATA[
<p>The context was explicitly <i>single machine</i>.</p>
]]></description><pubDate>Sun, 12 Apr 2026 17:55:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=47742468</link><dc:creator>chrismorgan</dc:creator><comments>https://news.ycombinator.com/item?id=47742468</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47742468</guid></item><item><title><![CDATA[New comment by chrismorgan in "I run multiple $10K MRR companies on a $20/month tech stack"]]></title><description><![CDATA[
<p>Python will take you a long way, but its ceiling (both typical and absolute) is <i>far</i> lower than the likes of Go and Rust. For typical implementations, the difference may be a factor of ten. For careful implementations (of both), it can be a lot more than that.<p>Does the difference matter? You must decide that.<p>As for your dismissing SQLite: please justify why it’s a bad idea. Because I strongly disagree.</p>
]]></description><pubDate>Sun, 12 Apr 2026 07:49:25 +0000</pubDate><link>https://news.ycombinator.com/item?id=47737060</link><dc:creator>chrismorgan</dc:creator><comments>https://news.ycombinator.com/item?id=47737060</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47737060</guid></item><item><title><![CDATA[New comment by chrismorgan in "A compelling title that is cryptic enough to get you to take action on it"]]></title><description><![CDATA[
<p>Which in this case will be a complaint about the preposterously large font-size, and will be <i>warranted</i> iff the author is in the thread.</p>
]]></description><pubDate>Sat, 11 Apr 2026 09:31:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=47729041</link><dc:creator>chrismorgan</dc:creator><comments>https://news.ycombinator.com/item?id=47729041</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47729041</guid></item><item><title><![CDATA[New comment by chrismorgan in "Helium is hard to replace"]]></title><description><![CDATA[
<p>The historical and religious context:<p>1. While approaching the land, the Amalekites had attacked them, preying on the weak. God had said that they would be destroyed. Now, probably partly as a test for their first king (he failed, <i>didn’t</i> eradicate them), God said, get on and do it.<p>2. God had promised the land to Abraham and his descendants, but said they’d only get it in four hundred years’ time, because “the iniquity of the Amorites is not yet complete”—they still had time to choose God’s ways. Only once they were irredeemable were they to be destroyed.</p>
]]></description><pubDate>Sat, 11 Apr 2026 03:57:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=47727223</link><dc:creator>chrismorgan</dc:creator><comments>https://news.ycombinator.com/item?id=47727223</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47727223</guid></item><item><title><![CDATA[New comment by chrismorgan in "Tell HN: Anthropic no longer allowing Claude Code subscriptions to use OpenClaw"]]></title><description><![CDATA[
<p>On your 1.5Mbps link, you could theoretically download 500GB per month. A huge amount, but I believe it was often genuinely allowed, because their uplinks could cope with it. Unlimited could genuinely be unlimited.<p>But now you might get things like “unlimited” 1Gbps… which reverts to 10Mbps (1% speed) or worse after 3.6TB (eight hours). And so your new theoretical maximum is about 6.8TB per month rather than 330TB.</p>
]]></description><pubDate>Sat, 04 Apr 2026 09:33:24 +0000</pubDate><link>https://news.ycombinator.com/item?id=47637446</link><dc:creator>chrismorgan</dc:creator><comments>https://news.ycombinator.com/item?id=47637446</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47637446</guid></item><item><title><![CDATA[New comment by chrismorgan in "Proton Meet Isn't What They Told You It Was"]]></title><description><![CDATA[
<p>You need mechanisms to <i>avoid</i> the possibility. The mechanisms to <i>do</i> such things exist by default, by both the software provider (e.g. Proton) and the software distributor (e.g. Apple for App Store, Google for Play Store, Cloudflare or AWS for web stuff), and various countries have laws that allow them to secretly compel implementing specific backdoors.<p>In order to block the distributor from going rogue, you need to be able to guarantee that the user device can only install/run code signed by the <i>provider</i>, who must never give those keys to the distributor. My impression is that Android is the only major platform that ever had this, but that Google ruined it a few years ago in the name of lighter bundles by insisting that <i>they</i> hold the keys. (I once had VLC from Google Play Store, but replaced it with a build from F-Droid under the same app ID; Google Play Store shows it has an update for it, but that it can’t install it.)<p>In order to block the provider or distributor sending specific users a different build, you need something more like Certificate Transparency logs: make it so that devices will only run packages that contains proof that they have been publicly shared. (This is necessary, but not sufficient.)<p>And if you’re using web tech, the mechanisms required to preclude such abuse do not at this time exist. If you’re shipping an app by some <i>other</i> channel, it can do a resource integrity check and mandate subresource integrity. But <i>no one</i> does things that way—half the reason for using web tech is specifically to bypass slow update channels and distribute new stuff immediately!</p>
]]></description><pubDate>Fri, 03 Apr 2026 10:06:26 +0000</pubDate><link>https://news.ycombinator.com/item?id=47624898</link><dc:creator>chrismorgan</dc:creator><comments>https://news.ycombinator.com/item?id=47624898</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47624898</guid></item><item><title><![CDATA[New comment by chrismorgan in "EmDash – A spiritual successor to WordPress that solves plugin security"]]></title><description><![CDATA[
<p>The popularity helps, but it’s also because WordPress’s security model is distilled insanity. PHP makes this insanity far easier than most languages, and WordPress embraces that, whereas the likes of Drupal rebuff it.</p>
]]></description><pubDate>Thu, 02 Apr 2026 01:00:23 +0000</pubDate><link>https://news.ycombinator.com/item?id=47608756</link><dc:creator>chrismorgan</dc:creator><comments>https://news.ycombinator.com/item?id=47608756</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47608756</guid></item><item><title><![CDATA[New comment by chrismorgan in "In Case of Emergency, Make Burrito Bison 3 (2017)"]]></title><description><![CDATA[
<p>(2017). Also doesn’t let you see the page until it’s downloaded more than 50MB, or you get tired and delete the stupid unnecessary loading screen element.</p>
]]></description><pubDate>Wed, 01 Apr 2026 09:11:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=47598581</link><dc:creator>chrismorgan</dc:creator><comments>https://news.ycombinator.com/item?id=47598581</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47598581</guid></item><item><title><![CDATA[New comment by chrismorgan in "Mad Bugs: Vim vs. Emacs vs. Claude"]]></title><description><![CDATA[
<p>It’s <i>extremely</i> common for shell prompts to integrate Git status for the working directory.<p>Who’s responsible for the vulnerability? Your text editor? The version control system with a useful feature that also happens to be a vulnerability if run on a malicious repository? The thing you extracted the repository with? The thing you downloaded the malicious repository with?<p>Windows + NTFS has a solution, sometimes called the “mark of the web”: add a Zone.Identifier alternate data stream to files. And that’s the way you could mostly fix the vulnerability: a world where curl sets that on the downloaded file, tar propagates it to all of the extracted files, and Git ignores (and warns about) config and hooks in marked files. But figuring out where the boundaries of propagation lie would be tricky and sometimes controversial, and would break some people’s workflows.</p>
]]></description><pubDate>Wed, 01 Apr 2026 09:10:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=47598567</link><dc:creator>chrismorgan</dc:creator><comments>https://news.ycombinator.com/item?id=47598567</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47598567</guid></item><item><title><![CDATA[New comment by chrismorgan in "Mad Bugs: Vim vs. Emacs vs. Claude"]]></title><description><![CDATA[
<p>I suspect that if you asked ten Vim developers where they’d start looking for this kind of security issue, at least nine of them would say “modeline” (and if one didn’t, it would just be because they forgot about the feature, and would change their answer to that as soon as you mentioned it). There’s a reason popular configurations have disabled it from time immemorial.<p>As for the Emacs thing, it feels <i>utterly</i> unfair to blame Emacs. The issue is 100% Git, and it’s unreasonable <i>and undesirable</i> for things like Emacs to try to put guard rails around <i>parts</i> of its functionality. Especially guard rails that may harm functionality. They were right to decline the suggested patch.<p>I don’t know how the sessions actually ran, but the Vim one probably started with “low-hanging fruit, let’s start by seeing if modeline has accidentally become insecure <i>yet again</i>”, and the emacs with “meh, don’t know anything offhand, before delving into code let’s see if… ooh look it runs Git, so can we apply the ol’ fsmonitor chestnut there?”</p>
]]></description><pubDate>Wed, 01 Apr 2026 06:52:10 +0000</pubDate><link>https://news.ycombinator.com/item?id=47597714</link><dc:creator>chrismorgan</dc:creator><comments>https://news.ycombinator.com/item?id=47597714</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47597714</guid></item><item><title><![CDATA[New comment by chrismorgan in "Mad Bugs: Vim vs. Emacs vs. Claude"]]></title><description><![CDATA[
<p>RCE stands for Remote Code Execution: being able to trigger arbitrary code execution (ACE) from a remote machine.<p>This, however, is mislabelled: it’s not remote code execution at all, only local. It would only become RCE if there was some path to remotely triggering Vim to open the attack file, or Emacs the attack repository, or if a normal way of fetching a repository automatically set up and executed the hook.</p>
]]></description><pubDate>Wed, 01 Apr 2026 06:42:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=47597646</link><dc:creator>chrismorgan</dc:creator><comments>https://news.ycombinator.com/item?id=47597646</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47597646</guid></item><item><title><![CDATA[New comment by chrismorgan in "Oracle slashes 30k jobs"]]></title><description><![CDATA[
<p>I’m currently moving my personal VPS to Oracle Cloud (for a couple of reasons). The new machine’s host name is lawnmower. I have never been so decisive and satisfied in naming a computer.</p>
]]></description><pubDate>Tue, 31 Mar 2026 16:03:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=47589416</link><dc:creator>chrismorgan</dc:creator><comments>https://news.ycombinator.com/item?id=47589416</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47589416</guid></item></channel></rss>