UK hosted · Static HTML · Soft-coded render engine · Agentic API

Websites from descriptions.

TinyCMS renders beautiful, fast static websites from VML — a structured, human and AI-readable site description language. Describe your site. Render once. Publish everywhere.

The concept

Describe your site.
The engine does the rest.

TinyCMS is built on a simple insight — a website is just a structured description rendered into HTML. Write the description in VML, our human-readable format, and TinyCMS generates clean, semantic, fast HTML. Once. Served by nginx directly from disk in under a millisecond.

No PHP on every request. No database queries per page load. No plugin conflicts. No attack surface. Just a file on disk that nginx serves in under a millisecond, anywhere in the world, under any load.

The same VML description can render to HTML for browsers, JSON for APIs, or XAML for desktop applications — using the same soft-coded render engine architecture that powers the Visualised RAD IDE. UK patent pending.

VML fileParserDBRender scriptsStatic HTML
nginx serves the HTML file directly · no PHP · no database · <1ms

Visualised Markup Language

Every element is a control with properties.

VML treats every part of a website as a named control with typed properties — exactly like VB5 or Avalonia UI controls. The HTML output is just one rendering target. The same VML renders to desktop, mobile or API.

@Site @Page @Section @Nav @NavItem — describe the container hierarchy. Every page is a tree of sections. Every section is a typed layout with named blocks.

@Heading @Text @Button @Image @Tag @Html — map 1:1 to HTML semantic elements. @Html is the escape hatch for edge cases only.

@Card @FeatureCard @StatCard @PriceCard @ContactCard @Copyright — named HTML patterns used 3+ times across sites. Each renders via a DB script.

Every control has Style= for presets and fine-grained properties: TextColor= BgColor= FontSize= FontWeight= Padding= Shadow= — VML owns all style decisions.

hero · about · services · features · pricing · cta · contact · form · footer · text · html. Each type maps to a layout wrapper in the DB. New types added via SQL.

A @tag exists only if it maps to a distinct HTML semantic element, OR is a named composite appearing 3+ times across sites. Everything else is @Html or a property.

VML @tag reference
# ── Structural ──────────────────────
@Site    slug  Domain= Webroot= Title= Desc=
@Page    slug  Output= Title= Status=published
@Section slug  Page= Type= BgColor=
@Nav     slug
@NavItem slug  Nav= Label= Href= Class= Order=

# ── Primitives ──────────────────────
@Heading slug  Section= Level=1-6  Text=
           TextColor= FontSize= FontWeight=
@Text    slug  Section= Text=
           TextColor= FontSize= LineHeight=
@Tag     slug  Section= Text= TextColor=
@Button  slug  Section= Label= Href= Style=
           BgColor= TextColor= MarginTop=
@Image   slug  Section= Src= Alt= Width=
@Html    slug  Section= Content=

# ── Composites ──────────────────────
@Card        slug  Section= Title= Text=
              Style=light|dark|accent|ghost
              TitleColor= BodyColor= BgColor=
@FeatureCard slug  Section= Number= Title= Text=
              TitleColor= BodyColor=
@StatCard    slug  Section= Value= Label=
              Style=dark|light
@PriceCard   slug  Section= Title= Price= Period=
              Featured=true|false
@ContactCard slug  Section= Email= Phone=
              Address= Hours=
@Copyright   slug  Section= Text=

# ── Data controls ───────────────────
@Select      slug  Section= Label=
              SeedData=csv
              val1, Label 1
              val2, Label 2
              #EndSeed
@DataBlock   slug  Section= Type=html
              raw content here
              @End

# ── Section types ───────────────────
hero      dark · h1 · sub · buttons
about     two-col · text left · visual right
services  card grid · three-col
features  numbered cards
contact   two-col · details + form
footer    brand + nav cols + copyright
text      prose · any blocks

# ── Style properties ────────────────
TextColor=  FontSize=   FontWeight=
BgColor=    Padding=    MarginTop=
Shadow=     TitleColor= BodyColor=

# ── Inline markup ───────────────────
*text*   →  accent colour em
\n       →  line break in headings

# ── SQLite per site ─────────────────
site.db lives in webroot
Full create/drop for site owner
Lua scripts access via tinycms.db()
DataBlock refs: {{data:my-block}}

# ── Coming soon ─────────────────────
@Script slug  Lang=lua  Cache=300
tinycms.db()    site SQLite
tinycms.fetch() HTTP calls
tinycms.site()  structure
tinycms.cache() caching
This page — tiny-cms.uk live VML
# Tinycms — exported VML
# Generated: 2026-06-22 04:52:28 by TinyCMS renderer
# Source of truth — DB id=46

