GitHub Sync Reimagined, a Hardened Workflow Engine & Self-Serve Account Control
One-click GitHub onboarding that auto-detects your repo layout (now including Astro content collections), a production-hardened translation workflow engine, bring-your-own DeepL, read-after-write consistency across the platform, self-serve account deletion, and a safer Content CMS with Trash and uploads.
GitHub Sync, Reimagined `IMPROVED`
Connecting a repository used to mean guessing your file layout. Now the wizard reads your repo and pre-fills everything — a Cloudflare-style recommendation card shows exactly what we detected before you commit to it.
Auto-detect file structure + key format `NEW`
The connect wizard inspects your repository tree and file contents, then recommends the right file structure and key format automatically. No more manual guessing that fails the first sync with "Source language files not found."
Four file structures — now including Astro `NEW`
We named and documented the four repository layouts, and added first-class support for namespace-folders (`faq/en.json`, `home/en.json`) used by Astro content collections:
Detection, reading, and the symmetric write path are wired end-to-end, including the v2 CDN manifest namespace breakdown.
Smoother connect & re-sync `IMPROVED`
---
- Detects the locale + namespace layout straight from the tree
- Reads file **content** to tell `flat` (`"auth.login": "..."`) from `nested` (`{ "auth": { "login": "..." } }`)
- Recommendation card surfaces detected languages with flags and language names, anchored on your source language
- The edit modal now exposes both File Structure and Key Format, and saving preserves the structure you already have
- Single file — `locales/en.json`
- Locale folders — `locales/en/common.json` (next-i18next)
- Namespace folders — `faq/en.json` *(new)*
- Locale-suffixed — `faq.en.json`
- "Sync now" button in integration settings — polls to completion and refreshes the editor when done
- Re-connecting an already-linked or orphaned repo now reconciles it instead of throwing a 409/CONFLICT
- A re-sync of an existing repo updates its detected structure
- Branded, context-aware "You're all set" screen; the GitHub Sync flow skips the framework/SDK steps you don't need and auto-advances once the sync completes
Translation Workflow Engine — Production-Hardened `IMPROVED`
The Mastra workflow engine that shipped in v2.1.0 got a full reliability pass on Cloudflare Workers.
---
- Concurrent target-language translation — languages translate in parallel instead of one after another
- Key-keyed LLM contract + dual-limit chunking + retry — large batches no longer overflow context or drop rows
- GPT-4.1 Mini for batch workflows — faster and cheaper for high-volume translation
- Bulk translations route to the workflow instead of looping single proposals
- Cancel works end-to-end — aborting on the client cancels the run server-side, with a per-card Cancel button
- `translateBatch` fixed — it silently ran as a no-op for async-generator tools; it now executes, fails loudly on dead provider credentials, and stops rendering failed runs as "Translated 1 key"
- Worker CPU limit raised to 300s to stop AI chat/workflow timeouts
Bring Your Own DeepL `NEW`
DeepL now uses your own API key instead of a shared platform account. The enable modal is a single key field — paste your key and go. Each project translates on its own DeepL quota.
---
Read-After-Write Consistency `IMPROVED`
Edits made through the AI agent, the editor, or the CMS now reflect immediately — no more "I just changed this, why is it stale?"
We introduced an uncached database path and inverted the default to uncached, opting in to caching only for hot reads:
---
- Editor, sync, publish status, and CMS enablement read through fresh
- Billing bridges the read-after-write gap — a paid plan reflects instantly after Checkout
- Security: authorization state (auth, membership) is always read uncached, never from a stale cache
- Namespace and target-language IDs resolve via `INSERT … RETURNING` to kill read-after-write data loss
Self-Serve Account Deletion `NEW`
A clean account closure flow, including for OAuth users:
---
- Email-confirmation deletion with a dedicated confirm page and a closure email
- A Resend button on the awaiting-confirmation state, plus a tightened delete modal
- User foreign keys set to null on deletion so closures aren't blocked by related records
Content CMS — Safer Publishing, Uploads & Trash `IMPROVED`
A full admin UX overhaul focused on not losing work and not publishing the wrong thing.
---
- Save-before-publish and dirty-state gating on Save — you can't publish stale edits
- Trash for deleted entries, media uploads, and clearer per-language state
- Multi-valued relation fields — an entry can now reference many others (repeatable content)
- Stops fabricating entry analytics when there is no data
- Fixes: date-picker selection, properties-panel scroll, clipped dialog footer, full-page setup wizard, and the new-post route losing its layout shell
Publish & CDN Reliability `IMPROVED`
Hardening across the customer-facing publish pipeline:
---
- Structure-aware path resolution so `namespace-folders` CDN files aren't generated empty
- Batch publish to GitHub preserves your repo's file shape (nested stays nested)
- Deletion-only and normal publish paths both strip deleted keys from per-namespace files
- CDN publish is gated to CDN-only projects — GitHub-connected repos are never mirrored to the CDN
- Keys and translations are read fresh so edits aren't published stale
- Tolerates duplicate keys on CDN import instead of failing the whole batch
Billing Reliability `IMPROVED`
---
- Subscription status refetches on return from Stripe Checkout
- Trial-started fires on transition, with per-attempt payment dunning
- Stripe price IDs repointed to the active account and currency repriced
Partner OAuth — Content Extras `IMPROVED`
Building on the v2.1.0 partner OAuth release:
---
- Partner endpoints for full content CRUD — models, fields, bulk operations, duplicate
- Mint content API keys via OAuth
- Partner content-api-key grants per-model read and self-heals on reuse
Reliability & Polish `IMPROVED`
- Stuck-splash cold-load fix — root-caused a redirect-in-`beforeLoad` crash plus a boot watchdog and auto-recovery
- Redesigned error / not-found / org-empty states
- Notion-style content skeleton for the AI drawer loading state
- API key deletion hardened against malformed metadata and scoped by owner
- Chinese (`zh`) added as a standalone language option
- Production no longer leaks stack traces in error responses
- Onboarding guide panel in the sidebar footer until the SDK is actually installed