Welcome!

Robb Doering

Full-stack software engineer

This is Robb's website — an experienced software engineer, ready to help you build robust, efficient, and ambitious software.

33 repositories · 1102 tracked test files · 414 documentation files · 8 years of practice

Broad experience

I've had the opportunity to work on mission-critical and highly scaled systems in the corporate world as a full-stack web developer, but I think the primary value I can offer your team is a proven ability to pick up new tools and quickly and reliably apply them across domains.

Recently this has meant a focus on Python tools, libraries, and plugins; TypeScript web applications ranging from static sites to interactive 3D; data engineering and visualization; and of course the omnipresent model inference and agent orchestration — but I bet I'm either experienced in or interested in what you're working on, too!

  1. Dump-scale parsingWikiparse241 tracked test files · published on PyPI
  2. Interactive 3D product workorigamiodyssey58 tracked test files · browser-native fold sequences
  3. Agent toolinginTact111 tracked test files · library, CLI, and MCP surface

Systematic perspective

I often lament being born into interesting times, but an unexpected upside was an incidental introduction to the idea of applying the tools of philosophy, psychology, and the other sciences to everyday engineering work.

Sometimes I get to live the dream and apply the arcane writings of one German idealist or another to an advanced AI prototype, for sure, but the main use case is adding structure and intentionality to those fuzzy tasks around engineering that slow it down: documentation, planning, specification, validation, and so on.

It's hard to express the concept in relation to the field in general, but I'd love to chat about how this applies to your stickiest, vaguest problems!

  1. A design constitutionthe rules this page is built under, versioned with the code
  2. Documentation as infrastructuremyBasis67 documentation files · 71 tracked test files
  3. A templated fleet33 of 33 repositories with CI configuration · 33 with pre-commit · 25 with type configuration

Collaborative mindset

I'm a firm believer in the idea that our kind of work is a deeply social endeavor, and that prioritizing clear communication is key to doing it effectively.

That is of course reflected in my passion for frustratingly effective clichés like high-quality documentation and clear, self-aware procedures and policies, but I think it also justifies squishier undertakings — such as doing my best to contribute to inclusive, friendly, and empathetic workplace relationships.

  1. Led a team of sixLed a team of six engineers during a planned three-month manager leave, clearing blockers and coordinating stakeholders and Agile ceremonies.
  2. Tests where there were noneIntroduced Jest unit testing to an existing, lightly tested codebase after coordinating regular functional testing.
  3. Review before merge33 of 33 repositories with CI configuration · 414 documentation files

Open source

30 public repositories, grouped.

A basic but thorough list. Every group opens in place; the full gallery with filters is at /work/.

Agent & AI tooling — 4 repositories
  • Wikiparse

    Wikitext Translation Pipeline

    64 documentation files · 241 test files · CI configuration present · v1.0.2 · GPL-2.0-only

  • myGate

    Superheavy-Model Gate for Nested Agents

    23 documentation files · 55 test files · CI configuration present · v0.5.0 · MIT

  • piq

    One-Verb Observation Primitive for Agents

    5 documentation files · 10 test files · CI configuration present · v0.1.0 · MIT

  • myModel

    Local LLM Inference Service

    18 documentation files · 35 test files · CI configuration present · v1.0.0 · MPL-2.0

Python libraries & tools — 3 repositories
  • inTact

    Self-Healing File Edits for Agents

    19 documentation files · 111 test files · CI configuration present · v0.8.1 · Apache-2.0

  • myBasis

    Ergonomic Python Utilities

    67 documentation files · 71 test files · CI configuration present · v1.0.0 · MPL-2.0

  • myMeans

    Double-Entry Accounting in Python

    20 documentation files · 61 test files · CI configuration present · v0.7.0 · MPL-2.0

Web apps & extensions — 5 repositories
  • Irix

    Architectonic Color Palette

    29 documentation files · 26 test files · CI configuration present · v0.7.0 · MIT

  • doering.ai

    Portfolio, CV, and Public Project Index

    31 documentation files · 109 test files · CI configuration present · v0.9.2 · MPL-2.0

  • origamiodyssey

    Interactive 3D Origami Instruction

    13 documentation files · 58 test files · CI configuration present · v0.1.0 · MIT

  • liblens

    Library Info for Repository Pages

    2 documentation files · 2 test files · CI configuration present · v0.7.0 · MPL-2.0

  • epstein-index

    OCR'd Case-File Explorer

    28 documentation files · 41 test files · CI configuration present · v0.8.0