@Site tinycms
Domain=tiny-cms.uk
Webroot=/var/www/html/tinycms/tinycms/public_html
Title=TinyCMS — Static websites from structured descriptions
Desc=TinyCMS builds beautiful, fast static websites from VML — a human and AI-readable site description language. Soft-coded render engine. Agentic API. UK hosted.

@Nav main

@NavItem 
Nav=main
Label=Concept
Href=#concept
Order=1

@NavItem 
Nav=main
Label=VML
Href=#vml
Order=2

@NavItem 
Nav=main
Label=Engine
Href=#engine
Order=3

@NavItem 
Nav=main
Label=API
Href=#api
Order=4

@NavItem 
Nav=main
Label=Start free
Href=#pricing
Class=nav-cta
Order=6

@NavItem 
Nav=main
Label=AGENT.md
Href=/api/agent.md
Order=60

@NavItem 
Nav=main
Label=Editor
Href=https://tiny-web.uk/dashboard/cms/
Order=70

@Nav footer

@NavItem 
Nav=footer
Label=Concept
Href=#concept
Order=1

@NavItem 
Nav=footer
Label=VML Reference
Href=#vml
Order=2

@NavItem 
Nav=footer
Label=Render Engine
Href=#engine
Order=3

@NavItem 
Nav=footer
Label=Agentic API
Href=#api
Order=4

@Nav footer-ecosystem

@NavItem 
Nav=footer-ecosystem
Label=TinyWeb
Href=https://tiny-web.uk
Order=1

@NavItem 
Nav=footer-ecosystem
Label=TinyVPS
Href=https://tinyvps.uk
Order=2

@NavItem 
Nav=footer-ecosystem
Label=TinyMail
Href=https://tinymail.uk
Order=3

@NavItem 
Nav=footer-ecosystem
Label=TinySMS
Href=https://tinysms.uk
Order=4

@Nav footer-legal

@NavItem 
Nav=footer-legal
Label=Privacy
Href=/privacy/
Order=1

@NavItem 
Nav=footer-legal
Label=Terms
Href=/terms/
Order=2

@NavItem 
Nav=footer-legal
Label=Contact
Href=mailto:hello@tiny-web.uk
Order=3

@Page index
Output=/index.html
Title=TinyCMS — Static websites from structured descriptions
Status=published

@Section hero
Page=index
Type=hero
BgColor=#0d1117

@Tag hero-tag
Section=hero
Text=UK hosted · Static HTML · Soft-coded render engine · Agentic API
TextColor=#6366f1
Order=0

@Heading hero-h1
Section=hero
Level=1
Text=Websites from *descriptions.*
TextColor=#ffffff
Order=1

@Text hero-sub
Section=hero
Text=TinyCMS renders beautiful, fast static websites from VML — a structured, human and AI-readable site description language. Describe your site. Render once. Publish everywhere.
TextColor=rgba(255,255,255,0.7)
Order=2

@Button hero-start
Section=hero
Href=#pricing
Label=Start free →
MarginTop=32px
Style=primary
Order=3

@Button hero-docs
Section=hero
Href=#vml
Label=Read the docs
Style=outline
Order=4

@Html hero-stats
Section=hero
Content=<div style="display:flex;gap:40px;margin-top:48px;padding-top:32px;border-top:1px solid rgba(255,255,255,.08);flex-wrap:wrap"><div><div style="font-size:28px;font-weight:800;color:#fff;line-height:1">~1ms</div><div style="font-size:12px;color:rgba(255,255,255,.4);margin-top:4px">Page response time</div></div><div><div style="font-size:28px;font-weight:800;color:#fff;line-height:1">Zero</div><div style="font-size:12px;color:rgba(255,255,255,.4);margin-top:4px">Attack surface</div></div><div><div style="font-size:28px;font-weight:800;color:#fff;line-height:1">100%</div><div style="font-size:12px;color:rgba(255,255,255,.4);margin-top:4px">Static HTML</div></div><div><div style="font-size:28px;font-weight:800;color:#fff;line-height:1">UK</div><div style="font-size:12px;color:rgba(255,255,255,.4);margin-top:4px">Hosted · GDPR ready</div></div></div>
Html=<div style="display:flex;gap:40px;margin-top:48px;padding-top:32px;border-top:1px solid rgba(255,255,255,.08);flex-wrap:wrap"><div><div style="font-size:28px;font-weight:800;color:#fff;line-height:1">~1ms</div><div style="font-size:12px;color:rgba(255,255,255,.4);margin-top:4px">Page response time</div></div><div><div style="font-size:28px;font-weight:800;color:#fff;line-height:1">Zero</div><div style="font-size:12px;color:rgba(255,255,255,.4);margin-top:4px">Attack surface</div></div><div><div style="font-size:28px;font-weight:800;color:#fff;line-height:1">100%</div><div style="font-size:12px;color:rgba(255,255,255,.4);margin-top:4px">Static HTML</div></div><div><div style="font-size:28px;font-weight:800;color:#fff;line-height:1">UK</div><div style="font-size:12px;color:rgba(255,255,255,.4);margin-top:4px">Hosted · GDPR ready</div></div></div>
Order=5

