Wakeve is a collaborative event planning application for groups that need one place to decide when to meet, who is coming, what the plan is, and what still needs organizing. It combines Kotlin Multiplatform shared logic, Android Compose, native SwiftUI iOS, a Ktor backend, offline-first persistence, and OpenSpec-driven release tracking.
The project is beyond the original Phase 2/Phase 3 README plan. Current source-of-truth tracking lives in ROADMAP.md, openspec/specs/, and the active OpenSpec changes.
Active changes:
| Change | Status | Remaining blocker |
|---|---|---|
add-event-weather-forecast |
20/22 tasks | WeatherKit Apple Developer capability, signed entitlement, and physical-device WeatherKit validation. |
add-on-device-wakeve-ai |
40/41 tasks | Supported physical-device profiling for Foundation Models latency, cancellation, memory, and production-log privacy. |
Recent archived roadmap work includes Android AI workflows, Android adaptive UI, contact participant selection, scenario matrix voting, web microfrontends, account deletion, UGC moderation, iOS brand identity, and create-event slot previews.
β Event Organization
- Create events with multiple time slot options
- Invite participants and manage RSVPs
- Real-time availability polling
- Weighted voting system (YES=2, MAYBE=1, NO=-1)
- Automatic best-time calculation
- Offline-first database persistence
- DRAFT β POLLING β CONFIRMED β ORGANIZING β FINALIZED workflow coordination
β Virtual Meetings
- MeetingService with support for Zoom, Google Meet, FaceTime
- Secure meeting link generation via backend proxy
- Meeting invitation and reminder scheduling
- Integration with native calendar
- Meeting lifecycle management (create, update, cancel, start, end)
β Multiplatform Support
- Android with Jetpack Compose UI
- iOS with native SwiftUI app, shared KMP integration, App Store readiness evidence, and WeatherKit/WakeveAI work in progress
- JVM/Desktop support
- Single shared codebase via Kotlin Multiplatform
β Backend Infrastructure
- Production-ready Ktor REST API
- SQLDelight type-safe database
- Event, meeting, auth, moderation, calendar, and organization APIs
- Role-based access control
- Secure API key management for external platforms
β Release Readiness
- App Store blocker register and final signoff workflow
- Local privacy, accessibility, media, license, export, live URL, and Store metadata evidence docs
- Account deletion and UGC moderation implementations archived after local validation
- Critical release gate scripts for OpenSpec, iOS metadata, web, and selected regression tests
# Clone repository
git clone https://github.com/guyghost/wakeve.git
cd wakeve
# Build and test
./gradlew build
./gradlew :shared:jvmTest
openspec validate --all --strict
# Start server
./gradlew server:run # http://localhost:8080
# Android uses https://api.wakeve.app by default.
# For emulator-local backend development, add this to local.properties:
# server.url=http://10.0.2.2:8080
# Build Android app
./gradlew :composeApp:assembleDebugSee QUICK_START.md for detailed setup instructions.
wakeve/
βββ shared/ # Kotlin Multiplatform shared code
β βββ src/commonMain/ # Cross-platform models & logic
β βββ src/jvmTest/ # JVM-specific tests
β βββ sqldelight/ # Type-safe database schema
βββ composeApp/ # Android app with Jetpack Compose
βββ server/ # Ktor REST backend server
βββ iosApp/ # Native iOS app and Xcode project
βββ openspec/ # Specification documents
βββ docs/ # Documentation
βββββββββββββββββββββββββββββββββββββββ
β UI Layer (Compose/SwiftUI) β
βββββββββββββββββββββββββββββββββββββββ€
β Business Logic (EventRepository) β
βββββββββββββββββββββββββββββββββββββββ€
β Persistence (SQLDelight) β
βββββββββββββββββββββββββββββββββββββββ€
β Platform Drivers (Android/iOS/JVM) β
βββββββββββββββββββββββββββββββββββββββ
Wakeve follows the Functional Core, Imperative Shell pattern to ensure testability and separation of concerns:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β IMPERATIVE SHELL β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Services (MeetingService, EventRepository) β β
β β State Machines (MVI FSM) β β
β β External APIs (MeetingProxyRoutes) β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β Handles side effects: I/O, async, state mutations β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β FUNCTIONAL CORE β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Pure Functions (logic, validators, transforms) β β
β β Domain Models (Event, Meeting, Vote) β β
β β Business Rules (scoring, eligibility) β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β No side effects, 100% testable β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Key Principles:
- β Shell CAN call Core
- β Core CANNOT call Shell
- β Core ignores Shell's existence
- β Pure functions in Core are easily testable
- β Side effects isolated in Shell (database, network, API)
See docs/architecture/meeting-service.md for detailed MeetingService architecture.
- Language: Kotlin 2.2.20 with Multiplatform support
- UI: Jetpack Compose (Android), SwiftUI (iOS)
- Database: SQLDelight with type-safe queries
- Backend: Ktor 3.3.1 REST server
- Testing: Kotlin test, XCTest, OpenSpec validation, release gate scripts
- Serialization: kotlinx-serialization for JSON
| Metric | Value |
|---|---|
| Roadmap Status | Active release hardening |
| Active OpenSpec Changes | 2 |
| Validated Specs/Changes | 26/26 with openspec validate --all --strict |
| Shared Test Files | 92 common test files |
| Android Test Files | 85 Compose test files |
| iOS Test Files | 28 XCTest files |
| Supported Platforms | Android, iOS, JVM/server |
| Current External Blockers | App Store/live infrastructure, signed-device WeatherKit, WakeveAI real-device profiling |
- QUICK_START.md - 5-minute setup guide
- CONTRIBUTING.md - Development guidelines
- AGENTS.md - OpenSpec workflow and AI agents
For comprehensive documentation, visit docs/:
- Architecture - System architecture and KMP patterns
- API Documentation - REST API endpoints
- Testing - Testing strategy and reports
- Integrations - Calendar, OAuth, and external services
- Migration Guides - Design system migrations
- Refactoring Docs - Major refactorings
- Implementation Status - PRD feature tracking
- openspec/specs/ - Detailed specifications
- openspec/AGENTS.md - Specification-driven development workflow
- Java 11+
- Kotlin 2.2.20
- Gradle 8.14+
- Android SDK (for Android development)
- Xcode with an available iOS simulator (for iOS development)
# Run shared JVM tests
./gradlew :shared:jvmTest
# Run specific test
./gradlew :shared:jvmTest --tests "EventRepositoryTest"
# Build Android app
./gradlew :composeApp:assembleDebug
# Start server
./gradlew :server:run
# Format code
./gradlew spotlessApplyWakeve has comprehensive test coverage:
EventRepositoryTest 10 tests
PollLogicTest 6 tests
DatabaseEventRepositoryTest 13 tests
OfflineScenarioTest 7 tests
βββββββββββββββββββββββββββββββββββ
Unit Tests 36 tests β
PrdWorkflowE2ETest 6 tests
ServiceIntegrationE2ETest 5 tests
MultiUserCollaborationTest 10 tests
DeleteEventE2ETest 6 tests
AuthFlowE2ETest 4 tests
βββββββββββββββββββββββββββββββββββ
E2E Tests 35 tests β
TOTAL 71 tests β
All tests cover:
- β Event creation and lifecycle
- β Participant management
- β Vote submission and aggregation
- β Database persistence
- β Offline data recovery
- β API endpoints
- β Complete PRD workflow (DRAFT β FINALIZED)
- β Multi-user collaboration scenarios
- β Virtual meeting link generation
- β Service integration (Budget, Transport, Meeting, Suggestion)
GET /health # Health check
GET /api/events # List all events
GET /api/events/{id} # Get event details
POST /api/events # Create event
PUT /api/events/{id}/status # Update event status
GET /api/events/{id}/participants # List participants
POST /api/events/{id}/participants # Add participant
GET /api/events/{id}/poll # Get poll results
POST /api/events/{id}/poll/votes # Submit vote
POST /api/meetings/proxy/zoom/create # Create Zoom meeting
POST /api/meetings/proxy/google-meet/create # Create Google Meet meeting
POST /api/meetings/proxy/zoom/{id}/cancel # Cancel Zoom meeting
GET /api/meetings/proxy/zoom/{id}/status # Get Zoom meeting status
Security Note: Meeting proxy endpoints secure external API keys (Zoom, Google Meet) by handling all external API calls server-side.
See docs/API/meeting-api.md for detailed MeetingProxy API documentation.
WAKEVE_API_BASE="${WAKEVE_API_BASE:-https://api.wakeve.app}"
curl -X POST "$WAKEVE_API_BASE/api/events" \
-H "Content-Type: application/json" \
-d '{
"title": "Team Meeting",
"description": "Q4 Planning",
"organizerId": "user-1",
"deadline": "2025-11-20T18:00:00Z",
"proposedSlots": [{
"id": "slot-1",
"start": "2025-12-01T10:00:00Z",
"end": "2025-12-01T12:00:00Z",
"timezone": "UTC"
}]
}'- OAuth/email/guest authentication flows in shared and platform code
- Role-based access control for organizer and participant behavior
- Account deletion flow implemented and locally validated
- UGC moderation, reporting, blocking, and review controls implemented and archived
- Store-readiness checks for privacy manifests, logging hygiene, live URL/AASA evidence, App Review notes, and release signoff markers
- UI Framework: Jetpack Compose
- Target: API 24+
- Build:
./gradlew :composeApp:assembleDebug
- Framework: SwiftUI with shared KMP framework integration
- Project:
iosApp/iosApp.xcodeproj - Target: tracked in Xcode build settings
- Database: Native SQLite driver
- Framework: Ktor REST server
- Database: SQLDelight with JDBC driver
- Run:
./gradlew server:run
- Create feature branch:
codex/<feature-name>for Codex work - Follow OpenSpec process (see CONTRIBUTING.md)
- Write tests for all new code
- Submit PR with issue reference
<type>(optional-scope): <description>
<optional body>
Examples:
feat(events): add event creation API
fix(timezone): handle poll slot conversion
test(sync): add offline conflict scenarios
Build Fails
./gradlew clean build # Clean rebuild
java -version # Verify Java 11+Tests Failing
./gradlew :shared:jvmTest --info # Verbose output
./gradlew :shared:jvmTest --tests "TestName" -d # Debug modeServer Won't Start
lsof -i :8080 # Check port 8080
./gradlew :server:run --info # Debug modeSee QUICK_START.md for more solutions.
Wakeve follows the OpenSpec specification-driven development process:
1. Create Issue β 2. Create Proposal β 3. Create Spec β
4. Get Approval β 5. Implement with Tests β 6. Merge & Deploy
See openspec/PROCESS.md for detailed workflow.
We welcome contributions! Please see CONTRIBUTING.md for:
- Development setup
- Code style guidelines
- Testing requirements
- Commit conventions
- Pull request process
- Issues: Create GitHub Issue for bugs/features
- Discussions: Use GitHub Discussions for questions
- Documentation: See full docs in repository
- Email: Contact maintainers for security issues
Wakeve is licensed under the MIT License. See LICENSE file for details.
Built with:
Wakeve's mission is to make collaborative scheduling effortless. By combining intelligent polling, automatic scheduling, and offline-first principles, we're building the event planning tool for distributed teams.
Ready to contribute? Start with QUICK_START.md and CONTRIBUTING.md!
Questions? Check openspec/ for detailed specifications and documentation.