Project Structure
This guide provides a detailed walkthrough of the codebase structure and what each directory contains.
Overview
activity-challenge-bot/
├── src/ # Source code
├── scripts/ # Utility scripts
├── data/ # Activity data files
├── tests/ # Test files
├── docs/ # Documentation (VitePress)
├── webapp/ # Web application (React)
├── deployment/ # Deployment configurations
├── index.ts # Entry point
└── package.json # Dependencies and scriptsSource Code (src/)
Bot Module (src/bot/)
Core bot initialization and configuration.
src/bot/
├── instance.ts # Bot instance creation
├── setup.ts # Command setup and configuration
├── start.ts # Bot startup logic
├── commands.ts # Command handlers
├── middleware.ts # Global middleware
└── handlers/
├── handlers.ts # Message and callback handlers
└── inlineQueryHandler.ts # Inline query handlingKey Files:
instance.ts: Creates the Telegraf bot instancesetup.ts: Configures bot commands and menustart.ts: Orchestrates bot startup, database migration, and error handlingcommands.ts: Handles all bot commands (/start, etc.)
Flows Module (src/flows/)
Conversation flows organized by feature.
src/flows/
├── activity/ # Activity logging wizard
│ ├── wizard.ts # Main wizard definition
│ ├── steps/ # Individual wizard steps
│ │ ├── 1-category.ts
│ │ ├── 2-subcategory.ts
│ │ ├── 3-activity.ts
│ │ ├── 4-intensity.ts
│ │ ├── 5-date.ts
│ │ ├── 6-duration.ts
│ │ └── 7-confirm.ts
│ └── helpers/
│ ├── activity-data.ts # Activity hierarchy access
│ └── navigation.ts # Navigation helpers
├── register/ # User registration wizard
│ ├── wizard.ts
│ ├── steps/
│ │ ├── 1-terms.ts # Terms and conditions
│ │ ├── 2-guild.ts # Guild selection
│ │ └── 3-confirm.ts # Confirmation
│ └── helpers/
│ ├── format.ts # Text formatting
│ └── keyboard-builder.ts # Keyboard generation
├── menu/ # Main menu system
│ ├── menu-router.ts # Menu routing logic
│ ├── registered-menu.ts
│ └── unregistered-menu.ts
├── profile/ # User profile features
│ ├── profile-menu.ts
│ ├── user-profile-info.ts
│ ├── activity-history.ts
│ └── delete.ts # Account deletion
├── stats/ # Statistics and rankings
│ ├── stats-menu.ts
│ └── index.ts
├── info/ # Information pages
│ ├── info-menu.ts
│ ├── about.ts
│ ├── credits.ts
│ ├── points.ts
│ └── terms.ts
├── feedback.ts # Feedback collection
└── index.ts # Flow exportsFlow Organization:
- Each major feature has its own directory
- Wizards are multi-step conversation flows
- Menus are single-step navigation interfaces
- Helpers contain shared logic
Database Module (src/db/)
All database operations.
src/db/
├── connection.ts # PostgreSQL connection
├── schema.sql # Database schema
├── migrate.ts # Migration runner
├── users.ts # User queries
├── activities.ts # Activity queries
├── points.ts # Point calculations
├── guilds.ts # Guild queries
├── feedback.ts # Feedback queries
└── index.ts # Database exportsDatabase Functions:
users.ts: CRUD operations for usersactivities.ts: Activity logging and retrievalpoints.ts: Point calculation and updatesguilds.ts: Guild standings and statistics
Example from users.ts:
export async function createUser(data: CreateUserData) {
return await sql`
INSERT INTO users (telegram_id, username, first_name, last_name, guild)
VALUES (${data.telegramId}, ${data.username}, ${data.firstName},
${data.lastName}, ${data.guild})
RETURNING *
`
}Configuration (src/config/)
Application configuration files.
src/config/
├── competition.ts # Competition dates and settings
├── guilds.ts # Guild definitions
├── contributors.ts # Project contributors
└── index.ts # Config exportsConfiguration Files:
competition.ts: Current competition period, date validationguilds.ts: List of guilds with short/full namescontributors.ts: Credits for the about page
Utilities (src/utils/)
Shared utility functions.
src/utils/
├── two-message-manager.ts # Two-message UX pattern
├── calendar.ts # Date selection helpers
├── format-list.ts # Text formatting
├── texts.ts # Text content and messages
├── webapp-auth.ts # Web app authentication
└── index.ts # Utility exportsKey Utilities:
two-message-manager.ts: Manages the "question + answer" UX patterncalendar.ts: Creates date selection keyboardstexts.ts: Centralized text strings and messages
Types (src/types/)
TypeScript type definitions.
src/types/
└── index.ts # All type definitionsContains interfaces for:
- User data structures
- Activity data structures
- Wizard states
- API responses
API Server (src/api/)
Web app backend API.
src/api/
└── server.ts # Express API serverProvides endpoints for:
- User statistics
- Guild rankings
- Activity history
- Authentication
Scripts Directory (scripts/)
Utility scripts for database management and development.
scripts/
├── populateTestData.ts # Add sample data
├── clear.ts # Clear database
├── init-guilds.ts # Initialize guild data
├── setup-local-cluster.ts # Kubernetes setup
├── deploy-local.ts # Deploy to local K8s
├── destroy-local.ts # Destroy local K8s
└── pdf-to-json.py # Process activity dataCommon Scripts:
populateTestData.ts: Creates realistic test dataclear.ts: Removes all data while keeping schemainit-guilds.ts: Ensures all guilds exist in database
Run with:
bun scripts/populateTestData.ts
# or
bun run populateData Directory (data/)
Activity data files (MET values from Compendium of Physical Activities).
data/
├── raw/
│ └── compendium-2024.pdf # Original source data
└── processed/
└── activity-hierarchy.json # Structured activity dataData Structure:
{
"Sports": {
"Running": {
"General running": {
"Moderate (5 mph)": [{
"met_value": 8.3,
"examples": "General running"
}]
}
}
}
}Four levels: Category → Subcategory → Activity → Intensity
Tests Directory (tests/)
Test files using Bun's built-in test runner.
tests/
├── leaderboard.test.ts # Leaderboard logic tests
└── ranking.test.ts # Ranking calculation testsRun tests:
bun testDocumentation (docs/)
VitePress documentation (what you're reading now!).
docs/
├── .vitepress/
│ └── config.ts # VitePress configuration
├── index.md # Home page
├── features.md # Feature list
├── architecture/ # Architecture docs
├── reference/ # Reference docs
├── guide/ # User guides
├── development/ # Developer guides
└── admin/ # Admin guidesWeb App (webapp/)
React-based web application for viewing statistics.
webapp/
├── src/
│ ├── App.tsx # Main application
│ ├── pages/ # Page components
│ ├── components/ # Reusable components
│ ├── hooks/ # Custom React hooks
│ └── api.ts # API client
├── index.html
├── vite.config.ts # Vite configuration
└── package.json # Web app dependenciesNot fully documented here - DOCUMENTATION COMING SOON!.
Deployment (deployment/)
Deployment configurations for different environments.
deployment/
├── clusters/
│ ├── hetzner-bot/ # Production cluster config
│ └── local-dev/ # Local Kubernetes config
├── infrastructure/
│ ├── apps/ # Application manifests
│ └── core/ # Core infrastructure
└── modules/ # Terraform modulesNot fully documented here - deployment is handled by your friend.
Root Files
index.ts
Entry point for the application.
import 'dotenv/config'
import { startBot } from './src/bot/start'
startBot()package.json
Defines dependencies, scripts, and project metadata.
See Local Development for script documentation.
Configuration Files
tsconfig.json- TypeScript compiler configurationeslint.config.mjs- ESLint linting rulescompose.yaml- Docker/Podman compose configurationcompose.dev.yaml- Development-specific compose overridesContainerfile- Container image definition
Finding Code
To Find User Interface Code
Look in src/flows/. Each feature has its own directory.
To Find Database Operations
Look in src/db/. Functions are organized by entity (users, activities, guilds).
To Find Configuration
Look in src/config/. All configuration is centralized here.
To Find Business Logic
Look in:
src/db/points.tsfor point calculationssrc/flows/activity/helpers/activity-data.tsfor activity datasrc/utils/for shared utilities
To Find Bot Setup
Look in src/bot/:
instance.tsfor bot creationsetup.tsfor command configurationstart.tsfor startup logic
Next Steps
- Learn about Testing
- Read Architecture Overview
- Explore Flows and Wizards