Date: February 2026
Last commit: a8184d0 - feat(cloud): add feedback storage, contextual help panels, and blog
Previously implemented core cloud platform:
- Cloud mode detection (
TADA_CLOUD_MODEenv var or Stripe keys) - Database schema: subscription fields, email_verification_tokens, subscription_events
- Usage limits: 1-year rolling window for free tier
- Email verification flow
- Stripe integration (checkout, portal, webhooks)
- Account page (
/account) useSubscriptioncomposableArchiveNoticecomponent
Completed:
- DELETE /api/account - Deletes user and all data
- Cancels any active Stripe subscriptions
- Invalidates all user sessions
- Deletes user record (cascades to all related data via foreign keys)
- Requires confirmation phrase "DELETE" in request body
- /account - Added "Danger Zone" section
- Delete account button with modal confirmation dialog
- User must type "DELETE" to confirm
- Works for both cloud and self-hosted modes
- feedback table - New database table for storing user feedback
- Stores type (bug/feedback/question), description, system info
- Status tracking: new → reviewed → in_progress → resolved → closed
- Internal notes field for admin use
- 0017_feedback.sql - Migration for feedback table
- /api/feedback - Updated to store in database instead of logging
- ContextualHelpPanel.vue - Slide-in help panel
- Page-specific help content for: Timeline, Sessions, Ta-Da!, Moments, Tally, Rhythms, Settings
- Philosophy-focused content answering "why" not just "how"
- Links to full FAQ and feedback form
- Keyboard shortcut (Escape to close)
- default.vue - Added ? icon in header
- Positioned next to settings icon
- Opens contextual help panel on click
- NewsletterSignup.vue - Email subscription form
- Used on blog page and landing page
- Success/error states with friendly messaging
- Privacy policy link
- newsletter_subscribers table - Database table for subscribers
- 0018_newsletter_subscribers.sql - Migration
- /api/newsletter/subscribe - Subscription API
- Email validation, handles resubscription
- blog/index.vue - Added newsletter signup
- LandingPage.vue - Added newsletter section and blog link
- /dpa - GDPR-compliant DPA page
- Processing scope and purpose
- Categories of data
- Security measures
- Sub-processors list
- Data breach notification
- International transfers
- auth.global.ts - Added /dpa to public paths
- privacy.vue - Added DPA link in footer
- GettingStartedCard.vue - First-week guidance card
- Appears on home page for new users
- Warm, friendly tone with quick-start links
- Links to Sessions, Ta-Da!, Moments, Rhythms
- Emphasizes "count up" philosophy
- Dismissible, respects user preference
- useOnboarding.ts - Added
shouldShowFirstWeekCardcomputed - index.vue - Added GettingStartedCard to home page
- /blog - Blog listing page
- Category filtering (Philosophy, Design)
- Clean card-based post listing
- Newsletter signup (fully functional)
- /blog/counting-up - Article on count-up philosophy
- /blog/identity-over-streaks - Article on identity-based habits
- /blog/graceful-rhythms - Article on flexible consistency
- auth.global.ts - Added /blog to public paths
Previously completed:
- HelpLink.vue - Reusable contextual help link component
- Supports search query param to pre-filter help page
- Added to: Sessions, Rhythms, Settings pages
- /help - Now supports
?q=query param for pre-filtering - SettingsHint.vue - Settings page tour
- Shows once on first visit to Settings
- Gentle banner explaining key sections
- Dismissible, respects user preference
- useOnboarding.ts - Added settingsHintDismissed state
Previously completed:
Legal & Compliance:
- /privacy - GDPR-compliant privacy policy
- /terms - Terms of service
- CookieConsent.vue - Shows only in cloud mode
Marketing:
- LandingPage.vue - Philosophy-driven landing
- index.vue - Shows landing or timeline based on auth
- SEO meta tags in nuxt.config.ts - OG, Twitter, canonical
User Support:
- /help - Searchable FAQ with 6 categories
- /feedback - Bug report with system info consent
- /api/feedback - Stores feedback in database
- /blog - Philosophy blog with 3 articles
Onboarding:
- useOnboarding.ts - State management
- WelcomeOverlay.vue - First-visit welcome
- FeatureHint.vue - Contextual hints
- FirstTimeCelebration.vue - Celebrates firsts
Infrastructure:
- /api/health - Health check endpoint
- auth.global.ts - Updated for public pages
- App version bumped to 0.4.0
See design/roadmap.md for full details.
- First week "getting started" card on home (DONE)
- Settings tour when visiting Settings page (DONE)
- Direct "Need help?" links from relevant pages (DONE)
- Contextual
?icon in header with slide-in panels (DONE)
- Screenshot/recording attachment option
- Database table for storing feedback (DONE)
- Data processing agreements page (DONE)
- Data deletion workflow in account settings (DONE)
- Blog foundation with initial content (DONE - 3 articles)
- Email newsletter signup (DONE)
- CapRover captain-definition
- Automated backup scripts
| Purpose | File |
|---|---|
| Cloud mode detection | app/server/utils/cloudMode.ts |
| Usage limits | app/server/utils/usageLimits.ts |
| Subscription state | app/composables/useSubscription.ts |
| Stripe integration | app/server/services/stripe.ts |
| Onboarding state | app/composables/useOnboarding.ts |
| Getting started card | app/components/onboarding/GettingStartedCard.vue |
| Public page list | app/middleware/auth.global.ts |
| Contextual help | app/components/ContextualHelpPanel.vue |
| Feedback storage | app/server/db/schema.ts (feedback table) |
| Newsletter signup | app/components/NewsletterSignup.vue |
| Newsletter API | app/server/api/newsletter/subscribe.post.ts |
| Data Processing Agreement | app/pages/dpa.vue |
| Blog pages | app/pages/blog/*.vue |
| Design docs | design/commercial.md, design/roadmap.md |
Ta-Da! is gentle and celebratory:
- Count up, not down — celebrate what you did
- Identity over streaks — "you're a meditator" not "don't break your streak"
- Graceful rhythms — missing a day isn't failure
- Onboarding like a friend showing you around, not a tutorial
- Help that answers "why" not just "how"
- Cloud mode: Set
TADA_CLOUD_MODE=trueor configureSTRIPE_SECRET_KEY - Self-hosted mode: Leave both unset (default)
- Health check:
curl localhost:3000/api/health - Landing page: Log out and visit
/
Quick wins: Add "Need help?" links to pages, Settings tourDONEData deletion: Add delete account button toDONE/accountpageFeedback storage: CreateDONEfeedbacktable in schema, update APIBlog: CreateDONE/blogwith 1-2 philosophy articlesContextual help panels:DONE?icon in header with slide-in help panelsFirst week card: Add "getting started" card on home for new usersDONEEmail newsletter: Add newsletter signup to blog/landingDONEData Processing Agreement: Add /dpa page for GDPR complianceDONE- Deployment: CapRover captain-definition and backup scripts (can defer to actual deployment)
Handover prepared by Claude Opus 4.5