Get rich slow with Guile and Guix

Guix Social

2024-06-18

https://dthompson.us

Hi!

  • I'm David Thompson
  • From Massachusetts, USA
    • The birthplace of Scheme and Free Software
  • CTO at Spritely Institute
  • Guile/Guix user and contributor for over 10 years

tl;dr

  • 2012: Discovered Scheme then started using Guile
  • 2013: Became an early Guix contributor
  • 2015-2017: Made my own tools/libraries with Guile
  • 2022-now: Making FOSS full-time

2012: Libreplanet

In hindsight, the most defining moment in my career path:

  • Yukihiro Matsumoto: "How Emacs Changed My Life"
  • Christine Lemmer-Webber: GNU MediaGoblin

2012: Libreplanet

  • Immediately dropped Vim for Emacs
  • Started to use/hack on MediaGoblin

2012: Ruby

  • First professional development job writing Ruby
  • Relevant to Guix, eventually

2012: Game dev

  • Wanted to make games as a hobby
  • Went the C core with embedded "scripting" language route
  • Started with Lua, but then…

2012: SICP

2012: Guile

  • "official" GNU extension language
  • I was into GNU at the time
  • Can extend C programs… but at what cost?

2013: First FOSS patch

  • Like many, I struggled to find a way to participate in FOSS development
  • GNU MediaGoblin turned out to be very welcoming!
    • Issue tracker had "bitesized" tag for newcomers
    • I added an option to enable/disable comments

2013: Guix

  • I hadn't heard of Nix, but this new Guix thing by Ludovic Courtès looked fascinating
  • Started before the distro was bootstrapped
  • Switched from Debian to Guix later

Why Guix?

  • Functional package management model
  • Practical software freedom
  • Whole-system rollback
  • Easy development environments

Extend vs. Embed

  • Nix embeds Bash into package recipes
  • Guix uses Guile all the way down (almost)
  • Scheme isn't icing on top of C++/Bash
    • Scheme is the cake

2013: Guix contributor

  • First Guix patch: Packaged libtheora
  • Packaged SDL, SDL2, etc. shortly after
  • Ludo gave me commit access!

2013: Guile contributor

  • First patch to Guile: alist->hash-table
  • Worked on (system repl coop-server) with Mark Weaver

2014: Ruby build system

  • Wrote (guix build-system ruby) and initial Ruby packages
  • Pjotr Prins was involved in this, too

2014: guix environment

  • Wanted something like nix shell
  • Would become guix shell later
  • Did not achieve consensus on sane defaults
    • Remember --ad-hoc?
  • guix shell corrected the problems, eventually

2015: guix publish

  • Guix wanted to encourage more substitute providers
    • but Hydra was a large piece of software
  • I wrote the initial version of guix publish
    • Pure Guile; uses the (web ...) modules

2015: guix publish

  • Seems to have been useful over the years
    • but substitute availability is far from a solved problem
  • Distributed substitutes seem like the way to go

2015: call-with-container

  • Learned that there was more to containers than layered disk images
    • Thanks to Docker for "container" ambiguity! 😞
  • The good stuff is actually the runtime environment (Linux namespaces, etc.)
  • Can we implement just the good parts of Docker for Guix?

2015: call-with-container

  • Don't mount opaque disk images of unknown provenance
  • Bind mount /gnu/store directories instead
  • Containment + reproducibility
  • Used in:
    • guix shell --container
    • guix system container
    • containerized Shepherd services

2015: Haunt

  • Static site generator written in Guile
  • Uses guix shell for development environment
  • Guix is the first (only?) distro that gets package updates
  • Both the Guix and Guile websites use Haunt

2016: Oops, I bought a house

  • Who could have imagined this would use up all my free time?
  • Guix contibutions greatly reduced
    • I've never returned to my previous level of activity
    • But the Guix community has grown a lot!
    • I can be a user now (mostly) 👾

2017: Chickadee

  • After all this time, I still wanted to make games
  • Created Guile-SDL2 along the way
  • Uses guix shell for development, naturally

Chickadee

  • not a wrapper around raylib, etc.
  • Inspired by Guix to maximize usage of Guile
  • Rendering code 100% Scheme (until we hit libGL)
    • Made possible by Andy Wingo's incredible compiler/VM work

2019: guix deploy

  • Wanted an answer to Chef, Ansible, etc.
  • Co-mentored Jakob L. Kreuze with Christine Lemmer-Webber for Google Summer of Code
  • A GSoC project that made it upstream!
  • I now manage my personal server with guix deploy
  • Lots of improvements could be made
    • Any volunteers? 🙂

Intermission: Pandemic

2022: Lisp Game Jam

  • Became co-host of the Lisp Game Jam on itch.io
    • along with Fennel maintainer technomancy
  • This will become relevant shortly

2022: Spritely

  • Spritely is a US 501(c)(3) nonprofit
  • Cofounded by Christine Lemmer-Webber
    • now famous for ActivityPub!
  • Building the next generation of secure, distributed networking infrastructure
  • Object capability security

https://spritely.institute

OCapN: The Object Capability Network

OCapN

  • Open standard for capability-secure networking
  • Pre-standardization phase

https://ocapn.org

My role at Spritely

  • Initially hired as Core Infrastructure Architect
    • now CTO
  • First big project: Distributed debugging

2023: Distributed debugger

How Spritely uses Guix

  • guix shell for development environments
  • guix deploy to manage servers over SSH
  • guix pack -f docker to build CI images
  • Goblins and Hoot releases are immediately published to Guix on release day

Highlight: GitLab CI

I've noticed people asking about this lately:

guix pack -m ci-manifest.scm -C zstd -f docker -S /bin=bin
skopeo copy ...

2023: Hoot

2023: Hoot

  • Hoot is a Scheme-to-WebAssembly compiler
    • with its own toolchain!
    • No emscripten!
  • Scheme in the browser!
  • Lead engineer: Andy Wingo (Guile maintainer)
  • I wrote the Wasm interpreter (wasm vm)
  • Still actively working on toolchain and Scheme implementation

2023: Strigoform

2023: Strigoform

  • My game dev fascination comes full circle!
  • Made for the Autumn Lisp Game Jam
  • One of the first Wasm GC games to be published
  • Built with Hoot 0.1 + some additional stuff from the main branch
  • Largest program built with Hoot at the time

2024: Cirkoban

2024: Cirkoban

  • Made for the Spring Lisp Game Jam
  • Built with Hoot 0.4.1 and a WIP port of Goblins
  • Uses Goblins actors and transactional rollback

The future: guix develop

  • docker compose but for Guix
  • I've wanted this for 10 years!
  • Like guix shell but also spawns a Shepherd
  • Uh oh, another kind of service?

The future: Distributed shepherd

  • Currently funded by NLnet and in development by Juli Sims
  • Shepherd + Spritely Goblins
  • Orchestrate clusters of Guix machines securely!
  • guix deploy over Object Capabilities Network (OCapN)?

The future: Distributed substitutes

The future: Guix, the OCap OS

  • Unified services (no system vs. home split)
  • Reduce ambient authority on Linux
  • Build on call-with-container?

The future: Chickadee + Hoot

  • Native + web builds of Guile games from the same source
  • Need to improve Wasm GC to make this possible

Fin

  • Opportunties come from unexpected vectors
  • Guile and Guix have come a long way!
  • Keep pushing the limits of what Guile can do!
  • Thank you to the Guix Social organizers!

Questions?

https://dthompson.us

https://spritely.institute