A web-based audio-only chat application where conversations are permanently deleted the moment the last person leaves the room.
To-do: Create a short screen recording of two browser windows interacting and convert it to a GIF to showcase the real-time audio chat functionality.
Echoless solves the problem of "digital residue" from casual online conversations. It provides a platform for creating temporary, audio-only chat rooms that are ephemeral by design. By leveraging WebRTC for direct peer-to-peer audio streams and a Redis-backed presence system, the application ensures that once a conversation is over, it's gone for good.
The system uses a decoupled frontend and backend to optimize for scalability and maintainability.
- Frontend (Next.js on Vercel): A server-rendered React application responsible for the UI and all client-side logic. It handles the initial HTTP request to create a room.
- Signaling Server (Node.js/Express on Fly.io): A stateful WebSocket server that manages user presence, signaling for WebRTC handshakes, and chat message broadcasting. It is the authority for the "self-destruct" mechanism.
- Database (Redis): An in-memory data store used for its speed in managing the real-time state of active rooms and participant lists. No conversation data is ever stored here.
- WebRTC: Enables direct peer-to-peer, low-latency audio streaming between clients, minimizing server load and enhancing privacy.
- Framework: Next.js / React
- Language: TypeScript
- Real-time: Socket.IO Client, Simple-Peer (for WebRTC)
- Styling: Tailwind CSS
- Framework: Node.js / Express
- Language: JavaScript
- Real-time: Socket.IO
- Database: Redis
- 🎙️ Crystal Clear Audio: High-quality peer-to-peer voice streaming
- 🔒 Zero Persistence: Conversations are permanently deleted when rooms empty
- ⚡ Instant Connection: No sign-up required, join with just a nickname
- 💬 Integrated Chat: Real-time text messaging alongside voice
- 📱 Cross-Platform: Works on desktop and mobile browsers
- 🌐 Global Reach: STUN/TURN server support for worldwide connectivity
The repository is structured as a monorepo with two primary packages:
/
├── src/ # Next.js frontend application
│ ├── app/
│ │ ├── page.tsx # Landing page with room creation
│ │ └── room/ # Room interface and WebRTC logic
│ └── ...
├── backend/ # Node.js/Express signaling server
│ ├── index.js # Main server with Socket.IO handlers
│ └── package.json
├── public/ # Static assets
└── README.md
To run this project locally, you will need Node.js, npm, and a running Redis instance.
git clone https://github.com/your-username/echoless.git
cd echolesscd backend
npm installcd ../
npm installFrontend (.env.local):
NEXT_PUBLIC_WEBSOCKET_URL=http://localhost:8080Backend (.env):
# Frontend URL for CORS
FRONTEND_URL=http://localhost:3000
# Redis Configuration
REDIS_URL=redis://localhost:6379
# Optional: Twilio for TURN servers (improves connectivity)
TWILIO_ACCOUNT_SID=your_twilio_account_sid_here
TWILIO_AUTH_TOKEN=your_twilio_auth_token_hereMake sure you have Redis running locally:
redis-serverStart the backend server:
cd backend
npm startStart the frontend development server:
cd ../
npm run devThe application will be available at http://localhost:3000.
- Room Creation: Users create ephemeral rooms with a unique ID
- WebRTC Signaling: The backend facilitates peer-to-peer connection establishment
- Audio Streaming: Direct P2P audio streams between participants using WebRTC
- Presence Management: Redis tracks active participants in real-time
- Self-Destruction: Rooms are automatically deleted when the last participant leaves
- Peer-to-Peer Audio: Uses
simple-peerlibrary for WebRTC abstraction - STUN/TURN Servers: Configurable ICE servers for NAT traversal
- Signaling: Custom Socket.IO events for offer/answer exchange
- Audio Processing: Includes echo cancellation, noise suppression, and auto gain control
This is a portfolio project, but suggestions and feedback are welcome! Feel free to open issues or submit pull requests.
This project is open source and available under the MIT License.