Twill is an open source CMS toolkit for Laravel that helps developers rapidly create a custom admin console that is intuitive, powerful and flexible. /// Chat with us and others on Spectrum: https://spectrum.chat/twill

Last update: May 14, 2022

Build Status Latest Stable Version Total Downloads License

About Twill

Twill is an open source Laravel package that helps developers rapidly create a custom CMS that is beautiful, powerful, and flexible. By standardizing common functions without compromising developer control, Twill makes it easy to deliver a feature-rich admin console that focuses on modern publishing needs.

Twill is an AREA 17 product. It was crafted with the belief that content management should be a creative, productive, and enjoyable experience for both publishers and developers.

Benefits overview

With a vast number of pre-built features and custom-built Vue.js UI components, developers can focus their efforts on the unique aspects of their applications instead of rebuilding standard ones.

Built to get out of your way, Twill offers:

  • No lock-in, create your data models or hook existing ones
  • No front-end assumptions, use it within your Laravel app or headless
  • No bloat, turn off features you don’t need
  • No need to write/adapt HTML for the admin UI
  • No limits, extend as you see fit

Learning Twill

If you use Laravel, you already know Twill. It embraces Laravel to the fullest extent and encourages you to write beautiful code. To get started, read our documentation. If you'd like to hire us for implementation or support, contact us. We're here to discuss your plans, evaluate your needs, make recommendations, and give you a full walk-thru of Twill.

Credits

Over the last 15 years, nearly every engineer at AREA 17 has contributed to Twill in some capacity. However, Twill in its current form as an open source initiative was created by:

  • Quentin Renard, lead application engineer
  • Antoine Doury, lead interface engineer
  • Antonin Caudron, interface engineer
  • Martin Rettenbacher, product designer
  • Jesse Golomb, product owner
  • George Eid, product manager

With contributions from Laurens van Heems, Fernando Petrelli, Gilbert Moufflet, Mubashar Iqbal, Pablo Barrios, Luis Lavena, and Mike Byrne.

Contributing

We look forward to your contribution to make Twill the best it can be. You can find our contribution guidelines in the Twill documentation.

Security vulnerabilities

If you discover a security vulnerability within Twill, please email us at [email protected]. All security vulnerabilities will be promptly addressed.

License

The Twill software is licensed under the Apache 2.0 license. The Twill UI, including but not limited to images, icons, patterns, and derivatives thereof are licensed under the Creative Commons Attribution 4.0 International License.

Attribution

By using the Twill UI, you agree that any application which incorporates it shall prominently display the message “Made with Twill” in a legible manner in the footer of the admin console. This message must open a link to Twill.io when clicked or touched. For permission to remove the attribution, contact us at [email protected].

Trademark

Twill and the Twill logo are trademarks of AREA 17. You may not display or invoke the Twill name or logo in a manner that implies a relationship or affiliation with, sponsorship, promotion, or endorsement by Twill or AREA 17, except as authorized by the terms of attribution.

Copyright © AREA 17

GitHub

