A minimal, text-focused blogging platform. Just write, save, and share.
Noet is a simple blogging system that gets out of your way. It’s basically a text editor that saves to a database and serves your posts as a website. No themes to configure, no plugins to manage, no complex admin panels. You write in a clean editor, your posts auto-save, and they show up on your site.
The editor supports the basics you’d expect—headings, lists, links, code blocks, math equations (via LaTeX), and images with markdown support. Posts can be public or private. The first heading in your post becomes the title. That’s about it.
Sometimes you just want to write and publish without thinking about WordPress, static site generators, or managing a complex CMS. Noet is for those times. It’s a single binary you can run on a server, a Raspberry Pi, or locally on your laptop.
- Rich text editor with syntax highlighting for code, math equations (KaTeX), and inline images. Supports markdown syntax
- Auto-save while you type
- Public/private posts (toggle with a click)
- @mentions to link between posts
- Image uploads with size adjustment and captions
- Clean, readable design that doesn’t get in the way
- Single binary deployment (Go backend + embedded frontend)
- SQLite database (one file, easy backups)
I use this for my personal blog. You can visit https://kindled.dev to checkout how the end blog looks. You can't test editting but can see how the blog is rendered.
- Backend: Go (single binary, SQLite)
- Frontend: React, Vite, TypeScript
- Editor: Tiptap (extensible rich text)
- Styling: Custom CSS, no frameworks
Quick start with Docker Compose:
services:
noet:
image: ghcr.io/rishikanthc/noet:latest
restart: unless-stopped
ports:
- "8081:8081"
volumes:
- ./data:/data
environment:
- NOET_DB_PATH=/data/noet.db
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8081/api/settings"]
interval: 30s
timeout: 5s
retries: 3
start_period: 10sThen run:
docker-compose up -dVisit http://localhost:8081 to get started. Your data will be saved in the ./data directory.
Behind a reverse proxy (Caddy):
If you’re running Noet behind Caddy with automatic HTTPS:
services:
noet:
image: ghcr.io/rishikanthc/noet:latest
restart: unless-stopped
networks:
- caddy_net
volumes:
- ./data:/data
environment:
- NOET_DB_PATH=/data/noet.db
- CORS_ALLOWED_ORIGINS=https://yourdomain.com
labels:
caddy: yourdomain.com
caddy.reverse_proxy: "{{upstreams 8081}}"
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8081/api/settings"]
interval: 30s
timeout: 5s
retries: 3
start_period: 10s
networks:
caddy_net:
external: truePrerequisites:
- Go 1.21 or higher
- Node.js 18 or higher
Build and run:
# Build everything (frontend + backend)
./build.sh
# Run it
cd backend
./noetVisit http://localhost:8081 and create an account.
Build everything:
./build.shThe backend/noet binary is all you need. Copy it to your server and run it.
Noet uses environment variables:
NOET_DB_PATH- SQLite database file location (default:./noet.db)PORT- Server port (default:8081)
When you first run Noet, visit the homepage and you’ll be prompted to create an admin account. That’s it. You’re ready to write.
Writing:
- Start with a heading (
#or##or###) for your post title - Press
Ctrl/Cmd + Kto insert a link - Type
$$for block math equations,$for inline math - Drag and drop images directly into the editor
- Click on images to adjust size or add captions
Since everything is in a single SQLite file, backups are simple:
# If running locally
cp noet.db noet-backup-$(date +%Y%m%d).db
# If using Docker with bind mount
tar -czf noet-backup-$(date +%Y%m%d).tar.gz data/MIT