Open source

Ledgerline

Open-⁠source-платформа, сделана с Claude Code · Платёжная платформа, устроенная как банковская

Платёжная платформа, в которой деньги никогда не создаются, не теряются и не проводятся дважды: двойная запись на журнале событий, карточные платежи и выплаты как саги, outbox в Kafka, проверка на мошенничество в потоке, аналитика в ClickHouse, gRPC API для мерчантов и трассировка OpenTelemetry — всё доказано намеренными сбоями.

Ledgerline — превью

Задача

Платёжные системы проверяет день сбоя: потерянный ответ, упавшая база или повторный запрос не должны создать деньги, потерять их или провести дважды — а демо редко это показывают.

Решение

Леджер с двойной записью на журнале событий, саги, которые никогда не гадают, идемпотентность везде и outbox в Kafka, а затем хаос-тесты, нагрузочные тесты, модель мошенничества и оповещения — всё измерено, а не предположено.

Под капотом

Ни потерь, ни двойных проводок в 11 сценариях хаоса и 40 461 запросе; мошенничество поймано на 88% против 37% у правил; ~430 переводов/с на одном ядре; каждое оповещение проверено; онлайн-демо и CI.

Обзор

Ledgerline — open-⁠source-платёжная платформа, которую я сделал с Claude Code, чтобы показать, что нужно ядру банка: деньги никогда не создаются, не теряются и не проводятся дважды, даже когда всё вокруг ломается. Леджер с двойной записью на Kotlin и Spring Boot ведёт неизменяемый журнал событий в PostgreSQL; остатки — проекции, восстанавливаемые из него, каждая запись идемпотентна, а аудит пересчитывает книги. Карточные платежи, возвраты и выплаты работают поверх него как конечные автоматы и саги, а каждое изменение попадает в Kafka через транзакционный outbox.

Это доказано сбоями под нагрузкой: сервисы, PostgreSQL и Kafka убиваются, сеть рвётся, ответы обрываются на середине, а клиент продолжает платить. В 11 сценариях хаоса и 40 461 запросе (4 188 из них отправлены дважды одновременно) проверка не нашла ни потерь, ни двойных проводок. Нагрузочные тесты нашли узкие места: леджер проводит около 430 переводов в секунду на одном ядре и отклоняет лишнее, а не падает.

Модель LightGBM на признаках из Kafka в реальном времени поймала 88% мошенничества при 0,7% ложных отказов против 37% у настроенных правил, по скрытой разметке симулятора; аналитика в ClickHouse сходится с леджером до копейки. Мерчанты получают gRPC API, подписанные вебхуки и SDK на TypeScript: когда сервис убили посреди платежа, все 1 085 изменений всё равно дошли до тестового магазина. Трассы идут за платежом через outbox, воркер и вебхуки, а каждое оповещение проверено внесением той неисправности, за которой оно следит.

Что делает

  • Леджер с двойной записью на Kotlin и Spring Boot поверх неизменяемого журнала событий в PostgreSQL: идемпотентные операции, никакого ухода в минус при любой конкуренции и аудит, пересчитывающий книги
  • Карточные платежи, возвраты и выплаты в смоделированный ненадёжный банк — конечные автоматы и саги; каждое изменение попадает в Kafka через транзакционный outbox
  • Мошенничество оценивает в потоке модель LightGBM на признаках из Kafka, измеренная по скрытой разметке симулятора; аналитика в ClickHouse сходится с леджером до копейки
  • gRPC API, подписанные вебхуки и SDK на TypeScript для мерчантов; трассы, идущие за платежом через outbox, воркер и вебхуки; SLO-оповещения, проверенные внесением каждой неисправности

Что дальше

Ищете full-⁠stack- или Python-разработчика — или нужно сделать что-то похожее? Давайте обсудим.

Открыт к предложениям: офис или гибрид в Москве, либо удалённо; полная занятость или контракт. Отвечаю в течение 48 часов, в Telegram — быстрее.

Связаться TelegramСкачать резюме

Альхассан Альфарран.

© 2026 · Спроектировал и сделал сам. Стек сайта: Next.js, Tailwind и Framer Motion.

Моё местное время: · Москва

Заметки
Как устроен этот сайт

Стек

Next.js (App Router) и React, стили на Tailwind CSS, анимации на Framer Motion. Форма обратной связи отправляет письма через Resend, сайт размещён на Vercel.

Три языка, одна вёрстка

У английской, русской и арабской версий свои адреса (/en, /ru, /ar), а собраны они из одних и тех же компонентов. В вёрстке используются логические CSS-свойства (start/end вместо left/right), поэтому арабская версия отражается справа налево без отдельных стилей. Сервер отдаёт каждую страницу сразу с нужным языком и направлением текста, так что после загрузки ничего не перескакивает, а арабский шрифт загружается, только когда на экране есть арабский текст.

Скорость и доступность

Секции ниже первого экрана не отрисовываются, пока страница не прокручена до них, а быстрое меню загружается при первом открытии. Всем можно пользоваться с клавиатуры — есть ссылка для перехода к содержимому и заметный фокус, — а анимации отключаются, если в системе включено уменьшение движения.

Исходный код на GitHub