dougelkin.com
  • About
  • Blog
    About GmocliAbout Preaction CMS
  • Portfolio
Content Type "image" Settings

Doug Elkin

Software Engineer

Content Type "wysiwyg" Settings
Block Type "content" Settings
Page Settings
Page Settings
Content Type "spacer" Settings

About Preaction CMS


Thoughout 2018-2022, I worked on a project I called Preaction CMS, and decsribed it as a "barebones, extendable CMS built on top of simple JavaScript libraries."


"Simple" could probably be more accurately described as a hodgepodge of the most predictable javascript libraries that one might choose to build a CMS in the year 2018.


Specifically: Node, Express, Sequelize, SQLite, React, Bootstrap, Axios, SASS, Webpack, Jest, ESLint, Prettier. It is also using the Quill editor for WYSIWYG editing.


It has some great features:


  • SSR by default
  • Cached responses with automatic warming
  • Optional Google Analytics
  • EXIF data removal for image uploads
  • Sitemap.xml generation
  • Socket.io-induced automatic page reloading
  • WYSIWYG editing
  • Extensions for both backend and frontend
  • Path-specific settings
  • Redirect management
  • Feature parity between desktop and mobile
  • Support for non-empty root path
  • Unit tests on both backend and frontend
  • Database backups for every write operation, and a restore feature as well
  • It's also an SPA, and it selectively reloads only the parts of the page that need to change when you navigate


Backend extensions are as simple as writing an express middleware function with the (request, response, next) signature. Frontend extensions are just React components that accept some standard props, and there is also an extension API for the administrative side of your extension. Custom S/CSS style overrides can be done at compile-time, or placed in a static location and using an extension block type to add the style block to your page header.


Keeping in mind that there's nothing keeping you from writing an extension that does something insecure, it's reasonably secure by default. It uses bcrypt password hashing, CSRF protection, Randomized admin PW by default, signed cookies with a randomized default cookie secret. Support for SAMESITE=secure. It also has a read-only mode, which disables all admin-required and CSRF-protected middleware.


It achieves good performance using SSR and pre-warmed cached responses by default. For the frontend javascript, the main bundle delivered to users is just 133 KB gzipped. Accessing the administrator functions will give you bundles which amount to to less than 100 KB of additional gzipped javascript.


I've used this in the past as a technical foundation to build knowledgebase websites for higher ed institutions. The extensibility allowed me to build a template site using CRM-derived data to serve potentially thousands of client-specific sites all running from the same lightweight instance.


This website, https://dougelkin.com, is a live instance of Preaction CMS. You can find the source on Github.


Building a CMS from scratch is not exactly something I want to do again, but I have found joy in this project. Follow me on Fosstodon to stay up-to-date on my thoughts about this.


~ Doug

Content Type "wysiwyg" Settings
Block Type "content" Settings
Block Type "spacer" Settings
Page Settings
Block Type "spacer" Settings
Block Type "ext/SocialBadge" Settings
Alternative Mastodon Profiles
https://mastodon.social/@duhdugg
https://infosec.exchange/@duhdugg
https://masto.ai/@duhdugg
https://indieweb.social/@duhdugg
Block Type "ext/MastoAlts" Settings

Copyright © 2018-2025 Doug Elkin. All rights reserved.

Content Type "wysiwyg" Settings
Block Type "content" Settings
Page Settings
Site Settings
New Page