summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--about/resources.gmi206
-rw-r--r--gemfeed/2026-02-02-tmux-popup-editor-for-cursor-agent-prompts.gmi76
-rw-r--r--gemfeed/2026-02-02-tmux-popup-editor-for-cursor-agent-prompts.gmi.tpl76
-rw-r--r--gemfeed/atom.xml78
-rw-r--r--index.gmi2
-rw-r--r--uptime-stats.gmi2
6 files changed, 310 insertions, 130 deletions
diff --git a/about/resources.gmi b/about/resources.gmi
index a9e89ac8..e3af7f47 100644
--- a/about/resources.gmi
+++ b/about/resources.gmi
@@ -35,110 +35,110 @@ You won't find any links on this site because, over time, the links will break.
In random order:
-* Java ist auch eine Insel; Christian Ullenboom;
+* Object-Oriented Programming with ANSI-C; Axel-Tobias Schreiner
+* Modern Perl; Chromatic ; Onyx Neon Press
+* Seeking SRE: Conversations About Running Production Systems at Scale; David N. Blank-Edelman; eBook
* Perl New Features; Joshua McAdams, brian d foy; Perl School
+* Kubernetes Cookbook; Sameer Naik, Sébastien Goasguen, Jonathan Michaux; O'Reilly
+* Polished Ruby Programming; Jeremy Evans; Packt Publishing
+* Systems Performance Tuning; Gian-Paolo D. Musumeci and others...; O'Reilly
* Amazon Web Services in Action; Michael Wittig and Andreas Wittig; Manning Publications
-* Learn You a Haskell for Great Good!; Miran Lipovaca; No Starch Press
-* 21st Century C: C Tips from the New School; Ben Klemens; O'Reilly
-* The Go Programming Language; Alan A. A. Donovan; Addison-Wesley Professional
-* Raku Fundamentals; Moritz Lenz; Apress
+* Hands-on Infrastructure Monitoring with Prometheus; Joel Bastos, Pedro Araujo; Packt
* The DevOps Handbook; Gene Kim, Jez Humble, Patrick Debois, John Willis; Audible
-* Effective awk programming; Arnold Robbins; O'Reilly
-* Think Raku (aka Think Perl 6); Laurent Rosenfeld, Allen B. Downey; O'Reilly
-* The KCNA (Kubernetes and Cloud Native Associate) Book; Nigel Poulton
-* Raku Recipes; J.J. Merelo; Apress
-* Polished Ruby Programming; Jeremy Evans; Packt Publishing
-* Concurrency in Go; Katherine Cox-Buday; O'Reilly
+* Funktionale Programmierung; Peter Pepper; Springer
* Chaos Engineering - System Resiliency in Practice; Casey Rosenthal and Nora Jones; eBook
-* Seeking SRE: Conversations About Running Production Systems at Scale; David N. Blank-Edelman; eBook
-* C++ Programming Language; Bjarne Stroustrup;
* Pro Puppet; James Turnbull, Jeffrey McCune; Apress
-* The Kubernetes Book; Nigel Poulton; Unabridged Audiobook
-* Programming Perl aka "The Camel Book"; Tom Christiansen, brian d foy, Larry Wall & Jon Orwant; O'Reilly
-* Object-Oriented Programming with ANSI-C; Axel-Tobias Schreiner
-* DevOps And Site Reliability Engineering Handbook; Stephen Fleming; Audible
-* Terraform Cookbook; Mikael Krief; Packt Publishing
-* Clusterbau mit Linux-HA; Michael Schwartzkopff; O'Reilly
-* Funktionale Programmierung; Peter Pepper; Springer
+* Site Reliability Engineering; How Google runs production systems; O'Reilly
+* Concurrency in Go; Katherine Cox-Buday; O'Reilly
+* The Go Programming Language; Alan A. A. Donovan; Addison-Wesley Professional
+* Leanring eBPF; Liz Rice; O'Reilly
+* Learn You Some Erlang for Great Good; Fred Herbert; No Starch Press
+* 21st Century C: C Tips from the New School; Ben Klemens; O'Reilly
+* Ultimate Go Notebook; Bill Kennedy
* DNS and BIND; Cricket Liu; O'Reilly
-* Go Brain Teasers - Exercise Your Mind; Miki Tebeka; The Pragmatic Programmers
+* Raku Recipes; J.J. Merelo; Apress
+* 100 Go Mistakes and How to Avoid Them; Teiva Harsanyi; Manning Publications
+* Higher Order Perl; Mark Dominus; Morgan Kaufmann
+* Developing Games in Java; David Brackeen and others...; New Riders
+* Effective awk programming; Arnold Robbins; O'Reilly
+* Programming Perl aka "The Camel Book"; Tom Christiansen, brian d foy, Larry Wall & Jon Orwant; O'Reilly
* 97 things every SRE should know; Emil Stolarsky, Jaime Woo; O'Reilly
-* Kubernetes Cookbook; Sameer Naik, Sébastien Goasguen, Jonathan Michaux; O'Reilly
-* Systems Performance Tuning; Gian-Paolo D. Musumeci and others...; O'Reilly
-* Effective Java; Joshua Bloch; Addison-Wesley Professional
+* The KCNA (Kubernetes and Cloud Native Associate) Book; Nigel Poulton
+* The Kubernetes Book; Nigel Poulton; Unabridged Audiobook
+* Learn You a Haskell for Great Good!; Miran Lipovaca; No Starch Press
* The Pragmatic Programmer; David Thomas; Addison-Wesley
-* Ultimate Go Notebook; Bill Kennedy
-* Data Science at the Command Line; Jeroen Janssens; O'Reilly
-* Hands-on Infrastructure Monitoring with Prometheus; Joel Bastos, Pedro Araujo; Packt
-* Developing Games in Java; David Brackeen and others...; New Riders
+* Effective Java; Joshua Bloch; Addison-Wesley Professional
+* Clusterbau mit Linux-HA; Michael Schwartzkopff; O'Reilly
+* The Docker Book; James Turnbull; Kindle
+* C++ Programming Language; Bjarne Stroustrup;
+* 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
* Programming Ruby 3.3 (5th Edition); Noel Rappin, with Dave Thomas; The Pragmatic Bookshelf
* Distributed Systems: Principles and Paradigms; Andrew S. Tanenbaum; Pearson
-* Site Reliability Engineering; How Google runs production systems; O'Reilly
-* 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
-* Systemprogrammierung in Go; Frank Müller; dpunkt
-* The Docker Book; James Turnbull; Kindle
-* Leanring eBPF; Liz Rice; O'Reilly
+* Data Science at the Command Line; Jeroen Janssens; O'Reilly
+* Go Brain Teasers - Exercise Your Mind; Miki Tebeka; The Pragmatic Programmers
* Tmux 2: Productive Mouse-free Development; Brain P. Hogan; The Pragmatic Programmers
-* Modern Perl; Chromatic ; Onyx Neon Press
-* Higher Order Perl; Mark Dominus; Morgan Kaufmann
-* Learn You Some Erlang for Great Good; Fred Herbert; No Starch Press
-* 100 Go Mistakes and How to Avoid Them; Teiva Harsanyi; Manning Publications
+* Terraform Cookbook; Mikael Krief; Packt Publishing
+* Raku Fundamentals; Moritz Lenz; Apress
+* Java ist auch eine Insel; Christian Ullenboom;
+* Think Raku (aka Think Perl 6); Laurent Rosenfeld, Allen B. Downey; O'Reilly
+* DevOps And Site Reliability Engineering Handbook; Stephen Fleming; Audible
+* Systemprogrammierung in Go; Frank Müller; dpunkt
## Technical references
I didn't read them from the beginning to the end, but I am using them to look up things. The books are in random order:
* Understanding the Linux Kernel; Daniel P. Bovet, Marco Cesati; O'Reilly
-* Groovy Kurz & Gut; Joerg Staudemeier; O'Reilly
-* The Linux Programming Interface; Michael Kerrisk; No Starch Press
-* Algorithms; Robert Sedgewick, Kevin Wayne; Addison Wesley
* BPF Performance Tools - Linux System and Application Observability, Brendan Gregg; Addison Wesley
-* Go: Design Patterns for Real-World Projects; Mat Ryer; Packt
* Relayd and Httpd Mastery; Michael W Lucas
* Implementing Service Level Objectives; Alex Hidalgo; O'Reilly
+* Groovy Kurz & Gut; Joerg Staudemeier; O'Reilly
+* The Linux Programming Interface; Michael Kerrisk; No Starch Press
+* Go: Design Patterns for Real-World Projects; Mat Ryer; Packt
+* Algorithms; Robert Sedgewick, Kevin Wayne; Addison Wesley
## Self-development and soft-skills books
In random order:
-* Soft Skills; John Sommez; Manning Publications
-* Coders at Work - Reflections on the craft of programming, Peter Seibel and Mitchell Dorian et al., Audiobook
-* The Good Enough Job; Simone Stolzoff; Ebury Edge
-* Ultralearning; Anna Laurent; Self-published via Amazon
-* Buddah and Einstein walk into a Bar; Guy Joseph Ale, Claire Bloom; Blackstone Publishing
-* Who Moved My Cheese?; Dr. Spencer Johnson; Vermilion
-* Atomic Habits; James Clear; Random House Business
-* The Off Switch; Mark Cropley; Virgin Books (RE-READ 1ST TIME)
-* Consciousness: A Very Short Introduction; Susan Blackmore; Oxford Uiversity Press
-* The Bullet Journal Method; Ryder Carroll; Fourth Estate
-* Never Split the Difference; Chris Voss, Tahl Raz; Random House Business
-* Solve for Happy; Mo Gawdat (RE-READ 1ST TIME)
* 97 Things Every Engineering Manager Should Know; Camille Fournier; Audiobook
-* Eat That Frog!; Brian Tracy; Hodder Paperbacks
* Meditation for Mortals, Oliver Burkeman, Audiobook
+* The Obstacle Is The Way; Ryan Holiday; Profile Books Ltd
+* The Software Engineer's Guidebook: Navigating senior, tech lead, and staff engineer positions at tech companies and startups; Gergely Orosz; Audiobook
+* Ultralearning; Scott Young; Thorsons
+* Influence without Authority; A. Cohen, D. Bradford; Wiley
* Search Inside Yourself - The Unexpected path to Achieving Success, Happiness (and World Peace); Chade-Meng Tan, Daniel Goleman, Jon Kabat-Zinn; HarperOne
-* The Phoenix Project - A Novel About IT, DevOps, and Helping your Business Win; Gene Kim and Kevin Behr; Trade Select
-* Eat That Frog; Brian Tracy
+* Deep Work; Cal Newport; Piatkus
+* The Off Switch; Mark Cropley; Virgin Books (RE-READ 1ST TIME)
+* Consciousness: A Very Short Introduction; Susan Blackmore; Oxford Uiversity Press
+* Time Management for System Administrators; Thomas A. Limoncelli; O'Reilly
+* Buddah and Einstein walk into a Bar; Guy Joseph Ale, Claire Bloom; Blackstone Publishing
* The 7 Habits Of Highly Effective People; Stephen R. Covey; Simon & Schuster UK
-* Stop starting, start finishing; Arne Roock; Lean-Kanban University
-* So Good They Can't Ignore You; Cal Newport; Business Plus
-* The Software Engineer's Guidebook: Navigating senior, tech lead, and staff engineer positions at tech companies and startups; Gergely Orosz; Audiobook
+* Eat That Frog; Brian Tracy
* The Daily Stoic; Ryan Holiday, Stephen Hanselman; Profile Books
-* Influence without Authority; A. Cohen, D. Bradford; Wiley
+* So Good They Can't Ignore You; Cal Newport; Business Plus
+* Eat That Frog!; Brian Tracy; Hodder Paperbacks
* Slow Productivity; Cal Newport; Penguin Random House
+* The Phoenix Project - A Novel About IT, DevOps, and Helping your Business Win; Gene Kim and Kevin Behr; Trade Select
+* Stop starting, start finishing; Arne Roock; Lean-Kanban University
* The Joy of Missing Out; Christina Crook; New Society Publishers
-* The Courage to Be Disliked; Ichiro Kishimi and Fumitake Koga; Audiobook
-* Digital Minimalism; Cal Newport; Portofolio Penguin
-* The Obstacle Is The Way; Ryan Holiday; Profile Books Ltd
-* The Complete Software Developer's Career Guide; John Sonmez; Unabridged Audiobook
+* Never Split the Difference; Chris Voss, Tahl Raz; Random House Business
+* Soft Skills; John Sommez; Manning Publications
+* The Bullet Journal Method; Ryder Carroll; Fourth Estate
+* Getting Things Done; David Allen
+* Coders at Work - Reflections on the craft of programming, Peter Seibel and Mitchell Dorian et al., Audiobook
+* Ultralearning; Anna Laurent; Self-published via Amazon
+* Who Moved My Cheese?; Dr. Spencer Johnson; Vermilion
* Staff Engineer: Leadership beyond the management track; Will Larson; Audiobook
-* Time Management for System Administrators; Thomas A. Limoncelli; O'Reilly
-* Deep Work; Cal Newport; Piatkus
+* Digital Minimalism; Cal Newport; Portofolio Penguin
+* The Good Enough Job; Simone Stolzoff; Ebury Edge
* 101 Essays that change the way you think; Brianna Wiest; Audiobook
-* Getting Things Done; David Allen
+* The Complete Software Developer's Career Guide; John Sonmez; Unabridged Audiobook
* The Power of Now; Eckhard Tolle; Yellow Kite
-* Ultralearning; Scott Young; Thorsons
+* The Courage to Be Disliked; Ichiro Kishimi and Fumitake Koga; Audiobook
+* Solve for Happy; Mo Gawdat (RE-READ 1ST TIME)
* Psycho-Cybernetics; Maxwell Maltz; Perigee Books
+* Atomic Habits; James Clear; Random House Business
=> ../notes/index.gmi Here are notes of mine for some of the books
@@ -146,30 +146,30 @@ In random order:
Some of these were in-person with exams; others were online learning lectures only. In random order:
-* Structure and Interpretation of Computer Programs; Harold Abelson and more...;
-* Scripting Vim; Damian Conway; O'Reilly Online
+* The Ultimate Kubernetes Bootcamp; School of Devops; O'Reilly Online
+* Ultimate Go Programming; Bill Kennedy; O'Reilly Online
* AWS Immersion Day; Amazon; 1-day interactive online training
-* 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)
-* Apache Tomcat Best Practises; 3-day on-site training
-* F5 Loadbalancers Training; 2-day on-site training; F5, Inc.
* MySQL Deep Dive Workshop; 2-day on-site training
+* The Well-Grounded Rubyist Video Edition; David. A. Black; O'Reilly Online
* Protocol buffers; O'Reilly Online
-* Cloud Operations on AWS - Learn how to configure, deploy, maintain, and troubleshoot your AWS environments; 3-day online live training with labs; Amazon
-* The Ultimate Kubernetes Bootcamp; School of Devops; O'Reilly Online
* Linux Security and Isolation APIs Training; Michael Kerrisk; 3-day on-site training
-* Developing IaC with Terraform (with Live Lessons); O'Reilly Online
-* Algorithms Video Lectures; Robert Sedgewick; O'Reilly Online
+* Scripting Vim; Damian Conway; O'Reilly Online
+* Cloud Operations on AWS - Learn how to configure, deploy, maintain, and troubleshoot your AWS environments; 3-day online live training with labs; Amazon
+* 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)
* Functional programming lecture; Remote University of Hagen
-* Ultimate Go Programming; Bill Kennedy; O'Reilly Online
-* The Well-Grounded Rubyist Video Edition; David. A. Black; O'Reilly Online
+* F5 Loadbalancers Training; 2-day on-site training; F5, Inc.
+* Structure and Interpretation of Computer Programs; Harold Abelson and more...;
+* Algorithms Video Lectures; Robert Sedgewick; O'Reilly Online
+* Apache Tomcat Best Practises; 3-day on-site training
+* Developing IaC with Terraform (with Live Lessons); O'Reilly Online
## Technical guides
These are not whole books, but guides (smaller or larger) which I found very useful. in random order:
-* Advanced Bash-Scripting Guide
-* How CPUs work at https://cpu.land
* Raku Guide at https://raku.guide
+* How CPUs work at https://cpu.land
+* Advanced Bash-Scripting Guide
## Podcasts
@@ -177,58 +177,58 @@ These are not whole books, but guides (smaller or larger) which I found very use
In random order:
-* Dev Interrupted
+* Modern Mentor
+* The Pragmatic Engineer Podcast
+* Pratical AI
* BSD Now [BSD]
-* The Changelog Podcast(s)
-* Wednesday Wisdom
+* Deep Questions with Cal Newport
* Fallthrough [Golang]
-* Modern Mentor
-* The ProdCast (Google SRE Podcast)
* Maintainable
-* Cup o' Go [Golang]
-* Pratical AI
* Fork Around And Find Out
-* Deep Questions with Cal Newport
-* Backend Banter
-* The Pragmatic Engineer Podcast
+* The Changelog Podcast(s)
+* Cup o' Go [Golang]
* Hidden Brain
+* Wednesday Wisdom
+* Backend Banter
+* The ProdCast (Google SRE Podcast)
+* Dev Interrupted
### Podcasts I liked
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.
+* Modern Mentor
* Ship It (predecessor of Fork Around And Find Out)
-* Java Pub House
-* Go Time (predecessor of fallthrough)
* CRE: Chaosradio Express [german]
+* Go Time (predecessor of fallthrough)
+* Java Pub House
* FLOSS weekly
-* Modern Mentor
## Newsletters I like
This is a mix of tech and non-tech newsletters I am subscribed to. In random order:
-* Ruby Weekly
-* Register Spill
+* Applied Go Weekly Newsletter
* Andreas Brandhorst Newsletter (Sci-Fi author)
+* The Imperfectionist
+* Ruby Weekly
* VK Newsletter
* The Pragmatic Engineer
-* byteSizeGo
-* Changelog News
* Monospace Mentor
-* The Imperfectionist
-* Golang Weekly
-* Applied Go Weekly Newsletter
* The Valuable Dev
+* byteSizeGo
+* Golang Weekly
+* Register Spill
+* Changelog News
## Magazines I like(d)
This is a mix of tech I like(d). I may not be a current subscriber, but now and then, I buy an issue. In random order:
-* Linux User
+* LWN (online only)
* Linux Magazine
+* Linux User
* freeX (not published anymore)
-* LWN (online only)
# Formal education
diff --git a/gemfeed/2026-02-02-tmux-popup-editor-for-cursor-agent-prompts.gmi b/gemfeed/2026-02-02-tmux-popup-editor-for-cursor-agent-prompts.gmi
index 33b829fa..67f93801 100644
--- a/gemfeed/2026-02-02-tmux-popup-editor-for-cursor-agent-prompts.gmi
+++ b/gemfeed/2026-02-02-tmux-popup-editor-for-cursor-agent-prompts.gmi
@@ -79,14 +79,14 @@ And this is how it looks like after sending back the text to the Cursor Agent's
And here is the full script. It is a bit ugly since it's shell (written with Cursor Agent with GPT-5.2-Codex), and I might (let) rewrite it in Go with propper unit tests, config-file, multi-agent support and release it once I have time. But it works well enough for now.
+> Updated 2026-02-02: Script now works on both Linux and macOS; the listing below reflects the latest version.
+
```bash
#!/usr/bin/env bash
set -u -o pipefail
-declare -i LOG_ENABLED=0
-
+LOG_ENABLED=0
log_file="${TMPDIR:-/tmp}/tmux-edit-send.log"
-
log() {
if [ "$LOG_ENABLED" -eq 1 ]; then
printf '%s\n' "$*" >> "$log_file"
@@ -96,17 +96,30 @@ log() {
# Read the target pane id from a temp file created by tmux binding.
read_target_from_file() {
local file_path="$1"
+ local pane_id
if [ -n "$file_path" ] && [ -f "$file_path" ]; then
- sed -n '1p' "$file_path" | tr -d '[:space:]'
+ pane_id="$(sed -n '1p' "$file_path" | tr -d '[:space:]')"
+ # Ensure pane ID has % prefix
+ if [ -n "$pane_id" ] && [[ "$pane_id" != %* ]]; then
+ pane_id="%${pane_id}"
+ fi
+ printf '%s' "$pane_id"
fi
}
# Read the target pane id from tmux environment if present.
read_target_from_env() {
- local env_line
+ local env_line pane_id
env_line="$(tmux show-environment -g TMUX_EDIT_TARGET 2>/dev/null || true)"
case "$env_line" in
- TMUX_EDIT_TARGET=*) printf '%s' "${env_line#TMUX_EDIT_TARGET=}" ;;
+ TMUX_EDIT_TARGET=*)
+ pane_id="${env_line#TMUX_EDIT_TARGET=}"
+ # Ensure pane ID has % prefix
+ if [ -n "$pane_id" ] && [[ "$pane_id" != %* ]] && [[ "$pane_id" =~ ^[0-9]+$ ]]; then
+ pane_id="%${pane_id}"
+ fi
+ printf '%s' "$pane_id"
+ ;;
esac
}
@@ -117,16 +130,25 @@ resolve_target_pane() {
current_pane="$(tmux display-message -p "#{pane_id}" 2>/dev/null || true)"
log "current pane=${current_pane:-<empty>}"
+
+ # Ensure candidate has % prefix if it's a pane ID
+ if [ -n "$candidate" ] && [[ "$candidate" =~ ^[0-9]+$ ]]; then
+ candidate="%${candidate}"
+ log "normalized candidate to $candidate"
+ fi
+
if [ -n "$candidate" ] && [[ "$candidate" == *"#{"* ]]; then
log "format target detected, clearing"
candidate=""
fi
if [ -z "$candidate" ]; then
candidate="$(tmux display-message -p "#{last_pane}" 2>/dev/null || true)"
+ log "using last pane as fallback: $candidate"
elif [ "$candidate" = "$current_pane" ]; then
last_pane="$(tmux display-message -p "#{last_pane}" 2>/dev/null || true)"
if [ -n "$last_pane" ]; then
candidate="$last_pane"
+ log "candidate was current, using last pane: $candidate"
fi
fi
printf '%s' "$candidate"
@@ -192,9 +214,12 @@ validate_target_pane() {
return 1
fi
target_found=0
+ log "validate: looking for target='$target' in all panes:"
for pane in $(tmux list-panes -a -F "#{pane_id}" 2>/dev/null || true); do
+ log "validate: checking pane='$pane'"
if [ "$pane" = "$target" ]; then
target_found=1
+ log "validate: MATCH FOUND!"
break
fi
done
@@ -203,6 +228,7 @@ validate_target_pane() {
echo "Target pane not found: $target" >&2
return 1
fi
+ log "validate: target pane validated successfully"
}
# Send temp file contents to the target pane line by line.
@@ -212,13 +238,18 @@ send_content() {
local prompt_text="$3"
local first_line=1
local line
+ log "send_content: target=$target, prompt_text='$prompt_text'"
while IFS= read -r line || [ -n "$line" ]; do
+ log "send_content: read line='$line'"
if [ "$first_line" -eq 1 ] && [ -n "$prompt_text" ]; then
if [[ "$line" == "$prompt_text"* ]]; then
+ local old_line="$line"
line="${line#"$prompt_text"}"
+ log "send_content: stripped prompt, was='$old_line' now='$line'"
fi
fi
first_line=0
+ log "send_content: sending line='$line'"
tmux send-keys -t "$target" -l "$line"
tmux send-keys -t "$target" Enter
done < "$tmpfile"
@@ -233,6 +264,10 @@ main() {
local tmpfile
local prompt_text
+ log "=== tmux-edit-send starting ==="
+ log "target_file=$target_file"
+ log "EDITOR=$editor"
+
target="$(read_target_from_file "$target_file" || true)"
if [ -n "$target" ]; then
log "file target=${target:-<empty>}"
@@ -249,22 +284,47 @@ main() {
target="$(resolve_target_pane "$target")"
log "fallback target=${target:-<empty>}"
- tmpfile="$(mktemp "./.tmux-edit-send.XXXXXX.md")"
+ tmpfile="$(mktemp)"
+ log "created tmpfile=$tmpfile"
+ if [ ! -f "$tmpfile" ]; then
+ log "ERROR: mktemp failed to create file"
+ echo "ERROR: mktemp failed" >&2
+ exit 1
+ fi
+ mv "$tmpfile" "${tmpfile}.md" 2>&1 | while read -r line; do log "mv output: $line"; done
+ tmpfile="${tmpfile}.md"
+ log "renamed to tmpfile=$tmpfile"
+ if [ ! -f "$tmpfile" ]; then
+ log "ERROR: tmpfile does not exist after rename"
+ echo "ERROR: tmpfile rename failed" >&2
+ exit 1
+ fi
trap 'rm -f "$tmpfile"' EXIT
+ log "capturing prompt text from target=$target"
prompt_text="$(capture_prompt_text "$target")"
+ log "captured prompt_text='$prompt_text'"
prefill_tmpfile "$tmpfile" "$prompt_text"
+ log "prefilled tmpfile"
+ log "launching editor: $editor $tmpfile"
"$editor" "$tmpfile"
- log "editor exited with status $?"
+ local editor_exit=$?
+ log "editor exited with status $editor_exit"
if [ ! -s "$tmpfile" ]; then
log "empty file, nothing sent"
exit 0
fi
+
+ log "tmpfile contents:"
+ log "$(cat "$tmpfile")"
+ log "validating target pane"
validate_target_pane "$target"
+ log "sending content to target=$target"
send_content "$target" "$tmpfile" "$prompt_text"
+ log "=== tmux-edit-send completed ==="
}
main "$@"
diff --git a/gemfeed/2026-02-02-tmux-popup-editor-for-cursor-agent-prompts.gmi.tpl b/gemfeed/2026-02-02-tmux-popup-editor-for-cursor-agent-prompts.gmi.tpl
index 3032b1a7..4a4d6684 100644
--- a/gemfeed/2026-02-02-tmux-popup-editor-for-cursor-agent-prompts.gmi.tpl
+++ b/gemfeed/2026-02-02-tmux-popup-editor-for-cursor-agent-prompts.gmi.tpl
@@ -70,14 +70,14 @@ And this is how it looks like after sending back the text to the Cursor Agent's
And here is the full script. It is a bit ugly since it's shell (written with Cursor Agent with GPT-5.2-Codex), and I might (let) rewrite it in Go with propper unit tests, config-file, multi-agent support and release it once I have time. But it works well enough for now.
+> Updated 2026-02-02: Script now works on both Linux and macOS; the listing below reflects the latest version.
+
```bash
#!/usr/bin/env bash
set -u -o pipefail
-declare -i LOG_ENABLED=0
-
+LOG_ENABLED=0
log_file="${TMPDIR:-/tmp}/tmux-edit-send.log"
-
log() {
if [ "$LOG_ENABLED" -eq 1 ]; then
printf '%s\n' "$*" >> "$log_file"
@@ -87,17 +87,30 @@ log() {
# Read the target pane id from a temp file created by tmux binding.
read_target_from_file() {
local file_path="$1"
+ local pane_id
if [ -n "$file_path" ] && [ -f "$file_path" ]; then
- sed -n '1p' "$file_path" | tr -d '[:space:]'
+ pane_id="$(sed -n '1p' "$file_path" | tr -d '[:space:]')"
+ # Ensure pane ID has % prefix
+ if [ -n "$pane_id" ] && [[ "$pane_id" != %* ]]; then
+ pane_id="%${pane_id}"
+ fi
+ printf '%s' "$pane_id"
fi
}
# Read the target pane id from tmux environment if present.
read_target_from_env() {
- local env_line
+ local env_line pane_id
env_line="$(tmux show-environment -g TMUX_EDIT_TARGET 2>/dev/null || true)"
case "$env_line" in
- TMUX_EDIT_TARGET=*) printf '%s' "${env_line#TMUX_EDIT_TARGET=}" ;;
+ TMUX_EDIT_TARGET=*)
+ pane_id="${env_line#TMUX_EDIT_TARGET=}"
+ # Ensure pane ID has % prefix
+ if [ -n "$pane_id" ] && [[ "$pane_id" != %* ]] && [[ "$pane_id" =~ ^[0-9]+$ ]]; then
+ pane_id="%${pane_id}"
+ fi
+ printf '%s' "$pane_id"
+ ;;
esac
}
@@ -108,16 +121,25 @@ resolve_target_pane() {
current_pane="$(tmux display-message -p "#{pane_id}" 2>/dev/null || true)"
log "current pane=${current_pane:-<empty>}"
+
+ # Ensure candidate has % prefix if it's a pane ID
+ if [ -n "$candidate" ] && [[ "$candidate" =~ ^[0-9]+$ ]]; then
+ candidate="%${candidate}"
+ log "normalized candidate to $candidate"
+ fi
+
if [ -n "$candidate" ] && [[ "$candidate" == *"#{"* ]]; then
log "format target detected, clearing"
candidate=""
fi
if [ -z "$candidate" ]; then
candidate="$(tmux display-message -p "#{last_pane}" 2>/dev/null || true)"
+ log "using last pane as fallback: $candidate"
elif [ "$candidate" = "$current_pane" ]; then
last_pane="$(tmux display-message -p "#{last_pane}" 2>/dev/null || true)"
if [ -n "$last_pane" ]; then
candidate="$last_pane"
+ log "candidate was current, using last pane: $candidate"
fi
fi
printf '%s' "$candidate"
@@ -183,9 +205,12 @@ validate_target_pane() {
return 1
fi
target_found=0
+ log "validate: looking for target='$target' in all panes:"
for pane in $(tmux list-panes -a -F "#{pane_id}" 2>/dev/null || true); do
+ log "validate: checking pane='$pane'"
if [ "$pane" = "$target" ]; then
target_found=1
+ log "validate: MATCH FOUND!"
break
fi
done
@@ -194,6 +219,7 @@ validate_target_pane() {
echo "Target pane not found: $target" >&2
return 1
fi
+ log "validate: target pane validated successfully"
}
# Send temp file contents to the target pane line by line.
@@ -203,13 +229,18 @@ send_content() {
local prompt_text="$3"
local first_line=1
local line
+ log "send_content: target=$target, prompt_text='$prompt_text'"
while IFS= read -r line || [ -n "$line" ]; do
+ log "send_content: read line='$line'"
if [ "$first_line" -eq 1 ] && [ -n "$prompt_text" ]; then
if [[ "$line" == "$prompt_text"* ]]; then
+ local old_line="$line"
line="${line#"$prompt_text"}"
+ log "send_content: stripped prompt, was='$old_line' now='$line'"
fi
fi
first_line=0
+ log "send_content: sending line='$line'"
tmux send-keys -t "$target" -l "$line"
tmux send-keys -t "$target" Enter
done < "$tmpfile"
@@ -224,6 +255,10 @@ main() {
local tmpfile
local prompt_text
+ log "=== tmux-edit-send starting ==="
+ log "target_file=$target_file"
+ log "EDITOR=$editor"
+
target="$(read_target_from_file "$target_file" || true)"
if [ -n "$target" ]; then
log "file target=${target:-<empty>}"
@@ -240,22 +275,47 @@ main() {
target="$(resolve_target_pane "$target")"
log "fallback target=${target:-<empty>}"
- tmpfile="$(mktemp "./.tmux-edit-send.XXXXXX.md")"
+ tmpfile="$(mktemp)"
+ log "created tmpfile=$tmpfile"
+ if [ ! -f "$tmpfile" ]; then
+ log "ERROR: mktemp failed to create file"
+ echo "ERROR: mktemp failed" >&2
+ exit 1
+ fi
+ mv "$tmpfile" "${tmpfile}.md" 2>&1 | while read -r line; do log "mv output: $line"; done
+ tmpfile="${tmpfile}.md"
+ log "renamed to tmpfile=$tmpfile"
+ if [ ! -f "$tmpfile" ]; then
+ log "ERROR: tmpfile does not exist after rename"
+ echo "ERROR: tmpfile rename failed" >&2
+ exit 1
+ fi
trap 'rm -f "$tmpfile"' EXIT
+ log "capturing prompt text from target=$target"
prompt_text="$(capture_prompt_text "$target")"
+ log "captured prompt_text='$prompt_text'"
prefill_tmpfile "$tmpfile" "$prompt_text"
+ log "prefilled tmpfile"
+ log "launching editor: $editor $tmpfile"
"$editor" "$tmpfile"
- log "editor exited with status $?"
+ local editor_exit=$?
+ log "editor exited with status $editor_exit"
if [ ! -s "$tmpfile" ]; then
log "empty file, nothing sent"
exit 0
fi
+
+ log "tmpfile contents:"
+ log "$(cat "$tmpfile")"
+ log "validating target pane"
validate_target_pane "$target"
+ log "sending content to target=$target"
send_content "$target" "$tmpfile" "$prompt_text"
+ log "=== tmux-edit-send completed ==="
}
main "$@"
diff --git a/gemfeed/atom.xml b/gemfeed/atom.xml
index eca73b29..f5c83c78 100644
--- a/gemfeed/atom.xml
+++ b/gemfeed/atom.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
- <updated>2026-02-01T22:27:38+02:00</updated>
+ <updated>2026-02-02T11:03:17+02:00</updated>
<title>foo.zone feed</title>
<subtitle>To be in the .zone!</subtitle>
<link href="gemini://foo.zone/gemfeed/atom.xml" rel="self" />
@@ -101,6 +101,8 @@ bind-key e run-shell -b "tmux display-message -p &#39;#{pane_id}&#39;
<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 with propper unit tests, config-file, multi-agent support and release it once I have time. But it works well enough for now.</span><br />
<br />
+<span class='quote'>Updated 2026-02-02: Script now works on both Linux and macOS; the listing below reflects the latest version.</span><br />
+<br />
<!-- Generator: GNU source-highlight 3.1.9
by Lorenzo Bettini
http://www.lorenzobettini.it
@@ -108,10 +110,8 @@ 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_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>
@@ -121,17 +121,30 @@ log() {
<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">local</font></u></b> pane_id
<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>
+ pane_id=<font color="#808080">"$(sed -n '1p' "</font>$file_path<font color="#808080">" | tr -d '[:space:]')"</font>
+ <i><font color="silver"># Ensure pane ID has % prefix</font></i>
+ <b><u><font color="#000000">if</font></u></b> [ -n <font color="#808080">"$pane_id"</font> ] &amp;&amp; [[ <font color="#808080">"$pane_id"</font> != %* ]]; <b><u><font color="#000000">then</font></u></b>
+ pane_id=<font color="#808080">"%${pane_id}"</font>
+ <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">"$pane_id"</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
+ <b><u><font color="#000000">local</font></u></b> env_line pane_id
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> ;;
+ TMUX_EDIT_TARGET=*)
+ pane_id=<font color="#808080">"${env_line#TMUX_EDIT_TARGET=}"</font>
+ <i><font color="silver"># Ensure pane ID has % prefix</font></i>
+ <b><u><font color="#000000">if</font></u></b> [ -n <font color="#808080">"$pane_id"</font> ] &amp;&amp; [[ <font color="#808080">"$pane_id"</font> != %* ]] &amp;&amp; [[ <font color="#808080">"$pane_id"</font> =~ ^[<font color="#000000">0</font>-<font color="#000000">9</font>]+$ ]]; <b><u><font color="#000000">then</font></u></b>
+ pane_id=<font color="#808080">"%${pane_id}"</font>
+ <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">"$pane_id"</font>
+ ;;
<b><u><font color="#000000">esac</font></u></b>
}
@@ -142,16 +155,25 @@ resolve_target_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>
+
+ <i><font color="silver"># Ensure candidate has % prefix if it's a pane ID</font></i>
+ <b><u><font color="#000000">if</font></u></b> [ -n <font color="#808080">"$candidate"</font> ] &amp;&amp; [[ <font color="#808080">"$candidate"</font> =~ ^[<font color="#000000">0</font>-<font color="#000000">9</font>]+$ ]]; <b><u><font color="#000000">then</font></u></b>
+ candidate=<font color="#808080">"%${candidate}"</font>
+ log <font color="#808080">"normalized candidate to $candidate"</font>
+ <b><u><font color="#000000">fi</font></u></b>
+
<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>
+ log <font color="#808080">"using last pane as fallback: $candidate"</font>
<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>
+ log <font color="#808080">"candidate was current, using last pane: $candidate"</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>
@@ -217,9 +239,12 @@ validate_target_pane() {
<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>
+ log <font color="#808080">"validate: looking for target='$target' in all panes:"</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>
+ log <font color="#808080">"validate: checking pane='$pane'"</font>
<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>
+ log <font color="#808080">"validate: MATCH FOUND!"</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>
@@ -228,6 +253,7 @@ validate_target_pane() {
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>
+ log <font color="#808080">"validate: target pane validated successfully"</font>
}
<i><font color="silver"># Send temp file contents to the target pane line by line.</font></i>
@@ -237,13 +263,18 @@ send_content() {
<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
+ log <font color="#808080">"send_content: target=$target, prompt_text='$prompt_text'"</font>
<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>
+ log <font color="#808080">"send_content: read line='$line'"</font>
<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>
+ <b><u><font color="#000000">local</font></u></b> old_line=<font color="#808080">"$line"</font>
line=<font color="#808080">"${line#"</font>$prompt_text<font color="#808080">"}"</font>
+ log <font color="#808080">"send_content: stripped prompt, was='$old_line' now='$line'"</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>
+ log <font color="#808080">"send_content: sending line='$line'"</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>
@@ -258,6 +289,10 @@ main() {
<b><u><font color="#000000">local</font></u></b> tmpfile
<b><u><font color="#000000">local</font></u></b> prompt_text
+ log <font color="#808080">"=== tmux-edit-send starting ==="</font>
+ log <font color="#808080">"target_file=$target_file"</font>
+ log <font color="#808080">"EDITOR=$editor"</font>
+
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>
@@ -274,22 +309,47 @@ main() {
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>
+ tmpfile=<font color="#808080">"$(mktemp)"</font>
+ log <font color="#808080">"created tmpfile=$tmpfile"</font>
+ <b><u><font color="#000000">if</font></u></b> [ ! -f <font color="#808080">"$tmpfile"</font> ]; <b><u><font color="#000000">then</font></u></b>
+ log <font color="#808080">"ERROR: mktemp failed to create file"</font>
+ echo <font color="#808080">"ERROR: mktemp failed"</font> &gt;&amp;<font color="#000000">2</font>
+ <b><u><font color="#000000">exit</font></u></b> <font color="#000000">1</font>
+ <b><u><font color="#000000">fi</font></u></b>
+ mv <font color="#808080">"$tmpfile"</font> <font color="#808080">"${tmpfile}.md"</font> <font color="#000000">2</font>&gt;&amp;<font color="#000000">1</font> | <b><u><font color="#000000">while</font></u></b> <b><u><font color="#000000">read</font></u></b> -r line; <b><u><font color="#000000">do</font></u></b> log <font color="#808080">"mv output: $line"</font>; <b><u><font color="#000000">done</font></u></b>
+ tmpfile=<font color="#808080">"${tmpfile}.md"</font>
+ log <font color="#808080">"renamed to tmpfile=$tmpfile"</font>
+ <b><u><font color="#000000">if</font></u></b> [ ! -f <font color="#808080">"$tmpfile"</font> ]; <b><u><font color="#000000">then</font></u></b>
+ log <font color="#808080">"ERROR: tmpfile does not exist after rename"</font>
+ echo <font color="#808080">"ERROR: tmpfile rename failed"</font> &gt;&amp;<font color="#000000">2</font>
+ <b><u><font color="#000000">exit</font></u></b> <font color="#000000">1</font>
+ <b><u><font color="#000000">fi</font></u></b>
<b><u><font color="#000000">trap</font></u></b> <font color="#808080">'rm -f "$tmpfile"'</font> EXIT
+ log <font color="#808080">"capturing prompt text from target=$target"</font>
prompt_text=<font color="#808080">"$(capture_prompt_text "</font>$target<font color="#808080">")"</font>
+ log <font color="#808080">"captured prompt_text='$prompt_text'"</font>
prefill_tmpfile <font color="#808080">"$tmpfile"</font> <font color="#808080">"$prompt_text"</font>
+ log <font color="#808080">"prefilled tmpfile"</font>
+ log <font color="#808080">"launching editor: $editor $tmpfile"</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">local</font></u></b> editor_exit=$?
+ log <font color="#808080">"editor exited with status $editor_exit"</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>
+
+ log <font color="#808080">"tmpfile contents:"</font>
+ log <font color="#808080">"$(cat "</font>$tmpfile<font color="#808080">")"</font>
+ log <font color="#808080">"validating target pane"</font>
validate_target_pane <font color="#808080">"$target"</font>
+ log <font color="#808080">"sending content to target=$target"</font>
send_content <font color="#808080">"$target"</font> <font color="#808080">"$tmpfile"</font> <font color="#808080">"$prompt_text"</font>
+ log <font color="#808080">"=== tmux-edit-send completed ==="</font>
}
main <font color="#808080">"$@"</font>
diff --git a/index.gmi b/index.gmi
index 536f2eac..53daeba1 100644
--- a/index.gmi
+++ b/index.gmi
@@ -1,6 +1,6 @@
# Hello!
-> This site was generated at 2026-02-01T22:27:38+02:00 by `Gemtexter`
+> This site was generated at 2026-02-02T11:03:17+02:00 by `Gemtexter`
Welcome to the foo.zone!
diff --git a/uptime-stats.gmi b/uptime-stats.gmi
index e86a468f..bf32d396 100644
--- a/uptime-stats.gmi
+++ b/uptime-stats.gmi
@@ -1,6 +1,6 @@
# My machine uptime stats
-> This site was last updated at 2026-02-01T22:27:38+02:00
+> This site was last updated at 2026-02-02T11:03:17+02:00
The following stats were collected via `uptimed` on all of my personal computers over many years and the output was generated by `guprecords`, the global uptime records stats analyser of mine.