<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: stephen</title><link>https://news.ycombinator.com/user?id=stephen</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Tue, 21 Apr 2026 06:29:03 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=stephen" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by stephen in "Show HN: Pg-typesafe – Strongly typed queries for PostgreSQL and TypeScript"]]></title><description><![CDATA[
<p>Per "how to handle dynamic queries", it's admittedly pretty different b/c we're an ORM (<a href="https://joist-orm.io/" rel="nofollow">https://joist-orm.io/</a>) that "fetches entities" instead of adhoc SQL queries, but our pattern for "variable number of filters/joins" looks like:<p>const { date, name, status } = args.filter;<p>await em.find(Employee, { date, name, employer: { status } });<p>Where the "shape" of the query is static, but `em.find` will drop/prune any filters/joins that are set to `undefined`.<p>So you get this nice "declarative / static structure" that gets "dynamically pruned to only what's applicable for the current query", instead of trying to jump through "how do I string together knex .orWhere clauses for this?" hoops.</p>
]]></description><pubDate>Wed, 18 Feb 2026 03:28:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=47056799</link><dc:creator>stephen</dc:creator><comments>https://news.ycombinator.com/item?id=47056799</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47056799</guid></item><item><title><![CDATA[New comment by stephen in "Dagger: Define software delivery workflows and dev environments"]]></title><description><![CDATA[
<p>Hello! Yeah, I totally get Dagger is more "hey client please create a DAG via RPC calls", but just making something up in 30 seconds, like this is what I had in mind:<p><a href="https://gist.github.com/stephenh/8c7823229dfffc0347c2e94a3c99227b" rel="nofollow">https://gist.github.com/stephenh/8c7823229dfffc0347c2e94a3c9...</a><p>Like I'm still building a DAG, but by creating objects with "kinda POJOs" (doesn't have to be literally POJOs) and then stitching them together, like the outputs of 1 construct (the build) can be used as inputs to the other constructs (tests & container).</p>
]]></description><pubDate>Wed, 17 Dec 2025 02:08:56 +0000</pubDate><link>https://news.ycombinator.com/item?id=46297384</link><dc:creator>stephen</dc:creator><comments>https://news.ycombinator.com/item?id=46297384</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46297384</guid></item><item><title><![CDATA[New comment by stephen in "Dagger: Define software delivery workflows and dev environments"]]></title><description><![CDATA[
<p>Right, my point is that this:<p><a href="https://docs.dagger.io/cookbook/services?sdk=typescript" rel="nofollow">https://docs.dagger.io/cookbook/services?sdk=typescript</a><p>Still looks like "a circa-2000s Java builder API" and doesn't look like pleasant / declarative / idiomatic TypeScript, which is what aws-cdk pulled off.<p>Genuinely impressively (imo), aws-cdk intermixes "it's declarative" (you're setting up your desired state) but also "it's code" (you can use all the usual abstractions) in a way that is pretty great & unique.</p>
]]></description><pubDate>Sun, 14 Dec 2025 23:15:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=46268161</link><dc:creator>stephen</dc:creator><comments>https://news.ycombinator.com/item?id=46268161</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46268161</guid></item><item><title><![CDATA[New comment by stephen in "Dagger: Define software delivery workflows and dev environments"]]></title><description><![CDATA[
<p>I thought Dagger had/has a lot of potential to be "AWS-CDK for CI pipelines".<p>I.e. declaratively setup a web of CI / deployment tasks, based on docker, with a code-first DSL, instead of the morass of copy-pasted (and yes orbs) CircleCI yaml files we have strewn about our internals repos.<p>But their DSL for defining your pipelines is ... golang? Like who would pick golang as "a friendly language for setting up configs".<p>The underlying tech is technically language-agnostic, just as aws-cdk's is (you can share cdk constructs across TypeScript/Python), but it's rooted in golang as the originating/first-class language, so imo will never hit aws-cdk levels of ergonomics.<p>That technical nit aside, I love the idea; ran a few examples of it a year or so ago and was really impressed with the speed; just couldn't wrap my around "how can I make this look like cdk".</p>
]]></description><pubDate>Sun, 14 Dec 2025 16:16:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=46264117</link><dc:creator>stephen</dc:creator><comments>https://news.ycombinator.com/item?id=46264117</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46264117</guid></item><item><title><![CDATA[New comment by stephen in "Show HN: LinkedQL – Live Queries over Postgres, MySQL, MariaDB"]]></title><description><![CDATA[
<p>Thanks for the reply! That all makes sense!<p>As a potential user, I'd probably be thinking through things like: if I have a ~small-fleet of 10 ECS tasks serving my REST/API endpoints, would I run `client.query`s on these same machines, or would it be better to have a dedicated pool of "live query" machines that are separate from most API serving, so that maybe I get more overlap of inherited queries.<p>...also I think there is a limit on WAL slots? Or at least I'd probably want not each of my API servers to be consuming their own WAL slots.<p>Totally makes sense this is all "things you worry about later" (where later might be now-/soon-ish) given the infra/core concepts you've got working now -- looking really amazing!</p>
]]></description><pubDate>Sun, 14 Dec 2025 16:04:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=46264025</link><dc:creator>stephen</dc:creator><comments>https://news.ycombinator.com/item?id=46264025</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46264025</guid></item><item><title><![CDATA[New comment by stephen in "Show HN: LinkedQL – Live Queries over Postgres, MySQL, MariaDB"]]></title><description><![CDATA[
<p>Can you description the deployment setup, somewhere in the docs/maybe with a diagram?<p>I get this is a backend library, which is great, but like does it use postgres replication slots? Per the inherited queries, do they all live on 1 machine, and we just assume that machine needs to be sufficiently beefy to serve all currently-live queries?<p>Do all of my (backend) live-queries live/run on that one beefy machine? What's the life cycle for live-queries? Like how can I deploy new ones / kill old ones / as I'm making deployments / business logic changes that might change the queries?<p>This is all really hard ofc, so apologies for all the questions, just trying to understand -- thanks!</p>
]]></description><pubDate>Sat, 13 Dec 2025 23:34:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=46259289</link><dc:creator>stephen</dc:creator><comments>https://news.ycombinator.com/item?id=46259289</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46259289</guid></item><item><title><![CDATA[New comment by stephen in "Why frozen test fixtures are a problem on large projects and how to avoid them"]]></title><description><![CDATA[
<p>These two suggestions are fine, but I don't think they make fixtures really that much better--they're still a morass of technical debt & should be avoided at all costs.<p>The article doesn't mention what I hate most about fixtures: the noise of all the other crap in the fixture that doesn't matter to the current test scenario.<p>I.e. I want to test "merge these two books" -- great -- but now when stepping through the code, I have 30, 40, 100 other books floating around the code/database b/c "they were added by the fixture" that I need to ignore / step through / etc. Gah.<p>Factories are the way: <a href="https://joist-orm.io/testing/test-factories/" rel="nofollow">https://joist-orm.io/testing/test-factories/</a></p>
]]></description><pubDate>Tue, 09 Dec 2025 15:05:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=46205692</link><dc:creator>stephen</dc:creator><comments>https://news.ycombinator.com/item?id=46205692</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46205692</guid></item><item><title><![CDATA[New comment by stephen in "Toucan Wireless Split Keyboard with Touchpad"]]></title><description><![CDATA[
<p>I still use my index finger; I've just gotten used to moving my hand ~slightly over from j to the nub.<p>I would definitely prefer their trackpoint module be "flipped upside down" so the nub was on top, directly next to the H key, so I could move "just the index finger", and not my palm, but it's really not a big deal now that I'm used to it.<p>They seem to get this feedback a lot, b/c they have an FAQ entry about (nub location), which asserts the current thumb location is due to space/engineering constraints. But, dunno, I kinda wonder if that was for the smaller UHK60? B/c just looking at my UHK80, it really seems like the nub could be by the H if they wanted it to. :-)<p>So not "perfect perfect" but still really amazing imo, and so glad I switched over -- I'm like 10 years late to split keyboards, custom layers for movement / programming binds, everything the cool kids have been doing forever, but I couldn't give up a trackpoint. But here we are, finally! :-)<p>(Also fwiw I held off on the UHK80 for about a year b/c they were having firmware issues on initial release, repeated/missed keys, that sort of thing, but its been rock solid for me; literally zero issues.)</p>
]]></description><pubDate>Tue, 11 Nov 2025 14:55:44 +0000</pubDate><link>https://news.ycombinator.com/item?id=45887918</link><dc:creator>stephen</dc:creator><comments>https://news.ycombinator.com/item?id=45887918</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45887918</guid></item><item><title><![CDATA[New comment by stephen in "Toucan Wireless Split Keyboard with Touchpad"]]></title><description><![CDATA[
<p>The UHK80 has a trackpoint module that works great!</p>
]]></description><pubDate>Tue, 11 Nov 2025 02:29:54 +0000</pubDate><link>https://news.ycombinator.com/item?id=45883504</link><dc:creator>stephen</dc:creator><comments>https://news.ycombinator.com/item?id=45883504</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45883504</guid></item><item><title><![CDATA[New comment by stephen in "Why we migrated from Python to Node.js"]]></title><description><![CDATA[
<p>Everyone's definition of "production quality" is different :-), but Joist is a "mikro-ish" (more so ActiveRecord-ish) ORM that has a few killer features:<p><a href="https://joist-orm.io/" rel="nofollow">https://joist-orm.io/</a><p>Always happy to hear feedback/issues if anyone here would like to try it out. Thanks!</p>
]]></description><pubDate>Mon, 03 Nov 2025 19:29:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=45803315</link><dc:creator>stephen</dc:creator><comments>https://news.ycombinator.com/item?id=45803315</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45803315</guid></item><item><title><![CDATA[New comment by stephen in "Pipelining in psql (PostgreSQL 18)"]]></title><description><![CDATA[
<p>Great to hear you're using postgres.js in prod/large deployments! That sort of real-world-driven usage/improvements/roadmap imo leads to the best results for open source projects.<p>Also interesting about a potential v4! I'll keep lurking on the github project and hope to see what it brings!</p>
]]></description><pubDate>Sun, 12 Oct 2025 21:21:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=45562022</link><dc:creator>stephen</dc:creator><comments>https://news.ycombinator.com/item?id=45562022</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45562022</guid></item><item><title><![CDATA[New comment by stephen in "Pipelining in psql (PostgreSQL 18)"]]></title><description><![CDATA[
<p>Oh hello! Very happy to hear from you, and even happier to be wrong about your "AWOL-ness" (since I want to ship postgres.js to prod). :-)<p>My assumption was just from, afaict, the general lack of triage on GitHub issues, i.e. for a few needs we have like tracing/APM, and then also admittedly esoteric topics like this stack trace fixing:<p><a href="https://github.com/porsager/postgres/issues/963#issuecomment-2676383773" rel="nofollow">https://github.com/porsager/postgres/issues/963#issuecomment...</a><p>Fwiw I definitely sympathize with issue triage being time-consuming/sometimes a pita, i.e. where a nontrivial/majority of issues are from well-meaning but maybe naive users asking for free support/filing incorrect/distracting issues.<p>I don't have an answer, but just saying that's where my impression came from.<p>Thanks for replying!</p>
]]></description><pubDate>Sun, 12 Oct 2025 15:14:44 +0000</pubDate><link>https://news.ycombinator.com/item?id=45558780</link><dc:creator>stephen</dc:creator><comments>https://news.ycombinator.com/item?id=45558780</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45558780</guid></item><item><title><![CDATA[New comment by stephen in "Pipelining in psql (PostgreSQL 18)"]]></title><description><![CDATA[
<p>I really want to use pipelining for our "em.flush" of sending all INSERTs & UPDATEs to the db as part of a transaction, b/c my initial prototyping showed a 3-6x increase:<p><a href="https://joist-orm.io/blog/initial-pipelining-benchmark/" rel="nofollow">https://joist-orm.io/blog/initial-pipelining-benchmark/</a><p>If you're not in a transaction, afaiu pipelining is not as applicable/useful b/c any SQL statement failing in the pipeline fails all other queries after it, and imo it would suck for separate/unrelated web requests that "share a pipeline" to have one request fail the others -- but for a single txn/single request, these semantics are what you expect anyway.<p>Unfortunately in the TypeScript ecosystem, the node-pg package/driver doesn't support pipelining yet, instead this "didn't quite hit mainstream adoption and now the author is AWOL" driver does: <a href="https://github.com/porsager/postgres" rel="nofollow">https://github.com/porsager/postgres</a><p>I've got a branch to convert our TypeScript ORM to postgres.js solely for this "send all our INSERTs/UPDATEs/DELETEs in parallel" perf benefit, and have some great stats so far:<p><a href="https://github.com/joist-orm/joist-orm/pull/1373#issuecomment-2735235279" rel="nofollow">https://github.com/joist-orm/joist-orm/pull/1373#issuecommen...</a><p>But it's not "must have" for us atm, so haven't gotten time to rebase/ship/etc...hoping to rebase & land the PR by eoy...</p>
]]></description><pubDate>Sun, 12 Oct 2025 13:13:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=45558022</link><dc:creator>stephen</dc:creator><comments>https://news.ycombinator.com/item?id=45558022</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45558022</guid></item><item><title><![CDATA[New comment by stephen in "Niri – A scrollable-tiling Wayland compositor"]]></title><description><![CDATA[
<p>I want to use/try Niri, but have been staying on Hyprland from my safety blanket of Omarchy [1], and really liking its hyprscrolling plugin:<p><a href="https://github.com/hyprwm/hyprland-plugins/tree/main/hyprscrolling" rel="nofollow">https://github.com/hyprwm/hyprland-plugins/tree/main/hyprscr...</a><p>Imo Hyprland should merge this hyprscrolling plugin into the main project, and just ship it as the default (only?) layout option -- it just scales to "more than 4 windows" so much better than either of Hyprland's master/dwindle layouts.<p>[1] I tried vanilla arch + archinstall + sway/niri/etc but really couldn't make it work from scratch, vs. the contrast of Omarchy which was "wow this all works" :shrug:</p>
]]></description><pubDate>Fri, 03 Oct 2025 15:11:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=45463884</link><dc:creator>stephen</dc:creator><comments>https://news.ycombinator.com/item?id=45463884</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45463884</guid></item><item><title><![CDATA[New comment by stephen in "We rewrote the Ghostty GTK application"]]></title><description><![CDATA[
<p>I've been using Ghostty, and other GPU-based apps like Alacritty / WezTerm / Zed, because they're ofc better/faster...<p>Ironically they've all made my DX worse, by highlighting how terrible the nvidia drivers actually worked on both my old Regolith i3wm/compositor-less or new sway/wayland setup.<p>Like it's ridiculously terrible.<p>I've tried every magical env flag that Claude can think of, and 4 of the various 550/560/575/580 driver versions--they all suck at screensharing, or resume from sleep, or just out-right buginess/crashes/segfaults in the nvidia drivers.<p>It must have always been this bad, but I just didn't notice, b/c I never actually used my GPU? lol</p>
]]></description><pubDate>Fri, 15 Aug 2025 01:11:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=44907590</link><dc:creator>stephen</dc:creator><comments>https://news.ycombinator.com/item?id=44907590</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44907590</guid></item><item><title><![CDATA[New comment by stephen in "Show HN: I've been building an ERP for manufacturing for the last 3 years"]]></title><description><![CDATA[
<p>I was wondering the same, about their backend domain model (or lack of it).<p>Fwiw in the TypeScript space, we built Joist (<a href="https://joist-orm.io/" rel="nofollow">https://joist-orm.io/</a>) to do exactly this.<p>Granted, we went with a Rails/ActiveRecord minimalist take on DDD instead of some of the more elaborate (overkill imo) implementations that are common i.e. in the .NET space.</p>
]]></description><pubDate>Tue, 05 Aug 2025 14:16:36 +0000</pubDate><link>https://news.ycombinator.com/item?id=44798256</link><dc:creator>stephen</dc:creator><comments>https://news.ycombinator.com/item?id=44798256</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44798256</guid></item><item><title><![CDATA[New comment by stephen in "Microservices are a tax your startup probably can't afford"]]></title><description><![CDATA[
<p>> Microservices are a design pattern for organisations as opposed
> to technology ... breakout into multiple teams<p>I agree, but just saying "multiple teams" has led many eng directors to think "I have two squads now --> omg they cannot both be in the same monolith".<p>When both squads are 5 people each.<p>And the squads re-org (or "right size") every 9 months to re-prioritize on the latest features.<p>Five years go by, 7 team/re-org changes, all of which made sense, but thank god we didn't microservice on the 2nd/3rd/4th/5th/6th team boundaries. :grimmacing:<p>We should stay "stable, long-lived teams" -- like you need to have a team that exists with the same ownership and mandate for ~18 months to prove its a stable entity worth forming your architecture around.</p>
]]></description><pubDate>Fri, 09 May 2025 22:51:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=43941654</link><dc:creator>stephen</dc:creator><comments>https://news.ycombinator.com/item?id=43941654</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43941654</guid></item><item><title><![CDATA[New comment by stephen in "We fell out of love with Next.js and back in love with Ruby on Rails"]]></title><description><![CDATA[
<p>Well, we're not the "go to" yet :-) but if you want an entity-based ORM that isn't just a query builder, Joist has several amazing features (no N+1s) and great ergonomics <a href="https://joist-orm.io/" rel="nofollow">https://joist-orm.io/</a></p>
]]></description><pubDate>Sat, 03 May 2025 23:19:44 +0000</pubDate><link>https://news.ycombinator.com/item?id=43883141</link><dc:creator>stephen</dc:creator><comments>https://news.ycombinator.com/item?id=43883141</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43883141</guid></item><item><title><![CDATA[New comment by stephen in "Show HN: Hatchet v1 – A task orchestration platform built on Postgres"]]></title><description><![CDATA[
<p>Do queue operations (enqueue a job & mark this job as complete) happen in the same transaction as my business logic?<p>Imo that's the killer feature of database-based queues, because it dramatically simplifies reasoning about retries, i.e. "did my endpoint logic commit _and_ my background operation enqueue both atomically commit, or atomically fail"?<p>Same thing for performing jobs, if my worker's business logic commits, but the job later retries (b/c marking the job as committed is a separate transaction), then oof, that's annoying.<p>And I might as well be using SQS at that point.</p>
]]></description><pubDate>Fri, 04 Apr 2025 14:24:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=43582886</link><dc:creator>stephen</dc:creator><comments>https://news.ycombinator.com/item?id=43582886</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43582886</guid></item><item><title><![CDATA[New comment by stephen in "Ask HN: What are you working on? (March 2025)"]]></title><description><![CDATA[
<p>Working on v2 of our n+1-proof/reactive TypeScript ORM, Joist (<a href="https://joist-orm.io/" rel="nofollow">https://joist-orm.io/</a>), that moves to using the new-ish postgres.js driver (instead of knex/node-pg), so that we can leverage postgres.js's statement pipelining within transactions.<p>I'm anticipating a really sweet perf increase (as shown by some proof-of-concepts), but now that everything is actually working on the v2 branch, I'm putting together benchmarks that show the benefit in practice.<p>Love to have anyone poke around/ask questions/hang out on discord.</p>
]]></description><pubDate>Sun, 30 Mar 2025 23:18:20 +0000</pubDate><link>https://news.ycombinator.com/item?id=43528773</link><dc:creator>stephen</dc:creator><comments>https://news.ycombinator.com/item?id=43528773</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43528773</guid></item></channel></rss>