A control room for coding agentsNothing
scatters.

Laser is a desktop app for coding agents. It runs them across every project on your machine and draws all of them through one interface. One command installs it. You never open a terminal again. Phone remote control is coming soon.

$curl -fsSLo laser-install.sh https://github.com/youssefsiam38/laser/releases/latest/download/install.sh && sh laser-install.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
runtimes to install
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

Soon

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

Soon

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.

Version 0.1.0 downloads from the public GitHub repository. It verifies the app against a signed checksum manifest and Laser's GitHub build provenance before anything is written. On Ubuntu, Debian, Fedora and related systems it installs the native package, asks for the normal administrator password once, and registers a signed update feed.

$curl -fsSLo laser-install.sh https://github.com/youssefsiam38/laser/releases/latest/download/install.sh && sh laser-install.sh

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

You need curl and GitHub CLI 2.49 or newer. No GitHub account or sign-in is required. Those tools only fetch and verify the release; Laser itself brings everything it runs on.

Future releases appear in your operating system's normal software updater.--uninstallremoves the package and its update source. Use--format appimagefor a no-root per-user install instead.

Every format

AppImage
no-root option
.deb
Ubuntu updater
.rpm
Fedora updater
tar.gz
everything else

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

In short

The whole thing,
without the prose.

Platform
Linux, x86-64 and arm64
Packages
AppImage, .deb, .rpm, tar.gz
Dependencies
None. The app carries its own runtime and its own coding agent.
Install
One command. Native package by default; AppImage when you want no root.
Before it writes
Checks the download against a checksum manifest and build provenance.
If interrupted
Rolls back. Re-running upgrades in place and says which version it moved from.
Removal
--uninstall removes exactly what it created, and asks before touching anything you made.
On your phone · Soon
The same interface, not a companion app with fewer features.
Relay · Soon
Designed to forward encrypted bytes without reading them.
Pairing · Soon
A QR code and six symbols checked on both screens.
Panel kinds
Run, decision, stream, plan, document, collection.
Theming
Colour, type, size, density, corners, contrast and motion are tokens you edit live.