summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-02-01 20:25:06 +0200
committerPaul Buetow <paul@buetow.org>2026-02-01 20:25:06 +0200
commit770b163d25d45c3aa2c09496d5f7c5f7738308b9 (patch)
tree06aa34842f8a981ede0656209932e8eadfb5898a
parentda96c83f00a257ac6797632e8fa10018df9f4a33 (diff)
Update content for html
-rw-r--r--about/resources.html208
-rw-r--r--gemfeed/2026-02-02-tmux-popup-editor-for-cursor-agent-prompts.html317
-rw-r--r--gemfeed/atom.xml401
-rw-r--r--gemfeed/index.html1
-rw-r--r--gemfeed/tmux-popup-editor-for-cursor-agent-prompts/demo1.pngbin0 -> 66443 bytes
-rw-r--r--gemfeed/tmux-popup-editor-for-cursor-agent-prompts/demo2.pngbin0 -> 79061 bytes
-rw-r--r--index.html3
-rw-r--r--uptime-stats.html2
8 files changed, 734 insertions, 198 deletions
diff --git a/about/resources.html b/about/resources.html
index 27e4197d..ffd2da66 100644
--- a/about/resources.html
+++ b/about/resources.html
@@ -50,112 +50,112 @@
<span>In random order:</span><br />
<br />
<ul>
-<li>DNS and BIND; Cricket Liu; O&#39;Reilly</li>
-<li>21st Century C: C Tips from the New School; Ben Klemens; O&#39;Reilly</li>
-<li>DevOps And Site Reliability Engineering Handbook; Stephen Fleming; Audible</li>
-<li>C++ Programming Language; Bjarne Stroustrup;</li>
-<li>The DevOps Handbook; Gene Kim, Jez Humble, Patrick Debois, John Willis; Audible</li>
-<li>Clusterbau mit Linux-HA; Michael Schwartzkopff; O&#39;Reilly</li>
-<li>Chaos Engineering - System Resiliency in Practice; Casey Rosenthal and Nora Jones; eBook</li>
-<li>Amazon Web Services in Action; Michael Wittig and Andreas Wittig; Manning Publications</li>
-<li>Data Science at the Command Line; Jeroen Janssens; O&#39;Reilly</li>
+<li>Polished Ruby Programming; Jeremy Evans; Packt Publishing</li>
+<li>100 Go Mistakes and How to Avoid Them; Teiva Harsanyi; Manning Publications</li>
+<li>Effective Java; Joshua Bloch; Addison-Wesley Professional</li>
+<li>Distributed Systems: Principles and Paradigms; Andrew S. Tanenbaum; Pearson</li>
+<li>Go Brain Teasers - Exercise Your Mind; Miki Tebeka; The Pragmatic Programmers</li>
<li>Raku Recipes; J.J. Merelo; Apress</li>
-<li>Programming Ruby 3.3 (5th Edition); Noel Rappin, with Dave Thomas; The Pragmatic Bookshelf</li>
-<li>Concurrency in Go; Katherine Cox-Buday; O&#39;Reilly</li>
+<li>Effective awk programming; Arnold Robbins; O&#39;Reilly</li>
+<li>Systemprogrammierung in Go; Frank Müller; dpunkt</li>
<li>Hands-on Infrastructure Monitoring with Prometheus; Joel Bastos, Pedro Araujo; Packt </li>
-<li>Higher Order Perl; Mark Dominus; Morgan Kaufmann</li>
-<li>Learn You Some Erlang for Great Good; Fred Herbert; No Starch Press</li>
<li>Kubernetes Cookbook; Sameer Naik, Sébastien Goasguen, Jonathan Michaux; O&#39;Reilly</li>
-<li>The Pragmatic Programmer; David Thomas; Addison-Wesley</li>
-<li>Effective Java; Joshua Bloch; Addison-Wesley Professional</li>
-<li>Developing Games in Java; David Brackeen and others...; New Riders</li>
-<li>The Practise of System and Network Administration; Thomas A. Limoncelli, Christina J. Hogan, Strata R. Chalup; Addison-Wesley Professional Pro Git; Scott Chacon, Ben Straub; Apress</li>
-<li>Effective awk programming; Arnold Robbins; O&#39;Reilly</li>
<li>Seeking SRE: Conversations About Running Production Systems at Scale; David N. Blank-Edelman; eBook</li>
-<li>Think Raku (aka Think Perl 6); Laurent Rosenfeld, Allen B. Downey; O&#39;Reilly</li>
-<li>The Go Programming Language; Alan A. A. Donovan; Addison-Wesley Professional</li>
-<li>Object-Oriented Programming with ANSI-C; Axel-Tobias Schreiner</li>
-<li>Perl New Features; Joshua McAdams, brian d foy; Perl School</li>
-<li>Systemprogrammierung in Go; Frank Müller; dpunkt</li>
-<li>Programming Perl aka "The Camel Book"; Tom Christiansen, brian d foy, Larry Wall &amp; Jon Orwant; O&#39;Reilly</li>
-<li>The Docker Book; James Turnbull; Kindle</li>
-<li>Terraform Cookbook; Mikael Krief; Packt Publishing</li>
+<li>Higher Order Perl; Mark Dominus; Morgan Kaufmann</li>
+<li>Data Science at the Command Line; Jeroen Janssens; O&#39;Reilly</li>
<li>97 things every SRE should know; Emil Stolarsky, Jaime Woo; O&#39;Reilly</li>
-<li>Funktionale Programmierung; Peter Pepper; Springer</li>
-<li>The KCNA (Kubernetes and Cloud Native Associate) Book; Nigel Poulton</li>
+<li>Systems Performance Tuning; Gian-Paolo D. Musumeci and others...; O&#39;Reilly</li>
+<li>The Practise of System and Network Administration; Thomas A. Limoncelli, Christina J. Hogan, Strata R. Chalup; Addison-Wesley Professional Pro Git; Scott Chacon, Ben Straub; Apress</li>
+<li>Raku Fundamentals; Moritz Lenz; Apress</li>
+<li>Terraform Cookbook; Mikael Krief; Packt Publishing</li>
+<li>The Pragmatic Programmer; David Thomas; Addison-Wesley</li>
+<li>DevOps And Site Reliability Engineering Handbook; Stephen Fleming; Audible</li>
<li>Leanring eBPF; Liz Rice; O&#39;Reilly</li>
+<li>Chaos Engineering - System Resiliency in Practice; Casey Rosenthal and Nora Jones; eBook</li>
+<li>C++ Programming Language; Bjarne Stroustrup;</li>
+<li>Amazon Web Services in Action; Michael Wittig and Andreas Wittig; Manning Publications</li>
+<li>Clusterbau mit Linux-HA; Michael Schwartzkopff; O&#39;Reilly</li>
+<li>Site Reliability Engineering; How Google runs production systems; O&#39;Reilly</li>
+<li>The DevOps Handbook; Gene Kim, Jez Humble, Patrick Debois, John Willis; Audible</li>
+<li>Programming Ruby 3.3 (5th Edition); Noel Rappin, with Dave Thomas; The Pragmatic Bookshelf</li>
+<li>21st Century C: C Tips from the New School; Ben Klemens; O&#39;Reilly</li>
<li>Learn You a Haskell for Great Good!; Miran Lipovaca; No Starch Press</li>
-<li>Raku Fundamentals; Moritz Lenz; Apress</li>
-<li>Pro Puppet; James Turnbull, Jeffrey McCune; Apress</li>
-<li>Go Brain Teasers - Exercise Your Mind; Miki Tebeka; The Pragmatic Programmers</li>
-<li>Polished Ruby Programming; Jeremy Evans; Packt Publishing</li>
+<li>Modern Perl; Chromatic ; Onyx Neon Press</li>
+<li>Perl New Features; Joshua McAdams, brian d foy; Perl School</li>
<li>Java ist auch eine Insel; Christian Ullenboom; </li>
-<li>The Kubernetes Book; Nigel Poulton; Unabridged Audiobook</li>
-<li>Ultimate Go Notebook; Bill Kennedy</li>
+<li>Pro Puppet; James Turnbull, Jeffrey McCune; Apress</li>
+<li>The Go Programming Language; Alan A. A. Donovan; Addison-Wesley Professional</li>
+<li>The KCNA (Kubernetes and Cloud Native Associate) Book; Nigel Poulton</li>
<li>Tmux 2: Productive Mouse-free Development; Brain P. Hogan; The Pragmatic Programmers </li>
-<li>Distributed Systems: Principles and Paradigms; Andrew S. Tanenbaum; Pearson</li>
-<li>Systems Performance Tuning; Gian-Paolo D. Musumeci and others...; O&#39;Reilly</li>
-<li>100 Go Mistakes and How to Avoid Them; Teiva Harsanyi; Manning Publications</li>
-<li>Site Reliability Engineering; How Google runs production systems; O&#39;Reilly</li>
-<li>Modern Perl; Chromatic ; Onyx Neon Press</li>
+<li>Funktionale Programmierung; Peter Pepper; Springer</li>
+<li>Developing Games in Java; David Brackeen and others...; New Riders</li>
+<li>Ultimate Go Notebook; Bill Kennedy</li>
+<li>The Docker Book; James Turnbull; Kindle</li>
+<li>Learn You Some Erlang for Great Good; Fred Herbert; No Starch Press</li>
+<li>Programming Perl aka "The Camel Book"; Tom Christiansen, brian d foy, Larry Wall &amp; Jon Orwant; O&#39;Reilly</li>
+<li>Object-Oriented Programming with ANSI-C; Axel-Tobias Schreiner</li>
+<li>Concurrency in Go; Katherine Cox-Buday; O&#39;Reilly</li>
+<li>Think Raku (aka Think Perl 6); Laurent Rosenfeld, Allen B. Downey; O&#39;Reilly</li>
+<li>DNS and BIND; Cricket Liu; O&#39;Reilly</li>
+<li>The Kubernetes Book; Nigel Poulton; Unabridged Audiobook</li>
</ul><br />
<h2 style='display: inline' id='technical-references'>Technical references</h2><br />
<br />
<span>I didn&#39;t read them from the beginning to the end, but I am using them to look up things. The books are in random order:</span><br />
<br />
<ul>
+<li>Groovy Kurz &amp; Gut; Joerg Staudemeier; O&#39;Reilly</li>
+<li>The Linux Programming Interface; Michael Kerrisk; No Starch Press </li>
<li>Understanding the Linux Kernel; Daniel P. Bovet, Marco Cesati; O&#39;Reilly</li>
+<li>Implementing Service Level Objectives; Alex Hidalgo; O&#39;Reilly</li>
<li>BPF Performance Tools - Linux System and Application Observability, Brendan Gregg; Addison Wesley</li>
-<li>The Linux Programming Interface; Michael Kerrisk; No Starch Press </li>
<li>Relayd and Httpd Mastery; Michael W Lucas</li>
-<li>Groovy Kurz &amp; Gut; Joerg Staudemeier; O&#39;Reilly</li>
-<li>Go: Design Patterns for Real-World Projects; Mat Ryer; Packt</li>
-<li>Implementing Service Level Objectives; Alex Hidalgo; O&#39;Reilly</li>
<li>Algorithms; Robert Sedgewick, Kevin Wayne; Addison Wesley</li>
+<li>Go: Design Patterns for Real-World Projects; Mat Ryer; Packt</li>
</ul><br />
<h2 style='display: inline' id='self-development-and-soft-skills-books'>Self-development and soft-skills books</h2><br />
<br />
<span>In random order:</span><br />
<br />
<ul>
-<li>Influence without Authority; A. Cohen, D. Bradford; Wiley</li>
+<li>Buddah and Einstein walk into a Bar; Guy Joseph Ale, Claire Bloom; Blackstone Publishing</li>
+<li>Solve for Happy; Mo Gawdat (RE-READ 1ST TIME)</li>
+<li>The Courage to Be Disliked; Ichiro Kishimi and Fumitake Koga; Audiobook</li>
+<li>The Daily Stoic; Ryan Holiday, Stephen Hanselman; Profile Books</li>
+<li>Soft Skills; John Sommez; Manning Publications</li>
+<li>The Complete Software Developer&#39;s Career Guide; John Sonmez; Unabridged Audiobook</li>
+<li>Getting Things Done; David Allen</li>
<li>Slow Productivity; Cal Newport; Penguin Random House</li>
-<li>Psycho-Cybernetics; Maxwell Maltz; Perigee Books</li>
-<li>Who Moved My Cheese?; Dr. Spencer Johnson; Vermilion</li>
+<li>Never Split the Difference; Chris Voss, Tahl Raz; Random House Business</li>
+<li>The 7 Habits Of Highly Effective People; Stephen R. Covey; Simon &amp; Schuster UK</li>
+<li>The Power of Now; Eckhard Tolle; Yellow Kite</li>
<li>Atomic Habits; James Clear; Random House Business</li>
-<li>The Daily Stoic; Ryan Holiday, Stephen Hanselman; Profile Books</li>
-<li>Ultralearning; Scott Young; Thorsons</li>
-<li>The Off Switch; Mark Cropley; Virgin Books (RE-READ 1ST TIME)</li>
-<li>97 Things Every Engineering Manager Should Know; Camille Fournier; Audiobook</li>
-<li>The Joy of Missing Out; Christina Crook; New Society Publishers</li>
-<li>So Good They Can&#39;t Ignore You; Cal Newport; Business Plus</li>
<li>Search Inside Yourself - The Unexpected path to Achieving Success, Happiness (and World Peace); Chade-Meng Tan, Daniel Goleman, Jon Kabat-Zinn; HarperOne</li>
-<li>Never Split the Difference; Chris Voss, Tahl Raz; Random House Business</li>
-<li>Buddah and Einstein walk into a Bar; Guy Joseph Ale, Claire Bloom; Blackstone Publishing</li>
-<li>The Obstacle Is The Way; Ryan Holiday; Profile Books Ltd</li>
+<li>Psycho-Cybernetics; Maxwell Maltz; Perigee Books</li>
+<li>Stop starting, start finishing; Arne Roock; Lean-Kanban University </li>
<li>The Software Engineer&#39;s Guidebook: Navigating senior, tech lead, and staff engineer positions at tech companies and startups; Gergely Orosz; Audiobook </li>
-<li>Digital Minimalism; Cal Newport; Portofolio Penguin</li>
-<li>Eat That Frog!; Brian Tracy; Hodder Paperbacks</li>
-<li>The Courage to Be Disliked; Ichiro Kishimi and Fumitake Koga; Audiobook</li>
-<li>Deep Work; Cal Newport; Piatkus</li>
<li>Consciousness: A Very Short Introduction; Susan Blackmore; Oxford Uiversity Press</li>
-<li>The Good Enough Job; Simone Stolzoff; Ebury Edge</li>
-<li>Solve for Happy; Mo Gawdat (RE-READ 1ST TIME)</li>
-<li>Staff Engineer: Leadership beyond the management track; Will Larson; Audiobook</li>
-<li>Time Management for System Administrators; Thomas A. Limoncelli; O&#39;Reilly</li>
-<li>Ultralearning; Anna Laurent; Self-published via Amazon</li>
-<li>The 7 Habits Of Highly Effective People; Stephen R. Covey; Simon &amp; Schuster UK</li>
+<li>The Bullet Journal Method; Ryder Carroll; Fourth Estate</li>
+<li>Who Moved My Cheese?; Dr. Spencer Johnson; Vermilion</li>
<li>Eat That Frog; Brian Tracy</li>
+<li>97 Things Every Engineering Manager Should Know; Camille Fournier; Audiobook</li>
+<li>The Phoenix Project - A Novel About IT, DevOps, and Helping your Business Win; Gene Kim and Kevin Behr; Trade Select</li>
+<li>The Off Switch; Mark Cropley; Virgin Books (RE-READ 1ST TIME)</li>
+<li>Influence without Authority; A. Cohen, D. Bradford; Wiley</li>
+<li>Deep Work; Cal Newport; Piatkus</li>
+<li>Ultralearning; Scott Young; Thorsons</li>
<li>Meditation for Mortals, Oliver Burkeman, Audiobook</li>
+<li>Ultralearning; Anna Laurent; Self-published via Amazon</li>
<li>Coders at Work - Reflections on the craft of programming, Peter Seibel and Mitchell Dorian et al., Audiobook</li>
-<li>Stop starting, start finishing; Arne Roock; Lean-Kanban University </li>
-<li>Soft Skills; John Sommez; Manning Publications</li>
-<li>The Complete Software Developer&#39;s Career Guide; John Sonmez; Unabridged Audiobook</li>
-<li>Getting Things Done; David Allen</li>
+<li>Eat That Frog!; Brian Tracy; Hodder Paperbacks</li>
<li>101 Essays that change the way you think; Brianna Wiest; Audiobook</li>
-<li>The Bullet Journal Method; Ryder Carroll; Fourth Estate</li>
-<li>The Power of Now; Eckhard Tolle; Yellow Kite</li>
-<li>The Phoenix Project - A Novel About IT, DevOps, and Helping your Business Win; Gene Kim and Kevin Behr; Trade Select</li>
+<li>Digital Minimalism; Cal Newport; Portofolio Penguin</li>
+<li>The Joy of Missing Out; Christina Crook; New Society Publishers</li>
+<li>The Obstacle Is The Way; Ryan Holiday; Profile Books Ltd</li>
+<li>So Good They Can&#39;t Ignore You; Cal Newport; Business Plus</li>
+<li>Time Management for System Administrators; Thomas A. Limoncelli; O&#39;Reilly</li>
+<li>The Good Enough Job; Simone Stolzoff; Ebury Edge</li>
+<li>Staff Engineer: Leadership beyond the management track; Will Larson; Audiobook</li>
</ul><br />
<a class='textlink' href='../notes/index.html'>Here are notes of mine for some of the books</a><br />
<br />
@@ -164,31 +164,31 @@
<span>Some of these were in-person with exams; others were online learning lectures only. In random order:</span><br />
<br />
<ul>
-<li>Functional programming lecture; Remote University of Hagen</li>
<li>Structure and Interpretation of Computer Programs; Harold Abelson and more...; </li>
-<li>F5 Loadbalancers Training; 2-day on-site training; F5, Inc. </li>
-<li>The Ultimate Kubernetes Bootcamp; School of Devops; O&#39;Reilly Online</li>
-<li>Apache Tomcat Best Practises; 3-day on-site training</li>
+<li>Developing IaC with Terraform (with Live Lessons); O&#39;Reilly Online</li>
<li>MySQL Deep Dive Workshop; 2-day on-site training</li>
-<li>Ultimate Go Programming; Bill Kennedy; O&#39;Reilly Online</li>
-<li>Linux Security and Isolation APIs Training; Michael Kerrisk; 3-day on-site training</li>
+<li>Functional programming lecture; Remote University of Hagen</li>
<li>Cloud Operations on AWS - Learn how to configure, deploy, maintain, and troubleshoot your AWS environments; 3-day online live training with labs; Amazon</li>
+<li>The Ultimate Kubernetes Bootcamp; School of Devops; O&#39;Reilly Online</li>
+<li>Ultimate Go Programming; Bill Kennedy; O&#39;Reilly Online</li>
<li>Protocol buffers; O&#39;Reilly Online</li>
-<li>Red Hat Certified System Administrator; Course + certification (Although I had the option, I decided not to take the next course as it is more effective to self learn what I need)</li>
-<li>The Well-Grounded Rubyist Video Edition; David. A. Black; O&#39;Reilly Online</li>
<li>Scripting Vim; Damian Conway; O&#39;Reilly Online</li>
-<li>Developing IaC with Terraform (with Live Lessons); O&#39;Reilly Online</li>
-<li>AWS Immersion Day; Amazon; 1-day interactive online training </li>
+<li>Apache Tomcat Best Practises; 3-day on-site training</li>
<li>Algorithms Video Lectures; Robert Sedgewick; O&#39;Reilly Online</li>
+<li>AWS Immersion Day; Amazon; 1-day interactive online training </li>
+<li>Linux Security and Isolation APIs Training; Michael Kerrisk; 3-day on-site training</li>
+<li>Red Hat Certified System Administrator; Course + certification (Although I had the option, I decided not to take the next course as it is more effective to self learn what I need)</li>
+<li>The Well-Grounded Rubyist Video Edition; David. A. Black; O&#39;Reilly Online</li>
+<li>F5 Loadbalancers Training; 2-day on-site training; F5, Inc. </li>
</ul><br />
<h2 style='display: inline' id='technical-guides'>Technical guides</h2><br />
<br />
<span>These are not whole books, but guides (smaller or larger) which I found very useful. in random order:</span><br />
<br />
<ul>
+<li>Raku Guide at https://raku.guide </li>
<li>Advanced Bash-Scripting Guide </li>
<li>How CPUs work at https://cpu.land</li>
-<li>Raku Guide at https://raku.guide </li>
</ul><br />
<h2 style='display: inline' id='podcasts'>Podcasts</h2><br />
<br />
@@ -197,51 +197,51 @@
<span>In random order:</span><br />
<br />
<ul>
-<li>Hidden Brain</li>
-<li>Cup o&#39; Go [Golang]</li>
-<li>BSD Now [BSD]</li>
-<li>Pratical AI</li>
-<li>Deep Questions with Cal Newport</li>
<li>The ProdCast (Google SRE Podcast)</li>
-<li>Wednesday Wisdom</li>
+<li>Modern Mentor</li>
<li>The Pragmatic Engineer Podcast</li>
+<li>Deep Questions with Cal Newport</li>
+<li>The Changelog Podcast(s)</li>
<li>Fallthrough [Golang]</li>
-<li>Modern Mentor</li>
-<li>Fork Around And Find Out</li>
-<li>Backend Banter</li>
-<li>Dev Interrupted</li>
+<li>BSD Now [BSD]</li>
+<li>Wednesday Wisdom</li>
+<li>Pratical AI</li>
+<li>Hidden Brain</li>
<li>Maintainable</li>
-<li>The Changelog Podcast(s)</li>
+<li>Cup o&#39; Go [Golang]</li>
+<li>Dev Interrupted</li>
+<li>Backend Banter</li>
+<li>Fork Around And Find Out</li>
</ul><br />
<h3 style='display: inline' id='podcasts-i-liked'>Podcasts I liked</h3><br />
<br />
<span>I liked them but am not listening to them anymore. The podcasts have either "finished" (no more episodes) or I stopped listening to them due to time constraints or a shift in my interests.</span><br />
<br />
<ul>
-<li>Go Time (predecessor of fallthrough)</li>
+<li>Java Pub House</li>
<li>FLOSS weekly</li>
+<li>Go Time (predecessor of fallthrough)</li>
<li>CRE: Chaosradio Express [german]</li>
<li>Modern Mentor</li>
<li>Ship It (predecessor of Fork Around And Find Out)</li>
-<li>Java Pub House</li>
</ul><br />
<h2 style='display: inline' id='newsletters-i-like'>Newsletters I like</h2><br />
<br />
<span>This is a mix of tech and non-tech newsletters I am subscribed to. In random order:</span><br />
<br />
<ul>
-<li>Changelog News</li>
-<li>VK Newsletter</li>
+<li>Monospace Mentor</li>
<li>The Imperfectionist</li>
-<li>Andreas Brandhorst Newsletter (Sci-Fi author)</li>
+<li>The Valuable Dev</li>
+<li>VK Newsletter</li>
<li>The Pragmatic Engineer</li>
+<li>byteSizeGo</li>
+<li>Golang Weekly</li>
<li>Register Spill</li>
+<li>Changelog News</li>
<li>Applied Go Weekly Newsletter</li>
-<li>Golang Weekly</li>
-<li>Monospace Mentor</li>
-<li>The Valuable Dev</li>
-<li>byteSizeGo</li>
<li>Ruby Weekly</li>
+<li>Andreas Brandhorst Newsletter (Sci-Fi author)</li>
</ul><br />
<h2 style='display: inline' id='magazines-i-liked'>Magazines I like(d)</h2><br />
<br />
@@ -249,9 +249,9 @@
<br />
<ul>
<li>freeX (not published anymore)</li>
-<li>Linux User</li>
<li>LWN (online only)</li>
<li>Linux Magazine</li>
+<li>Linux User</li>
</ul><br />
<h1 style='display: inline' id='formal-education'>Formal education</h1><br />
<br />
diff --git a/gemfeed/2026-02-02-tmux-popup-editor-for-cursor-agent-prompts.html b/gemfeed/2026-02-02-tmux-popup-editor-for-cursor-agent-prompts.html
new file mode 100644
index 00000000..112691fd
--- /dev/null
+++ b/gemfeed/2026-02-02-tmux-popup-editor-for-cursor-agent-prompts.html
@@ -0,0 +1,317 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<title>A tmux popup editor for Cursor Agent prompts</title>
+<link rel="shortcut icon" type="image/gif" href="/favicon.ico" />
+<link rel="stylesheet" href="../style.css" />
+<link rel="stylesheet" href="style-override.css" />
+</head>
+<body>
+<p class="header">
+<a href="https://foo.zone">Home</a> | <a href="https://codeberg.org/snonux/foo.zone/src/branch/content-md/gemfeed/2026-02-02-tmux-popup-editor-for-cursor-agent-prompts.md">Markdown</a> | <a href="gemini://foo.zone/gemfeed/2026-02-02-tmux-popup-editor-for-cursor-agent-prompts.gmi">Gemini</a>
+</p>
+<h1 style='display: inline' id='a-tmux-popup-editor-for-cursor-agent-prompts'>A tmux popup editor for Cursor Agent prompts</h1><br />
+<br />
+<span class='quote'>Published at 2026-02-01T20:24:16+02:00</span><br />
+<br />
+<span>...and any other TUI based application</span><br />
+<br />
+<h2 style='display: inline' id='table-of-contents'>Table of Contents</h2><br />
+<br />
+<ul>
+<li><a href='#a-tmux-popup-editor-for-cursor-agent-prompts'>A tmux popup editor for Cursor Agent prompts</a></li>
+<li>⇢ <a href='#why-i-built-this'>Why I built this</a></li>
+<li>⇢ <a href='#what-it-is'>What it is</a></li>
+<li>⇢ <a href='#how-it-works-overview'>How it works (overview)</a></li>
+<li>⇢ <a href='#challenges-and-small-discoveries'>Challenges and small discoveries</a></li>
+<li>⇢ <a href='#test-cases-for-a-future-rewrite'>Test cases (for a future rewrite)</a></li>
+<li>⇢ <a href='#almost-works-with-any-editor-or-any-tui'>(Almost) works with any editor (or any TUI)</a></li>
+</ul><br />
+<h2 style='display: inline' id='why-i-built-this'>Why I built this</h2><br />
+<br />
+<span>I spend some time in Cursor Agent (the CLI version of the Cursor IDE, I don&#39;t like really the IDE), and I also jump between Claude Code CLI, Ampcode, Gemini CLI, OpenAI Codex CLI, OpenCode, and Aider just to see how things are evolving. But for the next month I&#39;ll be with Cursor Agent.</span><br />
+<br />
+<span>Short prompts are fine in the inline input, but for longer prompts I want a real editor: spellcheck, search/replace, multiple cursors, and all the Helix muscle memory I already have.</span><br />
+<br />
+<span>Cursor Agent has a Vim editing mode, but not Helix. And even in Vim mode I can&#39;t use my full editor setup. I want the real thing, not a partial emulation.</span><br />
+<br />
+<a class='textlink' href='https://helix-editor.com'>https://helix-editor.com</a><br />
+<a class='textlink' href='https://www.vim.org'>https://www.vim.org</a><br />
+<a class='textlink' href='https://neovim.io'>https://neovim.io</a><br />
+<br />
+<span>So I built a tiny tmux popup editor. It opens <span class='inlinecode'>$EDITOR</span> (Helix for me), and when I close it, the buffer is sent back into the prompt. It sounds simple, but it feels surprisingly native.</span><br />
+<br />
+<span>This is how it looks like:</span><br />
+<br />
+<a href='./tmux-popup-editor-for-cursor-agent-prompts/demo1.png'><img alt='Popup editor in action' title='Popup editor in action' src='./tmux-popup-editor-for-cursor-agent-prompts/demo1.png' /></a><br />
+<br />
+<h2 style='display: inline' id='what-it-is'>What it is</h2><br />
+<br />
+<span>The idea is straightforward:</span><br />
+<br />
+<ul>
+<li>A tmux key binding <span class='inlinecode'>prefix-e</span> opens a popup overlay near the bottom of the screen.</li>
+<li>The popup starts <span class='inlinecode'>$EDITOR</span> on a temp file.</li>
+<li>When I exit the editor, the script sends the contents back to the original pane with <span class='inlinecode'>tmux send-keys</span>.</li>
+</ul><br />
+<span>It also pre-fills the temp file with whatever is already typed after Cursor Agent&#39;s <span class='inlinecode'>→</span> prompt, so I can continue where I left off.</span><br />
+<br />
+<h2 style='display: inline' id='how-it-works-overview'>How it works (overview)</h2><br />
+<br />
+<span>This is the tmux binding I use (trimmed to the essentials):</span><br />
+<br />
+<pre>
+bind-key e run-shell -b "tmux display-message -p &#39;#{pane_id}&#39;
+ &gt; /tmp/tmux-edit-target-#{client_pid} \;
+ tmux popup -E -w 90% -h 35% -x 5% -y 65% -d &#39;#{pane_current_path}&#39;
+ \"~/scripts/tmux-edit-send /tmp/tmux-edit-target-#{client_pid}\""
+</pre>
+<br />
+<span>And this is how it looks like after sending back the text to the Cursor Agent&#39;s input:</span><br />
+<br />
+<a href='./tmux-popup-editor-for-cursor-agent-prompts/demo2.png'><img alt='Prefilled prompt text' title='Prefilled prompt text' src='./tmux-popup-editor-for-cursor-agent-prompts/demo2.png' /></a><br />
+<br />
+<span>And here is the full script. It is a bit ugly since it&#39;s shell (written with Cursor Agent with GPT-5.2-Codex), and I might (let) rewrite it in Go and release it once I have time. But it works well enough for now.</span><br />
+<br />
+<!-- Generator: GNU source-highlight 3.1.9
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><i><font color="silver">#!/usr/bin/env bash</font></i>
+<b><u><font color="#000000">set</font></u></b> -u -o pipefail
+
+<b><u><font color="#000000">declare</font></u></b> -i LOG_ENABLED=<font color="#000000">0</font>
+
+log_file=<font color="#808080">"${TMPDIR:-/tmp}/tmux-edit-send.log"</font>
+
+log() {
+ <b><u><font color="#000000">if</font></u></b> [ <font color="#808080">"$LOG_ENABLED"</font> -eq <font color="#000000">1</font> ]; <b><u><font color="#000000">then</font></u></b>
+ <b><u><font color="#000000">printf</font></u></b> <font color="#808080">'%s</font>\n<font color="#808080">'</font> <font color="#808080">"$*"</font> &gt;&gt; <font color="#808080">"$log_file"</font>
+ <b><u><font color="#000000">fi</font></u></b>
+}
+
+<i><font color="silver"># Read the target pane id from a temp file created by tmux binding.</font></i>
+read_target_from_file() {
+ <b><u><font color="#000000">local</font></u></b> file_path=<font color="#808080">"$1"</font>
+ <b><u><font color="#000000">if</font></u></b> [ -n <font color="#808080">"$file_path"</font> ] &amp;&amp; [ -f <font color="#808080">"$file_path"</font> ]; <b><u><font color="#000000">then</font></u></b>
+ sed -n <font color="#808080">'1p'</font> <font color="#808080">"$file_path"</font> | tr -d <font color="#808080">'[:space:]'</font>
+ <b><u><font color="#000000">fi</font></u></b>
+}
+
+<i><font color="silver"># Read the target pane id from tmux environment if present.</font></i>
+read_target_from_env() {
+ <b><u><font color="#000000">local</font></u></b> env_line
+ env_line=<font color="#808080">"$(tmux show-environment -g TMUX_EDIT_TARGET 2&gt;/dev/null || true)"</font>
+ <b><u><font color="#000000">case</font></u></b> <font color="#808080">"$env_line"</font> <b><u><font color="#000000">in</font></u></b>
+ TMUX_EDIT_TARGET=*) <b><u><font color="#000000">printf</font></u></b> <font color="#808080">'%s'</font> <font color="#808080">"${env_line#TMUX_EDIT_TARGET=}"</font> ;;
+ <b><u><font color="#000000">esac</font></u></b>
+}
+
+<i><font color="silver"># Resolve the target pane id, falling back to the last pane.</font></i>
+resolve_target_pane() {
+ <b><u><font color="#000000">local</font></u></b> candidate=<font color="#808080">"$1"</font>
+ <b><u><font color="#000000">local</font></u></b> current_pane last_pane
+
+ current_pane=<font color="#808080">"$(tmux display-message -p "</font><i><font color="silver">#{pane_id}" 2&gt;/dev/null || true)"</font></i>
+ log <font color="#808080">"current pane=${current_pane:-&lt;empty&gt;}"</font>
+ <b><u><font color="#000000">if</font></u></b> [ -n <font color="#808080">"$candidate"</font> ] &amp;&amp; [[ <font color="#808080">"$candidate"</font> == *<font color="#808080">"#{"</font>* ]]; <b><u><font color="#000000">then</font></u></b>
+ log <font color="#808080">"format target detected, clearing"</font>
+ candidate=<font color="#808080">""</font>
+ <b><u><font color="#000000">fi</font></u></b>
+ <b><u><font color="#000000">if</font></u></b> [ -z <font color="#808080">"$candidate"</font> ]; <b><u><font color="#000000">then</font></u></b>
+ candidate=<font color="#808080">"$(tmux display-message -p "</font><i><font color="silver">#{last_pane}" 2&gt;/dev/null || true)"</font></i>
+ <b><u><font color="#000000">elif</font></u></b> [ <font color="#808080">"$candidate"</font> = <font color="#808080">"$current_pane"</font> ]; <b><u><font color="#000000">then</font></u></b>
+ last_pane=<font color="#808080">"$(tmux display-message -p "</font><i><font color="silver">#{last_pane}" 2&gt;/dev/null || true)"</font></i>
+ <b><u><font color="#000000">if</font></u></b> [ -n <font color="#808080">"$last_pane"</font> ]; <b><u><font color="#000000">then</font></u></b>
+ candidate=<font color="#808080">"$last_pane"</font>
+ <b><u><font color="#000000">fi</font></u></b>
+ <b><u><font color="#000000">fi</font></u></b>
+ <b><u><font color="#000000">printf</font></u></b> <font color="#808080">'%s'</font> <font color="#808080">"$candidate"</font>
+}
+
+<i><font color="silver"># Capture the latest multi-line prompt content from the pane.</font></i>
+capture_prompt_text() {
+ <b><u><font color="#000000">local</font></u></b> target=<font color="#808080">"$1"</font>
+ tmux capture-pane -p -t <font color="#808080">"$target"</font> -S -<font color="#000000">2000</font> <font color="#000000">2</font>&gt;/dev/null | awk <font color="#808080">'</font>
+<font color="#808080"> function trim_box(line) {</font>
+<font color="#808080"> sub(/^ *│ ?/, "", line)</font>
+<font color="#808080"> sub(/ *│ *$/, "", line)</font>
+<font color="#808080"> sub(/[[:space:]]+$/, "", line)</font>
+<font color="#808080"> return line</font>
+<font color="#808080"> }</font>
+<font color="#808080"> /^ *│ *→/ &amp;&amp; index($0,"INSERT")==0 &amp;&amp; index($0,"Add a follow-up")==0 {</font>
+<font color="#808080"> if (text != "") last = text</font>
+<font color="#808080"> text = ""</font>
+<font color="#808080"> capture = 1</font>
+<font color="#808080"> line = $0</font>
+<font color="#808080"> sub(/^.*→ ?/, "", line)</font>
+<font color="#808080"> line = trim_box(line)</font>
+<font color="#808080"> if (line != "") text = line</font>
+<font color="#808080"> next</font>
+<font color="#808080"> }</font>
+<font color="#808080"> capture {</font>
+<font color="#808080"> if ($0 ~ /^ *└/) {</font>
+<font color="#808080"> capture = 0</font>
+<font color="#808080"> if (text != "") last = text</font>
+<font color="#808080"> next</font>
+<font color="#808080"> }</font>
+<font color="#808080"> if ($0 ~ /^ *│/ &amp;&amp; index($0,"INSERT")==0 &amp;&amp; index($0,"Add a follow-up")==0) {</font>
+<font color="#808080"> line = trim_box($0)</font>
+<font color="#808080"> if (line != "") {</font>
+<font color="#808080"> if (text != "") text = text " " line</font>
+<font color="#808080"> else text = line</font>
+<font color="#808080"> }</font>
+<font color="#808080"> }</font>
+<font color="#808080"> }</font>
+<font color="#808080"> END {</font>
+<font color="#808080"> if (text != "") last = text</font>
+<font color="#808080"> if (last != "") print last</font>
+<font color="#808080"> }</font>
+<font color="#808080"> '</font>
+}
+
+<i><font color="silver"># Write captured prompt text into the temp file if available.</font></i>
+prefill_tmpfile() {
+ <b><u><font color="#000000">local</font></u></b> tmpfile=<font color="#808080">"$1"</font>
+ <b><u><font color="#000000">local</font></u></b> prompt_text=<font color="#808080">"$2"</font>
+ <b><u><font color="#000000">if</font></u></b> [ -n <font color="#808080">"$prompt_text"</font> ]; <b><u><font color="#000000">then</font></u></b>
+ <b><u><font color="#000000">printf</font></u></b> <font color="#808080">'%s</font>\n<font color="#808080">'</font> <font color="#808080">"$prompt_text"</font> &gt; <font color="#808080">"$tmpfile"</font>
+ <b><u><font color="#000000">fi</font></u></b>
+}
+
+<i><font color="silver"># Ensure the target pane exists before sending keys.</font></i>
+validate_target_pane() {
+ <b><u><font color="#000000">local</font></u></b> target=<font color="#808080">"$1"</font>
+ <b><u><font color="#000000">local</font></u></b> pane target_found
+ <b><u><font color="#000000">if</font></u></b> [ -z <font color="#808080">"$target"</font> ]; <b><u><font color="#000000">then</font></u></b>
+ log <font color="#808080">"error: no target pane determined"</font>
+ echo <font color="#808080">"Could not determine target pane."</font> &gt;&amp;<font color="#000000">2</font>
+ <b><u><font color="#000000">return</font></u></b> <font color="#000000">1</font>
+ <b><u><font color="#000000">fi</font></u></b>
+ target_found=<font color="#000000">0</font>
+ <b><u><font color="#000000">for</font></u></b> pane <b><u><font color="#000000">in</font></u></b> $(tmux list-panes -a -F <font color="#808080">"#{pane_id}"</font> <font color="#000000">2</font>&gt;/dev/null || <b><u><font color="#000000">true</font></u></b>); <b><u><font color="#000000">do</font></u></b>
+ <b><u><font color="#000000">if</font></u></b> [ <font color="#808080">"$pane"</font> = <font color="#808080">"$target"</font> ]; <b><u><font color="#000000">then</font></u></b>
+ target_found=<font color="#000000">1</font>
+ <b><u><font color="#000000">break</font></u></b>
+ <b><u><font color="#000000">fi</font></u></b>
+ <b><u><font color="#000000">done</font></u></b>
+ <b><u><font color="#000000">if</font></u></b> [ <font color="#808080">"$target_found"</font> -ne <font color="#000000">1</font> ]; <b><u><font color="#000000">then</font></u></b>
+ log <font color="#808080">"error: target pane not found: $target"</font>
+ echo <font color="#808080">"Target pane not found: $target"</font> &gt;&amp;<font color="#000000">2</font>
+ <b><u><font color="#000000">return</font></u></b> <font color="#000000">1</font>
+ <b><u><font color="#000000">fi</font></u></b>
+}
+
+<i><font color="silver"># Send temp file contents to the target pane line by line.</font></i>
+send_content() {
+ <b><u><font color="#000000">local</font></u></b> target=<font color="#808080">"$1"</font>
+ <b><u><font color="#000000">local</font></u></b> tmpfile=<font color="#808080">"$2"</font>
+ <b><u><font color="#000000">local</font></u></b> prompt_text=<font color="#808080">"$3"</font>
+ <b><u><font color="#000000">local</font></u></b> first_line=<font color="#000000">1</font>
+ <b><u><font color="#000000">local</font></u></b> line
+ <b><u><font color="#000000">while</font></u></b> IFS= <b><u><font color="#000000">read</font></u></b> -r line || [ -n <font color="#808080">"$line"</font> ]; <b><u><font color="#000000">do</font></u></b>
+ <b><u><font color="#000000">if</font></u></b> [ <font color="#808080">"$first_line"</font> -eq <font color="#000000">1</font> ] &amp;&amp; [ -n <font color="#808080">"$prompt_text"</font> ]; <b><u><font color="#000000">then</font></u></b>
+ <b><u><font color="#000000">if</font></u></b> [[ <font color="#808080">"$line"</font> == <font color="#808080">"$prompt_text"</font>* ]]; <b><u><font color="#000000">then</font></u></b>
+ line=<font color="#808080">"${line#"</font>$prompt_text<font color="#808080">"}"</font>
+ <b><u><font color="#000000">fi</font></u></b>
+ <b><u><font color="#000000">fi</font></u></b>
+ first_line=<font color="#000000">0</font>
+ tmux send-keys -t <font color="#808080">"$target"</font> -l <font color="#808080">"$line"</font>
+ tmux send-keys -t <font color="#808080">"$target"</font> Enter
+ <b><u><font color="#000000">done</font></u></b> &lt; <font color="#808080">"$tmpfile"</font>
+ log <font color="#808080">"sent content to $target"</font>
+}
+
+<i><font color="silver"># Main entry point.</font></i>
+main() {
+ <b><u><font color="#000000">local</font></u></b> target_file=<font color="#808080">"${1:-}"</font>
+ <b><u><font color="#000000">local</font></u></b> target
+ <b><u><font color="#000000">local</font></u></b> editor=<font color="#808080">"${EDITOR:-vi}"</font>
+ <b><u><font color="#000000">local</font></u></b> tmpfile
+ <b><u><font color="#000000">local</font></u></b> prompt_text
+
+ target=<font color="#808080">"$(read_target_from_file "</font>$target_file<font color="#808080">" || true)"</font>
+ <b><u><font color="#000000">if</font></u></b> [ -n <font color="#808080">"$target"</font> ]; <b><u><font color="#000000">then</font></u></b>
+ log <font color="#808080">"file target=${target:-&lt;empty&gt;}"</font>
+ rm -f <font color="#808080">"$target_file"</font>
+ <b><u><font color="#000000">fi</font></u></b>
+ <b><u><font color="#000000">if</font></u></b> [ -z <font color="#808080">"$target"</font> ]; <b><u><font color="#000000">then</font></u></b>
+ target=<font color="#808080">"${TMUX_EDIT_TARGET:-}"</font>
+ <b><u><font color="#000000">fi</font></u></b>
+ log <font color="#808080">"env target=${target:-&lt;empty&gt;}"</font>
+ <b><u><font color="#000000">if</font></u></b> [ -z <font color="#808080">"$target"</font> ]; <b><u><font color="#000000">then</font></u></b>
+ target=<font color="#808080">"$(read_target_from_env || true)"</font>
+ <b><u><font color="#000000">fi</font></u></b>
+ log <font color="#808080">"tmux env target=${target:-&lt;empty&gt;}"</font>
+ target=<font color="#808080">"$(resolve_target_pane "</font>$target<font color="#808080">")"</font>
+ log <font color="#808080">"fallback target=${target:-&lt;empty&gt;}"</font>
+
+ tmpfile=<font color="#808080">"$(mktemp "</font>./.tmux-edit-send.XXXXXX.md<font color="#808080">")"</font>
+ <b><u><font color="#000000">trap</font></u></b> <font color="#808080">'rm -f "$tmpfile"'</font> EXIT
+
+ prompt_text=<font color="#808080">"$(capture_prompt_text "</font>$target<font color="#808080">")"</font>
+ prefill_tmpfile <font color="#808080">"$tmpfile"</font> <font color="#808080">"$prompt_text"</font>
+
+ <font color="#808080">"$editor"</font> <font color="#808080">"$tmpfile"</font>
+ log <font color="#808080">"editor exited with status $?"</font>
+
+ <b><u><font color="#000000">if</font></u></b> [ ! -s <font color="#808080">"$tmpfile"</font> ]; <b><u><font color="#000000">then</font></u></b>
+ log <font color="#808080">"empty file, nothing sent"</font>
+ <b><u><font color="#000000">exit</font></u></b> <font color="#000000">0</font>
+ <b><u><font color="#000000">fi</font></u></b>
+
+ validate_target_pane <font color="#808080">"$target"</font>
+ send_content <font color="#808080">"$target"</font> <font color="#808080">"$tmpfile"</font> <font color="#808080">"$prompt_text"</font>
+}
+
+main <font color="#808080">"$@"</font>
+</pre>
+<br />
+<h2 style='display: inline' id='challenges-and-small-discoveries'>Challenges and small discoveries</h2><br />
+<br />
+<span>The problems were mostly small but annoying:</span><br />
+<br />
+<ul>
+<li>Getting the right target pane was the first hurdle. I ended up storing the pane id in a file because of tmux format expansion quirks.</li>
+<li>The Cursor UI draws a nice box around the prompt, so the prompt line contains a <span class='inlinecode'>│</span> and other markers. I had to filter those out and strip the box-drawing characters.</li>
+<li>When I prefilled text and then sent it back, I sometimes duplicated the prompt. Stripping the prefilled prompt text from the first line fixed that.</li>
+</ul><br />
+<h2 style='display: inline' id='test-cases-for-a-future-rewrite'>Test cases (for a future rewrite)</h2><br />
+<br />
+<span>These are the cases I test whenever I touch the script:</span><br />
+<br />
+<ul>
+<li>Single-line prompt: capture everything after <span class='inlinecode'>→</span> and prefill the editor.</li>
+<li>Multi-line boxed prompt: capture the wrapped lines inside the <span class='inlinecode'>│ ... │</span> box and join them with spaces (no newline in the editor).</li>
+<li>Ignore UI noise: do not capture lines containing <span class='inlinecode'>INSERT</span> or <span class='inlinecode'>Add a follow-up</span>.</li>
+<li>Preserve appended text: if I add <span class='inlinecode'> juju</span> to an existing line, the space before <span class='inlinecode'>juju</span> must survive.</li>
+<li>No duplicate send: if the prefilled text is still at the start of the first line, it must be stripped once before sending back.</li>
+</ul><br />
+<h2 style='display: inline' id='almost-works-with-any-editor-or-any-tui'>(Almost) works with any editor (or any TUI)</h2><br />
+<br />
+<span>Although I use Helix, this is just <span class='inlinecode'>$EDITOR</span>. If you prefer Vim, Neovim, or something more exotic, it should work. The same mechanism can be used to feed text into any TUI that reads from a terminal pane, not just Cursor Agent.</span><br />
+<br />
+<span>One caveat: different agents draw different prompt UIs, so the capture logic depends on the prompt shape. A future version of this script should be more modular in that respect; for now this is just a PoC tailored to Cursor Agent.</span><br />
+<br />
+<span>If I get a chance, I&#39;ll clean it up and rewrite it in Go (and release it properly). For now, I am happy with this little hack. It already feels like a native editing workflow for Cursor Agent prompts.</span><br />
+<br />
+<span>E-Mail your comments to <span class='inlinecode'>paul@nospam.buetow.org</span> :-)</span><br />
+<br />
+<span>Other related posts are:</span><br />
+<br />
+<a class='textlink' href='./2026-02-02-tmux-popup-editor-for-cursor-agent-prompts.html'>2026-02-02 A tmux popup editor for Cursor Agent prompts (You are currently reading this)</a><br />
+<a class='textlink' href='./2025-08-05-local-coding-llm-with-ollama.html'>2025-08-05 Local LLM for Coding with Ollama on macOS</a><br />
+<a class='textlink' href='./2025-05-02-terminal-multiplexing-with-tmux-fish-edition.html'>2025-05-02 Terminal multiplexing with <span class='inlinecode'>tmux</span> - Fish edition</a><br />
+<a class='textlink' href='./2024-06-23-terminal-multiplexing-with-tmux.html'>2024-06-23 Terminal multiplexing with <span class='inlinecode'>tmux</span> - Z-Shell edition</a><br />
+<br />
+<a class='textlink' href='../'>Back to the main site</a><br />
+<p class="footer">
+ Generated with <a href="https://codeberg.org/snonux/gemtexter">Gemtexter 3.0.1-develop</a> |
+ served by <a href="https://www.OpenBSD.org">OpenBSD</a>/<a href="https://man.openbsd.org/relayd.8">relayd(8)</a>+<a href="https://man.openbsd.org/httpd.8">httpd(8)</a> |
+ <a href="https://foo.zone/site-mirrors.html">Site Mirrors</a>
+ <br />
+ Webring: <a href="https://shring.sh/foo.zone/previous">previous</a> | <a href="https://shring.sh">shring</a> | <a href="https://shring.sh/foo.zone/next">next</a>
+</p>
+</body>
+</html>
diff --git a/gemfeed/atom.xml b/gemfeed/atom.xml
index d8063be1..86db1b25 100644
--- a/gemfeed/atom.xml
+++ b/gemfeed/atom.xml
@@ -1,12 +1,320 @@
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
- <updated>2026-01-31T19:49:46+02:00</updated>
+ <updated>2026-02-01T20:24:16+02:00</updated>
<title>foo.zone feed</title>
<subtitle>To be in the .zone!</subtitle>
<link href="https://foo.zone/gemfeed/atom.xml" rel="self" />
<link href="https://foo.zone/" />
<id>https://foo.zone/</id>
<entry>
+ <title>A tmux popup editor for Cursor Agent prompts</title>
+ <link href="https://foo.zone/gemfeed/2026-02-02-tmux-popup-editor-for-cursor-agent-prompts.html" />
+ <id>https://foo.zone/gemfeed/2026-02-02-tmux-popup-editor-for-cursor-agent-prompts.html</id>
+ <updated>2026-02-01T20:24:16+02:00</updated>
+ <author>
+ <name>Paul Buetow aka snonux</name>
+ <email>paul@dev.buetow.org</email>
+ </author>
+ <summary>I spend some time in Cursor Agent (the CLI version of the Cursor IDE, I don't like really the IDE), and I also jump between Claude Code CLI, Ampcode, Gemini CLI, OpenAI Codex CLI, OpenCode, and Aider just to see how things are evolving. But for the next month I'll be with Cursor Agent.</summary>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml">
+ <h1 style='display: inline' id='a-tmux-popup-editor-for-cursor-agent-prompts'>A tmux popup editor for Cursor Agent prompts</h1><br />
+<br />
+<span>...and any other TUI based application</span><br />
+<br />
+<h2 style='display: inline' id='table-of-contents'>Table of Contents</h2><br />
+<br />
+<ul>
+<li><a href='#a-tmux-popup-editor-for-cursor-agent-prompts'>A tmux popup editor for Cursor Agent prompts</a></li>
+<li>⇢ <a href='#why-i-built-this'>Why I built this</a></li>
+<li>⇢ <a href='#what-it-is'>What it is</a></li>
+<li>⇢ <a href='#how-it-works-overview'>How it works (overview)</a></li>
+<li>⇢ <a href='#challenges-and-small-discoveries'>Challenges and small discoveries</a></li>
+<li>⇢ <a href='#test-cases-for-a-future-rewrite'>Test cases (for a future rewrite)</a></li>
+<li>⇢ <a href='#almost-works-with-any-editor-or-any-tui'>(Almost) works with any editor (or any TUI)</a></li>
+</ul><br />
+<h2 style='display: inline' id='why-i-built-this'>Why I built this</h2><br />
+<br />
+<span>I spend some time in Cursor Agent (the CLI version of the Cursor IDE, I don&#39;t like really the IDE), and I also jump between Claude Code CLI, Ampcode, Gemini CLI, OpenAI Codex CLI, OpenCode, and Aider just to see how things are evolving. But for the next month I&#39;ll be with Cursor Agent.</span><br />
+<br />
+<span>Short prompts are fine in the inline input, but for longer prompts I want a real editor: spellcheck, search/replace, multiple cursors, and all the Helix muscle memory I already have.</span><br />
+<br />
+<span>Cursor Agent has a Vim editing mode, but not Helix. And even in Vim mode I can&#39;t use my full editor setup. I want the real thing, not a partial emulation.</span><br />
+<br />
+<a class='textlink' href='https://helix-editor.com'>https://helix-editor.com</a><br />
+<a class='textlink' href='https://www.vim.org'>https://www.vim.org</a><br />
+<a class='textlink' href='https://neovim.io'>https://neovim.io</a><br />
+<br />
+<span>So I built a tiny tmux popup editor. It opens <span class='inlinecode'>$EDITOR</span> (Helix for me), and when I close it, the buffer is sent back into the prompt. It sounds simple, but it feels surprisingly native.</span><br />
+<br />
+<span>This is how it looks like:</span><br />
+<br />
+<a href='./tmux-popup-editor-for-cursor-agent-prompts/demo1.png'><img alt='Popup editor in action' title='Popup editor in action' src='./tmux-popup-editor-for-cursor-agent-prompts/demo1.png' /></a><br />
+<br />
+<h2 style='display: inline' id='what-it-is'>What it is</h2><br />
+<br />
+<span>The idea is straightforward:</span><br />
+<br />
+<ul>
+<li>A tmux key binding <span class='inlinecode'>prefix-e</span> opens a popup overlay near the bottom of the screen.</li>
+<li>The popup starts <span class='inlinecode'>$EDITOR</span> on a temp file.</li>
+<li>When I exit the editor, the script sends the contents back to the original pane with <span class='inlinecode'>tmux send-keys</span>.</li>
+</ul><br />
+<span>It also pre-fills the temp file with whatever is already typed after Cursor Agent&#39;s <span class='inlinecode'>→</span> prompt, so I can continue where I left off.</span><br />
+<br />
+<h2 style='display: inline' id='how-it-works-overview'>How it works (overview)</h2><br />
+<br />
+<span>This is the tmux binding I use (trimmed to the essentials):</span><br />
+<br />
+<pre>
+bind-key e run-shell -b "tmux display-message -p &#39;#{pane_id}&#39;
+ &gt; /tmp/tmux-edit-target-#{client_pid} \;
+ tmux popup -E -w 90% -h 35% -x 5% -y 65% -d &#39;#{pane_current_path}&#39;
+ \"~/scripts/tmux-edit-send /tmp/tmux-edit-target-#{client_pid}\""
+</pre>
+<br />
+<span>And this is how it looks like after sending back the text to the Cursor Agent&#39;s input:</span><br />
+<br />
+<a href='./tmux-popup-editor-for-cursor-agent-prompts/demo2.png'><img alt='Prefilled prompt text' title='Prefilled prompt text' src='./tmux-popup-editor-for-cursor-agent-prompts/demo2.png' /></a><br />
+<br />
+<span>And here is the full script. It is a bit ugly since it&#39;s shell (written with Cursor Agent with GPT-5.2-Codex), and I might (let) rewrite it in Go and release it once I have time. But it works well enough for now.</span><br />
+<br />
+<!-- Generator: GNU source-highlight 3.1.9
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><i><font color="silver">#!/usr/bin/env bash</font></i>
+<b><u><font color="#000000">set</font></u></b> -u -o pipefail
+
+<b><u><font color="#000000">declare</font></u></b> -i LOG_ENABLED=<font color="#000000">0</font>
+
+log_file=<font color="#808080">"${TMPDIR:-/tmp}/tmux-edit-send.log"</font>
+
+log() {
+ <b><u><font color="#000000">if</font></u></b> [ <font color="#808080">"$LOG_ENABLED"</font> -eq <font color="#000000">1</font> ]; <b><u><font color="#000000">then</font></u></b>
+ <b><u><font color="#000000">printf</font></u></b> <font color="#808080">'%s</font>\n<font color="#808080">'</font> <font color="#808080">"$*"</font> &gt;&gt; <font color="#808080">"$log_file"</font>
+ <b><u><font color="#000000">fi</font></u></b>
+}
+
+<i><font color="silver"># Read the target pane id from a temp file created by tmux binding.</font></i>
+read_target_from_file() {
+ <b><u><font color="#000000">local</font></u></b> file_path=<font color="#808080">"$1"</font>
+ <b><u><font color="#000000">if</font></u></b> [ -n <font color="#808080">"$file_path"</font> ] &amp;&amp; [ -f <font color="#808080">"$file_path"</font> ]; <b><u><font color="#000000">then</font></u></b>
+ sed -n <font color="#808080">'1p'</font> <font color="#808080">"$file_path"</font> | tr -d <font color="#808080">'[:space:]'</font>
+ <b><u><font color="#000000">fi</font></u></b>
+}
+
+<i><font color="silver"># Read the target pane id from tmux environment if present.</font></i>
+read_target_from_env() {
+ <b><u><font color="#000000">local</font></u></b> env_line
+ env_line=<font color="#808080">"$(tmux show-environment -g TMUX_EDIT_TARGET 2&gt;/dev/null || true)"</font>
+ <b><u><font color="#000000">case</font></u></b> <font color="#808080">"$env_line"</font> <b><u><font color="#000000">in</font></u></b>
+ TMUX_EDIT_TARGET=*) <b><u><font color="#000000">printf</font></u></b> <font color="#808080">'%s'</font> <font color="#808080">"${env_line#TMUX_EDIT_TARGET=}"</font> ;;
+ <b><u><font color="#000000">esac</font></u></b>
+}
+
+<i><font color="silver"># Resolve the target pane id, falling back to the last pane.</font></i>
+resolve_target_pane() {
+ <b><u><font color="#000000">local</font></u></b> candidate=<font color="#808080">"$1"</font>
+ <b><u><font color="#000000">local</font></u></b> current_pane last_pane
+
+ current_pane=<font color="#808080">"$(tmux display-message -p "</font><i><font color="silver">#{pane_id}" 2&gt;/dev/null || true)"</font></i>
+ log <font color="#808080">"current pane=${current_pane:-&lt;empty&gt;}"</font>
+ <b><u><font color="#000000">if</font></u></b> [ -n <font color="#808080">"$candidate"</font> ] &amp;&amp; [[ <font color="#808080">"$candidate"</font> == *<font color="#808080">"#{"</font>* ]]; <b><u><font color="#000000">then</font></u></b>
+ log <font color="#808080">"format target detected, clearing"</font>
+ candidate=<font color="#808080">""</font>
+ <b><u><font color="#000000">fi</font></u></b>
+ <b><u><font color="#000000">if</font></u></b> [ -z <font color="#808080">"$candidate"</font> ]; <b><u><font color="#000000">then</font></u></b>
+ candidate=<font color="#808080">"$(tmux display-message -p "</font><i><font color="silver">#{last_pane}" 2&gt;/dev/null || true)"</font></i>
+ <b><u><font color="#000000">elif</font></u></b> [ <font color="#808080">"$candidate"</font> = <font color="#808080">"$current_pane"</font> ]; <b><u><font color="#000000">then</font></u></b>
+ last_pane=<font color="#808080">"$(tmux display-message -p "</font><i><font color="silver">#{last_pane}" 2&gt;/dev/null || true)"</font></i>
+ <b><u><font color="#000000">if</font></u></b> [ -n <font color="#808080">"$last_pane"</font> ]; <b><u><font color="#000000">then</font></u></b>
+ candidate=<font color="#808080">"$last_pane"</font>
+ <b><u><font color="#000000">fi</font></u></b>
+ <b><u><font color="#000000">fi</font></u></b>
+ <b><u><font color="#000000">printf</font></u></b> <font color="#808080">'%s'</font> <font color="#808080">"$candidate"</font>
+}
+
+<i><font color="silver"># Capture the latest multi-line prompt content from the pane.</font></i>
+capture_prompt_text() {
+ <b><u><font color="#000000">local</font></u></b> target=<font color="#808080">"$1"</font>
+ tmux capture-pane -p -t <font color="#808080">"$target"</font> -S -<font color="#000000">2000</font> <font color="#000000">2</font>&gt;/dev/null | awk <font color="#808080">'</font>
+<font color="#808080"> function trim_box(line) {</font>
+<font color="#808080"> sub(/^ *│ ?/, "", line)</font>
+<font color="#808080"> sub(/ *│ *$/, "", line)</font>
+<font color="#808080"> sub(/[[:space:]]+$/, "", line)</font>
+<font color="#808080"> return line</font>
+<font color="#808080"> }</font>
+<font color="#808080"> /^ *│ *→/ &amp;&amp; index($0,"INSERT")==0 &amp;&amp; index($0,"Add a follow-up")==0 {</font>
+<font color="#808080"> if (text != "") last = text</font>
+<font color="#808080"> text = ""</font>
+<font color="#808080"> capture = 1</font>
+<font color="#808080"> line = $0</font>
+<font color="#808080"> sub(/^.*→ ?/, "", line)</font>
+<font color="#808080"> line = trim_box(line)</font>
+<font color="#808080"> if (line != "") text = line</font>
+<font color="#808080"> next</font>
+<font color="#808080"> }</font>
+<font color="#808080"> capture {</font>
+<font color="#808080"> if ($0 ~ /^ *└/) {</font>
+<font color="#808080"> capture = 0</font>
+<font color="#808080"> if (text != "") last = text</font>
+<font color="#808080"> next</font>
+<font color="#808080"> }</font>
+<font color="#808080"> if ($0 ~ /^ *│/ &amp;&amp; index($0,"INSERT")==0 &amp;&amp; index($0,"Add a follow-up")==0) {</font>
+<font color="#808080"> line = trim_box($0)</font>
+<font color="#808080"> if (line != "") {</font>
+<font color="#808080"> if (text != "") text = text " " line</font>
+<font color="#808080"> else text = line</font>
+<font color="#808080"> }</font>
+<font color="#808080"> }</font>
+<font color="#808080"> }</font>
+<font color="#808080"> END {</font>
+<font color="#808080"> if (text != "") last = text</font>
+<font color="#808080"> if (last != "") print last</font>
+<font color="#808080"> }</font>
+<font color="#808080"> '</font>
+}
+
+<i><font color="silver"># Write captured prompt text into the temp file if available.</font></i>
+prefill_tmpfile() {
+ <b><u><font color="#000000">local</font></u></b> tmpfile=<font color="#808080">"$1"</font>
+ <b><u><font color="#000000">local</font></u></b> prompt_text=<font color="#808080">"$2"</font>
+ <b><u><font color="#000000">if</font></u></b> [ -n <font color="#808080">"$prompt_text"</font> ]; <b><u><font color="#000000">then</font></u></b>
+ <b><u><font color="#000000">printf</font></u></b> <font color="#808080">'%s</font>\n<font color="#808080">'</font> <font color="#808080">"$prompt_text"</font> &gt; <font color="#808080">"$tmpfile"</font>
+ <b><u><font color="#000000">fi</font></u></b>
+}
+
+<i><font color="silver"># Ensure the target pane exists before sending keys.</font></i>
+validate_target_pane() {
+ <b><u><font color="#000000">local</font></u></b> target=<font color="#808080">"$1"</font>
+ <b><u><font color="#000000">local</font></u></b> pane target_found
+ <b><u><font color="#000000">if</font></u></b> [ -z <font color="#808080">"$target"</font> ]; <b><u><font color="#000000">then</font></u></b>
+ log <font color="#808080">"error: no target pane determined"</font>
+ echo <font color="#808080">"Could not determine target pane."</font> &gt;&amp;<font color="#000000">2</font>
+ <b><u><font color="#000000">return</font></u></b> <font color="#000000">1</font>
+ <b><u><font color="#000000">fi</font></u></b>
+ target_found=<font color="#000000">0</font>
+ <b><u><font color="#000000">for</font></u></b> pane <b><u><font color="#000000">in</font></u></b> $(tmux list-panes -a -F <font color="#808080">"#{pane_id}"</font> <font color="#000000">2</font>&gt;/dev/null || <b><u><font color="#000000">true</font></u></b>); <b><u><font color="#000000">do</font></u></b>
+ <b><u><font color="#000000">if</font></u></b> [ <font color="#808080">"$pane"</font> = <font color="#808080">"$target"</font> ]; <b><u><font color="#000000">then</font></u></b>
+ target_found=<font color="#000000">1</font>
+ <b><u><font color="#000000">break</font></u></b>
+ <b><u><font color="#000000">fi</font></u></b>
+ <b><u><font color="#000000">done</font></u></b>
+ <b><u><font color="#000000">if</font></u></b> [ <font color="#808080">"$target_found"</font> -ne <font color="#000000">1</font> ]; <b><u><font color="#000000">then</font></u></b>
+ log <font color="#808080">"error: target pane not found: $target"</font>
+ echo <font color="#808080">"Target pane not found: $target"</font> &gt;&amp;<font color="#000000">2</font>
+ <b><u><font color="#000000">return</font></u></b> <font color="#000000">1</font>
+ <b><u><font color="#000000">fi</font></u></b>
+}
+
+<i><font color="silver"># Send temp file contents to the target pane line by line.</font></i>
+send_content() {
+ <b><u><font color="#000000">local</font></u></b> target=<font color="#808080">"$1"</font>
+ <b><u><font color="#000000">local</font></u></b> tmpfile=<font color="#808080">"$2"</font>
+ <b><u><font color="#000000">local</font></u></b> prompt_text=<font color="#808080">"$3"</font>
+ <b><u><font color="#000000">local</font></u></b> first_line=<font color="#000000">1</font>
+ <b><u><font color="#000000">local</font></u></b> line
+ <b><u><font color="#000000">while</font></u></b> IFS= <b><u><font color="#000000">read</font></u></b> -r line || [ -n <font color="#808080">"$line"</font> ]; <b><u><font color="#000000">do</font></u></b>
+ <b><u><font color="#000000">if</font></u></b> [ <font color="#808080">"$first_line"</font> -eq <font color="#000000">1</font> ] &amp;&amp; [ -n <font color="#808080">"$prompt_text"</font> ]; <b><u><font color="#000000">then</font></u></b>
+ <b><u><font color="#000000">if</font></u></b> [[ <font color="#808080">"$line"</font> == <font color="#808080">"$prompt_text"</font>* ]]; <b><u><font color="#000000">then</font></u></b>
+ line=<font color="#808080">"${line#"</font>$prompt_text<font color="#808080">"}"</font>
+ <b><u><font color="#000000">fi</font></u></b>
+ <b><u><font color="#000000">fi</font></u></b>
+ first_line=<font color="#000000">0</font>
+ tmux send-keys -t <font color="#808080">"$target"</font> -l <font color="#808080">"$line"</font>
+ tmux send-keys -t <font color="#808080">"$target"</font> Enter
+ <b><u><font color="#000000">done</font></u></b> &lt; <font color="#808080">"$tmpfile"</font>
+ log <font color="#808080">"sent content to $target"</font>
+}
+
+<i><font color="silver"># Main entry point.</font></i>
+main() {
+ <b><u><font color="#000000">local</font></u></b> target_file=<font color="#808080">"${1:-}"</font>
+ <b><u><font color="#000000">local</font></u></b> target
+ <b><u><font color="#000000">local</font></u></b> editor=<font color="#808080">"${EDITOR:-vi}"</font>
+ <b><u><font color="#000000">local</font></u></b> tmpfile
+ <b><u><font color="#000000">local</font></u></b> prompt_text
+
+ target=<font color="#808080">"$(read_target_from_file "</font>$target_file<font color="#808080">" || true)"</font>
+ <b><u><font color="#000000">if</font></u></b> [ -n <font color="#808080">"$target"</font> ]; <b><u><font color="#000000">then</font></u></b>
+ log <font color="#808080">"file target=${target:-&lt;empty&gt;}"</font>
+ rm -f <font color="#808080">"$target_file"</font>
+ <b><u><font color="#000000">fi</font></u></b>
+ <b><u><font color="#000000">if</font></u></b> [ -z <font color="#808080">"$target"</font> ]; <b><u><font color="#000000">then</font></u></b>
+ target=<font color="#808080">"${TMUX_EDIT_TARGET:-}"</font>
+ <b><u><font color="#000000">fi</font></u></b>
+ log <font color="#808080">"env target=${target:-&lt;empty&gt;}"</font>
+ <b><u><font color="#000000">if</font></u></b> [ -z <font color="#808080">"$target"</font> ]; <b><u><font color="#000000">then</font></u></b>
+ target=<font color="#808080">"$(read_target_from_env || true)"</font>
+ <b><u><font color="#000000">fi</font></u></b>
+ log <font color="#808080">"tmux env target=${target:-&lt;empty&gt;}"</font>
+ target=<font color="#808080">"$(resolve_target_pane "</font>$target<font color="#808080">")"</font>
+ log <font color="#808080">"fallback target=${target:-&lt;empty&gt;}"</font>
+
+ tmpfile=<font color="#808080">"$(mktemp "</font>./.tmux-edit-send.XXXXXX.md<font color="#808080">")"</font>
+ <b><u><font color="#000000">trap</font></u></b> <font color="#808080">'rm -f "$tmpfile"'</font> EXIT
+
+ prompt_text=<font color="#808080">"$(capture_prompt_text "</font>$target<font color="#808080">")"</font>
+ prefill_tmpfile <font color="#808080">"$tmpfile"</font> <font color="#808080">"$prompt_text"</font>
+
+ <font color="#808080">"$editor"</font> <font color="#808080">"$tmpfile"</font>
+ log <font color="#808080">"editor exited with status $?"</font>
+
+ <b><u><font color="#000000">if</font></u></b> [ ! -s <font color="#808080">"$tmpfile"</font> ]; <b><u><font color="#000000">then</font></u></b>
+ log <font color="#808080">"empty file, nothing sent"</font>
+ <b><u><font color="#000000">exit</font></u></b> <font color="#000000">0</font>
+ <b><u><font color="#000000">fi</font></u></b>
+
+ validate_target_pane <font color="#808080">"$target"</font>
+ send_content <font color="#808080">"$target"</font> <font color="#808080">"$tmpfile"</font> <font color="#808080">"$prompt_text"</font>
+}
+
+main <font color="#808080">"$@"</font>
+</pre>
+<br />
+<h2 style='display: inline' id='challenges-and-small-discoveries'>Challenges and small discoveries</h2><br />
+<br />
+<span>The problems were mostly small but annoying:</span><br />
+<br />
+<ul>
+<li>Getting the right target pane was the first hurdle. I ended up storing the pane id in a file because of tmux format expansion quirks.</li>
+<li>The Cursor UI draws a nice box around the prompt, so the prompt line contains a <span class='inlinecode'>│</span> and other markers. I had to filter those out and strip the box-drawing characters.</li>
+<li>When I prefilled text and then sent it back, I sometimes duplicated the prompt. Stripping the prefilled prompt text from the first line fixed that.</li>
+</ul><br />
+<h2 style='display: inline' id='test-cases-for-a-future-rewrite'>Test cases (for a future rewrite)</h2><br />
+<br />
+<span>These are the cases I test whenever I touch the script:</span><br />
+<br />
+<ul>
+<li>Single-line prompt: capture everything after <span class='inlinecode'>→</span> and prefill the editor.</li>
+<li>Multi-line boxed prompt: capture the wrapped lines inside the <span class='inlinecode'>│ ... │</span> box and join them with spaces (no newline in the editor).</li>
+<li>Ignore UI noise: do not capture lines containing <span class='inlinecode'>INSERT</span> or <span class='inlinecode'>Add a follow-up</span>.</li>
+<li>Preserve appended text: if I add <span class='inlinecode'> juju</span> to an existing line, the space before <span class='inlinecode'>juju</span> must survive.</li>
+<li>No duplicate send: if the prefilled text is still at the start of the first line, it must be stripped once before sending back.</li>
+</ul><br />
+<h2 style='display: inline' id='almost-works-with-any-editor-or-any-tui'>(Almost) works with any editor (or any TUI)</h2><br />
+<br />
+<span>Although I use Helix, this is just <span class='inlinecode'>$EDITOR</span>. If you prefer Vim, Neovim, or something more exotic, it should work. The same mechanism can be used to feed text into any TUI that reads from a terminal pane, not just Cursor Agent.</span><br />
+<br />
+<span>One caveat: different agents draw different prompt UIs, so the capture logic depends on the prompt shape. A future version of this script should be more modular in that respect; for now this is just a PoC tailored to Cursor Agent.</span><br />
+<br />
+<span>If I get a chance, I&#39;ll clean it up and rewrite it in Go (and release it properly). For now, I am happy with this little hack. It already feels like a native editing workflow for Cursor Agent prompts.</span><br />
+<br />
+<span>E-Mail your comments to <span class='inlinecode'>paul@nospam.buetow.org</span> :-)</span><br />
+<br />
+<span>Other related posts are:</span><br />
+<br />
+<a class='textlink' href='./2026-02-02-tmux-popup-editor-for-cursor-agent-prompts.html'>2026-02-02 A tmux popup editor for Cursor Agent prompts (You are currently reading this)</a><br />
+<a class='textlink' href='./2025-08-05-local-coding-llm-with-ollama.html'>2025-08-05 Local LLM for Coding with Ollama on macOS</a><br />
+<a class='textlink' href='./2025-05-02-terminal-multiplexing-with-tmux-fish-edition.html'>2025-05-02 Terminal multiplexing with <span class='inlinecode'>tmux</span> - Fish edition</a><br />
+<a class='textlink' href='./2024-06-23-terminal-multiplexing-with-tmux.html'>2024-06-23 Terminal multiplexing with <span class='inlinecode'>tmux</span> - Z-Shell edition</a><br />
+<br />
+<a class='textlink' href='../'>Back to the main site</a><br />
+ </div>
+ </content>
+ </entry>
+ <entry>
<title>Using Supernote Nomad offline</title>
<link href="https://foo.zone/gemfeed/2026-01-01-using-supernote-nomad-offline.html" />
<id>https://foo.zone/gemfeed/2026-01-01-using-supernote-nomad-offline.html</id>
@@ -17760,95 +18068,4 @@ http://www.gnu.org/software/src-highlite -->
</div>
</content>
</entry>
- <entry>
- <title>One reason why I love OpenBSD</title>
- <link href="https://foo.zone/gemfeed/2024-01-13-one-reason-why-i-love-openbsd.html" />
- <id>https://foo.zone/gemfeed/2024-01-13-one-reason-why-i-love-openbsd.html</id>
- <updated>2024-01-13T22:55:33+02:00</updated>
- <author>
- <name>Paul Buetow aka snonux</name>
- <email>paul@dev.buetow.org</email>
- </author>
- <summary>HKISSFISHKISSFISHKISSFISHKISSFISH KISS</summary>
- <content type="xhtml">
- <div xmlns="http://www.w3.org/1999/xhtml">
- <h1 style='display: inline' id='one-reason-why-i-love-openbsd'>One reason why I love OpenBSD</h1><br />
-<br />
-<span class='quote'>Published at 2024-01-13T22:55:33+02:00</span><br />
-<br />
-<pre>
- FISHKISSFISHKIS
- SFISHKISSFISHKISSFISH F
- ISHK ISSFISHKISSFISHKISS FI
- SHKISS FISHKISSFISHKISSFISS FIS
-HKISSFISHKISSFISHKISSFISHKISSFISH KISS
- FISHKISSFISHKISSFISHKISSFISHKISS FISHK
- SSFISHKISSFISHKISSFISHKISSFISHKISSF
- ISHKISSFISHKISSFISHKISSFISHKISSF ISHKI
-SSFISHKISSFISHKISSFISHKISSFISHKIS SFIS
- HKISSFISHKISSFISHKISSFISHKISS FIS
- HKISSFISHKISSFISHKISSFISHK IS
- SFISHKISSFISHKISSFISH K
- ISSFISHKISSFISHK
-</pre>
-<br />
-<span>I just upgraded my OpenBSD&#39;s from <span class='inlinecode'>7.3</span> to <span class='inlinecode'>7.4</span> by following the unattended upgrade guide:</span><br />
-<br />
-<a class='textlink' href='https://www.openbsd.org/faq/upgrade74.html'>https://www.openbsd.org/faq/upgrade74.html</a><br />
-<br />
-<!-- Generator: GNU source-highlight 3.1.9
-by Lorenzo Bettini
-http://www.lorenzobettini.it
-http://www.gnu.org/software/src-highlite -->
-<pre>$ doas installboot sd0 <i><font color="silver"># Update the bootloader (not for every upgrade required)</font></i>
-$ doas sysupgrade <i><font color="silver"># Update all binaries (including Kernel)</font></i>
-</pre>
-<br />
-<span><span class='inlinecode'>sysupgrade</span> downloaded and upgraded to the next release and rebooted the system. After the reboot, I run:</span><br />
-<br />
-<span class='quote'>Note to myself: I have to undo the <span class='inlinecode'>/var/www</span> symlink before upgrading, and re-establishing the symlink afterwards again. This is due to disk space constraings on my setup!</span><br />
-<br />
-<!-- Generator: GNU source-highlight 3.1.9
-by Lorenzo Bettini
-http://www.lorenzobettini.it
-http://www.gnu.org/software/src-highlite -->
-<pre>$ doas sysmerge <i><font color="silver"># Update system configuration files</font></i>
-$ doas pkg_add -u <i><font color="silver"># Update all packages</font></i>
-$ doas reboot <i><font color="silver"># Just in case, reboot one more time</font></i>
-</pre>
-<br />
-<span>That&#39;s it! Took me around 5 minutes in total! No issues, only these few comands, only 5 minutes! It just works! No problems, no conflicts, no tons (actually none) config file merge conflicts.</span><br />
-<br />
-<span>I followed the same procedure the previous times and never encountered any difficulties with any OpenBSD upgrades.</span><br />
-<br />
-<span>I have seen upgrades of other Operating Systems either take a long time or break the system (which takes manual steps to repair). That&#39;s just one of many reasons why I love OpenBSD! There appear never to be any problems. It just gets its job done!</span><br />
-<br />
-<a class='textlink' href='https://www.openbsd.org'>The OpenBSD Project</a><br />
-<br />
-<span>BTW: are you looking for an opinionated OpenBSD VM hoster? OpenBSD Amsterdam may be for you. They rock (I am having a VM there, too)!</span><br />
-<br />
-<a class='textlink' href='https://openbsd.amsterdam'>https://openbsd.amsterdam</a><br />
-<br />
-<span>E-Mail your comments to <span class='inlinecode'>paul@nospam.buetow.org</span> :-)</span><br />
-<br />
-<span>Other *BSD related posts are:</span><br />
-<br />
-<a class='textlink' href='./2025-12-07-f3s-kubernetes-with-freebsd-part-8.html'>2025-12-07 f3s: Kubernetes with FreeBSD - Part 8: Observability</a><br />
-<a class='textlink' href='./2025-10-02-f3s-kubernetes-with-freebsd-part-7.html'>2025-10-02 f3s: Kubernetes with FreeBSD - Part 7: k3s and first pod deployments</a><br />
-<a class='textlink' href='./2025-07-14-f3s-kubernetes-with-freebsd-part-6.html'>2025-07-14 f3s: Kubernetes with FreeBSD - Part 6: Storage</a><br />
-<a class='textlink' href='./2025-05-11-f3s-kubernetes-with-freebsd-part-5.html'>2025-05-11 f3s: Kubernetes with FreeBSD - Part 5: WireGuard mesh network</a><br />
-<a class='textlink' href='./2025-04-05-f3s-kubernetes-with-freebsd-part-4.html'>2025-04-05 f3s: Kubernetes with FreeBSD - Part 4: Rocky Linux Bhyve VMs</a><br />
-<a class='textlink' href='./2025-02-01-f3s-kubernetes-with-freebsd-part-3.html'>2025-02-01 f3s: Kubernetes with FreeBSD - Part 3: Protecting from power cuts</a><br />
-<a class='textlink' href='./2024-12-03-f3s-kubernetes-with-freebsd-part-2.html'>2024-12-03 f3s: Kubernetes with FreeBSD - Part 2: Hardware and base installation</a><br />
-<a class='textlink' href='./2024-11-17-f3s-kubernetes-with-freebsd-part-1.html'>2024-11-17 f3s: Kubernetes with FreeBSD - Part 1: Setting the stage</a><br />
-<a class='textlink' href='./2024-04-01-KISS-high-availability-with-OpenBSD.html'>2024-04-01 KISS high-availability with OpenBSD</a><br />
-<a class='textlink' href='./2024-01-13-one-reason-why-i-love-openbsd.html'>2024-01-13 One reason why I love OpenBSD (You are currently reading this)</a><br />
-<a class='textlink' href='./2022-10-30-installing-dtail-on-openbsd.html'>2022-10-30 Installing DTail on OpenBSD</a><br />
-<a class='textlink' href='./2022-07-30-lets-encrypt-with-openbsd-and-rex.html'>2022-07-30 Let&#39;s Encrypt with OpenBSD and Rex</a><br />
-<a class='textlink' href='./2016-04-09-jails-and-zfs-on-freebsd-with-puppet.html'>2016-04-09 Jails and ZFS with Puppet on FreeBSD</a><br />
-<br />
-<a class='textlink' href='../'>Back to the main site</a><br />
- </div>
- </content>
- </entry>
</feed>
diff --git a/gemfeed/index.html b/gemfeed/index.html
index 8c0a3715..b651c344 100644
--- a/gemfeed/index.html
+++ b/gemfeed/index.html
@@ -15,6 +15,7 @@
<br />
<h2 style='display: inline' id='to-be-in-the-zone'>To be in the .zone!</h2><br />
<br />
+<a class='textlink' href='./2026-02-02-tmux-popup-editor-for-cursor-agent-prompts.html'>2026-02-02 - A tmux popup editor for Cursor Agent prompts</a><br />
<a class='textlink' href='./2026-01-01-using-supernote-nomad-offline.html'>2026-01-01 - Using Supernote Nomad offline</a><br />
<a class='textlink' href='./2026-01-01-posts-from-july-to-december-2025.html'>2026-01-01 - Posts from July to December 2025</a><br />
<a class='textlink' href='./2026-01-01-cloudless-kobo-forma-with-koreader.html'>2026-01-01 - Cloudless Kobo Forma with KOReader</a><br />
diff --git a/gemfeed/tmux-popup-editor-for-cursor-agent-prompts/demo1.png b/gemfeed/tmux-popup-editor-for-cursor-agent-prompts/demo1.png
new file mode 100644
index 00000000..5985d55f
--- /dev/null
+++ b/gemfeed/tmux-popup-editor-for-cursor-agent-prompts/demo1.png
Binary files differ
diff --git a/gemfeed/tmux-popup-editor-for-cursor-agent-prompts/demo2.png b/gemfeed/tmux-popup-editor-for-cursor-agent-prompts/demo2.png
new file mode 100644
index 00000000..1d7f26d7
--- /dev/null
+++ b/gemfeed/tmux-popup-editor-for-cursor-agent-prompts/demo2.png
Binary files differ
diff --git a/index.html b/index.html
index 5f3fee80..42c87227 100644
--- a/index.html
+++ b/index.html
@@ -13,7 +13,7 @@
</p>
<h1 style='display: inline' id='hello'>Hello!</h1><br />
<br />
-<span class='quote'>This site was generated at 2026-01-31T19:49:46+02:00 by <span class='inlinecode'>Gemtexter</span></span><br />
+<span class='quote'>This site was generated at 2026-02-01T20:24:16+02:00 by <span class='inlinecode'>Gemtexter</span></span><br />
<br />
<span>Welcome to the foo.zone!</span><br />
<br />
@@ -43,6 +43,7 @@
<br />
<h3 style='display: inline' id='posts'>Posts</h3><br />
<br />
+<a class='textlink' href='./gemfeed/2026-02-02-tmux-popup-editor-for-cursor-agent-prompts.html'>2026-02-02 - A tmux popup editor for Cursor Agent prompts</a><br />
<a class='textlink' href='./gemfeed/2026-01-01-using-supernote-nomad-offline.html'>2026-01-01 - Using Supernote Nomad offline</a><br />
<a class='textlink' href='./gemfeed/2026-01-01-posts-from-july-to-december-2025.html'>2026-01-01 - Posts from July to December 2025</a><br />
<a class='textlink' href='./gemfeed/2026-01-01-cloudless-kobo-forma-with-koreader.html'>2026-01-01 - Cloudless Kobo Forma with KOReader</a><br />
diff --git a/uptime-stats.html b/uptime-stats.html
index 9a562502..2eae3023 100644
--- a/uptime-stats.html
+++ b/uptime-stats.html
@@ -13,7 +13,7 @@
</p>
<h1 style='display: inline' id='my-machine-uptime-stats'>My machine uptime stats</h1><br />
<br />
-<span class='quote'>This site was last updated at 2026-01-31T19:49:46+02:00</span><br />
+<span class='quote'>This site was last updated at 2026-02-01T20:24:16+02:00</span><br />
<br />
<span>The following stats were collected via <span class='inlinecode'>uptimed</span> on all of my personal computers over many years and the output was generated by <span class='inlinecode'>guprecords</span>, the global uptime records stats analyser of mine.</span><br />
<br />