Sign in
birdclaw keeps its database local. Archive import needs no X credentials. Live reads and writes use these transports:
xurlis the recommended setup for new users and uses the official X API with your own developer app.- Existing private
birdinstallations remain supported for cookie-backed workflows and compatibility fallback. - Native
webaccess handles DM requests directly with session cookies, without either external CLI.
Install xurl for a new live-transport setup. Transport selection is workflow-specific: sync commands expose --mode, while auth use only controls moderation writes such as block, unblock, mute, and unmute.
On a fresh Birdclaw database, import your X archive before the first live sync. Archive import establishes your real account identity; init --demo creates only synthetic sample data. The current auth commands verify transports but do not bind a new database to the authenticated X account.
#Set up xurl
Install xurl, register an X developer app, then start OAuth2 authentication. Homebrew is available on macOS; npm and the upstream install script work on macOS and Linux:
# macOS
brew install --cask xdevplatform/tap/xurl
# macOS or Linux
npm install -g @xdevplatform/xurl
xurl auth oauth2 --app my-app
xurl whoami
Alternatively, use xurl's no-sudo install script. Register my-app first by following the xurl authentication guide. The redirect URI configured in the X developer portal must match xurl's configured URI. Treat the client secret as a secret; avoid entering it in shared shell history or exposing it in process listings.
#Existing bird installations
Birdclaw preserves compatibility with existing private bird installations, but bird is not a public setup path for new users. If bird is already installed and authenticated, verify the detected account:
bird whoami
Existing bird configurations continue to provide cookie-backed fallback for supported reads and writes.
#Run without bird
An authenticated xurl installation is sufficient for archive search, normal feed and accepted-DM synchronization, profile lookup, research, posting/replies, and moderation. No browser, browser cookies, or bird executable is needed for these workflows. Select xurl explicitly to avoid optional transport fallback:
birdclaw auth use xurl
birdclaw sync timeline --mode xurl --refresh --json
birdclaw sync mentions --mode xurl --refresh --json
birdclaw sync mention-threads --mode xurl --json
birdclaw dms sync --mode xurl --refresh --json
Home and DM sync default to auto; mention-thread sync defaults to xurl. Moderation verifies the blocking or muting boolean returned by X itself. Malformed, missing, or contradictory confirmation is a failure, even when xurl exits successfully; the mutation is never replayed just to obtain confirmation.
X's official DM API does not expose the message-request inbox or its accept/reject state. Birdclaw's native web transport supplies these operations using your own X session cookies, without a bird executable, browser process, or browser-cookie database access. Configure AUTH_TOKEN and CT0 through a secret manager or a protected service environment; never pass cookie values as command arguments.
birdclaw dms sync --mode web --inbox requests --limit 20 --refresh --json
birdclaw dms accept <conversation-id> --json
birdclaw dms reject <conversation-id> --json
birdclaw dms block <conversation-id> --json
Request actions default to web; --mode bird retains explicit legacy support. The native transport verifies the authenticated account before reading or changing DMs, rejects redirects, limits response sizes and pagination, and never retries a mutation automatically. It discovers the current public X web-client bearer and viewer query from X-owned assets; no bearer is embedded in the package. These are undocumented web endpoints, so X changes or expired cookies can require attention. The read-only deployment flag blocks this transport, and the live-write disable flag blocks request actions.
#Verify xurl in birdclaw
birdclaw auth status --json
auth status runs a coarse xurl status probe. It does not probe bird, prove that a specific X API request will succeed, or choose a transport for every command.
installedreports whether the xurl executable exists.availableTransportisxurlwhenxurl auth statussucceeds without a known unauthenticated message; otherwise it islocal.statusTextexplains the detected state.rawStatuscontains xurl's status output when available.
Use xurl whoami as the end-to-end authentication check. Run xurl auth status for detailed app/token state. Existing private bird users can run bird whoami to verify bird independently.
#Choose moderation transport
Persist the preferred transport for block, unblock, mute, and unmute:
birdclaw auth use auto
birdclaw auth use bird
birdclaw auth use xurl
auto tries bird first for moderation writes, then xurl. A command-level --transport flag overrides the saved value. BIRDCLAW_ACTIONS_TRANSPORT overrides the config for one process.
Sync commands do not use this saved moderation setting. Select their source with the command's --mode flag:
birdclaw sync timeline --mode auto
birdclaw sync mentions --mode bird
birdclaw sync likes --mode xurl
Select an existing Birdclaw account per operation with its username or stored ID:
birdclaw sync timeline --account steipete --mode xurl
birdclaw import hydrate-profiles --account @steipete
birdclaw profiles replies @someone --account steipete
With xurl, Birdclaw routes that invocation to the matching named OAuth2 account. With Bird, Birdclaw cannot switch cookie jars itself and instead refuses the operation when bird whoami does not match. Put {"accounts":{"default":"steipete"}} in config.json to omit the repeated flag. This selects an existing row only; it does not change the database default or persist credential identity.
Supported modes differ by command; use birdclaw sync <command> --help.
#Security
- xurl stores developer-app credentials and OAuth tokens under
~/.xurl. - Native
weband bird use browser session cookies. TreatAUTH_TOKEN(auth_token) andCT0(ct0) as full account credentials. - Use archive-only mode when live access is unnecessary.
- Set
BIRDCLAW_DISABLE_LIVE_WRITES=1for development or dry runs.
For multiple Birdclaw accounts, use --account <username> or a stored account ID on commands that support it. See Configuration.