Case study / Personal data infrastructure / 2026

Meta Archive Explorer

Facebook exports are exhaustive, fragmented, and almost impossible to explore. I built a private, localhost-only system that turns a 40+ GiB export into a provenance-preserving archive: deduplicated, searchable, and browsable across conversations, media, people, activity, time, and derived semantics.

A FastAPI service and SQLite/Alembic data model handle ingestion, reconciliation, API access, and source identity. A React and TypeScript dashboard makes 1.3M+ messages usable, while LanceDB, local embeddings, and reranking add semantic retrieval without separating results from their original context.

Messages indexed
1.3M+
Source archive
40+ GiB
Source files
80K+
Unique blobs
55K+
Application views
17
Retrieval modes
4

An archive that keeps its receipts

Every source file is inventoried and hashed. Duplicate bytes become immutable content-addressed blobs, while source coordinates, collisions, and reconstruction manifests remain intact. The archive becomes easier to use without erasing how it was assembled.

Archive receiptLocal only
Inventory
80K+ source files
Identity
SHA-256 + source coordinates
Storage
55K+ immutable blobs
Reconstruction
Manifest-backed
Real archive aggregates / No names, message text, or conversation identifiers shown

Many ways in, one source of truth

The same retained records can be explored as conversations, media, chronological activity, or aggregate patterns. Deep links return every derived view to its source.

Conversation ledger1,744 histories
virtualized · cursor-paged

Filter direct, group, and system histories; jump by date; search within a thread; inspect attachments, reactions, calls, and provenance boundaries.

Starred

One private collection across conversations, messages, media, activity, events, and people.

Identity repair

Audited, undoable merge and split corrections preserve every original source coordinate.

Deletion

Revision-bound preview, reversible quarantine, restore, and guarded purge across derived data.

Retrieval that keeps its receipts

Search can be lexical, exact-literal, semantic, or hybrid. Hybrid mode combines full-text and vector rankings, reranks a bounded candidate set locally, and preserves context plus an exact jump back to the retained record.

  1. 01Speaker-labelled windowsMessages, transcripts, activity, and extracted text
  2. 02Local BGE embeddingsPinned 768-dimensional model with explicit health state
  3. 03LanceDB + hybrid fusionExact cosine search and reciprocal-rank fusion
  4. 04CPU cross-encoderBounded reranking with stable result identities
  5. 05Source jumpOriginal conversation, timestamp, and surrounding context

Local enrichment

Resumable audio transcription, sandboxed document extraction, versioned sentiment, emotion, and toxicity estimates, topic clusters, and six-way NLI conflict review. Model output is visibly derived, provenance-labelled, and never presented as ground truth.

Private by construction

The default product path stays on one machine. Security and deletion semantics are part of the data model, not a privacy paragraph added after the screenshots looked nice.

SourceMultipart exportsInventory · normalized paths · SHA-256
StorageImmutable content-addressed blobsDeduplication · collision retention · reconstruction
CatalogSQLite + Alembic + full-text + LanceDBRelational migrations · stable identities · vectors · analytics
ServiceFastAPI on loopbackOne-time token · HttpOnly session · guarded attachments
InterfaceReact + TypeScript dashboardVirtualized views · deep links · responsive exploration

Security posture

Loopback-only binding, strict Host, Origin, and CSRF checks, restrictive content security policy, and no automatic external-media fetches. Optional cloud RAG is explicit and bounded; ordinary browsing, search, and enrichment remain local.

Python · FastAPI · SQLite · Alembic · React · TypeScript · TanStack · ECharts · LanceDB · ONNX Runtime · Playwright