Releases: primocms/primo
Release list
v3.2.4
Fixes
- Fix
primo push300s timeout on content-heavy sites (#1200). The import was doing a per-record delete-and-recreate of all content entries on every push, and every entry Save triggered PocketBase relation-existence validation — ~33,000 SQL statements for a 44-page site, enough to blow Railway's un-raiseable 300s edge timeout. Redundant import work is now skipped so pushes stay well under the limit. - Make file→CMS upload sync idempotent (#1203). Every push re-uploaded unchanged images: an already-suffixed upload picked up another hash suffix and a fresh
site_uploadsrecord each time, orphaning the prior one and growing a single image into many byte-identical duplicates — pushes resent everything until they aborted. Reconcile now matches incoming uploads by content hash first (filename second), so an unchanged image is a no-op regardless of the name sent, and bootstrap returnscreated_idsso the CLI's first push can write back canonical names. - Don't drop link fields while the referenced page is still loading (#1199). A link field to an unloaded page was omitted entirely, so blocks reading
link.label/link.urlcrashed until the page happened to load. It now emits a well-formed link object immediately (emptysafe_urluntil resolvable) and lets reactivity fill in the URL. - Harden on-page repeater matching against entry reorder (#1201). On-page edits to repeater subfields could bind to the wrong row and appear to revert when storage order diverged from render order (after a row reorder or CLI re-import). Matching no longer relies on entries arriving in render order.
Changes
- Enable daily backups by default on fresh deploys (#1202). A new deploy now gets a default
0 3 * * *schedule (keep 7), overridable viaPRIMO_BACKUP_CRONand never clobbering a schedule set in the admin UI. Backups land on thepb_datavolume — a floor, not off-site protection; configureBackups.S3for durable backups. - Publish the
:latestDocker tag explicitly, and document it for Railway (#1197).:latestnow reliably tracks releases rather than being an implicit side effect. Railway/self-host deployers should followghcr.io/primocms/primo:latestfor auto-updates — the one-click template's:mainis a rolling build, not a release. - Move the version label out of the editor toolbar into the profile popover (#1196). It now reads as a subtle muted line in the dashboard sidebar dropdown instead of sitting prominently next to the publish controls.
- Remove dead SSH deploy jobs from CI (#1195). Both jobs SSHed to the retired
palacms.comhost and failed on every release tag / every push tomain; images are still built and pushed to ghcr. - Ignore local-only
internal/SPEC-*.mddesign specs (#1198).
v3.2.3
Release v3.2.3 - Fix repeater subfield ordering on render and export (#1194) - Trim snapshot upload bloat; guard null image entries (#1194)
v3.2.2
Fixes
layout.yamlnow round-trips page-type body sections (#1180). The editor already supported placing body sections in a page type's layout, but the file pipeline dropped them on export and could not represent them on import.layout.yamlnow supports abody:key alongsideheader:/footer:, seeding default sections onto new pages of the type (locked when the type has noallowed_blocks).- Skip user-activity tracking in local dev (#1181). Collaborator-presence tracking no longer runs under
primo dev, eliminating a flood of 404/ZodError console noise from activity rows pointing at deleted pages.
v3.2.1
Fixes
- Fix
/admincrash on image fields with null entry values, and stop image-upload edits leaking across shared upload records (copied sections, duplicated repeater items, cloned sites). (#1179) - Fix Docker build by aligning
@tiptap/*to^3.27.0. (#1178) - Extend user password-reset token TTL to 30 days. (#1162)
Changes
- Complete the Pala → Primo rename, phase 2 — internal identifiers, dev-mode WS endpoint, debug env var, usage-stats cron id. (#1173, #1179)
- README update. (#1163)
- Dependency bumps (tiptap, dompurify, protobufjs, @sveltejs/kit, svelte-check, and others).
Note: Draft until reviewed. Assets are not publicly downloadable (and primo-cli cannot fetch them) until published.
v3.2.0 - CLI & Local Development
What's New in v3.2.0
Local Development Mode
Run the CMS locally on your machine, represent the entire site with local files. Enables development with local IDE and AI agent.
- Dev mode indicator - Visual badge shows when running locally
- Skip setup - No superuser configuration required for local dev
Site Import/Export
Move your sites between instances or back them up locally.
- Export - Download your entire site as a
.primofile (blocks, pages, content, assets) - Import - Upload a
.primofile to restore or migrate sites - File upload cloning - Create new sites by uploading snapshot files directly
Sitemap Generation
Automatically generates sitemap.xml when you publish. Includes all pages with full URL paths for better search
engine indexing.
Technical Changes
New Endpoints
/api/palacms/export/{siteId}- Export site as.primofile/api/palacms/import/{siteId}- Import site from.primofile/api/palacms/import/{siteId}/preview- Preview import before applying/api/palacms/bootstrap- First-run setup for local dev/api/palacms/dev-auth- Auto-authentication for localhost/__pala_dev_ws__- WebSocket for dev mode sync
v3.1.0
What's New
- Server-side site cloning — site creation from templates is now handled by the server, making it faster and more reliable for larger templates
- Unified code editor — HTML, CSS, and JS are now edited in a single file view instead of separate panes (ground work for LLM integration)
- Inline CSS editor — right-click a class name in the HTML editor to view and edit its styles in place
- Logout button — added to the editor toolbar dropdown
Bug Fixes
- Fixed field key auto-fill overwriting existing keys when editing fields
- Fixed repeated auto-selection in site-field and link field types
- Fixed content rendering crash when entries are missing for group, markdown, rich-text, image, page, and link fields
- Fixed "info" field type being incorrectly auto-detected from field name
- Added missing empty values for page and page-list field types
Under the Hood
- Replaced batch API with sequential commits (batching was unreliable)
- Added timeout and size limit to snapshot fetching
- Fixed potential stuck commit queue after a failed save
- Removed client-side clone logic (832 lines) in favor of server-side Go endpoint
- Disabled telemetry
Version 3 🎉
The first stable version of Primo, 7 years in the making 🎉
What's New in V3
Self-Hosted Architecture
- PocketBase Backend - Run Primo on your own infrastructure with a single Go binary
- Monolithic Deployment - Ship as a single Docker image
- Your Data, Your Control - No vendor lock-in or external dependencies
Content System
- Custom Page Types - Create flexible content structures for blogs, products, team pages, and more
- Dynamic Content Fields - Site fields, page fields, and relational content that updates across pages
- Conditional Fields - Show/hide fields based on other field values
- Block & Starter Library - Reusable components and starter templates
Editor Experience
- Real-time Collaboration - Multiple users editing simultaneously
- Enhanced On-page Editing - More intuitive visual editing
- Improved Drag & Drop - Better block placement with mobile support
- Better Content Organization - Drag to reorder pages and content items
- Refined Block Editor - Cleaner separation between code and content
- Design System Editor - Built-in tools for managing your site's design tokens
Technical Changes
Architecture
- Backend rearchitected from Supabase/Serverless to PocketBase Monolith (Go)
- Database moved from SQL schema to PocketBase migrations
Frontend Stack
- Svelte 4 → Svelte 5 (runes syntax)
- SvelteKit 1.x → SvelteKit 2.x
- Tailwind CSS 3 → Tailwind CSS 4
- Custom components → bits-ui
- CodeMirror 6 with Svelte language support
- TipTap 3.x for rich text editing
- Pragmatic drag-and-drop
Build & Compilation
- Browser-based Rollup (@rollup/browser)
- Server-side compilation options
- Pages compile to static HTML
Roadmap
- Internationalization
- Framework integration (Next.js, SvelteKit, Astro)
- AI block generation
- Local development tools & CLI
- Marketplace for community blocks and starters
- Plugin API
Major credit to @joas8211 for suggesting and implementing the monolithic approach, as well as major architectural work & helping create the first stable version.
Note: project was renamed to "Pala" for a bit but decided to go back to the original name for the credibility/non-slop commitment signal of 7 years of development
v3.0.0-rc.5
New Features
- Copy Entries System - Implemented useCopyEntries for creating sections and pages, providing a more robust approach to duplicating
content across the site - Batch Operations - Enabled batching for committing changes with intelligent batch splitting based on PocketBase limits, improving
performance for large operations
Improvements
- Site Creation - Added loading state and error handling for site creation failures
- Batch Processing - Split batches dynamically based on limits set in PocketBase configuration
- API Rules - Handle multiple site_role_assignment records using ?= operator for more flexible permission handling
- UI Polish - Fixed version number display in app sidebar, hid 'Block Data' UI when no fields exist
Bug Fixes
- Broadened page generation success condition to include header, body, and footer content
- Fixed delay between loading state and success state
- Fixed issue where cloning a site with unused symbols failed
- Fixed image loading from site field
- Fixed page field hydration breaking section
- Fixed long load time after creating site from larger starter
- Fixed deleting site that has no homepage
- Fixed mod.mount is not a function error when first creating a block
- Fixed API rules copying as pointers to avoid references to wrong values
- Undo individual failed requests after partially successful batch operations
Dependency Updates
- PocketBase: 0.32.0 → 0.34.2
- Svelte: 5.43.5 → 5.46.0
- SvelteKit: 2.48.4 → 2.49.2
- Tiptap extensions: 3.10.x → 3.13.0
- TailwindCSS: 4.1.17 → 4.1.18
- Various other minor dependency updates
v3.0.0-rc.4
Features
Site Snapshotting
- Implemented site snapshotting functionality to capture and preserve site states
- Added ability to clone starter templates from snapshots
- Significantly improves site creation speed & sets groundwork for full site backups & timeline
Content Management
- Added Date field type with integrated date handling in FieldItem component
- Implemented subpage reordering with enhanced drag-and-drop functionality
- Auto-populate new pages with page type entries to streamline content creation
Developer Experience
- Added CodeMirror Svelte 5 syntax support for better code editing (THANK YOU @Kynson 🙏)
- Dynamic pane sizing in FullCodeEditor based on code presence
- Show block data above preview for easier integrating/debugging
- Include UTF-8 and viewport meta tags in generated pages by default
- Include image height/width in image field values
Fixes
Critical Fixes
- Fixed 'undefined' error caused by race condition on conditional fields
- Fixed page type Head/Body/Footer HTML not updating when navigating between page types
- Prevented circular dependencies by filtering current page type from available options in 'page' page field
- Fixed 't is not a function' race condition with dynamic data updates
UI/UX Fixes
- Hide 'create subpage' option for home page
- Fixed link field not keeping 'url' option selected when URL is set
- Fixed auto-protocol handling for links with existing protocols and relative links
- Fixed SVG images failing to upload
- Fixed newly created blocks being added to bottom instead of top of list
- Fixed externally-imported Svelte components not working (must end in
.svelte) - Fixed console logs clearing on recompilation
- Fix mod-e keyboard shortcut on page type editor
- Prevent 'symbol not found' flash on load
Field Improvements
- Stopped auto-populating key field when label loses focus to prevent data loss
- Auto-select first option in SelectField when no value is set
- Clear icon picker search query on icon selection
- Enhanced link field with auto-protocol setting on blur
Improvements
User Experience
- Hide hidden entries from developers for cleaner dev interface
- Add keyboard affordances (cmd-enter for code format, mod-click to collapse/expand repeater items)
- Enhanced field visibility messages with improved button interactions and key hints
- Updated icon picker to auto-search on query change
- Hierarchical structure in selectable pages with visual indicators for subpages
Performance & Error Handling
- Enhanced error handling and preview functionality
- Improved error handling in compilation and page generation
- Import component in preview only when needed
- Cache external modules and suppress ESM Svelte circular dependency warnings
- Set code fields max length to 100,000 characters
UI Polish
- Removed page type section borders for cleaner look
- Enhanced selectable pages with hierarchical structure in Page field
- Fixed starter overflow on create site screen
- Improved spacing on section editor
- Set max height/width for image field
- Show 'entry' tab by default
- Fixed positioning on format hotkey affordance
Dependencies
- Updated Tiptap extensions (core, highlight, typography, link, image, youtube) to 3.10.4
- Updated Svelte from 5.41.0 to 5.43.5
- Updated @sveltejs/kit from 2.48.0 to 2.48.4
- Updated various other dependencies for security and performance improvements
v3.0.0-rc.3
Highlights
- Faster component preview loads thanks to lazy module imports that only fetch and mount the rendered component when new code arrives (
src/lib/builder/ components/misc.js). - Testing deploy pipeline now supports manual triggers via
workflow_dispatch, so you can redeploy the testing environment on demand (.github/workflows/ main.yml).
Enhancements
- Code, head, and foot editors across symbols, sites, and page types now accept up to 100k characters, giving builders more room for complex snippets
(migrations/1762158952_code_field_length.go).
Dependency Updates
- Editor stack: TipTap core/starter-kit/highlight/image/typography/youtube and
@tiptap/pmall bumped to 3.10.1;@codemirror/lang-markdownupdated to 6.5.0. - Frontend platform: Svelte 5.43.2, SvelteKit 2.48.4, Bits UI 2.14.2, lucide-svelte 0.552.0, and svelte-awesome-color-picker 4.1.0.
Upgrade Notes
- Run PocketBase migrations after upgrading so the new 100k character limits apply to existing collections (
migrations/1762158952_code_field_length.go).