Personal data archaeology — analyze your own YouTube + Spotify + Calendar history locally with an autonomous AI agent.
Project description
Echo
Your past, heard back.
Echo turns your Google Takeout (YouTube watches, searches, calendar) and Spotify Extended Streaming History into a queryable local database, then runs an autonomous Claude-powered agent over it. The agent finds chapters in your life from the changepoints in your viewing patterns, writes narrative reflections of each one, and answers free-form questions like "what was I anxious about in early 2024" or "show me my deepest binge sessions" — with evidence trails back to the underlying rows.
It runs entirely on your machine.
Privacy
Echo is a local tool. Your data never leaves your computer except for the LLM API calls you configure (Anthropic, OpenAI, or OpenRouter) — and those calls hit only the providers you set keys for. No telemetry, no analytics, no hosted version, no upload, no sync. You own:
- the SQLite database (
~/.echo/echo.db) - the vector index (
~/.echo/lancedb/) - the reflections written by GPT-4o (in
echo.db) - the embeddings (cached locally)
- your API keys (in
~/.echo/.env, never committed)
When you stop using Echo, you delete ~/.echo/ and that's the end of it.
What do I need?
The only hard requirement is a Google Takeout export. Everything else is optional and can be added later — just re-run the relevant pipeline step.
| What you have | What you can do |
|---|---|
| Google Takeout only | Ingest + detect chapters + engagement signals. Binge Sessions and Agency Map views work. |
| + Anthropic key | Echo Speaks — the autonomous agent that investigates your data and narrates findings. |
| + OpenAI key | Chapter narrative reflections (GPT-4o) + vector embeddings for semantic search. |
| + YouTube Data API key | Video metadata enrichment (title, channel, view count). Free, 10K quota/day. |
| + Spotify history + keys | Spotify plays, listening patterns, cross-modal music + video queries. |
Spotify heads-up: The Extended Streaming History export takes ~30 days from Spotify to deliver. Request it at https://www.spotify.com/account/privacy now if you want Spotify data — you can finish the rest of the setup while you wait.
Hardware: Python 3.11+, ~5 GB disk. Node.js 20+ only if you want to rebuild the UI.
echo init links to every provider's dashboard and walks you through the setup.
Quick start
pip install echo-archaeology
echo init # 5-section interactive wizard; writes ~/.echo/config.toml + .env
echo run # ingest -> enrich -> detect -> signals -> reflect -> embed
echo serve # open http://localhost:8000 (or: docker compose up)
No cloud API key? Install Ollama, run ollama pull llama3.1 && ollama serve, set OLLAMA_BASE_URL=http://localhost:11434 in ~/.echo/.env, and the
agent runs fully local.
From source (for development):
git clone https://github.com/aditya30103/echo.git
cd echo && pip install -e .
Quick-start guide (AI-friendly): INSTALL.md. Full walkthrough: SETUP.md.
CLI reference
echo --help lists everything. Quick map:
| Command | What it does |
|---|---|
echo init |
First-run setup wizard. Pass --non-interactive for scripted/CI use. |
echo run [--from STEP] |
Full pipeline (ingest → enrich → detect → signals → reflect → embed). |
echo doctor |
Sanity-check the install: paths, configured zips, API keys, DB schema. |
echo ingest |
Just load Takeout/Spotify zips into echo.db. |
echo enrich [--key K] |
YouTube Data API enrichment. |
echo enrich-spotify [--dry-run] |
Spotify Web API enrichment. |
echo detect [--penalty N] [--plot] |
PELT changepoint detection. |
echo signals |
Engagement scoring (sessions, autoplay, rewatch, search-driven). |
echo reflect [--dry-run] [--chapter N] [--autobiography] |
GPT-4o reflections. Always run --dry-run first. |
echo embed [--dry-run] [--table T] |
LanceDB vector embedding. |
echo view-reflections |
Render chapter reflections to an HTML page. |
echo serve [--host] [--port] |
Start FastAPI + bundled UI on one port. |
echo migrate-data --from PATH |
One-time: move pre-packaging state into ~/.echo/. |
Status
| Pipeline (ingest → embed) | ✅ shipped |
| Echo Speaks agent (20-round ReAct, 7-tool toolkit, two-block prompt caching) | ✅ shipped |
| SvelteKit UI (Echo Speaks landing, Binge Sessions, Agency Map, Ask Echo) | ✅ shipped |
| Spotify Phase 1 (ingest) + Phase 3 (signals) | ✅ shipped |
| Spotify Phase 2 (enrich_spotify track metadata) | ⏳ quota-blocked; works when unblocked |
| Spotify Phase 3b (embed_spotify_tracks → LanceDB) | ⏳ blocked by Phase 2 |
Packaged CLI (echo command) |
✅ shipped |
| Local Ollama provider (run the agent with no cloud key) | ✅ shipped |
PyPI release (pip install echo-archaeology) |
✅ shipped — release process in RELEASING.md |
| CI (tests + wheel-smoke on every PR) | ✅ shipped |
See TODOS.md for the deferred-work list with context.
Documentation
| Doc | Read it for |
|---|---|
| SETUP.md | First-time install + run, step by step |
| docs/ARCHITECTURE.md | High-level design, module map, tech choices |
| docs/DATA.md | Every table, every column, how it's computed |
| docs/RUNBOOK.md | Operating the pipeline, idempotency contracts, debugging |
| docs/DESIGN.md | Visual design system — two-temperature principle, color tokens, typography, component patterns |
| CLAUDE.md / AGENTS.md | Conventions for AI assistants working on the codebase |
| TODOS.md | Deferred work + ship-blocker tracking |
| annotations.example.yaml | Template for the per-user life-context file |
Tech stack
Python 3.11 (FastAPI + sqlite-utils + LanceDB + ruptures + scikit-learn) + SvelteKit 2 + Anthropic Claude + OpenAI gpt-4o + Datasette (for raw DB browsing). Built and packaged with hatchling. MIT licensed.
License
MIT © 2026 Aditya Arya.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file echo_archaeology-0.1.0.tar.gz.
File metadata
- Download URL: echo_archaeology-0.1.0.tar.gz
- Upload date:
- Size: 187.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dd369bb573c1261b9d79fa4ce0e0c954dc509d77d310da9a06267c1d528b5ede
|
|
| MD5 |
29ac35072f85d0e3404ae74d62b81e84
|
|
| BLAKE2b-256 |
f264f1a4ce445ead6a703cb09043c3bd538cb5ca4c642c3adfb4309955f2b9b3
|
Provenance
The following attestation bundles were made for echo_archaeology-0.1.0.tar.gz:
Publisher:
publish.yml on aditya30103/echo
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
echo_archaeology-0.1.0.tar.gz -
Subject digest:
dd369bb573c1261b9d79fa4ce0e0c954dc509d77d310da9a06267c1d528b5ede - Sigstore transparency entry: 1775040337
- Sigstore integration time:
-
Permalink:
aditya30103/echo@55a8ffc45709501d3b1e41bd76bbbca3400b948e -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/aditya30103
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@55a8ffc45709501d3b1e41bd76bbbca3400b948e -
Trigger Event:
push
-
Statement type:
File details
Details for the file echo_archaeology-0.1.0-py3-none-any.whl.
File metadata
- Download URL: echo_archaeology-0.1.0-py3-none-any.whl
- Upload date:
- Size: 165.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8ebfabfabbd91e88bc17b09dbfdd426ed87474eaef97371889bff999c0882b7e
|
|
| MD5 |
aab7bc2aa9684a4794bbad1d725b37ed
|
|
| BLAKE2b-256 |
ebcfc1fd3e01faef3883557280b3275d7b255d91bfadc995c2a0b9db64c12a22
|
Provenance
The following attestation bundles were made for echo_archaeology-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on aditya30103/echo
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
echo_archaeology-0.1.0-py3-none-any.whl -
Subject digest:
8ebfabfabbd91e88bc17b09dbfdd426ed87474eaef97371889bff999c0882b7e - Sigstore transparency entry: 1775040396
- Sigstore integration time:
-
Permalink:
aditya30103/echo@55a8ffc45709501d3b1e41bd76bbbca3400b948e -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/aditya30103
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@55a8ffc45709501d3b1e41bd76bbbca3400b948e -
Trigger Event:
push
-
Statement type: