BOXY

Reference

Patterns

Full page layouts, each shown in the mode that suits it. They all use the same tokens and components. Only the spacing, density and size of display type change from one to the next.

01 / App shell · industrial

Dashboard

A 48px top bar and a 256px sidebar, each separated by a 1px line. Compact density, mono table headers that stick as you scroll, and status shown as a square plus a word.

console.example.com/services
4 healthy us-east-1

Services

6 services across 3 regions

Requests / 24h

2.41M

p95 latency

88ms

Error rate

0.04%

Spend / mo

$1,284

ServiceRegionStatusp95Requests
edge-routerus-east-1Healthy41 ms2,410,882
api-gatewayeu-west-2Healthy88 ms1,092,441
image-proxyap-south-1Degraded612 ms318,204
webhook-fanoutus-east-1Failing—0
cron-workereu-west-2Paused—0

Scroll sideways to see the whole preview at desktop width

02 / Marketing · editorial

Landing

A two-column hero with a 1px line between the columns, a feature grid with shared borders so the section reads as one table, and a single inverted call-to-action band.

orbit.dev
ORBIT
Sign inStart free

Infrastructure

Ship to the edge in one command

310 locations, immutable builds, instant rollback. No YAML, no control plane to babysit.

Start building Read the docs

No credit card · 4,000 free builds

deploy.log
$ orbit deploy
✓ build 1.8s
✓ upload 0.4s
✓ propagate 2.1s
live at orbit.app → 310 pops

02 / Platform

Everything the team needs

Instant rollback

Every deploy is content-addressed. Roll back in under a second.

Edge routing

Requests terminate at the nearest of 310 locations, with failover.

Zero-config TLS

Certificates issued, renewed and stapled with no configuration.

Start shipping in under five minutes

Free for personal projects.

Create account Talk to us

Scroll sideways to see the whole preview at desktop width

03 / Documentation

Docs

Three columns separated by 1px lines. Body text is capped at 68ch, code blocks have a mono strip naming the language, and the active heading gets an accent line.

orbit.dev/docs/routing

Guides / Routing

Routing

Requests are matched against your route table in order. The first match wins, so put specific patterns above catch-alls.

Defining routes

Routes live in orbit.toml at the root of your project.

orbit.toml12 lines
[[routes]]
pattern = "/api/*"
service = "api-gateway"
timeout = 30

[[routes]]
pattern = "/*"
service = "edge-router"

Order matters

A catch-all above a specific pattern will shadow it entirely.

Scroll sideways to see the whole preview at desktop width

04 / Flows

Auth and settings

A 400px sign-in card on a darker background with the grid showing, and a settings page where each row is a cell in one shared grid.

ORBIT

Sign in

Welcome back.

or
Forgot?

No account? Create one

Account / Settings

Settings

General

Auto-scale

Add instances when p95 exceeds 200ms.

Preview deploys

Build every pull request.

Region

Primary write region.

Danger zone

Delete project

Permanent. Requires typing the project name.

05 / AI agent · blueprint

Agent workspace

Sessions on the left, the transcript in the middle, and the agent's plan and changed files on the right. Tool calls are log lines you can expand. The approval request is the only thing in the warning colour. Type in the composer and it streams back a reply.

agent.orbit.dev/s/fix-flaky-webhook
agent/webhook-retry Running · 02:14
Jo Rivera12:02

send.test.ts fails about one run in five on CI but never locally. Find the cause and fix it; do not touch the mock server.

Agentsonnet-5
Thought for 9s

CI-only and intermittent points to timing. CI boots the mock in the same job, so the first request can land before it is ready. If send() has no retry, a single 503 fails the test.

Check the sender first, then reproduce with a cold mock.

