К содержимому
Ricklayer
RUEN
← Все кейсы

04 · Площадка для жизни в Сербии на 12 языках

Kvart

Площадка для жизни в Сербии на 12 языках

Жилье, вещи, мастера и услуги для тех, кто не читает по-сербски. Своя площадка с объявлениями, чатами, проверкой личности, оплатой и AI-помощником: 12 языков, 73 936 строк TypeScript за 3 недели и 741 тест, включая атакующие.

Свой набор иконок

Для площадки мы разработали 126 иконок в одном стиле: объемные для разделов и каталога в фирменном синем и линейные значки интерфейса, от ленты до кабинета.

Иконки из приложения Kvart

0

объемных иконок разделов и каталога

0

линейных значков интерфейса

Как собрали систему иконок

Начинали с короткой задачи: иконки для четырех разделов. Мы предложили не рисовать их по одной, а собрать систему: общие палитра, материал и камера, один промпт, в котором меняется только предмет, и маскот, собранный нами в Blender. Так набор вырос до 126 иконок и остался цельным.

Промпты из репозитория Kvart

Один промпт на все иконки

Asset type: category icon for Kvart marketplace. Subject: a small sculptural apartment building, 3 stories, rounded cobalt blue facade, four pale lavender windows, warm apricot entrance. Unified brand family: soft rounded geometry, matte molded surfaces, cobalt blue #3b60e4, pale lavender #d9d8f2, warm apricot #f3b58d. Recognizable at 100px, slight elevated front three-quarter camera, 80% of a square canvas, pure white background. No text, logos or watermark.

Меняется только предмет: стиль, палитра, камера и кадр общие, поэтому новая иконка встает в ряд с первого раза

#3b60e4#d9d8f2#f3b58d

Квартик: попробуйте сами

Мы подготовили и обучили AI-помощника для Kvart: характер, база знаний по законам Сербии, умения считать дни пребывания и искать по площадке. Ниже его интерфейс в том виде, в каком он работает на проде: выберите вопрос или напишите свой.

Интерфейс из приложения Kvart, ответы в демо заглушка

Квартик

Привет! Чем помочь?

Помощник по жизни в Сербии: считает безвизовые дни, ищет жилье, вещи и мастеров на Kvart, объясняет законы со ссылками на источники.

Квартик помогает разобраться, но не заменяет юриста и МУП. Здесь тестовая среда, живой Квартик на kvartrs.com.

Квартик учится дальше

В основе модель, выученная на огромных массивах текста. Поверх нее мы дали Квартику характер и знания Kvart, а теперь он учится на разговорах пользователей: с их согласия, по оценкам «хорошо» и «плохо», без имен, почт и номеров.

На экране процесс дообучения на Mac Studio, цифры в нем выдуманные

Mac Studio M5 Ultra

Наш ML-инженер занимается обучением модели

Процесс как у нас: набор только с согласия и без личных данных, дообучение на Mac Studio, проверка судьей. Цифры на экране выдуманы

Объем работы и тесты

За три недели почти 74 тысячи строк. Ни одна выкладка не уходит на сервер, пока не пройдет весь круг проверок: от поиска ключей в коде до браузера и атак на собранный сайт. На экранах показано, как идет работа: макет, тесты со сканерами и мутациями, сервер, и как все это сходится и уходит в прод через два чистых круга.

Сцены на экранах приближены к настоящей работе, данные в них выдуманные

Дизайнер и 3D-художник
Разработчик и QA
DevOps-инженер

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

Задача

Релоканты и туристы в Сербии ищут жилье и услуги на местных сайтах на сербском. Язык становится главным барьером, а объявлениям трудно доверять.

Задача: своя площадка, где все, от ленты до переписки, на языке человека, а собственники проверены.

Срез по слоям

Интерфейспиксель
Светлый сайт с фирменным синим, сначала телефон, поиск словами, чат как мессенджер, темная рабочая среда модератора
Логикаденьги и правила
Жилье, товары, мастера, трансферы, модерация с причиной на языке собственника, платное продвижение, AI-помощник
Данныесхема и миграции
54 таблиц, 72 миграций на SQL, переводы объявлений отдельно, личные поля запечатаны шифром
Сервервыкладка и эксплуатация
Свой сервер в Амстердаме, Caddy и PostgreSQL на localhost, выкладка одной командой с авто-откатом, ночные копии
Безопасностьядро
12 классов угроз на каждое решение, мутационные и атакующие тесты, админка на своем хосте за вторым фактором

12 языков без компромиссов

Интерфейс, объявления и письма на языке человека: от русского и сербского до китайского.

  1. 01Тексты интерфейса для 12 языков живут вместе, тест сверяет ключи и подстановки во всех файлах
  2. 02Объявления переводятся в отдельную таблицу, без перевода показываются в оригинале
  3. 03Письма о событиях уходят на языке получателя и без текста переписки: только событие и ссылка

Квартик: AI-помощник

Отвечает про жизнь в Сербии, считает дни без визы и ищет по площадке словами.

  1. 01Claude через Anthropic Messages API, свой характер и правила, ответ идет потоком
  2. 02Законы и сроки только из базы знаний по первоисточникам, каждый пункт со ссылкой на статью
  3. 03Умения на своем коде: калькулятор дней пребывания и поиск по разделам с карточками
  4. 04Цена каждого ответа учитывается в миллионных долях доллара: 15 вопросов в месяц бесплатно, 6 в минуту, суточный потолок трат
  5. 05Защита от инъекций: нельзя подставить роль модели, текст объявлений не считается указаниями, запросы с чужих сайтов отклоняются

Личные данные только шифром

Даже с дампом базы на руках почту, телефоны и переписку не прочитать.

  1. 01Каждое личное поле пишется как kv1. + AES-256-GCM со случайным вектором
  2. 02Метка «таблица.колонка» входит в проверку подлинности: шифр из одной колонки не откроется в другой
  3. 03Почта ищется по отпечатку HMAC-SHA256, ключи выводятся из одного главного через HKDF
  4. 04Шифрует тип колонки в ORM, код сайта работает с обычным текстом
  5. 05Сквозное шифрование переписки отвергнуто осознанно: оно ломает жалобы, модерацию и помощь Квартика

Сервер и выкладка

Прод поднят с нуля и закрыт так, что взлом приложения не дает ни код, ни root.

  1. 01Код принадлежит пользователю выкладки, приложение работает от системного пользователя без оболочки и sudo, пишет в три каталога
  2. 02Песочница systemd: строгая защита системы, свой /tmp, без capabilities, фильтр системных вызовов, потолок памяти
  3. 03Выкладка: проверки → rsync → снимок базы → миграции → сборка → переключение релиза. Не ответил за минуту: ссылка возвращается на прошлый
  4. 04Одна выкладка за раз под блокировкой, хранятся три релиза, откат одной командой

Итог

systemd-analyze security оценивает службу в 1.3 из 10, чем меньше, тем лучше.

Истории с прода

Инцидент 01 · открыт

Бэкап, который не восстанавливался

pg_restore идет с пустым search_path, а функция поиска без акцентов звала unaccent без схемы. Таблицы объявлений не создавались, и это касалось всех прошлых копий.

Инцидент 02 · открыт

Песочница проверена взломом

Настройки песочницы легко написать и не проверить.

Инцидент 03 · открыт

Подмена адреса клиента

Присланные X-Forwarded-For и X-Real-IP могли обмануть лимиты частоты и журнал.

Стек

Next.js 16 · React 19 · TypeScript strict · Tailwind 4 · next-intl · Drizzle · PostgreSQL 17 · Zod · Vitest · Playwright · Claude API · Caddy · systemd