SmileyOS · bare-metal Rust · 32-bit x86

A tiny OS
for kids who code.

SmileyOS is a bare-metal operating system written from scratch in Rust. It turns old 32-bit PCs into safe, offline coding playgrounds with a real desktop, a real terminal, and Smilium — a tiny built-in language for shell scripts, UI apps and 2D games.

Rusti686v86WebAssembly
Try it right now

Boot SmileyOS in your browser.

The full ISO runs on a real x86 emulator in a single browser tab. No sign-ups, no installs — click boot and you're at the SmileyOS desktop in seconds.

Live demo · powered by v86

Boot SmileyOS in your browser

Runs entirely on your device. Nothing is uploaded. The ISO is ~10 MB plus a 2 MB WebAssembly emulator — after that the OS boots straight onto a virtual 32-bit PC.

32-bit x86 · 256 MB RAM · VGA 640×480 · read-only CD-ROM
Under the hood

A real OS, not a demo.

Kernel, scheduler, filesystem, drivers, GUI stack and shell — all hand-written in Rust. The shell below is the same muscle-memory real developers use every day on Linux and macOS.

Caught on camera

Not a VM. Not a browser demo.
Booting on a real PC.

SmileyOS flashed onto a USB stick, plugged into a 32-bit machine, POST → kernel → desktop. No host OS underneath, no browser tab — just bare metal, a keyboard, and a smile.

Watch on YouTube
100k+
lines of Rust

Kernel, HAL, drivers, Smilium interpreter, GUI — all hand-written.

288
source files

Small, readable modules. You can open any file and understand it.

40+
shell commands

A complete userland: files, processes, themes, apps.

27k+
lines of writing

Five in-progress books. Every snippet here comes from them.

SmileyOS Terminal
smiley@me > pwd
/home/kiddo
smiley@me > ls
games/ snake.smy sprites/ notes.txt
smiley@me > smilium -g snake.smy
▸ starting Snake… press ESC to quit
smiley@me > theme list
mono · neon · sunrise · ocean · forest
smiley@me > help
40 commands available. Try: apps, playground, paint.
smiley@me >

Over 40 commands, all hand-implemented.

Typed into a PS/2 keyboard, parsed by the SmileyOS shell, answered by real kernel syscalls. No cheating, no shelling out — this is the whole userland.

Navigation

Find your way around.

  • pwdShow the current folder.
  • lsList files and folders here.
  • cd <dir>Enter a folder.
  • cd ..Go up one folder.

Files

Read, write, move, delete.

  • cat <file>Print a file to the screen.
  • write <f> <text>Write text to a new file.
  • smile <file>Open the built-in editor.
  • cp · mv · rm · renameCopy, move, delete and rename.
  • find <pattern>Search for files by name.
  • chmod -p <name>Change file or folder permissions.

Folders

Shape your disk.

  • mkdir <name>Create a new folder.
  • rmdir <name>Delete an empty folder.

System

Real OS, real syscalls.

  • uptimeHow long SmileyOS has been running.
  • memoryRAM usage snapshot.
  • ps · kill <pid>List and stop running processes.
  • date · timeCurrent date and clock.
  • reboot · shutdownRestart or halt the machine.

Apps

Launch anything, any time.

  • appsList every installed application.
  • playground [file.smy]Open the Smilium IDE.
  • smilium -s/-g <file>Run a shell or game program directly.
  • calc · paint · filesCalculator, paint app, file manager.
  • snake · breakout · moleBuilt-in games.

Customize

Make it yours.

  • theme <name>Switch the color scheme.
  • theme listSee every available theme.
  • historyReplay your recent commands.
  • resetconfigNuclear reset of all settings.

Type help in the booted OS for the live list — it stays in sync with the kernel.

The Smilium language

A tiny language. Three modes. Endless projects.

Smilium programs start with directives — @core is always on, and you pick one of @shell, @game or @ui to say what kind of program you're building.

Three modes. Three hello-worlds.

The smallest program you can write in each mode — everything else builds from here.

Shell modeHello, Smilium
@core
@shell
 
outLine("Hello, World!");
outLine("Welcome to Smilium!");
Game modeDraw a yellow square
@core
@game
 
func update() {
clearScreen(Colors.black);
fillRect(70, 50, 20, 20, Colors.yellow);
}
UI modeA button in a column
@core
@ui
 
Column main = Column();
Button myButton = Button("Click me!");
main.add(myButton);

Language at a glance.

The whole language fits on one screen — directives, types, control flow, and the keys you'll press in Smilium Playground.

Directives

Pick a mode, opt into features.

  • @coreAlways-on: variables, conditions, loops, functions.
  • @shellText I/O — outLine, in, ask, sleep, rand.
  • @gameDraw frames, keyboard, sprites, full 60 fps loop.
  • @uiDeclarative widgets — Columns, Rows, Buttons, TextField.
  • @systemOptional: files, time, system info.

Data types

Strict typing, friendly errors.

  • number64-bit float. Whole or decimal.
  • stringUp to 32 chars. Use + to concat.
  • booleanStrict true / false.
  • number[]Fixed arrays, up to 16 elements.
  • sprite8×8, 16×16 or 32×32 pixel grid.

