Commit Graph
747 Commits
Author SHA1 Message Date
Dries AugustynsandGitHub 6759bffd2a Merge pull request #381 from taniasanz7/patch-29-contact-email-link
feat(contacts): make email cell a link to the contact detail page
2026-05-16 21:45:25 +02:00
Dries AugustynsandGitHub d2496bc51d Merge pull request #368 from ReylanLugo/feat/domains-api-key-auth
feat(api): allow API key authentication for domain endpoints
2026-05-16 21:42:43 +02:00
Dries AugustynsandGitHub bfecf04fa3 Merge pull request #375 from taniasanz7/patch-1-webhook-templating
feat: render template variables in WEBHOOK step url, headers and body
2026-05-16 21:40:55 +02:00
Tania Sanz 6d98d51222 feat(contacts): make email cell a link to the contact detail page
Currently the only entry point from the /contacts list to a contact's
detail page is the small Edit icon-button in the actions column. Make
the email itself a Link to /contacts/:id so the obvious affordance
("click the thing that identifies the row") works too. Applied to both
the desktop table cell and the mobile card variant.
2026-05-16 21:26:18 +02:00
taniasanz7andTania Sanz c484da88ab feat: render template variables in WEBHOOK step url, headers and body 2026-05-16 08:11:35 +02:00
Dries AugustynsandGitHub 1d475c382b Merge pull request #361 from useplunk/release-please--branches--next--components--plunk
chore(next): release 0.11.0
v0.11.0
2026-05-13 21:14:25 +02:00
Dries AugustynsandGitHub 3fea06ba2d Merge pull request #374 from taniasanz7/patch-19-dockerignore-nested-build-outputs
fix: .dockerignore excludes nested build outputs (apps/*/dist, .next, .turbo, etc.)
2026-05-13 21:13:56 +02:00
Tania Sanz 1d1d407a6f fix: .dockerignore excludes nested build outputs (apps/*/dist, .next, .turbo, etc.) 2026-05-13 20:59:02 +02:00
github-actions[bot]andGitHub 46b2b8390f chore(next): release 0.11.0 2026-05-13 17:23:20 +00:00
Dries Augustyns 9e4aa9443b fix: improve iframe height adjustment logic in EmailEditor component 2026-05-13 19:22:17 +02:00
Dries Augustyns a27d564e1a fix: implement mergeContactData method for efficient contact data updates 2026-05-13 19:19:11 +02:00
Dries Augustyns 4e95c5a4e4 seo: implement OpenAPI operation rendering and add llms documentation 2026-05-13 17:37:02 +02:00
Dries AugustynsandGitHub 463301b5db Merge pull request #373 from taniasanz7/patch-18-configurable-mail-from-subdomain
feat: make MAIL FROM subdomain configurable via MAIL_FROM_SUBDOMAIN env
2026-05-12 22:00:21 +02:00
Dries AugustynsandGitHub f178c59b5b Merge pull request #371 from taniasanz7/patch-15-compose-env-passthrough
fix: pass missing env variables from .env.self-host.example to plunk service
2026-05-12 21:50:44 +02:00
Dries Augustyns 6195b39f3d feat: add SwitchOffer component to promote switching from competitors for enhanced user engagement 2026-05-12 21:48:35 +02:00
Tania Sanz e0bf0f628a feat: make MAIL FROM subdomain configurable via MAIL_FROM_SUBDOMAIN env var 2026-05-12 20:35:53 +02:00
Tania Sanz 8a26d605b4 fix: pass DISABLE_SIGNUPS and EMAIL_RATE_LIMIT_PER_SECOND through compose; trim .env.self-host.example
PR review (#371): scope the self-host baseline to envs that make sense
without reselling Plunk.

docker-compose.yml: pass through only DISABLE_SIGNUPS (private/single-
admin self-host) and EMAIL_RATE_LIMIT_PER_SECOND (works around the
silent 14/sec fallback when ses:GetSendQuota is denied). Drop the
VERIFY_EMAIL_ON_SIGNUP and OPENROUTER_API_KEY passthroughs — signup
hygiene and phishing detection are reselling concerns.

.env.self-host.example: drop the entire Stripe Billing block (billing
only matters when reselling), drop the VERIFY_EMAIL_ON_SIGNUP doc
block for the same reason, and add an EMAIL_RATE_LIMIT_PER_SECOND
section explaining the silent-14/sec fallback so operators know why
they'd set it.
2026-05-12 20:35:53 +02:00
Dries Augustyns 715961c007 fix: handle undefined path in footer component for improved stability 2026-05-12 08:35:12 +02:00
Dries Augustyns ccd516e4e8 feat: add Markdown cut link to footer and page for improved accessibility 2026-05-12 08:07:57 +02:00
ReylanLugo 6aee5db588 refactor(api): rely on auth middleware for domain endpoint permissions
Replace per-route apiKey/jwt branching with auth.projectId from middleware,
matching the contacts controller pattern. Preserve JWT admin gating on
POST/DELETE; API keys are project-scoped by design and skip the role check.
Cross-project domain access by ID now returns 404 instead of 403 to avoid
leaking existence.
2026-05-10 22:44:28 -04:00
Dries Augustyns 649bbf6d6b fix: enhance Quick Start card layout for improved responsiveness and usability 2026-05-10 13:57:46 +02:00
Dries Augustyns e43f70d8a1 fix: update activity item colors and backgrounds for improved visual distinction 2026-05-10 11:59:54 +02:00
Dries Augustyns f22da4add1 feat: implement caching for recent activity count to optimize performance and reduce database load 2026-05-10 11:37:31 +02:00
Dries Augustyns de6335e999 feat: implement bulk contact action selector for improved flexibility in bulk operations 2026-05-10 10:40:40 +02:00
Dries Augustyns 7658a59b5d feat: enhance campaign scheduling and audience settings UI for better clarity and usability 2026-05-10 09:52:25 +02:00
Dries Augustyns aaf5ac6530 feat: refactor template editing layout for improved usability and clarity 2026-05-10 09:24:21 +02:00
ReylanLugo 3f30a48c40 feat(api): allow API key authentication for domain endpoints
Switch /domains controller from `isAuthenticated` (cookie-only) to
`requireAuth` (cookie OR API key), matching the pattern used by other
project-scoped API endpoints (/v1/send, /contacts, etc.).

API keys are project-scoped credentials with full access; for write
operations the projectId in the request must equal the API key's
projectId. JWT (dashboard) auth retains role-based checks
(requireAdminAccess for POST/DELETE).

Also: improve UX when a domain is already linked to the same project
by returning a clear error instead of the generic "linked to another
project" message.

Refactor DomainService.checkDomainOwnership to make `userId` optional
(needed for API key path) while preserving its existing return shape
and adding `projectId` to the result.
2026-05-09 22:25:17 -04:00
Dries Augustyns c6340a1dc7 feat: add workflow duplication functionality with API endpoint and UI button 2026-05-09 16:51:36 +02:00
Dries Augustyns 4ba43dd3b6 feat: add external link to edit email templates in SendEmailStepDialog and WorkflowBuilder 2026-05-09 16:36:47 +02:00
Dries Augustyns d11495061d feat: add search functionality to campaigns list with debounce effect 2026-05-09 09:10:17 +02:00
Dries Augustyns fadc19d139 feat: Ability to change subscription status in workflows 2026-05-09 08:43:05 +02:00
Dries Augustyns 2ea1802290 fix: update TemplateSearchPicker to maintain selected template name on change 2026-05-08 08:03:15 +02:00
Dries Augustyns 15bdcf6e49 seo: Enhance copy of landing page 2026-05-07 09:21:30 +02:00
Dries Augustyns 2529c9b428 fix: enhance campaign finalization process to handle pending emails and ensure accurate status updates 2026-05-06 21:48:54 +02:00
Dries Augustyns 4ddafdc041 docs: expand documentation with new sections on importing contacts, unsubscribe pages, and API key management 2026-05-06 21:37:00 +02:00
Dries Augustyns 88be252a29 seo: add comparison pages for Mailjet, Buttondown, and Amazon SES 2026-05-06 20:21:49 +02:00
Dries Augustyns db5dfc46ce seo: add MX record checker and header checker tools 2026-05-06 19:40:25 +02:00
Dries Augustyns e2ce5d4e96 seo: Add dkim, dmarc, spf check 2026-05-06 17:06:14 +02:00
Dries Augustyns 735acff454 feat: add sanitize-html for improved email content sanitization 2026-05-06 11:06:50 +02:00
Dries Augustyns 1193d6c7e6 log: remove detailed logging of full SES notification for inbound email 2026-05-06 10:46:47 +02:00
Dries Augustyns 62661ae45f log: improve logging for inbound email notifications and enhance email content parsing 2026-05-06 10:37:39 +02:00
Dries Augustyns 4587e9d670 fix: enhance email content parsing and logging for better debugging 2026-05-05 20:35:36 +02:00
Dries Augustyns 88a8a02e53 ui: add SVG favicon and update favicon links for consistency 2026-05-05 08:34:41 +02:00
Dries Augustyns cbb3bffcf4 fix: update middleware matcher to exclude webmanifest files 2026-05-05 08:25:51 +02:00
Dries Augustyns 80ef65e04b docs: update README to clarify self-hosted alternative and add inbound emails feature 2026-05-04 21:15:54 +02:00
Dries Augustyns 361ec0b1eb refactor: convert forwardRef components to function components for consistency 2026-05-04 21:08:14 +02:00
Dries Augustyns ed9027b4ef refactor: implement step dialog components for workflow editing 2026-05-04 20:25:19 +02:00
Dries Augustyns d1f357c300 fix: update segment filter logic to retain value and unit, enhance activity name mapping 2026-05-04 19:39:32 +02:00
Dries Augustyns a126563542 fix: update segment filter logic to retain value and unit, enhance activity name mapping 2026-05-04 19:35:29 +02:00
Dries Augustyns a3cc62213f feat: add segment membership operators and enhance segment filter functionality 2026-05-04 19:07:04 +02:00