← appsuper.ru Кейс проекта · 2026
kniginapolke.ru P2P-буккроссинг

Книжная полка

Прочитанную книгу нельзя оставлять пылиться.

Социальная платформа для обмена бумажными книгами с соседями, коллегами и друзьями. Компьютерное зрение, интерактивные карты, real-time-база данных и живое invite-only-сообщество — спроектировано, написано и развёрнуто в одиночку.

React 19 + TypeScript Gemini Vision Firestore real-time ~25 МБ RAM в проде Nginx · PM2 · SSL
Листайте вниз
01 — Что это

Буккроссинг нового поколения

«Книжная полка» превращает вашу личную библиотеку в общую. Никаких магазинов, посредников и рекламы — только живой обмен книгами между людьми, которые рядом. Это про чтение, общение и экологичное потребление: одна бумажная книга проживает много жизней вместо того, чтобы пылиться на полке.

Сообщество закрытое, invite-only — так между участниками сохраняется высокий уровень доверия. Вы делитесь книгами с теми, кого пригласили, и с теми, кто пригласил их.

Шеринг-экономикаБез коммерцииБез рекламы Invite-onlyЛокальное сообщество
02
Как это работает

Путь одной книги — от полки до полки

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

1
Добавляете книгу
Сфотографируйте обложку или введите название вручную — метаданные и официальная обложка подтянутся автоматически.
2
Она появляется на карте
Книга привязывается к точке встречи (кафе, коворкинг), а не к вашему домашнему адресу.
3
Сосед находит её рядом
В радиусе 3 км — по названию, автору или просто листая ближайшие полки.
4
Отправляет запрос на обмен
Вы получаете уведомление в реальном времени — без перезагрузок и ожидания.
5
Оба подтверждают обмен
И только теперь открываются контакты (Telegram). До этого момента они скрыты с обеих сторон.
6
Встречаетесь и передаёте книгу
Счётчики обменов растут, разблокируется ачивка — а книга начинает новую жизнь.
03
Возможности

Шесть вещей, которые делают магию

Каждая функция — это отдельный инженерный вызов: от компьютерного зрения до атомарных операций в облачной базе. Ниже — интерактивные демонстрации. Попробуйте сами.

01 Карта и геолокация

Книги рядом с вами

Пользователи отмечают на карте удобную точку для встреч — кафе или коворкинг — не раскрывая домашний адрес. Поиск учитывает геолокацию: вы видите книги в радиусе 3 км, а расстояние считается по формуле гаверсинусов прямо на клиенте.

Leaflet + OpenStreetMap · геокодирование через Nominatim
Haversine formula — точный расчёт по координатам сферы
РАДИУС 3 КМ Вы
Наведите на метку — увидите книгу и расстояние
d = 2R · arcsin√( sin²(Δφ/2) + cosφ₁·cosφ₂·sin²(Δλ/2) )
02 AI-сканирование обложки

Сфотографируй — и книга уже на полке

Наведите камеру на обложку. Снимок уходит в Google Gemini через официальный GenAI SDK — модель мгновенно распознаёт название и автора по изображению с точностью до 98% и сама заполняет форму добавления.

@google/genai · модель gemini-3-flash-preview
Мультимодальный ввод: изображение → структурированные данные
Дюна
Фрэнк Герберт
Название
Автор
✓ Распознано · 98% точность
03 AI-автодополнение

Подсказки на лету

При ручном вводе приложение в реальном времени обращается к Gemini за релевантными подсказками. Чтобы не жечь токены и не подвешивать интерфейс, запрос уходит через debounce 300 мс и только после 3 символов.

