# WishNinja — TODO

Lightweight backlog for the project. Check items off as they land; move to Gitea Issues if the
list outgrows a single file.

## Cleanup
- [ ] Remove dead `IdentityNoOpEmailSender.cs` (leftover from the Blazor template scaffold; the
      real sender is `Services/EmailSender.cs`).

## Docs
- [ ] Document deployment in the README: Gitea Actions runner setup (`catthehacker` label mapping),
      Unraid container env vars, and the **Nginx Proxy Manager WebSocket toggle** required for Blazor.

## Features / polish
- [ ] Let users edit their own **display name** (Account → Manage).
- [ ] Tag releases (`v0.1.0`, …) so CI also publishes versioned images alongside `:latest`.
- [ ] Blazor reconnection UX polish (custom reconnect modal copy).

## Security (revisit if onboarding ever opens beyond a trusted group)
- [ ] Add an SSRF guard to the image-URL fetch (`ImageService.SaveFromUrlAsync`) to block
      private/loopback IP ranges. Low risk while accounts are admin-invite-only.

## Done (for reference)
- [x] Initial build: Blazor + EF Core/SQLite + Identity, owner-hidden claims, admin invites.
- [x] Dockerfile, docker-compose, Gitea Actions CI (test + push image), Unraid template.
- [x] Deployed to Unraid behind Nginx Proxy Manager at https://wish.basso.land.
- [x] Fix: SQLite can't `ORDER BY DateTimeOffset` — order by `Id` instead.
- [x] All item images stored locally (URL inputs downloaded server-side).
