pressroom
Open-source org content pipeline

Ten-minute member logs in. A newsletter, a social post, and branded posters out.

Members file a short periodic log of what happened. pressroom compiles a month's public logs into publication drafts, renders an email-safe branded newsletter, and dresses HTML-first posters in four social formats — all from source, never hand-patched, signed off by one named approver.

The demo runs entirely in your browser on fictional seed data (Orbital Collective, a community lab that does not exist) — no server, no account, and nothing you do in it is saved.

0npm dependencies
4poster formats
2operating modes
1named approver
How it works

Six steps, one discipline: regenerate, never hand-patch

Raw logs are filed as-is and never rewritten. Everything downstream is generated from them — so corrections go into the source, and the outputs are rebuilt.

Log

Each member files a short weekly or monthly log: highlights, progress, people, the thing they learned, one line for the public. visibility: internal never leaves the repo.

Compile

A month's public logs are assembled into one compile input with provenance headers. Internal logs are excluded — and every exclusion is counted.

Draft

An AI pass — your key, your provider, or a local Ollama — drafts the newsletter, social post, and collateral brief. No invented facts; unknowns stay marked.

Dress

The brand extractor samples your website — colors, fonts, logo — into one tokens file. The poster engine itself ships zero brand values.

Author

Posters compose a fixed component vocabulary in four formats: 4:5, 1:1, 9:16, 16:9. One build inlines everything into a single standalone HTML file.

Approve

One named approver reads the notes — exclusions, unverified figures, open questions — and signs off. Nothing publishes before that.

The log form in the demo app: six section textareas (highlights, progress, people and meetings, learned, coming up, one line for the public), visibility and status selectors, and the bring-your-own-key AI tidy panel below The feed in the demo app: fictional Orbital Collective member logs grouped by ISO week, each card carrying submitted or draft and public or internal badges
See it, not a screenshot

Three live artifacts, straight from this repo's build

Everything below was generated by the same commands you would run for your own organization, using the fictional Orbital Collective seed content.

What is in the box

Small pieces with sharp contracts

Node 20 or newer, zero npm dependencies. The one optional install is playwright, and only for PNG and PDF export.

Two operating modes, one app

LOCAL is a node-stdlib server plus git — no accounts, no cloud. TEAM adds Google sign-in, Firestore, and hosting. The same SPA picks its backend at load, with no build step.

Email-safe branded newsletter

The renderer resolves your brand token values out of tokens.css and inlines them, because email clients do not support CSS custom properties. Table layout, 640px single column, inline styles only — it degrades sanely in Outlook and Gmail.

Public/internal redaction

A log filed as internal never enters any output — and every exclusion is counted, so the approver can see that redaction happened without seeing what was redacted. Visibility fails closed: anything but exactly public is excluded.

AI drafting, bring your own key

Anthropic, OpenAI, Gemini, or a local Ollama for the fully offline path. Keys live in your browser or your env vars — never in the database, never in git. The AI sorts and drafts; people decide.

Brand extraction from your website

Point the extractor at your site and it samples colors, fonts, and the logo into one tokens file, with a TODO(spot-check) comment on every judgment call. Posters stay on-brand by construction, not by review.

The TBD discipline

Any fact you do not actually have renders loud amber — in posters and in the newsletter alike — so a draft can never quietly pass as final. Grep for it before anything ships.

Quickstart

Local in about a minute

# Node >= 20. No npm install — there are no dependencies.
# (update the clone URL after the first publish of this repo)
git clone https://github.com/fritzhand/pressroom && cd pressroom

cp pressroom.config.example.json pressroom.config.json
node cli/serve.mjs        # the UI on http://localhost:8123

File a log, compile the month, build the branded newsletter from the Compile tab — or render the fictional sample issue with no setup at all: node newsletter/build.mjs --sample. Git is the collaboration layer; team mode with sign-in and a hosted dashboard is documented in the repo.

Honest limitations

What it does not do

Knowing the edges up front beats discovering them mid-rollout.