Last year, I tried something. I tried to make an enterprise app that ran entirely client-side. For the non-technical, this means I tried to build an app that did not need any databases or servers. It was a naive attempt at enforcing decentralization standards on an audience that cares more about security and privacy than decentralization. And it's important to understand that it's OK to not be decentralized or to be partially decentralized, especially when you are providing a secure and private alternative to software solutions that thrive on surveillance capitalism.

That version of Graphite Pro was a failure. It was not performant, struggled with bugs, and couldn't support any level of adoption.

Over the last five months, I have rebuilt Graphite Pro into what it should have been originally. It is partially decentralized, and as much data is obscured away from Graphite servers and databases as possible. In fact, the only data ever stored on Graphite servers or databases are pointers. Things like:

  • File ID
  • Team ID
  • User ID

By using traditional client/server models for programming and by combining that with client-side encryption and user-controlled storage, Graphite Pro is finally ready for prime time. It's performant, secure, private, and a joy to use. Take a look at this short demo video:

What's actually happening behind the scenes, though? There will be another post that goes far more into the technical details, but here's a quick summary.

Each team receives an encryption keypair, generated on the fly and on the client-side. This means Graphite never has access to that keypair. The keypair is shared with each teammate in a peer-to-peer manner, thus preventing third-party (including Graphite) access. When a file or document is shared with a team, it is encrypted with the team's public key and decrypted with the team's private key. When a user is removed from the team, the team key is rotated, meaning a new key is generated and shared, and files are re-encrypted.

But what I like most about this is where the actual content is stored. As I mentioned previously, the Graphite database only maintains pointers. In fact, here's an example of a document shared with a team from the Graphite test account:

    "title": {
    "teamName": {
    "currentHostBucket": {

There's a lot of gibberish in there, but you can see that even the team names are encrypted. The file itself, whether it's a document, a contact, a form, or a file upload, is stored in specific user storage hubs. Whoever updated the file last has the file. Thus the currentHostBucket pointer.

This makes it so that Graphite does not have access to any of your sensitive information. Yet, you still get the same performance benefits you would if Graphite was storing everything.

There's a lot more to dive into, but we'll leave it at that for now. Graphite Pro is available now. Prices start at $99/month for organization ($49/month for 501c3 non-profits). You can sign up for a free trial right inside the app at

If you're interested and want to talk more, please contact me.