An iOS client for Fluxer β a modern messaging platform that is a competitor to Discord.
Voice channels, camera view, and microphone mute syncing with the Fluxer backend are now working. Server profile images, GIFs, and @mentions are also fixed.
No known issues at this time β report anything via Settings β Contact Support.
This project follows these design principles:
- Polished & Refined: Every pixel matters, smooth 120fps animations
- Playful but Professional: Delightful micro-interactions without being childish
- Customizable: Multiple themes (Light, Dark, OLED Dark, Sandstone, Ocean, Forest, Solarized) with 11 accent colors
- Content First: Clean typography, generous whitespace
- Native Feel: Built with SwiftUI for optimal performance
| Feature | Description |
|---|---|
| Theme System | Light, Dark, OLED Dark, Sandstone, Ocean, Forest, Solarized modes with 11 accent colors |
| App Lock | Biometric (Face ID / Touch ID) + PIN protection for app data |
| Accessibility | Increase Contrast toggle for improved legibility |
| Home Shell | Sidebar navigation with DMs, Favorites, and Guilds sections |
| Chat Interface | Message bubbles, reactions, voice messages, rich attachments, inline replies |
| GIF Support | Pick and send GIFs via the system document picker |
| Quick Switcher | Cmd-K switcher to jump between channels and DMs instantly |
| Navigation | Customizable tab bar with floating compose button |
| Notifications | Push notifications with mentions, DMs, calls |
| Voice/Video Calls | CallKit native integration for calls |
| Voice Channels | Join voice channels with participant tracking and speaking indicators |
| Presence | Real-time user online/offline/idle status via PresenceStore |
| Image Caching | Efficient async image loading with in-memory cache |
| Profile | User profiles with stats and customization |
| Settings | Comprehensive settings with appearance options |
| Onboarding | Welcome flow with web-based OAuth login |
| Authentication | Secure token storage in Keychain with web OAuth flow |
| Composer | Rich message composer with attachments, GIFs, and voice recording |
| Search | Global search for messages and content |
| Messages View | Dedicated messages/DMs interface |
| Starred Channels | Persistent favorites synced across sessions |
- Hexagon Branding: Fluxer logo-inspired shapes throughout
- Inline Replies: Long-press any message to reply
- Custom Context Menus: Long-press channels/servers for quick actions
- Toast Notifications WIP: Visual feedback for actions
- Smooth Animations: Spring-based transitions
- Haptic Feedback: Tactile responses for interactions
- Adaptive Colors: Dynamic text and background colors
- Real-time: WebSocket events for messages, calls, and presence
flukavike/
βββ FluxerApp.swift # App entry point with push setup
βββ Services/
β βββ APIService.swift # Fluxer REST API client
β βββ WebSocketService.swift # Real-time Gateway connection
β βββ WebAuthService.swift # Web-based OAuth authentication
β βββ KeychainTokenStore.swift # Secure token storage
β βββ FluxerCallService.swift # CallKit & voice calls
β βββ AudioRecorderService.swift # Voice message recording
β βββ AudioPlayerService.swift # Voice message playback
β βββ BiometricLockService.swift # App lock (Face ID/Touch ID + PIN)
β βββ PushNotificationService.swift # APNs handling
β βββ UserCache.swift # In-memory user object cache
β βββ SiriDonationService.swift # Siri intent donation
βββ Stores/
β βββ ThemeManager.swift # Theme & app state management
β βββ ImageCache.swift # Async image caching
β βββ PresenceStore.swift # Real-time user presence
β βββ StarredChannelsStore.swift # Persisted starred channels
βββ Models/
β βββ Models.swift # Data models (User, Message, Server, etc.)
βββ Views/
β βββ Main/
β β βββ MainTabView.swift # Bottom tab navigation
β β βββ OnboardingView.swift # Welcome & login flow
β β βββ WebLoginView.swift # Web-based OAuth login
β β βββ WebAPILoginView.swift # API-based login fallback
β βββ Home/
β β βββ HomeShellView.swift # Sidebar shell (DMs / Favorites / Guilds)
β β βββ HomeView.swift # Home dashboard content
β β βββ GuildNavigationView.swift # Server/guild navigation sidebar
β β βββ ChannelListView.swift # Channel browser
β β βββ StarredChannelsView.swift # Starred channels list
β βββ Messages/
β β βββ MessagesView.swift # Direct messages view
β βββ Chat/
β β βββ ChatView.swift # Message interface with inline replies
β βββ Call/
β β βββ CallView.swift # Active call UI
β β βββ VoiceChannelView.swift # Voice channel grid
β βββ Compose/
β β βββ ComposeView.swift # Message composer
β βββ Search/
β β βββ SearchView.swift # Global search
β βββ Notifications/
β β βββ NotificationsView.swift
β βββ Profile/
β β βββ ProfileView.swift
β βββ Settings/
β β βββ SettingsView.swift
β β βββ PinSetupView.swift # PIN enrollment/change for app lock
β βββ Common/
β βββ CommonViews.swift # Shared UI components
β βββ AppLockView.swift # Biometric + PIN lock overlay
β βββ CachedAsyncImage.swift # AsyncImage wrapper with caching
β βββ QuickSwitcherView.swift # Cmd-K channel/DM quick switcher
β βββ GIFDocumentPicker.swift # System GIF file picker
β βββ ContextMenus.swift # Channel/server/DM context menus
β βββ HCaptchaView.swift # hCaptcha verification
βββ Intents/
β βββ FlukavikeIntents.swift # Siri intent definitions
βββ docs/
βββ DESIGN.md # Design system documentation
βββ SPEC.md # Technical specification
βββ API_REFERENCE.md # Fluxer API documentation
βββ API_INTEGRATION.md # Integration guide
βββ SIRI_INTEGRATION.md # Siri setup guide
βββ PUSH_CALL_SETUP.md # Push notification setup
βββ PREVIEW.md # Preview/testing guide
βββ ACCESSIBILITY.md # Accessibility features
- iOS 26.4
- Xcode 15.0+
- Swift 5.9+
- CocoaPods (for dependencies)
- Clone the repository
- Run
pod installin the project directory - Open
flukavike.xcworkspacein Xcode - Select an iOS Simulator or device
- Build and run (β+R)
Edit ThemeManager.swift:
enum AppTheme: String, CaseIterable, Identifiable {
case system = "System"
case light = "Light"
case dark = "Dark"
case oled = "OLED Dark"
case sandstone = "Sandstone"
case ocean = "Ocean"
case forest = "Forest"
case solarized = "Solarized"
case yourTheme = "Your Theme" // Add here
}enum AccentColor: String, CaseIterable, Identifiable {
// ... existing colors
case yourColor = "Your Color"
var color: Color {
switch self {
// ... existing cases
case .yourColor: return Color(red: ..., green: ..., blue: ...)
}
}
}| Home | Chat | Profile | Settings |
|---|---|---|---|
| Server pills, recent conversations | Message bubbles, reactions | User stats | Themes, accent colors |
Do not simplify the MessageReference or EmojiObject structs in Models.swift.
Fluxer's API returns two objects that cannot be decoded as [String: String]:
-
message_referenceβ contains atypefield with an integer value alongside string fields. Decoding as[String: String]throws atypeMismatcherror that propagates up and fails the entire message array, breaking history loading on any channel with replied-to messages. -
emoji(inside reactions) β containsid(integer or null) andanimated(bool) alongside thenamestring. Same consequence: one bad reaction kills the whole channel decode.
Both are handled with private typed structs (MessageReference, EmojiObject) that only decode the fields actually needed, with try? used at the call sites so any unexpected shape produces a nil rather than a throw.
File: Models/Models.swift β search for β οΈ WARNING to find all three affected sites.
Do not change how channels are fetched without reading this first.
Fluxer does not return channel data from the REST endpoint GET /guilds/{id}/channels β that endpoint always returns an empty array [] for regular user tokens, regardless of guild membership or permissions.
Channels are delivered exclusively through the WebSocket Gateway READY event, the same pattern Discord uses for large guilds. The READY payload includes a guilds array where each guild object contains its full channel list.
The channel loading flow is:
FluxerAppconnects the WebSocket on login- When the Gateway sends
READY,onReadystoresready.guildsintoAppState.gatewayGuilds HomeView.loadChannels(for:)checksappState.gatewayGuildsfirst and uses the channels from thereHomeViewhas an.onChange(of: appState.gatewayGuilds)observer that reloads channels if the READY event arrives after the initial server list load- The REST call at the bottom of
loadChannelsis a last-resort fallback only (it will return[]on Fluxer but may work on other compatible instances)
Files involved:
FluxerApp.swiftβwebSocketService.onReadycallbackStores/ThemeManager.swiftβAppState.gatewayGuildsViews/Home/HomeView.swiftβloadChannels(for:)and.onChange(of: appState.gatewayGuilds)
Full biometric protection with fallback PIN. Lock screen appears on app background/foreground and at launch.
New sidebar-driven layout with separate sections for DMs, Favorites, and Guilds. Replaces the previous tab-based home screen.
Cmd-K (keyboard) or swipe-accessible switcher to jump between any channel or DM without navigating the sidebar.
Attach GIFs directly from the system file picker in the message composer.
Real-time online, idle, and offline status for users powered by WebSocket Gateway events.
All avatars and media load via an in-memory cache to eliminate redundant network requests and reduce jank.
Overhauled chat view with better message grouping, user caching to avoid repeated API lookups, and smoother scroll behavior.
Updated voice channel grid with improved speaking indicators and participant tracking.
Mark channels as favorites for quick access; state persists across sessions.
All actions provide visual feedback via toast notifications that appear at the bottom of the screen.
- Basic UI structure
- Theme system
- Navigation
- Web-based OAuth authentication
- Fluxer API client
- WebSocket connection
- Real-time messaging
- Gateway-based channel loading
- Push notifications
- CallKit integration
- Inline message replies
- Voice messages
- Search functionality
- Toast notification system
- App Lock (Face ID / Touch ID + PIN)
- GIF attachment support
- Quick Switcher (Cmd-K)
- Image caching
- User presence tracking
- Screen sharing
- Widgets
- iPad multi-column support
- Siri integration
- Share extension
- Design System β UI/UX guidelines and design tokens
- API Reference β Fluxer API documentation
- API Integration β Integration guide
- Push & Call Setup β Push notification configuration
- Siri Integration β Siri setup guide
- Accessibility β Accessibility features
New to Swift/SwiftUI? Here are some helpful resources:
This is a learning project! Feel free to:
- Fork and experiment
- Submit improvements
- Report issues
- Share your own versions
MIT License - feel free to use this as a starting point for your own projects.
- Built for the Fluxer platform
- Created for educational purposes
Made with SwiftUI