Write the app.
We run the rest.
Data, actions, background jobs and Next.js pages in one folder. We store the records, run the code and serve the pages, on the same balance as your models.
- api/models/ticket/schema.ib.tsmodel
- api/models/ticket/actions/triage.tsaction
- settings.ib.tsschedule
- web/app/page.tsxpage
- git pushdeploy
Same folder. Four kinds of job.
A Shopify app, a tool for your team, a sync between two services or a public site: it’s the same models, actions and pages underneath.
Shopify apps, without the plumbing.
Pick Shopify app and the folder starts with the install wired up: the shop model, its scopes and an admin page. Synced products and theme blocks are files you add.
- Install, scopes and uninstall run as actions on the shop model.
- Products sync into a model you can query like any other.
- Theme blocks ship as a theme app extension; admin pages use Polaris.
Tools your team signs in to.
Bring a spreadsheet, get a searchable app with sign-in, roles and the actions your team runs every day.
- Import a CSV into a model, search it, export it back.
- Sign-in and roles come with the Members starter, so only your team gets in.
- Each action is an API endpoint and an MCP tool, for scripts and agents.
Glue between services, with retries.
Take a webhook in, enrich it with a model, save the record and pass it on. Jobs, retries and schedules come built in, not as infrastructure.
- A route takes the webhook and queues a job, retried with backoff when it fails.
- Schedules in settings.ib.ts, each time queued once.
- Every run is in Logs, with its model calls and what they cost.
// web/app/api/leads/route.ts export async function POST(request: Request) { await createClient().enqueue("enrichLead", await request.json(), { retries: 5 }); return new Response(null, { status: 202 }); } // settings.ib.ts schedules: [{ action: "syncCrm", cron: "*/15 * * * *" }],
Public sites, and apps people sign in to.
Start from the Site starter: posts, a contact form and a newsletter. Or from the Members starter, with accounts, sign-in and members-only pages.
- Posts written in the record editor, served at /blog and as RSS.
- Contact form messages become lead records and an email to you.
- Serve it at the app’s address or your own domain.
Call a model like any other function.
Model calls go through the Gateway, so your team’s allowed models, budgets and Logs apply. No provider key to paste, and every run shows what its model calls cost.
import { save, type ActionRun } from "@inferencebureau/apps-sdk"; export const run: ActionRun = async ({ record, ai }) => { const { text } = await ai.generateText({ model: "anthropic/claude-haiku-4.5", prompt: `One label for this ticket: ${record.subject}`, }); record.label = text.trim(); await save(record); };
Push to deploy. Undo anything.
Development and production are separate, each with its own records, secrets and address. Connect a repository and pushes to the production branch deploy.
Crossed off, and what happens instead.
- Register Shopify webhooksListed in settings.ib.ts, subscribed for you
- Keep a tunnel open for local webhooksib-apps dev opens one and keeps it up
- Paste a model provider keyModel calls bill to your balance
- Create a storage bucketA file field on any model
- Run a job queueJobs, retries and schedules built in
- Build an admin for your dataRecords, search and CSV in the console
- Write a deploy pipelinePush to the production branch
- Set up sign-inComes with the Members starter
- Wire up preview URLsA preview environment per pull request
- Copy secrets between environmentsPer-environment variables, or 1Password
Nothing here is a black box.
The assistant writes ordinary TypeScript you can read, run and take with you.
Free to start. Pay when it’s real.
One plan for the team, with allowances pooled across apps. Development is never counted. Model calls and the assistant bill as ordinary gateway requests.
Describe it, or write it.
Start from a prompt on the homepage, or run ib-apps dev in a folder and keep going in your own editor.