Tutorials now live entirely under Learn with their own focused sidebar, and the docs sidebar no longer lists Tutorials or Changelog. Old links keep working — /docs/tutorials/… forwards to /learn/… and the old in-docs changelog forwards to xentr.ai/changelog.
Technical details
Second fumadocs collection (content/learn) served at /learn/[...slug] with its own page tree; the four tutorial pages moved via git mv (history preserved). Permanent redirects cover /docs/tutorials, /docs/tutorials/:slug and /docs/changelog. Search indexes both trees; the sitemap lists /learn/* and drops the redirecting URLs. The changelog source file stays in place as the single source for the marketing page, RSS feed, and the CI changelog gate.
A deep redundancy audit removed the leftovers of the retired MIMOS i4TAP pilot (old demo seeds, sales decks, proposal PDFs), 80+ completed one-off scripts, an unused FOCAS driver package superseded by the Rust edge runtime, and broken release tooling. Duplicated dashboard and marketing pages were consolidated into shared components, so future fixes land once instead of twice. No customer-facing behavior changes.
Technical details
118 files deleted (~9k lines): retired-customer collateral, historical apply-NNNN migration runners, pre-Drizzle setup scripts, packages/drivers/driver-focas, Changesets machinery (broken by org policy — see VIGOR-DEVIATIONS.md #4), Mender compose stack, and the Lark tracking integration (deviation #5). Consolidations: reports/mimos + mimos-savings into one parameterized component, shared OEE bar chart, audience/legal page components, invalidateOrderSurfaces, useReflowAccept, canonical ['production-methods', factoryId] query (fixes a stale-cache invalidation bug), staff-role checks via isXentrStaff. Dead exports stripped from method-throughput, gateway-core, protocols, mqtt-protocol. Docs truth pass: staging architecture, edge runbooks, Mender references, sub-processors, README. Magma Grafana origin is now env-overridable (MAGMA_GRAFANA_ORIGIN / NEXT_PUBLIC_MAGMA_GRAFANA_ORIGIN, in-source fallback unchanged).
This changelog now has a dedicated page on the main site at xentr.ai/changelog, and the learning journey has its own home at developer.xentr.ai/learn — five steps from an empty account to a running, staffed factory. The Developers menu now points at Docs, Learn, API Reference and Changelog as four distinct destinations, and the Compare page has been removed from the site navigation.
Technical details
xentr.ai/changelog is statically rendered from this same MDX file at build time (single source; the per-PR changelog CI gate covers it for free), with per-entry anchors and the RSS link. /learn is a dedicated page on the developer portal linking the quickstart + four tutorials in order. The in-app "What's new" banner now points to the marketing changelog. Compare routes still exist (SEO); they're just delinked from the header, footer and mobile menu.
The xentr.ai homepage now opens on film: a slow dolly through a dark machine hall behind a bolder headline, in the same ink-and-violet grade as the rest of the brand. And the site header gains a Developers menu — Documentation, API Reference, Changelog, and a step-by-step Learning journey — so the developer path is one click from anywhere.
Technical details
Hero footage generated with Seedance 2.0 (unbranded prompt, frame-checked), 0.8 MB WebM / 2.2 MB MP4, first frame as WebP poster; phones and prefers-reduced-motion get the still. Copy-legibility scrims layered left + vertical; headline scale raised. New DevelopersMenu mega-menu (desktop + mobile drawer) pointing at developer.xentr.ai's docs, API reference, changelog, and tutorials; the old standalone "Docs" link and Resources "API Docs" entry are folded into it.
The "A day on a floor you can't see" narrative is rewritten for the people who sign: each moment now names its cost — payroll spent finding out what ran, paid machine-hours producing nothing, overtime and expedited freight, quotes priced on capacity the floor never had — and closes with the four P&L lines a blind floor bleeds into, linking straight to the OEE calculator so you can put your own numbers on it.
Technical details
FloorStory copy rewrite (CEO/CFO framing) + a "bleed lines" strip and an anchor link to #oee-calculator. Cost *mechanisms* only — no invented figures, per the truth rules; the calculator computes the visitor's own numbers.
The xentr.ai homepage now opens with the problem before the product: a new "A day on a floor you can't see" section walks through the real cost of running blind — the morning walk, the silent stop, the quiet slip, the month-end post-mortem — before the rest of the page answers it. Behind the hero, the machine-hall backdrop now moves: a subtle ambient loop of light trails drifting across the floor. It stays a still image on phones and for anyone with reduced motion enabled.
Technical details
New FloorStory section (ink band, mono-timestamp narrative beats, truth-rule copy) between the hero and "Your floor. In plain sight.", so the existing ink→light rhythm reads as blind→seen. Hero loop generated from the existing duotone still with Seedance 2.0 (start frame = end frame → seamless 10s loop), encoded to 0.29 MB WebM + 0.70 MB MP4, autoplay muted loop playsinline at 30% opacity with the WebP still as poster; hidden below sm and under prefers-reduced-motion via CSS so those users keep the still.
The xentr.ai site now shows the factory, not just describes it: sector vignettes in the "Already on the floor in Penang" section, device-in-context scenes on the operator app / wallboard / copilot cards, a wire-it-to-see-it schematic in the deployment story, per-industry artwork on all six industry pages, and backdrops on the homepage hero, booking page, and 404. The developer portal front page gets a matching illustration. All artwork is generated in one duotone ink-and-violet grade — no real plants or customers are shown.
Technical details
17 generated duotone assets (unbranded, no readable text, individually reviewed) served as WebP under public/duotone/ (14-100 KB each, ~760 KB total) via next/image with explicit sizes; backdrops are aria-hidden with gradient scrims to keep text contrast; the industry template maps slug → image with a graceful no-image fallback.
The xentr.ai website and this developer portal got a structural tune-up. Search engines now see each page's own address and shared links show the right page titles; both sites have proper branded "page not found" screens; the developer portal gained a favicon, social-share cards, and a sitemap; and this changelog now has shareable links per entry plus an RSS feed. Contact buttons that silently went nowhere now route to the booking form.
Technical details
Marketing: per-route canonicals, per-page OpenGraph/Twitter inheritance, Organization/WebSite/FAQPage JSON-LD, blog posts added to the sitemap, not-found.tsx/error.tsx, www→apex 308 redirect, skip-to-content link, nav current-page indication, mobile pricing-table overflow fix, and dead mailto: CTAs replaced with the booking form. Developer portal: /docs/api-reference index page (was a 404), corrected dashboard host in quickstart/auth docs, favicon + OG image + robots + sitemap, Space Grotesk display headings aligned with the marketing brand, a custom 404, and this changelog restructured with per-entry heading anchors and an RSS route.
Sensor readings can no longer be double-counted after an edge reconnects, so axis/spindle/temperature aggregations stay correct.
Technical details
sensor_readings had no unique key, so a gateway WAL replay inserted duplicate rows (unlike machine_states/production_counts, which already dedupe). Migration 007 de-duplicates existing rows and adds UNIQUE (time, factory_id, machine_id, sensor_type, sensor_name); the batch writer now uses ON CONFLICT DO NOTHING. The index is already applied to the prod TimescaleDB.
Two production orders created at the same instant in the same factory can no longer be assigned the same order number.
Technical details
generateOrderNumber was read-max-then-increment with no lock. Order creation (and cloning) now allocate the number under a per-factory advisory lock, and migration 0083 adds a UNIQUE (factory_id, order_number) index as the hard backstop. The migration self-guards: it fails loudly if pre-existing duplicates exist so they can be resolved first.
Switching the active factory now starts Copilot fresh for the new site — its conversation, thread, and suggestion chips no longer carry over from the previous factory.
Technical details
Proactive suggestions were fetched once behind a boolean ref, so Factory A's chips (embedding A's order numbers / action tokens) survived a switch to Factory B. Suggestions are now keyed by factoryId (refetch on change), and a factory switch resets the conversation id, message thread, and chips.
When you log a past production run, Xentr now blocks an end time that's before the start, or times in the future, instead of silently saving a broken window.
Technical details
The validateBackfillTiming guard existed but was never called. It's now enforced on both backfill paths (scheduleSplit and applyTimingToOrder), throwing a 400 on inverted / future windows that previously corrupted part-count and pace math.
Account managers now see edge and device inventory only for the organizations they're assigned to — never the whole fleet, and never another tenant's.
Technical details
Fleet endpoints (GET /api/fleet/stats, /api/fleet/edges) previously treated xentr_account_manager as full-fleet staff: it could omit organizationId for a global view and pass any organizationId unverified. Now only xentr_platform_owner gets the global (null) scope; every other role is confined to listReadableOrgIds, and a supplied organizationId is verified with assertCanReadOrg.
If you keep a tab open (a wallboard, a planning screen) and we ship an update, a banner now appears at the top: refresh with one click, or follow the What's new link to this changelog. Dismiss it to keep working — it won't nag again until the next update.
Technical details
New UpdateBanner in the app root layout compares the app version baked into the client bundle at build time (NEXT_PUBLIC_APP_VERSION) against GET /api/version (force-dynamic, no-store), polled every 5 minutes and on tab re-focus. Every release bumps the version, so any mismatch means a newer deployment is live. The banner keys off the lockstep app version rather than a deployment commit SHA.
A new desktop app for on-site setup scans your factory network for FANUC machines, adds them in a click, and shows live connection status — no config files or command-line steps.
Technical details
New edge/xentr-connector Electron wizard that wraps the xentr-fanuc collector and its :9180 control plane (subnet FOCAS scan, hot-reload machine add, health/readiness view, one-click Windows service install). Out of the pnpm/turbo workspace and version-lockstep, like the collector. Also removed the unused gsap dependency from the product app.
Xentr now publishes a user-facing changelog — every product change ships with a plain-language entry on this page.
Technical details
PR #352/#353. The changelog is part of the developer docs at developer.xentr.ai — each entry pairs a plain-language headline with an optional technical note like this one, newest first.