@Section concept
Page=index
Type=about
BgColor=#ffffff

@Heading concept-eyebrow
Section=concept
Level=5
Text=The concept
TextColor=#6366f1
Order=0

@Heading concept-h2
Section=concept
Level=2
Text=Describe your site.\n*The engine does the rest.*
TextColor=#0f172a
Order=1

@Text concept-p1
Section=concept
Text=TinyCMS is built on a simple insight — a website is just a structured description rendered into HTML. Write the description in VML, our human-readable format, and TinyCMS generates clean, semantic, fast HTML. Once. Served by nginx directly from disk in under a millisecond.
TextColor=#475569
Order=2

@Text concept-p2
Section=concept
Text=No PHP on every request. No database queries per page load. No plugin conflicts. No attack surface. Just a file on disk that nginx serves in under a millisecond, anywhere in the world, under any load.
TextColor=#475569
Order=3

@Text concept-p3
Section=concept
Text=The same VML description can render to HTML for browsers, JSON for APIs, or XAML for desktop applications — using the same soft-coded render engine architecture that powers the Visualised RAD IDE. UK patent pending.
TextColor=#475569
Order=4

@Html concept-diagram
Section=concept
Content=<div style="background:#f8fafc;border:1px solid #e2e8f0;border-radius:14px;padding:28px;margin-top:24px"><div style="display:flex;align-items:center;gap:12px;flex-wrap:wrap;justify-content:center"><span style="background:#6366f1;color:#fff;padding:8px 16px;border-radius:8px;font-size:13px;font-weight:700">VML file</span><span style="color:#94a3b8;font-size:18px">→</span><span style="background:#0f172a;color:#4ade80;padding:8px 16px;border-radius:8px;font-size:13px;font-weight:700">Parser</span><span style="color:#94a3b8;font-size:18px">→</span><span style="background:#0f172a;color:#fff;padding:8px 16px;border-radius:8px;font-size:13px;font-weight:700">DB</span><span style="color:#94a3b8;font-size:18px">→</span><span style="background:#0f172a;color:#a78bfa;padding:8px 16px;border-radius:8px;font-size:13px;font-weight:700">Render scripts</span><span style="color:#94a3b8;font-size:18px">→</span><span style="background:#16a34a;color:#fff;padding:8px 16px;border-radius:8px;font-size:13px;font-weight:700">Static HTML</span></div><div style="text-align:center;margin-top:16px;color:#94a3b8;font-size:12px">nginx serves the HTML file directly · no PHP · no database · &lt;1ms</div></div>
Html=<div style="background:#f8fafc;border:1px solid #e2e8f0;border-radius:14px;padding:28px;margin-top:24px"><div style="display:flex;align-items:center;gap:12px;flex-wrap:wrap;justify-content:center"><span style="background:#6366f1;color:#fff;padding:8px 16px;border-radius:8px;font-size:13px;font-weight:700">VML file</span><span style="color:#94a3b8;font-size:18px">→</span><span style="background:#0f172a;color:#4ade80;padding:8px 16px;border-radius:8px;font-size:13px;font-weight:700">Parser</span><span style="color:#94a3b8;font-size:18px">→</span><span style="background:#0f172a;color:#fff;padding:8px 16px;border-radius:8px;font-size:13px;font-weight:700">DB</span><span style="color:#94a3b8;font-size:18px">→</span><span style="background:#0f172a;color:#a78bfa;padding:8px 16px;border-radius:8px;font-size:13px;font-weight:700">Render scripts</span><span style="color:#94a3b8;font-size:18px">→</span><span style="background:#16a34a;color:#fff;padding:8px 16px;border-radius:8px;font-size:13px;font-weight:700">Static HTML</span></div><div style="text-align:center;margin-top:16px;color:#94a3b8;font-size:12px">nginx serves the HTML file directly · no PHP · no database · &lt;1ms</div></div>
Order=5

@Section vml
Page=index
Type=features
BgColor=#f8fafc

@Heading vml-eyebrow
Section=vml
Level=5
Text=Visualised Markup Language
TextColor=#6366f1
Order=0

@Heading vml-h2
Section=vml
Level=2
Text=Every element is a *control with properties.*
TextColor=#0f172a
Order=1

