Hello everyone!
It’s been a while. What started as a weekly log of building Chiffre and following the 100 Days of Tech Startup challenge ended up stalling last July.
Life gets in the way. Obviously, 2020 did make things more difficult for everyone, and in my case (I won’t bother you too long with my life, I promise) I took some time off software development in the summer to move into a new home with my wife. Silver lining: we became first-time parents in November, and it’s been quite the ride ever since. 👶🍼💩
If you’re a new subscriber (a lot of you have joined in since the last issue), 👋 hello, thanks for joining in and welcome to the only weekly newsletter that runs twice a year. At least you can’t complain about spam.
Quick recap: Chiffre is an end-to-end encrypted web analytics side-project of mine, that I’m trying to turn into a SaaS product, publishing what I learn (mostly in the form of mistakes) along the way.
The first deployment of the Chiffre.io MVP came online in February 2020. By MVP, I mean:
Ideally, MVP should mean:
So after one year of operations, Chiffre has cost me (from my own pocket):
Total: ~300€
Or “Microservices are a footgun”.
In retrospect, having a separate service for the event aggregation + a Redis queue + the main backend was overkill. There were a few “reasons” behind this choice:
navigator.sendBeacon
which is non-blocking and low-priority).It would have cost me less money to have it all as a single Node.js service, no Redis. Lesson learned: monoliths still rule, and Hype Driven Development is costly (in both time, money and induced technical debt, which translates back to time and money).
Or “How the wrong turn can bring React to its knees”
Decryption takes time. Like, a lot more time than downloading the encrypted events from the server. This is due to the fact that I use a JavaScript implementation of NaCl, maybe WebAssembly could help here, but that’s another problem.
Our story concerns where to do things. When I first implemented the download + decrypt + store layer, it all lived in the React render function. Simple: time range props change, run a useEffect
, load everything, decrypt everything, store everything.
Needless to say, when there are a lot of messages to process (long time since last login or peak of traffic), this slows down the UI thread to a halt. Yep: when JavaScript is busy running a side-effect, it does not process UI events.
In my last newsletter issue, I was working on moving the download + decrypt + store layer to a WebWorker. That worked fine, but now the bottleneck is on the analytics aggregation part (digesting raw data into leaderboards and useful stats), so it will also probably have to go to a Worker as well.
Running some back of the envelope calculations, this amounts to 0.002€ per event. I’m pretty sure a serverless approach would cost me less.
Even though I’ve been busy changing nappies while juggling with freelancing contracts, I have managed to add a few things to the MVP since the last publication:
Those were supported since day one, but had no visualisation of their own yet. Currently they only show as a history table, but I’d like to add a leaderboard view there too. I use them to track what plans are selected on the landing page:
Oh, another good lesson learned here: some people actually clicked on the paid plans. 20 people selected the small plan, and 4 selected the large plan. But since I’ve been procrastinating to implement a payment system, I’ve potentially missed out on 5 240€. Yeah, I know. 🤦♂️
Since all the clear-text data lives in the browser, in the IndexedDB database, it’s easy to export your raw analytics data points to a newline-delimited JSON file.
In the future, I might add expiration dates on the encrypted events on the server for free plans, since all the decrypted data is local it would only be a penalty if wanting to sync a new device (that would have to download a larger history of encrypted events), and the data export could help there at no cost for me.
My brief drive-by on Hacker News attracted some attention to Chiffre, and I was contacted by members of the Fission project, a decentralised community with whom I’ll be doing a live-streamed video chat to present Chiffre. I’ll post it in here once it’s out.
As for the product itself, I initially gave myself the goal to ship it (ie: open it to everyone, not just with cryptic invite codes) in Q1 2021. Which is ambitious since I’ve transitioned to a full-stack dad role since my wife’s maternity leave ended. Family comes first, always. So it will ship when it will ship.
There are some showstopper issues that need attention before I send you people some invite codes, like:
If you made it this far, sorry for all my bad jokes (hey, I just became a dad, they come with the territory). I can’t say when the next issue will be, but I’d like it to contain signup invites, or even the announcement that “screw it, it’s available for everyone. Just ship it™”.
In the mean time, take care of yourself.
François Best
Founder | Chiffre.io