A web platform for OSINT/GEOINT analysts to archive, reference, and visualize geolocations of armed-conflict events. Interactive map, structured submission flow (coords + source + media + Tiptap proof + tags), community requests, and analyst profiles.
Live at vidit.app (closed beta).
100% open source under AGPL-3.0 — nothing proprietary. Anyone can self-host the platform; modifications deployed as a network service must publish their source under the same license. Monetization on the maintainer's hosted instance (vidit.app) is API rate limits + a small set of paid-only endpoints (alert webhooks, larger exports) — the analyst-facing platform is, and will stay, free. Strategy lives in planning/roadmap.md → Openness & transparency.
promo-readme.mp4
| Layer | Choice |
|---|---|
| Backend | FastAPI (Python 3.12) + SQLAlchemy 2 + GeoAlchemy2 + Alembic |
| Database | PostgreSQL + PostGIS 3 (16 in prod, 18 locally) |
| Auth | Cookie session + double-submit CSRF (JWT payload, PyJWT) + bcrypt + invite codes |
| Storage | AWS S3 + CloudFront (media) |
| Frontend | Next.js 16 (App Router) + TypeScript + Tailwind |
| Map | MapLibre GL JS + CARTO Dark Matter tiles, client-side clustering |
| Editor | Tiptap (rich proof) |
| Hosting | Railway (API + DB) + Vercel (frontend) |
| Package mgmt | uv (backend) + npm (frontend) |
Details and rationale: docs/engineering.md.
vidit/
├── backend/ FastAPI service (uv)
│ ├── app/ routers → services → models, Pydantic schemas
│ ├── alembic/ migrations
│ ├── scripts/ one-off ops scripts (mock admin, demo seeders)
│ └── tests/
├── frontend/ Next.js 16 app (npm)
│ └── src/
│ ├── app/ App Router pages
│ ├── components/
│ ├── contexts/ React context providers (auth, map state)
│ ├── hooks/
│ ├── lib/
│ ├── types/
│ └── proxy.ts default-deny auth + host canonicalisation
├── video/ promo-as-code pipeline (Playwright capture + Remotion render, `make promo`)
├── docs/ api, backups, data-model, design, engineering (technical reference)
├── planning/ roadmap + next (project planning, not user docs)
├── docker/ custom PG image (PostGIS + AGE + pg_cron) + weekly backup cron
├── AGENTS.md project context for AI tools (CLAUDE.md is a one-line `@AGENTS.md` pointer for Claude Code)
├── CHANGELOG.md release history
├── CODE_OF_CONDUCT.md Contributor Covenant 2.1
├── CONTRIBUTING.md PR flow + commits + doc-sync rule
├── LICENSE AGPL-3.0
├── SECURITY.md vulnerability reporting
├── docker-compose.yml PostgreSQL + PostGIS for local dev
├── Makefile init / dev / seed / test entry points
└── .github/workflows/ backend + frontend CI + manual deploy
More detail: docs/engineering.md.
The technical reference is also hosted at docs.vidit.app (MkDocs Material build of docs/).
make init # install + env + db-up + migrate (one-shot bootstrap)
make seed # mock-admin + 50 demo geolocations + admin follows every demo analyst
make dev # FastAPI :8000 + Next.js :3000 in parallel
make test # backend pytestmake help lists every target individually.
- Docker (for PostgreSQL + PostGIS — prod runs PG 16 on Railway; local is PG 18, see
docs/backups.mdfor restore implications) - Python 3.12+ and uv
- Node.js 20+ and npm
make init copies .env.example → .env (backend) and .env.local.example → .env.local (frontend). Defaults are wired for localhost; every var is documented inline in backend/.env.example and frontend/.env.local.example. API docs auto-served at http://localhost:8000/docs.
make seed (or make mock-admin) creates admin@vidit.app / admin directly. To exercise the real invite + registration flow:
- Set
ADMIN_EMAILS=<your-email>inbackend/.envso your account auto-promotes to admin on first login. - Get an invite code: once an admin exists, the
/adminpanel mints them; for the very first one runmake mock-adminto get one. - Register at http://localhost:3000/register with the code.
EMAIL_PROVIDER=console(the local default) prints the confirmation link to backend stdout.
- Database connection failed — ensure
docker-compose up -dis running and nothing else holds port 5432. - Frontend can't reach the API — check
NEXT_PUBLIC_API_URLinfrontend/.env.localishttp://localhost:8000/api/v1. - "Module not found" — re-run
uv sync(backend) /npm install(frontend), ormake installfor both.
cd backend
uv run pytest # run tests
uv run ruff check . # lint
uv run ruff format . # format
uv run alembic revision --autogenerate -m "..." # new migrationcd frontend
npm run lint
npm run buildSee AGENTS.md → Conventions.
Licensed under the GNU Affero General Public License v3.0. See CONTRIBUTING.md, SECURITY.md, and CODE_OF_CONDUCT.md.
The demo content shipped on the landing video and in the seed requests uses real geolocation work from @geo27752, reproduced with their consent. Thanks for letting Vidit show the platform the way analysts actually use it.