Skip to content

Releases

v0.12.2

Choose a tag to compare

@kenresoft kenresoft released this 23 Oct 13:43

Changed

  • URL fields no longer show "Choose from Media" by default. It invited picking a Media file where
    a web link belongs (a store listing, a repository). To keep it on a field, open Content types →
    the field → tick "Allow choosing a file from the Media Library". A plain URL field that already holds
    a Media file link now shows a warning instead of looking like a normal link. If a URL field of yours
    relies on the picker, tick that box once after updating; nothing else changes.

Fixed

  • Clicking the thumbnail of a chosen Media file (a media field, or a URL field that allows Media) now opens
    a larger preview, so editors can see what they picked.

v0.12.1

Choose a tag to compare

@kenresoft kenresoft released this 23 Oct 13:04

Changed

  • Dependency updates: Hono 4.13.13 (the API and plugins now require ^4.13.11) and Vite 8.3.5 for
    the admin build. No action needed beyond pnpm run update.

v0.12.0

Choose a tag to compare

@kenresoft kenresoft released this 23 Oct 12:19

Added

  • Duplicate check, human check and CSV export for forms — Forms → Edit form has two new
    settings. "Refuse duplicates on" takes field names (for example app, email for a waitlist): a
    submission with the same values as an earlier one is refused with 409, and email addresses are
    compared in lowercase. "Require a Turnstile human check" makes the public submit route verify the
    visitor's x-turnstile-token the same way sign-up does; it only applies when the deployment has
    TURNSTILE_SECRET_KEY set. The Submissions page has an "Export CSV" button (real submissions
    only; cells that start with =, +, - or @ are neutralised for spreadsheets).
    Email-type form fields are now stored trimmed and lowercased. Needs pnpm run update to apply
    the new migration (additive, existing forms and submissions are unchanged and keep allowing
    duplicates). The Astro client's forms.submit takes a turnstileToken option and sets
    KenresoftApiError.code, which needs @kenresoft-cms/astro and @kenresoft-cms/contracts to be
    published with this release.

v0.11.0

Choose a tag to compare

@kenresoft kenresoft released this 02 Oct 02:15

Added

  • Submission context — a form can now be "about" one published entry, such as a job application
    for a vacancy. Set the form's content type (Forms → Edit form → "About an entry of this content
    type") and submit to /api/v1/public/forms/{slug}/submissions?context={entry-slug}. The server
    resolves the published entry itself and stores it, with a title snapshot, on the submission, so
    the visitor can't point an application at another record. Optional rules refuse a submission when
    the entry isn't open (status = Open) or a closing-date field has passed. Staff see an "About"
    card on the submission, the owning account sees context in its submissions, and notification
    emails name the entry. Update emails get a {{context.title}} variable. Needs pnpm run update
    to apply the new migration (additive, existing forms are unchanged). The Astro client's
    forms.submit takes a context option: this needs @kenresoft-cms/astro 0.9.0 (which
    depends on @kenresoft-cms/contracts 0.8.0).

Changed

  • Job Application form template now has phone, a PDF/DOCX resume, a cover letter, LinkedIn and
    portfolio links and an additional-information box. Existing forms are not changed.

v0.10.0

Choose a tag to compare

@kenresoft kenresoft released this 29 Sep 08:43

Added

  • Pixabay in the Media picker — a "From Pixabay" tab with real keyword search, imported into
    your own library like any upload. Optional: set the free API key as a Worker secret
    (wrangler secret put PIXABAY_API_KEY); without it the tab explains how. Picsum stays as the
    no-key fallback. The key can be entered by an admin in Settings → API → Image sources (stored
    encrypted, never shown again; a PIXABAY_API_KEY Worker secret still takes precedence). Needs
    pnpm run update to apply the new migration.

Fixed

  • Scheduled publishing — it relied only on the 5-minute Cron Trigger, which never fires under
    wrangler dev and could lag on a deployment, and one failing entry could stop the whole sweep.
    Due drafts (entries and pages) are now also published from ordinary request traffic (throttled to
    once every 30s), each item is isolated so one failure can't block the rest, and the entry editor
    shows when a schedule will fire.
  • Email Templates — toggling Enabled no longer discards unsaved edits; the open email is kept in
    the URL (reload/Back work); leaving with unsaved edits asks first; custom-HTML emails no longer
    look "dirty" on open; preview failures are shown instead of hanging; branding is saved with one
    explicit button instead of a request per keystroke/color-picker tick.

