Cecil is a CLI application that merges plain text files (written in Markdown), images and Twig templates to generate a static website.

Last update: Jun 24, 2022

Cecil

Cecil logo

Your content driven static site generator.

Latest Stable Version Test Release cecil.phar License
Scrutinizer Code Quality Codacy Badge Coverage Status StyleCI SymfonyInsight

Cecil is a CLI application that merges plain text files (written in Markdown), images and Twig templates to generate a static website.

📄 Documentation | 💻 Demo | 🐛 Issue tracker | 💬 Discussion

Cecil CLI demo

Quick Start

Read the Quick Start documentation page.

Deploy to Netlify Deploy with Vercel Import this project into Forestry

Features

  • No server, no database, no dependency: performance and security
  • Content is stored in flat files, written in Markdown with YAML front matter
  • Powered by Twig, a flexible template engine, with theme support
  • Pagination, taxonomies, RSS, redirections, etc. are generated automatically
  • Download just one file and run it
  • Easy to deploy

Installation

Download cecil.phar from your browser or from your terminal:

curl -LO https://cecil.app/cecil.phar

Then install the binary globally:

mv cecil.phar /usr/local/bin/cecil
chmod +x /usr/local/bin/cecil

PHP 7.1+ is required.

Usage

  • Get help: cecil help
  • Create new website: cecil new:site
  • Build and serve it: cecil serve

Contributing

See Contributing.

Sponsors

Aperture Lab studio cecillie

License

Cecil is a free software distributed under the terms of the MIT license.

Cecil © Arnaud Ligny
Logo © Cécile Ricordeau

GitHub

