← Усі кейси
Цифровий продукт · Креаторська економіка

Челенджі креаторів на леджері, який завжди сходиться.

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

Челенджі креаторів на леджері, який завжди сходиться.
>20 minсередній час у застосунку
12незалежних доменних модулів
0операцій з плаваючою крапкою в розрахунках
75+REST-ендпоїнтів, задокументованих через OpenAPI
~27kрядків Python без міграцій
~21kрядків TypeScript у 49 маршрутах
Індустрія
Креаторська економіка / соціальні розваги
Формат
Повний цикл розробки продукту (бекенд + вебзастосунок)

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
Ваш проєкт

Є процес, який варто покращити?

Покажіть, що відбувається зараз. Ми допоможемо визначити, що варто змінити і що варто будувати.

Обговорити проєкт