# CLAUDE.md This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. ## Commands ```bash # Run all tests with coverage go test -v -coverprofile=coverage.out -coverpkg=./... ./... # Run a single test go test -v -run TestWebhookHandler ./test/diunwebhook/ # Run the app locally go run ./cmd/diunwebhook/ # Build Docker image docker build -t diun-webhook-dashboard . # Run with Docker Compose docker compose up -d ``` CI warns (but does not fail) when coverage drops below 80%. ## Architecture The app is a minimal Go HTTP server that receives [DIUN](https://crazymax.dev/diun/) webhook events and exposes them via a JSON API and static HTML dashboard. All state is in-memory (no persistence). **Package layout:** - `pkg/diunwebhook/` — core library: `DiunEvent` struct, in-memory `updates` map (guarded by `sync.Mutex`), and HTTP handlers (`WebhookHandler`, `UpdatesHandler`) - `cmd/diunwebhook/main.go` — wires the handlers and static file server onto `net/http`'s default mux, listens on `:8080` - `test/diunwebhook/` — external test package (`package diunwebhook_test`) that imports `pkg/diunwebhook`; uses `httptest` for handler tests - `static/` — served verbatim at `/` **Key data flow:** 1. DIUN POSTs JSON to `/webhook` → `WebhookHandler` decodes into `DiunEvent` → stored in `updates[event.Image]` (latest event per image wins) 2. Dashboard JS polls `GET /api/updates` → `UpdatesHandler` returns full map as JSON **Test helpers exposed from the library package** (not part of the public API, only for tests): `GetUpdatesMap()`, `UpdatesReset()`, `UpdateEvent()`.