Commit Graph

228 Commits

Author SHA1 Message Date
Matthew Meszaros c9f2ae4a11 site: theme tokens, layout/header/footer, home page 2026-05-25 16:37:17 +00:00
Matthew Meszaros 45f51c2cbb site: bootstrap site/ from warmbly-web (strip old content for redesign) 2026-05-25 16:29:37 +00:00
Matthew Meszaros 6c4fad43fc Merge pull request #13 from warmbly/fix/dev-stack-and-worktree-split
Fix dev stack startup and split into infra + app for worktree sharing
2026-05-25 13:50:41 +02:00
Matthew Meszaros ef9ce6a6e2 refactor: split make dev into make infra and make app
Every docker compose invocation in the Makefile now pins
-p warmbly so all git worktrees target the same compose
project. This means infra (postgres, redis, kafka, mailpit,
localstack, stripe-mock, cloud-tasks-emulator, zookeeper,
schema-registry) is brought up once and stays running across
worktree switches. App services (backend, consumer, worker,
tracking, realtime, web) recreate in place per worktree against
the bind-mounted source.

Removed targets:
- dev, dev-down, dev-logs (and the DEV_SVCS / SVCS vars)

Added targets:
- infra, infra-down
- app, app-down, app-logs

Daily flow becomes:

    make infra                     # once, from any worktree
    cd /path/to/worktree-a
    make app                       # bring up app code for branch A
    cd /path/to/worktree-b
    make app                       # recreates app against branch B;
                                   # infra untouched, caches warm

The named cache volumes already shared their content across
worktrees (warmbly_gomodcache, warmbly_gocache, warmbly_cargo_home,
warmbly_cargo_target, warmbly_mix_deps, warmbly_mix_build); pinning
the project name additionally makes container ownership shared,
which is what eliminates the per-worktree cold start.

README.md, resources/local-development.md, resources/deployment-guide.md,
deploy/README.md, and docker-compose.dev.yml all updated to reflect
the new targets.
2026-05-25 11:43:33 +00:00
Matthew Meszaros 1dc600d722 fix: disable Go VCS stamping in air dev build
The bind-mounted .git is owned by the host user but the dev
container runs as root, so git aborts with "dubious ownership"
and Go's automatic VCS stamping fails the build with:

  error obtaining VCS status: exit status 128
  Use -buildvcs=false to disable VCS stamping.

Production Dockerfiles are unaffected because they do not
bind-mount .git; they COPY source into the image and let Go
stamp normally.
2026-05-25 11:43:21 +00:00
Matthew Meszaros 1317ea67d6 fix: rename duplicate migration 000035 to 000037
PR #10 added 000035_api_key_suffix and PR #11 separately added
000035_api_key_smart_limits, both targeting the api_keys table.
golang-migrate refuses to load when two source files share a
version number, so the backend container failed health checks
in fresh stacks.

Bumping api_key_smart_limits to 000037 keeps PR #10 in its
original slot (it landed first) and matches the next free
version after 000036_contact_categories. The two migrations
touch different columns so apply order does not matter.
2026-05-25 11:43:14 +00:00
Matthew Meszaros c790812207 Merge pull request #11 from warmbly/feature/api-keys-dashboard
feat: ship api keys dashboard with smart limits and analytics
2026-05-25 12:26:54 +02:00
Matthew Meszaros e38d571610 Merge pull request #12 from warmbly/feature/campaign-creation-overhaul
feat: fix campaign creation 500 and ship full-config wizard
2026-05-25 12:26:44 +02:00
Matthew Meszaros 1435e0d618 style: gofmt api_key models 2026-05-25 10:23:32 +00:00
Matthew Meszaros b4d5667e8c Merge pull request #10 from warmbly/feature/contacts-power-tools
Contacts: categories, import/export, contact 360 slide-over
2026-05-25 12:19:08 +02:00
Matthew Meszaros 8d351d1f0f fix: satisfy golangci-lint on the contacts power-tools branch
- gofmt-align ContactEngagement fields and drop trailing blank line
  in contact/export.go
- remove no-op self-assignment ac.CustomFields = ac.CustomFields
  flagged by govet
