← All templates

Messaging App

Communication · React + Node (Express) · 22 @molecule/* packages

WhatsApp-like 1:1 and group messaging with end-to-end encryption, read receipts, and media sharing — with built-in Stripe-backed subscription tiers

Open in Molecule

What is inside

  • auth
  • realtime
  • encryption
  • media
  • notifications
  • subscriptions

Screens (18)

  • Landing /
  • Login /login
  • Signup /signup
  • ForgotPassword /forgot-password
  • ResetPassword /reset-password
  • Inbox /inbox (signed in)
  • Conversation /conversations/:id (signed in)
  • NewConversation /conversations/new (signed in)
  • Contacts /contacts (signed in)
  • Groups /groups (signed in)
  • Settings /settings (signed in)
  • ContactDetail /contacts/:id (signed in)
  • GroupDetail /groups/:id (signed in)
  • NewGroup /groups/new (signed in)
  • Profile /profile (signed in)
  • Archive /archive (signed in)
  • Search /search (signed in)
  • Notifications /notifications (signed in)

Data model (13 tables)

  • contacts — id, user_id, contact_user_id, nickname, is_blocked, created_at, updated_at, updatedAt
  • conversation_participants — id, conversation_id, user_id, joined_at, last_read_at, is_muted, muted_until, is_archived, …
  • conversations — id, type, title, created_by, group_id, last_message_at, last_message_preview, last_sender_id, …
  • devices — id, createdAt, updatedAt, userId, name, pushPlatform, pushSubscription, hasPushSubscription
  • group_members — id, group_id, user_id, role, is_muted, joined_at, updatedAt
  • groups — id, owner_id, name, description, avatar_url, encryption_enabled, created_at, updated_at, …
  • media — id, conversation_id, sender_id, url, thumbnail_url, type, size, name, …
  • message_receipts — id, message_id, user_id, status, at, updatedAt
  • messages — id, conversation_id, sender_id, content, type, media_id, reply_to_message_id, is_edited, …
  • payments — id, createdAt, updatedAt, userId, transactionId, productId, platformKey, data, …
  • reactions — id, message_id, user_id, emoji, created_at, updatedAt
  • notifications — id, user_id, kind, payload, read_at, created_at, updatedAt
  • user_preferences — user_id, preferences, updated_at, updatedAt

API (12 handlers)

  • \_decorate api/src/handlers/_decorate.ts
  • \_seed api/src/handlers/_seed.ts
  • contacts api/src/handlers/contacts.ts
  • conversations api/src/handlers/conversations.ts
  • group-members api/src/handlers/group-members.ts
  • groups api/src/handlers/groups.ts
  • media api/src/handlers/media.ts
  • messages api/src/handlers/messages.ts
  • notifications api/src/handlers/notifications.ts
  • profile api/src/handlers/profile.ts
  • reactions api/src/handlers/reactions.ts
  • search api/src/handlers/search.ts

Subscription tiers

free / pro / team — gated by: maxContacts, maxConversations, maxMedia, maxMessages, advancedFeatures, canExport, retentionDays

Built from 22 @molecule/* packages

Browse all @molecule/* packages →

Required secrets

  • DATABASE_URL PostgreSQL connection string
  • S3_BUCKET S3 bucket for media uploads
  • ENCRYPTION_KEY AES encryption key for message encryption

The @molecule/* packages are Apache-2.0. The app you build from this template is yours to export and self-host. Licensing