MCPcopy Index your code
hub / github.com/SonicJs-Org/sonicjs

github.com/SonicJs-Org/sonicjs @v3.0.0-beta.24

Chat with this repo
repository ↗ · DeepWiki ↗ · release v3.0.0-beta.24 ↗ · + Follow
3,548 symbols 11,053 edges 884 files 682 documented · 19% updated 1d agov3.0.0-beta.24 · 2026-07-03★ 1,62968 open issues
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

SonicJS

GitHub stars npm downloads GitHub commit activity Discord TypeScript License: MIT

PR Tests codecov Tests npm version

The edge-native headless CMS for Cloudflare Workers. Sub-100ms response times globally. Zero cold starts. TypeScript-first.

sonicjs.com

📦 Get Started

npx create-sonicjs@latest my-app

Sponsor Open Collective

Deploy to Cloudflare

⚠️ Note: This repository is for developing the SonicJS core package. To build an application with SonicJS, use the command above to create a new project.

🐳 Self-Hosting with Docker

No Cloudflare account? Run SonicJS on any server with Docker and SQLite:

docker build -t sonicjs .
docker run -d --name sonicjs -p 3000:3000 \
  -v $(pwd)/data:/app/data \
  -e JWT_SECRET=$(openssl rand -base64 32) \
  -e BETTER_AUTH_SECRET=$(openssl rand -base64 32) \
  sonicjs

# Create the first admin user
docker exec sonicjs npm run reset
# → admin@sonicjs.com / sonicjs! (change after first login)

See the Self-Hosting guide for Docker Compose, Node.js, backup strategy, and production hardening.

🚀 Features

Core Platform

  • ⚡ Edge-First: Built specifically for Cloudflare Workers with global performance
  • 🔧 Developer-Centric: Configuration over UI, TypeScript-first approach
  • 🤖 AI-Friendly: Structured codebase designed for AI-assisted development
  • 🔌 Plugin System: Extensible architecture without core modifications
  • 📱 Modern Stack: Hono.js, TypeScript, D1, R2, and HTMX
  • 🚀 Fast & Lightweight: Optimized for edge computing performance

Advanced Content Management (Stage 5)

  • 📝 Rich Text Editor: TinyMCE integration with customizable toolbars
  • 🎛️ Dynamic Fields: Custom field types (text, number, date, boolean, select, media)
  • 📚 Content Versioning: Complete revision history with restore functionality
  • ⏰ Content Scheduling: Publish/unpublish automation with date controls
  • 🔄 Workflow System: Draft → Review → Published → Archived with role-based permissions
  • 💾 Auto-Save: Automatic content saving every 30 seconds
  • 👁️ Live Preview: Real-time content preview before publishing
  • 📋 Content Duplication: One-click content copying and templates
  • 🛡️ XSS Protection: Comprehensive input validation and HTML escaping

📊 How SonicJS Compares

SonicJS Strapi Payload
Edge-native Yes No No
Cloudflare Workers Yes No Limited
Cold starts None 2-5s 1-3s
Response time <100ms 200-500ms 150-400ms
Database D1 (SQLite at edge) PostgreSQL/MySQL MongoDB/PostgreSQL
Global distribution Built-in Requires setup Requires setup

SonicJS is the only production-ready CMS built specifically for edge computing. We have 46x more development activity per GitHub star than Strapi.

🌟 Why SonicJS?

Edge Performance

  • Global distribution via Cloudflare's network
  • Sub-100ms response times worldwide
  • Automatic scaling and DDoS protection
  • No cold starts - instant responses

Developer Experience

  • TypeScript-first with full type safety
  • Hot reload development environment
  • create-sonicjs CLI for instant setup
  • Comprehensive documentation

AI-Friendly Architecture

  • Clean, structured codebase
  • TypeScript types for autocomplete
  • Clear conventions and patterns
  • Built for AI-assisted development
  • 12 specialized Claude Code agents for development (View all agents)

🛠 Technology Stack

Core Framework

  • Hono.js - Ultrafast web framework for Cloudflare Workers
  • TypeScript - Strict type safety throughout
  • HTMX - Enhanced HTML for dynamic interfaces

Cloudflare Services

  • D1 - SQLite database at the edge
  • R2 - Object storage for media
  • Workers - Serverless compute runtime
  • KV - Key-value storage for caching
  • Images API - Image optimization and transformation

Development Tools

  • Vitest - Fast unit testing
  • Playwright - End-to-end testing
  • Wrangler - Local development and deployment
  • Drizzle ORM - Type-safe database queries

🏁 Quick Start

For Application Developers (Using SonicJS)

If you want to build an application with SonicJS:

# Create a new SonicJS application
npx create-sonicjs@latest my-app

# Navigate to your app
cd my-app

# Start development server
npm run dev

# Visit http://localhost:8787

