We are excited to announce the release of Hoot 0.10.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.9.0 release back in May.
Use Hoot in the upcoming Lisp Game Jam!
On Friday (October 30th 2026), the autumn 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
For more inspiration, here are some games made with Hoot for past jams:
Now, onto the release notes!
Compiler changes
- Added module name to contextualize duplicate import errors.
- Added support for library versioning for R6RS compatibility.
- Fixed default version for
define-modulelibraries. - Fixed
locate-librarynot respecting configured load extensions. Previously, we were using Guile's load extension parameter instead of Hoot's own.
Runtime changes
- Added
%struct-refand%struct-set!primitives for accessing record types defined using the interpreter. - Stopped raising errors when importing an undefined symbol in the runtime module system. Guile is lax about this so Hoot being strict caused compatibility issues.
- Fixed optional argument parsing in
primitive-eval. - Fixed keyword argument parsing for procedures with both optional and
keyword arguments in
primitive-eval. - Fixed error messages regarding runtime module registry to include
the correct CLI flag:
-fruntime-modules.
Scheme changes
- Added partial implementation of SRFI-13: String Libraries. It's just a set of re-exports, very similar to Guile, but Guile's SRFI-13 module is not declarative and is thus rejected by Hoot's compiler.
- Added partial implementation of SRFI-60: Integers as Bits.
- Added
define-macro,defmacro,delete,list->symbol, andsymbolto(guile). - Exported
define-syntax-parameterandsyntax-parameterize,symbol-append,integer-length, andgensymfrom(guile). - Added
list->bitvectorandbitvectorto(hoot bitvectors)and re-exported them in(guile). - Implemented
get-bytevector-allin(rnrs io ports). - Made
bytevector=?a publicly exported procedure from(hoot bytevectors)and(rnrs bytevectors). - Added
define-syntax-parameterandsyntax-parameterizeprimitives. - Improved
(ice-9 exceptions)exports to more closely match Guile. - Added
(rnrs)module. - Added
(rnrs base)module. - Added
(rnrs syntax-case)module. - Added
(rnrs r5rs)module. - Added
(rnrs hashtables)module. - Added
(rnrs files)module. - Added
(rnrs enums)module. - Added
(rnrs exceptions)module. - Added
(rnrs arithmetic fixnums)module. - Added
(rnrs records inspection)module. - Added
(rnrs records procedural)module. - Added
(rnrs records syntactic)module. - Added
(rnrs io simple)module. - Added
(rnrs io ports)module. - Added
port-has-position?to(hoot ports)for R6RS compatibility. - Added stubs for centered division to
(hoot numbers)and a stub forinteger-lengthto(hoot bitwise)for R6RS compatibility (eventually). - Rewrote
(rnrs bytevectors)as an R6RS module with version(6). - Fixed
number->stringto round floating point decimal part to an even digit. - Fixed
number->stringfor floating point numbers ±2^N, where 52 <= N <= 1023. - Fixed incorrect bytevector copy in
number->stringfloating point conversion algorithm. - Fixed
min/maxmacros not working when given zero arguments. - Fixed the parameters to the
logprocedure in(guile). - Fixed the implementation of
negateinguile. It was doing entirely the wrong thing.
CLI changes
- Port numbers are now validated to be exact integers in the range [1, 65535].
- Actually complain about invalid option or unknown subcommand. Previously, the code that was supposed to do this was unreachable.
- Add
--experimental-wasm-exnreffeature flag when runninghoot compile --run=nodefor continued compatibility with supported NodeJS versions that don't have the new Wasm exnref feature enabled by default. - Fixed build-time disabling of
hoot server. In past releases, thehootCLI script would still attempt to load should-be-optional libraries that./configurehad already determined to be missing. Thanks to mcc for discovering this blunder.
Documentation changes
- Improved instructions in "Building from source" section of the manual.
- Dependencies are now mentioned in the "Advanced path" section of the
README. - Updated project template
READMEto say Guix is not required (though it's still the easiest option).
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.10.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 Z572, stdh, Walter Lewis, and Jelle Licht for their contributions to this release.
Until next time, happy hooting! 🦉
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
- Nerine Pekowsky
- Serra Allgood
Silver tier
- Austin Robinson
- Brit Butler
- Charlie McMackin
- Dan Connolly
- Deb Nicholson
- Diana Thayer
- Eric Bavier
- Eric Schultz
- Evangelo Stavro Prodromou
- Evgeni Ku
- Glenn Thompson
- James Luke
- Jonathan Smith
- Jonathan Wright
- Justin Sheehy
- Matt Panhans
- Michel Lind
- Mike Ledoux
- Moto A
- Nathan TeBlunthuis
- Nia Bickford
- Noah Beasley
- Steve Sprang
- Travis Smith
Bronze tier
- Alan Zimmerman
- Aria Stewart
- Ben Hamill
- Benjamin Grimm-Lebsanft
- Brooke Vibber
- Brooklyn Zelenka
- Carl A
- Crazypedia No
- Ellie High
- François Joulaud
- Gabor Udvari
- Grant Gould
- Gregory Buhtz
- James Smith
- Jason Wodicka
- Jeff Forcier
- Marty McGuire
- Mason DeVries
- Michael Orbinpost
- Neil Brudnak
- Nelson Pavlosky
- Philipp Nassua
- Rodion Goritskov
- Ron Welch
- Stefan Magdalinski
- Stephen Herrick
- Steven De Herdt
- Tamara Schmitz
- Thomas Talbot
- William Murphy
- a b
- chee rabbits
- r g
- terra tauri