Coronate: A chess tournament app written in ReasonReact



For the past several months, I’ve been working on this as a personal project. It’s finally stable enough that I’m comfortable showing it off.


I started working on this originally because I couldn’t find any good, free, tournament managers, so I decided to make my own. At the time, I was a JS novice and decided to use this as an excuse to learn React. After a while, tried out Reason and decided that I wanted to use that instead. The app got rewritten a few times as I learned from my mistakes. As it usually goes with these kinds of projects, the amount of work involved was far beyond what I initially expected. :wink:

As far as the technology structure, it does everything in-browser with Reason & ReasonReact. Data is stored in IndexedDB (using LocalForage). It can also be built into a standalone Electron app, which I mainly made because I wanted a convenient way to make its data “portable.”

Right now, I consider it in a “proof-of-concept” stage. There are probably a lot of extra features real-world users would want, but it satisfies my needs for the time being.

A few modules that may be of interest:

Externals has almost all of the external bindings. This includes some commonly-used libraries like Reach-Tabs. It also has an (overly-complex?) binding to LocalForage which is used in conjunction with the Db module and LoadTournament module.

Electron has Electron bindings. It’s far from complete, but it covers some of the basic API that the project uses. You can see some of how it’s used in the Window module.

Data contains modules for the different data types, player, match, etc. Each one has JSON encoder functions that enable them to easily be stored with LocalForage or get passed to HTML/JS side.

I hope someone finds this useful or interesting. I’ve been meaning to do a formal blog post somewhere detailing the whole dev process, but the project was so long and complex that I haven’t gotten to it yet. If you have any questions about how or why I did something, I’m happy to talk about it.