A control room for coding agents

Nothing
scatters.

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 | sh

Downloads to a file first, so you can read it before you run it. Nothing is piped into a shell.

4
package formats
0
things to install first
1
command

Ordinary light goes everywhere at once. A laser is the same light, in phase.

The problem

Every extension invents its own interface.

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

Review the auth diffrunning
Migrate the session storedone
Publish the releaseneeds you

The contract

Six kinds of panel. One system.

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.

Run

Rewrite the worker pool

spawned by · session 01a0

phase 3 of 502:47

Work that is happening. Queued, running, paused, done.

Decision

Delete 3 stale branches?

feat/relay-rotate
fix/asar-entry
chore/pin-node

NoYes

Something is waiting on a person.

Stream

Build output

resolved 815 packages

linked 691

built @laser/protocol

built @laser/host

Output as it arrives.

Plan

  1. Read the catalog
  2. Rewrite the resolver
  3. Re-point the workers

Steps, and which one it is on.

Document

+ const runtime = resolveBundled(app)

- const runtime = which("node")

  return spawn(runtime, args)

Something to read, or a diff to approve.

Collection

auth.tspool.tsrelay.tssw.ts+9

Many of something, countable.

Self-contained

One install.
No terminal after it.

Nothing else to install

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.

The same interface on your phone

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.

The relay never sees your work

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.

Every value is yours

Colour, type, size, density, corners, contrast, motion. No component holds a literal — the whole interface is tokens you change in Settings, live.

Install

Paste one line.

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 | sh

Downloads 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

AppImage
runs anywhere, no root
.deb
Debian, Ubuntu
.rpm
Fedora, RHEL
tar.gz
everything else

x86-64 and arm64. The AppImage is statically linked, so it does not want libfuse2.