ADHX
June 7, 2026 · View on GitHub
Save now. Read never. Find always.
For people who bookmark everything and read nothing. A Twitter/X bookmark manager that syncs your bookmarks, surfaces what's trending, and actually helps you find that tweet you saved 6 months ago — and previews Instagram Reels, TikToks, and YouTube Shorts too.
⚡ Quick Add: URL Prefix
Save tweets, or preview Instagram Reels, TikToks and YouTube Shorts instantly by replacing the host in any link with adhx.com:
x.com/user/status/123 instagram.com/reels/abc tiktok.com/@user/video/123 youtube.com/shorts/abc
↓ ↓ ↓ ↓
adhx.com/user/status/123 adhx.com/reels/abc adhx.com/@user/video/123 adhx.com/shorts/abc
You can also paste the full URL after adhx.com/ — the middleware proxy (src/proxy.ts) handles every shape:
adhx.com/https://x.com/user/status/123 → /user/status/123
adhx.com/https://www.instagram.com/reels/abc → /reels/abc
adhx.com/https://www.tiktok.com/@user/video/123 → /@user/video/123
adhx.com/https://youtube.com/shorts/abc → /shorts/abc (also youtu.be/abc, watch?v=abc)
Tweets land in your collection and open in the lightbox. Reels and TikToks render a public preview with inline playback, and you can save them to your collection alongside your tweets. YouTube Shorts play inline via the official embed.
📱 Save it from anywhere
Pick whatever's least friction for your device — every route ends up at the same adhx.com preview:
| Method | Best for | How |
|---|---|---|
| URL-prefix trick | Everyone | Replace the link's host with adhx.com (see above). Works on any device, no setup. |
| Bookmarklet | Desktop + Android | Drag the one-click bookmarklet to your toolbar; click it on any X / Instagram / TikTok / YouTube page. |
| Add to ADHX | Logged-in users | Paste any link into the in-app "Add" box (X, Instagram, TikTok, YouTube — auto-detected). |
| Android share sheet | Android | Install the app (below), then Share → ADHX from any app — it's a PWA share target. |
| iOS Shortcut | iOS | One-tap Share Sheet shortcut. Currently rewrites x.com only; for Reels / TikToks / Shorts on iOS use the URL-prefix trick. |
Install as an app (PWA)
ADHX is a Progressive Web App, so you can add it to your home screen and run it full-screen like a native app — no app store:
- Android (Chrome): a one-tap "Add to home screen" banner appears at the bottom on mobile; tap Add.
- iOS (Safari): tap the Share button, then "Add to Home Screen" (the in-app banner reminds you how).
Once installed it launches standalone, remembers your session, and registers as an Android share target so you can share links straight into it. (The prompt is handled by src/components/PWAInstallPrompt.tsx; a cache-free service worker in public/sw.js makes the app installable without ever serving stale content.)
✨ Features
| Feature | Description |
|---|---|
| 🐿️ Hoard Mode | Sync up to 800 bookmarks from Twitter/X. No judgment here. |
| 🎬 Reels & TikToks | Paste any Instagram Reel or TikTok URL → preview it inline and save it to your collection alongside your tweets. |
| ▶️ YouTube Shorts | Paste a Shorts (or youtu.be / watch) link → preview + play inline via the official embed, save it to your collection. |
| 💾 Save Across Platforms | Add Reels, TikToks, and Shorts to your collection alongside tweets. Same feed, one search, platform badges keep things straight. |
| 📲 Install as an App | On mobile, tap "Add to home screen" — ADHX runs full-screen like a native app (PWA), with an Android share-target so you can share any link straight into it. |
| 🌐 Discover | A live, anonymous feed of what everyone's saving across ADHX right now — filter by type, preview any of it, save your own. Public, no account needed. |
| 🖼️ Three Views | Browse your collection as a masonry gallery (hover-preview videos), a dense list, or a bento mosaic. |
| ⚡ Triage Mode | Full-screen, one-card-at-a-time pass through your backlog — Keep / Delete / Done with arrow keys, plus a daily streak to keep you honest. |
| 🌗 Light & Dark | A warm editorial theme in both modes. Follows your device by default, one-tap toggle everywhere, remembers your choice. |
| 🔍 Actually Find Stuff | Full-text search that works. Revolutionary, we know. |
| 🏷️ Tag Everything | Custom tags to organize your chaos (or don't, we won't tell) |
| ✅ Read Tracking | Mark bookmarks as read so you know what you've |
| 📖 Article Support | Full rendering of X Articles with rich text and images |
| ⌨️ Keyboard Shortcuts | ← → to browse, R/U for read/unread, Esc to close |
| 🔤 ADHD-Friendly Fonts | Choose from 4 fonts designed for readability (Lexend, Atkinson Hyperlegible, etc.) |
| 📖 Bionic Reading | Bold the first part of each word to help your eyes flow |
| 👥 Multi-User Ready | Each user gets their own bookmarks, tags, and read status |
🚀 Quick Start
Prerequisites
- Node.js 20+
- pnpm
- Twitter/X Developer Account (for OAuth credentials)
- A concerning number of unread bookmarks
Setup
# Clone the repo
git clone https://github.com/itsmemeworks/adhx
cd adhx
# Install dependencies
pnpm install
# Copy environment template
cp .env.example .env
# Start dev server
pnpm dev
Open http://localhost:3001 and connect your Twitter/X account.
Environment Variables
Create a .env file:
# Twitter OAuth 2.0 credentials (from developer.twitter.com)
TWITTER_CLIENT_ID=your_client_id
TWITTER_CLIENT_SECRET=your_client_secret
# App URL (for OAuth callback)
NEXT_PUBLIC_APP_URL=http://localhost:3000
# Session security (generate a random string)
SESSION_SECRET=your-secret-key-here
Getting Twitter API Credentials
- Go to developer.twitter.com
- Create a new project and app
- Enable OAuth 2.0 with PKCE
- Set callback URL to
http://localhost:3000/api/auth/twitter/callback - Copy the Client ID and Client Secret
- Try not to get distracted by your timeline
🛠️ Tech Stack
| Layer | Technology |
|---|---|
| Framework | Next.js 16 (App Router) + React 19 |
| Database | SQLite + Drizzle ORM (multi-user ready) |
| Styling | Tailwind CSS |
| Auth | Twitter OAuth 2.0 PKCE + JWT sessions |
| Media | FxTwitter for X, InstaFix for Instagram Reels, fxTikTok for TikToks, YouTube oEmbed + iframe for Shorts |
| Deployment | Fly.io with automated releases |
| Testing | Vitest (800+ tests) |
🧪 Development
pnpm dev # Start dev server
pnpm build # Production build
pnpm test # Run tests
pnpm test:watch # Run tests in watch mode
pnpm lint # ESLint
pnpm typecheck # TypeScript check
pnpm format # Format the codebase with Prettier
pnpm format:check # Check formatting (CI gate)
pnpm db:migrate # Run database migrations
A pre-commit hook (Husky + lint-staged) auto-formats staged files and runs
typecheck + tests. On pull requests, CI runs lint, format check, typecheck,
tests, and a production build, plus CodeQL security analysis — the build and
format checks are required to merge. See ARCHITECTURE.md
for how the codebase is organized.
🚀 Deployment (Fly.io)
ADHX is configured for deployment on Fly.io with persistent SQLite storage.
Prerequisites
# Install Fly CLI
curl -L https://fly.io/install.sh | sh
# Login to Fly
fly auth login
Deploy
# Create the app (first time only)
fly apps create your-app-name
# Create persistent volume for SQLite database
fly volumes create adhx_data --region lhr --size 1
# Set secrets (replace with your domain)
fly secrets set TWITTER_CLIENT_ID=your_client_id
fly secrets set TWITTER_CLIENT_SECRET=your_client_secret
fly secrets set SESSION_SECRET=$(openssl rand -base64 32)
fly secrets set NEXT_PUBLIC_APP_URL=https://your-app-name.fly.dev
# Deploy
fly deploy
Post-deployment
- Update your Twitter app's callback URL to match your domain:
- Local:
http://localhost:3000/api/auth/twitter/callback - Fly.io:
https://your-app-name.fly.dev/api/auth/twitter/callback
- Local:
- Visit your app URL and connect your Twitter account
Automated Releases
Releases are automated via Release Please:
- Merge PRs with conventional commits to
main - Release Please creates/updates a release PR with changelog
- Merge the release PR → automatically deploys to Fly.io
Manual deploy: gh workflow run deploy.yml
🤖 Agent Skill (works with any agent)
ADHX ships as an Agent Skill — an open, portable format for giving AI agents new capabilities. Paste any X/Twitter link into your agent of choice and it can fetch the post as clean JSON, no browser or scraping needed.
The adhx skill follows the agentskills.io specification, so it works across any skills-compatible agent, including: Claude Code, Claude, Cursor, Gemini CLI, OpenCode, OpenAI Codex, GitHub Copilot, Goose, Kiro, VS Code (Copilot), Letta, Factory, Roo Code, Amp, and more.
📂 Skill source: skills/adhx/SKILL.md
Install
The skill is a single folder you drop into your agent's skills directory. Location varies by agent:
| Agent | Skills directory |
|---|---|
| Claude Code | ~/.claude/skills/ |
| Claude (web/desktop) | Settings → Skills → Upload |
| Cursor | .cursor/skills/ (project) or ~/.cursor/skills/ (global) |
| Gemini CLI | ~/.gemini/skills/ |
| OpenCode | ~/.config/opencode/skills/ |
| OpenAI Codex | ~/.codex/skills/ |
| GitHub Copilot / VS Code | .github/skills/ (workspace) |
| Goose | ~/.config/goose/skills/ |
Check your agent's docs if your client isn't listed — the install path may differ, but the skill file itself is identical everywhere.
One-line install (replace <SKILLS_DIR> with the path from the table above):
mkdir -p <SKILLS_DIR>/adhx && \
curl -sL https://raw.githubusercontent.com/itsmemeworks/adhx/main/skills/adhx/SKILL.md \
-o <SKILLS_DIR>/adhx/SKILL.md
Claude Code marketplace (shortcut for Claude Code users):
/plugin marketplace add itsmemeworks/adhx
/plugin install adhx
Update
Re-run the same install command — it overwrites the existing SKILL.md with the latest version. For the Claude Code marketplace install, use /plugin update adhx.
# Example for Claude Code
curl -sL https://raw.githubusercontent.com/itsmemeworks/adhx/main/skills/adhx/SKILL.md \
-o ~/.claude/skills/adhx/SKILL.md
Usage
Once installed, paste any X link into your agent and ask it to read/summarize/analyze:
> Read this and give me the key takeaways https://x.com/dgt10011/status/2020167690560647464
The agent will automatically call the ADHX public API and return structured JSON with the full post content, author info, and engagement metrics — including long-form X Articles.
API
GET https://adhx.com/api/share/tweet/{username}/{statusId}
No auth required. Works with x.com, twitter.com, and adhx.com URLs.
🤝 Contributing
We welcome contributions! Whether you're fixing bugs, adding features, or just improving docs.
Quick start:
- Fork the repo
- Create a branch (
git checkout -b feat/amazing-feature) - Make your changes
- Commit with conventional commits (
git commit -m 'feat: add amazing feature') - Push and open a PR
See CONTRIBUTING.md for detailed guidelines.
Commit Format
We use conventional commits for automatic versioning:
feat: add new feature # → Minor version bump
fix: resolve bug # → Patch version bump
feat!: breaking change # → Major version bump
📁 Project Structure
For a narrative walkthrough of the data flow, auth, preview model, and database design, see ARCHITECTURE.md.
src/
├── app/ # Next.js App Router
│ ├── api/ # API routes
│ │ ├── auth/ # Twitter OAuth flow
│ │ ├── bookmarks/ # Bookmark CRUD
│ │ ├── feed/ # Main feed endpoint
│ │ ├── activity/ # Public anonymous Discover/pulse feed
│ │ ├── media/ # Video/photo/thumbnail proxies (X, IG, TikTok)
│ │ └── sync/ # Sync with Twitter
│ ├── discover/ # Public Discover page
│ ├── settings/ # Settings page (font, theme, streak)
│ └── page.tsx # Collection (authed) / landing (signed-out)
├── components/
│ ├── feed/ # Feed: FeedGrid, FeedCard, FeedListRow, FeedBentoTile, MediaCard (triage)
│ ├── discover/ # DiscoverFeed + DiscoverCard
│ ├── matter/ # Matter design primitives (badges, glyphs, logo)
│ ├── ThemeToggle.tsx # Light/dark toggle (public + preview surfaces)
│ └── ...
└── lib/
├── db/ # Database schema + startup migrations
├── auth/ # OAuth utilities
├── theme/ # ThemeProvider (device-default, localStorage)
├── activity/ # recordActivity() pulse writer
└── media/ # FxTwitter / mirror integrations
🔒 Security
Found a security issue? Please report it privately. See SECURITY.md for details.
📜 License
MIT © ADHX
Built for people who save tweets about productivity while procrastinating.
adhx.com