Челенджі креаторів на леджері, який завжди сходиться.
Розважальна платформа на кредитах: креатори публікують реальні челенджі, а аудиторія бере участь за внутрішні кредити. В основі — аудитований цілочисельний леджер, автоматична модерація та рушій розрахунків без жодної операції з плаваючою крапкою.

- Індустрія
- Креаторська економіка / соціальні розваги
- Формат
- Повний цикл розробки продукту (бекенд + вебзастосунок)
Heads Up дає будь-якому користувачу стати креатором, відкрити Room і публікувати челенджі, до яких аудиторія приєднується за кредити платформи. Паралельно працюють два формати: паріматюельний прогноз, де учасники обирають один із 2–5 результатів, і формат подань, де учасники сплачують внесок і завантажують фото чи відео, які суддя розставляє по місцях. Кожен рух кредитів записується в незмінний леджер, кожне відео проходить автоматичну модерацію, а комісія платформи ділиться з монетизованими креаторами за налаштовуваною ставкою.
Продукт свідомо не є азартною грою. Кредити не мають грошової вартості, не виводяться і не залишають систему інакше, ніж через результати челенджів. Це обмеження визначило доменну мову, поверхню API та комплаєнс-позицію всієї розробки.
З чим ми мали справу
- Фінансовий леджер, якому не можна «пливти». На кожному розрахунку кредити рухаються між тисячами учасників, зверху — комісія платформи, частка креатора та залишки від округлення. Один цент розходження, накопичений за багато розрахунків, зробив би баланси незвідними, а кожну квитанцію про виплату — недоказовою.
- Два економічно різні формати на одному гаманці. Прогнозні челенджі пропорційно перерозподіляють пул тих, хто програв, між переможцями. Челенджі з поданнями збирають внески і виплачують фіксовану таблицю місць. Обидва мали списувати з одного балансу, лишати однаковий аудиторський слід і віддавати однаковий формат квитанції, без протікання правил одного формату в інший.
- Відео від користувачів у центрі продукту. Учасники завантажують відеоподання та відеокоментарі. Публікувати немодерований контент неприпустимо юридично і з погляду безпеки платформи, але блокувати кожне завантаження синхронною перевіркою зробило б продукт непридатним.
- Результати, що мають чесно закриватися, коли ніхто не дивиться. Челенджі блокуються за дедлайном незалежно від того, з’явився креатор чи ні. Без розв’язання кредити учасників зависають назавжди. Система мала сама закривати, розв’язувати, виплачувати і повертати — правильно і рівно один раз.
Як ми це вирішили
- Цілочисельний леджер із блокуванням на рівні рядка. Кредити зберігаються як цілі мінорні одиниці з чотирма знаками після коми, жодних float на грошовому шляху. Кожна мутація бере блокування SELECT FOR UPDATE на гаманці, перевіряє невід’ємність балансу і пише незмінний рядок транзакції з результуючим балансом і структурованим reference ID. «Пил» від округлення при пропорційному розподілі детерміновано віддається найбільшому учаснику, а не тихо відкидається.
- Розрахунок як чиста функція. Паріматюельний рушій — функція без бази даних: приймає ставки, оголошені результати, ставку комісії та частку креатора і повертає рядки виплат, розподіл комісії та «пил», усе в цілочисельній арифметиці. Оркестрація (блокування рядків, запис виплат, зарахування на гаманці) винесена назовні. Найскладнішу логіку продукту стало можливо вичерпно тестувати за мілісекунди, включно зі скасуваннями, нічиїми, односторонніми пулами та депозитами креаторів.
- Асинхронна модерація з fail-closed за замовчуванням. Завантаження приймаються одразу і ставляться в чергу Celery, де відео оцінює багатоголовий API візуальної модерації, а посилання перевіряє Google Web Risk. Позначений контент видаляється, а його тіло редагується; шлях ескалації для захисту дітей позначає перевірку критичною та логує її для людини. Пороги та класи позначення налаштовуються через оточення на збережених відповідях провайдера, тож зміна політики не потребує деплою.
- Планові задачі життєвого циклу, які володіють годинником. Періодичні задачі Celery блокують прострочені челенджі, автоматично розв’язують результати за голосуванням спільноти, фіналізують челенджі з поданнями після пільгового вікна, повертають депозити креаторів при скасуванні та видають бейджі. Кожна ідемпотентна і захищена явними перевірками передумов, а не перехопленням порушень обмежень БД, тож повтор чи накладання запусків не подвоїть виплату.
Вимірний результат
- Леджер, що сходиться за побудовою. Цілі мінорні одиниці, обов’язкові блокування рядків і append-only журнал транзакцій означають, що кожен баланс у системі виводиться з його історії. Будь-який учасник може отримати квитанцію по челенджу з розміром пулу, комісією, часткою креатора і власним рядком.
- 816 автотестів, зосереджених на грошовому шляху. Розрахунок, ставки, фіналізація та мутації гаманця покриті сценаріями скасування, нічиєї, одностороннього пулу і повернення. Регресії в найризиковішому коді спливають у CI, а не в продакшн-балансах.
- Модерація, що масштабується без черги людей. Перевірка відео та посилань повністю працює у фоні з повторами та backoff. Продукт випускає користувацький контент без рецензента в контурі, зберігаючи повний аудиторський слід відповідей провайдера для налаштування порогів і ескалації.
- Дві економіки челенджів на одній платформі. Прогнозний формат і формат подань працюють паралельно з незалежними ставками комісії, незалежними правилами життєвого циклу та спільним гаманцем, леджером і квитанціями, тож нові формати додаються без розкриття фінансового ядра.
Під капотом
- Бекенд Django 5.2 і Django REST Framework у 12 доменних модулях (users, creators, wallet, payments, challenges, submit challenges, engagement, badges, stats, files, observability, common). Бізнес-логіка живе у виділених сервісних класах, ніколи у views чи serializers; Django signals заборонені повністю, тож кожен побічний ефект простежується до явного виклику. 100% покриття типами, контролюється у pre-commit.
- Дані PostgreSQL 16. Гроші як мінорні одиниці в PositiveBigIntegerField, унікальність і check-обмеження на рівні БД для доменних інваріантів, явні передумови через .exists() замість бізнес-правил на виключеннях.
- Асинхронність Celery 5 на Redis для модерації, перевірки посилань, блокування челенджів, автофіналізації, видачі бейджів і прибирання осиротілих файлів.
- Фронтенд Next.js 16 з React 19, TypeScript і Tailwind 4, 49 маршрутів. Шар репозиторіїв ховає кожен виклик API за інтерфейсом, а mock-реалізації дозволили будувати й демонструвати UI до готовності ендпоїнтів.
- Інтеграції Stripe Checkout із підписаними ідемпотентними вебхуками для купівлі кредитів; AWS S3 із presigned URL для медіа; TheHive.ai для візуальної модерації; Google Web Risk для безпеки посилань; Sentry плюс структуровані JSON-логи з кореляцією X-Request-ID між HTTP і Celery.
- Доставка Docker Compose на AWS EC2, CI/CD на GitHub Actions, агрегація логів у CloudWatch, Flower для видимості черг.
Що використали
- Python
- Django
- Django REST Framework
- PostgreSQL
- Celery
- Redis
- Next.js
- React
- TypeScript
- Tailwind CSS
- Stripe
- AWS EC2
- AWS S3
- Docker
- GitHub Actions
- Sentry
- AI Content Moderation
- OpenAPI