Blog

My personal notebook — a place to save things I learn, break, and fix. Some articles are written from scratch, some are heavily edited with AI, and some are just small code snippets I want to keep handy. A lot of it is here so I remember it next time. Maybe someone else will find it useful too.

Blog intro illustration

Showing all posts

Linux

Executable Cheatsheets: which-key for your whole Linux desktop, in rofi

A rofi cheatsheet that doesn't just list your keybindings — it runs them. Live-parsed from the i3 config for the WM; for apps it reads each keymap from wherever the app hides it (Telegram/Zen JSON, Brave over CDP, mpv over IPC) and fires it. Inspired by which-key.nvim.

A fullscreen rofi menu listing i3 keybindings, each row a key chord and its action
AI

Making My Portfolio Chat Widget Stream Like ChatGPT

Building the chat widget, wiring it to OpenRouter with tool calls, then moving from a blocking response to Server-Sent Events — this time owning the backend, not just the frontend.

Terminal streaming Server-Sent Events — data delta frames printing an answer word by word
AI

I Gave My Portfolio an MCP Server

Why and how I built an MCP server on top of my personal website — so AI assistants can query my projects, experience, and technical work directly.

Diagram showing an AI assistant connecting to a portfolio through MCP
Linux

telepad: Discord-Style Quick-Jump for Telegram, From Any Window

A Rust + rofi menu that jumps Telegram to any chat, group, channel, contact, forum topic or archived chat — across multiple accounts — from any window on i3. Telegram has no Ctrl+K quick-switcher; this is my fix for it.

Rofi menu listing Telegram chats across multiple accounts for quick jumping
Linux

brave-rofi-rust: Switch Browser Tabs From Any Window

A Rust + rofi menu that switches browser tabs, bookmarks, and history from any window on i3 — not just when the browser is focused. It drives Brave over the Chrome DevTools Protocol and hands window-raising to a hook, so one keybind works everywhere.

Rofi menu listing Brave browser tabs for switching
Homelab

x2x: One Keyboard, Two Screens

How to share your keyboard and mouse between two X11 displays using x2x — no KVM switch, no remote desktop, just edge-of-screen cursor sliding.

Two monitors side by side with cursor moving between them
Homelab

Running a mesh network behind CGNAT and DPI

How I keep my homelab reachable from laptops and one old 32-bit Android phone that also has to be my DPI-bypass VPN device.

Mesh access architecture with a VPS, DPI-bypass tunnel, and homelab clients
Open Source

My Bun PR Outlived the Language It Was Written In

A follow-up: my Zig fix for bun create got auto-closed by a bot because Bun had migrated to Rust. I traced what actually happened, re-did the fix in Rust, fought the NixOS toolchain, and ran into the real bottleneck in Bun — not code, but review.

Terminal-style thumbnail: PR #29089 closed as predating the Rust rewrite, src/cli.zig moved into runtime/cli, reopened as Rust PR #32954
Homelab

The $300 Living-Room Home Server on an Old ThinkPad T460s

How an old ThinkPad T460s with a dead touchpad became a living-room home server for Telegram bots, music, audiobooks, torrents, NFS storage, and private remote access.

Laptop plugged into a TV serving as a homelab
Open Source

Debugging a Broken Nuxt Command into a Bun CLI Bug

I tried to scaffold a Nuxt 3 project with Bun, found that the docs command was misleading, traced the real bug into Bun's CLI argument forwarding, got a Nuxt docs PR merged, and opened a Bun fix in Zig with help from Claude Code.

Terminal-style thumbnail showing Bun passing -- literally while npm passes -t v3 correctly
Neovim

telescope-gist: GitHub Gists Belong in Telescope

I built a Neovim Telescope extension for GitHub Gists: list them, preview with filetype syntax highlighting, open multi-file gists as editable buffers, push changes back on :w, create from visual selections, delete, yank URLs, and keep it fast with a two-layer cache.

Neovim Telescope picker showing GitHub Gists with edit and cache hints
Homelab

tg-media-bot: Send a Link, Get the File Back

A self-hosted Telegram bot that downloads media from 1000+ sites with yt-dlp and sends it straight back — tagged MP3s, inline-playable video, 2 GB uploads, a live progress bar. Plus the war stories: three bugs hiding in code that looked finished, an upload you can't measure, and a cookies.txt that broke the very site it was meant to help.

Terminal showing tg-media-bot fetching a link with yt-dlp and sending the file
Homelab

tg-mpv-bot: My TV's Remote Is Now Telegram

I rebuilt my Telegram→mpv homeserver hack into a standalone open-source bot: browse the library with inline buttons, stream any link, forward 2 GB Telegram files to the TV — plus the networking war stories (broken IPv6, IP-locked CDNs, an MP4 that deadlocked a pipe) that shaped its architecture.

Terminal showing tg-mpv-bot playing media controlled from Telegram
Homelab

How Docker Silently Ate 105GB on My ThinkPad's Btrfs Root

A homelab on an old ThinkPad T460 with a 217GB Btrfs root ran out of space. The culprit: unbounded Docker logs from a single GitLab container. Here's how I diagnosed it, fixed it, and hardened the setup.

Terminal showing docker system df reclaiming 105 GB on a Btrfs root
Homelab

Reading Hermes Agent's Status Bar and Cutting Token Usage on Long Sessions

What every glyph in Hermes' TUI status bar actually means (corrected against the source — yes, one of them is not an ETA), how to spot when the agent is about to burn through your nanogpt monthly allowance, and the config knobs that actually move the needle.

Terminal showing the Hermes agent status bar with context and token usage
Shell

Tmuxinator Projects with fzf

Interactively browse and launch tmuxinator projects from terminal using fzf

Terminal showing fzf selecting a tmuxinator project

No posts match your filters