Your app will be created with: - ✅ SonicJS CMS pre-configured - ✅ Database migrations ready - ✅ Example content collections - ✅ Admin interface at /admin - ✅ Ready to deploy to Cloudflare

For Package Developers (Contributing to SonicJS)

If you want to contribute to the SonicJS core package:

# Clone this repository
git clone https://github.com/lane711/sonicjs-ai.git
cd sonicjs-ai

# Install dependencies
npm install

# Build the core package
npm run build:core

# Create a test app to validate changes
npx create-sonicjs@latest my-sonicjs-app

# Run tests
npm test

Setting Up a Fresh Database

When working in a new worktree or wanting to reset your local database, run from the project root:

# Create a fresh D1 database for your branch
npm run db:reset

This will: - Create a new D1 database named sonicjs-worktree-<branch-name> - Apply all migrations - Update wrangler.toml with the new database ID

Working with Database Migrations

When developing the core package, migrations are located in packages/core/migrations/. Your test app will reference these migrations through the npm workspace symlink.

From your test app directory (e.g., my-sonicjs-app/):

# Check migration status (local D1 database)
wrangler d1 migrations list DB --local

# Apply pending migrations to local database
wrangler d1 migrations apply DB --local

# Apply migrations to production database
wrangler d1 migrations apply DB --remote

Important Notes: - The test app's wrangler.toml points to: migrations_dir = "./node_modules/@sonicjs-cms/core/migrations" - Since the core package is symlinked via npm workspaces, changes to migrations are immediately available - After creating new migrations in packages/core/migrations/, rebuild the core package: npm run build:core - Always apply migrations to your test database before running the dev server or tests

Creating New Migrations:

SonicJS uses a build-time migration bundler because Cloudflare Workers cannot access the filesystem at runtime. All migration SQL must be bundled into the application code.

  1. Create a new migration file in packages/core/migrations/ following the naming pattern: NNN_description.sql (e.g., 027_add_user_preferences.sql)
  2. Write your migration SQL (use CREATE TABLE IF NOT EXISTS and INSERT OR IGNORE for idempotency)
  3. Regenerate the migrations bundle: cd packages/core && npm run generate:migrations
  4. Rebuild the core package: npm run build:core (or just npm run build from packages/core - the bundle generation runs automatically as a prebuild step)
  5. Apply to your test database: cd my-sonicjs-app && wrangler d1 migrations apply DB --local

Important: After modifying any .sql files in migrations/, you must rebuild the package. The SQL files are not used at runtime - only the generated migrations-bundle.ts file is included in the build.

Common Commands (For Apps)

# Start development server
npm run dev

# Deploy to Cloudflare
npm run deploy

# Database operations
npm run db:migrate     # Apply migrations
npm run db:studio      # Open database studio

# Run tests
npm test

📁 Project Structure

This is a package development monorepo for building and maintaining the SonicJS CMS npm package.

sonicjs-ai/
├── packages/
│   ├── core/              # 📦 Main CMS package (published as @sonicjs-cms/core)
│   │   ├── src/
│   │   │   ├── routes/    # All route handlers (admin, API, auth)
│   │   │   ├── templates/ # HTML templates & components
│   │   │   ├── middleware/# Authentication & middleware
│   │   │   ├── utils/     # Utility functions
│   │   │   └── db/        # Database schemas & migrations
│   │   └── package.json   # @sonicjs-cms/core
│   ├── templates/         # Template system package
│   └── scripts/           # Build scripts & generators
│
├── my-sonicjs-app/        # 🧪 Test application (gitignored)
│   └── ...                # Created with: npx create-sonicjs@latest
│                          # Used for testing the published package
│
├── www/                   # 🌐 Marketing website
└── tests/e2e/             # End-to-end test suites

Important Notes

⚠️ This is NOT an application repository - it's for developing the @sonicjs-cms/core npm package.

  • packages/core/ - The main package published to npm
  • my-sonicjs-app/ - Test installation for validating the published package (can be deleted/recreated)
  • No root src/ - Application code lives in packages/core/ or test apps like my-sonicjs-app/

🔧 Content Management

Creating Collections

Collections are TypeScript config objects registered at app startup — no database table required.

// src/collections/blog-posts.collection.ts
import type { CollectionConfig } from '@sonicjs-cms/core'

export default {
  name: 'blog_post',
  displayName: 'Blog Post',
  slug: 'blog-posts',
  description: 'Article content collection',

  schema: {
    type: 'object',
    properties: {
      title: { type: 'string', title: 'Title', required: true, maxLength: 200 },
      content: { type: 'lexical', title: 'Content', required: true },
      publishedAt: { type: 'datetime', title: 'Published Date' },
    },
    required: ['title', 'content'],
  },

  managed: true,
  isActive: true,
} satisfies CollectionConfig
// src/index.ts — register before createSonicJSApp
import { registerCollections, createSonicJSApp } from '@sonicjs-cms/core'
import blogPostsCollection from './collections/blog-posts.collection'

