Skip to content

guyghost/wakeve

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

284 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Wakeve - Collaborative Event Planning

License Status Tests Platforms

Wakeve is a modern, collaborative event planning application that solves the scheduling problem for distributed teams. With intelligent availability polling, automatic best-time calculation, and offline-first synchronization, Wakeve makes it easy to find a time that works for everyone.

🎯 Features

Current (Phase 2 βœ…)

βœ… 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

βœ… 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 database driver (UI in Phase 2)
  • JVM/Desktop support
  • Single shared codebase via Kotlin Multiplatform

βœ… Backend Infrastructure

  • Production-ready Ktor REST API
  • SQLDelight type-safe database
  • 8 comprehensive endpoints + 4 MeetingProxy endpoints
  • Role-based access control
  • Secure API key management for external platforms

Planned (Phase 3 πŸš€)

⏳ User Authentication - OAuth2 with Google/Apple ⏳ Offline Sync - Automatic change synchronization ⏳ Push Notifications - Deadline reminders and updates βœ… Calendar Integration - Native calendar app support (Android & iOS), ICS export and share

πŸš€ Quick Start

# Clone repository
git clone https://github.com/guyghost/wakeve.git
cd wakeve

# Build and test
./gradlew build
./gradlew shared:test  # 36 tests passing βœ…

# Start server
./gradlew server:run   # http://localhost:8080

# Build Android app
./gradlew wakeveApp:assembleDebug

See QUICK_START.md for detailed setup instructions.

πŸ“ Project Structure

wakeve/
β”œβ”€β”€ shared/               # Kotlin Multiplatform shared code
β”‚   β”œβ”€β”€ src/commonMain/  # Cross-platform models & logic
β”‚   β”œβ”€β”€ src/jvmTest/     # JVM-specific tests
β”‚   └── sqldelight/      # Type-safe database schema
β”œβ”€β”€ wakeveApp/          # Android app with Jetpack Compose
β”œβ”€β”€ server/              # Ktor REST backend server
β”œβ”€β”€ wakeveApp/wakeveApp/ # iOS app entry point (SwiftUI)
β”œβ”€β”€ openspec/            # Specification documents
└── docs/                # Documentation

πŸ—οΈ Architecture

Multiplatform Layers

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  UI Layer (Compose/SwiftUI)         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  Business Logic (EventRepository)   β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  Persistence (SQLDelight)           β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  Platform Drivers (Android/iOS/JVM) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Architecture Pattern: Functional Core & Imperative Shell (FC&IS)

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.

Key Technologies

  • 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 framework, 36+ tests
  • Serialization: kotlinx-serialization for JSON

πŸ“Š Project Statistics

Metric Value
Phase Status 2 Complete, 3 Planning
Tests Passing 71/71 (100%) βœ…
Unit Tests 36 tests
E2E Tests 35 tests
Lines of Code ~4,500
Files Created 40+
API Endpoints 12 (8 event + 4 meeting proxy)
Database Tables 8
Supported Platforms 3 (Android, iOS, JVM)

πŸ“– Documentation

Getting Started

Complete Documentation

For comprehensive documentation, visit docs/:

OpenSpec

πŸ”§ Development

Prerequisites

  • Java 11+
  • Kotlin 2.2.20
  • Gradle 8.14+
  • Android SDK (for Android development)
  • Xcode 15+ (for iOS development)

Build Commands

# Run all tests
./gradlew shared:test

# Run specific test
./gradlew shared:test --tests "EventRepositoryTest"

# Build Android app
./gradlew wakeveApp:assembleDebug

# Start server
./gradlew server:run

# Format code
./gradlew spotlessApply

πŸ§ͺ Testing

Wakeve 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)

πŸ“‘ REST API

Event Endpoints

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

Meeting Proxy Endpoints (Secure)

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.

Example: Create Event

curl -X POST http://localhost:8080/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"
    }]
  }'

πŸ” Security

Current (Phase 2)

  • Static user IDs (for development)
  • Role-based access control (organizer vs participant)
  • Input validation on all endpoints
  • Error handling with appropriate HTTP status codes

Planned (Phase 3)

  • OAuth2 authentication (Google, Apple)
  • Secure token storage and refresh
  • HTTPS enforcement
  • Rate limiting and request validation

πŸ“± Platform Support

Android

  • UI Framework: Jetpack Compose
  • Target: API 24+
  • Build: ./gradlew wakeveApp:assembleDebug

iOS

  • Framework: Swift/SwiftUI (planned Phase 2)
  • Target: iOS 13+
  • Database: Native SQLite driver

JVM/Server

  • Framework: Ktor REST server
  • Database: SQLDelight with JDBC driver
  • Run: ./gradlew server:run

🚦 Development Workflow

Creating a Feature

  1. Create feature branch: change/<feature-name>
  2. Follow OpenSpec process (see CONTRIBUTING.md)
  3. Write tests for all new code
  4. Submit PR with issue reference

Git Commit Format

[#<issue>] <type>: <description>

<optional body>

Examples:

[#2] feat: Implement event creation API
[#15] fix: Handle timezone conversion
[#20] test: Add offline sync scenarios

πŸ› Troubleshooting

Common Issues

Build Fails

./gradlew clean build  # Clean rebuild
java -version          # Verify Java 11+

Tests Failing

./gradlew shared:test --info  # Verbose output
./gradlew shared:test --tests "TestName" -d  # Debug mode

Server Won't Start

lsof -i :8080          # Check port 8080
./gradlew server:run --info  # Debug mode

See QUICK_START.md for more solutions.

πŸ“‹ Workflow

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.

🀝 Contributing

We welcome contributions! Please see CONTRIBUTING.md for:

  • Development setup
  • Code style guidelines
  • Testing requirements
  • Commit conventions
  • Pull request process

πŸ“ž Support

  • 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

πŸ“„ License

Wakeve is licensed under the MIT License. See LICENSE file for details.

πŸ™ Acknowledgments

Built with:

🎯 Vision

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.

About

No description, website, or topics provided.

Resources

Contributing

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors