Commit Graph

1633 Commits

Author SHA1 Message Date
Matthew Meszaros 1387541bf0 feat: make self-hosted auth work without a mail relay by rewriting the platform SMTP transport with real AUTH and TLS (it did neither, so SMTP_USERNAME/SMTP_PASSWORD were dead and every documented relay was unreachable), adding MAIL_TRANSPORT=smtp|log|ses with a log transport that prints codes so a fresh install can sign in with no relay, demoting the emailed login code to AUTH_LOGIN_CODE=always|new_device|off (off on self-host, per NIST SP 800-63B and OWASP ASVS), claiming the first owner through a single-use setup link or WARMBLY_BOOTSTRAP_* instead of register-then-psql, deriving every emailed URL from APP_URL rather than a hardcoded app.warmbly.com that leaked live reset tokens to the vendor, fixing the confirm hooks that read path params against paramless routes and broke login, register and reset confirmation in the dashboard everywhere, adding generic OIDC with PKCE, one-time state, verified nonce and (issuer,subject) identity binding, enforcing 2FA on the social paths that skipped it, adding a per-IP limiter and trusted-proxy handling to the unthrottled auth group, refusing boot on the published default secrets, and dropping mailpit from the default stack 2026-08-14 10:37:14 +02:00
Matthew Meszaros 8f465fdb1c feat: give each mailbox a human sending persona (randomized daily and hourly caps, send spacing, work start/end, lunch break and working weekdays, rolled once per local day in the mailbox's own timezone and applied across the campaign, warmup and smart-send schedulers), add campaign auto-pause guardrails that stop a campaign when its bounce, complaint or reply rate leaves the configured band, make mailbox rotation actually rotate for tag-resolved and all-mailbox campaigns, stop every scheduler from ever returning a slot in the past, and correct the mailbox min-gap field that stored seconds while labelling them minutes 2026-08-13 16:51:29 +02:00
Matthew Meszaros 8bd2c2b57a feat: make self-hosting work end to end and rewrite the guide around what was tested (#97) 2026-08-13 09:47:46 +02:00
Matthew Meszaros a7518a8558 docs: refresh the documentation site, fix inaccurate claims and contact addresses, add SEO primitives (#90)
* feat: rewrite the self-hosting docs against repo ground truth: turn the deployment guide into a full self-host guide (quick start with first-admin bootstrap via make grant-admin, .env secrets with exact key formats, PUBLIC_HOST derivation and HTTPS reverse-proxy vars, provider switches with build-tag caveats, mailbox OAuth, remote worker enrollment via SSH or wmenroll tokens, real CI image tags, upgrades and backups), rewrite the events page around the real NATS/Kafka bus topics and {type,body} envelopes, fix Kafka-era and make-target claims in architecture/local-development/deploy README, add API_PUBLIC_URL and drop the dead LOG_DISCORD_WEBHOOK_URL in env.example, and remove the docker-compose.kafka.yml comment pointing at a file that does not exist

* feat: make the self-hosting docs visual and skimmable by adding a Mermaid MDX component (client-rendered, theme-aware) to the docs site, condensing the self-host guide around a control-plane topology diagram, a worker enrollment sequence diagram, a dashboard screenshot, and symptom/check troubleshooting + optional-subsystem tables, and adding an execution-plane flowchart to the architecture page

* feat: stop the docs root flashing a 'Continue to the Warmbly docs' link before redirecting by navigating with an inline location.replace that runs during HTML parse, and demoting the visible link and meta refresh to no-JS fallbacks inside noscript

* feat: cut docs bulk and duplication by deleting three orphaned API pages that were stale forks of the reference section and were unreachable from the sidebar (porting their unique social sign-in, promo-code, and referral endpoints into api/reference/account-org.mdx as compact tables), condensing the deliverability and warmup guides to roughly half their length around tables instead of prose, replacing prose em dashes across the guides and MCP pages, and adding the required trailing slashes to internal links in 24 files

* feat: condense the sequences guide by about 40 percent, folding the switch-step deciders and branch conditions into tables and cutting restated prose while keeping every rule about threading, instant branches, reply matching, and stop on reply

* feat: condense the automations, unibox, advisor, and expressions guides by roughly 40 percent each, folding trigger lists, action catalogs, sending controls, and advisor checks into tables, adding a trigger-condition-action flow diagram to automations, and cutting restated prose while preserving every threshold, permission boundary, and rule

* feat: condense the mailboxes, campaigns, analytics, and team-roles guides by roughly 45 percent each, replacing prose walks through providers, rotation modes, lead statuses, counting rules, A/B confidence, and the permission matrix with compact tables and collapsing the four-way role grid into one capability table plus a one-line mapping

* feat: condense the AI-steps, security, and contacts-CRM guides by roughly 40 percent, turning sign-in methods, AI step modes, switch deciders, credit and failure behavior, import field mappings, and deal views into tables while keeping every safety boundary and dedupe rule

* feat: condense the meetings, notifications, AI-credits, and AI-assistant guides by roughly 40 percent, merging notification categories and their defaults into one table, collapsing credit costs, spend controls, and plan allowances into tables, and tightening the assistant page around its approval and permission boundaries

* feat: condense the integrations, collaboration, zapier, and make guides by roughly 35 percent, grouping the thirty-row Zapier and Make action lists into eight labelled areas, folding CRM default field mappings and presence indicators into tables, and promoting the destructive-action and unattended-delete warnings into callouts

* fix: correct three factual errors in the development docs: NOTIFICATION_EMAIL_DAILY_CAP=0 means uncapped rather than disabled (overEmailBudget returns false at limit<=0, so documenting it as a kill switch inverted the behavior), and the worker-SSH and warmup-pool migration citations in architecture.mdx pointed at pre-squash filenames that no longer exist or now belong to unrelated migrations, so both now cite the tables in 000001_baseline.up.sql

* feat: add the missing docs SEO primitives: a build-time sitemap.xml covering all 64 pages, a robots.txt that points at it and keeps the llms.mdx and og mirrors out of the index as duplicate content, and per-page canonical plus richer OpenGraph URL/title/description metadata

* fix: use the single real team@warmbly.com address everywhere a human is told to write in, replacing the invented hello/sales/legal/support inboxes across the marketing site, the transactional email footer, and the admin outreach composer default Reply-To (which pointed replies at a mailbox that does not exist), and collapse the contact page's two-inbox framing into one inbox with one published response time
v0.2.0
2026-08-05 10:37:27 +02:00
Matthew Meszaros 50f50e680d feat: make the inbound mail pipeline work end to end by never publishing the eventbus partition key as Nats-Msg-Id (JetStream deduped every event after the first per mailbox), fetching IMAP message bodies after the outer FETCH closes instead of nesting one inside it (which deadlocked sync on the first message), wrapping NEW_EMAIL in JobEventNewEmail across all three providers so the consumer stops nil-derefing, coalescing nil arrays before the NOT NULL unibox columns, sealing validation credentials on a copy so stored SMTP/IMAP passwords are not double encrypted, routing the email task type to the user email handler, and returning false instead of closing a nil conn in VerifySMTP (#88) 2026-07-31 09:41:36 +02:00
Matthew Meszaros 5e6287c920 feat: add the Advisor, continuous sending checks surfaced on the row they are about (#86)
* feat: index advisor findings by subject and parent entity so a list page fetches its whole surface once and every row resolves its own advice from the shared cache instead of firing a request per row

* feat: rebuild the advisor fix drawer as a three-screen resolution flow (why it fired with the measured evidence, the exact before and after, then an animated outcome with undo) with a progress rail and direction-aware transitions, and deep-link manual fixes to the screen where they are made

* feat: add AdvisorRowFlag, the inline per-row advisor indicator that renders on the mailbox or campaign the problem is about and opens that row's findings in an anchored panel instead of making the reader join a card list against a table

* feat: add AdvisorSummaryBar, a one-line collapsible page summary that replaces the stack of advisor cards above a list, counts the distinct rows implicated rather than the findings, and forces itself open only for critical or workspace-level advice no row flag can carry

* feat: put advisor advice on the mailbox row it is about in the accounts list, replace the card stack above the table with the collapsible summary bar, and support ?mailbox=<id> so a finding can deep-link straight to the mailbox detail instead of the top of the list

* feat: flag advisor findings on the campaign row in the campaigns list, including step-level copy problems which index onto their parent campaign since a step has no row of its own, and add the collapsible summary bar above the list

* feat: move the deliverability and contacts pages onto the collapsible advisor summary bar so their findings stop pushing the numbers they describe below the fold

* feat: add an ordered Steps field to advisor findings, persisted as text[] and always refreshed from the current build, and write real how-to steps for the deliverability checks that have no one-click fix (bounce rate, spam placement, tracking domain, and per-record SPF/DKIM/DMARC instructions)

* feat: write ordered how-to steps for the manual advisor findings where the remedy alone leaves someone stuck (broken template syntax, missing first-name fallback, unsubscribed contacts still enrolled, a campaign with no resolvable sender, and a mailbox that lost warmup pool standing) and correct the personalization detail that named a merge syntax this product does not use

* feat: show a mailbox's advisor findings at the top of its detail drawer, which is where both the row flag and the ?mailbox deep link now land

* feat: open the resolution flow from findings that have no one-click fix too, since the ordered how-to lives there and a card with no Fix button previously left the steps unreachable

* docs: document the per-row advisor flags, the collapsible page summary, the three-screen resolution flow, and the ordered manual steps for findings with no one-click fix

* feat: align the advisor summary bar to the px-5 page gutter used by SectionBar and the list rows on all four surfaces, instead of sitting flush against the edge while the table it describes is indented

* fix: stop the resolution drawer collapsing to zero height between screens by switching the step transition to popLayout with a layout-animated container, so the dialog resizes into the next screen instead of snapping shut and reopening

* feat: wire the advisor repository, narrator, service, tool registration, and background runner into the backend boot path so findings evaluate on a schedule and the assistant can read them

* docs: register the advisor guide in the sidebar, add its endpoint scope table to the API reference, and document the sandbox advisor showcase

* fix: darken the advisor nav badge to solid orange-600 on white instead of a pale amber-100 chip that read as a disabled control beside the sidebar's saturated indicators, and drop the critical badge to rose-600 so the two stay in the same weight class

* fix: use orange-500 for the advisor nav badge, matching the high-severity dot on the row it points at, rather than the darker orange-600

* feat: add an Auto safety class to advisor actions and mark the seven fixes autopilot may apply unattended (the cap cuts, the send-gap widen, the campaign limit matches, and the unsubscribe header), with a test pinning the boundary so nothing that halts sending or generates new outbound mail can drift into it

* feat: add advisor autopilot, which applies the auto-safe fixes unattended as the member who switched it on, resolving their live permissions each run so it fails closed when they leave the org, bounded to 10 changes per evaluation and audited per fix like any hand-made change

* feat: add the advisor agent fix, a bounded per-finding agent run that resolves the problems a settings change cannot (broken template syntax, bulk-reading copy, shared-inbox lists) as the calling member inside a tool allowlist scoped to the finding's category, metered per iteration and marked applied only when it actually called a write tool

* feat: surface autopilot and the agent fix in the dashboard, adding the workspace toggle that names exactly which changes it may make, an Auto chip on the findings it is allowed to take, and an agent-fix path in the resolution drawer that reports the tools it actually called rather than only its own account of them

* docs: document the agent fix and autopilot, naming the exact set of changes autopilot may make, that it acts as the member who enabled it and stops when they leave, and why the agent-fix endpoint is JWT only

* fix: gate the agent fix per detector instead of per category, so a missing DMARC record no longer offers a Fix-with-agent button it can never satisfy and then reports failure; findings whose fix lives in DNS or a provider console now show their manual steps, and the client is told which is which via agent_fixable

* feat: soften the advisor surfaces to translucent washes, replacing the filled nav badge with a tinted pill that carries its colour in the text, frosting the row panel and the resolution drawer, and turning the severity chips and cards into layers the page shows through

* docs: correct the agent-fix scope to name the findings it cannot resolve, and why a DNS record shows steps instead of a button

* feat: ship the actual DNS records for the findings that live outside the platform, with the provider's SPF include resolved, the DMARC record scoped to the sending domain and starting at p=none, the DKIM host plus the console that generates its value, and a tracking CNAME pointing at this install's own tracking host

* feat: render advisor snippets as labelled copy-button rows so a DNS record is one click per field rather than a text-selection exercise, with no copy affordance on a value the server could not supply

* docs: document the pasteable DNS records and the guarantee that every check offers a fix, an agent, or ordered steps

* fix: bump golang.org/x/text to 0.39.0 to clear CVE-2026-56852, a HIGH-severity infinite loop in norm.Iter that Trivy started failing the security scan on
2026-07-30 17:15:09 +02:00
Matthew Meszaros b342629534 Merge pull request #85 from Turtlesfr/fix/duplicate-migration-000077 2026-07-26 19:44:20 +02:00
Matthew Meszaros 764500391c fix: clear the trivy security scan by bumping react-router-dom to 7.18.1 in web and admin, postcss to 8.5.23 across web/admin/docs (docs via a pnpm-workspace override since next pins 8.4.31), next and eslint-config-next to 16.2.11, and ignoring the RSC-only react-router CSRF advisory 2026-07-26 19:36:23 +02:00
Alexandre a8dcc8e49b fix: renumber migration 000077_ai_variables_resolved to 000078 to resolve the duplicate version with 000077_warmup_generation_scale that makes golang-migrate fail on backend boot 2026-07-26 11:05:59 -04:00
Matthew Meszaros 7efd4c09df Merge pull request #84 from warmbly/release-frontend-assets
Ship the dashboard and admin as production release images
v0.1.0
2026-07-22 18:43:25 +02:00
Matthew Meszaros 53a05fa7dd docs: document the web and admin release images and their WARMBLY_* runtime env in the deployment guide 2026-07-22 18:40:06 +02:00
Matthew Meszaros 084dd0a3d9 ci: build the web and admin images on PRs that touch them and run the web typecheck so broken frontend Dockerfiles and type errors are caught before a release 2026-07-22 18:40:06 +02:00
Matthew Meszaros 79efbd4b5b feat: publish the web and admin images to GHCR in the release workflow and serve those production builds from the prod docker-compose instead of the Vite dev servers 2026-07-22 18:40:06 +02:00
Matthew Meszaros 664774e1e3 feat: add production nginx Dockerfiles for the web dashboard and admin panel that build the SPA once and render /config.js from WARMBLY_* env at container start 2026-07-22 18:40:06 +02:00
Matthew Meszaros 611ecba1c2 feat: add the same runtime config shim to the admin panel so its built image reads api url, dashboard url, env label, and turnstile key from container env 2026-07-22 18:40:06 +02:00
Matthew Meszaros 9a67008ea2 feat: add a runtime config shim to the dashboard so a single built image reads its API url, app url, tracking domain, and turnstile key from container env via /config.js 2026-07-22 18:40:06 +02:00
Matthew Meszaros 666ea44256 fix: type the conditional token build/parse helpers with a uid-less subset so the web typecheck passes on the transient uid attribute 2026-07-22 18:40:06 +02:00
Matthew Meszaros 443dcbf4b5 Merge pull request #83 from warmbly/ai-content-blocks
AI content blocks and a much more capable dashboard assistant
2026-07-22 17:59:36 +02:00
Matthew Meszaros cca3bd5ba0 fix: keep the marketing site on sharp 0.34.5 since 0.35 breaks its Cloudflare build, bump svgo to 4.0.2, and suppress the remaining build-only sharp HIGH in the documented .trivyignore 2026-07-22 17:53:13 +02:00
Matthew Meszaros 00e12fab8f fix: upgrade grpc to 1.82.1 (plus its otel/oauth2/genproto bumps) to clear the HIGH GHSA-hrxh-6v49-42gf xDS RBAC and HTTP/2 advisories 2026-07-22 17:53:13 +02:00
Matthew Meszaros 66e9856ea8 fix: bump sharp to 0.35 in docs and site and linkify-it to 5.0.2 in web via pnpm overrides to clear the HIGH-severity Trivy CVEs blocking the security scan 2026-07-22 17:33:52 +02:00
Matthew Meszaros 55dfa56c33 docs: wrap the company merge token in backticks in the AI variables guide so MDX does not parse it as a JS expression and the docs build succeeds 2026-07-22 17:24:07 +02:00
Matthew Meszaros a7d06cbfbe docs: italicize the support and enterprise note callout to match the repo aside style 2026-07-22 17:17:14 +02:00
Matthew Meszaros f2f06b10ed docs: add a Runs on Docker Compose badge to the self-hosting section and restyle the support and enterprise section as a blue-bordered note callout 2026-07-22 17:14:22 +02:00
Matthew Meszaros 225a9c7472 docs: add a support and enterprise section to the README with managed-infrastructure and enterprise-support offers plus WarmblyHQ X follow buttons 2026-07-22 17:05:38 +02:00
Matthew Meszaros 8032167837 docs: document the expanded agent tool surface in the MCP reference and rewrite the AI assistant guide for real sending with approval and full workspace parity 2026-07-22 17:05:38 +02:00
Matthew Meszaros fe127c9d8d feat: add automation agent tools to list, read, update, enable or disable, and delete automations while preserving the node graph 2026-07-22 17:05:37 +02:00
Matthew Meszaros 67c4dbfdfb feat: add API key and webhook management agent tools gated on manage-api-keys and manage-settings 2026-07-22 17:05:37 +02:00
Matthew Meszaros 1efc722458 feat: add JWT-only team, org-settings, voice-profile, and read-only billing agent tools that API keys and MCP cannot reach 2026-07-22 17:05:37 +02:00
Matthew Meszaros 49507b0244 feat: add mailbox management agent tools for reading, updating sending limits and warmup, tracking domains, warmup appeals, and disconnecting a mailbox 2026-07-22 17:05:37 +02:00
Matthew Meszaros 64ccd1b273 feat: add send_reply and compose_email agent tools as RiskSend with a recipient-suppression gate, so the assistant can send with per-action approval and never over MCP 2026-07-22 17:05:37 +02:00
Matthew Meszaros ae99322f29 feat: add unified-inbox agent tools for mark-seen, thread labels, snooze, and scheduled-send review and cancel 2026-07-22 17:05:24 +02:00
Matthew Meszaros 6d8385c89e feat: add campaign sequence-step agent tools to list, add, update, and delete steps 2026-07-22 17:05:24 +02:00
Matthew Meszaros 2efffda0f6 feat: add campaign get, update, delete, sender-set, tracking-domain verify, and logs agent tools 2026-07-22 17:05:24 +02:00
Matthew Meszaros 66c49bddc0 feat: add full CRM agent tools covering deals, tasks, task types, notes, pipelines, and stages end to end 2026-07-22 17:05:24 +02:00
Matthew Meszaros 2fba098313 feat: add contact create, delete, bulk-edit, timeline, and sent-email agent tools, each gated by the caller's contact permission and org 2026-07-22 17:05:24 +02:00
Matthew Meszaros 2da507c673 feat: wire the new agent tool service dependencies into the tool registry and hoist advancedService construction so the compose and reply suppression gate is available 2026-07-22 17:05:24 +02:00
Matthew Meszaros 97461cd0cb feat: expand aitools Deps with mailbox, send, compose, warmup, sequence, org, api-key, webhook, subscription, and suppression services and register the new tool groups 2026-07-22 17:05:24 +02:00
Matthew Meszaros 0f86917880 feat: add a JWTOnly gate to the aitools registry so tools whose HTTP route has no API-key scope are hidden from API-key and MCP callers 2026-07-22 17:05:24 +02:00
Matthew Meszaros 58c166c073 docs: add the AI variables guide and update the campaigns API reference, endpoints scope map, AI credits, and guides nav for per-recipient AI blocks 2026-07-22 17:05:08 +02:00
Matthew Meszaros 14587b9cd1 feat: swap the OG and Twitter social image for the new Social.jpg and update its width and height to 1280x640 2026-07-22 17:05:08 +02:00
Matthew Meszaros 887106c3d9 feat: add BuildInlineSnippetRules humanization prompt for AI variables so inline fragments read plainly and fit the surrounding sentence instead of copywriting rhythm 2026-07-22 17:05:08 +02:00
Matthew Meszaros 5bb449f682 feat: add the POST /generation/ai-variable preview endpoint that resolves a block for a sample or selected contact with the same credit semantics as write 2026-07-22 17:05:08 +02:00
Matthew Meszaros f2eddb0c4b feat: resolve per-recipient AI variables in the campaign task before tracking, threading surrounding email context and caching results per contact and step 2026-07-22 17:05:08 +02:00
Matthew Meszaros 8fc9cb7dba feat: add migration 000077 for the campaign_contact_progress ai_variables_resolved cache column so retried sends never regenerate a snippet 2026-07-22 17:05:08 +02:00
Matthew Meszaros 4ad91688e3 feat: adopt the shared variable catalog and chip editor on the templates page so templates get the same personalization experience as campaigns 2026-07-22 17:05:08 +02:00
Matthew Meszaros 0fb3147244 feat: add the AI-variable config model, encode/decode, generate client, and useGenerateAIVariable hook for the block preview button 2026-07-22 17:05:08 +02:00
Matthew Meszaros 470d6f43a8 feat: replace the Write with AI blob action with an inline caret AI assistant in the campaign email editor 2026-07-22 17:04:51 +02:00
Matthew Meszaros 1750d4eb45 feat: wire variable chips, per-recipient AI blocks, and conditionals into RichTextEditor, EmailContentEditor, the preview renderer, and chip styles 2026-07-22 17:04:51 +02:00
Matthew Meszaros 04a8463eba feat: add useAnchoredFloating hook wrapping floating-ui with a fixed strategy so editor popovers anchor correctly inside transformed dialogs 2026-07-22 17:04:51 +02:00