Initial build: WishNinja self-hosted gift wishlist manager
Build & Push Docker image / test (push) Failing after 1m33s
Build & Push Docker image / docker (push) Has been skipped

ASP.NET Core Blazor (.NET 10) + EF Core/SQLite + Identity. Features:
- Wishlists & items with local image storage (upload, clipboard paste,
  or URL fetched and stored locally)
- Owner-hidden claims (enforced at the query layer) to preserve surprises
- Admin-invite-only onboarding with email-based password resets
- All state under /data; ships as a single Docker image

Includes Dockerfile, docker-compose, Gitea Actions CI (test + push image),
Unraid template, and xUnit tests (claim privacy, invite lifecycle, image validation).

Co-Authored-By: Claude Opus 4.8 <[email protected]>
This commit is contained in:
Jim Basso
2026-06-10 15:57:42 -05:00
co-authored by Claude Opus 4.8
commit 7dee999759
142 changed files with 66327 additions and 0 deletions
+36
View File
@@ -0,0 +1,36 @@
<?xml version="1.0"?>
<Container version="2">
<Name>WishNinja</Name>
<Repository>your-gitea-host/youruser/wishninja:latest</Repository>
<Registry>your-gitea-host</Registry>
<Network>bridge</Network>
<Privileged>false</Privileged>
<Support/>
<Project/>
<Overview>Self-hosted gift wishlist manager. Create wishlists, claim gifts (hidden from the list owner to keep the surprise), invite-only accounts. All data persists under /data.</Overview>
<Category>Tools: Productivity:</Category>
<WebUI>http://[IP]:[PORT:8080]/</WebUI>
<Icon/>
<ExtraParams/>
<PostArgs/>
<Shell>sh</Shell>
<DonateText/>
<DonateLink/>
<Config Name="WebUI Port" Target="8080" Default="8080" Mode="tcp" Description="HTTP port (terminate TLS at your reverse proxy)" Type="Port" Display="always" Required="true" Mask="false">8080</Config>
<Config Name="Data" Target="/data" Default="/mnt/user/appdata/wishninja" Mode="rw" Description="SQLite database, uploaded images, and data-protection keys" Type="Path" Display="always" Required="true" Mask="false">/mnt/user/appdata/wishninja</Config>
<Config Name="Base URL" Target="WishNinja__BaseUrl" Default="https://wishninja.example.com" Description="Public URL used in invite/reset email links" Type="Variable" Display="always" Required="true" Mask="false"></Config>
<Config Name="Bootstrap Admin Email" Target="SEED_ADMIN_EMAIL" Default="" Description="First-run admin account email" Type="Variable" Display="always" Required="true" Mask="false"></Config>
<Config Name="Bootstrap Admin Password" Target="SEED_ADMIN_PASSWORD" Default="" Description="First-run admin account password" Type="Variable" Display="always" Required="true" Mask="true"></Config>
<Config Name="SMTP Host" Target="WishNinja__Smtp__Host" Default="" Description="SMTP server (leave blank to disable email; invite links still shown in admin UI)" Type="Variable" Display="always" Required="false" Mask="false"></Config>
<Config Name="SMTP Port" Target="WishNinja__Smtp__Port" Default="587" Description="SMTP port" Type="Variable" Display="advanced" Required="false" Mask="false">587</Config>
<Config Name="SMTP Use STARTTLS" Target="WishNinja__Smtp__UseStartTls" Default="true" Description="Use STARTTLS" Type="Variable" Display="advanced" Required="false" Mask="false">true</Config>
<Config Name="SMTP User" Target="WishNinja__Smtp__User" Default="" Description="SMTP username" Type="Variable" Display="advanced" Required="false" Mask="false"></Config>
<Config Name="SMTP Password" Target="WishNinja__Smtp__Password" Default="" Description="SMTP password" Type="Variable" Display="advanced" Required="false" Mask="true"></Config>
<Config Name="SMTP From Address" Target="WishNinja__Smtp__FromAddress" Default="[email protected]" Description="Sender email address" Type="Variable" Display="advanced" Required="false" Mask="false"></Config>
<Config Name="SMTP From Name" Target="WishNinja__Smtp__FromName" Default="WishNinja" Description="Sender display name" Type="Variable" Display="advanced" Required="false" Mask="false">WishNinja</Config>
</Container>