Skip to content

Changelog

Håkan Edling edited this page Feb 17, 2020 · 84 revisions

This page contains all updates in the official releases. For information about what's been updated in the pre-releases, please refer to Pre-release Changelog.

Version 8.1 - Service Release 1

2020-02-17

Piranha.Data.EF 8.1.1, Piranha.Data.EF.MySql 8.1.1, Piranha.Data.EF.SQLite 8.1.1, Piranha.Data.EF.SQLServer 8.1.1

This service release fixes a critical failure in the Post Service where an async method call is not awaited properly, causing threading issues.

Bugfixes

  • Async operation not awaited in ContentService.Transform. #1051

Version 8.1

2020-02-16

Please note that in this versions all EF Migrations have been pulled out into provider specific packages due to changes in how migrations are generated for EF Core 3.1. Check the template projects and the docs for reference.

Big thanks to @gyfke, @lukethenuke, @mikaellindemann and @psandgren for their contributions and all of the people who has helped with translating the manager.

Core

  • Add native comment system. #186
  • Add hook for extending Sitemap generation. #961
  • Add option for UseSitemapRouting to IntegratedMiddleware. #979
  • Store hostnames for current request. #986
  • Updated Manager Bootstrap to v4.4.1 #997
  • Add meta-fields for media assets. #1020
  • Asynchronous SaveChanges for Identity. #1023
  • Add support for permissions on Pages & Posts. #1025

Manager

  • Add Generic Block rendering. #820
  • Use push state to store active folder in the media view. #867
  • Keyboard command for saving content in the manager. #891
  • Redesign config view for more space. #964
  • Updated Manager Bootstrap to v4.4.1 #997
  • Hide archive & site in PostPicker in modal when not needed. #1003
  • Placeholders in the User/Edit are not localized. #1014
  • Update manager media library. #1024
  • No error message on login page when used wrong password or username. #1027
  • Compile .vue templates into components. #1034

Bugfixes

  • ListExpand not working for collection regions. #888
  • Manager resources doesn't work behind a reverse proxy. #934
  • No button to add post for new archive. #948
  • Preview resize works in debug environment but not deployed. #987
  • The alias manager always uses the default site. #1002
  • Redirect after successful manager login. #1019
  • Specific Vue components give a compilation error on page-load. #1021

Version 8.0 - Service Release 2

2019-12-25

Piranha 8.0.2, Piranha.AspNetCore 8.0.2

Core

  • Allow more configuration for Integrated Middleware. #954

Bugfixes

  • Non-Integrated Middleware Fails check for Preview Claims. #953
  • HTTP Caching is missing from Integrated middleware. #955
  • Redirect is missing from Integrated Middleware. #956

Version 8.0 - Service Release 1

2019-12-11

Piranha 8.0.1, Piranha.AspNetCore 8.0.1, Piranha.Azure.BlobStorage 8.0.1

Bugfixes

  • Field description not being display in list region. #938
  • New list item not getting the ListTitlePlaceholder value if it was set. #939
  • Add option for runtime view compilation to simple startup. #941
  • Page parameter in ArchiveModel.OnGet is always null. #942
  • Integrated middleware does not pass on query params. #943
  • Piranha.Azure.BlobStorage as wrong package reference. #944

Version 8.0

2019-12-05

This version includes updating to .NET Core 3.1 which of course means a couple of breaking changes. Before updating, make sure to read through the notes below. For detailed upgrade instructions, please refer to this article.

Big thanks to @bignfat and @Urreman for their contributions and all of the people who has helped with translating the manager.

Known Issues

  • Piranha.Azure.BlobStorage has a faulty reference. If you're using this package, please add a manual package reference to Microsoft.Azure.Storage.Blob 11.1.0 in your project.

Breaking Changes

  • As Microsoft has changed the underlying component for handling SQLite and changed how Guid columns are represented for SQLite, migrating an existing database won't be possible. Instead setup a new database and migrate the data.

Core

  • Support routing for Archives positioned below a page. #699
  • Upgrade to .NET Core 3.1. #878
  • Simplify Startup for integrated applications. #935

Manager

  • User save should use IdentityResults. #916
  • Add delete confirm in user list. #917

Bugfixes

  • SelectField is not populated if used in a collection region. #930
  • Manager resources doesn't work in HTTPS behind a reverse proxy. #934

