The official website for S.P.L.U.R.T. Station - a NSFW furry roleplaying server for Space Station 13
S.P.L.U.R.T. Station is a multiplayer sandbox roleplaying game built on Space Station 13. This repository contains the source code for the official website at splurt.space.
The website features:
- ๐ฎ Information about the game and how to play
- ๐ผ๏ธ Media gallery with screenshots and videos
- ๐ต Music player with YouTube playlist integration
- ๐ฑ Responsive design with pixel-art aesthetics
- โก Fast, static-first architecture with SSR capabilities
Inspired by https://github.com/spacestation13/website
| Category | Technology |
|---|---|
| Framework | Astro 5.x |
| Runtime | Bun |
| UI Components | Solid.js |
| Styling | Tailwind CSS 4.x |
| Linting | Ultracite (Biome) |
| Deployment | Docker + Dokploy (PM2 in-container) or PM2 on VPS |
- Bun 1.x or later
- Node.js 18+ (for some dev dependencies)
# Clone the repository
git clone https://github.com/SPLURT-Station/splurt-webpage.git
cd splurt-webpage
# Install dependencies
bun install# Start the development server at http://localhost:4321
bun dev# Build the site to ./dist/
bun build
# Preview the production build locally
bun preview| Command | Description |
|---|---|
bun dev |
Start development server at localhost:4321 |
bun build |
Build production site to ./dist/ |
bun preview |
Preview production build locally |
bun start |
Run the production server (after build) |
bun test |
Run all tests |
bun test:watch |
Run tests in watch mode |
bun test:coverage |
Run tests with coverage report |
bun lint |
Fix linting issues with Ultracite |
bun lint:check |
Check for linting issues without fixing |
| Command | Description |
|---|---|
bun pm2:start |
Start the application with PM2 |
bun pm2:stop |
Stop the PM2 process |
bun pm2:restart |
Restart the PM2 process |
bun pm2:logs |
View PM2 logs |
bun pm2:status |
Check PM2 process status |
splurt-webpage/
โโโ .github/
โ โโโ workflows/ # GitHub Actions CI/CD
โ โโโ deploy-vps.yml # Production deployment
โ โโโ test.yml # Testing workflow
โโโ public/ # Static assets (fonts, images)
โโโ src/
โ โโโ actions/ # Astro server actions
โ โโโ assets/ # Processed assets (images, videos, logos)
โ โโโ components/ # Reusable components
โ โ โโโ age-gate/ # Age verification modal
โ โ โโโ hero-header/ # Hero section component
โ โ โโโ media-tabs/ # Media gallery tabs
โ โ โโโ music-player/ # YouTube music player
โ โ โโโ navigation/ # Site navigation
โ โ โโโ ...
โ โโโ layouts/ # Page layouts
โ โโโ pages/ # Route pages
โ โโโ styles/ # Global styles (ITCSS architecture)
โ โโโ test/ # Test files
โ โโโ utils/ # Utility functions
โโโ astro.config.mjs # Astro configuration
โโโ tailwind.config.ts # Tailwind CSS configuration
โโโ biome.json # Biome/Ultracite configuration
โโโ package.json
This project uses the ITCSS (Inverted Triangle CSS) architecture combined with Tailwind CSS. See src/styles/README.md for detailed documentation.
Key principles:
- Utility-first approach with Tailwind CSS
- Component-specific styles follow the principle of locality (CSS files live next to their components)
- Design tokens defined in CSS variables for consistency
- Custom pixel-art fonts for game-themed aesthetics
# Run all tests
bun test
# Run tests in watch mode
bun test:watch
# Run tests with coverage
bun test:coverage
# Run Astro type checking
bun astro checkSee TESTING.md for the complete testing guide.
This project uses Ultracite, a zero-config Biome preset for linting and formatting:
# Auto-fix linting issues
bun lint
# Check without fixing
bun lint:checkHusky is configured to run linting before each commit to ensure code quality.
Create a .env file based on the required secrets (see .github/workflows/deploy-vps.yml for the list of expected environment variables):
# Media configuration
PUBLIC_MEDIA_SPLASH_SOURCE_TYPE=...
PUBLIC_MEDIA_SPLASH_BASE_URL=...
PUBLIC_MEDIA_SPLASH_PATTERNS=...
# YouTube integration
PUBLIC_YOUTUBE_PLAYLIST_ID=...
PUBLIC_YOUTUBE_API_KEY=...The repo includes a multi-stage Dockerfile and docker-compose.dokploy.yml for Dokploy: the image is built from the repository on each deploy, and the app runs under pm2-runtime (PM2 as PID 1 โ auto-restart, logs).
- In Dokploy, create a Docker Compose service and point it at this repository.
- Set Compose path to
docker-compose.dokploy.yml. - Environment variables (Dokploy docs: Docker Compose โ Environment): use the built-in editor โ Dokploy writes a
.envfile next to your compose file. The compose service uses:build.argsto passPUBLIC_*,MEDIA_*, and YouTube variables into the Docker build stage (so Vite/Astro can inlineimport.meta.env.*duringbun run build), andenv_file: .env+environmentto provide runtime variables to the container on start. Fill values from.env.example.
- The compose file binds
127.0.0.1:${PUBLISH_PORT:-4321}โ container${PORT:-4321}so only local nginx can reach the app. In nginx:proxy_pass http://127.0.0.1:4321;(or whateverPUBLISH_PORTyou set). If you changePORTin.env, update the right-hand side of theports:mapping indocker-compose.dokploy.ymlto match.
Creating .env on the server (SSH)
If you prefer a file on disk, SSH into the host and create .env in the same directory as the compose file Dokploy uses (the deployment working directory), then redeploy. Example:
cd /path/to/dokploy/compose/project # your actual path from Dokploy
nano .env # paste variables from .env.exampleAuto Deploy + persistent secrets
Dokploy re-clones the repo on each deploy, so a .env you only put inside the clone can disappear. Prefer the Environment tab in Dokploy, or a File Mount (Advanced โ Mounts) and change env_file to e.g. ../files/splurt-webpage.env per Dokploy file mounts.
Local Docker smoke test
cp .env.example .env # fill in values
docker compose -f docker-compose.dokploy.yml up --build
# Or: docker build -t splurt-webpage . && docker run --rm -p 4321:4321 --env-file .env splurt-webpageThe site can still be deployed to a self-hosted runner (Proxmox LXC) on push to main / master (.github/workflows/deploy-vps.yml): build on the runner, .env from GitHub secrets, PM2 on the host.
bun build
bun pm2:start # or bun start- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Make your changes
- Run tests:
bun test - Run linting:
bun lint - Commit your changes:
git commit -m 'Add amazing feature' - Push to the branch:
git push origin feature/amazing-feature - Open a Pull Request
Made with ๐ by the S.P.L.U.R.T. Station team