Changed

  • Email Templates no longer has its own Developer options. Custom HTML for an email is offered
    when the deployment-wide Developer experience setting (Settings → API) is on.

v0.9.0

Choose a tag to compare

@kenresoft kenresoft released this 27 Sep 01:09

Added

  • Numbered releases. Kenresoft CMS now ships as versioned releases (v0.9.0 onwards), each a git tag, a GitHub release and a section of this changelog. Settings → Updates shows the version a deployment runs and whether a newer release exists, and Admins and Owners see an "Update available" notice in the sidebar. The check asks GitHub from the API Worker, cached for hours; a fork can point it at its own repo, or turn it off, with the new optional UPDATE_CHECK_REPO variable. The running version is only shown to Admins and Owners, never on a public endpoint. Maintainers cut releases with pnpm run release; the version rules and process are in docs/RELEASING.md. Requires publishing @kenresoft-cms/contracts 0.6.2 (the version endpoint's schema).
  • Account-linked form submissions. A form can now require a website account (Forms > Edit > "Require a website account"). Only a signed-in, verified account can submit it, and the submission belongs to that account. The owner is always taken from the session, never from the request. The account can then follow its own submissions from your site through a new account API, /api/v1/account/forms/submissions: list, detail, file downloads and messages. Another account's submission is always a 404. Anonymous forms work exactly as before.
  • Per-form progress stages. A form can have its own ordered stages (for example Submitted, In Progress, Completed). New submissions start in the first stage. Staff move a submission along from its detail page (PUT /api/v1/admin/forms/:id/submissions/:submissionId/stage), which records the change in a history the owning account can see. A stage is separate from the inbox status (new/read/archived), which the account never sees. If the form has an "Account page URL", the owning account gets an email when the stage changes, through a new admin-editable template, Request update (website account).
  • Two-way submission threads. The owning account can post messages with up to 5 files (PDF, DOCX or image, 10 MB each) from your site, and the form's notification recipients are emailed. Staff replies still go out by email as before, and now also appear in the account's view of the submission, with a link back to it in the email when the form has an Account page URL. Staff see account messages in the submission's conversation.
  • Accepted files per file field. A form's file field can be limited to PDF, Word (.docx) and/or images (Forms > field > "Accepted files", stored as config: { accept: ['pdf', 'docx'] }). The API checks the file's actual content against it, so a crafted request can't get around the browser's accept attribute. A field with nothing ticked accepts any supported file, as before.
  • @kenresoft-cms/astro 0.8.0: client.account.submissions (list, get, fileUrl, sendMessage), forms.submit() accepts FormData (for file fields) and sends the session cookie, and the /cms proxy forwards /api/v1/account/*. Update with npx @kenresoft-cms/create astro --update. Requires publishing, in this order, @kenresoft-cms/contracts 0.6.0 (the new account submission types, and the form and reply schema changes, which 0.8.0 depends on), @kenresoft-cms/astro 0.8.0 and @kenresoft-cms/create 0.3.3.
  • "Only one featured entry" per content type. A new switch on a content type (Content Types > a type > Edit) for a single spot such as a homepage hero. When it's on, featuring an entry un-features the one that was featured before, so a site asking for ?featured=true always gets exactly one. The entry editor says so before you save. Turning it on while several entries are already featured keeps only the most recently updated one. Off, the default, allows any number of featured entries, as before. Only Admins and Owners can change it. Requires publishing @kenresoft-cms/contracts 0.6.1 (adds singleFeatured to the content type schema).

Changed

  • pnpm run update now moves to the latest release instead of the tip of develop. It prints what's new since your version, and does nothing but redeploy when you're already on the latest release. pnpm run update -- --version 0.9.1 moves to a specific release. Following unreleased code is still possible for test installs with --branch develop or UPDATE_BRANCH=develop. It never downgrades; see "Rolling back" in docs/RELEASING.md. An install that was tracking develop is ahead of the first release and stays where it is until a release catches up with it.
  • npm create @kenresoft-cms@latest now starts a new install on the latest release instead of the tip of the default branch, so a fresh install runs the same released code pnpm run update moves existing installs to. With no releases yet it keeps the branch tip, as before. Requires publishing @kenresoft-cms/create 0.3.4.
  • A form submission with files is now all-or-nothing. Files are stored before the submission is created, and if any file, the submission or its attachment links can't be saved, everything already stored is removed and the API answers 500 with nothing kept. Before, a file that failed to store was skipped and the submission was still reported as a success without it. Messages with files from an account follow the same rule. An uploaded Media object whose database row can't be written is also removed from R2 instead of being left behind.
  • A file field no longer silently ignores an empty file someone actually picked: it's refused with "File is empty". A file input left blank still counts as no file. A macro-enabled Word document renamed to .docx is refused as unsupported.
  • Admin: a submission on an account-only form whose website account was later deleted now says the account is no longer available, where replies go instead, and labels the account's earlier messages "Former website account". The submission, its files and its thread stay fully workable for staff.
  • npx @kenresoft-cms/create astro managed files: the /cms proxy now reads PUBLIC_KENRESOFT_CMS_URL from the Worker's runtime variables first (on Node, the server's environment), then from the build. A site built without the variable, for example on a machine or Cloudflare Git build without it, no longer breaks every /cms call as long as the Worker has it at runtime. src/lib/kenresoft.ts marks its server client as pure, so a browser script that only imports browserCms no longer ships the API's address. Refresh with npx @kenresoft-cms/create astro --update.
  • @kenresoft-cms/astro: createCmsProxy without a URL now logs what's missing and answers 503 instead of crashing (which Astro turned into a blank 404), and createKenresoftClient without a URL throws an error naming PUBLIC_KENRESOFT_CMS_URL instead of "Cannot read properties of undefined (reading 'replace')".
  • Files attached to a staff reply are now kept as private Media, so the thread (and the owning account, for an account-linked submission) can download them later. Before, only their names were recorded and the file itself was only emailed. Older replies keep their name-only record. Deleting a submission also deletes these stored files.

Migration

  • 0056_account_linked_submissions.sql adds forms.requires_account / stages / account_submission_url, form_submissions.account_user_id / stage, and a form_submission_stage_changes table. It also rebuilds form_submission_replies to add direction and make to/subject nullable. Every existing reply is copied across as an outbound reply, unchanged. No data backfill is needed: existing submissions have no owner and no stage, and no account can see them. Applied by pnpm run update.
  • 0057_single_featured_content_types.sql adds content_types.single_featured, off for every existing content type, so nothing changes until someone turns it on. Applied by pnpm run update.

Fixed

  • A site's featured list now updates as soon as an entry is featured or un-featured. The public ?featured=true list was cached separately from the plain list and never cleared on save, so a change could take up to 5 minutes to show.
  • Checklists now show on one line on your site, whatever its CSS. A saved checklist used to put the checkbox and the item's text in separate blocks, so a site without checklist-specific CSS (most sites) showed a bullet with the checkbox on one line and the text on the next. Checklists are now saved as <li><input type="checkbox"> text</li> in a list with bullets turned off, which renders correctly with no CSS. The checkbox also carries a small inline style so a site-wide input { display: block; width: 100% } rule can't push it onto its own line. Checklists saved before this update are served in the new shape too, since the API rewrites the old markup when it delivers content. You don't need to re-save anything. A published page may keep showing the old layout for up to 5 minutes after you update, until its edge-cached copy expires.
  • Checklists no longer disappear when an entry is saved. The API's rich-text sanitizer removed the editor's checklist markup on every save, so a checklist came back as a plain bullet list, and a numbered list starting at 3 restarted at 1. It now keeps both, and every checkbox is stored as a disabled, display-only <input type="checkbox"> with nothing else of the original tag kept. Any other kind of <input> is still removed, and email HTML is unchanged. The same applies to the Page RichText and Raw HTML blocks.
  • Markdown checkboxes in the rich-text editor. - [ ] item / - [x] item written in Markdown mode now come back as a real checklist. Before, it only worked for a tight list: a blank line between items (common in blog posts), a numbered checklist (1. [ ] step), or a list mixing checkbox and plain items all lost their checkboxes. Plain GFM checkbox HTML pasted into HTML mode, or stored by the API or an entry import, is recognized too.
  • **Switching to Markdown mode and back no longer ch...
Read more