Version 7.1

2019-11-15

Please note that TinyMCE has been moved into it's own package which needs to be included into your application to enable WYSIWYG editing. We now also provide an alternative package for Summernote.

To install TinyMCE into your application you need to add the package:

Piranha.Manager.TinyMCE

Then add the following lines to your Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    ...

    services.AddPiranhaTinyMCE();

    ...
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApi api)
{
    ...

    app.UsePiranhaTinyMCE();

    ...
}

Big thanks to @121GWJolt for his contributions and all of the people who has helped our translating the manager.

Manager

  • Manager UI should remove buttons the admin does not have access to. #772
  • BlockDisplayMode.Vertical component. #791
  • Move TinyMCE into a separate module. #815
  • Media System Performance enhancement #845. #845
  • Delete confirmations in manager. #847
  • Cannot choose route for page. #856
  • Add paging in manager archive view. #860
  • Add post should not be a dropdown if Archive only has one post type. #871
  • Add client side validation for manager forms. #872
  • Full support for Toolbar actions. #873
  • Can we make piranha play nice with swashbuckle?. #876
  • Support for SVG images. #879
  • Password validation. #883
  • Improve styling on global fields for Horizontal Block Groups. #896
  • Move folders in the media library. #904

Bugfixes

  • Flush cache after changing site host url. #516
  • Sitemap is not purged correctly from cache. #855
  • DateField saves time of day (sort of) when using Datepicker. #877
  • Updating an image moves the image to the root of the media library. #892

Version 7.0 - Service Release 5

2019-10-04

Piranha 7.0.3, Piranha.AspNetCore 7.0.1, Piranha.AttributeBuilder 7.0.1. Piranha.Data.EF 7.0.2, Piranha.Manager 7.0.5

Please note that in order to support field meta-data in block groups the following attributes has been moved from the namespace Piranha.AttributeBuilder to Piranha.Extend.

FieldAttribute, FieldDescriptionAttribute, RegionAttribute and RegionDescriptionAttribute.

Make sure to update your PageTypes, PostTypes and Regions by using the new namespace.

Core

  • Add support for FieldAttribute to BlockGroup Fields. #831
  • Add helper method for rendering Css Name from block type. #835
  • Automatically register custom fields used in blocks. #839

Bugfixes

  • Custom partials are not rendered in the manager. #832
  • SelectFields are not initialized for Block Groups. #834
  • BlockGroup fields are not initialized on load. #836
  • TinyMCE doesn't clear bogus tags on save. #838

Version 7.0 - Service Release 4

2019-09-26

Piranha 7.0.2, Piranha.Manager 7.0.4, Piranha.Manager.Localization 7.0.4

Big thanks to @AlexJPawlak, @AlexeyMAGician and @121GWJolt for their contributions.

Manager

  • Default title implementations for standard Blocks. #800
  • Add full Russian & Polish translations. #812
  • Add SRI support for custom manager scripts. #819
  • Collapse block on load in the manager. #828
  • Show block title when collapsed. #829

Bugfixes

  • Getting archive by tag crashes. #801
  • IsUnlisted = false is not handled when adding Block Group Items. #821
  • ArchivePage doesn't filter on allowed Post Types. #827
  • BlockGroup fields not initialized correctly on Create. #805

Version 7.0 - Service Release 3

2019-09-10

Piranha 7.0.1, Piranha.Data.EF 7.0.1, Piranha.Manager 7.0.3, Piranha.Manager.Localization 7.0.3

Manager

  • Confirm deleting site. #783
  • Draft post does not display in post list. #793
  • GetTitle on HtmlField should strip HtmlTags. #795
  • HtmlField does not propagate title change to parent. #796

Bugfixes

  • Post setting regions doesn't have the "region" class. #785
  • Site setting regions doesn't have the "region" class. #792
  • SelectFields does not work for Site Content. #794

Version 7.0 - Service Release 2

2019-08-30

Piranha.Manager 7.0.2, Piranha.Manager.Localization 7.0.2

Manager

  • Added German & Dutch translations. #768
  • Move manager block styles outside of .block. #774
  • Add css support for custom block actions. #775
  • PageField only shows links from the default site. #777
  • UI Issues in media Gallery view. #779

