gocast
gocast copied to clipboard
Add extensible site theme system with Christmas theme
Motivation and Context
Enable admins to activate seasonal themes (e.g., Christmas) site-wide for all users, with an extensible architecture for adding future themes.
Description
Implements a theme system with admin controls and a Christmas theme featuring animated snowflakes.
Backend:
-
model/site-settings.go:SiteSettingkey-value model,Themestruct,AvailableThemes()registry -
dao/site-settings.go:SiteSettingsDaofor persistence -
api/site-settings.go: Theme endpoints (GET /api/theme/active,GET /api/theme/available,PUT /api/theme/active)
Frontend:
-
web/ts/theme-manager.ts: Singleton that fetches active theme on page load, applies effects globally -
web/assets/css/themes.css: Snowflake animations withprefers-reduced-motionsupport - Admin UI in Maintenance page for theme selection
Adding new themes:
// 1. model/site-settings.go
const ThemeHalloween ThemeID = "halloween"
// In AvailableThemes():
{ID: ThemeHalloween, Name: "Halloween", Description: "Spooky theme", Icon: "fa-ghost"}
// 2. web/ts/theme-manager.ts
class HalloweenTheme implements ThemeEffects { ... }
// Register in themeEffects map
Steps for Testing
Prerequisites:
- 1 Admin user
- Log in as admin
- Navigate to Admin → Maintenance
- In "Site Theme" section, select "Christmas"
- Verify snowflakes appear across all pages
- Open in incognito/different browser to confirm theme applies to all users
- Select "Default" to disable
Screenshots
[!WARNING]
Firewall rules blocked me from connecting to one or more addresses (expand for details)
I tried to connect to the following addresses, but was blocked by firewall rules:
dario.cat
- Triggering command:
/update-job-proxy /update-job-proxy github.com/TUM-D-c -lang=go1.24 /opt/hostedtoolclog -uns _base.go r/runc-log.json bash -c=4 -nolocalimports -importcfg /opt/hostedtoolcHEAD -ato -bool r/runc-log.json /opt/hostedtoolcache/go/1.24.10/x64/pkg/tool/linux_amd64/vet -errorsas -ifaceassert -nilfunc /opt/hostedtoolcfilter(dns block)- Triggering command:
/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 5495d30143fbecc5--format=format:%H %ct %D /bin/git --detach od /bin/git /usr/bin/git init a89987915194adde--depth=1 ce50ae9e:go.mod /bin/git om/spf13/cobra 42642302:go.mod /usr/lib/git-cor-t git(dns block)- Triggering command:
/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT bbc7f005:go.mod /home/dependabotrefs/tags/v2.4.0 --pack_header=2,/usr/bin/git REDACTED /bin/git git conf tformat /usr/bin/git e/git =2 d7cf7b34:go.mod /bin/git e/git(dns block)filippo.io
- Triggering command:
/update-job-proxy /update-job-proxy github.com/TUM-D-c -lang=go1.24 /opt/hostedtoolclog -uns _base.go r/runc-log.json bash -c=4 -nolocalimports -importcfg /opt/hostedtoolcHEAD -ato -bool r/runc-log.json /opt/hostedtoolcache/go/1.24.10/x64/pkg/tool/linux_amd64/vet -errorsas -ifaceassert -nilfunc /opt/hostedtoolcfilter(dns block)- Triggering command:
/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 5495d30143fbecc5--format=format:%H %ct %D /bin/git --detach od /bin/git /usr/bin/git init a89987915194adde--depth=1 ce50ae9e:go.mod /bin/git om/spf13/cobra 42642302:go.mod /usr/lib/git-cor-t git(dns block)- Triggering command:
/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT bbc7f005:go.mod /home/dependabotrefs/tags/v2.4.0 --pack_header=2,/usr/bin/git REDACTED /bin/git git conf tformat /usr/bin/git e/git =2 d7cf7b34:go.mod /bin/git e/git(dns block)go.etcd.io
- Triggering command:
/update-job-proxy /update-job-proxy github.com/TUM-D-c -lang=go1.24 /opt/hostedtoolclog -uns _base.go r/runc-log.json bash -c=4 -nolocalimports -importcfg /opt/hostedtoolcHEAD -ato -bool r/runc-log.json /opt/hostedtoolcache/go/1.24.10/x64/pkg/tool/linux_amd64/vet -errorsas -ifaceassert -nilfunc /opt/hostedtoolcfilter(dns block)- Triggering command:
/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 5495d30143fbecc5--format=format:%H %ct %D /bin/git --detach od /bin/git /usr/bin/git init a89987915194adde--depth=1 ce50ae9e:go.mod /bin/git om/spf13/cobra 42642302:go.mod /usr/lib/git-cor-t git(dns block)- Triggering command:
/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT bbc7f005:go.mod /home/dependabotrefs/tags/v2.4.0 --pack_header=2,/usr/bin/git REDACTED /bin/git git conf tformat /usr/bin/git e/git =2 d7cf7b34:go.mod /bin/git e/git(dns block)go.googlesource.com
- Triggering command:
/update-job-proxy /update-job-proxy github.com/TUM-D-c -lang=go1.24 /opt/hostedtoolclog -uns _base.go r/runc-log.json bash -c=4 -nolocalimports -importcfg /opt/hostedtoolcHEAD -ato -bool r/runc-log.json /opt/hostedtoolcache/go/1.24.10/x64/pkg/tool/linux_amd64/vet -errorsas -ifaceassert -nilfunc /opt/hostedtoolcfilter(dns block)- Triggering command:
/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 5495d30143fbecc5--format=format:%H %ct %D /bin/git --detach od /bin/git /usr/bin/git init a89987915194adde--depth=1 ce50ae9e:go.mod /bin/git om/spf13/cobra 42642302:go.mod /usr/lib/git-cor-t git(dns block)- Triggering command:
/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT bbc7f005:go.mod /home/dependabotrefs/tags/v2.4.0 --pack_header=2,/usr/bin/git REDACTED /bin/git git conf tformat /usr/bin/git e/git =2 d7cf7b34:go.mod /bin/git e/git(dns block)go.uber.org
- Triggering command:
/update-job-proxy /update-job-proxy github.com/TUM-D-c -lang=go1.24 /opt/hostedtoolclog -uns _base.go r/runc-log.json bash -c=4 -nolocalimports -importcfg /opt/hostedtoolcHEAD -ato -bool r/runc-log.json /opt/hostedtoolcache/go/1.24.10/x64/pkg/tool/linux_amd64/vet -errorsas -ifaceassert -nilfunc /opt/hostedtoolcfilter(dns block)- Triggering command:
/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 5495d30143fbecc5--format=format:%H %ct %D /bin/git --detach od /bin/git /usr/bin/git init a89987915194adde--depth=1 ce50ae9e:go.mod /bin/git om/spf13/cobra 42642302:go.mod /usr/lib/git-cor-t git(dns block)- Triggering command:
/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT bbc7f005:go.mod /home/dependabotrefs/tags/v2.4.0 --pack_header=2,/usr/bin/git REDACTED /bin/git git conf tformat /usr/bin/git e/git =2 d7cf7b34:go.mod /bin/git e/git(dns block)google.golang.org
- Triggering command:
/update-job-proxy /update-job-proxy github.com/TUM-D-c -lang=go1.24 /opt/hostedtoolclog -uns _base.go r/runc-log.json bash -c=4 -nolocalimports -importcfg /opt/hostedtoolcHEAD -ato -bool r/runc-log.json /opt/hostedtoolcache/go/1.24.10/x64/pkg/tool/linux_amd64/vet -errorsas -ifaceassert -nilfunc /opt/hostedtoolcfilter(dns block)- Triggering command:
/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 5495d30143fbecc5--format=format:%H %ct %D /bin/git --detach od /bin/git /usr/bin/git init a89987915194adde--depth=1 ce50ae9e:go.mod /bin/git om/spf13/cobra 42642302:go.mod /usr/lib/git-cor-t git(dns block)- Triggering command:
/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT bbc7f005:go.mod /home/dependabotrefs/tags/v2.4.0 --pack_header=2,/usr/bin/git REDACTED /bin/git git conf tformat /usr/bin/git e/git =2 d7cf7b34:go.mod /bin/git e/git(dns block)gopkg.in
- Triggering command:
/update-job-proxy /update-job-proxy github.com/TUM-D-c -lang=go1.24 /opt/hostedtoolclog -uns _base.go r/runc-log.json bash -c=4 -nolocalimports -importcfg /opt/hostedtoolcHEAD -ato -bool r/runc-log.json /opt/hostedtoolcache/go/1.24.10/x64/pkg/tool/linux_amd64/vet -errorsas -ifaceassert -nilfunc /opt/hostedtoolcfilter(dns block)- Triggering command:
/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 5495d30143fbecc5--format=format:%H %ct %D /bin/git --detach od /bin/git /usr/bin/git init a89987915194adde--depth=1 ce50ae9e:go.mod /bin/git om/spf13/cobra 42642302:go.mod /usr/lib/git-cor-t git(dns block)- Triggering command:
/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT bbc7f005:go.mod /home/dependabotrefs/tags/v2.4.0 --pack_header=2,/usr/bin/git REDACTED /bin/git git conf tformat /usr/bin/git e/git =2 d7cf7b34:go.mod /bin/git e/git(dns block)gorm.io
- Triggering command:
/update-job-proxy /update-job-proxy github.com/TUM-D-c -lang=go1.24 /opt/hostedtoolclog -uns _base.go r/runc-log.json bash -c=4 -nolocalimports -importcfg /opt/hostedtoolcHEAD -ato -bool r/runc-log.json /opt/hostedtoolcache/go/1.24.10/x64/pkg/tool/linux_amd64/vet -errorsas -ifaceassert -nilfunc /opt/hostedtoolcfilter(dns block)- Triggering command:
/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 5495d30143fbecc5--format=format:%H %ct %D /bin/git --detach od /bin/git /usr/bin/git init a89987915194adde--depth=1 ce50ae9e:go.mod /bin/git om/spf13/cobra 42642302:go.mod /usr/lib/git-cor-t git(dns block)- Triggering command:
/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT bbc7f005:go.mod /home/dependabotrefs/tags/v2.4.0 --pack_header=2,/usr/bin/git REDACTED /bin/git git conf tformat /usr/bin/git e/git =2 d7cf7b34:go.mod /bin/git e/git(dns block)moul.io
- Triggering command:
/update-job-proxy /update-job-proxy github.com/TUM-D-c -lang=go1.24 /opt/hostedtoolclog -uns _base.go r/runc-log.json bash -c=4 -nolocalimports -importcfg /opt/hostedtoolcHEAD -ato -bool r/runc-log.json /opt/hostedtoolcache/go/1.24.10/x64/pkg/tool/linux_amd64/vet -errorsas -ifaceassert -nilfunc /opt/hostedtoolcfilter(dns block)- Triggering command:
/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 5495d30143fbecc5--format=format:%H %ct %D /bin/git --detach od /bin/git /usr/bin/git init a89987915194adde--depth=1 ce50ae9e:go.mod /bin/git om/spf13/cobra 42642302:go.mod /usr/lib/git-cor-t git(dns block)- Triggering command:
/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT bbc7f005:go.mod /home/dependabotrefs/tags/v2.4.0 --pack_header=2,/usr/bin/git REDACTED /bin/git git conf tformat /usr/bin/git e/git =2 d7cf7b34:go.mod /bin/git e/git(dns block)mvdan.cc
- Triggering command:
/update-job-proxy /update-job-proxy github.com/TUM-D-c -lang=go1.24 /opt/hostedtoolclog -uns _base.go r/runc-log.json bash -c=4 -nolocalimports -importcfg /opt/hostedtoolcHEAD -ato -bool r/runc-log.json /opt/hostedtoolcache/go/1.24.10/x64/pkg/tool/linux_amd64/vet -errorsas -ifaceassert -nilfunc /opt/hostedtoolcfilter(dns block)- Triggering command:
/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 5495d30143fbecc5--format=format:%H %ct %D /bin/git --detach od /bin/git /usr/bin/git init a89987915194adde--depth=1 ce50ae9e:go.mod /bin/git om/spf13/cobra 42642302:go.mod /usr/lib/git-cor-t git(dns block)- Triggering command:
/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT bbc7f005:go.mod /home/dependabotrefs/tags/v2.4.0 --pack_header=2,/usr/bin/git REDACTED /bin/git git conf tformat /usr/bin/git e/git =2 d7cf7b34:go.mod /bin/git e/git(dns block)nullprogram.com
- Triggering command:
/update-job-proxy /update-job-proxy github.com/TUM-D-c -lang=go1.24 /opt/hostedtoolclog -uns _base.go r/runc-log.json bash -c=4 -nolocalimports -importcfg /opt/hostedtoolcHEAD -ato -bool r/runc-log.json /opt/hostedtoolcache/go/1.24.10/x64/pkg/tool/linux_amd64/vet -errorsas -ifaceassert -nilfunc /opt/hostedtoolcfilter(dns block)- Triggering command:
/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 5495d30143fbecc5--format=format:%H %ct %D /bin/git --detach od /bin/git /usr/bin/git init a89987915194adde--depth=1 ce50ae9e:go.mod /bin/git om/spf13/cobra 42642302:go.mod /usr/lib/git-cor-t git(dns block)- Triggering command:
/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT bbc7f005:go.mod /home/dependabotrefs/tags/v2.4.0 --pack_header=2,/usr/bin/git REDACTED /bin/git git conf tformat /usr/bin/git e/git =2 d7cf7b34:go.mod /bin/git e/git(dns block)sigs.k8s.io
- Triggering command:
/update-job-proxy /update-job-proxy github.com/TUM-D-c -lang=go1.24 /opt/hostedtoolclog -uns _base.go r/runc-log.json bash -c=4 -nolocalimports -importcfg /opt/hostedtoolcHEAD -ato -bool r/runc-log.json /opt/hostedtoolcache/go/1.24.10/x64/pkg/tool/linux_amd64/vet -errorsas -ifaceassert -nilfunc /opt/hostedtoolcfilter(dns block)- Triggering command:
/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 5495d30143fbecc5--format=format:%H %ct %D /bin/git --detach od /bin/git /usr/bin/git init a89987915194adde--depth=1 ce50ae9e:go.mod /bin/git om/spf13/cobra 42642302:go.mod /usr/lib/git-cor-t git(dns block)- Triggering command:
/update-job-proxy /update-job-proxy conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT bbc7f005:go.mod /home/dependabotrefs/tags/v2.4.0 --pack_header=2,/usr/bin/git REDACTED /bin/git git conf tformat /usr/bin/git e/git =2 d7cf7b34:go.mod /bin/git e/git(dns block)If you need me to access, download, or install something from one of these locations, you can either:
- Configure Actions setup steps to set up my environment, which run before the firewall is enabled
- Add the appropriate URLs or hosts to the custom allowlist in this repository's Copilot coding agent settings (admins only)
Original prompt
Create a christmas theme on all of the pages that could be activated in the admin UI but for all users
💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.