LiteFrame CMS

A lightweight content management platform built for performance, SEO, and developer sanity.

What is LiteFrame?

LiteFrame CMS is a fully managed content platform designed for agencies and developers who need fast, maintainable sites without the overhead of WordPress. There is nothing to install, no plugin ecosystem to manage, and no build pipeline to maintain — hosting, security, and speed optimization are built in.

Core Principles

Performance first. Every page renders as clean HTML/CSS. No JavaScript frameworks on the front end. PageSpeed scores stay in the 90s without optimization plugins.

Everything built in. Editor, collections, SEO, forms, media, and AI tools ship as one product and update automatically. No plugins to install, patch, or babysit.

Collections as first-class content. Not just pages and posts. Collections give you custom content types with entry fields, categories, tags, index pages, entry pages, and card templates, all configurable from the admin UI.

Developer-friendly. Templates use HTML with {{token}} syntax. No programming, no template language to learn. Write the HTML you want, drop in tokens where data goes.

Fully Managed

LiteFrame is a hosted platform. We handle the server, the database, the SSL, the updates. You build your site, we keep it running. If you ever want to leave, you can export your entire site as a static HTML package and take it anywhere.

How It Works

What makes LiteFrame different.

Clean HTML Output

Every page LiteFrame serves is clean HTML and CSS. No JavaScript frameworks on the front end, no render-blocking scripts, no layout shift. This is why PageSpeed scores stay in the 90s without optimization plugins or CDN tricks.

Single Admin Panel

The entire admin is one interface. Pages, collections, SEO, forms, media, AI tools, and settings all live in one place. No plugin ecosystem, no compatibility matrix, no update anxiety.

Content Model

All content lives in a unified system. Standard pages, blog posts, landing pages, and collection entries are all managed the same way, and collection field data is fully structured — which means your content is portable: everything round-trips through bulk export in open formats you can take anywhere.

Templates Without Code

Layouts use HTML with {{token}} syntax. You write the HTML you want, drop in tokens where data goes. No programming, no template language, no build step. If you can write HTML, you can build templates.

Site Modes

LiteFrame supports multiple site modes for different use cases:

ModeDescription
hosted_directStandard mode. Full HTML editing, template access, code editor.
hosted_secureTemplates locked. Users edit through schema fields only. For client-managed sites where the developer controls the design.
hybridSome pages use secure templates, others use direct editing.
headlessContent-only. Front end is a separate application consuming the API.

Portability

Your site is yours. Export at any time as a complete static HTML package. Your content, your templates, your images, fully self-contained and deployable to any web server. Structured content round-trips through Bulk Export & Import.

Getting Started

Your site is ready. Here's how to make it yours.

Your Admin Panel

Log in at yourdomain.com/admin with the credentials from your welcome email. You'll land on the Dashboard, which shows your content stats, PageSpeed score, SEO readiness, and recent activity.

First Steps

1. Set your site name and branding. Head to Settings and configure your site name, logo, and favicon. These appear in the admin sidebar and can be used in your site templates.

2. Build your first page. Click + Page from the Dashboard quick actions. Give it a title, write some content, and hit Publish. Visit your site to see it live.

3. Set up collections. If your site needs structured content (team members, services, resources, locations), create a Collection from Content > Manage Content. Add your entry fields, design your cards, and start adding entries.

4. Configure SEO. SearchLab will score every page you publish and give you actionable recommendations. Connect Google Search Console in SearchLab > Settings to unlock CTR gap analysis and position tracking.

The Toolbox

The orange button in the top-right corner of the admin opens the Toolbox panel. It has three tabs:

  • Shortcodes lists every collection with copy-paste shortcode snippets for embedding, plus all available template tokens and layout tokens.
  • Quick Links provides direct navigation to pages, collections, media, code, and settings.
  • Help links to this documentation, the changelog, and lists keyboard shortcuts (Ctrl+S to save, Ctrl+Shift+E for code editor).

Bringing Content In

Content > Import has three site-migration paths — the LiteFrame WP Exporter plugin, standard WordPress WXR XML, and static HTML/ZIP — covered in Site Import. For spreadsheet workflows (drafting entries in a sheet, bulk edits), see Bulk Export & Import.

Taking Your Site With You

LiteFrame is yours. If you ever want to leave, export your entire site as a static HTML package from Settings > Export. You get clean HTML, CSS, and images that work on any hosting provider.

Pages

Standard content pages, blog posts, and landing pages.

Page Modes

