A self-hosted, privacy-first real-time quiz platform. This document tracks current state, identified limitations, and strategic goals.
Darkhold has reached and exceeded basic feature parity with Kahoot's core quiz functionality through 11 completed milestones.
| Feature | Status | Milestone |
|---|---|---|
| User Registration & Login (role-based) | Done | 1 |
| PostgreSQL + Flyway migrations | Done | 1 |
| Docker deployment (H2 + PostgreSQL) | Done | 1 |
| Input validation & error handling | Done | 1 |
| Multiple Choice questions | Done | 2 |
| True/False questions | Done | 2 |
| Type Answer (fuzzy matching) | Done | 2 |
| Poll questions | Done | 2 |
| Configurable points & time per question | Done | 2 |
| In-browser question editor (CRUD) | Done | 3 |
| Drag-and-drop question reordering | Done | 3 |
| Challenge duplicate/clone | Done | 3 |
| JSON/CSV import & export | Done | 3 |
| Excel import (backward compatible) | Done | 3 |
| Image URLs on questions | Done | 4 |
| YouTube video embeds | Done | 4 |
| Streak bonuses (1x-4x multipliers) | Done | 5 |
| Score change animations & rank deltas | Done | 5 |
| Pause/Resume/Skip/End game controls | Done | 5 |
| Kick player from lobby | Done | 5 |
| Animated podium (gold/silver/bronze) | Done | 5 |
| Multiple concurrent games (PIN-scoped) | Done | 6 |
| Game timeout & auto-cleanup | Done | 6 |
| Game history & past results | Done | 7 |
| Per-question analytics (success rate, difficulty) | Done | 7 |
| CSV export of results | Done | 7 |
| Practice mode (self-paced solo) | Done | 8 |
| Game mode selection UI | Done | 8 |
| Team mode (balanced/random/manual) | Done | 9 |
| Team leaderboards & podium | Done | 9 |
| Dark/Light theme with persistence | Done | 10 |
| Sound effects & animations | Done | 10 |
| WCAG 2.1 AA accessibility | Done | 10 |
| PWA support | Done | 10 |
| i18n: English, Spanish, French, German | Done | 11 |
| CSRF protection (including WebSocket) | Done | 11+ |
| Rate limiting on PIN entry | Done | 11+ |
- Backend: Spring Boot 4.0, Spring Security 6, Spring Data JPA, Java 21+
- Database: H2 (dev), PostgreSQL 16 (prod), 11 Flyway migrations, 16 tables
- Frontend: Thymeleaf + Bootstrap 5.3 + vanilla JS (ES6+ module pattern)
- Real-time: WebSocket with STOMP over SockJS
- Build: Gradle 9.2 with Error Prone, Checkstyle 12.3, PMD 7.19, JaCoCo
- Deploy: Docker (Temurin JDK 25), GitHub Actions CI
- Codebase: 101 source files, 38 test files, 15 packages
Goal: Transform from a Kahoot alternative into an enterprise-ready, AI-powered, self-hosted learning platform
The following 12 limitations have been identified through competitive analysis against Kahoot, Wayground (Quizizz), Mentimeter, Slido, and the broader $29B+ game-based learning market. Each limitation has a corresponding milestone in MILESTONES.md.
Current state: All interactions are server-rendered Thymeleaf pages. No programmatic access. Goal: Expose a documented REST API (OpenAPI/Swagger) for challenges, games, users, and analytics. Add JWT-based API authentication. This is the foundation for mobile apps, third-party integrations, LMS connectivity, and the plugin ecosystem. Why it matters: Without an API, Darkhold is a closed application. With one, it becomes a platform.
Current state: All quizzes are created manually (30+ minutes per quiz). Goal: Generate quizzes from pasted text, uploaded PDFs, or URLs using LLM integration. Support both cloud APIs (OpenAI, Anthropic) and local models (Ollama) for air-gapped deployments. Why it matters: AI quiz generation is the #1 feature race in 2025-2026. Every major competitor has shipped this. Without it, Darkhold is perceived as a generation behind. With it -- as a self-hosted platform with local AI -- it is unique in the market.
Current state: Own user management with BCrypt passwords only. Goal: Support enterprise identity providers via OAuth2/OIDC (Okta, Azure AD, Google Workspace, Keycloak) and SAML 2.0. Leverage Spring Security 6's built-in OAuth2 client support. Why it matters: Enterprise IT departments reject tools without SSO. This is a hard gate to institutional adoption.
Current state: All play is synchronous (live games) except basic practice mode. Goal: Allow hosts to publish challenges with deadlines. Participants complete at their own pace within the window. Results aggregate after deadline. Support configurable attempts and availability windows. Why it matters: Doubles the use-case surface area. Teachers assign homework; trainers assign pre/post assessments; event organizers run pre-event trivia. Live games are episodic; async drives daily active usage.
Current state: Basic per-game results with CSV export. No visualizations or trend analysis. Goal: Build rich analytics dashboards with Chart.js: learning gap analysis, question difficulty curves, participant progress over time, cohort comparison, engagement heatmaps. Add PDF report generation and email delivery. Why it matters: Analytics is a premium differentiator across all competitors. Users who see insights keep coming back.
Current state: No SCORM, LTI, or xAPI support. Goal: Export results in SCORM 1.2/2004 format. Implement LTI 1.3 provider so Darkhold games launch from Moodle, Canvas, Blackboard, Google Classroom with automatic grade passback. Why it matters: Unlocks the two largest market segments (education 44.9% + enterprise training 20.3% CAGR). Without LMS integration, institutional procurement is blocked.
Current state: All deployments show "Darkhold" branding. Goal: Admin-configurable logo, colors, fonts, domain, email templates, and game screen branding. CSS custom properties already in place for theming -- extend to admin-managed brand assets. Why it matters: Organizations want their brand on training materials. Required for enterprise adoption and reseller channels.
Current state: No external event notifications. Goal: Emit webhooks on key events (game started, ended, participant joined, results finalized). Allow organizations to pipe data into Slack, Teams, email, or custom systems. Why it matters: Enterprise workflows require automation hooks. Low effort, high integration value.
Current state: Quizzes run in a separate browser tab from presentations. Goal: Build embeddable game view that can be iframed into presentation tools. Create plugins for PowerPoint and Google Slides. Why it matters: Mentimeter and Slido dominate the presentation-integrated quiz space. This opens the events/meetings segment.
Current state: WebSocket state is in-memory per server. No horizontal scaling. Goal: Support multi-node deployment with Redis pub-sub for WebSocket message brokering, distributed session storage, and Kubernetes manifests with Helm charts. Why it matters: Organizations running large events (500+ concurrent) or institution-wide deployments need reliability at scale.
Current state: 51% instruction coverage, 34% branch coverage. JaCoCo minimum set at 35%. Seven packages below 25% coverage (analytics.service at 4%, team.service at 7%, practice.service at 11%). Goal: Raise to 85% instruction / 70% branch coverage through 5 dedicated milestones. Progressively raise JaCoCo minimum: 35% -> 45% -> 55% -> 62% -> 68% -> 75%. See TEST_COVERAGE_PLAN.md for per-package breakdown. Why it matters: Enterprise customers expect 60%+ coverage. Higher coverage enables safe refactoring for the features above. Security-critical code (SecurityConfig, RateLimitingService, WebSocketConfig) is currently near-zero branch coverage.
Current state: Browser-only with responsive design and PWA. Goal: Evaluate React Native or Flutter mobile app built on the REST API (Milestone 13). PWA improvements in the interim. Why it matters: Native apps improve notification delivery, offline caching, and app store discoverability.
| Feature | Kahoot | Wayground | Mentimeter | Slido | Darkhold (Now) | Darkhold (Goal) |
|---|---|---|---|---|---|---|
| Multiple choice | Yes | Yes | Yes | Yes | Yes | Yes |
| True/False | Yes | Yes | Yes | Yes | Yes | Yes |
| Type answer | Yes | Yes | No | No | Yes | Yes |
| Poll | Yes | Yes | Yes | Yes | Yes | Yes |
| Image/Video questions | Yes | Yes | Yes | Partial | Yes | Yes |
| AI quiz generation | Yes | Yes | Yes | Partial | No | Yes (M14) |
| Self-paced/Homework | Yes | Yes | Yes | No | Partial | Yes (M16) |
| Team mode | Yes | No | No | No | Yes | Yes |
| Analytics & reports | Yes | Yes | Yes | Yes | Basic | Advanced (M17) |
| LMS (SCORM/LTI) | SCORM | LTI | Partial | Webex | No | Yes (M18) |
| SSO/OIDC | Yes | Yes | Yes | Yes | No | Yes (M15) |
| REST API | Yes | Yes | Yes | Yes | No | Yes (M13) |
| White-label branding | Enterprise | Enterprise | Enterprise | No | No | Yes (M19) |
| Self-hosted | No | No | No | No | Yes | Yes |
| Free unlimited players | No | Limited | No | No | Yes | Yes |
| Open source | No | No | No | No | Yes | Yes |
| Air-gapped / offline AI | No | No | No | No | No | Yes (M14) |
| Horizontal scaling | Yes | Yes | Yes | Yes | No | Yes (M21) |
Recommended sequence based on dependencies and strategic value:
| Order | Milestone | Focus | Rationale |
|---|---|---|---|
| 1 | M12 | Security & Scale | Foundation hardening; already scoped |
| 2 | M13 | REST API | Enables M14, M16, M18, M20; platform foundation |
| 3 | M14 | AI Quiz Generation | Closes #1 competitive gap; unique with local model support |
| 4 | M15 | SSO / Enterprise Identity | Hard gate to enterprise adoption |
| 5 | M16 | Async / Homework Mode | Doubles use-case surface area |
| 6 | M17 | Advanced Analytics | Premium differentiator; leverages existing data |
| 7 | M18 | LMS Integration | Unlocks education + enterprise procurement |
| 8 | M19 | White-Label Branding | Enterprise requirement; extends theme system |
| 9 | M20 | Platform Ecosystem | Plugin architecture + marketplace |
| 10 | M21 | Horizontal Scaling | Large deployment support |
See CONTRIBUTING.md for guidelines. Pick any milestone or task and submit a PR.