Selected work
I build products and the systems behind them.
I lead Product at DDC Public Affairs, where my team runs software for advocacy, PAC management, compliance, communications, and reporting.
Outside DDC, I build iPhone apps, developer tools, distributed systems, firmware, and experiments in artificial life.
DDC
Software for running public-affairs programs.
I lead Product at DDC Public Affairs, an Omnicom company. Our platform serves more than 360 clients across 430 websites, joining advocacy, PAC management, communications, compliance, and reporting around one client record. View the experience ↗
Most public-affairs programs are split across several vendors. DDC brings the CRM, PAC website, advocacy tools, email, compliance, and reporting into one platform, with one client record underneath it.
My job covers product strategy, design, engineering priorities, security, client experience, and the business behind the products. The platform supports more than 360 clients and 430 websites, including heavily regulated companies that put us through more than 300 security reviews each year.
The work is often less glamorous than a new feature: enforcing legal contribution limits, generating payroll files correctly, keeping constituent targeting accurate, moving legacy systems into Azure, and making hundreds of sites manageable by a small team. That reliability is the product.
I have also led our work on personalization and AI. We built shared rules for dynamic content, a permission-aware AI orchestration layer, and internal operating tools that turn repeatable agency work into documented workflows.


Role
SVP of Product · current
Platform
Democracy Direct® · PACWeb® · Capitol Connect®
Under management
430+ websites · 360+ clients
Assurance
300+ enterprise security audits a year
Loom.haus
Searching simulated physics for signs of life.
Loom evolves the physical rules of small simulated universes, then measures whether stable structures form, reproduce, and pass recognizable traits to their descendants. View the experience ↗
Each universe contains two complex fields on a torus. They evolve under the Gross–Pitaevskii equation, a nonlinear form of the Schrödinger equation used for quantum matter waves.
The search changes physical constants such as mass, coupling, damping, and drive. The question is simple: which combinations allow persistent structures to form, split, and pass recognizable structure to descendants?
The difficult part is measurement. A spreading wave can look like reproduction, so Loom only counts an event when descendants separate, persist, and remain more similar to their parent than to unrelated structures. The system has observed many fissions, but no confirmed inheritance yet.
What it is
Artificial-life research platform
Engine
Gross–Pitaevskii · Visscher staggered leapfrog
Physics as data
Planck · mass · 3 couplings · damping · drive
Visit
Page
An inbox shared by your devices and agents.
Page saves notes, decisions, reminders, and questions from any terminal or agent. They appear on your phone immediately and remain available to later sessions on other machines. a-gnt.com/page ↗
The problem it solves is unglamorous. You are three hops into an SSH session and you work something out worth keeping. Getting it anywhere useful means selecting it out of a terminal that reflows, mailing it to yourself, or dropping it in a scratch file that is gone by Friday. Copy and paste does not cross machines, and it does not cross sessions at all — the session that made the decision ends, and the decision goes with it.
Page replaces that with one command. `page "rate limiter: token bucket per API key, not per IP"` and it is stored, not merely delivered. On Friday, from a different machine, `pager_list()` hands it back. The CLI and the MCP server write to the same inbox, so an agent saves what it figured out and a later agent reads it, without either of them going through you.
Every page is one of four typed objects — a note, a reminder, an update, or a question — so the inbox reads like a briefing instead of a feed. The iPhone app reads the day as a timeline, as a tree grouped by the machine that wrote it, or by project. On iPad it opens like Mail, list beside page.
The walking-away part came out of the same design and turned out to be the demo people remember. A question carries answer buttons. `page ask "Deploy?" --choices "Ship,Review"` blocks in the shell until you tap, then prints your choice to stdout, so an agent can hand you a decision and wait while you are nowhere near the desk.
Page content is encrypted at rest with AES-256-GCM, a random IV per value and an authentication tag, so a stolen disk image yields ciphertext. Tokens are stored as hashes, the sign-in token rides in a URL fragment so it never reaches a log, and App Store receipts are verified against Apple’s root with verification failing closed.




