Getting started
Architecture
A Go ingest API, a Next.js dashboard, Postgres, and four MIT client packages. One compose file. No extra workers.
Vector 5 is a monorepo: apps/api (Go), apps/web (Next.js dashboard + marketing), apps/docs (this site), and MIT packages under packages/.
Repository layout
| Path | Role | Licence |
|---|---|---|
apps/api | Go binary v5d — ingest, classify, rollup, query, auth | AGPL-3.0 |
apps/web | Dashboard, marketing site, waitlist | AGPL-3.0 |
apps/docs | Documentation (docs.vector5.ai) | AGPL-3.0 |
packages/tracker | v5.js — ~1 KB browser script | MIT |
packages/middleware | Next / Express / Hono / Workers / Node | MIT |
packages/mcp | stdio MCP server, six tools | MIT |
packages/skills | Ready-made agent prompts | MIT |
What happens on a pageview
- The browser posts
{ d, n, u, r, h, w, p, utm_* }to/api/eventviasendBeacon. - The API looks up the site, loads today's salt, parses the UA, classifies the actor, looks up country, hashes the visitor, discards the IP.
- The row is written to
events. Hourly/daily rollups update in-process. - If the visitor was GPTBot, this step never happened — the middleware posted
/api/hitinstead, withjsExecuted = false.
Storage
Postgres 17. Events and agent hits are partitioned by month. Dashboard queries hit rollups. A storage interface is left so ClickHouse can be added later; it is not required. See ADR 0002.
Auth modes
V5_AUTH_MODE=admin— single operator from.env. Default for self-host and local.V5_AUTH_MODE=supabase— hosted / multi-user. JWT from your Supabase project.
API keys (v5_live_…) are created under Settings and sent as Authorization: Bearer. They are scoped to the team and work for every read route plus MCP.
Something off? Open an issue · Edit on GitHub

