Skip to content

Releases

PU — EmuFramework v1.4.1

Choose a tag to compare

@emu479p01 emu479p01 released this 23 Oct 13:54
466bc7b

PU — EmuFramework v1.4.1

Summary

Update the framework runtime to Node.js 24.22.1 for the October 2026 security fixes and validate application and updater containers before publishing.

Fixes

  • Upgrade Node.js from 24.18.0 to 24.22.1 in development guidance, CI, release builds and both container images. Supported Node.js ranges now start at 22.23.4 and 24.22.1.
  • Replace the deprecated pnpm 11.12.0 release with 11.25.0 across the toolchain, retaining the existing dependency lockfile.
  • Upgrade workflow actions to versions declaring the Node.js 24 runtime and add repository version checks to CI.
  • Build both images before publishing either image. Validate their Node.js version, application SQLite native binding, startup health and restart health in CI and release workflows; publish the same validated images.

Breaking changes and migration

No application API, metadata or database schema changes. Source installations must update Node.js to a supported patched version before installing dependencies.

Upgrade notes

Back up the data and designer databases together. Upgrade both application and updater images to 1.4.1; replacing only the host Node.js does not update container runtimes. Source installations should use Node.js 24.22.1 and pnpm 11.25.0 and reinstall with the frozen lockfile. TLS validation is stricter upstream; integrations relying on non-canonical IP hostnames or revoked certificates may need corrected endpoints or certificates.

Validation

Validated locally on Node.js 24.22.1 and pnpm 11.25.0: frozen-lockfile installation, version consistency, PU release policy, type checking, production build, and 348 automated tests passed (one optional legacy-backup fixture skipped). Both Linux amd64 images built successfully; runtime version, SQLite native binding, startup and restart health checks passed. The existing persistent-database upgrade check passed from 1.3.0 to 1.4.1. Both GitHub workflows passed actionlint. GitHub CI is required before merge; this release has not been published.

Known issues

Registry publication of two images is not atomic: an upload failure can still leave only one versioned image published. Both images are built and checked before uploads begin, and latest tags are updated only after both versioned uploads succeed. Existing 1.4.0 application limitations still apply.

FU — EmuFramework v1.4.0

Choose a tag to compare

@emu479p01 emu479p01 released this 28 Sep 14:43
2741e97

FU — EmuFramework v1.4.0

Summary

Draft-based record creation, audit field aliases, UTC datetimes, image input for Functions, configurable branding and collapsible deployment previews.

Improvements

  • New records open as encrypted, user-bound drafts: initValue results (including read-only document numbers) are shown without inserting a row, and saving is atomic, retry-safe and survives a restart. Expired drafts, other users' drafts and drafts created before a metadata change are rejected; failed saves roll back and keep the draft usable.
  • Read-only virtual audit fields sys_createdBy, sys_createdAt, sys_modifiedBy and sys_modifiedAt can be listed, filtered, sorted and used in Views. Updates preserve the original creation audit and ignore forged audit values.
  • Datetimes are stored and returned in UTC and shown in the browser time zone. Numbers are displayed with grouping; IDs, references and strings are not reformatted.
  • Functions can declare imageInput to receive JPEG, PNG or WebP images attached to a record, selected from files or the camera. Uploads are deduplicated, signature-checked, permission-checked and retried per file. WebP attachments can be previewed.
  • EMU_APP_TITLE brands the browser title, login and setup pages. Deployment previews start collapsed with counts and show where moved or deleted artifacts came from.

Breaking changes and migration

Lifecycle hooks (initValue, validateWrite, validateDelete) and data event handlers must be synchronous; async functions or returned Promises now raise an error instead of running outside the transaction. Move awaited work into an async Function. System field names are reserved case-insensitively, and schema sync stops without changes if a stored column collides with an audit alias. Datetime values without an offset are interpreted as UTC and returned with Z. Table metadata from /api/metadata now includes the system fields.

Upgrade notes

Back up the data and designer databases together. Update application and updater images together to 1.4.0. Draft storage is created automatically; no data migration is required. Review scripts for async lifecycle handlers before upgrading. Read Record lifecycle, audit fields and Function images for details.

Validation

Version consistency, type checking, production builds and automated tests pass on Node 24 (135 core, 45 client, 162 server and 6 release-policy tests; one optional legacy-backup fixture test is skipped). The 1.3.0-to-1.4.0 persistent-database upgrade check passed for existing login, business/audit/datetime data, CUS extension fields, existing initValue scripts, Recent/Favorites, legacy package preview, and an encrypted draft saved after restart. This branch is not published.