Bugfixes

  • Redirect is missing from the manager UI. #766
  • EditorConfig initializes Block styles as inline. #767
  • Mediapicker does not clear filter when changing folder. #771

Version 7.0 - Service Release 1

2019-08-23

Piranha.Manager 7.0.1, Piranha.Manager.Localization 7.0.1

This updates contains a simplified way of configuring the Tiny MCE editor. Your can read more about it in the documentation.

Manager

  • Added full Spanish translations #760
  • Simplify customizing of Tiny MCE editor. #761

Bugfixes

  • Menu includes links when user is not authorized. #756
  • TinyMCE Dropdowns breaks in column blocks. #757
  • Empty HTML-block in columns doesn't allocate 100% height. #762
  • Positioning of Tiny MCE toolbar doesn't work properly. #763

Version 7.0

2019-08-19

Starting with this version the Manager interface has changed technology stack and is now built with Razor Pages and VueJs. Projects developed with earlier versions of Piranha CMS will need to update their view components for custom blocks and custom fields in order for them to work in the new Manager. For guidance on how to implement custom components, please refer to the official documentation.

Known issues

  • Manager menu doesn't remove items not valid for the current user. #756

Core

  • Add WebApi module for accessing the IApi. #229
  • Reference fields should use cached data. #588
  • Archive service doesn't populate category/tag. #620
  • Updated posts are not purged from cache. #603
  • Save drafts of already published content. #622
  • Saving a copied page throws exception. #626
  • Null checks of fields. #692

Manager

  • Move texts to resources for translation. #39
  • Media card/gallery view. #62
  • Update font awesome. #406
  • New manager interface. #460
  • Add possibility to add custom buttons to the manager. #508
  • Horizontal block groups. #599
  • Possibility to collapse all blocks. #613
  • Two imagefields on one page aren't updating right. #614
  • Description on fields. #621
  • Documents displayed as videos in media. #629
  • Page ordering past depth of 5. #636

Bugfixes

  • PageField & PostField can cause circular reference. #260
  • Sitemap caching issues when updating pages. #725

Version 6.1.0

2019-05-01

Starting with this version all project templates have been merged into a single package Piranha.Templates. This is to simplify setup on your local development machine and make sure you get all future templates as well when updating this package.

Big thanks to @i-love-code and @stefanolsen for their contributions.

Core

  • DisplayTemplate missing in example for VideoBlock. #548
  • Null-checking a PageField causes a NullReferenceException. #572
  • Full caching still causes repeated SQL queries. #574
  • Add interfaces for all services exposed in the Api. #576
  • Archive page returns 404 when request URL has trailing slash. #580
  • SimpleCache should use ConcurrentDictionary. #583
  • Aliases are cached only if found. #587

Manager

  • Manager ajax urls when deployed to virtual directory. #372
  • Media folders do not take in account other folders as items. #565
  • Using Manager Login - ReturnUrl in LoginModel is always null. #579
  • Blocks without Custom Editor Templates / Checkbox Field Serialization. #585
  • Hide menu group when no item is visible. #593

Bugfixes

  • Publish/unpublish content does not reflect when CacheLevel=Full. #568
  • GetSitemap in for EF does not take scheduled pages into account. #569
  • Items on a BlockGroup does not gets serialized on posts. #577

Version 6.0 - Service Release 2

2019-04-03

Piranha.Manager 6.0.2

By mistake outdated .css and .js files where bundled with the manager causing the ImageBlock and VideoBlock to behave incorrectly.

Version 6.0 - Service Release 1

2019-04-02

Piranha 6.0.1, Piranha.Data.EF 6.0.1, Piranha.Manager 6.0.1

Bugfixes

  • Sitemap cache is not clear when publishing a drafted page. #555
  • Items on BlockGroup still not gets serialized. #558
  • IsUnlisted is ignored on the first add-block on a post. #559

Version 6.0.0

2019-03-31

Entity Framework Core

As of 6.0 all data mappings for Entity Framework Core as been moved into the new package Piranha.Data.EF. To ensure backwards compatibility, make sure you include this package into your project.

Fully Async Pipeline

As of 6.0 the entire application pipeline and all all Api metods are now async. To ensure backwards compatibility for sync code, make sure you include the package Piranha.Extensions.Sync, however it is of course our recommendation that all code should be migrated to use the async methods.

