Run
Rewrite the worker pool
spawned by · session 01a0
Work that is happening. Queued, running, paused, done.
A control room for coding agents
Laser runs coding agents across every project on your machine and draws all of them through one interface — the same one that reaches your phone. One command installs it. You never open a terminal again.
$gh api repos/youssefsiam38/laser/contents/install.sh | shDownloads to a file first, so you can read it before you run it. Nothing is piped into a shell.
Ordinary light goes everywhere at once. A laser is the same light, in phase.
The problem
In a terminal the only surface is lines of text, so each package draws its own progress bar, its own prompt, its own idea of what "done" looks like. Put five of them in one window and you have five applications wearing a trench coat.
Laser does not pass presentation through. A package declares what it has — one of six kinds of panel — and Laser decides how it looks and where it goes. A package that has never heard of Laser still renders correctly.
Before — five vocabularies
pi-subagents › ▓▓▓░░ 3/5 workers
[tasks] queued=2 running=1 done=8
*** REVIEW READY (y/n) ***
plan.md · step 2 of 6 · ~4m
notify: build finished
After — one
The contract
A package says which of these it has and how urgent it is. Laser owns where it lands, how big it gets, and what it looks like when it needs you. Panels grow and shrink in place — the same element, never a new one popping in.
Rewrite the worker pool
spawned by · session 01a0
Work that is happening. Queued, running, paused, done.
Delete 3 stale branches?
feat/relay-rotate
fix/asar-entry
chore/pin-node
Something is waiting on a person.
Build output
resolved 815 packages
linked 691
built @laser/protocol
built @laser/host
Output as it arrives.
Steps, and which one it is on.
+ const runtime = resolveBundled(app)
- const runtime = which("node")
return spawn(runtime, args)
Something to read, or a diff to approve.
Many of something, countable.
Self-contained
The app carries its own runtime and its own agent. On a machine that has never had Node, npm, or a coding agent on it, the install is still one line.
Not a companion app with a subset of features. The interface you use at your desk, reaching your phone over a relay that forwards bytes and cannot read them.
It links no crypto library and parses nothing but a channel id. Pairing is a QR code and six words you check on both screens.
Colour, type, size, density, corners, contrast, motion. No component holds a literal — the whole interface is tokens you change in Settings, live.
Install
The repository is private, so the install goes through gh and there is no token to juggle. It verifies the download against a checksum manifest and build provenance before anything is written, installs into your home directory without asking for root, and rolls back if it is interrupted.
$gh api repos/youssefsiam38/laser/contents/install.sh | shDownloads to a file first, so you can read it before you run it. Nothing is piped into a shell.
Re-running it upgrades in place and tells you which version it moved from.--uninstallremoves exactly what it created, and asks before it touches anything you made.
Every format
x86-64 and arm64. The AppImage is statically linked, so it does not want libfuse2.