# iObj Personlig JSON-objekt / "hukommelsesbank" service. Gemmer og gør søgbare små strukturerede memory-objekter — git-commit-noter, AI-recap, mødereferater, 1:1-noter, standups m.m. — på tværs af maskiner, uden at kræve en databaseserver. ## Hvorfor I dag ligger denne slags data spredt i flade filer (`~/.githistory`, `~/.claude_recap.md`, `~/copilot-sessions/*/sessions`), lokalt på én maskine og uden fælles skema eller søgning. iObj samler det i én lille service, der kan tilgås fra enhver maskine. **Bemærk:** Denne version af iObj er selve servicen. Integration af `git-today` / `resume_copilot` / recap-flowet til at skrive ind i iObj er en separat, senere opgave. ## Datamodel Hvert objekt har: - `id` — uuid - `type` — `git_commit` | `session_log` | `recap` | `meeting_note` | `oneonone` | `standup` | `custom` - `created_at` — hvornår objektet blev gemt - `object_date` — datoen objektet handler om (bruges til sharding + datofiltrering) - `project` — valgfrit projektnavn - `tags` — liste af fritekst-tags - `title` / `body` — kort titel + fritekst/markdown-indhold - `payload` — vilkårligt ekstra JSON (fx `{"sha": "...", "participants": [...]}`) - `source_machine` / `source_tool` — hvor og hvorfra objektet blev skrevet Data gemmes i **TinyDB**, ét JSON-fil-shard pr. måned (`data/2026-07.json`) — ingen database-server at drifte, og filstørrelser holdes nede over tid. ## Kør lokalt ```bash python3 -m venv .venv && source .venv/bin/activate pip install -r requirements.txt -r requirements-dev.txt IOBJ_DATA_DIR=./data IOBJ_API_TOKEN=dev-token \ uvicorn iobj.app:app --reload --port 8000 ``` Kør tests: ```bash pytest -q ``` ## API Alle `/objects*` endpoints kræver `Authorization: Bearer ` (auth er slået fra hvis `IOBJ_API_TOKEN` ikke er sat — kun til lokal dev). | Metode | Path | Beskrivelse | |---|---|---| | GET | `/health` | Liveness check | | POST | `/objects` | Opret objekt | | GET | `/objects` | Søg (query params: `type`, `project`, `tag`, `date_from`, `date_to`, `q`, `limit`, `offset`). `q` matcher fritekst i `title`, `body` og `payload`. | | GET | `/objects/date/{date}` | Alle objekter for én dato | | GET | `/objects/{id}` | Hent ét objekt | | PATCH | `/objects/{id}` | Opdater (delvist) | | DELETE | `/objects/{id}` | Slet | ### Eksempler ```bash TOKEN=dev-token BASE=http://localhost:8000 # Opret en recap curl -s -X POST "$BASE/objects" -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{ "type": "recap", "object_date": "2026-07-13", "project": "NordBytes", "tags": ["backend"], "title": "BDD test patterns", "body": "Implementerede Behave step definitions for invoice-flowet.", "source_tool": "manual" }' # Opret en git-commit-note curl -s -X POST "$BASE/objects" -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{ "type": "git_commit", "object_date": "2026-07-13", "project": "DevOpsMCP", "title": "Fix Redis TTL bug", "payload": {"sha": "abc123", "author": "Henrik Jess Nielsen"} }' # Søg alt for NordBytes i juli, der nævner "BDD" curl -s "$BASE/objects?project=NordBytes&date_from=2026-07-01&date_to=2026-07-31&q=BDD" \ -H "Authorization: Bearer $TOKEN" # Alt for én bestemt dag (afløser for git-today's dags-visning) curl -s "$BASE/objects/date/2026-07-13" -H "Authorization: Bearer $TOKEN" ``` ## Deploy - `Dockerfile` — python:3.11-slim, ikke-root bruger, health check på `/health` - `iobj.nomad` — Nomad job (samme mønster som `devops-mcp.nomad`), deployes på `autobox.i80.dk`, exposed via Traefik som `https://iobj.i80.dk` - Data persisteres via Nomad host-volume `iobj-data` → `/app/data` - `IOBJ_API_TOKEN` sættes via Consul KV (`iobj/api/token`), samme mønster som DevOpsMCP's secrets-templates ```bash docker build -t registry.i80.dk/gitea/iobj: . docker push registry.i80.dk/gitea/iobj: nomad job run -var="image_tag=" iobj.nomad curl -sf https://iobj.i80.dk/health ``` ## Miljøvariabler | Variabel | Default | Beskrivelse | |---|---|---| | `IOBJ_DATA_DIR` | `data` | Sti til mappen med TinyDB-shards | | `IOBJ_API_TOKEN` | (unset) | Bearer-token for alle `/objects*` kald. Auth deaktiveret hvis unset — sæt altid i netværksdeploy | | `IOBJ_LOG_LEVEL` | `INFO` | Log-niveau | | `PORT` | `8000` | Lytteport (styres af Nomad i produktion) |