Run the two lines
Over SSH, in the folder you want the CMS in. No shell? Upload install.php to the web root and
open it in the browser instead.
Describe the schema. Get REST, OpenAPI, CRUD, live preview, backups, and an SDK. Your SPA stays the frontend.
curl -fsSL -o install.php 'https://2js.ru/download?source=curl'
php install.php
The second line boots the wizard on port 8080 and prints a one-time link: PHP check, latest release, DB and admin — all in the browser.
Over SSH, in the folder you want the CMS in. No shell? Upload install.php to the web root and
open it in the browser instead.
php install.php serves the wizard on port 8080 behind a one-time key. It checks PHP 8.3+,
downloads the latest release and verifies sha256.
The wizard writes the config, runs migrations and creates the owner. Then /admin and /api are live for your SPA.
What's new
Product cut for a modern headless CMS on PHP: live preview, content features, ISR webhooks, fine-grained ACL, data backups, and an official SDK.
0.62.11
Draft-safe preview tokens for the SPA, Cache-Control + Surrogate-Key on public GET — ready for CDN/ISR.
0.62.11
manyToMany / oneToOne, typed blocks field, entry status workflow, and content locale columns with ?locale= fallback.
0.62.11
Thin TypeScript client and hcms-types CLI from OpenAPI — ship typed SPA calls without a second
schema DSL.
0.62.12
Internal Event Bus; webhook templates for Vercel, Netlify, Cloudflare, and Fastly revalidation.
0.62.12–15
Per-grant fieldAcl and ownEntriesOnly. Owner hides admin sections and picks the post-login home.
0.62.0 / .13
URL/self health probes with soft cron. DB + media snapshots, restore, and push to Google / Yandex / Dropbox / SFTP.
Why HCMS
CRUD, migrations, admin UI, OpenAPI — again. HCMS closes that gap on any PHP host.
Compare
When shared hosting and a two-line install matter more than a cloud dashboard.
| Capability | HCMS | Custom CRUD | Node headless |
|---|---|---|---|
| Shared hosting / public_html | ✓ | ~ | — |
| Zero Node runtime | ✓ | ✓ | — |
| install.php → latest zip | ✓ | — | — |
| Schema → OpenAPI + admin | ✓ | — | ~ |
| MIT, self-host, no cloud upsell | ✓ | ✓ | ~ |
For your SPA
HCMS is the backend your SPA is missing: visual schema, REST, feature flags, translates, and a real /admin — no custom CRUD.
Ship a full admin UI with your PHP host. Editors never touch the SPA repo.
Public /api/{slug} with pagination, search, sort, and filter. Bearer tokens, CORS included.
Spec at /api/openapi.json, UI at /api/docs — generated from the schema you publish.
SPA runtime
Ship kill-switches and copy from the same PHP host as your content API.
Boolean, integer, string, object. Admin CRUD plus public GET /api/features with ETag for the SPA.
Sticky buckets on boolean flags: abTest + rolloutPercent, subject via query or X-Flag-Subject.
Locales and keys in admin. Public GET /api/translates for SPA dictionaries — import/export JSON.
Built for teams
OAuth, clear roles for editors and viewers, spam-safe public forms, and email out of the box.
Google and Telegram login plus TOTP 2FA. Owners stay on password; editors can connect social accounts.
Invite a content manager to edit entries — or give view-only access to the admin. Owner keeps schema, users, and system. Field/row ACL and per-resource grants on top.
Anti-spam on public create: honeypot, timing, captcha, blocklist. Send via Resend, Postmark, or Mailgun.
Build APIs fast
Schema is the source of truth for SQL, validation, REST, Admin UI, and OpenAPI.
String, richtext, relation (M2M / oneToOne), blocks, media, slug, enum, json, dates — publish and get a migration.
Per-resource pagination, search, sort, and filter. Custom resource APIs for read and write projections.
No hand-written spec. Open /api/docs after you hit publish on a content type.
Content tools
Media, rich text, relations, revisions, dashboard analytics — the usual CMS jobs, wired to your API.
Library, crop, optimize (WebP/JPEG/PNG), variants. Pretty /media/{id}/{file} with static warm-cache after the first hit.
Markdown for editors. Typed column filters, bulk delete, and relation labels in the list view.
manyToOne / manyToMany / oneToOne, entry revisions, workflow status, locale siblings, package export/import.
Deploy anywhere
No Cloud upsell. Self-host, update in-app, roll back if a swap dies mid-flight.
Wizard downloads the latest release, verifies sha256, unzip. If src/ is already there, skip.
public_html layout done right — or docker compose up with MySQL and Adminer for local.
Settings → System. Interrupted swap rolls back. restore.php if the box still needs a shove.
Secure by default
Auth is Bearer-only. The rest ships in core.
Content managers edit entries; viewers only browse the admin. Owner → admin → editor → viewer, plus field/row ACL and per-resource grants.
Google / Telegram and authenticator apps. Captcha, IP blocks, token origin/IP limits — no security plugin hunt.
Event Bus listeners with retries. Presets for Vercel / Netlify / Cloudflare / Fastly revalidation.
FAQ
Yes. public_html layout is first-class: web root in the docroot, src/ one level up. PHP 8.3+ and MySQL / MariaDB.
No. Runtime is PHP only. Node is only for building the admin UI when you develop from source.
Those want a Node host. HCMS targets classic PHP hosting: one install.php, zip from GitHub, no Cloud tier.
Roles: owner → admin → editor → viewer. Give a content manager editor access, or viewer for read-only admin. ACL can narrow resources further.
Publish migrates for you. Destructive ops (drop field, change type) require confirmDestructive — or the whole migration fails cleanly.
No. Flags (with optional A/B) and translation keys live in the same admin and public API as your content — /api/features and /api/translates.
Latest zip from GitHub. Admin at /admin, API at /api. MIT.
curl -fsSL -o install.php 'https://2js.ru/download?source=curl'
php install.php