Open-source project
shd101wyy/Yo avatar
shd101wyy/Yo

Yo transpiles to C, ships prebuilt binaries, and still labels itself not ready

Yo - A programming language that's LLM-friendly to write and human-friendly to read

37 stars0 forksShellNOASSERTION

At a glance

What is it?
A compiled, multi-paradigm language with homoiconic syntax, algebraic effects, compile time reference counting and contract verification against a pinned solver. Two practical facts matter more than the feature list: the compiler is a C program, so a C compiler sits on the critical path, and building it needs about 8 GB of memory with no swap.
Who is it for?
Adopt Yo if you want a Lisp shaped language with real compile time guarantees and you are prepared to be an early user: the release line is moving several versions a week and the page still says not ready. Check three things before you commit a team to it.
Can I use it commercially?
Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
Is it still maintained?
Yes. The repository received new commits within the last day.
What is it written in?
Mainly Shell, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 30, 2026, and from our analysis. They are not legal advice.

Editorial analysis

The first line of the page says work in progress, and that is the honest summary

Before any feature is described, the project states its own status in two words followed by a smiley: work in progress, not ready. That placement is deliberate and it should govern how you read everything else on the page. The performance claim is stated in the same breath as the ambition, in the form that the language aims to be simple and fast, with fast quantified as landing somewhere between no measurable difference and about fifteen percent slower than C. The name has a footnote of its own, tracing the word to the Chinese term for pomelo and then to the author's daughter's nickname, and the mascot is a panda hugging a halved pomelo whose segments form the letter shapes of the name. All of that is context rather than capability, and the status line is the part that changes how you should treat the rest.

Homoiconicity is the mechanism behind the readable-to-agents claim

The stated design goal is a language that is friendly to write for a language model and friendly to read for a person, and the feature list names the mechanism that is supposed to deliver it: homoiconicity and metaprogramming, with syntax inspired by the Lisp S expression. The stated benefit is a simple syntax rule that serves both a human reader and an AI. Around that sit two more features of the same kind, first class types and compile time evaluation, which together mean a lot of what a program does is resolved before it runs rather than interpreted. The page is explicit that this list is non-exhaustive, and it points at a separate design document for the reasoning rather than pretending the feature bullets are the argument. The parallel model is named in the same list and is thread per core rather than a work stealing pool, and the build side is a declarative system inspired by Zig and Nix that can also target WebAssembly. Two line counting scripts at the repository root suggest the project tracks its own size, which is a reasonable thing for a language whose stated goal begins with simplicity. For an evaluator, that combination is the thing to look at first, because the LLM-friendly framing is a claim about syntax rather than about tooling.

Memory safety needs an explicit pragma, and there is a command to audit it

The safety story is opt out rather than opt in, and the mechanism is a pragma. User code cannot write undefined behaviour through raw pointers, through foreign function interface calls, or through inline assembly unless it first opts in with an explicit unsafe allowance pragma. Two companion tools make that auditable rather than theoretical: an in place mutation form that takes a name and mutates through it, and a command that reports on the unsafe surface of your program, so a reviewer can ask what has opted out and see the answer. Foreign function interface declarations are structured rather than magical: the include and extern forms evaluate to module values, and you bind, select, rename or glob their members, with a bare declaration meaning the glob and no shadowing between them. Reference counting is handled at compile time with ownership and lifetime analysis, on top of reference types for structs and enums.

One effect system covers async, error handling and resumable control flow

The concurrency and control flow features are not separate mechanisms bolted on, they all come from one algebraic effects and handlers system. The handlers are one shot delimited continuations that are tail resumptive, and the continuation passing style used is documented by reference to evidence passing. Async and await is then described as a builtin effect rather than a keyword layer, which brings a stackless coroutine model and cooperative multitasking, lazy futures, and the ability to await more than once. Single threaded concurrency is described as arriving through a state machine transformation, which is the phrasing that tells you it is a compiler rewrite rather than a scheduler in the runtime. If you are evaluating the language, this is the subsystem to read first, because the same primitives are reused rather than reimplemented for errors, cancellation and structured concurrency.

code
$ yo init my-project        # Scaffold a new project
$ cd my-project
$ yo build run              # Build and run
Hello, world!

Contracts are proved at compile time against a pinned solver

The formal verification feature is not a separate tool in a separate language, it runs during compilation. You write contracts with precondition, postcondition and termination clauses, and you write refinement types that attach a predicate to a type, along with ghost specifications and quantifiers. Those obligations are discharged at compile time against a pinned version of a solver, invoked through a verify command. The failure modes are described concretely, which is what makes this feature assessable: a refuted obligation produces a counter example rather than a generic error, telemetry about solver behaviour is cached, a strict mode gates enforcement, results can be emitted as JSON for tooling, and the language server will show a contract when you hover it in the editor. That last item is the one that decides whether anyone actually uses the feature day to day.

