{"id":51524547,"url":"https://github.com/angelerator/nilalytics","last_synced_at":"2026-07-09T20:00:43.031Z","repository":{"id":369083962,"uuid":"1288295645","full_name":"Angelerator/nilalytics","owner":"Angelerator","description":"Batteries-included, OpenTelemetry-native web \u0026 mobile product analytics on DuckLake + your object storage (S3/GCS/R2/Azure). No warehouse, no per-event fees.","archived":false,"fork":false,"pushed_at":"2026-07-06T07:27:44.000Z","size":95,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-08T19:48:09.832Z","etag":null,"topics":["analytics","duckdb","ducklake","lakehouse","mobile-analytics","object-storage","observability","opentelemetry","otlp","product-analytics","quack","self-hosted","web-analytics"],"latest_commit_sha":null,"homepage":"https://angelerator.github.io/nilalytics/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Angelerator.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"docs/security.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-07-03T13:09:55.000Z","updated_at":"2026-07-06T07:27:49.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Angelerator/nilalytics","commit_stats":null,"previous_names":["angelerator/nilalytics"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/Angelerator/nilalytics","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Angelerator%2Fnilalytics","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Angelerator%2Fnilalytics/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Angelerator%2Fnilalytics/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Angelerator%2Fnilalytics/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Angelerator","download_url":"https://codeload.github.com/Angelerator/nilalytics/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Angelerator%2Fnilalytics/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35311289,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-09T02:00:07.329Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["analytics","duckdb","ducklake","lakehouse","mobile-analytics","object-storage","observability","opentelemetry","otlp","product-analytics","quack","self-hosted","web-analytics"],"created_at":"2026-07-08T19:31:57.214Z","updated_at":"2026-07-09T20:00:43.024Z","avatar_url":"https://github.com/Angelerator.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# nilalytics\n\n[![PyPI](https://img.shields.io/pypi/v/nilalytics)](https://pypi.org/project/nilalytics/)\n[![Python](https://img.shields.io/pypi/pyversions/nilalytics)](https://pypi.org/project/nilalytics/)\n[![License: Apache-2.0](https://img.shields.io/badge/license-Apache--2.0-blue)](LICENSE)\n[![Docs](https://img.shields.io/badge/docs-angelerator.github.io-14b8a6)](https://angelerator.github.io/nilalytics/)\n\n**The batteries‑included, OpenTelemetry‑native way to run your own web \u0026 mobile product analytics — on a DuckLake in your object storage.**\n\nnilalytics collects product events, errors, and performance data over\n[OpenTelemetry](https://opentelemetry.io/) (OTLP), stores them in a\n[DuckLake](https://ducklake.select/) lakehouse on any major cloud's object\nstorage, and serves sub‑second reads over DuckDB's [Quack](https://duckdb.org/docs/stable/core_extensions/quack) protocol — no warehouse, no per‑event fees, no data leaving your infrastructure.\n\n- **Web, mobile _and_ backends:** Grafana Faro (web), OpenTelemetry SDKs (mobile + server) → OTLP. Record user actions *and* whether the backend calls behind them succeeded — in one lake.\n- **Runs on any cloud:** S3, MinIO, Google Cloud Storage, Cloudflare R2, or Azure / ADLS Gen2.\n- **Recommendation‑ready:** a curated per‑user `user_events` table, partitioned **subject › date › person**, so \"everything this user did\" is one fast read. Look anyone up by email / account id / phone.\n- **Subjects \u0026 AI usage:** every event is classified — `errors` · `activities` · `ai_usage` · `traceability` — so category reads and LLM/token tracking prune to their own partition.\n- **Small files solved:** DuckLake data inlining + compaction keep streaming writes fast and files healthy.\n- **Bounded storage:** opt‑in data retention drops old events (with a read‑only dry‑run preview).\n- **Batteries included:** funnels, retention, errors, traces, metrics, cross‑device identity.\n- **Secure by default:** token‑authenticated ingest, read‑only query authz, a hardened public gateway.\n\n📖 **Full documentation:** \u003chttps://angelerator.github.io/nilalytics/\u003e\n\n## Install\n\n```bash\npip install nilalytics\n```\n\n\u003e Also works with `pipx install nilalytics` or `uv tool install nilalytics`.\n\u003e Bleeding edge from source: `pip install git+https://github.com/Angelerator/nilalytics`.\n\n## 60‑second local demo\n\n```bash\n# 1. object storage (local MinIO)\nminio server .minio-data --address 127.0.0.1:9100 --console-address 127.0.0.1:9101 \u0026\nmc alias set nila http://127.0.0.1:9100 minioadmin minioadmin\nmc mb --ignore-existing nila/nilalytics\n\n# 2. run the pipeline\nnilalytics server \u0026      # ingest + Quack catalog\nnilalytics gateway \u0026     # public ingest gateway (CORS + tokens)\n\n# 3. send + query\nnilalytics emit --count 200 --persons 5\nnilalytics query report\nnilalytics query subject ai_usage 7                # per-subject read (last 7 days)\nnilalytics query user --key person0@example.com 3  # one person's activity (last 3 days)\n```\n\n## Architecture\n\n```mermaid\nflowchart LR\n  W[\"Web · Grafana Faro\"] --\u003e|OTLP + token| GW\n  M[\"Mobile · OpenTelemetry\"] --\u003e|OTLP + token| GW\n  GW[\"Ingest Gateway\u003cbr/\u003eCORS · tokens · TLS\"] --\u003e SRV[\"OTLP server\u003cbr/\u003e(duckdb-otlp)\"]\n  B[\"Backend services · OpenTelemetry\"] --\u003e|\"OTLP · private net\"| SRV\n  SRV --\u003e LAKE[(\"DuckLake\u003cbr/\u003eDuckDB + Quack catalog\u003cbr/\u003e+ Parquet on object storage\")]\n  LAKE --\u003e READ[\"Reads: DuckDB / DuckDB-WASM\u003cbr/\u003eover Quack\"]\n```\n\n## Acknowledgements\n\nnilalytics stands on the shoulders of giants. Huge thanks to\n[DuckDB](https://duckdb.org/), [DuckLake](https://ducklake.select/) and Quack (DuckDB Labs / DuckDB Foundation),\n[duckdb‑otlp](https://github.com/smithclay/duckdb-otlp) ([@smithclay](https://github.com/smithclay)),\n[OpenTelemetry](https://opentelemetry.io/) (CNCF),\n[Grafana Faro](https://github.com/grafana/faro-web-sdk) (Grafana Labs),\nand [MinIO](https://min.io/) — plus the projects that inspired it:\n[canardstack](https://github.com/smithclay/canardstack),\n[icelight](https://github.com/cliftonc/icelight), and\n[stratif.io](https://stratif.io/).\n\nFull credits and dependency list: [Acknowledgements](https://angelerator.github.io/nilalytics/acknowledgements/).\n\n## License\n\n[Apache‑2.0](LICENSE) © Angelerator\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fangelerator%2Fnilalytics","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fangelerator%2Fnilalytics","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fangelerator%2Fnilalytics/lists"}