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.0a16–v0.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 stagedCtrl-Cso a stray keypress no longer quits. - v0.1.0a28 — pi-style slash commands (
/clear,/help,/exit),Ctrl-Rhistory 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()andsplit() - 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:
- Bring your own builder: point a workspace at a third-party builder — by name or import path — via a documented
WorkspaceBuilderProtocol; the defaultClassicWorkspaceBuilderis unchanged - Configurable pane readiness (
auto | always | never): the newautodefault waits for the prompt only on zsh, so bash/sh users skip a needless delay
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.0a11–v0.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.1a27–a31):
- 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-docutilsandsphinx-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:
- CLI —
agentgrep 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/--vimgrepfor pipeline consumption. - TUI — Textual app with live-streaming results, vim-style navigation, and format-aware JSON/Markdown rendering. Accessible via bare
agentgrepor--uion any subcommand. - Library —
run_search_query()and typed event-stream iterators for embedding in other tools. - MCP server —
agentgrep-mcpexposes search, catalog, discovery, and validation tools plusagentgrep://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:
- Interactive commands:
display_popup(),display_menu(),command_prompt(),confirm_before(),choose_tree(),choose_buffer(),choose_client() - Buffer I/O:
set_buffer(),show_buffer(),delete_buffer(),save_buffer(),load_buffer(),paste_buffer() - Rearrangement:
Window.swap(),Pane.swap(),Pane.join(),Pane.break_pane(),Pane.move(),Window.rotate(),Window.link(),Window.unlink() - Key bindings and server control:
bind_key(),unbind_key(),run_shell(),source_file(),lock_server() - Headless testing: New
control_modepytest fixture starts a realtmux -Cclient so interactive commands can be tested without a TTY
v0.57.0 adds a typed client model and tmux-native filtering:
Clientobject: Typed access to attached terminals withattached_session,attached_window,attached_panelive-attachment propertiesServer.clients: QueryList accessor for all attached clients- Native filtering:
search_sessions(),search_windows(),search_panes()pass filters directly to tmux's-fflag display_message()on Server and Window, joining the existing Pane method
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_panerestarts a stuck pane in place, preservingpane_idand window layout - Layout-relative targeting:
find_pane_by_positionresolves 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_textredesigned to match only new output, reframingwait_for_channelas the primary synchronization primitive - Polling correctness: Wrapped-line matching in
search_panes, history-limit trim warnings, pane lifecycle detection inwait_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/-vvfor 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):
- Read/write/wait:
send_keys,snapshot_pane,capture_pane,wait_for_text,wait_for_content_change,wait_for_channel - Pane lifecycle:
respawn_panefor in-place shell recovery preservingpane_idand window layout - Buffer orchestration:
load_buffer,paste_buffer,show_buffer,delete_buffer— agent-namespaced via UUID to prevent cross-session collisions - Middleware stack: Audit logging, safety-tier gating (
readonly/mutating/destructive), readonly retry, bounded output - Self-guards: Refuses to kill the agent's own pane; auto-GC of namespaced buffers on shutdown
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:
- Domain autodocumenters:
sphinx-autodoc-argparse(CLIs),sphinx-autodoc-pytest-fixtures(pytest),sphinx-autodoc-fastmcp(MCP tools),sphinx-autodoc-typehints-gp(Python types) - Theme + UX:
sphinx-gp-theme,sphinx-fonts(IBM Plex via Fontsource),sphinx-ux-badges,sphinx-ux-autodoc-layout— unified badge palette and layout across all autodoc sources - Site infrastructure:
sphinx-gp-opengraph,sphinx-gp-sitemap - Sphinx 8.1+ floor, namespaced under
gp-sphinx-*CSS
Already powering the docs for libtmux v0.55.1, libvcs v0.40.0, and vcspull v1.59.0.
Publications
-

The Tao of tmux
Book on tmux terminal multiplexer
Learn tmux, including:
- Session management
- Window and pane navigation
- Scripting and automation
Language Projects
Unix-like Utilities
Web Projects
Featured content
Coding around the web
- My ports for the FreeBSD operating system on portscout
- My issues for FreeBSD in Bugzilla
- Software porting from Linux to BSD on my FreeBSD Wiki Page
- Unofficial tally / roster of open source contributions on OpenHub
- GitHub @tony for recent / current coding
Porting (Linux-to-BSD)
- Elementary Algorithms – Book of Elementary Algorithms and Data structures #16
- pymux – tmux(1) clone in python #34
- aseprite – Cross-platform sprite / pixel art editor #888
- tmux-mem-cpu-load memory, CPU and load averages for tmux status lines #30
- uMario_Jakowski – Super Mario NES clone in SDL2 and C++. Add CMake and get building on FreeBSD and OS X #1
- spdlog - C++11 logger #254
- python-cmake-buildsystem - CMake buildsystem for CPython #133
Scrapyard
Experimental code / patches that never made it upstream:
- kakoune branches: cmake build support, mini, new-cli (#693), observers, rm-server (serverless kakoune), pybind11 and Boost.Python integration
- vis branches: cmake support, C++ support, python integration
- sphinx branches: flexible-builder invocation
- tmux branches: cmake build support
- saltstack + fabric demo: gist
Project templates
Permissively licensed starter templates you can use to bootstrap your projects.
These are mostly outdated
Frontend
- react-typescript-vanilla-starter: Webpack v4
- vue-typescript-vanilla-starter: Vue 2.x, Webpack v4
Cookiecutter
- cookiecutter-pypackage - Bootstrap python packages
- cookiecutter-flask-pythonic - Flask project
Presentations
- Guest Speaker @ Fullstack Academy (YC S12) at 1871 (Feb 2017)
- Guangzhou LUG software freedom day @ Sun Yat-sen University (May 2013)
Industry and Press
- Opensource.com mentions The Tao of tmux (Feb 2017)
- Japanese tech blog mentions The Tao of tmux (Jan 2017)
- Bugsnag Engineering using tmuxp (Nov 2016)
- Pragmatic Coders dev shop on configuring tmux sessions with tmuxp (Dec 2015)
- tmuxp featured on OneThingWell Nov 2013 and June 2014
Code Exploration
- reST, docutils, sphinx, readthedocs (Updated Feb 09, 2015)
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