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 |
|---|---|---|
| watermark | When a Ring flood sensor finds water, the camera goes to the water: a claim-ready evidence pack… | Python |
| ring-partner-py | ringpartner: a typed Python client for the Ring Partner API (devices, sensors, media downloads,… | Python |
| sans-calque | English to Canadian French on an open 4B model fine-tuned on government text; every flag cites… | Python |
| nature-bingo | A bingo card of the 16 things most likely out this October near your town. TabPFN, an open-weig… | Python |
| world-clock | A Kaggle benchmark that asks 19 AI models what time it is, grades every answer against the IANA… | Python |
| moxie-library | A library of one writer's 16 years of work, with a desk that remembers. | JavaScript |
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.