Known issues

Drafts invalidated by a metadata change must be reopened; entered values stay in the open page but are not transferred automatically. Uploaded images remain attached when the Function fails. External side effects cannot be rolled back. New long-tail administration/Designer labels remain English.

FU — EmuFramework v1.3.0

Choose a tag to compare

@emu479p01 emu479p01 released this 22 Sep 13:43
9f205f0

FU — EmuFramework v1.3.0

Summary

App-local Recent navigation, selected-model deployments, Apps & Models administration, and optional offline ISV licensing.

Improvements

  • Sidebar activity follows the original app menu, including Recent shortcuts and record detail routes. Recent history retains ten entries per user per app, with a separate Settings history and existing Favorites preserved.
  • Designer builds complete selected-model packages for vendor updates (SYS/ISV/LOC) or UAT-to-Prod promotion (all layers). Preview identifies metadata additions, changes, removals and preserved models; ownership conflicts, missing dependencies and incompatible customizations block deployment. Unselected models and physical business data are retained.
  • Change-set apply revalidates the candidate and restores runtime registrations and database changes on synchronous apply/persistence failures.
  • System administration lists app/model layers, source, metadata revisions, dependencies, deployment history and license state.
  • Optional ISV requirements use installation/customer-bound Ed25519 license files, a seller CLI, vendor trust registration, monotonic renewal sequences and audit records. Expiry restricts the app and dependent apps to read-only use; renewal takes effect without redeployment.

Breaking changes and migration

None for existing apps and packages. License tables are created automatically in the designer database; existing models remain unlicensed. Recent returns an additional app property and up to ten entries per app rather than ten globally. Selected-model packages use schema version 2 and require 1.3.0 at the destination; legacy version-1 packages remain supported.

Upgrade notes

Back up the data and designer databases together. Update application and updater images together to 1.3.0. Use metadata packages for UAT-to-Prod promotion; each environment keeps its own installation identity and licenses. Read Model deployment and ISV licenses for deployment modes, seller CLI usage, renewal and recovery.

Validation

Version consistency, type checking, production builds and automated tests pass (131 core, 39 client, 155 server and 6 release-policy tests; one optional legacy-backup fixture test is skipped). Tests use Node 24 and bounded worker concurrency. The 1.2.0-to-1.3.0 persistent-database upgrade check passed for existing login, business data, CUS fields/models, Recent/Favorites, legacy package preview and additive license storage. Browser checks verified desktop/mobile menu activity, app-local Recent, Apps & Models and layer selection in both deployment modes. Release-policy validation passes against 1.2.0. This branch is not published.

Known issues

Offline licensing cannot prevent changes by operators controlling the server, source, database or clock, and has no online revocation or key rotation. Trusted scripts/native code are not sandboxed. External side effects cannot be rolled back; a machine failure between commits to the separate data/designer databases requires backup recovery. Dynamic customizations still require UAT validation. New long-tail administration/Designer labels remain English. License notices in an already-open page update on refresh.

FU — EmuFramework v1.2.0

Choose a tag to compare

@emu479p01 emu479p01 released this 19 Sep 13:44
8080f05

FU — EmuFramework v1.2.0

Summary

This framework update makes localization, Data Entities, navigation, and attachments fully usable from the screens: Recent navigation replaces Favorites, the Designer gains Translation, Data Entity, and Data Entity Extension editors, apps declare a default language, framework screens ship in English and Thai, and image attachments can be previewed on desktop and mobile.

