← All updates

CHANGELOG

v1.0.0-beta.28

A campaign holds the screens, forms and contacts a push runs across. 528 changes in all: 140 new, 247 fixes, 13 performance, 1 reverted, 24 changed, 56 docs and 47 behind the scenes.

The Aglyn Team · Aug 2026

Released to production on August 31, 2026 at 17:50 CDT. See every commit in this release on GitHub

This version reached production in 2 deploys; the last landed on August 31, 2026 at 18:41 CDT.

New

  • Console: a campaign holds the screens, forms and contacts a push runs across
  • Console: the inbox's sections are addresses, not tabs
  • Email: an email is written on its own page, and its message has one source
  • Marketing site: a campaign of several emails reports what it earned
  • Email: a site holds several senders and an email picks one
  • Billing: a dedicated sending domain is an entitlement, not a tier
  • Console: a campaign's page says what it caused and where it sent people
  • Email: a site chooses the address and the person its mail comes from
  • Billing: a custom sending domain begins at Pro
  • Email: a site without its own domain sends receipts, not nothing
  • Pricing: campaign email begins at Pro, and Starter cannot send
  • Email: the opt-out pages carry the sending site's brand, not the platform's
  • Console: a plugin widget asks who is looking, once per page
  • Console: the organization can see the person its sites share
  • Console: the register and the email console declare who may open them
  • Billing: the page-view rate is held to the page weight it prices
  • Console: the modules the conversions surfaces are built from
  • Console: what the campaigns caused is finally on screen
  • Console: the utilization every margin figure assumes is measured
  • Console: the shell decides who may open a plugin surface, not the plugin
  • Console: the page heading says which section of a surface is open
  • Billing: assist is metered in what it costs, not in how often it is asked
  • Console: the Forms create button moves up into the page header
  • Billing: the tier bands are costed against the prices they are sold at
  • Billing: email sending is priced, and the top plan is no longer unbounded
  • Email: the provisioning sweep claims for sites that have none
  • Email: a site's mail leaves on its own domain, never on aglyn.com
  • Sites: a campaign gets credit for the form, lead, contact and booking it caused
  • Console: the forms surface reaches parity with reusable components
  • Email: the composer names the address it leaves on, and refuses before Send
  • Email: a tenant can add a sending domain, publish its records and verify it
  • Email: one site's sending identity has a route, and only an org admin may write it
  • Email: a test send picks its persona, its recipient and its identity
  • Billing: how many forms a site may hold stops being a per-tier lever
  • Billing: how many forms a site may hold is a plan allowance, and it is published
  • Email: a campaign says what it earned, because we own the checkout
  • Email: stop mailing an address that has gone quiet, without removing it
  • Email: an audience can ask who opened, and say "any of" and "not"
  • Email: engagement is rolled onto the person, not only the message
  • Email: the console says what a send is doing, and lets a campaign be edited
  • Email: a campaign can be removed and a draft thrown away, without losing a send
  • Email: a merchant can require a confirmation click, per stream
  • Email: a verified sending domain has to keep proving itself
  • Besigner: a form is designed in the besigner, and cannot be published broken
  • Console: forms have a list and a page of their own
  • Forms: a form is a versioned document, on the rails a component runs on
  • Email: a recipient can ask for less mail instead of none
  • Email: a campaign reaches an audience larger than one send
  • Email: a workspace has its own bounce and complaint rate, and a new one is ramped
  • Automations: an automation can wait, so a sequence can exist
  • Email: a customer can bring the list they already have
  • Email: an email is written, sent and withdrawn on its own page
  • Forms: a design that would silently stop collecting cannot be published
  • Email: you can write an email here, and send one to more people later
  • Email: every remaining list on the surface reads by the same row grammar
  • Email: a campaign row is a link and carries the console's trailing actions cluster
  • Email: a message row opens the message, and carries where else it leads
  • Email: a topic row opens the topic, and Edit moves off the row
  • Email: the templates list is a table, and its actions are where every other list keeps them
  • Email: a plain-text message previews the mail it actually sent
  • Email: the platform suppression list has a reader, a release and an explanation
  • Email: the composer sends under a topic, and creates through the shared drawer
  • Email: an audience is a resource, with pages and a real filter builder
  • Email: a campaign holds many emails, and the send dialog states its size
  • Marketplace: a campaign email can start from somebody else's design
  • Email: a recipient can leave one stream instead of the whole site
  • Email: a merchant can put an address on the suppression list by hand
  • Email: an email and a template each get their own page
  • Email: the delivery log answers who opened one site's mail
  • Email: a send records which list it went to
  • Console: billing shows the pace a workspace is throttled at
  • Console: an email list can be read, renamed, added to and taken from
  • Console: a campaign report, with every denominator on screen
  • Email: a campaign keeps the populations its own send measured
  • Email: the unsubscribe link can say which campaign it came from
  • Email: the delivery webhook records what a campaign rate divides by
  • Email: campaign reporting math where every denominator is named
  • Data: a dataset record can be read without being opened for editing
  • Console: plan cards state the campaign email allowance, three to a row
  • Console: the site's name, address and backups move to the Admin hub
  • Console: billing opens on the upgrade decision, not the whole catalog
  • Console: a sending domain can ask a provider for its signing key
  • Forms: the forms that already exist can be adopted, and keep their history
  • Forms: per-form submission lists key on the id, not the caption
  • Forms: a form captures a lead, and one person is one lead
  • Forms: a form is a thing, not the caption an author typed
  • Email: the default consent policy enforces retroactively
  • Tooling: backfill a marketing-consent basis over the pre-release records
  • Email: a consent basis records whose act it was, not just what it says
  • Inbox: add a form's sender to a list, on a basis somebody stated
  • Site data: a list membership records WHY it may be mailed, and honors a refusal
  • Cloud functions: the dynamic-list sweep gets the index its query needs
  • Email: a list can be a rule, and the rule never drops anybody
  • Email: a campaign reaches the people who agreed to hear from it
  • Console: the sending-domain records are shown, not guessed at
  • Marketing site: a campaign on an unverified domain answers 409, not silence
  • Site data: a site's bulk send can ask both suppression lists
  • Email: a sending domain that DNS has not proved cannot reach verified
  • Email: a workspace gets a share of the platform hour, not all of it
  • Email: the send path refuses an unverified identity, twice over
  • Email: the three send ceilings are dimensioned against each other
  • Email: a sending domain that is not verified refuses the send
  • Platform: one address-derived document id, on the server side of the barrel
  • Console: the dashboard keeps the cards you keep
  • Plugins: a dashboard widget declares the name its switch will carry
  • Inbox: answer a form submission from the Inbox
  • Inbox: the dashboard says what is waiting for a reply
  • Console: the dashboard glance cards are registered, not imported
  • Console: the upgrade collects what it needs instead of sending you away
  • Console: the subscription lifecycle reaches the workspace feed
  • Tooling: fold one person's two accounts together, by sweeping for the uid
  • Console: the Stripe portal gains a staff door on the org page
  • Site data: a payout that never landed leaves a record
  • Platform: a plugin console page can be a hub of routes
  • Console: creation is an event too, and a check that says so
  • Console: a way to pay an overdue invoice, and a quote that explains its tax
  • Console: a resource records who made it, and the route records that it was made
  • Scripts: reconstruct the activity entries that were never written
  • Console: subscribing is our own page now, and billing details need no plan
  • Console: open a delivery row to read the message
  • Console: import the mail sent before the feed existed
  • Console: a plugin page owns its switch
  • Console: where the platform files its sales tax is a control, not a redeploy
  • Console: the card form is ours now, and nothing opens over the page
  • Console: the ad tags reach every surface we own, and stop on the same word
  • Tooling: one paste sets a secret in .env and on Vercel
  • Console: billing settings you can read and change without a popup
  • Console: what we sent someone, on their staff page
  • Sites: already-published images get their intrinsic size
  • Console: a site's plugin settings follow the workspace's, and can stop
  • Platform: a plugin setting a workspace answers once, a site may answer itself
  • Console: an authored analytics event carries params
  • Commerce: a member account door reports to the host's own GA4
  • Console: the sales tax return files where the deployment is registered
  • UI components: images carry their own dimensions, so the page stops shifting
  • Sites: a hostname becomes reachable without a hosting vendor
  • Console: a paid subscription reports its Google Ads conversion
  • Platform: a signup reports the Google Ads conversion it earned
  • Console: the console asks before it measures
  • Platform: a site can run its own Google Ads and LinkedIn tags