Archive Service

Methods in the ArchiveService has been revised to allow loading just the posts without the containing page. Existing code must be updated from making one call to making two separate calls, one for the page itself, and a second one for the post archive.

// Old code
var model = _api.Archives.GetById<MyArchivePage>(...);

// New code
var model = await _api.Pages.GetByIdAsync<MyArchivePage>(...);
model.Archive = await _api.Archives.GetByIdAsync(...);

Taxonomies

The TagService and CategoryService has been removed to simplify repository implementation for NoSql databases. Methods for getting these taxonomies can now be found in the PostService

api.Posts.GetAllCategoriesAsync
api.Posts.GetCategoryBySlugAsync
api.Posts.GetAllTagsAsync
api.Posts.GetTagBySlugAsync

Core

  • Make API async. #102
  • Optimize queries for large sets of non cached data. #198
  • Add VideoBlock. #458
  • Async Pipeline. #478
  • Add hooks for content models. #513
  • Add block type to serialized JSON. #518
  • Multiple Blocks with Archive listing slow down page. #519
  • MemoryCaches should clone object on Get. #522
  • Items on BlockGroup does not get serialized to JSON. #543

Manager

  • Add allowed PostTypes to Archive page. #276
  • Add item count on media folders. #484
  • Restrict so that not empty media folders can't be deleted. #485

Bugfixes

  • Recalculating block indexes is missing some attributes. #450
  • Placeholder does not get printed for Posts & Sites. #552

Version 5.4.0

2019-03-01

Note that Piranha.Cache.MemCache has been renamed to Piranha.Cache.SimpleCache. Update your code to reflect the changes, or change it to use one of the new cache services available.

Core

  • Added support for IDistributedCache. #249
  • Added support for IMemoryCache. #482
  • Upgraded ImageSharp to beta6. #492

Manager

  • Updated Piranha.Manager to Razor Class Library. #527
  • Updated Piranha.AspNetCore.Identity to Razor Class Library. #527

Bugfixes

  • When uploading media, file extensions is case sensitive. #483
  • Delete role is missing from AspNetCore.Identity. #525
  • Last role assignment on each row is not saved. #526

Version 5.3 - Service Release 2

2019-02-16

Piranha.Azure.BlobStorage 5.3.1

  • Replaced WindowsAzure.Storage with Microsoft.Azure.Storage.Blob. #487
  • Create BlobStorage with connection string. #491

Version 5.3 - Service Release 1

2018-12-08

Piranha 5.3.1, Piranha.AspNetCore 5.3.1, Piranha.Manager 5.3.1

Service release containing some minor bug fixes and updates on routing in multiple site scenarios.

Core

  • Redesign how sites are fetched from hostname. #449

Bugfixes

  • Routing with Two Different Sites. #437
  • Adding a region to page is not backward-compatible. #446
  • Api is always null in ApplicationService. #447
  • The DateField EditorTemplate renders with different format than expected. #451

Version 5.3.0

2018-11-19

Big thanks to @filipjansson, @Talagozis, @MCNorthwood, @DraagrenKirneh and @be4i for their contributions.

Core

  • Mobile Friendly Hamburger menu. #302
  • Culture / Language Support on Site level. #308
  • Add config to FileStorage extension method. #422

Manager

  • Document media preview. #69
  • Default block template. #411
  • Improve add user email field. #412
  • Add loading animation to AJAX actions on Manager. #413
  • Tooltip support. #414
  • Allow HTML in region descriptions. #415
  • Don't show inner HTML in link dialog. #419

Bugfixes

  • Published post from unpublished archive page is accessible. #323
  • Updating image-link in the HTML-editor. #420
  • Pdfs show last image viewed in modal. #421
  • Fix hardcoded item title for single field list regions #435

Version 5.2.1

2018-10-17

This is primarily a security update to address the Denial of Service vulnerability in AspNetCore 2.1. For more information regarding this, please read Microsofts official announcement at https://github.com/dotnet/announcements/issues/67. This release is updated to the latest packages and .NET Core 2.1.5.

Core

  • Add Site Global Last Modified. #407
  • Upgrade AspNetCore to the latest version. #408

Version 5.2.0

2018-10-15

Big thanks to @Talagozis for his contribution.

