nginx includes auth_enabled.conf, (re)written at container start from
BASIC_AUTH_USER/PASSWORD (htpasswd via apache2-utils). Both set => the site +
/api require a shared login; unset => open (local dev not locked out). Set both
on the Coolify web service to protect the deployment.
Add POST /api/export {projectIds}: one folder per project (named after it),
photos named <lastname-firstname>.<ext>, with a generated initials SVG for
Members without a Slack photo. Dedupe image fetches, bounded concurrency, fflate
zip. Factor data.ts so routes + export share one fixtures/live gating path.
Frontend: Export-photos button downloads the zip.
ProjectPicker becomes a searchable multi-select (chips + checklist). App renders
one ProjectGroup per selected project (a Person on several appears in each), with
per-group member/photo counts. Surface Slack status (degraded/unconfigured) and a
Refresh-avatars button that re-sweeps the directory and reloads groups.
Rework cache to a slack_directory snapshot + refreshed_at (ADR-0001). Sweep the
workspace via users.list (skip deleted/bots), match Members by email in memory,
30-day TTL. Members response carries slack status (ok|degraded|unconfigured);
degrade to initials on Slack failure. Add POST /api/slack/refresh.
Napta uses Auth0 M2M, not a static token: exchange client_id/secret for a cached
JWT, then list non-archived projects via JSON:API (include client name). Falls back
to fixtures when NAPTA_CLIENT_ID/SECRET are unset. Member resolution still stubbed.
Coolify honors host port bindings in the compose and the host already has :80
(its own proxy) and :8000 allocated, so publishing them fails the deploy at
container start. Switch web/api to expose-only; nginx still reaches api over the
compose network, and Coolify routes the domain via docker_compose_domains. Add a
docker-compose.override.yml so local 'docker compose up' still publishes ports.
Vite + Vue 3 + DaisyUI SPA (project picker + Slack avatar member grid) with a
TypeScript/Node (Hono) backend proxying Napta + Slack, SQLite avatar cache via
node:sqlite, and docker-compose for Coolify deploy.