A self-hostable, decentralized blogging platform built on Lens Protocol — own your content, audience, and distribution forever.
Fountain is a batteries-included web3 publishing platform that positions itself as a decentralized alternative to Medium, Substack, and Mirror. Built on Lens Protocol, it stores all published posts on-chain and uses Grove (Lens’s decentralized storage layer) for content permanence, meaning writers truly own their work independently of any single company’s infrastructure decisions.
At its core, Fountain combines a rich, Plate.js-powered editor — capable of rendering equations, code blocks, embeds, tables, callouts, and more — with a publishing flow that interacts with the Ethereum-compatible Lens Protocol. Every article is submitted as an on-chain transaction, metadata is uploaded to decentralized storage, and the transaction hash is used to fetch the canonical post URL. This chain of custody gives writers verifiable ownership that no platform operator can revoke.
Beyond writing and publishing, Fountain integrates newsletter management via Listmonk so bloggers can grow and email their audience directly, without relying on a third-party newsletter SaaS. Real-time collaborative editing is powered by Yjs with a Hocuspocus server, allowing multiple authors to co-write articles. Monetization hooks let readers collect posts as NFTs with configurable pricing, revenue splits, and content licensing terms on-chain.
The platform is entirely self-hostable: all components — the Next.js frontend, Hocuspocus collaboration server, notification server, and Supabase database — can be deployed on your own infrastructure. While official self-hosting documentation is still in progress, the codebase is structured to make independent deployment tractable for developers comfortable with modern TypeScript web stacks.
Architecture Fountain follows a layered Next.js App Router architecture with a clear separation between server components for data fetching and client components for interactivity. The application is organized into domain-focused feature directories — auth, blog, draft, editor, post, publish, newsletter — each encapsulating its own components, hooks, and logic. The data flow follows a top-down pattern: server-rendered page components fetch Supabase records and Lens Protocol session state, then pass serialized data into client-side React trees that manage local state via Zustand stores and Jotai atoms. The collaboration layer introduces an orthogonal real-time dimension through a separate Hocuspocus WebSocket server that syncs Yjs documents independently of the Next.js request cycle. The result is a modular structure where the decentralized publishing concern (Lens + Grove) is cleanly separated from the off-chain draft management concern (Supabase + Hocuspocus), though the publish flow binds them together in a multi-step transaction sequence.
Tech Stack Fountain is a TypeScript Next.js 14 application using the App Router with Bun as the runtime and package manager. The editor is built on Plate.js (version 48), a highly extensible Slate-based framework with an extensive plugin ecosystem covering everything from code block syntax highlighting via Lowlight to LaTeX equation rendering and Yjs collaborative sync through the YjsPlugin. Real-time collaboration runs on a standalone Hocuspocus server with a custom Supabase database extension that persists Yjs binary states as hex-encoded PostgreSQL records. Web3 integration uses the official Lens Protocol TypeScript client and React SDK (canary builds) alongside Wagmi v2 and Viem for wallet connectivity, with ConnectKit handling the wallet modal UI. Off-chain data uses Supabase with auto-generated TypeScript types. Styling is Tailwind CSS v3 with shadcn/ui components built on Radix UI primitives. The error handling pattern uses neverthrow’s Result type for monadic error propagation in the Lens client layer.
Code Quality
No test files were found in the repository — the codebase has no unit, integration, or end-to-end test suite despite @udecode/plate-playwright and @udecode/plate-test-utils being listed in dependencies, suggesting test infrastructure was considered but not implemented. Biome is configured as the linter and formatter with recommended rules, though several rules are explicitly disabled including noExplicitAny, noUnusedVariables, and useExhaustiveDependencies, indicating a pragmatic rather than strict posture. TypeScript is used in strict mode throughout. Error handling in the Lens publishing flow uses the neverthrow Result pattern for typed error propagation, though React component code defaults to toast notifications for user-facing errors without structured error boundaries. Code is organized consistently with domain-based folders and descriptive file naming. Inline comments are sparse across most files.
What Makes It Unique Fountain’s most technically distinctive feature is the marriage of a fully-featured collaborative rich-text editor with an on-chain publishing pipeline that produces verifiable content ownership. Unlike typical web2 blogging platforms where removing your account erases your content, Fountain’s publish flow uploads article metadata to Grove decentralized storage and submits the content URI to Lens Protocol, creating an immutable on-chain record anchored to the author’s Ethereum address. The post collection mechanism uses Lens collect actions to let readers mint the article as an NFT with configurable pricing, revenue splits, and licensing terms — turning every published article into a programmable economic artifact. The integration of real-time collaborative Yjs editing with decentralized publishing is uncommon: most web3 publishing tools sacrifice collaboration features for decentralization, while Fountain attempts to preserve both through the Hocuspocus layer for drafts and the Lens layer for published finality.
Fountain is licensed under AGPLv3 (GNU Affero General Public License version 3), a strong copyleft license with a specific network-use clause. This means you can freely use, modify, and self-host the platform. However, if you run a modified version of Fountain as a publicly accessible service — meaning other users interact with it over a network — you are legally required to make your modified source code available to those users under the same AGPL terms. For teams running Fountain purely for internal use or as a personal blog server, this is unlikely to create friction. Teams offering a hosted Fountain service to paying customers must be prepared to open-source their modifications.
Running Fountain yourself involves several moving parts. You need a Next.js frontend deployment, a standalone Hocuspocus WebSocket server for real-time collaboration (runs on port 4444), a notification server, and a Supabase PostgreSQL database for off-chain draft and post record storage. You also need an UploadThing account for image storage and must configure Lens Protocol API keys. A Listmonk instance is required if you want the newsletter integration. Environment configuration is managed via a .env file with numerous required variables. The project’s own README acknowledges that self-hosting documentation is not yet complete, so operators should expect to invest time reading source code and environment examples to get a production deployment right.
There is no separate commercial or enterprise tier — the project is community-driven with the hosted version at fountain.ink serving as the reference deployment. Compared to hosted alternatives like Substack or Beehiiv, self-hosting Fountain trades managed infrastructure, built-in deliverability, and customer support for full data sovereignty and no revenue percentage taken. You handle your own SSL, backups, scaling, Supabase maintenance, and email deliverability reputation. The upside is genuine ownership: your content lives on decentralized storage and Lens Protocol, not in a company database that could be sunset.
Developer Tools · Blogging · CMS
The open-source, Next.js-native headless CMS that lives inside your /app folder and gives you a full TypeScript backend instantly.
Marketing · Blogging
High-performance, self-hosted newsletter and mailing list manager packaged as a single binary with built-in analytics, transactional messaging, and multi-channel delivery.
Ecommerce · Blogging · CMS
Open-source, self-hosted CMS on AWS serverless — a TypeScript framework you extend with code, not a product you configure through a UI.