Розробка мобільного додатка для пошуку роботи (Job Board)
Вакансія на Senior iOS Developer з'явилась на сайтах пошуку роботи о 9:15 — до 11:00 вже 47 відповідей, а до 14:00 роботодавець закрив прием. Користувач мобільного job board побачив вакансію о 15:30, тому що додаток його не сповістив. Мобільний job board без релевантних push-сповіщень — просто мобільна версія сайту.
Архітектура пошуку та матчингу
Ядро job board — пошуковий движок. Для невеликих дошок (до 100K вакансій) — PostgreSQL з повнотекстовим пошуком (tsvector, tsquery, pg_trgm). При зростанні — Elasticsearch або MeiliSearch (простіші в експлуатації, добре підходять для мобільних клієнтів з автокомплітом).
Матчинг «соискатель → вакансія» для push-сповіщень будується на підписках. Соискатель зберігає пошуковий запит (посада, зарплата від, місто, формат роботи) як «Збережений пошук». При появі нової вакансії, що відповідає фільтрам, система відправляє сповіщення.
Реалізація через тригер в базі або через чергу: при додаванні вакансії запуск матчингу проти всіх активних підписок → список соискателів → batch push через FCM.
При великій кількості підписок матчинг на SQL стає повільним. Тоді — індекс в Elasticsearch з pre-built percolator queries: документ (вакансія) «проходить» через всі збережені пошуки за O(1) замість N послідовних SELECT.
Мобільний клієнт: ключові екрани та технічна складність
Пошук з фільтрами — найбільш навантажений екран. Фільтри: місто (геолокація через CoreLocation/FusedLocationProvider), категорія, тип зайнятості, зарплата, досвід, формат (офіс/удалика/гібрид). Фільтри застосовуються миттєво з debounce 400ms на кожний ввід — запит до API не летить при кожному натиску.
Картка вакансії — rich content: опис з форматуванням (Markdown або HTML), стек технологій як теги, карта з офісом компанії (MapLibre або Yandex Maps SDK). Завантаження картки lazy, карта ініціалізується тільки при скролі до неї.
Відповідь — найважливіший сценарій з точки зору конверсії. One-tap apply якщо резюме вже завантажено. Супровідний лист — опціонально, з шаблонами. Статус відповіді відстежується в розділі «Мої відповіді» та оновлюється через push.
Push-сповіщення для соискателя:
- «Нова вакансія за вашим запитом: Senior iOS, Київ, 350K»
- «Роботодавець переглянув ваше резюме»
- «Запрошення на співбесіду»
- «Нове повідомлення від рекрутера»
Push-сповіщення для роботодавця (окремий додаток або кабінет):
- «Нова відповідь на вакансію»
- «Кандидат прийняв/відхилив запрошення»
Двостороння комунікація: месенджер всередині додатка
Job board без вбудованого чату змушує сторони переходити в WhatsApp/Telegram, втрачаючи контекст. Месенджер — конкурентна перевага та фактор утримання.
Реалізація: WebSocket-з'єднання (Socket.io або Centrifugo) для real-time, REST для історії. Зберігання повідомлень у PostgreSQL. Push-сповіщення про нові повідомлення через FCM, коли користувач offline.
На Flutter — flutter_chat_ui як базовий компонент або кастомна реалізація на ListView.builder з reverse scroll.
Профіль та резюме
Завантаження резюме у форматах PDF та DOC. На iOS — UIDocumentPickerViewController, на Android — Intent.ACTION_GET_CONTENT. Документ завантажується на сервер (S3-сумісне сховище), парсується для заповнення профілю (опціонально — через GPT API для автозаповнення).
Фото профілю з обрізкою — image_cropper на Flutter, стиснення перед завантаженням через flutter_image_compress.
Технічний стек та терміни
Frontend: Flutter (єдина кодова база iOS + Android) або React Native. Flutter переважніша для плавних анімацій у картках.
Backend: Node.js або Go + PostgreSQL + Redis (сесії, кеш пошуку) + Elasticsearch (повнотекстовий пошук).
Push: Firebase Cloud Messaging + APNs.
| Масштаб | Функціональність | Термін |
|---|---|---|
| MVP | Пошук, вакансії, відповіді, базові push | 8–10 тижнів |
| Стандарт | + Чат, кабінет роботодавця, аналітика | 14–18 тижнів |
| Розширений | + AI-матчинг, відео резюме, ATS-інтеграції | 22–28 тижнів |
Вартість розраховується індивідуально після аналізу вимог.