@Text vml-lead
Section=vml
Text=VML treats every part of a website as a named control with typed properties — exactly like VB5 or Avalonia UI controls. The HTML output is just one rendering target. The same VML renders to desktop, mobile or API.
TextColor=#475569
Order=2

@FeatureCard vml-f1
Section=vml
BodyColor=#475569
Number=01
Text=@Site @Page @Section @Nav @NavItem — describe the container hierarchy. Every page is a tree of sections. Every section is a typed layout with named blocks.
Title=Structural controls
TitleColor=#0f172a
Order=3

@FeatureCard vml-f2
Section=vml
BodyColor=#475569
Number=02
Text=@Heading @Text @Button @Image @Tag @Html — map 1:1 to HTML semantic elements. @Html is the escape hatch for edge cases only.
Title=Primitive controls
TitleColor=#0f172a
Order=4

@FeatureCard vml-f3
Section=vml
BodyColor=#475569
Number=03
Text=@Card @FeatureCard @StatCard @PriceCard @ContactCard @Copyright — named HTML patterns used 3+ times across sites. Each renders via a DB script.
Title=Composite controls
TitleColor=#0f172a
Order=5

@FeatureCard vml-f4
Section=vml
BodyColor=#475569
Number=04
Text=Every control has Style= for presets and fine-grained properties: TextColor= BgColor= FontSize= FontWeight= Padding= Shadow= — VML owns all style decisions.
Title=Style properties
TitleColor=#0f172a
Order=6

@FeatureCard vml-f5
Section=vml
BodyColor=#475569
Number=05
Text=hero · about · services · features · pricing · cta · contact · form · footer · text · html. Each type maps to a layout wrapper in the DB. New types added via SQL.
Title=Section types
TitleColor=#0f172a
Order=7

@FeatureCard vml-f6
Section=vml
BodyColor=#475569
Number=06
Text=A @tag exists only if it maps to a distinct HTML semantic element, OR is a named composite appearing 3+ times across sites. Everything else is @Html or a property.
Title=Governing rule
TitleColor=#0f172a
Order=8

@Section vml-code
Page=index
Type=text
BgColor=#f8fafc

@Heading vml-code-eyebrow
Section=vml-code
Level=5
Text=VML language reference & this page source
TextColor=#6366f1
Order=0

@Html vml-panels
Section=vml-code
Html={{data:vml-panels}}
Order=1

@Lua-test lua-demo
Section=vml-code
Order=5

@Section engine
Page=index
Type=about
BgColor=#ffffff

@Heading engine-eyebrow
Section=engine
Level=5
Text=Soft-coded render engine
TextColor=#6366f1
Order=0

@Heading engine-h2
Section=engine
Level=2
Text=The renderer is an *interpreter.*
TextColor=#0f172a
Order=1

@Text engine-p1
Section=engine
Text=The TinyCMS render engine contains zero hardcoded HTML. Every block type renders via a PHP snippet stored in the database. Every section layout is a wrapper template. New block types and layouts are added via SQL — no PHP changes required.
TextColor=#475569
Order=2

@Text engine-p2
Section=engine
Text=This is the same architecture as the Visualised RAD IDE, which uses named Lua interpreters to render controls to Avalonia XAML. TinyCMS applies the same model to the web — VML describes the what, the render engine decides the how.
TextColor=#475569
Order=3

@Text engine-p3
Section=engine
Text=Lua scripting for render scripts is coming — enabling dynamic content, database lookups and conditional rendering within static pages. A @Script block with Lang=lua executes at render time and caches the result.
TextColor=#475569
Order=4

@Html engine-schema
Section=engine
<span style="color:#6366f1">Renderer loop (pure interpreter)</span>
  foreach section → load layout wrapper from DB
  foreach block   → execute render script from DB
  inject blocks   → into wrapper → write HTML file</pre></div>
Content=<div style="background:#f8fafc;border:1px solid #e2e8f0;border-radius:14px;padding:24px;margin-top:24px"><div style="font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:#64748b;margin-bottom:16px">DB schema — render engine</div><pre style="font-size:12px;line-height:1.9;color:#0f172a;margin:0;white-space:pre"><span style="color:#6366f1">cms_render_scripts</span>
  block_type   — 'card' | 'feature-card' | 'heading' ...
  lang         — 'php' | 'lua' (coming soon)
  script       — executable snippet, returns HTML string
Html=<div style="background:#f8fafc;border:1px solid #e2e8f0;border-radius:14px;padding:24px;margin-top:24px"><div style="font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:#64748b;margin-bottom:16px">DB schema — render engine</div><pre style="font-size:12px;line-height:1.9;color:#0f172a;margin:0;white-space:pre"><span style="color:#6366f1">cms_render_scripts</span>
  block_type   — 'card' | 'feature-card' | 'heading' ...
  lang         — 'php' | 'lua' (coming soon)
  script       — executable snippet, returns HTML string