4 tool calls5.4s
grep"send(" src/webhooks0.2s
Output · 2 matches
src/webhooks/send.ts:4   export async function send(hook, body)
src/webhooks/queue.ts:31  await send(hook, payload)
read_filesrc/webhooks/send.ts0.1s
Output · 7 lines
export async function send(hook: Hook, body: string) {
  const res = await fetch(hook.url, { method: "POST", body });
  if (!res.ok) throw new WebhookError(hook.id);
  return res;
}
runMOCK_COLD=1 npm test -- webhooks4.8s
Input
{ "command": "MOCK_COLD=1 npm test -- webhooks", "timeout": 60 }
Output · exit 1
FAIL  webhooks/send.test.ts
  ✗ delivers to a cold endpoint
    WebhookError: hook_01H8 (503 Service Unavailable)
Tests: 1 failed, 11 passed
edit_filesrc/webhooks/send.ts  +9 −20.3s
Diff
+ for (let attempt = 0; attempt < 5; attempt++) {
+   const res = await fetch(hook.url, { method: "POST", body });
+   if (res.ok) return res;
+   await sleep(200 * 2 ** attempt);
+ }
- if (!res.ok) throw new WebhookError(hook.id);

Reproduced it. A cold mock returns 503 for roughly 300ms1, and send() throws on the first non-2xx response. I added a bounded retry:

src/webhooks/send.ts+9−2
export async function send(hook: Hook, body: string) {  const res = await fetch(hook.url, { method: "POST", body });  if (!res.ok) throw new WebhookError(hook.id);  for (let attempt = 0; attempt < 5; attempt++) {    const res = await fetch(hook.url, { method: "POST", body });    if (res.ok) return res;    await sleep(200 * 2 ** attempt);  }  throw new WebhookError(hook.id);}
Approval needed · writes to the working tree

Run the full suite 20 times against a cold mock to confirm the fix:

for i in $(seq 20); do MOCK_COLD=1 npm test -- webhooks || exit 1; done
Waiting on you · 12:03:41
↵ send

Scroll sideways to see the whole preview at desktop width

06 / Marketing · editorial

Features and pricing

A feature grid with one wider cell, then pricing laid out as a plain table. The recommended plan gets an inverted header instead of a bigger card. The billing toggle works.

orbit.dev/pricing
Sign inStart free

01 / Platform

Everything between git push and production

01

Deploys you can undo

Every build is immutable and content-addressed. Rolling back is a pointer move that lands in under a second, at every edge location at once.

  • Instant, global rollback
  • Preview URL per pull request
  • 90 days of build history
DeploysFIG. 01
  1. 12:04 · 8f3a1c2

    Live

  2. 11:52 · 2b7d9e0

    Rolled back in 0.8s

  3. 11:40 · c41a0f3

    Superseded

02

310 edge locations

Requests terminate at the nearest location with automatic failover.

03

Zero-config TLS

Certificates issued, renewed and stapled without a line of config.

04

Built-in observability

p50, p95 and error rate per route, kept for 30 days.

05

Cold starts under 5ms

Isolates, not containers. Nothing to keep warm.

02 / Pricing

Pay for what you ship

Billing period

Hobby

$0 /month

Personal projects and experiments.

Start free
  • 1 project
  • 100 GB bandwidth
  • Preview deploys
  • Team members
  • SSO

Team

Recommended

$20 /month

Per member. For teams shipping weekly.

Start 14-day trial
  • Unlimited projects
  • 1 TB bandwidth
  • Preview deploys
  • Up to 50 members
  • SSO

Enterprise

Custom

Volume pricing, SLAs and support.

Talk to sales
  • Unlimited projects
  • Committed bandwidth
  • Preview deploys
  • Unlimited members
  • SAML SSO & SCIM

Compare plans

FeatureHobbyTeamEnterprise
Deploy
Build minutes / month1006,000Custom
Concurrent builds1424
Instant rollback
Security
Audit log30 days1 year
SAML SSO
Uptime SLA99.9%99.99%

Scroll sideways to see the whole preview at desktop width

07 / Support · editorial

Frequently asked questions

A heading column that stays in place as you scroll, next to a numbered accordion that opens one answer at a time. A segmented control filters the questions by category. The section ends with a real person to contact, so readers who don't find their answer still have somewhere to go.

orbit.dev/faq

03 / FAQ

Questions, answered plainly

Can’t find it here? The docs go deeper, and a human answers the rest.

Still stuck?

Median first reply: 38 minutes

