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.
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.
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.
You own the logic. We run everything else.
You write
Fabric handles
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
Use cases
What people build with Fabric.
API Agents
Give your API a brain.
Turn any OpenAPI spec into a chat assistant, CLI tools, and MCP server.
Workflows
Workflows that survive anything.
Multi-step processes with persistence, retries, and real sleep.
Scheduled Jobs
Cron that actually works.
Managed scheduling with retries, execution history, and alerts.
Background Jobs
Queues without the infra.
Job processing with retries, dead-letter queues, and full traces.
Internal Tools
CLI + API from one function.
One codebase for your API, CLI, and RPC. Same auth everywhere.
Realtime
WebSockets + SSE with types and auth.
Typed messages, session context. No separate realtime server.
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.
Fabric
$20/mo
1 machine included, +$10/mo per extra
We host and run everything.
Enterprise
Custom
annual contract
Dedicated infra and support.
Coming soon
Get early access to Fabric.
We'll notify you when it's ready to deploy to.