I am Tony Narlock

This is my professional website. I’ve been a software developer for over 17 years. If you’re not in the field, what I do might not make much sense to you.

I work at tech startups, building web-based applications. On the frontend, I use React, TypeScript, and Relay (GraphQL), and on the backend, Python and Amazon Web Services.

In my spare time, I plan, develop, and maintain a suite of developer tools. For instance, tmuxp, which constructs tmux sessions from a JSON or YAML file. A few years ago, I also wrote a book about tmux, titled “The Tao of tmux”. Another tool I’ve created is cihai, based on Unicode’s UNIHAN dataset, which supports Chinese, Japanese, and Korean languages.

I actively contribute to open-source software projects. You can find me on GitHub, GitLab, and OpenHub.

My CV documents everything I’ve ever done - professional work, my projects, and open-source contributions (I’m a polyglot; there’s even some C++ in there).

Hello, I’m Tony Narlock

This is my professional website. I’ve been a software developer for over 17 years, currently working from Texas.

I build web-based applications at tech startups. On the frontend, I work with React, TypeScript, and Relay (GraphQL); on the backend, Python and Amazon Web Services.

Outside of work, I maintain a collection of developer tools. tmuxp builds tmux sessions from JSON or YAML configuration. I’ve also written “The Tao of tmux”, a practical guide to the terminal multiplexer. cihai provides programmatic access to Unicode’s UNIHAN dataset for Chinese, Japanese, and Korean characters.

I contribute to open-source projects and you can find my work on GitHub, GitLab, and OpenHub.

My CV has the details — professional work, personal projects, and contributions across various languages and technologies.

What's going on in my life as a programmer

What am I busy with outside of work?

2026

June 2026

agentgrep

agentgrep searches your local AI-agent prompts and history — Claude Code, Codex, Cursor, Gemini, Antigravity, Grok, Pi, OpenCode. June added a redesigned explorer, a query language, and two new backends, across alphas v0.1.0a16v0.1.0a31.

A pi- and Claude-Code-inspired TUI redesign of the agentgrep ui explorer, across three releases:

  • v0.1.0a27 — a calmer look: the terminal background shows through, headers and scrollbars are gone, and panes use light rule headers instead of boxes. Adds find-within-a-result (/, Ctrl-F) and a staged Ctrl-C so a stray keypress no longer quits.
  • v0.1.0a28 — pi-style slash commands (/clear, /help, /exit), Ctrl-R history recall, and a one-line progress header.
  • v0.1.0a30 — stays responsive on big stores: searching, stepping matches, and filtering no longer freeze the keyboard.

v0.1.0a23 adds a Lucene-style query language to search, grep, and find — booleans, phrases, field filters (agent:, model:, role:, path:, timestamp:), wildcards, and date ranges. It works the same over the MCP server, with as-you-type completion in the TUI.

Two new backends: v0.1.0a25 adds VS Code GitHub Copilot Chat (Code, Insiders, VSCodium, OSS), and v0.1.0a22 adds Google Antigravity (antigravity-cli, antigravity-ide). Plus faster searches over large Codex, Claude, and Cursor histories.

libtmux

libtmux rounded out its tmux 3.7 support across three June releases.

v0.60.0 brings tmux 3.7's floating panes into the typed Python API:

  • Floating panes: Window.new_pane() / Pane.new_pane() open a popup-like pane above the tiled layout — sized, positioned, styled, and optionally kept open after its command exits
  • Broad 3.7 coverage: new options, variables, and command flags, typed in Python — including new flags on capture_pane() and split()
  • Backward compatible: tmux 3.2a–3.6 keeps working unchanged

v0.59.0 adds tmux 3.7 to the test matrix and works around a 3.7 crash when breaking out a pane, so break_pane() and rejoining work again. v0.58.1 restores pytest 9.1 support.

tmuxp

tmuxp v1.73.0 makes the workspace build step pluggable:

Existing workspaces are unaffected. v1.72.0 / v1.71.0 pull in libtmux 0.60.0 / 0.59.0 — surfacing floating panes and tmux 3.7 through tmuxp's API and tmuxp shell — and v1.70.1 picks up the pytest 9.1 fix.

