Skip to content
AndersseenPublic

About

⚡ Code-first, TypeScript-native headless CMS for Angular & Analog.js — edge-first on Cloudflare (Pages · D1 · R2). Payload, but for Angular.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Latest commit

 

History

391 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ForgeCMS — code-first, TypeScript-native CMS foundation

A code-first, TypeScript-native headless CMS for Angular and Analog.js — runs on Cloudflare (D1 + R2) or on plain Node (libSQL + S3).


CI License: MIT npm Status

Documentation · 2.0 roadmap · Server quickstart · Angular quickstart · Reference · Support · Security


Note

Status. ForgeCMS 1.0.0 was published through the main release workflow. All twelve public packages are the fixed family; the accepted 1.0.0-rc.2 remains in release history. Agent Kit and Cloudflare Analytics remain experimental. Release workflow and verification evidence: docs/1.0-RELEASE-DOSSIER.md. Support boundaries and known limitations: docs/LIMITATIONS.md.

What is ForgeCMS?

ForgeCMS is a code-first headless CMS for Angular and Analog.js developers. You describe your content in TypeScript; that one definition drives the database schema, validation, a REST API, the types your Angular app receives and the forms of a reusable admin. There is no GUI schema builder, no code generation step and no second language.

  • Audience: TypeScript/Node developers who want a CMS they own (server-only use is fully supported), and Angular/Analog developers who want a CMS that is Angular-native instead of a React admin next to their app.
  • Product inspiration: Payload — config-as-code collections, a Local API, access functions. ForgeCMS is not a Payload clone and does not claim feature parity; it has no GraphQL, plugin system, page builder or CLI (see limitations).
  • Where it runs: Cloudflare Pages/Workers with D1 + R2, or Node with on-disk libSQL + an S3-compatible bucket. Both profiles are built from the packed public packages and exercised in CI; the Cloudflare profile was also rehearsed on isolated real Cloudflare staging with a backup and an isolated restore. See the deployment matrix.
  • Supported baseline: Node >= 22, pnpm 10, TypeScript 5.9 strict, Angular 21 (client also on Angular 22), Analog.js 2 — exact ranges and the versions actually tested are in docs/SUPPORT.md.

Install

Server only (no Angular, no admin):

pnpm add @forge-cms/core @forge-cms/runtime @forge-cms/db @forge-cms/auth @forge-cms/storage @forge-cms/api

Add what your profile needs:

pnpm add @forge-cms/cloudflare   # D1 + R2 (Cloudflare profile)
pnpm add @forge-cms/s3           # S3-compatible storage (portable profile)
pnpm add @forge-cms/angular      # typed Angular client, session, guard, signal resources
pnpm add @forge-cms/admin        # reusable Angular admin (Angular 21)
pnpm add -D @forge-cms/testing   # adapter contract suites, if you write an adapter

A schema, a runtime, the Local API

import { defineCollection, defineField } from '@forge-cms/core';
import { UsersCollectionAuthAdapter, defineUsersCollection } from '@forge-cms/auth';
import { LibSqlDatabaseAdapter } from '@forge-cms/db';
import { ForgeCmsRuntime } from '@forge-cms/runtime';
import { InMemoryStorageAdapter } from '@forge-cms/storage';

const users = defineUsersCollection();
const notes = defineCollection({
  slug: 'notes',
  fields: {
    title: defineField.text({ required: true }),
    author: defineField.relation({ collection: 'users', required: true })
  },
  access: { read: () => true, create: ({ user }) => user?.role === 'admin' }
});

const database = new LibSqlDatabaseAdapter('file:./forge.db');
const auth = new UsersCollectionAuthAdapter().init({
  AUTH_SECRET: process.env.AUTH_SECRET,
  userDatabase: database
});
const runtime = new ForgeCmsRuntime({
  collections: [users, notes],
  adapters: { database, auth, storage: new InMemoryStorageAdapter() }
});

runtime.init();
await runtime.syncSchema();
const { docs } = await runtime.find({ collection: 'notes' });

This is a sketch; the complete, verified version (first admin, access enforced, HTTP handlers) is the server quickstart. Business logic lives in the Local API; the HTTP handlers are a thin transport.

Two ways to start

