Skip to main content

The backend you'd build
if you had infinite time.

Every backend needs APIs, queues, cron jobs, workflows, WebSockets, auth, monitoring, CLI tools, AI agents. You either spend months wiring them together — or you deploy typed functions and let Fabric do it.

createInvoice.ts
export const createInvoice = pikkuFunc({
  input: z.object({
    orderId: z.string(),
    amount: z.number(),
  }),
  output: InvoiceSchema,
  func: async ({ db, email }, data) => {
    // your business logic
  },
  permissions: { user: isAuth },
})
DEPLOY
REST APIhttps://api.acme.dev/v1
Cron jobEvery Monday at 9am
Queue workerbilling.createInvoice
WorkflowDurable multi-step process
CLI toolpikku billing invoice
MCP toolAvailable in Claude, Cursor
AI agentSame auth, same permissions

Same auth. Same validation. Same types. One codebase.

Your backend today

You set up Express for your API. Bull for your queues. A cron library for scheduled jobs. A separate CLI entry point. You write OpenAPI specs by hand. Auth is different for every surface — bearer tokens on the API, nothing on the CLI. When someone asks for observability, you add three more libraries. When the AI team wants tool access, you build another wrapper.

Every piece works on its own. But nothing is connected. Permissions don't carry over. Types don't flow through. You spend more time on plumbing than on the thing your code actually does.

"So many places in my code base have like three entry points: CLI, public (sometimes protected) HTTP API and internally from within the API. Would be so nice having everything just an invoke away. With Nest it's a pain because you basically have to start the whole API up just to run CLI command."

Alex Harley, Co-founder @ Superbridge

Write. Wire. Push.

A typed function. A few wiring lines. A git push. That's the entire workflow.

1
Write a functionYour logic. Typed inputs, outputs, permissions.
export const createInvoice = pikkuFunc({
input: z.object({ orderId: z.string(), amount: z.number() }),
output: InvoiceSchema,
func: async ({ db, email }, { orderId, amount }) => {
const invoice = await db.invoices.create({ orderId, amount })
await email.send({ to: invoice.customer, template: 'invoice-created' })
return invoice
},
permissions: { user: isAuthenticated },
})

This function doesn't know if it's called from an API, a queue, a cron job, or an AI agent. It just does one thing.

2
Wire it to surfacesOne line per surface. Pick any combination.
wireHTTP({ method: 'post', route: '/invoices', func: createInvoice })
wireScheduler({ schedule: '0 9 * * 1', func: createInvoice })
wireQueueWorker({ queue: 'billing', func: createInvoice })
wireCLI({ program: 'billing', commands: { invoice: createInvoice } })
pikkuAIAgent({
name: 'billing-assistant',
tools: [createInvoice],
model: 'anthropic/claude-sonnet-4-5',
})

Same function. Five surfaces. Same auth rules apply everywhere.

3
Push to FabricEverything is live.
terminal
$ git push fabric main
Deploying to production...
✓ API live https://api.acme.dev/v1
✓ Cron active Mon 09:00
✓ Queue running billing.createInvoice
✓ CLI published pikku billing invoice
✓ AI tool live createInvoice
✓ Dashboard https://fabric.pikku.dev/acme
Deployed in 4.2s

You own the logic. We run everything else.

You write

Business logic as typed functions
Permission rules (who can call what)
Which surfaces each function runs on
Service dependencies (DB, email, etc.)

Fabric handles

Hosting and running your functions
HTTP routing, WebSocket channels, queue consumers
Cron scheduling and execution
Durable workflows that survive restarts
Auth enforcement across every surface
OpenAPI spec and type-safe client generation
Logs, traces, and error tracking
Environments, branch previews, rollbacks
MCP server — your functions as IDE tools
Scaling

You maintain a folder of TypeScript functions. Fabric maintains everything else.

"Ever been annoyed at having to write your code different in a Lambda than in an express handler? Pikku fixes that."

Christoph Sitter, CTO @ spot

Pricing

Start with the open-source framework. Upgrade to Fabric when you want managed infrastructure.

Open Source

Free

forever

Self-host on your own infra.

All 12 surfaces
Any runtime (Express, Lambda, Cloudflare, etc.)
Auth, clients, OpenAPI generation
Community support

Fabric

$20/mo

1 machine included, +$10/mo per extra

We host and run everything.

Everything in Open Source
Managed hosting + deploys
Environments, previews, rollbacks
Observability + MCP server
Priority support

Enterprise

Custom

annual contract

Dedicated infra and support.

Everything in Fabric
SSO / SAML + SLAs
Custom integrations
Dedicated support engineer

Coming soon

Get early access to Fabric.

We'll notify you when it's ready to deploy to.

No spam. One email when we launch.