NeilClack 138bf03ea9 Portal: move Schedule to per-License-Key with daily/weekly and Block.day
Adds Schedule.licenseKeyId (unique, nullable) and Schedule.type, makes the
legacy userId optional/non-unique, adds Block.day and flips Block
dynamicAudio default to true. The migration backfills each existing
per-user schedule onto that account's oldest License Key as a daily
schedule, preserves unmappable schedules (licenseKeyId NULL) with a
NOTICE, and is reversible. Tested up/down against a scratch schema.
2026-09-29 10:11:21 -05:00
2026-09-11 15:36:03 -05:00
2026-02-24 12:08:01 -06:00
2026-07-06 21:01:41 -05:00
2026-01-13 16:21:12 -06:00
2026-07-17 13:28:40 -05:00
2026-09-11 12:44:44 -05:00
2026-01-20 08:40:05 -06:00
2026-01-13 16:21:12 -06:00

Radiant Wave Technologies - User Portal

A combination application that combines the main Radiant Wave API with a user-facing account management application, and an admin-facing platform management application. An all-in-one management platform for Radiant Wave and Radiant Wave Technologies.

SvelteKit 2 + Svelte 5 + Tailwind CSS v4 + Prisma 7 + PostgreSQL + Better-Auth.

Deployment

This application runs inside of a Docker container, defined by the Dockerfile found within this repo. Codeberg/Gitea actions are triggered on push actions to the main branch, and build the docker container. The docker container is then uploaded to the Digital Ocean Container Registry, where it is pulled into an App Platform application and run.

To build the Docker container locally (with podman), ensuring builds pass prior to pushing to main:

podman build --platform linux/amd64 -t registry.digitalocean.com/radiantwave-portal-container-registry/portal:latest .

To build the Docker container on a Linux machine, such as a Forgejo Action Runner:

docker build -t registry.digitalocean.com/radiantwave-portal-container-registry/portal:latest .

Then push to the container registry:

podman push registry.digitalocean.com/radiantwave-portal-container-registry/portal:latest

Development

Admin

Admin pages live under /admin (requires roleId <= 3); /admin redirects to /admin/profiles. Each route owns its own form and modal logic, built on the shared DataTable.svelte and AdminModal.svelte components. The generic $lib/svelte-admin CRUD layer has been removed; see docs/ADMIN_OVERHAUL.md for the migration notes.

Route Notes
/admin/users Name, Email, Role
/admin/profiles Reference implementation
/admin/proclamations Super-only content edits
/admin/solfeggio-frequencies
/admin/proclamation-categories Draggable reorder
/admin/proclamation-groups Draggable reorder
/admin/license-keys List-only + rotate
S
Description
No description provided
Readme
2 MiB
Languages
TypeScript 89.3%
Svelte 9.5%
HTML 1%
Dockerfile 0.1%