Tokens
Claude, Cursor 등 AI 코딩 도우미 토큰 사용량을 추적·시각화·경쟁
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Personal film analytics: Letterboxd → dbt/DuckDB → Next.js dashboard. Live: https://www.featheranalytics.dev/cinemetrics/
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
809 viewings of 683 films across eight years, from a single Letterboxd account. Enriched via TMDB and OMDb, modeled with dbt in DuckDB, served as a static Next.js dashboard with an ML-powered recommendation engine.
A personal film analytics project that started as a spreadsheet and became an end-to-end pipeline: ingest, model, export, deploy, recommend. The interesting part is not the stack — it is what the data says when you stop lying to it about what it recorded.README 전문 보기 ↗Live: featheranalytics.dev/cinemetrics
A personal film analytics project that started as a spreadsheet and became an end-to-end pipeline: ingest, model, export, deploy, recommend. The interesting part is not the stack — it is what the data says when you stop lying to it about what it recorded.
liked — the 129 pre-Letterboxd rows never recorded liked or is_rewatch. Collapsing the unknowns into false understates the affection rate by 7.4 points. Always filter liked is not null first.star_rating × 20 = rating_100 holds across the 683 rows that arrived carrying both values. Derived in stg_film_log.sql.flowchart LR
subgraph Sources
letterboxd[Letterboxd RSS]
tmdb[TMDB]
omdb[OMDb]
end
subgraph Ingest
update[update.py]
fetch[fetch_candidates.py]
end
subgraph Model
seeds[(seed CSVs)]
dbt[dbt: staging → marts]
db[(DuckDB)]
end
subgraph Publish
export[export_web.py]
train[train_embeddings.py]
json[cinemetrics.json]
r2[Cloudflare R2]
site[GitHub Pages]
drawer[Recommendation drawer]
end
letterboxd --> update
tmdb --> update
tmdb --> fetch
omdb --> update
omdb --> fetch
update --> seeds
fetch --> seeds
seeds --> dbt
dbt --> db
db --> export
db --> train
export --> json
train --> r2
json --> site
r2 --> drawer
drawer --> site
nightly{{Nightly Action}} -.-> update
nightly -.-> fetch
nightly -.-> dbt
nightly -.-> export
nightly -.-> train
film_log.csv (watch history), film_enrichment.csv (rated films), candidate_enrichment.csv (recommendation pool from TMDB similar + popular).transform/models/staging/).dim_film, fct_watches, dim_candidate. The franchise_mapping() macro rolls TMDB collections up into umbrella franchises by collection, film, or director rules.recommend/encode.py). train_embeddings.py exports sparse vectors and R2 serves them; the browser () builds a rating-weighted taste vector and does the similarity math client-side. On a leave-one-out held-out test over liked films, the balanced ranker places the held-out film at median rank 5,089 with 2% in the top 100.| Path | Contents |
|---|---|
recommend/ | Python: ML pipeline (feature encoding, model, explainability) |
ingest/ | Python: TMDB + OMDb enrichment |
transform/ | dbt project (seeds → staging → marts) |
scripts/ | export, candidate fetch, training, R2 upload |
tests/ | pytest: encoding, model, ingest, taste eval |
web/ | Next.js dashboard + recommendation drawer |
data/ | movies.duckdb, ml/ (gitignored) |
make setup # install Python (uv) + Node dependencies
cp .env.example .env # add your TMDB, OMDb, and R2 keys
make build # full pipeline: dbt → export → train → web build
make dev # start Next.js dev server at localhost:3000
See .env.example for the full list of keys.
All targets are defined in the Makefile.
| Command | What it does |
|---|---|
make build | Full pipeline: dbt build → export JSON → train embeddings → web build |
make dev | Start Next.js dev server |
make test | Run all tests: ruff + eslint + dbt + vitest |
make candidates | Fetch candidate films from TMDB (similar + popular) |
make train | Train embeddings (skips if data unchanged) |
make retrain | Force retrain regardless of data changes |
make upload | Upload embeddings to Cloudflare R2 |
make update | Auto-update from Letterboxd RSS |
make docs | Generate the dbt docs site into web/public/dbt/ |
make doc-stats | Refresh the docs' figures and lineage diagram from the built marts |
docs/ARCHITECTURE.md — how the pipeline and infrastructure fit together, plus the data conventions that are easy to get wrong.Letterboxd for the watch log (ingest/letterboxd.py), TMDB for genres/keywords/runtime/budget/revenue/similar films, OMDb for critic scores, box office, and cast. API clients live in ingest/http.py. Primary key: tmdb_id.
The code is MIT-licensed. The seed CSVs under transform/seeds/ are personal data shared for reproducibility, not relicensed.
web/src/lib/recommend.tsupdate-data.yml) fetches Letterboxd RSS, enriches new films, retrains if data changed, uploads to R2, deploys.