Skip to content

feat(email): pre-launch marketing campaign for waitlist#356

Open
h4yfans wants to merge 1517 commits into
mainfrom
feat/marketing-launch-emails
Open

feat(email): pre-launch marketing campaign for waitlist#356
h4yfans wants to merge 1517 commits into
mainfrom
feat/marketing-launch-emails

Conversation

@h4yfans
Copy link
Copy Markdown
Collaborator

@h4yfans h4yfans commented May 11, 2026

Summary

  • Eleven-email drip series for the 400-person Memry waitlist, sent over eight weeks via Resend
  • Built with React Email; voice follows the Capacities prosumer/calm reference (one feature per email, hero plus inline screenshots, no marketing varnish)
  • Standalone package at email/ outside the pnpm workspace so marketing infra ships independently of the desktop app

Cadence

# Slug Feature
01 introduction What Memry is, why we built it
02 notes Block editor + end-to-end encryption
03 inbox Quick capture
04 tasks Tasks tied to notes and projects
05 journal Daily journal + CRDT sync
06 projects-calendar Projects and calendar
07 ai-agent BYO model (Claude, GPT, Gemini, local)
08 graph Graph view
09 offline Offline-first architecture
10 launch-week Five-day-out recap
11 launch-day Download buttons for mac/win/linux

Schedule: 1/week W1–W6, 2/week W7, 3 emails W8 (launch week intensity).

Layout

email/
├── package.json                # React Email + Resend, ESM, standalone
├── tsconfig.json
├── README.md                   # cadence + voice rules
├── .env.example                # RESEND_API_KEY, RESEND_FROM, AUDIENCE_ID, REPLY_TO
├── components/                 # Layout, Eyebrow, HeroImage, InlineImage, Signoff, Footer, constants, styles
├── emails/                     # 11 .tsx files
└── scripts/send.ts             # --to / --audience / --send-now / --export

Verified

  • pnpm install --ignore-workspace — 240 packages installed
  • pnpm typecheck — 0 errors
  • pnpm send <slug> --export — all 11 emails render to HTML (7.8–11 KB each) + plaintext

Test plan

  • cd email && cp .env.example .env and fill in real Resend credentials
  • pnpm dev — visually QA every email at http://localhost:3000
  • Verify SPF/DKIM/DMARC on the sending domain in Resend dashboard before any audience send
  • Replace placehold.co URLs with real product screenshots before each weekly send
  • pnpm send 01-introduction --to <your-email> — verify transactional send works
  • pnpm send 01-introduction --audience — verify broadcast appears in Resend dashboard (no auto-send)
  • Review copy against Memry brand voice; tweak components/styles.ts for brand palette if needed

Notes for reviewers

  • Voice was written with stop-slop rules: no em-dashes, no adverbs, no throat-clearing, active voice, varied rhythm. Worth a read-through.
  • --audience defaults to create broadcast only, not send. --send-now is the explicit blast flag to prevent fat-finger blasts.
  • email/.env.example uses your-resend-api-key placeholder (passes the repo secret scanner allowlist).
  • Standalone package (not in pnpm-workspace.yaml) means root-level pnpm install skips it. Use pnpm install --ignore-workspace inside email/ to set it up.

h4yfans and others added 30 commits April 29, 2026 23:43
- Improved the `isExtractErrorMessageCall` function for better readability.
- Clarified ESLint rule descriptions.
- Adjusted button formatting in the Example component to align with internationalization standards.
…styles

- Further refined the `isExtractErrorMessageCall` function for improved clarity.
- Updated ESLint rule descriptions for better understanding.
- Enhanced button styles in the Example component to ensure consistency with internationalization practices.
Adds title, openInInbox, unsnoozeNow, and reschedule keys under
phaseI.inboxSnoozePopover for the snoozed inbox item popover on
the calendar (chip-click action).
Renders a small floating popover for snoozed inbox items with three
actions: open in inbox, unsnooze now, reschedule (via SnoozePicker).
Mirrors the positioning/dismiss pattern of CalendarEventPopover but
stays presentational — receives data + callbacks, fires callbacks.

Outside-click handler explicitly ignores Radix popper portals so
nesting SnoozePicker (DropdownMenu + Dialog) doesn't dismiss the
popover mid-interaction.
Adds popover state slot, three action handlers (open in inbox via
useTabActions.openTab, unsnooze, reschedule via inboxService), and
prop passthrough to CalendarShell.

Navigation uses tab system (openTab) since the renderer doesn't ship
react-router; openTab dedups singleton tabs (inbox is one) so the
existing inbox tab is focused if open.

Typecheck will fail until CalendarShell props are extended in the
next commit (Task 4).
Extends CalendarShellProps with the inboxSnoozePopoverState slot and
five callbacks. Renders the popover when state is non-null, mirroring
the existing event popover render path.

Adds @/contexts/tabs mock to calendar-page.test.tsx and
calendar-quick-create.test.tsx so they don't crash on the new
useTabActions() call introduced in CalendarPage.
Three Playwright specs against the built bundle, seeded via the
existing __memryTestHooks.seedCalendarProjection hook (which already
creates a snoozed inbox item):

- Click chip opens the popover with all three action buttons; Escape
  dismisses it.
