← Back to Portfolio
RC

Gay Run Club

Community event management for LGBTQ+ running club

Live JavaScript Node.js PlanetScale

Project Overview

Gay Run Club is a production-ready community event management platform specifically designed for coordinating and managing running club events within the LGBTQ+ community. The application provides a comprehensive suite of tools for event creation, participant registration, waiver management, and real-time analytics.

Built with scalability and security in mind, the platform leverages serverless architecture to handle varying load patterns while maintaining consistent performance. The application emphasizes inclusive design, safety features, and ease of use for both coordinators and participants.

Live URL: https://gayrunclub.kervinapps.com

Status: Production (v3.0.0)

License: MIT

Core Features

1. Run Coordination & Scheduling

Coordinators can create runs with comprehensive details including location (with interactive map selection), date/time, capacity limits, and custom descriptions. The system generates unique management URLs for each run, enabling coordinators to oversee their events independently.

2. Real-Time Signup System

Participants can register for runs through shareable links with a streamlined signup process. The system automatically checks capacity, prevents overbooking, and provides instant confirmation.

3. Digital Waiver Management

Comprehensive waiver system with digital signature capture, secure storage, and compliance tracking. All waivers are timestamped and stored with full audit trails.

4. Admin Dashboard

Full CRUD interface for managing all runs, viewing participant lists, editing event details, and monitoring engagement metrics.

5. Device & Telemetry Tracking

Advanced telemetry system captures device information, browser details, session data, and user interaction patterns to help optimize the platform experience.

Technical Architecture

Technology Stack

Frontend

  • • Vanilla JavaScript (ES6+)
  • • HTML5 Canvas API
  • • CSS3 with Flexbox/Grid
  • • Mapbox GL JS v2.15

Backend

  • • Node.js 14+
  • • Express.js 4.18
  • • Serverless Functions
  • • RESTful API Design

Database

  • • PlanetScale (MySQL)
  • • JSON File Storage
  • • Real-time synchronization

Deployment

  • • Netlify Hosting
  • • Netlify Functions
  • • Continuous Deployment
  • • CDN Distribution

System Architecture

The application follows a serverless microservices architecture with clear separation between frontend presentation, business logic, and data storage:

API Documentation

RESTful API endpoints for programmatic access:

POST /api/runs/create

Create a new run

{
  "location": "Central Park, NYC",
  "datetime": "2025-11-30T18:00:00Z",
  "maxParticipants": 20,
  "description": "Evening 5K run"
}
GET /api/runs

Get all runs (with optional filters)

GET /api/runs/:runId

Get details for a specific run

POST /api/runs/:runId/signup

Register for a run

{
  "name": "John Doe",
  "phone": "+1234567890",
  "waiver": "base64_signature_data"
}
GET /api/runs/:runId/signups

Get all signups for a run

PUT /api/runs/:runId

Update run details

DELETE /api/runs/:runId

Delete a run

Database Schema

PlanetScale database structure:

runs table

CREATE TABLE runs (
  id VARCHAR(255) PRIMARY KEY,
  location TEXT,
  datetime DATETIME,
  max_participants INT,
  description TEXT,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

signups table

CREATE TABLE signups (
  id INT AUTO_INCREMENT PRIMARY KEY,
  run_id VARCHAR(255),
  name VARCHAR(255),
  phone VARCHAR(50),
  waiver_signed BOOLEAN,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (run_id) REFERENCES runs(id) ON DELETE CASCADE
);

telemetry table

CREATE TABLE telemetry (
  id INT AUTO_INCREMENT PRIMARY KEY,
  session_id VARCHAR(255),
  device_info JSON,
  browser_info JSON,
  ip_address VARCHAR(50),
  timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Security & Privacy

Performance Metrics

Page Load Time

< 1.5s

API Response Time

< 200ms

Database Query Time

< 50ms

Uptime

99.9%

Future Enhancements

Links & Resources