v1.0.0-beta.231
Released to production on October 7, 2026 at 18:23 CDT. See every commit in this release on GitHub
New
- Redirects: the Apple apps add, edit, switch and delete redirects natively
- Native: the Apple plugin context writes as the console does, via FirestoreWriter
- Commerce: the Apple store takes the Kotlin order chips and the to-ship card
- Native: the Apple plugin host takes Kotlin's Besigner rules and screen-only actions
- Commerce: the POS register and the store, native on iPhone, iPad and Mac
- Native: the Aglyn app manages natively; the Besigner is its only web view
- Native: the kit plans on both readers, takes device cards, opens only the Besigner
- Native: unsigned Macs sign in over REST; push and notification settings
- Native: the Apple kit plans list queries and formats orders as the console does
- Native: the native seed writes a notification feed for both apps
- Native: the Aglyn app shows the catalog and scans stock natively
- Native: the Aglyn app shows the store's sales natively
- Accounting: a Codat provider reaches QuickBooks Desktop, NetSuite, Sage and more
- Redirects: the apps add, edit, switch and delete redirects natively
- Native: the Windows Besigner runs in WebView2 inside the app window
- Native: the apps open only the Besigner on the web; every other area is native
- Fulfillment networks: ShipBob and Amazon MCF route paid orders and write tracking back
- Native: the Aglyn app manages a site's orders natively
- Commerce: post-purchase plugin — AfterShip, Route protection, Narvar
- Native: the POS takes cards on Tap to Pay and Bluetooth, and scans with the camera
- Native: per-type push switches, desktop Credential Manager and Listen
- Native: a stored order without status or a totals field decodes
- AI: a site put live whole says so with the shared site-live notice
- Commerce: ShippingEasy connector beside ShipStation, with the merchant's own keys
- Shipping: Easyship, Sendcloud, ShipperHQ and merchant carrier accounts
- Native: the Aglyn and Aglyn POS app icons, generated from the chosen designs
- AI: guided-start and build pages and layouts are designed in the layout language
- AI: every page the layout language describes compiles to a tree the doctrine admits
- Sharing: new datasets, media and CRM records each get their own default sharing
- AI: run the guided AI site start locally, on the emulators with the real model
- Commerce: outside fulfillers' holds and synced stock counts, through core seams
- Fonts: an installer for a site's own font files in the theme editor
- Fonts: the media library stores and serves a site's WOFF2 fonts
- Fonts: a font picker over the whole Google Fonts catalog, with cost and pairings
- Fonts: the theme editor's Typography card hosts a font control zone
- UI components: a download cost badge, a searchable virtual list and useInView
- Fonts: the font loader prices a theme's fonts as a published page loads them
- Fonts: a theme's fonts read and write as a body font and a heading font
- Fonts: a font loader that serves each theme face from the site, sized fallbacks
- Commerce: the desktop register reads wedge scanners and prints ESC/POS over TCP
- Bookings: today's bookings take payment at the Aglyn POS counter
- Commerce: the native Aglyn POS register for Android and the JVM desktop
- Mobile: the kit adds notices, amount rows, steppers, choice chips, skeleton grids
- Mobile: the Kotlin apps run on the JVM desktop with menus and shortcuts
- Mobile: the iOS and Mac Home is a site dashboard built from the shared kit
- Mobile: seed the native apps' emulator stack from tools/scripts
- Mobile: the Android console view carries the origin-checked bridge
- Mobile: push over FCM registers the Android install and opens a tapped link
- Mobile: the Kotlin list-query planner replays the console's plans
- Mobile: the Kotlin apps adopt the generated contracts and formatter cases
- Mobile: the till lists menu screens and binds the register's peripherals
- Mobile: plugins read the register's peripherals and declare console-served screens
- Mobile: the hardware kit encodes ESC/POS receipts and reads HID scanner bursts
- Mobile: the Aglyn POS Android app with its store picker and register host
- Mobile: the Android Home is a site dashboard built from the shared kit
- Mobile: the native Apple foundation and the Aglyn and Aglyn POS shells
- Mobile: push goes out over APNs and FCM, and device rules check each transport
- Mobile: the native Kotlin foundation and the Aglyn Android shell
- Marketing platforms: Mailchimp, Klaviyo, Omnisend and Attentive sync
- Commerce: a checkout reached with an address raises checkout.started
- Email: a site's marketing consent as an outside list mirrors it
- Plugins: the person-records seam walks a site's people by change
- Mobile: check:mobile-isolation holds the Swift and Kotlin trees both ways
- UI components: StatusChip, CopyField and useClientPagination; sales channels use them
- Mobile: record the console's formatter and order-rule answers for the native ports
- Mobile: generate the shared native contracts from the pure modules
- Bookings: check a guest in and move a booking, as member routes
- Bookings: take payment for a booking in person on the native pos app's reader
- Commerce: terminal connection tokens and the site location for the native pos app
- Sales channels: product feeds for Google, Meta, TikTok, Pinterest, Snapchat and Microsoft
- Mobile: the notification catalog for the native apps' push settings
- Mobile: the native apps' logo, wordmark and app icons, generated
- Mobile: native theme tokens and the bundled Roboto Flex face
- Mobile: generate the native plugin manifest for Swift and Kotlin
- Commerce: checkout and the register ask the store's tax service
- Tax engines: merchants connect their own Avalara AvaTax or TaxJar
- Platform: a core.tax-engine contract beside the tax profile
- Legal: the subprocessor list names Apple and Google for push; push is on
- Commerce: wallets, pay later and crypto on every storefront checkout
- Mobile: biometric unlock for the Aglyn app
- Mobile: native lists on the console's query plan, DAM upload and member access
- Commerce: the Aglyn app's orders, products, scan and sales screens
- Mobile: push devices, Expo fan-out, per-type push settings and tap deep links
- Commerce: the tablet register scans with the camera and a wedge scanner off the search box
- Commerce: the tablet register runs the shift, PIN cashier, customer lookup and 80mm receipt
- Commerce: quick keys, modifiers and an item sheet for picking items at the register
- Commerce: a POS devices card for card readers and customer displays
- Commerce: the customer display, with text receipts and a thank-you that forgets the customer
- Console: a plugin's public device page at /kiosk, with no session or ad tags
- Commerce: a tablet-first register that splits tender across every payment
- Commerce: the Hardware card lists a register's readers and displays
- Commerce: sales print, kick the drawer, kitchen tickets, scanners and labels
- Commerce: camera barcode scanning and a Hardware card per register
- Commerce: ShipStation Custom Store endpoint with sealed credentials and shipnotify
- Mobile: Aglyn app skeleton, mobile foundation libs and plugin mobile surface
- Shipping: buy a return label from the return dialog
- Shipping: check a paid order's address with the carrier
- Commerce: live carrier rates at checkout, ship-from addresses, shipment seam
- Shipping: shipping plugin with Shippo and EasyPost, labels, tracking, label billing
- Commerce: a register return joins the store's returns and raises the refund events
- Commerce: register shifts, Z-report, staff PIN, customer lookup, returns, receipts
- Plugins: a person-records search the register's customer lookup reads
- Accounting: QuickBooks Online and Xero sync of sales, refunds, fees and payouts
- Commerce: a site's order history, read by other plugins through a service
- Commerce: returns, invoice and order webhooks in the console; buyer return page
- Commerce: return events, signed order webhooks, order-status return action
- Sms: order texts after the receipt keep quiet hours in the store's zone
- Commerce: a guest order-status page behind the link in every order email
- Commerce: data layer for the app's orders, products and sales screens
- Commerce: pure outbox and smart-collection reads for the app, web untouched
- Commerce: shipping CSV presets, tracking import and shipping fields on orders
- Commerce: returns — buyer request, approve, decline, receive with restock, refund once
- Commerce: register receipts ride the buyer-notification door, and raise order.paid
- Commerce: split-tender POS ledger, Stripe Terminal readers and tips
- Sms: an SMS plugin behind core's messaging contract; resend receipt and buyer notification switches
- Commerce: order events for other plugins, and as workflow triggers
- Plugins: plugin events, declared by a plugin and delivered through an outbox
- Commerce: cloud receipt printers — Star CloudPRNT and Epson Server Direct Print queue
- Commerce: in-page storefront checkout is complete and released
- Commerce: orderDetail and orderFulfillment zones, Fulfill items panel
- Commerce: fulfill an order by quantity, several shipments each editable
- Commerce: buyer emails for shipped, delivered, refunded, canceled and POS receipts
- Commerce: one shared carrier tracking-link builder for every surface
Fixed
- Accounting: the codat declaration names no accounting credential variable
- Commerce: post-purchase cards link their guide; specs list the new locked-on plugins
- Sharing: deny client writes to the default sharing fields
- Native: the POS app is named "Aglyn POS" on iPhone, iPad and Mac
- AI: the contact check's matches are typed, so the plugin's build compiles
- AI: a site's footer prints one copyright line, its bottom bar's
- Commerce: post-purchase declarations name their reason as customer-chosen
- AI: only a guided start links a page kept out of the nav; Home always
- Native: an order reads as the console lifts it, and sales figures are ported
- AI: a site's header and footer link every page it builds, Home first
- Commerce: the shippingeasy connection rule names its orders, not a recursive match
- AI: no link reference reaches a language-built page's words
- Fulfillment networks: the plugin's console budget, the self-host anchor and typed spec offers
- AI: a language-built page or frame shows no gap; a fact the brief lacks is left out
- Commerce: post-purchase catalog row fits the page budget; generated contracts, tsconfigs and plugin budget
- Commerce: post-purchase order key is a named key function; card copy reads no brand
- AI: a centered section's head stays centered; a spelled-out escape is its character
- Native: the desktop Listen client compiles against grpc and the KMP dependency DSL
- AI: the invented-contact check reads no icon drawing as a phone number
- AI: a language page's contact check reads its stored nodes as a doctrine tree
- Console: the Create site dialog closes once the site exists
- AI: a language page gives no address or hours the job was not given
- AI: a layout gives no street address or opening hours the brief did not
- UI components: the table and the layout slot each name their drawer glyph once
- Console: the editor-hint bounce never leaves a sign-up door mid-landing
- Email: a subdomain's DKIM record named relative to its zone is readable
- UI components: an icon size and a stack spacing stored as text are still numbers
- AI: left-out sections are asked for again alone; a card a column is one group
- Commerce: the ShippingEasy card's status chip and spec orders type-check
- Commerce: the ShippingEasy card's four fixed facts are rows, not a mapped list
- Shipping: American spelling in the Easyship and Sendcloud adapters
- Shipping: ShipperHQ names the configured brand as the cart
- Native: the splash screen keeps its launcher background color
- AI: rule 1 counts a repeated block within its section, frames of items aside
- Native: native build targets are build-native, out of the web build
- Commerce: the POS touch style and memory store reads name their types
- Onboarding: a starter site says it is live, and AI answers know it
- Commerce: a synced stock count's adjustment row takes a minted resource id
- AI: an AI layout fills the window, so a short page keeps its footer at the bottom
- AI: the local guided start stops every emulator it started, and waits for slow ones
- AI: a layout names the site by its own name and invents no contact detail
- AI: the tree check settles a Grid container's items for layouts and components too
- AI: a guided start's page may link the pages built after it
- Fonts: the font prepare route tells a refused token from a failed check
- AI: a heading past its ceiling keeps its first whole clause, not a mid-word cut
- AI: a node map's missing children and unheld elements are settled, not refused
- AI: a section whose plan places no component draws its repeated item inline
- AI: the build page shows the contact form being built
- AI: a customer never reads a building rule's own words
- AI: a Grid container's items are sized before the page check, not refused
- AI: a finished job's notification says what it could not build
- AI: a guided start's plan handoff never reads as a failed site
- AI: the item a build is writing shows as building, with its time
- AI: a guided start's site job carries the site's own name
- Native: the native test targets are test-native, out of the jest sweep
- Fonts: each font control loads behind its own boundary in the Typography card
- Fonts: a body font picked from the short list keeps the heading and uploaded fonts
- Fonts: a font delivery chosen without its file sizes is reconsidered in minutes
- Fonts: a customer site draws in the system font until its theme picks one
- Fonts: a published page preloads each theme font once, not twice
- Fonts: a Google font file id may run to 400 characters, so Roboto Flex loads
- Commerce: register presses outlive their step; a payment left at a reader can stop
- Mobile: a quantity stepper shows remove, not delete, when its floor is one
- Mobile: picking a site on a fresh install keeps that site
- Mobile: the self-host host ratchet allows the native app's bundle id
- Mobile: the self-host ratchet allows the APNs topic's bundle id
- Mobile: one declaration per APNs host in the subprocessor inventory
- Mobile: regenerate the native contracts for the device transport fields
- Mobile: the cookie inventory declares the native console session copy
- Mobile: the subprocessor inventory declares the APNs gateways the push sender calls
- Mobile: the subprocessor inventory declares APNs' production and sandbox hosts
- Marketing platforms: the workspace export discloses the connections and owed events
- Marketing platforms: the platforms gate answers 401 only to a refused token
- Marketing platforms: the Mailchimp API base names its declared host literally
- Sales channels: the repo-wide sweeps see the plugin as it is
- Mobile: the subprocessor inventory declares the Android resource namespace
- Bookings: the 3DS sweep classifies the card-present booking payment door
- Themes: the console serves Roboto Flex, the face its theme names
- Marketing platforms: the sync log pages with the shared paged hook and footer
- Marketing platforms: log rows take a minted id, and the plugin has its budget
- Marketing platforms: the brand is the configured one, event URLs spelled whole
- Commerce: the 423 route-gate spec mocks runPluginEventHandlers for detach
- Commerce: the host-lock job sweep expects the payment-method-domains job
- Shipping: the shipping guide documents carrier accounts and labels for the cards
- Tax engines: the Tax service cards open the tax services guide
- Tax engines: the workspace export discloses the shipping and tax data it erases
- Accounting: the host-field sweep strips comments string-aware, so a URL is no field
- Bookings: booking member and in-person doors answer 401 only to a refused token
- Sales channels: cards carry docs help, and only a refused token answers 401
- Tax engines: the tax-engine door answers 401 only to a refused token
- Accounting: the accounting gate classifies a token throw with isRefusedIdToken
- Commerce: the printers door answers 401 only to a refused token
- Commerce: the register-ops gate answers 401 only to a refused token
- Commerce: the POS door answers 401 only to a refused token, not an outage
- Shipping: carrier-rate and shipping doors answer 401 only to a refused token
- Commerce: the product editor stages a country of origin a letter at a time
- Commerce: the tenant image-sink inventory declares the POS and print surfaces
- Commerce: the table-footer sweep classifies the Commerce v3 lists
- Commerce: the webhook delivery log pages past its first 25 rows
- Commerce: shift history pages through the shared footer instead of Show more
- Mobile: the Firebase client comparison calls the GitLive SDKs unofficial
- Mobile: the community-naming sweep exempts the React Native netinfo package's files
- Commerce: the cache-drop sweep exempts the buyer notification switches
- AI: the automation draft's grammar fits its proof again, every trigger kept
- Mobile: the server drops the Expo push sender; transports register at the fan-out
- Commerce: a receipt prints a media-library logo, resolved as the display resolves it
- Commerce: the root barrel stops re-exporting the model, so sites skip its modules
- Shipping: every shipping card carries its help affordance
- Accounting: every accounting card opens the guide for its ledger
- Accounting: the Accounting nav header waits for listed guides before naming a topic
- Accounting: the Accounting nav tab names its id literally, as the flag map reads it
- Accounting: release_accounting declares the two guides that disclose its rollout
- Commerce: the store import and Pirate Ship guides' descriptions fit the excerpt limit
- Commerce: the POS hardware guide's description fits the help excerpt limit
- Shipping: the carrier quote cache's TTL is declared, documented and owed
- Commerce: the print job queue's TTL is declared, documented and owed
- Commerce: the order webhook delivery log's TTL is declared, documented and owed
- Commerce: POS staff names resolve across auth pools, so SSO staff are named
- Commerce: the order API spec expects shipment lines, status and label link
- Commerce: the 3DS payment-door inventory classifies the POS Terminal door
- Commerce: billing health specs expect the Terminal reader webhook events
- Mobile: the self-host reference documents the app's build variables and push switches
- Shipping: the self-host reference documents the Shippo and EasyPost variables
- Accounting: the self-host reference documents the QuickBooks and Xero variables
- Commerce: the media scan's corpus classifies the cloud printer and print job collections
- Commerce: the media scan's corpus classifies the Terminal location and reader collections
- Commerce: a read-only host rules block re-grants no write, so returns and webhooks read as denied
- Shipping: server declarations load their handlers lazily, so boot never pulls next/cache
- Commerce: the host-event picker order names commerce's order and return events
- Legal: the subprocessor inventory declares 10.0.2.2 and the Epson ePOS namespace
- Commerce: the app's camera prompts name the configured brand
- Commerce: the customer display shows the tip just chosen and no tax before pricing
- Commerce: the console surface registers managePos, so the register opens for its owner
- Commerce: the manifest declares the order-status site component it registers
- Commerce: register receipts go where the customer asked, and readers wait for live Terminal
- Commerce: register card payments settle on the platform account, as §10.7 says
- Commerce: refund a split-tender register sale card by card; void, not cancel, an open one
- Commerce: removing a POS register works for merchants, on the server
- AI: regenerate the palette for the return page's new summary
- Commerce: one sale-print path, and print jobs carry minted ids
- Commerce: product labels print in the page's own ink, with no fixed colors
- Mobile: the app's generated paths carry the shipping plugin; drift names each file's own aliases
- Shipping: a queued Shippo void settles from transaction_updated
- Shipping: brand name from config, named quote ids, typed quote race
- Shipping: shipping runs where commerce is on, without a requires edge
- Documentation: Use Pirate Ship spells canceled the American way
- Plugins: accounting takes catalog order 19 beside funnels, and carries v1.0.0-beta.230
- Accounting: a Stripe Tax sale posts without the tax Aglyn remits
- Commerce: a refund made in the Stripe Dashboard raises order.refunded
- Workflows: the webhook transport is lazy-loaded through the plugin's own module
- Workflows: a webhook step reaches only public addresses
- Commerce: the carrier host declarations name no brand
- Commerce: declare the carrier tracking hosts as no-request egress
Performance
- Fonts: keep the font loader out of the published page's browser bundle
- AI: the AI plugin registers its cards and pages lazily, 409 KB to 54 KB eager
Changed
- Native: the Redirects plugin loads from the generated manifest
- Mobile: remove the React Native app, its libs, CI job and tooling
- Mobile: plugins drop their React Native src/mobile entries
- Lists: media, site and campaign list declarations are pure lib modules
- Lists: the list filter grammar is a pure module the native app can plan with
Documentation
- Legal: codat is a listed subprocessor, avalara and taxjar act for the merchant
- Mobile: every console area has a native owner and a parity row
- Legal: merchant-connected fulfillment and tracking services are not subprocessors
- Legal: v11 — the subprocessor list names twilio, shipping and tax vendors
- Mobile: console areas are native; only the Besigner opens in an in-app web view
- Email: auth emails are catalog sends through Resend; Firebase SMTP is a fallback
- Email: platform mail on notify.aglyn.com, Aglyn marketing on news.aglyn.com
- Legal: the subprocessor inventory carries the general rows
- Analytics: the analytics shot shows "Last 14 days", and the guard sees Accounting
- Fonts: what's new names the font picker and the font installer
- Fonts: upload your own font, and WOFF2 in the media library
- Fonts: the theme page describes the font picker, its cost badge and pairings
- Fonts: the inventory says a published site no longer sends visitors to Google Fonts
- Fonts: how a published site loads its theme fonts, and what's new
- Mobile: the native apps carry the console's brand, type and polish bar
- Mobile: choose the Firebase client per platform, with the options compared
- Mobile: the native apps replace React Native as the only apps
- Mobile: native app architecture for iOS, Android, macOS and Windows
- Commerce: the register's payments, item picking, customer display and hardware
- Commerce: a register return is listed under Returns, with its reason
- Commerce: register operations guide and what's new
- Sms: the three Twilio variables and the inbound webhook, in the env reference
Behind the scenes
- Sites: the layout language's image line is prompt text, not a tenant image sink
- Tooling: the Linear ceiling is read off the workspace again, AGL-3671
- Console: the guided-start e2e harness reads screens and creates none
- Console: the layout language's live eval is a known mention of the provider key
- AI: the live sections eval and the emulated env name the provider key
- AI: layout shots write the words an AI-built page shows, for a grep
- AI: the live layout-language eval builds each brief's Contact page too
- Pricing: re-measure the published page the view rate rests on, at beta.230
- Tooling: the Linear ceiling is AGL-3663, read from the workspace; post-purchase package at beta.231
- Tooling: the Linear ceiling is read off the workspace again, AGL-3665
- AI: door tables, step minimums and goldens know the language page and frame
- AI: layout shots render an AI-built Home inside the layout, whole
- Tooling: the Linear ceiling is read off the workspace again, AGL-3664
- Tooling: the Linear ceiling is AGL-3663, read from the workspace
- AI: the prompt-cache ledger carries the insight rule on a site's published state
- AI: a live eval designs six guided starts' pages and frames in the layout language
- wip(ai): a site's and a build's page and layout units are designed in the layout language
- wip(ai): the layout frame typechecks; heading order, item budget and filler settles
- wip(ai): compact layout language checkpoint before restart
- AI: render-layout-shots draws a site layout as a visitor sees it
- AI: the live section eval measures any section writer, five briefs, every figure
- Sites: a hung font origin renders in the sized fallbacks, naming no Google
- Tooling: the Linear ceiling is AGL-3659, read from the workspace
- Fonts: the prepare route's refused token and verifier outage
- Fonts: the fonts plugin's console budget, and the AI page audit re-recorded
- Fonts: the console specs know the Fonts switch and the font zone
- Tooling: the plugin-domain guard reads 'fonts' as the theme's own field
- Mobile: the shell's UI tests sign in and open the site dashboard and switcher
- Plugins: the workspace-locked plugins include email platforms
- Mobile: the Kotlin config, API client, workspace, registry and deep-link cases
- Tooling: test wiring counts Kotlin and Swift tests in a native project
- Tooling: the native libraries are Nx projects but not npm packages
- Commerce: the Terminal connection-token spec refuses with a coded token error
- Tooling: the Linear ceiling is AGL-3656, read from the workspace
- Console: the tax-return findings spec waits for the findings table it asserts
- Console: the org Plugins page counts tax services and sales channels as locked on
- Plugins: the workspace-locked plugins include tax services and sales channels
- Tooling: plugin budgets measure eager bytes and run as a CI guard
- Tooling: the Linear ceiling is AGL-3650, read from the workspace
- Logic: re-baseline the logic plugin's bundle budget for AGL-3603's growth
- Mobile: EAS build profiles for the Aglyn app
- Commerce: register modifiers are a proven-pure module the app may reach
- Commerce: a scanner's pace is the spec's clock, not the test machine's
- Console: the Plugins page counts Shipping among the locked-on plugins
- Commerce: the 80mm receipt's black-on-white stylesheet is a recorded color site
- Releases: the sms plugin carries v1.0.0-beta.230
- Accounting: a mocked-HTTP spec for every QuickBooks and Xero call
- Tooling: the charge-shape guard lets a listed file read a connected account
- Tooling: the Linear ceiling is AGL-3645, read from the workspace
- Commerce: the stock-writer sweep names returns as transactional
- Commerce: declare the returns collection, named where the sweep reads it
- Releases: the sms plugin carries v1.0.0-beta.229
Share this article
We're building the open web platform. Follow along as we ship — and tell us what you need.