Сайты
Корпоративные сайты и посадочные страницы, которые открываются мгновенно, готовы к продвижению в Google и работают на нескольких языках с первого дня.
Сайты и приложения
Проектируем и пишем быстрые сайты и приложения для iOS и Android. Без шаблонов и без привязки: код, домен и все аккаунты оформлены на вас.
Корпоративные сайты и посадочные страницы, которые открываются мгновенно, готовы к продвижению в Google и работают на нескольких языках с первого дня.
iOS и Android из одной кодовой базы: функция пишется один раз и работает в обеих системах. Публикацию в App Store и Google Play берём на себя.
База данных, личные кабинеты, роли и права доступа, приём оплаты через Stripe, рассылки, push-уведомления и связь с внешними сервисами по API.
Проект не заканчивается в день запуска. Остаёмся рядом: правим, измеряем, добавляем функции и следим за инфраструктурой.
До первой строки кода разбираемся, какой процесс съедает время или деньги. Иногда ответ — не приложение, и мы об этом говорим прямо.
Не изобретаем заново авторизацию, платежи и уведомления. Берём проверенные инструменты, а время тратим на то, что уникально именно в вашем бизнесе.
Код, домен, хостинг и база данных — ваши. В любой момент можете забрать всё и уйти к другой команде, не спрашивая нас.
Сайты, веб-системы и приложения для iOS и Android — работы для клиентов и наши собственные продукты. У каждой — подробный разбор: задача, что внутри, экраны и технологии.

Set Hub в Даунтауне сдаёт шестнадцать сетов под одной крышей, крышу над городом и площадку с винтажным «Мерседесом». Мы построили для студии всю систему — CRM, сайт с онлайн-бронью и оплатой, кабинет гостя и два приложения, — и брони из всех каналов сошлись в одну базу.

Приложение для iPhone и Android, через которое постоянные гости бронируют сеты напрямую, без комиссии площадок: лента времени по живой занятости, бронь в обход занятого часа, подбор сета по фото-референсу, золотой час на крыше и вход в студию по Face ID — даже в подвале без сети.

Веб-CRM, в которой студия из Даунтауна Лос-Анджелеса ведёт всё: брони с четырёх каналов, запросы, задачи команды, деньги, переписку с гостями и девятнадцать календарей. Письма площадок, оплаты Stripe и сообщения в Telegram сами становятся записями, обычный текст разбирается без ИИ, а ChatGPT и Claude работают с данными по тем же правам, что и люди.

Нативное приложение для iPhone и Android: команда видит свой день, подтверждает брони и задачи прямо из уведомления и записывает встречи с клиентами. Face ID на входе, данные клиентов только в памяти, а виджет и экран блокировки показывают съёмку без имён гостей и сумм.

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

Клиент сдаёт технику и получает ссылку, где видно, на каком этапе она сейчас, с фотографиями до и после. Звонки «ну как там моё?» заканчиваются.

Отправляем клиенту ссылку, он открывает её на телефоне, подписывает пальцем — и обе стороны получают документ на почту. Без печати, без сканера, без установки программ.

Для агентств, которые продают недвижимость иностранным покупателям, а потом ею управляют. Система ведёт объект по всей жизни: продажа, передача в управление, аренда, обслуживание.

Мобильное приложение и полноценный веб-портал из одной кодовой базы — для агентств и собственников, которые ведут сразу несколько объектов.
Инженерия
Выдержки в том виде, в каком они лежат в репозитории: форма заявки, подписание договоров, статусы ремонта и часы мастерской. Всё вырезанное помечено «// …».
if (form.company) return json({ ok: true });
const name = String(form.name ?? '').trim().slice(0, 200);
const contact = String(form.contact ?? '').trim().slice(0, 200);
const about = String(form.about ?? '').trim().slice(0, MAX_LEN);
if (!name || !contact || !about || form.consent !== true) {
return json({ error: 'validation' }, 400);
}
if (env.TURNSTILE_SECRET) {
const ip = request.headers.get('cf-connecting-ip');
const ok = await verifyTurnstile(env.TURNSTILE_SECRET, form.turnstile, ip);
if (!ok) return json({ error: 'captcha' }, 400);
}Ловушка для ботов и проверка Turnstile: в почту попадают заявки от людей, а спам отсеивается молча.
export async function sha256Hex(text) {
return toHex(await crypto.subtle.digest('SHA-256', enc.encode(text)));
}
// …
const now = new Date().toISOString();
await env.DB.prepare(
`update contracts
set status = 'signed', signed_at = ?, signer_name = ?, signer_image = ?,
signer_ip = ?, signer_ua = ?, signed_hash = ?,
signer_phone = ?, signer_address = ?
where id = ? and status <> 'signed'`,
)
.bind(
// …
await sha256Hex(row.body),
// …
)
.run();Фиксируем время, IP, устройство и SHA-256 текста, который человек видел при подписании: подпись можно доказать, а документ — не подменить.
const status = ALL_STATUSES.includes(b.status) ? b.status : row.status;
const now = new Date().toISOString();
// …
if (status !== row.status || clean(b.comment, 500)) {
await addEvent(env, id, status, clean(b.comment, 500), now);
}
let mailed = false;
if (status === 'ready' && row.status !== 'ready') {
mailed = await mailOrder(env, 'ready', {
email: row.client_email,
lang: row.lang,
number: row.number,
device: row.device,
url: new URL(`/o/${id}`, SITE.url).href,
});
}Каждая смена статуса записывается в историю, которую клиент видит по своей ссылке, а письмо уходит один раз — когда ремонт готов.
function canary(d) {
const f = new Intl.DateTimeFormat('en-CA', {
timeZone: 'Atlantic/Canary', year: 'numeric', month: '2-digit', day: '2-digit',
hour: '2-digit', minute: '2-digit', hourCycle: 'h23', weekday: 'short',
});
const p = Object.fromEntries(f.formatToParts(d).map((x) => [x.type, x.value]));
const dow = { Sun: 0, Mon: 1, Tue: 2, Wed: 3, Thu: 4, Fri: 5, Sat: 6 }[p.weekday];
return { date: `${p.year}-${p.month}-${p.day}`, dow, mins: Number(p.hour) * 60 + Number(p.minute) };
}
const toMins = (hhmm) => Number(hhmm.slice(0, 2)) * 60 + Number(hhmm.slice(3, 5));
const workday = (c) => (HOURS[c.dow] && !HOLIDAYS.has(c.date) ? HOURS[c.dow] : null);
export function shopStatus(now = new Date()) {
const c = canary(now);
const h = workday(c);
if (h && c.mins >= toMins(h[0]) && c.mins < toMins(h[1])) return { open: true, closes: h[1] };
// …
}Сайт сам знает, открыта ли мастерская: время Тенерифе с переходом на летнее и праздниками — из того же источника, что и данные для Google.
Только то, на чём реально работают HostBase, Hourgrid, Mansaria и этот сайт. Ничего «для солидности».
Уже знаете, что нужно? Отметьте задачи, стек и формат работы — заявка соберётся сама.
Собрать проект в конструктореРасскажите в WhatsApp. Первый разговор бесплатный и нужен, чтобы понять, стоит ли вообще это делать.