Order=5

@Section api
Page=index
Type=about
BgColor=#f8fafc

@Heading api-eyebrow
Section=api
Level=5
Text=Agentic API
TextColor=#6366f1
Order=0

@Heading api-h2
Section=api
Level=2
Text=Built for *AI assistants.*
TextColor=#0f172a
Order=1

@Text api-p1
Section=api
Text=TinyCMS is designed from the ground up to work with AI agents. The API accepts VML directly — describe a site in plain text, POST it to the API, receive a fully rendered site. No UI required.
TextColor=#475569
Order=2

@Text api-p2
Section=api
Text=Drop AGENT.md into any project and any AI assistant immediately understands your site structure, available endpoints and how to make changes safely. Claude, GPT, Gemini — any agent that can read a file and call an API can build and maintain your TinyCMS site.
TextColor=#475569
Order=3

@Html api-endpoints
Section=api
Content=<div style="background:#fff;border:1px solid #e2e8f0;border-radius:14px;padding:24px;margin-top:24px"><div style="font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:#64748b;margin-bottom:16px">REST API — api.tiny-web.uk</div><div style="display:flex;flex-direction:column;gap:8px"><div style="background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;padding:12px 16px;display:flex;align-items:center;gap:16px"><code style="font-size:12px;color:#6366f1;font-weight:700;min-width:180px">POST /cms/render</code><span style="font-size:12px;color:#64748b">Submit VML → parse → render → live site</span></div><div style="background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;padding:12px 16px;display:flex;align-items:center;gap:16px"><code style="font-size:12px;color:#6366f1;font-weight:700;min-width:180px">PATCH /cms/block</code><span style="font-size:12px;color:#64748b">Update one field in one block → re-render</span></div><div style="background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;padding:12px 16px;display:flex;align-items:center;gap:16px"><code style="font-size:12px;color:#6366f1;font-weight:700;min-width:180px">GET /cms/site/{slug}/map</code><span style="font-size:12px;color:#64748b">Full site structure for AI context</span></div><div style="background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;padding:12px 16px;display:flex;align-items:center;gap:16px"><code style="font-size:12px;color:#6366f1;font-weight:700;min-width:180px">GET /api/agent.md</code><span style="font-size:12px;color:#64748b">AI assistant protocol — AGENT.md</span></div></div></div>
Html=<div style="background:#fff;border:1px solid #e2e8f0;border-radius:14px;padding:24px;margin-top:24px"><div style="font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:#64748b;margin-bottom:16px">REST API — api.tiny-web.uk</div><div style="display:flex;flex-direction:column;gap:8px"><div style="background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;padding:12px 16px;display:flex;align-items:center;gap:16px"><code style="font-size:12px;color:#6366f1;font-weight:700;min-width:180px">POST /cms/render</code><span style="font-size:12px;color:#64748b">Submit VML → parse → render → live site</span></div><div style="background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;padding:12px 16px;display:flex;align-items:center;gap:16px"><code style="font-size:12px;color:#6366f1;font-weight:700;min-width:180px">PATCH /cms/block</code><span style="font-size:12px;color:#64748b">Update one field in one block → re-render</span></div><div style="background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;padding:12px 16px;display:flex;align-items:center;gap:16px"><code style="font-size:12px;color:#6366f1;font-weight:700;min-width:180px">GET /cms/site/{slug}/map</code><span style="font-size:12px;color:#64748b">Full site structure for AI context</span></div><div style="background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;padding:12px 16px;display:flex;align-items:center;gap:16px"><code style="font-size:12px;color:#6366f1;font-weight:700;min-width:180px">GET /api/agent.md</code><span style="font-size:12px;color:#64748b">AI assistant protocol — AGENT.md</span></div></div></div>
Order=4

@Button api-agent
Section=api
Href=/api/agent.md
Label=Read AGENT.md →
MarginTop=24px
Style=outline
Order=5

@Section roadmap
Page=index
Type=services
BgColor=#ffffff

@Heading roadmap-eyebrow
Section=roadmap
Level=5
Text=Roadmap
TextColor=#6366f1
Order=0

@Heading roadmap-h2
Section=roadmap
Level=2
Text=What's coming *next.*
TextColor=#0f172a
Order=1

@Text roadmap-lead
Section=roadmap
Text=TinyCMS is under active development. This page is itself built with TinyCMS and updated as features ship.
TextColor=#475569
Order=2

@Card road-lua
Section=roadmap
Style=light
Text=Render scripts in Lua — lighter, sandboxed, faster to iterate. Sandboxed DB access, HTTP calls and site structure via tinycms.lua API.
Title=Lua render scripts
Order=3