registerCollections([blogPostsCollection])
export default createSonicJSApp({ plugins: { register: [] } })

Field Types

  • string: Single-line text with validation
  • lexical: Rich text editor
  • number: Numeric input with min/max constraints
  • boolean: Checkbox with custom labels
  • datetime: Date/time picker
  • select: Dropdown with single/multi-select
  • slug: URL slug with auto-generation
  • user: User reference picker
  • media: File picker with preview

🌐 API Endpoints

Content Management

  • GET /admin/content/new?collection=id - Create new content form
  • GET /admin/content/:id/edit - Edit content form
  • POST /admin/content/ - Create content with validation
  • PUT /admin/content/:id - Update content with versioning
  • DELETE /admin/content/:id - Delete content

Advanced Features

  • POST /admin/content/preview - Preview content before publishing
  • POST /admin/content/duplicate - Duplicate existing content
  • GET /admin/content/:id/versions - Get version history
  • POST /admin/content/:id/restore/:version - Restore specific version
  • GET /admin/content/:id/version/:version/preview - Preview historical version

Public API

  • GET /api/content - Get published content (paginated)
  • GET /api/collections/:collection/content - Get content by collection
  • GET /api/collections - List all collections

🚀 Deployment

Deploying Your SonicJS Application

After creating your app with npx create-sonicjs@latest:

# 1. Configure your Cloudflare project
# Update wrangler.toml with your project settings

# 2. Create production database
wrangler d1 create my-app-db

# 3. Apply database migrations
npm run db:migrate:prod

# 4. Deploy to Cloudflare Workers
npm run deploy

Your app will be live at: https://your-app.workers.dev

Environment Configuration

# wrangler.toml
name = "my-sonicjs-app"
main = "src/index.ts"
compatibility_date = "2024-01-01"

[[d1_databases]]
binding = "DB"
database_name = "my-app-db"
database_id = "your-database-id"

[[r2_buckets]]
binding = "MEDIA_BUCKET"
bucket_name = "my-app-media"

🧪 Testing

```bash

Run unit tests

npm test

Run tests in watch mode

npm run test:watch

Run E2E tests

npm run t

Extension points exported contracts — how you extend this code

CFSendEmailBinding (Interface)
(no doc) [7 implementers]
packages/core/src/services/email/providers/cloudflare.ts
ModulePosition (Interface)
* QR code matrix position info
my-sonicjs-app/src/plugins/qr-generator/services/svg-customizer.ts
Author (Interface)
(no doc)
www/src/types/blog.ts
FormField (Interface)
(no doc)
packages/templates/src/components/form.template.ts
Row (Interface)
(no doc)
packages/stats/src/plugins/stats-dashboard/routes/admin.ts
CfEmailBinding (Interface)
(no doc) [7 implementers]
packages/core/src/plugins/core-plugins/email-plugin/services/cf-email-provider.ts
ContactSettings (Interface)
(no doc)
my-sonicjs-app/src/plugins/contact-form/types.ts
FeaturedImage (Interface)
(no doc)
www/src/types/blog.ts

Core symbols most depended-on inside this repo

log
called by 846
packages/core/src/services/logger.ts
get
called by 821
packages/core/src/plugins/types.ts
error
called by 565
packages/core/src/plugins/types.ts
prepare
called by 451
packages/core/src/__tests__/utils/d1-sqlite.ts
prepare
called by 447
packages/core/src/plugins/core-plugins/email-reconciliation/index.ts
get
called by 434
packages/core/src/plugins/singletons/service-singleton.ts
set
called by 313
packages/core/src/plugins/singletons/service-singleton.ts
count
called by 313
my-sonicjs-app/src/plugins/qr-generator/services/qr.service.ts

Shape

Function 1,737
Method 1,004
Interface 608
Class 196
Enum 3

Languages

TypeScript100%

Modules by API surface

packages/core/src/plugins/types.ts76 symbols
packages/core/src/types/plugin.ts71 symbols
packages/core/src/services/rbac.ts42 symbols
packages/core/src/plugins/available/email-templates-plugin/services/email-management.ts41 symbols
packages/core/src/plugins/cache/services/cache.ts37 symbols
packages/core/src/plugins/core-plugins/multi-tenant-plugin/services/tenant-service.ts35 symbols
packages/core/src/templates/components/dynamic-field.template.ts30 symbols
packages/core/src/adapters/storage/filesystem-driver.ts29 symbols
packages/core/src/adapters/db/sqlite-driver.ts29 symbols
packages/core/src/plugins/redirect-management/services/redirect.ts27 symbols
packages/core/src/services/plugin-service.ts26 symbols
packages/core/src/plugins/core-plugins/workflow-plugin/services/workflow-service.ts26 symbols

For agents

$ claude mcp add sonicjs \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact

Ask about this repo answers extend the page