Pitlane

Platform Integration for Remix Apps

Running on Cloudflare and built around Vite+, explicit config, and typed runtime primitives.

$ vp create pitlane my-app
$ vp install
$ vp dev
$ pitlane resources create
$ pitlane deploy
Install
$vp create pitlane my-app

Scaffolds a Remix app wired for Vite+ and Pitlane on Cloudflare.

The Stack

One stack: Remix framework, Vite+ tooling, Cloudflare platform.

Why Pitlane

Cloudflare primitives that fit Remix instead of fighting it.

Pitlane keeps the platform visible and typed. Configure resources in platform(), let Pitlane generate Wrangler config and worker types, then read D1, R2, KV sessions, queues, and cron through explicit Remix middleware.

Vite+ runs the application lifecycle. Pitlane handles the Cloudflare platform work around it: provisioning, migrations, secrets, generated configuration, and deploys.

Learn the workflow
Primitives

Five typed primitives, each one middleware away.

D1 Database
remix/data-table
import { env } from "cloudflare:workers";
import { Database } from "remix/data-table";
import { database } from "pitlane/data-table-middleware";

router.use(database(env.DB));

router.get("/contacts", async ctx => {
    let db = ctx.get(Database);
    return Response.json(
        await db.findMany(Contacts),
    );
});
R2 File Storage
remix/file-storage
import { env } from "cloudflare:workers";
import { FileStorage } from "pitlane/file-storage";
import { fileStorage } from "pitlane/file-storage-middleware";

router.use(fileStorage(env.FILES));

router.post("/avatar", async ctx => {
    let files = ctx.get(FileStorage);
    await files.set(
        "avatar",
        await ctx.request.blob(),
    );
});
KV Sessions
remix/session-storage
import { env } from "cloudflare:workers";
import { Session } from "remix/session";
import { session } from "remix/session-middleware";
import { createKvSessionStorage } from "pitlane/session-storage";

let storage = createKvSessionStorage(env.SESSIONS, {
    keyPrefix: "session:",
    ttl: 60 * 60 * 24,
});

router.use(session(cookie, storage));

router.get("/", ctx => {
    let s = ctx.get(Session);
    return Response.json({
        count: s.get("count") ?? 0,
    });
});
Background Jobs
pitlane/job
import { env } from "cloudflare:workers";
import * as s from "remix/data-schema";
import { createJobs, Scheduler } from "pitlane/job";
import { scheduler } from "pitlane/job-middleware";

let jobs = createJobs({
    sendEmail: {
        binding: env.TASKS,
        schema: s.object({ to: s.string() }),
        async handle({ to }) {
            await sendEmail(to);
        },
    },
});

router.use(scheduler(jobs));

router.post("/emails", async ctx => {
    let scheduler = ctx.get(Scheduler);
    await scheduler.enqueue(
        jobs.sendEmail,
        { to: "a@example.com" },
    );
});
Cron Jobs
pitlane/job
import { env } from "cloudflare:workers";
import { createJobs } from "pitlane/job";

let jobs = createJobs({
    refreshHourlyData: {
        binding: env.TASKS,
        schedule: { 
            cron: "0 * * * *", 
            timezone: "UTC" 
        },
        async handle() { 
            await refresh(); 
        },
    },
});
Lap Time

From scaffold to deploy in under one minute.

00:00.00$ vp create pitlane my-app→ Scaffolded my-app
 $ cd my-app && vp install→ Installed 412 packages
 $ pitlane resources create→ D1, KV, R2, Queue ready
 $ vp dev→ Local server on :1612
 $ pitlane deploy→ Live at https://my-app.workers.dev
Pitlane pit crew servicing a Pitlane-branded race carPitlane pit crew servicing a Pitlane-branded race car
Platform Ops

Platform ops at pit-crew speed.

pitlane resources create reads platform() and provisions D1, KV, R2, queues, and cron triggers in one pass. pitlane db migrate runs pending D1 migrations. pitlane secrets push syncs secrets from .env to Wrangler. pitlane deploy ties it all together.

CLI reference
Pole Position

A short setup, a long straight.

·3lines
To wire a Cloudflare primitive into a Remix route — import, mount middleware, read from context.
·330+
Edge cities your app runs in by default, on Cloudflare's global Workers network.
·0ms
Cold start. V8 isolates, not containers — your routes are warm everywhere.
·0
wrangler.toml files to maintain by hand. Pitlane generates them from platform().
Build With
Footer background

Start with Pitlane

Create a Remix app, configure Cloudflare resources, and deploy through the same Vite+ workflow you use every day.

Get started

© 2026 Pitlane. Released under the MIT License.