@Card road-wp
Section=roadmap
Style=light
Text=Import your WordPress XML export in one click. Pages map to VML sections. Your existing site live on TinyCMS in under 60 seconds.
Title=WordPress importer
Order=4

@Card road-editor
Section=roadmap
Style=light
Text=Click any element on the live preview to edit it. Changes write to DB and re-render instantly. Amy and Bailey are already using v1.
Title=Visual editor v2
Order=5

@Card road-auth
Section=roadmap
Style=light
Text=Add login and Stripe payments to any static site via lightweight JavaScript API calls. No backend required on your site.
Title=TinyAuth + Stripe
Order=6

@Card road-cdn
Section=roadmap
Style=light
Text=One-click push to Cloudflare R2 and Workers. Your static HTML served from 300+ edge locations worldwide.
Title=Global CDN
Order=7

@Card road-github
Section=roadmap
Style=light
Text=Export your rendered HTML directly to a GitHub Pages repository. Free hosting, custom domains, automatic HTTPS.
Title=GitHub Pages export
Order=8

@Section pricing
Page=index
Type=text
BgColor=#f8fafc

@Heading pricing-eyebrow
Section=pricing
Level=5
Text=Pricing
TextColor=#6366f1
Order=0

@Heading pricing-h2
Section=pricing
Level=2
Text=Start free.\n*Scale when ready.*
TextColor=#0f172a
Order=1

@Text pricing-lead
Section=pricing
Text=All plans include UK hosting on tiny-cms.uk, the VML builder, contact forms and SSL. No contracts. Cancel anytime.
TextColor=#475569
Order=2

