16 KiB
dumpsterChat: Guilded Feature Parity Roadmap
Goal: Reach feature parity with Guilded (minus apps/PWA handled by existing PWA, monetization, screen share, PTT, streaming, friend requests, activity/game status).
Base: The app already has text chat, reactions, replies, mentions, voice channels, servers, channels, roles, permissions, invites, webhooks, bots, push notifications, and a terminal-aesthetic UI.
Phase 1 — Core Chat Polish (2–3 weeks)
Must-have features that every Guilded user expects. Low risk, high impact.
1.1 Direct Messages
- Backend: New
conversationstable (id, type: DM/group_dm, created_at),conversation_membersjoin table. Newconversation_messagestable or reuse existingmessageswith a nullablechannel_idand a requiredconversation_id. - Route:
POST /conversations(create DM),GET /conversations,POST /conversations/{id}/messages,GET /conversations/{id}/messages. - WS events:
MESSAGE_CREATEalready works; just scope to conversation members. - Frontend: New
ConversationsListcomponent in a sidebar panel (switch between servers view and DMs view). NewDMChatAreaor reuseChatAreawith a conversation context. - Estimated: 4–6 files backend, 3–4 files frontend.
1.2 Full Markdown Rendering
- Frontend: Install
react-markdown+remark-gfm(tables, strikethrough, task lists, autolinks). Replace the plain text renderer inChatAreawith<ReactMarkdown>. - Backend: No changes (store raw markdown).
- Estimated: 1 file frontend.
1.3 Rich Embeds / Link Unfurling
- Backend: On message create, scan for URLs. For each URL, fetch
<title>,<description>,<og:image>viaog:meta tags. Store inembedstable (message_id FK, url, title, description, image_url, color). - Rate limit: Max 5 embeds per message, async fetch with 2s timeout, cache for 24h.
- Frontend: Render embeds as cards below the message (dark card with image, title, description).
- Estimated: 2 files backend, 1 file frontend.
1.4 Message Search
- Backend: Add PostgreSQL full-text search.
ALTER TABLE messages ADD COLUMN search_vector tsvector. Create a GIN index. Add trigger to populate on insert/update. - Route:
GET /channels/{channelID}/messages/search?q=...&author_id=...&before=...&after=...&limit=25. - Frontend: Search bar in channel header or a dedicated search panel. Highlight matching terms in results.
- Estimated: 2 files backend, 2 files frontend.
1.5 Ban / Kick / Mute UI
- Backend: Already have
KICK_MEMBERSandBAN_MEMBERSpermissions. Add:DELETE /servers/{serverID}/members/{userID}(kick)POST /servers/{serverID}/bans(ban, with optional reason and delete_message_days)DELETE /servers/{serverID}/bans/{userID}(unban)GET /servers/{serverID}/bans(list bans)banstable (server_id, user_id, reason, banned_by, created_at)- Mute:
server_mutestable (server_id, user_id, muted_by, expires_at, reason). New permissionMUTE_MEMBERS. Muted users cannot send messages or speak in voice.
- Frontend: Context menu on member list items (right-click or three-dot menu) with Kick/Ban/Mute options. Confirmation modals for each action.
- Estimated: 3 files backend, 2 files frontend.
1.6 Slowmode
- Backend: Add
slowmode_secondscolumn tochannels. New permissionMANAGE_SLOWMODE. In message Create handler, check if user's last message in this channel was withinslowmode_seconds; if so, return 429 with retry-after. - Frontend: Show cooldown timer on the message input when slowmode is active. Channel settings to configure slowmode (0/5/10/30/60/120/300 seconds).
- Estimated: 2 files backend, 2 files frontend.
Phase 2 — Moderation & Permissions (2–3 weeks)
Unlocks serious server organization. Guilded's strength was granular permissions.
2.1 Per-Channel Permission Overrides
- Backend: New
channel_overridestable (channel_id, target_type: role/user, target_id, allow_bitflags, deny_bitflags). Extend permission checker to layer channel overrides on top of role permissions. - Route:
PUT /channels/{channelID}/permissions/{targetType}/{targetID},GET /channels/{channelID}/permissions,DELETE /channels/{channelID}/permissions/{targetType}/{targetID}. - Frontend: Channel settings modal with a permissions tab. Matrix UI showing each permission with allow/deny/inherit toggles.
- Estimated: 3 files backend, 2 files frontend.
2.2 Expanded Permission Flags
- Add:
CREATE_INSTANT_INVITE,CHANGE_NICKNAME,MANAGE_NICKNAMES,MANAGE_ROLES,MANAGE_WEBHOOKS,EMBED_LINKS,ATTACH_FILES,ADD_REACTIONS,USE_EXTERNAL_EMOJIS,MENTION_EVERYONE,MUTE_MEMBERS,DEAFEN_MEMBERS,MOVE_MEMBERS. - Update permission checker to gate the corresponding handlers.
- Estimated: 2 files backend.
2.3 Role Colors & Hierarchy
- Backend: Add
color(hex string) andposition(integer) columns toroles. Permission resolution uses highest-position role's color. - Frontend: Role editor with color picker. Member names shown in their highest role color in chat and member list.
- Estimated: 2 files backend, 2 files frontend.
2.4 Audit Log
- Backend: New
audit_logtable (server_id, user_id, action_type, target_type, target_id, reason, changes JSONB, created_at). Instrument all moderation actions (kick, ban, mute, role changes, channel CRUD, server settings changes) to write audit entries. - Route:
GET /servers/{serverID}/audit-log?limit=50&before=...&action_type=.... - Frontend: Audit log panel in server settings. Shows who did what, when, with details. Filter by action type.
- Estimated: 3 files backend, 2 files frontend.
2.5 Bulk Message Delete
- Backend:
POST /channels/{channelID}/messages/bulk-deletewith{ "messages": ["id1", "id2", ...] }. Max 100 messages, must be within 14 days. RequiresMANAGE_MESSAGES. - Frontend: Select multiple messages (shift-click or checkbox mode), then bulk delete option.
- Estimated: 1 file backend, 1 file frontend.
Phase 3 — Threads & Forums (2–3 weeks)
Guilded's thread and forum system kept busy servers organized.
3.1 Threads
- Backend: Add
threadchannel type. Newthreadstable (id, parent_channel_id, creator_id, name, archived_at, auto_archive_duration, message_count, last_message_at). Threads live under a parent channel. Messages in a thread are scoped to that thread. - Route:
POST /channels/{channelID}/threads(create thread from message or standalone),PATCH /threads/{threadID}(archive/unarchive),GET /channels/{channelID}/threads(list active threads). - WS events:
THREAD_CREATE,THREAD_UPDATE,THREAD_DELETE. - Frontend: Thread panel that slides in from the right when clicking a thread. Thread starter message shown at top. Thread list in channel header area.
- Estimated: 3 files backend, 3 files frontend.
3.2 Forum Channels
- Backend: Add
forumchannel type. Forums display threads as a list of posts (title, tags, reply count, last activity). Newforum_tagstable (channel_id, name, emoji, color). Thread tags are assigned on creation. - Route: CRUD for forum tags. Forum listing uses the threads endpoint with sorting (latest activity, most replies, creation date).
- Frontend: Forum channel renders as a post list (card layout) instead of a message stream. Each post card shows title, tags, reply count, last reply time, author avatar. Clicking opens the thread view.
- Estimated: 2 files backend, 3 files frontend.
Phase 4 — User System Enhancements (1–2 weeks)
Rich profiles and social features that make Guilded feel polished.
4.1 Rich User Profiles
- Backend: Extend
userstable withbanner_url,tagline(max 128),social_links(JSONB array of {platform, url}),pronouns(max 40). Custom avatar upload (stored in MinIO, replace Gravatar dependency). - Route:
GET /users/{userID}/profile(public profile),PATCH /auth/me(update profile fields). - Frontend: Clickable usernames open a profile modal/banner card. Shows avatar, display name, tagline, bio, social links, pronouns, badges, status, and shared servers.
- Estimated: 2 files backend, 2 files frontend.
4.2 Badges
- Backend: New
badgestable (id, name, icon, description). Newuser_badgesjoin table (user_id, badge_id, granted_at, granted_by). Seed system badges (Server Booster, Early Adopter, Bot Developer, Verified, etc.). - Route:
GET /users/{userID}/badges,POST /servers/{serverID}/badges(create custom badge),PUT /users/{userID}/badges/{badgeID}(grant). - Frontend: Badge display next to username in profiles and chat. Small icon grid.
- Estimated: 2 files backend, 1 file frontend.
4.3 Block List
- Backend: New
blockstable (blocker_id, blocked_id, created_at). Blocked users: messages hidden, DMs blocked, presence hidden. - Route:
POST /users/me/blocks,DELETE /users/me/blocks/{userID},GET /users/me/blocks. - Frontend: Block option in user context menu. Blocked users section in settings.
- Estimated: 2 files backend, 1 file frontend.
Phase 5 — Guilded Signature Features (3–4 weeks)
The features that set Guilded apart: calendar, docs, lists, scheduling.
5.1 Calendar Channels
- Backend: New
calendarchannel type. Neweventstable (channel_id, creator_id, title, description, start_time, end_time, recurrence_rule, location, color). Newevent_rsvpstable (event_id, user_id, status: going/maybe/no, responded_at). - Route: CRUD for events.
POST /events/{eventID}/rsvp(RSVP).GET /channels/{channelID}/events?from=...&to=.... - WS events:
EVENT_CREATE,EVENT_UPDATE,EVENT_DELETE,EVENT_RSVP. - Frontend: Calendar channel renders as a monthly/weekly/daily calendar view. Event cards show title, time, RSVP counts. Event detail modal with description, attendees, RSVP buttons. Auto-created voice channel for event start time (optional).
- Estimated: 3 files backend, 3 files frontend.
5.2 Docs Channels
- Backend: New
docchannel type. Newdocumentstable (channel_id, creator_id, title, content TEXT, updated_at, locked_by). Docs are collaborative documents within a channel. - Route: CRUD for documents. Lock/unlock for editing.
- Frontend: Docs channel renders as a wiki-style page list. Doc editor with markdown support. Version history (store diffs or snapshots).
- Estimated: 3 files backend, 2 files frontend.
5.3 Lists Channels (Task Management)
- Backend: New
listchannel type. Newlist_itemstable (channel_id, creator_id, title, description, assignee_id, due_date, status: todo/in_progress/done, position, completed_at). Supports nested items (parent_id). - Route: CRUD for list items. Bulk status update. Filter by assignee/status.
- Frontend: Lists channel renders as a kanban board or checklist view. Drag-and-drop reordering. Assignee avatars, due date badges, status filters.
- Estimated: 3 files backend, 3 files frontend.
5.4 Scheduling / Availability
- Backend: New
availabilitytable (user_id, server_id, day_of_week, start_time, end_time). Users set their weekly availability. - Route:
PUT /users/me/availability,GET /servers/{serverID}/availability(aggregated view). - Frontend: Availability grid in server settings or user profile. Shows when each member is generally available. Useful for scheduling events.
- Estimated: 2 files backend, 2 files frontend.
Phase 6 — Voice Enhancements (1–2 weeks)
Fill in the voice feature gaps (minus the excluded items).
6.1 Video Calls
- LiveKit already supports video. This is primarily a frontend feature.
- Frontend: Camera toggle button in VoicePanel. Video grid showing camera feeds of participants. Small overlay for self-view. LiveKit's
Room.createScreenTrack()and camera track APIs. - Estimated: 0 files backend, 2 files frontend.
6.2 Noise Suppression
- Frontend: Enable LiveKit's built-in noise suppression (RNNoise) via
room.options.audioCaptureDefaults.echoCancellationand noise suppression settings. Alternatively, integrate DeepFilterNet3 WASM. - Estimated: 0 files backend, 1 file frontend.
6.3 Voice Whisper
- Backend: Extend voice WS events to support targeted messages.
VOICE_WHISPERevent with target user IDs (not broadcast to whole room). - Frontend: Whisper button in VoicePanel, select one or more users to whisper to. Audio routed only to selected users via LiveKit's track subscription API.
- Estimated: 1 file backend, 1 file frontend.
Phase 7 — Notifications & UX Polish (1–2 weeks)
Make the app feel complete and polished.
7.1 Per-Channel Notification Settings
- Backend: New
notification_settingstable (user_id, channel_id, level: all/mentions/none). Extend push dispatch to respect per-channel settings. - Route:
PUT /channels/{channelID}/notifications,GET /users/me/notifications. - Frontend: Bell icon on channels with dropdown (All Messages, Mentions Only, Nothing). Notification settings in user preferences.
- Estimated: 2 files backend, 1 file frontend.
7.2 Email Notifications
- Backend: Queue-based email dispatch (using existing SMTP2GO relay config).
email_queuetable. Digest mode: aggregate unread messages and send hourly/daily digest. - Route:
PUT /users/me/email-settings(frequency: instant/hourly/daily/off). - Frontend: Email notification preferences in settings.
- Estimated: 2 files backend, 1 file frontend.
7.3 Custom Emoji
- Backend: New
custom_emojitable (server_id, name, image_url, uploaded_by). Emoji stored in MinIO. Max 50 per server. - Route: CRUD for custom emoji.
GET /servers/{serverID}/emoji. - Frontend: Emoji picker extended with server emoji section. Custom emoji rendered inline in messages (
:emoji_name:syntax). - Estimated: 2 files backend, 2 files frontend.
7.4 Read Receipts
- Backend: New
read_statestable (user_id, channel_id, last_message_id, last_read_at). Updated on message fetch or when user views a channel. - Route:
POST /channels/{channelID}/read(mark as read).GET /users/me/read-states. - Frontend: Unread dot/counter on channels. "New messages" divider in chat. Optional per-message read indicators (small avatar circles).
- Estimated: 2 files backend, 1 file frontend.
Phase 8 — Server Groups & No-Code Bots (2 weeks)
Guilded's organizational and automation features.
8.1 Server Groups (Sub-Servers)
- Backend: New
server_groupstable (server_id, name, icon, position). Channels can optionally belong to a group. Groups act as collapsible sections with their own header. - Route: CRUD for server groups. Channel CRUD updated to accept optional
group_id. - Frontend: Server sidebar shows groups as collapsible sections containing channels. Drag channels between groups.
- Estimated: 2 files backend, 2 files frontend.
8.2 No-Code Bot Builder (Flow Bots)
- Backend: New
automationstable (server_id, trigger_type, trigger_config JSONB, actions JSONB, enabled, created_by). Trigger types: message_contains, user_join, reaction_added, scheduled. Actions: send_message, add_role, remove_role, send_webhook. - Route: CRUD for automations.
POST /automations/{id}/test(dry run). - Frontend: Visual automation builder with trigger selector and action list. Simple if-then logic. Test button to verify.
- Estimated: 3 files backend, 3 files frontend.
Summary: Dependency Order & Total Effort
| Phase | Focus | Weeks | Depends On |
|---|---|---|---|
| 1 | Core Chat Polish | 2–3 | — |
| 2 | Moderation & Permissions | 2–3 | Phase 1 (for mute context menu) |
| 3 | Threads & Forums | 2–3 | Phase 1 (markdown, embeds) |
| 4 | User System | 1–2 | — |
| 5 | Guilded Signature Features | 3–4 | Phase 1 (markdown for docs) |
| 6 | Voice Enhancements | 1–2 | — |
| 7 | Notifications & Polish | 1–2 | Phase 1 (search, threads) |
| 8 | Server Groups & Automation | 2 | Phase 2 (permissions) |
Total estimated effort: 14–21 weeks (one developer, full-time).
Parallelizable: Phases 1, 4, and 6 can run in parallel. Phases 2 and 3 can run in parallel after Phase 1. Phase 5 can start after Phase 1. Phase 7 and 8 can start after Phase 2.
Critical path: Phase 1 → Phase 3 (threads need markdown) → Phase 5 (docs need threads/markdown).
Phases 1 + 4 + 6 in parallel would cover ~60% of the gap and take 3–4 weeks.