libtmux-mcp

libtmux-mcp — terminal control for AI agents — refined the tools it exposes across five alphas (v0.1.0a11v0.1.0a15):

  • Keystroke batches: send an ordered run of keys and text to a pane in one call with send-keys-batch
  • Clearer errors: failures surface the original exception plus a hint on what to fix and where to look next
  • Tighter safety: read-only tools are blocked from spawning a shell, an unknown safety setting defaults to read-only, and a vulnerable dependency was patched (CVE-2026-48710)
ai-workflow-plugins

ai-workflow-plugins — a plugin marketplace for Claude Code, Codex, and Gemini — added pytest-optimizer (#24), which finds and applies safe speedups for a slow pytest suite:

  • Finds what's actually slow — the tests and fixtures costing you the most time
  • Measures before it changes anything — each speedup is checked against real timings, not estimated
  • Lands each change as its own commit — verified passing and easy to roll back
  • Safe by default — risky changes are flagged for review, not auto-applied

It also moved skills that use Google agents to the Antigravity CLI (agy) (ai-workflow-plugins#21).

gp-sphinx

gp-sphinx — the autodoc design system for git-pull Sphinx projects — extended its autodoc coverage and refreshed its build stack across five alphas (v0.0.1a27a31):

  • v0.0.1a29 auto-documents the whole docutils/Sphinx extension family — transforms, readers, parsers, writers, nodes, translators, builders, domains — with the same reference cards, via sphinx-autodoc-docutils and sphinx-autodoc-sphinx; components are now linkable from prose
  • v0.0.1a28 moves the theme build stack to current majors — Zod 4, Vitest 4, TypeScript 6, Tailwind 4.3, Vite 8 (Rolldown-powered)
  • v0.0.1a31 gives FastMCP resources and prompts the same linkable cards as tools

gp-libs v0.0.18 moved its own docs onto the published gp-sphinx stack and the shared Library Skeleton layout.

vcspull

libvcs v0.44.0 now returns Git, Mercurial, and SVN output as printed — without the previous per-line trimming — so a captured git diff re-applies cleanly instead of arriving mangled (a breaking change for code that leaned on the old trimmed output). vcspull v1.64.0 / v1.63.0 pick this up with no config or CLI changes, and libvcs v0.45.0 makes the test fixtures order-independent.

cihai

The cihai CJK character stack shipped a coordinated release on 2026-06-28, led by unihan-etl v0.43.0: a corrupt or interrupted UNIHAN download now repairs itself instead of crashing first-time setup. cihai v0.38.0, cihai-cli v0.34.0, and unihan-db v0.21.0 move in step and shift their docs onto the shared gp-sphinx platform — no changes for existing code.

social-embed

The social-embed docs site moved to Astro 7 (#61) and Astro's faster native Rust "Sätteri" Markdown engine (#63) — pages and links render identically. No library or web-component changes this month; see the news & release notes.

May 2026

agentgrep

agentgrep is a new project for searching local AI agent prompts and history across Claude Code, Codex, Cursor, and Gemini CLI. It ships four consumption surfaces from one codebase:

  • CLIagentgrep grep (rg/ag-shaped content search), agentgrep find (fd-shaped file discovery), agentgrep fuzzy (fzf-shaped ranking). A Lucene-style query language threads through all subcommands with field predicates (agent:, mtime:, model:, role:), boolean operators, and date ranges. --json / --ndjson / --vimgrep for pipeline consumption.
  • TUI — Textual app with live-streaming results, vim-style navigation, and format-aware JSON/Markdown rendering. Accessible via bare agentgrep or --ui on any subcommand.
  • Libraryrun_search_query() and typed event-stream iterators for embedding in other tools.
  • MCP serveragentgrep-mcp exposes search, catalog, discovery, and validation tools plus agentgrep:// resources to any MCP client.

Backed by a Pydantic-modelled storage catalog mapping every known prompt and history store across agents. Seven alpha releases (a0–a6) shipped in May.

libtmux

libtmux shipped three feature releases in May:

v0.56.0 is the command-parity release — 50+ new Python methods covering tmux's full command surface:

v0.57.0 adds a typed client model and tmux-native filtering:

v0.58.0 fixes subprocess output decoding on non-UTF-8 locales, where the Unicode format separator was corrupted and list accessors silently returned empty results.

libtmux-mcp

libtmux-mcp shipped six alpha releases (v0.1.0a4 through v0.1.0a9) maturing the agent-facing terminal control surface:

  • Pane recovery: respawn_pane restarts a stuck pane in place, preserving pane_id and window layout
  • Layout-relative targeting: find_pane_by_position resolves window corners (top-left, bottom-right, etc.) to a typed pane — no more parsing tmux format variables
  • Typed geometry: Pane responses now carry window-relative coordinates and edge predicates so agents can reason about layout without extra queries
  • Agent discovery rework: Bare "pane", "window", "session" prompts now activate the server; registration slug standardized to tmux
  • Deterministic command completion: wait_for_text redesigned to match only new output, reframing wait_for_channel as the primary synchronization primitive
  • Polling correctness: Wrapped-line matching in search_panes, history-limit trim warnings, pane lifecycle detection in wait_for_content_change

April 2026

vcspull

v1.59.0 overhauls vcspull sync with timeout guards, live progress, and a per-invocation debug log:

  • Per-repo timeout: Each repo runs under a 10-second deadline; override with --timeout SECONDS. The end-of-run summary lists timed-out repos with copy-pasteable rerun commands.
  • Live status indicator: Terminal spinner shows the active repo name and elapsed time; piped output emits periodic heartbeat lines.
  • Streaming output trail: A 3-line panel above the spinner shows recent git output and collapses when each repo finishes; tunable with --panel-lines.
  • Per-invocation debug log: Drops debug logs under $TMPDIR/vcspull/ (npm/pnpm style), surfaced automatically on failure or timeout.
  • Ctrl-C aborts shell chains: Exits via signal so chained vcspull sync && ... stops on first interrupt.
  • Quieter default output: libvcs logs are silenced by default; pass -v/-vv for verbosity.

Built on libvcs v0.40.0, which adds a timeout= keyword to Git.run()/Hg.run()/Svn.run() and fixes a perf regression on ref-heavy repos (2400+ refs).

libtmux-mcp

libtmux-mcp — terminal control for AI agents, built on libtmux and FastMCP — landed its first public alphas: v0.1.0a1 (2026-04-13) through v0.1.0a3 (2026-04-19). It exposes 30+ MCP tools across the tmux hierarchy (server → session → window → pane):

gp-sphinx

gp-sphinx — an integrated autodoc design system for git-pull Sphinx projects — landed its first public alphas: v0.0.1a10 (2026-04-25) through v0.0.1a12 (2026-04-27). It bundles 12 Sphinx packages that replace ~300 lines of duplicated docs/conf.py with ~10 lines:

Already powering the docs for libtmux v0.55.1, libvcs v0.40.0, and vcspull v1.59.0.

See more

Publications

Language Projects

Unix-like Utilities

Web Projects

Featured content

Coding around the web

Porting (Linux-to-BSD)

#893

#136

#147

  • pyston - An open-source Python implementation using JIT techniques #1072, #1073,

#1085

  • libpypa - Python parser implemented in pure C++ #50

Scrapyard

Experimental code / patches that never made it upstream:

Project templates

Permissively licensed starter templates you can use to bootstrap your projects.

These are mostly outdated

Frontend
Cookiecutter

Presentations

Industry and Press

Code Exploration

Other

  • Leather - PSA on why leather is cool

Donate

Like my open source projects and learning resources? Your support is appreciated!

Emboldening virtue, the Junzi

  • To be a righteous person (君子 jūn zǐ), as opposed to (小人 xiăorén)

What makes a good gentleman-scholar in Confucius' eyes?

  • Be coherent: "How did we get here?", "How do these things connect?"
  • Tolerate ambiguity
  • Treat matters in proportion to the issue
  • Secure attachment