Hoot 0.9.0 released!
Dave Thompson —We are excited to announce the release of Hoot 0.9.0! Hoot is a Scheme to WebAssembly compiler backend for Guile, as well as a general purpose WebAssembly toolchain. In other words, Scheme in the browser!
This release contains new features and bug fixes and since the 0.8.0 release back in February.
Use Hoot in the upcoming Lisp Game Jam!
On Friday (May 15th 2026), the Spring edition of the Lisp Game Jam will begin! It's a 10-day long game jam where participants make games using their favorite flavor of Lisp.
Does making a small web game in Scheme using Hoot sound appealing to you? Well, then we have just the thing to get you started: the Hoot game jam template! This template project has everything you need to start making an HTML5 game with Hoot quickly.
The template repository includes:
-
Bindings to the necessary web APIs to make an interactive game with HTML5 canvas
-
A Makefile for compiling, running a development web server, and generating a .zip bundle for uploading to itch.io
-
A very simple Breakout-like example game that demonstrates how to put all the pieces together
Thanks to contributor Gonzalo Delgado, the game jam template now features gamepad input support!
For more inspiration, here are some games made with Hoot for past jams:
Now, onto the release notes!
Toolchain changes
-
Added the concept of host provided types. Useful for Hoot on Wastrel support.
-
Switched from legacy exceptions to standard Wasm exceptions, which were officially adopted in July 2025 but have been available in browsers for much longer. The
--experimetal-wasm-exnrefflag is passed to NodeJS in case it is old enough to still require this feature flag (which is currently the case for Guix). -
Added support for DWARF custom section.
Compiler changes
-
Replaced function name/source metadata with DWARF.
-
Changed default debug level to 1, which now includes emitting DWARF. For a production build stripped of all debug data, use debug level 0 (
-g0in the CLI) or strip the binary afterwards usinghoot strip. -
Update compiler backend for new primitive bytevector predicates introduced in Guile 3.0.11.
-
Added support for bitvector literals on big endian host systems.
Runtime changes
-
Floating point number to string conversion is now implemented in Scheme rather than relying on an import. This makes binaries slightly bigger but makes it easier to support Hoot on Wastrel and non-JavaScript runtimes generally.
-
Bignum imports have been monomorphized to ease non-JavaScript runtimes (Wastrel, again).
-
Scheme binaries now export a
mainfunction that takes 0 arguments and returns 0 values that invokes the internal$loadfunction. This makes it posible for Wastrel to boot a Hoot program without support for the Scheme reflection interface. -
Added DWARF parser to
reflect.js. -
Removed
fsqrtimport in favor of usingf64.sqrtinstruction.
Scheme changes
-
Range errors now include the range in the exception irritants list.
-
Added
uint8array->bytevectorprocedure to(hoot typed-arrays). -
Vectors are now considered self-evaluating in
(hoot expander). -
Added internal
(hoot module-syntax)module to gather runtime module macros and support code. -
define-record-typenow works in the Scheme interpreter for record types with up to 8 fields. (Supporting more than 8 fields is planned but will require larger changes to the Hoot runtime.)
CLI changes
-
guild compile-wasmhas been deprecated in favor of the newhoot compilesubcommand. Both commands accept the same flags. -
Added
hoot helpsubcommand. -
Added
hoot stripsubcommand to remove debugging information from a Wasm binary. -
Feature flags have been split out from debug options in
hoot compile/guild compile-wasm. For example,-gruntime-modulesis no longer valid; use-fruntime-modulesinstead. The-gflag now exclusively handles debugging data such as whether to emit DWARF or a names section. The-fflag handles things that change program behavior such as whether to include a runtime module system for use with the Scheme interpreter.
Documentation changes
-
Updated manual to use
hoot compileinstead ofguild compile-wasm. -
hoot compile --bundleis now recommended in web deployment section rather than manually copying support files.
Bug fixes
-
The
repl.jsfile missing from 0.8.0 (which brokehoot repl) is now included in the release tarball. Apologies for the oversight! -
Fixed pathologically large function emitted by
lower-globals, which Wasm engines such as Wastrel can struggle with. Instead, many smaller functions are emitted. -
hash-set!,hashq-set!, etc. now return the passed value. This matches Guile's behavior and allows more existing Guile programs to work as expected. -
Fixed bug in parsing zero-length custom sections in Wasm binaries.
-
Fixed validation of
return_call_indirectinstruction. -
Fixed missing EOF handler in REPL meta-command reader.
Browser compatibility
-
Compatible with Safari 26 or later.
-
Compatible with Firefox 121 or later.
-
Compatible with Chrome 119 or later.
Get Hoot
Hoot is available in GNU Guix:
$ guix pull
$ guix install guile guile-hoot
Also, Hoot is now available in Debian, though it will take awhile for this release to make it there.
Otherwise, Hoot can be built from source via our release tarball. See the Hoot homepage for a download link and GPG signature.
Documentation for Hoot 0.9.0, including build instructions, can be found here.
Get in touch
For bug reports, pull requests, or just to follow along with development, check out the Hoot project on Codeberg.
If you build something cool with Hoot, let us know on our community forum!
Thanks to our supporters
Your support makes our work possible! If you like what we do, please consider becoming a Spritely supporter today!
Diamond tier
- Aeva Palecek
- David Anderson
- Holmes Wilson
- Jonathan Frederickson
- Lassi Kiuru
Gold tier
- Alex Sassmannshausen
- Juan Lizarraga Cubillos
Silver tier
- Austin Robinson
- Brit Butler
- Charlie McMackin
- Dan Connolly
- Deb Nicholson
- Eric Bavier
- Eric Schultz
- Evangelo Stavro Prodromou
- Evgeni Ku
- Glenn Thompson
- James Luke
- Jonathan Wright
- Michel Lind
- Mike Ledoux
- Nathan TeBlunthuis
- Nia Bickford
- Noah Beasley
- Steve Sprang
- Travis Smith
- Travis Vachon
Bronze tier
- Alan Zimmerman
- Aria Stewart
- BJ Bolender
- Ben Hamill
- Benjamin Grimm-Lebsanft
- Brooke Vibber
- Brooklyn Zelenka
- Carl A
- Crazypedia No
- Ellie High
- François Joulaud
- Gerome Bochmann
- Grant Gould
- Gregory Buhtz
- Ivan Sagalaev
- James Smith
- Jason Wodicka
- Jeff Forcier
- Marty McGuire
- Mason DeVries
- Michael Orbinpost
- Neil Brudnak
- Nelson Pavlosky
- Philipp Nassua
- Robin Heggelund Hansen
- Ron Welch
- Stefan Magdalinski
- Stephen Herrick
- Steven De Herdt
- Tamara Schmitz
- Thomas Talbot
- William Murphy
- a b
- chee rabbits
- r g
- terra tauri
Until next time, happy hooting! 🦉