5.1 KiB
Context
This is a new race planning application built from scratch. The system needs to support two primary user types: organizers who create and manage events, and participants who register for and attend events. The application requires user authentication, event management, registration workflows, payment tracking, and communication features.
Goals / Non-Goals
Goals:
- Build a full-stack web application with clear separation of concerns
- Implement secure user authentication with role-based access
- Create intuitive event management for organizers
- Enable seamless participant registration workflow
- Provide real-time dashboard metrics
- Support payment tracking (initially manual recording, extensible to online payments)
Non-Goals:
- Real-time chat or messaging between users
- Complex payment processing integration (Phase 1 is manual tracking only)
- Mobile native apps (web-responsive only)
- Social media integrations
- Advanced analytics or reporting (basic metrics only)
Decisions
Architecture: Full-stack with REST API
Decision: Use a client-server architecture with a REST API backend and SPA frontend.
Rationale: This provides clear separation of concerns, enables independent development of frontend and backend, and supports future mobile app development if needed.
Alternatives considered:
- Server-side rendered (SSR) application - Rejected: Less interactive UI, harder to build dashboard features
- GraphQL API - Rejected: Adds complexity, REST is sufficient for current requirements
Tech Stack: .NET Backend + Next.js Frontend (Bun Runtime)
Decision:
- Backend: .NET (C# with ASP.NET Core Web API)
- Frontend: Next.js with TypeScript, running on Bun runtime (instead of Node.js)
Rationale:
- .NET Backend: Robust framework with excellent performance, built-in dependency injection, Entity Framework Core for PostgreSQL integration, and strong typing with C#
- Next.js on Bun: Bun provides faster startup times and better performance than Node.js, while Next.js offers excellent React framework with SSR/SSG capabilities
- Full-stack TypeScript experience (C# on backend, TypeScript on frontend)
- Clear separation allows independent scaling and deployment
Alternatives considered:
- Python/Django - Rejected: Less suitable for real-time dashboard updates
- Node.js backend - Rejected: Prefer .NET's strong typing and enterprise features
- Node.js runtime for frontend - Rejected: Bun offers better performance for Next.js
Database: PostgreSQL
Decision: Use PostgreSQL as the primary database with normalized schema.
Rationale: ACID compliance for financial data (payments), mature ecosystem, good ORM support.
Alternatives considered:
- MongoDB - Rejected: Less suitable for relational data (users, events, registrations)
- SQLite - Rejected: Won't scale to multiple concurrent organizers
Authentication: JWT with httpOnly cookies
Decision: Use JWT tokens stored in httpOnly cookies for session management.
Rationale: Stateless authentication, secure against XSS, supports role-based claims.
Alternatives considered:
- Session-based auth - Rejected: Requires server-side session store, adds complexity
- OAuth only - Rejected: Still need local auth for initial version
Payment Tracking: Manual + Extensible
Decision: Start with manual payment recording, design for future integration.
Rationale: Faster MVP, payment processing can be added later without schema changes.
Risks / Trade-offs
Risk: Payment data security without integrated processor Mitigation: Encrypt sensitive fields, audit logs, plan for processor integration in Phase 2
Risk: Dashboard performance with many events/registrations Mitigation: Implement pagination, consider caching layer for metrics, database indexing
Risk: Email delivery reliability Mitigation: Use transactional email service (SendGrid/Mailgun), implement retry logic
Trade-off: Manual payment recording requires organizer trust Acceptance: Documented limitation for MVP, roadmap includes automated processing
Migration Plan
Not applicable - this is a new application with no existing data to migrate.
Deployment strategy:
- Deploy database schema
- Deploy backend API
- Deploy frontend application
- Configure DNS and SSL
- Create initial admin user
Open Questions (Resolved)
Decision Log:
-
Email verification before allowing registration?
- Decision: Not needed for MVP
- Rationale: Keep signup friction minimal for initial launch; can add later if needed
-
Event categories/tags for filtering?
- Decision: Yes, implement event categories/tags
- Rationale: Improves event discoverability and participant experience
-
Can participants edit registrations after submission?
- Decision: Yes, support registration cancellation
- Rationale: Users need flexibility to manage their commitments
-
File uploads (event images, participant documents)?
- Decision: Not needed for MVP
- Rationale: Keep initial scope focused; can add as separate feature later