Everything Fóir does

A content API is the smallest part of what an application needs. This is the rest of it.

Content

How your information is shaped.

Models and fields

Define the shape of your data from sixteen built-in field types, including rich text, exact decimals, media, references and geopoints, in the console or in code.

Relations

Point one model at another with a reference field and read across it in one query, with relationship kinds that decide whether access and deletes follow the reference.

Prose and inline models

Rich text that holds your own models among the paragraphs in any order, inline models you define once and reuse as field types, and typed lists.

Hierarchies

Declare a reference field as a model's hierarchy and its records form a tree, with every read returning the record's path and its ancestors.

Locales

Translate text and prose fields per locale, with a fallback chain walked field by field and a strict mode that reports which fields had no translation.

Variants

Vary a whole record, a single field or a single prose entry by audience, with the variant selected on the server from reusable, prioritised targeting rules.

Audiences and segments

Build audiences from context dimensions such as device, platform, locale and sign-in status, and from rule-based segments the server evaluates on every request.

Natural keys and lookups

Address a record by a readable key, and declare extra unique lookup keys on a model so a handle or a SKU finds it in one typed query.

Design tokens

Colour, type and spacing held as tokens on the project and served from the API, so an app that reads them at runtime shows a rebrand once it is published.

Publishing

Getting it live, and getting it back.

Drafts

On a model with publishing on, each save writes a draft while the API keeps serving the published version. The console previews a draft as the API would serve it.

Version history

On versioned models each save is a numbered version, kept for a window set by your plan. Restoring adds a new version, and a dry run reports the effect first.

Scheduled publishing

Set a publish time on a record version, and an unpublish time if the content should come down again. A schedule can be changed or cancelled until it fires.

Rollouts

A rollout publishes a named batch of record versions at one scheduled moment. A failed item is skipped and can be retried, and the batch can be rolled back.

Releases

Changes to models and configuration are staged as drafts and released together, now or at a set time, with a diff of breaking changes and a rollback.

Per-model behaviour

Versioning, publishing and variants are switched on per model and are off by default, so each model takes on only the workflow its records need.

Delivery

How it reaches your application.

Typed GraphQL

Fóir generates a GraphQL schema from your models. Production serves the published schema, and a CLI check fails your build when committed types fall behind the project.

Resolved on read

A read passes a locale, a context and a preview flag. The server applies the locale fallback, picks the variant and selects the draft or published version.

Live updates

Subscribe over a WebSocket to hear when records change. Events carry the id of what changed, and the SDK's live module applies them to your query cache.

API keys

Each key is public or secret and belongs to one project. It holds the scopes you give it, and can be narrowed to chosen models and operations or one organisation.

Response caching

The GraphQL API caches resolved responses for 60 seconds by default and drops them when a record they contain is written. A CLI command purges by hand.

SDK and CLI

A typed client that writes the GraphQL for your application, with types generated per key, and a CLI for content, schema, publishing and configuration with JSON output for scripts.

Limits applied for you

Request rates are set per key by your plan, and query depth, field count and aliases are capped before a query runs. Responses report the limits in their headers.

Identity and access

Who can see and do what.

Hosted sign-in

A sign-in page that Fóir hosts for your users on a login domain you verify, carrying your project's name, logo and colour, with password, emailed-code and provider sign-in.

OpenID Connect sign-in

Your users sign in through any identity provider that publishes an OpenID Connect discovery document. You supply its discovery URL and your client credentials, and Fóir runs the exchange.

Step-up verification

Require a passkey or an authenticator-app code as a second step after a password, before a sensitive operation or on every sign-in to an app.

Roles

A role is a set of permissions you compose, granted across a workspace or on one project. Your users' roles are declared per project in config or the CLI.

Record-level access

A model declares who owns its records, and each record is private or public. A private record can be shared with a named person by a grant you can revoke.

Field-level access

A field can name which kinds of caller may read it and which may write it. There are five kinds, decided by the credential a request carries.

Session control

The console lists the sessions your users hold on a custom login domain, per sign-in app, and revokes any one. Other sign-ins end by token revocation or expiry.

Audit trail

Who did what and when, recorded alongside the change and readable in the console by team members who hold the permission. Entries are kept for 90 days.

Security

How your data is kept apart from everyone else's.

Enforced in the database

Access rules are compiled into Postgres row-level security, so the database filters what a request can read and a forgotten check in application code does not expose a row.

Workspace isolation

