What's going on in my life as a programmer
What am I busy with outside of work?
Browse by year
2025 | 2024 | 2023 | 2022 | 2021 | 2020 | 2019 | 2018 | 2017
2025 UpdatesLink to section
December 2025Link to section
libtmuxLink to section
libtmux shipped two releases in December:
v0.51.0 enforces deprecations: Legacy API methods (deprecated since v0.16-v0.33) now raise DeprecatedError instead of DeprecationWarning. See the migration reference table for old-to-new method mappings.
v0.52.0 enhances capture_pane() with 5 new parameters exposing tmux capture-pane flags:
escape_sequences(-e): Include ANSI escape sequences for colored outputescape_non_printable(-C): Escape non-printable chars as octal\xxxjoin_wrapped(-J): Join wrapped lines back togetherpreserve_trailing(-N): Preserve trailing spaces at line endstrim_trailing(-T): Trim trailing empty positions (tmux 3.4+)
Trusted Publisher attestationsLink to section
Three packages now publish with PyPI Trusted Publisher and build attestations:
This replaces long-lived PyPI API tokens with OpenID Connect (OIDC) authentication from GitHub Actions, and enables cryptographic verification that packages were built from their claimed source repository.
November 2025Link to section
libtmuxLink to section
libtmux v0.50.0 ships the long-awaited unified options and hooks API:
- Unified Options API: New
show_option(),show_options(),set_option(), andunset_option()methods on Server, Session, Window, and Pane - Hook Management: Full programmatic control over tmux hooks with indexed arrays and bulk operations via
HooksMixin SparseArray: Internal data structure for tmux’s sparse indexed arrays (e.g.,command-alias[0],command-alias[99])- tmux 3.2+ baseline: Dropped support for older tmux versions, enabling cleaner code
See the Options and Hooks guide and release notes.
libvcsLink to section
libvcs v0.38.0 introduces typed APIs for traversing git repository entities:
- Managers: New
Git.branches,Git.remotes,Git.tags,Git.stashes,Git.worktrees,Git.notes,Git.submodules, andGit.reflogfor traversing repository entities - Commands: Low-level typed commands targeting specific entities (branches, tags, stash entries, etc.)
QueryList: Allls()methods return chainable, filterable collections- Bug fixes: 20+ fixes to git command parameters
See the Traversing Git Repos guide and release notes.
vcspullLink to section
vcspull shipped three releases focused on smoothing the new CLI flows:
- v1.42.0 raises the floor to Python 3.10 and adopts libvcs 0.37 to stay current with upstream sync tooling.
- v1.43.0
adds duplicate-root detection/merging to
vcspull fmt,vcspull add, andvcspull discoverso workspace sections stop clobbering each other. - v1.44.0
makes
vcspull addpath-first (auto-detecting name, remote, and workspace), shortens config paths in logs to~/.vcspull.yaml, and stabilises CLI snapshots for future refactors.
The duplicate detection flow now keeps repository configs consistent end to end:
vcspull fmt merges repeated
workspace blocks, vcspull add
infers metadata while honouring --no-merge, and
vcspull discover surfaces
duplicates before they reach vcspull sync,
vcspull list, or
vcspull status.
October 2025Link to section
vcspullLink to section
vcspull: Major CLI modernization (#472) for familiarity, aligning with DevOps tool conventions:
- Support for adding repositories
vcspull add(single repo) andvcspull discover(filesystem scan) - Normalized
-f/--filefor repo files across all commands - Added introspection commands:
vcspull list(view repos) andvcspull status(health checks) - Added
--dry-runsupport with Terraform-style plans for preview-before-apply workflows - Added structured output (
--json/--ndjson) for CI/CD automation - Added semantic colors with
NO_COLORsupport - Short flags:
-wfor workspace,-nfor dry-run,-ffor file
See release notes for v1.39.0, v1.39.1, and v1.40.0.
July 2025Link to section
tony.shLink to section
tony.sh: Migrated the homepage from Sphinx to Astro.
hskflashcards.comLink to section
hskflashcards.com: Migrated from Gatsby to Astro.
February 2025Link to section
libtmuxLink to section
libtmux: Support for context managers have landed in v0.44.0, enabling automatic cleanup of servers, sessions, windows, and panes in tmux.
January 2025Link to section
social-embedLink to section
social-embed: Began overhauling of embed providers to be extendable.
2024 UpdatesLink to section
December 2024Link to section
CVLink to section
CV overhauled
social-embedLink to section
social-embed: Experiment with new doc gen and package manager:
- Documentation: Moved from docusaurus to starlight, an Astro-based documentation generator.
- Package manager: Moved from yarn classic to pnpm.
November 2024Link to section
Migrated Python projects from poetry to uv, a new Rust-based package and project manager.
It’s impressive to see Rust revitalizing tooling in Python and Node.js. What might come next?
unihan-etlLink to section
Updated to UNIHAN @ Revision 37.
October 2024Link to section
Faster test fixturesLink to section
- libvcs:
v0.33.0
(diff): 50% faster.
- vcspull: v1.32.0 (diff): 33% faster.
Additional improvements to pytest fixtures are expected, along with significant enhancements like new options and hooks support in libtmux.
June 2024Link to section
libvcsLink to section
libvcs: v0.30.1 (diff): Support for [AWS CodeCommit] URLs.
CVLink to section
CV: Added sidebar of years, track current year in top menu while scrolling.
April-June 2024Link to section
libtmuxLink to section
libtmux: Working on options and hooks: libtmux#516
March 2024Link to section
libtmux refactoring continuesLink to section
libtmux refactoring continues
- v0.33.0 (diff): Improved new session creation and window splitting.
- v0.34.0-v0.35.0 (diff): Improved
.cmd()in respect to targets.
Automated fixes via ruffLink to section
Machine-made refactors rendering consistent, tight python code:
- unihan-etl: v0.34.0 (diff)
- libvcs: v0.29.0 (diff)
- vcspull: v1.30.0 (diff)
- libtmux: v0.36.0 (diff)
- tmuxp: v1.45.0 (diff)
February 2024Link to section
Busman’s holidayLink to section
libtmuxLink to section
- API streamlining (e.g.,
Pane.select_pane()->Pane.select()) - Up next: Options and hooks: libtmux#516
CVLink to section
CV: Add timeline to pull requests
unihan-etlLink to section
- v0.31.0 (diff): Support updated from UNIHAN at Unicode 11.0.0 (May 2018) to 15.1.0 (Sept 2023), via unihan-etl#309.
- v0.32.0 (diff): Highlight examples on the front page: unihan-etl#253, unihan-etl#314.
- v0.33.0 (diff): Lint improvements, fix CSV highlighting.
January 2024Link to section
CVLink to section
CV: Move to Tailwind (cv#1674, diff)
2023 UpdatesLink to section
2023 - DecemberLink to section
Moved projects to biome linterLink to section
Moved my CV and social-embed project to oxlint biome, a Rust-based linter and formatter:
Documented projects with pydocstyleLink to section
Documented even more projects w/ ruff’s pydocstyle linter:
- cihai: v0.30.0 (diff)
- cihai-cli: v0.25.0 (diff)
- unihan-db: v0.14.0 (diff)
- django-slugify-processor: v1.6.0 (diff)
- g: v0.0.3 (diff)
- vcspull: v1.26.0 (diff)
- tmuxp: v1.33.0 (diff)
2023 - NovemberLink to section
social-embedLink to section
social-embed: Upgraded website from docusaurus v2 to v3 (diff).
Linted project documentationLink to section
Linted project documentation with pydocstyle + ruff:
2023 - OctoberLink to section
Overhauled django-docutilsLink to section
django-docutils - a django package for reStructuredText - is being dusted off.
-
-
Renamed template tags / filters from
restructuredtexttorst -
Enabled template tags to accept block content, e.g.
{% load django_docutils %}{% rst %}**my bold text**{% endrst %} -
Added test coverage for template tags and template engine.
-
-
v0.19.0 (diff): Typings for settings, cleanup, documentation
This package, originally part of a blog that combined django ORM + django
views + intersphinx, remained unused in the attic until last month. It is
now known as django-docutils.
2023 - Late SeptemberLink to section
More mypy —strict compliant typingsLink to section
2023 - Early SeptemberLink to section
More quality improvementsLink to section
2023 - AugustLink to section
Continued quality improvementsLink to section
Building upon the improvements made to ruff in July 2023, the following additional projects have now been revitalized:
CV Website updatedLink to section
CV Website updated
- Dark mode
- Renewed design with CSS variables
2023 - JulyLink to section
Improved Quality StandardsLink to section
This enhances the maintainability of projects by employing ruff, a Python linter/fixer developed in Rust:
- unihan-etl: v0.25.0 (diff)
- cihai: v0.26.0 (diff)
- cihai-cli: v0.21.0 (diff)
- unihan-db: v0.11.0 (diff)
2023 - JuneLink to section
social-embed moved to viteLink to section
social-embed moved to vite.
P.S. cihai updates ongoing (updated below)
2023 - May-JuneLink to section
cihai is being revampedLink to section
cihai is being revamped
After over 5 years of inactivity, this suite of packages has been revived.
cihai updates:
- May 25th, 2023 - 0.20.0: Adds mypy
--strictcompliant typings - June 3rd, 2023 - 0.21.0: Migrate from SQLAlchemy v1.3 to SQLAlchemy v2.0
cihai-cli updates:
- June 4th, 2023:
0.17.0:
Introduced mypy
--strictcompliant typings and transitioned from SQLAlchemy 1.3 to SQLAlchemy 2.0.
unihan-etl updates:
- June 12th, 2023: 0.21.0:
Move to
pathlib, type callbacks viatyping.Protocol. - June 17th, 2023: 0.22.0:
- Add
doctestsupport - Configuration: Move options from
dictto typeddataclasses.dataclassobject. - Docs: Split API documentation into multiple pages
- Move
unihan_etl.process->unihan_etl.core
- Add
unihan-db updates:
- June 10th, 2023: 0.9.0:
mypy
--strictcompliant typings and migrate from SQLAlchemy 1.3 to SQLAlchemy 2.0
In the future, cihai projects will have:
SQLAlchemy updated to 1.4, then 2.0+Completed- Typings, for improved maintainability and completions
- Doctests for tested examples
- unihan-etl and cihai will have their own [pytest plugin]s for bootstrapping a UNIHAN.zip and reusing it throughout the test session.
- In the medium to longterm: Simpler and stable APIs
2022 UpdatesLink to section
2022 - DecemberLink to section
I’m not giving up being successfulLink to section
In 2023:
-
Snappable, expressive configurations will enliven tmuxp and vcspull
Dataclasses will resemble the structure of the:
-
My oldest library - libtmux - will be renewed with dataclasses, documentation, and improve tests
2022 - SeptemberLink to section
One more thing on doctestLink to section
I wrote a doctest module that can parse reStructuredText and markdown:
It also has a pytest plugin
On that note, I also made a pytest plugin for libtmux and libvcs:
- libtmux pytest plugin - bootstrap tmux sessions in your tests
- libvcs pytest plugin - setup and teardown git, mercurial and subversion repos in your tests.
2022 - Mid AugustLink to section
Promises keep comingLink to section
Additionally, test and quality infrastructure has been improved across all projects:
- libtmux now has comprehensive typings (
--strictmypy compliance) as of 0.13.0 - All projects except vcspull now have basic mypy and doctest support.
2022 - Early AugustLink to section
Promises kept (and keep coming)Link to section
libvcs 0.14.0 released w/ typing annotations and doctests.
Also, added a URL Parser (compare to urlparse) for libvcs.parse.git,
libvcs.parse.hg, and libvcs.parse.svn URLs. Extensible using
framework tools. Built on dataclasses and uses doctest.
In the process, “side inventions” (License MIT):
libvcs._internal.query_list.QueryList: Nested searching ofdict-like data.libvcs._internal.subprocess.SubprocessCommand: Deferrablesubprocesscommands.libvcs._internal.dataclasses.SkipDefaultFieldsReprMixin: Exclude default fields (useful for clearer pytest assertions / printing). Thanks Pietro Oldrati.
2022 - JuneLink to section
libvcs and vcspull rebuildLink to section
libvcs and vcspull are being rebuilt from the ground up. This will be a fresh take on one of my earliest python projects. What they’ll be using:
- doctest: actual code demo in documentation which also function as tests
- mypy: type checking through annotations (PEP 484, PEP 526)
- dataclasses (experimental): As a library creator, I will put these to the test
The projects will be a proving ground for quality standards and patterns I’ll adopt across my other and future packages.
2022 - MarchLink to section
All sites moved to new design.
2021 UpdatesLink to section
2021 - JuneLink to section
tmux-python (tmuxp + libtmux), vcs-python (vcspull + libvcs), cihai (cihai, cihai-cli, unihan-etl, unihan-db) moved to markdown
2021 - AprilLink to section
social-embed web componentLink to section
Created @social-embed web component / library in TypeScript and LitElement:
Homepage,
GitHub
2021 - FebruaryLink to section
Experimenting with new CV: cv-react-v2.git-pull.com
2020 UpdatesLink to section
2020 - AugustLink to section
- All documentation moved to poetry, Amazon CloudFront and GitHub actions
- HSKFlashCards has been rewritten in Gatsby + TypeScript + chakra-ui
2019 UpdatesLink to section
2019 - AugustLink to section
- unihan-etl 0.10.3 released
- cihai 0.9 released
- cihai-cli 0.5 released, you can now install via
pip install cihai[cli]
2018 UpdatesLink to section
2018 - JuneLink to section
Notes on common patterns in project structure / layout in git-pull python projects.
2018 - AprilLink to section
New organization mirrors on GitLab:
2018 - MarchLink to section
New organizationsLink to section
Two new organizations:
- tmux-python, for the tmuxp and libtmux projects.
- vcs-python, for the vcspull and libvcs projects.
Working slogan: Permissively licensed. For the public good.
tmuxp CI fixedLink to section
Continuous integration fixed for tmuxp (#348)
2018 - FebruaryLink to section
Package updateLink to section
alagitpull, a Sphinx theme based off alabaster, learned to open external links in new tabs.
New articleLink to section
New front-end appLink to section
New front-end app, “CV”, two versions:
- React Version: React + Redux + Reselect + webpack (source)
- Vue.js Version: Vue.js + Vuex + webpack (source)
See source code on GitHub at https://github.com/tony/cv.
2017 UpdatesLink to section
2017 - DecemberLink to section
New projectLink to section
New articleLink to section
Demystifying Django’s import strings
2017 - NovemberLink to section
New articlesLink to section
2017 - SeptemberLink to section
New articleLink to section
Pipenv: Holy Grail for Python Environments
2017 - AugustLink to section
The design and internals of HSKFlashCards have been refreshed.
2017 - JulyLink to section
New websiteLink to section
New website (in development): https://devel.tech
See devel.tech’s open source contributions and site updates
2017 - JuneLink to section
New articlesLink to section
Django vs Flask and About UNIHAN
New ProjectLink to section
unihan-db, database models and abstraction for UNIHAN.
2017 - MayLink to section
unihan-etlLink to section
unihan-etl, a tool to access UNIHAN, a dataset of Chinese, Japanese, and Korean character information, to a etl format, is now available. Supports customizable export to CSV, YAML, JSON, python, and Data Package format.
2017 - AprilLink to section
cihai, a project to open and standardize CJK datasets, is being restarted.
2017 - MarchLink to section
The Tao of tmux has been updated. See 2017-03-30 for more details.
2017 - FebruaryLink to section
HSKFlashCards has gotten a face lift. Take your study of chinese glyphs to the next level with its new search and directory functionality.
2017 - JanuaryLink to section
New bookLink to section
A new book, The Tao of tmux is available on Leanpub and Kindle (Amazon). Read and browse the book for free on the web.