In-Band Terminal Multiplexing Considered Harmful
A consideration of why the reliability of a terminal environment is a decreasing function of the density of in-band multiplexers.
A consideration of why the reliability of a terminal environment is a decreasing function of the density of in-band multiplexers.
How caching desktop sysdeps saved 48 seconds in Shitty, and why parallelizing Clippy with cargo-nextest cut DeepBlock's CI from 10 minutes to 5.
The eight-job workflow that builds, installs, and byte-verifies a Tauri release across macOS and Debian, and the gotchas that shaped every guard in it.
How I run Pi 1.0.4 on the host, experiment with Durable sessions, and isolate regular Pi in Gondolin without per-tool wrappers.
I ran the same CI checks through Dagger containers and native mise-driven GitHub Actions on the same commit, and measured a 78% test-time cut once the Rust cache actually stayed warm.
How a DeepBlock release job went from a 45-minute timeout to a two-second failure exit, in one afternoon of trial and error with runner disk space, APT stalls, and duplicate builds.
Git 2.56 can now sweep merged local branches natively, but its ancestry-only check misses the squash merges and rebased patches my workflow produces, so my shell helpers stay.
pass-cli login --pat exposes the token in argv and shell history, PAT-authenticated sessions cannot manage PATs, and a rotated token that never reaches the Keychain silently breaks auto-renewal.
A duplicate socket-registration call made nvim probe its own RPC server with a blocking child process, freezing nvim and kitty-scrollback launches.
How I migrated an Astro blog from ESLint and typescript-eslint to type-aware Oxlint, and why astro check still blocks TypeScript 7 here.
How I replaced ESLint and typescript-eslint with Oxlint to unlock the native TypeScript 7 compiler in a Vite + Tauri repo.
Moving a Tauri Android setup from an Android Studio Mac to a headless Debian VM by pinning the SDK as a mise tool.
I removed the per-repo toolchain from my Gondolin dev VM image and made each repo install its own tools at boot from its mise.lock.
How I got image paste and file drag-and-drop working in pi over SSH from kitty, and stopped pi's regular TUI mode from wiping scrollback, without forking pi.
How I made submissions to a slow, unreliable governmental API safe to crash and safe to retry, with a submission state machine, a ShedLock-guarded recovery cron, an idempotency guard, and a full audit trail.
How I replaced a fragile hand-rolled API retry queue with a local-first SQLite sync layer, and the per-user sync rules and server-authoritative upload model that kept it correct.
A single daily GitLab schedule keeps Renovate's vulnerability detection fast while a repository-level schedule window collapses routine dependency churn into one weekly review batch.
An unconditional S3 snapshot restore on every deploy rolled back Let's Encrypt renewals until an expired certificate wedged CertMagic at boot.
Comparing three git worktree layouts for many local repos, and why I settled on ~/worktrees/<repo>/<slug>.
I reorganized a shared shell configuration into XDG-aligned domain modules while preserving startup order, behavior, and warm-shell performance.
I built a shell-native Git worktree selector with safe removal, optional pull-request previews, and behavior shared by Bash and Zsh.
A pnpm peer-resolution path dropped the update depth, retained nanoid 3.3.16, and made a full lockfile and node_modules refresh the clean no-override fix.
Starting with pnpm 11.19 in our build, `pnpm deploy --legacy` left workspace dependencies linked to source directories that the runtime image did not contain.
zmx preserves one Kitty window ID and broadcasts the SSH kitten handshake to every attached client, causing rejected or interleaved responses.
I evaluated Dagger against a monorepo running 2,000 CI jobs a month, separating pipeline changes from the runner, cache, and hardware constraints that remain.
A PMD violation appeared on a clean checkout because the pmd task lacked compiled classes for type resolution. The review also exposed an HTTP contract change behind a passing gate.
How I migrated an Android Expo app from a committed native project to reproducible CNG, then fixed the release task that still inherited the wrong JDK.
zmx gives me the one thing I actually used from tmux (detachable sessions) and leaves window management to my OS, terminal, and editor.
A comparison of a used M1/M2 Mac Mini, ARM64 servers, and AMD x86 hardware for a GitLab CI runner with x86_64 production images.
A missing lockfile setting left mise warning about unresolved tools; the CI lock check also depended on generating locks on glibc rather than musl.
Using glab and the GitLab API to turn a self-hosted runner's job durations into GitLab.com SaaS compute-minute estimates.
A comparison of home hardware, GitLab.com, AWS, ARM64 cloud, local AMD hardware, and Hetzner for a monorepo running 2,000 CI jobs a month.
A recurring SyntaxError traced to a brace-expansion patch and an ESM export-shape mismatch: how moving minimatch to v10 removed one patch while a minimatch@3 compatibility patch remained necessary.
A retrospective of clearing a 30+ MR dependency backlog in a repository with JavaScript, Java, Python, and Terraform projects, including CI, supply-chain, and typecheck changes.
Shell functions that add OSC 8 hyperlink flags to eza, ripgrep, and fd only when stdout is a terminal, so clickable paths never leak into pipes or files.
Seven pnpm releases shipped between 11.7 and 11.13.1, and the one that maps to my config is a peak-memory fix for the minimumReleaseAge and trustPolicy resolution path.
The Gondolin bridge substitutes placeholders in request headers, but the AWS SDK signs the request over the placeholder value. The substitution happens too late and every call returns SignatureDoesNotMatch. The fix is to mount the host's ~/.aws/ read-only instead.
An unquoted recursive glob made Lychee scan seven shallow HTML files in GitHub Actions while the quoted local command reached the full generated Astro site.
Caching the package manager store treats a symptom. A pull-through proxy registry is the layer where cross-runner dependency caching actually compounds.
A source trace explains why Dagger's BuildKit cache bridge works on 0.20.1, disappears in 0.21, and leaves type=gha with no effect.
A decision guide to persistent engines, host-side cache bridges, registry proxies, and cold execution after Dagger 0.21 removed BuildKit remote export.
The Go rewrite delivers 10x faster type-checking. It also removes the programmatic API that eslint, Dagger, and every framework template type-checker depends on.
How I closed two testing gaps on a React Native/Expo app, visual regression and CI integration, by adding Maestro baselines, migrating RNTL to v14, and deleting Storybook RN entirely.
A single broken dependency blocked 20 updates in one Renovate PR. Three config changes prevent it from happening again.
Running a production backend on EC2 without Kubernetes: the immutable-release and coherent-backup model I put in to make deploys reversible and restores internally consistent.
How one Cognito user pool serves four client surfaces through a shared token-pair contract, a REQUEST Lambda authorizer, and defense-in-depth re-validation that isolates a new mobile client without duplicating identity.
Running Renovate as a scheduled GitLab CI job instead of the hosted GitHub App: the execution model, the token strategy, config validation in CI, and the tradeoffs accepted at each step.
Five cache mechanisms layered on a single self-hosted GitLab runner to keep a Java + Node + Python + React Native monorepo fast without standing up an external cache service.
GitLab's recommended control-plane include looked like the clean fix for ~40 repeated rules blocks. I evaluated it, found it would break my manual fallbacks and my lint tool, and collapsed the duplicated if-blocks in place instead.
Pulling four mature JS apps into one root pnpm workspace with a shared lockfile failed for six concrete reasons; here's the narrower shape that survived.
A lockfile change rebuilt five unrelated jobs. The fix was to stop using the lockfile as a build trigger and let the cache key encode toolchain changes instead.
After re-deriving the same pnpm audit remediation decision tree across five JS trees one too many times, I packaged it as an agent skill that runs the process instead of rediscovering it.
A Tauri resource glob hard-failed on CI with exit code 101 because a gitignore !KEEP re-include pointed at a file that was never committed, leaving the resources dir empty on fresh checkouts.
A two-command setup that runs the pi coding agent with either tool-only filesystem sandboxing or full clean-room isolation, each tier matching a different threat model.
A Gondolin-sandboxed pi session crashed on socket close because mise ships pi as a Bun binary while the Gondolin SDK targets Node; installing pi via npm under mise-managed Node fixed it.
How I moved API key exports from eager shell startup to lazy, process-isolated injection using pass-cli run.
How an agents.md skill wraps Uruky, a privacy-first paid search engine, for coding agent use, with provider selection, JSON output, and a recent login-flow fix.
Renovate's vulnerability alerts only cover direct dependencies in npm and pip. Here is the CI-gate and manual-remediation pattern that catches the rest, and why I run Renovate without Dependabot.
How a root_dir callback gate scopes jdtls to a Maven backend in a polyglot pnpm monorepo on Neovim 0.12.
Committing a self-contained mise bootstrap, mounting persistent cache volumes in Dagger, and enforcing the lockfile everywhere so mise.toml is the only source of truth for the toolchain.
Using pnpm catalog to turn two workspace packages with divergent TypeScript and ESLint versions into a single source of truth. Covers a Remotion peer-dep fix and a minimumReleaseAge interaction.
Six pnpm releases shipped while my project was frozen at 11.1.2. Two of them added security controls I should have adopted sooner.
Porting my Dagger module to a repo with a uv Python service and pnpm frontends broke the lockfile-first cache trick, because uv builds the project at install time and pnpm does not.
The frontend/backend split, the wheel pipeline, and why uv sync builds your project.
One container, ten checks, local/CI parity, and three bugs that taught me how Dagger works.
Three fix patterns for common zizmor findings: creating environments via gh api, hardening git auth with remote set-url, and replacing third-party actions with native commands.
How I widened ZMK's layer state from 32-bit to 64-bit and built a dual-OS keyboard layout for the Glove80.
A systematic approach to eliminate every known vulnerability and replace pnpm monkey-patches with proper supply-chain configuration.
fff.nvim is fast and frecency-aware but opinionated about git repos. Snacks.picker covers what fff skips: dotfiles, non-git directories, everything. I wired both into the LazyVim dashboard.
Updating this blog to Astro 7 alpha surfaced vite version conflicts, rolldown type incompatibilities, and the fact that pnpm update bypasses minimumReleaseAge.
How transparent PNGs cause white borders on Apple devices and the fix.
Closing supply chain gaps in an existing Renovate setup with OSV scanning, SHA pin protection, and cooldown alignment complementing pnpm's minimumReleaseAge.
How I route Kitty file hyperlinks to local or SSH-session Neovim, reuse RPC sockets, and keep remote files from opening on my Mac.
How I replaced diffview with CodeDiff and wired gh and ]h for wrapped gitsigns hunk previews in LazyVim.
How to set up Renovate or Dependabot with cooldown policies that complement pnpm's minimumReleaseAge: automated patches without opening the door to compromised packages.
Lockfiles, cooldowns, and exclusion lists are necessary but not sufficient. Provenance verification and behavioral analysis catch the attacks they miss.
Your pnpm security config decays over time. minimumReleaseAgeExclude entries pile up, trustPolicyExclude entries become stale, and allowBuilds lists drift from reality. Here's how to catch it.
How the astro-pagefind integration replaced three Vite workarounds with a single dependency.
Three issues I ran into integrating Pagefind search into an Astro site with Vite's bundler.
What changed when I replaced Nuxt Content's schema and collections with Astro's content collections.
Trying to survive in the JS minefield
How I turned implicit writing patterns into a reusable agent skill for consistent Clanker-authored content.
What I found when I reviewed the Open Graph and structured data setup across bsnews and frangonf.com, and what I changed.
Replacing raw img tags with Astro's built-in Image component for automatic optimization, responsive srcsets, and format conversion.
How I added axe-core and knip to catch accessibility issues, and fixed a contrast problem hiding in my CSS variables.