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-exnref flag 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 (-g0 in the CLI) or strip the binary afterwards using hoot 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 main function that takes 0 arguments and returns 0 values that invokes the internal $load function. 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 fsqrt import in favor of using f64.sqrt instruction.

Scheme changes

  • Range errors now include the range in the exception irritants list.

  • Added uint8array->bytevector procedure 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-type now 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-wasm has been deprecated in favor of the new hoot compile subcommand. Both commands accept the same flags.

  • Added hoot help subcommand.

  • Added hoot strip subcommand 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-modules is no longer valid; use -fruntime-modules instead. The -g flag now exclusively handles debugging data such as whether to emit DWARF or a names section. The -f flag 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 compile instead of guild compile-wasm.

  • hoot compile --bundle is now recommended in web deployment section rather than manually copying support files.

Bug fixes

  • The repl.js file missing from 0.8.0 (which broke hoot 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_indirect instruction.

  • 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! 🦉