v1.0.0-beta.28
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
We're building the open web platform. Follow along as we ship — and tell us what you need.