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
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.
March 2026
vcspull
v1.58.0 adds --sync and --prune flags to vcspull import for full bidirectional config reconciliation, a --prune-untracked flag, and a granular options.pin metadata field to protect specific entries from mutation:
--sync: Updates changed URLs and prunes stale entries, fully reconciling config with the remote--prune: Standalone cleanup — removes stale entries without updating URLs--prune-untracked: Extends--sync/--pruneto also remove entries lacking import provenance- Provenance tracking:
metadata.imported_fromtags scope pruning — manually added repos are never removed options.pin: Per-repo, per-operation mutation guard (pin: true,pin: {import: true},allow_overwrite: false)- Bug fix:
vcspull add,discover, andfmtno longer silently corrupt.jsonconfig files
Available on all six import providers. Pruning is config-only — cloned directories on disk are not deleted. Uses a consistent CRDT action model (classifier → enum → apply) across all five config-mutation operations.
February 2026
vcspull
vcspull shipped two feature releases:
v1.55.0 adds vcspull import for bulk-importing repositories from remote hosting services into your vcspull configuration:
- 6 services: GitHub (
gh), GitLab (gl), Codeberg (cb), Gitea, Forgejo, and AWS CodeCommit (cc) - 3 modes: user (default), organization, and search
- Filtering:
--language,--topics,--min-stars,--archived,--forks - Self-hosted support:
--urlfor GitHub Enterprise, GitLab, Gitea, and Forgejo instances - GitLab subgroups: Nested group hierarchies map to workspace roots automatically;
--flatten-groupsto collapse them - SSH clone URLs by default;
--httpsto switch
No new dependencies — HTTP is handled with stdlib urllib.
v1.56.0 adds vcspull worktree for declarative git worktree management. Configure worktrees per-repo in YAML targeting tags, branches, or commits, then list, sync, and prune them. Dirty worktrees are reported as BLOCKED (never force-updated), and --include-worktrees on vcspull sync handles repositories and their worktrees in one pass.
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