FERMAIN // FRAME

A git-based editor that lives inside your SvelteKit site.

Content is plain files in your repository—not rows locked in someone else’s database. Frame gives clients clean forms, live previews rendered by your actual Svelte components, and a publish button that turns their edits into commits.

In production · SvelteKit & Git Start with Frame

How it works

  1. 01

    Describe your content as code

    A single TypeScript config file defines your collections, fields, and validations. No database schemas to migrate; Frame generates the editing forms automatically.

  2. 02

    Mount the editor at /admin

    Frame compiles directly into your static SvelteKit bundle. Because it lives inside the site, previews are rendered live by your site’s real Svelte components, fonts, and CSS.

  3. 03

    Edits stay safe on draft branches

    Editors sign in with passwordless magic links. Every save is a commit to an isolated draft branch, with automatic local draft recovery so work is never lost.

  4. 04

    Publishing is a git merge

    The Publish button displays the exact number of pending changes. One click merges the draft into your production branch, triggering your existing CI/CD build.

src/lib/frame.config.ts
import { collection, defineConfig, fields, singleton, setting } from '@fermain/frame';

export default defineConfig({
  media: { path: 'static/images', publicPath: '/images' },

  collections: {
    // Structured content with real component previews
    posts: collection({
      label: 'Articles',
      path: 'src/content/posts',
      title: 'title',
      fields: {
        title: fields.text({ label: 'Title' }),
        date: fields.date({ label: 'Date' }),
        cover: fields.image({ label: 'Cover photo' }),
        body: fields.markdown({ label: 'Body' })
      },
      // Renders with your site's actual Svelte component & styles
      components: { view: () => import('./ArticlePreview.svelte') }
    }),

    // Single-instance configurations (e.g. business hours, listing details)
    listing: singleton({
      label: 'Listing details',
      file: 'src/content/listing.json',
      fields: {
        tagline: fields.text({ label: 'Tagline' }),
        rates: fields.number({ label: 'Nightly rate', unit: { before: 'R' } }),
        highlights: fields.list({
          label: 'Highlights',
          item: fields.text({ label: 'Highlight' })
        })
      }
    })
  }
});

In production

Editing live sites today.

Frame is not a prototype. It powers booking engines, non-profit field operations, and client portfolios in production.

Care Cottage

Hospitality · Direct booking

Visit live site →
https://carecottage.co.za/admin/#/listing
Frame CMS interface for Care Cottage showing split-screen listing editor and live guest preview component

A luxury holiday cottage with direct booking, managed entirely by its owner without developer intervention.

The Challenge

Keeping seasonal rental rates, room amenities, guest rules, wildlife sighting guides, and categorized photo galleries up to date throughout the tourist season.

How Frame Does It

Svelte 5 runes pipe unsaved form state directly into the actual <ListingHeader /> and <Highlights /> components, giving a pixel-perfect preview of the guest experience before committing.

The Impact

Direct-booking engine with zero monthly CMS subscription fees, 100/100 Lighthouse performance, and zero database maintenance.

Stack: SvelteKit · Google Cloud Storage · Frame Hub Relay · Real-time Runes Preview

Snare Aware

Non-profit · Field conservation

Visit live site →
https://snareaware.org/admin/#/figures
Frame CMS interface for Snare Aware showing figures editor and live counter component preview

A volunteer conservation group publishing real-time anti-poaching metrics and field patrol milestones.

The Challenge

Volunteer coordinators operating in KwaZulu-Natal reserves need to update critical public impact figures (snares removed, animals saved) and campaign announcements from mobile devices.

How Frame Does It

The figures.json singleton binds to the home page’s <FiguresBand /> preview component. Edits commit to a safe draft branch; clicking Publish triggers a 45-second GitHub Pages rebuild.

The Impact

Full volunteer autonomy with an immutable git audit trail for every single figure change, R0 hosting cost, and impervious to WordPress-style plugin exploits.

Stack: SvelteKit · GitHub Pages · GitHub Actions · Draft Branch Isolation

Durability

What stays yours.

Repository, not a database
Content is Markdown, JSON, YAML, and images in your own GitHub repository. Every change has a commit author, timestamp, and diff.
Zero runtime API latency
Content is imported at build time. When a visitor lands on your site, there is no third-party CMS API to query, fail, or bill you by the request.
Your hosting, your rules
Deploy to Cloud Storage, GitHub Pages, Cloud Run, or a private server. Frame never proxies your traffic or sits between you and your users.
A clean exit, built in
If you ever stop using Frame, delete the package and the /admin route. Your content remains clean, structured files on disk that your site can still read.

Enquire

Built for teams who value ownership over SaaS bloat.

Frame powers live commercial sites today. We set up each site deliberately to ensure the content schemas, preview components, and git branches fit your team’s workflow properly.

Frame works with any SvelteKit site whose codebase is on GitHub. Say what you are building and Oliver will answer by email.

Not a developer? Fermain designs, builds, and maintains bespoke web software in South Africa. Visit ferma.in

Frame by Fermain