I build software that actually ships. Most of what is below started as a deadline and ended as something that runs, against real data, in front of real users.
I work mostly in TypeScript and Python, lately on AI agents and developer tooling, and I care more about whether a thing survives contact with real input than about how clean it looks in a diagram.
I take on project work: AI agents, RAG pipelines, developer tooling, and integrations. Details and selected work at jonathansolvesproblems.com.
| Project | What it is | Stack |
|---|---|---|
| setpiece | Seated mixed reality previs for VFX shots: block the shot on your table with your hands and lea… | TypeScript |
| floorcount | A salsa practice Lens for SPECS. The count lights up on your own floor, so you stop walking bac… | TypeScript |
| final-buzzer | Every official paid at the final buzzer. A youth basketball tournament's money, run by an agent… | TypeScript |
| world-clock | A Kaggle benchmark that asks 19 AI models what time it is, grades every answer against the IANA… | Python |
| floodplain | Runs the test suites of a package's dependents before and after a release, in forked Nebius San… | Python |
| call-it | Watches your game through OBS and runs prediction bets in your Twitch chat. Built in OpenAI Cod… | TypeScript |
How this page keeps itself current
The board is not a third-party widget. It is an SVG this repo generates from my own push history, so it reflects what I actually touched last rather than a static image I updated once and forgot.
scripts/build_profile.py queries the GitHub API, renders both themes, rewrites the table
scripts/build_banner.py renders the banner from assets/portrait.png
assets/board-*.svg dark and light boards, swapped by prefers-color-scheme
.github/workflows/ re-runs the generator every Monday and commits any change
Run python scripts/build_profile.py to refresh it by hand.





