Commit Graph
1206 Commits
Author SHA1 Message Date
Matthew Meszaros d2afbf9319 feat: rewrite the quarantine-early blog post with the four-band health table, sample-size floors, engagement-signal rule, and earned re-entry 2026-07-07 07:15:06 +02:00
Matthew Meszaros bba7a8fcb3 feat: rewrite the bulk sender rules blog post to full cluster length, converting it to mdx and covering the current Google and Microsoft 5000-a-day SPF DKIM DMARC alignment enforcement bar 2026-07-07 07:15:06 +02:00
Matthew Meszaros 339e3495b2 feat: add eleven 1200x600 webp blog cover images (29-59KB each) under public/blog for post grid thumbnails and social share cards 2026-07-07 07:15:06 +02:00
Matthew Meszaros 6df48f626e chore: update the README top banner to the new Figma branding export (1600x533 JPG, ~108KB, smaller than the previous banner) 2026-07-06 06:28:11 +02:00
Matthew Meszaros f6a6a310ac feat: enrich blog structured data with BreadcrumbList, wordCount, keywords, inLanguage, articleSection, and a per-post share image on BlogPosting 2026-07-06 06:28:11 +02:00
Matthew Meszaros 721aced30f feat: replace the social OG card with the Figma export as an optimized 52KB mozjpeg JPG (1200x600) and switch every og:image reference from PNG to JPG 2026-07-06 06:28:11 +02:00
Matthew Meszaros 1f38604fcd feat: cross-link the three existing blog posts into the new warmup, sending, and deliverability topic clusters with contextual internal links 2026-07-06 06:28:11 +02:00
Matthew Meszaros 074f484c43 feat: add eight SEO blog posts on cold email sending limits, warmup mechanics, delivery vs inbox placement, DMARC alignment, reputation recovery, and self-hosting 2026-07-06 06:28:11 +02:00
Matthew Meszaros 5809247980 style: replace an em dash with a colon in the terms usage-limits clause to match the no-em-dash copy rule 2026-07-06 06:28:11 +02:00
Matthew Meszaros 7aa1390f21 feat: add FAQPage JSON-LD to /faq, correct the per-user to per-organization DEK claim, and drop em dashes from two answers 2026-07-06 06:28:11 +02:00
Matthew Meszaros 534f6eb263 fix: correct the encryption claim from per-user to per-organization DEKs on the about, trust, and integrations pages to match the envelope-encryption model 2026-07-06 06:27:43 +02:00
Matthew Meszaros dcf50cb99a feat: change the trial to three mailboxes everywhere and add free-tier limitation copy (unfilled warmup pool, for evaluation not production) on the homepage and pricing page 2026-07-06 06:27:43 +02:00
Matthew Meszaros a9384ca72c feat: add reciprocal Deep dives blog link blocks to the warmup, sending, and deliverability pillar pages so clusters link both directions 2026-07-06 06:27:43 +02:00
Matthew Meszaros 71a4275e59 feat: surface the self-host warmup pool notice on the warmup page and sharpen the open-source section caveat that the pool needs the cloud 2026-07-06 06:27:43 +02:00
Matthew Meszaros d9c8d3c9bd feat: add a reusable PillarPosts component for a 'Deep dives' blog link block on pillar pages 2026-07-06 06:27:43 +02:00
Matthew Meszaros e37a340bb4 feat: add a reusable WarmupPoolNotice component explaining the shared warmup pool is a cloud feature a single self-hosted instance cannot replicate 2026-07-06 06:27:43 +02:00
Matthew Meszaros 1d4357e4af feat: add a site-wide coming-soon launch banner (LaunchBanner) announcing Warmbly Cloud and the shared warmup pool with a waitlist CTA, rendered above the header in Layout 2026-07-06 06:27:43 +02:00
Matthew Meszaros 99dfd261d4 Merge pull request #62 from warmbly/feature/gmail-imap-sync-fixes
Feature/gmail imap sync fixes
2026-07-04 13:19:15 +02:00
Matthew Meszaros 27487a3279 Merge pull request #59 from warmbly/feature/human-send-behavior
Human-like send + warmup engagement timing (no metronome, round-mark, or 3am-read fingerprints)
2026-07-04 13:12:29 +02:00
Matthew Meszaros f38a939f2e Merge pull request #60 from warmbly/feature/inbound-bounce-and-behavior
Inbound NDR bounce suppression (permanent-only, idempotent) + warmup volume variation + reconciler throttle
2026-07-04 13:12:15 +02:00
Matthew Meszaros 87a877bd95 Merge pull request #61 from warmbly/fix/realtime-multiarch-publish
Fix realtime image publish: native multi-arch runners instead of 6h QEMU hang
2026-07-04 12:09:32 +02:00
Matthew Meszaros 4c714c471f Merge pull request #58 from warmbly/feature/gmail-imap-sync-fixes
Fix Gmail and SMTP/IMAP sync/send bugs; bring both to parity with the Graph path
2026-07-04 12:09:30 +02:00
Matthew Meszaros b11cf3fa27 Merge pull request #57 from warmbly/feature/mailbox-graph-api
Microsoft mailboxes on Graph + working account load/send/sync + warmup categorization
2026-07-04 12:02:05 +02:00
Matthew Meszaros a2e35a1c02 fix: build the realtime image on native amd64 and arm64 runners and merge the digests into one manifest so the elixir release stops hanging for hours under qemu emulation 2026-07-04 11:59:35 +02:00
Matthew Meszaros ad1d40fd2b test: cover the gmail/graph message mapping (read-state inversion, spam/category labels, unpadded base64url bodies, warmup and classification header surfacing), the imap header-flag parser, the graph MIME builder, and the human-behavior timing (sub-minute randomisation, daily volume factor, night-deferred and heavy-tailed engagement) 2026-07-04 11:45:01 +02:00
Matthew Meszaros f9142345ca feat: occasionally skip all positive warmup engagement on a message so a mailbox files but never opens some mail, avoiding a perfect every-message-engagement pattern while keeping spam-rescue and foldering 2026-07-04 11:38:23 +02:00
Matthew Meszaros 4ea9611510 feat: vary each mailbox's daily warmup volume by a stable per-day factor with occasional lighter days so a mailbox never sends an identical count every day 2026-07-04 11:36:47 +02:00
Matthew Meszaros 8b0f08c08d feat: throttle the worker reconciler to republish each mailbox at most every five minutes so the safety-net loop stops re-shipping every account's credentials over Kafka each tick, while onboarding and reassignment still load immediately 2026-07-04 11:36:47 +02:00
Matthew Meszaros 041ae5afd5 feat: resolve inbound bounce events back to the original campaign send by message id and record them idempotently through the deliverability pipeline (suppression, campaign progress, breaker), and document permanent-only bounce detection 2026-07-04 11:36:47 +02:00
Matthew Meszaros ab3c925eca feat: detect permanent NDRs worker-side from the synced bounce body across gmail/graph/imap and emit an INBOUND_BOUNCE event, giving api-sent mail its only bounce signal without adding SQL or S3 to the worker 2026-07-04 11:36:47 +02:00
Matthew Meszaros 7abde17c26 feat: add a conservative DSN bounce parser that extracts permanence, failed recipient, and original message id from delivery-status reports, treating only 5.x.x/failed as permanent so transient 4.x.x failures never over-suppress 2026-07-04 11:36:47 +02:00
Matthew Meszaros 1e8236d685 feat: only reply to warmup messages received between 45 minutes and 7 days ago so replies follow a plausible read, and document the human-behavior timing model in the warmup guide 2026-07-04 11:27:36 +02:00
Matthew Meszaros 3738f17643 feat: make warmup read engagement heavy-tailed up to an hour instead of uniform within four minutes and defer read/star/important actions into the recipient's waking hours so no pool mailbox reads mail at 3am 2026-07-04 11:27:36 +02:00
Matthew Meszaros 2a76428ecf feat: randomise the sub-minute second of every scheduled send, drop the campaign 5-minute grid rounding, and vary send spacing multiplicatively into bursts and lulls so fleet timing has no metronome or round-mark fingerprint 2026-07-04 11:27:36 +02:00
Matthew Meszaros 0e60971e57 feat: flag Graph junk-folder arrivals as Junk during delta sync so warmup spam-placement detection and placement tests see where the message landed 2026-07-04 09:30:27 +02:00
Matthew Meszaros b8e4002adb feat: fetch the warmup verify token and machine-reply headers via BODY.PEEK on IMAP sync and surface them as flag pseudo-headers, and join replies to the parent's thread instead of forking a new thread at every reply depth 2026-07-04 09:30:27 +02:00
Matthew Meszaros 3e4c3e9655 feat: write the caller's Message-ID header on SMTP sends so the recorded id matches the wire message for reply and bounce correlation, classify refused recipients as recipient-rejected instead of server-unreachable, and use the resolved host for the SMTP client handshake 2026-07-04 09:30:27 +02:00
Matthew Meszaros 1d4212c725 feat: key the Gmail messageId map by the Gmail message id so remove and label lookups match the add entry, and translate Gmail label transitions into internal flag add/remove events with the UNREAD inversion 2026-07-04 09:30:27 +02:00
Matthew Meszaros 5a7d791202 feat: fix the inverted UNREAD-to-Seen mapping in the Gmail message mapper, surface SPAM and CATEGORY_ labels for spam-placement and promotions detection, populate the snippet, and extract bodies from single-part payloads with unpadded base64url decoding 2026-07-04 09:30:27 +02:00
Matthew Meszaros 700a35da8d feat: hydrate full Gmail messages during history sync instead of mapping the id-only history stubs, skip 404s for messages deleted in-flight, and map non-API transport errors to a retryable mail error instead of silently returning nil 2026-07-04 09:30:27 +02:00
Matthew Meszaros 4fe0689d50 feat: document the Graph-backed Outlook connection and the recipient-side warmup folder categorization in the mailboxes and warmup guides 2026-07-04 08:07:50 +02:00
Matthew Meszaros 599f144364 feat: surface warmup and machine-reply/DSN headers from Gmail sync into flags for the reply and bounce classifier and match internet header names case-insensitively 2026-07-04 08:07:50 +02:00
Matthew Meszaros 4c0da59763 feat: categorize Graph warmup mail by surfacing the verify token into flags and filing it into the Warmbly folder, re-resolving the live message id from the immutable RFC Message-ID so post-move engagement actions never act on a stale id 2026-07-04 08:07:50 +02:00
Matthew Meszaros cb13c65d5d feat: load active mailboxes onto their assigned workers via a backend reconciler and immediately on onboarding, decrypting each account's credentials into the AddWorkerEmail payload, fixing gmail/outlook/smtp accounts that were assigned but never loaded 2026-07-04 08:07:49 +02:00
Matthew Meszaros 52c5f224fa feat: rebuild the provider oauth2 config locally on the worker so delegated mailbox tokens refresh, and ship BOX_ google/outlook client credentials to provisioned workers through the orchestrator env 2026-07-04 08:07:49 +02:00
Matthew Meszaros eb0a5654fd feat: persist the opaque per-folder Graph delta cursor in a new email_delta_links table via a repository and a GRAPH_DELTA_UPDATE consumer handler wired into the consumer service 2026-07-04 08:07:49 +02:00
Matthew Meszaros 049d751a11 feat: route the outlook provider through Microsoft Graph in the wmail worker with nil-guarded send/sync/new-email dispatch and a delta-cursor event, request delegated Graph OAuth scopes instead of the legacy IMAP/SMTP scopes, and always sync Outlook mailboxes 2026-07-04 08:07:49 +02:00
Matthew Meszaros 955ad1fc0c feat: add the internal/client/msgraph Graph mail client (RAW MIME sendMail, delta sync of inbox/junk, warmup move/mark/flag actions, RFC-message-id resolution, throttling-aware error mapping) plus the shared inbound classification-header list 2026-07-04 08:07:49 +02:00
Matthew Meszaros 36bfaf2e71 Merge pull request #55 from warmbly/automation-realtime-editing
Dashboard-wide real-time collaboration: live cursors, collaborative canvases, sticky positions, and live CRM
2026-07-02 20:43:36 +02:00
Matthew Meszaros 76d7e09c29 feat: document the cursor-chat permission gate and the live:select keep-alive and expiry semantics in the realtime API reference and the collaboration guide 2026-07-02 20:33:44 +02:00