New
Apps 1,895Makers 1,890This week 1,690
Promote your app−30%
Inkwell screenshot 1
0views in
the last 30 days

Inkwell

A federated social journaling platform — LiveJournal meets MySpace, reimagined for 2026 with...

Built with Claude Code

by stantondev · Unclaimed · from USUnited States · added Oct 29, 2026
no ratings0 comments

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

Features

Writing & Publishing

  • Rich text editor (TipTap) with 17+ extensions — formatting, tables, task lists, image uploads, smart typography
  • Drafts, excerpts, cover images, word count & reading time
  • Series & collections for organizing entries
  • 21 content categories, tags, mood & music metadata
  • Distraction-free writing mode
  • Post by Email (Plus) — publish by sending to a unique email address
  • Cross-posting to Mastodon/fediverse accounts

Social & Discovery

  • Pen Pals (follow/accept) with pending state
  • Stamps — 7 postage-stamp-styled reaction types per entry
  • Inks — community discovery signal with trending & "Most Inked" sorting
  • Threaded comments ("Marginalia") with @mentions
  • Guestbooks on profile pages
  • Circles — group discussion spaces with a Writer's Salon aesthetic
  • Native polling (entry polls & platform-wide community polls)
  • Direct messaging ("Letters") with rich text
  • User blocking with full visibility enforcement

Profile Customization (MySpace-style)

  • 8 theme presets, 8 fonts, 4 layouts, 3 color pickers
  • Background images, banner images, profile music player
  • Avatar frames (10 decorative SVG overlays)
  • Avatar builder (DiceBear Croodles hand-drawn doodle style)
  • Widget ordering, custom CSS, custom HTML (full-page mode with template tags)
  • AIM-style status messages, social links, tag cloud
  • 3 entry display modes (cards, full post, timeline)

Federation (ActivityPub)

  • Fully interoperable with Mastodon and the fediverse
  • Users followable at @username@inkwell.social
  • Entries federated as Article objects (FEP-b2b8)
  • Inbound/outbound: follows, comments, inks (boosts), stamps (likes)
  • Relay support for bootstrapping fediverse content on Explore
  • WebFinger, HTTP Signatures, actor endpoints

Newsletters

  • Double opt-in email subscribers (CAN-SPAM/GDPR compliant)
  • Send published entries as emails with one-click unsubscribe
  • Scheduled sends (Plus), custom newsletter name & reply-to

Monetization & Support

  • Plus subscription ($5/mo) via Stripe
  • Ink Donor voluntary donations ($1/$2/$3/mo)
  • Postage — reader-to-writer payments via Stripe Connect (8% commission)
  • Writer Subscription Plans — recurring paid content access
  • External support links (Ko-fi, BMC, Patreon, etc.)

Platform

  • Community feedback board & roadmap at /roadmap
  • Content translation (DeepL, 15 languages)
  • Sensitive content labeling & reporting system
  • Redactions (keyword-based content muting)
  • Custom domains (Plus)
  • Public API with ink_-prefixed API keys
  • Full-text search (Meilisearch with Postgres fallback)
  • Self-hosting support via Docker Compose

Architecture

  • Backend: Elixir/Phoenix 1.8 — OTP release deployed to Fly.io
  • Frontend: Next.js 16 + React — standalone output deployed to Fly.io
  • Federation: ActivityPub handled natively in Phoenix (no sidecar)
  • Database: PostgreSQL 16
  • Search: Meilisearch (optional, graceful fallback to Postgres ILIKE)
  • Email: SMTP via gen_smtp or Resend API (transactional + newsletters)
  • Background Jobs: Oban (Postgres-backed)
  • Payments: Stripe (subscriptions, Connect, donations)

Project Structure

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.

Getting Started

Prerequisites

  • Elixir 1.19+ / Erlang/OTP 28+ (install via brew install elixir on macOS)
  • Node.js 20+
  • Docker Desktop (for PostgreSQL and Meilisearch)

First-Time Setup

# 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

Development URLs

Service URL
Frontend http://localhost:3000
Phoenix API http://localhost:4000
API Health Check http://localhost:4000/health
Meilisearch http://localhost:7700

Logging In Locally

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.

If mix compile Fails

On first compile with Elixir 1.19, you may hit a one-time ordering issue:

mix deps.compile oban --force
mix compile

Self-Hosting

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:latest
  • ghcr.io/stantondev/inkwell-web:latest

Deployment (Fly.io)

The 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.

License

GNU Affero General Public License v3.0

Description taken from the repository README.

Ratings

–
0 ratings
5 0
4 0
3 0
2 0
1 0

Rate this app

Sign in to rate

Comments 0

Sign in to comment

No comments yet.

Related apps

#journaling · #fediverse · #social