AI needed a format for Context. It got one.

TL;DR: faf-cli v6 is a ground-up Bun-native rewrite. 94% smaller. MCP server detection for 10 frameworks. Python and Rust support. Format version 3.0. And now — three letters is all it takes.

Three Letters

faf

That's it. No arguments. No flags. faf auto-detects your project, creates or enriches your .faf file, and scores it. From any directory. In any project.

  • No .faf? Creates one.
  • Has .faf? Enriches it.
  • Never overwrites.

bunx faf (7 chars). npx faf (6 chars). From anywhere.

The Rewrite

v6 is not an upgrade. It's a rebuild. Same format, everything else new.

v5
v6
Source
53,214 lines
3,182 lines
Package
850 KB
95 KB
Files in tarball
728
6
Slots
21 (Mk3.1)
33 (Mk4)
Scoring
TypeScript
WASM (Rust)
Runtime deps
10+
4

MCP Server Detection

10 MCP frameworks. Auto-detected. Your MCP server gets the right type, backend, and framework sub-type.

project:
  type: mcp
  framework: fastmcp
stack:
  backend: FastMCP
  api_type: MCP (stdio/SSE)

Tested against real repos:

  • claude-faf-mcp — 44% cli → 59% mcp
  • grok-faf-mcp — 44% cli → 59% mcp
  • gemini-faf-mcp — 33% library → 41% mcp

Python & Rust

Project name, description, and dependencies read from pyproject.toml and Cargo.toml. FastAPI, Django, Flask, SQLAlchemy, rmcp — all detected from manifests.

Next.js now supersedes React. Nuxt supersedes Vue. SvelteKit supersedes Svelte. Meta-frameworks win.

Why We Sunset v5

v5 did its job. It proved the format, got the IANA registration, shipped 45k+ downloads, and earned Anthropic's MCP #2759 merge. But it was carrying weight from every pivot and experiment along the way.

  • 53,214 lines for a CLI that generates a YAML file
  • 10+ runtime dependencies — webpack configs pointing to files that didn't exist
  • 850 KB package with 728 files in the tarball
  • Jest test runner fighting with Bun's single-process model

The architecture served its purpose. The format won. The code needed to go. Read the Sunset Edition post →

What's New in v6

MCP Server Detection

10 MCP frameworks architected. Your MCP server gets the right project type, backend slot, and framework sub-type — automatically. @modelcontextprotocol/sdk, fastmcp, mcp (Python), rmcp (Rust), plus Go, .NET, and more queued.

Format Version 3.0

All generated .faf files now use faf_version: "3.0". Cascades to migrate, TAF receipts, and share URLs. Your existing files still work — the WASM kernel accepts any version.

Python & Rust Support

Project name and description from pyproject.toml and Cargo.toml. Dependencies parsed for stack detection — FastAPI, Django, Flask, SQLAlchemy, rmcp, all detected from manifests.

Meta-Framework Supersede

Next.js beats React. Nuxt beats Vue. SvelteKit beats Svelte. When a meta-framework is detected alongside its base, the meta-framework wins.

Safe Sync

Sync never overwrites existing CLAUDE.md. Stamps a <!-- faf: ... --> meta tag at line 1 — invisible to renderers, visible to AI. Idempotent. Your hand-crafted content is sacred.

Pre-Commit Lint

Lint errors blocked at commit time. Warnings pass. No more red CI from a missing semicolon.

Three Letters

faf with no arguments runs faf auto. Creates or enriches. Never overwrites. Three letters to AI context.

33 Slots — Solo to Fortune 500

Mk4 scores 33 slots across 8 categories. A solo dev's CLI tool uses 9 active slots. An enterprise full-stack monorepo uses all 33. Same format, same engine, same score — the slots that don't apply are slotignored.

From a weekend project to a Fortune 500 codebase. One format scales.

FAFb — The Compiled Binary

faf compile turns your .faf into a sealed .fafb binary. 32-byte header, CRC32 checksum, priority-ordered sections. The score is baked in at compile time — no re-scoring, no divergence.

YAML is source code. FAFb is compiled output. WASM is the compiler. The Triangle of Trust.

Why Does AI Need Context?

Without context, AI guesses. It suggests the wrong framework, the wrong patterns, the wrong conventions. It hallucinates architecture. It introduces bugs you won't find until production.

With context, AI knows. Your stack. Your conventions. Your architecture. Every session. Every tool. No re-explaining.

That context needs a format. Not prose — structure. Not a README — a machine-readable file that any AI can parse in milliseconds.

AI likes structured data. Give it the facts in YAML — your stack, your conventions, your architecture. Then use your tokens on custom instructions that actually matter. Don't waste them explaining that you use Next.js for the hundredth time.

What is WASM?

WebAssembly. The same Rust scoring engine runs in your terminal, in your browser, at the edge, in Node, in Bun. One binary, any platform. The score is deterministic — Claude, Gemini, Grok, Cursor all score the same file the same way.

No server. No API calls. No network dependency. The compiler runs locally. 284 microseconds per score.

Why FAF is Different

CLAUDE.md is instructions. AGENTS.md is agent config. .cursorrules is Cursor-specific. Every AI tool invented its own context file. None of them are portable. None of them are scorable. None of them are registered standards.

FAF is the format layer underneath all of them. IANA-registered. Machine-readable. Universal. One .faf file syncs to CLAUDE.md, AGENTS.md, GEMINI.md, and .cursorrules. Define once, use everywhere.

Why not just use CLAUDE.md? Because it only works with Claude. GEMINI.md only works with Gemini. AGENTS.md only works with agent frameworks. .cursorrules only works with Cursor. Conductor only works with Conductor.

.faf works with all of them. And it generates them. faf export --agents --cursor --gemini — one source, every format.

The others are instructions. FAF is infrastructure.

Why It Matters

Every AI tool starts from zero. You open Claude, explain your stack, describe your architecture, list your conventions. Next session — same thing. New tool — same thing.

10 lines of structured YAML gives AI more context than 550 lines of prose. That's not a feature. That's a format.

project.faf sits next to package.json. It versions with your code. Every clone, every fork, every checkout — full AI context. No setup, no drift, no re-explaining.

Markdown wasn't built to define schema for AI. YAML was. That's why package.json isn't a package.md. That's why tsconfig.json isn't a tsconfig.md. And that's why AI context shouldn't live in a markdown file either.

FAF defines. CLAUDE.md instructs. AI consumes.

Try It

bunx faf-cli auto

Or just:

faf

The Numbers

  • v6.0.10 — Released March 28, 2026
  • 375/375 — Tests passing
  • 100% — Trophy score (faf-cli scores itself)
  • 45,000+ — Downloads across npm, PyPI, crates.io
  • IANA registeredapplication/vnd.faf+yaml