Linear обходит главный тормоз веб-приложений — сеть. Вместо того чтобы каждый раз ходить на сервер, Linear хранит данные прямо в браузере, в IndexedDB. Когда пользователь меняет заголовок задачи, строка issue.title = "Faster app launch" мгновенно обновляет локальное состояние (MobX observable), а issue.save() ставит транзакцию в очередь. Сервер получает её асинхронно, а другие клиенты узнают об изменениях через WebSocket. Никаких спиннеров — пользователь никогда не ждёт сеть. Сооснователь Linear Туомас ещё в 2024 году рассказывал, что с синхронизации начал писать код с самого первого дня.
Чтобы первый экран загружался мгновенно, Linear переписывала сборку четыре раза: Parcel → Rollup → Vite → Rolldown. Результат — 50% меньше кода, 30% меньше после сжатия, Time-to-first-paint на Safari упал на 59%, а потребление памяти сократилось на 70–80%. Сейчас Linear отгружает около 21 MB минифицированного JavaScript, но код агрессивно разбит на сотни чанков — по одному на каждый npm-пакет. В index.html через modulepreload подтягиваются все критические чанки параллельно, ещё до выполнения скрипта. Оставшиеся 1200 ресурсов (чунки, иконки, шрифты) фоново кеширует service worker — через пару секунд после открытия страницы входа всё приложение уже лежит в кеше и готово к офлайн-работе.
Такой же подход и к авторизации. Linear не проверяет сессию при загрузке. Встроенный в index.html скрипт просто смотрит, есть ли в localStorage запись ApplicationStore. Если есть — значит, данные рабочего пространства уже есть в IndexedDB, и приложение сразу показывает интерфейс. Реальная проверка происходит позже, на первом же запросе к серверу — если сессия протухла, клиент получит 401 и перенаправит на логин. Оптимистичный подход работает и здесь: покажи то, что есть, а с ошибкой разберёшься потом.
Каждый объект в Linear — отдельный MobX observable, и каждый компонент, который его читает, обёрнут в observer(). Когда приходит обновление для одного поля одной задачи, перерисовывается только тот кусочек UI, который это поле показывает. Не список целиком, не сайдбар — одна ячейка. Синхронизация с сервером подтверждает изменения, а рендеринг масштабируется за счёт того, что меняется.
Скорость — не только инженерная задача, но и дизайнерская. В Linear каждое частое действие имеет шорткат, часто из одной буквы. ⌘k открывает командную палитру, которая ищет по всему приложению — задачам, проектам, меткам, настройкам. Поиск идёт по локальному MobX-пулу, а не по серверу, поэтому отклик мгновенный. Так пользователю не нужно пробираться через меню мышкой — путь к любому действию максимально короткий.
Анимации в Linear построены на строгих правилах. Анимируют только composited-свойства: transform и opacity. Никаких margin, height или left, которые заставляют браузер пересчитывать layout. Тайминги короткие: появление мгновенное (0s), исчезновение — 0.15s, стандартный переход — 0.25s. Большинство анимаций делают пространственную работу: панель агента выезжает от кнопки, поповер статуса вырастает из самого статуса. Ничего лишнего — только то, что помогает понять, откуда взялся элемент.