Welcom facilitates safe, friendly, and respectful communication between parties during difficult conversations. By enforcing turn-based speaking with automatic muting, both people can express themselves without interruption, yelling, or talking over each other.
Difficult conversations often break down when people interrupt, raise voices, or talk over each other. Welcom creates a structured, safe space for communication by:
- Preventing Interruptions: Only one person can speak at a time
- Equal Voice: Both parties get fair, timed turns to express themselves
- Reducing Tension: Automatic muting prevents heated overlapping arguments
- Promoting Respect: Turn-based structure encourages thoughtful listening
- Building Understanding: Private notes help process what you hear without immediate reaction
Perfect for: couples therapy, family discussions, workplace conflicts, mediation sessions, or any conversation that needs structure.
- ✅ Turn-Based Audio: Automatic muting based on turn rotation
- ✅ Session Timer: Visual countdown with configurable turn duration
- ✅ Private Notes: Take notes during opponent's turn
- ✅ Session Logging: Complete session history with export capability
- ✅ Session Ratings: Rate negotiation quality and respectfulness after completion
- ✅ Multiple Sharing Options: AirDrop, QR codes, NFC, or manual codes
- ✅ Share App: Invite others to download via built-in share button
- ✅ Modification Requests: Request and approve session changes
- Extend turn duration
- Add extra turns
- Pause/Resume session
- End session
- ✅ Real-time Sync: Session state synchronized between parties (ready for Firebase)
- ✅ SwiftUI + MVVM: Clean architecture with reactive state management
Welcom/
├── Models/
│ ├── Session.swift # Session data model
│ ├── Note.swift # Private notes model
│ ├── LogEntry.swift # Session logging
│ ├── ModificationRequest.swift # Request workflow
│ ├── SessionRating.swift # Post-session ratings
│ └── User.swift # User information
├── ViewModels/
│ └── SessionViewModel.swift # Session state & logic
├── Views/
│ ├── SessionView.swift # Main session UI
│ ├── ContentView.swift # Home screen
│ ├── CreateSessionView.swift # Create new session
│ ├── JoinSessionView.swift # Join existing session
│ ├── WaitingRoomView.swift # Pre-session waiting area
│ └── SessionRatingView.swift # Post-session feedback
├── Services/
│ ├── NFCSessionManager.swift # NFC reading/writing
│ ├── QRCodeGenerator.swift # QR code generation
│ ├── QRCodeScanner.swift # QR code scanning (camera)
│ ├── WebSocketService.swift # Real-time messaging client
│ └── SessionMessagingService.swift # Session sync via WebSocket
├── Utils/
│ └── ShareSheet.swift # AirDrop & share menu
└── WelcomApp.swift # App entry point
-
Demo Mode (Current):
- Mock data, single device testing
- "Simulate Join" button for testing UI
-
Peer-to-Peer Mode (Production-Ready, No Backend Required):
- ✅ AirDrop: Share code instantly between nearby devices
- ✅ QR Code: Scan to join, works at any distance
- ✅ Manual Code: Fallback 6-character code entry
- ✅ NFC: Tap phones together (iPhone 7+)
- Works completely offline, no server needed
-
WebSocket Mode (Full Real-Time):
- Use
waelio-messagingbackend for live sync - Real-time turn management
- User presence detection
- Requires messaging server running
- Use
To enable WebSocket sync:
- Uncomment WebSocket integration in
SessionViewModel.swift - Set server URL in
WebSocketService.swift - Start messaging server:
cd /Users/waelio/Code/waelio-messaging && npm run dev
Audio Integration (Future):
- Add WebRTC or Agora SDK
- Implement in
SessionViewModel.swift - Hook into existing mute/unmute logic
Creating and Joining Sessions
Option 1: Using AirDrop (Recommended)
- Host: Tap "Start Conversation" → Tap "Share via AirDrop"
- Participant: Accept AirDrop → Code appears in message → Copy and paste into join screen
- Session automatically starts when both users are connected
Option 2: Using QR Code
- Host: Tap "Start Conversation" → Session shows QR code in waiting room
- Participant: Tap "Join Conversation" → Tap "Scan QR Code" → Point camera at host's screen
- Session automatically starts when both users are connected
Option 3: Using NFC
- Host: Tap "Start Conversation" → Fill details → Tap "Share via NFC"
- Participant: Tap "Join Conversation" → Tap "Scan with NFC"
- Hold phones back-to-back until code transfers
- Session automatically starts when both users are connected
Option 4: Using Session Code
- Host: Tap "Start Conversation" → Share the 6-character code
- Participant: Tap "Join Conversation" → Enter code manually
- Session starts when participant joins
Want to help someone get started with Welcom?
- Tap the share button (↑) in the top-right corner of the home screen
- Choose how to share:
- AirDrop - Send directly to nearby devices
- Messages - Text the app info
- Mail - Email the download link
- Copy - Get the link to share anywhere
The share message includes:
- What Welcom does
- Why it's useful for difficult conversations
- GitHub download link
Perfect for therapists, mediators, or anyone who wants to help others communicate better!
- Launch the app
- Tap "Start Demo Session"
- View the session interface with:
- Circular timer showing remaining time
- Party status indicators (A/B)
- Private notes section
- Session log
- Control buttons
- Notes: Take private notes during opponent's turn
- Menu (⋯): Access modification requests
- Extend Turn: Add 1 minute to current turn
- Add Turn: Increase total number of turns
- Pause/Resume: Temporarily halt the session
- End Session: Terminate early with mutual consent
- Export (↑): Save session log as text file
- ✅ Core UI Implementation
- ✅ Session Management
- ✅ Timer & Turn Logic
- ✅ Notes & Logging
- ✅ Modification Requests
- ✅ QR Code Joining
- ✅ NFC Session Sharing
- ✅ WebSocket Service (waelio-messaging integration ready)
- ⏳ Full Real-Time Sync (backend running required)
- ⏳ Real-time Audio (planned)
- ⏳ User Authentication (planned)
Welcom includes WebSocket client code to integrate with the waelio-messaging backend for real device-to-device communication.
Architecture:
WebSocketService.swift- Generic WebSocket client for waelio-messagingSessionMessagingService.swift- Session-specific sync logic- Compatible with: https://github.com/waelio/waelio-messaging
To use:
- Run messaging server:
cd /path/to/waelio-messaging && npm run dev - Update server URL in
WebSocketService.swiftif needed - Enable WebSocket sync in
SessionViewModel(currently commented out) - Both devices connect to same server
- Session state syncs automatically
Currently: App works standalone with QR codes. WebSocket integration is implemented but optional.
Hardware:
- iPhone 7 or later (iPhone XR/XS for background NFC)
- Both devices must support NFC
Testing:
- NFC only works on physical devices, not simulators
- Devices must have iOS 13.0 or later
- Hold devices back-to-back (where NFC antenna is located)
- Wait for haptic feedback confirming successful read/write
Entitlements:
- Near Field Communication Tag Reading capability is enabled
- NDEF format support is configured
- Orange: 1-2 minutes remaining
- Red: < 1 minute remaining
- ✅ Core UI Implementation
- ✅ Session Management
- ✅ Timer & Turn Logic
- ✅ Notes & Logging
- ✅ Modification Requests
- ⏳ Firebase Integration (planned)
- ⏳ Real-time Audio (planned)
- ⏳ User Authentication (planned)
xcodebuild -project Welcom.xcodeproj -scheme Welcom -destination 'platform=iOS Simulator,name=iPhone 15' buildxcodebuild test -project Welcom.xcodeproj -scheme Welcom -destination 'platform=iOS Simulator,name=iPhone 15'MIT License - feel free to use this project for your own applications.
waelio
- Built with SwiftUI
- Uses Combine for reactive programming
- MVVM architecture pattern