- Go 79.8%
- templ 6.7%
- TypeScript 5.9%
- Shell 4.9%
- JavaScript 1.7%
- Other 1%
Deploy run #290 (commit
|
||
|---|---|---|
| .bridge | ||
| .forgejo/workflows | ||
| .planning | ||
| .toolchain | ||
| assets | ||
| cmd | ||
| compliance | ||
| db/queries | ||
| deploy | ||
| e2e | ||
| internal | ||
| migrations | ||
| scripts | ||
| .dockerignore | ||
| .env.example | ||
| .gitignore | ||
| CLAUDE.md | ||
| docker-compose.yml | ||
| Dockerfile | ||
| go.mod | ||
| go.sum | ||
| Makefile | ||
| migrations.go | ||
| README.md | ||
| sqlc.yaml | ||
xi2ix.com
The corporate website for xi2ix d.o.o., a Croatia-based consultancy founded by Colja Vendel. The site is trilingual — English (primary), German, Croatian — and is engineered first and foremost to radiate unconditional, immediate trust: a "digital business card" built to withstand KYC/due-diligence scrutiny from Croatian banks, authorities, and partners. Its design register is Hanseatic Minimalist — deep blues, slate, generous whitespace, quiet confidence — deliberately free of startup hype or buzzword bingo. The site's centerpiece is Ix, a self-hosted, fact-grounded AI conversational assistant. Ix is not a generic chatbot: it draws out who a visitor is and what they need, is guardrailed to never fabricate company facts, and closes by proposing a warm, pre-drafted handoff to the founder.
Live at xi2ix.com, xi2ix.de, xi2ix.at, and xi2ix.ch (apex +
www on each), all served from the same deployment with per-domain
locale defaults and valid Let's Encrypt certificates.
Tech stack
- Go (module
xi2ix.com/website,go 1.26) + templ + htmx/SSE — server-rendered, minimal-JS frontend - chi — HTTP routing/middleware
- PostgreSQL + pgvector — relational data and AI-grounding retrieval (existing k3s cluster in production; a local Podman container in dev)
- Ollama, self-hosted — runs the Ix LLM; no external AI API (data sovereignty)
- go-i18n/v2 — EN/DE/HR translation catalogs
- Playwright — GUI acceptance tests
See CLAUDE.md for the full stack rationale, version pins, and engineering
conventions.
Dev quickstart
Go is installed project-locally — there is no system-wide Go on this project.
# One-time (fresh clone only): download + SHA256-verify the pinned Go toolchain
./.toolchain/install.sh
# Every shell session: activate the project-local toolchain
source .toolchain/env.sh
Containers run on rootless Podman (no Docker daemon). One-time host setup:
systemctl --user enable --now podman.socket
Copy the environment template and fill in the values your local run needs
(at minimum OLLAMA_HOST, FORM_SECRET, POSTGRES_PASSWORD,
XI2IX_APP_DB_PASSWORD — see the comments in the file for the rest):
cp .env.example .env
Bring up the dev environment and start the server:
make dev-up # starts Postgres+pgvector, waits for it, bootstraps the
# DB role/extension, builds frontend assets (templ + CSS)
go run ./cmd/server # applies goose migrations at boot, then serves
make dev-up followed by go run ./cmd/server is the documented first-run
sequence — make migrate is not part of normal dev flow (the server
migrates itself at boot).
Run the tests:
make test # fast unit tests, no containers required
make test-integration # full suite, including testcontainers (needs the Podman socket)
make e2e # Playwright acceptance tests
Repo layout
| Path | What's there |
|---|---|
assets/ |
Fonts, CSS, and JS — including vendored htmx + htmx-ext-sse and ix.js |
cmd/server |
The main binary: boots, runs migrations, serves the site |
cmd/ingest |
Read-only corpus provenance/validation CLI (no DB/network access) |
compliance/ |
GDPR/DSA/EAA scope memos, breach runbook, retention schedule, DSAR procedure |
db/queries |
Hand-written SQL used to generate type-safe query code (sqlc) |
deploy/ |
Helm chart (deploy/chart), cluster manifests (deploy/cluster), and the deploy/handoff docs (see Deployment below) |
e2e/ |
Playwright TypeScript project — specs, fixtures, playwright.config.ts |
internal/ |
The Go application itself: admin, antispam, brandterms, config, contact, corpus, db, email, i18n, ix (the Ix assistant — conversation, guardrails, SSE handler, handoff), ollama (the Ollama client), pages, repo, routes, server, testsupport, views (templ components) |
migrations/ |
Goose SQL migrations |
scripts/ |
bootstrap.sql, restore-drill.sh, secrets-scan.sh, xss-ssti-scan.sh |
Deployment
Deployment is documented separately from this README, with clear ownership
boundaries between this project and the surrounding infrastructure ("Umgebungsmanagement").
Start with deploy/RUNBOOK-deploy.md for the deploy procedure itself, and
deploy/ENVIRONMENT-HANDOFF.md for the checklist of what a third-party
environment owner needs to supply (kubeconfig, DSN, certificate) versus what
this project never needs to know (cluster identity, cert/key location, DB
topology).
Further reading
CLAUDE.md— full engineering conventions, stack rationale, and the AI-assistant-facing workflow rules for this repo..planning/— GSD project history and planning artifacts:.planning/STATE.md(current status),.planning/PROJECT.md(requirements/context),.planning/ROADMAP.md(phase roadmap), plus.planning/phases/and.planning/quick/for the underlying planning documents.