TaijiOS is a modern fork of Inferno® Distributed Operating System, originally developed at Bell Labs and maintained by Vita Nuova® as Free Software (MIT License since 2021).
TaijiOS brings Inferno's powerful distributed computing capabilities to modern systems with updated build tools, C11 compliance, and enhanced platform support.
- Limbo Programming Language - Concise concurrent language compiled to portable Dis bytecode
- Distributed Design - Built-in networking and resource sharing across heterogeneous systems
- Virtual Machine - Run anywhere: native (bare metal) or hosted (Linux, BSD, Windows, macOS)
- Everything is a File - Unified interface to all resources via Styx protocol
- Portable Applications - Write once, run on any supported architecture
- Modern Build System - C11 standard compliance, modern gcc/clang support
- Multi-Platform Support - Native amd64 support for Linux, OpenBSD, 9front, and Plan 9
- 9front Integration - Modern drivers, IP stack, and file system improvements
- NixOS Ready - First-class NixOS integration with reproducible builds
- Enhanced Security - Modern cryptography and security features
- Active Development - Regular updates and bug fixes for contemporary systems
cd /path/to/TaijiOS
# Option 1: Use the universal script (recommended)
./run.sh # Build and run emu in one command
# Option 2: Use nix-shell environment
nix-shell # Enter the build environment
./run.sh # Build and run
# For a clean rebuild
./run.sh --clean # Clean build then runcd /path/to/TaijiOS
chmod +x run.sh
./run.sh # Build and run in one command# Install dependencies first:
# Debian/Ubuntu: sudo apt install build-essential libx11-dev libxext-dev
# Fedora: sudo dnf install gcc make libX11-devel libXext-devel
# Arch: sudo pacman -S base-devel libx11 libxext
cd /path/to/TaijiOS
chmod +x run.sh
./run.sh # Build and run in one commandThe run.sh script works on NixOS, OpenBSD, and generic Linux:
./run.sh # Build and run raw emu (no auto-start)
./run.sh --clean # Clean build then run
./run.sh -h # Show emu help options
./run.sh -g 800x600 # Run with specific geometryThis script:
- Automatically detects your OS (NixOS/OpenBSD/Linux)
- Builds TaijiOS if needed
- Sets up the namespace directory structure
- Runs the raw emu interpreter
Builds and runs with the window manager auto-started:
./run-wm.sh # Build and run with wm/wm.dis
./run-wm.sh --clean # Clean build then run with WMRun any app in its own isolated emu instance with its own X11 window:
./run-app.sh wm/bounce.dis 8 # Run bounce with 8 balls
./run-app.sh wm/clock.dis # Run clockEach instance creates its own emu process and X11 window, completely isolated from others.
When you enter nix-shell, the shell.nix provides:
- Build dependencies: gcc, make, binutils, X11 libraries, linux headers
- Helper functions: Convenience wrappers that run the scripts above
- Environment: Sets PATH for mk build tool and emu binaries
The helper functions in shell.nix are simply wrappers around the scripts:
build9ferno→ runs./run.sh(build portion)run9ferno→ runs./run.shemu→ runs./run.sh(with any arguments passed through)
Run the complete window manager with all apps:
./run.shOnce emu starts, you'll see the ; prompt. You can run Limbo programs:
# Start the window manager
wm/wm
# List available commands
ls /dis
# Run a program
/wm/bounce.dis 8
# Exit
exit
Run any app in its own isolated emu instance with its own X11 window:
# Run bouncing balls with 8 balls
./run-app.sh wm/bounce.dis 8
# Run clock
./run-app.sh wm/clock.dis
# Run multiple instances (each in separate terminal)
./run-app.sh wm/bounce.dis 8
./run-app.sh wm/clock.dis
./run-app.sh wm/bounce.dis 16Each instance creates its own emu process and X11 window, completely isolated from others.
Simple Console App (hello.b):
implement Hello;
include "sys.m";
sys: Sys;
Hello: module {
init: fn(ctxt: ref Draw->Context, argv: list of string);
};
init(ctxt: ref Draw->Context, argv: list of string)
{
sys = load Sys Sys->PATH;
sys->print("Hello from TaijiOS!\n");
}
Compile and run:
cd appl/cmd
mk hello.dis
./run-app.sh hello.disSimple Tk App (mytkapp.b):
implement Mytkapp;
include "sys.m";
sys: Sys;
include "draw.m";
draw: Draw;
include "tk.m";
tk: Tk;
Mytkapp: module {
init: fn(ctxt: ref Draw->Context, argv: list of string);
};
init(ctxt: ref Draw->Context, argv: list of string)
{
sys = load Sys Sys->PATH;
draw = load Draw Draw->PATH;
tk = load Tk Tk->PATH;
# Create window
top := tk->toplevel(ctxt.display, "");
# Add UI
tk->cmd(top, "label .l -text {My App}");
tk->cmd(top, "button .b -text Exit -command {send cmd exit}");
tk->cmd(top, "pack .l .b");
# Wait for exit
cmdch := chan of string;
tk->namechan(top, cmdch, "cmd");
<-cmdch;
}
TaijiOS/
├── Linux/amd64/ # Platform-specific binaries
│ ├── bin/ # Built binaries (emu, limbo, etc.)
│ └── lib/ # Libraries
├── dis/ # Compiled Limbo programs (.dis files)
├── appl/ # Limbo application source code
├── module/ # Limbo module definitions
├── emu/ # Inferno emulator source
├── lib*/ # Library source code
├── shell.nix # NixOS shell environment
├── run.sh # Universal build/run script (full WM)
└── run-app.sh # Run isolated app instances
If you need to do a complete clean build:
# In nix-shell on NixOS
mk nuke # Clean all built files
mk install # Rebuild everythingTaijiOS runs in two modes:
- Runs as an application on top of another OS
- Available for: Linux, FreeBSD, OpenBSD, NetBSD, macOS, Windows
- No reboot required - just run
emu
- Boots directly on hardware
- Available for: x86 (32/64-bit), ARM, PowerPC, SPARC, MIPS
- Full control of hardware with minimal footprint
This was a known issue with X11 threading initialization. Fixed in TaijiOS - if you still see crashes:
# Make sure you have the latest version
git pull
# Rebuild
cd /path/to/TaijiOS
nix-shell
build9fernoWhen you see cd: /usr/username: '/usr/username' does not exist, this is normal. TaijiOS tries to set up a home directory but falls back gracefully.
Make sure you have the required dependencies installed:
Debian/Ubuntu:
sudo apt install build-essential libx11-dev libxext-devFedora/RHEL:
sudo dnf install gcc make libX11-devel libXext-develArch Linux:
sudo pacman -S base-devel libx11 libxextIf you get errors about missing /dis directories:
# Run the full build which creates all needed directories
mk install# Build the app first
cd appl/wm # or wherever the app is
mk bounce.dis
# Then run
./run-app.sh wm/bounce.dis 8# Make sure X11 is running
echo $DISPLAY
# If empty, set it (Linux)
export DISPLAY=:0TaijiOS welcomes contributions! Please see the source repository for guidelines on submitting patches and bug reports.
Based on Inferno OS Fourth Edition by Vita Nuova Holdings:
TaijiOS incorporates enhancements from the 9front community:
MIT License (since 2021)
See individual source files for details.
- Bell Labs for the original Inferno operating system
- Vita Nuova Holdings for releasing Inferno as free software
- The 9front community for continued development and improvements
- All contributors to TaijiOS
TaijiOS - Distributed computing for the modern era.