ADHX

June 7, 2026 · View on GitHub

CI Release License: MIT PRs Welcome

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.

Bookmarks Saved: Infinite Bookmarks Read: Maybe 3


⚡ 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:

MethodBest forHow
URL-prefix trickEveryoneReplace the link's host with adhx.com (see above). Works on any device, no setup.
BookmarkletDesktop + AndroidDrag the one-click bookmarklet to your toolbar; click it on any X / Instagram / TikTok / YouTube page.
Add to ADHXLogged-in usersPaste any link into the in-app "Add" box (X, Instagram, TikTok, YouTube — auto-detected).
Android share sheetAndroidInstall the app (below), then Share → ADHX from any app — it's a PWA share target.
iOS ShortcutiOSOne-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

FeatureDescription
🐿️ Hoard ModeSync up to 800 bookmarks from Twitter/X. No judgment here.
🎬 Reels & TikToksPaste any Instagram Reel or TikTok URL → preview it inline and save it to your collection alongside your tweets.
▶️ YouTube ShortsPaste a Shorts (or youtu.be / watch) link → preview + play inline via the official embed, save it to your collection.
💾 Save Across PlatformsAdd Reels, TikToks, and Shorts to your collection alongside tweets. Same feed, one search, platform badges keep things straight.
📲 Install as an AppOn 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.
🌐 DiscoverA 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 ViewsBrowse your collection as a masonry gallery (hover-preview videos), a dense list, or a bento mosaic.
Triage ModeFull-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 & DarkA warm editorial theme in both modes. Follows your device by default, one-tap toggle everywhere, remembers your choice.
🔍 Actually Find StuffFull-text search that works. Revolutionary, we know.
🏷️ Tag EverythingCustom tags to organize your chaos (or don't, we won't tell)
Read TrackingMark bookmarks as read so you know what you've actually looked at scrolled past
📖 Article SupportFull rendering of X Articles with rich text and images
⌨️ Keyboard Shortcuts← → to browse, R/U for read/unread, Esc to close
🔤 ADHD-Friendly FontsChoose from 4 fonts designed for readability (Lexend, Atkinson Hyperlegible, etc.)
📖 Bionic ReadingBold the first part of each word to help your eyes flow
👥 Multi-User ReadyEach 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

  1. Go to developer.twitter.com
  2. Create a new project and app
  3. Enable OAuth 2.0 with PKCE
  4. Set callback URL to http://localhost:3000/api/auth/twitter/callback
  5. Copy the Client ID and Client Secret
  6. Try not to get distracted by your timeline

🛠️ Tech Stack

LayerTechnology
FrameworkNext.js 16 (App Router) + React 19
DatabaseSQLite + Drizzle ORM (multi-user ready)
StylingTailwind CSS
AuthTwitter OAuth 2.0 PKCE + JWT sessions
MediaFxTwitter for X, InstaFix for Instagram Reels, fxTikTok for TikToks, YouTube oEmbed + iframe for Shorts
DeploymentFly.io with automated releases
TestingVitest (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

  1. 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
  2. Visit your app URL and connect your Twitter account

Automated Releases

Releases are automated via Release Please:

  1. Merge PRs with conventional commits to main
  2. Release Please creates/updates a release PR with changelog
  3. 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:

AgentSkills 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:

  1. Fork the repo
  2. Create a branch (git checkout -b feat/amazing-feature)
  3. Make your changes
  4. Commit with conventional commits (git commit -m 'feat: add amazing feature')
  5. 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