https://github.com/area17/twill
Comments
  • 1. All local asset urls broken

    Trying to demo this on Valet and i've defined my APP_URL as well as the ADMIN_APP_URL and I finally managed to log in but none of the styles/js assets are loading because they are referencing localhost:8080 and not twill.test like i've defined...

    Looks like a promising product but the docs and setup process could be well improved.

    Reviewed by sebszocinski at 2018-07-10 04:44
  • 2. Edit form doesn't load

    I'm following the documentation to add Twill (1.2.) on a fresh install (php ^7.1.3 & laravel 5.7.).

    For now, I only set these env values on the .env:

    MEDIA_LIBRARY_ENDPOINT_TYPE=local
    MEDIA_LIBRARY_LOCAL_PATH=uploads/
    FILE_LIBRARY_ENDPOINT_TYPE=local
    FILE_LIBRARY_LOCAL_PATH=uploads/
    MEDIA_LIBRARY_IMAGE_SERVICE=A17\Twill\Services\MediaLibrary\Local
    

    And I setup the database to use sqlite3.

    No problem with the installation, everything is going well. I've my administration credentials but when I'm trying to access to the dashboard settings, (it redirects me to http://admin.localhost:8000/users/1/edit but) the form is never appearing. The loader never stops. When I look at the DOM, the fields seem to be well generated.

    image

    I think it's a DOM error. Here is the logs in the JS console.

    image

    Uncaught SyntaxError: Unexpected token &
    
    Uncaught TypeError: Cannot read property 'medias' of undefined
    
    Reviewed by bastienrobert at 2019-02-07 13:02
  • 3. Custom Vue component forms in admin [form.blade.php] (block hack) is not rendered

    Hi, I have a ... well, critical issue after updating to 2.0

    I need on some modules a total custom Vue component formfield in order to make special forms (some sort of repeater but with very specific and custom specs). It is not a repeater though.

    I had those Vue components directly "injected" into the form.blade.php template, as there was no way to add custom specific formFields at that time, so I followed a kinda 'hacky' process someone told me on Spectrum chats.

    Example of what I have right now:

    @extends('twill::layouts.form')
    
    @section('contentFields')
        @formField('input', [
            'name' => 'title',
            'label' => 'Quiz title',
            'maxlength' => 100
        ])
        @formField('input', [
            'name' => 'points_correct',
            'label' => 'Points per success',
            'maxlength' => 3,
            'default' => 10
        ])
        @formField('input', [
            'name' => 'points_miss',
            'label' => 'Points per failure',
            'maxlength' => 3,
            'default' => 3
        ])
        @formField('browser', [
            'label' => "Journey quiz group",
            'name' => 'journey',
            'moduleName' => 'journeys',
            'routePrefix' => 'travessies-i-trivial',
            'max' => 1
        ])
        @formField('browser', [
            'label' => "Play related to quiz",
            'name' => 'play',
            'moduleName' => 'plays',
            'routePrefix' => 'obres-critiques-festivals',
            'max' => 1
        ])
        <a17-block-quizzes :quiz-question-data="{{ $questionsData }}"></a17-block-quizzes>
    @stop
    

    Since I updated to last Twill version, those custom components dissapeared!!!! :fearful:

    I've been trying to run php artisan twill:blocks and then npm run twill-build but unsuccessful. Seems that the custom component is not rendered on the view, as looking at the HTML source code, it appears the <a17-block-quizzes> tag instead of the rendered component.

    Now the backend is unusable, as those components were crucial for some sections of the website.

    How can I roll back to the 'hacky' behavior? How can I add my custom formfields that were working before?

    Any manual solution? I will modify Twill core and add it to my own fork if there's no more solution to this.

    I chose Twill months ago as a good CMS thinking it could be flexible, customizable and able handle a complex site, but the work, effort and issues I'm putting into this project means a 10 fold dedication instead of saving time... anyway at this point I have no way to rollback, so I have to fix this at all costs :disappointed:

    Any ideas??

    Reviewed by zedee at 2020-03-13 13:45
  • 4. Build scripts for windows

    Hi, I tried to install twill but no success with build scripts in document, look like it works only in linux/macos, so i rewrote a little to make it works:

    "cms-build": "npm run cms-copy-blocks && cd vendor/area17/twill && npm ci && npm run prod && cp -R public/* ${INIT_CWD}/public", "cms-copy-blocks": "npm run cms-clean-blocks && mkdir resources\\assets\\js\\blocks\\ && mkdir vendor\\area17\\twill\\frontend\\js\\components\\blocks\\customs\\ && cp -R resources\\assets\\js\\blocks\\ vendor\\area17\\twill\\frontend\\js\\components\\blocks\\customs\\", "cms-clean-blocks": "rm -rf vendor\\area17\\twill\\frontend\\js\\components\\blocks\\customs && rm -rf resources\\assets"

    One more problem is paths in public/assets/tasks/icon.js, i saw you used path.resolve('frontend/icons') but i got the syntax is incorrect when build, and i changed it to path.resolve('frontend\icons') but still got same problem.

    @ preicons D:\laragon\www\laratrans\vendor\area17\twill rimraf public/assets/admin/icons/icons.svg && rimraf frontend/scss/setup/_icons.scss && rimraf public/assets/admin/icons/icons-files.svg && rimraf frontend/scss/setup/_icons-files.scss && mkdir -p public/assets/admin/icons

    The syntax of the command is incorrect. npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! @ preicons: rimraf public/assets/admin/icons/icons.svg && rimraf >frontend/scss/setup/_icons.scss && rimraf public/assets/admin/icons/icons-files.svg && >rimraf frontend/scss/setup/_icons-files.scss && mkdir -p public/assets/admin/icons npm ERR! Exit status 1`

    Reviewed by folkevil at 2018-08-16 03:40
  • 5. Imgix Integration using Local Storage

    Hello,

    I am following the official instructions exactly and I can't get Twill to connect to my Imgix account.

    Here are my .env variables:

    MEDIA_LIBRARY_LOCAL_PATH=uploads/ (this works as files are being written locally)
    IMGIX_SOURCE_HOST=jkh.imgix.net (accessible on the WWW)
    IMGIX_USE_SIGNED_URLS=true
    IMGIX_SIGN_KEY=xxxxx (Is this the Imgix 'API key' found in my account settings?)
    

    Imgix Source Settings:

    Base URL: http://darwin.test/uploads/ (confirmed working, e.g. I can access http://darwin.test/uploads/3b74e4bb-e506-4a57-a79c-d103f0f38b0c/photo-2019-02-28-09-37-59-3.jpg from my local machine)

    imgix Domain: jkh.imgix.net

    I really need to get this working ASAP so I'd appreciate any/all help.

    Thanks

    Jon

    Reviewed by jkhamler at 2019-03-06 12:53
  • 6. Saving input from a browser form field

    I've added a browser input for a module called services (a taxonomy associated with a project), added a field called services to the project table in the database (which I've assigned the text type in the database), and I've added a browser form field to the project's form.blade.php. Nothing is saving to the database, so I'm wondering if I'm missing something. It seems like Twill is setup to handle that as far as I can tell (add a form field and a corresponding field to the database and Twill will handle the logic of saving the data automatically). Is there some logic that needs to be added manually (e.g. to the projects model) to handle saving the input? It's not really obvious to me how the data entered in a browser input (or the block editor) is saved to the database, the documentation doesn't seem to go over that, so it's a bit of a black box.

    Reviewed by wratke at 2018-10-22 18:42
  • 7. Is it possible to use repeaters outside Block Editor?

    I'm a little confused about the usage of repeaters. In the docs under the form fields section I see the following example:

    <a17-fieldset title="Videos" id="videos" :open="true">
        @formField('repeater', ['type' => 'video'])
    </a17-fieldset>
    

    This seems to use the repeaters without the Block Editor, but I can't figure out how to make it work, where should video template stuff go? And would the content be saved on a specific column on the model's table?

    Any help appreciated, Thanks.

    Reviewed by amrnn90 at 2018-12-26 12:56
  • 8. Pages module

    First of, thanks for sharing your work, it looks amazing!

    I am trying to create a pages module, but I am not sure how to go about it.

    Documentation states that 'Pages are unstructured data models most often used for static content, such as an About page [...]', which I understand should not be prefixed with 'pages'. I also don't know how to arrange it in page/subpage/... convention. Do you maybe have any more detailed docs about it?

    I will also need pages to have different page templates with different fields. I read #54 and will try to implement it somehow, but I would appreciate if you have any ideas how to do that or where to start?

    Also related: is it/or would be possible to implement a sort of addons system. For example a 'pages' addon that would scaffold all of this (tree structure, templates, ...) and leave user to populate template' fields, because it seems like something that a lot of projects requiring CMS would actually need.

    Thanks for your help!

    Reviewed by zipavlin at 2018-12-18 11:04
  • 9. Laravel 8 Upgrade and general roadmap plans?

    Hi there, seeing that tomorrow is L7 last day of bugfix support and having no further security support around march 2021, I'd like to ask what the roadmap is for upgrading to L8 and beyond.

    Laravel adapted a rather quick release cycle, which twill seems to be behind judging based on the last upgrade to version 7. I do know this is an open source project and I am not trying to say that there are any obligations from Area17's side, this is mainly to vet a decision going further with twill in general.

    This also doesn't mean you'd be required to upgrade, this could/should be a community effort given if you guys support or endorse that at all. But for that part to work out or happen, it might be necessary for more people to maintain this project? This is just a stab into the dark, but I feel like it's only @ifox handling everything? Surely doesn't work out since @ifox has other things to do as well and it cannot be expected from him to be available nor review everything right away.

    Please excuse if this may come over harsh, it's just that I feel like there is a gap between the public facing side of twill.io which attracts people and businesses, but on the other side feels like this project is rather a burden that get's maintained on a low frequent level.

    So tldr: If a business were to use twill, what can they expect? Would a rough estimation be possible for support of the project itself? How can others help? Are you looking for more maintainers or could that help with the longevity of the project?

    I am currently not actively using this project myself, but our company decided to use it which made me do this post. Eventually I'll get to contribute actively to this codebase and I am willing to take on some tasks.

    Thanks in advance.

    Reviewed by lostdesign at 2020-09-09 14:22
  • 10. Custom Block with Slideshow Component Won't Save

    Hi @ifox @yanhao-li

    I've had this problem for a while - not sure if there is a bug. I've created a brand new block called 'slideshow' which contains a single form element:

    @formField('medias', [
    'name' => 'slideshow',
    'label' => 'Slideshow',
    'max' => 5,
    'note' => 'Minimum image width: 1500px'
    ])
    

    I'm able to select images but then nothing saves or writes to the DB, so if I refresh my page then the images have been lost. Is there something I'm missing?

    image

    Reviewed by jkhamler at 2019-03-12 15:28
  • 11. twill:dev does not work(no docker)

    Description

    I'm developing custom components and i've following issues running twill:dev

    • changing TWILL_DEV_MODE_URL env variable doesn't make any difference, it keeps serving http://localhost:8080 (i just had other server running same port so i had to remove it.)
    • when i run php artisan twill:dev with TWILL_DEV_MODE=true then http://localhost:8080 brings me Cannot GET / and http://localhost:8080/twill-manifest.json is showing file content from public/assets/admin/twill-manifest.json Have no idea how to solve it. Google says it could be a webpack issue but i didn't try to downgrade it or something.
    • php artisan twill:dev does not watch for changes in ./resources/assets/js/components. But this could be a normal behavior, i don't know. If so then developing a custom component is turning into a terrible nightmare:)

    Versions

    Twill version: 2.4 Laravel version: 8.0 PHP version: 7.4 Database engine: 8.0 OS: Windows 10

    p.s: great piece of software, thank you for sharing it.

    Reviewed by ammma at 2021-06-28 08:54
  • 12. Release command

    I can only test this when actually doing a release.

    Dist files are removed, but they will now always be added by force when tagging a new release.

    The following check are running when releasing:

    $this->versionIsGreaterThanLatestVersion($version);
    $this->checkChangelogContainsVersion($version);
    $this->isOnMainBranch();
    $this->isNotBehind();
    $this->checkTwillServiceProviderVersion($version);
    $this->checkPackageJsonVersionMatches($version);
    

    dist is no longer committed, instead, we have twill-assets, dist is still used to build to, but we copy the files to twill-assets when releasing (the command does this).

    When running a twill:build we now manually copy the folder from dist to public to maintain backward compatibility.

    Reviewed by haringsrob at 2022-05-23 11:37
  • 13. [FUTURE] Call for ideas: Form builder

    Summary

    It can be useful for site admins to build dynamic forms. I want to explore if we can make this possible in Twill core.

    Describe the solution you'd like

    Since we now have the form builder, we could just make a UI in front of it that saves that to a JSON model.

    • Introduce a "Form" model and a "FormSubmissions" model for storing the form and its submissions.
    • Introduce a pluggable (packageable) action such as "mail" that can be executed when the form is submitted.

    When a form is submitted, it is stored in the FormSubmissions, and one or more actions are being executed, examples of actions:

    • Send an e-mail

    • Send via an API (hubspot, ...)

    • Conver to another type of entity

    • Introduce a generic block "Form" that has the sole purpose of rendering (coupled) or exposing the form (decoupled). This form can be placed in any page with a block editor.

    Additional context

    If you have additional ideas or suggestions, let's all add them as comments and discuss.

    Reviewed by haringsrob at 2022-05-23 10:35
  • 14. [3.x] Form builder validation

    Summary

    Now that we the form builder we could add inline validation (https://github.com/area17/twill/pull/1360):

    return Form::make([
        Input::make()
            ->name('test')
            ->rules(['required', 'string']),
    ]);
    
    Reviewed by haringsrob at 2022-05-23 06:31
  • 15. Medias field not loading in content editor

    Description

    The media field, and any other fields present in the same block, are not loaded in the content editor. Console shows: TypeError: $parent.blockFieldName is not a function

    Steps to reproduce

    Add any block containing a medias field to a block_editor form field and navigate to the content editor in the CMS.

    Expected result

    The medias field is expected to be loaded within the content editor.

    Actual result

    The medias field isn't loaded within the content editor.

    Versions

    Twill version: 2.8.2 (fresh install) Laravel version: 9.2 PHP version: 8.1 Database engine: MySQL

    Reviewed by tijsbakker at 2022-05-20 19:50
  • 16. [3.x] Add getters/setters for options in controllers

    To further enhance the developer experience I want to add getters/setters for:

    'indexOptions, while we leave the property for 3.x (but deprecated) we instead suggest to use:

            'create' => true,  --> $this->enableCreate(); $this->disableCreate();
            'edit' => true, --> $this->enableEdit(); $this->disableEdit();
            'publish' => true, --> $this->enablePublish(); ...
            'bulkPublish' => true,
            'feature' => false,
            'bulkFeature' => false,
            'restore' => true,
            'bulkRestore' => true,
            'forceDelete' => true,
            'bulkForceDelete' => true,
            'delete' => true,
            'duplicate' => false,
            'bulkDelete' => true,
            'reorder' => false,
            'permalink' => true,
            'bulkEdit' => true,
            'editInModal' => false,
            'skipCreateModal' => false,
    

    We also introduce a new "setup" method, that can be used to call these:

    public function setup() {
       $this->disableCreate();
       ...
       /// Can also be chained
       $this->enablePublish()->disableBulkPublish();
    
      // For example how this can be used:
      if (Carbon::now()->isWeekend()) {
        $this->disableEdit();
        $this->disablePublish();
      }
    }
    
    Reviewed by haringsrob at 2022-05-19 07:10
BaiCloud-cms is a powerful open source CMS that allows you to create professional websites and scalable web applications. Visit the project website for more information.

BaiCloud-cms About BaiCloud-cms is a powerful open source CMS that allows you to create professional websites and scalable web applications. Visit the

Feb 2, 2022
Powerful framework for designers and developers to create responsive, fast & robust Joomla based websites and templates.
Powerful framework for designers and developers to create responsive, fast & robust Joomla based websites and templates.

Astroid Framework Powerful Frontend Template Framework for Joomla CMS Powerful framework for designers and developers to create responsive, fast & rob

Oct 28, 2021
Craft is a flexible, user-friendly CMS for creating custom digital experiences on the web and beyond.

About Craft CMS Craft is a flexible, user-friendly CMS for creating custom digital experiences on the web and beyond. It features: An intuitive, user-

May 19, 2022
ProcessWire 3.x is a friendly and powerful open source CMS with a strong API.

Welcome to ProcessWire 3.x This document is in Markdown. An HTML formatted version of this document can be read at: https://github.com/processwire/pro

May 13, 2022
Amila Laravel CMS - Free, open-source Simple Bootstrap Laravel CMS
 Amila Laravel CMS - Free, open-source Simple Bootstrap Laravel CMS

Simple Bootstrap Laravel CMS. Support Laravel 8.x Can integrate into any existing Laravel project. Only add few database tables with prefixes, not affect your existing database tables. Support Laravel 7.x & Laravel 6.x & Laravel 5.x & MySql & PostgreSql - Amila Laravel CMS

Mar 16, 2022
Flextype is an open-source Hybrid Content Management System with the freedom of a headless CMS and with the full functionality of a traditional CMS
Flextype is an open-source Hybrid Content Management System with the freedom of a headless CMS and with the full functionality of a traditional CMS

Flextype is an open-source Hybrid Content Management System with the freedom of a headless CMS and with the full functionality of a traditional CMS. Building this Content Management System, we focused on simplicity. To achieve this, we implemented a simple but powerful API's.

May 18, 2022
May 9, 2022
PHPVibe Open source video CMS / Video Sharing CMS / Youtube Api v3 / Video Embeds
PHPVibe Open source video CMS / Video Sharing CMS / Youtube Api v3 / Video Embeds

PHPVibe Video CMS Free Video Sharing CMS The modern choice of design inspired by Youtube and a social videos sharing module that may just cut it for y

May 17, 2022
ExpressionEngine is a flexible, feature-rich, free open-source content management platform that empowers hundreds of thousands of individuals and organizations around the world to easily manage their web site.
ExpressionEngine is a flexible, feature-rich, free open-source content management platform that empowers hundreds of thousands of individuals and organizations around the world to easily manage their web site.

ExpressionEngine CMS ExpressionEngine is a mature, flexible, secure, free open-source content management system. It is beloved by designers for giving

May 11, 2022
ExpressionEngine is a mature, flexible, secure, free open-source content management system.

ExpressionEngine is a flexible, feature-rich, free open-source content management platform that empowers hundreds of thousands of individuals and organizations around the world to easily manage their web site.

Mar 29, 2022
Intuitive Website Styling integrated into WordPress' Customizer
Intuitive Website Styling integrated into WordPress' Customizer

Customify - Intuitive Website Styling for WordPress With Customify, developers can easily create advanced theme-specific options inside the WordPress

Jul 9, 2021
A toolkit for using self-hosted Natural Language Processing with Elasticsearch and WordPress

Natural Language Processing Tools for WordPress A toolkit for using self-hosted Natural Language Processing in WordPress This plugin is a Proof of Con

Jul 14, 2021
Kirby: the CMS that adapts to any project, loved by developers and editors alike.
Kirby: the CMS that adapts to any project, loved by developers and editors alike.

Kirby: the CMS that adapts to any project, loved by developers and editors alike. The Starterkit is a full-blown Kirby installation with a lot of exam

May 23, 2022
A flexible and fast Cms built with Symfony and Vuejs.
A flexible and fast Cms built with Symfony and Vuejs.

GreenCheap CMS A modular and lightweight CMS made with Symfony and Vuejs components GreenCheap works with PHP 8 version. In this case, lower versions

Apr 30, 2022
REDAXO, a PHP-based CMS since 2004. Both simple and flexible.
REDAXO, a PHP-based CMS since 2004. Both simple and flexible.

?? Deutsch Content Management since 2004. Both simple and flexible. REDAXO provides you an easy-to-learn website framework. It lets you create content

May 6, 2022
Borgert is a CMS Open Source created with Laravel Framework 5.6
Borgert is a CMS Open Source created with Laravel Framework 5.6

A simple CMS to start projects in Laravel containing some modules. Blog, Pages, Products, Mailbox, Image Gallery, Log Viewer and Users. Frontend: Blog

Apr 6, 2022
Free, open-source, self-hosted CMS platform based on the Laravel PHP Framework.
Free, open-source, self-hosted CMS platform based on the Laravel PHP Framework.

Winter is a Content Management System (CMS) and web platform whose sole purpose is to make your development workflow simple again. It was born out of

May 19, 2022
Bolt CMS is an open source, adaptable platform for building and running modern websites.

Bolt CMS is an open source, adaptable platform for building and running modern websites. Built on PHP, Symfony and more. Read the site for more info.

May 21, 2022
🚀Bolt CMS is an open source, adaptable platform for building and running modern websites

??Bolt CMS is an open source, adaptable platform for building and running modern websites

Jan 6, 2022