Personal blogging platform with ActivityPub support
  • Go 67.5%
  • HTML 28.7%
  • JavaScript 2.6%
  • Dockerfile 1%
  • CSS 0.2%
Find a file
2026-05-04 15:57:51 +02:00
static "All bugs" fixed 2026-05-04 03:25:26 +02:00
templates "All bugs" fixed 2026-05-04 03:25:26 +02:00
.dockerignore Initial commit 2026-05-04 01:45:01 +02:00
.env.example Initial commit 2026-05-04 01:45:01 +02:00
.gitignore Initial commit 2026-05-04 01:45:01 +02:00
activitypub.go Add admin endpoint to send Delete(Tombstone) for orphaned AP notes 2026-05-04 15:07:00 +02:00
AGENTS.md AGENTS.md: only deploy when user explicitly asks 2026-05-04 15:57:51 +02:00
db.go Add UUID-based AP Note identity, fix QuoteRequest parsing, add LICENSE 2026-05-04 11:44:28 +02:00
docker-compose.yml "All bugs" fixed 2026-05-04 03:25:26 +02:00
Dockerfile Initial commit 2026-05-04 01:45:01 +02:00
go.mod Initial commit 2026-05-04 01:45:01 +02:00
go.sum Initial commit 2026-05-04 01:45:01 +02:00
handlers_admin.go Add admin endpoint to send Delete(Tombstone) for orphaned AP notes 2026-05-04 15:07:00 +02:00
handlers_auth.go Initial commit 2026-05-04 01:45:01 +02:00
handlers_public.go Initial commit 2026-05-04 01:45:01 +02:00
handlers_upload.go Initial commit 2026-05-04 01:45:01 +02:00
i18n.go "All bugs" fixed 2026-05-04 03:25:26 +02:00
LICENSE Add UUID-based AP Note identity, fix QuoteRequest parsing, add LICENSE 2026-05-04 11:44:28 +02:00
logblog Add admin endpoint to send Delete(Tombstone) for orphaned AP notes 2026-05-04 15:07:00 +02:00
main.go Add admin endpoint to send Delete(Tombstone) for orphaned AP notes 2026-05-04 15:07:00 +02:00
package.json Initial commit 2026-05-04 01:45:01 +02:00
README.md Initial commit 2026-05-04 01:45:01 +02:00
tailwind.config.js Initial commit 2026-05-04 01:45:01 +02:00
Taskfile.yml Initial commit 2026-05-04 01:45:01 +02:00

log

A minimal self-hosted blog. Markdown editor, image uploads, dark/light theme, RSS feed, and a clean public reading experience.

Built with Go, HTMX, and TailwindCSS. Single binary, SQLite database, zero runtime dependencies.

Features

  • Markdown editor with live preview and image upload
  • Post separator (---more---) — shows a teaser on the list and the full text on the post page
  • Infinite scroll on both the public list and the admin list
  • Admin search
  • Light / dark theme (follows system preference, manual toggle)
  • RSS feed at /rss
  • Admin behind a simple username + password login

Requirements

Development

  • Go 1.22+
  • Node.js (for recompiling TailwindCSS when editing templates)
  • Task (task CLI)

Production

  • Just the compiled binary — no runtime dependencies

Environment variables

Variable Default Description
LOG_TITLE log Site title shown in the header, browser tab, and RSS feed
LOG_SUBTITLE (none) Optional tagline shown below the title in the header. Markdown is supported (e.g. *italic*, links)
LOG_USER admin Admin username
LOG_PASSWORD password Admin password
LOG_DB ./log.db Path to the SQLite database file
LOG_PORT 8080 Port the server listens on
LOG_BASE_URL http://localhost:8080 Public base URL (used in RSS links)
LOG_UPLOADS_DIR ./uploads Directory where uploaded images are stored
LOG_SECRET (random) HMAC secret for signing session cookies. Set this in production — without it sessions are lost on restart

Copy .env.example to .env and edit before starting.

Development

# 1. Install Node dependencies (Tailwind)
npm install

# 2. Start the server (compiles CSS, then runs with go run)
LOG_USER=admin LOG_PASSWORD=secret task dev

The server starts on http://localhost:8080. Admin is at http://localhost:8080/admin.

If you edit templates and add new Tailwind classes, recompile CSS separately in a second terminal:

task css-watch

Production build

# Compile CSS + build a static binary
task build

# Run
LOG_USER=admin \
LOG_PASSWORD=yourpassword \
LOG_SECRET=a-long-random-string \
LOG_BASE_URL=https://yourdomain.example.com \
./log

The uploads/ directory and the database file (log.db) are created automatically on first start. Back these up — everything else is in the binary.

Docker

# Build image and start
docker compose up -d

# Logs
docker compose logs -f

# Stop
docker compose down

Configure the instance by editing the environment section in docker-compose.yml before the first start, or by creating a .env file alongside it (Docker Compose picks it up automatically).

Data is persisted in a named volume (log_data) that holds both the SQLite database and the uploads directory.