Loading...
Loading...
Open-source development for Alveus Sanctuary, a non-profit virtual education center following the journeys of non-releasable exotic ambassadors.
Avg 33.9 stars per repo.
279 followers.
This is the community-built, open-source website for Alveus Sanctuary. You can access the site at alveussanctuary.org (or alveus.gg).
This project uses PNPM workspaces. The main app is the website package (apps/website), which is a Next.js app.
For development:
Website stack (based on T3 Stack):
Hosting (production):
For a more complete overview see: #9

Hey there! Welcome to Alveus.gg! There's a few ways that you can help contribute.
[!NOTE] If you only want to work on the front end, you may skip the prerequisite and skip setting up a database or file storage (step 5). But you may encounter some errors when running the website without a database or file storage.
If you aren't working on features related to Twitch authentication, you can set the DISABLE_ADMIN_AUTH to true in your apps/website/.env file (see step 6 and 6.i) in order to use the admin dashboard immediately. Otherwise, create a Twitch application, setting the OAuth callback to be http://localhost:3000/api/auth/callback/twitch. Note down your client ID and client secret.
nvm or fnm. Run nvm install/fnm install in the project directory to install and nvm use/fnm use to use the correct Node.js version. Alternatively see nodejs.org for other options to download and install Node.js. You can see what version we need in package.json under engines.corepack enable to use pnpm as the package manager. Corepack is a tool provided with Node.js that makes it easy for you to use the specific package manager we expect.npm login --auth-type=legacy --registry=https://npm.pkg.github.com
read:packages scope and use it as the password when promptedpnpm install --frozen-lockfiledocker compose up -d from within apps/website to start a local MySQL database, and an S3 bucket with MinIO.apps/website/.env.example to apps/website/.env and open your copy in a text editor and fill it:
DISABLE_ADMIN_AUTH to true in order to use the admin dashboard without authentication. Otherwise, fill in TWITCH_CLIENT_ID and TWITCH_CLIENT_SECRET as mentioned above.pnpx web-push generate-vapid-keysNEXTAUTH_SECRET), Action API secret (ACTION_API_SECRET) and Vercel Cron Secret (CRON_SECRET) have to be filled with 32-byte Base64-encoded secrets. See Generate secrets below.DATA_ENCRYPTION_PASSPHRASE) has to be filled with a 24-byte Base64-encoded secret. See Generate secrets below.WEATHER_API_KEY) to use the weather API and stream overlay. See Weather API below.SUPER_USER_IDS variable with their CUID (using comma separated values)apps/database/.env.example to apps/database/.envpnpm prisma db push from within apps/database.pnpm dev from within apps/websitehttp://localhost:3000/ (open in browser)pnpm prisma studio from within apps/databasedocker compose exec db sh -c 'MYSQL_PWD=$MYSQL_ROOT_PASSWORD mysql alveusgg'"typescript.tsdk": "node_modules/typescript/lib" + "eslint.workingDirectories": [{ "pattern": "apps/*" }] to .vscode/settings.json to ensure you're using the correct TypeScript version + ESLint working directoriesWe use Base64-encoded random strings for various secrets. To generate these secrets you can use OpenSSL or Python. OpenSSL should be preinstalled on most Unix-like systems (Linux, macOS, WSL). If neither is installed on your system, you may need to install it yourself.
openssl rand -base64 32openssl rand -base64 24python3 instead depending on your installation.
python -c "import os, base64; print(base64.b64encode(os.urandom(32)).decode('utf-8'))"python -c "import os, base64; print(base64.b64encode(os.urandom(24)).decode('utf-8'))"Alveus operates a weather station on-site that uploads data to wunderground.com. Wunderground provide an API via api.weather.com that we use to display the weather for the stream overlay (and in the API for the Twitch chat bot). Accessing the API required an API key, which is only granted to users that have a weather station on wunderground.com.
It seems that anyone can sign up for a Wunderground account and register a weather station on the site, at which point you'll be granted access to the API, without ever needing to actually connect a weather station and upload data. It seems you can use this to get an API key to develop with the weather API locally.
In production, we use the actual API key for the account that is associated with the Alveus weather station, which does upload data to the site.
We use Cloudflare Stream to host a low-latency variation of the live cams specifically for camera operators. To do that, we need to do some setup with Cloudflare.
Login to the Cloudflare dashboard and navigate to Stream -> Live Inputs and click "Create Live Input"
Tick the "Require Signed URLs" box and leave the rest of the defaults
Click "Create Live Input" button
Make a note of the "Live Input ID", this will be used to configure the CF_STREAM_LOLA_VIDEO_ID environment variable.
Make a note of the host, this will be used to configure the CF_STREAM_HOST environment variable. It will look like customer-<unique-customer-id>.cloudflarestream.com and can be found under Connection Info -> WebRTC (WHIP) -> WebRTC (WHIP) URL.
Create an API token with the Stream:Edit permission. This is sometimes referred to as "Stream" under the "Account" dropdown.
Use that token to make a request to create a set of signing keys for Cloudflare Stream. This is global to the account, not just this specific stream.
Make a note of the id and jwk values, these will be used to configure the CF_STREAM_KEY_ID and CF_STREAM_KEY_JWK environment variables.
Ensure that the following environment variables are set in apps/website/.env:
CF_STREAM_KEY_IDCF_STREAM_KEY_JWKCF_STREAM_LOLA_VIDEO_IDCF_STREAM_HOSTThe stack should work on any Node.js server or Next.js capable hosting provider and any MySQL server, but has only been tested on Vercel (and PlanetScale) for now.
mysql://user:pass@us-east.connect.psdb.cloud/alveusgg?sslaccept=strict and mysql://user:pass@us-east.connect.psdb.cloud/alveusgg/shadow?sslaccept=strict)apps/website/.env.example and create your own apps/website/.env.production (see Development setup above) and also:
pnpm prisma db push.Next.js, leave the other build/dev settings on the default optionapps/websiteengines in package.json for the required versionapps/website/.env.production hereMemberEvent on alveusgg/control-api
January 27th, 2026 2:47 AM