Theme Development

Oizzy themes are built with Liquid templating and a pattern-based section system. This guide covers everything you need to build a custom theme.

Theme Structure

Every theme lives in its own directory with the following structure:

themes/your-theme/
  theme.json          # Theme config: name, version, settings, patterns, parts
  layouts/
    default.liquid    # Main layout template
  templates/
    index.liquid      # Homepage template
    post.liquid       # Single post template
    page.liquid       # Single page template
    error.liquid      # Error page template
  patterns/           # Section pattern partials
    hero-banner.liquid
    post-archive.liquid
    cta-section.liquid
    ...
  partials/           # Shared partials (post cards, etc.)
    post-card.liquid
    ...
  styles/             # Style variation JSON files
    default.json
    dark.json
    ...
  assets/             # Theme-specific static assets
    logo.svg
    ...

theme.json

The theme.json file defines your theme's metadata, available patterns, settings, and style variations. It tells Oizzy's design editor what sections are available and how they can be configured.

Layouts

Layout files wrap your templates. The default.liquid layout typically includes the {% oizzy_head %}, {% oizzy_styles %}, and {% oizzy_foot %} tags to inject required meta tags, stylesheets, and scripts.

Templates

Templates define the structure of each page type. They use the {% sections %} tag to render the design editor's section layout, or {% pattern %} to render individual patterns.

Patterns

Patterns are the building blocks of your theme's design. Each pattern is a Liquid partial that renders a configurable section. The design editor lets users add, remove, and reorder patterns on any page.

Partials

Shared Liquid partials used across multiple patterns or templates (e.g., a post card component used in both post-archive and featured-post).

Styles

JSON files defining style variations (color schemes, typography presets). Users can switch between styles in the design editor.

Assets

Static files specific to your theme (images, icons, fonts).


Pattern System

Oizzy uses a tiered pattern system to ensure consistency across themes while allowing creative freedom.

TierMeaningEnforcement
Tier 1: RequiredEvery general theme MUST implement these. Without them, the theme is incomplete.Hard requirement
Tier 2: RecommendedThemes SHOULD implement these. A theme missing all of them feels bare.Soft requirement
Tier 3: Theme-SpecificCreative freedom. Themes can add any patterns that serve their niche.Optional

Tier 1: Required Patterns

Every general theme must implement all of the following.

hero-* (at least one variant)

First impression, above-the-fold section. Themes may name their hero variants freely (e.g. hero-banner, hero-split, hero-minimal) as long as at least one exists.

No standard fields enforced — hero sections are highly theme-specific.

post-archive

Grid or list of posts with filtering, sorting, and count controls.

FieldTypeDescription
headingtextSection title
post_countselect: 3, 6, 9, 12, allHow many posts to show
collectionselectFilter by collection
sort_byselect: published_at_desc, published_at_asc, title_asc, title_descSort order
show_feature_imagetoggle (default: true)Show post feature images
show_excerpttoggle (default: true)Show post excerpts
show_datetoggle (default: true)Show publish dates

All themes must use the name post-archive.

cta-section

Call-to-action block with heading, description, and button.

FieldTypeDescription
headingtextCTA heading
subheadingtextareaSupporting description
button_texttextButton label
button_urlurlButton link target
styleselect: default, accent, minimalVisual style variant

rich-text

Freeform content block for arbitrary text content outside of posts/pages.

FieldTypeDescription
headingtextSection heading
bodytextareaRich text content
alignmentselect: left, centerText alignment

post-header

Single post view: title, date, tags. No standard fields — rendered from post data via Liquid drops.

post-feature-image

Single post view: hero/feature image. No standard fields — rendered from post data via Liquid drops.

post-content

Single post view: body content. No standard fields — rendered from post data via Liquid drops.

post-author

Single post view: author byline with name and optional avatar. No standard fields — rendered from post data via Liquid drops.

page-header

Single page view: title. No standard fields — rendered from page data via Liquid drops.

page-feature-image

Single page view: hero/feature image. No standard fields — rendered from page data via Liquid drops.

page-content

Single page view: body content. No standard fields — rendered from page data via Liquid drops.


Themes should implement these to add depth. A theme missing all of them feels bare.

about-section

Bio or description block with optional image. Useful for author intros, company descriptions, or mission statements.

FieldTypeDescription
headingtextSection heading
bodytextareaBio or description text
imageimageOptional photo or illustration
alignmentselect: left, center, rightLayout alignment (image position)

newsletter-signup

Email capture section for building an audience. This is a UI-only pattern — backend email collection will integrate with a mailer/list provider in a future iteration.

FieldTypeDescription
headingtextSection heading (e.g. "Stay updated")
subheadingtextareaSupporting description
button_texttextSubmit button label (e.g. "Subscribe")
placeholder_texttextInput placeholder (e.g. "[email protected]")

featured-post

Single highlighted post displayed larger or more prominently than archive cards. Useful for pinning important content.

FieldTypeDescription
headingtextOptional section heading
postpost-selectThe featured post to display
show_excerpttoggle (default: true)Show post excerpt
show_datetoggle (default: true)Show publish date

image-gallery

Grid of images, optionally clickable or expandable.

FieldTypeDescription
headingtextSection heading
columnsselect: 2, 3, 4Grid column count
itemsrepeaterList of gallery items
items.imageimageGallery image
items.captiontextOptional caption
items.urlurlOptional link

testimonials

Quotes, reviews, or endorsements.

FieldTypeDescription
headingtextSection heading
itemsrepeaterList of testimonials
items.quotetextareaThe testimonial text
items.nametextAttribution name
items.titletextAttribution title/role
items.imageimageOptional avatar

social-proof

Logos bar showing media mentions, client logos, or partner brands.

FieldTypeDescription
headingtextOptional heading (e.g. "As seen in")
itemsrepeaterList of logos
items.imageimageLogo image
items.nametextOrganization name (alt text)
items.urlurlOptional link

divider

Visual separator between sections.

FieldTypeDescription
styleselect: line, space, dotsDivider style
spacingselect: small, medium, largeVertical spacing

Tier 3: Theme-Specific Patterns

Themes can add any patterns that serve their niche. Here are some examples:

PatternPurpose
faq-accordionExpandable Q&A sections
podcast-embedAudio player with episode info
stats-barKey numbers/metrics display
timelineChronological events
post-listAlternative minimal post feed
services-columnsService offerings grid
photo-scrollHorizontal scrolling gallery

Example: faq-accordion

Expandable Q&A sections using <details>/<summary> HTML elements.

FieldTypeDescription
headingtextSection heading
itemsrepeaterList of Q&A pairs
items.questiontextThe question
items.answertextareaThe answer

Example: podcast-embed

Audio player with episode info and platform links.

FieldTypeDescription
headingtextSection heading
descriptiontextareaShow description
embed_urltextEmbed URL (Spotify, Apple, YouTube)
itemsrepeaterPlatform links
items.platform_nametextPlatform name (e.g. "Spotify")
items.platform_urlurlPlatform URL

Naming Conventions

  1. Use kebab-case for all pattern names: post-archive, cta-section, rich-text.
  2. Post/page patterns use the prefix post- or page- followed by the content area: post-header, post-content, page-feature-image.
  3. Section patterns are named by their function: cta-section, about-section, newsletter-signup.
  4. Hero patterns must start with hero-: hero-banner, hero-split, hero-minimal.
  5. No theme-specific naming for Tier 1 patterns. All themes use the same names to ensure consistency in theme.json and the design editor.
  6. Tier 2 and Tier 3 patterns may use theme-specific names only if they serve a meaningfully different purpose than the standard.