Live demo: notacms.holas.pl
notACMS is a static site generator built on Symfony 7.4. Write content in Markdown with YAML frontmatter, configure your locales and site settings in a single YAML file, and deploy a fully pre-rendered HTML site served by nginx — no database, no runtime PHP (except an optional contact form). Customize templates, styles, and content without touching core files via the local/ override system.
- Static by default — all pages are pre-rendered to HTML at build time; nginx serves them directly
- Multi-language — any number of locales, configured in
local/content/_site.yaml; the demo ships with English, German, and Polish - Markdown content — posts and pages are Markdown files with YAML frontmatter; no admin panel, no database
local/overrides — templates, SCSS, translations, nginx config, and content all live inlocal/so you never modify core files- Two themes out of the box — ship the minimal bare wireframe for custom builds, or the polished demo (amber-phosphor with dark mode, search overlay, docs sidebar) shown on the live site above
Upgrading from 1.0.0? See UPGRADE-1.1.md. A drop-in compatibility package at
docs/customization/old-template/restores the 1.0.0 look.
Requires DDEV and Node.js/npx (for Pagefind search index).
git clone https://github.com/holas1337/notACMS my-site
cd my-site
ddev start
ddev build # seeds local/ from docs/demo/ (default) and builds the site
# or
ddev build --bare # seed from docs/bare/ — minimal wireframe, build your own look on topOpen https://notacms.ddev.site to see your site. Edit local/content/_site.yaml to configure your domain, locales, and site name.
Theme choice on first build:
--demo(default) — copies the full demo design intolocal/: templates, SCSS, JS, translations, nginx, content. Matches the live site at notacms.holas.pl.--bare— copies only minimal seed content intolocal/content/. Core bare templates and styles render the site. Use this when you plan to write your own theme.
Flags are mutually exclusive. Once local/ has content, subsequent ddev build runs skip seeding.
| Command | Description |
|---|---|
ddev start |
Start DDEV development environment |
ddev build |
Full production build (static HTML + search index) |
ddev test |
Run PHPUnit test suite |
ddev code-check |
Run code quality checks (CS Fixer, Rector, PHPStan, Twig lint) |
ddev code-fix |
Auto-fix PHP code style issues |
ddev exec php bin/console sass:build --watch |
SCSS watch mode |
| Command | Description |
|---|---|
./notACMS deploy --prod |
Production deploy: build image, start containers, full build (seeds --demo by default) |
./notACMS deploy --prod --bare |
Production deploy with bare wireframe theme |
./notACMS deploy --prod --port 8081 |
Override port at runtime |
./notACMS deploy down |
Stop and remove containers |
./notACMS rebuild |
Rebuild static HTML + search index (containers already running) |
./notACMS rebuild --bare |
Rebuild and re-seed local/content/ from docs/bare/ |
./notACMS --help |
Show all commands and options |
Set NGINX_PORT=80 in .env.local to expose on port 80.
- PHP 8.5 + Symfony 7.4 (minimal, no database)
- DDEV for local development
- Markdown content with YAML frontmatter
- Twig templates
- Pagefind for client-side search (WASM, auto language split)
- Cloudflare Turnstile captcha on contact form
- AssetMapper for frontend assets (no Node.js build step)
| File | Contents |
|---|---|
| docs/ARCHITECTURE.md | Content pipeline, routing, services, and templates |
| docs/EDITOR_GUIDE.md | How to write and publish posts and pages (frontmatter, images, drafts, series) |
| docs/STYLEGUIDE.md | Design tokens, components, and the living styleguide |
| docs/LOCALES.md | How to add, remove, or manage locales |
| docs/CUSTOMIZATION.md | How to override templates, JS, SCSS, and nginx config via local/ |
| docs/TESTING.md | How to run tests, write new tests, and the coverage strategy |
| docs/TESTS.md | Quick reference: test file map, fixtures, naming conventions |
notACMS is designed to be AI-friendly — content is Markdown with structured YAML frontmatter, all configuration lives in plain text files, and the local/ override system means an AI agent can customize the site without touching core files.
Two optional MCP servers are used for AI-assisted content workflows (image generation).
Requires Draw Things running locally with the API server enabled (Settings → API Server).
Claude Code:
claude mcp add draw-things \
--env DRAWTHINGS_HOST=YOUR_DRAW_THINGS_IP \
--env DRAWTHINGS_PORT=7860 \
-- npx -y mcp-drawthingsOpenCode — add to ~/.opencode/opencode.json:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"draw-things": {
"type": "local",
"command": ["npx", "-y", "mcp-drawthings"],
"environment": {
"DRAWTHINGS_HOST": "YOUR_DRAW_THINGS_IP",
"DRAWTHINGS_PORT": "7860"
},
"timeout": 600000,
"enabled": true
}
}
}Important: Klein 9B image generation takes time — timeout: 600000 (600 seconds) is required. Also, always pass all parameters explicitly (model, width, height, steps, seed, cfg_scale) when calling the MCP tool, even if they match current Draw Things settings.
See local/docs/EDITOR_GUIDE.md → "AI image generation" for model settings and batch workflow.
Claude Code:
claude mcp add --transport http hf-mcp-server https://huggingface.co/mcp \
--header "Authorization: Bearer YOUR_HF_TOKEN"OpenCode — add to ~/.opencode/opencode.json:
{
"hf-mcp-server": {
"type": "remote",
"url": "https://huggingface.co/mcp",
"headers": {
"Authorization": "Bearer YOUR_HF_TOKEN"
},
"enabled": true
}
}Get your token at huggingface.co/settings/tokens. Used as a fallback when Draw Things is unavailable.
Apache 2.0 — see LICENSE.
This project uses open-source software. All dependency licenses are available
in vendor/*/LICENSE after running composer install.
See CONTRIBUTING.md for development setup, code standards, and the PR process. For site customizations, use the local/ override system — no core files need editing. See docs/CUSTOMIZATION.md.
Built by a developer, for developers — holas