yanfishel / atarcms-core
Lightweight content management system
Requires
- php: >=8.4
- ext-exif: *
- ext-fileinfo: *
- ext-gd: *
- ext-intl: *
- ext-mbstring: *
- ext-pdo: *
- ext-pdo_mysql: *
- guzzlehttp/guzzle: ^8.2
- intervention/image: ^4.3
- league/oauth2-client: ^2.9
- league/oauth2-google: ^5.0
- nikic/fast-route: ^1.3
- nyholm/psr7: ^1.8
- nyholm/psr7-server: ^1.1
- psr/container: ^2.0
- psr/http-client: ^1.0
- psr/http-message: ^2.0
- psr/http-server-handler: ^1.0
- psr/http-server-middleware: ^1.0
- psr/log: ^3.0
- symfony/html-sanitizer: ^8.1
- symfony/mailer: ^8.1
- wamania/php-stemmer: ^3.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.64
- phpstan/phpstan: ^2.1
- phpunit/phpunit: ^12.0
- rector/rector: ^2.0
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
AtarCMS
A small multilingual CMS that AI agents can build, run and read.
PHP 8.4 · no build step · one small VPS is enough
AtarCMS runs small sites — a studio, a clinic, a club, a workshop — with one to five trusted editors: sections and menus, entries with revisions, autosave and preview, a media library with on-demand WebP/AVIF variants, search, forms with a message inbox, SEO with generated share images, analytics behind a consent banner, an accessibility toolbar, and an admin in five languages (English, Russian, Hebrew with full RTL, German, French). Everything boots from the sources on plain OPcache: no compiled cache, no build step, no node_modules.
AI-ready, end to end
Being readable and operable by AI agents is the project's central design goal, not an add-on. The default theme scores a clean sheet in Lighthouse, including Google's new agentic browsing audit:
Every stage of a site's life has an AI surface:
1. An agent builds the site. The skeleton ships an agent skill (.agents/skills/building-atarcms-sites/,
wired up by AGENTS.md): a coding agent installs AtarCMS, builds the theme from a design brief, configures
languages, sections and menus, fills demo content and walks the go-live checklist.
2. An agent runs the admin. The admin describes itself at /admin/ai-guide — one known URL instead of
hidden per-page hints. A signed-in browser agent gets the screens it may open, every content type with its
fields and limits, and how saving, autosave, translations and media work — generated for this site and filtered
by that user's permissions. The admin itself works without JavaScript, renders semantic markup and never hides
state in scripts, so agents driving the accessibility tree operate it reliably.
3. Agents and LLMs read the published site. The public site is machine-readable without scraping:
-
/llms.txt— the whole site as a markdown map (llmstxt.org), one request:# Atar Demo > A demo site with sections, articles, news and a contact form. Site languages: en (default), ru, he Append .md to an entry's URL for a markdown version. ## News (en) - [Spring at Atar](https://example.com/news/spring-at-atar)
-
{page URL}.md— every public entry page has a markdown twin: the same content as clean markdown (text/plain), with aLink: rel="canonical"header back to the HTML page andX-Robots-Tag: noindexso search engines never see duplicates. Old addresses redirect with 301, like the HTML pages:$ curl https://example.com/contacts.md # Contacts - Language: en (translations: [he](…/he/contacts.md), [ru](…/ru/contacts.md)) ## Text …
"Hide from search engines" hides /llms.txt and the .md twins along with the sitemap, so a site under
construction leaks nothing. Details: docs/architecture.md ("AI readiness") and docs/admin-ui.md ("AI guide").
A look inside
What is in the box
- Content: collections and singles defined in code, entries with revisions, autosave, preview, scheduled publication; sections (hierarchical menus with addresses), tags and custom taxonomies; slug history with 301s.
- Multilingual by design: per-language content with linked translations, hreflang alternates, localized sitemaps and feeds; machine translation of a form in place (Chrome's on-device Translator API).
- Media: folders, bulk upload, alt texts per language, image variants on demand (WebP, AVIF, art direction), self-hosted video, YouTube/Vimeo embeds.
- Public site: themes of plain PHP templates with a strict Content Security Policy (no inline anything), search, contact and custom forms with rate limiting and a message inbox, generated share images, JSON-LD, feeds, sitemap, robots.txt — and the AI surfaces above.
- Operations:
bin/atarconsole (installer doctor, migrations, user management, one-time login links), audit log of every change, Google sign-in, deploy configs for nginx/Caddy/Apache, Docker setups for development and production. - Visitors: accessibility toolbar, cookie consent (statistics and advertising separately) gating Metrica, GA4 and ad pixels, dark/light theme.
Quick start
A site starts from the skeleton, its own repository
(yanfishel/atarcms, exported from skeleton/ with every
version tag), and gets this core as the Composer package yanfishel/atarcms-core:
composer create-project yanfishel/atarcms my-site --no-interaction
Then: fill .env, run php bin/atar migrate, create the first administrator with
php bin/atar user:create you@example.com --role=admin and sign in with a one-time
php bin/atar user:login-link — or hand the whole thing to a coding agent, which reads
AGENTS.md and does the same. Every installation path (Docker or not, local, a server, shared hosting) is in
the skeleton's .agents/skills/building-atarcms-sites/references/install.md, and php bin/atar doctor checks
the result.
Requirements: PHP 8.4 (gd, intl, mbstring, pdo_mysql, exif, fileinfo), MariaDB or MySQL, any web server — or just Docker.
Documentation
docs/architecture.md |
How every subsystem works, with the decisions behind it |
docs/theme-guide.md |
Building a public theme: templates, helpers, rules, a recipe |
docs/admin-ui.md |
The admin: design tokens, screens, the rules tests enforce |
docs/releasing.md, UPGRADE.md |
Versions, the release pipeline, what a site does after an update |
Versions are git tags (v0.1.0…); what changed is in CHANGELOG.md. This repository is a per-release mirror
of a private development repository (CONTRIBUTING.md); issues and security reports (SECURITY.md) live here.
Development
Everything runs in Docker:
docker compose run --rm php composer install
docker compose run --rm php composer check # PHP-CS-Fixer, PHPStan at level max, PHPUnit
The runnable demo site lives in skeleton/ (see skeleton/README.md).
Licence
AtarCMS's own code is released under the MIT licence (LICENSE). The vendored third-party components keep their
own licences (see "Third-party components"); the admin's rich-text editor is the GPL build of CKEditor 5, so a
redistribution of AtarCMS together with it must honour the GPL for that component.
Third-party components
- CKEditor 5 48.5.2 (the admin's rich-text editor), GPL-2.0-or-later, source:
https://github.com/ckeditor/ckeditor5/tree/v48.5.2. Its files and licence (
ckeditor5.LICENSE,ckeditor5.COPYING.GPL) are inresources/admin/assets/vendor/.






