Refresh developer docs, deployment notes, and public-site copy to describe the Postgres-backed encrypted key and message-map model after DynamoDB removal.
site/src/pages/index.astro imports { animate, inView, stagger } from
'motion' for its scroll/entrance animations, but the package was never
declared in site/package.json. astro build (Site CI) therefore failed to
resolve the import (Rollup: failed to resolve import "motion"). Add
motion@^12.34.0 (matching web/) and sync site/pnpm-lock.yaml so the
frozen-lockfile install + build pass.
Add PUBLIC_HOST wiring for local web, admin, site, realtime, and backend CORS so the native dev stack can be reached over Tailscale or LAN without changing localhost defaults.
Three surfaces close the loop on the limit-increase workflow:
- admin/dashboard/LimitRequestsPage.tsx queues every pending request
with full context (org → users → field → current vs requested →
+delta) and one-click approve/reject. Both actions open a review
dialog; approve notes are optional, reject notes are required and
surface to the customer.
- web/settings/limits/page.tsx is the customer-facing form. Resource
selector, requested value, reason textarea, plus a list of every
past request with its status (pending/approved/rejected/cancelled)
and the reviewer's notes when present. Pending rows expose a
cancel link. Footer links to the ToS limits clause.
- site/terms.astro grows a new section 07 ("Usage limits and
increase requests"). Explicit: "unlimited" means no plan-tier cap
but a product-wide hard ceiling still applies, increases are at
Warmbly's sole discretion, and previously granted increases can be
revoked when reputation signals deteriorate. Bumps every existing
section heading and id from 07 onward.
Admin sidebar grows a "Limit requests" entry under Accounts (Gauge
icon). Web settings layout grows a "Limits" section under owner-only
sections.
The animated fanout SVG was not landing. Removes the entire diagram
panel so the page goes hero, then How it works, then categories.
Tightens the hero bottom padding now that nothing overlaps it.
Drops the fake floating dashboard. The new hero panel shows a real
story: a single campaign.reply_received event lands on the Warmbly hub
and fans out to five concrete provider channels (Calendly meeting
booked, HubSpot activity logged, Slack #sales notified, Cal.com demo
booked, Pipedrive deal advanced). Each channel has a traveling SVG
packet animation. Subtle pulsing hub ring and per-card receive pulses.
The diagram tells the integrations value proposition directly instead
of showing generic dashboard rows.
Replaces deliverability + DNS sections with CRM, Automation,
Notifications, Meetings, and Data. Mock dashboard reflects the new
provider mix. Number-strip and copy adjusted to match the
twelve-provider catalog.
Keeps the page structure (hero, floating dashboard, three-step connect
diagram, four category sections, webhooks + API, security, at-a-glance,
FAQ, CTA). Rewrites every headline and body in straightforward
descriptive prose. Drops the editorial "Stance" critique section.
Removes em dashes throughout in favor of periods, commas, and
parentheses.
The admin and marketing site sit outside the compose stack, so `make app`
never started them. Add `make admin` and `make site` to launch each
workspace's dev server (Vite on 5174, Astro on 4321), and update the root
README and admin/README to point at them instead of the old "open
localhost:5174" line that implied `make app` was enough.
Also add `make grant-admin EMAIL=... [ROLE=super|support|ops|analyst]`
plus `make revoke-admin` so the first super-admin can be seeded without
hand-writing SQL. Role bitmasks mirror AdminRolePermissions in
internal/models/admin_permission.go.
Strips the stance section, mock dashboard, 3-step model, "by the numbers"
strip, and FAQ — leaves a clean catalog: hero, four category grids
(Deliverability, DNS, Meetings, Data), and a Webhooks + API block with
the real event types. Each integration card now shows its auth method
explicitly.
Full rebuild matching the deliverability/warmup/developers pages:
HeroAtmosphere, floating dashboard mock, opinionated stance section,
3-step connection model, per-category sections (deliverability, DNS,
meetings, data), webhook event surface with sample payload, security
strip, by-the-numbers footer, FAQ accordion, CTA.
Content frames the tier 1/2 prioritization decided in the planning
session — short catalog (nine providers, all directly load-bearing)
plus an open webhook stream that anyone can build on top of.
Activity feed and its 'streaming' header were taking too much vertical
space. Removed both and let the four KPIs (Peers, Replies, Inbox,
Spam) sit on a single full-width row below the sky-tinted divider.
Big tabular numbers, eyebrow + sub-line each, no boxes. Pool
composition strip stays at the bottom.
Section is now: title bar, six mailbox rings, divider, KPI row,
pool strip. Roughly 35% shorter overall.
User said the big SVG chart was too much and white borders looked odd
on the sky theme. Restructured the warmup mock entirely:
- Dropped the big SVG ramp chart.
- Dropped every white-tinted border / divider / ring. No more
border-white/X, divide-white/X, ring-white/X anywhere in this
section.
- Top row is a quiet status header: 'Mailboxes in warmup .
acme.co' eyebrow on the left, 'pool active' streaming pill on
the right.
- Six small circular progress rings, one per mailbox (founder,
hello, team, intro, partnerships, support). Each ring is a
bare SVG with a sky-tinted background track and a sky gradient
stroke that fills proportionally to day / 30. Day number sits
inside the ring, full mailbox under it, mono 'day X / 30' below.
Group hover bumps the scale 5%.
- Section divider is a thin centered gradient line in sky-200,
not a white rule.
- Live pool activity stream takes the focal-element role. A
vertical-scrolling feed (warmup-feed-track, 45s loop, masked
fades top + bottom) with timestamp + dot + email + action +
uppercase kind tag (reply / send / rescue / star). Sits on
the sky bg with no panel chrome.
- KPI column to the right of the feed: Peers 142, Replies 11,
Inbox 96.4%, Spam 1.8% in a 2x2 grid, big tabular numbers, no
surrounding box.
- Pool composition strip remains, also box-free.
Warmup section: kept the dark sky radial gradient and drifting clouds,
swapped the flat 6-row mailbox table for a single-mailbox product
detail mock that actually looks like the warmup screen.
- App-shell top bar with traffic-light dots, Warmup / founder@acme.co
breadcrumb, healthy pill.
- Body splits into a chart column (1.55fr) and a KPI rail (1fr).
- Chart column: real SVG ramp from day 1 to day 30 (10/day -> 40/day,
+1/day), area gradient sky-300 -> transparent under a sky-300 ->
sky-500 stroke, dashed y-gridlines, mono d1/d8/d15/d22/d30 x-ticks,
vertical dashed guide at today (day 22) with a glowing dot and a
'today' badge. To the right of the chart header, today's value
'32 / 40' is shown big and right-aligned.
- KPI rail: Pool peers 142, Replies in 11 (rate 34%), Inbox 96.4%,
Spam 1.8%, each with a mono eyebrow and a sub-line.
- Recent pool activity feed below: an 8-row list duplicated and
wrapped in a .warmup-feed-track that vertical-scrolls forever
(45s loop, respects prefers-reduced-motion). Each row is timestamp
+ colored dot + email + action + uppercase kind tag (reply / send /
rescue / star) so it reads as a real event log.
- Pool composition footer retained (Gmail 46% / Outlook 24% / Yahoo
12% / iCloud 9% / Self-IMAP 9%).
Trial scope: the hero caveat that the trial is '1 mailbox' was wrong;
it is now '2 mailboxes' as the user clarified. Same line, same place.
User asked for creative, on-theme, professional, not AI-generated. The
home pricing now uses the same sky-atmosphere hero pattern the rest of
the product pages use, with the card grid floating over the sky-to-white
boundary the way /pricing handles its hero.
- Section split in two: a relative-isolate sky hero with HeroAtmosphere,
then a -mt-32/-mt-40 white section pulled up under it that holds the
card grid and the see-comparison link.
- Hero content: small white sky-style mono 'Pricing' eyebrow, one big
white headline 'Pay for what you send.', a short white/80 subhead
naming what's bundled, and the toggle on a translucent backdrop-blur
pill. Save 20% pill also translucent-on-sky.
- Toggle thumb flipped to white on the sky bg (matches /pricing's
approach). Toggle JS updated to swap the active button color to
sky-7 dark and the inactive to white/70 so the labels stay legible
on both states of the new chrome.
- Card grid below unchanged; it now floats over the sky boundary like
the cards on every other product page do, which makes the home
pricing section visually consistent with the rest of the site.
User asked for something clean, useful, visually appealing. Header above
the cards is now a real value-proposition surface instead of a marketing
block or a chart.
Layout:
- Top line keeps the tiny 'Pricing' sky-6 eyebrow on the left, with the
toggle and Save 20% pill pulled right.
- A single white panel sits below with its own mono SHOUT eyebrow
'Bundled on every paid plan' and a quiet subline 'same product .
different sizes'.
- Six clickable feature tiles inside the panel in a 6-column row
(2 / 3 / 6 across breakpoints), each with a sky-1 chip icon, a
feature name, and a one-line description: Warmup, Sending,
Unified inbox, Analytics, CRM, API & webhooks. Each tile links to
its product page so the panel is functional, not decorative.
- One short centered line under the panel anchors the pricing thesis
(you pay for daily send volume; everything in the panel ships on
every plan).
Clean (no headline shouting, no chart, no side panel), useful (every
tile is a real surface and a real link), visually appealing (the
6-tile grid has its own composition that earns the space).
User wanted something entirely different and creative. The header now
*is* a chart. Plan names sit above the sends/day tick that unlocks
them, on a single horizontal axis with a sky-color gradient implying
ascending scale.
- Top row: 'Pricing · sends per day' eyebrow on the left, toggle and
Save 20% pill pulled to the right (no centered marketing block).
- Volume axis: 4 evenly spaced ticks, name above the dot, sends/day
number below. Starter 150, Grow 3,000, Business 15,000, Enterprise
infinity / custom.
- Business is visually emphasized: brand sky-6 fill + sky-2 ring +
outer rgba shadow ring, bigger number, brand-color name with a
trailing dot. The 'highlighted' card below is the same plan, so the
chart and the cards reinforce each other.
- Below the axis: one short line stating the actual product positioning
(the lever that changes between plans is sends/day; everything else
is included). Replaces the marketing headline and subhead entirely.
- Cards below unchanged.
Replaces the asymmetric editorial 2-column layout with a minimal
centered header: small sky-6 'Pricing' eyebrow, one big 'Same product.
Four sizes.' headline, the toggle directly below with the Save 20%
pill. No side control panel, no trust strip, no trial scope paragraph,
no subhead. The card grid does the rest of the work.
Selected by the user from a four-way preview pick.
The user pointed out that listing '14-day trial' and 'No credit card' in
the same checkbox grid as the paid plans is misleading: those facts only
apply to the trial signup, and the trial has its own limits (1 connected
mailbox slot) that were never stated.
This commit splits the two:
- The 2x2 fact grid in the billing card now lists only things that are
true for every paid plan: Unlimited mailboxes, Unlimited warmup,
Cancel any time, Self-host on Apache 2.0. No trial-specific claims
in this list.
- The trial scope gets its own honest one-liner below the grid, on its
own divider: 'Free trial: 14 days, 1 connected mailbox, no card.
Pick a plan from below to unlock everything in this list.' So the
reader cannot mistake the trial scope for the paid-plan scope.
The user pointed out that pricing is per workspace not per mailbox, and
that the centered-marketing-block header was getting worse with each
iteration. Cards stay byte-for-byte untouched.
- Centered marketing block replaced with an asymmetric 2-column editorial
layout: left holds the headline, right holds a control panel.
- Eyebrow drops 'billed per mailbox' entirely (factually wrong, and
obvious enough that it does not need to be said).
- Headline rewritten to 'Same product. Four sizes.' which states what
the four-card grid below it actually represents, without making any
per-anything claim about billing.
- Subhead names the bundling promise (every paid plan ships with every
feature) and the lever you pull (daily send volume).
- The right column is now a real control panel: a Billing eyebrow,
the toggle plus Save 20% pill, then a 2x2 fact grid (14-day trial,
no credit card, cancel any time, self-host on Apache 2.0) on a
white ringed card with a soft shadow.
- Trust facts moved off a long horizontal strip into the panel grid so
they read as facts about billing rather than a banner.
Edge-to-edge plan card grid below the header is unchanged.
User said the price boxes are good but the section header above them
was bad. Only the header block changes.
- Drop the brand-soft eyebrow chip and the italic flourish on
'Predictable.' Both read as marketing-template noise.
- New eyebrow uses the standard site mono caps style:
'Plans · billed per mailbox' in 10.5px sky-6.
- Headline rewritten to 'Pick a volume. Get every feature.' which
states the actual product positioning (volume-priced, not
feature-gated) instead of a vague adjective. Two-line break on
sm+ so the line lengths balance; reflows on mobile.
- Headline scaled up the responsive ramp (40 / 52 / 64 px) so the
section reads as a real chapter break rather than a small subsection.
- Subhead names every product surface that's bundled (warmup, sending,
unified inbox, analytics, CRM, API), so the reason there is one
number is obvious.
- New trust strip under the toggle: 14-day trial, one mailbox to start,
no credit card, cancel any time. Four short reassurances, sky-color
checks, dot separators, no banner theater.
Edge-to-edge card grid below is byte-for-byte unchanged.
Cards stay edge-to-edge. Only the price-number swap changes.
- Price markup adds the .plan-price > .plan-price-inner wrapper pair
/pricing uses, with overflow-hidden on the parent so the new digit
can rise from below the cropped box.
- Toggle JS replaces the motion.dev opacity fade on .price-amount with
the same two-phase translateY swap /pricing runs on .plan-price:
phase 1 lifts and fades the old value to translateY(-100%), phase 2
drops the new value in from translateY(100%) with a
cubic-bezier(0.34,1.56,0.64,1) overshoot.
- Cadence line keeps its existing class but now does a soft 180ms
opacity-out, text-swap, opacity-in instead of a hard snap, so it
reads in sync with the price.
- Thumb still animates with motion.dev animate(); the switcher
behavior is unchanged.
User confirmed the old pricing they meant is the 1d5a75d edge-to-edge
grid: cards share borders, no individual rounded ring on each card,
the whole grid sits inside one rounded ring with overflow-hidden.
This commit takes the layout from 1d5a75d:
- grid uses gap-px on a [color:var(--border)] background to render the
internal separators as 1px lines instead of card gaps.
- Whole grid wrapped in a single ring-1 rounded-[10px] overflow-hidden
container so the four cards read as one block.
- Each card is bare bg-white p-7, no rounded corners, no individual ring,
no shadow.
- Plan name uses the 14px uppercase tracking-[0.12em] eyebrow style,
not the 16px bold heading style.
- Featured card keeps the Most popular pill, brand-color name, and
brand-filled CTA, but drops the ring-2 scale-[1.02] and the
sweep/bloom decorations (they only made sense on a separated card).
Switcher and price animation are still the d256ba4 motion.dev versions
restored in the previous commit, so the switcher works and the price
fades on toggle.
The user asked for the OLD pricing section back, the one before the
1d5a75d strip-down. This commit restores it exactly as it shipped in
commit d256ba4:
- Plans data: string prices ($29, $23, ..., 'Custom') instead of the
numeric/null shape I borrowed from /pricing.
- Section header: small 'Pricing' eyebrow chip on brand-soft, big
italic 'Per mailbox. Predictable.' headline, larger py-24/py-32
padding restored.
- Toggle: ID-based premium thumb toggle (#billing-toggle / #toggle-thumb)
with motion.dev sliding the thumb between Monthly and Annual. Save 20%
emerald pill sits to the right.
- Cards: ring-1 standard / ring-2 brand + scale-1.02 featured, sweep
+ bloom on the featured card, Most-popular pill anchored top-right,
sky-zap sends/day chip, brand-soft/sky checkmarks, brand-filled CTA
on the featured plan.
- Toggle script: the original motion.dev driven version that swaps the
.price-amount text via opacity flips and pushes the .cadence string.
- Kept the inline thumb width/left fallback (left:116px width:112px) so
the thumb stays visible until motion has booted.
The user has been asking for the home pricing section to match /pricing.
This commit ports the /pricing card grid verbatim onto the home page:
- Plan data structure aligned: numeric price/annual (29, 23, etc),
null for the Enterprise plan, all other fields preserved (summary,
sendsPerDay, href, cta, highlight, features).
- Card markup is now the same as /pricing: rounded-[18px] white card,
ring + layered shadow on standard plans, a 2px sky-6 ring + sky glow
on the featured plan, sky-1-to-transparent gradient overlay at the
top of the featured card, Most-popular pill anchored top-center.
- Plan name eyebrow is the sky-6 mono SHOUT label (matches /pricing).
- Price block: 48px number with a 28px $ prefix span, slide-up
.plan-price > .plan-price-inner wrapper with the same
cubic-bezier(0.34,1.56,0.64,1) rebound easing /pricing uses, then a
/ mo postfix; Enterprise renders the bare 'Custom' word at 44px.
- Cadence is .plan-note with data-monthly-note / data-annual-note that
the toggle script swaps with a soft fade. Enterprise gets the static
'volume-based · contact sales' string.
- Feature rows use sky-1 chip + sky-6 check, no neutral pills.
- Plan CTA: sky-6 filled button with lift+glow on the featured card,
dark filled button on the others, matching /pricing.
The toggle and switcher script were already aligned in the prior
commit; this commit only changes the card grid so the layout and the
price-swap animation now match /pricing exactly.
Home pricing:
- Removed both clouds the user flagged: the big cloud-5 backdrop sitting
behind the panel and the small cloud-4 bloom inside the featured card.
The brand-ring + sweep + Most-popular pill carry the highlight alone now.
- Switcher swapped to the same vanilla implementation /pricing uses:
data-billing-toggle wrapper with a .billing-indicator span that slides
by getBoundingClientRect, no motion.dev dependency, indicator is
positioned on first frame so it is never invisible.
- Price animation: the cards keep their original layout (large $48px
number, cadence note line, no $ prefix, no /mo split, no 62px
forced height), but the inner number now lives in a
.plan-price > .plan-price-inner pair and swaps via the same slide-up
cubic-bezier(0.34,1.56,0.64,1) rebound used on /pricing.
- Cadence text uses .plan-note with data-monthly-note / data-annual-note
so it fades in sync with the price swap.
Footer:
- The Mindroot Ltd disclosure went from three stacked lines to a single
compact line under the copyright, satisfying UK Companies Act s.82
without dominating the footer.
Brand and assets:
- New /public/brand/social-avatar.jpg: the official Warmbly social profile
picture (paper-plane mark on a sky-with-clouds canvas, 1024x1024).
- scripts/gen-icons.mjs generates the full favicon set from that source
using sharp. Rounded variants (16/32/48/96) so the icon reads as a
soft chip in browser tabs, square apple-touch-icon (iOS rounds it),
square maskable manifest icons (192/512), and a 1200x630 OG card on a
sky gradient with the rounded avatar on the left.
SEO / head:
- Layout.astro head now declares all favicon sizes, full Open Graph
set (type, site_name, url, locale, image w/h/alt), Twitter card with
summary_large_image, application-name and PWA capability meta, dual
light/dark theme-color tied to the sky tokens, format-detection off
for phone-number autolink, and crawler hints with
max-image-preview:large.
- Two JSON-LD blocks: Organization (legalName Mindroot Ltd, postal
address, two ContactPoints, Companies House identifier, sameAs
GitHub) and WebSite (publisher reference). Drives rich-result
eligibility and gives crawlers a clean entity to attach signals to.
- site.webmanifest expanded: real name, description, start_url, scope,
full icon set including the 96 rounded chip and apple-touch-icon
alongside the maskable 192/512s, sky-token theme/background colors.
Brand page:
- New Social avatar section after Marks: 1024 source preview, round
and square crop previews at 48/64/80/112, download CTA pointing at
/brand/social-avatar.jpg. Asset manifest gets the avatar entry.
About page:
- Repo surface list now includes site/ (this marketing site, Astro 5
+ Tailwind v4), deploy/, docs/, resources/, scripts/. AGENTS.md
(CLAUDE.md symlinked) System Shape section updated with the same
extra paths so the agent context stays in sync.
Footer:
- UK Companies Act s.82 disclosure restored with real entity info:
Mindroot Ltd, company number 16543299, registered office at
71-75 Shelton Street, London, England, WC2H 9JQ. Copyright line
flipped to Mindroot Ltd.
Home pricing regression fix:
- The home pricing cards had been flattened into a single edge-to-edge
grid with no rings, no featured-card highlight, and no animations,
while the toggle thumb had no inline width/left so it disappeared
whenever motion.dev had not booted yet (the 'defected switcher'
the user reported).
- Restored the premium card layout: each plan is a separated rounded
card with its own ring, the featured plan picks up ring-2 of the
brand color, a cloud bloom in the top-right, a continuously sweeping
highlight (pricing-sweep keyframes already present in the page
stylesheet), and a 'Most popular' pill.
- Toggle thumb now starts at left:116px width:112px so the Annual
default is visually selected on first paint even before the JS
upgrade animates it.
About:
- Remove the floating six-cell at-a-glance stats card under the hero
(License/Self-hostable/Roadmap/Encryption/Worker SQL access/Default
cold cap). The card looked busy and disrupted the page flow; the
same facts are covered in the planes, principles, and posture
sections lower down.
- Drop the now-unused facts array and the github.com/warmbly/warmbly
caption.
- Tighten the hero bottom padding from pb-44/pb-56 to pb-20/pb-28
since nothing floats over it anymore.
Legal layout:
- Add a top-to-bottom dark scrim above HeroAtmosphere so the white
eyebrow, title, and metadata stay legible when a painterly cloud
drifts behind them. Scrim uses the sky tokens (sky-8 to sky-6 to
transparent) so it reads as deeper sky, not as a black bar.
- Drop the white-on-cloud type into a small text-shadow as belt-and-
braces against the brightest cloud highlights.
Removes pages we do not need:
- dpa
- acceptable-use
- subprocessors
- cookies
Footer Legal column drops the four removed entries and keeps just
Terms and Privacy.
Shared Legal layout (src/layouts/Legal.astro) now drives both pages:
- Hero uses HeroAtmosphere for consistency with the product pages.
- Sticky sidebar lists the in-page sections passed as a sections prop.
- Scroll-spy script highlights the active section as you scroll and
slides an animated vertical pill indicator next to it, matching the
learn handbook treatment.
- Documents block under the section list cross-links Terms <-> Privacy.
- Footer line points to hello@warmbly.com (the only inbound legal
address advertised on /contact).
Real legal entity sourced from ~/warmbly-web:
- Mindroot Ltd, company number 16543299, registered in England and Wales
- Registered office: 71-75 Shelton Street, London, England, WC2H 9JQ
- Governing law: England and Wales; jurisdiction: courts of London
Terms rewritten as 17 numbered sections using the shared layout, with
a Who-we-are section that names Mindroot Ltd and the registered
office, Stripe as the payment processor, an Acceptable use section
that absorbs the relevant bits from the removed acceptable-use page,
and a contact section that points to hello@warmbly.com.
Privacy rewritten as 13 numbered sections, mirroring the real
encryption model (AWS KMS root, per-user 32-byte DEK, AES-GCM at the
app layer, DEK ciphertext in DynamoDB, plaintext DEK cached briefly
in Redis, control-plane state in PostgreSQL, workers operating over
Kafka/KMS/DynamoDB/S3/Redis only). UK ICO named as supervisory
authority; UK IDTA and EU SCCs referenced for international transfers.
Email cleanup across the site so only addresses that appear on the
contact page are used (hello@ and sales@):
- trust: security@warmbly.com -> hello@warmbly.com in the hero CTA,
the responsible-disclosure body and email chip, and the final CTA;
CTA secondary link swapped from /subprocessors/ to /privacy/.
- trust: subprocessors-summary block keeps the table of infrastructure
providers (real, sourced from CLAUDE.md) but drops the link out to
the deleted /subprocessors/ page and the DPA-on-request note.
- brand: press@warmbly.com -> hello@warmbly.com in the press contact.
- faq: DPA answer email updated from security@ to hello@.
Build: 36 pages (was 40); no remaining links to the removed pages.
Ten pages rewritten end to end against the shared HeroAtmosphere hero,
container-page max-width, and sky color tokens, so they finally match
the visual language of the product pages (sending, warmup, developers,
roadmap, changelog).
Company:
- about: open-source positioning, control plane vs execution plane
origin essay, six numbered build principles, posture comparison,
real repo path strip, small-team note linking to roadmap and
changelog and GitHub.
- brand: marks grid with wordmark and mark variants plus clear-space
and min-size strip, full sky palette ramp with hex and token names,
typography specimen (Inter plus system mono), four voice principles,
do and dont misuse grid, press contact and download manifest.
- trust: posture badges with shipped vs roadmap items called out
honestly, real envelope encryption flow (KMS, per-user DEK, AES-GCM,
Redis-cached plaintext DEK, encrypted DEK in DynamoDB) with source
anchors, worker boundary table, collect vs never-collect split, real
auto-block thresholds, subprocessors link, responsible disclosure
with security@warmbly.com only, status and changelog quick links.
Deliverability:
- mailbox-first positioning, per-mailbox health dashboard mocking the
five real states (healthy, watch, throttled, quarantined, blocked),
opinionated four-point stance, defaults spec sheet pulled straight
from CLAUDE.md (50/day, 600s, 10/day, 40/day, +1/day, 100/5min,
500/hr, 3/24h tokens, score > 50), four-pool isolation card grid,
auto-quarantine band gauge with thresholds and Google/SES anchors,
SPF/DKIM/DMARC/PTR coverage grid, six-row suppression engine table,
recommended cold posture, by-the-numbers strip with source paths,
FAQ and CTA.
Legal (consistent treatment, sticky sidebar TOC + numbered sections):
- terms: 17 numbered sections, Stripe payment processor note,
placeholder governing-law phrasing, legal@warmbly.com contact.
- privacy: 13 sections mirroring the real encryption model in copy,
print stylesheet for clean printing.
- dpa: 20 sections plus three annexes, SCC and UK IDTA references,
72-hour breach notification, sub-processor authorization model,
cross-references to terms and trust and subprocessors.
- acceptable-use: opinionated 14-section AUP, allowed vs not-allowed
two-column grid, real mailbox health enforcement ladder, no fake
enforcement statistics, abuse@warmbly.com.
- subprocessors: designer-grade table of real vendors only (AWS,
Cloudflare, Stripe, Postmark, Sentry, Plain) with real security or
privacy URLs, mobile stacked-card fallback, subscribe-to-changes
mailto, evaluation criteria, notice and objection window.
- cookies: per-category tables (strictly necessary, functional,
third-party) with real cookie names, analytics and marketing
explicitly empty rather than invented, manage-preferences anchor.
Constraints enforced across all ten: no em dashes, no fabricated
metrics, no fake compliance badges, no fictional company or employee
names, no AI-cute filenames or terminal logs. Astro JSX parser
caveat respected throughout (no < or <= comparisons inside JSX
expression blocks; all comparisons hoisted to frontmatter).