Commit Graph
140 Commits
Author SHA1 Message Date
Matthew Meszaros 6ca3d2e924 feat: add changelog landing showcase
Introduce a compact changelog section to highlight recent platform updates after the product feature tour.
2026-06-06 11:55:31 +02:00
Matthew Meszaros ef2ba2af28 feat: add crm pipeline landing mock
Show how positive replies become pipeline deals with stages, owners, notes, and tasks.
2026-06-06 11:55:28 +02:00
Matthew Meszaros 5cd4e0cad2 feat: add developer api landing mock
Add the API keys and webhook mock that supports the developer-focused landing section.
2026-06-06 11:55:23 +02:00
Matthew Meszaros 2c32940ee3 feat: add integrations landing mock
Show provider connections, signed webhook configuration, and encrypted-token positioning for the integrations section.
2026-06-06 11:55:19 +02:00
Matthew Meszaros 77fa10a3dd feat: add ai assistant landing mock
Add the writing assistant screen that demonstrates prompt-driven email drafting and tone controls.
2026-06-06 11:55:15 +02:00
Matthew Meszaros 9d4cf33880 feat: add analytics landing mock
Show deliverability metrics, campaign ranking, and account health in a product-style analytics screen.
2026-06-06 11:55:10 +02:00
Matthew Meszaros c66c0a4856 feat: add unified inbox landing mock
Present the reply triage workflow with mailbox filters, message classification, and an inline reply pane.
2026-06-06 11:55:07 +02:00
Matthew Meszaros 26abb6e17c feat: add campaign schedule landing mock
Add a weekly sending-window editor mock with preset controls, timezone details, and drag-to-create animation hooks.
2026-06-06 11:55:01 +02:00
Matthew Meszaros 7badea0a1b feat: add campaign builder landing mock
Show the sequence builder canvas with branching, step controls, and an email composer for the campaign feature section.
2026-06-06 11:54:58 +02:00
Matthew Meszaros 417db48b14 feat: add reusable feature showcase section
Introduce the framed product-window section used to present each landing-page feature with consistent copy, callouts, and scaling.
2026-06-06 11:54:53 +02:00
Matthew Meszaros 5a0e42620b feat: allow sequence mock step limits
Let the sequence mock render a compact subset of steps for smaller landing-page showcase contexts.
2026-06-06 11:54:48 +02:00
Matthew Meszaros 098c65377c feat: normalize dashboard mock copy punctuation
Align the existing dashboard mock comments with the site copy guidance before adding the new landing sections.
2026-06-06 11:54:43 +02:00
Matthew Meszaros c3489b3bee feat: widen site content containers
Give landing sections a shared wider content measure so the new feature showcase aligns with the header, hero, and footer.
2026-06-06 11:54:39 +02:00
Matthew Meszaros cd1b503575 feat: add personalization guide
Document merge variables, custom fields, and conditional template syntax in the public Learn section.
2026-06-06 07:50:32 +02:00
Matthew Meszaros a1c9a898b5 feat: refresh app favicon assets 2026-06-04 08:55:31 +02:00
Matthew Meszaros 3943b8a2e7 feat: update docs for postgres-backed secrets
Refresh developer docs, deployment notes, and public-site copy to describe the Postgres-backed encrypted key and message-map model after DynamoDB removal.
2026-06-02 15:55:01 +02:00
Matthew Meszaros 379d2e8bb7 feat: declare motion dependency for the marketing site
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.
2026-06-01 06:05:21 +02:00
Matthew Meszaros 8b28b86b7f feat: support exposed local dev hosts
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.
2026-06-01 05:51:02 +02:00
Matthew Meszaros bf40834557 feat: update unibox experience 2026-05-30 16:37:50 +00:00
Matthew Meszaros b146417b50 chore: dashboard and plans 2026-05-29 16:42:05 +00:00
Matthew Meszaros ff763c4483 feat: add role and team-size onboarding questions and rework site SEO me 2026-05-29 14:47:16 +00:00
Matthew Meszaros e7ef328b2d Merge pull request #18 from warmbly/feature/admin-management
feat: admin management surface with overrides, ban scope, and throttles
2026-05-29 05:01:00 +02:00
Matt 93bb56a458 feat(limits): admin queue + customer request form + ToS clause
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.
2026-05-28 12:16:02 +02:00
Matt 32875772c8 refactor(site): drop hero diagram from integrations page
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.
2026-05-28 09:45:58 +02:00
Matt 38373aa267 refactor(site): replace integrations hero mock with animated fanout diagram
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.
2026-05-28 09:41:59 +02:00
Matt df48bec738 refactor(site): rewrite integrations page for new catalog
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.
2026-05-28 08:59:10 +02:00
Matt 077296ce84 refactor(site): rewrite integrations copy in plain professional tone
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.
2026-05-28 08:40:03 +02:00
Matt 9d0679d0e7 chore(make): add admin/site dev shortcuts and grant-admin tooling
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.
2026-05-28 08:38:58 +02:00
Matt 8c006215ac Revert "refactor(site): drop editorializing from integrations page"
This reverts commit 45754b192d00166fe752fb57ae04d5e7eb094633.
2026-05-28 08:36:25 +02:00
Matt d1eeff2fbc refactor(site): drop editorializing from integrations page
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.
2026-05-28 08:36:10 +02:00
Matt 0515a632b3 feat(site): redesign integrations page in marketing theme
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.
2026-05-28 08:31:47 +02:00
Matthew Meszaros 04fcd00ad2 site: home warmup - drop activity feed, KPIs become a clean 4-up row
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.
2026-05-27 06:11:18 +00:00
Matthew Meszaros a6be9ceac5 site: home warmup section - rings + activity feed, no chart, no white borders
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.
2026-05-27 06:10:02 +00:00
Matthew Meszaros 40f75fdd53 site: rebuild home warmup section as a real product detail screen, trial=2 mailboxes
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.
2026-05-27 06:05:27 +00:00
Matthew Meszaros 0a1f153cb1 site: home pricing - sky hero section, cards float into white
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.
2026-05-27 05:57:03 +00:00
Matthew Meszaros 616f18c0a2 site: home pricing - bundled-features panel as the section header
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).
2026-05-27 05:54:09 +00:00
Matthew Meszaros 3e80c18bc4 site: home pricing - replace marketing header with a sends/day volume axis
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.
2026-05-27 05:47:35 +00:00
Matthew Meszaros 57d469c8fe site: home pricing - minimal centered header per the user's choice
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.
2026-05-27 05:46:16 +00:00
Matthew Meszaros 692ea8135d site: home pricing - don't conflate trial perks with paid-plan perks
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.
2026-05-27 05:44:34 +00:00
Matthew Meszaros 10aafa68d2 site: home pricing header to an asymmetric editorial block, drop per-mailbox claim
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.
2026-05-27 05:42:30 +00:00
Matthew Meszaros 9b65664746 site: home pricing header redesign (cards untouched)
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.
2026-05-27 05:39:06 +00:00
Matthew Meszaros 658352b694 site: home pricing - swap price numbers with /pricing slide-up animation
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.
2026-05-27 05:36:51 +00:00
Matthew Meszaros 243eb0e59b site: home pricing cards go edge-to-edge (gap-px shared border, no ring per card)
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.
2026-05-27 05:34:02 +00:00
Matthew Meszaros ec986891d5 site: revert home pricing section to the d256ba4 version verbatim
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.
2026-05-27 05:31:11 +00:00
Matthew Meszaros f6fdd9731c site: home pricing now mirrors /pricing card layout 1:1
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.
2026-05-27 05:27:11 +00:00
Matthew Meszaros 756978f9c1 site: home pricing - drop clouds, mirror /pricing switcher + price slide-up, compact footer
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.
2026-05-27 05:24:12 +00:00
Matthew Meszaros 734d149072 site: social avatar + full SEO icon set + Mindroot Ltd footer + home pricing restore
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.
2026-05-27 05:19:52 +00:00
Matthew Meszaros 8813247b46 site: drop about hero stats card, fix legal hero readability against clouds
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.
2026-05-27 05:09:35 +00:00
Matthew Meszaros 8316ab333e site: trim legal to terms + privacy, unify layout, real entity, contact emails only
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.
2026-05-27 05:05:41 +00:00
Matthew Meszaros f64c7e8922 site: full redesign of company, legal, and deliverability 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).
2026-05-27 04:51:27 +00:00