SELF-HOSTED · AI-NATIVE

Every branch gets its own dev environment.

Isolated, AI-native workspaces — each with its own filesystem, its own agent session and its own live URL. Your team and its agents work in parallel without ever standing on each other.

Isolated per worktree· A live URL per branch· Claude Code, Codex, Antigravity· Your own server
The workspace board: a task list, its activity feed, and one task in progressEye of HorusNorthport Studio/atlas+ New taskatlasmainnorthport-studio/atlasType a task and press Enter…PlanClaude · Opus (latest)Start →NEEDS YOU2Add search to the customer listCompleted · feat/customer-search · 22h ago↑ PushFix the flaky checkout testIdle · fix/checkout-test · 3d agoWORKING1Rework the onboarding emailsimplementing · 4 files touchedTasks3Open PRs1Branchesfeat/customer-searchrunningfix/checkout-testidleActivityliveHenrik pushedf5165c8— tighten the empty states21h agoAndrew opened a PR onfix/checkout-test1d agoAgent verified 34 checks on64da79d1d ago
One repository fans out into three isolated environments, each with its own live URLrepoatlasworkingfeat/customer-searchcompletedfix/checkout-testPR openfeat/pricing-copylive URLlive URLlive URL
RUNS YOUR AGENTS
Claude CodeOpenAI CodexAntigravity GitHubCoolifyany Docker host
PLATFORM

Everything a team needs, in one box.

Every branch, its own box

Each worktree gets a sandboxed filesystem, its own processes and its own agent session. Nothing leaks between branches — or between the people working on them.

Bring your own agent

Claude Code, OpenAI Codex and Antigravity run inside the environment. Pick the agent and the model per task; the environment underneath stays the same.

A live URL per worktree

Every environment can boot your app and publish it on its own subdomain. Share the branch itself, not a screenshot of it.

You still hold the pen

Nothing merges behind your back. Every change lands as a diff you can read line by line — approve it, push it, or send the agent back with notes.

Keys stay where they belong

GitHub credentials are scoped per team — and per repo when a client owns the remote. The agent pushes to the right place, and only there.

Everything stays in sync

Switch org, repo or branch and the whole interface follows instantly. No stale screens, no refresh, no wondering what you're looking at.

WORKFLOW

A task, start to finish.

Every task boots its own environment, plans before it touches anything, and checks its own work before it asks for yours.

01

Describe it

Type the task in plain words. Plan mode is seeded for you.

02

Own environment

An isolated worktree with its own files, processes and agent session.

03

Agent works

Plans, implements, runs the checks, fixes what it broke.

04

You review

Read the diff, push, open the PR. Or send it back with notes.

An agent working through a task in chat, from request to a verified branchAdd search to the customer listworkingfeat/customer-searchChatReviewGitPreviewPeople should be able to filter the customer listby name and status without a page reload.AGENT · PLAN APPROVEDGot it. I'll add a debounced filter to the customerlist, keep the query in the URL so it survives arefresh, and reuse the existing status chips.⎿ customers/+page.svelte+41-7⎿ lib/customers/filter.ts+64-12⎿ customers.server.ts+88✓ checks clean · 34 tests passinga91c02d filter customer listc4f7b18 debounce the search inputagent is verifying the branch…Reply, @mention a file, or type / for commands…PlanSend →
REVIEW

You still hold the pen.

Nothing merges behind your back. Every change lands as a diff you can read line by line — approve it, push it, open the PR, or send the agent back with notes.

  • File-by-file review with per-commit history
  • Push and open the PR without leaving the app
  • Rebase on main when the branch drifts
Reviewing a diff: the changed files on the left, one reviewed hunk on the rightAdd search to the customer listCompleted↑ Push changesFeedReviewGitFilesApps12 FILESfilter.ts+96-14CustomerList.svelte+41-7customers.server.ts+88+page.svelte+9-8Review all changesapps/web/src/lib/customers/filter.ts@@ -1,41 +1,55 @@export function filterCustomers(rows, query) {- return rows;+ const q = query.trim().toLowerCase();+ if (!q) return rows;+ return rows.filter((row) =>+ row.name.toLowerCase().includes(q));}f5165c8 add filter helper64da79d wire the search input
ISOLATION

One machine. Five people. No overlap.

Every member becomes a real account on the box with their own files, so sharing a server stops meaning sharing a filesystem. It's one container on your own host — your code and your keys never leave the building.

One host, five separate accounts: each member's files and worktrees stay their ownNORTHPORT STUDIO — 5 MEMBERS+ Invitehenrikeoh-henrik · own files · 3 worktreesadminandreweoh-andrew · own files · 2 worktreesmember[email protected]invited · awaiting first sign-inpendingACTIVE WORKTREEShenrik / feat/customer-searchagent workinghenrik / fix/checkout-testneeds reviewandrew / feat/pricing-copyPR openandrew / chore/dep-bumpidleone container · five accountsisolated ✓
A branch's preview app: running, with its build logPreview apps■ Stop allSwebatlas-web-wt42.yourdomain.dev ↗Running[runtime] uploading source…[runtime] building image…[service] starting oven/bun:1.3-alpine[runtime] container is running$ vite build — 157 modules transformed✓ built in 4.21s — preview live
PREVIEW

Every branch gets a live URL.

The environment doesn't just hold the code, it runs it. Click through the branch before it merges — designers, producers and clients see the real thing instead of a description of it.

Open the eye.

No pricing page yet — we're onboarding studios one at a time. Tell us how your team works and we'll walk you through the whole thing.

EYE OF HORUSA NORTHPORT.STUDIO PRODUCT2026