mirror of
https://github.com/warmbly/warmbly.git
synced 2026-09-05 16:02:48 +00:00
* feat: ease a graduating mailbox into cold volume instead of handing it the full cap the day it joins a campaign: cold sending read warmup HEALTH but never whether the mailbox had actually warmed enough, so one at its 40/day warmup ceiling could send 50 cold the next morning, which is the post-warmup spike providers penalise; effectiveCap gains a min() term that starts the mailbox at 5, 10 or 20 a day by how long it warmed and adds 5 per clean day toward its own cap, freezing on a spam placement through the same union-of-freezes the warmup ramp uses, anchored by a new cold_ramp_started_at stamped idempotently on the first cold send and reset on org import because it raises a ceiling the destination never watched being earned; mailboxes that never warmed are not gated, since capping senders who never opted into warmup is a different decision from smoothing the transition out of it * feat: anchor the graduation ramp on a CONFIRMED send, and make the hold the drawer reports the hold the scheduler applies: stamping cold_ramp_started_at at dispatch started the clock on a send the worker then failed, so a mailbox climbed on days it had not proven anything, and the stamp moves to the worker's EMAIL_SENT; separately the drawer computed its hold over every placement while ColdCeiling only counts placements after the first cold send, so a placement predating the ramp read as paused while the scheduler kept climbing, and both now go through one ColdHeldUntil * fix: restore the Callout closing tag my conflict resolution dropped, which types:check and lint both pass and only pnpm build catches
Warmbly Web App
React + TypeScript frontend for Warmbly.
Stack
- React 19
- Vite (Rolldown)
- TypeScript
- TanStack Query
- Zustand
- Tailwind CSS 4
Prerequisites
- Node.js 20+
- pnpm 10+
Setup
cd web
pnpm install
cp .env.example .env
Run
pnpm dev
Default dev URL: http://localhost:5173
Quality Checks
pnpm lint
pnpm test:run
pnpm build
Project Layout
src/approute pages and layoutssrc/componentsUI and feature componentssrc/lib/apiAPI clients, hooks, and modelssrc/storesZustand store slices