Literate Scripting • The Applied Go Weekly Newsletter 2025-10-12
Your weekly source of Go news, tips, and projects
Literate Scripting
Hi ,
A compiled language usually isn't designed to be a good scripting language. Go isn't either, but projects like Mage, Yaegi, or bitfield/script reveal a widespread interest to use Go for scripting purposes. How about embedding Go "scripts" into Jupyter Notebook-like documents? I tried it, and it works! (Not surprisingly, as I would otherwise write about something different at this point, right?) More in this week's Spotlight!
–Christoph
Featured articles
How we found a bug in Go's arm64 compiler
Sporadic panics in production are no fun to track down. Cloudflare had no choice. Tracking down the problem, they dug deep into Go scheduler structs and finally discovered a bug in the async preemption mechanism on the arm64 architecture.
Organizing Go tests | Redowan's Reflections
Test organization in Go is intentionally held simple, yet there are a few things to keep in mind to avoid sliding into chaos.
[security] Go 1.25.2 and Go 1.24.8 are released
New Go minor versions available! Go 1.25.2 includes security fixes to archive/tar
, crypto/tls
, crypto/x509
, encoding/asn1
, encoding/pem
, net/http
, net/mail
, net/textproto
, and net/url
, as well as bug fixes to the compiler, the runtime, and the context
, debug/pe
, net/http
, os
, and sync/atomic
packages.
(The set of changes in Go 1.24.8 is nearly identical.)
Podcast corner
Fallthrough | The Failure of Open Source Leadership
When a project fails, blame leadership! No, it's not that simple; especially with open source projects.
Cup o' Go | 🍪 No more all-you-can-eat Cookies
Jonathan and Shay release info about new releases, confer on Go conferences, swagger with new swag, and propose reading proposal updates.
Spotlight: Go as a Scripting Language for Atuin Runbooks
Do you know Jupyter Notebooks? They're a convenient way (primarily intended for scientists) to compose snippets of Python code together with relevant documentation into a single document, runnable right from within the app.
Atuin Desktop is for shell scripts what Jupyter Notebooks is for scientific scripts. You can compose Runbooks from documentation, shell scripts, SQL statements, kubectl get
commands and interactive elements. I came across Atuin just recently (when they announced that Atuin Desktop goes open source) and instantly became curious if I could run Go code as a "shell script" inside a Runbook.
Shell scripts in Atuin work like this: You write shell commands into a "Script" block, and Atuin passes it to a shell or interpreter using them in batch mode, like /usr/bin/bash -c <command>
or /usr/bin/ruby -e <command>
.
Atuin lets you add custom shells or interpreters, so my first thought was to add something like go run
. There is, however, a tiny problem with that: The Go compiler doesn't read from stdin
. It expects to find .go
files in the working directory.
I could, in theory, write a wrapper that does something along these lines:
cat <<EOF | tee /tmp/blah.go | go run /tmp/blah.go
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
EOF
While this could work (I didn't test it), it feels a bit clumsy, and it requires creating a file, which I would want to avoid.
Then I remembered Yaegi, a Go interpreter for scripts (as a command) and for Go plugins (as a library). Yaegi has a REPL mode, as well as a batch mode via yaegi run -e
.
So I tried it!
Step 1: I added Yaegi as a custom script interpreter for Script blocks:
Step 2: I created a Runbook with three blocks:
- One block that sets a variable
- One that runs a
fmt.Println()
statement with the variable as input - And one that displays the output of the script
Between the action blocks, I added documentation blocks to show how Atuin lets you combine code and docs into a single document.
The string passed to fmt.Println()
in the script field might look like a Go template placeholder, but in fact it's an Atuin placeholder. var.user
evaluates to the variable user
defined in the Template Variable block.
It's fun to play with Atuin! Usually, I'd use Taskfile for building CLI commands, but Atuin shines with a convenient UI and treats documentation as a first-class citizen (which, like Jupyter Notebooks, reminds me remotely of Donald Knuth's Literate Programming, an approach to weave documentation and code seamlessly into one document. Literate Programming was clearly ahead of its time, but Jupyter Notebooks and Atuin Desktop are noteworthy interpretations of this approach.)
Atuin Desktop is open source; only the Hub isn't. The Hub powers a paid synchronization service
More articles, videos, talks
Breaking down Go's sync package - mfbmina.dev
Get in sync with sync
. (Yeah, silly pun...)
From Zero to Zero Trust: Securing Microservices with SPIFFE (The Fun Way!)
Inspired by Fortifying gRPC Microservices: Beyond JWT with mTLS and SPIFFE (YT), Ted decided to build his own SPIFFE/SPIRE project for learning and sharing. (SPIFFE stands for Secure Production Identity Framework For Everyone, and SPRIE is SPIFFE's runtime.)
Build an Asteroids Game with Raylib-go | by Tim Little | Oct, 2025 | Level Up Coding
Build a complete Asteroids game in a single article—albeit a quite long one! Web pages have plenty of space, after all...
Projects
Libraries
GitHub - fastschema/qjs: QJS is a CGO-Free, modern, secure JavaScript runtime for Go applications, built on the powerful QuickJS engine and Wazero WebAssembly runtime
Another CGO-free JS engine for Go.
GitHub - ankur-anand/taskwheel: Hierarchical timing Wheel For Go, Manage Millions of timers with O(1), Operations.
Checking queue items for expiration individually doesn't scale well. The Timing Wheel approach can expire arbitrary numbers of items instantly.
Tools and applications
GitHub - timtatt/sift: A lightweight terminal UI for displaying Go tests
Inspect Go unit test results in the terminal—interactively.
Completely unrelated to Go
AI and Home-Cooked Software | Karan Sharma
"An AI can churn out a first draft in a few hours, which gets you surprisingly far. But the devil is in the details, and the last stretch of the journey – handling edge cases, ensuring security, and debugging subtle issues – can stretch into weeks."

Happy coding! ʕ◔ϖ◔ʔ
Questions or feedback? Drop me a line. I'd love to hear from you.
Best from Munich, Christoph
Not a subscriber yet?
If you read this newsletter issue online, or if someone forwarded the newsletter to you, subscribe for regular updates to get every new issue earlier than the online version, and more reliable than an occasional forwarding.
Find the subscription form at the end of this page.
How I can help
If you're looking for more useful content around Go, here are some ways I can help you become a better Gopher (or a Gopher at all):
On AppliedGo.net, I blog about Go projects, algorithms and data structures in Go, and other fun stuff.
Or visit the AppliedGo.com blog and learn about language specifics, Go updates, and programming-related stuff.
My AppliedGo YouTube channel hosts quick tip and crash course videos that help you get more productive and creative with Go.
Enroll in my Go course for developers that stands out for its intense use of animated graphics for explaining abstract concepts in an intuitive way. Numerous short and concise lectures allow you to schedule your learning flow as you like.
Christoph Berger IT Products and Services
Dachauer Straße 29
Bergkirchen
Germany