Fixed

  • Tooling: a re-baseline keeps the calibration, and an exact boundary is not drift
  • Repository: clear the release gate — raw NUL bytes and fabricated changelog ids
  • Console: a record's detail page is headed by the record, not by its list
  • Sites: the admin bar's Orders link opens Orders
  • Email: a dedicated domain reads as the request it is, and senders are documented
  • Email: a campaign batch keeps inside the provider's request rate
  • Email: a provider rate limit defers the recipient instead of settling them
  • Repository: a test spanning two plugins moves out of the app that owns neither
  • Email: a confirmed opt-in lifts the bounce it just disproved
  • Console: a review verdict stops chasing a dead publisher mailbox
  • Marketing site: a campaign page leads with what the campaign caused
  • Console: orders are not an inbox
  • Security rules: the sending-label pin and its request stamp are Admin-SDK only
  • Email: a dedicated sending domain is requested, not issued
  • Email: the sender picker offers everyone who works on the site
  • Console: the emails hub's first section stops repeating the hub's name
  • Email: a spec binding named module fails the next lint rule
  • Billing: every upgrade card says what the next screen will ask for
  • Email: a sending domain no longer outlives the site that owned it
  • Runtime: an immediate action email asks who it is mailing
  • Email: a topic opt-out reaches the senders that only the gate guards
  • Sites: the unsubscribe page logo is named in the image-sink inventory
  • Email: the shared pool is the floor under a dedicated sending domain
  • Email: a campaign honors the pace its recipients asked for
  • Billing: a plan the org did not buy says so, instead of a dead button
  • Console: the zone read sees the whole zone, not its first page
  • Platform: campaignAttributions is classified for the media scan
  • Console: the usage meters hold until the plan is known
  • Repository: the spec configs compile against the types they are asserting
  • Console: the plan grid delivers all eight plans and says each fact once
  • Repository: npm run lint runs the linters again
  • Billing: the plan count includes the plan the grid folds away
  • Security rules: reading the CRM asks for the permission its console asks for
  • Email: the audience table reports the basis the sender acts on
  • Console: the sending-domain sweep runs on a scheduler instead of nothing
  • Pricing: publish the email-send and assist overage rates the product already bills
  • Email: a mailbox provider can reach the unsubscribe link it is told to POST
  • Email: a domain the provider already holds is adopted, not refused forever
  • Email: a sending domain's own page is reachable from the list
  • Accounts: a request that cannot be authorized is not sent, and does not hang
  • Console: the marketing conversions tab has a title
  • Email: the sending-domain provisioning sweep has the index it queries
  • Security rules: reading who is on an audience needs the authority to manage data
  • Email: scheduling a campaign that cannot be authorized says so instead of nothing
  • Security rules: a custom role that revokes data.manage is honored by the rules
  • Console: the conversions section says why the kinds stand apart
  • Pricing: the margin model counts assist credits, and cannot miss the next cost
  • Tooling: the page-weight gate's --entry note names a client root
  • Repository: the deploy-ordering guard covers the Cloud Scheduler routes too
  • Console: the margin surface answers the console's standing guards
  • Pricing: the add-on tables state the rates the code charges
  • Console: one mock key per name, so the app typechecks
  • Billing: our cost of goods stops crossing the customer boundary
  • Pricing: every table the /pricing generator emits is reconciled, not two
  • Pricing: the published tables carry the resized allowances
  • Console: the enrollment double declares its campaign lookup once
  • Console: the relaxed-coverage test measures the band before it trusts it
  • Self-hosting: the per-site sending domain answers to the two self-host guards
  • Console: a plugin's site page and its workspace page title apart
  • Pricing: the Pro bandwidth band is sized to the tier's own cost model
  • Console: a plugin section gets its own browser-tab title
  • Forms: the catalog quotes the allowance the server enforces
  • Billing: the assist credit odometer declares its lockdown posture
  • Billing: close the last of the negative tails, on both levers
  • Pricing: the annual Agency price is the one Stripe charges
  • Consent: a marketing basis runs to a brand, not to an account
  • Console: the identity picker offers the site's own domain, not aglyn.com
  • Console: the enrollment double answers the campaign-touch lookup
  • Console: the content entries page IS the query
  • Commerce: the recovery queue counts an ordered walk
  • Commerce: the orders table reads the most recent orders, and says so
  • Commerce: the money cards read the period they report
  • Bookings: a refunded appointment stops counting as revenue a campaign earned
  • Besigner: a form is placeable from any document, and an empty picker says so
  • Email: the attribution record is server-only, and three assertions were vacuous
  • Console: forms are reachable from the nav
  • UI components: a table row's cells sit on one vertical center
  • Email: a confirmation message is counted like every other send
  • Email: the erasure double did not honor a field deletion
  • Email: three specs typecheck under their own tsconfigs
  • Email: the sender's address comes from the server, and only from the server
  • Console: the console plugin API dispatcher bounds what one operator can spend
  • Email: an immediate send may name an email, but only an unsent one
  • Console: the discoverable-form scan is a text file again
  • Scripts: the form-id backfill refuses an argument it does not understand
  • Email: an email always says which template it used, or that it used none
  • Forms: a date field's label stops sitting on its own placeholder
  • Email: a campaign of one names its email, and one record opens one page
  • Platform: the media usage scan classifies the campaign container
  • Email: a site editor cannot forge a campaign's delivery record
  • Email: one alignment decision per campaign column, not two
  • Email: the send-ceiling spec may read the price table it checks against
  • Email: the copy that gets mailed is sanitized like the copy that gets previewed
  • Email: the pre-send preview answers, and one renderer draws what is mailed
  • Email: bulk mail carries an unsubscribe, a suppression check and a ceiling
  • Email: an unrecorded delivered count read as a 0% delivery rate
  • Console: the enrollment-and-send spec doubles the two helpers its sender now calls
  • Marketing site: the Figma pricing frames carry the lowered email allowances
  • Data: the record view renders a list item by item, not as a join
  • Platform: a consent-provenance fixture names a role, not a person
  • Pricing: the top two email allowances come down to what we can deliver
  • Console: a metered limit on a plan card carries its rate
  • Console: the Enterprise card states its limits instead of omitting them
  • Console: the Enterprise card stops printing its highlights twice
  • Console: each plan card states what it alone adds
  • Console: the issuing join survives a domain released mid-write
  • Besigner: the form picker offers the site's forms instead of nothing
  • Scripts: the demo-host check reports a failure it could only call unknown
  • Marketing site: a replayed delivery event no longer counts twice
  • Scripts: a typo in the backfill's --exclude no longer writes over a real person
  • Marketing site: proofing your own draft is not a marketing send
  • Email: the default consent policy is the one the sends actually apply
  • Console: the campaign allowance is reported off the counter that gates it
  • Cloud functions: the dynamic-list query wants a single-field index, not a composite
  • Marketing site: a campaign reaches a knowable set of people, and says which
  • Email: one person subscribing twice is one list member, not two
  • Inbox: the reply card stops spacing itself, and admits its window
  • Console: the automation guard reads the section ids where they now live
  • Redirects: the plan refusal belongs to the shell that renders it
  • Console: the Traffic card takes the row, and reads across it
  • Console: the workspace pickers page on the shared footer
  • Platform: the admin-gate check reads rules, not prose
  • Console: the refusal names the add-on, and cannot grant itself
  • Marketplace: a role refusal names the roles it admits
  • Console: a member's orders page, and the lifetime figure stops guessing
  • Console: the refund charge list pages, and admits it is a window
  • Redirects: the rule list pages, and the walk names its order
  • Events: the events list pages, and says when it is short
  • Console: the events page stops promising an upgrade it can't deliver
  • Console: a legal acceptance's sha256 links to the document it hashes
  • Console: the flags page banner stops carrying an oversized help icon
  • Marketplace: a listing's reviews page, and the guard sees the helpers
  • Console: the license lists page, and name the order they walk
  • Console: the stuck-claims list pages, and its figures say "at least"
  • Console: the erasure queue pages, and says when it is a floor
  • Cloud functions: themeHistory is server-owned, and the split can now run
  • Repository: drop 85 citations that named the wrong real issue
  • Console: a self-host dunning email points at the operator's own console
  • Console: a card that needs authentication gets to authenticate
  • Repository: the list-pagination arc cites the issue it is actually about
  • Tooling: a citation names an issue that exists, and a guard keeps it that way
  • Sites: four specs assert against shapes the compiler allows
  • Commerce: the commerce lists reach past their first window
  • Tooling: a deploy script refuses an argument it cannot parse
  • Console: a retained version is an event; a resource's first is not
  • Console: a site's lifecycle events reach its own log
  • Console: the staff overview names the workspace, not its id
  • Console: a manager seat is taken in the transaction that grants it
  • Site data: erasure stops at an address two accounts hold
  • Workflows: the actions list is bounded, the expander is a footer
  • Commerce: the discounts hub reaches the payment link and the register
  • Platform: the sign-in screen is an admin decision
  • Console: the order row declares the two fields that decide its mode
  • Console: capacity cannot be dropped out from under what is using it
  • Commerce: a rehearsal stops reporting itself into the merchant's analytics
  • Console: the bank challenge runs against the intent Stripe is holding
  • Commerce: a smoke-test order stops counting as revenue
  • Redirects: the redirect cap counts what the server counts
  • Console: a half-typed site setting survives changing tab
  • Sites: the detector learns the shape a plugin list is actually written in
  • Console: a seat pool cannot shrink under the sites holding it
  • Console: the billing address gets one editor, sharing moves out
  • Console: the mode notice covers the org it was written for, and Plan fills its row
  • Console: the downgrade warning measures what the plan includes
  • Sites: a workflow step stops writing dataset rows nobody paid for
  • Commerce: the discounts hub reaches buy-now, and the product page can take a code
  • Marketplace: a facilitated sale records the state it was taxed in
  • Console: mail history and erasure see every address
  • Console: a provider address joins the uniqueness index
  • Commerce: a scoped discount stops discounting the whole catalog
  • Console: a marketplace moderation decision is retrievable by what it acted on
  • Commerce: one dashboard stops showing two different revenues
  • Console: an audit entry reaches the page of the person it is about
  • Console: one opening of a message is one audited access
  • Console: the ledger stops asserting money arrived
  • Console: the tax ID is asked for before the charge it changes
  • Console: a mid-cycle plan change quotes its tax
  • Marketplace: a publisher can take their bio down
  • Console: an abandoned bank confirmation stops being invisible
  • Commerce: a coupon can be given the expiry both checkouts already enforce
  • Console: the confirm quotes the proration too, not next month's invoice
  • Commerce: a stranded merchant gets a door into Stripe
  • Commerce: a line refund gives back what the buyer paid, not the list price
  • Console: a site with one member has no mystery about who built it
  • Commerce: a free-shipping code stops charging for shipping
  • Commerce: an abandoned booking stops holding its dates forever
  • Platform: an abandoned signup stops holding a paid plan and booking its MRR
  • Commerce: a canceled order stops counting as revenue at a glance
  • Commerce: the payments card stops calling stranded funds enabled
  • Commerce: the plugin lists get a footer, and name what they page
  • Console: a site built from a template records that it was
  • Console: a plan switch quotes what it costs, not next month's invoice
  • Console: the delivery dialog settles, and every cell sits on one line
  • Workflows: the run history asks for its own rows
  • Commerce: the public availability reads stop at their own horizon
  • Site data: the cross-pool user sweeps ask the pools together
  • Console: a table with rows under it has a footer under those
  • Console: a finding names its rows, and we stop filing our own sale
  • Console: the delivery table is one line per row, at full width
  • Console: the recovery queue names its seller, and the label map is in scope
  • Console: the Assist board names its workspaces and states its cuts
  • Console: the audit log pages on the shared footer
  • Console: the staff Users list pages what it draws, not what it fetched
  • UI components: a hidden footer stops paging, and a dead size menu stops drawing
  • Console: the site artifact lists page an ordered walk
  • Site data: a dotted key in a merge-set is a field NAME, not a path
  • Console: a refused save says why, and the guard covers the EIN
  • Console: a compact field stops truncating its own label
  • Documentation: the trust page stops denying the ad signals it now grants
  • Console: the ad tags this console mounts are named in its candidate CSP
  • Console: a breadcrumb names the section you are on
  • Console: the country namer stops being assigned twice
  • Console: a site's plugin page gets its own help destination
  • Tooling: the new guard's own advice published an unprovisioned mailbox
  • Email: every message carries an HTML part, so its links are links
  • Monitoring: every uptime check carries the firewall bypass header
  • Console: the site collaborator list is in the order it looks like it is in
  • Marketplace: the marketplace shelf and the template gallery page
  • Plugin data: the records table walks the collection instead of sampling it
  • Documentation: the two customer-facing uptime checks have been dark for a week
  • Platform: one client-address reader, and a hop a caller cannot pick
  • Monitoring: the receiver and the channel get read honestly
  • Email: the credential probe stops looking like failed mail
  • Commerce: every paid path reports its checkout
  • Monitoring: the platform 5xx log gets a policy that watches it
  • Sites: a tenant site is not a page that uploads
  • UI components: the vertical tab rail follows its own URL
  • Console: the screen and layout editors report a refused cache drop
  • Sites: the wildcard driver claimed apexes nobody named
  • Console: a publish says so when the live pages were not refreshed
  • Platform: two env-mutating specs shared one global loader
  • Console: a refused save no longer publishes and says it worked
  • Platform: a closed tab no longer loses the subscribe conversion
  • Console: the privacy control reaches pages with no account menu
  • Platform: the geo signal and build stamp work off Vercel
  • Platform: the country signal is not one platform's header
  • Platform: the console declares the advertising it actually does
  • Plugin data: the delete spy declares the argument it is asserted on
  • Plugin UI: a subtitle names its element at the call site
  • Platform: a record delete asks the query, not a page
  • Themes: a subtitle is a type style, not a heading
  • Sites: every published page gets a main landmark
  • Sites: the analytics hits reach Google again, on both of its domains
  • Console: a tracking id can be turned off, not just on
  • Commerce: a scanned barcode reaches the whole catalog
  • Commerce: the catalog search reaches the whole catalog
  • Platform: a node interaction reaches the page it was authored on

