bookmarksthread expansion controls (--expand-root-only,--author-chain,--author-only,--full-chain-only,--include-ancestor-branches,--include-parent,--thread-meta,--sort-chronological) for richer context exports (#55) — thanks @kkretschmer2.--chrome-profile-dirto point at Chromium profile directories or cookie DB files (Arc/Brave/etc) for cookie extraction (#16) — thanks @tekumara.aboutcommand to report account origin/location metadata (#51) — thanks @pjtf93.follow/unfollowcommands to manage follows (#54) — thanks @citizenlee.- Twitter client now supports like/unlike/retweet/unretweet/bookmark via the engagement mixin (#53) — thanks @the-vampiire.
bookmarksexpanded JSON now preserves paginationnextCursor, and full-chain filtering only includes ancestor branches when requested.- Follow/unfollow REST fallback now supports cursor pagination for followers/following (#54).
- About account live coverage now verifies data extraction paths (#51) — thanks @pjtf93.
- Live tests now exercise engagement mutations (opt-in) (#53) — thanks @the-vampiire.
homecommand for the "For You" and "Following" home timelines (#31) — thanks @odysseus0.news/trendingcommand for Explore tabs with AI-curated headlines (#39) — thanks @aavetis.user-tweetscommand to fetch a user's profile timeline (#34) — thanks @crcatala.repliesandthreadnow support pagination (--all,--max-pages,--cursor,--delay) (#35) — thanks @crcatala.searchnow supports pagination (--all,--max-pages,--cursor) (#42) — thanks @pjtf93.likesnow supports pagination (--all,--max-pages,--cursor) (#44) — thanks @jsholmes.list-timelinenow supports pagination (--all,--max-pages,--cursor) (#30) — thanks @zheli.- Rich text output now shows article previews, quoted tweets, and media links (#32) — thanks @odysseus0.
- Long-form article tweets now render rich Draft.js content blocks/entities (#36) — thanks @crcatala.
- Library typing:
SearchResultis now a discriminated union (soerroronly exists whensuccess: false).
- Lists GraphQL feature flags updated to prevent 400s (#27) — thanks @zheli.
- Lists feature overrides now scope new GraphQL flags correctly (#50) — thanks @ryanh-ai.
- Tweet detail parsing now tolerates partial GraphQL errors when usable data exists (#48) — thanks @jsholmes.
- News output now respects
--tweets-per-item, keeps unique IDs, and parses non-add entry instructions (#39) — thanks @aavetis. - Following/followers pagination now guards repeat cursors and standardizes JSON output (#28) — thanks @malpern.
- Likes pagination now follows cursors and avoids stalling on duplicate pages (#12) — thanks @titouv.
- macOS cookie extraction now supports Brave keychain storage (#40) — thanks @gakonst.
- Terminal hyperlinks now sanitize control characters before emitting OSC 8 sequences (#29) — thanks @mafulafunk.
pnpm run build:distnow succeeds after tightening JSON/pagination option typing in tweet output commands.
- Following: split following/likes tests + cover cursor handling (#33) — thanks @VACInc.
- Bookmark exports now support pagination (
--all,--max-pages) with retries (#15) — thanks @Nano1337. lists+list-timelinecommands for Twitter Lists (#21) — thanks @harperreed- Tweet JSON output now includes media items (photos, videos, GIFs) (#14) — thanks @Hormold
- Bookmarks can resume pagination from a cursor (#26) — thanks @leonho
unbookmarkcommand to remove bookmarked tweets (#22) — thanks @mbelinky.
- Feature flags can be overridden at runtime via
features.json(refreshable viaquery-ids).
- GraphQL feature flags now include
post_ctas_fetch_enabledto avoid 400s (#38) — thanks @philipp-spiess.
bird --helpnow includes explicit “Shortcuts” and “JSON Output” sections (documentsbird <tweet-id-or-url>shorthand +--json).- Release docs now include explicit npm publish verification steps.
pnpm bird --helpnow works (dev script runs the CLI entrypoint, not the library entrypoint).following/followersnow fall back to internal v1.1 REST endpoints when GraphQL returns404.
- Add root help output regression test.
- Add opt-in live CLI test suite (real GraphQL calls; skipped by default; gated via
BIRD_LIVE=1).
likescommand to list your liked tweets (thanks @swairshah).- Quoted tweet data in JSON output +
--quote-depth(thanks @alexknowshtml). following/followerscommands to list users (thanks @lockmeister).
- Query ID updater now tracks the Likes GraphQL operation.
- Query ID updater now tracks Following/Followers GraphQL operations.
- Query ID updater now tracks BookmarkFolderTimeline and keeps bookmark query IDs seeded.
following/followersJSON user fields are now camelCase (followersCount,followingCount,isBlueVerified,profileImageUrl,createdAt).- Cookie extraction timeout is now configurable (default 30s on macOS) via
--cookie-timeout/BIRD_COOKIE_TIMEOUT_MS(thanks @tylerseymour). - Search now paginates beyond 20 results when using
-n(thanks @ryanh-ai). - Library exports are now separated from the CLI entrypoint for easier embedding.
bookmarkscommand to list your bookmarked tweets.bookmarks --folder-idto fetch bookmark folders (thanks @tylerseymour).
- Cookie extraction now uses
@steipete/sweet-cookie(dropssqlite3CLI + custom browser readers inbird). - Query ID updater now tracks the Bookmarks GraphQL operation.
- Lint rules stricter (block statements, no-negation-else, useConst/useTemplate, top-level regex, import extension enforcement).
pnpm lintnow runs both Biome and oxlint (type-aware).
- Coverage thresholds raised to 90% statements/lines/functions (80% branches).
- Added targeted Twitter client coverage suites.
- Cookie source selection:
--cookie-source safari|chrome|firefox(repeatable) +cookieSourceconfig (string or array).
tweet/reply: fallback tostatuses/update.jsonwhen GraphQLCreateTweetreturns error 226 (“automated request”).
- Remove
allowSafari/allowChrome/allowFirefoxconfig toggles in favor ofcookieSourceordering.
- Safari cookie extraction (
Cookies.binarycookies) +allowSafariconfig toggle.
- Removed the Sweetistics engine + fallback.
birdis GraphQL-only. - Browser cookie fallback order: Safari → Chrome → Firefox.
- Enforce coverage thresholds (>= 70% statements/branches/functions/lines) + expand unit coverage for version/output/Twitter client branches.
- Output controls:
--plain,--no-emoji,--no-color(respectsNO_COLOR). helpcommand:bird help <command>.- Runtime GraphQL query ID refresh:
bird query-ids --fresh(cached on disk; auto-retry on 404; override cache viaBIRD_QUERY_IDS_CACHE). - GraphQL media uploads via
--media(up to 4 images/GIFs, or 1 video).
- CLI
--version: read version frompackage.json/VERSION(no hardcoded string) + append git sha when available.
mentions: no hardcoded user; defaults to authenticated user or accepts--user @handle.- GraphQL query ID updater: correctly pairs
operationName↔queryId(CreateTweet/CreateRetweet/etc). build:dist: copiessrc/lib/query-ids.jsonintodist/lib/query-ids.json(keepsdist/in sync).--engine graphql: strict GraphQL-only (disables Sweetistics fallback).
- Engine default now
auto(GraphQL primary; Sweetistics only on fallback when configured).
- Add engine resolution tests for auto/default behavior.
- GraphQL read: rotate TweetDetail query IDs with fallback to avoid 404s.
- CLI commands:
tweet,reply,read,replies,thread,search,mentions,whoami,check. - URL/ID shorthand for
read, plus--jsonoutput where supported. - GraphQL engine with cookie auth from Firefox/Chrome/env/flags (macOS browsers).
- Sweetistics engine (API key) with automatic fallback when configured.
- Media uploads via Sweetistics with per-item alt text (images or single video).
- Long-form Notes and Articles extraction for full text output.
- Thread + reply fetching with full conversation parsing.
- Search + mentions via GraphQL (latest timeline).
- JSON5 config files (
~/.config/bird/config.json5,./.birdrc.json5) with engine defaults, profiles, allowChrome/allowFirefox, and timeoutMs. - Request timeouts (
--timeout,timeoutMs) for GraphQL and Sweetistics calls. - Bun-compiled standalone binary via
pnpm run build. - Query ID refresh helper:
pnpm run graphql:update.