Skip to content

What's going on in my life as a programmer

What am I busy with outside of work?

Browse by year

2026 | 2025 | 2024 | 2023 | 2022 | 2021 | 2020 | 2019 | 2018 | 2017

2026 UpdatesLink to section

August 2026Link to section

agentgrepLink to section

agentgrep shipped four alphas, v0.1.0a47v0.1.0a50, sharpening what the explorer copies and what the catalogue admits it holds:

  • Copying follows the highlight: select text with the mouse and Ctrl-C copies it, while an empty selection keeps its old job of stopping the search. Notifications now report what was sent to the terminal rather than claiming a clipboard write nothing acknowledged
  • depth:, effort:, and kind: join the query language, so search depth and record kind are typed terms across the CLI, MCP, and explorer instead of flags. A misspelled field predicate now warns with a suggestion rather than quietly running an empty search
  • Every store an agent keeps is catalogued — including app state, derived caches, and encrypted stores agentgrep deliberately does not read — so find tells a deliberate omission from an undiscovered one
  • Origin data returns to three backends: Cursor IDE records carry their working directory, branch, model, and worktree again, Grok transcripts are dated instead of dropping out of date filters, and Gemini stops reporting a project name as a workspace hash
libtmux-mcpLink to section

libtmux-mcp gives an AI agent a tmux terminal. v0.1.0a21 tries a new shape for scoping what that agent can reach: LIBTMUX_TOOLSETS names the groups of tools the server hands out — inspect, manage, execute, teardown — so inspect on its own is an agent that reads panes and never types into one. What shape fits a tmux MCP is still being worked out; the trust page carries the current thinking.

It also keeps caller-supplied names and paths literal instead of letting tmux expand them as formats, and search-panes no longer stalls on a pathological pattern.

vcspullLink to section

libvcs v0.46.0 stops a repository URL or a configured revision from doing more than checking code out. A value starting with - reached git and svn as an option — through git pull, a revision, and svn checkout, three places an end-of-options -- cannot guard — where it could run a command or truncate a file. Those are now rejected. An external report prompted the audit that found them. Progress-callback timestamps are now aware UTC values rather than naive local time.

vcspull v1.67.0 picks this up with no configuration or CLI changes.

django-search-queryLink to section

django-search-query v0.1.0a1 opens the Django floor move that three git-pull packages made on 2026-08-08: a Django 5.2 LTS minimum with 6.0 and 6.1 added, after 4.2 LTS and 5.1 both left security support. Behavior is untouched in each — only the supported range moved. It also fills out its documentation site: a runnable tutorial, how-to guides, an API reference, and a dedicated query-language page whose worked examples are checked against a live table.

django-docutilsLink to section

django-docutils v0.31.0 makes the same move — Django 6.1 and 6.0 added, minimum raised to 5.2 — with rendering unchanged, so upgrading needs no code changes beyond the floor. v0.31.1 puts the project links on the PyPI page and trims the source distribution to the package, its tests, and its docs.

django-slugify-processorLink to section

django-slugify-processor v1.11.0 completes the set and rebuilds its documentation around a purpose-built landing page. slugify(), its template filter, and SLUGIFY_PROCESSORS are unchanged.

gp-sphinxLink to section

gp-sphinx v0.1.0a38 lets a project say what its MCP tools are in its own words. sphinx-autodoc-fastmcp classified every tool against one fixed vocabulary and rendered a single badge, so a project using different tags had everything badged read-only — including the tools that run commands. Tools are now classified on axes the project declares, drawn from tags, MCP’s own ToolAnnotations, or meta, with one badge per axis. Projects on fastmcp_toolsets must move to fastmcp_axes.

July 2026Link to section

agentgrepLink to section

agentgrep searches your local AI-agent prompts and history. July was its heaviest month — fifteen alphas, v0.1.0a32v0.1.0a46 — finishing the explorer and giving every search an explicit depth.

The agentgrep ui explorer stopped being an experiment, across three releases:

  • v0.1.0a36 — controls move inside the input: type / for a compact, filterable menu of commands, /maximize zooms a pane without hiding the input, and /screenshot saves a clean SVG. The experimental --layout and --workflow flags retire in favour of one supported explorer
  • v0.1.0a37 — agentgrep dark, light, and Tokyo Night themes with a first-run chooser, a welcome screen offering runnable query examples, and large result sets that stream instead of building every row first
  • v0.1.0a42 — a detail pane worth reading in: Markdown and source render as styled, selectable text with clickable links, v and y do tmux-style visual select and yank, and a single keymaps.toml keeps vim, emacs, and arrow bindings all working at once

v0.1.0a44 gives every search a depth. The default reads fast prompt history, --deep adds conversations selected from matching prompt evidence, and --exhaustive reads every eligible backend; the MCP server and the explorer offer the same three rungs. Results now say whether they are exact, bounded, or approximate and what to run next, so a shallow miss reads as one rung’s miss rather than an empty corpus. MCP search cursors are gone in favour of one ordered response, and the transcript-only agents leave the default search.

