Developing a Mobile Application for Job Board
A Senior iOS Developer position posted on job boards at 9:15 AM — by 11:00 there were 47 applications, by 2:00 PM the employer closed applications. A mobile job board user saw the listing at 3:30 PM because the app didn't notify them. Mobile job board without relevant push notifications is just a mobile version of a website.
Search and Matching Architecture
Job board core is a search engine. For small boards (up to 100K listings) — PostgreSQL with full-text search (tsvector, tsquery, pg_trgm). As it grows — Elasticsearch or MeiliSearch (easier to operate, suits mobile clients with autocomplete well).
"Job seeker → Job" matching for push notifications is built on subscriptions. Job seeker saves a search query (position, salary from, city, work format) as a "Saved Search". When new job matching the filters appears, system sends notification.
Implementation via trigger in database or via queue: new job added → matching job launches against all active subscriptions → list of candidates → batch push via FCM.
With many subscriptions, SQL matching becomes slow. Then — index in Elasticsearch with pre-built percolator queries: document (job) "runs through" all saved searches in O(1) instead of N sequential SELECT.
Mobile Client: Key Screens and Technical Complexity
Search with Filters — most loaded screen. Filters: city (geolocation via CoreLocation/FusedLocationProvider), category, employment type, salary, experience, format (office/remote/hybrid). Filters apply instantly with 400ms debounce on each input — API request doesn't fly on every keystroke.
Job Card — rich content: description with formatting (Markdown or HTML), tech stack as tags, map with office location (MapLibre or Yandex Maps SDK). Card loading lazy, map initializes only on scroll.
Application — most important scenario for conversion. One-tap apply if resume already uploaded. Cover letter — optional, with templates. Application status tracked in "My Applications" section, updated via push.
Push Notifications for Job Seeker:
- "New job matching your query: Senior iOS, Moscow, 350K"
- "Employer viewed your resume"
- "Interview invitation"
- "New message from recruiter"
Push Notifications for Employer (separate app or cabinet):
- "New application for job"
- "Candidate accepted/declined invitation"
Two-Way Communication: Messenger Within App
Job board without built-in chat forces sides to WhatsApp/Telegram, losing context. Messenger — competitive advantage and retention factor.
Implementation: WebSocket connection (Socket.io or Centrifugo) for real-time, REST for history. Message storage in PostgreSQL. Push notifications about new messages via FCM when user offline.
On Flutter — flutter_chat_ui as basic component or custom implementation on ListView.builder with reverse scroll.
Profile and Resume
Resume upload in PDF and DOC formats. On iOS — UIDocumentPickerViewController, on Android — Intent.ACTION_GET_CONTENT. Document uploaded to server (S3-compatible storage), parsed for profile completion (optionally — via GPT API for autofill).
Profile photo with crop — image_cropper on Flutter, compression before upload via flutter_image_compress.
Technology Stack and Timeline
Frontend: Flutter (single codebase iOS + Android) or React Native. Flutter preferable for smooth card animations.
Backend: Node.js or Go + PostgreSQL + Redis (sessions, search cache) + Elasticsearch (full-text search).
Push: Firebase Cloud Messaging + APNs.
| Scale | Features | Timeline |
|---|---|---|
| MVP | Search, jobs, applications, basic push | 8–10 weeks |
| Standard | + Chat, employer cabinet, analytics | 14–18 weeks |
| Extended | + AI matching, video resume, ATS integrations | 22–28 weeks |
Cost calculated individually after requirements analysis.