Core

  • Page redirects in sitemap for better SEO. #340
  • Remove IApi from ContentTypeBuilder. #363
  • Keep all Content Types in memory. #369
  • Add placeholder option for fields. #370
  • Add support for async Init() on Fields. #374
  • Adding information text for a region. #388
  • Rename BlogPage to ArchivePage. #391
  • Extension method for adding Mem Cache. #398
  • Extension method for adding Blob Storage. #399

Manager

  • BrowserLink for live updated preview. #287
  • Better support for multiple sites. #351
  • Change Login Logo via Manager / Config. #359
  • Ability to filter the manager media list. #360
  • Add possibility to inject partials into the manager. #373
  • Make buttons fixed for Page & Post edit. #393
  • Fix button layout for Post & Page field. #395
  • Post link dialog doesn't support multiple sites. #405
  • Display group icon instead of placeholder icon. #402

Bugfixes

  • Cannot add hyperlink to image in HTML editor. #343 #343
  • Raw SQL in migration breaks in MySQL. #375
  • Markdown Fields not saved on first click. #392
  • 24 hour time format in manager date picker? #394
  • Can't remove last block from Page. #396

Version 5.1.2

2018-08-10

Please note that the HTML-editor initialization has been updated due to the new Ajax save. If you have a custom TinyMCE setup in your project, make sure you add the following lines to your TinyMCE init:

setup: function (editor) {
    editor.on('change', function () {
        editor.save();
    });
}

Bugfixes

  • Missing Content Type for Sitemap.xml. #350
  • EF Migration error on Npgsql. #352
  • Bug when saving static HTML fields in the manager. #358

Version 5.1.1

2018-07-24

Bugfixes

  • Bug in Sitemap Caching. #337
  • After changing sort order wrong site is loaded. #346
  • Problem adding pages with multiple sites. #347
  • Meta description limitations not updated. #349

Version 5.1.0

2018-07-10

Please note that this version switches from AspNetCore and EF Core 2.0 to 2.1.1

Big thanks to @filipjansson and @aatmmr for their contributions.

Upgrading

A new service component have been added to hold information for the request context, such as current Site, Sitemap and other info. After upgrading you must add this service in your Startup.cs.

public IServiceProvider ConfigureServices(IServiceCollection services)
{
    ...

    services.AddPiranhaApplication();

    ...
}

To access the new features in your views, add the following in your _ViewImports.cshtml.

@inject Piranha.AspNetCore.Services.IApplicationService WebApp

Core

  • Add support for Block Groups. #291
  • Support for site-global content. #295
  • Support multiple file formats in image scaling. #296
  • Upgrade to .NET Core 2.1.1 & EF Core 2.1.1 #297
  • Added MySQL support for Identity. #298

Manager

  • Change Page & Post edit to save via Ajax. #292
  • Improve error message on failed login. #294
  • Improve UX on media fields. #299
  • Show Block icon and name on hover. #303
  • Visual placeholders for empty HTML blocks. #307
  • Set new Block dialog position depending on screen position. #318
  • Add support for "unlisted" block types. #324
  • Add ApplicationService to simplify application development. #333

Bugfixes

  • Adding blog post to not saved draft of a new archive causes exception. #321

Version 5.0.1

2018-05-25

Manager

  • Fixed so the login page doesn't say 5.0.0-beta1

Version 5.0.0

2018-05-25

This release contains some minor breaking changes. Application startup needs to be updated to incorporate new services & features. For more information, please refer to Project Setup in the Wiki.

Big thanks to @filipjansson and @lukethenuke for their contributions.

Core

  • Added block-based content. #202
  • Add checkbox field. #230
  • Add support for custom search queries. #232
  • Add Hook for slug generation. #243
  • Add tag filtering for archives. #246
  • Support DI in field Init(). #250
  • Rename Piranha.Extend.FieldAttribute. #251
  • Support for Page Copies. #252
  • Add security module for AspNetCore Identity. #271
  • Add number Field. #277
  • Updated slug generation. 278
  • Support for loading content without regions & blocks. #285
  • Auto register fields used by content types. #288

Manager

  • Add media link to TinyMCE. #242
  • Add module info to the Manager. #248
  • Add custom css/js to the Manager. #273
  • Add font awesome to the Manager. #275
  • Added column swap for column blocks. #281
  • Make scheduled entries more visible. #283