@Html pricing-cards
Section=pricing
Content=<div style="display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-top:40px"><div style="border:1px solid #e2e8f0;border-radius:14px;padding:28px;background:#fff"><div style="font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:#94a3b8;margin-bottom:10px">Free</div><div style="font-size:40px;font-weight:800;color:#0f172a;line-height:1;margin-bottom:6px">£0<span style="font-size:14px;font-weight:400;color:#94a3b8">/mo</span></div><div style="font-size:12px;color:#94a3b8;margin-bottom:24px">1 site · tiny-cms.uk subdomain</div><div style="display:flex;flex-direction:column;gap:8px;font-size:13px;color:#475569;margin-bottom:28px"><div>✓ VML builder</div><div>✓ Contact API</div><div>✓ Static HTML render</div><div>✓ GitHub Pages export</div><div style="color:#cbd5e1">✗ Custom domain</div><div style="color:#cbd5e1">✗ WordPress importer</div></div><a href="#" style="display:block;text-align:center;padding:11px;border:1.5px solid #e2e8f0;border-radius:8px;color:#475569;font-weight:600;font-size:14px;text-decoration:none">Get started</a></div><div style="border:2px solid #6366f1;border-radius:14px;padding:28px;background:#fff"><div style="font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:#6366f1;margin-bottom:10px">Starter</div><div style="font-size:40px;font-weight:800;color:#0f172a;line-height:1;margin-bottom:6px">£9<span style="font-size:14px;font-weight:400;color:#94a3b8">.99/mo</span></div><div style="font-size:12px;color:#94a3b8;margin-bottom:24px">3 sites · custom domain + SSL</div><div style="display:flex;flex-direction:column;gap:8px;font-size:13px;color:#475569;margin-bottom:28px"><div>✓ Everything in Free</div><div>✓ Custom domain + SSL</div><div>✓ Visual editor</div><div>✓ TinyMail 5 addresses</div><div>✓ WordPress importer</div><div style="color:#cbd5e1">✗ API access</div></div><a href="#" style="display:block;text-align:center;padding:11px;background:#6366f1;border-radius:8px;color:#fff;font-weight:700;font-size:14px;text-decoration:none">Start free trial</a></div><div style="border:1px solid #e2e8f0;border-radius:14px;padding:28px;background:#fff"><div style="font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:#94a3b8;margin-bottom:10px">Pro</div><div style="font-size:40px;font-weight:800;color:#0f172a;line-height:1;margin-bottom:6px">£19<span style="font-size:14px;font-weight:400;color:#94a3b8">.99/mo</span></div><div style="font-size:12px;color:#94a3b8;margin-bottom:24px">10 sites · full API access</div><div style="display:flex;flex-direction:column;gap:8px;font-size:13px;color:#475569;margin-bottom:28px"><div>✓ Everything in Starter</div><div>✓ Full agentic API</div><div>✓ TinyAuth integration</div><div>✓ Stripe payments</div><div>✓ Lua render scripts</div><div>✓ 10GB storage</div></div><a href="#" style="display:block;text-align:center;padding:11px;border:1.5px solid #e2e8f0;border-radius:8px;color:#475569;font-weight:600;font-size:14px;text-decoration:none">Get started</a></div><div style="border:1px solid #e2e8f0;border-radius:14px;padding:28px;background:#fff"><div style="font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:#94a3b8;margin-bottom:10px">Agency</div><div style="font-size:40px;font-weight:800;color:#0f172a;line-height:1;margin-bottom:6px">£49<span style="font-size:14px;font-weight:400;color:#94a3b8">.99/mo</span></div><div style="font-size:12px;color:#94a3b8;margin-bottom:24px">Unlimited · white label</div><div style="display:flex;flex-direction:column;gap:8px;font-size:13px;color:#475569;margin-bottom:28px"><div>✓ Everything in Pro</div><div>✓ White label</div><div>✓ Unlimited sites</div><div>✓ Agentic API unlimited</div><div>✓ On-site support</div><div>✓ SLA guarantee</div></div><a href="#" style="display:block;text-align:center;padding:11px;border:1.5px solid #e2e8f0;border-radius:8px;color:#475569;font-weight:600;font-size:14px;text-decoration:none">Get started</a></div></div>
Html=<div style="display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-top:40px"><div style="border:1px solid #e2e8f0;border-radius:14px;padding:28px;background:#fff"><div style="font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:#94a3b8;margin-bottom:10px">Free</div><div style="font-size:40px;font-weight:800;color:#0f172a;line-height:1;margin-bottom:6px">£0<span style="font-size:14px;font-weight:400;color:#94a3b8">/mo</span></div><div style="font-size:12px;color:#94a3b8;margin-bottom:24px">1 site · tiny-cms.uk subdomain</div><div style="display:flex;flex-direction:column;gap:8px;font-size:13px;color:#475569;margin-bottom:28px"><div>✓ VML builder</div><div>✓ Contact API</div><div>✓ Static HTML render</div><div>✓ GitHub Pages export</div><div style="color:#cbd5e1">✗ Custom domain</div><div style="color:#cbd5e1">✗ WordPress importer</div></div><a href="#" style="display:block;text-align:center;padding:11px;border:1.5px solid #e2e8f0;border-radius:8px;color:#475569;font-weight:600;font-size:14px;text-decoration:none">Get started</a></div><div style="border:2px solid #6366f1;border-radius:14px;padding:28px;background:#fff"><div style="font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:#6366f1;margin-bottom:10px">Starter</div><div style="font-size:40px;font-weight:800;color:#0f172a;line-height:1;margin-bottom:6px">£9<span style="font-size:14px;font-weight:400;color:#94a3b8">.99/mo</span></div><div style="font-size:12px;color:#94a3b8;margin-bottom:24px">3 sites · custom domain + SSL</div><div style="display:flex;flex-direction:column;gap:8px;font-size:13px;color:#475569;margin-bottom:28px"><div>✓ Everything in Free</div><div>✓ Custom domain + SSL</div><div>✓ Visual editor</div><div>✓ TinyMail 5 addresses</div><div>✓ WordPress importer</div><div style="color:#cbd5e1">✗ API access</div></div><a href="#" style="display:block;text-align:center;padding:11px;background:#6366f1;border-radius:8px;color:#fff;font-weight:700;font-size:14px;text-decoration:none">Start free trial</a></div><div style="border:1px solid #e2e8f0;border-radius:14px;padding:28px;background:#fff"><div style="font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:#94a3b8;margin-bottom:10px">Pro</div><div style="font-size:40px;font-weight:800;color:#0f172a;line-height:1;margin-bottom:6px">£19<span style="font-size:14px;font-weight:400;color:#94a3b8">.99/mo</span></div><div style="font-size:12px;color:#94a3b8;margin-bottom:24px">10 sites · full API access</div><div style="display:flex;flex-direction:column;gap:8px;font-size:13px;color:#475569;margin-bottom:28px"><div>✓ Everything in Starter</div><div>✓ Full agentic API</div><div>✓ TinyAuth integration</div><div>✓ Stripe payments</div><div>✓ Lua render scripts</div><div>✓ 10GB storage</div></div><a href="#" style="display:block;text-align:center;padding:11px;border:1.5px solid #e2e8f0;border-radius:8px;color:#475569;font-weight:600;font-size:14px;text-decoration:none">Get started</a></div><div style="border:1px solid #e2e8f0;border-radius:14px;padding:28px;background:#fff"><div style="font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:#94a3b8;margin-bottom:10px">Agency</div><div style="font-size:40px;font-weight:800;color:#0f172a;line-height:1;margin-bottom:6px">£49<span style="font-size:14px;font-weight:400;color:#94a3b8">.99/mo</span></div><div style="font-size:12px;color:#94a3b8;margin-bottom:24px">Unlimited · white label</div><div style="display:flex;flex-direction:column;gap:8px;font-size:13px;color:#475569;margin-bottom:28px"><div>✓ Everything in Pro</div><div>✓ White label</div><div>✓ Unlimited sites</div><div>✓ Agentic API unlimited</div><div>✓ On-site support</div><div>✓ SLA guarantee</div></div><a href="#" style="display:block;text-align:center;padding:11px;border:1.5px solid #e2e8f0;border-radius:8px;color:#475569;font-weight:600;font-size:14px;text-decoration:none">Get started</a></div></div>
Order=3