A workspace is your account. Every governed row carries its id, and the policy on the table compares that id with the caller's session before anything else is considered.

Project isolation

Each project has its own content, users, files, keys, secrets and sign-in domains. An API key belongs to exactly one project and cannot be pointed at another.

Organisation isolation

When your product has tenants of its own, each one is an organisation. The database stamps every row with its organisation and filters every read by it.

Support access by approval

When Fóir staff need to look inside a workspace to help, one of its administrators approves the request with a one-time code. The visit lasts an hour and is recorded.

Demesne

The engine that compiles the rules is open source, so you can read how the policies are written and run its tests yourself.

Projects and organisations

For agencies, and for products with tenants of their own.

A project per client

Each client gets a project with its own content, keys, users and sign-in. One workspace administers them all, and a client you invite reaches only their own project.

Organisations

Give your product tenants of its own. Each customer of yours is an organisation inside your project, with its own members, users, data and limits.

Organisation trees

Organisations nest to any depth. A parent reads everything beneath it and changes only its own rows, and models and settings are inherited down the tree.

Organisation provisioning

One call creates an organisation with its brand, its settings, its first member and a key confined to it. Run it twice and you still get one organisation.

Staging and production

One config file declares staging and production as named projects, and the CLI pushes to one per run. They stay identical apart from declared destinations, and drift is reported.

Custom domains

A project can serve its API from a domain you verify, and a sign-in app can serve the hosted sign-in page from one. Both are optional, with TLS issued automatically.

Media

Files, and what you do to them.

Asset library

Upload a file once and reference it by id from any record, with dimensions and a placeholder read from images when the upload is confirmed.

Image transformations

Each image is served in eight named sizes and four formats, rendered the first time a URL is requested, with crops and focal points set per usage.

Private files

A file has its own owner and visibility, with public files served from a plain URL and private files through a signed link that expires.

Video

Every uploaded video gets a thumbnail, a short animated preview and its duration, and adaptive HLS streaming is included on some plans.

Automation

Work that happens without a person.

Schedules

A schedule runs one of your operations on a cron expression, in a timezone you name, and can be paused, resumed or triggered by hand.

Lifecycle hooks

A hook runs one of your operations when something happens in a project, such as a record being published, and every delivery is stored with its status.

Operations

An operation is an HTTP endpoint you host and register with Fóir, which calls it with a signed payload, retries failures and records every run.

Usage quotas

A quota caps how often an operation can run in a rolling window, per signed-in user or across a wider pool, and returns a message you write.

Preconditions

A precondition decides whether an operation may run, by the caller's segment membership or by a rule on the input, and refuses with a message you write.

Secrets

A vault for the credentials your operations use, stored encrypted, addressed by reference and rotated without a redeploy.

Notifications

Send email, in-app and push notifications to your users, directly or from an event, with preferences each user sets per category and channel.

Working together

The people, and the agents.

Notes

Threaded comments your team attaches to a record, a file, a model or another subject, down to one field or one passage, with mentions and an inbox per project.

Tasks

Assign a note to a team member and it becomes a task, with a due date, sub-tasks and a queue per person. Settling the note marks it done.

Ask Fóir

An assistant in the console that works with the signed-in person's own permissions. Its edits arrive as unsaved changes, as drafts or as requests you approve.

Hand a thread to Fóir

Hand a note thread to the assistant for one short unattended run. It reads the project and answers on the thread, and it cannot edit, publish or delete content.

Any MCP client

Connect your own agent to Fóir's hosted MCP server. It works inside the permissions of whoever connected it, or the scopes of the secret key it was given.

Feedback from your users

Signed-in users can write notes about a record and read your team's replies. A React widget files the note for you, and a project can accept visitor feedback.

Yours to keep

The exit, and the extensions.

Postgres export

One command exports a project as typed Postgres tables generated from your models, with foreign keys, your published content and download links for your files.

Access rules in the export

The export bundle includes Postgres row-level security for which rows each user can read. You apply it yourself. Field permissions, API scopes and write rules stay behind.

Your logic stays yours

Fóir does not host your code. You register a function you host as an operation, and Fóir calls it with a signed, scoped token, retries failures and records each run.

Apps

Extend the console with your own tools. An app is a web page you host, embedded as a page, an editor tab, a sidebar or a field editor.

Config as code

Models, API keys, hooks, sign-in providers and the rest of a project's configuration in one file you commit. A push stages a draft and a release publishes it.

Start with one model

Create a project, define a model, and read it back over the API.