MMT Content Desk
An internal idea generator for on-site and social media content
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.
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.
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.