Everclear Psychic Reading Chat – Real-Time iOS Platform
A scalable iOS app for real-time chat and phone sessions, connecting users with professional advisors for spiritual guidance. Focused on robust architecture, high test coverage, and seamless user experience.
Tech Stack
#Overview
Everclear Psychic Reading Chat is an iOS platform that connects users with professional advisors for personalized guidance through real-time chat and phone sessions. As an iOS engineer on this project, I focused on building a robust real-time communication system, establishing comprehensive automated testing, and creating a scalable architecture that could handle thousands of concurrent users.
The app provides tarot readings, astrology insights, numerology, and other spiritual guidance services through a seamless mobile experience. It's available on the App Store and serves users across multiple regions.
#Screenshots






#What We Built
#Real-Time Chat System with PubNub
The core of the user experience is real-time communication between users and advisors. I implemented the chat system using PubNub, creating a scalable messaging infrastructure that handles thousands of concurrent conversations.
Key engineering challenges solved:
- Message ordering and consistency — ensuring messages appear in the correct sequence even during network interruptions
- Channel-based architecture — isolating conversations with proper permissions and access control
- Connection reliability — robust reconnection logic and message queuing for offline scenarios
- Low-latency delivery — optimizing for sub-second message delivery across global users
The implementation uses reactive streams to handle real-time message flows, providing seamless UI updates and maintaining conversation state across app launches.
#MVVM-C Architecture & Clean Code
I refactored the existing codebase from legacy patterns to MVVM-C architecture, improving maintainability and testability. This involved:
- Separation of concerns — moving business logic out of view controllers into reusable ViewModels
- Navigation & Flow control — centralizing navigation logic in Coordinators to decouple ViewControllers from flow management
- Dependency injection — making network services and external dependencies mockable for testing
- Reactive data binding — using RxSwift to create predictable, testable data flows
- Modular design — organizing features into independent modules with clear interfaces
This transformation made the codebase significantly easier to maintain and enabled rapid development of new features.
#Comprehensive Test Coverage
I established a robust testing culture with both unit and UI automation:
Unit Testing (95% coverage):
- ViewModel testing — validating business logic and state management
- Network layer testing — ensuring API contracts and error handling work correctly
- Reactive stream testing — verifying complex async operations and data transformations
UI Testing (90% coverage):
- API stubbing — eliminated test flakiness by mocking backend responses
- Deterministic test flows — created repeatable test scenarios independent of external services
- CI/CD integration — automated testing on every pull request and release
#Promotional Payment Flows
The app includes sophisticated payment and trial systems, such as "3 free minutes" promotions. I worked on:
- Trial validation — preventing abuse while maintaining smooth user experience
- Payment processing — integrating with payment providers for seamless transactions
- Promotional logic — handling complex business rules for different user tiers and offers
#Impact & Results
- Enabled reliable messaging for 10,000+ active users with 99.9% uptime
- Achieved 95% unit test coverage and 90% UI test coverage across the codebase
- Reduced test flakiness by 80% through API stubbing and deterministic test design
- Improved development velocity by 40% through better architecture and testing practices
- Maintained high app store ratings with consistent 4.5+ star reviews citing reliability
- Supported global scale with users across North America and Europe
#Technical Highlights
Why PubNub for messaging? Real-time messaging at scale requires infrastructure that can handle global message routing, offline queuing, and high availability. PubNub provided this out-of-the-box, allowing us to focus on application logic rather than messaging infrastructure.
Why RxSwift for data flows? Chat applications have complex async operations — incoming messages, typing indicators, connection status, payment flows. RxSwift's reactive patterns made these interactions predictable and testable, especially when multiple async operations needed coordination.
Why comprehensive test automation? In a chat app, user trust depends on reliability. Messages must be delivered, payments must process correctly, and the app must work consistently. High test coverage caught regressions before they reached users and enabled confident releases.
Why MVVM-C over legacy patterns? The original codebase had business logic and navigation scattered across view controllers, making it hard to test and modify. MVVM-C concentrated business logic in testable ViewModels and moved navigation into dedicated Coordinators, making the codebase easier to understand, extend, and navigate.
Key Challenges
- Real-Time Messaging Reliability
- Test Automation & Flakiness Reduction
- Legacy Code Refactoring
- Scalable Architecture
Impact & Results
- Enabled reliable real-time chat for 10k+ users
- Achieved 95% unit test coverage
- Reduced UI test flakiness by 80%
- Improved codebase maintainability and velocity