Features

Built for the people who ship.

Forge gives developers schema-as-code and content teams a real editor, on infrastructure that stays in Europe.

Everything your
content team needs.

content/article.ts
import { collection, field } from '@forge/sdk'

export const Article = collection({
  name:   'article',
  fields: {
    title:   field.text({ required: true }),
    body:    field.richText(),
    author:  field.relation({ to: 'author' }),
    cover:   field.media(),
    status:  field.select(['draft', 'published']),
  }
})

Schema in code, not settings panels.

Define content types in TypeScript. Typed fields, version-controlled in your repo, diffable in pull requests. No GUI surprises when a field shape changes.

StringRichText RelationMedia
GET /v1/content?type=article&locale=en POST /v1/content GET /v1/assets/{id} PATCH /v1/content/{id} WH content.published → endpoint

Delivered from Europe. Fast.

REST, GraphQL, TypeScript SDK: same data, your choice. EU-only CDN with smart invalidation. Webhooks on every mutation, HMAC-signed with exponential retry.

<50ms
TTFB, EU edge

Real-time collaboration

Multiple editors, inline comments, conflict-free concurrent writes.

Multi-locale native

Dozens of languages with smart fallbacks and per-locale field overrides.

GDPR-native by design

EU-only hosting. No data leaves Europe. DPA included on all paid plans.

Ultra-fast delivery

Global CDN, smart cache invalidation. TTFB under 50ms. Your frontend never waits.

One API.
Three styles.

Use whichever fits your stack: TypeScript SDK, REST, or GraphQL. Same data, same power, zero lock-in.

import { Forge } from '@forge/sdk'

const forge = new Forge({ apiKey: 'fgk_live_...' })

const posts = await forge.content({
  type:   'article',
  locale: 'en',
  where:  { status: 'published' }
})
// → typed Article[], TTFB <50ms
GET https://cms.altovar.net/api/v1/content
  ?type=article&locale=en

Authorization: Bearer fgk_live_...
X-Project: acme-blog

200 OK
{ "data": [{ "id": "..." }],
  "meta": { "total": 42 } }
query Articles($locale: String!) {
  articleCollection(locale: $locale, limit: 10) {
    items {
      title
      slug
      author { name }
    }
  }
}

Your content. Your server. Ship today.

Free plan, no card required. Running in the EU: your data never leaves Europe.