Control flow

Familiar C-like syntax.

  • if / elseBranch on any boolean expression.
  • while (…) { }Loop while a condition holds.
  • for (i=0; i<n; i=i+1)Classic counted loop.
  • func name() { }Reusable block; return values allowed.

IDE shortcuts

Playground does the typing for you.

  • TabAutocomplete keyword or expand snippet.
  • F5Run or stop your program.
  • Shift + F5Fullscreen game preview.
  • F4Jump into the built-in lessons.

Ready for the deep end?

Six complete Smilium programs — loops, pixel-art sprites, onClick handlers and a form that saves to disk. Paste any of them into Smilium Playground, press F5, and it runs.

Shell modeGreet the user by name
@core
@shell
 
string name = ask("What's your name? ");
outLine("Hi, " + name + "!");
Shell modeGuess the number, with loops
@core
@shell
 
number secret = rand(1, 10);
number guess = 0;
while(guess != secret) {
guess = inNumber("Guess 1-10: ");
if(guess < secret) outLine("Higher!");
else if(guess > secret) outLine("Lower!");
}
outLine("You got it!");
Game modeMove a square with arrow keys
@core
@game
 
number x = 70; number y = 50;
 
func update() {
if(keyDown("Left")) x = x - 1;
if(keyDown("Right")) x = x + 1;
clearScreen(Colors.black);
fillRect(x, y, 10, 10, Colors.yellow);
}
Game modeDraw a pixel-art sprite
@core
@game
 
sprite smile[8][8] = {
{ 0, 1, 1, 1, 1, 1, 1, 0 },
{ 1, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 2, 0, 0, 2, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 3, 0, 0, 3, 0, 1 },
{ 1, 0, 0, 3, 3, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 1 },
{ 0, 1, 1, 1, 1, 1, 1, 0 } };
 
func update() {
drawSprite(smile, 60, 40, 4);
}
UI modeClickable counter
@core
@ui
 
number count = 0;
 
Column main = Column();
Label display = Label("Count: 0");
Button plus = Button("+1");
 
plus.onClick(func() {
count = count + 1;
display.setText("Count: " + toStr(count));
});
 
main.add(display); main.add(plus);
UI modeTiny form with a text field
@core
@ui
 
Column form = Column();
TextField nameInput = TextField("Your name");
Button submit = Button("Save");
 
submit.onClick(func() {
string name = nameInput.getText();
writeFile("name.txt", name);
});
 
form.add(nameInput); form.add(submit);
Curriculum · work in progress

Read the books.

SmileyOS is a one-person project. The five companion books and 30 interactive lessons below are in active development — every snippet above comes straight from the current drafts.

Lesson book

Language Reference

The complete Smilium teacher's guide — directives, syntax rules, every built-in function with examples.

Beginner

Terminal Guide

Shell commands, file system, aliases, pipes — the same muscle memory real developers use every day.

Ages 8–12

Shell Programming

From "Hello, World!" to mini calculators and quizzes. Conditions, loops and functions explained story-first.

Ages 10–14

Game Development

Draw, animate, collide, and ship a full Snake-clone. Plus 10 complete annotated example games.

Ages 10–14

UI App Development

Columns, Rows, Buttons and TextFields. Build forms, dynamic lists, and a working TODO app that saves to disk.

In the IDE

30 guided lessons

Press F4 anywhere in Smilium Playground. Each lesson is a few lines, a run button, and a small challenge.

Press Tab. Finish the line.

Every keyword and built-in function is Tab-completable in Smilium Playground. Type fo → Tab and you get a full for loop skeleton. Kids ship more code because they type less of it.

Friendly errors, on purpose.

Strict types explained in plain English. Messages like "expected number, got string on line 7" — never a segfault, never a stack trace.

Who it's for

One OS. Three kinds of people.

Kids, 8–14

Safe, offline, distraction-free. From clicking a file to writing a game in a real language — at their own pace, with friendly error messages.

Boot it in your browser

Parents & teachers

A curriculum in a box: one USB stick, an old PC, five in-progress books, 30 lessons, and zero ads, trackers or subscriptions. Everything lives on the machine.

See the books

Curious tinkerers

Anyone who wants to see a real OS running on real hardware — platform abstraction, drivers, a file system and a scheduler, all in one small, readable Rust codebase.

Peek under the hood
Help it grow

Two ways to help SmileyOS ship.

SmileyOS is built by one developer on nights and weekends. Whether you want to fund the next release or run a pilot with real students, there's a path for you.

Donors

Fuel the next release.

Community donations let me pay real illustrators and layout designers so the books get professionally produced — and eventually printed for classrooms. Every coffee goes straight into kernel work, Smilium features and new lessons.

Why we use donations and how it helps.

Teachers

Pilot it in your classroom.

SmileyOS is in active development. If you'd like to pilot it with a small group of students — or just watch it grow — reach out and we'll loop you in. Zero cost, zero tracking, one USB stick per student.