[{"id":"writing-with-twig","draft":false,"featured":false,"title":"Writing Templates with Twig","date":"2026-01-22T00:00:00+01:00","author":"Stephan Brockert","summary":"<p>How to use Twig in your page templates \u2014 variables, filters, includes, and the cms global.<\/p>","media":"http:\/\/www.huel.com\/perferendis-quam-cumque-eos-iure-facere-fuga","content":"<p>Total CMS uses <a href=\"https:\/\/twig.symfony.com\">Twig<\/a> for templating. Inside any builder template, you have access to the <code>cms<\/code> global \u2014 your gateway to collections, configuration, and dynamic content.<\/p><h3>Common patterns<\/h3><ul><li><code>cms.collection.objects('blog')<\/code> \u2014 fetch all blog posts<\/li><li><code>cms.data.raw('blog', params.id)<\/code> \u2014 fetch a single post<\/li><li><code>cms.config('domain')<\/code> \u2014 read a config value<\/li><\/ul><p>The <a href=\"\/admin\/utils\/twig-playground\">Twig Playground<\/a> lets you experiment with templates without committing changes.<\/p>","extra":"<ol><li>Accusamus dolore occaecati veritatis error at ut dolorem iste consequatur necessitatibus qui quaerat est.<\/li><li>A autem aut voluptatum sed.<\/li><li>Nostrum rerum dolores eaque impedit porro.<\/li><li>Quia aperiam iusto et nobis rerum voluptatum.<\/li><li>Sed itaque saepe maiores et natus consequatur sunt iure voluptatum maiores.<\/li><li>Consequuntur reiciendis a recusandae rerum sunt.<\/li><\/ol><p>Deserunt voluptas possimus labore et fugiat officiis est nihil eius vel. Quis maiores ut voluptatibus eaque aspernatur libero consequuntur et eum. Eum illo ipsam suscipit unde temporibus a optio placeat.<\/p><p>Blanditiis voluptatibus ab ad cum vero quidem odit ut numquam et consequatur placeat. Quo pariatur ut officiis excepturi cumque non et. Vitae sequi omnis accusamus voluptates quis quis voluptatibus consectetur architecto consectetur debitis <em>sunt exercitationem<\/em> quibusdam voluptatem occaecati enim consequuntur totam. Asperiores dolor nobis dolore inventore a <strong>nostrum<\/strong> mollitia aut eum.<\/p>","categories":["tutorials"],"tags":["twig","templates","tutorial"],"image":{"alt":"","exif":{"nodata":""},"featured":false,"focalpoint":{"x":50,"y":50},"hash":"816a2342","height":480,"link":"","mime":"image\/jpeg","name":"picsum-6a2584888aaaa4.00353388.jpg","palette":["#000000","#000000","#000000","#000000","#000000"],"size":20574,"tags":[],"uploadDate":"2026-06-07T16:47:00+02:00","width":640},"gallery":[{"alt":"","exif":{"nodata":""},"featured":false,"focalpoint":{"x":50,"y":50},"hash":"52bc9bbc","height":1080,"link":"","mime":"image\/png","name":"imageShape-6a258488d7a473.55473778.png","palette":[],"size":12966,"tags":[],"uploadDate":"2026-06-07T16:47:37+02:00","width":1920},{"alt":"","exif":{"nodata":""},"featured":false,"focalpoint":{"x":50,"y":50},"hash":"d02f7f70","height":1080,"link":"","mime":"image\/png","name":"imageShape-6a258488eef051.28114974.png","palette":[],"size":13468,"tags":[],"uploadDate":"2026-06-07T16:47:37+02:00","width":1920},{"alt":"","exif":{"nodata":""},"featured":false,"focalpoint":{"x":50,"y":50},"hash":"e2b42902","height":1080,"link":"","mime":"image\/png","name":"imageShape-6a2584890d6c26.15878692.png","palette":[],"size":12178,"tags":[],"uploadDate":"2026-06-07T16:47:37+02:00","width":1920},{"alt":"","exif":{"nodata":""},"featured":false,"focalpoint":{"x":50,"y":50},"hash":"94b39399","height":1080,"link":"","mime":"image\/png","name":"imageShape-6a2584891f9c85.00420477.png","palette":[],"size":11268,"tags":[],"uploadDate":"2026-06-07T16:47:37+02:00","width":1920},{"alt":"","exif":{"nodata":""},"featured":false,"focalpoint":{"x":50,"y":50},"hash":"ee4462ce","height":1080,"link":"","mime":"image\/png","name":"imageShape-6a258489321ef7.21149897.png","palette":[],"size":11454,"tags":[],"uploadDate":"2026-06-07T16:47:37+02:00","width":1920}],"updated":"2026-06-08T12:50:45+02:00","created":"2026-06-07T16:47:00+02:00"},{"id":"welcome-to-total-cms","draft":false,"featured":true,"title":"Welcome to Total CMS","date":"2026-01-15T09:00:00+00:00","author":"Joe Workman","summary":"A quick tour of what makes Total CMS different \u2014 flat-file storage, dynamic routing, and the Site Builder.","media":"http:\/\/www.beer.com\/est-sed-ut-fugiat-alias.html","content":"<p>Welcome! This is your first sample post \u2014 feel free to edit, delete, or duplicate it as you build out your blog. Posts are stored as JSON objects in the <code>blog<\/code> collection, and the Site Builder's page router handles all the URL routing for you.<\/p><p>To add your own post, head to <a href=\"\/admin\/collections\/blog\">Collections \u2192 Blog<\/a> and click <em>+ New Object<\/em>. Your post will be available at <code>\/blog\/{id}<\/code> immediately \u2014 no rebuild step.<\/p>","extra":"<ol>\n\t<li><em>Fuga<\/em> aut et.<\/li>\n\t<li><strong>Eligendi<\/strong> quis alias nemo impedit.<\/li>\n\t<li>Placeat eos libero accusantium.<\/li>\n<\/ol>","categories":["tutorials"],"tags":["getting-started","welcome"],"image":{"alt":"","exif":{"nodata":""},"featured":false,"focalpoint":{"x":50,"y":50},"hash":"28b7262d","height":480,"link":"","mime":"image\/jpeg","name":"picsum-6a258487af9c98.46492832.jpg","palette":[],"size":11615,"tags":[],"uploadDate":"2026-06-07T16:47:36+02:00","width":640},"gallery":[{"alt":"","exif":{"nodata":""},"featured":false,"focalpoint":{"x":50,"y":50},"hash":"7b5f1100","height":1080,"link":"","mime":"image\/png","name":"imageShape-6a2584881b5723.43193284.png","palette":[],"size":10368,"tags":[],"uploadDate":"2026-06-07T16:47:36+02:00","width":1920},{"alt":"","exif":{"nodata":""},"featured":false,"focalpoint":{"x":50,"y":50},"hash":"8b9ee6f6","height":1080,"link":"","mime":"image\/png","name":"imageShape-6a25848838ddd7.96329438.png","palette":[],"size":13087,"tags":[],"uploadDate":"2026-06-07T16:47:36+02:00","width":1920},{"alt":"","exif":{"nodata":""},"featured":false,"focalpoint":{"x":50,"y":50},"hash":"983f0340","height":1080,"link":"","mime":"image\/png","name":"imageShape-6a2584884ccb53.91154120.png","palette":[],"size":11588,"tags":[],"uploadDate":"2026-06-07T16:47:36+02:00","width":1920},{"alt":"","exif":{"nodata":""},"featured":false,"focalpoint":{"x":50,"y":50},"hash":"8af621e2","height":1080,"link":"","mime":"image\/png","name":"imageShape-6a258488600029.90912822.png","palette":[],"size":10152,"tags":[],"uploadDate":"2026-06-07T16:47:36+02:00","width":1920},{"alt":"","exif":{"nodata":""},"featured":false,"focalpoint":{"x":50,"y":50},"hash":"05aa9682","height":1080,"link":"","mime":"image\/png","name":"imageShape-6a25848872bb63.42586565.png","palette":[],"size":9619,"tags":[],"uploadDate":"2026-06-07T16:47:36+02:00","width":1920}],"updated":"2026-06-07T16:47:36+02:00","created":"2026-06-07T16:47:36+02:00"},{"id":"publishing-workflow","draft":false,"featured":false,"title":"A Sane Publishing Workflow","date":"2026-02-04T14:00:00+00:00","author":"Joe Workman","summary":"Drafts, publish toggles, scheduled posts \u2014 the patterns I use to keep a blog organized.","media":"http:\/\/www.wilkinson.com\/quia-nam-illum-dolores-iste.html","content":"<p>Every blog post in Total CMS has a <code>draft<\/code> toggle. Draft posts won't appear in your listing or be reachable at their URL. Flip it off when you're ready to publish.<\/p><p>For scheduled publishing, set a future <code>date<\/code> field and filter by date in your listing template:<\/p><pre><code>{% verbatim %}{% set posts = cms.collection.objects('blog')\n    | filter(p =&gt; not p.draft and p.date &lt;= 'now' | date('c'))\n    | sortCollectionByString('date:desc') %}{% endverbatim %}<\/code><\/pre><p>That's it \u2014 no plugins needed.<\/p>","extra":"<p>Sed dolorem aut et vel unde dolore itaque repudiandae earum omnis sequi omnis vel nihil architecto qui eos et. Ut est <strong>magnam est<\/strong> quam id et ipsa. <strong>Sequi omnis<\/strong> unde sint ut porro dignissimos odio quis ab occaecati.<\/p>\n\n<p>Quos quis quidem adipisci impedit voluptatem. Ut aspernatur iure esse adipisci minima natus inventore a repudiandae. Veritatis atque id et dolorem reprehenderit perspiciatis temporibus ea ipsum fugit possimus qui et.<\/p>\n\n<p>Numquam sint qui <a href=\"#optio\">dolor facilis<\/a> aut. Aliquam architecto dicta dolorum et <a href=\"#eum\">et illum similique<\/a> illo quis et delectus nihil. Reprehenderit velit animi doloribus officia tenetur voluptatem excepturi quo quis. Ex ducimus maiores labore in quibusdam ab voluptatem nesciunt atque nobis. Quis accusantium maiores aperiam harum dolorem optio qui. Adipisci voluptate sapiente voluptas maiores id magnam et perspiciatis. Optio doloribus quia non optio est ea omnis cum in quidem rerum non nulla maiores.<\/p>","categories":["workflow"],"tags":["publishing","drafts"],"image":{"alt":"","exif":{"nodata":""},"featured":false,"focalpoint":{"x":50,"y":50},"hash":"b249f3de","height":480,"link":"","mime":"image\/jpeg","name":"picsum-6a2584894a3da9.71033093.jpg","palette":[],"size":19236,"tags":[],"uploadDate":"2026-06-07T16:47:37+02:00","width":640},"gallery":[{"alt":"","exif":{"nodata":""},"featured":false,"focalpoint":{"x":50,"y":50},"hash":"3ec363fb","height":1080,"link":"","mime":"image\/png","name":"imageShape-6a2584899602b9.40788878.png","palette":[],"size":12587,"tags":[],"uploadDate":"2026-06-07T16:47:38+02:00","width":1920},{"alt":"","exif":{"nodata":""},"featured":false,"focalpoint":{"x":50,"y":50},"hash":"9cbc9d74","height":1080,"link":"","mime":"image\/png","name":"imageShape-6a258489ae0273.88943971.png","palette":[],"size":11552,"tags":[],"uploadDate":"2026-06-07T16:47:38+02:00","width":1920},{"alt":"","exif":{"nodata":""},"featured":false,"focalpoint":{"x":50,"y":50},"hash":"dbd85c3f","height":1080,"link":"","mime":"image\/png","name":"imageShape-6a258489c144b4.13982009.png","palette":[],"size":11529,"tags":[],"uploadDate":"2026-06-07T16:47:38+02:00","width":1920},{"alt":"","exif":{"nodata":""},"featured":false,"focalpoint":{"x":50,"y":50},"hash":"dafc5103","height":1080,"link":"","mime":"image\/png","name":"imageShape-6a258489d4f848.02833926.png","palette":[],"size":13202,"tags":[],"uploadDate":"2026-06-07T16:47:38+02:00","width":1920},{"alt":"","exif":{"nodata":""},"featured":false,"focalpoint":{"x":50,"y":50},"hash":"090ccb47","height":1080,"link":"","mime":"image\/png","name":"imageShape-6a258489e85002.60981205.png","palette":[],"size":10840,"tags":[],"uploadDate":"2026-06-07T16:47:38+02:00","width":1920}],"updated":"2026-06-07T16:47:38+02:00","created":"2026-06-07T16:47:38+02:00"},{"id":"styling-without-a-build","draft":false,"featured":false,"title":"Styling Your Site Without a Build Step","date":"2026-03-02T08:45:00+00:00","author":"Joe Workman","summary":"You don't need npm, Vite, or webpack to ship a beautiful site. Here's how the inline-styles approach holds up.","media":"http:\/\/wilkinson.biz\/ut-iste-sed-aut-inventore-omnis-ut-doloremque","content":"<p>The starter ships with inline <code>&lt;style&gt;<\/code> tags in the layout \u2014 and that's deliberate. Plain CSS still works fine, modern browsers ship excellent layout primitives, and one HTTP round-trip beats a build pipeline for many sites.<\/p><p>When you do want a frontend pipeline, run <code>tcms builder:frontend<\/code> and you'll get a Vite scaffold ready to go. Until then: edit the <code>&lt;style&gt;<\/code> block in <code>layouts\/default.twig<\/code>.<\/p>","extra":"<p>Accusantium quibusdam ea <a href=\"#eius\">alias expedita qui.<\/a> Et reprehenderit tempora suscipit placeat qui <a href=\"#rerum\">asperiores veniam<\/a> totam voluptate nostrum voluptate cum reiciendis. Nihil voluptatibus minima dolorem eveniet rem quidem. <strong>A<\/strong> placeat quia veritatis exercitationem sed id. Tenetur qui ipsam in explicabo sit qui ad rerum aut fugit cumque et sapiente perferendis inventore accusantium aut. Molestias modi consequatur impedit consequatur sunt voluptatibus iste ut quaerat <em>tenetur<\/em> vero iusto officia. Ipsam quae facilis rerum quia dignissimos non placeat quis sunt. Blanditiis facilis molestiae soluta hic praesentium reprehenderit asperiores culpa tempora totam.<\/p>\n\n<p><strong>Quia<\/strong> consequatur nam repellendus. Voluptas autem consequuntur architecto sunt. Non voluptatem dolores dolorem autem ullam odio quod nam est adipisci dolor dignissimos. Cupiditate blanditiis possimus pariatur eligendi quam a iure sit doloremque rerum incidunt aut. Est rerum placeat laborum voluptatibus quia enim. Molestiae sint non quia autem reprehenderit reiciendis a voluptas et dolorem rerum sunt iusto aperiam aspernatur. Facere exercitationem voluptate aliquid optio ut quia voluptate recusandae doloribus. <a href=\"#sed\">Et fuga quo<\/a> expedita expedita.<\/p>\n\n<ul>\n\t<li>Necessitatibus rerum consectetur nemo sapiente tenetur dicta in.<\/li>\n\t<li>Ut corrupti commodi quasi esse autem.<\/li>\n\t<li>Est vero cum dolores voluptate recusandae incidunt <em>quaerat<\/em> similique.<\/li>\n\t<li>Vel deleniti vel incidunt quam necessitatibus eaque tenetur tenetur neque perferendis culpa.<\/li>\n\t<li>Rerum <strong>voluptatem<\/strong> ut sed ipsa ut.<\/li>\n<\/ul>","categories":["design"],"tags":["css","design","no-build"],"image":{"alt":"","exif":{"nodata":""},"featured":false,"focalpoint":{"x":50,"y":50},"hash":"4fb1f50d","height":480,"link":"","mime":"image\/jpeg","name":"picsum-6a25848ab363b2.54915376.jpg","palette":[],"size":14058,"tags":[],"uploadDate":"2026-06-07T16:47:39+02:00","width":640},"gallery":[{"alt":"","exif":{"nodata":""},"featured":false,"focalpoint":{"x":50,"y":50},"hash":"342e173a","height":1080,"link":"","mime":"image\/png","name":"imageShape-6a25848b0be2b6.59298153.png","palette":[],"size":11284,"tags":[],"uploadDate":"2026-06-07T16:47:39+02:00","width":1920},{"alt":"","exif":{"nodata":""},"featured":false,"focalpoint":{"x":50,"y":50},"hash":"e856c28b","height":1080,"link":"","mime":"image\/png","name":"imageShape-6a25848b24e036.61978796.png","palette":[],"size":11290,"tags":[],"uploadDate":"2026-06-07T16:47:39+02:00","width":1920},{"alt":"","exif":{"nodata":""},"featured":false,"focalpoint":{"x":50,"y":50},"hash":"352f3260","height":1080,"link":"","mime":"image\/png","name":"imageShape-6a25848b37a8e7.09921263.png","palette":[],"size":12576,"tags":[],"uploadDate":"2026-06-07T16:47:39+02:00","width":1920},{"alt":"","exif":{"nodata":""},"featured":false,"focalpoint":{"x":50,"y":50},"hash":"1c223316","height":1080,"link":"","mime":"image\/png","name":"imageShape-6a25848b4bd4f1.52308465.png","palette":[],"size":11210,"tags":[],"uploadDate":"2026-06-07T16:47:39+02:00","width":1920},{"alt":"","exif":{"nodata":""},"featured":false,"focalpoint":{"x":50,"y":50},"hash":"a8e4e671","height":1080,"link":"","mime":"image\/png","name":"imageShape-6a25848b5ea259.20521638.png","palette":[],"size":11975,"tags":[],"uploadDate":"2026-06-07T16:47:39+02:00","width":1920}],"updated":"2026-06-07T16:47:39+02:00","created":"2026-06-07T16:47:39+02:00"},{"id":"seo-essentials","draft":false,"featured":false,"title":"SEO Essentials for Builder Pages","date":"2026-02-18T11:15:00+00:00","author":"Joe Workman","summary":"Meta descriptions, og:image, sitemaps, and the small details that make a difference.","media":"https:\/\/www.mayer.info\/corporis-officiis-quia-et-itaque-ut-vitae","content":"<p>The <code>builder-page<\/code> schema includes everything you need for solid SEO out of the box: <code>title<\/code>, <code>description<\/code>, <code>image<\/code> (used as <code>og:image<\/code>), and a <code>sitemap<\/code> toggle.<\/p><p>Total CMS auto-generates <code>\/sitemap.xml<\/code> from your pages and any indexed collections. Visit <a href=\"\/sitemap.xml\">\/sitemap.xml<\/a> to see it. To exclude a page, toggle off <em>Include in Sitemap<\/em> in the page form.<\/p>","extra":"","categories":["seo"],"tags":["seo","meta","sitemap"],"image":{"alt":"","exif":{"nodata":""},"featured":false,"focalpoint":{"x":50,"y":50},"hash":"f51065cb","height":480,"link":"","mime":"image\/jpeg","name":"picsum-6a25848a0ca450.73889755.jpg","palette":[],"size":12442,"tags":[],"uploadDate":"2026-06-07T16:47:38+02:00","width":640},"gallery":[{"alt":"","exif":{"nodata":""},"featured":false,"focalpoint":{"x":50,"y":50},"hash":"59a8b6d9","height":1080,"link":"","mime":"image\/png","name":"imageShape-6a25848a4ffbc8.32017392.png","palette":[],"size":12334,"tags":[],"uploadDate":"2026-06-07T16:47:38+02:00","width":1920},{"alt":"","exif":{"nodata":""},"featured":false,"focalpoint":{"x":50,"y":50},"hash":"8d42b440","height":1080,"link":"","mime":"image\/png","name":"imageShape-6a25848a636492.04495614.png","palette":[],"size":9843,"tags":[],"uploadDate":"2026-06-07T16:47:38+02:00","width":1920},{"alt":"","exif":{"nodata":""},"featured":false,"focalpoint":{"x":50,"y":50},"hash":"b7dfbbd1","height":1080,"link":"","mime":"image\/png","name":"imageShape-6a25848a75b8a3.63990545.png","palette":[],"size":10619,"tags":[],"uploadDate":"2026-06-07T16:47:38+02:00","width":1920},{"alt":"","exif":{"nodata":""},"featured":false,"focalpoint":{"x":50,"y":50},"hash":"405f03ce","height":1080,"link":"","mime":"image\/png","name":"imageShape-6a25848a890763.50954288.png","palette":[],"size":13239,"tags":[],"uploadDate":"2026-06-07T16:47:38+02:00","width":1920},{"alt":"","exif":{"nodata":""},"featured":false,"focalpoint":{"x":50,"y":50},"hash":"16e8cb17","height":1080,"link":"","mime":"image\/png","name":"imageShape-6a25848a9bd182.30038513.png","palette":[],"size":10865,"tags":[],"uploadDate":"2026-06-07T16:47:38+02:00","width":1920}],"updated":"2026-06-07T16:47:38+02:00","created":"2026-06-07T16:47:38+02:00"}]