Yo transpiles to C, so a C compiler sits on the critical path

The most consequential line on the installation page is not a language feature. Yo transpiles to C, which means a C compiler is required to produce machine code, so even the quick start path goes through an external toolchain. The install script is described as setting that toolchain up for you, and the platform guides are framed explicitly as being for two other situations: configuring the toolchain by hand, or diagnosing an install that already failed. There is a separate guide for WebAssembly because that target additionally needs Emscripten. The practical consequence for evaluation is that Yo is not a hermetic language. A Yo build inherits the behaviour of whatever C compiler is on your path, and the installer even accepts a compiler override and extra compiler flags, which is a candid admission of that dependency rather than a hidden one.

code
# macOS / Linux
$ curl -sSL https://shd101wyy.github.io/Yo/install.sh | sh
code
# Windows (PowerShell)
> irm https://shd101wyy.github.io/Yo/install.ps1 | iex

The installer takes a prefix, a version, and seven flags that change what it does

The recommended install is a single line piped into a shell, with a matching PowerShell line for Windows, and it fetches a native prebuilt compiler rather than building one. What lands on disk is described precisely: the compiler goes under a library directory inside the chosen prefix, named for the tag that was installed, and one command is linked into the prefix binary directory. The prefix defaults to a dot directory in your home, and passing a system prefix is what triggers privilege elevation. Six other options modify the run: a version flag to pin a release, a from source flag, a compiler override, a compiler flags option, an uninstall flag, and a dry run flag that changes nothing. Two of the compiler options imply the source build rather than being separate switches, which is a small ergonomic decision worth knowing before you assemble a command line.

code
# a specific release, system-wide
$ curl -sSL https://shd101wyy.github.io/Yo/install.sh | sh -s -- --version=v0.2.4 --prefix=/usr/local

# build from source with your own toolchain
$ curl -sSL https://shd101wyy.github.io/Yo/install.sh | sh -s -- -cc=gcc -cflags='-march=native'

NixOS cannot use the prebuilt binary, and building the compiler needs 8 GB

Two constraints are documented in enough detail to plan around. The first is platform coverage. Some platforms have no prebuilt bundle, and the answer there is the source flag, which downloads the release's single file C source and compiles it with your own compiler so the result links against your own C library and loader. The worked example given is NixOS, where the prebuilt binary's hardcoded ELF interpreter path does not exist. The source option has a version floor: releases up to and including an earlier version predate the single file source artifact, so the flag only works on releases made after it, and the installer is described as saying so explicitly rather than failing obscurely. The second constraint is memory. A compiler build fits on an 8 GB machine with a recent enough compiler, peaking at a stated figure measured on Linux, and continuous integration runs the build inside an 8 GB no swap limit on every change.

Editorial conclusion

Adopt Yo if you want a Lisp shaped language with real compile time guarantees and you are prepared to be an early user: the release line is moving several versions a week and the page still says not ready. Check three things before you commit a team to it. Whether your platform has a prebuilt bundle, because NixOS users have to build from source. Whether your machine has the memory, since a compiler build peaks in the gigabytes and continuous integration runs without swap. And which release you pin, because the source install path only exists after a specific version, and older releases differ in both that and their memory appetite.

Frequently asked questions

Does Yo ship prebuilt binaries, and where does the installer put them?

Yes, the recommended install fetches a native prebuilt compiler. It installs under a library directory inside the chosen prefix, named for the installed tag, and links the command into the prefix binary directory, with the prefix defaulting to a dot directory in your home. A version flag pins a specific release and a dry run flag changes nothing.

Why does the Yo installer fail on NixOS, and what is the workaround?

The prebuilt binary carries a hardcoded ELF interpreter path that does not exist on NixOS. Passing the from source option makes the installer download the release's single file C source and compile it with your own C compiler, so it links against your own C library and loader. That option only works on releases made after v0.2.4, which is when the single file source artifact appeared.

How much memory do I need to build the Yo compiler?

The page states that building the compiler fits on an 8 GB machine with a sufficiently recent compiler, that a full build peaks at about 4.3 GiB measured on Linux including the C compiler, and that continuous integration runs it inside an 8 GB no-swap limit on every change. Older releases needed about 10 GB, and compiling your own programs needs far less.

How do I start a first Yo project, and should I?

The quick start is a scaffold command, a directory change, and a build and run command that prints hello world, and the scaffold generates a manifest, a build file, source and tests. Before you rely on it, note that the readme labels the language a work in progress and not ready, the default branch is a development branch rather than a release branch, and three tagged releases landed within four days in late September 2026.

Official sources

  1. Official documentation
  2. Official README
  3. Project repository
  4. Release notes
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/shd101wyy-yo.svg)](https://hysenlabs.com/projects/shd101wyy-yo)