Performance

  • Sites: the root layout stops pulling the icon catalog for one constant
  • Tooling: the page-weight gate pins the boundary, not only the ceiling
  • Sites: the published page stops reaching core through a barrel
  • Sites: the page-weight gate and the host module its parent commit names
  • Sites: a published page stops downloading the console half of core
  • Besigner: an entity picker browses a page instead of a catalog
  • Plugins: the console cards order their windows and read pickers on demand
  • Commerce: the product editor reads its pickers when it is opened
  • Inbox: the inbox mounts the section being read, not all of them
  • Console: one read for a whole page of /v1/sites, not one per site
  • Site data: the media delivery gate reads three fields, in one batch
  • Console: a hub index redirects on the server, so it stops flashing blank
  • Commerce: one catalog read seeds every grid on the page

Reverted

  • Tooling: drop set-env-secret, which only worked for Aglyn

Changed

  • Console: the zone read uses the documented endpoint version
  • Console: a form is a capability with both halves, so it is a plugin
  • Plugins: the campaign shapes marketing reads stop living inside the email plugin
  • Console: a campaign is a marketing object, and now lives there
  • UI components: the rule that a rate names its denominator has one home
  • Email: the templates section says templates in its URL too
  • Email: one figure component, and one name for a message's campaign
  • UI components: the create drawer moves to a library so plugin pages can use it
  • Platform: the list-enrollment rule moves to the framework both callers can reach
  • Console: the section that holds Workflows is no longer called Workflows
  • Security rules: the host membership helper is named for the test it makes
  • Console: drop the second spelling of the Setup tab-id list
  • Console: the Setup layout stops importing the cards it no longer renders
  • Console: Host Setup is five routes, and its sections stop costing what they never showed
  • Email: three more plugin hubs are routes, metered first
  • Console: drop the pre-split billing page
  • Console: billing is four sections, and an unopened one costs nothing
  • Console: delete the embedded checkout panel
  • Console: marketplace sections are routes, unopened tabs stop reading
  • Console: drop the checkout dialog the panel replaced
  • Console: the tab param's compatibility layer goes
  • Console: the console asks a provider for a name, not Vercel
  • Platform: one consent dialog, on every surface
  • Console: the account page becomes six routes

