Skip to content

Releases: jaapstronks/deckyard

v1.17.0

Choose a tag to compare

@jaapstronks jaapstronks released this 05 Aug 15:06
087019c

1.17.0 (2026-08-05)

Added

  • analytics: anonymous viewers can erase their own data (session-token proof-of-possession) (#637) (52b7f41)
  • analytics: drop the internal/external tracking toggle, leaving analytics.enabled as the only switch (#635) (0172041)
  • api: carry ownerId as the identity in responses and compare it on the client (#640) (5d653d2)
  • authz: decide presentation ownership on users.id instead of the email string (#638) (1b5c229)
  • authz: decide the workspace grant against the actor's own organization (L10) (#639) (566d970)
  • identity: key user_settings on users.id (T10 PR E) (#643) (a0c2af9)
  • identity: verify and backfill the identity data migration (T10 PR G) (#646) (6ea1181)
  • notes: let the join link edit the session's speaker notes (#632) (e6823c9)

Fixed

  • analytics: make the identifier the scope on the last two org-blind seams (#629) (688c843)
  • collaborators: a failed invite insert answers 500, not 400 (#642) (d389a32)
  • db: honor DATABASE_URL over DATABASE_* in db:migrate (#631) (19a4f28)
  • export: queued exports load their theme through loadTheme (#641) (7f56e38)
  • share: branch the invite failure on e.code, not on the message (#645) (39e548a)

Security

  • analytics: drop sessionToken from the sessions list response (#636) (51cb500)
  • analytics: return a per-deck device label instead of the raw device id (#634) (23748b4)

v1.16.0

Choose a tag to compare

@jaapstronks jaapstronks released this 04 Aug 19:26
d4a16f3

1.16.0 (2026-08-04)

Added

  • authz: add owner/created_by/updated_by user_id to presentations (T10 PR 3) (#616) (aa0c591)
  • authz: add user_id to collaborators alongside user_email (T10 PR 2) (#613) (3a239c2)
  • authz: persist owner on PG ownership transfer (T10 tail) (a0fed94)
  • storage: move questions, interactions and feedback from disk JSON to Postgres (#606) (0a5b932)

Fixed

  • authz: scope collaborator rows on the deck, not the session (#626) (fdacfb2)
  • editor: make a failing language switch visible (#620) (596ee2f)

Security

  • share-links: rate-limit the public password verify (#628) (9cd3898)

v1.15.0

Choose a tag to compare

@jaapstronks jaapstronks released this 03 Aug 21:01
10f97db

1.15.0 (2026-08-03)

⚠ BREAKING CHANGES

  • slide-types: seven slide-type CSS classes are no longer emitted (team-cards-group-left, kpi-note, quote-author-text, poll-results-main, sfi-header, sfi-card-code, sfi-card-qr). No core stylesheet targeted them, so Deckyard's own themes are unaffected; a fork that styled any of these names against its own copy of the slide types must move those rules to the surviving class on the same element.

Added

  • i18n: tier UI locales - nl/en gated, ten best-effort (12c9bad)
  • import: complete the file→Postgres import path (#586) (53fe563)
  • ops: ship Postgres in the compose stack (#585) (4c93690)
  • sandbox: run sandbox TTL cleanup and quota on Postgres (#589) (3cd1d3d)
  • storage: default STORAGE_MODE to postgres with a boot guard for file data (#587) (12b9a3b)
  • storage: move email templates from disk JSON to Postgres (#602) (e6d2d35)
  • storage: move live sessions and follow codes from disk JSON to Postgres (#604) (96aa349)
  • storage: move settings from disk JSON to Postgres (#603) (e0c4072)
  • storage: remove the file storage backend (#595) (1825a2f)

Fixed

  • image-library: find image usage in the presentations table, not on disk (#601) (6a84975)
  • install: pass the local compose overlay and fail fast on a stale DATABASE_HOST (#598) (4ae2f0d)

Changed

  • auth: reuse the active membership for designer resolution (06d8122)
  • main: revert the 2.0.0 release bookkeeping, keep numbering in 1.x (51103e7)
  • slide-types: drop seven dead emitted CSS classes (#599) (6347085)

v1.14.0

Choose a tag to compare

@jaapstronks jaapstronks released this 03 Aug 10:33
2de22eb

1.14.0 (2026-08-03)

Added

  • slides: add role tokens and the slide-roles reference (role-vocabulary phase 1) (#571) (3309330)

Fixed

  • test: key slide-css gate scales per category + drop dead .slide-header rules (#576) (037d432)

Security

  • self-host Prism and KaTeX, loaded lazily by the app shell (B33) (#565) (c54bf9f)

v1.13.0

Choose a tag to compare

@jaapstronks jaapstronks released this 03 Aug 07:37
da821f0

1.13.0 (2026-08-03)

Added

  • bundled gradients as a licence-free image source (#560) (bc4a88f)
  • capture: hash the recipe module graph instead of the entry file (#545) (abe8d69)
  • ci: resolve every relative import, and make the doc gate fork-configurable (#550) (05f3cc1)
  • css: refine the spacing scale to 2px and gate its use (#553) (ad0c404)
  • test: the classes a slide type emits must resolve to a CSS rule (#554) (397955b)

Fixed

  • fonts: pin self-hosted Google Fonts and ship the Latin subsets (#546) (6fb558e)
  • slide-types: re-export SCHEMA_BASE_URI for the website generator (#564) (71de779)
  • slide-types: re-export SLIDE_STRUCTURES for the website generator (#558) (97d5e7b)
  • slide-types: re-export the runtime and interaction vocabularies (#559) (f0df831)

Security

  • self-host DOMPurify instead of loading it from a CDN (#563) (f200ec7)

v1.12.1

Choose a tag to compare

@jaapstronks jaapstronks released this 02 Aug 19:10
c57aed9

1.12.1 (2026-08-02)

Fixed

  • derive readable link colour for theme slide-background variants (#540) (52d61c9)

Changed

  • lazy-load Bunny Player.js in the live app (#542) (6385c82)

v1.12.0

Choose a tag to compare

@jaapstronks jaapstronks released this 02 Aug 14:52
976d305

1.12.0 (2026-08-02)

Added

  • editor: closed per-field editor vocabulary replaces the chart and table forms (#526) (d728ae4)
  • editor: one generic collection editor replaces the seven hand-built forms (#524) (7e465ef)
  • editor: resolve itemDefaults per deck language via itemDefaultsByLang (#527) (1289c6b)
  • editor: the image forms become declarations and the shared element card (#528) (abfd48d)
  • editor: the slide-list label reads the labelField declaration (#530) (ac406c0)
  • jobs: schedule the three unwired retention cleanups (#537) (ff2d96f)
  • slide-types: per-type CSS claimed in the TYPE_CSS manifest (seam-collapse gate point 6, PR 1) (#534) (06e3253)

Fixed

  • i18n: ?lang= is the only UI-locale URL param, the ?locale= alias is removed (#529) (12c4646)
  • i18n: let ?lang= URL param outrank the saved uiLocale for the session (#520) (95ee83f)
  • quote-slide: the editor canvas stops reflowing on focus, and a delegated control stops looking broken (#525) (c9337e0)

v1.11.0

Choose a tag to compare

@jaapstronks jaapstronks released this 01 Aug 15:54
74296a7

1.11.0 (2026-08-01)

Added

  • api: canonicalize slides[].type on export/read; drop slideTypes manifest (#514) (2dffe2b)
  • api: one write-seam validates and normalizes slides[].type (#511) (0e2973d)
  • capture: tranche-2 marketing recipes for the /features page (#512) (e723f42)
  • organizations: invite people, and let members reach the member list (94442eb)
  • organizations: organization profile screen, with delete for the owner (#498) (2773f6c)
  • slide-types: three tiers and a fallback facet that enforces them (#502) (eba33ec)
  • slide-types: v3->v4 migration folds stored type spellings to the registry key (#515) (8db6bff)
  • spec: open the published schema and make structure normative (#504) (fea73f0)
  • spec: reverse-DNS type ids, -slide dropped, and the evolution rule (#506) (dfe1f0b)

Fixed

  • export: anchor slide base font to theme, stop app-chrome font leaking into PDF (37afb40)
  • export: inline local url() assets and blank unfetchable images (#488) (e3b43e1)
  • export: stop blurred shadows reaching the PDF as luminosity masks (#492) (6e04a5c)
  • i18n: Dutch field labels for countdown/custom-html/embed/lead-capture/matrix/process slides (#518) (4d27091)
  • i18n: one permission-label helper, Dutch comparison/timeline field labels (#513) (70c9eb8)
  • organizations: report invitations that were sent, administer the organization you are in (#500) (084601b)
  • slide-types: a fork override of a core name reaches the browser (#507) (a77958c)
  • theme: declare the generated slide gradient where its coordinates live (#493) (8ba7a2e)
  • title-slide: stop left logo corner from shifting the title block (eac3aeb)

Changed

  • export: cap PDF images at their display size, not source resolution (#497) (d83216f)
  • export: rasterize gradient slide backgrounds in the PDF export (1181d7f)
  • export: rasterize visible gradient pseudo-element layers too (#491) (017c058)

v1.10.0

Choose a tag to compare

@jaapstronks jaapstronks released this 31 Jul 07:50
3e0df4e

1.10.0 (2026-07-30)

Added

  • capture: bilingual lemonade-stand sample deck for the marketing shots (#454) (1bdbacc)
  • capture: the tranche-1 marketing recipes, and three fixes they surfaced (#456) (1fc63d5)
  • deck-format: point schema $id at deckyard.eu and license the spec under CC0 (#441) (cddf708)
  • kpi-slide: let a theme colour the KPI tiles through tokens (#438) (ed14676)
  • ops: add maintenance mode so a deploy stops failing saves silently (#447) (23bf94f)
  • organizations: add an organization switcher to the user menu (#446) (33f231d)
  • organizations: gate admin UI on the membership role of the active org (#449) (6be2c55)
  • organizations: manage the member list from the Users tab (#486) (3dcd05e)
  • organizations: the Users tab becomes the member list in multi-org (#484) (0503117)
  • scripts: rename migration lijstje-slide → list-slide, on both stores (#464) (4e6f999)
  • slide-types: assert no duplicate types and no lossy layout variants (#457) (5d56ae2)
  • slide-types: declare the runtime facet so nine modules stop guessing (#460) (3cbfb32)
  • slide-types: declare the structure facet and guard it in CI (#453) (dd42f93)
  • slide-types: derive the name-branching inventory so the matrix has no hole (#458) (e36b96e)
  • themes: a green/brass brand theme, and it becomes the default (#455) (f239adf)
  • video-slide: let the author set the watch link shown in exports (#434) (67e55b2)

Fixed

  • comments: recognise AI suggestions by the effective author identity (#442) (95da202)
  • deps: reflect the optional dependency story in the manifest (B6-C4) (#431) (9184d21)
  • drop a stray node_modules symlink that rode along in #460 (#461) (09a9c63)
  • editor: stop redundant slide-list rebuilds from lock/comment SSE echoes (#435) (8f466a1)
  • export: render the video poster in PDF/PNG placeholders (#433) (a14922d)
  • i18n: detect duplicate keys in i18n:validate over raw lines (#439) (a1dfa9b)
  • slide-types: make the aggregator seam registry-first, and put the companions on the wire (#473) (a83927e)
  • slides: three lemonade-stand defects — list alignment, nested-surface contrast, slide-copy language (#463) (fcf7a3a)
  • spec: stop publishing legacy fields in the JSON Schema (#452) (3a2334b)
  • storage: stop partial writes from erasing deck columns (#440) (71f9a16)

Changed

  • editor: debounce the slide-search rerender (#437) (a5a8f3f)
  • editor: patch slide-list lock indicators in place instead of rebuilding (#436) (410986c)
  • export: ship viewer CSS, not the 630 KB editor bundle (#462) (b9dd8a2)
  • thumbnails: warm the deck raster on save, debounced per deck (#426) (5bbc8a2)

v1.9.0

Choose a tag to compare

@jaapstronks jaapstronks released this 27 Jul 13:21
1ca5b5b

1.9.0 (2026-07-27)

Added

  • lint: add advisory dead-CSS-selector scanner (#424) (3c48ed1)
  • table-slide: add cornerCell to colour the whole top row (#418) (ac15833)

Fixed

  • ai: accept rows[]-canonical text-blocks slides in the refine schema (#420) (0bee87e)
  • slide-locks: make acquire atomic to stop a delete-then-insert 500 (#423) (a30996a)
  • thumbnails: stop invalidating deck rasters on unrelated saves (#422) (87ca965)