You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Images, tables, embeds and code in the visual editor. Images show as images, with an Image button in the toolbar (Media library) and double-click to edit the description. Tables, figures, YouTube and other embeds, code blocks and dividers are kept exactly as they are (shown read-only, edited in HTML). Loose text no longer breaks loading. src/lexical-blocks.ts.
HTML editor: every rich text field has a Visual | HTML | Preview switch. HTML edits the saved HTML directly; Visual is refused for HTML it would damage (images, tables, embeds, code blocks).
Fixed
Dashboard showed 0 media files and "0 B". Upstream still counts its old media table, which uploads no longer fill (they are media_asset documents). The Media Files card and Storage Usage now count the media documents. src/dashboard-media.ts (sites: add it to sync-core and wrap the upstream response with withMediaUsage).
Sidebar jumped when switching between Blog and News. The entries were only added after the counts loaded, so the menu shifted on every page. They now draw at once from the last known counts (kept in the browser) and the numbers refresh afterwards. src/sections.ts.
Editor could blank imported posts. Upstream's visual (Lexical) editor has no images, tables, embeds or code blocks: such HTML was dropped or the box stayed empty, and saving wrote that back. Content with those elements now opens in an HTML editor with a preview (nothing lost); if the visual editor loses text on load it switches too; emptying a box with text asks for confirmation, and the server refuses a save that would blank a post or page unless confirmed. src/content-guard.ts.
Added
Content list: an eye (View on site) before the edit button opens the published page in a new tab; the editor's View on Website uses the same address. Sites give their URL rules once with setPublicRoutes(SITEMAP_ROUTES). Drafts have no eye.
Sidebar: Blog and News entries under Workspace (after Content) with post counts, highlighted on their list; News only when the site has news posts.
Posts list divided by section: All posts | Blog | News tabs with counts above the list; filters, paging and "New Content" keep the section (a new post from News starts as News). src/sections.ts.
SEO plugin (Admin › SEO), modelled on Yoast SEO: SEO panel on pages, posts and categories with Google and share previews, focus keyphrase, SEO and readability analysis, Auto-fill SEO button, scores in the Content list; General settings (site name, title formats, organisation), Indexing (robots.txt, llms.txt, hide site), Redirects with CSV import, and a Check list. Sites get seoHead, sitemaps per type, robots.txt and structured data (Article, BreadcrumbList, WebSite, Organization). See docs/seo.md.
Categories collection (name, slug, section blog/news, description, SEO title and description).
Posts: Section (blog or news), Categories and Tags as searchable multiselects in the editor (categories filtered to the post's section, tags suggested from existing ones or added new), Author name / URL slug / website, Legacy ID and Legacy URL for imported posts. See docs/posts.md.
Changed
Node.js 24 LTS is now the minimum (engines>=24, .nvmrc); verified with 24.21.0.