Skip to content
A minimal Matrix chat client, focused on performance, offline functionality and working on my aging phone.
JavaScript HTML CSS
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.
doc update todo list Sep 15, 2019
prototypes prototypes for lumia idb changes (removing array keys, etc ...) Jun 26, 2019
scripts enable service worker again Oct 12, 2019
src preserve value for storage errors on add and put Oct 12, 2019
.editorconfig wip Feb 17, 2019
.eslintrc.js its syncing, sort off Feb 10, 2019
.gitignore basic build script with js and css bundling Sep 15, 2019 newline Sep 8, 2019
index.html add offline availability with service worker and appcache Sep 15, 2019
package.json increment version to 0.0.3 Oct 12, 2019


A minimal Matrix chat client, focused on performance, offline functionality and working on my Lumia 950 Windows Phone.


Brawl can currently log you in, or pick an existing session, sync already joined rooms, fill gaps in the timeline, and send text messages. Everything is stored locally.

Showing multiple sessions, and sending messages


I started writing Brawl both to have a functional matrix client on my aging phone, and to play around with some ideas I had how to use indexeddb optimally in a matrix client.

For every interaction or network response (syncing, filling a gap), Brawl starts a transaction in indexedb, and only commits it once everything went well. This helps to keep your storage always in a consistent state. As little data is kept in memory as well, and while scrolling in the above GIF, everything is loaded straight from the storage.

If you find this interesting, feel free to reach me at

How to use

I haven't made a deployment script yet for this, so for now you need to locally yarn start or npm start and point your browser to http://localhost:3000.

You can’t perform that action at this time.