Dark-neon publishing, portable by design

Ty Clifford's Content Management System

TCMS, Ty's Content Management System, or just Ty's CMS, is a PHP blog engine built around Markdown files, Bludit-style folders, SQLite comments, JSON indexes, CSV stats, shortcodes, embeds, and a native AppKit Mac client.

PHP 8.1+ runtime SQLite comments Markdown posts macOS 12+ client

What it is

File-first publishing with a bright pulse.

TCMS keeps the daily publishing path simple: write content as Markdown, store each item in a copy-friendly folder, rebuild the generated index, and let the public theme do the rest. It keeps the author surface powerful, trusting first-party content to include raw HTML, iframes, JavaScript, and executable PHP when the site owner wants that control.

bl-content/pages/hello-neon/index.txt
bl-content/pages/about/index.txt
config/site.json
storage/database/comments.sqlite
storage/stats/visits.csv

Captured from the demo CMS

Real screens, real theme.

The showcase uses live screenshots from the demo pages and posts in this repository, preserving the grid background, sticky navigation, accent swatches, search, side rail, comments, and Markdown rendering.

TCMS home page with neon grid, post cards, categories, tags, archive, search, and accent controls.
Home and post listing Post cards, static navigation, social links, category counts, tag chips, archive links, and visitor theme controls.
TCMS Hello Neon post showing Markdown content, code block, tags, comments area, and side rail.
Markdown post view Front matter becomes routing, metadata, summaries, tags, and a polished public article page.
TCMS search results page for the query neon.
Search results Built-in search returns matching posts and pages while preserving the same sidebar metadata.

README, demonstrated

The docs are the architecture map.

TCMS is intentionally transparent. The README describes where content lives, how publishing works, how embeds are declared, how the API authenticates, and where operational data is stored.

01

Bludit-style folders

Every post or page lives at bl-content/pages/<slug>/index.txt, so imports, backups, and hand edits stay understandable.

02

Trusted author rendering

Markdown is rendered while allowing raw HTML, iframes, JavaScript, and PHP blocks for site-owner-controlled content.

03

Shortcodes and embeds

Declare shortcodes in config/shortcodes.php or JSON. Built-ins include YouTube embeds and local video players through lone-embed.php.

04

Comments and stats

SQLite stores moderated comments with captcha and honeypot protection, while visits stream to an Excel-ready CSV file.

05

Routing and feeds

Pretty URLs, search, pagination, categories, tags, archives, static pages, RSS, and sitemap output are included.

06

API-first management

api.php exposes authenticated management for posts, pages, media, comments, autosave, publishing, updates, and deletes.

Author workflow

Copy a folder. Rebuild the index. Publish.

The canonical store remains plain text plus a small metadata block. That makes TCMS easy to move, inspect, diff, script, and recover.

  1. Create or copy a content folder under bl-content/pages.
  2. Edit front matter for title, slug, type, status, dates, category, tags, author, and comments.
  3. Run the CLI to rebuild indexes or create, update, delete, list, moderate, and summarize content.
php cli/blog.php help
php cli/blog.php list --all
php cli/blog.php create "New Post" --status=published --category=Notes --tags=php,markdown
php cli/blog.php update hello-neon --title="Hello Neon"
php cli/blog.php comments:list --status=pending
php cli/blog.php stats:summary
php cli/blog.php rebuild

Media and shortcodes

Embeds are declared, not improvised.

Shortcodes turn common media needs into repeatable author syntax. A YouTube ID can become a privacy-friendly iframe; a local video can become a full-frame HTML5 player through lone-embed.php; direct images, videos, and media links can join the public lightbox slideshow.

[youtube=dQw4w9WgXcQ]
[video poster=poster.jpg file=file.mp4]
config/shortcodes.php
config/shortcodes.json
bl-content/uploads

Native companion

The Mac client brings TCMS to AppKit.

The native macOS 12+ client lives in macclient/ and points at any TCMS site URL. It calls api.php with the username and password stored in the site's .env, then manages the same portable posts, pages, media, and comments from a desktop workspace.

TCMS Posts Pages Media Comments Settings
RefreshNewDraftUpdatePublishUpload Media
TitleStatusType SlugCategoryTags SummaryAuthorCover
# New Post Start writing here. Local autosave + optional remote draft autosave.
Create, edit, update, draft, publish, and delete posts or pages. Upload media, preview images, play audio/video, and copy Markdown embeds. Moderate comments and page through large lists. Use Command-S, Command-Comma, undo, redo, spell check, and auto-correct.

Get the code

Clone a copy of TCMS.

Grab the repository, run the local server, open the demo pages, and build the native Mac client when you want desktop management. You can also visit Ty Clifford's real live blog to see the public site in context.

tyclifford.com/blog git.tyclifford.com/snick/tcms
git clone https://git.tyclifford.com/snick/tcms
cd tcms
php -S 127.0.0.1:8080 router.php

cd macclient
./build-app.sh
open TCMS.app