Communication System Capstone
A capstone moving class discussion out of Slack and onto the course site — class-wide announcements, per-week chat, and a rich-text composer with emoji already shipped, with per-assignment threads, 1:1 direct messages, GIFs, Slack-style emoji reactions, and teacher moderation still to build.
Communication System
Class discussion is moving out of Slack and into the course site, next to the work it is about. Class-wide announcements, per-week chat, and a rich-text composer with emoji already ship; still to build are a thread on every assignment, 1:1 direct messages, GIFs in the composer, and Slack-style emoji reactions.
Main announcements page: one class-wide thread per course, pinned above the course timeline. Captured signed out, so it runs in local preview with sample messages. Skeleton UI, not the final version — layout, styling, and copy will all change as the feature gets polished.
Class Announcements
One class-wide thread per course, pinned above the course timeline
About
One announcement thread per course, keyed on a group name like csa-announcements and pinned above the course timeline. It reuses the group chat that already ships in Open-Coding-Society/spring, so nothing new had to be built on the backend to get it live. The group is created on first use, which means adding a course never means seeding a database row by hand.
Impact
Sub-task chat system/UI: every week card carries its own thread, collapsed by default and scoped to that week. Skeleton UI, not the final version — layout, styling, and copy will all change as the feature gets polished.
Per-Week Chat
Every week card carries its own thread, collapsed by default
About
Every week card on the course timeline carries its own collapsible chat, scoped to that week alone. It is included from sprint-week-card.html, which already has the week number and sprint key in scope, so a new week gets a thread for free. While the backend waits on deployment, messages are kept in localStorage in the viewer's own browser.
Impact
Assignment Threads
A thread on every assignment, not just every week
About
Week-level threads are still too coarse: every assignment inside Week 0 currently shares a single conversation. Re-keying the thread on the assignment's own slug gives each piece of work its own discussion, surfaced both on the task row in the week card and on the assignment page itself, with an unread count so nobody has to go hunting for where people are talking.
Impact
GIFs and Slack-Parity Messaging
GIFs in the composer, and the Slack habits people still leave the site for
About
Rich text and emoji insertion landed in PR #36, which covers the writing half of Slack parity. What is left is the part people reach back to Slack for: dropping a GIF into a message, and reacting to somebody else's message instead of replying to it. GIFs can ride the image field the chat payload already carries and render through the same allow-listed sanitiser as everything else, which keeps the message model and the security story unchanged. Reactions are the piece that genuinely needs backend work, since a count of who reacted with what is per-message state rather than another field on the message.
Impact
Direct Messages
1:1 conversations with a real security boundary
About
Direct messages get their own backend domain rather than being squeezed into two-person Groups. Group chat ships with membership checks commented out — the right call for a class feed where everyone reads everything, and the wrong one for a private conversation. DMs are stored in the database through JPA rather than the S3 JSONL files group chat uses, so "only these two people" is enforced in the query, and sender identity comes off the STOMP Principal instead of whatever the client claims.
Impact
Teacher Moderation
Delete already works on the backend and nothing calls it
About
The moderation endpoint is already implemented on the Spring side — it is the frontend that has no way to reach it. Until a teacher can delete a message from the page, the announcement chat cannot responsibly take over from Slack as the class-wide channel.
Impact
Team
Who owns what, straight off the UGRC-CSA sprint board
Why Not Stay on Slack
The case for moving discussion onto the course site
What Has to Land First
Straight off the UGRC-CSA sprint board
Following Along
Where this work is tracked