No description
  • Go 79.8%
  • templ 6.7%
  • TypeScript 5.9%
  • Shell 4.9%
  • JavaScript 1.7%
  • Other 1%
Find a file
Colja Vendel e10afa8213
All checks were successful
ci / gates (push) Successful in 6m33s
deploy / build-push-deploy (push) Successful in 4m46s
docs(debug): resolve sse-lifecycle-idle-reconnect — live-verified
Deploy run #290 (commit 2bdd45f): ci.yaml + deploy.yaml both green,
prod-smoke gate passed end-to-end including prod-smoke-sse-lifecycle.spec.ts
(the exact spec that surfaced this defect on run #288). Rollback streak
reset to 0. Moved to resolved/.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-04 10:27:30 +02:00
.bridge Register agent-bridge as a peer, and add the missing 389ds peer 2026-07-27 03:09:22 +02:00
.forgejo/workflows docs(quick-260727-nvm): distinguish the REPORTED streak sequence from the PERSISTED one 2026-07-28 02:40:53 +02:00
.planning docs(debug): resolve sse-lifecycle-idle-reconnect — live-verified 2026-08-04 10:27:30 +02:00
.toolchain feat(quick-260721-gwo): shared rollback-streak script + kubectl provisioning 2026-07-21 12:34:59 +02:00
assets feat(09-03): mark assistant turns with voluntary M4 attribution attributes 2026-07-29 17:30:09 +02:00
cmd feat(10-09): remove dead whatsApp fields from pages.go, assistant.go, main.go 2026-08-03 02:43:10 +02:00
compliance docs(compliance): compile counsel handoff package for v1.0 launch 2026-07-17 02:45:32 +02:00
db/queries feat(quick-260702-x23): add ListConversations/GetConversation queries + repo wrappers 2026-07-03 12:20:31 +02:00
deploy docs(10-08): mark CONT-03 retired in REQUIREMENTS.md; drop WhatsApp from LAUNCH-CHECKLIST.md 2026-08-03 02:37:08 +02:00
e2e test(10-07): drop wa.me assertions from ix_takeover and ingress_sse specs 2026-08-03 02:32:37 +02:00
internal fix(ix): redeliver an assistant reply lost to a mid-turn eviction 2026-08-04 10:15:07 +02:00
migrations fix(04): add pending_copies UNIQUE(consent_id) + InsertPendingCopy upsert (WR-02) 2026-06-22 09:36:54 +02:00
scripts feat(quick-260727-nvm): announce every rollback the moment it fires, from BOTH callers 2026-07-28 02:01:41 +02:00
.dockerignore feat(07-04): multi-stage distroless Dockerfile + .dockerignore 2026-06-26 15:34:57 +02:00
.env.example docs(10-10): reword residual "WhatsApp" mentions found by the phase's own grep gate 2026-08-03 02:56:49 +02:00
.gitignore feat(quick-260726-03s): add committed agent-bridge config + gitignored MCP wiring 2026-07-26 00:22:19 +02:00
CLAUDE.md docs(bridge): codify full-read + interim-busy-ack session discipline 2026-08-03 08:07:05 +02:00
docker-compose.yml feat(01-01): scaffold Go module, tooling, bootstrap SQL, and Docker guard 2026-06-19 14:10:27 +02:00
Dockerfile feat(07-04): multi-stage distroless Dockerfile + .dockerignore 2026-06-26 15:34:57 +02:00
go.mod fix(deploy): correct stale IX_MODEL chart value causing prod Ix outage 2026-07-15 01:59:10 +02:00
go.sum feat(quick-260630-wwp-01): safe-markdown renderer + SSE rendered event 2026-06-30 23:53:00 +02:00
Makefile fix(04): pin empty SMTP AUTH in test-mail-e2e so .env creds can't leak 2026-06-22 18:29:13 +02:00
migrations.go feat(01-02): migrations, pgxpool, goose bridge, testcontainers helper 2026-06-19 14:19:02 +02:00
README.md docs: refresh STATE.md and README for today's CI/CD stabilization work 2026-07-17 02:05:23 +02:00
sqlc.yaml feat(01-01): scaffold Go module, tooling, bootstrap SQL, and Docker guard 2026-06-19 14:10:27 +02:00

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.