Improvements

  • Navigation switches from Favorites to an always-visible Recent list that keeps the ten most recent unique authorized menu items per user and moves reopened items to the top. The Favorites API and stored data remain for compatibility; star buttons and the Favorites root are removed from the UI.
  • Recent ordering becomes deterministic with millisecond timestamps that always exceed the user's previous maximum, so openings within the same second keep a stable order, and a failing history write never blocks navigation.
  • App manifests gain an optional defaultLocale (BCP-47, canonicalized with Intl.getCanonicalLocales, default en), editable as "Default language" in the Designer.
  • Label translation resolves per key: exact user locale → its base language → the owner app's defaultLocale → that locale's base → the stored label. Partial translations only affect the keys they cover, and the user locale is never rewritten automatically.
  • The framework ships read-only system Translations (FW_UiEn, FW_UiTh) covering screen titles, buttons, placeholders, and help texts for the shell, home, attachments, System Maintenance, and the Designer chrome; t() reads them reactively.
  • GET /api/metadata adds locale, availableLocales, resolved uiMessages, and per-app defaultLocale/availableLocales. The user menu language dropdown is built from availableLocales with Intl.DisplayNames labels, is disabled while switching, keeps routes, open records, and unsaved form state, and offers Retry when the preference is saved but texts fail to reload.
  • For one key and locale, Translations resolve by layer SYS → ISV → LOC → DEV → CUS with artifact-name tie-breaks, so results never depend on file load order; duplicate keys and keys without a live target are reported to the Designer, ui.* keys are reserved for the framework, and cross-app resources require a declared app dependency.
  • The Designer adds a Translation editor whose target list is generated by the same key builders as the runtime resolver (search, untranslated filter, read-only resource keys, stale-key warnings, empty cell means "do not override"), plus structured Data Entity and Data Entity Extension editors with Core validation as the final judge.
  • New dataEntityExtension metadata kind appends root fields, new lines, or extra fields on existing lines. Root table, business key, line relationships, and archive settings can never change through an extension; import, export, archive, and restore read the merged entity, and archives created before an extension still restore (missing fields follow import defaults; a new mandatory field without a default fails clearly and keeps the archive).
  • PATCH /api/me/locale canonicalizes tags (th-th → th-TH) and rejects invalid tags with errors naming the field.
  • System Maintenance splits Storage Overview from Archive Policy: labeled usage rows with human-readable sizes, per-mount filesystem capacity ("Unknown" instead of zero), storage paths, approximate per-App usage notes, a labeled backup component dropdown, unsaved-policy guards, an hourly-scheduler warning, and confirmation with entity/cutoff/batch before manual archive runs.
  • Attachments gain GET /api/attachments/:attachmentId/preview for PNG and JPEG with file-signature verification, inline disposition, X-Content-Type-Options: nosniff, Cache-Control: private, no-store, and streaming. The client shows lazy thumbnails and a responsive viewer (Escape closes on desktop with focus restore; mobile fits the viewport with 44 px touch targets and keeps browser zoom). Header and line attachments both support preview; PDF, Office, text, note, and URL attachments keep their existing display.

Breaking changes and migration

None. All metadata kinds, properties, and API additions are additive. Apps, metadata packages, attachments, and user data from 1.1.0 load unchanged, and no database schema migration is required. Favorites rows and API are retained even though the UI no longer shows them.

Upgrade notes

Create a full backup and update the application and updater images together to 1.2.0. After restart, set each app's Default language in the Designer if it should not be English, then create Translations from the Designer's New menu. Existing translations keep working; consider canonicalizing locale tags in file-based apps to th-TH style on your own schedule (runtime accepts either form).

Validation

Version consistency (pnpm check:versions), release-policy tests, core/server/client type checking, all automated tests (core, server, and client suites), production builds, and pnpm check:release -- --tag 1.2.0 --previous 1.1.0 pass on the release branch. Upgrade from 1.1.0 was verified for existing apps, metadata packages, attachments, and user data.

Known issues

Business data values, executable script code, technical identifiers, and raw server error messages are not translated. Long-tail Designer strings beyond the framework ui.* catalog remain English. The archive scheduler still checks hourly and cannot be pinned to an exact run time, and archived data is retained without automatic purge. Only PNG and JPEG attachments are previewable.

FU — EmuFramework v1.1.0

Choose a tag to compare

@emu479p01 emu479p01 released this 19 Sep 10:47
f2e7888

FU — EmuFramework v1.1.0

Summary

This framework update adds localized metadata labels, personal navigation, record attachments, document-level Data Entity exchange, governed business-data archiving, storage monitoring, and a substantially expanded Report Designer.

Improvements

  • Adds BCP-47 metadata translations with per-user locale and exact-locale, base-language, and default-label fallback.
  • Adds server-backed Favorites and the ten most recent authorized navigation items per user.
  • Adds file, note, and URL attachments to saved header and line records with opaque storage keys, SHA-256 integrity, streaming upload/download, configurable limits, and parent-record permissions.
  • Adds separate /files and /archive Docker volumes while retaining shared /data fallbacks with administrator warnings.
  • Adds Header/Line Data Entities with XLSX sheets or manifest-based CSV ZIP packages, durable staging, per-document atomic upsert, and downloadable error files.
  • Adds opt-in archive policies for explicitly eligible Data Entities, immutable checksummed payloads and blobs, scheduled batches, read-only search, collision-safe restore, and job history.
  • Adds a Storage & Archive dashboard with filesystem capacity, database/WAL, backup, font, live-file, archive, and per-App database usage.
  • Expands Report Designer with A3, A4, A5, Letter, Legal, and custom paper; orientation; four margins; cm, inch, and pixel display units; strict layout validation; text/field borders; and PNG/JPEG images from bundled assets or record attachments.
  • Extends backup schema version 4 with live files and archive data, streaming backup downloads, and backward-compatible restore validation.

