← All projects

MMT Content Desk

An internal idea generator for on-site and social media content

OwnedInternal Tool2026

Next.js · Neon · X API v2 · Ghost Admin API · FRED API · resvg

What it is

An internal idea generator for Modern Macro Technologies, the research publication I own. It draws on X, the house framework, our own archive and scorecard, and the live dashboard readings to produce on-site and social media content. It knows only this one publication's material and is useless without it.

The deck. Every idea is generated against live model readings and the market tape, not against a blank prompt.

What it does

Four modes. Post ideas are generated against the house framework, the archive of past calls and their scorecard, live model readings pulled from the dashboard's database, and the market tape. A watchlist reads recent posts from a set of niche X accounts, ranks them by engagement and drafts replies; its roster can be imported straight from an X List rather than typed in, and a fourth mode takes a pasted post as a manual reply target. Site posts are graded against the publication's own attribution: a daily job pulls every published post's signups, clicks and opens, classifies them by type and topic, and generation leans toward what has actually converted, not toward what feels good. Each idea expands into its citations and a short argument for why now, and the primary action on a card writes that brief into a finished draft and files it into Ghost, free or paywalled, with a server-rendered chart. Two limits are absolute: nothing ever posts to social, and Ghost only ever receives drafts. Publishing stays a human action.

An idea expanded into its receipts — the series it was drawn from, with sources, and the argument for why it is worth saying today.
The chart library — the same server-side builder that draws charts into filed drafts also renders them here as downloadable PNGs.

How it's built

Next.js on Vercel behind a shared password. Generation runs on the Claude API against a corpus of about fifty thousand tokens, prompt-cached so a working session costs cents after the first call. Charts come from one shared SVG builder rendered to PNG with resvg and a bundled font, and the same builder serves both the drafts and a browsable chart library. When the CMS or the data API is unreachable, generation still runs and says so on the card rather than failing.

The X side is two connections doing different jobs. Watchlist reads run on an app-only bearer token and are billed per post read, so refreshes are batched and a re-read inside the same day is not paid for twice — a twelve-account refresh lands around fifty cents, which is the kind of number that has to shape the design rather than be discovered later. Anything account-specific — importing a List, reading an account's own posts — goes through OAuth2 with PKCE, and the tokens are encrypted before they are stored. The scopes requested are read-only: tweet.read, users.read, list.read, offline.access. That is what makes "nothing ever posts to social" a property of the credentials rather than a promise in the code. A second loop reads the accounts' own posts, scores them by engagement and keeps a rolling performance summary that feeds back into generation, so the desk is pulled toward what actually landed.

Working with Claude

Every card carries its citations, and every chart is drawn from a stored series instead of from anything the model remembers. That constraint came first and the rest of the tool was built behind it, because an idea generator that invents a figure is worse than no generator at all for a research publication. The voice was handled the same way: rather than describing the house register in a prompt, a script extracts it from the archive of published posts, so what comes back is derived from the account's own history. Claude wrote the extractor and the thing that consumes it, which is a fair summary of where this kind of tool is strongest: building the plumbing that keeps a model's output tied to something checkable.