Portfolio & evidence index

Robb Doering

Full-stack software engineer

A communication-focused engineer pairing full-stack work in Python and TypeScript with an academic approach to artificial systems, HCI, and the software development cycle.

30 repositories · 682 recorded tests · 262 documentation files · 8 years of practice

What follows is a row of terraces — one thing I know how to do per landing, with the evidence I can point to. The numbers come from the fleet registry; what I cannot show is labeled rather than claimed.

01

Parsing · regular expressions

Parse Wikipedia at dump scale

Wikiparse converts raw Wikipedia XML dumps into structured, per-article Markdown with YAML frontmatter. The citation parser is built on optimized regular expressions; at dump scale, the choice of pattern is the difference between a pass that is practical and one that is not.

A dump is not a document; it is one long file of repeated records, and parsing one fast is largely deciding what never needs reading twice. I maintain a Sublime syntax for the advanced regex module's grammar for the same reason — the tool you read a pattern in should be as precise as the pattern.

184 tests — the fleet's largest suite · 23 docs · v0.7.0 on PyPI

02

Sublime Text · syntax definitions

Write grammars for grammar languages

10 syntax definitions ship as one family — CSV, Kitty, Logfile, Ledger, Python, regex, MyST, Taskfile, YAML — plus Metasyntax: a ground-up reimplementation of Sublime Text's own.sublime-syntax language. A syntax definition is a theory of a language; Metasyntax is a theory of the tool that holds the theories.

A Rust syntect server gives the definitions an LSP of their own, and the test harness runs pytest inside a live Sublime Text instance, because a mock can only tell you so much about an editor.

10 syntaxes in one family · 17 Sublime repositories · Rust LSP over stdio · live-instance tests

03

Review machinery

Review diffs through lenses

Fleet merge requests go through adversarial review, and the machinery treats a diff as several objects rather than one: read for correctness it says one thing, for drift from convention another, for scope another still. Each lens is narrow on purpose, and no lens is allowed to summarize the others — a summary is how things get missed.

A lens is a checklist that runs: small, executable, and expected to be hostile.

adversarial lens review on fleet MRs · machinery lives in the private fleet commons

04

Templating · copier

Publish a fleet from one template

29 public repositories, 29 shipped, 8 on PyPI. That count is only reachable because the hygiene is templated rather than remembered: copier templates carry the CI config, the pre-commit hooks, the typing setup, and the docs layout, and each repository re-stamps them instead of re-deciding them.

A template is a decision you make once, carefully, and then stop remaking.

30 repositories · 29 shipped · 8 PyPI packages

05

Pipelines · custom images

Treat CI/CD as the floor

29 of 30 repositories run CI, 28 run pre-commit hooks, 22 are typed, and 20 carry all three. 682 tests are on record across the fleet, running in custom images built for the fleet.

Any step that relies on memory eventually does not happen. The pipeline is the memory.

29/30 CI · 28 pre-commit · 22 typed · 682 tests on record

06

Tailscale · Docker · haloy

Deploy over a private network

Applications build as small Docker images; I deploy them to their hosts over a tailnet with haloy, exposing only what each application serves. This site is the reference deployment: a Bun static build served by an unprivileged nginx container behind a health check.

Deployment should be boring. Boring is the goal.

this site: Bun build → unprivileged nginx · haloy rollouts · health-checked

07

Secrets · minimal scope

Scope secrets down to the run

Interactive work reads secrets from 1Password through op, behind an approval prompt each time. Fleet automation resolves Proton Pass references per run and caches them sealed, so services never call a password manager live. The exemplar is repass — private, source not published — a human-gated pipeline that normalizes 1Password content behind piecemeal confirmation, with a secret-value guardrail and encrypted backups before anything moves.

How far a secret can spread is fixed at integration time. Keep it small.

human-gated · redaction-guarded · encrypted-backup-first · repass is private by design

08

Interfaces · dataviz

Build interfaces for browser and terminal

Interfaces as web UIs and as terminal UIs, with data visualization treated as a first-class output in both. Origami Odyssey renders interactive three-dimensional fold sequences in the browser; this site's charts are build-time inline SVG whose every number derives from the registry rather than from a hand. In the terminal I work in Ratatui and Textual; those interfaces are practice, not yet registry entries.

The medium changes. The evidence contract does not.

origami: 36 tests · build-time SVG charts · zero chart libraries

09

Agent tooling

Build tools for the agents

4 of the fleet's 30 repositories exist so agentic work stays legible and bounded. piq is a go-look-report primitive — one verb, modality dispatch, observe-only by covenant. tact heals stale or drifted file edits through a reconciliation ladder instead of failing them, shipping as a library, a CLI, and an MCP server. gate denies known superheavy model launches before they start; my-model serves local models over HTTP via vLLM and Quart.

The agents do much of the work. The tools keep the work observable.

tact: 88 tests · piq: observe-only · gate: deny-before-launch

Contact

The fastest route is email.

Available for full-stack product work, developer tooling, and system design.

robb@doering.ai