- Unsnooze now closes the popover and removes the chip from the
  calendar (cache invalidation works).
- Open in inbox tears down the calendar surface (singleton inbox tab
  takes over the active group).
extractErrorMessage requires the fallback to come from t() (lint
rule i18n/no-error-fallback-literal). Adds two phaseI.errors keys —
couldNotUnsnoozeInboxItem, couldNotRescheduleInboxItem — and uses
getI18n().getFixedT(null, 'calendar') in the new handlers, matching
the pattern used by the existing event handlers in this file.
Commit d1228ee (chore(i18n): migrate updater dialogs, tab menu, and tag
toasts) updated tag rename/delete toast strings to use the new i18n
templates ('Renamed "x" to "y"' and 'Deleted "x" from N items') but
did not refresh the corresponding test assertions in
tag-detail-view.test.tsx, leaving main red.

Update both assertions to match the rendered i18n output for the test's
fixture (count=0). No source change.
Both branches added per-sourceType branches to handleSelectItem in
calendar.tsx (main: 'task' popover; this branch: 'inbox_snooze' popover)
and a corresponding popover state hook. Conflict was on the popover
state declarations.

Resolution:
- Keep both inboxSnoozePopoverState and taskPopoverState as independent
  state hooks; keep useTabActions/openTab needed by the inbox-snooze
  "Open in inbox" handler.
- Make handleSelectItem clear the two sibling states whenever it opens
  any of the three popovers — pre-merge each branch only knew about one
  sibling, so the merged switch could leave two popovers visible at once
  across calendar.tsx and calendar-shell.tsx.
- Extend selectedItemId to also fall through to inboxSnoozePopoverState,
  matching the visual-selection contract main introduced for tasks.

Verified: pnpm typecheck:web clean, 144/144 calendar vitest tests pass.
The committed snapshot drifted from the generator output (likely after
the generator's TypeScript printer settings changed). Channel set is
identical (333 channels in both versions) — diff is purely quote style
('foo' -> "foo") and collapsing multi-line generic types onto single
lines. Verified by sorting and diffing the channel-name lists from both
files: zero differences.

This drift was pre-existing on main and was failing CI's typecheck job
on every PR (the pre-typecheck hook runs 'pnpm ipc:check' which calls
'generate-ipc-invoke-map.js --check'). Regenerating unblocks both this
PR's CI and main CI.

Verified locally: 'pnpm typecheck' (full pipeline incl. pre-hook) clean.
feat(calendar): make inbox-snooze chips clickable with action popover
…ons and remove completion checkbox

- Integrated status icons into CalendarTaskPopoverHeader, replacing the checkbox for task completion.
- Updated tests to reflect changes in rendering and interaction with task statuses.
- Removed unused props and streamlined the component's structure for better readability.
- Replaced useEffect with direct state updates during render in multiple components to avoid unnecessary re-renders and improve performance.
- Updated components such as AuthorAvatar, ColumnHeader, and FilterBuilder to handle state changes more efficiently.
- Introduced useLayoutEffect in appropriate places to ensure layout-related updates occur synchronously.
- Enhanced user experience by ensuring focus and selection behaviors are handled more intuitively across input fields and dropdowns.
…g click functionality

- Added project color display in CalendarTaskPopoverMeta for better visual identification of tasks.
- Implemented onTagClick functionality to allow users to drill down into tags directly from the popover.
- Updated CalendarTaskPopover to handle tag clicks and maintain popover state.
- Refactored related tests to ensure new features are covered and existing functionality remains intact.
h4yfans and others added 23 commits May 10, 2026 23:09
…ring sanitization'

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
Raise desktop and sync-server test coverage
…ult-mcp

# Conflicts:
#	apps/desktop/src/renderer/src/pages/settings/settings-page.i18n.test.tsx
feat: agent chat P1 — vault MCP server
…n-storage

feat: agent chat P2 conversation storage
Agent Chat P3: Chat UI and runtime orchestration
…t, updating conversation ID handling, and improving conversation creation logic. Add new component for blocks-so and adjust tests accordingly.
Eleven-email drip series for the 400-person Memry waitlist, sent over
eight weeks via Resend. Built with React Email. Voice follows the
Capacities prosumer/calm reference: one feature per email, hero plus
inline screenshots, no marketing varnish.

Standalone package at email/, outside the pnpm workspace so marketing
infra ships independently of the desktop app.

- Shared components: Layout, Eyebrow, HeroImage, InlineImage, Signoff,
  Footer, constants, styles
- 11 emails: introduction, notes (+E2E), inbox, tasks, journal (+sync),
  projects+calendar, AI agent, graph, offline, launch-week recap,
  launch-day with download buttons
- scripts/send.ts with three modes: --to (test send), --audience
  (broadcast create), --export (render to HTML + plaintext)

Verified: pnpm typecheck clean, all 11 emails render via send --export
to 7.8 to 11 KB HTML each (well under Gmail clip threshold).
@vercel
Copy link
Copy Markdown

vercel Bot commented May 11, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
memry-docs Ready Ready Preview, Comment May 11, 2026 9:12pm
memrynote-landing Ready Ready Preview, Comment May 11, 2026 9:12pm

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies documentation Improvements or additions to documentation enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant