Introducing the TachyonCMS
This is the fifth in a series of articles about how to cost effectively manage multi-site content in a modern cloud environment. The series to date has led me to the conclusion that there wasn’t really an adequate content management tool in existence. In this article I introduce my solution to that, the TachyonCMS.
CMS Goals
- Strong offline editing support.
- Data formats humans can understand.
- Easily extend and modify the functionality.
- Effective change and version control, full audit ability.
- Cloud agnostic, multi-cloud support.
How we achieve that
Strong offline editing support
We provide an Electron app that works without any backend server requirements. It can edit CMS data stored in multiple local directories. Those files can be synced via a Git process or cloud resources.
We’ll use AWS Appsync API with Datastore to enable offline capabilities in the web, Android and iOS versions.
Data formats humans can understand
All the CMS data is modeled as simple JSON objects. A user could read and edit those JSON files directly.
Easily extend and modify the functionality
The core logic is broken out into a Vue 3 composable function. That same function is use for all versions of the app, Electron, Android, iOS, and web.
It is simple to create new block types. Each block type requires defining an editor and a renderer. Those are small pieces of code and ones specific to your needs can be created in a few lines of code.
Other applications and scripts can directly manipulate the resulting files for automatic updates or changes.Creating code to modify the human created content is easy and straight forwards.
We use Quasar for the app. That allows us to use the same core logic and view across Electron, web, Android and iOS apps.
Effective change and version control, full audit ability
This is achieved using well-proven Git workflows. These can be as automated or manual as needed in your situation. Instead of an editor simply approving the current state of an article they can view a diff and verify that what was removed was correct.
Cloud agnostic, multi-cloud support
The Electron version doesn’t require any network services, you can create an unlimited number of new flows and nuggets without ever connecting to the network.
The first cloud storage service will be Storj, used by Electron and the management scripts.
TachyonCMS Components
TachyonCMS will provide an almost identical experience to users regardless of the client version.
Electron Desktop Editor
We will be publishing the Desktop editor ans an Electron app under Windows, Linux and MacOS. This enables unlimited, network free editing and creation with no cost to the users.
This will support working with local or LAN files as well as with files located on the Storj.io network. Storj offers 250MB storage for free and a terabyte is only $4 per month. Plus you get the warm fuzzies from supporting a decentralized app.
Single-tenant AWS App
This version allows companies to manage their own AWS based TachyonCMS environment. This provides a standalone, serverless Amplify app that requires very little devops support. If it’s run in its own AWS Organization it can be entirely isolated from other AWS services.
Multi-tenant AWS App
This is the software we’ll use for our own SaaS offering. TachyonCMS.com will provide users to get all the benefits of TachyonCMS without having to run or manage anything locally or on the cloud.
It will support incoming and outgoing webhooks so synchronize with other deployment flows.
TachyonCMS Data Model
The data is modeled as flows, nuggets and blocks.
Flows
A flow has a title and can have it’s publication dates and locations managed. A flow has a sequence of nuggets defined.
In file based representations, flows are in their own directory named using the flow’s ID. A flow.json
file contains the tile, publication and meta info. A nuggetSeq.json
file contains a sequenced array of Nugget IDs.
In AWS Appsync versions the flows are in their own DynamoDB table. The nuggetSeq
is stored in that record.
Nuggets
Nuggets in turn have their own publication settings, and an optional title. Nuggets consist of a sequence of blocks, blocks share the nugget’s publication settings.
In file based representations, nuggets are in their own directory named using the nugget’s ID. A nugget.json
file contains the tile, publication and meta info. It also a blocks
property that contains an array of blocks, with their type and data.
In AWS Appsync versions the nuggets are in their own DynamoDB table.
Blocks
Blocks are stored in a sequenced array within the nugget record, whether it is stored in a file or in DynamoDB. They are an array of other JSON objects or strings. Each block has a type defined that is used to load the correct editor and renderer.
Customizations
Customization can be accomplished in either the editor or the renderer. If that data represented doesn’t change you can use a custom renderer when producing the production output.
If you need a different data model a custom editor can be created. This is simply a Vue component that adheres to the editor API. You only need to worry about the component creating well formed JSON or strings for output. The TachyonCMS framework will take care of storing and retrieving that data automatically. This allows super fast development of custom data types and schemas.
Self-hosted versions can customize any and all of the text or styling in any of the available platform versions.
Previous articles in series:
Part 1 — Parking for Pennies
Part 2 — AWS SSL Certificates
Part 3 — Mass Hosting Paradigm
Part 4 — Not Content with Contentful