v0.1.0a33 and v0.1.0a34 thread project context through results, so prompts from different checkouts of one repository no longer look alike: working directory, repository, worktree, branch, and workspace hash travel with a record and drive --only-here, cwd:, branch:, and model:. Every MCP tool now advertises that agentgrep is read-only, which lets a host stop asking permission on each call.

v0.1.0a32 realigns the backends to what today’s CLIs actually write — VS Code Copilot Chat had moved to a per-session event log that left recent sessions invisible — and reaches Cursor IDE chat written by the Windows-host UI when running under WSL. v0.1.0a41 makes Pydantic a required dependency and removes the optional serialization bridge, a breaking change for library callers that imported its helpers.

libtmuxLink to section

libtmux shipped two releases in July.

v0.62.0 teaches libtmux objects to locate themselves and to resolve shared windows the way tmux does:

  • Self-location: Pane.from_env() and its Server, Session, and Window siblings let code running inside tmux — a script in a split, a hook, a test harness, an agent — ask where it is, and the answer survives a move-window
  • Shared windows: Window.linked_sessions lists every session that holds a window, and point lookups now let tmux resolve the session and index it would act on rather than whichever sorted last by name
  • Query errors join the LibTmuxException hierarchy — a breaking change for handlers that caught the general exception first

v0.61.0 hardens the tmux 3.7 patch line: break_pane() keeps tmux’s own default window name on 3.7a/3.7b instead of forcing libtmux, and the new get_version_str() returns the version with its point-release suffix intact.

tmuxpLink to section

tmuxp v1.74.0 pairs the libtmux 0.61.0 upgrade with a documentation overhaul. tmuxp debug-info now reports the exact tmux patch release — 3.7a rather than a normalized 3.7 — which is what a bug report needs when patch releases differ in behavior. The docs gain theme-aware inline diagrams in place of static ASCII art and a concept-first rewrite that leads with what each feature is before its configuration.

libtmux-mcpLink to section

libtmux-mcp shipped four alphas, v0.1.0a16v0.1.0a19, led by v0.1.0a19: an agent waiting on a pane now sees the output it was told to watch for.

  • wait-for-text matches the line it was waiting on: the wait began one row past the cursor, which on an idle pane is exactly where the next line arrives — so watching for a daemon’s single ready line could never match at all
  • A wait says how it ended: whether the command never ran, the output did not match, or a full-screen program owns the pane. No wait outruns LIBTMUX_MCP_WAIT_MAX_SECONDS, and cancelling one no longer leaves its tmux child running

v0.1.0a17 keeps an agent’s commands out of your shell history by default, and v0.1.0a18 makes a stale pane id fail once with advice instead of twice in silence.

vcspullLink to section

vcspull v1.66.0 lets you register a repository before you have cloned it: vcspull add now accepts a URL where it required a checkout on disk, and vcspull sync clones it on the next run. A pip-style revision on the URL is recorded as options.rev, so git+https://github.com/pallets/[email protected] stores flask pinned to v1.0. This restores declaring an un-cloned repository at all — something the path-based rework in v1.43.0 had removed.

v1.65.0 turns a failed checkout into guidance: the error names the requested revision, suggests how to repair the configuration, and lists the branches Git actually reported. libvcs v0.45.1 unbreaks suites that build their documentation before running pytest — the bundled plugin was overriding pytest’s own collection-ignore rules.

gp-sphinxLink to section

gp-sphinx — the autodoc design system for git-pull Sphinx projects — shipped six alphas, v0.0.1a32v0.1.0a37.

  • v0.0.1a32 adds sphinx-gp-mermaid: fenced mermaid blocks render to inline SVG at build time in light and dark variants — no client-side runtime, no pop-in, no layout shift
  • v0.0.1a33 gives those diagrams a :responsive: option, and sphinx-gp-highlighting a tree lexer for directory layouts plus inline roles for commands and paths
  • v0.1.0a37 gives every class-level name — a field, a typed-dictionary key, an enum member, a constant — exactly one description with the live signature beside it, and carries a description written on a base class to the subclasses inheriting it. An undescribed ClassVar is now withheld rather than shipped bare

v0.0.1a34 hides # doctest: +HIDE setup lines from rendered docs while still running them, pairing with gp-libs v0.0.19, which adds the flag itself.

django-search-queryLink to section

django-search-query v0.1.0a0 is a new project: a Lucene-inspired search query language for Django, plus an optional admin integration.

  • Core: search_query_to_q() turns a user’s search string into a Django Q — field-scoped terms, quoted phrases, boolean AND/OR/NOT with grouping, comparisons, ranges, and wildcards. Half-typed or unparseable input degrades to a match instead of raising, so a query runs while the user is still typing
  • A field registry declares what is searchable and maps user-facing names to ORM lookups, keeping the search surface decoupled from your models
  • django-admin-search-query: SearchQueryAdminMixin teaches the admin changelist the language, behind a search box that colors the query as you type and suggests field names and enum values entirely client-side. Anything it cannot parse falls back to Django’s search_fields, and with JavaScript off it degrades to the plain box

As an alpha, the APIs may still change before 0.1.0.

