HNHacker News
TopNewBestAskShowJobs

russellthehippo

310 karma · joined January 11, 2017

submissionscomments
russellthehippo··on Ask HN: What are you working on? (August 2026)
Pretty cool apps! One thing i'd love to see for both is a historical view of the data - how do things change over time? Where is today relative the past five years for a given place? ten years? etc.
russellthehippo··on Data centers have hiked electricity prices on the public by $23B
Precisely this. Incredibly annoying headline
russellthehippo··on Data centers have hiked electricity prices on the public by $23B
Failures to allow faster generation/hookup rollout have suppressed supply increase relative to demand increase
russellthehippo··on Was sick of sandbox priced 50x what the CPU is worth so I made my own 5x cheaper
"VMs but it's on Hetzner so it's equally fast and 10x cheaper!" Hell yeah I also wanted to build this, good luck mate
russellthehippo··on I rewrote PostHog's SQL parser, 70x faster, while barely looking at the code
The key parts of this is how not vibecoded it is. Feels like a model of how you should do software with AI. Now that we can easily set up property testing, fuzzing, etc. there's almost no reason not to.
russellthehippo··on Show HN: Oak – Git alternative designed for agents
"Welcome to the agentic substrate"

YAAS (yet another agentic substrate)

russellthehippo··on Samurai City
There were real geographic and social tradeoffs to having status and power.
russellthehippo··on Show HN: Electrolite – embeddable Electric-style sync for SQLite
Hi HN, I made this. My brother wanted to use per-tenant SQLite at his startup, but really likes Electric’s Shape model for Postgres. So I got curious to see if the same idea was feasible for SQLite.

Electrolite is “Electric-style Shapes, but for SQLite, embedded in an app.” The server defines authorized subsets of rows, the browser asks for one by name, gets an initial snapshot, then long-polls for logical changes captured by SQLite triggers.

It’s very experimental, not on npm yet, and the predicate language is intentionally small. I also wouldn’t describe it as deeply optimized yet. But in a local in-process smoke test, one SQLite write woke 1000 live Shape clients and all materialized the new row in ~100ms, so it looks promising for SQLite-first apps.

Would love your feedback and suggestions, and maybe it will even be useful for you.

russellthehippo··on Technical, cognitive, and intent debt
I'm finding in practice in using this process that you're right - it just doesn't work, even for one dev (usually). ha. But, the process of forcing plans to verify intent has worked pretty well! specifically the process of repeated adversarial review against a dual "will do, won't do" thing has been very, very useful at getting change plans to match intent.
russellthehippo··on Honker – Durable queues, streams, pub/sub, and cron scheduler in a SQLite file
Appreciated your input on the original thread as well. Maybe I should note this recommendation in the docs or something.
russellthehippo··on Durable queues, streams, pub/sub, and a cron scheduler – inside your SQLite file
Author here. Yeah doesn’t depend on the underlying db if it speaks SQLite.
russellthehippo··on Durable queues, streams, pub/sub, and a cron scheduler – inside your SQLite file
Yup
russellthehippo··on Honker – Durable queues, streams, pub/sub, and cron scheduler in a SQLite file
Respectfully (thanks haha) - yeah probably right. Original intent was to use inotify type thing but i avoided per-platform differences at the outset. this was definitely a for fun project that blew up unintentionally and am working to harden/improve.

Love Fly.

russellthehippo··on Durable queues, streams, pub/sub, and a cron scheduler – inside your SQLite file
Author here - previously posted here: https://news.ycombinator.com/item?id=47874647

Key difference vs SQL polling is that we’re touching metadata instead of data pages. I have work in process to make this work without any polling (innotify, kqueue, mmap’d shm file check) after the original stat(2) direction proved unreliable if lightweight.

Would love your feedback and or contributions in the repo - still figuring out the end shape.

russellthehippo··on An update on GitHub availability
Reading the capacity crunch idea made me a little more empathetic to their issues - 30x in one year is a lot when you're starting from a high baseline. Now that being said...I'd really appreciate more availability.
russellthehippo··on Show HN: Honker – Postgres NOTIFY/LISTEN Semantics for SQLite
Reporting back again. It seems I was actually right the first time - the C API's SQLITE_FCNTL_DATA_VERSION doesn't work cross connection. It is cached on each read - but if there aren't any reads (i.e. just polling SQLITE_FCNTL_DATA_VERSION) then it doesn't work.

PRAGMA data_version is pretty fast (1500ns with prepared statement) and doesn't have that issue.

Checking the wal-index is sub-nanosecond when mmapped but has slightly different behavior on Windows.

Here's the link to the thread on this, my scripts are all there.

https://github.com/russellromney/honker/issues/5

russellthehippo··on Show HN: Honker – Postgres NOTIFY/LISTEN Semantics for SQLite
I've added examples for many ORMs and web frameworks to the docs. See here:

https://honker.dev/guides/orm/#sqlalchemy--sqlmodel

