[{"data":1,"prerenderedAt":710},["Reactive",2],{"content-/en/blog/statamic":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"locale":10,"draft":6,"date":11,"image":12,"tags":15,"imageLogo":18,"imageLogo2":23,"seoImage":27,"body":29,"_type":705,"_id":706,"_source":707,"_file":708,"_extension":709},"/en/blog/statamic","blog",false,"","Statamic CMS – Lessons from Two Projects","A flat-file CMS built on Laravel: Git integration, a modern interface and AI compatibility – but also price, caching and server requirements","en","2026-10-09T00:00:00.000Z",{"src":13,"alt":14},"/background/background-5.svg","background",[16,17],"tools","cms",{"src":19,"alt":20,"width":21,"left":22},"/logo/statamic.svg","statamic-logo","30%","10%",{"src":24,"alt":25,"width":26,"right":22},"/logo/git.svg","git-logo","15%",{"src":28},"/images/blog/statamic.webp",{"type":30,"children":31,"toc":688},"root",[32,52,59,64,69,77,83,90,103,108,114,128,133,139,144,208,213,219,224,351,371,377,389,395,401,420,425,431,443,470,476,481,527,555,561,574,661,666,672,677,682],{"type":33,"tag":34,"props":35,"children":36},"element","p",{},[37,40,50],{"type":38,"value":39},"text","I've now used ",{"type":33,"tag":41,"props":42,"children":47},"a",{":target":43,"href":44,"rel":45},"\\_blank","https://statamic.com/",[46],"nofollow",[48],{"type":38,"value":49},"Statamic",{"type":38,"value":51}," in two client projects: a conference website with programme, speakers and exhibitors, and the site of a network organisation with events, locations and articles. Both run on Statamic 6 and Laravel 13. Time for an honest interim review.",{"type":33,"tag":53,"props":54,"children":56},"h2",{"id":55},"what-is-statamic",[57],{"type":38,"value":58},"What is Statamic?",{"type":33,"tag":34,"props":60,"children":61},{},[62],{"type":38,"value":63},"Statamic is a content management system built on Laravel. At its core it is a so-called flat-file CMS: content isn't stored in a database but as Markdown and YAML files right in the project directory. On top of that comes a Control Panel (the backend) where editors manage content without ever touching a file.",{"type":33,"tag":34,"props":65,"children":66},{},[67],{"type":38,"value":68},"The frontend is built with the Antlers template language or with Blade. Statamic can also be run headless.",{"type":33,"tag":34,"props":70,"children":71},{},[72],{"type":33,"tag":73,"props":74,"children":76},"img",{"alt":75,"src":28},"The Statamic Control Panel",[],{"type":33,"tag":53,"props":78,"children":80},{"id":79},"advantages",[81],{"type":38,"value":82},"Advantages",{"type":33,"tag":84,"props":85,"children":87},"h3",{"id":86},"git-integration",[88],{"type":38,"value":89},"Git integration",{"type":33,"tag":34,"props":91,"children":92},{},[93,95,101],{"type":38,"value":94},"Since all content is stored in files, the entire project can be versioned in Git – code, templates, field definitions ",{"type":33,"tag":96,"props":97,"children":98},"em",{},[99],{"type":38,"value":100},"and",{"type":38,"value":102}," content. That's a real difference to WordPress & co., where content lives in the database and has to be painstakingly synchronised between your local environment and the server.",{"type":33,"tag":34,"props":104,"children":105},{},[106],{"type":38,"value":107},"With the Pro edition, Statamic can even commit and push changes made in the backend automatically. An editor saves an entry, and shortly afterwards the commit shows up in the repository. Every change is traceable and can be rolled back if needed.",{"type":33,"tag":84,"props":109,"children":111},{"id":110},"modern-interface",[112],{"type":38,"value":113},"Modern interface",{"type":33,"tag":34,"props":115,"children":116},{},[117,119,126],{"type":38,"value":118},"Since version 6 the Control Panel has been completely redesigned and feels very modern: fast, tidy, with dark mode, live preview and a global search (",{"type":33,"tag":120,"props":121,"children":123},"code",{"className":122},[],[124],{"type":38,"value":125},"Ctrl + K",{"type":38,"value":127},"). Fields are defined in blueprints and organised into tabs and sections. That way the backend looks exactly the way the project needs it for each content type – nothing more, nothing less.",{"type":33,"tag":34,"props":129,"children":130},{},[131],{"type":38,"value":132},"For clients this was a big plus. Onboarding took much less time than I'm used to with other systems.",{"type":33,"tag":84,"props":134,"children":136},{"id":135},"flexibility",[137],{"type":38,"value":138},"Flexibility",{"type":33,"tag":34,"props":140,"children":141},{},[142],{"type":38,"value":143},"Statamic doesn't force a structure on you. You build your content models yourself:",{"type":33,"tag":145,"props":146,"children":147},"ul",{},[148,160,177,198],{"type":33,"tag":149,"props":150,"children":151},"li",{},[152,158],{"type":33,"tag":153,"props":154,"children":155},"strong",{},[156],{"type":38,"value":157},"Collections",{"type":38,"value":159}," for pages, news, events, speakers …",{"type":33,"tag":149,"props":161,"children":162},{},[163,168,170,175],{"type":33,"tag":153,"props":164,"children":165},{},[166],{"type":38,"value":167},"Blueprints",{"type":38,"value":169}," and ",{"type":33,"tag":153,"props":171,"children":172},{},[173],{"type":38,"value":174},"fieldsets",{"type":38,"value":176}," for the fields, including Replicator/Bard/Grid for flexible page building blocks",{"type":33,"tag":149,"props":178,"children":179},{},[180,185,187,192,193],{"type":33,"tag":153,"props":181,"children":182},{},[183],{"type":38,"value":184},"Taxonomies",{"type":38,"value":186},", ",{"type":33,"tag":153,"props":188,"children":189},{},[190],{"type":38,"value":191},"globals",{"type":38,"value":169},{"type":33,"tag":153,"props":194,"children":195},{},[196],{"type":38,"value":197},"navigations",{"type":33,"tag":149,"props":199,"children":200},{},[201,206],{"type":33,"tag":153,"props":202,"children":203},{},[204],{"type":38,"value":205},"Roles and permissions",{"type":38,"value":207},", for example \"Content Editor\" and \"Site Manager\" with precisely defined rights",{"type":33,"tag":34,"props":209,"children":210},{},[211],{"type":38,"value":212},"Because it's Laravel, everything can be extended: custom controllers, commands, scheduler (for us: importing external API data), queues and addons. If something is missing, you just write it in PHP.",{"type":33,"tag":84,"props":214,"children":216},{"id":215},"flat-file-cms",[217],{"type":38,"value":218},"Flat-file CMS",{"type":33,"tag":34,"props":220,"children":221},{},[222],{"type":38,"value":223},"No database means no database server, no dumps, no migration headaches between staging and production. An entry looks like this:",{"type":33,"tag":225,"props":226,"children":230},"pre",{"className":227,"code":228,"language":229,"meta":7,"style":7},"language-yaml shiki shiki-themes dracula","---\nid: 6f0c4a1e-0000-0000-0000-000000000000\ntitle: Opening keynote\npublished: true\nstart: '2026-10-09 10:00'\n---\nThe content goes here as plain **Markdown**.\n","yaml",[231],{"type":33,"tag":120,"props":232,"children":233},{"__ignoreMap":7},[234,246,268,286,305,334,342],{"type":33,"tag":235,"props":236,"children":239},"span",{"class":237,"line":238},"line",1,[240],{"type":33,"tag":235,"props":241,"children":243},{"style":242},"--shiki-default:#F8F8F2",[244],{"type":38,"value":245},"---\n",{"type":33,"tag":235,"props":247,"children":249},{"class":237,"line":248},2,[250,256,262],{"type":33,"tag":235,"props":251,"children":253},{"style":252},"--shiki-default:#8BE9FD",[254],{"type":38,"value":255},"id",{"type":33,"tag":235,"props":257,"children":259},{"style":258},"--shiki-default:#FF79C6",[260],{"type":38,"value":261},":",{"type":33,"tag":235,"props":263,"children":265},{"style":264},"--shiki-default:#F1FA8C",[266],{"type":38,"value":267}," 6f0c4a1e-0000-0000-0000-000000000000\n",{"type":33,"tag":235,"props":269,"children":271},{"class":237,"line":270},3,[272,277,281],{"type":33,"tag":235,"props":273,"children":274},{"style":252},[275],{"type":38,"value":276},"title",{"type":33,"tag":235,"props":278,"children":279},{"style":258},[280],{"type":38,"value":261},{"type":33,"tag":235,"props":282,"children":283},{"style":264},[284],{"type":38,"value":285}," Opening keynote\n",{"type":33,"tag":235,"props":287,"children":289},{"class":237,"line":288},4,[290,295,299],{"type":33,"tag":235,"props":291,"children":292},{"style":252},[293],{"type":38,"value":294},"published",{"type":33,"tag":235,"props":296,"children":297},{"style":258},[298],{"type":38,"value":261},{"type":33,"tag":235,"props":300,"children":302},{"style":301},"--shiki-default:#BD93F9",[303],{"type":38,"value":304}," true\n",{"type":33,"tag":235,"props":306,"children":308},{"class":237,"line":307},5,[309,314,318,324,329],{"type":33,"tag":235,"props":310,"children":311},{"style":252},[312],{"type":38,"value":313},"start",{"type":33,"tag":235,"props":315,"children":316},{"style":258},[317],{"type":38,"value":261},{"type":33,"tag":235,"props":319,"children":321},{"style":320},"--shiki-default:#E9F284",[322],{"type":38,"value":323}," '",{"type":33,"tag":235,"props":325,"children":326},{"style":264},[327],{"type":38,"value":328},"2026-10-09 10:00",{"type":33,"tag":235,"props":330,"children":331},{"style":320},[332],{"type":38,"value":333},"'\n",{"type":33,"tag":235,"props":335,"children":337},{"class":237,"line":336},6,[338],{"type":33,"tag":235,"props":339,"children":340},{"style":242},[341],{"type":38,"value":245},{"type":33,"tag":235,"props":343,"children":345},{"class":237,"line":344},7,[346],{"type":33,"tag":235,"props":347,"children":348},{"style":264},[349],{"type":38,"value":350},"The content goes here as plain **Markdown**.\n",{"type":33,"tag":34,"props":352,"children":353},{},[354,356,362,363,369],{"type":38,"value":355},"It's easy to read, easy to back up and easy to move. Cloning a project means ",{"type":33,"tag":120,"props":357,"children":359},{"className":358},[],[360],{"type":38,"value":361},"git clone",{"type":38,"value":186},{"type":33,"tag":120,"props":364,"children":366},{"className":365},[],[367],{"type":38,"value":368},"composer install",{"type":38,"value":370}," – done. Users and roles are files as well. A database is only needed for Laravel internals, if at all – in our case a small SQLite file does the job.",{"type":33,"tag":84,"props":372,"children":374},{"id":373},"ai-compatibility",[375],{"type":38,"value":376},"AI compatibility",{"type":33,"tag":34,"props":378,"children":379},{},[380,382,387],{"type":38,"value":381},"Because ",{"type":33,"tag":96,"props":383,"children":384},{},[385],{"type":38,"value":386},"everything",{"type":38,"value":388}," in Statamic is stored in files, an AI assistant in your editor can read and understand the whole project: templates, blueprints, content, configuration. It can create new collections, add fields, adjust entries or refactor templates without needing access to a database or an API. Everything also shows up in the Git diff, which makes it easy to review.",{"type":33,"tag":53,"props":390,"children":392},{"id":391},"disadvantages",[393],{"type":38,"value":394},"Disadvantages",{"type":33,"tag":84,"props":396,"children":398},{"id":397},"price",[399],{"type":38,"value":400},"Price",{"type":33,"tag":34,"props":402,"children":403},{},[404,406,411,413,418],{"type":38,"value":405},"Statamic Core is free, but comes with limitations, most notably a single user account. As soon as you need several editors, roles, revisions, multiple languages/sites or the Git integration, you need Pro. Since May 2026 that costs ",{"type":33,"tag":153,"props":407,"children":408},{},[409],{"type":38,"value":410},"$349 per site",{"type":38,"value":412}," (one-time, includes one year of updates), then ",{"type":33,"tag":153,"props":414,"children":415},{},[416],{"type":38,"value":417},"$99 per year",{"type":38,"value":419}," for updates and support. Before it was $275 and $65.",{"type":33,"tag":34,"props":421,"children":422},{},[423],{"type":38,"value":424},"For a client project that's manageable. For hobby projects, small club websites or when you run lots of small sites, it's a noticeable expense compared to WordPress. So include the price in your quote from the start. On the plus side, forms, static caching and a navigation builder are already included, for which other systems often require paid plugins.",{"type":33,"tag":84,"props":426,"children":428},{"id":427},"caching",[429],{"type":38,"value":430},"Caching",{"type":33,"tag":34,"props":432,"children":433},{},[434,436,441],{"type":38,"value":435},"To keep a file-based system fast, Statamic uses the ",{"type":33,"tag":153,"props":437,"children":438},{},[439],{"type":38,"value":440},"Stache",{"type":38,"value":442},", a cache index over all content. On top of that come the regular Laravel caches (config, routes, views) and optionally static caching.",{"type":33,"tag":34,"props":444,"children":445},{},[446,448,454,455,461,462,468],{"type":38,"value":447},"In practice this means: if something looks \"odd\" after a deployment, it's almost always the cache. In our case, for example, a config cache with wrong absolute paths caused a 500 error. After every deploy, ",{"type":33,"tag":120,"props":449,"children":451},{"className":450},[],[452],{"type":38,"value":453},"cache:clear",{"type":38,"value":186},{"type":33,"tag":120,"props":456,"children":458},{"className":457},[],[459],{"type":38,"value":460},"config:clear",{"type":38,"value":169},{"type":33,"tag":120,"props":463,"children":465},{"className":464},[],[466],{"type":38,"value":467},"statamic:stache:clear",{"type":38,"value":469}," are a must. If you use static caching, you also need to think about invalidation.",{"type":33,"tag":84,"props":471,"children":473},{"id":472},"server-requirements",[474],{"type":38,"value":475},"Server requirements",{"type":33,"tag":34,"props":477,"children":478},{},[479],{"type":38,"value":480},"Statamic is a Laravel application and needs a matching environment:",{"type":33,"tag":145,"props":482,"children":483},{},[484,494,499,517,522],{"type":33,"tag":149,"props":485,"children":486},{},[487,492],{"type":33,"tag":153,"props":488,"children":489},{},[490],{"type":38,"value":491},"PHP 8.3+",{"type":38,"value":493}," (8.4 in some of our setups)",{"type":33,"tag":149,"props":495,"children":496},{},[497],{"type":38,"value":498},"Composer and ideally SSH access",{"type":33,"tag":149,"props":500,"children":501},{},[502,504,510,511],{"type":38,"value":503},"Write permissions for ",{"type":33,"tag":120,"props":505,"children":507},{"className":506},[],[508],{"type":38,"value":509},"storage/",{"type":38,"value":169},{"type":33,"tag":120,"props":512,"children":514},{"className":513},[],[515],{"type":38,"value":516},"bootstrap/cache",{"type":33,"tag":149,"props":518,"children":519},{},[520],{"type":38,"value":521},"GD or Imagick for image processing (Glide)",{"type":33,"tag":149,"props":523,"children":524},{},[525],{"type":38,"value":526},"Cron for the Laravel scheduler",{"type":33,"tag":34,"props":528,"children":529},{},[530,532,538,539,545,547,553],{"type":38,"value":531},"Cheap shared hosting with an old PHP version is out. At one host the account's default PHP version was still 7.4, so PHP had to be switched explicitly via ",{"type":33,"tag":120,"props":533,"children":535},{"className":534},[],[536],{"type":38,"value":537},".htaccess",{"type":38,"value":169},{"type":33,"tag":120,"props":540,"children":542},{"className":541},[],[543],{"type":38,"value":544},"php84",{"type":38,"value":546}," had to be used instead of ",{"type":33,"tag":120,"props":548,"children":550},{"className":549},[],[551],{"type":38,"value":552},"php",{"type":38,"value":554}," on the CLI. Compared to a static Nuxt site on Netlify or simple WordPress hosting, that's considerably more effort.",{"type":33,"tag":84,"props":556,"children":558},{"id":557},"deployment-a-conditional-disadvantage",[559],{"type":38,"value":560},"Deployment – a conditional disadvantage",{"type":33,"tag":34,"props":562,"children":563},{},[564,566,572],{"type":38,"value":565},"Deployment itself is actually unproblematic: GitHub Actions builds ",{"type":33,"tag":120,"props":567,"children":569},{"className":568},[],[570],{"type":38,"value":571},"vendor/",{"type":38,"value":573}," and the assets, transfers them to the server, and a few Artisan commands run afterwards. That's not specific to Statamic, it's everyday Laravel. Still, there were a few stumbling blocks:",{"type":33,"tag":145,"props":575,"children":576},{},[577,611,625,643],{"type":33,"tag":149,"props":578,"children":579},{},[580,585,587,593,595,601,603,609],{"type":33,"tag":153,"props":581,"children":582},{},[583],{"type":38,"value":584},"nginx and Glide:",{"type":38,"value":586}," Image variants (",{"type":33,"tag":120,"props":588,"children":590},{"className":589},[],[591],{"type":38,"value":592},"/img/...",{"type":38,"value":594},") returned 404 because the default configuration intercepts static file extensions like ",{"type":33,"tag":120,"props":596,"children":598},{"className":597},[],[599],{"type":38,"value":600},".webp",{"type":38,"value":602}," before PHP gets a chance. You need a dedicated ",{"type":33,"tag":120,"props":604,"children":606},{"className":605},[],[607],{"type":38,"value":608},"location",{"type":38,"value":610}," rule.",{"type":33,"tag":149,"props":612,"children":613},{},[614,623],{"type":33,"tag":153,"props":615,"children":616},{},[617],{"type":33,"tag":120,"props":618,"children":620},{"className":619},[],[621],{"type":38,"value":622},"open_basedir",{"type":38,"value":624}," was set too restrictively on Plesk.",{"type":33,"tag":149,"props":626,"children":627},{},[628,633,635,641],{"type":33,"tag":153,"props":629,"children":630},{},[631],{"type":38,"value":632},"Permissions and directories:",{"type":38,"value":634}," ",{"type":33,"tag":120,"props":636,"children":638},{"className":637},[],[639],{"type":38,"value":640},"storage/logs",{"type":38,"value":642}," was missing after the deploy because the directory wasn't in the repository.",{"type":33,"tag":149,"props":644,"children":645},{},[646,651,653,659],{"type":33,"tag":153,"props":647,"children":648},{},[649],{"type":38,"value":650},"Content vs. code:",{"type":38,"value":652}," This is the real catch. If editors change content on the server and a code deploy later overwrites those files from the repository, the changes are gone. You either exclude ",{"type":33,"tag":120,"props":654,"children":656},{"className":655},[],[657],{"type":38,"value":658},"content/",{"type":38,"value":660}," from the deploy or rely on the Git integration – which then has to play nicely with the deploy so pushes don't fail with \"non-fast-forward\".",{"type":33,"tag":34,"props":662,"children":663},{},[664],{"type":38,"value":665},"Once it's set up properly, it runs reliably. But if you're starting out, plan for these points from day one.",{"type":33,"tag":53,"props":667,"children":669},{"id":668},"conclusion",[670],{"type":38,"value":671},"Conclusion",{"type":33,"tag":34,"props":673,"children":674},{},[675],{"type":38,"value":676},"Statamic is one of the most pleasant CMSs I've worked with so far. The combination of Git workflow, modern backend and full customisability is a great fit for projects where editors need a comfortable interface while developers still want full control over code and structure. The fact that everything lives in files also makes working with AI assistants much easier.",{"type":33,"tag":34,"props":678,"children":679},{},[680],{"type":38,"value":681},"The downsides are manageable, but real: the price of Pro, a server with a current PHP version, and a bit of discipline around caching and deployment. For simple, small sites without editors or with a tight budget, there are other options that may fit better. For client projects with real requirements, I'd use Statamic again any time.",{"type":33,"tag":683,"props":684,"children":685},"style",{},[686],{"type":38,"value":687},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":248,"depth":248,"links":689},[690,691,698,704],{"id":55,"depth":248,"text":58},{"id":79,"depth":248,"text":82,"children":692},[693,694,695,696,697],{"id":86,"depth":270,"text":89},{"id":110,"depth":270,"text":113},{"id":135,"depth":270,"text":138},{"id":215,"depth":270,"text":218},{"id":373,"depth":270,"text":376},{"id":391,"depth":248,"text":394,"children":699},[700,701,702,703],{"id":397,"depth":270,"text":400},{"id":427,"depth":270,"text":430},{"id":472,"depth":270,"text":475},{"id":557,"depth":270,"text":560},{"id":668,"depth":248,"text":671},"markdown","content:en:blog:statamic.md","content","en/blog/statamic.md","md",1791545016253]