Scouting 51 Website & Volunteer Console

WebCommunityAI Translation
HTML/CSS/JS Node.js Nginx Claude API Internationalization Playwright Docker Cloudflare Tunnel Self-hosted

Project Overview

Who

Scouting unit 51 in Modesto: Cub Scout Pack 51, Scouts BSA Troop 51, and Venturing Crew 51. The site is for families thinking about joining, current families checking meetings and events, and the volunteer leaders who keep it up to date.

What

A public website with a landing page that sends visitors to the right unit. Each unit has its own page and color scheme. Everything a volunteer would normally change, like meeting nights, den info, and events, is in one plain text file. If a value is left blank, the page shows a yellow TODO so the gap is obvious.

Behind the site is a volunteer console with individual accounts and roles. Den leaders upload their own schedules, agendas, and documents. Admins manage accounts. The console is also where leaders get into the Scouting for Food app.

Every page can be switched to Spanish, Punjabi, or Hmong for families who are more comfortable reading those than English.

When

Launched in August 2026. I expanded it from the pack to all three units in September, added translation later that month, and added the Scouting for Food app in October.

Where

Self-hosted on my homelab as a Docker Compose stack, with Nginx serving the site and a small Node.js API for the console. It's published through Cloudflare Tunnel at scouting-51.com and kept in a private Git repository.

Why

Families need one place to find meeting nights, events, and how to join. The volunteers who keep that current change from year to year. So I built it so a volunteer can maintain it without me: no build step, no database for the content, and no way for a normal edit to break the layout.

I also didn't want anyone maintaining four copies of the site. English is the only version anyone edits. The other languages are generated from it.

How It Works

  • When a page needs a sentence that hasn't been translated yet, it's sent to Claude once and saved to a dictionary file for that language. After that it's served from the file. On a normal day nothing gets translated.
  • If someone edits an English sentence, the old translation is dropped and the new one is translated on the next visit. Corrections from native speakers are never overwritten.
  • Since the translation endpoint is open to anyone visiting the site, it has three limits: per request, per visitor per minute, and a daily cap on new sentences. That keeps the cost predictable.
  • Console accounts use individual logins with hashed passwords. Uploaded documents are locked down so they can't run code on the site. There's no personal contact info on the public pages on purpose.
  • Each unit has its own preview card when a link is shared, generated with Playwright.
  • Volunteer edits show up on the next page reload. I had to confirm Cloudflare wasn't holding onto old copies for hours.

Still open: the Punjabi and Hmong translations haven't been reviewed by native speakers yet, and a few unit details are still waiting on leaders to fill in.

Stack & Tools

Frontend
HTML, CSS, JavaScript
Web Server
Nginx
Backend
Node.js API
Translation
Claude API, saved dictionaries
Languages
English, Español, ਪੰਜਾਬੀ, Hmoob
Auth
Individual accounts, scrypt
Previews
Playwright-rendered cards
Containers
Docker, Docker Compose
Remote Access
Cloudflare Tunnel