Documentation

  • Pricing: checking a live page needs the probe header, not a browser
  • Pricing: the SEO description is a ninth surface, and one request cannot confirm a publish
  • Pricing: the page caught up, and the SEO description is a surface too
  • Pricing: the Agency raise is recorded, and every surface it had to reach
  • Email: two comments cite copy that no longer says what they quote
  • Email: the words describe the sending model the product actually has
  • Self-hosting: the two shared-pool settings get their rows
  • Email: a sending-domain slot is a bundled quota, not a per-domain price
  • Pricing: the recorded page weight is first paint, and says so
  • Security rules: record the resolved-permission projection where the other two live
  • Self-hosting: state the ratchet's rule as a technical fact
  • Tests: record what the read-cost pass fixed and what is left
  • Tests: classify every oversized read by who pays for it
  • Email: the gate's comments state the rule, not how it was assembled
  • Email: sending domains and the proof drawer are documented, and the registers agree
  • Repository: the plugin boundary audit names the elements filed in the wrong library
  • Email: tell customers about import, opt-down and confirmation
  • Repository: the one-click unsubscribe check says what a human must actually do
  • Email: the gap register records what closed, and what P11 leaves open
  • Email: a template's standing has no writer yet, and says so
  • Tests: the email registers say what is actually built
  • Self-hosting: the marketing frequency ceiling is a configurable number
  • Email: the gap register marks what has since been closed
  • Email: the nine-field rule is reachable, and G4 is closed
  • Email: topics and the preference page, for customers and for operators
  • Email: the campaign send cap is per workspace, not per site
  • Tests: the email overhaul spec stops describing problems that are fixed
  • Console: the read meter records why the emails figures moved
  • Tests: the shared domain hides which tenant earned a complaint
  • Tests: where email actually stands against the products it is sold beside
  • API: the form-submission object publishes its form id and its routing
  • Self-hosting: the two sending-domain variables an operator must set
  • Site data: name every writer the dated rule filters depend on
  • Design: what custom sending domains do, and where the build stops
  • Tests: the email spec described a send order the code never had
  • Tests: the list-member key is one derivation, and not in the file either spec named
  • Tests: why the Inbox got a reply button and not an add-to-list one
  • the automation section is named Automation, its tabs keep their names
  • Tests: a form is not an object in this product, and that is the whole problem
  • Tests: correct the email spec's headline finding — the secret was set
  • Tests: the email feature is mostly built and mostly switched off
  • send readers to Admin for the surfaces that already live there
  • Console: the unmetered months are written off, and why not to chase them
  • Console: the Billing address card says which tax it sets
  • Marketplace: name the listing review state and pin the queue
  • Releases: the owed rules deploy, the billing decision, and the field a feed cannot be read without
  • Platform: the dead-status note stops citing a bucket that no longer exists
  • put the stale-GA-settings marker where the paragraph still reads
  • Analytics: five places still said Google Signals was off
  • Sites: a comment that claimed a reader, and a person quoted
  • the domain provider gets a runbook, and four shipped surfaces get a page
  • the self-host template names the domain driver and the tax jurisdiction
  • Documentation: every env var a self-host operator sets, in one place
  • Sites: the CSP says why it carries no script-src and no trusted types
  • Analytics: google signals is on, and on deliberately
  • Pricing: saving the live version revalidates, and the note said otherwise