ModePurposeURL Pattern
standardRegular site pages/page-slug
blogBlog posts/blog/post-slug
landingLanding pages (no nav/footer)/page-slug
seoSEO location pages/page-slug
collection slugCollection entries/prefix/entry-slug

Page Templates

Each page can use one of these templates, configured in Code > Templates:

  • Default - Standard page with header, footer, and content area
  • Full Width - No sidebar constraints, content spans the viewport
  • Blank - No header or footer, just the content
  • Custom HTML - Raw HTML, no wrapper at all

Page Locking

Owners can lock individual pages to prevent editor-role users from modifying them. The lock toggle appears in the editor controls bar. Locked pages show a padlock icon for editors and reject save attempts at the server level.

Visual Editor

The visual editor is a diff-based overlay that loads the live page in an iframe. Click any editable element (headings, paragraphs, images, links, buttons) to edit it in place. Changes are tracked and applied back to the source HTML on save without serializing the iframe DOM, so shortcodes, scripts, and whitespace are preserved. Template regions and shortcode blocks are greyed out and non-editable.

Collections

Structured content types with custom fields, templates, and taxonomy.

StableSince v3.5.3

What are Collections?

Collections are custom content types. A "Resources" collection might have fields for category, read time, and a body. A "Team Members" collection might have fields for job title, photo, and bio. Each collection gets its own index page, entry pages, category/tag taxonomy, and card templates.

Creating a Collection

Navigate to Content > Manage Content and click + New Collection. Give it a name, slug, and URL prefix. The slug becomes the entry's content type — the page_mode value you'll see as a column in bulk export files — and the URL prefix determines the public URL path.

Collection Tabs

Each collection has the following tabs:

  • Entries - List, create, and manage content entries
  • Content Templates - Four sub-tabs for entry fields, card template, index page, and entry page
  • Taxonomy - Manage categories and tags for this collection
  • Features - Toggle collection capabilities on/off
  • Settings - Slug, prefix, and collection-level configuration

Feature Toggles

The Features tab controls what panels appear in the entry editor and what functionality is available:

  • Content Body - Visual editor with free-form HTML content, like a page or blog post body
  • Categories & Tags - Organize entries with taxonomy scoped to this collection; enables archive pages
  • Author - Track who created each entry; shows author field in the editor
  • Dates - Published date, chronological sorting; makes this collection time-based like a blog
  • SEO / Rank Readiness - Meta titles, descriptions, focus keywords, Rank Readiness scoring per entry
  • Comments - Allow visitors to comment on entries

Taxonomy

Categories and tags are managed in the Taxonomy tab. Each category/tag gets a slug used for archive URLs (/prefix/?cat=slug). Entries can be assigned categories and tags in the entry editor.

API / Headless

Each collection has its own API mode, configurable in the Features tab. Four modes are available:

ModeDescriptionBest For
OffAPI disabled for this collection-
Data OnlyRaw JSON with field values, categories, and metadataReact, Next.js, mobile apps
Rendered HTMLPre-rendered HTML fragments using your card and entry templatesEmbedding content into other sites
Data + Design TokensRaw JSON plus your style settings as a separate objectDesign system sync, Figma-to-code

Entry Fields

Define the data structure for your collection entries.

Updated v5.15

Overview

Entry fields are the first sub-tab inside Content Templates. Each field you define becomes an input in the entry editor and a {{token}} available in your card, index, and entry page templates. Fields are defined per collection and can be added, reordered, or retyped at any time.

Field Types

TypeDescriptionToken Output
textSingle-line text inputPlain text, HTML-escaped
textareaMulti-line textUnescaped; line breaks preserved
htmlRaw HTML contentUnescaped HTML
wysiwygVisual rich text editor (TipTap)Unescaped HTML
imageImage URL (opens media picker)URL string
galleryMultiple image URLsJSON array of URLs
iconIcon pickerUnescaped SVG markup
selectDropdown with predefined optionsSelected value
checkboxBoolean toggle1 or empty
numberNumeric inputNumber
urlURL inputURL string
emailEmail addressEmail string
phonePhone numberPhone string
dateDate pickerDate string
colorColor pickerHex color
groupRepeater group with sub-fieldsLoop syntax required
referenceLink to entries in another collectionReferenced entry data — see References
The field type controls escaping. Only textarea, html, wysiwyg, and icon render markup. If a field shows pasted HTML as visible code on the page (<p> as text, &amp; on screen), the field's type is text — change the type in the schema. The stored content is fine; nothing needs re-entering.

Field Options

