- Removed /product, /security, /workers (Footer, 404, privacy, dpa, trust
references updated).
- Mega-menu now 620px wide with a sky-tinted header strip showing
'The platform · 6 systems', a 2-col grid of products where each item
has a 40x40 icon tile that goes from quiet surface ring to a sky
gradient on hover (with a sky drop-shadow), current page is shown
with the gradient tile active + a sky dot next to the name. Footer
band kept (GitHub link + pricing CTA).
Hover or focus the Product nav item to reveal a wide (720px) mega-menu:
- Top: featured 'Product overview' card with sky-gradient icon tile, plus
a Resources column (Deliverability, API, Integrations, Changelog).
- Two-column product grid grouped 'Send & deliver' (Warmup, Sending,
Workers, Security) and 'Engage & analyse' (Inbox, Campaigns, CRM,
Analytics) with icon + title + 1-line description per item.
- Footer band with open-source link and pricing link.
- Caret rotates 180° on open, panel fades + slides down 200ms.
- Hover-bridge with 140ms close delay so cursor can travel from
trigger to panel without flicker. Escape closes.
- Replaced the static chapter list with a 2-pane rail matching Learn.astro:
'On this page' (chapter-link list with scroll-spy active state) plus
'All essays' switcher showing every learn article with this handbook
highlighted as current.
- Active state uses only a soft sky color shift + semibold, no bg or ring,
with a 300ms color transition.
- Chapter rail active state: only color shifts to sky (no background,
no ring), font weight bumps to semibold, smooth 300ms color transition.
- Article switcher: same treatment. Current article shows a small sky
dot on the right where read time would normally be, so you can spot
the current spot at a glance.
- Added scroll-spy to the chapter rail: as you scroll, the H2 closest
to the upper third of the viewport becomes the active link (white
background, sky text, sky ring).
- Below the chapter rail, an 'Other essays' list shows every other
learn article (6 on each page) with read-time, plus an 'All articles'
link back to the library.
Rebuilt Learn.astro to mirror the deliverability handbook:
- top bar with library breadcrumb + eyebrow/reading/updated meta
- sticky chapter rail on the left, auto-populated from H2 headings via
inline JS (each H2 gets a slugged anchor, rail lists numbered links)
- main column with page header (eyebrow, big title, description) and
prose body with handbook-tuned typography (numbered ol counters,
bulleted ul with sky bullets, section anchor § glyph, sky blockquotes,
code blocks)
- footer with 'continue reading' cards excluding the current page
All seven learn subpages (email-warmup, spf-dkim-dmarc, inbox-placement,
cold-email-rules, warmup-pools, reputation-recovery, glossary) now use
this layout. No sky background.
- learn index: dropped the sky-atmosphere library + glossary bands.
Library is now a quiet inline section with article rows on the left
and a sticky reference panel on the right showing 6 sample glossary
entries with a stat strip. White background, no sky.
- handbook: rebuilt as a docs-style 2-column layout (Stripe API style).
Sticky chapter rail on the left, page header + 8 chapter rows on the
right. Each chapter has prose on the left and a side example panel
on the right (definitions list, signal-weight table, threshold table,
right vs wrong code blocks, numbered recipe, measure list, noise
cards, incident runbook). Closing rule + continue-reading footer.
Every docker compose invocation in the Makefile now pins
-p warmbly so all git worktrees target the same compose
project. This means infra (postgres, redis, kafka, mailpit,
localstack, stripe-mock, cloud-tasks-emulator, zookeeper,
schema-registry) is brought up once and stays running across
worktree switches. App services (backend, consumer, worker,
tracking, realtime, web) recreate in place per worktree against
the bind-mounted source.
Removed targets:
- dev, dev-down, dev-logs (and the DEV_SVCS / SVCS vars)
Added targets:
- infra, infra-down
- app, app-down, app-logs
Daily flow becomes:
make infra # once, from any worktree
cd /path/to/worktree-a
make app # bring up app code for branch A
cd /path/to/worktree-b
make app # recreates app against branch B;
# infra untouched, caches warm
The named cache volumes already shared their content across
worktrees (warmbly_gomodcache, warmbly_gocache, warmbly_cargo_home,
warmbly_cargo_target, warmbly_mix_deps, warmbly_mix_build); pinning
the project name additionally makes container ownership shared,
which is what eliminates the per-worktree cold start.
README.md, resources/local-development.md, resources/deployment-guide.md,
deploy/README.md, and docker-compose.dev.yml all updated to reflect
the new targets.
The bind-mounted .git is owned by the host user but the dev
container runs as root, so git aborts with "dubious ownership"
and Go's automatic VCS stamping fails the build with:
error obtaining VCS status: exit status 128
Use -buildvcs=false to disable VCS stamping.
Production Dockerfiles are unaffected because they do not
bind-mount .git; they COPY source into the image and let Go
stamp normally.
PR #10 added 000035_api_key_suffix and PR #11 separately added
000035_api_key_smart_limits, both targeting the api_keys table.
golang-migrate refuses to load when two source files share a
version number, so the backend container failed health checks
in fresh stacks.
Bumping api_key_smart_limits to 000037 keeps PR #10 in its
original slot (it landed first) and matches the next free
version after 000036_contact_categories. The two migrations
touch different columns so apply order does not matter.