Conversation
Signed-off-by: Xe Iaso <me@xeiaso.net>
Signed-off-by: Xe Iaso <me@xeiaso.net>
Signed-off-by: Xe Iaso <me@xeiaso.net>
Assisted-by: GLM 4.7 via Claude Code (agent teams) Signed-off-by: Xe Iaso <me@xeiaso.net>
Signed-off-by: Xe Iaso <me@xeiaso.net>
Signed-off-by: Xe Iaso <me@xeiaso.net>
This is a simple sponsor panel service implementing the spec in the docs folder. This is the simplest possible thing that could work and should be Good Enough:tm:. Assisted-by: GLM 4.7 via Claude Code Signed-off-by: Xe Iaso <me@xeiaso.net>
Signed-off-by: Xe Iaso <me@xeiaso.net>
Signed-off-by: Xe Iaso <me@xeiaso.net>
Assisted-by: GLM 4.7 via Claude Code Signed-off-by: Xe Iaso <me@xeiaso.net>
Signed-off-by: Xe Iaso <me@xeiaso.net>
Signed-off-by: Xe Iaso <me@xeiaso.net>
Signed-off-by: Xe Iaso <me@xeiaso.net>
Signed-off-by: Xe Iaso <me@xeiaso.net>
Signed-off-by: Xe Iaso <me@xeiaso.net>
Signed-off-by: Xe Iaso <me@xeiaso.net>
Signed-off-by: Xe Iaso <me@xeiaso.net>
There was a problem hiding this comment.
Pull request overview
Adds a new sponsor-panel service (served at sponsors.xeiaso.net) to let GitHub sponsors manage benefits (Discord invite, logo submission, and team invites), alongside a small internal web/htmx static package + extensions and the required build/deploy plumbing.
Changes:
- Introduce the sponsor-panel Go service with GitHub OAuth + dashboard + HTMX endpoints for invites/logo submissions.
- Add an embedded
web/htmxpackage (htmx core + extensions) and Tailwind-based styling pipeline for the sponsor-panel UI. - Add container build + Kubernetes manifests + CI/bake wiring for deploying sponsor-panel.
Reviewed changes
Copilot reviewed 60 out of 64 changed files in this pull request and generated 18 comments.
Show a summary per file
| File | Description |
|---|---|
| web/htmx/websocket.js | Adds HTMX WebSocket extension implementation |
| web/htmx/remove-me.js | Adds HTMX “remove-me” extension |
| web/htmx/path-params.js | Adds HTMX path-parameter substitution extension |
| web/htmx/htmx_templ.go | Generated templ output for HTMX script inclusion |
| web/htmx/htmx.templ | templ component to include htmx.js + extensions |
| web/htmx/htmx.go | Embed+mount HTMX static JS on a mux |
| web/htmx/headers.go | Cache-control helper for static files |
| web/htmx/event-header.js | Adds HTMX request “Triggering-Event” header extension |
| pb/xesite.twirp.go | Regenerated Twirp client/server glue formatting |
| pb/xesite.pb.go | Regenerated protobuf output/version bump |
| pb/external/protofeed/protofeed.pb.go | Regenerated protobuf output/version bump |
| pb/external/mimi/announce/mimi-announce.twirp.go | Regenerated Twirp glue formatting |
| pb/external/mimi/announce/mimi-announce.pb.go | Regenerated protobuf output/version bump |
| pb/external/mi/mi.twirp.go | Regenerated Twirp glue formatting |
| pb/external/mi/mi.pb.go | Regenerated protobuf output/version bump |
| package.json | Adds Tailwind dependencies + sponsor-panel dev script |
| manifest/sponsor-panel/service.yaml | Service for sponsor-panel |
| manifest/sponsor-panel/kustomization.yaml | Kustomize resources for sponsor-panel |
| manifest/sponsor-panel/ingress.yaml | Ingress for sponsors.xeiaso.net |
| manifest/sponsor-panel/deployment.yaml | Deployment for sponsor-panel |
| manifest/sponsor-panel/database.yaml | (Currently commented out in kustomization) CNPG cluster |
| manifest/sponsor-panel/1password.yaml | OnePasswordItem for sponsor-panel secrets |
| internal/adminpb/internal.twirp.go | Regenerated Twirp glue formatting |
| internal/adminpb/internal.pb.go | Regenerated protobuf output/version bump |
| go.mod | Adds templ/go-github/pgx/sessions deps + tool block |
| docker/sponsor-panel.Dockerfile | Build image for sponsor-panel (includes go generate) |
| docker-bake.hcl | Adds sponsor-panel build target |
| cmd/sponsor-panel/templates/oautherror_templ.go | Generated templ output (OAuth error page) |
| cmd/sponsor-panel/templates/oautherror.templ | OAuth error UI |
| cmd/sponsor-panel/templates/login_templ.go | Generated templ output (login page) |
| cmd/sponsor-panel/templates/login.templ | Login page UI |
| cmd/sponsor-panel/templates/helpers.go | Template helper for money formatting |
| cmd/sponsor-panel/templates/formsuccess_templ.go | Generated templ output (success fragments) |
| cmd/sponsor-panel/templates/formsuccess.templ | Success fragments UI |
| cmd/sponsor-panel/templates/formresult_templ.go | Generated templ output (success/error fragment) |
| cmd/sponsor-panel/templates/formresult.templ | Generic success/error fragment UI |
| cmd/sponsor-panel/templates/dashboard_templ.go | Generated templ output (dashboard + cards) |
| cmd/sponsor-panel/templates/dashboard.templ | Dashboard UI + cards |
| cmd/sponsor-panel/templates/base_templ.go | Generated templ output (base layout) |
| cmd/sponsor-panel/templates/base.templ | Base layout (loads CSS + HTMX) |
| cmd/sponsor-panel/tailwind.config.js | Tailwind configuration for sponsor-panel |
| cmd/sponsor-panel/styles.css | Tailwind entrypoint + font imports |
| cmd/sponsor-panel/static/favicon.ico | Sponsor-panel favicon |
| cmd/sponsor-panel/static/css/.gitignore | Ignore generated CSS output |
| cmd/sponsor-panel/oauth.go | OAuth flow + sponsorship checks + session mgmt |
| cmd/sponsor-panel/models.go | DB models + sponsorship tier check helpers |
| cmd/sponsor-panel/migrations.go | Inline SQL schema migration |
| cmd/sponsor-panel/main.go | Sponsor-panel server bootstrap + routes |
| cmd/sponsor-panel/handlers.go | HTMX endpoints for team invite + logo submission |
| cmd/sponsor-panel/generate.go | go:generate Tailwind build + templ generation |
| cmd/sponsor-panel/docs/UX_FLOWS.md | UX spec document |
| cmd/sponsor-panel/docs/SPEC.md | Technical spec document |
| cmd/sponsor-panel/docs/README.md | Executive summary doc |
| cmd/sponsor-panel/dashboard.go | Login/dashboard page handlers |
| cmd/sponsor-panel/CLAUDE.md | Agent pointer file |
| cmd/sponsor-panel/AGENTS.md | Agent/build/run notes |
| .github/workflows/earthly.yml | CI runner change + publish sponsor-panel image tag |
| .claude/skills/templ-syntax/SKILL.md | Internal agent skill doc |
| .claude/skills/templ-http/SKILL.md | Internal agent skill doc |
| .claude/skills/templ-htmx/SKILL.md | Internal agent skill doc |
| .claude/skills/templ-components/SKILL.md | Internal agent skill doc |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| // Get uploaded file | ||
| file, header, err := r.FormFile("logo") | ||
| if err != nil { | ||
| slog.Error("logoHandler: failed to get logo file", "err", err) | ||
| renderError(w, "Logo file required", http.StatusBadRequest) | ||
| return | ||
| } | ||
| defer file.Close() | ||
|
|
||
| slog.Debug("logoHandler: received logo file", | ||
| "user_id", user.ID, | ||
| "company", companyName, | ||
| "filename", header.Filename, | ||
| "size", header.Size) |
There was a problem hiding this comment.
The uploaded logo file is never uploaded anywhere (not attached to the created GitHub issue, not stored in DB/object storage, and not included in the issue body). As written, this silently discards the sponsor’s logo while reporting success. Either implement actual storage/upload (e.g., S3 or commit to a repo) or change the form to collect a URL/attachment instructions instead of a file upload.
Signed-off-by: Xe Iaso <me@xeiaso.net>
Signed-off-by: Xe Iaso <me@xeiaso.net>
Signed-off-by: Xe Iaso <me@xeiaso.net>
Signed-off-by: Xe Iaso <me@xeiaso.net>
A small panel at https://sponsors.xeiaso.net that allows sponsors to manage benefits of sponsorship including:
Assisted-by: GLM 4.7 via Claude Code