Design & writing systems — 2 repositories
  • myForm

    Universal Docs-Format Translator

    32 documentation files · 81 test files · CI configuration present · v0.7.0 · MPL-2.0

  • myArch

    A Systematic Development Framework

    26 documentation files · 40 test files · CI configuration present · v2.0.0 · MPL-2.0

Sublime Text packages — 16 repositories
  • myTest Sublime Plugin

    Pytest for Sublime Plugins

    4 documentation files · 25 test files · CI configuration present · v0.7.0 · MPL-2.0

  • myBasis Sublime Plugin

    Typed Infrastructure for Sublime Plugins

    2 documentation files · 17 test files · CI configuration present · v0.7.0 · MPL-2.0

  • Pyrefly Sublime LSP

    Python Type Checking for Sublime

    2 documentation files · 6 test files · CI configuration present · v0.7.0 · MPL-2.0

  • myIrix Sublime Color Scheme

    Architectonic Color Scheme for Sublime

    2 documentation files · 4 test files · CI configuration present · v0.7.0 · MPL-2.0

  • myHeaders Sublime Plugin

    Hierarchical Code Headers for Sublime

    3 documentation files · 20 test files · CI configuration present · v0.7.0 · MPL-2.0

  • Sublime syntax family

    10 syntaxes

  • Syntect Sublime LSP

    Language Server for Sublime Syntaxes

    2 documentation files · 4 test files · CI configuration present · v0.7.0 · MPL-2.0

3 more repositories are private.

Résumés

The general CV and five audience editions.

The résumé page carries the complete CV, five audience-specific editions in full and one-page form, and the skills, services, AI policy, and FAQ that go with them.

Go to the résumé →

Evidence terraces

Nine things I know how to do, with the evidence nearby.

Limits — counts and configuration-presence observations only; this snapshot does not claim a passing pipeline, test coverage, typing completeness, or an artifact release.

Evidence snapshot · 33 generated records

Rebuild with bun run content:sync.

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.

241 tracked test files — the fleet's largest recorded test-file surface · 64 documentation files · v1.0.2 on PyPI

Evidence route — Wikiparse detail

Terminal progress readout from a wikiparse run: a bar reading 254,245 / 256,564 streams (99.10%) at 22.44 streams per second, followed by row counts ok=18,247,916, suspect=18,808,282, failed=64,270, and category spine 4/4 complete.
A wikiparse run's own progress telemetry — stream throughput, per-row outcome counts, and category-spine completion — not a diagram of the pipeline's stages.

tests/examples/citations/APA.yaml (first fixture)

book:
    "Sapolsky, R. M. (2017). _Behave: The biology of humans at our best and worst._ Penguin Books.":
        last: Sapolsky
        first: R. M.
        year: 2017
        title: "Behave: The biology of humans at our best and worst"
        publisher: Penguin Books
The fixture exactly as wikiparse tests it: a raw APA citation mapping to the fields the parser must extract.

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

Evidence route — Sublime syntax-family detail

The Metasyntax .sublime-syntax grammar file, open in Sublime Text, highlighted by the Metasyntax syntax it defines — regex embeds, YAML mapping keys, and scope names all colored by their own grammar.
Metasyntax highlighting its own grammar source — the self-hosting claim the surrounding prose makes, made literal.

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

Evidence route — public corroboration of review machinery

one diff, three lens verdictsillustrative

$ lens-review diff.patch
correctness  warn: logic holds, but the new branch has no test covering it
drift        pass: matches house naming and doc-placement conventions
scope        fail: this diff also touches an unrelated chart helper — split it
Illustrative: the shape of a lens review, not a captured report — the real machinery lives in the private fleet commons.

04

Templating · copier

Publish a fleet from one template

30 repositories with currently public source, 3 with source publication planned, 9 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.

33 repositories · 30 currently public sources · 9 PyPI packages

Evidence route — public Copier-stamped artifact

corpus/copier.yaml (task excerpt)

_subdirectory: pyrepo
_tasks:
    - command:
        - uv
        - run
        - --project
        - '{{ root_ }}/corpus'
        - finalize-repo
        - '{{ {"dst": _copier_conf.dst_path, "pretend": _copier_conf.pretend, "tags": tags,
          "has_tests": has_tests, "has_docs": has_docs, "has_cf_": has_cf_, "is_sublime_": is_sublime_,
          "is_py_": is_py_, "is_ts_": is_ts_, "is_web_": is_web_} | to_json }}'
