ab86dbdf5987892996569616412277a07e46724b
Append-only history of person properties and cohort definitions, since the free tier overwrites the live person / prunes data. A new row is written only when the payload changes (hash compare), so the tables stay a compact change-timeline rather than a daily full copy. - `PosthogPersonSnapshot` (personId join key to PosthogEvent.personId, all distinct_ids, properties JSONB, propertiesHash). - `PosthogCohortSnapshot` (cohortId, name, count, filters, stateHash). - `listPersons` / `listCohorts` REST helpers (next-pagination) in posthog.ts. - `stableHash` (sorted-key JSON hash) in hash.ts for change detection. - `posthog-identity-archive` job wired @03:00 daily. Latest-hash lookup via one DISTINCT ON query, inserts only changed rows via createMany. Verified against prod: 242 persons → 242 snapshots on first run, 0 on immediate re-run (change detection). 0 cohorts currently → graceful no-op. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Süper Panel
Internal admin panel — sp.semih.ai — Tailscale-only access.
Phase 0 skeleton: Next.js 16 + Better Auth (email/password + TOTP) + Prisma + Postgres + Redis. Deployed on Coolify, fronted by Traefik with Let's Encrypt (Cloudflare DNS-01).
See super-panel-prd.md for the full PRD.
Local dev
pnpm install
cp .env.example .env
# fill DATABASE_URL_PANEL, BETTER_AUTH_SECRET (32+ chars)
pnpm --filter @panel/web prisma:generate
pnpm dev
Production deploy
Pushes to main trigger Coolify deploy via webhook.
Deploy status
First production deploy: 2026-05-13. Live at https://sp.semih.ai (Tailscale only).
Description
Languages
TypeScript
99.2%
CSS
0.4%
Shell
0.2%
Dockerfile
0.2%