<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: jeeybee</title><link>https://news.ycombinator.com/user?id=jeeybee</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Wed, 29 Jul 2026 20:19:41 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=jeeybee" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[Show HN: Pgnudge – tell your app which Postgres tables just changed]]></title><description><![CDATA[
<p>Hello HN!<p>I found my self always doing some kind of polling loop for my applications when i want to watch data as it comes in, however i find striking the balance between aggressive polling and the responsiveness tricky.<p>So i wrote (with help from claude)  pgnudg. pgnudge is a small async Python library that wakes your app when specific Postgres tables change. It only tells you which tables moved. You refetch, and the database stays the source of truth.It reads the WAL over the replication protocol and turns commits into per-table wakeup<p>I am more than willing to acknowledge that this is properly overkill, but I found it interesting, and maybe some else might as well?</p>
<hr>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=48969927">https://news.ycombinator.com/item?id=48969927</a></p>
<p>Points: 1</p>
<p># Comments: 0</p>
]]></description><pubDate>Sun, 19 Jul 2026 17:18:36 +0000</pubDate><link>https://github.com/janbjorge/pgnudge</link><dc:creator>jeeybee</dc:creator><comments>https://news.ycombinator.com/item?id=48969927</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48969927</guid></item><item><title><![CDATA[Show HN: Pgnudge - tell your app which Postgres tables just changed]]></title><description><![CDATA[
<p>Genuinely unsure if this is crazy or cool: looking for feedback.<p>pgnudge is a small async Python library that tells you which tables just changed in Postgres, so a cache or read model can refetch the moment the data moves. No row data - it tells you when and what to reload, you already know how
to load it.<p>It leaves nothing persistent on the server (temp replication slot, dropped when the session ends) and needs no database driver — it speaks the walsender protocol itself. One dependency.<p>Not CDC (no before/after rows), not a queue (no durability). It moves wakefulness, not rows or work.<p>Repo: <a href="https://github.com/janbjorge/pgnudge" rel="nofollow">https://github.com/janbjorge/pgnudge</a></p>
<hr>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=48883032">https://news.ycombinator.com/item?id=48883032</a></p>
<p>Points: 3</p>
<p># Comments: 0</p>
]]></description><pubDate>Sun, 12 Jul 2026 17:57:40 +0000</pubDate><link>https://github.com/janbjorge/pgnudge</link><dc:creator>jeeybee</dc:creator><comments>https://news.ycombinator.com/item?id=48883032</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48883032</guid></item><item><title><![CDATA[Show HN: PgQueuer v1.0 – Python job queue using only PostgreSQ]]></title><description><![CDATA[
<p>PgQueuer is a Python job queue that uses PostgreSQL for everything — queue
storage, locking, notifications. No Redis, no RabbitMQ, no separate broker
to operate. If your app already has Postgres, you already have the broker.<p>After ~2 years and 26 minor releases, 1.0 ships today as the first stable
release. Strict semver from here on.<p>Thanks to everyone who contributed and left feedback!</p>
<hr>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=48100177">https://news.ycombinator.com/item?id=48100177</a></p>
<p>Points: 2</p>
<p># Comments: 0</p>
]]></description><pubDate>Mon, 11 May 2026 20:22:13 +0000</pubDate><link>https://github.com/janbjorge/pgqueuer</link><dc:creator>jeeybee</dc:creator><comments>https://news.ycombinator.com/item?id=48100177</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48100177</guid></item><item><title><![CDATA[New comment by jeeybee in "Show HN: Rekal – Long-term memory for LLMs in a single SQLite file"]]></title><description><![CDATA[
<p>Added a mcp command for it, but i might add it as a comfig as well?<p><a href="https://github.com/janbjorge/rekal/pull/14/changes" rel="nofollow">https://github.com/janbjorge/rekal/pull/14/changes</a></p>
]]></description><pubDate>Tue, 14 Apr 2026 06:13:17 +0000</pubDate><link>https://news.ycombinator.com/item?id=47761872</link><dc:creator>jeeybee</dc:creator><comments>https://news.ycombinator.com/item?id=47761872</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47761872</guid></item><item><title><![CDATA[New comment by jeeybee in "Show HN: Rekal – Long-term memory for LLMs in a single SQLite file"]]></title><description><![CDATA[
<p>Thanks, i will look into making them configurable.</p>
]]></description><pubDate>Mon, 13 Apr 2026 21:10:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=47757864</link><dc:creator>jeeybee</dc:creator><comments>https://news.ycombinator.com/item?id=47757864</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47757864</guid></item><item><title><![CDATA[New comment by jeeybee in "Show HN: Rekal – Long-term memory for LLMs in a single SQLite file"]]></title><description><![CDATA[
<p>The 0.4/0.4/0.2 weights are just based of hand wavy trail an error, will look into other options. I could make them configurable?</p>
]]></description><pubDate>Mon, 13 Apr 2026 21:10:23 +0000</pubDate><link>https://news.ycombinator.com/item?id=47757862</link><dc:creator>jeeybee</dc:creator><comments>https://news.ycombinator.com/item?id=47757862</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47757862</guid></item><item><title><![CDATA[New comment by jeeybee in "Show HN: Rekal – Long-term memory for LLMs in a single SQLite file"]]></title><description><![CDATA[
<p>Thanks! You're right, that's just a relic of my dev environment. Will broaden the version requirement.</p>
]]></description><pubDate>Mon, 13 Apr 2026 06:16:25 +0000</pubDate><link>https://news.ycombinator.com/item?id=47748255</link><dc:creator>jeeybee</dc:creator><comments>https://news.ycombinator.com/item?id=47748255</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47748255</guid></item><item><title><![CDATA[Show HN: Rekal – Long-term memory for LLMs in a single SQLite file]]></title><description><![CDATA[
<p>I got tired of repeating myself to my LLM every session. rekal is an MCP server that stores memories in SQLite and retrieves them with hybrid search (BM25 + vectors + recency decay). One file, local embeddings, no API keys.</p>
<hr>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=47744683">https://news.ycombinator.com/item?id=47744683</a></p>
<p>Points: 9</p>
<p># Comments: 10</p>
]]></description><pubDate>Sun, 12 Apr 2026 21:25:53 +0000</pubDate><link>https://github.com/janbjorge/rekal</link><dc:creator>jeeybee</dc:creator><comments>https://news.ycombinator.com/item?id=47744683</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47744683</guid></item><item><title><![CDATA[New comment by jeeybee in "Keeping a Postgres Queue Healthy"]]></title><description><![CDATA[
<p>Did you test with fillfactor < 100 on the queue table? With HOT updates, status changes can reuse dead space without creating new index entries, which seems like it could significantly delay the onset of the death spiral?</p>
]]></description><pubDate>Sat, 11 Apr 2026 19:07:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=47733155</link><dc:creator>jeeybee</dc:creator><comments>https://news.ycombinator.com/item?id=47733155</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47733155</guid></item><item><title><![CDATA[New comment by jeeybee in "Show HN: Pglens – 27 read-only PostgreSQL tools for AI agents via MCP"]]></title><description><![CDATA[
<p>No config step, the tools discover everything from pg_catalog at call time. list_schemas → list_tables → describe_table is the typical agent workflow, and there's a query_guide prompt baked in that suggests that progression.<p>On query guardrails: every query runs in a readonly transaction and results are capped at 500 rows via a wrapping SELECT * FROM (...) sub LIMIT 500. There's also explain_query which returns the plan without executing, so agents can check before running something expensive. That said, there's no cost-based gate that blocks a bad plan automatically; that's an interesting idea worth exploring.</p>
]]></description><pubDate>Mon, 30 Mar 2026 18:37:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=47578003</link><dc:creator>jeeybee</dc:creator><comments>https://news.ycombinator.com/item?id=47578003</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47578003</guid></item><item><title><![CDATA[New comment by jeeybee in "Show HN: Pglens – 27 read-only PostgreSQL tools for AI agents via MCP"]]></title><description><![CDATA[
<p>Thanks! Read-only felt like the obvious constraint; agents shouldn't need write access to understand a database.</p>
]]></description><pubDate>Mon, 30 Mar 2026 17:00:50 +0000</pubDate><link>https://news.ycombinator.com/item?id=47576853</link><dc:creator>jeeybee</dc:creator><comments>https://news.ycombinator.com/item?id=47576853</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47576853</guid></item><item><title><![CDATA[New comment by jeeybee in "Show HN: Pglens – 27 read-only PostgreSQL tools for AI agents via MCP"]]></title><description><![CDATA[
<p>Most Postgres MCP servers expose query and list_tables. Agents end up guessing column values, enum casing, and join paths - then retrying until something works.<p>pglens gives agents the context to get it right the first time: column_values shows real distinct values with counts, find_join_path does BFS over the FK graph and returns join conditions through
intermediate tables, describe_table gives columns/PKs/FKs/indexes in one call. Plus production health tools like bloat_stats, blocking_locks, and sequence_health.<p>Everything runs in readonly transactions, identifiers escaped via Postgres's quote_ident(), no extensions required. Works on any Postgres 12+ (self-hosted, RDS, Aurora, etc.). Two dependencies:
asyncpg and mcp.<p><a href="https://github.com/janbjorge/pglens" rel="nofollow">https://github.com/janbjorge/pglens</a><p>pip install pglen</p>
]]></description><pubDate>Sun, 29 Mar 2026 16:31:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=47564630</link><dc:creator>jeeybee</dc:creator><comments>https://news.ycombinator.com/item?id=47564630</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47564630</guid></item><item><title><![CDATA[Show HN: Pglens – 27 read-only PostgreSQL tools for AI agents via MCP]]></title><description><![CDATA[
<p>Article URL: <a href="https://github.com/janbjorge/pglens">https://github.com/janbjorge/pglens</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=47564620">https://news.ycombinator.com/item?id=47564620</a></p>
<p>Points: 13</p>
<p># Comments: 7</p>
]]></description><pubDate>Sun, 29 Mar 2026 16:30:36 +0000</pubDate><link>https://github.com/janbjorge/pglens</link><dc:creator>jeeybee</dc:creator><comments>https://news.ycombinator.com/item?id=47564620</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47564620</guid></item><item><title><![CDATA[Show HN: Pglens – Postgres MCP server that lets agents look before they query]]></title><description><![CDATA[
<p>Article URL: <a href="https://github.com/janbjorge/pglens">https://github.com/janbjorge/pglens</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=47494195">https://news.ycombinator.com/item?id=47494195</a></p>
<p>Points: 3</p>
<p># Comments: 0</p>
]]></description><pubDate>Mon, 23 Mar 2026 19:43:21 +0000</pubDate><link>https://github.com/janbjorge/pglens</link><dc:creator>jeeybee</dc:creator><comments>https://news.ycombinator.com/item?id=47494195</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47494195</guid></item><item><title><![CDATA[Show HN: GYML – YAML syntax, JSON semantics, zero runtime dependencies]]></title><description><![CDATA[
<p>YAML keeps surprising people in production. The Norway Problem (`NO` parsed as `False`). Silent duplicate key overwrites. The spec has 211 grammar productions. Most of that complexity exists to support features nobody wanted in a config file.<p>GYML is a strict subset of YAML. Valid GYML is always valid YAML. It keeps the block indentation syntax and pairs it with JSON's type semantics: one spelling for each type, no anchors, no aliases, no tags, duplicate keys are a hard error. From-scratch parser, no runtime dependencies, fully typed Python.<p><a href="https://github.com/janbjorge/gyml" rel="nofollow">https://github.com/janbjorge/gyml</a></p>
<hr>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=47302509">https://news.ycombinator.com/item?id=47302509</a></p>
<p>Points: 1</p>
<p># Comments: 0</p>
]]></description><pubDate>Sun, 08 Mar 2026 22:55:51 +0000</pubDate><link>https://github.com/janbjorge/gyml</link><dc:creator>jeeybee</dc:creator><comments>https://news.ycombinator.com/item?id=47302509</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47302509</guid></item><item><title><![CDATA[Show HN: PgQueuer – A PostgreSQL job queue that works without PostgreSQL]]></title><description><![CDATA[
<p>PgQueuer turns PostgreSQL into a background job queue using LISTEN/NOTIFY and FOR UPDATE SKIP LOCKED. v0.26.0 adds an in-memory adapter so you can run the same code in tests and CI without a database. Internally it's now built on port protocols, so you can swap the persistence layer entirely.<p>EDIT; HN trims the full url to readme about in-memory <a href="https://github.com/janbjorge/pgqueuer?tab=readme-ov-file#in-memory-adapter" rel="nofollow">https://github.com/janbjorge/pgqueuer?tab=readme-ov-file#in-...</a></p>
<hr>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=47210945">https://news.ycombinator.com/item?id=47210945</a></p>
<p>Points: 2</p>
<p># Comments: 0</p>
]]></description><pubDate>Sun, 01 Mar 2026 21:38:06 +0000</pubDate><link>https://github.com/janbjorge/pgqueuer</link><dc:creator>jeeybee</dc:creator><comments>https://news.ycombinator.com/item?id=47210945</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47210945</guid></item><item><title><![CDATA[Show HN: Jqueue: A job queue that runs on a single JSON file]]></title><description><![CDATA[
<p>I built a Python job queue that stores its entire state in one JSON file on S3, GCS, or your filesystem. No Redis, no RabbitMQ, no Postgres. Just object storage.<p>How it works<p>Read the JSON file, modify it in memory, write it back with compare-and-set. If two workers race, one wins. The loser retries with fresh state. No locks needed.<p>Inspired by; <a href="https://turbopuffer.com/blog/object-storage-queue" rel="nofollow">https://turbopuffer.com/blog/object-storage-queue</a></p>
<hr>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=47144842">https://news.ycombinator.com/item?id=47144842</a></p>
<p>Points: 2</p>
<p># Comments: 0</p>
]]></description><pubDate>Tue, 24 Feb 2026 23:14:45 +0000</pubDate><link>https://github.com/janbjorge/jqueue</link><dc:creator>jeeybee</dc:creator><comments>https://news.ycombinator.com/item?id=47144842</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47144842</guid></item><item><title><![CDATA[PGQueuer for High-Performance Job Queues]]></title><description><![CDATA[
<p>Article URL: <a href="https://alexdewey.github.io/AlexDeweyGiovanniniBlog/2026/02/20/PGqueuer.html">https://alexdewey.github.io/AlexDeweyGiovanniniBlog/2026/02/20/PGqueuer.html</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=47094172">https://news.ycombinator.com/item?id=47094172</a></p>
<p>Points: 1</p>
<p># Comments: 0</p>
]]></description><pubDate>Fri, 20 Feb 2026 21:24:08 +0000</pubDate><link>https://alexdewey.github.io/AlexDeweyGiovanniniBlog/2026/02/20/PGqueuer.html</link><dc:creator>jeeybee</dc:creator><comments>https://news.ycombinator.com/item?id=47094172</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47094172</guid></item><item><title><![CDATA[New comment by jeeybee in "Using PostgreSQL as a Dead Letter Queue for Event-Driven Systems"]]></title><description><![CDATA[
<p>I maintain a small Postgres-native job queue for Python called PGQueuer: <a href="https://github.com/janbjorge/pgqueuer" rel="nofollow">https://github.com/janbjorge/pgqueuer</a><p>It uses the same core primitives people are discussing here (FOR UPDATE SKIP LOCKED for claiming work; LISTEN/NOTIFY to wake workers), plus priorities, scheduled jobs, retries, heartbeats/visibility timeouts, and SQL-friendly observability. If you’re already on Postgres and want a pragmatic “just use Postgres” queue, it might be a useful reference / drop-in.</p>
]]></description><pubDate>Mon, 26 Jan 2026 11:03:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=46764198</link><dc:creator>jeeybee</dc:creator><comments>https://news.ycombinator.com/item?id=46764198</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46764198</guid></item><item><title><![CDATA[New comment by jeeybee in "Kafka is Fast – I'll use Postgres"]]></title><description><![CDATA[
<p>If you like the <i>“use Postgres until it breaks”</i> approach, there’s a middle ground between hand-rolling and running Kafka/Redis/Rabbit: PGQueuer.<p>PGQueuer is a small Python library that turns Postgres into a durable job queue using the same primitives discussed here — `FOR UPDATE SKIP LOCKED` for safe concurrent dequeue and `LISTEN/NOTIFY` to wake workers without tight polling. It’s for <i>background jobs</i> (not a Kafka replacement), and it shines when your app already depends on Postgres.<p>Nice-to-haves without extra infra: per-entrypoint concurrency limits, retries/backoff, scheduling (cron-like), graceful shutdown, simple CLI install/migrations. If/when you truly outgrow it, you can move to Kafka with a clearer picture of your needs.<p>Repo: <a href="https://github.com/janbjorge/pgqueuer" rel="nofollow">https://github.com/janbjorge/pgqueuer</a><p><i>Disclosure: I maintain PGQueuer.</i></p>
]]></description><pubDate>Wed, 29 Oct 2025 21:58:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=45753628</link><dc:creator>jeeybee</dc:creator><comments>https://news.ycombinator.com/item?id=45753628</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45753628</guid></item></channel></rss>