The real template task each repository re-stamps; the registry records 30 public repositories, 9 on PyPI, and 17 Sublime repositories.

05

Pipelines · custom images

Treat CI/CD as the floor

33 of 33 repositories have CI configuration present, 33 have pre-commit configuration present, 25 have type configuration present, and 25 record all three signals. 1102 tracked test files are on record across the fleet.

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

33/33 CI config present · 33 pre-commit config present · 25 type config present · 1102 tracked test files

Evidence route — public pipeline history

.gitlab-ci.yml (stages and jobs)

stages:
    - eval
    - test
    - build

Evaluate TypeScript:
    stage: eval
    script:
        - bun run format:check
        - bun run check

Test Site:
    stage: test
    script:
        - bun run test
        - bun run build
        - bun run html:validate

Build Container:
    stage: build
    image: docker:29
    services:
        - docker:29-dind
    script:
        - docker build --pull --tag doering-ai:$CI_COMMIT_SHA .
This repository's real three-stage pipeline, including the container build that follows formatting, type, test, site-build, and HTML gates.

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

Evidence route — public haloy.yaml source

haloy.yaml — this site's own deploy config

name: doering-ai
server: https://haloy.doering.ai
image:
    repository: doering-ai
    build_config:
        context: .
        dockerfile: Dockerfile
        platform: linux/amd64
    history:
        strategy: local
        count: 5
port: 8080
health_check_path: /health
min_ready_seconds: 3
domains:
    - domain: doering.ai
      aliases:
          - www.doering.ai
This repository's real haloy.yaml: the tailnet server it deploys through, its domains, and its health check — not a network diagram.

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

Evidence route — Gate detail, adjacent deny-before-launch control

vault → sealed cache → one runillustrative

$ pass-cli run --env-file .env.pp -- ./deploy.sh
resolved 3 pass:// references
sealed to systemd-creds (run-scoped, 0600)
deploy.sh: using injected credentials
credentials discarded with the run
Illustrative: the shape of the documented secret-resolution pattern, not a captured run — the exemplar pipeline (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: 58 tracked test files · build-time SVG charts · zero chart libraries

Evidence route — Origami detail

Three wireframe crease-pattern diagrams on a pale pink field, ordered most-creased to least-creased: the first panel carries the densest crease geometry with callout labels Crease start, Crease end, and Folded corner; the second and third panels show progressively simpler geometry, both labelled Unfolded corner.
Origami Odyssey's crease-pattern diagrams — three wireframe states ordered most-creased to least-creased, with crease start, crease end, and corner callouts.

registry-derived evidence sample

[
  {
    "uid": "wikiparse",
    "title": "Wikiparse",
    "documentationFileCount": 64,
    "testFileCount": 241,
    "ciConfigPresent": true,
    "precommitConfigPresent": true,
    "typeConfigPresent": true,
    "workflowStage": 7,
    "allConfigSignalsPresent": true
  },
  {
    "uid": "intact",
    "title": "inTact",
    "documentationFileCount": 19,
    "testFileCount": 111,
    "ciConfigPresent": true,
    "precommitConfigPresent": true,
    "typeConfigPresent": true,
    "workflowStage": 8,
    "allConfigSignalsPresent": true
  },
  {
    "uid": "my-basis",
    "title": "myBasis",
    "documentationFileCount": 67,
    "testFileCount": 71,
    "ciConfigPresent": true,
    "precommitConfigPresent": true,
    "typeConfigPresent": true,
    "workflowStage": 8,
    "allConfigSignalsPresent": true
  },
  {
    "uid": "my-irix",
    "title": "Irix",
    "documentationFileCount": 29,
    "testFileCount": 26,
    "ciConfigPresent": true,
    "precommitConfigPresent": true,
    "typeConfigPresent": true,
    "workflowStage": 7,
    "allConfigSignalsPresent": true
  }
]
Four registry rows serialized at build time from the same data that drives the site's charts; no metric is typed into this panel.

09

Agent tooling

Build tools for the agents

4 of the fleet's 33 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: 111 tracked test files · piq: observe-only · gate: deny-before-launch

Evidence route — PiQ detail

Contact

The fastest route is email.

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

robb@doering.ai