RailRocket
v0.6.4 — just shipped Postgres workspaces →

A dev environment in your browser. Not in your way.

RailRocket gives every Git branch its own managed cloud workspace. Full IDE, terminal, debugger, preview server. Pre-configured runtime. Share with a teammate by URL. Spin up in 1.4 seconds.

Read the docs
Free for 3 active workspaces No credit card GitHub + GitLab in one tap
feat/login-redirect
2 vCPU · 4 GB · 14m alive
◰ Preview
Workspace
src/
lib/
TSauth.ts
TSrouter.ts
TSdb.ts
routes/
components/
TSmain.ts
Config
{ }package.json
TStsconfig.json
railrocket.yml
.env.env.dev
TS auth.ts
TS router.ts
TS db.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import { redirect } from "./router"; import { db } from "./db"; // Handle a login form post. Redirects to /dashboard on success. export async function login(email: string, password: string) { const user = await db.users.findOne({ email }); if (!user) { return { error: "Account not found" }; } const valid = await user.verifyPassword(password); if (!valid) { return { error: "Wrong password" }; } return redirect("/dashboard"); }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import { Request, Response } from "./http"; type RouteHandler = (req: Request) => Promise<Response>; const routes = new Map<string, RouteHandler>(); export function register(path: string, handler: RouteHandler) { routes.set(path, handler); } export async function handle(req: Request) { const handler = routes.get(req.path); if (!handler) { return new Response("Not found", { status: 404 }); } return handler(req); } export function redirect(path: string) { return new Response(null, { status: 302, headers: { Location: path } }); }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import { Pool } from "pg"; // Postgres connection pool. Sized for the workspace plan. const pool = new Pool({ connectionString: process.env.DATABASE_URL, max: 12, }); export const db = { users: { async findOne(where: { email: string }) { const result = await pool.query( "SELECT * FROM users WHERE email = $1", [where.email] ); return result.rows[0] ?? null; }, }, };
Terminal Logs Problems 1 node v20.11 · cwd: ~/web
$ npm run dev
  > web@1.0.0 dev
  > vite --port 3000
 
  VITE v5.0.12   ready in 412 ms
 
  ➤ Local: http://localhost:3000/
  ➤ Preview: https://feat-login-redirect.acme-web.railrocket.dev
[14:32:18] GET / 200 in 8ms
[14:32:18] GET /assets/index-83a.css 200 in 3ms
[14:32:18] GET /assets/index-19c.js 200 in 4ms
[14:32:21] GET /api/user 200 in 12ms
[14:32:24] POST /api/login 401 in 18ms · auth.ts:6 wrong password
[14:32:38] POST /api/login 401 in 14ms · auth.ts:6 wrong password
[14:32:51] POST /api/login 200 in 27ms · redirect /dashboard
[14:32:52] GET /dashboard 200 in 9ms
src/lib/auth.ts:6:42Parameter 'email' implicitly has an 'any' type.
Consider adding an explicit type. Or enable strict: true in tsconfig.json to catch these everywhere.
no other problems · tsc 5.3.3
feat-login-redirect.acme-web.railrocket.dev live
HMR · auth.ts updated · 0.03s
used by teams at
Pinion Labs /usr/bytes Roundkey harbour.io Trasselsudd Castlefork stack/seven
What's in the box

Everything you'd install on your laptop, already set up.

Workspaces ship with the runtime, the deps, the env vars, and the database. You write code.

~/

Per-branch workspaces

Every branch checkout spins up its own isolated workspace. Switch branches, switch context. Nothing pollutes anything else.

{}

Full VS Code in the browser

The actual editor, extensions and all. Or attach JetBrains, Cursor, or your terminal’s vim over SSH. Your call.

Live preview URLs

Every workspace gets a public URL. Share it for a code review. Send it to a designer. Tear it down when done.

Workspace as code

A railrocket.yml in your repo defines the workspace. Same config, every dev, every branch.

Branch-based workflow

Workspaces are pinned to branches.

Open a PR → a workspace appears. Push a commit → the workspace rebuilds. Close the PR → the workspace tears itself down. No babysitting.

  • Branch checkout in 1.4 s. Snapshot-based, not a fresh container build.
  • Shared with your team. Anyone with repo access can attach to your workspace.
  • Disposable. No state to clean up. No env drift. No “works on my machine”.
  • Reproducible. A teammate gets the same workspace as you, every time.
# create a workspace pinned to a branch $ railrocket workspace create feat/login-redirect   spinning up acme-web @ feat/login-redirect...   ↳ snapshot restore: 0.4s   ↳ npm install (cached): 0.8s   ↳ postgres restore: 0.2s   ✓ ready in 1.4s attach: https://railrocket.dev/w/acme-web/login-redirect preview: https://feat-login-redirect.acme-web.railrocket.dev tip: railrocket share — send the workspace URL to a teammate
Integrations

Drops into the tools you already use.

G
GitHub
/G
GitLab
B
Bitbucket
L
Linear
J
Jira
#
Slack
VS
VS Code
JB
JetBrains
C
Cursor
N
Neovim
D
Docker
PG
Postgres
From a recent customer
We migrated 14 engineers off local dev in a week. The cost of context-switching between projects went from a 10-minute setup tax to 1.4 seconds. RailRocket paid for itself in the first sprint.
MR
Mira Rao
Staff engineer · Roundkey (Series B, 80 engineers)
Pricing · $0 free · $12 hacker · $29 / dev for teams

Pricing built for indie devs and small teams.

Free tier is genuinely usable. The paid tiers are honest about what you get for your money — not a metering trap.

See pricing Read the docs