Сайти
Корпоративні сайти та посадкові сторінки, які відкриваються миттєво, готові до просування в 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. Перша розмова безкоштовна й потрібна, щоб зрозуміти, чи варто це взагалі робити.