Project Broadsheet
This site is built on Project Broadsheet, a free, open-source publication system designed for independent journalists and editorial teams who want full control over their platform without subscription fees, algorithmic gatekeepers, or third-party CMS lock-in. The source code is available on GitHub under the MIT license.
Our approach
Every page on this site is pre-built before you visit it. There is no server generating pages on the fly, no database to query, and no loading spinner while content renders in your browser. When you click a link, you get a finished page immediately. This makes the site fast, reliable, and cheap to run, which means we do not need advertising revenue to keep it online.
Pages and content
Articles are written as plain text files with simple formatting. A tool called Eleventy takes those files and turns them into the web pages you see. The entire site, all 500+ pages, builds in roughly ten seconds. We publish by pushing a button, and the new version is live within a minute.
Design
The look and feel is built with standard web styles, no design framework or theme. Every colour, font size, and spacing value is defined once and reused everywhere, so the site looks consistent whether you are reading an article, browsing the library, or filling out a form. Typefaces are served by Bunny Fonts, a privacy-friendly alternative to Google Fonts that does not track visitors. Web fonts are loaded on demand, only when a reader selects them in the display settings panel.
Interactive features
All interactive features, search, voice search, annotations, the events calendar, reading settings, and form dictation, are written in plain browser code with no external framework. They load only when needed and work offline once cached. Total size across all features: about 200 KB, smaller than most single images.
Search
Search is powered by Pagefind, which builds a search index alongside the site. When you search, your query is matched against a small index file already on the page, no request is sent to a search engine or third-party service.
Hosting
The site is hosted on Cloudflare Pages, which serves pages from data centres around the world. This means the site loads fast regardless of where you are. Cloudflare also provides protection against attacks and automatically encrypts all connections.
Forms
Contact forms, submissions, tips, and feedback are handled by Web3Forms. When you submit a form, your message is delivered to our email inbox. Nothing is stored in a database. Spam is filtered by hCaptcha, a privacy-respecting alternative to Google's reCAPTCHA.
Newsletter
The newsletter is managed by Buttondown. We have disabled open tracking and click tracking, we do not know whether you opened a particular email or clicked a particular link. You can unsubscribe at any time from any email.
Analytics
We use Umami, a privacy-first analytics tool. It tells us how many people visit the site and which pages are popular, but it does not use cookies, does not collect personal information, and cannot identify individual visitors. Our analytics dashboard is public, you can see exactly what we see.
Comments
Cusdis provides the comment system. You do not need an account to leave a comment. Comments are moderated before they appear.
Translation
GTranslate provides machine translation into nine languages via a small widget. Translation is performed by Google Translate.
Voice features
The read-aloud, voice search, and dictation features all use your browser's built-in speech capabilities. No audio is recorded or sent to us. Depending on your browser, speech processing may happen on your device or through your browser maker's servers (Apple, Google, or Microsoft).
Navigation speed
Links are prefetched on hover using instant.page (~3 KB, self-hosted). For most pages, navigation is handled SPA-style, when you click a link, only the main content area is swapped without a full page reload. This makes transitions feel nearly instant and allows background features like the music player to continue uninterrupted.
Glossary tooltips
When you hover over a glossary term in an article or library page, a tooltip shows the definition. This is powered by Tippy.js and Popper.js, both self-hosted (~45 KB combined). No requests are made to external servers, and no data is collected.
Music player
The Freethought Music player uses the YouTube IFrame API to play curated playlists in the background. The API script is loaded from Google's servers. Playback state is saved in localStorage so music can resume across page navigation.
Offline support
The site can work without an internet connection. Once you have visited a page, it is cached in your browser and available offline. On mobile, you can install the site as an app from your browser's menu.
Content management
Editors use Decap CMS, a browser-based tool that reads and writes directly to the site's source files. There is no separate database or content management server.
Public API
Every piece of content on this site is also available as JSON through our public API. Articles, quotes, glossary terms, events, timeline entries, and more are exposed as static JSON files on a global CDN. No authentication, no rate limits, CORS enabled. See the API index for all endpoints.
Scheduled publishing
Articles can be scheduled to publish at a future date by setting the date field in the front matter. A GitHub Action runs daily and triggers a Cloudflare Pages rebuild, making scheduled content visible as soon as its publish date arrives.
Source code
The full source code is available as Project Broadsheet, free to use under the MIT license. Anyone can fork it and launch their own publication. See open source for details.