<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/github---waaldev-waldi-a-quiet-place-to-write-and-to-be-read--yfbd1iaoh" -->

---
title: GitHub - waaldev/waldi: A quiet place to write, and to...
description: Waldi is an open-source, multi-tenant blogging platform built with a single Go binary and PostgreSQL. It features server-rendered HTML templates, a Tiptap...
canonical: https://daily.dev/posts/github---waaldev-waldi-a-quiet-place-to-write-and-to-be-read--yfbd1iaoh
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: GitHub - waaldev/waldi: A quiet place to write, and to be read. | daily.dev
og:description: Waldi is an open-source, multi-tenant blogging platform built with a single Go binary and PostgreSQL. It features server-rendered HTML templates, a Tiptap...
og:url: https://daily.dev/posts/github---waaldev-waldi-a-quiet-place-to-write-and-to-be-read--yfbd1iaoh
og:image: https://api.daily.dev/og/posts/yfBD1IAOh.png
og:image:alt: GitHub - waaldev/waldi: A quiet place to write, and to be read.
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# GitHub - waaldev/waldi: A quiet place to write, and to be read.

**[Hacker News](https://daily.dev/sources/hn)** · 10 min read · 0 upvotes · 0 comments

## Summary

Waldi is an open-source, multi-tenant blogging platform built with a single Go binary and PostgreSQL. It features server-rendered HTML templates, a Tiptap editor island, per-tenant subdomains or custom domains resolved via Host header, and a deliberate anti-social-media design: no public likes, no comments, private letter replies, and a guaranteed daily wildcard reader pool so new writers never publish into silence. The architecture covers layered Go packages (web, store, post, jobs, mail, storage, i18n), Cloudflare R2 for image storage, Caddy for TLS and custom domain certs, background cron jobs for digests and wildcard selection, and a Telegram bot for admin moderation. Self-hosting is supported under MIT license with Docker Compose on a single VM.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://github.com/waaldev/waldi>

## Questions this post answers

### How does Waldi serve multiple blogs from a single Go binary without per-tenant deployments?

Waldi resolves the tenant at runtime by reading the request's Host header. A cheap subdomain match (username.<base-domain>) is tried first via BlogFromHost, and if that fails it falls back to a verified custom domain lookup against Postgres, cached in-process with positive and negative TTLs to avoid a database hit on every request.

_See how daily.dev surfaces architecture patterns like multi-tenant routing for developers designing similar systems._

### How does Waldi guarantee new blog posts get read instead of publishing into silence?

Every reader receives one daily 'wildcard' post from a stranger, selected either from an admin-curated pool via a Telegram bot or, as fallback, a deterministic SQL query prioritizing published posts under a default impression floor of 100, oldest first. A planned scoring formula (0.6x follow-rate + 0.3x completion-rate + 0.1x letter-rate, Wilson-adjusted) will eventually replace manual curation.

_Developers weighing algorithmic feeds versus guaranteed-distribution models can track designs like this on daily.dev._

### What tech stack does Waldi use for storage, caching, and TLS in production?

Waldi runs on PostgreSQL for data, Cloudflare R2 (S3-compatible) for image storage with WebP conversion on upload, Cloudflare edge caching for anonymous HTML pages, and Caddy for TLS, including wildcard certificates via Cloudflare DNS challenge and on-demand Let's Encrypt certs for custom domains. Deployment is Docker Compose on a single VM, with GitHub Actions handling lint, test, build, and SSH deploy on merge to main.

_Anyone comparing self-hosted stacks for side projects can follow similar architecture writeups on daily.dev._

## Similar posts on daily.dev

- [How Waldium made a blog platform work for humans and AI alike](https://daily.dev/posts/how-waldium-made-a-blog-platform-work-for-humans-and-ai-alike-09zkksp9j) · Vercel · 3 upvotes · 0 comments
- [GitHub - texttile-blog/texttile: The Multiplayer Blog Engine](https://daily.dev/posts/github---texttile-blog-texttile-the-multiplayer-blog-engine-o5ooxahwf) · ElixirStatus · 0 upvotes · 0 comments
- [Finally, the Rails Blog Runs on Rails](https://daily.dev/posts/finally-the-rails-blog-runs-on-rails-1rapetyso) · RUBYLAND · 0 upvotes · 0 comments
- [Show me your open-source project](https://daily.dev/posts/show-me-your-open-source-project-s7g6zphi9) · DEV · 3 upvotes · 0 comments
- [Jan-Piet Mens :: A wiki from a single Go binary: LeoMoon Wiki-Go](https://daily.dev/posts/jan-piet-mens-a-wiki-from-a-single-go-binary-leomoon-wiki-go-tcusmef3j) · Jan-Piet Mens · 1 upvotes · 0 comments

---

Tags: [#golang](https://daily.dev/tags/golang), [#postgresql](https://daily.dev/tags/postgresql), [#multi-tenancy](https://daily.dev/tags/multi-tenancy)

[View this post on daily.dev](https://daily.dev/posts/github---waaldev-waldi-a-quiet-place-to-write-and-to-be-read--yfbd1iaoh)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"GitHub - waaldev/waldi: A quiet place to write, and to be read.","url":"https://daily.dev/posts/github---waaldev-waldi-a-quiet-place-to-write-and-to-be-read--yfbd1iaoh","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/github---waaldev-waldi-a-quiet-place-to-write-and-to-be-read--yfbd1iaoh"},"datePublished":"2026-07-18T11:23:20.088Z","dateModified":"2026-09-14T06:51:26.641Z","description":"Waldi is an open-source, multi-tenant blogging platform built with a single Go binary and PostgreSQL. It features server-rendered HTML templates, a Tiptap...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/4dc572b44f11263d3a58f91d0a9a86de?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/4dc572b44f11263d3a58f91d0a9a86de?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"Hacker News","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Hacker News","logo":"https://media.daily.dev/image/upload/t_logo,f_auto/v1/logos/hn","url":"https://daily.dev/sources/hn"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/github---waaldev-waldi-a-quiet-place-to-write-and-to-be-read--yfbd1iaoh","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":0},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"golang,postgresql,multi-tenancy","timeRequired":"PT10M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Hacker News","item":"https://daily.dev/sources/hn"},{"@type":"ListItem","position":3,"name":"GitHub - waaldev/waldi: A quiet place to write, and to be read."}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/github---waaldev-waldi-a-quiet-place-to-write-and-to-be-read--yfbd1iaoh#faq","mainEntity":[{"@type":"Question","name":"How does Waldi serve multiple blogs from a single Go binary without per-tenant deployments?","acceptedAnswer":{"@type":"Answer","text":"Waldi resolves the tenant at runtime by reading the request's Host header. A cheap subdomain match (username.<base-domain>) is tried first via BlogFromHost, and if that fails it falls back to a verified custom domain lookup against Postgres, cached in-process with positive and negative TTLs to avoid a database hit on every request. See how daily.dev surfaces architecture patterns like multi-tenant routing for developers designing similar systems."}},{"@type":"Question","name":"How does Waldi guarantee new blog posts get read instead of publishing into silence?","acceptedAnswer":{"@type":"Answer","text":"Every reader receives one daily 'wildcard' post from a stranger, selected either from an admin-curated pool via a Telegram bot or, as fallback, a deterministic SQL query prioritizing published posts under a default impression floor of 100, oldest first. A planned scoring formula (0.6x follow-rate + 0.3x completion-rate + 0.1x letter-rate, Wilson-adjusted) will eventually replace manual curation. Developers weighing algorithmic feeds versus guaranteed-distribution models can track designs like this on daily.dev."}},{"@type":"Question","name":"What tech stack does Waldi use for storage, caching, and TLS in production?","acceptedAnswer":{"@type":"Answer","text":"Waldi runs on PostgreSQL for data, Cloudflare R2 (S3-compatible) for image storage with WebP conversion on upload, Cloudflare edge caching for anonymous HTML pages, and Caddy for TLS, including wildcard certificates via Cloudflare DNS challenge and on-demand Let's Encrypt certs for custom domains. Deployment is Docker Compose on a single VM, with GitHub Actions handling lint, test, build, and SSH deploy on merge to main. Anyone comparing self-hosted stacks for side projects can follow similar architecture writeups on daily.dev."}}]}
```

