v0.1.0
What's Changed
- Phase 0: foundations (monorepo + @sitewright/schema) by @sbuchweitz in #1
- Phase 1: @sitewright/core (engine — tree, partials, bindings, validation) by @sbuchweitz in #2
- Phase 1b: Astro + Tailwind renderer, block library, sample site (visible win) by @sbuchweitz in #3
- Phase 2a: collection pages (per-entry static generation) by @sbuchweitz in #4
- Phase 2b: @sitewright/image-pipeline (sharp → AVIF/WebP/LQIP) by @sbuchweitz in #5
- Phase 2b-cont: image pipeline integration (
+ AVIF/WebP) by @sbuchweitz in #6 - Phase A: multi-tenant tenancy, auth, scoped projects API by @sbuchweitz in #7
- Phase B: tenant-scoped content API + file-format export/import by @sbuchweitz in #8
- Phase D: React editor SPA (the clickable CMS), served same-origin by the API by @sbuchweitz in #9
- Phase D2a: visual block editor with live SSR preview by @sbuchweitz in #10
- Phase D2b: dataset/CMS manager + block→dataset binding UI by @sbuchweitz in #11
- Phase D2c: media manager + image picker by @sbuchweitz in #12
- Phase C: static site publishing (single-container) by @sbuchweitz in #13
- Phase F: zip export + FTP/FTPS/SFTP deploy targets by @sbuchweitz in #14
- Phase F: rate limiting by @sbuchweitz in #15
- Phase F: pull-based release check + update banner by @sbuchweitz in #16
- Phase F: saved/encrypted deploy targets + SSRF allow-list by @sbuchweitz in #17
- Phase F: self-contained optimized exports + BuildRunner by @sbuchweitz in #18
- Phase F: isolated container build worker (opt-in) by @sbuchweitz in #19
- feat(blocks,core): Phase 1 — portable links + data-driven document skeleton by @sbuchweitz in #20
- test(api): integration harness + tenancy/publish/auth coverage by @sbuchweitz in #21
- test(api): media-pipeline + collection-routing integration coverage by @sbuchweitz in #22
- feat(schema,publish): Phase 2 — company corporate-identity + schema.org wiring by @sbuchweitz in #23
- feat(schema): deploy-target remoteDir control-char hardening + security/fidelity harness coverage by @sbuchweitz in #24
- fix(api): cascade project delete to content rows + preview/lifecycle harness coverage by @sbuchweitz in #25
- feat(schema,publish): Phase 2 — website settings (critical CSS + custom head/footer) + partials harness by @sbuchweitz in #26
- fix(api): on-disk cleanup on project delete + concurrent-publish harness by @sbuchweitz in #27
- feat: Phase 3 — reusable page templates (Outlet-based layouts) + rate-limit harness by @sbuchweitz in #28
- feat: Phase 3 — page-tree-driven auto-nav (Nav block) + binding-depth harness by @sbuchweitz in #29
- feat(blocks): integrated icon set — Lucide inline-SVG Icon block + adapter harness by @sbuchweitz in #30
- feat(api): Phase 5 — online AI generation (metered, agency-funded, quota-gated) by @sbuchweitz in #31
- feat: Tailwind utility layer (className on blocks + publish/preview compilation) by @sbuchweitz in #32
- feat(blocks): integrated brand/social icon set (simple-icons, CC0) by @sbuchweitz in #33
- feat(blocks): Html (raw embed) block — maps/forms/video/widgets by @sbuchweitz in #34
- feat(blocks): interactive Components + flagship Carousel (component-JS pipeline) by @sbuchweitz in #35
- feat(blocks): Lightbox gallery + Accordion components by @sbuchweitz in #36
- feat(editor): WYSIWYG live preview — allow-scripts sandbox + inlined component JS by @sbuchweitz in #37
- feat(editor): true WYSIWYG live preview via a CSP:sandbox preview document by @sbuchweitz in #38
- feat(blocks): Modal + CookieConsent components (completes the requested set) by @sbuchweitz in #39
- feat(blocks): Tabs component (rounds out the disclosure family) by @sbuchweitz in #40
- feat: Patterns library (fork-on-insert) + expose Components in the palette by @sbuchweitz in #41
- feat: multilingual publishing engine (per-locale output + fallback) by @sbuchweitz in #42
- feat(editor): locale switcher for multilingual page editing by @sbuchweitz in #43
- feat(api): project-scoped API keys + bearer auth (CLI/MCP foundation) by @sbuchweitz in #44
- feat(mcp): @sitewright/mcp stdio bridge for coding agents by @sbuchweitz in #45
- feat(preview): live auto-reload preview via SSE by @sbuchweitz in #46
- feat(api): OAuth 2.1 token-issuance core (PKCE, rotation) [C1] by @sbuchweitz in #47
- feat(api): OAuth 2.1 endpoints — authorize + consent + token [C2] by @sbuchweitz in #48
- feat(api): OAuth Dynamic Client Registration (RFC 7591) [C2b] by @sbuchweitz in #49
- feat(cli): sitewright login (OAuth loopback+PKCE) + mcp/whoami/logout [C3a] by @sbuchweitz in #50
- feat(editor): API-key management UI (project settings → access) [C3b] by @sbuchweitz in #51
- feat: token-lifecycle polish — server-side revoke filter + bridge auto-refresh by @sbuchweitz in #52
- feat: OAuth device authorization grant (RFC 8628) for headless CLI by @sbuchweitz in #53
- feat(publish): sitemap.xml + robots.txt + redirect rules on export [Phase 1] by @sbuchweitz in #54
- feat(admin): instance admin + instance settings (mail/hCaptcha/form modes) [Phase 2] by @sbuchweitz in #55
- feat(forms): web-forms-to-email engine — block, endpoint, Mode A, inbox, MCP [Phase 3a] by @sbuchweitz in #56
- feat(editor): forms authoring + submissions inbox UI [Phase 3b] by @sbuchweitz in #57
- feat(forms): hCaptcha verification + widget [Phase 4] by @sbuchweitz in #58
- feat(forms): Mode B contact.php + form-mode selection + forms hardening pass [Phase 5a] by @sbuchweitz in #59
- feat(forms): per-project SMTP (Mode B / userSmtp) [Phase 5b] by @sbuchweitz in #60
- feat(forms): Mode C — third-party endpoint [Phase 6] by @sbuchweitz in #61
- feat: stock images (Openverse/Unsplash/Pexels) via MCP + editor picker by @sbuchweitz in #62
- fix: keyless Openverse stock search (page_size must be <= 20) by @sbuchweitz in #63
- refactor: merge brand + company into unified Corporate Identity (format v2) by @sbuchweitz in #64
- feat: glassmorphic animated Settings editor (Corporate Identity + Website) by @sbuchweitz in #65
- feat: page draft/published status + Page Settings editor panel by @sbuchweitz in #66
- feat: content-route rate limits + hreflang multilingual SEO by @sbuchweitz in #67
- feat: built-in Starter snippet library (Phase 3 — global snippet scope) by @sbuchweitz in #68
- feat: template/partial variables ({{ company.* }} / {{ website.* }} / {{ page.* }}) by @sbuchweitz in #69
- feat: per-node client-editable regions with server-side enforcement by @sbuchweitz in #70
- feat: constrained client (member) restricted editor + client provisioning by @sbuchweitz in #71
- feat: invite-acceptance flow + project-scoped client access by @sbuchweitz in #72
- chore: upgrade vitest 2→4 (resolves GHSA-5xrq-8626-4rwp) + vite 6 by @sbuchweitz in #73
- feat: code-first template engine (T1 of the templating pivot) by @sbuchweitz in #74
- feat: hardened Handlebars renderer + isolated child-process render worker pool by @sbuchweitz in #75
- feat: reusable Handlebars snippets (partials) in the render pipeline by @sbuchweitz in #76
- feat: pages can be authored as Handlebars templates (page.source, Option A) by @sbuchweitz in #77
- feat: publish code-first source-pages to static HTML by @sbuchweitz in #78
- feat: code-first page editor in the SPA (CodeMirror + live styled preview) by @sbuchweitz in #79
- feat: client editing of code-first pages via {{edit}} bound regions by @sbuchweitz in #80
- feat: integrate DaisyUI as the brand-themed component layer by @sbuchweitz in #81
- feat: DaisyUI starter-pattern library for the code editor by @sbuchweitz in #82
- feat: page-settings panel for the code editor (code pages first-class) by @sbuchweitz in #83
- refactor: remove the block authoring editor (code-first is the only model) by @sbuchweitz in #84
- feat: MCP bridge teaches code-first authoring (agent builds a whole site) by @sbuchweitz in #85
- feat: code-first skeleton slots — shared topNav/footer with auto-nav (multi-page) by @sbuchweitz in #86
- feat: first-boot bootstrap admin + always-seeded Example Project + closed registration by @sbuchweitz in #87
- feat: complete the validated skeleton slots (mobileNav, sidebars, bottom) by @sbuchweitz in #88
- refactor: retire customHead/customFooter into the raw head/scripts model by @sbuchweitz in #89
- feat: JSON data URL → {{ website.json_data }} (publish-time fetch + SSRF guard) by @sbuchweitz in #90
- feat: editor UI for the validated skeleton slots + preview WYSIWYG parity by @sbuchweitz in #91
- chore(api): bump @fastify/static 8→9 (route-guard-bypass advisory) + harden SPA serving by @sbuchweitz in #92
- chore(render-app): bump astro 5→6 (define:vars XSS advisory) + fix cwd path resolution by @sbuchweitz in #93
- fix(editor): load the code-page preview via opaque-origin token+src (not srcDoc) by @sbuchweitz in #94
- feat(publish): compose {{> snippet}} Handlebars partials into published pages by @sbuchweitz in #95
- feat(mcp): OAuth device-grant login for the bridge — "connect to my website" by @sbuchweitz in #96
- fix(cli): repair the device-login keep-alive + revert the duplicate mcp login (#96) by @sbuchweitz in #97
- feat: remove the org layer → flat project tenancy (backend, PR1/9) by @sbuchweitz in #98
- feat: flatten the URL surface to /projects/:projectId (API + editor + MCP + CLI) (PR2/9) by @sbuchweitz in #99
- feat(publish): serve published sites at /sites// (PR5/9) by @sbuchweitz in #100
- feat(editor): restructure project IA — top tabs + Admin group + Forms/Inbox fold (PR6/9) by @sbuchweitz in #101
- feat(editor): single top-right Publish button + dirty signal (PR7/9) by @sbuchweitz in #102
- feat(editor): morph-glass restyle + global cursor-pointer (PR8/9) by @sbuchweitz in #103
- feat(editor): source⇄content edit-mode toggle + cleanup (PR9/9) by @sbuchweitz in #104
- fix(editor): distinct "Preview" iframe title — resolves the 2 code-preview e2e failures by @sbuchweitz in #105
- feat(seed): revamp the demo into a complete "Northwind Web Studio" site by @sbuchweitz in #106
- feat(editor): global Modal + black CodeMirror + partials Edit-in-modal + stock-search modal by @sbuchweitz in #107
- feat(assets): any-file-type uploads, virtual folders, list/grid — the ASSETS overhaul by @sbuchweitz in #108
- feat: motion/lazy/ripple runtimes, page-settings v2, editor + media + shell overhaul by @sbuchweitz in #109
- feat(i18n): document-level multilingual pages + German showcase by @sbuchweitz in #110
- feat(i18n): per-locale preview nav + indent sub-pages in the page list by @sbuchweitz in #111
- feat(pages): HOME is the page-tree root + nested demo sub-pages by @sbuchweitz in #112
- feat(editor): code-editor colours + Tab indent, left Library drawer with gallery modals, per-field settings editors by @sbuchweitz in #113
- fix(publish): rebase internal links page-relative so sub-folder nav works by @sbuchweitz in #114
- feat(pages): slug-only paths with routes computed from the parent chain by @sbuchweitz in #115
- feat(library): full Lucide icon set (1865) + brand icons + ~52 DaisyUI components by @sbuchweitz in #116
- feat(editor): Shift+Tab auto-indent, flat settings chrome, DaisyUI skeletons (PR-B) by @sbuchweitz in #117
- feat(editor): drag&drop + keyboard reordering of sibling pages (PR-C) by @sbuchweitz in #118
- feat(editor): ripple feedback + animated modals with close guard (PR-D) by @sbuchweitz in #119
- fix(publish): bundle assets under _assets/, serve them, + canonical trailing slash (PR1) by @sbuchweitz in #120
- feat(seed): Example Project uses local generated images in folders (PR2) by @sbuchweitz in #121
- feat(typography): per-project heading + body font slots (PR1) by @sbuchweitz in #122
- feat(typography): self-hosted Google Fonts — search, preview, select per slot by @sbuchweitz in #123
- feat(typography): font utilities, custom named slots + local font uploads by @sbuchweitz in #124
- refactor(editor): reusable FileBrowser + FileManager drawer; retire the Assets tab (PR1) by @sbuchweitz in #125
- feat(editor): FilePicker (pick + URL/import) wired to image fields (PR2) by @sbuchweitz in #126
- feat(fonts): merge self-hosted fonts into the media library (kind:'font') (PR3) by @sbuchweitz in #127
- feat(editor): asset-field follow-ups — logo variants, dataset image picker, Google-font dedup by @sbuchweitz in #128
- fix(editor): make the Assets file-manager launcher discoverable by @sbuchweitz in #129
- feat(editor): reusable SidePanel — Library + Assets as permanent edge panels (PR1) by @sbuchweitz in #130
- feat(editor): bottom code rails — Snippets + Templates side panels (PR2) by @sbuchweitz in #131
- fix(editor): anchor bottom side-panels under their tabs (stop hover flicker) by @sbuchweitz in #132
- feat(editor): smoother preview — scroll preserved across reloads, taller modal (PR1) by @sbuchweitz in #133
- feat(editor): inline content editing in the live preview (PR2) by @sbuchweitz in #134
- feat(brand): Sitewright logo + Space Grotesk / Inter type by @sbuchweitz in #135
- feat(editor): Data rail + Snippets center + gradient/full-height/overlay panels by @sbuchweitz in #136
- feat(snippets): global snippets + remove Insert-pattern select by @sbuchweitz in #137
- feat(editor): page-editor header + add-page modal + smooth drag reorder by @sbuchweitz in #138
- feat(editor): brand/header cleanup + project-selector identity + gradient theming by @sbuchweitz in #139
- feat(editor): DaisyUI toasts + tooltips + page-shaped preview skeleton by @sbuchweitz in #140
- feat(settings): single-column Corporate Identity + schema.org business-type modal by @sbuchweitz in #141
- feat(editor): data-sw-* directive layer + rich-text (data-sw-html) regions (PR1) by @sbuchweitz in #142
- feat(editor): in-place WYSIWYG toolbar + link editing + undo/redo (PR2) by @sbuchweitz in #143
- feat(editor): replace images & background images from the preview (PR3) by @sbuchweitz in #144
- feat(editor): entry editor modal + status toggle + duplicate + drag-reorder (PR4) by @sbuchweitz in #145
- feat(editor): dataset click-to-open from the preview (PR5) by @sbuchweitz in #146
- feat(editor): demo {{#eachEntry}} migration + Template reference in the Library (PR6) by @sbuchweitz in #147
- feat(editor): keyed dataset access (item..) + author-settable entry keys (PR7) by @sbuchweitz in #148
- feat(editor): website.data editable JSON store (graphical tree + JSON source) + keyed-access docs (#PR8) by @sbuchweitz in #149
- feat(editor): page.data — per-page custom JSON store (PR-A of page variables) by @sbuchweitz in #150
- feat(core): page.children — read a page's child pages, flattened (PR-B of page variables) by @sbuchweitz in #151
- feat(editor): bind data-sw-* directives to page.data via data. keys (PR-C1) by @sbuchweitz in #152
- feat: content-only blog templates + template-declared default page.data (PR-C2) by @sbuchweitz in #153
- feat(seed): a content-only demo blog in the Northwind showcase (PR-C3) by @sbuchweitz in #154
- refactor: page.content → page.data, the single editable-text store (retire-{{edit}} Phase 1) by @sbuchweitz in #155
- refactor: delete the {{edit}} helper + machinery; convert all content to data-sw-text (retire-{{edit}} Phase 2) by @sbuchweitz in #156
- feat(editor): page.data is object-only + retire the "Editable content regions" panel by @sbuchweitz in #157
- feat(blocks): sw-prefixed content helpers + one dataset-aware {{#each}} (drop values. prefix) by @sbuchweitz in #158
- docs: refresh stale {{edit}} references (seed docstring + i18n model doc) by @sbuchweitz in #159
- feat(blocks): {{page.slug}} + {{parentPage}} template bindings by @sbuchweitz in #160
- fix(api/test): unlink temp file DBs so makeTestDb stops leaking /tmp by @sbuchweitz in #161
- feat: slug-based media + preview URLs (drop project UUIDs) by @sbuchweitz in #163
- perf(db): short base62 internal IDs (drop 36-char UUIDs from PKs) by @sbuchweitz in #164
- feat(brand): mandatory color tokens with defaults, non-deletable in settings by @sbuchweitz in #165
- ci: isolate parallel E2E onto per-agent DinD slots + harden CI by @sbuchweitz in #162
- perf(db): open SQLite in WAL with a busy timeout by @sbuchweitz in #166
- feat(editor): single page.data store for all directives + fix data-sw-href preview overlay by @sbuchweitz in #167
- feat(editor): media library — sortable columns, search, folder sizes + UX polish by @sbuchweitz in #168
- feat(editor): global file/folder search across the whole library by @sbuchweitz in #169
- feat(editor): app-shell UI — centered login, 3-zone header, renamed rails, Publish→Preview by @sbuchweitz in #170
- feat: admin-editable global snippet/template library with scope by @sbuchweitz in #173
- feat(editor): confirm destructive deletes + clickable hover nav dropdown by @sbuchweitz in #171
- feat(admin): MCP admin panel — editable agent instructions, endpoint list, connect guide by @sbuchweitz in #172
- feat(blocks): semantic skeleton landmarks (, …) + reserve those elements in author content by @sbuchweitz in #174
- feat(identity): sortable social profiles (name + icon, auto-detected) + Map URL + footer helper by @sbuchweitz in #175
- feat(identity): powerful brand color picker — HEX/RGB/HSL/OKLCH with live conversion + alpha by @sbuchweitz in #176
- feat(editor): Publish & Deploy Options modal — local-publish toggle, preview-token gate, HTML minification by @sbuchweitz in #177
- feat(blocks): expand built-in brand logos 20 → 274 + auto-detect more socials by @sbuchweitz in #178
- feat(deploy): SFTP/SSH key-file auth + streaming deploy modal (live progress) + header Deploy button by @sbuchweitz in #179
- feat(blocks): country flags — {{sw-flag "de"}} / "de-circle" (all ~250 ISO countries) by @sbuchweitz in #180
- fix(editor): full-width header bar — flex with mx-auto-centered tablist by @sbuchweitz in #181
- feat(mcp): lazy agent-triggered auth — boot the bridge on URL alone, login on demand by @sbuchweitz in #182
- feat(mcp): live "agent is editing" indicator + device-approval → editor handoff by @sbuchweitz in #183
- feat(api): remote MCP transport at /mcp (Streamable HTTP, OAuth-gated) by @sbuchweitz in #184
- feat(mcp): configurable agent session lifetime + disconnect & AI agent details modal by @sbuchweitz in #185
- feat(mcp): dynamic agent-presence indicator + live OAuth session model by @sbuchweitz in #186
- feat(i18n): code-inheritance translation model — locale-first editor + atomic locale API by @sbuchweitz in #187
- feat(blocks): auto-imply lazy-load from data-src/data-bg (incl. iframes) + skeleton/iframe docs by @sbuchweitz in #188
- feat(i18n): translation-workflow polish — ancestors, locale homes, flag switcher, cross-tab sync by @sbuchweitz in #189
- feat(editor): open File Manager when files are dragged onto its tab by @sbuchweitz in #190
- feat(shop): MINI SHOP — front-end cart with WhatsApp/mailto/payment channels (PR-1) by @sbuchweitz in #191
- fix(blocks): gate interpolated data-src/data-bg URLs through {{sw-url}} by @sbuchweitz in #193
- docs(reference): pretty-print the library code examples by @sbuchweitz in #192
- feat(editor): settings/branding polish + slugged font filenames by @sbuchweitz in #194
- feat(shop): Form submission channel (cart → order Form via /f) (PR-2) by @sbuchweitz in #195
- feat(shop): Shop settings UI + MCP/agent instructions (PR-3) by @sbuchweitz in #196
- feat(shop): full demo storefront + template-panel UX (2-col grid + rename) by @sbuchweitz in #197
- feat(editor): unified header gear settings menu; admin surfaces as modals by @sbuchweitz in #199
- feat(shop): cart drawer UX — slide-in/blur/ripple + editable note + drop Stripe by @sbuchweitz in #200
- feat: validate template source on save + line/column errors + editor gutter marker by @sbuchweitz in #198
- feat(editor): header polish — Team admins-only, dropdown hover, deploy padding, agent connect tabs, font-bold by @sbuchweitz in #202
- feat(editor): snippet hover preview (eye) + rename in the snippets rail by @sbuchweitz in #201
- fix(shop): cart toggle stays fixed/unclipped + drawer flex-column footer by @sbuchweitz in #203
- feat(editor): interactive DaisyUI previews + add missing Filter component by @sbuchweitz in #204
- feat(agents): Mistral Le Chat connect tab + per-agent CLI config (sitewright config) by @sbuchweitz in #205
- fix(blocks): cart drawer fills full viewport height by @sbuchweitz in #206
- feat(editor): all DaisyUI component variants behind a Show all variants toggle by @sbuchweitz in #207
- fix(editor): correct hosted MCP-connector plan copy (Claude.ai free; ChatGPT Developer mode) by @sbuchweitz in #208
- fix(editor): soften ChatGPT connector note — Developer mode is a staged beta reachable on free accounts by @sbuchweitz in #209
- feat(api): split content:delete from content:write for agent keys by @sbuchweitz in #210
- feat(editor): default the page editor to the Content Editor + always-on editable outlines by @sbuchweitz in #211
- feat(editor): user/account menu — change email + password, relocate access keys by @sbuchweitz in #212
- docs(schema): tell agents that deleting needs the content:delete capability by @sbuchweitz in #213
- feat(editor): field-name label badges on the in-preview editable outlines by @sbuchweitz in #214
- feat(auth): TOTP two-factor authentication (enrol, login gate, recovery codes) by @sbuchweitz in #215
- fix(editor): color picker popover no longer covered by the next settings card by @sbuchweitz in #216
- fix(editor): header tabs use the shared gradient active + hover styling by @sbuchweitz in #217
- feat(editor): richer WYSIWYG toolbar + view/edit HTML source modal by @sbuchweitz in #218
- feat(editor): dataset editor UX overhaul by @sbuchweitz in #219
- feat(auth): passkeys (WebAuthn) — passwordless login + Security-tab management by @sbuchweitz in #220
- feat(blocks): {{#sw-folder}} helper — iterate a media folder (galleries / file lists) by @sbuchweitz in #221
- feat(editor): sticky Save + Discard group on the settings pages by @sbuchweitz in #222
- chore(auth): expired-auth-row sweep + recovery-codes-remaining in Security tab by @sbuchweitz in #223
- feat(editor): rename a dataset (name + slug migration) by @sbuchweitz in #224
- feat(editor): {{sw-control}} — content-editor-only control for page + page.data values by @sbuchweitz in #225
- feat(editor): floating per-section Save/Discard, clickable code cards, overlay scrollbar by @sbuchweitz in #226
- feat(editor): immediate stacked entrance animations (settings, pages, forms) by @sbuchweitz in #227
- fix(editor): align floating Save/Discard group with the first heading + header clearance on scroll by @sbuchweitz in #228
- feat(editor): drag-reorder dataset schema fields by @sbuchweitz in #229
- feat(editor): sw-control as="file" — pick an arbitrary uploaded file by @sbuchweitz in #230
- feat(settings): company Booking URL field (external reservation/appointment links) by @sbuchweitz in #231
- feat(auth): OIDC single sign-on — Relying Party flow + admin provider config (API) by @sbuchweitz in #232
- feat(auth): OIDC login UI — admin config, login buttons, set-a-password (editor) by @sbuchweitz in #233
- feat(blocks): {{sw-active}} helper for active nav-item styling by @sbuchweitz in #234
- refactor(schema): flatten page.seo onto the page (ogImage→image, drop seo.title) by @sbuchweitz in #235
- fix(api): bare empty 404 for unpublished/unknown published-site paths by @sbuchweitz in #236
- feat(nav): link-kind page placeholders — data model + nav/publish core (PR-A) by @sbuchweitz in #237
- fix(auth): OIDC "Add provider" no-op on plain-HTTP hosts (crypto.randomUUID) by @sbuchweitz in #238
- fix(api,editor): utf-8 site 403 + redirect to login on session expiry by @sbuchweitz in #239
- feat(editor): create + manage nav placeholders in the pages list (PR-B) by @sbuchweitz in #240
- feat(editor): proactively detect session expiry with a 60s /me poll by @sbuchweitz in #241
- feat(tailwind): nav + button effect schemes (CI-themed, contrast-safe) by @sbuchweitz in #242
- feat(nav): rich placeholder labels + dialog/anchor runtime + seed/docs (PR-C) by @sbuchweitz in #243
- feat(editor): no-code nav/button effects picker (Website settings) by @sbuchweitz in #244
- fix(publish): ship interactive component + dialog runtimes for code-first pages by @sbuchweitz in #245
- fix(schema): reject protocol-relative form redirectUrl (open-redirect guard) by @sbuchweitz in #246
- feat(blocks): real cross-browser baseline — modern-normalize + platform layer by @sbuchweitz in #247
- feat(auth): admin-gated self-registration + visible password policy by @sbuchweitz in #248
- fix(blocks): scrollbars actually apply (@supports gate) + .menu a + drop a{color:inherit} by @sbuchweitz in #249
- refactor(blocks): remove dead block-tree renderer + tree-scan paths (code-first only) — PR1 by @sbuchweitz in #250
- feat(branding): instance-settings storage + serving for admin white-label (PR1/2) by @sbuchweitz in #251
- fix(blocks): scrollbar thumb-only (70/100% primary, no track) + sticky footer by @sbuchweitz in #252
- refactor: delete legacy render-app + remove dead pattern entity (block-tree teardown PR-2a) by @sbuchweitz in #254
- feat(oidc): per-provider auto-register + PKCE compatibility toggle by @sbuchweitz in #253
- feat(branding): admin-panel white-label UI — name, gradient, logo (PR2/2) by @sbuchweitz in #255
- fix(blocks): solid no-transparency scrollbar + close the 12px footer gap by @sbuchweitz in #256
- feat(branding): brand-tinted drop-shadow glow (white-label follow-up) by @sbuchweitz in #257
- fix(blocks): re-add global a{color:inherit} (links inherit context colour, no UA blue) by @sbuchweitz in #258
- refactor: remove the partial block entity + binding/partial machinery (block-tree teardown PR-2b) by @sbuchweitz in #259
- feat(branding): brand-follow the input focus-ring + scrollbar by @sbuchweitz in #260
- feat(editor): replace emoji icons with lucide-react icons by @sbuchweitz in #261
- feat(editor): move section descriptions into "?" tooltips by @sbuchweitz in #262
- feat(blocks): code-first form embedding ({{sw-form}} + data-sw-form) + localizable cart strings by @sbuchweitz in #263
- refactor(seed): split seed-data.ts into apps/api/src/seed/ modules (verbatim move) by @sbuchweitz in #264
- refactor: drop Page.root + PageNode/block.ts — block-tree teardown complete (PR-2c) by @sbuchweitz in #265
- feat(seed): flagship example project — full feature showcase + complete German translation by @sbuchweitz in #266
- feat(seed): Spanish locale — the example project becomes fully trilingual (en/de/es) by @sbuchweitz in #267
- refactor(blocks): prune dead block-render RenderContext fields (teardown cleanup) by @sbuchweitz in #268
- feat(seed): flagship visual redesign of the example project by @sbuchweitz in #269
- feat(mcp): machine-readable component catalog + retire the redundant Accordion component by @sbuchweitz in #270
- feat(components): library-backed Carousel (Embla) + Lightbox (GLightbox) with vendored runtimes by @sbuchweitz in #271
- fix(components): reset slide margins — UA figure defaults broke Embla snap math by @sbuchweitz in #272
- feat(components): hero-slider primitives — data-active hook, press ripple, click-to-slide by @sbuchweitz in #273
- fix(components): slider polish — unbounded ripple, settle-deferred data-active, wrapper waves by @sbuchweitz in #274
- fix(core): extract {{sw-icon}}/{{sw-flag}} class args into the Tailwind candidate set by @sbuchweitz in #275
- fix(blocks): sw-active locale home pinned active across its whole locale tree by @sbuchweitz in #276
- fix(seed): hero chevrons size-10 → size-25 (60px rest / 70px hover) by @sbuchweitz in #277
- feat(components): data-item-align switch, size-paced ripple, wheel-arrow centering by @sbuchweitz in #278
- feat(components): data-kenburns hero primitive + data-item-align is horizontal by @sbuchweitz in #279
- fix(blocks): align nav hover-dropdowns to their trigger + bridge the hover gap by @sbuchweitz in #280
- feat: hero-slider global snippet + root-height convention (hero authoring simplified) by @sbuchweitz in #281
- feat(seed): Components hub + Slider/Lightbox child pages, dedicated slider variations by @sbuchweitz in #282
- feat(components): SmartPhoto-backed Lightbox (thumbnail strip, enlarge-from-thumbnail open, switches) by @sbuchweitz in #283
- fix(components): lift SmartPhoto lightbox above site chrome (z-index) by @sbuchweitz in #284
- fix(components): clean lightbox open animation + dune7-style arrows by @sbuchweitz in #285
- docs: canonical authoring-model reference (Widgets taxonomy) by @sbuchweitz in #286
- fix(components): lightbox open-animation/arrows/font polish + vendor-neutral class rename by @sbuchweitz in #287
- feat(schema): nested dataset fields (list/object) — data layer for Widgets by @sbuchweitz in #288
- feat(components): single-image + masonry lightbox examples by @sbuchweitz in #289
- feat(editor): recursive entry editor for nested list/object dataset fields by @sbuchweitz in #290
- feat(shop): per-channel order fields for WhatsApp/email checkout + email greeting by @sbuchweitz in #291
- feat: Widget provisioning — snippets declare datasets, page-save ensures them by @sbuchweitz in #292
- feat(components): one-line lightbox authoring + true mixed-aspect masonry by @sbuchweitz in #293
- feat(editor): sw-control number/color/date/select inputs + fail-loud unknown as by @sbuchweitz in #294
- feat(editor): brand DaisyUI toggles for all boolean settings + fix order-fields select width by @sbuchweitz in #295
- feat(widgets): first-class Widget registry — hero-slider becomes a data-backed Widget by @sbuchweitz in #296
- feat(editor): reveal display:none-hidden editable content + demo all sw-control inputs by @sbuchweitz in #297
- fix(editor): widen the schema.org business type modal (lg → xl) by @sbuchweitz in #298
- feat(blocks): chip styling for code/kbd/samp/pre in the site CSS baseline by @sbuchweitz in #299
- feat(components): data-gallery — group lightbox images across sections into one gallery by @sbuchweitz in #300
- feat(editor): Widgets rail — browse + insert system Widgets next to Snippets by @sbuchweitz in #301
- fix(editor): widen the business-type modal further (xl → 2xl) by @sbuchweitz in #302
- feat: wrap prose code samples in
(example project + SW interface) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/303 - feat(editor): overlay handles for occluded/hidden/off-screen editable content by @sbuchweitz in #304
- fix(editor): apply occluded/hidden text edits in place + unbreak sw-control e2e by @sbuchweitz in #305
- feat(widgets): hero-slider polish — HTML captions, Ken Burns toggle, prominent Add item by @sbuchweitz in #306
- feat(editor): dataset schema editor supports list/object field types with nested children by @sbuchweitz in #307
- test(e2e): unbreak suite-wide getByLabel('Password') strict-mode drift (~43 specs) by @sbuchweitz in #308
- feat(editor): "SiteWright Components" library reference (tab modal) + Lightbox docs by @sbuchweitz in #309
- feat(widgets): multiple Hero Slider configs + {{sw-control as="dataset-item"}} selector by @sbuchweitz in #310
- fix(editor): stop overlay handles flickering/disappearing on scroll by @sbuchweitz in #311
- feat(editor): SiteWright Components reference — all components + widgets, derived (stays in sync) by @sbuchweitz in #312
- fix(widgets): hero slider click-to-advance + click opens its config entry in the editor by @sbuchweitz in #313
- feat(editor): drift-guard the Template reference against the engine's registered helpers by @sbuchweitz in #314
- revert(editor): remove the overlay-handle system (back to in-place editing) by @sbuchweitz in #315
- feat(blocks): data-sw-src/data-sw-bg fill the lazy attribute (data-src/data-bg) when present by @sbuchweitz in #316
- fix(carousel): keep data-sw-entry on reparented slides so dataset sliders open their entry by @sbuchweitz in #317
- feat(editor): registries for data-sw-* directives, bindings & loop variables — derive the Template reference from them by @sbuchweitz in #319
- feat(i18n): dedicated translation catalog (website.translations) + {{sw-translate}} by @sbuchweitz in #318
- feat(editor): Editable-regions side-panel (reliable, no canvas overlays) by @sbuchweitz in #320
- fix(carousel): editor preview shows images (eager) + data-item-align drives Embla align by @sbuchweitz in #321
- feat(i18n): migrate seed chrome strings to website.translations + {{sw-translate}} by @sbuchweitz in #322
- fix(carousel): data-item-align center — first slide flush-left (don't justify an overflowing track) by @sbuchweitz in #323
- feat(editor): Regions panel shows real entry titles + a smaller tab by @sbuchweitz in #324
- feat(carousel): center is the default slide alignment by @sbuchweitz in #325
- chore(schema): remove legacy data-shape migrations (social-links + page-store) by @sbuchweitz in #326
- feat(i18n): editable data-sw-translate directive + content editor + locale-sync + Settings grid by @sbuchweitz in #327
- feat(editor): complete the dataset editor — field types, config, richtext, save UX, lists & list polish by @sbuchweitz in #328
- fix(editor): show the Regions rail only in content edit mode by @sbuchweitz in #329
- feat(i18n): cart strings + shared hero CTA via the translation catalog by @sbuchweitz in #330
- test(e2e): inline data-sw-translate editing → catalog persist + Settings grid by @sbuchweitz in #331
- feat(i18n/editor): make skeleton slots inline-editable (footer/nav chrome translations) by @sbuchweitz in #332
- feat(editor): {{sw-control}} can edit a GLOBAL website.data value by @sbuchweitz in #333
- feat(blocks): rename {{sw-rich}} → {{sw-html}} + broaden the HTML sanitizer (safe HTML + sandboxed iframes) by @sbuchweitz in #334
- feat(editor): nav-placeholder polish, translations modal, full-width code editors by @sbuchweitz in #335
- feat(authoring): require page.data. (drop data.) + rename parentPage → page.parent by @sbuchweitz in #336
- fix(editor): render placeholder labels via browser-safe icon helpers (not renderTemplate) by @sbuchweitz in #337
- refactor(authoring): rename datasets binding namespace data.* → dataset.* by @sbuchweitz in #338
- feat(shop): Enable-shop toggle + reserved-translation registry (auto-discoverable cart i18n) by @sbuchweitz in #339
- feat(editor): modals fade in from the top and fade out to the top by @sbuchweitz in #340
- feat(i18n): scoped translation keys + data-sw-translate across example pages by @sbuchweitz in #341
- feat(blocks): published-site Modal fades in from the top, out to the top by @sbuchweitz in #342
- feat(editor): page-list menu labels + unified page-editor toolbar (reload, both-mode tools) + dialog Enter/Esc by @sbuchweitz in #343
- feat(editor): infinite-scroll galleries + prominent shared search field by @sbuchweitz in #344
- test(blocks): guard the Modal fade-from-top transition by @sbuchweitz in #345
- feat(i18n,shop): collapsible scope groups + always-visible Translations & Labels + cart pulse by @sbuchweitz in #346
- feat(seed): demo pages for the remaining components — Tabs, Modal, CookieConsent, Forms by @sbuchweitz in #347
- feat(shop): all cart text translatable — currency + channel/field labels move to the catalog by @sbuchweitz in #348
- feat(blocks): auto close button + themeable defaults + blurred backdrop for Modal by @sbuchweitz in #349
- fix(editor): use shared SearchField in the template/components reference modal by @sbuchweitz in #351
- fix(blocks): global backdrop-close handler respects data-backdrop-close="false" by @sbuchweitz in #352
- feat(components): CookieConsent gains optional data-cookiename; drop redundant data-sw-block by @sbuchweitz in #353
- feat(shop): auto-surface shop. ghost rows from the configured channels/fields by @sbuchweitz in #354
- feat(blocks): Modal close button overhangs the corner (overflow-visible dialog) by @sbuchweitz in #355
- feat(blocks): deterministic block margins (zeroed) + lightweight .prose by @sbuchweitz in #356
- fix(components): viewport-center Modal + lock page scroll while open; thinner scrollbar by @sbuchweitz in #357
- feat(i18n): system translation scope for component runtime UI strings by @sbuchweitz in #358
- fix(i18n): carry system strings on (CSP-safe), not an inline script by @sbuchweitz in #359
- feat(components): lighter id-based Modal authoring ( + ) by @sbuchweitz in #360
- fix(blocks): un-break the block-margin reset (a comment closed itself early) by @sbuchweitz in #361
- feat(shop): polish cart drawer — solid neutral scheme, thumbnails, one-row line controls, scroll lock by @sbuchweitz in #362
- feat(shop): rename cart_subtotal → cart_total; compact qty button group by @sbuchweitz in #363
- feat(preloader): page-preloader skeleton slot + no-code effect picker (9 effects) by @sbuchweitz in #364
- feat(blocks): smaller nav-dropdown radius + keep lightbox image clear of the rail by @sbuchweitz in #365
- fix(preloader): trigger on ANY internal link (same-origin resolve) by @sbuchweitz in #366
- fix(preloader): save preloader change + 400ms min; rename effects section by @sbuchweitz in #367
- feat(shop): qty stepper — pill button group, Lucide +/− icons, 1.5rem buttons by @sbuchweitz in #368
- feat(core): pages namespace — cross-page data access by slug path by @sbuchweitz in #369
- feat(preloader): ~2x larger effects + smooth fade-in to match fade-out by @sbuchweitz in #370
- fix(shop): cart close icon rotates around its centre on hover by @sbuchweitz in #371
- fix(preloader): instant on fresh load, fade-in only on internal-link navigation by @sbuchweitz in #372
- fix(components): lightbox image fills more space + stays centred (incl. zoom) by @sbuchweitz in #373
- fix(components): revert lightbox fit overrides; shrink thumbnail rail instead by @sbuchweitz in #374
- feat(components): simpler Tabs markup + magic selector, fade-in & ripple by @sbuchweitz in #375
- feat(components): HTML tab labels via a data-sw-part="tabtitle" child by @sbuchweitz in #376
- fix(components): tall modals scroll their body (keep the overhanging close button) by @sbuchweitz in #377
- docs(components): document tabtitle as optional/fallback/mixable + showcase the mix by @sbuchweitz in #378
- feat(components): DateTimePicker — CI-themed Air Datepicker (date/range/datetime/time) by @sbuchweitz in #379
- feat(components): DateTimePicker dual-panel range (swap to Vanilla Calendar Pro) by @sbuchweitz in #380
- fix(deps): patch hono CORS advisory via pnpm override (>=4.12.25) by @sbuchweitz in #381
- fix(components): polished DateTimePicker theme (recolour the vendor look) by @sbuchweitz in #382
- feat(components): DateTimePicker light/dark mode + clean time-only picker by @sbuchweitz in #383
- feat(base-css): dark-mode-aware code/pre + modal backdrop + attractive inputs by @sbuchweitz in #384
- feat(color-schemes): opt-in light/dark via prefers-color-scheme (PR 1 — foundation) by @sbuchweitz in #385
- feat(theme): visitor dark/light toggle + editor settings + token docs (color-schemes PR 2) by @sbuchweitz in #386
- feat(effects): replace nav effects with curated showcase set + JS runtime by @sbuchweitz in #387
- feat(editor): sort nav/button/preloader effect pickers alphabetically by @sbuchweitz in #388
- feat(effects): "None / Custom Code" slots with fork-from-built-in editor by @sbuchweitz in #389
- feat(effects): polish the custom-code fork UI by @sbuchweitz in #390
- docs(mcp): document custom effect code for agents by @sbuchweitz in #391
- refactor(mcp): split agent instructions into a small core + on-demand guides by @sbuchweitz in #392
- test(editor): de-flake Project.roles page-list assertions by @sbuchweitz in #393
- feat(mcp): add a design agent guide (flagship section patterns + visual craft) by @sbuchweitz in #394
- feat(mcp): preview_page returns screenshots so agents can SEE their work by @sbuchweitz in #395
- perf(docker): cache the Chromium layer across code-only deploys by @sbuchweitz in #396
- feat(preview): always-on whole-site draft preview (live browse + auto-navigate) by @sbuchweitz in #397
- fix(preview): render correctly under the sandbox (cross-origin assets + drop preloader) by @sbuchweitz in #398
- feat(deploy): build the site at deploy time (no prior publish required) by @sbuchweitz in #399
- feat(deploy): Local Hosting as an opt-in deploy target (clean break) by @sbuchweitz in #400
- feat(deploy): Deploy split button + target picker (completes the reframe) by @sbuchweitz in #401
- feat(deploy): git deploy target — commit the built site to a branch (HTTPS token) by @sbuchweitz in #402
- feat(deploy): SSH-key git deploy targets (git binary + openssh) by @sbuchweitz in #403
- fix(preview): signed-path preview so the sandboxed draft can navigate (+ shareable link) by @sbuchweitz in #404
- fix(local-hosting): carry the preview-token gate in a cookie so in-site nav stays clean by @sbuchweitz in #405
- feat(site-import): import an external website into a Sitewright project (PR1) by @sbuchweitz in #406
- feat(site-import): ZIP/HTML upload intake (PR2) by @sbuchweitz in #407
- feat(mcp): expose snippets + a get_reference authoring tool to agents by @sbuchweitz in #408
- feat(mcp): media tools — list_media + import_image (from a URL) by @sbuchweitz in #409
- feat(site-import): editor import wizard (PR3) by @sbuchweitz in #410
- docs(agent): guides for snippets/widgets, the i18n catalog, page.children & nested data by @sbuchweitz in #411
- feat(site-import): AI-rewrite handoff (PR4) by @sbuchweitz in #412
- fix(media): import_image follows redirects + MCP stock providers derive from the schema by @sbuchweitz in #413
- feat(sites): subdomain routing for locally-hosted sites (.) by @sbuchweitz in #414
- feat(site-import): connect-pinned fetch (SSRF) + headless SPA rendering (PR5) by @sbuchweitz in #415
- feat(site-import): self-host + rewrite CSS url() images (PR6) by @sbuchweitz in #416
- feat(site-import): multilingual hreflang → locale variants (PR7) by @sbuchweitz in #417
- feat(site-import): infer datasets + {{#each}} from repeated content (PR8) by @sbuchweitz in #418
- feat(site-import): accurate-replica fidelity — full CSS, lazy images, self-hosted fonts by @sbuchweitz in #419
- feat(site-import): import media + capture fidelity (transparency, WebP, embeds, lazy assets) by @sbuchweitz in #420
- perf(docker): use chromium-headless-shell for screenshots (−390MB image) by @sbuchweitz in #421
- perf(docker): strip Mesa/LLVM (−225MB) + CI snapshot smoke in the runtime image by @sbuchweitz in #422
- feat(site-import): editable output — host imported CSS as a linked stylesheet by @sbuchweitz in #423
- feat(preview): 5 screenshot breakpoints (WQHD→mobile) + larger height caps by @sbuchweitz in #424
- feat(preview): default preview_page to fullhd + tablet + mobile by @sbuchweitz in #426
- feat(site-import): hoist all shared chrome into slots + pretty-print page source by @sbuchweitz in #425
- feat(site-import): import polish — pretty slots, folders, dataset naming, JS hosting, fidelity fix by @sbuchweitz in #427
- feat(revisions): content version history — backend (PR1) by @sbuchweitz in #428
- feat(preview): run imported site JS in the sandboxed preview (Fetch-Metadata gated) by @sbuchweitz in #429
- feat(revisions): editor history UI — pages, datasets, settings (PR2) by @sbuchweitz in #430
- feat(sites): run a local site's JS on its isolated subdomain origin + __Host- session cookie by @sbuchweitz in #431
- feat(revisions): MCP tools — list_revisions + restore_revision (PR4) by @sbuchweitz in #432
- fix(forms): subdomain-hosted form submissions + CORS check across local hosting targets by @sbuchweitz in #433
- feat(revisions): dedicated project-wide History viewer (PR3) by @sbuchweitz in #434
- fix(deploy): guard remote deploys against silently-broken forms + form E2E across all targets by @sbuchweitz in #435
- feat(revisions): coalesce + retention as admin settings (default 0) by @sbuchweitz in #436
- fix(import): editor preview must not Tailwind-compile an imported page's foreign classes by @sbuchweitz in #437
- feat(deploy): edit deploy targets in place + Minify for all target types by @sbuchweitz in #438
- feat(deploy): deploy-target configuration wizard (Local Hosting + edit + minify) by @sbuchweitz in #439
- refactor(config): slim runtime env — one data dir, persisted-role admin, closed-by-default registration by @sbuchweitz in #440
- feat(auth): auto-generate + rotate the session signing key (drop required COOKIE_SECRET) by @sbuchweitz in #441
- feat(auth): admin-settable failed-login throttle (replace SW_AUTH_RATE_LIMIT_MAX) by @sbuchweitz in #442
- feat(auth): force a password change on first login for the default-password admin by @sbuchweitz in #443
- feat(auth): skip the forced default-password change in development by @sbuchweitz in #444
- fix(agent): nativize an imported site = faithful port, not a redesign by @sbuchweitz in #445
- feat(blocks): WebGL animated backgrounds (shader-bg) + editor picker by @sbuchweitz in #446
- feat(editor): shader-bg picker — wider layout, color schemes, optional overlay by @sbuchweitz in #447
- feat(blocks): per-button button-effects scheme (28 effects + shapes + accents) + Button Builder by @sbuchweitz in #448
- fix(blocks): button corner radius on a.btn + plain example buttons by @sbuchweitz in #449
- refactor(blocks): vendor our own .btn (drop daisyUI's button component) by @sbuchweitz in #450
- feat(blocks): component buttons (cookie/form/cart) use the vendored .btn by @sbuchweitz in #451
- fix(blocks): effect hover suppressed by vendored baseline (:where) + Button Lab/Builder UX by @sbuchweitz in #452
- fix(editor): pad the Button Effects settings modal + harden preview brand-var read by @sbuchweitz in #453
- fix(api): page-editor preview compiles the site-wide effect/shape/accent schemes by @sbuchweitz in #454
- feat(datasets): file/folder field types + CodeMirror JSON editor by @sbuchweitz in #455
- test(e2e): update dataset specs to the current editor UI by @sbuchweitz in #456
- feat(blocks): cart toggle → sidebar tab ("Shopping Cart") + drawer no-shrink + skewed padding by @sbuchweitz in #457
- feat(datasets): short auto entry keys, publish-by-default, fix example reference target by @sbuchweitz in #458
- fix(blocks): add-to-cart + cookie buttons = "btn btn-sm"; cart tab hover grows (no edge gap) by @sbuchweitz in #459
- fix(blocks): cart drawer close layout-shift + tab solid bg / bigger pulse / ripple by @sbuchweitz in #460
- fix(publish): dataset loops + keyed access render published entries only by @sbuchweitz in #461
- fix(webauthn): derive RP origin from X-Forwarded-Proto/Host behind a TLS proxy by @sbuchweitz in #462
- feat(editor): move Logout to a new account dropdown (Account Settings + Logout) by @sbuchweitz in #463
- feat(blocks): back-to-top button (default-on, bottom-center, hidden on mobile) by @sbuchweitz in #464
- feat(editor): invited clients get full editing + revamped invite landing by @sbuchweitz in #465
- feat(blocks): back-to-top — larger, solid btn-primary, slide-only (no fade) by @sbuchweitz in #466
- feat(access): protect agency staff in project members + import owner-only by @sbuchweitz in #467
- feat(blocks): parallax / scroll-linked property engine (translate · opacity · scale · blur) by @sbuchweitz in #468
- feat(auth): invite-only access model — staff-only projects, no self-registration, OIDC existing-or-invited by @sbuchweitz in #469
- feat(seed): parallax demo page in the example project (trilingual) by @sbuchweitz in #470
- feat(editor): Parallax builder — compose scroll effects + copy markup (no-code) by @sbuchweitz in #471
- docs(editor): parallax Library reference section (data-sw-parallax* lookup) by @sbuchweitz in #472
- feat(nativize): faithful homepage clone — container, page bg, fonts, sidebar, alpha overlays, global modals by @sbuchweitz in #473
- fix(blocks): inactive modals no longer block clicks/scroll (display:none when closed) by @sbuchweitz in #474
- fix(nativize): fidelity pass — chrome, dataset binding, rich text, sliders, buttons, floats by @sbuchweitz in #475
- fix(import): follow redirects (re-pinned per hop) + normalize oklab colors to sRGB by @sbuchweitz in #476
- feat(snippets): reference snippet cookbook — PR1 (sliders + primitives) by @sbuchweitz in #478
- fix(nativize): convert oklab/oklch colors to sRGB (Tailwind-v4 sites) by @sbuchweitz in #477
- feat(snippets): reference cookbook PR2 — lightbox/gallery, tabs, modal recipes by @sbuchweitz in #480
- fix(nativize): clean nav labels + keep inline SVG icons (Tailwind sites) by @sbuchweitz in #479
- feat(snippets): reference cookbook PR3 — forms, shop, cookie-consent, parallax & shader by @sbuchweitz in #481
- feat(nativize): re-fold expanded card grids back into {{#each}} loops (lower LOC) by @sbuchweitz in #482
- feat(nativize): fold repetitive tables — ignore per-row capture artifacts + constant cells by @sbuchweitz in #483
- feat(nativize): extract a shared template from same-parent pages (services → 1 template) by @sbuchweitz in #484
- feat(snippets): data-driven navigation reference recipes + nav guide (PR1) by @sbuchweitz in #485
- feat(nav): consolidate to one "Main Navigation" slot + default everywhere (PR2) by @sbuchweitz in #486
- fix(hero-slider): hide a slide's caption pill when the caption is blank by @sbuchweitz in #487
- fix(nav): mobile drawer scrolls vertically only + scope nav effects to .menu links by @sbuchweitz in #488
- fix(parallax-builder): pad the modal body + make the live preview legible by @sbuchweitz in #489
- fix(parallax-builder): make the preview actually animate (CSP-blocked runtime) by @sbuchweitz in #490
- feat(parallax): v2 engine — from→to motion, per-effect anchor windows + OUT, layer scenes by @sbuchweitz in #491
- feat: AI clone/nativize pipeline — foundation extractor + MCP media tools + Clone-with-AI (Steps 1–5) by @sbuchweitz in #492
- fix(site-import): foundation font extraction (semantic font vars, !important, icon fonts) by @sbuchweitz in #493
- fix(editor): preview scrollbar + Deploy label + System Library with no project by @sbuchweitz in #494
- docs(nativize): Step 6 closed — AI-clone pipeline validated live, epic complete by @sbuchweitz in #495
- feat(projects): soft-delete / restore / reap a project (+ orphaned-client cleanup) by @sbuchweitz in #496
- fix(preview): give the whole-site preview a real, visible scrollbar by @sbuchweitz in #497
- fix(nativize): brief v4 + foundation fixes (clean nav labels, drop foreign files, flag sidebar) by @sbuchweitz in #498
- fix(preview): drop the app gutter behind the preview + slim the iframe scrollbar by @sbuchweitz in #499
- fix(parallax-builder): readable contrast, toggles, working custom viewport + UX polish by @sbuchweitz in #500
- feat(parallax-builder): OUT viewport + HOLD range, live preview that keeps scroll by @sbuchweitz in #503
- feat(mcp): compare_to_source — agents self-correct against the live original by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/502
- docs(nativize): R33 site-wide website.data + R34 replicate component look by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/501
- feat(editor): click-to-open sidebar drawers (backdrop close, slide, ripple) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/504
- feat(api): cache source-reference screenshots at ingest for compare_to_source by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/505
- feat(content-editor): top-level overlay badge HUD for editable regions by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/506
- docs(agent): agent reorganizes the imported/ media tree into clean folders by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/507
- feat(snippets): normalize recipe-* names + description tooltips by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/508
- fix(content-editor): seat the region badge on the element edge (no dead zone) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/510
- feat(pages): explicit rawHtml setting; foundation imports render native (fix nativize deadlock) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/509
- fix(editor): sidebar tooltip clipping, backdrop-close vs page editor, hover side by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/511
- feat(example): richer Depth-scene parallax showcase (all channels in one view) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/512
- fix(render): screenshots capture the FULL page, not just the first viewport by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/513
- feat(content-editor): typed detail tooltips on every editable-region badge by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/514
- feat(blocks): Notice component — free-content dismissible banners (multiple, per-page) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/515
- feat(clone): full-page screenshots, chrome-slot validation, dataset-rename cascade, delete_media, eased interpolation by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/516
- feat(example): brand identity (logo/icon/OG) + live animated background & parallax by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/517
- feat(consent): Consent Manager engine — banner + per-category preferences + sw:consentchange by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/518
- feat(consent): integration registry + consent-gated script loading + per-site CSP by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/520
- feat(identity): one icon source → generated favicon, apple-touch & PWA manifest by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/519
- feat(consent): click-to-load embeds (YouTube / Maps) + per-page CSP frame-src by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/521
- feat(consent): no-code editor panel + agent guide + flagship example by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/522
- feat(datasets): underscore identifiers (dataset slugs + entry ids) + eq/ne helper + clone fidelity by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/523
- feat(consent): universal author-iframe gate, retire {{sw-embed}} by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/524
- feat(nav): sticky/fixed top-header modes (pinned / hide-on-scroll / shrink) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/525
- docs(nav): sticky-header entrance recipe + complete effects guide / Library reference by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/526
- fix(consent): persistence, close/animation, toggles, re-open, dirty-save by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/527
- fix(nav): mobile drawer full-height under a transformed sticky header (h-dvh) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/528
- feat(settings): change the main language (relabel) + smaller back-to-top button by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/530
- feat(consent): auto-inject banner (retire {{sw-consent}}) + overlay placeholder by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/529
- fix(blocks): back-to-top slide + wide-short shape + hide at page bottom; example footer cookie link by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/531
- fix(blocks): back-to-top transition must be !important to actually slide by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/532
- fix(blocks): modal keeps a 2rem side gutter on small screens (was 90vw → touching) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/533
- feat(cache): version published assets (?v) + editor cache headers + stale-tab reload by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/534
- feat(scrollspy): highlight the nav link whose in-page section is in view by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/536
- refactor(components): retire legacy CookieConsent + rename Notice → Banner by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/535
- feat(seed): ScrollSpy demo project (site-wide main-nav + custom on-page nav) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/537
- feat(banner): inline fade-out + data-aos entrance effects by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/539
- fix(scrollspy): work in the editor preview + smooth-scroll the nav anchors by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/538
- fix(nav-effects): scope per-element nav schemes so they don't collide with the site-wide one by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/540
- docs(banner): comprehensive Components demo page + catalog examples + agent guide by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/541
- fix(seed): drop justify-center from the example ScrollSpy page sections by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/542
- docs(consent): example Consent manager page — gated YouTube embed + GDPR framing by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/543
- fix(consent): strip data-sw-consent marker from held iframes (no banner-styling collision) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/544
- fix(consent): pin held-iframe placeholder to the iframe's natural box (no collapse) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/545
- fix(import): dedupe inferred entry ids across the whole import (foundation import was aborting) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/546
- fix(render): full-bleed .sw-bleed utility + tame UA list indent + clone-guide polish by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/547
- feat(import): foundation captures the source's real body background texture by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/548
- style(consent): restyle the gate placeholder (flex wrap, square corners, emphasized note) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/549
- fix(editor): dataset items open on click — image-covered tiles + renamed datasets by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/550
- feat(import): foundation auto-detects content width + guide pivots to no-padding container by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/551
- feat(pages): pages..children + correct the FB-iframe / cross-page-grid guide by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/552
- feat(import): capture full schema.org identity (subtypes, legalName/shortName, businessType, geo) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/553
- feat(bindings): collision-free pages.*._attributes + Custom nav slot + {{json}} + page.code/template by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/555
- feat(seo): absolute og:image + og:url/canonical fallback, og:site_name/locale + twitter tags, noindex settings toggle by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/556
- feat(settings): validate siteUrl format on input with a clear inline message by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/557
- test(schema): pin MCP docs' binding syntax to the engine (drift guards) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/558
- refactor(helpers): rename {{json}} → {{sw-json}} + guard against undocumented bare helpers by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/559
- feat(pages): a new page lands last under home instead of sorting in by title by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/560
- feat(ai): on-page AI assistant backend — streaming tool-use agent loop (PR A) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/561
- test(ai): restore coverage gate for the on-page assistant backend by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/562
- feat(editor): New page opens the full Page Settings modal (configure everything at creation) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/563
- feat(ai): AI assistant provider configuration — instance + per-project BYO (PR B) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/564
- refactor(editor): unify New-page + Page-settings modals on one language control by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/565
- feat(ai): first-connect consent grant for the on-page assistant (PR C1) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/566
- feat(ai): AI assistant settings UI — instance admin + per-project BYO (PR C2) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/567
- feat(editor): group the Page Settings / New Page modal into sections + status in header by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/568
- feat(editor): searchable Parent + Template selectors (SearchableSelect combobox) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/569
- feat(ai): on-page AI assistant chat drawer + first-connect consent (PR C3) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/570
- fix(editor): parent selector listed "/" twice — label nav placeholders by name by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/571
- feat(media): File Manager Recycle Bin — soft-delete + 90-day reaper by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/572
- fix(core): keep nav placeholders out of page.children + page.parent bindings by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/573
- fix(agent): large on-page edits no longer fail silently + clearer chat feedback by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/574
- feat(settings): "Test connection" for AI provider + Stock-image API keys by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/575
- perf(agent): Anthropic prompt caching + "build big pages in stages" guidance by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/576
- feat(agent): image & PDF attachments in the chat (upload + clipboard paste) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/577
- fix(agent): reliable multi-step chat streaming + clearer UX + stronger instructions by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/578
- fix(preview): sticky-header scroll class + preloader now work in preview by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/579
- feat(agent): AI chat sessions persist across a page reload by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/580
- feat(editor): live-refresh data views when the agent edits content by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/581
- feat(export): whole-project export to a self-contained zip by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/582
- perf(agent): cut screenshot token cost (prune stale shots, fewer/smaller previews) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/583
- fix(agent): informative validation errors + icon/concise-chat instructions by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/584
- feat(editor): persistent AI badge, non-modal drawer, markdown chat by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/585
- perf(agent): cache the conversation history (uploaded attachments no longer reprocessed) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/586
- feat(import): project zip import → new project + one-click duplicate by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/587
- feat(agent): OpenRouter attribution headers + prompt caching (OpenAI-compat path) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/588
- feat(settings): OpenRouter as a first-class provider option by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/589
- feat(media): store originals + on-demand responsive thumbnails by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/590
- fix(publish): materialize the preloader logo thumbnail (no dangling 404) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/592
- fix(agent): total-failure flail cap — interleaved reads no longer defeat the guard by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/591
- fix(agent): OpenAI-compat adapter double-emitted tool calls (Gemini/OpenRouter) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/593
- feat(agent): teach CHROME SLOT authoring (website.mainNav/footer) so header/footer aren't built as pages by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/594
- feat(datasets): dataset-scoped entry ids — clean, per-dataset-unique ids by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/595
- fix(export): ship retained originals only, skip the on-demand thumbnail cache (#590/#595 follow-up) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/596
- feat(agent): closing the chat keeps the turn running + a bigger, pulsing AI button by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/597
- fix(agent): weak-model write friction — put_content backfill, stock hint, viewport aliases by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/598
- feat(pages): menu label always-visible + required, new pages default into the main nav by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/599
- feat(agent): add_language / remove_language MCP tools (atomic locale scaffold) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/600
- docs(agent): translate = data only, never custom code (+ bound-text prerequisite) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/601
- fix(clone): faithful-clone fidelity — compare route, sw-date NOW, chrome-slot + honeypot fixes, tightened import guide by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/602
- docs(agent): FINE POLISH last-mile fidelity guidance for clones by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/603
- fix(import): never abort a whole import on one malformed inferred entry id by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/604
- fix(import): content-hash media dedup + local-font typography + fidelity guide gaps by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/605
- fix(import): support a subpath-hosted seed (…/sites/droombos/) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/606
- fix(preview): unblock whole-site draft preview on embed-bearing sites (CSP) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/607
- fix(authoring): default agent entries to published + tighten import guide by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/608
- fix(import): alias-font body role + reproduce the footer map embed (hardened) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/609
- fix(import): footer map uses {{sw-url}} helper (survives settings save) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/610
- feat(buttons): FACE and EFFECT as independent, composable axes by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/611
- feat(import): capture the header's left/right decorative images into the native navbar by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/612
- docs(agent): import guide — buttons via DaisyUI primitives + SW button axes by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/613
- feat(import): register captured 3rd-party widget scripts as functional consent integrations by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/614
- fix(editor): sort the Recycle Bin + remove dead MediaPicker by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/615
- feat(import): preserve imported/uploaded SVGs as sanitized vector images by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/616
- feat: SVG animation engine (data-sw-svg) + data-aos to data-sw-animation rename + unified runtime registry by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/617
- fix(import): keep hero overlays + strip dead HTML comments by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/618
- feat(mcp): scope list_content(entry) to one dataset via ?dataset= by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/619
- fix(import): real copyright year + document slot rules & form schema by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/620
- feat(forms): checkbox + radio field types (incl. multi-select groups) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/621
- feat: SVG Animation Studio (per-element visual editor) + draw-then-fill / in-out / img-inline / media save by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/622
- fix(svg-studio): fit any imported SVG to the canvas (viewBox-only icons no longer render blank) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/623
- feat(svg-studio): global settings tab + auto-loop preview + all-directions scroll replay by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/624
- feat(svg-anim): entrance-ready gate (preloader-coordinated) + no-FOUC + completion-driven preview loop by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/625
- fix(nativize): keep emitted Handlebars tokens intact through re-serialize (marquee build break) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/626
- fix(nativize): don't let oversized chrome slots abort the finalize (bottom-overflow) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/627
- fix(svg-anim): auto-repeat loop coordinates with the animation + click/scroll triggers by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/628
- feat(slots): extend chrome slot / head / css size caps for nativized content by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/629
- fix(nativize): keep the foreign CSS for the foundation-import capture (broken clones) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/630
- fix(svg-anim): draw-then-fill stroke stays visible on loop / replay (was held stroke-opacity:0) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/631
- fix(svg-anim): stronger blur effect (40px, was a too-subtle 6px) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/632
- feat(seed): composed logo-mark demo (auto-loop + all triggers) on the SVG page by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/633
- feat(svg-anim): loop + click on scenes & morph; loop every demo animation by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/634
- fix(import): strip foreign off-canvas mobile-nav drawers from page bodies by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/635
- feat(site-import): measurable clone-fidelity gate (computed-style diff) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/636
- feat(site-import): chrome-scoring + hover capture in the fidelity gate by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/637
- feat(projects): Project Settings modal — rename project name + slug by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/638
- fix(site-import): fidelity gate no longer measures an unstyled clone (double-slash preview URL) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/639
- ci: lint clone-fidelity gate tools with Node+browser globals by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/640
- test(editor): cover project-admin API methods to clear the coverage gate by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/641
- feat(fidelity-gate): score the chrome axes the gate was blind to (skew/weight/ls/radius/shadow/fixed/ripple/modals) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/642
- refactor(site-import): promote fidelity-gate diff to importable TS (foundation for universal MCP tool) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/643
- feat(fidelity): universal fidelity_check MCP tool — objective clone gate for every agent by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/644
- feat(compare): compare_regions — high-res 2× lossless-WebP header/footer crops for agents by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/645
- feat(agent): get_capabilities index + datasets guide + fix dataset write instructions by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/646
- feat(settings): put_content merge:true — patch a slot without reverting the rest by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/647
- docs(agent): fix nav-guide inaccuracies + document settings merge:true by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/648
- fix(fidelity): make the chrome gate accurate + convergent (measurement + fill + responsive-x) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/649
- fix(import): strip leftover foreign header/footer in foundation mode (no duplicate chrome) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/650
- feat(import): capture ALL foreign fonts into named slots (secondary/tertiary self-host) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/651
- feat(nativize): font-aware nativize — per-element font utilities + secondary/tertiary capture by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/652
- feat(clone): faithful-chrome authoring guide + component-block auto-pair + short nav labels by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/653
- feat(clone): clone_audit — the comprehensive acceptance gate the nativize loop terminates on by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/654
- fix(fidelity): position-aware chrome matching + deterministic capture (accuracy) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/655
- fix(fidelity): gate the chrome matcher's pass-2 fallback by distance by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/656
- feat(clone): make chrome fidelity advisory in clone_audit (reachable terminating gate) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/657
- fix(api): tolerate empty JSON body so bodyless DELETE stops 500ing by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/658
- feat(csp): route author
- fix(preloader): prefix state class sw-loading (DaisyUI collision) + no animate-out by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/660
- fix(preview): emit self-hosted @font-face + criticalCss in editor canvas previews by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/661
- fix(api): isolate static-asset + preview rate-limit buckets so asset fan-out cannot 429 the preview by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/662
- feat(buttons): Material z-depth shadow baseline (raised default, grows on hover) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/663
- fix(modal): viewport-scroll platform so a tall modal never clips the close button by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/664
- fix(modal): neutral panel + paint on body so overflow-hidden can't clip the close by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/665
- fix(modal): anchor open-focus to the panel top so a tall modal opens at its top by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/666
- feat(forms): default validation cues — red dot on invalid fields + greyed submit by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/667
- fix(forms): make the invalid-field dot UNLAYERED so it persists through field styling by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/668
- feat(modal): single modal open by default; data-allow-multiple opts into stacking by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/669
- feat(modal): staggered slower animations + one shared scrim kept across a replace by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/670
- feat(modal): lazy-load [data-sw-lazymedia] on open (nothing fetched on page load) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/671
- refactor(lazyload): video/audio lazy via the shared data-src runtime; drop data-sw-lazymedia by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/672
- feat(svg-studio): optional "clean up code" toggle strips editor cruft on import by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/673
- fix(svg-studio): overwrite-save now sticks + pretty-formatted export by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/674
- feat(svg-anim): blur short-fade/full-duration + draw-on-group draws every member by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/675
- feat(media): optional "Clean up SVG code on upload" in the file browser by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/676
- feat(clone): import effect-recovery + unbreak main CI by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/677
- fix(preview): PDF-embed placeholder + restore PDF/media interactivity by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/678
- feat(author-js): author JS on isolated origins, expiring + revocable previews; fix entrance-animation reveal/replay by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/680
- perf(deploy): incremental SFTP/FTP sync — tar fast-path, compression, concurrent fastPut, change-manifest by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/681
- perf(deploy): overlap + speed up the tar capability probe; show a Checking phase by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/682
- perf(deploy): content-hash cache-bust token so unchanged pages stop re-uploading by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/683
- feat(deploy): rsync-over-SSH transfer for SFTP targets (key + password auth) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/684
- feat(pagespeed): Lighthouse page-speed + SEO audit (route, MCP tool, editor panel) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/685
- harden clone capture + prompt against recurring lazy-map/shrink/motion/shadow misses by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/679
- feat(import): parent top-level pages under home (route-neutral) + fix nav by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/686
- feat(clone): autonomous embed-guarded SPA cloning (importer un-blind + media/fonts/icons + guides) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/687
- feat(clone): agent-callable import_website tool + route (clone a URL from a blank project) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/688
- fix(mcp): honor SW_PUBLIC_URL for OAuth/MCP issuer behind a TLS proxy by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/689
- feat(oauth): editable scope selection on the MCP consent page (default all capabilities) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/690
- feat(api): production hardening — hardened-by-default posture + readiness + env simplification by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/691
- feat(api): WAL-safe DB snapshot before pending migrations (upgrade rollback) by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/692
- feat(api,editor): admin ops settings — log level + DB backup management by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/693
- feat(release): tag-driven release pipeline — versioned GHCR image + CHANGELOG by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/694
- docs: deployment + environment reference, SECURITY.md, refreshed README by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/695
- chore(release): finalize CHANGELOG for 0.1.0 by @sbuchweitz in https://github.com/sitewright-cms/sitewright/pull/696
New Contributors
- @sbuchweitz made their first contribution in #1
Full Changelog: https://github.com/sitewright-cms/sitewright/commits/v0.1.0