2026-05-25 09:27:10 +00:00
Matthew Meszaros 30a1138583 feat: smart contact activity tab — search, date range, infinite scroll
- useContactTimeline now uses cursor-based useInfiniteQuery (50/page,
  before=oldest cached at) instead of a one-shot fetch
- search input filters subject/content/campaign/sequence/mailbox/
  reason/intent; matches are highlighted in the row
- date range picker (popover with from/to + 7/30/90d presets) filters
  the visible list by event timestamp
- segmented type chips with motion indicator
- IntersectionObserver sentinel auto-fetches next page as user scrolls
- when filters narrow the visible set, lazy-prefetch more pages so
  results aren't artificially short (bounded to 250 events / 5 pages)
- skeleton rows with staggered pulse on first load, inline spinner on
  subsequent page loads, "end of history" marker when done
2026-05-25 09:12:20 +00:00
Matthew Meszaros 149825783e refactor: simplify contact activity tab to match monochrome theme
- drop colored timeline rail and per-type dot colors
- collapse per-event bordered cards into one bordered list container
  with divided rows (matches Overview's "Latest activity" treatment)
- segmented filter strip with motion indicator, matches main tab strip
- quote-style left border for body content (notes, reply snippets)
  instead of a free-floating block
2026-05-25 09:06:17 +00:00
Matthew Meszaros ae091ec28e refactor: simplify contact slide-over to match app's monochrome theme
- solid slate-100 round avatar with slate-700 initials (no gradient)
- single contextual status pill only when something is off
  (suppressed/unsubscribed); no chip when everything's fine
- text-only segmented tab strip, drop icons + side tint band
- flat stat tiles, no gradient hero variant
- keep animated motion indicator on tabs and email copy affordance
2026-05-25 09:04:56 +00:00
Matthew Meszaros d15e3c3c9b feat: redesign contact slide-over header and tab switcher
- gradient avatar deterministically colored by email
- bigger display name, copy-email affordance, status + company chips
- segmented tab strip with icons and animated motion indicator
- 34rem panel, deeper shadow, subtle tinted body background
2026-05-25 08:59:29 +00:00
Matthew Meszaros dd58de3a93 feat: tabbed contact 360 slide-over with overview, activity, notes 2026-05-25 08:39:09 +00:00
Matthew Meszaros 512fea76ff feat: add contact 360 detail, sent-emails, and timeline endpoints 2026-05-25 08:30:19 +00:00
Matthew Meszaros 2170b86106 fix: stop import 500 by installing no-op audit service and drop redundant banner 2026-05-25 06:19:22 +00:00
Matthew Meszaros b6c5081a1f fix: surface real backend error on import commit instead of generic failure 2026-05-25 06:08:33 +00:00
Matthew Meszaros be6596d4ad fix: import custom-field mapping and dropdown clipping in scroll containers 2026-05-25 05:43:58 +00:00
Matthew Meszaros d28df0d27d feat: edit contact categories in detail view, fix dropdown outside-click in slide-over 2026-05-25 05:28:41 +00:00
Matthew Meszaros e523d220d8 fix: round-trip organizationpermission through smallint via scan/value 2026-05-25 05:03:04 +00:00
Matthew Meszaros 6a070b6e59 fix: stop /onboarding ping-ponging with /app/emails via authlayout guard 2026-05-25 04:51:09 +00:00
Matthew Meszaros adb8b703a6 fix: stop orggate from looping navigate() to /select-org after login 2026-05-25 04:43:06 +00:00
Matthew Meszaros e463df748f fix: add zookeeper healthcheck so kafka waits for sessions to be ready 2026-05-25 04:32:41 +00:00
Matthew Meszaros d9dba1fd49 refactor: drop buildkit cache-mount optimization, dockerfiles work on legacy builds 2026-05-25 04:14:46 +00:00
Matthew Meszaros 1aaffd25cc fix: make seed build image upfront and disable TTY so it doesnt look frozen 2026-05-25 04:09:52 +00:00
Matthew Meszaros c5e9523924 fix: make seed reconcile backend spec before running to avoid stale healthcheck 2026-05-25 04:02:20 +00:00
Matthew Meszaros b94134bce7 fix: guard /select-org and /auth, give dev backend a lenient healthcheck 2026-05-25 03:57:02 +00:00
Matthew Meszaros 8e41c36c07 fix: weaken web depends_on backend so dev mode boots without healthcheck 2026-05-25 03:50:36 +00:00
Matthew Meszaros 5c64addb1a fix: make dev brings up full stack (mailpit, web) not just lang services 2026-05-25 03:43:37 +00:00
Matthew Meszaros 13e9fc5635 fix: load user on select-org so log out footer renders 2026-05-25 03:32:56 +00:00
Matthew Meszaros 7a9b1d6f28 feat: add log out button to workspace selector 2026-05-25 03:30:12 +00:00
Matthew Meszaros 99d2bff0cb feat: unify dev-mode hot-reload for go, rust, elixir under make dev 2026-05-25 03:21:42 +00:00
Matthew Meszaros bfa856318d feat: add make watch hot-reload mode for go services via air 2026-05-25 03:07:22 +00:00
Matthew Meszaros becb8f2d10 build: share go build cache across worktrees, parallelize restart-go 2026-05-25 02:55:36 +00:00
Matthew Meszaros 3a55d317ae fix: log out and switch workspace properly via the server 2026-05-24 16:57:59 +00:00
Matthew Meszaros 02c2f097e9 fix: resolve duplicate migration 000034 (api_key_suffix -> 000035, contact_categories -> 000036) 2026-05-24 16:25:42 +00:00
Matthew Meszaros 5a2128890b feat: contacts power-tools UI (categories, export dialog, import wizard) 2026-05-24 16:17:03 +00:00
Matthew Meszaros 66b84664f0 feat: accept full initial config when creating a campaign 2026-05-24 16:13:48 +00:00
Matthew Meszaros 03dc3bce95 feat: overhaul campaign creation with atomic transactional create + multi-step wizard
- fix 500 on POST /campaigns: insert now sets NOT NULL created_at/updated_at
- atomic create writes campaign + sequences + ab variants + tag/folder links + advanced overrides in one tx
- create accepts full optional config (schedule, sender pool, tracking, sequences, variants)
- handler forwards orgID so future start/stop and org-scoped routes resolve
- fix Get/GetByID joining campaign_email_tags/campaign_folders on wrong column
- publish CAMPAIGN_CREATED realtime event after successful create
- replace name+description modal with 4-step wizard (basics, schedule, sender pool, first email + follow-ups)
2026-05-24 16:13:22 +00:00
Matthew Meszaros 9123c4bfcf feat: full api keys product (smart limits, analytics, dashboard) 2026-05-24 16:07:18 +00:00
Matthew Meszaros 07b0c8b5ff feat: backend contacts categories, smart export, csv/xlsx import 2026-05-24 16:04:48 +00:00
Matthew Meszaros ee8d4fa104 chore: ignore AI assistant local state directories 2026-05-24 15:29:16 +00:00
Matthew Meszaros 7917200771 Merge pull request #9 from warmbly/feature/implement-templates
feat: add starter preset templates picker to new-template editor
2026-05-24 17:27:20 +02:00
Matthew Meszaros 9aedd8cbb0 Merge remote-tracking branch 'origin/main' into feature/implement-templates
# Conflicts:
#	internal/api/routes.go
2026-05-24 15:25:02 +00:00
Matthew Meszaros 413108db49 Merge pull request #7 from warmbly/feature/full-seed-data
chore: stabilize CI and add repo hygiene for seed tooling
2026-05-24 17:18:31 +02:00
Matthew Meszaros b5239ba4f8 Merge pull request #8 from warmbly/feature/api-key-support
feat: add api key auth with prefixed secrets and per-endpoint scopes
2026-05-24 17:18:07 +02:00
Matthew Meszaros 64341064cf feat(web): preset templates picker in new-template editor 2026-05-24 15:11:55 +00:00
Matthew Meszaros 2c82106ca4 style: gofmt seed files 2026-05-24 12:01:53 +00:00