Scuzz is a Scala-inspired language for native CLI, server, desktop, and mobile apps. It compiles to LLVM. Builtin IO is ZIO-shaped. It is not a ZIO port. UI is a Ui effect. Headless, Desktop, and Mobile are real runtimes.
Scuzz is not Scala 3. It is not the JVM. It is not a cats-effect port. Scala Native is a reference, not a dependency. Web is not a current target.
- Language: Scala-inspired subset for CLI, server, desktop, and mobile.
foris the binder (=pure,<-effect). I/O goes throughIO. Dense source aims for Scala-like token efficiency. - Runtime: native LLVM. No VM, no Java, no classpath.
- UI:
Viewis pure. State lives inSignal.Ui.runis the session. Canvas is Skia-shaped. Headless is a peer runtime. - Tooling: one CLI (
scuzz) for build, run, format, check, fuzz, and package. One formatter. One linter (scuzz check).[ui] run --watchis hot reload. - Testing: mutation, fuzz, properties, simulation, and determinism are built in. Oracles live in source. Drivers are oracle-free. Simulation is hermetic. Do not add a third-party harness.
- Batteries: the language and standard kits cover common cases. No ecosystem library sprawl.
Product intent: docs/vision.md. App path: docs/guide.md. Checkout setup: docs/developer-environment.md.
curl -fsSL https://github.com/SeanCheatham/scuzz/releases/latest/download/install.sh | shThe script installs scuzz under ~/.local/share/scuzz. It puts a wrapper at ~/.local/bin/scuzz. Put that bin dir on PATH:
export PATH="$HOME/.local/bin:$PATH"Apps need clang and make. Linux [ui] linking also needs zlib and bzip2 (zlib1g-dev libbz2-dev). Pin a release with SCUZZ_VERSION=v0.1.0 on the same curl | sh line. From a checkout, ./scripts/install.sh packages and installs the tree.
scuzz new myapp --ui
cd myapp
scuzz test --update
scuzz test
scuzz run --headless # Desktop: scuzz run
scuzz ide --headless . # bundled editor; Desktop without --headlessinstall.sh --help lists flags and env vars.
A multi-page Desktop app. Radios switch pages with showWhen. Tasks live in a Signal.list and persist through Fs. The window stays open. Close the window to quit. The snippet condenses examples/studio. The full example adds the widget catalog, properties, and drivers.
@main def main: IO[Unit] =
Sys.getenv("SCUZZ_TODO_PATH").flatMap(envPath =>
for {
path = if (Str.len(envPath) == 0) "/tmp/scuzz_studio.txt" else envPath
draft = Signal.str("")
items = Signal.list([])
page = Signal.int(0)
text <- Fs.read(path).handleErrorWith(_ => IO.pure(""))
_ = Signal.setList(items, Tasks.loadList(text))
_ <- Ui.run(_ => View.column(
View.row(View.radio(page, 0, "Home"), View.radio(page, 1, "Tasks")),
View.showWhen(page, 0, View.text("Studio")),
View.row(
View.textField(draft, "item"),
View.button("Add", _ => for {
d = Str.trim(Signal.getStr(draft))
} yield if (Str.len(d) == 0) () else Signal.setList(items, List.append(Signal.getList(items), d)))
),
View.expanded(View.scroll(View.each(items, s => View.row(
View.expanded(View.text(Tasks.itemLabel(s))),
View.button("Del", _ => Signal.setList(items, List.filter(Signal.getList(items), x => x != s)))
)))),
View.button("Save", _ => Fs.write(path, Tasks.saveBody(Signal.getList(items))))
))
} yield ()
)scuzz run examples/studio # Desktop window; close the window to quit
scuzz run --headless examples/studioApache-2.0