Документация LMS версия 0.1.0

Документация/Начало/Чем отличается

Чем отличается

Сравнивать по количеству возможностей бессмысленно: у зрелого SaaS их всегда больше. Разница в четырёх вещах, где расхождение не количественное, а принципиальное, — и в списке того, чего у нас нет, который стоит в конце и который стоит прочитать первым.

Одно API вместо двух #

У GetCourse их два, и они независимы: разные базовые адреса, разная аутентификация, разный формат тела, разные конверты ответа и разные названия одних и тех же сущностей.

Классическое API умеет три вещи: создать пользователя, создать заказ, запустить асинхронный экспорт. Формат — JSON в base64 внутри form-urlencoded. Лимит экспорта — 100 запросов за 2 часа на весь аккаунт, причём каждый опрос «готов ли файл» тоже расходует квоту, а экспорт однопоточный. Чтения одного объекта нет вообще — только массовая выгрузка.

Tech API закрывает часть дыр, но ключ выдаётся по анкете, а документация закрыта в robots.txt. Ни один из массовых интеграторов её не использует — все работают на классическом API с его тремя действиями.

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

У нас один адрес, одна аутентификация, один формат, один конверт ошибок и один справочник событий. Ключ школа заводит сама, без анкеты.

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

Права: роль — сущность, а не семьдесят галочек #

У GetCourse ролей как сущности нет. Есть поле «тип» в карточке человека и около семидесяти отдельных галочек, которые расставляются каждому сотруднику по одной, руками. Ни шаблонов, ни групп, ни копирования прав с человека на человека.

Три следствия, которые практики называют болью:

  • Права почти не привязаны к объектам. Ограничить сотрудника одним курсом можно только назначив его преподавателем этого курса. Одной воронкой, одним продуктом, одной рассылкой — нельзя. Администратор всегда администратор всего аккаунта.
  • Контакты ученика видны либо целиком, либо никак. Состояния «работай с человеком, но не видь его почту и телефон» не существует. На вопрос, как закрыть контакты от сотрудников, поддержка отвечает: заключайте договор о неразглашении.
  • Крупные права каскадно включают пакеты других. «Может настраивать аккаунт» разом добавляет управление правами, мессенджеры, хранилище, виджеты, трафик, пользователей, сайт, рассылки, промоакции и партнёрку. Выдать больше, чем собирался, легко.

У нас роль — сущность (ADR-049): набор прав, который выдаётся целиком и правится в одном месте. Право сужается до курса, а контакты закрываются отдельным правом, не связанным с правом работать с человеком.

И одна деталь, которую стоит назвать: куратор по умолчанию видит только своих учеников. У GetCourse наоборот — по умолчанию всех, включая чужие ответы, а «только своих» включается галочкой в каждом тренинге отдельно. Безопасное поведение должно быть тем, которое получается само.

Оформление переживает обновление #

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

Разметка собрана из утилитарных классов. Объявить их публичными — значит запретить себе менять вёрстку навсегда: любая перестановка сломает оформление у всех, кто его настроил. И сломает молча: CSS не падает при неверном селекторе, он просто перестаёт применяться. Ошибки в логах не будет, письмо придёт от клиента через месяц.

Поэтому наружу объявлены два намеренных слоя:

  • переменные оформления — 84 публичных имени, которые мы обязуемся не переименовывать. Одна строка --brand перекрашивает школу целиком, включая тёмную тему;
  • якоря — стабильные атрибуты на ключевых элементах, для случаев «уберите тень у карточки курса».

Внутреннюю разметку при этом мы меняем свободно — и именно поэтому обещание «не сломается при обновлении» чего-то стоит.

Данные забираются целиком #

Обещание «нет вендор-лока» проверяется одним вопросом: как выглядит уход.

У нас: база на вашем сервере, доступ к PostgreSQL у вас, плюс выгрузка школы одним архивом, включая содержимое курсов и файлы. У GetCourse выгрузка идёт по частям и упирается в ту самую квоту 100 запросов за 2 часа: база в десятки тысяч человек выгружается часами.

Чего у нас нет #

Самый ценный абзац страницы. Без него это буклет, а не сравнение.

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

Продаж нет. Ни продуктов, ни тарифов, ни заказов, ни приёма платежей. Это следующий крупный этап. Школа, которой нужно продавать завтра, сегодня продавать на этом не сможет.

Рассылок и сценариев нет. Спроектированы, не написаны.

Вебинаров нет.

Якорей оформления нет ни одного. Переменные работают, якоря появятся вместе с ближайшими экранами.

Приложений в App Store и Google Play не будет никогда. Не «пока нет» — не будет (ADR-053). Для коробки это тупик: одна установка — одна школа, значит каждой школе понадобилось бы своё приложение со своим названием, а это сотни публикаций и сотни ревью, плюс аккаунт разработчика и ежегодные платежи на покупателе. Вместо этого кабинет ставится на домашний экран как PWA и открывается на весь экран, а для тех, кто живёт в Telegram, есть отдельная оболочка. Обе показывают один и тот же кабинет.

Зрелости. GetCourse работает десять лет, на нём тысячи школ и найдены тысячи краевых случаев. У нас первая установка на живой сервер прошла в августе 2026 и дала девять находок. Это не то, что чинится обещанием.

Что дальше #

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

Эта страница в Markdown