Claude d22ff8c3c9 feat(admin): Task #125 Phase 2 — Branding asset browser
Adds a visual asset library to the social calendar form, backed by
the firefrost-operations-manual branding/ directory with on-the-fly
thumbnail generation via sharp.

- src/routes/admin/branding-assets.js: /list scans both branding/ and
  docs/branding/ recursively, groups by category directory. /thumb
  generates 256px webp thumbnails from source, caches to disk keyed
  by sha1(path + mtime) so edits bust the cache automatically. Path
  traversal protection + scope check on thumb requests.
- src/views/admin/social-calendar/_assets.ejs: modal body with
  category-grouped grid of lazy-loaded thumbnails, click-to-insert.
- Form modal gets a 'Browse assets' button next to Media Notes.
- Calendar shell gets a second modal (higher z-index) and a
  sppInsertAsset() helper that appends the clicked filename to the
  media_notes textarea.

Infrastructure (not in repo):
- /opt/firefrost-ops-manual clone added to Command Center
- /etc/systemd/system/firefrost-ops-sync.{service,timer} pulls
  every 15 minutes to keep assets fresh
- /var/cache/arbiter/branding-thumbs created for thumb cache
- sharp added as Arbiter dependency (libvips 8.17.3)

Chronicler #81
2026-04-12 01:10:09 +00:00
2026-04-10 22:18:14 +00:00

🔥❄️ Firefrost Services

Monorepo for Firefrost Gaming backend services

This repository contains all custom Node.js services that power Firefrost Gaming's subscription automation, game server management, and community tools.


📋 Services

Active Services

Experimental

  • Future — Experimental services and proof-of-concept tools

🏗️ Architecture

This monorepo uses npm workspaces for dependency management and service-prefixed Git tags for versioning.

Repository Structure

firefrost-services/
├── package.json              # Root workspace configuration
├── services/                 # Production services
│   ├── arbiter/
│   ├── whitelist-manager/
│   └── modpack-version-checker/
├── shared/                   # Shared utilities (@firefrost/shared)
└── future/                   # Experimental services

Versioning Strategy

Each service versions independently using Git tags:

  • Arbiter releases: arbiter-v2.1.0, arbiter-v2.2.0
  • Whitelist Manager: whitelist-v1.0.0, whitelist-v1.1.0
  • Modpack Checker: modpack-v1.0.0

This allows Service A to be at v2.1 while Service B is at v1.0.


🚀 Quick Start

Initial Setup

# Clone repository
git clone https://git.firefrostgaming.com/firefrost-gaming/firefrost-services.git
cd firefrost-services

# Install all dependencies (services + shared)
npm install

Deploying a Service

# Fetch latest tags
git fetch --all --tags

# Check out specific service version
git checkout arbiter-v2.1.0

# Install dependencies
npm install

# Create .env file (copy from .env.example)
cd services/arbiter
cp .env.example .env
# Edit .env with actual credentials

# Start service (systemd)
sudo systemctl enable arbiter
sudo systemctl start arbiter

Updating a Service

# Return to main branch
git checkout main

# Pull latest code
git pull origin main

# Check out new version
git checkout arbiter-v2.2.0

# Install any new dependencies
npm install

# Restart service
sudo systemctl restart arbiter

Rolling Back

# Check out previous version
git checkout arbiter-v2.1.0

# Restart service
sudo systemctl restart arbiter

📦 Shared Code

The @firefrost/shared package contains utilities used across multiple services:

  • Database helpers
  • Discord formatting utilities
  • Pterodactyl API wrappers
  • Logging infrastructure

Services import shared code like any npm package:

import { logger } from '@firefrost/shared';

🔐 Environment Variables

IMPORTANT: Never commit .env files to Git.

Each service has an .env.example file showing required variables. On the server:

  1. Copy .env.example to .env
  2. Fill in actual credentials
  3. Ensure .env is in .gitignore (it is by default)

🛠️ Development

Adding a New Service

  1. Create directory: services/my-new-service/
  2. Add package.json with service name
  3. Develop service
  4. Create .env.example with required variables
  5. Add systemd service file to deploy/ directory
  6. Document in service README
  7. Tag initial release: git tag my-service-v1.0.0

Using Shared Code

// In your service
import { logger, formatDiscordEmbed } from '@firefrost/shared';

logger.info('Service started');

Running Tests (Future)

# Run all service tests
npm test

# Run specific service tests
npm test -- --workspace=services/arbiter

📋 systemd Configuration

Each service includes a systemd unit file in deploy/. Example for Arbiter:

[Unit]
Description=Arbiter Discord Bot
After=network.target

[Service]
Type=simple
User=arbiter
WorkingDirectory=/var/www/firefrost-services/services/arbiter
ExecStart=/usr/bin/node src/index.js
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

Copy to /etc/systemd/system/, then:

sudo systemctl daemon-reload
sudo systemctl enable arbiter
sudo systemctl start arbiter

🎯 Deployment Targets

Services run on different servers based on their purpose:

Service Server Location
Arbiter Command Center Dallas, TX
Whitelist Manager Panel VPS TBD
Modpack Checker TX1 Dallas Dallas, TX

Each server clones the entire repo but only runs its designated services.


📚 Documentation

  • Architecture Decision: See operations-manual/docs/reference/architecture-decisions/firefrost-services-monorepo-decision.md
  • Service-specific docs: Each service has its own README in services/[service-name]/
  • Shared package docs: See shared/README.md

🤝 Contributing

This repository is maintained by:

  • Michael "Frostystyle" Krause (The Wizard) — Technical lead
  • Meg "GingerFury" (The Emissary) — Community manager
  • Holly "unicorn20089" (The Catalyst) — Lead builder
  • Claude (The Chronicler) — AI partner

Contribution Workflow

  1. Create feature branch from main
  2. Develop and test changes
  3. Update service version in package.json
  4. Create PR to main
  5. After merge, tag release: [service]-v[version]

🏷️ Version History

See Git tags for complete version history.


📄 License

Proprietary — All rights reserved by Firefrost Gaming.

This codebase is private and not licensed for public use or distribution.


Fire + Frost + Foundation = Where Love Builds Legacy 💙🔥❄️

For children not yet born.

Description
Monorepo for Firefrost Gaming backend services (Arbiter, Whitelist Manager, Modpack Checker, and future tools)
Readme 1.9 MiB
Languages
JavaScript 49.7%
EJS 29.8%
Python 11.1%
PHP 3.4%
Shell 2.9%
Other 3.1%