OCS Communication Systems
Students are extending the OCS communication system with chat, announcements, assignment discussions, direct messaging, calendar integration, and reusable presentation components. The work includes maintaining the real-time WebSocket service and connecting these features to the existing course site, backend APIs, security, and data model. Students will also develop the OCS SASS grammarβa small, purpose-built styling system for consistent, responsive, reusable components across the OCS GitHub Pages ecosystem.
OCS Communication Systems
Students are extending the OCS communication system with chat, announcements, assignment discussions, direct messaging, calendar integration, and reusable presentation components. The work includes maintaining the real-time WebSocket service and connecting these features to the existing course site, backend APIs, security, and data model. Students will also develop the OCS SASS grammarβa small, purpose-built styling system for consistent, responsive, reusable components across the OCS GitHub Pages ecosystem.
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 get their own private backend domain instead of being squeezed into a two-person group. The conversation is stored in JPA so only the matched participants can read it, and sender identity comes from the authenticated STOMP principal rather than a client-supplied name.
Direct Messages
1:1 conversations with a real security boundary
About
Direct messages get their own secure backend domain instead of being squeezed into a shared group chat. Private conversations stay isolated by design: only the two participants can read them, sender identity comes from the authenticated user, and the conversation is stored in the database rather than in the class-wide JSONL feed.
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