@Section footer
Page=index
Type=footer
BgColor=#0d1117

@Copyright footer-copy
Section=footer
Text=2026 TinyCMS · Part of the <a href="https://tiny-web.uk" style="color:rgba(255,255,255,.4)">TinyWeb</a> ecosystem · Built by <a href="https://wallisoft.co.uk" style="color:rgba(255,255,255,.4)">Wallisoft</a>, Eastbourne UK · <a href="mailto:hello@tiny-web.uk" style="color:rgba(255,255,255,.4)">hello@tiny-web.uk</a>
Order=0

Live data from site.db — rendered by LuaJIT
slugtypesize
vml-panelshtml36523 chars

Soft-coded render engine

The renderer is an interpreter.

The TinyCMS render engine contains zero hardcoded HTML. Every block type renders via a PHP snippet stored in the database. Every section layout is a wrapper template. New block types and layouts are added via SQL — no PHP changes required.

This is the same architecture as the Visualised RAD IDE, which uses named Lua interpreters to render controls to Avalonia XAML. TinyCMS applies the same model to the web — VML describes the what, the render engine decides the how.

Lua scripting for render scripts is coming — enabling dynamic content, database lookups and conditional rendering within static pages. A @Script block with Lang=lua executes at render time and caches the result.

DB schema — render engine
cms_render_scripts
block_type   — 'card' | 'feature-card' | 'heading' ...
lang         — 'php' | 'lua' (coming soon)
script       — executable snippet, returns HTML string

Agentic API

Built for AI assistants.

TinyCMS is designed from the ground up to work with AI agents. The API accepts VML directly — describe a site in plain text, POST it to the API, receive a fully rendered site. No UI required.

Drop AGENT.md into any project and any AI assistant immediately understands your site structure, available endpoints and how to make changes safely. Claude, GPT, Gemini — any agent that can read a file and call an API can build and maintain your TinyCMS site.

REST API — api.tiny-web.uk
POST /cms/renderSubmit VML → parse → render → live site
PATCH /cms/blockUpdate one field in one block → re-render
GET /cms/site/{slug}/mapFull site structure for AI context
GET /api/agent.mdAI assistant protocol — AGENT.md

Roadmap

What's coming next.

TinyCMS is under active development. This page is itself built with TinyCMS and updated as features ship.

Lua render scripts

Render scripts in Lua — lighter, sandboxed, faster to iterate. Sandboxed DB access, HTTP calls and site structure via tinycms.lua API.

WordPress importer

Import your WordPress XML export in one click. Pages map to VML sections. Your existing site live on TinyCMS in under 60 seconds.

Visual editor v2

Click any element on the live preview to edit it. Changes write to DB and re-render instantly. Amy and Bailey are already using v1.

TinyAuth + Stripe

Add login and Stripe payments to any static site via lightweight JavaScript API calls. No backend required on your site.

Global CDN

One-click push to Cloudflare R2 and Workers. Your static HTML served from 300+ edge locations worldwide.

GitHub Pages export

Export your rendered HTML directly to a GitHub Pages repository. Free hosting, custom domains, automatic HTTPS.

Free
£0/mo
1 site · tiny-cms.uk subdomain
✓ VML builder
✓ Contact API
✓ Static HTML render
✓ GitHub Pages export
✗ Custom domain
✗ WordPress importer
Get started
Starter
£9.99/mo
3 sites · custom domain + SSL
✓ Everything in Free
✓ Custom domain + SSL
✓ Visual editor
✓ TinyMail 5 addresses
✓ WordPress importer
✗ API access
Start free trial
Pro
£19.99/mo
10 sites · full API access
✓ Everything in Starter
✓ Full agentic API
✓ TinyAuth integration
✓ Stripe payments
✓ Lua render scripts
✓ 10GB storage
Get started
Agency
£49.99/mo
Unlimited · white label
✓ Everything in Pro
✓ White label
✓ Unlimited sites
✓ Agentic API unlimited
✓ On-site support
✓ SLA guarantee
Get started

Start free.
Scale when ready.

All plans include UK hosting on tiny-cms.uk, the VML builder, contact forms and SSL. No contracts. Cancel anytime.