The FREE stack, ring by ring — what I trust, and inside each ring, the layers it lands in.
Rings
Layers
- Languages15
- Frameworks & UI10
- ️ Data & Storage7
- ️ Tools & Environment20
- Platforms & Delivery7
- ️ Practice & Craft11
Each blip links to the entry it stands for; the full catalogue is below, under the rings it belongs to. On a narrow screen the drawing is wider than the page, so it pans.
The rings #
- Adopt
- proven in daily work, and the default for anything new.
- Trial
- running on real projects, not yet a default.
- Assess
- worth a prototype, and no commitment yet.
- Deprecate
- actively discouraged for new work.
A name in parentheses — (new), (moved in), (moved out) — says what changed
since the last revision; a note after a dash says why.
What FREE means #
- F — Functional
- declarative, predictable systems with clear effects.
- R — REPL
- code evaluated on the running system, with no write-compile-test lag.
- E — Extensible
- a stack built to scale into flexible, extensible systems.
- E — Environment Control
- the whole lifecycle under my own control: no hidden telemetry, no paywalls, one-command self-hosting.
✅ Adopt #
🧬 Languages #
- Guile Scheme and Lisps in general
- Emacs Lisp
- JavaScript (vanilla)
- Rust
- C (new) — the two desktop apps, LambDock and Heks Toon, are C with GTK4 around a Guile engine, and nothing above them needs a heavier language
🎨 Frameworks & UI #
- GNU Artanis
- GTK4 Libadwaita
- Olive CSS for all serious web projects (utility class vanilla CSS)
- Hygguile UI components (batteries included Guile Scheme UI framework built on Olive CSS)
🗃️ Data & Storage #
- SQLite
- PostgreSQL
- Plain SQL queries
- Hetzner Storage Volumes with Cron-job based backups and rsync
- Mutastructura (new) — migrations decreed as Lisp and applied incrementally, so a schema change is a file in the repo rather than a script someone ran once
🧰️ Tools & Environment #
- GNU Guix
- Emacs
- Org mode
- Maak build tool and command runner
- Veritas test framework (idiomatic unit, integration and black-box testing framework powered by Lisp - Guile Scheme)
- Scriba structured logging framework (modular log routing, formatting, and filtering, allowing developers to generate human-readable console logs during development and machine-readable logs for production environments)
- Woodpecker CI/CD — the CI that replaced the Jenkins pipelines I used to maintain
- Nix Flakes
- Nix dev shells
- Meson and Ninja (new) — what builds the C desktop apps, with Maak driving the steps around it
- Sift (new) — the Lisp formatter, linter and language server that never loses a byte; every Scheme repo of mine is linted through it
- Byggsteg (new) — pipelines described as a list in Lisp, and the CI that runs them
🌐 Platforms & Delivery #
- Custom low-power green VPS (Hetzner)
- Codeberg — free software’s own forge, and the home of every project of mine
- Docker images as the delivery unit (new) — every repo builds one and a compose file brings the stack up, so the server needs a container runtime rather than a list of install steps
⚙️ Practice & Craft #
- Authorization and Authentication with Bewaking tokens as cookies
- Guix Manifests
- Guix dev shells
- Hexagonal architecture / ports and adapters (moved in) — the boundary earns its keep wherever the domain is the complicated part; the Hexagon of Doom is the case where it is not
- A Guix manifest and a Nix flake in the same repo (new) — the toolchain described twice, so either package manager opens a shell that matches the build
🧪 Trial #
🧬 Languages #
- Guile embedded in C and GTK4 (moved in) — the dock Wayland was waiting for, with a Lisp engine inside a native app
- Kotlin (new) — symbanta, where the JVM’s libraries and compile-time checks pay for the ceremony
- Python (new) — the icon tooling (icns2linux, skeu-icons), where Pillow and numpy do the work
🎨 Frameworks & UI #
- Spring Boot (new) — symbanta’s HTTP layer: validation, security, JPA and Actuator out of the box, at the price of a framework that decides a great deal for you
- React 19 with Vite (new) — symbanta’s dashboard, and the one place a client-side framework still earns its keep; everything new is server-rendered
🗃️ Data & Storage #
- Flyway (new) — migrations for symbanta’s PostgreSQL, versioned beside the code that reads those tables
🧰️ Tools & Environment #
- Podman (moved in) — daemonless, root-less containers that stay under my own control
- Hyprland (moved in) — the Wayland compositor I actually use daily, after SwayFX taught me compositor scripting
- DeepSeek (new) — an LLM I keep on a short leash: it drafts and reviews, a human decides, and nothing it writes ships unread
- Maven with its wrapper (new) — what the one JVM project needs; Maak still drives everything around it
- OpenAPI as the contract (new) — guile-openapi-generator on the Scheme side and orval on the dashboard’s, so neither hand-writes the other’s types
🌐 Platforms & Delivery #
- Self-hosted Woodpecker runners on the same VPS (moved in) — CI that never leaves infrastructure I control
⚙️ Practice & Craft #
- Server-side rendering over client-side JavaScript (moved in) — pages that work before, and without, a megabyte of framework
- This very site as a single Org tree (moved in) — prose, build script and metadata in one plain-text source
- Parsing Expression Grammar in Scheme with
(ice-9 peg)(moved in) — how OrgWebAlchemy turns Org into HTML without a parser generator - Testcontainers and Kotest (new) — the JVM suite runs against a real PostgreSQL in a container, beside the fast tests
🔍 Assess #
🧬 Languages #
- Guile Hoot — Scheme compiled to WebAssembly
- Zig
- Hare
🧰️ Tools & Environment #
- Forgejo — a self-hosted forge for code I want to keep closer than Codeberg’s public instance
- Guix Home — one declarative description of the machine I actually work on
🌐 Platforms & Delivery #
- Guix System images on AArch64 (moved in) — a machine I can describe, build and roll back, on hardware that is not x86
- Guix System as the whole server, not just the toolchain
⚙️ Practice & Craft #
- Property-based testing — describing the invariant instead of the example
- Reproducible CI with `guix time-machine`
🗑️ Deprecate #
🧬 Languages #
- Haskell (moved out) — as beautiful and powerful as it is, it’s simply too complex for 9/10 use-cases
- Scala
- Common Lisp — rather use Scheme if possible
- TypeScript
🎨 Frameworks & UI #
- Svelte
- Servant (Haskell), API as a type
- ZIO (Scala)
- Tailwind CSS (new) — the dashboard’s utility classes; Olive CSS says the same things with no build step
🗃️ Data & Storage #
- MySQL
🧰️ Tools & Environment #
- Jenkins (moved out) — shared-library pipelines and Groovy DSLs, traded away for a thinner agent
🌐 Platforms & Delivery #
- Amazon AWS