The Applied Go Weekly Newsletter logo

The Applied Go Weekly Newsletter

Subscribe
Archives
October 12, 2025

Literate Scripting • The Applied Go Weekly Newsletter 2025-10-12

AppliedGoNewsletterHeader640.png

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:

Atuin settings: add a custom script interpreter with name Go and shell command /opt/homebrew/bin/yaegi run -e

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.

A runbook with a template variable block, a script block calling Yaegi, and a block to display the output

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.

Check it out.


Christoph Berger IT Products and Services
Dachauer Straße 29
Bergkirchen
Germany

Don't miss what's next. Subscribe to The Applied Go Weekly Newsletter:
https://c.im/@chris… LinkedIn
Powered by Buttondown, the easiest way to start and grow your newsletter.