Начните печатать в поле справа →
Запрос уходит, когда вы остановились, а не на каждую букву
✨
debounce 300 мс·мин. 3 символа ·ожидание
    04 Обогащение метаданных

    Обложка находится сама

    Как только известны название и автор, приложение обращается к Open Library API и подтягивает официальную обложку книги. Полка выглядит красиво без единого действия пользователя.

    Open Library API · Fetch
    Автоматический поиск обложки по названию + автору
    ?
    Название + автор
    введено
    данные книги
    →
    Мастер и Маргарита
    М. Булгаков
    обложка подтянута
    05 Геймификация и удержание

    Ачивки, и кролик 🐇

    Система достижений за приглашения, добавленные книги и обмены — с эффектной анимацией разблокировки на Framer Motion. А ещё по экрану бегает интерактивный кролик и съедает случайно появляющиеся цветы 🌸. Маленькая радость, которая делает продукт живым.

    Framer Motion · пасхалка как часть нарративного дизайна
    Кинь цветок кролику — он его найдёт →
    Съедено цветов: 0
    06 Приватность контактов

    Контакты — только по согласию

    Telegram-юзернейм скрыт и открывается только после того, как обе стороны подтвердили обмен. Никакого спама и случайных сообщений — доверие встроено в саму механику.

    Двустороннее подтверждение → раскрытие контакта
    Нажмите обе кнопки справа →
    А
    Анна · «Дюна»
    @anna_reads
    Контакт скрыт — ждём подтверждения обеих сторон
    04
    Архитектура

    Как всё соединено

    Тонкий React-клиент напрямую работает с облачными сервисами Firebase и внешними API, а лёгкий Node-сервер за Nginx раздаёт статику в продакшене. Наведите на узел, чтобы подсветить связи.

    React SPA TypeScript · Vite Tailwind · Framer Firebase Auth авторизация Cloud Firestore real-time · onSnapshot Gemini Flash Vision + Text Open Library обложки книг Nominatim геокодирование Express раздача статики Nginx reverse proxy PM2 процессы Certbot Let's Encrypt · SSL
    клиент → облачные сервисы AI-слой инфраструктура
    05
    База данных

    Денормализованная под скорость

    Firestore спроектирован документоориентированно и денормализованно — ради минимальных задержек и работы real-time-слушателей. Координаты встречи копируются в документ книги, чтобы гео-запросы были мгновенными.

    👤/users
    Профильимя · аватар · tg
    Точка встречиlat · lng
    Статистикакниги · обмены
    ИнвайтыinviteCode
    ПригласившийinvitedBy
    📚/books
    Метаданныеназвание · автор
    ОбложкаcoverUrl
    Координатыlat · lng
    Статусavailable…booked
    БроньuserId · контакт
    🌍/globalStats
    Всего обменовincrement()
    Агрегатыатомарно
    Обновлениеreal-time
    Метрикиплатформы
    06
    Инженерные вызовы

    Где было по-настоящему трудно

    Три задачи, которые отличают учебный проект от продакшена — и как они были решены.

    CASE 01

    Деплой на сервере с 1 ГБ RAM без swap

    ~25 МБ
    RAM в проде
    Проблема

    VPS имеет всего 1 ГБ памяти и ноль swap-пространства. Запуск сборки vite build прямо на сервере мгновенно ронял его: OOM-киллер Linux убивал процесс и сбрасывал SSH-соединение.

    Решение

    Сборка фронтенда вынесена на локальную машину. Готовый оптимизированный бандл из dist/ копируется на сервер через scp -r. Express под PM2 в режиме NODE_ENV=production раздаёт статику, потребляя всего ~25 МБ — сервер стабилен.

    CASE 02

    Real-time-синхронизация без лишних запросов

    0
    перезагрузок
    Проблема

    При обмене статус книги, статистика владельца и получателя должны обновляться мгновенно у всех — без ручного обновления страницы.

    Решение

    Слушатели onSnapshot на коллекциях книг и пользователей. При подтверждении обмена статус транзакционно меняется на booked, а счётчики растут через атомарный increment(). Клиенты получают обновления «по воздуху» и перерисовывают интерфейс сами.

    CASE 03

    Генеративный AI в UI без задержек

    300 мс
    debounce
    Проблема

    Запрос к ИИ на каждую введённую букву означал бы огромный расход токенов и зависания интерфейса в ожидании сети.

    Решение

    Механизм debounce на 300 мс: запрос уходит, только когда пользователь остановился. Плюс минимум 3 символа и graceful fallback — при ошибке сети или превышении лимитов подсказки бесшовно скрываются, не мешая ручному вводу.

    07
    Стек

    Всё одним взглядом

    ⚛️Frontend
    React 19TypeScriptViteTailwind CSSLucide
    🎬Анимации
    Framer MotionMotion
    🗺️Карты и гео
    LeafletReact LeafletOpenStreetMapNominatim
    🤖Искусственный интеллект
    @google/genaigemini-3-flash-previewVision + Text
    🔎Поиск
    Fuse.jsнечёткий поиск на клиенте
    🗄️Backend и БД
    Node.jsExpressFirebase AuthCloud Firestore
    🚀Инфраструктура и деплой
    Ubuntu VPSNginxPM2tsxCertbotLet's Encryptscp
    08
    Итог

    Что демонстрирует этот проект

    01
    Клиент-серверная архитектура SPA
    Проектирование современных приложений на React 19 и TypeScript — от структуры до сборки.
    02
    Облачные базы данных реального времени
    Firestore, слушатели onSnapshot, транзакции и атомарные операции.
    03
    Генеративный AI и компьютерное зрение в UX
    Gemini Vision и Text в реальных пользовательских сценариях — с дебаунсом и fallback.
    04
    Карты, геолокация и внешние API
    Leaflet, гаверсинус, Open Library, Nominatim — интеграции и гео-логика.
    05
    DevOps и администрирование Linux
    Nginx, SSL-сертификация, PM2 и оптимизация ресурсов в продакшене.

    Полка ждёт своего читателя

    Идея, UX, код и деплой — в одиночку. Посмотрите, как это работает вживую.

    Сообщество закрытое, invite-only — вход по приглашению