Matthew Meszaros
c229431b8c
chore(deploy): drop kubernetes manifests
...
Workers need IP diversity, but k8s nodes typically NAT all pods through a
small set of egress IPs — defeating the point of a DaemonSet for cold mail.
Plus, the control plane is moving to Railway and workers will be managed
per-VPS, so the kustomize tree no longer reflects how anything actually
ships.
2026-05-18 13:08:06 +00:00
Matthew Meszaros
1ad8e7e995
feat: implement dead worker detection with heartbeat TTL and auto-reassignment
2026-04-12 11:14:24 +00:00
Matthew Meszaros
2f2ccb41dd
feat: add exponential backoff retry for transient email send failures
2026-04-12 11:10:28 +00:00
Matthew Meszaros
3e556825d8
fix: add org scoping to contact notes and activities to prevent IDOR
2026-04-12 11:09:40 +00:00
Matthew Meszaros
562752d20e
feat: skip bounced and suppressed contacts in campaign scheduling
2026-04-12 11:06:04 +00:00
Matthew Meszaros
0f883e38ac
fix: record bounces in campaign progress so analytics and auto-pause work
2026-04-12 11:05:10 +00:00
Matthew Meszaros
e7933ab6c5
feat: publish auth error events on critical mail errors and register token update handler
2026-04-10 07:05:39 +00:00
Matthew Meszaros
f9d9ed6dc0
feat: implement IMAP sync worker and unified mail sync loop for all providers
2026-04-10 07:02:25 +00:00
Matthew Meszaros
00dac953ae
fix: add nil checks on SmtpImapData and avoid slice modification during iteration
2026-04-10 06:58:41 +00:00
Matthew Meszaros
6766696ac4
fix: add 2-minute timeout context to task handlers to prevent hangs
2026-04-10 06:57:17 +00:00
Matthew Meszaros
a741b4939a
feat: implement worker HandleAddEmail and HandleRemoveEmail handlers
2026-04-10 06:56:35 +00:00
Matthew Meszaros
fbd62ea20c
fix: invert nil checks in dynamo email message Del so non-nil keys are added
2026-04-10 06:54:58 +00:00
Matthew Meszaros
58d41f3668
fix: store correct email account ID and message ID in dynamo email map
2026-04-10 06:54:31 +00:00
Matthew Meszaros
b9797e9e7b
chore: ignore seed binary build artifact
2026-04-10 06:32:52 +00:00
Matthew Meszaros
7f90323d55
chore: remove metrics endpoint, prometheus instrumentation, and IP rate limiter
2026-04-10 06:32:30 +00:00
Matthew Meszaros
7e123a2dac
fix: remove deep health endpoint and add IP rate limiting to public endpoints
2026-04-09 16:03:37 +00:00
Matthew Meszaros
80358168ae
test: add unit tests for warmup health evaluation, campaign state machine, and templates
2026-04-09 15:59:27 +00:00
Matthew Meszaros
23b5c925e4
feat: add scheduled warmup health sweep, pool health summary endpoint, and admin overview
2026-04-09 15:57:04 +00:00
Matthew Meszaros
65641ec1f2
feat: add send test email endpoint for campaign preview before launch
2026-04-09 15:52:59 +00:00
Matthew Meszaros
33092fa56e
fix: add 10MB request body size limit to prevent OOM from large payloads
2026-04-09 15:50:08 +00:00
Matthew Meszaros
816c432e71
feat: add deep health check endpoint with PostgreSQL connectivity check
2026-04-09 15:49:28 +00:00
Matthew Meszaros
dd1fc3d41d
feat: generate List-Unsubscribe URL for campaign emails when unsubscribe header is enabled
2026-04-09 15:17:39 +00:00
Matthew Meszaros
ffe6bd31ca
fix: sanitize Stripe error messages to prevent leaking internal details to clients
2026-04-09 15:15:18 +00:00
Matthew Meszaros
3699774f7d
fix: use timeout context for Stripe webhook migration goroutines to prevent leaks
2026-04-09 15:13:47 +00:00
Matthew Meszaros
9c4b6d21fd
fix: add contact email deduplication with unique index and upsert on conflict
2026-04-09 15:12:41 +00:00
Matthew Meszaros
41aa183be2
fix: add campaign state machine to prevent invalid status transitions
2026-04-09 15:11:58 +00:00
Matthew Meszaros
36f4a94814
fix: prevent race condition in dedicated worker assignment with atomic insert
2026-04-09 14:54:22 +00:00
Matthew Meszaros
306690db0a
feat: add explicit position column to sequences for deterministic ordering
2026-04-09 14:52:17 +00:00
Matthew Meszaros
421a3fb3dc
fix: add campaign ownership validation to prevent IDOR in bulk campaign operations
2026-04-09 14:48:29 +00:00
Matthew Meszaros
c2948d464b
fix: add hard limit to pipeline list query to prevent unbounded results
2026-04-09 14:47:14 +00:00
Matthew Meszaros
d903c26255
fix: add hard limit of 500 to template list query to prevent unbounded results
2026-04-09 14:46:20 +00:00
Matthew Meszaros
4f16944ff8
fix: add size limits to bulk contact operations to prevent resource exhaustion
2026-04-09 14:45:10 +00:00
Matthew Meszaros
d417b1f0a4
perf: add missing index on campaign_leads(contact_id) for reverse lookups
2026-04-09 14:43:40 +00:00
Matthew Meszaros
4b8ff94201
fix: use correct column names contact_id and campaign_id in campaign_leads queries
2026-04-09 14:43:10 +00:00
Matthew Meszaros
0799020dac
feat: add metrics, warmup content variety, tz-aware scheduling, org budget, admin stubs, and bug fixes
2026-04-09 14:33:45 +00:00
Matthew Meszaros
19d20e72b4
feat: add warmup health throttled state, complaint/bounce metrics, A/B analysis, and rate limiting
2026-04-09 12:51:30 +00:00
Matthew Meszaros
ba9e3c096a
fix: replace context.TODO with proper context in cipher and Google client
...
- cipher: use the already-available ctx parameter for DynamoDB Put
- goog: use context.Background for OAuth token refresh callback since
it runs asynchronously outside any request lifecycle
2026-04-09 12:10:42 +00:00
Matthew Meszaros
91ec703093
fix: increment verification code tries on failed attempts
...
The Tries counter on login and registration sessions was checked but
never incremented, making the brute-force protection dead code. An
attacker could retry verification codes indefinitely within the session
TTL. Now each failed attempt increments and persists the counter.
2026-04-09 12:10:26 +00:00
Matthew Meszaros
4ec7e65896
fix: prevent nil deref on Stripe Customer and use background ctx for goroutines
...
- Guard checkoutSession.Customer access with nil checks to prevent panic
when Stripe sends incomplete checkout session data
- Switch worker migration goroutines from request ctx to context.Background()
since these operations outlive the webhook HTTP request and would be
cancelled prematurely when the response completes
2026-04-09 12:09:07 +00:00
Matthew Meszaros
7fe8e663d5
fix: propagate parent context instead of context.TODO in cipher service
...
The ctx parameter was already available from the Cipher method but
wasn't being passed to the DynamoDB Put call for new DEK storage.
2026-04-09 12:06:54 +00:00
Matthew Meszaros
6517b06893
feat: expand warmup subject lines and conversation templates
...
Increase warmup subjects from 5 to 20 and conversations from 3 to 12
to reduce repetition patterns that spam filters can detect. New themes
cover industry, tools, networking, feedback, planning, reading, travel,
wellness, and events.
2026-04-09 12:06:30 +00:00
Matthew Meszaros
3edf6b1d22
refactor: remove redundant min/max helpers shadowing Go builtins
...
Go 1.21+ provides builtin min/max for all ordered types. Remove the
custom int helpers and replace math.Max with builtin max for floats.
2026-04-09 12:06:25 +00:00
Matthew Meszaros
57644d752d
refactor: replace fmt.Printf with structured zerolog logging and fix weak URL hash
...
- Replace all fmt.Printf calls in Kafka consumer/producer, tracking consumer,
and user email task with structured zerolog (log.Warn/Error/Info)
- Fix hashURL using SHA-256 instead of naive first-8-chars+length approach
which was collision-prone for deduplication
2026-04-09 12:06:20 +00:00
Matthew Meszaros
9dbd25b24b
feat: delete S3 email body after successful send
2026-04-03 06:25:44 +00:00
Matthew Meszaros
308f72b874
feat: add CORS origin config, encrypt email bodies in S3, replace printfs with structured logging
2026-04-03 06:24:20 +00:00
Matthew Meszaros
d8d88c7f69
feat: add warmup health tracking, migrate repos to postgres, and overhaul web UI
2026-04-03 06:08:52 +00:00
Matthew Meszaros
21ffb6a748
feat: add advanced outreach controls with A/B testing, deliverability dashboard, and DLQ
2026-02-20 08:59:17 +00:00
Matthew Meszaros
c564b3ac95
feat: implement unibox replies, warmup conversations, and daily email limits
2026-02-20 04:54:46 +00:00
Matthew Meszaros
ae0a8f16a2
feat: add web dev container and use unique host ports
2026-02-19 03:07:06 +00:00
Matthew Meszaros
fbb55379c5
fix: propagate captcha errors and fix JWT signing
...
- Return actual captcha verification errors instead of generic
internal errors in login, registration, and reset password flows
- Fix Sentry capturing wrong variable (err -> xerr) in
RegistrationConfirm
- Pass AuthSecret as []byte to JWT SignedString/keyfunc
- Send form data in request body instead of PostForm for Turnstile
- Improve Turnstile non-200 error handling with response body logging
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-18 06:30:50 +01:00