What it is
One inbox for every machine and session · iOS
Surfaces
iPhone · iPad · CLI · MCP server · web
Server
Node stdlib only · zero dependencies · SQLite
Try it
Gauge
Local usage accounting for coding agents.
Gauge reads the transcripts Claude Code and Codex already store on disk, then reports token use and API-equivalent cost by project, session, model, day, and five-hour window. View the experience ↗
Coding agents can spend time and money in the background at a rate nobody can see, and the standard interface for that is a spinner. Subscriptions give a flat number and then a wall: no per-project accounting, no way to look at a week and say which piece was expensive.
The data is already on the machine. Both tools write full transcripts as they run — every request, every response, every token — and Gauge simply adds them up. Nothing leaves the machine: no account, no telemetry, no server to send anything to.
The finding that surprised me most is about subagents. Their transcripts nest deeply enough that a tool walking the obvious directory misses most of the work; in testing, roughly half the spend was down there. The by-model slice ends the routing argument too, because some of what gets sent to the heavy model is genuinely hard and some of it is a file rename.
The dollars are API-list-equivalent — what the usage would cost at published API rates — not a subscription bill. Subscription plans do not publish their quota mechanics, so anyone claiming to convert one into the other is guessing. It is an odometer, not a receipt.

What it is
Local usage meter for coding agents
Run it
npx github:joey-io/gauge
Slices
Project · session · model · day · 5-hour window
Privacy
Reads local transcripts · nothing leaves the machine
License
MIT · optional $3 supporter license
be here
A local social network carried by nearby phones.
be here moves posts and messages directly between nearby phones over Bluetooth. It needs no account, central server, or internet connection. Download on the App Store ↗
Posts, profiles, walls, group chats, and private messages move directly between nearby phones over Bluetooth. Each phone also relays what it hears, so a crowded room becomes one network and a neighborhood carries its own conversation from person to person.
The network belongs to the people who are present. Its history is stored on their phones rather than in a company’s cloud. Identity comes from a keypair that never leaves the device, private messages are encrypted, and the identifier a phone broadcasts changes every 15 minutes.
The protocol is written once in Rust and used by both the iPhone app and browser demo. It has been tested against dropped packets, crowded radio space, people coming and going, and fake identities. In a simulated stadium of 800 phones, one post required about 180 transmissions instead of 24,600.
Where this goes: anywhere you are, you open the app and the place comes alive around you. Neighbors, farmers-market vendors, shops and restaurants, the community association, the fire department — whoever is nearby can broadcast to the phones around them, and the people holding those phones can follow events, catch specials and offers, chat, and trade, all over the local mesh, off the grid, with no accounts and every message encrypted end to end. Version one is on the App Store; version two launches the first off-grid neighborhood.




What it is
Serverless proximity social network · iOS
Operating range
A hop is ~10–60 m · relayed onward by every phone · neighborhoods at walking pace
Core
Rust protocol library · Noise encryption · rotating identifiers
Status
v1 on the App Store · v2 launches the first off-grid neighborhood
Get it
Visit
Emergent.D
A planet-building game governed by one simulation.
Emergent.D lets players sculpt terrain, move water, grow life, and mine resources on a simulated planet. Every action changes the same physical world and its future capacity to recover. View the experience ↗
The core is a fluid and particle simulation built in Metal. Terrain, rivers, ice, clouds, and vegetation respond to the same world state rather than running as separate visual effects.
The economy is tied to the simulation. Mining produces gold but damages the ecosystem that makes future mining possible. Satellites use real orbital parameters and affect only the ground they pass over.
The browser version uses React, Three.js, WebGPU, and a WebGL2 fallback. Each persistent planet has an authoritative server process that hibernates when empty and advances the world while players are away.
Gold is controlled by the server through an append-only ledger. Player actions are sent as compact brush operations and replayed for verification, while arcade scores that award currency are checked server-side.





