Your first app
Let's get Sky running and build something in under a minute.
Install
One command downloads the right binary for your machine and puts it on your
PATH:
curl -fsSL https://raw.githubusercontent.com/anzellai/sky/main/install.sh | sh
This works on macOS, Linux, and Windows via WSL (the Windows Subsystem for Linux). If it can't find a build for your platform, see the README for the manual download and the current list of supported targets.
Check it worked:
sky --version
Once installed, sky upgrade keeps it current.
Create a project
sky init hello
cd hello
sky init scaffolds a tiny project: a sky.toml (project config), a
src/Main.sky (your code), and an AGENTS.md + CLAUDE.md so any AI assistant
already knows how to write Sky here. The generated src/Main.sky looks like:
module Main exposing (main)
import Sky.Core.Prelude exposing (..)
import Std.Log exposing (println)
main =
println "Hello, Sky!"
Build and run
sky run src/Main.sky
You'll see the phased pipeline log (parse → canonicalise → type → lower → Go build) and then:
Hello, Sky!
sky run builds and runs. To just compile, use sky build src/Main.sky (it
produces sky-out/app). To type-check without running, sky check — and in Sky,
sky check is exactly sky build minus running the binary: both compile the
generated Go, so a green check means it really builds.
The edit loop
While developing, keep a watcher running:
sky watch src/Main.sky
It rebuilds and restarts on every save. A warm rebuild is a second or two.
Change something
Edit main to do a little work:
module Main exposing (main)
import Sky.Core.Prelude exposing (..)
import Std.Log exposing (println)
main =
println (String.fromInt (2 + 3 * 4))
Save, and the watcher prints 14. String.fromInt turns the Int into a
String so println can show it — Sky won't silently convert types for you, and
that's a feature we'll come back to.
What just happened
Sky compiled your .sky source to Go, then compiled that Go to a native binary.
You get Go's deployment story — one static binary, no runtime to install — from a
language with no null and no exceptions. The rest of the tour is about the
language you'll write to fill that binary.