Sync
Bidirectional with conflict detection.
Per-entity baselines via .grantkit/state.json. Push
blocks on cloud drift; --force when you mean it.
GrantKit keeps your proposals in Supabase for team access and sharing, and on disk as plain markdown so Claude Code, Cursor, and any other agent can read, edit, and validate them the way they already edit code.
pip install grantkit · MIT licensed · v0.1 · source at github.com/GrantKit
The medium
A grant is a set of markdown files, a budget, a bib file, and a baseline that knows what the cloud looked like at your last sync.
Why we wrote this
2023 was the year of the chatbot. 2024, RAG and finetuning. 2025, MCP and tool use. 2026 will be the year of the computer environment and filesystem.
— Alex Albert, Anthropic · see the post
Your coding agent is already world-class at reading a directory of files, proposing a surgical edit, explaining why, and handing you a reviewable diff. That is exactly how a proposal wants to be written. So we stopped trapping grants in a web UI and started treating them like what they are: writing, held in files, on a filesystem, where your tools live.
i. Context
A web form hands the model a 2,000-token excerpt. A filesystem hands it the budget, last year's proposal, the solicitation, the reviewer's letter, and every response you've drafted — and lets it decide what to pull in.
ii. Provenance
Git remembers. An "undo" button forgets. When your broader impacts section drifts over three weeks of revisions, you want a line-level history you can bisect and blame, not a modal that asks if you're sure.
iii. Portability
Claude today, a local model tomorrow, a new frontier system next quarter. A grant stored as markdown outlives every LLM vendor and every SaaS company in the category.
GrantKit's CLI tracks a per-machine baseline of the cloud. Pushes detect when a teammate moved on since your last pull and refuse to overwrite their work. Pulls never clobber local edits. The same motions you use for code, for writing.
~/grants/ as markdown. $ grantkit sync status Sync plan ────────────────────────────────────────── local modified locally nsf-cssi/responses/broader_impacts.md local modified locally nsf-cssi/responses/project_summary.md cloud modified on cloud arnold-labor/responses/team.md ────────────────────────────────────────── modified locally: 2, modified on cloud: 1 $ grantkit sync pull ✓ Kept nsf-cssi/responses/broader_impacts.md (local changes) ✓ Kept nsf-cssi/responses/project_summary.md (local changes) ✓ Pulled arnold-labor/responses/team.md $ claude "Tighten the broader impacts section to 2500 words and add a specific undergraduate outreach plan." ...editing responses/broader_impacts.md... ✓ 2,498 words. Draft updated. $ grantkit sync push ✓ Push complete
Not a screenshot. Run the commands yourself with
pip install grantkit.
Sync
Per-entity baselines via .grantkit/state.json. Push
blocks on cloud drift; --force when you mean it.
NSF validation
Page limits, font, margins, URL restrictions, required sections, citation completeness. Offline. Before submission, not after.
Budget
Catch a $350k postdoc before a program officer does. Automatic per-diem lookups by city and fiscal year.
Bibliography
One references.bib. [@key] inline. Auto-regen is
opt-in and respects your manual edits.
Collaboration
Public view links for program officers. Editor / viewer roles for collaborators via Supabase row-level security.
Open source
The CLI, the validators, the plugin, the web app. Source at github.com/GrantKit.
Two commands and a coding agent. Nothing to migrate, no new editor to learn, no lock-in. Just files.
pip install grantkit && grantkit auth login