Сайт для организации, чья работа — не сайт.
Клиент — небольшая европейская гуманитарная организация гражданского общества, выросшая из диаспоральной сети в действующую гуманитарную операцию после февраля 2022 года. К моменту, когда мы начали, они координировали доставку грузов, размещение перемещённых людей и снаряжение для тех, кто работает на передовой. Сайт был последним, о чём кто-либо думал, — и это был абсолютно верный приоритет.
Ни веб-команды. Ни продакт-менеджера. Никого, чьей работой было бы писать тикеты, согласовывать тексты или вести CMS. Бриф был не продуктовым. Это был инфраструктурный бриф: дайте нам публичное лицо, которое отвечает на вопрос «кто вы и как я могу помочь?», а затем избавьте нас от необходимости снова об этом думать.
Это ограничение определило каждое последующее решение.
Две недели. Двуязычный. Без CMS.
Мы выпустили первую версию сайта примерно за две недели, приурочив к операционному рывку в середине 2022 года. Next.js на Vercel, Tailwind CSS, React. Двуязычный с первого дня — английский и родной язык организации — на нативной i18n-маршрутизации Next.js, без сторонних библиотек.
Решение по контенту было осознанным: без CMS. Ни Sanity, ни Contentful, ни Strapi. Весь контент — описания проектов, списки партнёров, направления работы, уровни пожертвований — живёт в типизированных объектах TypeScript в /data/<locale>/, под контролем версий рядом с кодом. Обновление текста — это git-коммит. Нет ни входа в систему, ни интерфейса редактора, ни пайплайна развёртывания, которому команду пришлось бы обучать.
Мы также не стали добавлять: библиотеки анимаций, API-роуты, базу данных в рантайме, слой rate-limiting, собственный механизм аутентификации. Ничего из этого не требовалось. Поток пожертвований уходит за пределы сайта на специализированные донорские рельсы. Задача сайта — информировать и направлять, а не проводить транзакции.
Статическая генерация повсюду. Сборка выдаёт HTML. Vercel его отдаёт. Единственное, что может пойти не так, — это падение сборки, а сборки не поднимают никого по тревоге в 3 часа ночи.
- F · 01Двуязычный статический сайт
- Английский и родной язык организации с первого дня. Нативная i18n-маршрутизация Next.js, полный паритет контента, без сторонней i18n-библиотеки.
- F · 02Контент как код
- Весь текст живёт в типизированных объектах TypeScript в /data/<locale>/, под контролем версий. Ни входа в CMS, ни интерфейса редактора, ни пайплайна развёртывания, который нужно осваивать.
- F · 03Статическая генерация повсюду
- Каждая страница предварительно отрендерена на этапе сборки. Ни API-роутов, ни базы данных в рантайме, ни дежурств по инфраструктуре.
- F · 04Пройдены два мажорных релиза Next.js
- Кодовая база прошла путь от Next.js 12 к 14 и 16 без переписывания. Выбор стека, который хорошо стареет.
- F · 05Тёмная тема через CSS-класс
- Zustand хранит состояние переключателя; localStorage его сохраняет. Никакого мерцания при перезагрузке. Никакой сторонней библиотеки тем.
- F · 06Ноль переписываний за четыре года
- Архитектура, нарисованная в первом спринте, сегодня в продакшене.
Двенадцать месяцев тишины, затем один коммит.
После первого спринта — тишина. С августа 2022 по май 2023 года кодовая база не получила ни одного изменения. Сайт держался. Организация доставляла помощь. Это было верное положение дел.
Июнь 2023 года: один коммит. Аналитика. Июль 2024 года: девять коммитов. Небольшой спринт поддержки — обновление Next.js, замена библиотеки карусели, гигиена зависимостей. Ничего структурного.
Март–апрель 2026 года: текущее обновление. Освежение дизайна, полная проработка мобильной версии, миграция на Tailwind v4, улучшения SEO. Кодовая база пересекла два мажорных релиза Next.js — с 12 на 14 и на 16 — без переписывания.
240 коммитов за четыре года. Картина всплесков честна: большая часть работы пришлась на начало, а затем на конец. Долгая середина была тем временем, когда сайт просто работал.
Правильный объём инженерии для организации гражданского общества — это тот, что исчезает.
Сайт не был проблемой, о которой организации приходилось думать. Это и есть результат. Не коэффициент конверсии, не показатель отказов — а отсутствие сайта как источника трения.
Та же кодовая база, что вышла в 2022 году, сегодня в продакшене. Та же команда, что её построила, её и поддерживает. Никакой травмы миграции, никакого разговора «нам нужно переписать это на современном стеке», потому что стек был выбран достаточно тщательно, чтобы оставаться современным без постоянного вмешательства. Bun заменил Node в роли рантайма. Biome заменил ESLint и Prettier. Tailwind v4 заменил v3. Всё это было аддитивным — никакого архитектурного долга, который пришлось бы распутывать.
Четыре года. Два мажорных релиза Next.js пройдены (12 → 14 → 16). Ноль переписываний. 240 коммитов. Одна команда.
Сайт не был проблемой, о которой нам приходилось думать.
