Readout
Turn session work into a shareable web page. You author MDX with JSX components
(never raw HTML), compile it to a themed static page, and publish it to a PocketBase
instance that serves the site, stores comments, and keeps version history — all on
one origin. Reviewers pin comments to any block; you read them back with a script.
Writing
A readout says what is true now: what the change does, what state the work is in, what
decisions are open. It is read once, skimmed, by a teammate or PM who was not in the
session. Four things to get right:
- State, not sequence. Describe what the change does, not the order you found it in.
Commit-by-commit accounts, "first we tried X then Y", and how-the-session-went narration
belong in the MR description. Use
Timeline only where the chronology is the reader's
subject (an incident, a rollout), never to recount your own work.
- Write the sentence that carries the fact. A line shaped for impact reads as
theatrical, and it drifts: shaping for punch is how a deliberate mock becomes something
that "sent into the void". Every claim has to survive a reader who knows the code.
- No em-dashes and no "it's X, not Y". Both are named AI-isms and both get noticed.
A full stop or a comma does the same work.
- Czech readouts get ordinary Czech, the words a colleague would say out loud. No
literary register, and no direct translation of an English term of art where a normal
Czech word exists.
intro on a Section is one plain sentence saying what the section covers. It is a
label rather than a hook, and it is optional: leave it off when the title already says it.
Pick components by what the content is: assets/example.mdx shows every callout and chip
type on one page because it is a catalogue, while a real readout uses the one or two that
apply, with a label naming the actual thing, and often uses none.
Paths & config
- Read
config.json next to this SKILL.md: root (default ~/git/readouts),
publicBaseUrl, pbUrl, pbToken, deployCmd.
- Project name:
basename "$(git -C . rev-parse --show-toplevel 2>/dev/null || pwd)".
- Source:
<root>/<project>/<slug>.mdx (slug = kebab-case of the title). Compiled HTML
lands next to it; galleries and _shared/ assets are managed by the scripts.
- Readouts are external to the work repo — never write them inside the project repo.
Generate & publish
- Write the MDX at
<root>/<project>/<slug>.mdx. Copy the component usage from
<skill-dir>/assets/example.mdx — it exercises every component and the frontmatter
(title required; |…| inside the title becomes the accented <em>; plus eyebrow,
lead, version, date). Available components: Section (auto-numbered), KeyPoints,
Callouts/Callout (success|info|warning|danger), Chips/Chip (blocker|risk|fyi),
Code / fenced blocks, Diagram (mermaid), DataTable (+Mark), History/Entry.
For review/recap readouts: Diff (patch = one full-file git diff with headers, not
a bare hunk — or oldText+newText; opt. filename/split) shows a change; Diagram html={…} swaps mermaid for rich HTML
(helpers diagram-panel/-lane/-layer/-arrow/-label) for swimlanes and layers;
Checklist/Check done for verification; Timeline/Event (time, title) for
chronology; StatTiles/Stat (label, value, delta?, trend?=up|down|flat) for
a KPI row; FileTree (paths={[{path, status, note}]}) for a touched-files map;
DocShelf/Doc (path required, title?, note?; children = the doc's markdown)
for embedding several full documents — file-tree sidebar, one doc visible at a time,
h2 sections collapsible (first open), per-doc expand-all. Anchor per pane:
doc-<kebab-of-path>.
Plain markdown works everywhere. Never use emoji as icons.
- Publish:
node <skill-dir>/scripts/publish.mjs <slug> --note "<what changed>".
It compiles (fix your MDX if the compile step fails and re-run), refreshes _shared,
rebuilds galleries, rsyncs to the server, and records the version in PocketBase
(skipped with a warning when pbToken is empty). Compile alone:
node <skill-dir>/scripts/compile.mjs <file.mdx>.
- Hand over the printed URL — that link is the deliverable.
Protected readouts (password)
To password-gate a readout (or when the frontmatter has protected: true), see
references/protected.md — encryption model, publish flags,
encrypted comments, and trade-offs.
Update (living document)
Re-runs edit the existing .mdx in place — same path, no new file. Bump version in
the frontmatter, prepend an <Entry> to <History>, and re-publish with a --note.
Comment anchors derive from section titles, so keep titles stable when revising or
existing comment threads detach.
Comments (the feedback loop)
Reviewers hover a block on the published page and pin a comment (no login). Each routes
to an audience (for the agent — default — or for a human) and can reply to another.
Read them back:
node <skill-dir>/scripts/read-comments.mjs [<project>/<slug> | <slug>] \
[--since <ISO>] [--new] [--all] [--consume] [--json]
Default output is unresolved comments only, threaded, each with its record id. --new
narrows to comments you haven't consumed yet; --all includes resolved ones. Writes need
pbToken: pass --consume to mark what you read as seen, and after addressing one mark it
resolved with read-comments.mjs --resolve <id>[,<id>...].
Visits (who viewed, when)
Every published page beacons one visit per tab-session into readout_visits (viewer =
the name the comment widget remembered, else "anonymous"). Reads need pbToken:
node <skill-dir>/scripts/read-visits.mjs [<project>/<slug> | <slug>] [--since <ISO>] [--days <n>] [--json]
No doc argument = summary across all docs. Bot user-agents are hidden by default
(--bots includes them). When the user asks "who viewed/opened my readout", run this.
Comments tagged [for human] are not yours to resolve — surface them to the user.
Anchors map to the document: masthead, s-<section-slug>, or <section-slug>-<type>-<n>
(type = callout|diagram|code|table|keypoints|diff|checklist|timeline|stattiles|filetree,
ordinal in the section). When the user asks "any comments?", run the script and act on
what it returns. No notification path — check when asked or before updating.
Server
PocketBase on the Hetzner VPS (readout-pb.service, port 8091, /opt/readout) serves
pb_public at https://readout.ssscribe.app and hosts the two collections. One-time setup,
collection import, and the pbToken minting procedure live in server/setup.md. The
hetzner-vps skill documents the box itself.
Notes
- Theme: one stylesheet, light+dark via
prefers-color-scheme plus a masthead toggle.
- Every publish snapshots the full MDX in PocketBase (restore procedure:
references/protected.md).
- The compile pipeline has npm deps — run
npm install in <skill-dir> once per machine.
artifact.js (theming, highlight.js, tables), comments.js, and visits.js load on
every page; comments and visits no-op when the file is opened from disk.
- The old artifact skill stays untouched for local-first, zero-dep documents.
1---2name: readout3description: Generate, update, and publish a "readout" — an MDX-authored, themed session document (walkthrough, plan, comparison, investigation, changelog) compiled to HTML and published to readout.ssscribe.app, where teammates leave anchored comments the agent reads back into the session. Successor to the artifact skill, built for sharing. Use when the user asks to "make/create/publish a readout", wants session output as a shareable link, asks to update an existing readout, or asks to read/check comments on a readout.4---56# Readout78Turn session work into a shareable web page. You author **MDX with JSX components**9(never raw HTML), compile it to a themed static page, and publish it to a PocketBase10instance that serves the site, stores comments, and keeps version history — all on11one origin. Reviewers pin comments to any block; you read them back with a script.1213## Writing1415A readout says what is true now: what the change does, what state the work is in, what16decisions are open. It is read once, skimmed, by a teammate or PM who was not in the17session. Four things to get right:1819- **State, not sequence.** Describe what the change does, not the order you found it in.20 Commit-by-commit accounts, "first we tried X then Y", and how-the-session-went narration21 belong in the MR description. Use `Timeline` only where the chronology is the reader's22 subject (an incident, a rollout), never to recount your own work.23- **Write the sentence that carries the fact.** A line shaped for impact reads as24 theatrical, and it drifts: shaping for punch is how a deliberate mock becomes something25 that "sent into the void". Every claim has to survive a reader who knows the code.26- **No em-dashes and no "it's X, not Y".** Both are named AI-isms and both get noticed.27 A full stop or a comma does the same work.28- **Czech readouts get ordinary Czech**, the words a colleague would say out loud. No29 literary register, and no direct translation of an English term of art where a normal30 Czech word exists.3132`intro` on a `Section` is one plain sentence saying what the section covers. It is a33label rather than a hook, and it is optional: leave it off when the title already says it.34Pick components by what the content is: `assets/example.mdx` shows every callout and chip35type on one page because it is a catalogue, while a real readout uses the one or two that36apply, with a `label` naming the actual thing, and often uses none.3738## Paths & config3940- Read `config.json` next to this SKILL.md: `root` (default `~/git/readouts`),41 `publicBaseUrl`, `pbUrl`, `pbToken`, `deployCmd`.42- Project name: `basename "$(git -C . rev-parse --show-toplevel 2>/dev/null || pwd)"`.43- Source: `<root>/<project>/<slug>.mdx` (slug = kebab-case of the title). Compiled HTML44 lands next to it; galleries and `_shared/` assets are managed by the scripts.45- Readouts are **external to the work repo** — never write them inside the project repo.4647## Generate & publish48491. **Write the MDX** at `<root>/<project>/<slug>.mdx`. Copy the component usage from50 `<skill-dir>/assets/example.mdx` — it exercises every component and the frontmatter51 (`title` required; `|…|` inside the title becomes the accented `<em>`; plus `eyebrow`,52 `lead`, `version`, `date`). Available components: `Section` (auto-numbered), `KeyPoints`,53 `Callouts`/`Callout` (success|info|warning|danger), `Chips`/`Chip` (blocker|risk|fyi),54 `Code` / fenced blocks, `Diagram` (mermaid), `DataTable` (+`Mark`), `History`/`Entry`.55 For review/recap readouts: `Diff` (`patch` = one full-file git diff with headers, not56 a bare hunk — or `oldText`+`newText`; opt. `filename`/`split`) shows a change; `Diagram html={…}` swaps mermaid for rich HTML57 (helpers `diagram-panel`/`-lane`/`-layer`/`-arrow`/`-label`) for swimlanes and layers;58 `Checklist`/`Check done` for verification; `Timeline`/`Event` (`time`, `title`) for59 chronology; `StatTiles`/`Stat` (`label`, `value`, `delta?`, `trend?`=up|down|flat) for60 a KPI row; `FileTree` (`paths={[{path, status, note}]}`) for a touched-files map;61 `DocShelf`/`Doc` (`path` required, `title?`, `note?`; children = the doc's markdown)62 for embedding several full documents — file-tree sidebar, one doc visible at a time,63 h2 sections collapsible (first open), per-doc expand-all. Anchor per pane:64 `doc-<kebab-of-path>`.65 Plain markdown works everywhere. Never use emoji as icons.662. **Publish:** `node <skill-dir>/scripts/publish.mjs <slug> --note "<what changed>"`.67 It compiles (fix your MDX if the compile step fails and re-run), refreshes `_shared`,68 rebuilds galleries, rsyncs to the server, and records the version in PocketBase69 (skipped with a warning when `pbToken` is empty). Compile alone:70 `node <skill-dir>/scripts/compile.mjs <file.mdx>`.713. **Hand over the printed URL** — that link is the deliverable.7273## Protected readouts (password)7475To password-gate a readout (or when the frontmatter has `protected: true`), see76[references/protected.md](references/protected.md) — encryption model, publish flags,77encrypted comments, and trade-offs.7879## Update (living document)8081Re-runs edit the existing `.mdx` in place — same path, no new file. Bump `version` in82the frontmatter, prepend an `<Entry>` to `<History>`, and re-publish with a `--note`.83Comment anchors derive from section titles, so keep titles stable when revising or84existing comment threads detach.8586## Comments (the feedback loop)8788Reviewers hover a block on the published page and pin a comment (no login). Each routes89to an audience (**for the agent** — default — or **for a human**) and can reply to another.90Read them back:9192```bash93node <skill-dir>/scripts/read-comments.mjs [<project>/<slug> | <slug>] \94 [--since <ISO>] [--new] [--all] [--consume] [--json]95```9697Default output is unresolved comments only, threaded, each with its record id. `--new`98narrows to comments you haven't consumed yet; `--all` includes resolved ones. Writes need99`pbToken`: pass `--consume` to mark what you read as seen, and after addressing one mark it100resolved with `read-comments.mjs --resolve <id>[,<id>...]`.101102## Visits (who viewed, when)103104Every published page beacons one visit per tab-session into `readout_visits` (viewer =105the name the comment widget remembered, else "anonymous"). Reads need `pbToken`:106107```bash108node <skill-dir>/scripts/read-visits.mjs [<project>/<slug> | <slug>] [--since <ISO>] [--days <n>] [--json]109```110111No doc argument = summary across all docs. Bot user-agents are hidden by default112(`--bots` includes them). When the user asks "who viewed/opened my readout", run this.113114Comments tagged `[for human]` are not yours to resolve — surface them to the user.115Anchors map to the document: `masthead`, `s-<section-slug>`, or `<section-slug>-<type>-<n>`116(type = callout|diagram|code|table|keypoints|diff|checklist|timeline|stattiles|filetree,117ordinal in the section). When the user asks "any comments?", run the script and act on118what it returns. No notification path — check when asked or before updating.119120## Server121122PocketBase on the Hetzner VPS (`readout-pb.service`, port 8091, `/opt/readout`) serves123`pb_public` at https://readout.ssscribe.app and hosts the two collections. One-time setup,124collection import, and the `pbToken` minting procedure live in `server/setup.md`. The125hetzner-vps skill documents the box itself.126127## Notes128129- Theme: one stylesheet, light+dark via `prefers-color-scheme` plus a masthead toggle.130- Every publish snapshots the full MDX in PocketBase (restore procedure:131 [references/protected.md](references/protected.md)).132- The compile pipeline has npm deps — run `npm install` in `<skill-dir>` once per machine.133- `artifact.js` (theming, highlight.js, tables), `comments.js`, and `visits.js` load on134 every page; comments and visits no-op when the file is opened from disk.135- The old artifact skill stays untouched for local-first, zero-dep documents.