ddcore 0.29
0.29.1 — 2026-10-18
No change an app would notice. Three API tests that still expected workspace entries a reader cannot open now follow the reader filter (#131), so the full suite passes again.
0.29.0 — 2026-10-18
Breaking
- A
Column Breakfield is no longer dropped with a warning. The fieldtype was removed in 0.4.0 and the loader quietly discarded such fields from older apps; it now refuses it like any unknown fieldtype, and a refused DocType stops the whole site from loading:ddcore dev,ddcore startandddcore migratefail with<DocType>: invalid fieldtype "Column Break" on field …. Upgrade: delete theColumn Breakfields from your DocTypes; a field's width comes from itswidth.
Fixed
- A reload that is refused no longer leaks the runtime pool. When
Engine.Loadrefused an app set (an invalid DocType, a failed extension, an i18n error), some of those paths left the freshly built JS runtime pool open; the pool is now closed on every refusal, and so is one whose first runtime fails to start or to report its metadata. - A workflow transition's response now carries the computed fields.
POST /api/workflow/applyreturned the document without runningonLoad, so a computed field was missing from it whileGETshowed it. - Insert and tree-children routes decode the DocType name in the URL. They read the raw route parameter, so a percent-encoded name did not match its DocType and the insert response skipped redaction.
- A Select whose options are a newline-separated string is now extracted for translation.
ddcore i18n extractskipped that form (whichValidateaccepts), so its options never reached the catalogue and rendered in English on a translated screen. It now also extracts list items that are not strings (numbers, say), so an app'sddcore i18n extract --checkmay report new missing keys: runddcore i18n extractafter upgrading and translate them. ddcore restorewrites the maintenance flag the way the engine does. It carried its own copy of the SQL, which resetsincewhen the flag was set again while already on and created the ops tables on the confined pool of a site with tenancy (#112). It now shares the engine's code.ddcore user unlocknow records anaccount.unlockaudit event and trims what was typed. The command line cleared the counters without leaving the trace the desk's unlock leaves, and it did not trim the address the way sign-in does, so a stray space cleared nothing. Only the command changed; unlocking from the desk still goes throughcore/services/users.ts.ddcore importstops cleanly on SIGTERM. It listened for Ctrl-C only, so akillor a container stop left a half-finished batch instead of cancelling the run; it now shares the signal handlingddcore restoreuses.ddcore jobs --sinceaccepts days.audittook7dandjobsrefused it; both now parse--sincethe same way (a Go duration or a number of days).ddcore webhooks listhandles-hand flags after arguments like the other commands. It used a bareflag.FlagSet; it now goes through the shared flag helpers, and its timestamp and error columns are formatted asddcore jobs listdoes.- Three CLI and loader messages that were in Portuguese are in English.
ddcore user addusage, the location line of a validation finding (in <file>) and the "DocType defined twice" error. - A record's history shows its status in the user's language. The
docstatusrow of a Version was hard-coded in Portuguese ("Rascunho", "Enviado", "Cancelado") whatever the language; it now goes through the catalogue (Draft,Submitted,Cancelled). - Five desk labels that were hard-coded in Portuguese now follow the language. A Link field's placeholder, clear and open-record labels ("Escolha o tipo antes", "Limpar …", "Abrir …"), and the Close and Clear buttons' accessible names in dialogs, the form's side panel and the history search.
- The print view's language picker lists the site's languages. It offered a fixed Portuguese, English and Spanish list whatever the site had installed; it now uses the languages the server reports at boot, as the profile does.
- A new document's defaults use the site's day, and Datetime defaults are an instant. A
default: "Today"was resolved in the browser's timezone, so a form opened near midnight could start a day off the server'stoday(); the same went for the due date marked overdue in a document's side panel, which counted in UTC. Both now use the site's timezone. The form also takes the server'stodayandnowkeywords (a Datetime starts at the current instant, no longer a bare date) and__user, which it used to show as text. - The desk no longer keeps every server message in memory.
onMessagealso removed the wrong listener when its unsubscribe function ran twice; listeners now live in a set and the unread message list is gone.