Nicolas Even


Coin is a chat client for web-based chat boards designed to be used on slow and unreliable mobile networks.


Coin is written in JavaScript using Node.js and the Express framework. Messages are stored in-memory on the server and all user settings are stored as cookies. Light touches of vanilla JavaScript enhance the frontend, but all the major features (logging in, posting…) work when javascript is disabled or the script fails to load.

Screen Captures

Chat Page
Highlighting replies
Auto-resizing input field

Main Design Decisions

Traditional GET/POST Architecture

Most other chat apps are single page apps or use ajax requests for refreshing and posting. While this allows better interactivity and a smoother user experience, this falls apart when the network connectivity is very poor.

The two main issues are :

This leads to a poor user experience on slow and unreliable networks.

To avoid theses issues, we have chosen a traditional architecture where each HTML page is rendered by the server and then sent in full. Even if the page is partially loaded and the js and css files fail to load, the user is able to read the messages and reply to them.

No Automatic Refresh

We have chosen not to use websockets or any other auto-refreshing techniques. These work poorly on mobile, especially if the app is in the background or the network connectivity is poor, and is problematic if the user's connection is metered.

Old-fashioned visual design and modern UX design

The visual design of Coin is old-fashioned on purpose : to be similar to the other tribune-protocol based chat boards so the users have a familiar experience.

However, this old-fashioned design hides modern features : Coin is mobile-first and responsive, and has many subtle enhancements such as the auto-resizing message field and many tappable elements.

Node.js Backend

The most time-consuming task of Coin is to forward the requests to the target chat boards and wait for the responses. Therefore the async nature of node.js was a natural fit.

By using aggressive caching and compression, the payload size is reduced to one approximately 10kB file, which amounts to a 2-second load time on a GPRS connection.