Breaking changes and migration

No existing metadata or API contract is removed. New metadata kinds and fields are additive. Official Docker deployments should add the emu-files:/files and emu-archive:/archive named volumes and set EMU_FILE_STORAGE_PATH=/files and EMU_ARCHIVE_STORAGE_PATH=/archive. Existing deployments continue to boot with /data/files and /data/archive, but the administration page warns that shared fallback storage is in use.

Reports remain compatible as layout version 1. Existing overflowing reports can still preview with warnings. A report saved from the updated designer becomes layout version 2 and must pass the printable-area validator.

Upgrade notes

Create a full backup, preserve .emu-secret.key, and update the application and updater images together to 1.1.0. Before stopping the application, the updater verifies that the application and updater see the same separate file and archive mounts. After restart, verify Settings → System Maintenance → Storage & Archive, configure archive policies only for declared Data Entities, and confirm attachment upload/download permissions.

Plan SSD capacity for databases, WAL, backups, live attachments, archive payloads, and rollback headroom. A practical baseline is 200 GB for a 4-vCPU/8-GB server; use 100 GB only for light deployments without material attachment growth, and 500 GB or more for file-heavy workloads.

Validation

The candidate is required to pass version consistency, release-policy tests, core/server/client type checking, all automated tests, production builds, and the isolated local Docker acceptance gate without dependency installation or network pulls. Docker acceptance covers fresh install, upgrade, failed-health rollback, interrupted maintenance recovery, restore rollback, byte equality, mount-continuity rejection, and attachment backup/restore.

Known issues

Archive data is retained indefinitely in this release; automatic archive purge is intentionally not provided. Legacy .xls files are not accepted by Data Entities. Attachment versioning and check-in/check-out are not included. Framework UI strings, runtime error messages, and business record values are not translated by metadata translation resources.

PU — EmuFramework v1.0.2

Choose a tag to compare

@emu479p01 emu479p01 released this 19 Sep 05:27
5c6f1ee

PU — EmuFramework v1.0.2

Summary

This proactive update makes container updates and restores durable, removes unauthorized actions from delivered metadata, and corrects Report Designer canvas sizing.

Improvements

  • Adds an atomic, phase-based maintenance journal with explicit rollback and recovery-required status.
  • Checkpoints and closes both SQLite databases during graceful application shutdown.

Fixes

  • Restores the previous container and the pre-operation persistent-data snapshot when update health verification fails.
  • Compensates interrupted update and restore phases idempotently and retains recovery artifacts when automated rollback cannot finish.
  • Requires stable X.Y.Z update targets and supports a fail-closed local-image mode for unpublished test images.
  • Omits unauthorized form and line actions from /api/metadata, while direct action calls continue to return 403.
  • Filters hidden or disabled actions defensively in the client.
  • Calculates Report Designer canvas width from left and right margins, including asymmetric margins.

Breaking changes and migration

None. The maintenance API adds optional phase, rollbackStatus, and recoveryRequired fields while preserving the existing status field.

Upgrade notes

Back up data.db and designer.db, preserve .emu-secret.key, and update both the application and updater images together to 1.0.2. After restart, verify login and Settings → System Maintenance diagnostics.

Validation

The candidate passed the offline release policy, type checking, automated tests, production builds, fresh-container boot, local-image upgrade, failed-health rollback, failed-restore rollback, and byte-equality checks for restored data.db.

Known issues

The local Docker acceptance stack requires Docker Desktop to be running and the previous release image to exist in the local image cache; the verifier never pulls it automatically.

v1.0.1

Choose a tag to compare

@emu479p01 emu479p01 released this 03 Sep 15:05
8fcdd0e

What's Changed

Full Changelog: 1.0.0...1.0.1

v1.0.0

Choose a tag to compare

@emu479p01 emu479p01 released this 03 Sep 14:12
f4cdf9a
Update v1.0.0

Update v1.0.0

v0.5.0.0

Choose a tag to compare

@emu479p01 emu479p01 released this 21 Aug 17:19
57b1bf3

What's Changed

Full Changelog: 0.1.6.1...0.5.0.0

v0.1.6.1

Choose a tag to compare

@emu479p01 emu479p01 released this 16 Aug 09:20
9b3a8d7

What's Changed

Full Changelog: 0.1.6.0...0.1.6.1