framejam
AGENTS.md67 starsChanged 21 days agoMITView on GitHub
FrameJam is a plugin for Claude Code, ChatGPT (Work and Codex) and Cursor, plus a small local app that sits next to the agent and helps the user make videos with it. The agent builds the video with whatever tool the project already uses (Hyperframes, Remotion, Motion Canvas, ffmpeg, screen recordings) and talks to FrameJam over MCP. It's one Node server plus a React UI, with no account and no upload: projects are JSON files in ~/.framejam. Published to npm…
- Commits and pushes
We split this AGENTS.md into the rules it gives an agent
5 rules. About 0 are common, 1 is distinctive, and 4 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
Distinctive · estimate
This author's own choices. Worth a look.
4
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- could be automatic: a setting could enforce it
- Very specific: line 61
Check with npx tsc --noEmit, npm run lint and npm run build before pushing.
- Distinctive: line 78
Run typecheck, lint and tests before every commit.
- Very specific: line 170
If npm publish fails with E404 Not Found - PUT https://registry.npmjs.org/framejam, the npm login expired (npm whoami returns 401).
- Very specific: line 195
Plugin: after editing the skill or bumping the version, run npm run sync:plugin (npm version does it for you).
- Very specific: line 200
Commands and options: if you change CLI commands, MCP tools, env vars or install steps, update README.md and the website docs …
≈ “Common” is an estimate: at least 1 in 5 of the 36,368 AGENTS.md files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
FrameJam
FrameJam is a plugin for Claude Code, ChatGPT (Work and Codex) and Cursor, plus a small local app that sits next to
the agent and helps the user make videos with it. The agent builds the video with whatever tool the project already
uses (Hyperframes, Remotion, Motion Canvas, ffmpeg, screen recordings) and talks to FrameJam over MCP. It's one Node
server plus a React UI, with no account and no upload: projects are JSON files in ~/.framejam. Published to npm as
framejam; source on GitHub at moritzkremb/framejam, which is also the plugin's marketplace for Claude and ChatGPT.
What it does
The core of the app, and what every change should be judged against:
- Styles. 30 built-in style presets with example videos. A style is a look, not a starting video: the user
names one (or picks it on a page) and the agent builds that subject in the style's palette, textures, fonts, motion
and pacing, bending them where needed. Nothing is selected ahead of time; a pick is saved on the project. The
guideholds look rules that work for any subject;examplesays what the preview shows so agents don't copy that scene. Users can add their own. - Video review. The agent renders an mp4 and opens it as a project. The user comments at a time, on a spot in the frame, on a range of the timeline or on the whole video, then presses Finish review. The agent gets every comment with its timestamp and a frame image (with the pin drawn on it), makes the next version, and the round repeats.
- Storyboards. The same review loop on a set of still panels, one per shot, before anything is animated.
- Playbooks. The method for one kind of video (a music video, a talking-head short, a product launch...): what the
user brings, the steps, the tools it needs and the quality bar, as defaults the user's request overrides. Styles set
the look; playbooks set how it's made. The user names one, or picks on a page (
/framejam playbook→open_picker, thenwait_for_pick). Each playbook is an agent skill folder plus aplaybook.jsonwith a creator, so outside creators can submit their own later. - Any video tool. FrameJam always reviews the rendered file. It doesn't care how the video was made.
Styles vs playbooks. A playbook is what you're making and how (inputs, steps, tools, length, story arc,
quality bar); a style is how it looks (palette, type, texture, motion, tempo), never a beat order or content rules.
Two checks for anything new: a style should make sense for a launch, an explainer and a talking-head short; a
playbook should still be the same playbook in three very different styles. If the steps or what the user brings
change, it's a new playbook; if only the look changes, it's a style. A playbook can list styles made for it
(featuredStyles: a note, ready settings for its template, and its own example video in previews/<style id>/);
any other style still works as its styles field says. examples adds more finished videos made with a playbook
that aren't a library style (another route or look), with their own previews/<id>/. Style names describe the look ("Midnight Glow"), not a kind
of video.
A toolkit, not a process. FrameJam should feel like an extension of the user's agent: fast, flexible, with as few prescribed steps as possible. Skills and playbooks give defaults, never gates: no question rounds before building, no plans to approve, no mandatory storyboards or planning documents. The user's request always wins.
Videos are mp4-only. The review page always plays the rendered file. There used to be a beta live Hyperframes
player (compositionDir) that resolved clicks to DOM elements; it was removed because it could show something other
than the render. Don't bring back composition playback. A pinned comment's frame image has the pin drawn on it, which
is how the agent sees what was clicked. MCP tools still accept and ignore compositionDir from older skills. Style
presets ship their example as a Hyperframes project, as plain files agents can look at for techniques (not copy as a
starting point); the app itself doesn't run Hyperframes. Don't
present FrameJam as a Hyperframes tool, and never tell agents to convert a project to another tool.
The website
https://www.framejam.ai (landing page, Styles gallery, docs) is a separate repo:
- Local:
/Users/moritzkremb/Coding Projects/framejam-site(../framejam-sitefrom here) - GitHub:
moritzkremb/framejam-site - Next.js 16 on Vercel. Every push to its
maindeploys to production; other branches get preview deploys. - Where things are:
app/page.tsx(landing page),app/docs/(install, review, storyboards, custom styles, MCP tools, troubleshooting),app/guides/(walkthroughs for search, listed inlib/guides.ts),lib/site.ts(install prompt and commands),public/presets/(preview videos the app streams). - Check with
npx tsc --noEmit,npm run lintandnpm run buildbefore pushing. - Work and commit directly on
mainthere too, with no feature branches or pull requests unless asked. Since a push is a production deploy, push only once the checks pass.
Commands
npm run dev # API on :2400 (tsx watch) + Vite UI on :2401
npm test # vitest
npm run typecheck
npm run lint # oxlint; warnings are known, errors are not ok
npm run build # tsc + vite + tsup → dist/
npm run sync:rule # after editing skills/framejam/SKILL.md (a test fails if you forget)
npm run sync:plugin # same, for the plugin's copy of the skill and its manifests
claude plugin validate ./plugin --strict # before a release that changes plugin/Run typecheck, lint and tests before every commit.
The skill has a Skill version: N line. Raise N whenever the skill changes after a release: npm version records each
released skill's fingerprint in skills/framejam/versions.json and fails if a released version's text changed. The app
and the MCP server tell users when an installed copy of the skill is older than the one FrameJam ships.
Work and commit directly on main. This is a solo project, so don't create feature branches or pull requests unless
asked. Push to GitHub yourself without asking (in both repos), once the checks pass and the release order below allows
it. The only step the user has to do is npm publish, because it needs their 2FA code.
Layout
src/server/cli.ts: CLI (install,start,serve,--stdio).src/server/install.ts: whatframejam installdoes (installs the plugin in each app and removes the setup from before plugins; from a source checkout it adds the MCP server and skill instead, so the apps run the checkout's build).src/server/catalog*.ts: the catalog of playbooks and styles (format and verification, public keys, download and cache, andlayerCopies, which picks the bundled, catalog or user copy for every kind);scripts/catalog.tsbuilds and signs it (Moritz only). Seedocs/catalog.md.plugin/: the plugin, one folder for all three apps. Claude reads.claude-plugin/plugin.json; ChatGPT and Cursor read the portableplugin.jsonandmcp.json; all readskills/(start,playbook,style, so the commands are/framejam:startetc.). The manifests,mcp.jsonandskills/startare generated bynpm run sync:pluginfrompackage.jsonand the main skill; editskills/playbook,skills/styleandREADME.mdthere by hand. The MCP server is pinned to the npm version (npx -y framejam@X.Y.Z --stdio). The repo lists it in.claude-plugin/marketplace.json(Claude) and.agents/plugins/marketplace.json(ChatGPT). Cursor also loads plugins installed in Claude Code, so it only gets its own copy (~/.cursor/plugins/local/framejam, from the npm package) when Claude Code doesn't have FrameJam; otherwise Cursor would list it twice.src/core/: code that runs anywhere, with no Node or filesystem imports (the web typecheck andtests/core.test.tsenforce it): types, playbook display helpers, feedback formatting, the MCP tools (core/mcp.ts, given a store and base URL) and theStoreinterface (core/store.ts: reviews, comments, picks, state, presets, playbooks).src/server/mcp.tsadds the local skill version;src/server/app.ts: HTTP routes. Both only useStore;src/server/json-store.tsis its JSON implementation in~/.framejam. Any new store must pass the contract suite intests/store-contract.ts.src/web/: the UI.src/web/components/setup-steps.tsxhas the setup prompt. The review screens read and write through aReviewDataSource(src/web/lib/data-source.ts), never/apidirectly;localDataSourceis the local server.tests/web/renders them with a fake one.skills/framejam/SKILL.md: the agent skill..cursor/rules/framejam.mdcis generated from it.playbooks/: the built-in playbooks, one folder each:playbook.json(schema insrc/shared/types.ts, checked byvalidatePlaybookinsrc/shared/playbooks.ts),SKILL.md(the method), optionalreferences/,scripts/,engine/ortemplate/, andposter.jpg. Like styles, theirpreview.mp4lives only on the website (../framejam-site/public/playbooks/<id>/). Users' own playbooks go in~/.framejam/playbooks/. Every playbook hasminAppVersion(the first app version that can use it). Playbooks also reach users through the signed catalog (see "The catalog" below).presets/: the 30 built-in styles (style.json, checked byvalidateStyleinsrc/core/presets.ts, pluscomposition/andposter.jpg). Theirpreview.mp4files aren't in the npm package; the app streams them fromframejam.ai/presets/<id>/preview.mp4, which the website serves from../framejam-site/public/presets. Every style hasversionandminAppVersionand also reaches users through the catalog.videos/: the landing video and other video projects. Ignored by git and kept only on the user's machine; never delete or rewrite them unless asked.design/: the design system. Neither is shipped.
Releasing: what needs npm and what doesn't
A push to GitHub doesn't reach users of the npm package. When you finish a change, tell the user which of these it is.
Needs an npm release (users only get it after publishing): anything in src/ (UI, MCP tools, CLI, install
messages), plugin/, skills/framejam/SKILL.md, and package.json dependencies. Playbooks and styles too, unless
they go out through the catalog (next section).
The plugin and the npm package ship together. Claude Code and ChatGPT fetch the plugin from GitHub main, and
the plugin runs the exact npm version it names. So the version bump (npm version, which also runs sync:plugin and
stages plugin/) and npm publish must happen before the push, as the release command below does: pushing a
plugin that names an unpublished version breaks every install. Plugin users only get a skill change when the version
changes, so skill edits go out with the next release. Claude Code installs update on their own; everyone else gets
the new version by rerunning npx -y framejam@latest install, which the app's update notice tells them.
Anthropic's directory. The plugin is submitted at claude.ai/directory/manage (folder plugin, branch main,
listed on Claude Code only, since claude.ai chat can't run its local server). The directory scans every new commit on
main, and each new version is held for a reviewer because the plugin launches FrameJam from npm; the reviewer has
to approve it before it can be published from the plugin's page. The listing reads plugin/.claude-plugin/plugin.json
and plugin/README.md; keep the README's list of what leaves the user's computer accurate, since the submission's
data-handling answers rely on it.
Doesn't need one:
- A change only to playbooks or styles (files under
playbooks/orpresets/, from 0.6.0 on): raise the item'sversionand publish the catalog instead (step C indocs/catalog.md). Installs pick it up within 6 hours or on restart. It still needs a release if the item relies on newer app code (an MCP tool or field, a manifest field older validators reject): raise itsminAppVersionand release. - Preview videos and the website: they deploy from
../framejam-site. README.md(the npmjs.com copy only refreshes on the next release, which is fine),design/,tests/,scripts/.
Release when a batch of user-facing changes is ready, not per commit. Version bumps: patch for fixes, minor for new features, major for breaking changes.
To release, the user runs one command (it needs their 2FA code for npm publish, which builds and tests first).
Whenever a change needs a release, give the user this as a single line with the version filled in. npm version
refuses to commit when anything else is uncommitted, hence --no-git-tag-version and the manual commit and tag. The last part
deploys the website, so it comes after the publish:
cd "/Users/moritzkremb/Coding Projects/framejam" && npm version X.Y.Z --no-git-tag-version && git add package.json package-lock.json && git commit -m "X.Y.Z" && git tag vX.Y.Z && npm publish && git push origin main --tags && cd ../framejam-site && git push origin mainIf npm publish fails with E404 Not Found - PUT https://registry.npmjs.org/framejam, the npm login expired (npm whoami
returns 401). The bump, commit and tag already happened, so continue with
npm login && npm publish && git push origin main --tags && cd ../framejam-site && git push origin main.
Push to main only after the npm release is live if the README or website already describe the new behavior.
The catalog
docs/catalog.md is the full guide: how the app downloads and verifies playbooks and styles, the off switches, how to
add another kind, and Moritz's steps (generate keys, embed the public keys, sign and publish, first rollout).
npm run catalogsigns with a private key that lives only in Moritz's macOS Keychain, with an approval prompt per use. Only he runs it, never CI. Never generate, read or print that key, and never run the signing form yourself: for tests and local tries usenpm run catalog -- --test-key --out <folder>and the committed test key intests/.- The public keys in
src/server/catalog-keys.tsare the root of trust; the app rejects any catalog until they're embedded, andnpm publishstops (prepublishOnly) unless the table holds exactly two keys. - A change to
playbooks/orpresets/means the catalog needs publishing:npm run catalog -- --checkreports drift, and the site copies (../framejam-site/public/playbooksandpublic/presets) are updated by the same command. - Catalog-only playbooks and styles are left out of the npm package with a
"!playbooks/<id>"or"!presets/<id>"line inpackage.jsonfiles(a test checks the lines against the catalog andnpm pack). - Network list: the catalog is a request that downloads code, so keep
README.mdandplugin/README.mdaccurate when it changes.
Keep in sync
- Plugin: after editing the skill or bumping the version, run
npm run sync:plugin(npm versiondoes it for you); tests fail whenplugin/is stale. The commands users type are/framejam:start,/framejam:playbookand/framejam:style; keep them the same in the app's UI,README.mdand the website. - Install prompt:
setupPrompt()insrc/web/components/setup-steps.tsxandinstallPrompt()in../framejam-site/lib/site.tsmust match word for word. - Commands and options: if you change CLI commands, MCP tools, env vars or install steps, update
README.mdand the website docs (../framejam-site/app/docs/) too. - Styles: adding or removing a built-in preset also means adding or removing its folder in
../framejam-site/public/presets(preview.mp4, poster.jpg and an identical style.json) and updating the counts and lists inREADME.md. After changing a style, raise itsversion, runnpm run catalog -- --checkand tell the user the catalog needs publishing. - Playbooks: the same for
../framejam-site/public/playbooks(preview.mp4, poster.jpg and an identical playbook.json, pluspreviews/<id>/preview.mp4andposter.jpgfor each featured style and example) and the list inREADME.md. The display helpers insrc/shared/playbooks.ts(needs groups, cost badge, styles sentence, copy prompt) have a copy in../framejam-site/lib/playbooks.ts; change both together. After changing a playbook, runnpm run catalog -- --checkand tell the user the catalog needs publishing.
Writing
User-facing text (UI, README, docs, CLI output) is plain and short. Say "project" to users, not "review". Present FrameJam as a plugin for Claude, ChatGPT and Cursor; users understand that better than "MCP server".
Where files are headingNew AGENTS.md files have more rules about keeping secrets out of the code, and fewer about code style.
Of the AGENTS.md files we read, the 28,693 first seen in the last six months, against the older ones: the kind of rule that gained most share, and the kind that lost most. About files like this in general, not this one, and an estimate, since a kind is a pattern in the words.
In this repository3 other files it gives its agents.
- CLAUDE.mdCLAUDE.md
- .cursor/rules/framejam.mdcCursor rule
- framejamSkill
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

