A large release, with 91 frontend commits and the server work behind them. It covers workspaces, a learner’s first run, AI authoring and the public site.
Asking to join, and switching workspaces
Until now an invitation from an admin was the only way into a workspace. A workspace can now mark itself joinable, and a person asks to join from its row in the workspace chooser. Admins decide at /admin/organizations/join-requests. The workspace switcher is back beside the sidebar’s collapse button, /workspaces lists the workspaces that have no address of their own, and platform admins can assign an address and set a logo and cover for each organization. The organizations list shows how many active members each one has.
Goals and analytics for learners
/app/goals shows a card for each goal, a detail view and a trend line. /app/analytics charts your activity over a range you pick, from today to the last 12 months, or a custom span of up to two years. The inbox groups notifications by day, with view and archive actions on each row.
We also walked a new account from sign-up to a finished module and found 46 problems. This release fixes 44 of them. The path picker now ranks a short “Recommended for you” list by your topics, role and hours, and finishing a module shows a toast.

Import shows its work
Content import now lets you pick the engine that reads your files: anydoc for 10 file types, or xberg for 32, including a build that reads the file in your browser. Before a build runs, the outline step estimates the modules, words and build time from this platform’s past runs, and suggests cheaper selections. The planner scores the draft plan on eight UDL and VARK dimensions and reworks only the ones that are out of balance, and each module type now has its own authoring agent. Admins set up agent presets at /admin/ai/agents and browse 16 personas at /admin/ai/gallery.

The public site
Eight marketing pages were rebuilt: /ai, /business, /academia, /company, /personal, /developers, /creators and /agencies. The landing hero is now a web of cards joined by threads, drawn in HTML and SVG, where it used to be a Three.js scene. The landing page loads 1.42 MB of JavaScript up front instead of 6.27 MB, and its Lighthouse accessibility score went from 92 to 100. Sign-in, sign-up and password reset now show a self-hosted CAPTCHA.


Also in this release
Added
- /app/goals, a detail page per goal, and /app/analytics.
- Join requests with an admin queue, the /workspaces chooser, and a member list for each organization.
- Inviting a user into an organization from the organization list or the user directory.
- A show-password toggle on every password field.
- Agent presets at /admin/ai/agents and a persona gallery at /admin/ai/gallery.
- Announcement destinations on /admin/notifications, starting with Telegram.
- An Unpublish action beside Publish on a path.
- Language, theme and profile cards in Settings.
Changed
- Sign-in and sign-up forms validate when you submit, not when you leave a field.
- Admin lists show names and titles instead of raw ids.
- [server] The global rate limit is 100 requests per 10 seconds, up from 10 per 500 ms.
- [server] Emails greet people by name, and all 12 templates use the new design.
Fixed
- “Request failed (HTTP 429)” panels in production. The cause was a Lambda concurrency quota of 10, and the client now retries with backoff and caps parallel calls.
- The learner rail offered the admin console to learners.
- Rich-text modules with long bodies showed “The author hasn’t written the reading body yet”.
- The shuffle toggles on assessments did nothing.
- [server] Workspaces set to OpenAI ran on Gemini in six workflows.
Removed
- The learner-side security settings. The access console lives only at /admin/access.
- The Three.js hero and the three dependency.
- The “Preferred formats” onboarding step, and the disabled Google and Apple sign-in buttons.
One email when we publish. Research, product decisions, and what teams report back.







