Repository navigation
Releases
Releases · kenresoft-technologies/kenresoft-cms
v0.12.2
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
v0.12.0
Added
- Duplicate check, human check and CSV export for forms — Forms → Edit form has two new
settings. "Refuse duplicates on" takes field names (for exampleapp, emailfor 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'sx-turnstile-tokenthe same way sign-up does; it only applies when the deployment has
TURNSTILE_SECRET_KEYset. 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. Needspnpm run updateto apply
the new migration (additive, existing forms and submissions are unchanged and keep allowing
duplicates). The Astro client'sforms.submittakes aturnstileTokenoption and sets
KenresoftApiError.code, which needs@kenresoft-cms/astroand@kenresoft-cms/contractsto be
published with this release.
v0.11.0
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 seescontextin its submissions, and notification
emails name the entry. Update emails get a{{context.title}}variable. Needspnpm run update
to apply the new migration (additive, existing forms are unchanged). The Astro client's
forms.submittakes acontextoption: this needs@kenresoft-cms/astro0.9.0 (which
depends on@kenresoft-cms/contracts0.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
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; aPIXABAY_API_KEYWorker secret still takes precedence). Needs
pnpm run updateto apply the new migration.
Fixed
- Scheduled publishing — it relied only on the 5-minute Cron Trigger, which never fires under
wrangler devand 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
Added
- Numbered releases. Kenresoft CMS now ships as versioned releases (
v0.9.0onwards), 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 optionalUPDATE_CHECK_REPOvariable. The running version is only shown to Admins and Owners, never on a public endpoint. Maintainers cut releases withpnpm run release; the version rules and process are indocs/RELEASING.md. Requires publishing@kenresoft-cms/contracts0.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'sacceptattribute. A field with nothing ticked accepts any supported file, as before. @kenresoft-cms/astro0.8.0:client.account.submissions(list,get,fileUrl,sendMessage),forms.submit()acceptsFormData(for file fields) and sends the session cookie, and the/cmsproxy forwards/api/v1/account/*. Update withnpx @kenresoft-cms/create astro --update. Requires publishing, in this order,@kenresoft-cms/contracts0.6.0 (the new account submission types, and the form and reply schema changes, which 0.8.0 depends on),@kenresoft-cms/astro0.8.0 and@kenresoft-cms/create0.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=truealways 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/contracts0.6.1 (addssingleFeaturedto the content type schema).
Changed
pnpm run updatenow moves to the latest release instead of the tip ofdevelop. 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.1moves to a specific release. Following unreleased code is still possible for test installs with--branch developorUPDATE_BRANCH=develop. It never downgrades; see "Rolling back" indocs/RELEASING.md. An install that was trackingdevelopis ahead of the first release and stays where it is until a release catches up with it.npm create @kenresoft-cms@latestnow starts a new install on the latest release instead of the tip of the default branch, so a fresh install runs the same released codepnpm run updatemoves existing installs to. With no releases yet it keeps the branch tip, as before. Requires publishing@kenresoft-cms/create0.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
.docxis 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 astromanaged files: the/cmsproxy now readsPUBLIC_KENRESOFT_CMS_URLfrom 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/cmscall as long as the Worker has it at runtime.src/lib/kenresoft.tsmarks its server client as pure, so a browser script that only importsbrowserCmsno longer ships the API's address. Refresh withnpx @kenresoft-cms/create astro --update.@kenresoft-cms/astro:createCmsProxywithout a URL now logs what's missing and answers 503 instead of crashing (which Astro turned into a blank 404), andcreateKenresoftClientwithout a URL throws an error namingPUBLIC_KENRESOFT_CMS_URLinstead 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.sqladdsforms.requires_account/stages/account_submission_url,form_submissions.account_user_id/stage, and aform_submission_stage_changestable. It also rebuildsform_submission_repliesto adddirectionand maketo/subjectnullable. 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 bypnpm run update.0057_single_featured_content_types.sqladdscontent_types.single_featured, off for every existing content type, so nothing changes until someone turns it on. Applied bypnpm run update.
Fixed
- A site's featured list now updates as soon as an entry is featured or un-featured. The public
?featured=truelist 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-wideinput { 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] itemwritten 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...