russellthehippo··on Show HN: Honker – Postgres NOTIFY/LISTEN Semantics for SQLite
Reporting back. This appears to be a bug in my original test the code of which sadly I did not commit anywhere. I went back to regenerate these tests and proved the opposite - the C API is better than PRAGMA and works across connections. I am going to make that update as I've proved across dozens of versions of SQLite that this is not in fact the case.
russellthehippo··on Show HN: Honker – Postgres NOTIFY/LISTEN Semantics for SQLite
Ha. Great callout. Will inspect further
russellthehippo··on Show HN: Honker – Postgres NOTIFY/LISTEN Semantics for SQLite
Will do
russellthehippo··on Show HN: Honker – Postgres NOTIFY/LISTEN Semantics for SQLite
link for all others - this commenter fixed a bug in core Postgres that fixed a scaling issue in actual listen/notify https://www.recall.ai/blog/postgres-listen-notify-does-not-s...
russellthehippo··on Show HN: Honker – Postgres NOTIFY/LISTEN Semantics for SQLite
writes and claim/ack flow. really depends on your journal mode and synchrnous mode as well.

notifs are extremely cheap, either in the old stat(2) mode or the new PRAGMA page_version (see my update on feeback comment). Some other comments mentioned that stat(2) is about 1µs.

russellthehippo··on Show HN: Honker – Postgres NOTIFY/LISTEN Semantics for SQLite
[Response to feedback]

Thanks all for your feedback, responses, and discussion. I've done a PR here taking your suggestions into account:

https://github.com/russellromney/honker/pulls/1

The PR implements a three-layer polling architecture: - PRAGMA data_version every 1ms - stat every 100ms - retry connection to handle blips

1. PRAGMA data_version every 1ms replaces stat-based (size, mtime) change detection. This is SQLite's own commit counter: monotonic, immune to clock skew, correctly handles WAL truncation and rolled-back transactions. ~3µs nonblocking query. Credit to ncruces for pointing to this. This is not done for performance but for correctness as it is slightly slower. tuo-lei also pointed out truncation risk, which turned out to be more real than i thought.

Interesting note: I found in testing that the C API's SQLITE_FCNTL_DATA_VERSION does not work cross-connection. So for now honker continues paying the cost of going through the VFS layer which vlovich123 pointed out and now we tradeoff explicitly.

2. Reconnect-on-error: if the data_version query fails (disk blip, NFS hiccup, corrupted connection), honker tries to reconnect and wakes subscribers as a precaution. zbentley pointed me in this direction.

3. stat identity check every 100ms: compares (dev, ino) against startup values to detect file replacement (atomic rename, litestream restore, volume remount). data_version can't catch this because it polls through the open fd, which follows the original inode even after replacement. Credit to zbentley for the file-replacement scenarios.

Again - thanks for the discussion, honker got better because of it and I learned some stuff. See you round

russellthehippo··on Technical, cognitive, and intent debt
Wow, yeah. You call it “optimizing for understanding.” I’ve been thinking about a very similar problem as “optimizing for execution of intent.”

My version is roughly: if execution and verification are getting cheap, but taste, design, intent, and planning are still expensive, then the workflow should focus on how intent gets executed in each change and how it stays intact over time instead of slowly drifting.

I’m more hesitant to formalize all of that into heavy tooling, but there are clear parallels here. I wrote up more of what I mean here: https://russellromney.com/blog/intent-driven-development

russellthehippo··on Show HN: Honker – Postgres NOTIFY/LISTEN Semantics for SQLite
I just tested this out. PRAGMA data_version uses a shared counter that any connection can use while the C API appears to use a per-connection counter that does not see other connections' commits.
russellthehippo··on Show HN: Honker – Postgres NOTIFY/LISTEN Semantics for SQLite
If this has been fixed somewhere or there is a better alternative I'd love to use that over polling. Current plan is to move to polling data version for speed + occasional stat for safety. Getting rid of polling was my original goal but i compromised with syscalls.
russellthehippo··on Show HN: Honker – Postgres NOTIFY/LISTEN Semantics for SQLite
Wow, thanks for the great feedback.

I actually looked at fstat, but the "check for deletions" piece, given I'm polling at 1kHZ, was the reason I decided not to use it. Older hardware actually made this a big issue but it's fast enough now I decided it wasn't a problem.

I'll ignore the malicious ones bc [out of scope declaration]. Object paranoia is an artifact of build trama and I respect that lmao.

I've just looked into the device number and system clock issues. I think what i'll end up doing is actually a combo of ncruces's above comment and your feedback: a 1kHZ data_version and a 10HZ stat() with version check. This gets around syscall load, avoid clock issues, avoids the WAL truncation issues that others have mentioned, and is both lighter weight and less bugabooable than my previous design.

Thanks again.

russellthehippo··on An update on recent Claude Code quality reports
Damn it was real the whole time. I found Opus 4.7 to holistically underperform 4.6, and especially in how much wordiness there is. It's harder to work with so I just switched back to 4.6 + Kimi K2.6. Now GPT 5.5 is here and it's been excellent so far.
russellthehippo··on Show HN: Honker – Postgres NOTIFY/LISTEN Semantics for SQLite
"a small proliferation" is a nice way to describe the cluster that is my side project habit. if you bump into any issues pls pull a PR or drop an issue on the repo!
russellthehippo··on Show HN: Honker – Postgres NOTIFY/LISTEN Semantics for SQLite
exactly. then you're building distributed locking and it's probably time for a different tool
Page 1 of 3Next →