Перейти к содержимому
Войти

О нас

Как мы работаем

Четыре правила, которые видно в коде, а не только в описании. Они дороже любого списка технологий: технологии у всех примерно одни.

Решение записано вместе с кодом

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

Тесты пишутся как атаки

Не «счастливый путь», а попытки: выйти из объявления стиля, подсунуть javascript: в ссылку, отправить форму с чужой страницы, назвать свою цену в корзине, дотянуться до данных чужого клиента. У отказа изоляции нет симптома: запросы проходят, страницы рисуются, отличается только то, чьи данные на них.

Ничего не грузится со стороны

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

Незаконченное называется незаконченным

У каждой части продукта есть список того, чего в ней ещё нет, и он лежит рядом со списком того, что готово. Обещание, которое нельзя выполнить сегодня, обходится дороже честного пропуска — особенно тому, кто на него рассчитывал.

Что сделано

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

Конструктор

Продукт платформы Olista

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

  • Редактор блоков Страница собирается перетаскиванием, отмена сделана снимками документа, а панель настроек генерируется из описания блока — пятьдесят рукописных панелей означали бы пятьдесят разных форм и пятьдесят шансов принять значение, которое сервер отклонит.
  • Шаблоны вместо пустого холста Сайт начинается с готового набора страниц: салон, кофейня, студия услуг, мастерская, интернет-магазин, лендинг. Шаблоны проверяются по каталогу блоков при старте, поэтому переименованное свойство роняет запуск, а не страницу автора.
  • Публикация снимком Опубликованная страница — неизменяемая копия черновика вместе с темой, шапкой и подвалом. Правки не появляются на живом сайте, пока автор их не опубликовал, а откат — это восстановление предыдущего снимка, то есть одна запись.
  • Сайт без рантайма в браузере Посетитель получает обычный HTML, один файл стилей и один небольшой скрипт. Формы настоящие, фильтры — обычный GET, ссылки — ссылки: страница, которая без JavaScript выглядит сломанной, так же выглядит и для поискового робота.
  • Интернет-магазин Каталог, карточка с вариантами и галереей, фильтры, корзина и оформление заказа. Ни одна сумма не принимается от браузера: цену считает сервер, а при оформлении все строки переоцениваются заново — корзина может пролежать неделю.
  • Каталог из 1С Источник подключается по OData: номенклатура, цены, остатки и фотографии, обновление по расписанию. Правка, сделанная менеджером в консоли, накладывается поверх источника и переживает ночную синхронизацию — иначе складское название возвращается к утру.
  • Онлайн-запись Услуги, график работы и свободные окна. Два человека не займут одно окно, потому что это уникальный индекс в базе, а не проверка перед записью: проверка проигрывает гонку, индекс — нет.
  • Заявки и письма Формы складывают обращения в консоль сайта и присылают письмо владельцу; покупателю и гостю уходит своё подтверждение. Письма идут очередью с повторами, а не из середины оформления заказа.
  • Соавторы, роли и журнал Владелец сайта заводит соавторов. У платформы отдельный набор прав с областью «вся установка» или «один сайт», а заход сотрудника в чужой сайт остаётся в журнале — с повышением записи, если чтение перешло в правку.
  • Кабинеты покупателей Магазин может пускать покупателей в личный кабинет: у каждого сайта свой клиент входа и свой набор учётных записей. Клиент магазина — это организация со своими людьми и ролями, а покупатель одного магазина не существует для другого.
  • .NET 10
  • Blazor WebAssembly
  • MongoDB
  • OpenIddict
  • OData 1С
  • SkiaSharp

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

Аналитика маркетплейсов

Рабочее место продавца

Аналитика открывается своим адресом Olista той же учётной записью. Токен кабинета уходит через серверный шлюз и не остаётся в браузере. Пока кабинет не подключён, экран пуст: придуманных цифр для красоты там нет.

  • Тот же вход Вход той же учётной записью Olista: отдельного логина у аналитики нет.
  • Секрет не возвращается Токен кабинета принимается один раз и хранится зашифрованным. Браузер его больше не видит.
  • Явная синхронизация Запрос имеет статус. Повторное нажатие не запускает скрытую вторую загрузку.
  • .NET 10
  • MongoDB
  • OpenIddict
  • Wildberries API

Карточка ведёт в настоящее приложение, а не в демонстрацию: данные появляются, когда подключён кабинет продавца.

Olista AI

Внутренняя лаборатория

У Olista AI собственный адрес и собственная страница: посетитель читает, что вертикаль умеет сегодня, а саму лабораторию открывает администратор установки после входа. Браузер не получает токен модели ни на одном шаге.

  • Та же учётная запись Вход — той же учётной записью Olista. Отдельного логина у приложения нет.
  • Черновик, не публикация Ассистент предлагает текст. Он не сохраняет страницу и не публикует сайт.
  • Модель за закрытой дверью К модели ходит только сервер этого приложения, по внутренней сети. Наружу она не выставлена.
  • .NET 10
  • Blazor WebAssembly
  • ASP.NET Core
  • MongoDB
  • OpenIddict

Лаборатория — рабочее место администратора установки, а не возможность владельца сайта: в редакторе конструктора ассистента сегодня нет. Карточка ведёт на страницу приложения, и она открыта всем; сама лаборатория — нет.

Восстанавливаем связь с сервером…

Не вышло. Следующая попытка через с.

Связь восстановить не удалось. Нажмите «Ещё раз» или обновите страницу.

Сервер приостановил работу страницы.

Продолжить не удалось. Нажмите «Продолжить» ещё раз или обновите страницу.