No updates detected yet. GitHub releases will appear here.
Inkwell — A federated social journaling platform. LiveJournal meets MySpace, reimagined for 2026 with ActivityPub federation. No algorithms, no ads, user-owned spaces. Self-hostable.
翻訳待ち
Loading the full README.
Read the full README ↗A federated social journaling platform — LiveJournal meets MySpace, reimagined for 2026 with ActivityPub federation. No algorithms, no ads, user-owned spaces.
Live instance: inkwell.social
@[email protected]Article objects (FEP-b2b8)/roadmapink_-prefixed API keysgen_smtp or Resend API (transactional + newsletters)inkwell/
apps/
api/ # Elixir/Phoenix backend (mix project)
web/ # Next.js frontend (npm workspace member)
services/
federation/ # Unused — federation is native in Phoenix
packages/
types/ # Shared TypeScript types (npm workspace member)
npm workspaces monorepo. Lock file lives at root, not in individual apps.
brew install elixir on macOS)# 1. Start Docker services (Postgres + Meilisearch)
docker compose up -d
# 2. Install JS dependencies
npm install
# 3. Install Elixir deps, create DB, run migrations
cd apps/api && mix setup
# 4. Start Phoenix API (Terminal 1)
mix phx.server
# Wait for: Running InkwellWeb.Endpoint at 0.0.0.0:4000
# 5. Start Next.js frontend (Terminal 2, from project root)
npm run dev:web
# Wait for: Ready in ...ms
| Service | URL |
|---|---|
| Frontend | http://localhost:3000 |
| Phoenix API | http://localhost:4000 |
| API Health Check | http://localhost:4000/health |
| Meilisearch | http://localhost:7700 |
No email service is needed for local development. The API runs in "dev mode" — after entering any email on the login/signup page, a clickable magic link appears on screen instead of being emailed.
mix compile FailsOn first compile with Elixir 1.19, you may hit a one-time ordering issue:
mix deps.compile oban --force
mix compile
Inkwell runs on any x86-64 server with Docker Compose, on one domain of your own, with every feature on for everyone and no billing. Three settings to start (DOMAIN, ADMIN_EMAIL, SECRET_KEY_BASE); Caddy handles HTTPS; members are followable as @name@yourdomain.
See SELF_HOSTING.md for the guide: install, email, your own Terms and Privacy Policy, backups, upgrades and troubleshooting.
Images are published to GitHub Container Registry on every push to main, tagged with the commit. :latest moves only after that commit's images have booted the self-hosted setup and passed scripts/selfhost-smoke.sh:
ghcr.io/stantondev/inkwell-api:latestghcr.io/stantondev/inkwell-web:latestThe hosted instance runs on Fly.io. Deploy commands:
# API (runs migrations automatically)
fly deploy --config fly.api.toml --wait-timeout 600
# Frontend
fly deploy --config fly.web.toml --wait-timeout 600
# Meilisearch
fly deploy --config fly.search.toml --wait-timeout 600
CI/CD via GitHub Actions (.github/workflows/docker-publish.yml) builds Docker images on every push to main, runs the self-hosting smoke test against them, then tags them latest.