{"id":48716391,"url":"https://github.com/webcpu/xdigest","last_synced_at":"2026-04-14T19:00:57.771Z","repository":{"id":350552822,"uuid":"1207350916","full_name":"webcpu/Xdigest","owner":"webcpu","description":"macOS menu bar app that filters your X feed for high-signal posts using Claude","archived":false,"fork":false,"pushed_at":"2026-04-11T10:50:44.000Z","size":37591,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-11T17:28:32.494Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/webcpu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-10T21:04:02.000Z","updated_at":"2026-04-11T10:50:48.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/webcpu/Xdigest","commit_stats":null,"previous_names":["webcpu/xdigest"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/webcpu/Xdigest","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webcpu%2FXdigest","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webcpu%2FXdigest/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webcpu%2FXdigest/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webcpu%2FXdigest/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/webcpu","download_url":"https://codeload.github.com/webcpu/Xdigest/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webcpu%2FXdigest/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31810741,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-14T18:05:02.291Z","status":"ssl_error","status_checked_at":"2026-04-14T18:05:01.765Z","response_time":153,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-04-11T17:19:35.733Z","updated_at":"2026-04-14T19:00:57.765Z","avatar_url":"https://github.com/webcpu.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"Resources/xdigest.png\" width=\"128\" alt=\"Xdigest app icon\"\u003e\n\u003c/p\u003e\n\n# Xdigest\n\n**X's For You feed optimizes for engagement, not for you.** You scroll past noise to find a few posts that matter. Most of the good ones get lost in the flood.\n\n**Your bookmarks are your taste.** They're the posts you actually cared about enough to save. But nothing uses them. They just sit there.\n\n**Xdigest closes that loop.** It fetches your feed, scores each post against your bookmarks with Claude, and gives you a short daily digest in your browser. No firehose. No doomscrolling. Just the posts you'd actually want to read.\n\n**Read on any device.** Phone, Mac, iPad. Xdigest keeps them all in sync. Pick up right where you left off, every time. It just works.\n\nhttps://github.com/user-attachments/assets/a55de033-181a-4647-8b06-4d823f7810c3\n\n## Requirements\n\n- macOS 15+\n- [Claude Code](https://code.claude.com/docs/en/setup). Install it, then run `claude` and use `/login` to sign in with your subscription (not API key)\n- [bird](https://www.npmjs.com/package/@steipete/bird) CLI (`npm install -g @steipete/bird`)\n- **Logged into X (Twitter) in Safari, Chrome, or Firefox**. bird reads browser cookies\n\n\u003e **Note:** If you added x.com to your dock as a web app, it has isolated cookies that bird can't read. Log in through the browser's regular window instead.\n\nXdigest checks all requirements on launch and shows a setup window telling you exactly what's missing and how to fix it. You don't need to configure anything manually.\n\n## Install\n\n### Download the DMG (easiest)\n\nGrab the latest release from [Releases](https://github.com/webcpu/Xdigest/releases), open the DMG, drag Xdigest to Applications.\n\n### Build from source\n\n```bash\ngit clone https://github.com/webcpu/Xdigest.git\ncd Xdigest\nswift build -c release\n./.build/release/Xdigest\n```\n\n## Usage\n\nLaunch Xdigest. The **XD** wordmark appears in your menu bar (template image, adapts to light/dark/tinted menu bar). Click it:\n\n- **Generate Digest**. Fetches your feed, scores with Claude, updates the reader\n- **Open Reader**. Opens `http://localhost:8408` in your browser\n- **Check for Updates...**. Queries GitHub for a newer release\n- **Quit**\n\nOr click the refresh button in the reader. When new posts are generated, a blue \"N new posts\" banner appears at the top. Click to reveal them.\n\n**Launching Xdigest opens today's reader automatically.** If today's digest already has posts, the reader opens immediately. Otherwise Xdigest runs the pipeline first, then opens when done.\n\n### Access from iPhone/iPad\n\n**On the same Wi-Fi as your Mac**: open Safari on your iPhone or iPad and go to `http://your-mac.local:8408`.\n\n**Not on the same Wi-Fi? Use [Tailscale](https://tailscale.com/).** Install it on your Mac and your iOS device, then use your Mac's Tailscale name: `http://your-mac-name:8408`. The reader works from anywhere: your couch, a coffee shop, another country. No port forwarding, no public exposure, no dynamic DNS.\n\nOn first launch, macOS will ask whether Xdigest can accept incoming connections. **Click Allow.** Otherwise nothing (LAN or Tailscale) can reach the reader. If you click Deny by mistake, Xdigest detects it and shows a setup window with a link to fix it.\n\n**Reveal state syncs across devices** in real time: click the \"N new posts\" banner on one device and the others catch up automatically.\n\n## Architecture\n\nData-centric, layered, Unix-style pipeline. Each module does one thing.\n\n```\nBirdService -\u003e ScorerService -\u003e DigestService -\u003e ServerService -\u003e Browser\n     |               |               |               |\n  [Tweet]      [ScoredPost]      [Digest]        [HTML]\n```\n\n- **XdigestCore**: shared data types, typed errors, process runner\n- **BirdService**: fetches and normalizes tweets from bird CLI\n- **ScorerService**: scores tweets against bookmarks using Claude\n- **DigestService**: assembles scored posts into a digest with dedup\n- **ServerService**: HTTP server with HTML reader and video proxy\n- **Pipeline**: orchestrates the flow with retry and caching\n\n## Privacy\n\nXdigest runs entirely on your Mac. Your feed, bookmarks, and scores never leave your machine. The only external calls are:\n\n- `bird` fetching from x.com (your own account)\n- `claude` scoring posts (your own subscription)\n- Video proxy streaming from `video.twimg.com`\n\nNo analytics, no telemetry, no accounts.\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwebcpu%2Fxdigest","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwebcpu%2Fxdigest","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwebcpu%2Fxdigest/lists"}