Docs
Changelog
Release history and platform updates for Seedly Sites.
Last updated
A record of major updates and improvements to Seedly Sites. The most recent changes appear first.
v1.1.1 (August 2026) - Custom CSS that was being thrown away, and an update that keeps your edits#
Cut 10 August 2026.
A hardening release. Three things were quietly wrong, and one of them was eating work.
Before You Upgrade#
-
Set
SUPER_ADMIN_EMAILon your instance first. The locked super-admin identity used to fall back to a built-in value and no longer does. If that variable is empty after you upgrade, the gate guarding portal user management refuses everyone, so the Users screen goes away for you as well as for everybody else. Setting it to your own owner login brings it back, and nothing else on the platform is affected. You can check in advance rather than finding out afterwards, because the doctor now reports an unset value as a hard failurenpx pnpm run setup:check --target=prod
Your Update Can No Longer Overwrite Work You Committed#
- Every download now carries a fingerprint of every file we shipped. The update helper used to work out what you had customized by asking git, and git only reports work you have not committed yet. The update playbook tells you to commit before updating, so the sequence that lost work was the one the manual recommends. Your working tree looked clean, so nothing looked wrong
- It now compares by content instead. A file that still matches what we shipped is stock code and is safe to replace. Anything else is yours and is kept. Whether you committed makes no difference, and it works with no git repo at all
- Every uncertain case keeps your copy rather than overwriting it, including a file we never shipped, a file that cannot be read, and a Windows line-ending rewrite
- One thing worth knowing about the timing. The helper compares against the fingerprints that shipped with the version you are on, and versions before this one have none, so the protection starts with the update after this one. Updating from an older version, the helper says so plainly instead of implying you are covered
Custom CSS That Was Silently Discarded#
- CSS typed into an element's Advanced tab now applies whether or not you filled in the ID field. Custom CSS is confined to the element you wrote it for, and it was confined by hanging the rules off that element's HTML id. The ID field is blank by default, so an element you had not named had nothing to hang off and its whole CSS box was thrown away without a word. Elements now carry an automatic handle of their own. Fill in the ID field when you want a name of your own to link to, not to make styling work
- Two other settings had the same blind spot and start working on any section where you left the ID blank. The section Shape, which is the wave divider, and the smaller background image phones are served in place of the full-size one. That second one means some pages get lighter on phones after their next deploy, with no visible change
- You do not need to edit anything. CSS that was being discarded starts taking effect the next time each site is deployed, which is worth a look on pages where you wrote CSS, gave up on it, and worked around it another way
Security#
- The media library now accepts images and PDFs only, and checks the file itself rather than what it is labelled as. It previously accepted any file type at all, which matters because clients upload to it during intake. Two of the image formats it used to accept reach a parser inside the CMS framework that can be made to loop forever on a malformed file, and no fixed version of that parser is available, so refusing those formats at the door is the only way to close it. The check reads the file's actual contents, so a file renamed to look like a photo no longer gets through, and SVGs are screened for harmful content before they are stored. If you have a workflow that uploaded something unusual, such as a video or a font, it will now be refused
- The Image Gallery leaked its Advanced CSS onto the rest of the page. Every other element rewrites that box so its rules can only reach the element you wrote them for. The gallery did not, so a gallery rule quietly restyled the page around it, and text that closed the style block early could run as a script when the page was opened in the shared editor preview. Gallery CSS is now confined the same way every other element's is
- Twelve dependency advisories cleared by pinning six transitive packages forward, each staying inside its current major so no breaking upgrade rides along. Distinct advisories in the tree fall from 89 to 61, and high-severity ones from 32 to 17
Also In This Release#
- An intake job opened by your CRM can arrive with the client's details already filled in. When your CRM posts to the intake webhook on payment it can include what it already knows, and those values pre-fill the intake form instead of asking the client to type them again. Name, website, industry, timezone, brand colour and a chosen template are understood, anything else is ignored, and the client can still change every one of them
- A throw while rendering the admin no longer produces a raw 500 with no way back. There are now error boundaries at the root, at the admin segment, and a global last resort, all rendering one shared screen
- Saving your exclude-my-visits list now records which account saved it. The save worked and your list was correct, but it was written without naming the account that made it, so anything asking who changed a setting saw it as an automatic change by the platform. Nothing about the list or how it filters your analytics changes
- You can run a public demo on one shared login without visitors locking each other out. Name the account in
DEMO_USER_EMAILand its sign-in details, profile, role and API key all refuse to change, two-factor setup is refused outright, and it cannot delete media or blog taxonomy (a reset restores names, never the image bytes). Visitors get a short friendly explanation rather than an error. Leave the variable unset, which is the default, and none of it is active
v1.1.0 (August 2026) - Every business detail as a token, and a canvas that shows its wiring#
Cut 1 August 2026.
A release about the details a client site repeats everywhere: the tokens that fill them in, seeing which fields are wired to what, and a proper table element.
Seeing What Is Wired#
- A Tokens switch in the builder panel. A filled-in token looks exactly like text somebody typed, so there was no way to tell a bound field from a literal one without opening every element. The switch flips the canvas between the two views. It starts on, so you open a site seeing what is wired before you edit
- A
{}reference beside it listing every token you can use, grouped by where it reads from, click to copy. Generated from the platform itself, so it can never offer a token that does not work
Locations Got the Rest of Their Tokens#
- Opening hours, a day at a time.
{{location.hours.monday}}throughsunday, each filling with that day's range or the word Closed - Postcode, suite number, and service cities, as
{{location.postalCode}},{{location.address2}}and{{location.serviceCities}} - Every location token has a numbered form, social links and hours included, so
{{location.2.hours.monday}}is your second location's Monday hours regardless of what the page is bound to
A Table Element#
- Pricing grids and service comparisons without a custom HTML block. Header-row toggle, four looks, comfortable or compact density, per-column alignment any cell can override, and a phone behavior that either scrolls sideways or stacks each row into a card. Publishes as a real semantic table. The builder now offers 49 element and block types
Corrections Worth Knowing About#
- Addresses now include the suite number and postcode.
{{location.address}}was building its line from street, city and state only, leaving out parts you had entered. An address that does not match your Google Business Profile listing works against you in local search. Existing pages pick this up on their next deploy - Cloned sites now arrive fully set up. The clone command created its site by a route that skipped the setup step, so a cloned site came up with no Settings record, no privacy policy and no terms. Sites cloned before this release can be repaired without touching anything already there
- Merge tokens work in SEO fields and llms.txt, so title tags and social cards fill themselves in
- A scheduled publish time no longer moves when you save the page
v1.0.0 (July 2026) - Generated sites in the client's voice, unique by design#
The first buyer release, cut 23 July 2026.
A wave of additions to how new client sites get built: a third way to create a site, generated copy that sounds like the client, sites that are unique to each client, and gates that keep generated copy honest. Those additions landed on a platform that was already finished, and the rest of this entry lists what that platform did, because all of it shipped in v1.0.0 too.
Three Ways to Build a Site#
- Clone a live site. A new third way to create a site, alongside porting and generating: make a plain, near-exact copy of a live site into a tenant as editable drafts, without keyword research or rewritten copy
- Generate matured. The generate-from-brand-inputs flow now runs from a guided client intake questionnaire and builds a keyword-grounded page plan (a tight set of pages worth ranking) rather than a raw services-by-locations cross-product
Copy in the Client's Voice#
- Generated copy is now written to sound like the client, drawn from a few sentences they supply at intake plus simple tone dials, so a generated site reads like the business owner rather than a generic template
- Optional tone reading from the client's own site and their Google reviews, used for style only and never turned into quoted phrases or stated facts
- A per-client "Does this sound like you?" review before the site is built
Unique by Design#
- Every generated site now gets its own structure - layout, color rhythm, spacing, typography, imagery, and photography - within brand-safe, accessibility-checked bounds
- Each build is checked against your prior builds and automatically re-rolled if it comes out too close to one you already made, so two clients built from the same template pack never receive a recognizably identical site
- The same client always rebuilds to the same site, so edits and approvals stay stable
Honesty Gates#
- Generated copy can no longer ship a statistic, rating, or superlative the client did not actually supply; a build that would invent one stops with a plain-English reason
- The built-in template packs can never ship a real reviewer's name or a source business's identity, so a generated site cannot quote a stranger or route leads to someone else's inbox
- Generic, AI-sounding phrasing is flagged for review
A New Builder Element#
- Before / After image slider. A new element for the visual builder that stacks two images with a draggable divider your site visitors slide across to compare a before and an after, either horizontally or vertically. The builder now offers 46 element and block types
Analytics and SEO#
- Heatmap screenshots now refresh automatically after each deploy, so click, scroll, and attention maps stay lined up with the current layout
- Analytics now stores visitor IP addresses only as a one-way hash, never in raw form, and UTM tracking respects cookie consent
- Local-business structured data now uses the correct business subtype for a much wider range of industries, not just home and trade services
The Platform It Was Built On#
Seedly Sites ran real client sites in production before it ever went on sale. This is what the platform already did on the day v1.0.0 shipped, alongside everything above.
The Platform#
- Multi-tenant CMS: unlimited client sites (tenants) managed from one operator login, with per-tenant pages, blog, media, redirects, tracking scripts, locations, and settings
- WordPress-style roles (Administrator, Editor, Author, Contributor, Subscriber) plus per-tenant role overrides and a separate deploy permission, strictly enforced per tenant
- White-label delivery: branded client login, no powered-by badge on published sites, custom domain per client
- Operator portal: dashboard, per-site management, activity log, backups, and metrics
The Visual Builder#
- Drag-and-drop builder on a Section, Row, Column hierarchy with a full element and block library, including a local-business pack (NAP, hours, service area, service, click-to-call, map)
- Native style fields throughout: per-breakpoint column widths, section styles and mobile-first padding, heading and text controls, responsive visibility
- 16 built-in section presets plus a saved-blocks library for your own reusable sections
- Header and footer built in the same builder, with a sticky-header option and mobile drawer navigation
- Builder-editable system templates: 404, blog archive, and single post
Content, SEO, and Analytics#
- Pages with drafts, scheduled publishing, password protection, an internal-link picker, and a content and SEO analysis panel
- Blog with categories, tags, rich-text editing, and author profiles with real author archive pages and structured data
- Per-page SEO fields, local-business structured data, automatic sitemaps and robots controls, redirects with a 404 monitor, and broken-link and orphan-page detection
- First-party, consent-gated Website Analytics Dashboard: click maps, scroll depth, attention maps, campaign and UTM attribution, bot watch, and experimental A/B tests (off by default)
Publishing and Hosting#
- Static rendering to one Cloudflare Pages project per client site, provisioned automatically, with media on R2
- Manual, operator-controlled deploys with a per-page readiness gate; publishing never silently changes a live site
- Per-site sitemap, robots rules, and redirects regenerated on every deploy
- Platform preview URLs kept out of search engines so only the client's real domain ranks
Migration#
- The migration pipeline: crawl an existing site and reproduce it closely in the builder, with a deterministic content-parity gate, a visual-difference signal, and a triage board for review
- Ports land as drafts and never publish or deploy automatically
Billing#
- Native Stripe billing per tenant: hosted checkout, customer portal, an operator billing dashboard, and configurable non-payment enforcement (freeze editing or suspend the site), with per-tenant overrides
Setup and Operations#
- Guided setup with Pixl: a local sandbox first (no accounts required), then provisioning for Railway, Cloudflare Pages, R2, and GitHub, with a doctor command that diagnoses problems in plain English
- Numbered setup handbook, operations playbooks (backups and disaster recovery, updating, data export), and a command and environment-variable reference