Bugfixes

  • Sitemap middleware includes unpublished posts. #195
  • Archive router bug for Razor pages. #248
  • Requesting a non-existing post should throw 404. #261
  • Image resize not working in TinyMCE. #282

Version 4.3.1

2018-04-02

Intermediate release with some bug fixes for the manager UI.

Manager

  • SimpleMDE not initialized correctly in new List Region. #224
  • Moving list region items sometimes crash. #225

Version 4.3.0

2018-03-23

General improvements and new content features.

Core

  • Add Select field. #56
  • Add support for Generic fields. #56
  • Split caching into different levels. #96
  • Allow aliases to point to http:// urls. #204
  • CDN support for media storage. #205
  • Allow prefix in hostnames. #209
  • Store requested SiteId in HttpContext. #210

Manager

  • Drag n Drop for moving media assets. #67
  • Drag and drop media upload. #67
  • Toolbar for Markdown fields. #85
  • Suggest alias when changing slugs. #184
  • Show Page type name in site tree. #212

Bugfixes

  • IApi should be injected in middleware Invoke(). #213
  • Old media isn't removed when updated with new filename. #218
  • Collection regions not working for posts. #219

Version 4.2.1

2018-03-01

Service release with some bug fixes and minor updates.

Core

  • Blog post URL's are wrong in sitemap.xml. #196
  • Permalinks are inconsistent. #197

Manager

  • Markdown preview doesn't limit image width. #192
  • Published date format error for pages & posts. #200

Version 4.2.0

2018-02-22

This release expands the functionality with more features like alias management, image cropping and more.

Core

  • Added alias model. #97
  • Added hooks for aliases. #105
  • Added hooks for categories. #105
  • Added hooks for media. #105
  • Added hooks for media folders. #105
  • Added hooks for params. #105
  • Added hooks for sites. #105
  • Added hooks for tags. #105
  • Made IStorage & IStorageSession async. #109
  • Added image scaling & image versions. #119
  • Added sitemap.xml generator. #150
  • Added basic project template. #167
  • Fixed bug in PostRouter for multiple sites. #181
  • Fixed so start page router can handle blog pages. #187

Azure

  • Added support for Azure Blob Storage. #23

Manager

  • Added alias management views. #97
  • Fixed format error on post published date. #183
  • Updated save behavior for posts. #185
  • Added post search in the blog archive. #188
  • Added manual publish date for pages. #189

Version 4.1.1

2018-01-22

Intermediate release that adds some features for blogging to support larger amounts of posts.

Core

  • Added methods for deleting unused categories & posts. #172

Manager

  • Added support for setting a future publish date for posts. #170
  • Added post type filter to the blog list. #168
  • Added category filter to the blog list. #165

Version 4.1.0

2018-01-14

This version adds blogging support with Posts, Categories, Tags and Archive Pages. It also includes some bug fixes & general improvements.

Thanks to @gyretech for testing and feedback.

Core

  • Added category model. #76
  • Added tag model. #77
  • Added post model. #78
  • Added document field. #157
  • Added video field. #158
  • Added media field. #159
  • Added post field. #160* Fixed bug with empty collection regions. #162
  • Added page field. #163
  • Added archive category filter. #164

Manager

  • Added custom TinyMCE plugin for Page & Post links. #153
  • Added sitemap reload after move. 6ede7ac
  • Prohibited recursive page delete. 83b3176

Version 4.0.2

2017-12-12

Intermediate release that addresses the following problems.

Manager

  • Added policy permissions support for menu. #151
  • Fixed initialization for dynamically inserted HTML-editors. #152

Version 4.0.1

2017-12-02

Intermediate release that addresses the following problems.

Manager


Version 4.0.0

2017-12-01

First official release with support for building page based sites.

With contributions by: @gyretech & @filipjansson

Core

  • Completely rewritten for NetStandard 2.0 & EF Core
  • Smart pluggable caching
  • Pluggable file storage
  • SEO-friendly URL’s & meta-data
  • Claims-based admin permissions

Content

  • Templated page types
  • Multiple sites with hostname-based routing
  • HTML and Markdown content
  • Hierarchical media library

Manager

  • Simple and intuitive interface
  • Responsive down to portrait tablets
  • Extensible
Clone this wiki locally