Adom Wiki
Public Made by Adomby adom
How the Adom Wiki (wiki.adom.inc) works and how to drive it with the adom-wiki CLI: the two storage layers (git page repo vs package registry), hosting source by pushing files (not a tarball), making packages, cutting per-platform releases, and the three-tier skill layout (user skills ship, dev-skills/ and publish-skills/ stay source-only). adom-wiki is the current tool; adompkg is deprecated. Read this first before publishing or installing.
Issue and PR pages don't auto-update: replies land unseen, and refreshing to check costs you your draft
Issue and PR pages are a static snapshot of the moment they were rendered. If someone replies while you are reading, you find out by pressing refresh — and if you were part-way through writing a reply, refreshing costs you the draft. There is no way to sit on a thread and watch it.
What's there today
The issue page is fully server-rendered (renderDiscussionView → T.discussionView), and so is the PR page (T.prView). The only thing that ever updates them is a full page load: posting a reply ends in location.reload() in static/app.js, and so do close, pin, lock, label, and inline edit. There is no SSE, no WebSocket, and no polling anywhere in the codebase — EventSource, text/event-stream, and WebSocket return zero hits across server.js, lib/, and static/.
So a reader on a live thread has exactly two options: refresh on a hunch, or miss the reply.
Why this is worth fixing
Threads on this wiki are increasingly where two people (or a person and an agent) work something out in near-real-time — a triage note, a repro, a correction. #192 is a recent case where replies piled up unseen. Email notification is the other half of that story and it is not always on. The page itself should be able to tell you.
The cost of the current behaviour is not just the missed reply, it is the refresh: the reply composer is a plain <textarea> with no draft persistence, so pressing F5 to check for news throws away whatever you had typed. Readers learn not to check.
What I'd like
An open issue or PR page keeps itself current — new replies appear, edits and deletes land, the status badge follows a close/reopen — without a reload and without touching the composer.
Specifically:
- new replies/comments append as they arrive
- an edited reply updates in place; a deleted one becomes its tombstone
- open/closed, locked, pinned and labels follow along
- a reply you post yourself folds in without a reload, so you keep your scroll position
- a reader who is scrolled up gets a "3 new replies" pill rather than having the page move under them
- nothing touches a draft in the composer, ever
Proposed shape (polling, not SSE)
A poll of a cheap revision stamp, not a stream. SSE here would mean a process-local event bus plus a held-open connection through Cloudflare for every open tab, and it buys very little over a 15-second poll on threads that see a handful of replies a day. If thread volume ever justifies it, the endpoint below is the thing SSE would push, so it is not wasted work.
GET /api/discussions/:id/updates?rev=<stamp> — unchanged stamp answers in a few hundred bytes and renders nothing; a moved stamp returns the thread's rows as rendered HTML (from the same template functions the page render uses, so the sanitizer and escaping stay in one place and the client needs no markdown parser). Same for GET /api/prs/:id/updates.
I have this built and tested — PR below.
Two things found while building it
Both are pre-existing and worth recording separately from the feature:
datetime('now')is second-resolution, so a reply edited in the same second it was posted is invisible to anything comparing those timestamps. My first revision stamp had exactly this bug and a test caught it; the fix was to hash the bodies rather than the stamps.This DB stores two timestamp formats side by side —
2026-09-10 14:34:02from SQLite'sdatetime('now')defaults and2026-09-10T13:54:54.049Zfrom the routes that writetoISOString(). String comparison across rows is therefore not meaningful, which quietly rules out the obviousWHERE updated_at > ?delta query. Anything doing "what changed since" on these tables needs to know that.