Publish Static Websites using Storj

Publishing a Quarto blog using Storj’s CDN.
self hosting
decentralization
Author

Nishan Mann

Published

April 13, 2025

Modified

May 16, 2025

There exist many excellent free services to host your blog or website, Github Pages, Netlify, Quarto Pub to name a few. Under the hood, these services host a static site on their CDNs (Content Delivery Networks). Recently, I have been reading about decentralized cloud storage or compute providers and Storj’s CDN use-case caught by eye. Having settled on Quarto for my future publishing needs (RIP fastpages 🪦), I decided to try and publish this blog using Storj’s CDN. Below are the steps I took:

  1. Create a blog on my local machine using Quarto’s tutorial.
  2. Signup for a Storj account. I chose Manual key management.
  3. Install and configure rclone on my local machine after generating S3 compatible credentials and uplink using Uplink CLI Tutorial.
  4. Create a bucket using rclone mkdir storj:bucket-name
  5. Sync the _site folder from step 1. over to Storj using rclone sync --progress my-blog/_site storj:bucket-name/blog This will automatically create a folder called blog under storj:bucket-name.
  6. Use a DNS provider to get a domain that allows for adding CNAME and TXT DNS records. I tried free tiers of noip and Dynu but unfortuately both of them require a paid subscription for adding TXT DNS records. I did not get to try FreeDNS. Ultimately I used Cloudlare to purchase the domain nishansinghmann.science for $10/year.
  7. Followed the instructions for creating Custom Domains. If you just signed up for Storj, likely you are on a free trial and must switch to the Pro account for https to work. To generate the DNS records, I used uplink share --dns blog.nishansinghmann.science sj://bucket-name/blog --tls --not-after=none When adding the CNAME record to Cloudflare, make sure to disable Proxy. I used dig @1.1.1.1 txt-blog.nishansinghmann.science TXT and looked at the ANSWER SECTION to confirm the propagation of DNS records after they were added to Cloudflare.
  8. Confirm that the blog is live on https://blog.nishansinghmann.science/ 🎉

Sounds like a lot of work however I did learn about the internals of hosting sites, decentralized cloud storage providers and the intricacies of DNS records. As irrational as this may sound to some, the following figure makes it all worth it! It shows how one file index.html is split into multiple pieces and then distributed worldwide across Storj’s network of operators. When someone visits this blog in their web browser, all file(s) pieces are retreived, assembled and served to the client’s browser in less than the blink of an eye 🤯

The current distribution of this blog’s entrypoint index.html file across the Storj network. Each blue dot represents a piece of the file.