Save articles. Read them when you're ready.
Self-hostable. Offline-first. No algorithms.
Self-host · Features · Contribute
Mind is a read-later app you actually own. It's a PWA that installs on any device, works offline, and lets you share URLs straight from your phone's share sheet. Your reading list lives on your own database — no tracking, no feeds, no noise.
- Share to save — share a URL from any app on your phone, Mind catches it
- Offline-first — your article list loads instantly from cache, even without a connection
- Installable — works as a native app on iOS, Android, and desktop
- Keyboard-first —
j/kto navigate,/to search,eto mark read,?for all shortcuts - API access — generate a token to save articles from scripts, shortcuts, or automation
- Swipe gestures — swipe right to mark read, left to delete on mobile
- Dark by default — easy on the eyes, always
Mind is designed to be self-hosted. You need three things:
- Node.js 20+
- A Turso database — free tier is plenty
- Google OAuth credentials — from console.cloud.google.com
git clone https://github.com/rajatvijay/mind.git
cd mind
npm installCreate .env.local:
TURSO_DATABASE_URL=libsql://your-db.turso.io
TURSO_AUTH_TOKEN=your-token
GOOGLE_CLIENT_ID=your-client-id
GOOGLE_CLIENT_SECRET=your-client-secret
BETTER_AUTH_URL=http://localhost:3000
BETTER_AUTH_SECRET=$(openssl rand -hex 32)Set up the database and run:
npx drizzle-kit push
npm run devThat's it. Open localhost:3000.
Works anywhere Node.js runs. For Vercel:
npx vercelSet the same env vars in your provider's dashboard and update BETTER_AUTH_URL to your production URL.
Save articles from Safari's share sheet using an iOS Shortcut.
Import the shortcut — you'll be asked to set your Mind URL and API token on import.
To generate an API token, open your Mind instance and use the iOS Shortcut Setup section on the main page.
If you'd rather create one from scratch:
- Open the Shortcuts app → tap +
- Add a URL action — set it to
https://your-mind-url/api/articles - Add a Get Contents of URL action:
- Method: POST
- Headers:
Authorization: Bearer YOUR_TOKEN - Body (JSON):
{"url": "Shortcut Input"}
- Use Receive > URLs from the share sheet as input
- Done — share any link from Safari and pick your shortcut
- Fork the repo
- Create a branch (
git checkout -b my-feature) - Make your changes
npm run lint && npm run build- Open a PR
Bug reports and ideas welcome in Issues.
Next.js 16 · React 19 · Turso · Drizzle · Better Auth · Tailwind CSS 4