Behind the scenes

  • Email: a free site is proved to send, not just to be ungated
  • Email: the batched-send clock is the one the code reads
  • Email: the guards on a branded opt-out page
  • Console: the metering case derives its bands instead of retyping them
  • Merge branch 'feat/shared-permission-resolution'
  • Console: the two conversions assertions that were passing on nothing
  • Email: the campaigns section holds a document ceiling, not a log line
  • Console: the forms list drops a snackbar it never raises
  • Forms: the contract check stands between the author and the write
  • Leads: a returning person's capture serialises against nobody
  • Email: every create control sits in its card header, contained
  • Email: campaign figures line up under their own headers
  • Email: the seven campaign-send doubles model the topic filter
  • Console: classify the campaign report's two tables
  • Repository: ignore the isolated nx cache directories
  • Console: the two pricing guards follow the lowered allowances
  • Console: the three plan cards read across cleanly
  • Scripts: the citation ceiling admits AGL-2502
  • Scripts: the backfill self-test names no Aglyn hostname
  • Marketing site: the two suites the org hourly claim was not added to
  • Marketing site: a sendable campaign audience carries a consent basis
  • Email: the three capture surfaces record a basis, and only a basis
  • Scripts: report the people holding two list rows, and never delete one
  • Events: the ceiling helpers are real in the doubles
  • Console: the member-drawer double answers the whole firestore surface
  • Console: the free-workspace ceiling on /api/orgs/create is covered
  • Console: the tax controls join the super-only surface map
  • Console: the create doubles carry the audit write and the refusal
  • Console: meter what each Host Setup section reads, before it becomes routes
  • Marketplace: the sale's jurisdiction, and that nothing is backfilled
  • Commerce: the refund suite can reach line refunds, and stops eating its errors
  • Console: the crowding spec fills both access halves, so it can fail
  • Console: the overview answers a spike instead of throwing on it
  • Sites: the console guard names its one ad mount instead of forbidding all of them
  • Platform: the hardcoded-host guard names the personal-identifier checker
  • Tooling: the public repo stops naming a person
  • Console: the footer guard walks every plugin, and a paged list names its order
  • Console: the site-plugins mocks name every component the card renders
  • one canonical author identity
  • untrack the agent handoff notes
  • untrack the agent handoff notes as well
  • untrack the personal agent instructions
  • Console: the media-alt assertion stopped testing the formatter
  • Platform: type the consent theme spec against the real stored record
  • Platform: the site's consent surface wears the site's theme
  • Platform: the closed-tab recovery is covered, not just written
  • Sites: prove the shared gtag library is fetched once, not twice

Share this article

The Aglyn Team

We're building the open web platform. Follow along as we ship — and tell us what you need.

Start building on Aglyn.

Free to start — design your first page and publish in minutes.