#+TITLE: Get rich slow with Guile and Guix
#+AUTHOR: David Thompson
#+DATE: 2024-06-18 Tue
#+OPTIONS: toc:nil num:nil reveal_title_slide:nil
#+REVEAL_MAX_SCALE: 2
#+REVEAL_MARGIN: 0.075
#+REVEAL_MIN_SCALE: 0.5
#+REVEAL_TRANS: cube
#+REVEAL_THEME: night
#+REVEAL_HLEVEL: 2
#+REVEAL_ROOT: reveal.js
# * To-Do
# ** TODO Fix Christine deadname in old blog post
* 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
#+REVEAL_HTML:
* 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
#+REVEAL_HTML:
- 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
#+REVEAL_HTML:
- 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
#+REVEAL_HTML:
* 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
#+REVEAL_HTML:
* 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:
#+BEGIN_SRC sh
guix pack -m ci-manifest.scm -C zstd -f docker -S /bin=bin
skopeo copy ...
#+END_SRC
* 2023: Hoot
#+REVEAL_HTML:
* 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
#+REVEAL_HTML:
* 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
#+REVEAL_HTML:
* 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
- Using ERIS perhaps?
https://codeberg.org/eris/guile-eris/
* 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