Skip to content

v0.3.0

Latest

Choose a tag to compare

@github-actions github-actions released this 29 Jul 18:21
v0.3.0
8e251ab

This is a rewrite rather than a release, and it breaks nearly everything.
If you have scripts on v0.2.0, read this before upgrading.

mbasic is gone

Every version up to v0.2.0 read mbasic.facebook.com, the HTML-only mobile site, and scraped rows out of it.
That site has been shrinking for years and the pages fb depended on now serve a log-in redirect more often than they serve content.

v0.3.0 reads what a signed-out browser is actually served: the Relay store that www.facebook.com ships inline in the page as <script type="application/json" data-sjs> blocks.
The same data the site's own JavaScript renders from, extracted, stitched and parsed.

Every field on every record comes from a different place than it did. Nothing here is a rename.

Eight surfaces, two tiers

fb surfaces
fb tiers
fb routes

Eight places fb reads, from the Comet page and its GraphQL endpoint down to the picture redirect and the Pages directory, and each command declares which one answers it.

Tier 0 needs nothing at all and is where nearly everything lives: pages, profiles, posts, comments, all seven reaction types, photos with alt text, videos with captions and transcripts, events with RSVP counts, and a public group's shell.

Tier 1 is two cookies from a browser you are already signed into, and it buys exactly three things: the timeline past the first post, group discussions, and search.

fb auth import --c-user <id> --xs <token>

There is still no app id, no developer app and no API token anywhere in this tool.

What comes back is claims

fb edges nasa
fb graph nasa --depth 2 --budget 25
fb rdf nasa --format turtle

Nineteen predicates, stable fb://kind/id URIs, and every claim carrying the URL, the surface and the tier that asserted it.
fb rdf and fb export write it as schema.org with RDF-star provenance.

Every record says what it did not see

{"tier":0,"surfaces":["s1","s3"],"sources":["..."],
 "via":{"followers":"s1","likes":"s3","talking_about":"s3"},
 "missed":["comments past the first 20"],
 "fetched_at":"2026-07-29T18:02:57Z"}

via is there because likes and followers are different numbers from different surfaces, and treating them as one field was a bug in every previous version.
missed is there because a post with 532 comments read from a permalink that ships twenty should not look like a post with twenty comments.

Commands that went away

Gone Instead
fb seed fb crawl <seed>... takes references directly
fb crawl --from, stdin Seeds are arguments
fb db query fb query <sql>
fb db --db --store on crawl, db, query, export
fb discover <seed> fb graph walks; fb discover is now the Pages directory
fb archive writing Markdown fb archive writes one read whole: HTML, Relay payloads, headers, record
--surface mbasic|mobile --tier, which caps a tier or pins a surface
-j --workers Requests are serialised and paced with --rate
--since, --until -n and filtering downstream
--raw, --user-agent, --lang, -y fb archive covers what --raw was for

The store schema is new too: three tables, nodes, claims and reads, replacing one table per record type.
An old .db file will not open as a new one. Recrawl.

Commands that arrived

fb id, fb explain, fb surfaces, fb tiers, fb routes and fb fields answer questions about fb rather than about Facebook, and five of the six make no request at all.

fb edges, fb graph, fb rdf and fb export are the claim graph.

fb serve and fb mcp expose the same eighteen read operations over HTTP as NDJSON and over stdio as MCP tools, generated from the operations rather than written a second time.

Exit codes

Nine of them, and exit 4 is the one to handle: Facebook served the log-in page.
Sometimes that is a private thing and sometimes it is a refusal that lifts in about fifteen minutes. The message says which.

The throttle is per URL rather than per address, so when /nasa walls, /nasa/photos usually still answers.

Install

go install github.com/tamnd/facebook-cli/cmd/fb@latest
brew install --cask tamnd/tap/fb
docker run --rm -v ~/data/fb:/data ghcr.io/tamnd/fb:0.3.0 page nasa

Full documentation: https://facebook-cli.tamnd.com