[{"data":1,"prerenderedAt":380},["ShallowReactive",2],{"navigation":3,"\u002Fblog\u002Fsleeping-on-zellij":204,"\u002Fblog\u002Fsleeping-on-zellij-surround":375},[4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,180,184,188,192,196,200],{"title":5,"path":6,"stem":7},"You do not have time to not have tests","\u002Fblog\u002Fyou-do-not-have-time-to-not-have-tests","2.blog\u002F20211217.you-do-not-have-time-to-not-have-tests",{"title":9,"path":10,"stem":11},"Migrate Vue 2 with Vuetify and Jest to Vite and Vitest","\u002Fblog\u002Fmigrate-vue-2-with-vuetify-and-jest-to-vite-and-vitest","2.blog\u002F20220109.migrate-vue-2-with-vuetify-and-jest-to-vite-and-vitest",{"title":13,"path":14,"stem":15},"I am a Dark Matter Developer","\u002Fblog\u002Fi-am-a-dark-matter-developer","2.blog\u002F20220626.i-am-a-dark-matter-developer",{"title":17,"path":18,"stem":19},"Why using Conventional commits is useful","\u002Fblog\u002Fusing-conventional-commits","2.blog\u002F20240623.using-conventional-commits",{"title":21,"path":22,"stem":23},"Why you should make a toolbox repository","\u002Fblog\u002Fwhy-you-should-make-a-toolbox-repository","2.blog\u002F20240630.Why-you-should-make-a-toolbox-repository",{"title":25,"path":26,"stem":27},"Apache Airflow Part 1 - Why and Goals for a near Serverless ELT","\u002Fblog\u002Fapache-airflow-part-1-why-and-goals","2.blog\u002F20240710.apache-airflow-part-1-why-and-goals",{"title":29,"path":30,"stem":31},"Oh My Zsh on your server","\u002Fblog\u002Foh-my-zsh-on-your-server","2.blog\u002F20240711.oh-my-zsh-on-your-server",{"title":33,"path":34,"stem":35},"Fire tablet and YouTube Kids","\u002Fblog\u002Ffire-tablet-and-youtube-kids","2.blog\u002F20240714.fire-tablet-and-youtube-kids",{"title":37,"path":38,"stem":39},"Using Ollama and Continue as a GitHub Copilot Alternative","\u002Fblog\u002Fusing-ollama-and-continue-as-github-copilot-alternative","2.blog\u002F20240723.using-ollama-and-continue-as-github-copilot-alternative",{"title":41,"path":42,"stem":43},"Debugging Local Packages Made Easy with pnpm","\u002Fblog\u002Fdebugging-local-packages-with-pnpm-link","2.blog\u002F20250422.debugging local-packages-with-pnpm-link",{"title":45,"path":46,"stem":47},"Two Weeks with Cloudflare AI and Tools","\u002Fblog\u002Ftwo-weeks-with-cloudflare-ai-and-tools","2.blog\u002F20250509.two-weeks-with-cloudflare-aI-and-tools",{"title":49,"path":50,"stem":51},"Adding Prompts to VS Code - How I Learned to Stop Worrying and Love AI Context","\u002Fblog\u002Fadding-prompts-to-vscode","2.blog\u002F20250528.adding-prompts-to-vscode",{"title":53,"path":54,"stem":55},"My Best Practices","\u002Fblog\u002Fmy-best-practicies","2.blog\u002F20250607.my-best-practicies",{"title":57,"path":58,"stem":59},"Creating my own CLI Tool - Towles Tool","\u002Fblog\u002Ftowles-tool","2.blog\u002F20250607.towles-tool",{"title":61,"path":62,"stem":63},"Software Development Best Practices & ITIL","\u002Fblog\u002Fsoftware-engineering-and-itil-best-practices","2.blog\u002F20250612.software-engineering-and-itil-best-practices",{"title":65,"path":66,"stem":67},"Voice to Text","\u002Fblog\u002Fvoice-to-text","2.blog\u002F20250622.voice-to-text",{"title":69,"path":70,"stem":71},"Setting Up ComfyUI - A Better Alternative to Fooocus","\u002Fblog\u002Fcomfy-ui-setup","2.blog\u002F20250628.comfy-ui-setup",{"title":73,"path":74,"stem":75},"Voice to System","\u002Fblog\u002Fvoice-to-system","2.blog\u002F20250705.voice-to-system",{"title":77,"path":78,"stem":79},"Tips for Claude Code","\u002Fblog\u002Ftips-for-claude-code","2.blog\u002F20250713.tips-for-claude-code",{"title":81,"path":82,"stem":83},"Review That AI Code: Why I Read Every Line Generated Code","\u002Fblog\u002Freview-that-ai-code","2.blog\u002F20250720.review-that-ai-code",{"title":85,"path":86,"stem":87},"My Context Engineering Journey: From Dev Scripts to AI Collaboration","\u002Fblog\u002F20250803-1.my-context-engineering-journey","2.blog\u002F20250803-1.my-context-engineering-journey",{"title":89,"path":90,"stem":91},"Context Engineering at Scale: Enterprise Lessons and the Future of Development","\u002Fblog\u002F20250803-2.context-engineering-at-scale","2.blog\u002F20250803-2.context-engineering-at-scale",{"title":93,"path":94,"stem":95},"Check That Your Tools and Linters Do Not Burn Tokens","\u002Fblog\u002Fcheck-that-your-tools-and-linters-do-not-burn-tokens","2.blog\u002F20250806.check-that-your-tools-and-linters-do-not-burn-tokens",{"title":97,"path":98,"stem":99},"Markdown + AI: The Communication Protocol That Changes Everything","\u002Fblog\u002Fmarkdown-plus-ai-the-communication-protocol-that-changes-everything","2.blog\u002F20250814.markdown-plus-ai-the-communication-protocol-that-changes-everything",{"title":101,"path":102,"stem":103},"Finally: Type-Safe AI in Production (And Why I'm Here For It)","\u002Fblog\u002Ffinally-type-safe-ai-in-production-and-why-im-here-for-it","2.blog\u002F20250819.finally-type-safe-ai-in-production-and-why-im-here-for-it",{"title":105,"path":106,"stem":107},"Dotfiles: Masterpiece or Late Stage Picasso?","\u002Fblog\u002Fdotfiles-masterpiece-or-late-stage-picasso","2.blog\u002F20250822.dotfiles-masterpiece-or-late-stage-picasso",{"title":109,"path":110,"stem":111},"Beyond API Wrappers: Building State-Driven MCP Servers for Long-Horizon Agent Orchestration","\u002Fblog\u002Fbeyond-api-wrappers-mcp-servers","2.blog\u002F20250907.beyond-api-wrappers-mcp-servers",{"title":113,"path":114,"stem":115},"Why Vertical Integration Wins: A Software Engineer's Case for Owning Your Stack","\u002Fblog\u002Fwhy-i-bought-tesla-model-3-vertical-integration","2.blog\u002F20250928.why-i-bought-tesla-model-3-vertical-integration",{"title":117,"path":118,"stem":119},"The Min-Maxer's Trifecta: Building Tools for the Game You Actually Play","\u002Fblog\u002Fmin-maxer-trifecta","2.blog\u002F20251004.min-maxer-trifecta",{"title":121,"path":122,"stem":123},"Read The Source: Learning by Cutting Out The Middleman and RTFM","\u002Fblog\u002Fread-the-source","2.blog\u002F20251010.read-the-source",{"title":125,"path":126,"stem":127},"The Exponential Shift: Why AI Progress Feels Different Now","\u002Fblog\u002Fthe-exponential-shift","2.blog\u002F20251015.the-exponential-shift",{"title":129,"path":130,"stem":131},"Plan Mode for Your Problems, Edit Mode for Claude's","\u002Fblog\u002Fplan-mode-problems-edit-mode-solutions","2.blog\u002F20251019.plan-mode-problems-edit-mode-solutions",{"title":133,"path":134,"stem":135},"AWS Aurora DSQL Looked Perfect Until I Needed the Connection String","\u002Fblog\u002Faws-aurora-dsql-postgres-serverless-authentication","2.blog\u002F20251028.aws-aurora-dsql-postgres-serverless-authentication",{"title":137,"path":138,"stem":139},"Switchback: Browser History for Your Thoughts","\u002Fblog\u002Fswitchback-second-order-reasoning","2.blog\u002F20251205.switchback-second-order-reasoning",{"title":141,"path":142,"stem":143},"AI Pairing: Notes to Self","\u002Fblog\u002Fai-pairing-notes-to-self","2.blog\u002F20251216.ai-pairing-notes-to-self",{"title":145,"path":146,"stem":147},"I've Been Sleeping on Zellij","\u002Fblog\u002Fsleeping-on-zellij","2.blog\u002F20251229.sleeping-on-zellij",{"title":149,"path":150,"stem":151},"Implementing a Ralph Wiggum Loop: The Secret is Session Markers","\u002Fblog\u002Fimplementing-ralph-wiggum-loop-for-autonomous-ai-coding","2.blog\u002F20260114.implementing-ralph-wiggum-loop-for-autonomous-ai-coding",{"title":153,"path":154,"stem":155},"Goodhart's Law Ate My Context Window","\u002Fblog\u002Fgoodharts-law-ate-my-context-window","2.blog\u002F20260119.goodharts-law-ate-my-context-window",{"title":157,"path":158,"stem":159},"Claude Code's Hidden Multi-Agent System Is Real","\u002Fblog\u002Fclaude-code-hidden-multi-agent-system","2.blog\u002F20260124.claude-code-hidden-multi-agent-system",{"title":161,"path":162,"stem":163},"Free Printable Math Sheets for Kids — Number Chart, Skip Counting, Multiplication, and More","\u002Fblog\u002Ffree-printable-number-chart-and-coin-sheets","2.blog\u002F20260214.free-printable-number-chart-and-coin-sheets",{"title":165,"path":166,"stem":167},"We Are Near the End of the Exponential","\u002Fblog\u002Fnear-the-end-of-the-exponential","2.blog\u002F20260214.near-the-end-of-the-exponential",{"title":169,"path":170,"stem":171},"Free Printable Language Arts Sheets for Kids — Sight Words, Parts of Speech, Homophones, and More","\u002Fblog\u002Ffree-printable-sight-words-and-grammar-sheets","2.blog\u002F20260215.free-printable-sight-words-and-grammar-sheets",{"title":173,"path":174,"stem":175},"Interactive Code Execution with Artifacts","\u002Fblog\u002Finteractive-code-execution-with-artifacts","2.blog\u002F20260215.interactive-code-execution-with-artifacts",{"title":177,"path":178,"stem":179},"Free Printable Telling Time Worksheet for Kids — Clock Reference & Practice Sheet","\u002Fblog\u002Ffree-printable-telling-time-worksheet","2.blog\u002F20260216.free-printable-telling-time-worksheet",{"title":181,"path":182,"stem":183},"Claude Code Skills: Teaching AI Your Playbook","\u002Fblog\u002Fclaude-code-skills-guide","2.blog\u002F20260221.claude-code-skills-guide",{"title":185,"path":186,"stem":187},"Building a Multi-Agent Loan Approval System with Human-in-the-Loop","\u002Fblog\u002Fmulti-agent-loan-approval-human-in-the-loop","2.blog\u002F20260225.multi-agent-loan-approval-human-in-the-loop",{"title":189,"path":190,"stem":191},"The Inception of AI Infrastructure: Bottlenecks All the Way Down","\u002Fblog\u002Fbiggest-bottleneck-scaling-ai-compute","2.blog\u002F20260313.biggest-bottleneck-scaling-ai-compute",{"title":193,"path":194,"stem":195},"What I Tell Teams About Claude Code","\u002Fblog\u002Fwhat-i-tell-teams-about-claude-code","2.blog\u002F20260314.what-i-tell-teams-about-claude-code",{"title":197,"path":198,"stem":199},"The Hardest Part of AI Isn't the AI","\u002Fblog\u002Fthe-hardest-part-of-ai-isnt-the-ai","2.blog\u002F20260327.the-hardest-part-of-ai-isnt-the-ai",{"title":201,"path":202,"stem":203},"Claude Code Hooks: The Capability I Left on the Table","\u002Fblog\u002Fclaude-code-hooks-capability-left-on-the-table","2.blog\u002F20260401.claude-code-hooks-capability-left-on-the-table",{"id":205,"title":145,"authors":206,"badge":212,"body":214,"date":364,"description":365,"extension":366,"image":367,"meta":370,"navigation":371,"path":146,"seo":372,"status":373,"stem":147,"__hash__":374},"posts\u002F2.blog\u002F20251229.sleeping-on-zellij.md",[207],{"name":208,"to":209,"avatar":210},"Chris Towles","https:\u002F\u002Ftwitter.com\u002FChris_Towles",{"src":211},"\u002Fimages\u002Fctowles-profile-512x512.png",{"label":213},"Tools",{"type":215,"value":216,"toc":354},"minimark",[217,222,226,229,233,236,244,247,251,254,261,264,271,274,277,283,287,290,293,297,300,333,336,339,343],[218,219,221],"h2",{"id":220},"why-i-never-used-tmux","Why I Never Used tmux",[223,224,225],"p",{},"Never got into tmux. The keybindings felt arcane, the config was intimidating, and I just... used multiple terminal windows. I've been oh-my-zsh-ing and iTerm2-ing my way through life without a multiplexer. Like a savage.",[223,227,228],{},"As part of working with my brother Patrick on a project, he recommended I try Zellij or Zed. Zellij is Rust, and everything my brother builds is Rust, so I'm giving it a shot.",[218,230,232],{"id":231},"the-problem-that-finally-made-me-try-one","The Problem That Finally Made Me Try One",[223,234,235],{},"I've been searching for a better Claude Code workflow. I keep switching between terminal windows, browser tabs, and editors. Claude can spin up agents on tasks beautifully, but I wasn't managing my own mental context well.",[223,237,238,239,243],{},"Here's my typical disaster: I'd open 5 terminal windows in VS Code, each running different Claude sessions. Then VS Code would crash (probably from all the Claude Code output flickering). I'd lose everything and have to piece it back together by checking ",[240,241,242],"code",{},"claude --resume"," threads, trying to figure out which ones were done and which were still working.",[223,245,246],{},"Add multiple repos, git worktrees, and branches to the mix? Chaos.",[218,248,250],{"id":249},"discovering-zellij","Discovering Zellij",[223,252,253],{},"Zellij caught my attention because it solves the exact problem I was having - persistent panes that survive crashes, with an interface that doesn't require memorizing cryptic keybindings.",[223,255,256,260],{},[257,258,259],"strong",{},"My biggest tip if you're new",": Start with the defaults. Don't customize anything yet.",[223,262,263],{},"I made the classic mistake of having Claude help me set up a fancy layout on day one. It looked great:",[223,265,266],{},[267,268],"img",{"alt":269,"src":270},"Zellij layout with Claude Code and Vite dev server in two panes","\u002Fimages\u002Fblog\u002F20251229-zellij-claude-suggested-layout.png",[223,272,273],{},"But I had no idea what any of the keybindings did. I spent the first hour completely lost, fighting against config I didn't understand.",[223,275,276],{},"So I scrapped it and started over with the stock layout. The default shows all keybindings on screen, making it easy to learn as you go:",[223,278,279],{},[267,280],{"alt":281,"src":282},"Zellij multi-pane workflow with Claude Code agents running in parallel","\u002Fimages\u002Fblog\u002F20251229-zellij-multipane-workflow.png",[218,284,286],{"id":285},"the-lesson-i-keep-re-learning","The Lesson I Keep Re-Learning",[223,288,289],{},"This is a mistake I make over and over for years with every new tool or framework: trying to make it behave like my old setup before I understand it on its own terms.",[223,291,292],{},"Someone spent a lot of time thinking about their tool's design and made deliberate tradeoffs. When I immediately try to customize it to feel \"familiar,\" I'm fighting against that design. Better to learn the tool as intended first, then customize once I understand what I'm changing and why.",[218,294,296],{"id":295},"early-impressions","Early Impressions",[223,298,299],{},"Still figuring out the ideal workflow, but I'm already loving:",[301,302,303,315,321,327],"ul",{},[304,305,306,309,310],"li",{},[257,307,308],{},"Multi-pane persistence"," - No more losing context when VS Code crashes\n",[301,311,312],{},[304,313,314],{},"Also, naming the panes helps me remember what each is doing",[304,316,317,320],{},[257,318,319],{},"Easy pane management"," - Splitting, resizing, and navigating panes is intuitive",[304,322,323,326],{},[257,324,325],{},"Discoverable keybindings"," - The on-screen hints actually teach you as you work",[304,328,329,332],{},[257,330,331],{},"Stackable panes"," - Great for running multiple Claude agents in the background while keeping focus on the main task",[223,334,335],{},"The dream setup I'm working toward: one pane for primary work, with stackable background panes for each Claude agent. Spin up an agent, let it work, check back when it's done. All without losing track of what's running where. Not sure about worktrees yet.",[223,337,338],{},"Still exploring whether to run Zellij inside VS Code's terminal or in a separate terminal app. The keybinding conflicts with VS Code are annoying, and I'm not sure yet if file links will open correctly. More experimentation needed.",[218,340,342],{"id":341},"resources","Resources",[301,344,345],{},[304,346,347],{},[348,349,353],"a",{"href":350,"rel":351},"https:\u002F\u002Fzellij.dev\u002Fdocumentation\u002F",[352],"nofollow","Zellij Documentation",{"title":355,"searchDepth":356,"depth":356,"links":357},"",2,[358,359,360,361,362,363],{"id":220,"depth":356,"text":221},{"id":231,"depth":356,"text":232},{"id":249,"depth":356,"text":250},{"id":285,"depth":356,"text":286},{"id":295,"depth":356,"text":296},{"id":341,"depth":356,"text":342},"2025-12-29","A non-tmux user finally discovers terminal multiplexers through Zellij","md",{"src":368,"alt":369},"images\u002Fblog\u002F20251230-0135-sleeping-on-zellij.jpeg","A developer's ultrawide monitor displaying an elegantly organized terminal with multiple glowing panes arranged in a perfect grid, each pane showing different running processes with subtle green and amber terminal text. In the foreground, scattered and overlapping browser tabs and terminal windows fade into chaos on a secondary display, creating visual contrast between disorder and order. Dramatic side lighting with warm rust-orange accent lighting reflecting off the organized screen while cool blue tones illuminate the chaotic side, cinematic depth of field focusing on the organized terminal. Photorealistic, 8k quality, moody developer workspace atmosphere, high contrast color grading with teal shadows and warm highlights, 16:9 composition.",{},true,{"title":145,"description":365},"published","WSpjXLJCkn2wau4yQsAueIip1wkpoDleMrhvJQdmp6Y",[376,378],{"title":141,"path":142,"stem":143,"description":377,"status":373,"children":-1},"My ever-evolving tips for pairing with AI - not rules, just habits I keep forgetting",{"title":149,"path":150,"stem":151,"description":379,"status":373,"children":-1},"How I turned towles-tool into an autonomous AI coding system using session markers to preserve context across iterations - and the weekend of mistakes that got me there.",1776221196452]