I build software that removes friction — usually a browser tab that replaces a spreadsheet, a manual process, or a "we've always done it by hand" workflow. Most of it lives in TypeScript and Next.js, with Node and Python doing the work underneath.
Nothing on this page is a widget. No badge services, no vendor cards, no trackers: a small dependency-free script reads the GitHub GraphQL API and draws every pixel you see here.
Live snapshot · 493 contributions in the last 365 days · 166 commits · 74 pull requests · 7 repositories touched in the last 90 days · current streak 0 days.
Rendered 2026-08-15 01:47 UTC by
tools/render— every number and every pixel above comes from the GitHub GraphQL API, not from a third-party badge service.
OpenKartline — TypeScript · updated 2d ago
Racing-line planner and lap-time simulator. Draw a track, get the optimal line, a speed profile, braking points and an estimated lap time.
OpenParts — Svelte · updated 6d ago
Local-first parts interchange lab. Cross-reference automotive part numbers entirely in the browser, with no backend to depend on.
Constellation — TypeScript · updated 7d ago
An observatory for public GitHub signals — profiles, achievements and activity, measured honestly instead of gamified.
Galegos — TypeScript · updated 1d ago
Digital menu that hands the finished order off to WhatsApp. Built for a real kitchen, so it had to survive real customers.
Speech → Text Translator — TypeScript · updated 1y ago
Real-time speech-to-text translation running straight in the browser.
Realistic Injuries — Lua · 1 ★ · updated 1y ago
FiveM mod that models injuries per body region instead of a single health bar.
Weekly totals instead of the usual 365-square grid. Consistency has a shape, and it is much easier to read as a waveform than as a wall of tiny boxes.
Measured in bytes of code across public repositories — what I actually write, not a wall of logos for things I once installed.
Profiles are increasingly consumed by software rather than people: agents summarising a candidate, bots routing an issue, a model answering "who maintains this?". So this repository ships a machine-readable layer alongside the human one.
llms.txt— a plain-text brief following the llms.txt convention: who I am, what I build, what I am good at.profile.json— the same information as structured data: stack shares, project summaries, live activity counters.
Both are regenerated on the same schedule as the images, so an agent reading them never gets a stale answer.
How this profile renders itself
A scheduled GitHub Action runs tools/render every six hours:
- A single GraphQL query pulls public repositories, language byte counts and the contribution calendar.
- Repositories are scored by recency, size and reach, then placed on a sunflower lattice. The constellation in the banner is the shape of my public work — it drifts as that work changes.
- Three SVG panels are drawn from scratch in light and dark variants, with the CSS and SMIL animation baked directly into each file.
llms.txt,profile.jsonand the generated blocks in this README are rewritten.- A fingerprint of the underlying data decides whether any of that gets committed, so a quiet week costs zero commits instead of four a day of timestamp churn.
No runtime dependencies and no external image services. If GitHub is up, this page is accurate.
GITHUB_TOKEN=$(gh auth token) node tools/render/render.mjsOpen to conversations about front-end architecture, developer tooling and open source.
Best first contact: open an issue or a discussion on any repository above.



