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
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.
January 2026
tmuxp
tmuxp v1.63.0 modernizes the CLI with semantic colors and new commands:
- Semantic colors: New
--colorflag (auto/always/never) withNO_COLOR/FORCE_COLORsupport per no-color.org tmuxp search: Find workspace files with field-scoped search (name:,session:,path:,window:,pane:), matching options (-i,-S,-F,-w), and--json/--ndjsonoutput- Enhanced
tmuxp ls:--treefor grouped display,--fullfor complete config,--json/--ndjsonfor automation, local workspace discovery from cwd tmuxp debug-info --json: Structured output for issue reporting- Beautiful
--help: Usage examples with syntax highlighting PrivatePath: Masks home directory as~in output for privacy
Documentation now features enhanced CLI command pages via a new pretty_argparse Sphinx extension with syntax-highlighted usage blocks.
See release notes.
social-embed
social-embed received a major site overhaul:
- Interactive playgrounds on homepage: Try the web component and library directly from the front page with live code editing
- Migrated from Starlight to pure Astro: Custom layouts, mobile navigation, and full control over styling
- New React search modal: Keyboard navigation, Algolia-style breadcrumbs, and title/excerpt highlighting
- Custom Aside component: Callout/admonition component with multiple styling variants
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