What it is
iOS simulation game · released Feb 2026
Engine
Metal fluid & particle simulation
Get it
Visit
Touch Advocacy
A simpler way to call and write Congress.
Touch starts with your representatives and two actions: call or write. It removes the terminology and onboarding that make civic participation feel reserved for professionals. Download on the App Store ↗
The app starts with the people who represent you and two familiar actions: call or write. It removes the jargon, issue catalogs, forms, and long onboarding flows that make advocacy feel like something reserved for professionals.
On-device Apple Intelligence helps people understand bills and campaign finance in plain language. Survey results and Census data add context about public opinion and the communities affected, so people can decide what matters to them before taking action.
Verified location connects each person to the correct district and representatives. Calls and messages move through the tools people already know, while Touch records completed actions without requiring an extra confirmation step.
Ranks, badges, and streaks keep people engaged and help occasional participation become a regular civic habit. Only completed actions count, so the system rewards real participation rather than taps inside the app.





What it is
Accessible civic participation for iPhone
Context
On-device Apple Intelligence · surveys · Census data
Participation
Verified location · calls · messages · civic streaks
Get it
Monday Draft
A production system for recurring client work.
Monday Draft connects local AI agents to briefs, source material, review, approval, delivery, and measurement. Each completed cycle informs the next one.
Most AI content tools stop after generating a draft. Monday Draft keeps the context around the work: the brand, market, template, source material, review history, performance, and what should change next time.
A local agent runtime produces typed artifacts. The web app handles client onboarding, review, approval, billing, and delivery. Quality gates can send weak work back through the run instead of simply flagging it.
Modules can publish independently, and each cycle feeds its results into the next brief. The goal is not more content. It is a production system that becomes more useful with each week.



What it is
AI-native production system for client deliverables
Shape
Local agent runtime + web app as one pipeline
First-class
Brands · locations · artifacts · runs · approvals · memory
The loop
Brief → produce → QA gate → review → approve → measure
Visit
Jimothy Jump
A one-day iPhone game about a real Seattle raccoon.
Jimothy Jump is an endless runner based on the short-spined raccoon that became an internet celebrity in 2026. The game, artwork, website, localized store listing, and submission were completed in one day. jimothyjump.com ↗
The character and setting follow the real story: a raccoon with short-spine syndrome and the Seattle backyards he was filmed in. Mt. Rainier sits on the horizon, the Space Needle appears in the skyline, and the fences vary among weathered wood, chain-link, and picket, each at its own height.
All art is generated in code: jittered vector paths for a cut-paper edge, layered drop shadows, and a grain pass. The app ships no drawn assets, and the icon is produced by a script from the same toolkit. Player movement uses hand-written physics with rectangle collision after SpriteKit’s body simulation proved unreliable for this design.
One tap jumps and a second tap double-jumps; distance is the score. Game Center provides leaderboards for longest run and burgers collected in a run. The game, the marketing site, and an App Store listing localized in English, Japanese, and Simplified Chinese went from nothing to submitted in one day.





What it is
iOS endless runner · in App Review
Setting
Papercut Seattle · Rainier · Space Needle
Art
All shapes generated in code
Visit
Amieeba
A private digital fidget toy.
Amieeba combines fluid motion, sound, and haptics for repetitive sensory play on iPhone and iPad. It costs 99 cents and has no advertising, subscription, account, or data collection. Download on the App Store ↗
The experience is built around sensory play rather than competition. You stretch, split, merge, and reshape a fluid form while bubbles respond with crisp sound and a satisfying haptic click.
The score and timer provide a light rhythm to the session, not a game to win. As the screen fills and rewards build, pressing and holding releases the form in an explosion of fluid motion—a digital exhale before starting again.
Amieeba is designed as a safe, calming break for adults and children. It has no advertising, no subscription, and collects no data. The app costs $0.99 once.





What it is
Mindful digital fidget toy · $0.99, once
Built with
Fluid physics · Core Haptics · spatial audio
Privacy
No ads · no account · no data collection
Get it
Oodl.ai
An art feed built from museum collections.
Oodl brings more than 100,000 open-access works from four museums into a simple iPhone feed. Recommendations run on the device, and every work retains its source, credit, and license. Download on the App Store ↗
The app includes more than 100,000 works from the Met, the Art Institute of Chicago, the Cleveland Museum of Art, and the National Gallery of Denmark. Swipe up for another work or sideways to change collections.
Saved works shape recommendations on the device. You can also add your own photographs, identify subjects locally, and generate a short description without creating an account.
Every museum work keeps its credit, license, and link to the source collection. The app is free and does not include advertising or collect a personal profile.