Read the docsContact support
Category
01What counts as a build minute?

Wall-clock time from the first build step to the upload finishing, rounded up to the next minute per build. Cached steps that are skipped cost nothing.

02What happens when I go over a limit?

Nothing stops. You get an email at 80% and 100%, and overage is billed at the published rate:

  • Bandwidth: $0.15 per GB
  • Build minutes: $0.01 per minute
03Can I bring my own domain?

Yes, on every plan. Point a CNAME at edge.orbit.app; certificates are issued within a minute and renew on their own.

04Which runtimes are supported?

Node 20 and 22, Bun, Deno and any static output. Set it per project in orbit.toml.

05Where is my data stored?

Build artefacts live in the region you pick at project creation. Logs are kept for 30 days and never leave that region.

06Do you support SSO?

SAML SSO and SCIM provisioning are on the Enterprise plan. Google and GitHub sign-in are on every plan.

6 questions

Scroll sideways to see the whole preview at desktop width

08 / Content · editorial

Blog index and article

The index puts one featured post at the top and the rest in a grid that reads like a table of contents. The article keeps text to 68ch, has a sticky table of contents beside a vertical line, and uses every content component: lists, a blockquote, code, a callout and a figure with a caption.

orbit.dev/blog/p95-is-a-lie

p95 is a lie your dashboard tells you

A single percentile hides the shape of the distribution. Here is what we alert on instead, and the incident that changed our minds.

AEAryan EbrahimpourSep 11, 20268 min read

One Tuesday in July our p95 latency looked perfect: 88ms, flat all afternoon. Meanwhile 4% of checkout requests were timing out. The dashboard was right about p95, but p95 was the wrong thing to be watching.

The shape matters

A percentile is one point on a curve. Two very different services can share a p95:

  • A tight distribution with a clean tail
  • A bimodal one, where a slow path serves a few percent of traffic
  • A healthy body with a cliff at p99.5 that a p95 never sees

We were not measuring the service. We were measuring one number the service happened to produce.

What we alert on instead

We now keep a full histogram per route and alert on the share of requests over budget, which is closer to what a user feels. The query is short:

alert.sqlsql
SELECT route,       count_if(latency_ms > budget_ms) / count(*) AS over_budgetFROM requestsWHERE ts > now() - INTERVAL '5 minutes'GROUP BY routeHAVING over_budget > 0.01;

Budgets are per route

Checkout gets 300ms, image resizing gets 2s. One global budget recreates the p95 problem.

Results

  1. Pages per week fell from 14 to 3
  2. Every remaining page mapped to user-visible impact
  3. Median time to detect dropped from 11 to 2 minutes
Histogram · checkout · Jul 14
FIG. 01 / The second mode at 4.2s is invisible at p95
observabilityalertingsre

Scroll sideways to see the previews at desktop width

09 / Analytics · industrial

Dashboard with charts and a team view

Filters sit in one row above everything they affect, with the date range first. Below them are KPI tiles with sparklines, a line chart with two series (the comparison line is gray and dashed, so it still reads in greyscale), a bar chart labelled on the bars, and a team table with workload meters and row menus. Hover over the charts or step through them with the arrow keys.

console.orbit.dev/acme/insights

Insights

Traffic and team

Click start, then end
Environment

Requests

14.2M

▲ 12.4% vs prev 7d

p95 latency

88ms

▼ 4ms vs prev 7d

Error rate

0.12%

▲ 0.03pp vs prev 7d

Spend

$1,284

64% of $2,000 budget

Requests per day

Millions · UTC
This periodPrevious period
Requests per day, millions
DayThis periodPrevious
Sep 191.81.6
Sep 201.61.5
Sep 211.71.4
Sep 222.11.8
Sep 232.31.9
Sep 242.22.0
Sep 252.51.9

Requests by region

Millions
Busiest region highlighted
Requests by region, millions
us-east5.8
eu-west4.1
ap-south2.2
us-west1.5
sa-east0.6

Team · on-call workload

14 members
MemberRoleWorkloadPages 7dStatusActions
MKMina Kato
Lead
3On call
JRJo Rivera
Admin
11Overloaded
AOAda Okafor
Member
7High
SLSam Lee
Member
1Off rota

