/foːɾʲ/Irish, verbto help

The application content runtime.

Structured content and application data, managed together. Define your models; Fóir provides the API, editing tools, customer sign-in and tenant isolation.

Build your product without assembling and maintaining the platform underneath it.

Here to help.

Try it out. Add a capability and watch the config on the left and the API it generates on the right.

3 capabilities selected. Configuration and schema updated.

foir.config.ts

// foir.config.ts
export default defineConfig({
key: "acme",
project: { settings: { logoUrl: "/logo.svg", primaryColor: "#0F3B2E" } },
models: [{
key: "",
fields: [
{ key: "title", type: "text", required: true },
{ key: "body", type: "richtext" },
{ key: "", type: "image" },
],
lookups: [{ keyBy: [""] }],
}],
relyingParties: [{
clientId: "acme-app",
redirectUris: ["https://app.acme.com/callback"],
customDomains: ["login.acme.com"],
loginMethods: { password: true, otp: true },
}],
});
$ foir workspaces create --name acme --select
$ foir push
$ foir customers import --file customers.csv
$ foir secrets put --label resend --value $RESEND_API_KEY
$ foir cache purge post launch-week
$ foir export postgres --target $DATABASE_URL

schema.graphql

# schema.graphql — generated by foir push
type Post {
title: String!
body: Richtext
cover: Image
}
type Image {
url: String
blurhash: String
webp: ImageVariantSet
avif: ImageVariantSet
}
type Query {
post(naturalKey: String!, preview: Boolean): Post
posts(where: PostWhereInput, first: Int): PostConnection
postBySlug(slug: String!): Post
authConfig: AuthConfig
authProviders: [AuthProvider]
}
type Mutation {
updateManyPost(where: PostWhereInput, data: PostUpdateInput): BatchPayload
customerRegister(email: String!, password: String!): CustomerAuthResult
customerLogin(email: String!, password: String!): CustomerAuthResult
customerLoginWithProvider(provider: String!): ProviderLoginStart
customerRefreshToken: CustomerAuthResult
customerLogout: Boolean
}

Point an agent at it

fóir is built for agents as much as people. Connect one over MCP and it works your content through the same tools and access rules your team uses, inside its own permissions. When a segment needs its own version of a catalogue item, the agent can create a new variant and write its copy, staged as a draft for you to approve.

We'll handle the hard parts

Your content resolves on every request, so a new language or audience is a field you set, not a rebuild. Access rules compile into the database's own row-level security, so a check you forgot can't leak a row, and every project stays isolated by default. The API is generated from your models, so there's nothing hand-written to get wrong. And if you ever want out, your data exports to a Postgres database you own.

Who's it for?

For SaaS teams building one product for many customers, with shared models and separate customer data. For agencies managing client sites without rebuilding the same platform each time. And for teams taking a Lovable-built app further, with managed sign-in, content editing and access rules in place of a custom backend to maintain.

Early access

Create a project and define your models. The rest is already there.