🦞 PolitiClaw: Building a Local-First Political Co-Pilot @ Minnebar 2026
I had the chance to present "PolitiClaw: Building a Local-First Political Co-Pilot With OpenClaw" at Minnebar 2026. PolitiClaw started as a personal "I want to follow what my reps are doing without a second job" project. It's now a plugin for an open-source agent framework called OpenClaw, and Minnebar gave me a forty-minute slot to walk through the why, the framework underneath, and a couple of the weirder engineering corners along the way.
What is PolitiClaw?
In one sentence: PolitiClaw is a local-first civic copilot that tracks federal legislation, scores your representatives against the political stances you declare, and drafts letters you send yourself.
The "you declare" part is the bit I care about most. There's no shipped scorecard from some publication or advocacy group, and your reps' alignment scores are derived from your values, not someone else's idea of them.
Two things PolitiClaw will not do: tell you how to vote, or send mail on your behalf. Both are deliberate. Outreach drafts are plain text. Copy, edit, send yourself. Voting recommendations to a rep aren't a feature, and they aren't going to become one.
A quick word on OpenClaw
PolitiClaw is an OpenClaw plugin, so a quick framework primer is in order.
OpenClaw is an open-source agent framework. A chatbot is reactive: you type, it answers. An agent is different. It remembers what you've told it, it runs while you're asleep, and it can take actions through tools you've wired up. OpenClaw is for building the second thing.
Five primitives keep coming up: a gateway (the long-running process), tools (typed functions the agent can call), skills (markdown files the agent reads as instructions), cron (scheduled agent runs that fire whether you're around or not), and memory (state that survives across runs). Most of OpenClaw is a thoughtful arrangement of those five things plus a plugin SDK so people can ship their own.
It runs locally and you choose the model. Could be Claude, could be GPT-5.4, could be a local Llama on your own GPU. If you've heard of Moltbook (the AI-agent social network Meta acquired in March), that's an OpenClaw plugin too. The ecosystem is real, not academic.
Why this fits OpenClaw
Every one of those primitives turned out to be load-bearing for PolitiClaw, which is most of the reason I picked the framework in the first place.
Local-first because political stances are sensitive. Your rep alignment scores and drafted letters live in a SQLite file on your machine and never sync anywhere. Cron because Congress doesn't fire webhooks. If you want a weekly digest of what your reps have been up to, somebody's process has to wake up and go check. AI for summarization because bills are long and dense and LLMs are good at compressing them. AI for drafting because outreach letters are 80% template and 20% the thing you actually care about. And choice of model because a privacy-first user can run the whole thing on a local LLM if they want to.
A few engineering corners worth flagging
Address → my reps (harder than it should be)
You'd think turning an address into "my two senators and one House rep" was a solved problem. It isn't. The Sunlight Foundation's free API died years ago. Google Civic is still around but the lookup quality has gotten flaky. Geocodio works fine but it's paid, and I refused to ship a civic-engagement plugin that required a credit card on day one.
So PolitiClaw does it the long way. The Census Bureau publishes congressional-district shapefiles every year (TIGER/Line). They're free and they're accurate. The unitedstates/congress-legislators repo on GitHub is a community-maintained YAML file with every current member of Congress. Combine the two with the Census's own free geocoder for address-to-lat/lon, do a point-in-polygon test against the district shapes, and you're done. Zero API keys. About 50 MB of local cache after the first download. After that, it's all on your machine.
The Senate doesn't expose roll-call votes
This one I had to read three times before I believed it. api.congress.gov, run by the Library of Congress, exposes House roll-call votes: every member's yea or nay on every vote. It does not expose Senate roll-call votes. The Senate has them. They're public. They live on senate.gov. They're just not in the API.
The workaround is Voteview, a UCLA political-science project that's been quietly maintaining a free dataset of every congressional roll-call vote ever taken, including the Senate. Voteview has a web app, the web app talks to an undocumented internal API, and that API does exactly what we need. PolitiClaw treats it as a tier-2 source: retries on 429s, transient failures tolerated, never blocks the rest of the digest.
Keeping AI honest while it writes the code
Most of PolitiClaw was written collaboratively with Claude. AI is great at writing code, and bad at remembering to update the four other places that reference the thing it just changed. Three structural fixes have done more for me than any LLM-specific lint rule.
TypeScript strict + minimal ESLint
tsconfig.json runs with strict: true plus noUncheckedIndexedAccess. That second one matters most: indexing into an array gives you T | undefined instead of T, so the LLM is structurally forced to handle the missing case before the file compiles. ESLint is kept intentionally minimal. The compiler does the heavy lifting.
A 1,198-line doc-drift script wired to pretest
scripts/docs.mts is 1,198 lines. It regenerates the docs from source-of-truth on every CI run and fails the build if what's checked in isn't byte-identical. Seven classes of drift, including version pins that have to match across five different files.
The trick that makes it work in practice is one line in package.json: "pretest": "npm run docs:check". npm runs pretest before test automatically, every time. So every npm test an AI assistant runs first checks the docs are in sync. I don't remember to keep docs current; the test command remembers for me.
Nyx: adversarial PR review by an OpenClaw agent
Nyx is my own personal OpenClaw agent. It runs on a separate machine, watches PolitiClaw's GitHub PRs, and posts adversarial review comments. The interesting design choice: Nyx runs on Codex (GPT-5.4), a different model than the one writing most of PolitiClaw's code (Claude). The reviewer is structurally different from the author, so it catches things Claude misses because of self-confidence in patterns it just wrote.
Yes, that means I'm using OpenClaw to review code in OpenClaw plugins. The framework eats its own dog food.
What this isn't
Done. The biggest known gap is state and local government. PolitiClaw today is federal-only, and your two senators and one House rep are not the only people whose votes shape your daily life. The reason isn't apathy: there's no api.data.gov equivalent for state legislatures, and the Voteview-style undocumented public source we lucked into on the federal side doesn't have an obvious twin at the state level. If you know of one, please let me know.
It's also not immune to AI hallucination. The mitigations are real (citations on every bill claim, a mandatory dissenting-view section in the weekly digest, hard guardrails in the skills against telling a rep how to vote), but they're mitigations, not a solved category. The plugin is early, the rough edges are real, and the foundation is roughly the right shape. That's about all I'm willing to claim.
Resources
- You can read more about my session on the Minnebar 2026 sessions website.
- PolitiClaw on GitHub
- OpenClaw on GitHub
- Nyx on GitHub
- api.data.gov signup