- Published on
Ripple Chat
- Authors

- Name
- Austin Sternberg
Overview
Ripple Chat is a public chat room platform that brings back the social and casual feel of early internet communication. Inspired by AOL Instant Messenger, Omegle, and Nintendo's PictoChat, it combines text messaging, pixel-art drawing, and real-time voice/video chat into a single nostalgic experience.
Built as a Human-Interface & Computer Interaction (HIC) project with a team of five, we focused on creating an intuitive interface following Shneiderman's 8 Golden Rules of Interface Design.
What it does
Multi-modal communication
- Real-time text messaging across public chat rooms
- Pixel-based drawing canvas (PictoChat-inspired) with color selection
- Public voice calls with push-to-talk controls
- Video chat with camera toggle
- Instant message and drawing synchronization
User management
- Secure account system with bcrypt password hashing
- Profile customization (username, email, phone, password)
- Session-based authentication
- Account deletion with double-confirmation
Drawing canvas
- Pixel-by-pixel drawing inspired by Nintendo DS PictoChat
- Color palette selection
- Undo/redo support (Ctrl+Z / Ctrl+Y)
- Send drawings directly into chat
Tech stack
- Frontend: React.js for dynamic, responsive UI
- Backend: Node.js & Express handling WebSocket connections and API routes
- Database: MongoDB for chat logs and user accounts
- Real-time: WebSockets for instant message delivery
- Security: bcrypt for password hashing
- Media: WebRTC for voice and video streaming
Key features in depth
Authentication flow
- Login with username/password
- Registration with email, phone, username, password
- Password visibility toggle (eye icon)
- Clear error messaging for invalid credentials
- Session persistence across page navigation
Chat interface
- Multiple public rooms accessible via sidebar
- Text input with keyboard shortcuts (Tab to navigate, Enter to send)
- Drawing canvas that replaces text input on toggle
- Messages display with username and timestamp
- Clean separation between text and drawing modes
Voice & video
- Join/leave call buttons in navbar
- Microphone mute/unmute (visual indicators: green = on, red = off)
- Camera toggle with live preview
- Error handling with prompts to rejoin on connection issues
- WebRTC peer connections managed server-side
Profile management
- Update username, email, password, phone number
- Password confirmation required for changes
- Visual feedback for successful/failed updates
- Logout functionality
- Account deletion with double-confirmation
Design principles
We followed Shneiderman's 8 Golden Rules throughout:
- Consistency: Unified color scheme (dark theme), consistent button styling, persistent navbar across all pages
- Shortcuts: Keyboard navigation (Tab, Enter) for all forms and actions
- Feedback: Instant visual feedback for all actions, error messages for failed operations
- Closure: Clear task completion (message sent, profile updated, account deleted)
- Error prevention: Password toggles, confirmation dialogs, separate text/drawing modes
- Reversal: Undo/redo for drawings, easy profile changes, cancel before submission
- Locus of control: Users decide when to chat, draw, join calls, or update profiles
- Reduced memory load: All options visible on screen, clear labeling, intuitive icons
Technical challenges
Real-time synchronization: Ensuring messages and drawings appear instantly across all clients required careful WebSocket management and state synchronization.
Canvas implementation: Building a pixel-based drawing system that felt responsive while handling undo/redo stacks and color switching was more complex than expected.
Media streaming: Integrating WebRTC for voice and video required handling peer connections, ICE candidates, and graceful error recovery when connections drop.
State management: Keeping voice/video controls, chat state, and user sessions in sync across React components required careful prop drilling and context usage.
Sample code snippet
Drawing canvas color selection:
const handleColorChange = (newColor) => {
setActiveColor(newColor)
// Immediate visual feedback
ctx.strokeStyle = newColor
ctx.fillStyle = newColor
}
// Undo functionality
const handleUndo = () => {
if (historyStep > 0) {
setHistoryStep(historyStep - 1)
ctx.putImageData(history[historyStep - 1], 0, 0)
}
}
Lessons learned
UI/UX matters: Following the Golden Rules forced us to think critically about every interaction. Small details like password visibility toggles and double-confirmation dialogs significantly improved user confidence.
Real-time is hard: WebSocket error handling and reconnection logic taught us that network reliability cannot be assumed. Graceful degradation is essential.
Accessibility: Keyboard shortcuts and clear visual feedback made the app usable without constant mouse interaction—something we initially overlooked.
Team coordination: With five people, clear component ownership and consistent coding standards (ESLint, Prettier) were crucial to avoid merge conflicts.
Next steps
- Add private messaging between users
- Implement chat room creation by users
- Store drawing history in database
- Add emoji picker and GIF support
- Mobile responsive design improvements
- Screen sharing for video calls
Team
Built by Austin Sternberg, Noah Al-lahabi, Colton Staiduhar, Ian Rohrbacher, and Paige Ogden as our Spring 2025 HIC project.
Check out the full project report for detailed UI/UX analysis and design decisions.