Releases: mx-space/core
Release list
v13.26.0
TL;DR
Google Vertex AI is now available as a first-class AI provider across text, image, and TTS.
Highlights
This release adds Google Cloud's Vertex AI as a unified provider option in the admin AI settings, complementing the existing OpenAI-compatible providers. Operators can now route text generation, image generation, and text-to-speech through Vertex's Gemini model family from a single configured provider, without standing up a separate OpenAI-compatible proxy.
Behind the scenes, text providers were reorganized behind the same shared protocol registry that image and TTS already use. Aligning all three modalities on one extensibility model lets new backends be added consistently and keeps existing adapters maintainable.
Changes
Features
- Add Google Vertex provider adapters for AI text, image, and TTS (#2794)
Full Changelog: v13.25.3...v13.26.0
v13.25.3
TL;DR
Repairs a schema migrator flaw that let a migration be recorded as applied without running, breaking article translations.
Changes
- A migration whose journal timestamp is not strictly increasing is no longer mistaken for already-applied history and skipped without executing its SQL (33d2a43)
- Servers upgraded to v13.25.2 automatically regain the missing
ai_translations.updated_atcolumn on deploy, so post, note, and category listings return translated content again (33d2a43) - The startup schema guard now verifies every bundled migration by hash rather than trusting the newest recorded timestamp, so an unapplied migration blocks the deploy instead of surfacing later as runtime query failures (33d2a43)
- Failed translation lookups now log the underlying database error instead of only the SQL statement that failed (33d2a43)
Full Changelog: v13.25.2...v13.25.3
v13.25.2
TL;DR
Fixes TTS narration staleness detection after re-translation, and compiles Zod validation schemas ahead of time for lower request overhead.
Changes
Bug Fixes
- AI narrations voiced from a translated article are now correctly flagged as stale when the translation is regenerated or hand-edited without touching the original article — readers see the "content edited" hint instead of silently hearing outdated audio (dbcbb21)
Other
- Request-validation Zod schemas are now compiled at build time instead of per process, reducing validation overhead on every request (6f40b9a)
Full Changelog: v13.25.1...v13.25.2
v13.25.1
TL;DR
Fixes Gemini text-to-speech language steering and refreshes core dependencies across five major version upgrades.
Changes
Bug Fixes
- Gemini TTS now respects the requested output language instead of defaulting to the model's detection (3c6b476)
Other
- Dependency refresh spanning 102 specs, including five major bumps: ioredis 6 (RESP3 by default, with legacy reply mapping preserved), maplibre-gl 6 (ESM-only, dedicated worker URL), motion 13, @antfu/install-pkg 2, and dotenv-expand 1000 (#2785). All upgrades verified via typecheck, admin build, and a Redis pub/sub cross-pod test under RESP3.
Full Changelog: v13.25.0...v13.25.1
v13.25.0
TL;DR
AI generation now records per-request metrics — tokens, cost, and latency — across insights, summary, translation, and narration, and the admin gains richer provider configuration.
Highlights
Every AI operation — insights, summary, translation, and TTS narration — now logs a generation record capturing the model, token counts, estimated cost, and latency into a new persistent ledger (migration 0029, applied automatically). The admin surfaces these metrics in each task's detail drawer with localized labels, so operators can finally see what each AI pass actually cost and how long it took, per article and per task type.
Provider configuration in the admin is more robust: built-in provider presets speed up onboarding, the model-assignment and TTS-voice fields validate against the live catalog, and per-model pricing feeds cost estimates back into the metrics ledger. A new TTS language strategy picks the right voice and script per language automatically. The test suite gains a database-safety helper so it can no longer mutate shared state.
Changes
Features
- AI generation metrics ledger records tokens, cost, and latency across insights, summary, translation, and TTS (e47f4b7)
- Smarter AI provider settings: presets, live-validated model/voice assignment, per-model pricing, and a TTS language strategy (24530fe)
Full Changelog: v13.24.0...v13.25.0
v13.24.0
TL;DR
AI provider configuration now unifies text, image, and speech capabilities while adding automatic text-to-speech voice discovery in Admin.
Highlights
AI providers can now declare text, image, and speech capabilities through one shared configuration. Image generation and text-to-speech assignments use the same provider model as writing, summaries, reviews, translation, and insights, reducing duplicated credentials and preventing providers from being removed while they remain assigned.
The Admin interface now exposes image-generation defaults and complete text-to-speech controls in the unified AI settings. Supported OpenAI speech models provide a built-in voice catalog, while compatible providers can supply a remote catalog; manual voice entry remains available when discovery is unavailable.
Changes
Features
- Configure text, image, and speech workloads through capability-aware AI providers. (cbb73df)
- Discover built-in or provider-hosted text-to-speech voices directly from Admin. (cbb73df)
- Automatically normalize existing image-generation and text-to-speech settings into the unified configuration. (cbb73df)
Full Changelog: v13.23.0...v13.24.0
v13.23.0
TL;DR
Articles can now be narrated block-by-block with AI-generated audio, complete with an admin management surface and entitlement-aware public playback.
Highlights
AI Text-to-Speech turns any post, note, or page into a spoken version, synthesized one content block at a time through any OpenAI-compatible speech endpoint. Each block is stored as a content-addressed audio object, so unchanged text is reused across regenerations and only stale segments are re-synthesized — keeping repeat runs fast and cheap. Narration availability is advertised on every article detail response via a tts meta flag, so frontends can surface a play control only when audio actually exists.
Reader access mirrors the existing paywall exactly. The public narration endpoint runs the same membership and password checks as article visibility, so premium content is gated consistently whether a reader is hitting text or audio. Site owners, active members, and entitled readers get playback; everyone else sees narration as unavailable, with no leak through the shared cache.
On the admin side, a generation panel inside the editor and a dedicated fleet management page cover the full lifecycle: enqueue or force-regenerate per article or in bulk, inspect segments on a timeline, resolve titles across the whole list, and delete with storage cleanup. AI quick-action entries are also added to the Note and Post context menus alongside summary, insights, and translation.
Changes
Features
- ai-tts: per-block AI narration for articles (#2781) — configurable OpenAI-compatible speech provider, content-addressed reuse, public entitlement-aware playback,
ttsarticle meta, and a full admin generation/management surface.
Bug Fixes
- migration: corrected an out-of-order timestamp on the
0028_ai_ttsmigration so the boot-time schema-currency check detects drift correctly (c3ff266)
Upgrade Notes
No manual operator action required. The 0028_ai_tts migration applies automatically via the normal migrate.mjs release step; its timestamp correction only affects the recorded created_at on fresh applies and does not change SQL execution order or any migration hash.
Full Changelog: v13.22.0...v13.23.0
v13.22.0
TL;DR
Space gains a native iOS administration app and secure push delivery through a separately deployable relay.
Highlights
Administration from iPhone. The native Space app now supports device-authorization pairing, dashboard statistics, comment review, quick note and say publishing, and file-library access. Mobile-specific API views provide the data needed by these workflows without requiring the full web administration interface, while the checked-in OpenAPI contract keeps the Swift packages and server routes aligned.
Privacy-preserving push delivery. mx-core can register devices and queue notification events through an independently deployed Push Relay. The relay receives only the minimum comment resource identifier instead of comment text, author details, email addresses, IP addresses, or user-agent data. Delivery credentials are encrypted at rest, and relay requests are limited to explicit server-controlled HTTPS origins.
Repeatable TestFlight delivery. The repository now includes a GitHub Actions workflow for signed iOS archives and TestFlight uploads. It runs automatically only when mobile-related files change, remains available for manual dispatch, and uses read-only repository permissions. This keeps routine server changes from consuming Apple build capacity while preserving an auditable release path for the mobile application.
Changes
Features
- Manage a Space instance from the native iOS application, including pairing, dashboard, moderation, publishing, and file workflows (#2783)
- Register mobile installations and deliver privacy-minimized comment notifications through the standalone Push Relay (#2783)
- Export and verify the mobile OpenAPI contract so server and Swift models remain synchronized (#2783)
- Build and upload signed iOS archives through a mobile-scoped or manually dispatched TestFlight workflow (#2783)
Bug Fixes
- Reject untrusted or malformed Push Relay destinations before activation, deactivation, and event delivery (#2783)
Upgrade Notes
- Existing deployments remain unaffected when push delivery is unused. To enable it, deploy and migrate the standalone Push Relay, enable mx-core encryption with a stable
MX_ENCRYPT_KEY, and setMX_PUSH_RELAY_ORIGINSto the exact trusted HTTPS relay origins. The mx-core0027_clean_vindicatormigration creates the new push source, binding, and delivery tables during the normal database migration process.
Full Changelog: v13.21.0...v13.22.0
v13.20.1
TL;DR
Fixes S3 storage settings being dropped on save, restores serving of files in nested upload folders, and cuts cold-start time by roughly 20%.
Changes
- S3 storage credentials and options now survive a settings save instead of being reset to defaults, so object-storage uploads keep working after any configuration change (#2780)
- Files stored inside nested directories under the upload root are served correctly again instead of returning a not-found error (#2780)
- Server startup is noticeably faster — a fresh container now reaches ready in about 430ms, down from ~530ms, thanks to a shipped V8 compile cache and deferring heavy dependencies until they are actually used (2afacbb)
Full Changelog: v13.20.0...v13.20.1
v13.20.0
TL;DR
Progressive Markdown→Lexical migration for posts, notes, and pages, plus Dependabot security dependency patches.
Highlights
Admin no longer blocks format switching as soon as a Markdown document has content. Eligible Markdown posts, notes, and pages can convert to Lexical per document: conversion is gated on supported syntax, opens diagnostics when unsupported constructs remain, and only becomes published when you save—so drafts can stage Lexical without forcing a live switch.
The server dry-runs conversion (including coupled AI translations), then commits Markdown→Lexical atomically on save for the source document and its translations. Historical Markdown draft snapshots stay as an immutable audit trail; Lexical still owns content with a writer-owned Markdown text projection.
Changes
Features
- Progressive Markdown-to-Lexical migration for posts, notes, and pages, with dry-run eligibility, source-located diagnostics, and atomic save-time commit (including AI translations) (#2777)
Other
- Patched Dependabot-reported direct and transitive dependency vulnerabilities (
@fastify/static,js-yaml,react-router,fast-xml-parser, and related overrides) (eb78fe2)
Full Changelog: v13.19.0...v13.20.0