https://github.com/Cecilapp/Cecil
Comments
  • 1. Dependencies.io troubleshooting

    We're opening this issue to inform you about problems with your dependencies.io configuration or build failures.

    We'll add a comment here when we see problems. You can close this issue when you have things resolved -- we'll open it back up if we detect new problems.

    Helpful links:

    Note: To help keep your repo as clean as possible, this is the only issue that we're going to open and comment on. Feel free to delete the comments that are made as you resolve them, if you want to keep this issue short and tidy.

    Reviewed by dependencies[bot] at 2017-09-23 21:41
  • 2. Template changes during watch

    hi everyone, i'm really enjoying the cecil + netlifycms stack right now but i feel something is messing around ie. when i cecil serve it livereloads every assets except templates (twig files) and i have to cecil build again to see applied changes..

    i wanted to know if i can find a way to fix this ?

    Reviewed by maxperei at 2019-04-02 14:53
  • 3. Best practice for a blog with images.

    Hi, I'd like to manage a blog with a main image for every post. To avoid polluting the 'static' directory with all the images for the posts, I understand that I could have a subfolder for each post and inside a file index.md and the corresponding main image:

    Screen Shot 2020-06-26 at 21 47 08

    Inside my index.md:

    ---
    title: 'This is a sad post.'
    date: '2020-06-22'
    draft: false
    tags: ["sad"]
    categories: ["Social"]
    excerpt: Introduction to a sad post.
    image: 'main_image.jpg'
    ---
    This is the markdown content of the sad post.
    

    Then, inside the template for the page, I should have something like:

    {{ asset(page.image) }}	
    

    But unfortunately this is not working, the file is not found. Is there a better way to do that ? Thanks a lot, Cecil rocks!

    Reviewed by thomascenni at 2020-06-27 00:53
  • 4. Tags are not managed.

    Following the Quick Start documentation, create a new post and add a tag to it as explained here: https://cecil.app/documentation/content/#front-matter

    To Reproduce

    macbook:Desktop thomas$ ./cecil.phar new:site cecil-test
    Creating a new website...
    Done!
    macbook:Desktop thomas$ cd cecil-test/
    macbook:cecil-test thomas$ ls
    config.yml	content		layouts		static
    macbook:cecil-test thomas$ ../cecil.phar new:page blog/my-first-post.md
    File "content/blog/my-first-post.md" created.
    

    Then just add some tags to the post.

    cat content/blog/my-first-post.md
    ---
    title: 'my-first-post'
    date: '2020-06-21'
    draft: true
    tags: [tag 1, tag 2]
    ---
    

    Serve the application with:

    ../cecil.phar serve --drafts

    And you get this error:

    [ERROR] Template "cecil:_default/list.html.twig" line 19 (for page "tags/tag-1"): Neither the property "all" nor one of the methods "all()", "getall()"/"isall()"/"hasall()" or "__call()" exist and have public access in class "Cecil\Collection\Taxonomy\Term".

    Screen Shot 2020-06-21 at 15 13 51

    Reviewed by thomascenni at 2020-06-21 18:16
  • 5. Bump symfony/property-access from 4.4.3 to 4.4.4

    Bumps symfony/property-access from 4.4.3 to 4.4.4.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language
    • @dependabot badge me will comment on this PR with code to add a "Dependabot enabled" badge to your readme

    Additionally, you can set the following in your Dependabot dashboard:

    • Update frequency (including time of day and day of week)
    • Pull request limits (per update run and/or open at any time)
    • Automerge options (never/patch/minor, and dev/runtime dependencies)
    • Out-of-range updates (receive only lockfile updates, if desired)
    • Security updates (receive only security updates, if desired)
    Reviewed by dependabot-preview[bot] at 2020-02-03 08:26
  • 6. Import remote JSON data

    Related to a problem?

    It doesn't seem like a big deal, but maybe it would be better if this was realized? I just want to fetch JSON data from outside (remotely), and it looks like Cecil doesn't exist yet? #cmiiw

    Describe the solution you'd like

    I found this plugin on Jekyll, and that's pretty much what I wanted😀 brockfanning/jekyll-get-json

    Describe alternatives you've considered

    No response

    Additional context

    Thanks for all the help😄

    Reviewed by sooluh at 2021-09-23 03:00
  • 7. Custom variables in front matter

    After adding custom variables, in this case image: 'path/my_filename.jpg', in the front matter, and adding {{ page.image }} to _default/page.html.twig, I get the following error

    In PagesRender.php line 155: [Cecil\Exception\Exception] Template "site:_default/page.html.twig" line 26 (for page "another-page"): Neither the property "image" nor one of the methods "image()", "getimage()"/"isimage()"/"hasimage()" or "__call()" exist and have public access in class "Cecil\Collection\Page\Page".

    Could the documentation include a section on how to make custom variables in the markdown file's front matter accessible to templates?

    Reviewed by haraldgroven at 2020-09-20 12:22
  • 8. Fix "serve" command not applying template changes

    Fixes #321.

    Changes to templates were not applied after a rebuild when using the "serve" command. The cause is Twig's internal template caching that does not refresh as the rebuild command is running in the same process that created the cache.

    As no public Twig API is available to refresh the cache this fix uses a separate process for rebuilding.

    Changes proposed in this pull request:

    • Use PhpExecutableFinder
    • Use separate process for running build command to fix templates updates

    @Narno please review :eyes:

    Reviewed by FunkyM at 2020-09-15 17:13
  • 9. Add new "markdown" Twig filter and update documentation accordingly

    Adds new "markdown" Twig filter which is handy when using Markdown from data sources directly within a template.

    Changes proposed in this pull request:

    • Add new "markdown" Twig filter
    • Update documentation accordingly

    @Narno please review :eyes:

    Reviewed by FunkyM at 2020-09-15 17:11
  • 10. Doesn't work with PHP 7.4

    Describe the bug cecil 5.27.0 does not build the site when using PHP version 7.4. It spits this error:

    Fatal error: Uncaught Error: Object of class Cecil\Collection\Page\Page could not be converted to string in phar:///cecil.phar/src/Assets/Url.php:78
    Stack trace:
    #0 phar:///cecil.phar/src/Renderer/Twig/Extension.php(308): Cecil\Assets\Url->__construct(Object(Cecil\Builder), Object(Cecil\Collection\Page\Page), Array)
    #1 phar:///cecil.phar/vendor/twig/twig/src/Environment.php(418) : eval()'d code(174): Cecil\Renderer\Twig\Extension->url(Object(Cecil\Collection\Page\Page), Array)
    #2 phar:///cecil.phar/vendor/twig/twig/src/Template.php(184): __TwigTemplate_2b3657fd54e1c2053ca6bff8ea8a797a7609ba5520f54283c502a6835b84d4c2->block_head(Array, Array)
    #3 phar:///cecil.phar/vendor/twig/twig/src/Environment.php(418) : eval()'d code(54): Twig\Template->displayBlock('head', Array, Array)
    #4 phar:///cecil.phar/vendor/twig/twig/src/Template.php(407): __TwigTemplate_2b3657fd54e1c2053ca6bff8ea8a797a7609ba5520f54283c502a6835b84d4c2->doDisplay(Array, Array)
    #5 phar:///cecil.phar/vendor/twig/twig/src/Template.php(380): Twig\Template->displayW in phar:///cecil.phar/src/Assets/Url.php on line 78
    

    To Reproduce Install PHP 7.4 Download and install cecil.phar ver 5.27.0 Execute this:

    ./cecil.phar new:site
    ./cecil.phar build
    

    One liner:

    docker run -it --rm php:7.4-cli bash -c "curl -LO https://cecil.app/cecil.phar && chmod +x cecil.phar && ./cecil.phar new:site && ./cecil.phar build"
    

    Expected behavior cecil should build the site without error on PHP 7.4.

    So as it works on PHP 7.3:

    docker run -it --rm php:7.3-cli bash -c "curl -LO https://cecil.app/cecil.phar && chmod +x cecil.phar && ./cecil.phar new:site && ./cecil.phar build"
    

    Additional context Testing on OS: Linux 5.6.11-1-MANJARO

    Reviewed by tbalsys at 2020-05-13 22:10
  • 11. Bump symfony/serializer from 4.4.3 to 4.4.4

    Bumps symfony/serializer from 4.4.3 to 4.4.4.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language
    • @dependabot badge me will comment on this PR with code to add a "Dependabot enabled" badge to your readme

    Additionally, you can set the following in your Dependabot dashboard:

    • Update frequency (including time of day and day of week)
    • Pull request limits (per update run and/or open at any time)
    • Automerge options (never/patch/minor, and dev/runtime dependencies)
    • Out-of-range updates (receive only lockfile updates, if desired)
    • Security updates (receive only security updates, if desired)
    Reviewed by dependabot-preview[bot] at 2020-02-03 08:26
  • 12. deps prod(deps): bump symfony/serializer from 4.4.42 to 4.4.43

    Bumps symfony/serializer from 4.4.42 to 4.4.43.

    Release notes

    Sourced from symfony/serializer's releases.

    v4.4.43

    Changelog (https://github.com/symfony/serializer/compare/v4.4.42...v4.4.43)

    • bug #46765 Fix denormalization union types with constructor (Gwemox)
    • bug #45861 Try all possible denormalization route with union types when ALLOW_EXTRA_ATTRIBUTES=false (T-bond)
    Commits
    • bd020a5 [Serializer] Fix denormalization union types with constructor
    • 31cbb3c [Serializer] Try all possible denormalization route with union types when ALL...
    • See full diff in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    Reviewed by dependabot[bot] at 2022-06-27 11:08
  • 13. deps prod(deps): bump symfony/console from 4.4.42 to 4.4.43

    Bumps symfony/console from 4.4.42 to 4.4.43.

    Release notes

    Sourced from symfony/console's releases.

    v4.4.43

    Changelog (https://github.com/symfony/console/compare/v4.4.42...v4.4.43)

    • bug #46747 Fix global state pollution between tests run with ApplicationTester (Seldaek)
    • bug #46595 Escape % in command name & description from getDefaultName() (ogizanagi)
    Commits
    • 8a2628d bug #46747 Fix global state pollution between tests run with ApplicationTeste...
    • 7797262 Fix global state pollution between tests run with ApplicationTester
    • b4a1d2d [Console] Escape % in command name & description from getDefault*()
    • See full diff in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    Reviewed by dependabot[bot] at 2022-06-27 11:08
  • 14. deps prod(deps): bump symfony/yaml from 4.4.37 to 4.4.43

    Bumps symfony/yaml from 4.4.37 to 4.4.43.

    Release notes

    Sourced from symfony/yaml's releases.

    v4.4.43

    Changelog (https://github.com/symfony/yaml/compare/v4.4.42...v4.4.43)

    • no significant changes
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    Reviewed by dependabot[bot] at 2022-06-27 11:08
  • 15. Deprecated on PHP 8.1

    Describe the bug

    Deprecated: Return type of _HumbugBox87c495005ea2\KevinGH\RequirementChecker\RequirementCollection::getIterator() should either be compatible with IteratorAggregate::getIterator(): Traversable, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///cecil.phar/.box/src/RequirementCollection.php on line 15
    
    Deprecated: Return type of _HumbugBox87c495005ea2\KevinGH\RequirementChecker\RequirementCollection::count() should either be compatible with Countable::count(): int, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///cecil.phar/.box/src/RequirementCollection.php on line 19
    

    To reproduce

    • PHP 8.1
    • Cecil 5.79.7
    docker run -it --rm php:8.1-cli bash -c "curl -LO https://cecil.app/cecil.phar && chmod +x cecil.phar && ./cecil.phar new:site"
    

    Same on macOS with PHP 8.1.1 (cli) (built: Dec 17 2021 22:38:05) (NTS)

    Expected behavior

    No Deprecated messages

    Version

    5.79.7

    Operating System

    No response

    Relevant log output

    No response

    Reviewed by ensimo at 2021-12-19 17:58
WordPress static site generator for security, performance and cost benefits

WordPress static site generator for security, performance and cost benefits

Jun 27, 2022
Sculpin — Static Site Generator

Sculpin - PHP Static Site Generator Sculpin takes data sources such as text files (Markdown, Textile, etc.) and transforms them using Twig templates t

Jun 22, 2022
Phrozn is extremely flexible static site generator in PHP.

Phrozn Phrozn is extremely flexible static site generator in PHP. Philosophy Configurable: you should be able to tune it to your needs SCM-Enabled: no

Apr 26, 2022
PHP Static site generator

Spress - PHP Static site generator Spress is a static site generator built with Symfony components. License: MIT. Requirements Linux, Unix, Mac OS X o

Feb 10, 2022
Site-builder is a simple static site generator. It allows you to create and manage a website out of simple text files and templates.

Site-builder is a simple static site generator. It allows you to create and manage a website out of simple text files and templates. This gives you many of the advantages of a CMS, but because the result is plain old HTML, it's more secure and has higher performance.

May 24, 2022
A package that uses blade templates to control how markdown is converted to HTML inside Laravel, as well as providing support for markdown files to Laravel views.
A package that uses blade templates to control how markdown is converted to HTML inside Laravel, as well as providing support for markdown files to Laravel views.

Install Install via composer. $ composer require olliecodes/laravel-etched-blade Once installed you'll want to publish the config. $ php artisan vendo

Jul 5, 2021
YCOM Impersonate. Login as selected YCOM user 🧙‍♂️in frontend.

YCOM Impersonate Login as selected YCOM user in frontend. Features: Backend users with admin rights or YCOM[] rights, can be automatically logged in v

Jan 19, 2022
Generate pseudo-static pages from markdown and HTML files for Flarum

Flarum Pages Generator This is not a Flarum extension. This package provides a Flarum extender that you can use in the local extend.php to define cust

Feb 21, 2022
Parser for Markdown and Markdown Extra derived from the original Markdown.pl by John Gruber.

PHP Markdown PHP Markdown Lib 1.9.0 - 1 Dec 2019 by Michel Fortin https://michelf.ca/ based on Markdown by John Gruber https://daringfireball.net/ Int

Jun 24, 2022
Parser for Markdown and Markdown Extra derived from the original Markdown.pl by John Gruber.

PHP Markdown PHP Markdown Lib 1.9.0 - 1 Dec 2019 by Michel Fortin https://michelf.ca/ based on Markdown by John Gruber https://daringfireball.net/ Int

Jun 24, 2022
EmailReplyParser is a PHP library for parsing plain text email content, based on GitHub's email_reply_parser library written in Ruby

EmailReplyParser EmailReplyParser is a PHP library for parsing plain text email content, based on GitHub's email_reply_parser library written in Ruby.

Jun 16, 2022
Joole Reflector - used to work with the properties of objects, their changes and merges

Joole Reflector allows you to change protected, as well as private properties of an object.

May 7, 2022
This Laravel package merges staudenmeir/eloquent-param-limit-fix and staudenmeir/laravel-adjacency-list to allow them being used in the same model.

This Laravel package merges staudenmeir/eloquent-param-limit-fix and staudenmeir/laravel-adjacency-list to allow them being used in the same model.

May 4, 2022
PHP library for parsing plain text email content.

EmailReplyParser EmailReplyParser is a PHP library for parsing plain text email content, based on GitHub's email_reply_parser library written in Ruby.

Jun 16, 2022
A PHP component to convert HTML into a plain text format

html2text html2text is a very simple script that uses DOM methods to convert HTML into a format similar to what would be rendered by a browser - perfe

Jun 28, 2022
Docbook Tool for static documentation generation from Markdown files

Roave Docbook Tool Static HTML and PDF generator tool for generating documentation from Markdown files. Generates a deployable HTML file from Markdown

Jun 22, 2022
💫 Vega is a CLI mode HTTP web framework written in PHP support Swoole, WorkerMan / Vega 是一个用 PHP 编写的 CLI 模式 HTTP 网络框架,支持 Swoole、WorkerMan

Mix Vega 中文 | English Vega is a CLI mode HTTP web framework written in PHP support Swoole, WorkerMan Vega 是一个用 PHP 编写的 CLI 模式 HTTP 网络框架,支持 Swoole、Work

Apr 28, 2022
Modern, Crazy Fast, Ridiculously Easy and Amazingly Powerful Flat-File CMS powered by PHP, Markdown, Twig, and Symfony

Grav Grav is a Fast, Simple, and Flexible, file-based Web-platform. There is Zero installation required. Just extract the ZIP archive, and you are alr

Jun 28, 2022
Twig-lint - Standalone twig linter

twig-lint - Standalone twig linter twig-lint is a lint tool for your twig files. It can be useful to integrate in your ci setup or as the basis of edi

Apr 21, 2022
Provides a twig editor field with Twig & Craft API autocomplete
Provides a twig editor field with Twig & Craft API autocomplete

Twigfield for Craft CMS 3.x & 4.x Provides a twig editor field with Twig & Craft API autocomplete Requirements Twigfield requires Craft CMS 3.0 or 4.0

Jun 24, 2022