Coin is a chat client for web-based chat boards designed to be used on slow and unreliable mobile networks.
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 :
The user will be tempted to use the browser refresh button. If he uses it, the whole app will reload, which will either be very slow or fail.
The custom loading indicators inside the app, which must be used, give poorer feedback than those built into the browser.
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.
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.