diff --git a/docs/assets/banner.jpg b/docs/assets/banner.jpg index b0708e93..91a3d165 100644 Binary files a/docs/assets/banner.jpg and b/docs/assets/banner.jpg differ diff --git a/site/public/blog/complaint-rate-that-gets-you-throttled.webp b/site/public/blog/complaint-rate-that-gets-you-throttled.webp new file mode 100644 index 00000000..77bac27d Binary files /dev/null and b/site/public/blog/complaint-rate-that-gets-you-throttled.webp differ diff --git a/site/public/blog/delivery-rate-is-not-inbox-placement.webp b/site/public/blog/delivery-rate-is-not-inbox-placement.webp new file mode 100644 index 00000000..3011957a Binary files /dev/null and b/site/public/blog/delivery-rate-is-not-inbox-placement.webp differ diff --git a/site/public/blog/getting-a-mailbox-back-into-warmup-pool.webp b/site/public/blog/getting-a-mailbox-back-into-warmup-pool.webp new file mode 100644 index 00000000..070611a2 Binary files /dev/null and b/site/public/blog/getting-a-mailbox-back-into-warmup-pool.webp differ diff --git a/site/public/blog/how-email-warmup-actually-works.webp b/site/public/blog/how-email-warmup-actually-works.webp new file mode 100644 index 00000000..05271d5f Binary files /dev/null and b/site/public/blog/how-email-warmup-actually-works.webp differ diff --git a/site/public/blog/how-many-cold-emails-per-day-per-mailbox.webp b/site/public/blog/how-many-cold-emails-per-day-per-mailbox.webp new file mode 100644 index 00000000..c16a29b0 Binary files /dev/null and b/site/public/blog/how-many-cold-emails-per-day-per-mailbox.webp differ diff --git a/site/public/blog/how-many-mailboxes-and-domains-cold-email.webp b/site/public/blog/how-many-mailboxes-and-domains-cold-email.webp new file mode 100644 index 00000000..59643669 Binary files /dev/null and b/site/public/blog/how-many-mailboxes-and-domains-cold-email.webp differ diff --git a/site/public/blog/mailbox-budgets-not-server-settings.webp b/site/public/blog/mailbox-budgets-not-server-settings.webp new file mode 100644 index 00000000..677f75c8 Binary files /dev/null and b/site/public/blog/mailbox-budgets-not-server-settings.webp differ diff --git a/site/public/blog/open-source-cold-email-platform.webp b/site/public/blog/open-source-cold-email-platform.webp new file mode 100644 index 00000000..3227e604 Binary files /dev/null and b/site/public/blog/open-source-cold-email-platform.webp differ diff --git a/site/public/blog/quarantine-early.webp b/site/public/blog/quarantine-early.webp new file mode 100644 index 00000000..cdb63972 Binary files /dev/null and b/site/public/blog/quarantine-early.webp differ diff --git a/site/public/blog/reading-the-bulk-sender-rules.webp b/site/public/blog/reading-the-bulk-sender-rules.webp new file mode 100644 index 00000000..01e8eefc Binary files /dev/null and b/site/public/blog/reading-the-bulk-sender-rules.webp differ diff --git a/site/public/blog/spf-dkim-dmarc-alignment-cold-email.webp b/site/public/blog/spf-dkim-dmarc-alignment-cold-email.webp new file mode 100644 index 00000000..fea179f1 Binary files /dev/null and b/site/public/blog/spf-dkim-dmarc-alignment-cold-email.webp differ diff --git a/site/public/og-image.jpg b/site/public/og-image.jpg new file mode 100644 index 00000000..a95cd6f0 Binary files /dev/null and b/site/public/og-image.jpg differ diff --git a/site/public/og-image.png b/site/public/og-image.png deleted file mode 100644 index 804af42a..00000000 Binary files a/site/public/og-image.png and /dev/null differ diff --git a/site/scripts/gen-icons.mjs b/site/scripts/gen-icons.mjs index 061cbb12..99a90308 100644 --- a/site/scripts/gen-icons.mjs +++ b/site/scripts/gen-icons.mjs @@ -9,8 +9,8 @@ * web-app-manifest-192x192.png * web-app-manifest-512x512.png * - * The 1200x630 OG / Twitter card (public/og-image.png) is generated - * separately from scripts/og-image.html — see scripts/render-og.py. + * The 1200x600 OG / Twitter card (public/og-image.jpg) is exported from the + * Figma Branding file (the "Social" frame), not generated here. * * Run with: node scripts/gen-icons.mjs */ diff --git a/site/src/components/LaunchBanner.astro b/site/src/components/LaunchBanner.astro new file mode 100644 index 00000000..70d861a8 --- /dev/null +++ b/site/src/components/LaunchBanner.astro @@ -0,0 +1,43 @@ +--- +/** + * Launch announcement bar, rendered site-wide above the header. + * + * Warmbly Cloud (hosted sending + the shared warmup pool) is not live yet. + * The whole platform is open source and self-hostable today; the cloud + * waitlist lives at app.warmbly.com. Keep this until cloud launches, then + * remove it from the Layout. + * + * Built from the site's own hero vocabulary: a rich single-family sky gradient + * with a soft light source, a glass CTA chip (same as the hero badges), a + * typographic mid-dot separator, tight heading tracking. Not dismissible. + */ +--- + diff --git a/site/src/components/OpenSourceShowcase.astro b/site/src/components/OpenSourceShowcase.astro index eb7b577b..c8410a35 100644 --- a/site/src/components/OpenSourceShowcase.astro +++ b/site/src/components/OpenSourceShowcase.astro @@ -41,7 +41,7 @@ const contribute = [ const selfhost = [ 'Run on your own infra: Postgres, Redis, Kafka, S3, KMS', 'One make up command boots the whole stack', - 'Or skip the ops and use our managed cloud', + 'Cloud, with the shared warmup pool, is coming soon', 'BYOK encryption and SSO on enterprise', ]; const links = [ @@ -196,9 +196,9 @@ const links = [ ))}
- Heads up: shared warmup pools only work with a large, vetted base of mailboxes, which a single - self-hosted instance usually will not have, so the shared pool is really only effective on our cloud. - Self-hosting still gives you the full sending, inbox and CRM stack. + One caveat: the shared warmup pool runs on our cloud. It only works with a large base of vetted + mailboxes sending to each other, which a single self-hosted instance starts without. Self-hosting + still gives you the full sending, inbox, CRM and API stack. The pool is the one part that needs the cloud.
diff --git a/site/src/components/PillarPosts.astro b/site/src/components/PillarPosts.astro new file mode 100644 index 00000000..0f3cdf0d --- /dev/null +++ b/site/src/components/PillarPosts.astro @@ -0,0 +1,43 @@ +--- +/** + * "Deep dives" block for a pillar page: links down to the best blog posts in + * its topic cluster, so the pillar-to-spoke links mirror the spoke-to-pillar + * links the posts already carry. Keeps the cluster reciprocal. + */ +import Icon from './Icon.astro'; + +interface Item { + href: string; + title: string; + kicker?: string; +} +interface Props { + title?: string; + items: Item[]; +} +const { title = 'From the blog', items } = Astro.props; +--- +- 14 days, 2 mailboxes, no credit card. Apache 2.0 if you want to self-host. + 14 days, 3 mailboxes, no credit card. Apache 2.0 if you want to self-host.
@@ -669,6 +669,9 @@ const softwareJsonLd = { See full comparison+ The free tier is a limited demo with an unfilled warmup pool. Use it to see what the product does, not to send at volume. +
diff --git a/site/src/pages/integrations.astro b/site/src/pages/integrations.astro index 93e8ee5d..9380ead1 100644 --- a/site/src/pages/integrations.astro +++ b/site/src/pages/integrations.astro @@ -167,7 +167,7 @@ const guarantees = [ // --- Security ---------------------------------------------------------------- const security = [ - { icon: 'lock', t: 'OAuth tokens encrypted at rest', d: 'AES-256-GCM with a per-user data key wrapped by AWS KMS. Plaintext lives only in a TTL-bounded cache during active use.' }, + { icon: 'lock', t: 'OAuth tokens encrypted at rest', d: 'AES-256-GCM with a per-organization data key wrapped by AWS KMS. Plaintext lives only in a TTL-bounded cache during active use.' }, { icon: 'key', t: 'API keys are opaque blobs', d: 'CRM, automation and notification keys are never serialized back to the API. The dashboard sees only public display fields.' }, { icon: 'link', t: 'Inbound URLs are per-organization', d: 'A leaked URL touches one organization. Rotating the secret invalidates the old path immediately.' }, { icon: 'shield', t: 'SSRF-guarded by default', d: 'Outbound webhook targets are HTTPS-only and blocked from obvious internal addresses. Self-hosted can opt into unsafe URLs.' }, @@ -630,7 +630,7 @@ X-Warmbly-Signature: t=1748443269,v1=9f2a…c1b7 Credentials are sealed, not stored.- Integration credentials use the same encryption envelope as mailbox OAuth tokens. Per-user data encryption keys are wrapped by AWS KMS, and plaintext keys are never written to disk. + Integration credentials use the same encryption envelope as mailbox OAuth tokens. Per-organization data encryption keys are wrapped by AWS KMS, and plaintext keys are never written to disk.
diff --git a/site/src/pages/pricing.astro b/site/src/pages/pricing.astro index 3fbf4af6..6894d0ea 100644 --- a/site/src/pages/pricing.astro +++ b/site/src/pages/pricing.astro @@ -248,6 +248,12 @@ const headers = ['Starter', 'Grow', 'Business', 'Enterprise']; ))} + ++ Want to try it first? The free tier runs the core product so you can see how sending, the inbox and + campaigns work. It is limited, and its warmup pool is not filled, so treat it as a way to evaluate + Warmbly, not a production sender. Warmup performs on a paid plan, where the premium pool is full. +
@@ -362,7 +368,7 @@ const headers = ['Starter', 'Grow', 'Business', 'Enterprise']; ['Is warmup metered separately?', 'No. Warmup is unlimited on every paid plan and runs against the premium pool.'], ['Is there a per-seat charge?', 'No. Add as many teammates as you want. Roles and audit log unlock on Business.'], ['Annual billing?', 'Yes, with 20% off. Toggle is at the top of this page.'], - ['What is the free trial?', '14 days, 2 mailboxes. No credit card. Converts to your chosen plan after.'], + ['What is the free trial?', '14 days, 3 mailboxes. No credit card. Converts to your chosen plan after.'], ['Refund policy?', 'Full refund inside 14 days of a paid purchase if the platform did not work for you.'], ['Startup pricing?', '50% off Grow for one year for pre-seed and seed companies on YC, Antler, EF, Techstars or similar.'], ].map(([q, a]) => ( @@ -423,7 +429,7 @@ const headers = ['Starter', 'Grow', 'Business', 'Enterprise']; Start sending in five minutes.- 14 days free · 2 mailboxes · no credit card. + 14 days free · 3 mailboxes · no credit card.
+ ++ Warmbly is open source, so you can self-host all of it. The one part that does not travel is the shared warmup pool, because a pool only works once enough vetted mailboxes are in it. +
+