Each field has these configurable properties:

  • Label - Display name shown in the entry editor
  • Key - Machine name used for the {{key}} token and JSON storage. Lowercase letters, numbers, underscores
  • Required - Whether the field must be filled before saving
  • Placeholder - Hint text shown when the field is empty
  • Options - For select type: comma-separated list of choices

Section Dividers

The special _section type adds a visual heading divider in the entry editor. It creates no token and stores no data. Use it to organize long field lists into logical groups.

Repeater Groups

The group type creates a repeater: users can add multiple rows of sub-fields. Each sub-field has its own key and type. In templates, use the loop syntax:

HTML{{#team_members}}
  <div class="member">
    <h3>{{name}}</h3>
    <p>{{role}}</p>
    <img src="{{photo}}" alt="{{name}}">
  </div>
{{/team_members}}

In bulk export files, each repeater row appears as numbered columns (see Bulk Export & Import).

Built-in Tokens

These tokens are always available regardless of your field schema:

{{title}}Entry title
{{url}}Full URL path
{{slug}}URL slug
{{id}}Entry ID
{{featured_image}}Featured image URL
{{excerpt}}Excerpt text
{{content}}Body content (HTML)
{{body}}Alias for content
{{author}}Author name
{{date}}Published date
{{categories}}Comma-separated names
{{category_links}}Linked category names
{{read_time}}Estimated read time

References

Link entries to entries in other collections and render their data.

Updated v5.15

How References Work

A reference field links an entry to one or more entries in another collection. At render time, each referenced entry's data is merged in: the built-ins (id, title, slug, featured_image, excerpt) plus every custom field from its own schema, repeaters included. Loop the reference key like a repeater:

HTML{{#speakers}}
  <a class="spk" href="/speakers/{{slug}}">
    <img src="{{featured_image}}" alt="{{title}}">
    <span>{{title}} — {{session_track}}</span>
  </a>
{{/speakers}}
  • A single reference behaves as a one-row loop; its fields also merge flat into the surrounding context.
  • A multiple reference loops once per referenced entry.
  • HTML-typed fields on the referenced entry's schema render unescaped — the escaping rule follows the entry that owns the field.

Nested References

Resolution is recursive: when a referenced entry has reference fields of its own, those resolve too. A chain like agenda item → learning lab → speaker renders at every level:

HTML{{#learninglabref}}
  <div class="lab">
    <div class="lab-title">{{labtitle}}</div>
    {{#labspeakerref}}
      <a href="/speakers/{{slug}}">
        <img src="{{featured_image}}" alt="{{title}}"> {{title}}
      </a>
    {{/labspeakerref}}
  </div>
{{/learninglabref}}
Depth cap: 3 levels. Visited entry ids are carried down the chain, so circular references (a speaker referencing back up at an agenda) resolve once and terminate instead of looping. Builds before 5.15.13 resolve one level only — second-level fields render empty there.

Card Template

How each entry looks in listings.

Content Templates sub-tab

Presets

Three built-in presets are available to get started quickly. Each provides a complete card design with image, title, excerpt, date, and hover effects:

PresetDescription
ShadowedWhite card with subtle shadow, rounded corners, image on top
MinimalNo border or shadow; clean typography-first layout
BorderedLight border with no shadow; structured, editorial feel

New collections default to the Shadowed preset. Existing collections with no saved template get a runtime fallback using the same Shadowed layout.

Custom Card HTML

Select "Custom" to write your own card template using HTML, CSS, and tokens. The card template renders once per entry in any listing context (index page, shortcode embeds, category archives).

HTML<a href="{{url}}" class="my-card">
  <img src="{{featured_image}}" alt="{{title}}">
  <div class="my-card-body">
    <span class="my-card-cat">{{categories}}</span>
    <h3>{{title}}</h3>
    <p>{{excerpt}}</p>
  </div>
</a>

Embed Card

An optional second card template used when embedding a collection via shortcode with card="embed". If empty, the main card template is used everywhere. This lets you have a full card on the index page and a compact card when embedded on other pages.

Available Tokens

All built-in tokens ({{title}}, {{url}}, {{featured_image}}, {{excerpt}}, {{date}}, {{author}}, {{categories}}, {{category_links}}, {{read_time}}) plus any custom entry field keys are available in card templates, including repeater loops, conditionals, and references.

Index Page

The listing page showing all entries in a collection.

Overview

The Index Page is the third sub-tab inside Content Templates. It controls the main listing page at /prefix/ showing all entries in a configurable grid. Category and tag filtered pages (/prefix/?cat=slug) inherit these settings.

Grid Layout

Three controls define the entry grid:

  • Columns (1-6) - Number of grid columns
  • Gap (px) - Space between cards
  • Max Width (px) - Maximum width of the grid container

Sort & Pagination

  • Entries Per Page - How many entries show before pagination
  • Sort By - Manual Order, Publish Date, Title, or Created Date
  • Direction - Newest First or Oldest First

Grid Section

The grid section wraps the entry cards. Controls include vertical/horizontal padding and background color. These apply to the section container that holds the grid.

Header Section

An optional header above the grid. Two modes:

  • On - Shows the collection name with configurable background color, text color, padding, subtitle, and text alignment
  • Off - No header, grid starts immediately

Category Filters

When enabled, filter buttons appear above the grid. Only renders if categories exist for the collection. Fully stylable:

  • Button shape - Font size, weight, padding, border radius
  • Default state - Background, text color, border color and width
  • Hover state - Background, text color, border color
  • Active state - Background, text color, border color
  • Layout - Alignment, gap between buttons, bottom margin
Full-width backgrounds. The header and filter sections stretch to the full viewport width while constraining their content to the configured max width. This lets you create full-width color bands with centered text and buttons.

Custom Layout Template

A custom layout template takes over the whole index page. Layout tokens:

{{items}}All entries through card template
{{filters}}Category filter buttons
{{featured:N}}First N entries through hero template
{{items_after:N}}Entries after position N
{{collection_name}}Collection display name

Entry Page

The full page view for individual collection entries.

Two-Zone Layout

The entry page is built from two zones. The Hero section always spans the full width of the container and contains the featured image, title, and metadata (date, author, categories). The Content section sits below it and holds the body text with an optional sidebar.

Template Mode

Choose between two approaches:

  • Default Layouts - Hero + content zones with sidebar options and full styling controls
  • Custom Template - Your own HTML/CSS/JS with complete control

Hero Layouts

Five hero configurations are available:

LayoutDescription
Full Width ImageImage spans the container above the title and metadata
Image LeftImage on the left, title and metadata on the right
Image RightTitle and metadata on the left, image on the right
Title OverlayTitle and metadata overlaid on the featured image
No ImageTitle and metadata only, no featured image

Hero spacing is fully configurable: padding top/bottom, margin top/bottom, image max height, image border radius, and column gap (for split layouts).

Content Section

The content section supports three layout options:

  • Full Width - Content spans the container
  • Content + Right Sidebar - Main content with a right sidebar
  • Left Sidebar + Content - Left sidebar with main content

The sidebar aligns with the body text, not the hero. It sits below the hero zone.

Element Styling

Fine-grained control over visual appearance:

  • Title - Font family (7 options), size, weight, color
  • Metadata - Font size, color, bottom margin
  • Body Content - Font size, line height, color
  • Page Background - Background color, text color

Sidebar Widgets

When a sidebar layout is selected, toggle these auto-generated widgets:

  • Search - Search within this collection
  • Categories - Category list with entry counts
  • Tag Cloud - All tags for this collection
  • Recent Entries - Latest entries with configurable count

Sidebar width is adjustable (200-480px).

Custom Template

Switch to Custom Template mode for full HTML/CSS/JS control. All entry tokens are available — including repeaters, conditionals, and nested references. The custom template replaces both the hero and content zones entirely.

Default template fallback. Entries without a custom template render a proper default layout with title, date/author metadata, category links, featured image, and body content. The default template respects which features are enabled for the collection.

Shortcodes

Embed collections and content anywhere.

The main shortcode for embedding collection entries. Both and are accepted for backward compatibility.

Shortcode

Attributes

AttributeDescriptionDefault
slugCollection slug (required)-
limitMax entries to showAll
columnsGrid columns (1-6)3
layoutgrid to force grid wrapper-
categoryFilter by category slug-
tagFilter by tag slug-
filterstrue to show category filter buttonsfalse
stylelinks, compact, or bullets-
cardembed to use embed card template-
show_datefalse to hide datestrue
show_imagefalse to hide imagestrue
show_excerptfalse to hide excerptstrue
show_buttontrue to add CTA buttonfalse
button_textButton labelLearn More
icon_fieldField key to use as icon-

Style Presets

StyleDescription
linksTitle + date list, no images. Good for sidebar navigation.
compactTiny thumbnail + title. Good for related content widgets.
bulletsBullet-point linked titles only. Good for simple lists.

Embed a gallery created in the Media Library:

Shortcode

Supports layout (grid, masonry, justified, slider), columns, gap, and per_page attribute overrides.

Embed a form:

Shortcode

Embed a map. and are the two shortcodes that also work inside global token values — see Templates & Tokens.

Templates & Tokens

Build layouts with HTML and token syntax.

Updated v5.15

Token Syntax

Tokens use double curly braces: {{token_name}}. They are replaced with real data at render time. No PHP, no template engine. A token whose field is empty or unknown renders as nothing — raw {{tokens}} never leak into output.

Simple Replacement

HTML<h1>{{title}}</h1>
<img src="{{featured_image}}" alt="{{title}}">

Repeater Loops

HTML{{#team_members}}
  <div class="member">
    <h3>{{name}}</h3>
    <p>{{role}}</p>
  </div>
{{/team_members}}
  • Inside the loop, tokens resolve against the current row's sub-fields.
  • An empty repeater removes the whole block, wrapper markup included. Put shared headings outside the loop behind {{?key}} — a repeater with at least one row passes the truthy test.
  • Repeaters nest up to 5 levels on the page-template engine.
  • On the page-template engine each row also gets {{_index}} (0-based) and {{_number}} (1-based). Collection templates don't inject counters.

Conditional Blocks

Render content only when a field has a value:

HTML{{?subtitle}}
  <p class="subtitle">{{subtitle}}</p>
{{/subtitle}}

Comparison forms match exact strings:

HTML{{?status=="Open"}}<strong>Open</strong>{{/status}}
{{?status!="Open"}}{{status}}{{/status}}
  • Falsy values: empty string, 0, "0", "false". An off checkbox is falsy.
  • == / != are exact, case-sensitive string comparisons.
  • Comparison blocks close with the bare key: {{?status=="Open"}} closes with {{/status}}.
  • Blocks nest, multiple blocks on one key work, and conditionals work inside repeater rows against row values.
  • Curly quotes pasted from Word are normalized in comparisons, but type straight quotes.
Every block needs its close tag. A conditional whose {{/key}} is missing or typo'd leaves the literal opening tag printed on the page. If you see {{?featured!="1"}} on a live page, count opens and closes.

Entry Tokens

{{title}}Entry title
{{url}}Full URL path
{{slug}}URL slug
{{id}}Entry ID
{{featured_image}}Featured image URL
{{excerpt}}Excerpt text
{{content}}Body content (HTML)
{{body}}Alias for content
{{author}}Author name
{{date}}Published date
{{categories}}Comma-separated names
{{category_links}}Linked category names
{{read_time}}Estimated read time

Custom Field Tokens

Any custom field key is automatically available as a token. If you have a field with key job_title, use {{job_title}} in your template.

Layout Tokens

These work in the Custom layout template for index pages:

{{items}}All entries through card template
{{filters}}Category filter buttons
{{featured:N}}First N entries through hero template
{{items_after:N}}Entries after position N
{{collection_name}}Collection display name

Dynamic Tokens

Global values configured in Settings. Use the token. prefix:

HTML<p>Call us at </p>
<a href="">Book Now</a>

Change the value once in Settings and it updates everywhere the token appears. Gallery-type tokens render a full gallery widget at the token position.

Known limits. Token replacement is single-pass: a token value containing stays literal. Shortcodes inside token values: only and work; the rest are processed before token replacement and won't see token-emitted shortcode text.

Render Pipeline & Escaping

Two rules explain most template surprises:

  • Order: the page pipeline runs shortcodes, then global tokens. The template engines run repeaters first, then conditionals, then simple tokens, then global tokens. Repeaters-before-conditionals is what makes row-scope conditionals evaluate row values.
  • Escaping is decided by field type, not content. Values are escaped on output unless the field's type is wysiwyg, html, textarea, or icon. A Text field showing pasted markup as code is behaving correctly — change the type.

Media & Galleries

Manage images, files, and image galleries.

Media Library

Upload images, documents, and files through the Media Library. Supported formats: JPG, PNG, WebP, GIF, SVG, PDF, MP4, and MP3. Multiple file upload is supported via drag-and-drop or the file picker. Files are searchable by name.

Image Processing

On upload, images are automatically processed based on your Settings:

  • Compression - Re-saves at your configured quality level (default 82%), adjustable in Settings.
  • Auto-resize - Images larger than 2400px on their longest side are resized down, preserving aspect ratio and transparency.
  • WebP Generation - A WebP version is automatically created alongside the original. If the WebP turns out larger than the source (rare, with small images), it is discarded.

Image Editing

Click any image in the library to open it in the preview panel. From there you can:

  • Rename - Change the filename. The WebP companion file is renamed to match.
  • Scale - Resize to specific pixel dimensions.
  • Crop - Visual crop tool with draggable region selection.
  • Copy URL - Copy the public URL for use in templates or external pages.

Bulk delete is available by selecting multiple files and clicking Delete Selected.

Media Picker

The media picker modal appears wherever an image field is used (page editor, collection fields, settings). It offers four tabs:

  • Media Library - Browse and select from existing uploads
  • Upload - Upload new files
  • Pexels Stock - Search and insert free stock photos (requires Pexels API key in Settings)
  • URL - Enter an external image URL

Galleries

The Galleries tab lets you create named image galleries. Each gallery has a name, slug, layout, and a sortable list of images with optional captions.

Gallery Layouts

LayoutDescription
gridCSS Grid with configurable columns and gap
masonryCSS columns-based masonry layout
justifiedFlexbox rows with images stretched to fill width
sliderHorizontal scroll with snap points, touch-friendly

Galleries are embedded via shortcode: . Shortcode attributes override the saved gallery settings. Galleries support pagination with a configurable per-page count.

Image Management

Within a gallery, images can be reordered via drag-and-drop. Add images from the Media Library or by URL. Each image can have a caption.

Bulk Export & Import

Round-trip content through spreadsheets. CSV, JSON, or XML.

Updated v5.15

Export

The Bulk panel on the Import page exports any content type — a collection, a page mode, or all pages. Columns come straight from the schema: standard page columns, then every custom field prefixed field_. Repeaters flatten to numbered columns:

CSVfield_faqs__1__q, field_faqs__1__a, field_faqs__2__q, field_faqs__2__a, ...

Exporting a collection gives you a correct template by construction. There is no column-mapping step because there's nothing to map.

Import

  • Rows match by id, then by slug. Matched rows update the columns present. id, created_at, and updated_at are immutable.
  • Unmatched rows are created. The content type selected in the panel decides what they become — selecting a collection creates entries of that collection.
  • A missing slug is generated from the title and de-collided: fresh-person, fresh-person-2.
  • A missing or invalid status defaults to draft — a sheet of new rows can't publish anything by itself.
  • Repeater columns reassemble into row arrays exactly as exported. A field_x cell containing JSON is decoded.
  • New pages are search-indexed on create.

The result reports N updated, N created, N skipped with row-numbered errors.

Create from scratch. A file needs only a title column to create new entries. The id-or-slug requirement applies only to update-only files. Draft entries in a spreadsheet, pick the collection, upload.

Site Import

Migrate a whole site in. Three paths on the Import page.

LiteFrame WP Exporter

For ZIPs produced by the LiteFrame WordPress plugin (manifest.json format). Supports conflict handling (skip or overwrite existing) and a media-only mode that imports just the media files.

WordPress WXR

Standard WordPress XML exports. Detected by xmlns:wp / wxr_version markers and processed asynchronously with progress reporting. Post types map to collections, field keys and taxonomy are preserved, and multiple content types can be mapped and imported in a single pass.

HTML / ZIP

Takes a zipped static HTML website and converts it into LiteFrame pages.

Preparing the ZIP

  • Must be a .zip; pages need .html or .htm extensions
  • A single top-level folder is treated as the site root
  • __MACOSX and .DS_Store are ignored
  • index.html becomes the home page; services/web-design.html becomes /services/web-design

What the scan detects

Before anything is written, the scan analyzes shared headers and footers, extracts CSS/JS/fonts/images, rewrites internal links and asset paths, and detects blog patterns: listing pages, card templates, post templates, and category pages.

Large Files

Uploads are chunked automatically, so big site archives work over ordinary connections.

Site Export

Your site as a static package, deployable anywhere.

What You Get

Settings > Export produces a ZIP of all published pages as static HTML with CSS, JS, and images. Blog posts land under the blog prefix directory (e.g. insights/post-slug.html). The package works on any web server, opened locally, or as a permanent archive.

It's a static snapshot. Published pages only — drafts, collection schemas, and settings are not part of the package. For structured content data, use Bulk Export alongside it.

SearchLab SEO

Built-in SEO intelligence suite.

Stable

Dashboard

The SearchLab dashboard provides a site-wide overview: aggregate SEO scores, keyword chart, and actionable summaries highlighting pages that need attention.

Site Health & Rank Readiness

Site Health scores every published page on SEO readiness with a checklist of actionable recommendations. Rank Readiness provides a site-wide average score and per-page breakdown.

Keyword Research

Powered by DataForSEO:

  • SERP Lookup - Live Google results for any keyword with own-site position banner, SERP feature detection (Featured Snippet, PAA, Local Pack, Image Pack, Video, AI Overview, Knowledge Panel, Shopping, Sitelinks), and top 20 organic results
  • Related Keywords - Seed keyword returns up to 30 related terms with search volume, CPC, and competition scores
  • People Also Ask - Questions displayed inline, clickable to re-search

Position Tracking

Track keywords per page with color-coded ranking display. Positions are automatically checked on every GSC sync using SERP cache (12-hour TTL). Position history accumulates over time for trend analysis.

CTR Gaps

Identifies pages ranking on page 1 of Google with below-average click-through rates. These are your highest-leverage optimization opportunities.

AI Recommendations

The AI recommendation engine analyzes each page using all available data: SEO score, failed checks, GSC queries, tracked keyword positions, SERP features, cached competitor data, PAA questions, recent change history, and content preview. Generates 5 prioritized recommendations with data-backed reasoning. Recommendations are cached for 48 hours and appear in the page editor.

Change Tracking & Impact

Every page save snapshots SEO-relevant fields. Changes are auto-classified (keyword change, meta update, content update, schema update). The impact measurement system compares 14-day windows before and after changes to show impressions, clicks, position, and CTR deltas.

Integrations

Configure in SearchLab > Settings:

  • Google Search Console (OAuth) - CTR data, impression data, position data
  • Bing Webmaster Tools - Bing-specific metrics
  • DataForSEO - Keyword research, SERP analysis, position tracking, backlink data
  • IndexNow - Instant indexing notifications to Bing/Yandex on publish

AI Visibility

Tracks how AI platforms (ChatGPT, Perplexity, Gemini, etc.) reference your content. Monitors LLM mentions and citation patterns.

BuildLab AI

AI-powered content and development assistant.

Overview

BuildLab is an AI assistant built into the admin panel, powered by the Anthropic API. It includes multiple tools:

  • Chat - Conversational AI for questions about your site, content strategy, and code
  • Content Writer - AI-generated content with your brand voice and SEO context
  • SEO Generator - Meta titles, descriptions, and recommendations based on your customer profile and target keywords
  • Stock Images - AI-powered stock photo search and insertion
  • Wizard - Step-by-step guided workflows for common tasks
  • Notepad - Scratchpad for drafting and iterating

Token usage is tracked per-site and visible in the BuildLab interface.

Checkout

Paid registration forms with Stripe-hosted payment.

v5.15 series

Forms & Passes

Each checkout form defines its passes with a price, an optional capacity cap, a role, and a coupon setting. Forms carry intro/notes/appearance settings, success and cancel URLs, and a notification email. Orders, attendees, receipts, and reports are built in. Payment is Stripe-hosted — card data never touches your server.

Coupon Codes

Each form uses one coupon source — Off, Stripe's own promo box on the payment page, or codes pulled from a connected Cvent event. Sources are exclusive, so double-discounting is structurally impossible.

Cvent-Sourced Codes

  • Flat amounts only. Percentage codes are refused at the form — two discount engines round percentages differently, and the totals must match to the cent.
  • Per registrant, capped at the pass price. A $200 code on three registrants takes $600 off; on a $150 pass it takes $150, never below zero.
  • Validation at the form. Inactive, expired, and fully-redeemed codes are refused with plain messages. Redemption capacity is enforced locally as well as in Cvent, so a capped code can't be overused through the form.

Per-Pass Eligibility

Each pass is set to Apply or Exempt in the pricing table. Exempt passes (an add-on family pass, for example) take no coupon; a selection containing only exempt passes refuses the code at the Apply button.

Comp Registrations

A code covering the whole order completes without a Stripe charge. The paid transition runs once — confirmation email, notification, and syncing all fire — and the buyer lands on the receipt, resolved by order reference.

Exact Per-Registrant Accounting

Each registrant's own paid share — their pass price minus their own coupon share — is stored on the order line at charge time and carried through receipts, reports, and exports. On a $1,148 order of two $599 passes with a $200 code plus an exempt $350 pass, the shares are exactly 399.00 / 399.00 / 350.00.

Forms

Build and manage contact forms.

Form Builder

The form builder uses a visual layout with a dark icon rail on the left, field configuration in the middle, and a live preview canvas on the right. Drag fields to reorder, click to configure.

Embedding Forms

Forms are embedded via shortcode:

Shortcode

Submissions go to the Forms > Entries tab and can be emailed to configured recipients.

Secure Templates

Locked-down editing for client-managed sites.

Developer FeatureUpdated v5.15

What is Hosted Secure Mode?

When a site runs in hosted_secure mode, the template HTML is locked. Users cannot access the code editor or modify template markup. Instead, they edit through a schema-driven field UI. The developer controls the design; the client controls the content.

How It Works

The system has three layers:

  • Templates — HTML layouts with {{token}} syntax, managed in the Template Manager
  • Field schemas — per template, defining exactly what fields the user sees in the editor
  • Page content — the values a user enters, keyed to the schema

When a page is rendered, the template and the page's field values are merged and the result is cached for fast delivery.

Template Manager

Accessed at /admin/templates (owner-only). Create templates with a slug, label, and description. Each template has its HTML, a CSS box (output with the page), and a field schema.

Building a Template

Write your HTML layout with tokens for every editable region:

HTML<section class="hero">
  <div class="container">
    <h1>{{headline}}</h1>
    {{?subheadline}}
      <p class="sub">{{subheadline}}</p>
    {{/subheadline}}
    <img src="{{hero_image}}" alt="{{headline}}">
  </div>
</section>

{{#features}}
  <div class="feature">
    <h3>{{title}}</h3>
    <p>{{description}}</p>
  </div>
{{/features}}

Token Types

SyntaxPurpose
{{field_key}}Simple replacement. Text fields are HTML-escaped; textarea/HTML/WYSIWYG/icon fields are not.
{{#repeater}}...{{/repeater}}Repeater loop. Rows get {{_index}} (0-based) and {{_number}} (1-based). Nests to 5 levels.
{{?field_key}}...{{/field_key}}Conditional. Rendered only if the field has a non-empty value.
{{?key=="val"}} / {{?key!="val"}}Exact string comparison. Closes with the bare key: {{/key}}. Works inside repeater rows.
{{title}}, {{slug}}, {{page_url}}, etc.Built-in page tokens. Always available regardless of schema. {{page_url}} renders / for the home page.

Field Schema

Define what fields users see in the editor. Uses the same field types as collection entry fields (text, textarea, html, wysiwyg, image, icon, gallery, select, checkbox, number, date, url, email, phone, reference, group). Reference fields resolve recursively to 3 levels — see References. The schema is edited as JSON in the template manager.

Caching

Rendered pages are cached for speed. The cache refreshes when a page is published or when the template itself is saved, and repeat visitors get efficient browser-side caching automatically.

Template Locking

Templates can be locked to prevent accidental edits. Locked templates show a lock icon in the list and require an explicit unlock before editing.

Troubleshooting

Template symptoms and their causes.

Updated v5.15

Symptom Table

SymptomCause / Fix
A literal {{?key…}} opening tag prints on the pageThe block never closes: its {{/key}} is missing or typo'd ({{/feature}} vs {{/featured}}). Comparison blocks close with the bare key. Count opens against closes.
HTML renders as visible code — <p> on screen, &amp; as textThe field's type is text/url/etc. Change it to wysiwyg, html, or textarea in the schema. Stored content is fine; nothing needs re-entering.
Token outputs nothingKey mismatch (keys are exact: lowercase, underscores) or the field is empty on that entry.
Repeater renders once, unlooped, or disappears entirelyOpen/close keys don't match, or the field isn't a group type.
{{_number}} or {{_index}} is emptyYou're in a collection template. Loop counters exist on the page-template engine only.
Row conditionals react to page values instead of row valuesBuild older than 5.15.8. Update.
Reference-inside-reference fields render emptyBuild older than 5.15.13 resolves references one level deep. Update.
Conditional never fires==/!= are exact, case-sensitive comparisons. Check what the Select actually stores.
Template edits not appearing on the siteCached render. Re-publish the page (the cache refreshes on publish and on template save).
A token or shortcode inside a global token value renders literallyBy design: token replacement is single-pass, and only and are processed after tokens.

API

REST API for external integrations.

Endpoints

LiteFrame exposes a REST API through api.php. Collection entries can be accessed when an API mode is enabled for the collection (in Features > API / Headless).

HTTPGET /api.php?collection=resources&limit=10
GET /api.php?collection=resources&category=guides
GET /api.php?collection=resources&id=42

API Modes

ModeResponse Content
jsonRaw JSON: field values, categories, metadata. No HTML rendering.
renderedPre-rendered HTML fragments using your card and entry templates. Drop into any page with fetch.
designJSON data plus your style settings (card_styles, page_styles, template_css) as a separate design object.

Response Format

All responses are JSON. Entry data includes all custom fields, built-in fields (title, slug, excerpt, featured_image), taxonomy assignments, and metadata (dates, author, status).

Accessibility