django-docutilsLink to section

django-docutils v0.30.1 fixes a failed import on installations without typing-extensions, which the library imported at runtime without declaring. Django, docutils, and Pygments are now the only runtime dependencies, and CI checks that on every push.

June 2026Link to section

agentgrepLink to section

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.

libtmuxLink to section

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.

tmuxpLink to section

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-mcpLink to section

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-pluginsLink to section

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-sphinxLink to section

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.

vcspullLink to section

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.

cihaiLink to section

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-embedLink to section

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 2026Link to section

agentgrepLink to section

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.

libtmuxLink to section

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-mcpLink to section

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 2026Link to section

vcspullLink to section

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-mcpLink to section

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-sphinxLink to section

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.

March 2026Link to section

vcspullLink to section

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/--prune to also remove entries lacking import provenance
  • Provenance tracking: metadata.imported_from tags 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, and fmt no longer silently corrupt .json config 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 2026Link to section

vcspullLink to section

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: --url for GitHub Enterprise, GitLab, Gitea, and Forgejo instances
  • GitLab subgroups: Nested group hierarchies map to workspace roots automatically; --flatten-groups to collapse them
  • SSH clone URLs by default; --https to 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 2026Link to section

tmuxpLink to section

tmuxp v1.63.0 modernizes the CLI with semantic colors and new commands:

  • Semantic colors: New --color flag (auto/always/never) with NO_COLOR/FORCE_COLOR support 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/--ndjson output
  • Enhanced tmuxp ls: --tree for grouped display, --full for complete config, --json/--ndjson for 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-embedLink to section

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

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 output
  • escape_non_printable (-C): Escape non-printable chars as octal \xxx
  • join_wrapped (-J): Join wrapped lines back together
  • preserve_trailing (-N): Preserve trailing spaces at line ends
  • trim_trailing (-T): Trim trailing empty positions (tmux 3.4+)
social-embedLink to section

social-embed has moved from social-embed.git-pull.com to its new home at social-embed.org.

This release adds an interactive Playground for testing embeds (#49):

  • Live code editor with syntax highlighting for HTML and JavaScript
  • Real-time preview with sandboxed iframe execution
  • CDN source picker: Switch between local builds, cdn.social-embed.org, jsDelivr, unpkg, esm.sh, or custom URLs
  • Provider presets: One-click examples for YouTube, Spotify, Vimeo, DailyMotion, Loom
  • Shareable links: URL state serialization for sharing playground configurations

The CDN picker makes it easy to test compatibility across different delivery networks and verify embeds work with production CDN sources.

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.

OIDC documentation deploymentLink to section

All open source project docs now deploy via GitHub Actions OIDC authentication. This eliminates long-lived AWS credentials in favor of short-lived tokens issued per workflow run, improving security posture across projects.

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(), and unset_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:

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, and vcspull discover so workspace sections stop clobbering each other.
  • v1.44.0 makes vcspull add path-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) and vcspull discover (filesystem scan)
  • Normalized -f/--file for repo files across all commands
  • Added introspection commands: vcspull list (view repos) and vcspull status (health checks)
  • Added --dry-run support with Terraform-style plans for preview-before-apply workflows
  • Added structured output (--json/--ndjson) for CI/CD automation
  • Added semantic colors with NO_COLOR support
  • Short flags: -w for workspace, -n for dry-run, -f for 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:

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

unihan-etl: v0.35.0 (diff)

Updated to UNIHAN @ Revision 37.

October 2024Link to section

Faster test fixturesLink to section

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

Automated fixes via ruffLink to section

Machine-made refactors rendering consistent, tight python code:

February 2024Link to section

Busman’s holidayLink to section
libtmuxLink to section

libtmux: v0.31.0 (diff)

  • 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

unihan-etl:

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:

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.

  • v0.15.0 (diff) introduces:

    • Renamed template tags / filters from restructuredtext to rst

    • 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:

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:

cihai-cli updates:

  • June 4th, 2023: 0.17.0: Introduced mypy --strict compliant 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 via typing.Protocol.
  • June 17th, 2023: 0.22.0:
    • Add doctest support
    • Configuration: Move options from dict to typed dataclasses.dataclass object.
    • Docs: Split API documentation into multiple pages
    • Move unihan_etl.process -> unihan_etl.core

unihan-db updates:

  • June 10th, 2023: 0.9.0: mypy --strict compliant 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:

    • libtmux: tmux session, and
    • libvcs: the file paths of the user’s repository checkouts
  • 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:

doctest_docutils

It also has a pytest plugin

On that note, I also made a pytest plugin for libtmux and libvcs:

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 (--strict mypy 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 of dict-like data.
  • libvcs._internal.subprocess.SubprocessCommand: Deferrable subprocess commands.
  • 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

2019 UpdatesLink to section

2019 - AugustLink to section

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:

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

Working for equity

New front-end appLink to section

New front-end app, “CV”, two versions:

See source code on GitHub at https://github.com/tony/cv.

2017 UpdatesLink to section

2017 - DecemberLink to section

New projectLink to section

django-slugify-processor

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.