You are… Start with Installs
A server/TypeScript developer Server quickstart core · db · auth · storage · api · runtime — no Angular at all
An Angular/Analog developer Angular/Analog quickstart the above + @forge-cms/angular + @forge-cms/admin + peers

Both quickstarts are executable: pnpm docs:verify:consumers installs each one from the packed tarballs into a clean project and builds and runs it.

What you get

Schema DSL with 15 field kinds (including group, array, blocks) · Local API and REST · function-based row and field access · the full hook pipeline · drafts, versions with restore, globals, live preview and localization · relations with restrict/cascade/set-null integrity · browser sessions with CSRF, scoped API keys, roles · uploads through R2 or S3 · schema drift detection and reviewed migrations · backup/restore procedures · a typed Angular client with signal resources and SSR support · a reusable Angular admin. The honest per-capability status (stable, experimental, intentionally limited) is the feature matrix.

Packages

All twelve are versioned together (one Changesets fixed group), ESM-only, and imported only through their entry points. @forge-cms/agent is experimental development tooling (a read-only local MCP server and an official skill pack for AI coding agents); it first appears in the 1.0 release line, is never a runtime dependency, and is outside the stable 1.x guarantee - see the Agent Kit guide.

Package Purpose
@forge-cms/core Schema DSL, collection/global definitions, validation, base types
@forge-cms/db Database contract, InMemory and libSQL adapters, schema planning, migrations
@forge-cms/auth Auth contract; users-collection sessions, API keys, composite/external adapters
@forge-cms/storage Storage contract and InMemory adapter
@forge-cms/s3 S3-API storage adapter (portable profile; Garage certified)
@forge-cms/api ApiContext and handler contracts
@forge-cms/runtime ForgeCmsRuntime (Local API) and framework-agnostic HTTP handlers
@forge-cms/cloudflare D1 + R2 adapters (and experimental Analytics Engine)
@forge-cms/angular Angular client SDK: provideForgeCms, typed client, session, guard, resources, SSR
@forge-cms/admin Reusable Angular admin: layout, content, auth pages, users workspace
@forge-cms/testing Adapter contract suites
@forge-cms/agent Experimental dev tooling: read-only local MCP server + official skill pack

Every export, option and default: docs/REFERENCE.md.

Deployment profiles

Profile Database Files Evidence
Cloudflare D1 R2 Adapter contracts · local workerd/D1/R2 · packed production consumer · isolated real Cloudflare staging with redeploy persistence and backup → isolated restore
Portable on-disk libSQL @forge-cms/s3 — Garage v2.4.1 certified Packed Node production server · restart persistence · upload/read/delete · backup/restore

AWS S3, Backblaze B2 and Wasabi are configurable but not certified. Staging evidence supports the framework/profile; it is not a guarantee for any particular production deployment. A production build never silently falls back to in-memory adapters. Details: deployment, docs/STAGING-REHEARSAL.md, docs/BACKUP-RESTORE.md.

Versions and roadmap checkpoints

Two separate numbering schemes:

  • npm versions. The twelve public packages always share one version; the stable release is 1.0.0. They are not the roadmap numbers.
  • Roadmap checkpoints (docs/ROADMAP.md) are product guarantees (0.5 → 0.12, then the 1.0 release). Roadmaps 0.5–0.12 are complete; roadmap 1.0 has shipped. See docs/roadmap/v1/1.0-release.md for its closeout.

What is implemented right now is docs/STATE.md; what the 1.0 release will stand on is docs/1.0-RELEASE-DOSSIER.md.

Help, support and security

Developing this repository

git clone https://github.com/Andersseen/ForgeCMS.git
cd ForgeCMS
pnpm install
pnpm build
pnpm dev:www

Quality gates, the spec-driven workflow, Changesets and the CI-driven release are in CONTRIBUTING.md, CLAUDE.md and docs/SDD.md. Try the Lumea clinic demo (source in apps/demo-aesthetics).

Strata

ForgeCMS does not depend on Strata and Strata is not part of the ForgeCMS 1.0 API. apps/tiny-project installs the published Strata packages as an external consumer to dogfood them; Forge owns CMS behaviour. Strata Server Components are not used and are not a 1.0 feature.

License

MIT © ForgeCMS contributors

About

⚡ Code-first, TypeScript-native headless CMS for Angular & Analog.js — edge-first on Cloudflare (Pages · D1 · R2). Payload, but for Angular.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages