A simple Hugo-based blog deployed to IPFS, accessible at theref.eth.
Read about the setup in A Censorship Resistant Blog.
This uses the Archie theme as a git submodule.
# Clone with submodules
git clone --recursive https://github.com/theref/blog.git
# Or if already cloned, initialize submodules
git submodule update --init --recursive# Install Hugo (if not already installed)
brew install hugo
# Run local server
hugo server -D
# Build site
hugo --minifyThe site will be available at http://localhost:1313
Automatically deploys to IPFS on every push to main via GitHub Actions.
The workflow:
- Builds the Hugo site
- Deploys the
public/directory to IPFS using Storacha - Pins to Pinata for persistent availability
- Posts the IPFS hash as a comment on PRs
Note: ENS contenthash updates are currently manual. After a deployment, I take the new CID and update the ENS record for theref.eth.
Set these in GitHub Settings → Secrets and Variables → Actions → New repository secret:
-
Install the Storacha CLI:
npm install -g @storacha/cli
-
Create a key for CI (outputs JSON):
w3 key create --json
Copy the
keyfield value → set asSTORACHA_KEYsecret -
Login and create a space:
w3 login your-email@example.com w3 space create blog
-
Create a delegation proof (replace
DID_OF_KEYwith the DID from step 2):w3 delegation create did:key:DID_OF_KEY \ -c space/blob/add \ -c space/index/add \ -c filecoin/offer \ -c upload/add \ --base64
Copy the output → set as
STORACHA_PROOFsecret
Important: Both secrets must be base64-encoded strings, not file paths!
- Create a free account at pinata.cloud
- Go to API Keys → New Key
- Give it a name (e.g., "GitHub Actions") with Admin privileges
- Copy the JWT token → set as
PINATA_JWT_TOKENsecret