Documentation

Community overview

The social layer — pages, posts, stories, follows, messaging, groups, badges, announcements, bookmarks.

The Community module turns any AppMint tenant into a social platform. It's the layer that lets your customers (not staff) follow each other, post content, run group chats, join interest pages, and earn badges. Everything is multi-tenant — every record carries the orgid boundary like the rest of AppEngine.

Two surfaces

Community ships two REST controllers plus one WebSocket gateway:

SurfacePathPrincipalPurpose
Customer-facing/client/community/*Customer (or public for read)Pages, posts, stories, feed, follows, bookmarks, groups, badges
Staff/admin/community/*UserConnection requests, DMs, meetings, blocks, reports
Realtimews://api/community-chatCustomer JWTLive DMs, group chat, presence, typing

The split keeps the customer API ergonomic (single token, one prefix) while admin tooling remains under the staff role gate.

Concepts

ConceptOwns
PageA community space. Has type, category, members, owner, announcements
PostA feed entry — text, media, poll, share. Belongs to a page or a user
CommentA reply tree under a post
ReactionLike, love, etc. on a post, comment, story or message
StoryEphemeral media — auto-expires after 24h
FollowOne-way subscription. Person follows person, person follows page
ConnectionTwo-way handshake. Connection requests resolve to an active connection
BlockOne person blocks another. Blocks suppress feed visibility and DMs
ReportMember-submitted moderation report against content or a user
DM threadDirect message conversation between two emails
Group chatMulti-member chat room with member roles
BookmarkSaved pointer to any target (post, page, comment) under an optional collection
AnnouncementPage-admin-authored broadcast pinned to a page
BadgeAwardable marker on a member's profile
NotificationIn-app activity record, with unread flag

What's in each page

Identity

Community uses Customer principals — the end users of your platform, not your staff. A customer signs in via POST /profile/customer/signin, which mints a JWT used both for REST and the WebSocket handshake. Email is the canonical identifier inside Community: feeds, follows, threads and group memberships are keyed off customer.data.email.

Public reads

Many endpoints are decorated @PublicRoute() so unauthenticated visitors can browse a community: list pages, get a page, read the feed, fetch trending hashtags, view stories. Anything mutating — creating a post, following someone, sending a DM — requires the customer JWT.

# Public — anyone can read the feed
curl https://appengine.appmint.io/client/community/feed \
  -H "orgid: my-org"

# Authenticated — must sign in first
curl https://appengine.appmint.io/client/community/posts \
  -H "orgid: my-org" \
  -H "Authorization: Bearer <customer-jwt>" \
  -H "Content-Type: application/json" \
  -d '{ "content": { "text": "hello" } }'

How it fits

  • DMs and group chat live here — distinct from the staff ChatModule (which powers customer-support inboxes and AI escalation).
  • Notifications are written by community services and surfaced via /client/community/notifications. Email/SMS fan-out is handled by the Sync notification queue, not by Community itself.
  • Pages and posts are first-class collections (community_page, community_post, etc.), so they can be queried via the generic /data/{collection} API and segmented by Dynamic Query.

Community is opt-in. If you're building a pure SaaS or e-commerce app, you can leave the module disabled and there's no surface to clean up.