What it is
iOS art discovery · free
Collection
100,000+ open-access works, four museums
Get it
a-gnt
A browsable catalog of AI tools.
a-gnt organizes thousands of prompts, agents, games, personalities, and MCP servers by what they help someone accomplish. View the experience ↗
The catalog contains thousands of tools grouped by what a person is trying to accomplish rather than by technical format.
People can save tools into a personal library, combine them into shared collections called benches, and reach them from supported AI clients through the a-gnt MCP server.
The product is aimed at people who are interested but not yet fluent: families, teachers, students, and people changing careers.




What it is
Curated discovery platform for AI tools
Catalog
3,500+ tools · 2,200+ MCP servers
Reach it from
Claude · ChatGPT · a-gnt MCP server
Visit
Atomic
A relational application kernel built around one record type.
Atomic represents models, data, identities, permissions, queries, and logs with the same structure. From those records it derives interfaces, validation, APIs, imports, and audit history. View on GitHub ↗
Every record uses the same atom shape. Models, data, identities, permissions, queries, and logs are represented through that structure instead of separate subsystems.
From those models Atomic derives validation, forms, REST endpoints, imports, exports, tenant boundaries, and audit behavior. Relationships and reverse references are part of the core rather than added later.
The practical goal is to keep the ease of a lightweight database tool while giving the application a foundation that can handle connected data without collapsing into special cases.


What it is
Graph-relational data substrate
The idea
The ease of Airtable on a relational foundation
Atomic Reason
A logic engine that identifies missing evidence.
Atomic Reason evaluates evidence against a stated goal. It reports which required questions are answered, unresolved, disputed, or contradicted.
A slot represents a question required by the goal. Assertions provide possible answers and evidence. Folding those assertions produces one of five states: known, pending, gap, tension, or contradiction.
Understanding is the share of required slots that are known. The remaining slots become a prioritized worklist instead of being hidden behind a confidence score.
The goal determines which questions matter. Domain-specific rules for required slots and incompatible answers are injected, so the same engine can be used with different kinds of evidence.

What it is
Pure-logic reasoner over evidence records
The formula
Understanding = f(Evidence, Relationships, Time, Context, Goal)
Slot states
known · pending · gap · tension · contradiction
Interface
Zero-dependency stdio MCP server
pac.dog
Open political data without the commercial interface.
pac.dog joins campaign-finance, committee, enforcement, and legislative records into a free website, open dataset, and MCP server. View the experience ↗
The underlying records are public, but using them usually requires downloading separate files, learning different schemas, and paying for a commercial interface. pac.dog models the records together and makes the relationships navigable.
The site includes committee filings, contributions, disbursements, votes, enforcement records, compliance material, and links back to original sources. An MCP interface lets an AI client query the same modeled data.
The bulk data used by the site is published openly, refreshed nightly, and available without an API key or rate limit.


Obsat
Twenty-four sources queried from one coordinate.
Obsat asks weather, mapping, satellite, environmental, demographic, and scientific providers what they know about a location. It runs locally and preserves the source and raw response behind every result. View on GitHub ↗
Twenty-four adapters ship with it, covering reverse geocoding, Census geographies, Sentinel and Landsat scene catalogs, ground elevation, weather, air quality, river discharge, earthquakes, species occurrence records, and EPA enforcement history. Twenty of them need no API key.
Every provider is normalized to the same record. An observation keeps its identifier, source, timestamp, geometry, properties, a link back to the provider, attribution, and the untouched response, so a result can be traced rather than trusted.
A provider that is down puts its error in the errors array and the remaining adapters still return. An adapter whose key is not set is held back before the request is made and reported as skipped, so a missing credential never reads as an outage.
The same runtime is a library, a command-line tool, and a local MCP server, so an AI client can probe a coordinate and reason from records that carry their own provenance.
await obsat.probe({
lat: 38.9847,
lon: -77.0947,
radiusKm: 10
})What it is
Local-first Earth-observation runtime
Sources
24 adapters · 20 need no key
Interfaces
Library · CLI · local MCP server
