···183183- `update-controller <did> <newController>` — transfer control
184184- `deactivate <did>` — permanently deactivate
185185186186+**Resolution API ([`web/app.py`](web/app.py)):**
187187+188188+A FastAPI server providing HTTP resolution, hosted at `https://api.cow.watch`. Run with:
189189+```bash
190190+uvicorn app:app --host 127.0.0.1 --port 6666
191191+```
192192+- `GET /<did>` — resolve a did:cow DID and return the modified DID document (mirrors the [plc.directory](https://plc.directory) API shape)
193193+- `GET /<did>/describe` — return on-chain state without fetching the wrapped DID document
194194+- `GET /api/config` — return contract address and chain ID (used by the web UI)
195195+196196+A systemd unit file is provided at [`web/cow-api.service`](web/cow-api.service).
197197+198198+**Web UI ([`web/static/index.html`](web/static/index.html)):**
199199+200200+A static single-page app hosted at `https://cow.watch`. Run locally with:
201201+```bash
202202+python3 web/web.py # serves on port 6667
203203+```
204204+- **Resolve** — enter a did:cow DID to fetch and display the DID document, with the current controller and wrapped DID shown as editable fields
205205+- **Create** — construct a did:cow identifier from a controller address and wrapped DID, with an animated reveal
206206+- **Edit** — update the controller or wrapped DID via a MetaMask transaction (visible after resolving; requires wallet connection)
207207+- Deep-linking: `https://cow.watch/#!/did:cow:...` auto-resolves on load
208208+186209## 10. Example DID Document
187210188211This example shows a did:cow ID wrapping a did:plc identity. The resolved document is the underlying did:plc document with three modifications: the `id` is replaced with the did:cow identifier, and a `did:cow` block is added carrying the Ethereum controller address (as a did:pkh DID) and the wrapped DID for client validation.