Goose, in this post, is the programming language by Wouter van Oortmerssen. It is a memory-safe systems language with no heap allocator, no garbage collector, and no lifetime annotations. It compiles a whole program to one C file, so it runs wherever a C compiler does, and it calls C through extern fn. A bundled TinyCC backend can also compile and run a program inside the compiler process, with no separate build. The repo is aardappel/goose. The short site is aardappel.github.io/goose.
That is the language. The name is crowded. If goose --help talks about providers, you installed the AI agent. If goose up migrates a database, you installed pressly/goose. Neither of those is this compiler.
What you actually write
A program starts at fn main. print takes any number of arguments and writes one line. There is no format string.
fn main() {
print("hello, goose");
}
goose hello.goose
That prints hello, goose. Functions are free functions. xs.total() is exactly total(xs). There is no impl and no method table. Dynamic values live on data stacks the compiler assigns. Growth bumps a pointer. Scope exit moves that pointer back. You do not write the stack. You do pick the array spelling, because that spelling is the contract. i64[>..] is the grow-only array. References into it stay valid across push.
The language is young. The tutorial says there is no namespace privacy, no labeled break, and compilation is whole-program. Sockets are not in the standard library yet. Networking is an extern fn when a program needs it. The long version is Goose, by example.
Where it sits next to flisk.sh
Flisk does not scaffold this language. --type backend --language generates Bun, Python, Go, Rust, or Node. Goose is still a language you can run on a Flisk stack, because bring-your-own takes any app that reads PORT, binds 0.0.0.0, and answers /health. That contract is in docs/byo.md. The generator and the container slot are different doors.
The 101 we already published
Read these in order. The series is Goose lang and Flisk.sh 101.
| Part | What it is | Link |
|---|---|---|
| 1 | Two binaries, not one flag | https://dev.to/flisk/goose-lang-and-flisksh-101-two-binaries-not-one-flag-2ngj |
| 2 | Install the compiler and print one line | https://dev.to/flisk/goose-lang-101-install-the-compiler-and-print-one-line-5e04 |
| 3 | One array, one slice, one function | Same. |
| 4 | One service.json, then a health URL |
Flisk.sh 101: One service.json, Then a Health URL |
| 5 | Same repo, different processes | Goose Lang and Flisk.sh 101: Same Repo, Different Processes |
Part 4 uses a generated Go backend on purpose. Part 5 keeps the Goose binary on the host and tells you not to pretend ./total is an HTTP service. Start at part 4 if you already have the compiler. The series list at the top of that post is the path back to hello world.