Activity

View all
  1. 12:31 · webhook-fanout

    Error rate above 1%

    Paged Jo Rivera

  2. 12:04 · edge-router

    Deploy succeeded

  3. 11:58 · people

    Sam Lee joined the rota

  4. 09:12 · billing

    Budget alert at 60%

Scroll sideways to see the whole preview at desktop width

10 / Documentation · blueprint

Docs site with a nested tree

Sidebar sections have mono headings on darker strips, and groups open three levels deep along drawn tree lines. The article has a breadcrumb, a tab for each package manager, a parameter table, an accordion for options you rarely need, and previous and next links. The version switcher is a menu.

orbit.dev/docs/networking/routing/rewrites

Rewrites

A rewrite serves a different path than the one requested, without changing the URL the visitor sees.

Install the SDK if you want to define rewrites in code rather than in orbit.toml:

terminal
npm install @orbit/sdk

Regex captures

Patterns may use named groups. Each group is available in the destination as :name.

orbit.tomltoml
[[rewrites]]source      = "/blog/(?<slug>[a-z0-9-]+)"destination = "/posts/:slug.html"status      = 200

Parameters

KeyTypeDefaultDescription
sourcestring—Path or regex to match. Required.
destinationstring—Path to serve instead. Required.
statusnumber200Response status to send.

Rewrites run after redirects

A redirect that matches first will win. Check matching order.

Advanced

Rewriting to an external origin

Set destination to a full URL. Orbit proxies the request and streams the response back; caching headers from the origin are respected.

Preserving the query string

Query strings are forwarded by default. Set query = "drop" to strip them.

Limits
  • 1,024 rewrites per project
  • Patterns up to 4 KB
  • No lookbehind in regex
Last updated Sep 22, 2026 Edit this page

Scroll sideways to see the whole preview at desktop width

11 / Storage · industrial

File browser

A folder tree, a breadcrumb that doubles as the path, and a table you can right-click. The right-click menu repeats the actions in each row's overflow menu, which stays visible. Drop files on the dashed area to add them to the upload tray.

console.orbit.dev/acme/storage/assets
1,204 objects · 12.8 GB
View
Name ▲TypeSizeModifiedActions
fonts/
Folder—Sep 21
img/
Folder—Sep 24
app.4e2c.css
text/css48.2 KB12:04
app.91bf.js
text/javascript212.6 KB12:04
hero.avif
image/avif1.4 MBSep 19
robots.txt
text/plain112 BAug 02

Uploads

2 of 3 done
  • svg

    logo-mark.svg

    4.1 KB

    Done
  • woff

    inter-var.woff2

    312 KB72%

    Uploading

Scroll sideways to see the whole preview at desktop width

12 / Status · editorial

Status page

Each component gets 90 square cells, one per day, which is the most literal use of the grid anywhere in the system. Every cell has its own tooltip, every state has both a colour and a word, and incidents are listed newest first.

status.orbit.dev
Degraded performance in ap-south-1 Updated 12:40 UTC

Components · last 90 days

OperationalDegradedOutage

Edge network

Operational
90 days ago99.99% uptimeToday

Builds

Operational
90 days ago99.91% uptimeToday

ap-south-1

Degraded
90 days ago99.95% uptimeToday

Dashboard & API

Operational
90 days ago100.00% uptimeToday

Incident history

  1. Sep 25 · 12:14 UTC · Monitoring

    Elevated latency in ap-south-1

    An upstream transit provider is dropping packets. Traffic has been shifted to secondary links; p95 is recovering.

  2. Sep 02 · 09:40 UTC · Resolved in 38m

    Slow builds for large monorepos

    A cache eviction bug forced cold builds. Fixed and backfilled.

  3. Jul 28 · 22:05 UTC · Resolved in 1h 12m

    Build queue outage

    A failed database migration stopped the queue. Builds were retried automatically once it recovered. Read the postmortem →

© 2026 Orbit Times in UTC · refreshes every 60s

Scroll sideways to see the whole preview at desktop width