Etherjot is a blog editor and static site generator that runs entirely in the browser and publishes to Swarm. You write in Markdown, Etherjot renders the whole site to HTML, uploads it to your Bee node, and updates a feed so the site keeps a stable address. There is no backend, no build server and no hosting account.
A running Bee node with its API reachable from the browser (http://localhost:1633 by default) and a usable postage batch on that node. Etherjot checks both on the welcome screen and refuses to create a blog until they are available. Brave users may need to disable shields for the page to reach the local node.
Creating a blog generates a random Ethereum key pair and a Swarm feed manifest owned by that key. Every publish rebuilds the site as a Mantaray collection (front page, one page per article, one page per category, assets, fonts, stylesheet, favicon) and writes the new collection hash to the feed. The feed reference does not change, so you can point an ENS name at it once and keep publishing.
Each article also gets an "immortal" version: a single HTML file with the stylesheet, banner and inline images embedded as data URIs, uploaded separately. It stays readable on its own hash even if the rest of the site is rebuilt or the feed moves on.
The editor is Markdown with front matter, either YAML between --- fences or TOML between +++ fences. Recognised keys are title, category, tags, date, banner and kind, and the sidebar edits the same fields for you.
kind controls how a post appears on the front page: h1 and h2 get the large slots at the top, highlight goes into the highlight section, and regular falls into the normal grid. Categories become their own index pages, tags become a tag cloud linking to per-tag pages.
Images are uploaded to Swarm through the asset browser and referenced by hash, so the same asset can be reused across posts and as a banner.
Comments come from swarm-comment-system-ui, loaded from a CDN and keyed per article, so comments are stored on Swarm rather than on a server you have to run. Donations render a button from swarm-donation against an Ethereum address you configure. The footer takes a description and links for Discord, Twitter, GitHub, YouTube, Reddit and LinkedIn.
Blog state (the private key, configuration, article metadata and asset references) lives in the browser's localStorage. Article Markdown and every asset live on Swarm. Two consequences worth taking seriously:
Clearing site data for the Etherjot page destroys the key and the article index, and there is no way to recover them from the network. Use Data > Export as zip regularly. The zip contains swarm.json, blog.json, every article as a Markdown file with front matter, and every asset, and it can be imported back through Data > Import from zip.
Swarm content is only stored for as long as its postage batch is paid for. If the batch you published with expires, the site goes with it. Keep it topped up.
npm install
npm start # vite dev server
npm run build # production build into dist/
npm run check # typescript, no emit
The stack is React 18, TypeScript and Vite, with @ethersphere/bee-js for Swarm and ethers for key handling. src/libswarm wraps bee-js in the few primitives Etherjot needs (raw data, collections, feeds); src/libetherjot is the site generator, split into engine for state and uploads, html for fragments and page for whole pages.