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.
Меняется только предмет: стиль, палитра, камера и кадр общие, поэтому новая иконка встает в ряд с первого раза

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

Привет! Чем помочь?
Помощник по жизни в Сербии: считает безвизовые дни, ищет жилье, вещи и мастеров на Kvart, объясняет законы со ссылками на источники.
Квартик помогает разобраться, но не заменяет юриста и МУП. Здесь тестовая среда, живой Квартик на kvartrs.com.
Квартик учится дальше
В основе модель, выученная на огромных массивах текста. Поверх нее мы дали Квартику характер и знания Kvart, а теперь он учится на разговорах пользователей: с их согласия, по оценкам «хорошо» и «плохо», без имен, почт и номеров.
На экране процесс дообучения на Mac Studio, цифры в нем выдуманные

Mac Studio M5 Ultra
Наш ML-инженер занимается обучением модели
Процесс как у нас: набор только с согласия и без личных данных, дообучение на Mac Studio, проверка судьей. Цифры на экране выдуманы
Объем работы и тесты
За три недели почти 74 тысячи строк. Ни одна выкладка не уходит на сервер, пока не пройдет весь круг проверок: от поиска ключей в коде до браузера и атак на собранный сайт. На экранах показано, как идет работа: макет, тесты со сканерами и мутациями, сервер, и как все это сходится и уходит в прод через два чистых круга.
Сцены на экранах приближены к настоящей работе, данные в них выдуманные



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

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

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

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

Прод поднят с нуля и закрыт так, что взлом приложения не дает ни код, ни root.
- 01Код принадлежит пользователю выкладки, приложение работает от системного пользователя без оболочки и sudo, пишет в три каталога
- 02Песочница systemd: строгая защита системы, свой /tmp, без capabilities, фильтр системных вызовов, потолок памяти
- 03Выкладка: проверки → rsync → снимок базы → миграции → сборка → переключение релиза. Не ответил за минуту: ссылка возвращается на прошлый
- 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