Евгений Григорьевич Написать

Веб-разработка на заказ

Сайты, которые сами собирают заказ

Не визитка с телефоном в подвале. Страница, на которой человек сам выбирает вариант, видит итоговую цену и оставляет заявку — без единого вопроса в мессенджер. Пишу на своём коде, без конструкторов. Фиксированная цена, запуск за 2–3 дня.

Цены

от 1 500 ₽
Починка мобильной версии Сайт едет вбок на телефоне, текст вылезает за экран, в кнопки не попасть пальцем. Открываю на трёх мобильных разрешениях, нахожу причину замером, чиню и присылаю скриншоты до и после. Час-два, обычно в тот же день.
15 000 ₽
Одностраничник под ключ Дизайн под вашу нишу, а не готовый шаблон. Адаптив под телефон и планшет, форма заявки с уведомлением в Telegram, метатеги и красивое превью ссылки, установка на хостинг и домен. Два дня, два круга правок.
35 000 – 60 000 ₽
Сайт с расчётом или бронью Человек сам собирает заказ и сразу видит итоговую цену — или бронирует время. Сумма пересчитывается на сервере, поэтому её нельзя подменить, а заявка сохраняется в базу с номером обращения. Страницы отдаются готовыми, и поисковики их видят. Четыре-шесть дней.

Цена и срок фиксированные — называю их до начала работы, а не после. Предоплата половины. Исходники, домен и все доступы остаются у вас: уйти к другому исполнителю можно в любой момент, ничего не сломается.

Что входит в каждый пакет

Работы

Четыре работы, сделанные по брифу

Все четыре помечены словом «Концепт»: заказчиков у них не было, бренды придуманы. Всё, что можно проверить, открыв сайт, — настоящее и замерено.

Концепт Первый экран сайта Cadence: заголовок «Кофе в вашем ритме» на тёмном фоне

Кейс 01

Cadence — конструктор заказа вместо телефона в подвале

АйдентикаТексты ДизайнАнимация ВёрсткаСерверная часть
Бриф Небольшая обжарочная продаёт кофе по подписке. Нужен сайт, который сам собирает заказ и показывает свежесть, а не рассказывает о ней словами.

Конструктор заказа вместо телефона в подвале: заявка в два действия, ответ сервера 0,4 с, первый экран 213 КБ. Сделано за один день — от логотипа до базы данных.

Видео, логотип и иконки нарисованы с нуля для проекта. Стоковых материалов нет.

Концепт Первый экран сайта «Табльдот»: заголовок «Французское бистро на Мойке» на фоне тёмного зала

Кейс 02

Табльдот — меню и бронь вместо рассказа о шеф-поваре

АйдентикаТексты МенюДизайн ВёрсткаСерверная часть Бронь
Бриф Городское бистро с французским уклоном в Петербурге. Люди приходят на сайт ради одного: посмотреть, что сегодня едят и сколько это стоит.

Меню и бронь вместо рассказа о концепции: звонок и бронь в один тап, путь до формы короче на четверть, ответ сервера 0,3 с. Две страницы, сделано за один день.

Фотографии — со свободного стока, обработаны под палитру проекта. Это не моя съёмка.

Концепт Первый экран сайта «Контур»: заголовок «Технику подбираем под задачу» и цены по категориям

Кейс 03

Контур — подбор от задачи вместо сетки из тысячи позиций

АйдентикаТексты КаталогДизайн ВёрсткаСерверная часть Приём заявок
Бриф Магазин техники в Петербурге. Человек приходит с вопросом, что взять под свою задачу и сколько это стоит, а получает сетку из тысячи позиций и фильтр по производителю.

Подбор идёт от задачи — работа, учёба, игры, съёмка, — а цены стоят на первом экране вместо 2 165 пикселей прокрутки. Фильтры живут в адресе страницы, поэтому подборку можно отправить ссылкой. Ответ сервера 0,3 с.

Фотографии — со свободного стока, приведены к общему светлому фону. Это не моя съёмка, модели техники вымышленные.

Концепт Первый экран сайта «Оборот»: заголовок «Ремонт, который видно», цена диагностики и нормо-часа

Кейс 04

Оборот — процесс ремонта вместо слов о профессионализме

АйдентикаТексты ПрайсДизайн Векторные сценыВёрстка Серверная частьБаза
Бриф Автосервис в Петербурге. Человек боится трёх вещей: что навяжут лишнее, что цену назовут после работы и что машина зависнет в сервисе без объяснений.

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

Снимки сгенерированы под проект: это не съёмка в цехе и не сток. Прайс придуман, хотя собран по логике нормо-часа.

Услуги

Цена известна заранее

Фиксированная сумма и срок называются до старта. Предоплата 50%. Сверх пакета — 500 ₽ за круг правок.

Сегодня

1 500 ₽

1–2 часа

  • Разбор сайта на телефоне: что съезжает и что не нажимается
  • Починка мобильной вёрстки
  • Ускорение загрузки
  • Отчёт со скриншотами «до и после»
Написать

Одностраничник

15 000 ₽

2 дня

  • Дизайн под нишу, а не готовый шаблон
  • Адаптив под телефон и планшет
  • Форма заявки с уведомлением в Telegram
  • Метатеги, превью ссылки, favicon
  • Установка на хостинг и домен
  • 2 круга правок
Обсудить

Сайт с расчётом или бронью

35 000 – 60 000 ₽

4–6 дней

  • Конструктор заказа или форма брони
  • Проверка данных на сервере, а не только в браузере
  • Заявки сохраняются в базу с номером обращения
  • Серверный рендеринг — страница видна поисковикам
  • Разметка для поиска и карт
  • 3 круга правок
Обсудить

Как работаю

Что происходит после того, как вы напишете

Чтобы не было сюрпризов ни по деньгам, ни по срокам.

  1. Вы пишете, что нужноЕсть сайт — пришлите ссылку. Сайта нет — просто расскажите, чем занимаетесь и что должен делать сайт. Этого достаточно.
  2. Я называю цену и срокФиксированные, до начала работы. Если задача не укладывается в пакет — скажу сразу, а не в середине.
  3. Предоплата половины, дальше делаюПоказываю готовое целиком, а не кусками. Правки входят в цену — сколько именно, написано в пакете.
  4. Ставлю на хостинг и отдаю исходникиСайт ваш: файлы, домен, доступы. Уйти к другому исполнителю можно в любой момент, ничего не сломается.

Разборы

Как это сделано

Здесь технические подробности: что и чем замерялось, какие решения принимались и почему. Открывайте, если интересно, — для заказа читать не обязательно.

Кейс 01Cadence — как устроен конструктор заказа

Сайт можно собрать за час. Ценность — в решениях, которые принимаются по замерам, а не на глаз.

Проблема

Кофейные подписки продают свежесть словами: «свежая обжарка», «отборное зерно». Проверить это на сайте нельзя, поэтому фраза не работает. А типовой сайт обжарочной — визитка со списком сортов: посетитель не понимает, сколько будет стоить именно его вариант и что делать, если уедет в отпуск. За ответами он идёт в мессенджер, и там половина отваливается.

Цель

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

Решения

  1. Метроном как основаПодписка — это ритм: обжарка, помол, доставка, повтор. На этом построена вся структура: четыре главы фильма названы четырьмя тактами, конструктор называется «ритм».
  2. Скролл-фильм вместо галереиПрокрутка проматывает непрерывный ролик. Смонтирован как одна съёмка, разрезанная по точным кадрам, поэтому на стыках глав нет рывка. Человек видит путь зерна, а не читает о нём.
  3. Палитра против клише нишиКофейные сайты рефлекторно уходят в бежевый и крафт. Здесь — чернильно-синий, костяной белый и один сигнальный красный.
  4. Цена считается на сервереКонструктор показывает цену в браузере, но при отправке сервер пересчитывает её заново по каталогу и игнорирует присланное клиентом. Подменить сумму через инструменты разработчика нельзя.

Доводка прокрутки на телефоне: три итерации по записям экрана

Первая версия на телефоне шла рывками — причину искал замерами, а не перебором настроек.

  1. Запись перваяНа один кадр приходилось 12 пикселей движения пальца: браузер перематывал плёнку втрое быстрее реального воспроизведения. Попутно выяснилось, что «мобильная» сборка роликов была фикцией — правило «уменьшить высоту до 720, если она больше» на исходнике в 720 не делало ничего.
  2. Запись втораяТекст второй главы шёл поверх кадров первой, потом картинка прыгала через сцену. Признак не рывков отрисовки, а незагруженного файла: ролики отдавались с Cache-Control: max-age=0, браузер не имел права их хранить.
  3. Запись третьяПерекомпенсация: 36 подряд идущих кадров, больше секунды прокрутки, почти не отличались друг от друга.
  4. ИтогРолики 640×360 при 24 кадрах, главы по 2,0–2,2 экрана, кеш на год с пометкой immutable, предзагрузка первых роликов. Около 18 пикселей прокрутки на кадр и вчетверо меньше пикселей на декодирование.

Замеренные цифры

Доступа к аналитике клиента нет и быть не может — только то, что измеримо на самом сайте.

Ответ сервера, прогретый0,40–0,47 с
Ответ сервера, холодный старт0,94 с
Вес первого экрана213 КБ / 428 КБ с роликом
Фильм для телефона680 КБ на 4 ролика
Действий до заявки2
Полный размер сборки1,27 МБ / 246 КБ сжато

Дополнительно: содержимое отдаётся сервером готовым, поэтому страница индексируется; при системной настройке «уменьшить движение» видео не загружается вообще и вся история читается статикой; у шкал вкуса есть текстовые подписи для скринридеров; форма имеет все состояния — пустое, отправка, успех, ошибка поля, ошибка сервера.

Кейс 02Табльдот — десять правок по замерам

Сайт ресторана обычно решает не ту задачу: рассказывает о шеф-поваре, пока гость стоит в метро с полутора минутами и одной рукой и хочет знать, что сегодня едят и сколько это стоит.

Решения

  1. Сайт и есть менюНазвание взято буквально: table d'hôte, стол хозяина с фиксированным набором перемен. Первый экран не рассказывает о заведении, а показывает карту сегодняшнего дня.
  2. Состояние считается по петербургскому времениСервер отдаёт «открыто до 00:00» или «понедельник, выходной», а за час до закрытия переключается на «кухня закрывается через N минут». Чистая функция от времени, поэтому серверная разметка и браузер не расходятся.
  3. Один источник правдыСтол дня меняется по дню недели, состав берётся из той же карты, что и страница меню. Поменяли блюдо в карте — оно поменялось и на главной, и в подтверждении брони.
  4. Часы проверяются дваждыФорма подставляет слоты по полчаса для выбранной даты и блокирует понедельник. Сервер проверяет то же самое повторно, чтобы бронь нельзя было протолкнуть в обход формы.
  5. Движение служебное, а не украшениеШесть видов, все привязаны к прокрутке, без видео. Бокал нарисован вектором, уровень поднимается по мере прокрутки. В состоянии покоя бокал налит, поэтому при отключённой анимации страница просто статична.

Замеренные цифры

Ответ сервера0,30–0,57 с
Первый экран на телефоне358 КБ
Разметка главной6 КБ
Страница меню4 КБ, ответ 0,41 с
Высота главной6 828 px против 7 034 px
Действий до брони1 тап

Проверено вручную, а не заявлено: бронь отправлена насквозь, получен номер, строка найдена в базе, тестовая запись удалена; понедельник блокирует выбор времени; день недели в серверной разметке совпадает с реальным; в отданном HTML присутствует разметка Restaurant.

Разбор с телефона переписал половину структуры

После сборки сайт проверялся не на глаз, а замерами на экране 375×812. Нашлось десять проблем, каждая правка подтверждена повторным замером. Это ровно та работа, которую я продаю отдельной услугой.

  • Телефон был только в подвале 7 000 px до негошапка, адрес и липкая панель
  • Кнопки первого экрана обрезаны на 722 px при экране 812на 371 px
  • Снимок зала не виден на телефоне начинался на 899 pxфон первого экрана
  • Путь до формы брони 4 460 px3 488 px и один тап
  • Цели касания меньше нормы 10 штук по 19 px0, минимум 44 px
  • Снимки без размеров, страница прыгала 40
  • Список стола дня на всю неделю 7 строк2: сегодня и завтра
  • Противоречие в часах работы «до последнего гостя»убрано
  • Ссылка на маршрут нет2
  • Разметка для поиска нетRestaurant с часами и телефоном
Кейс 03Контур — цена на первом экране

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

Решения

  1. Подбор от задачи, а не от категорииРабота, учёба, игры, съёмка. Категория остаётся вторым фильтром. На каждой плитке задачи стоит цена «от», посчитанная из каталога, — человек сразу понимает, попадает ли в бюджет.
  2. Фильтры живут в адресе страницыВыбор переписывает адрес: ?category=laptops&band=under60. Подборку можно отправить ссылкой, она откроется у получателя в том же виде, и кнопка «назад» возвращает предыдущий набор. Для магазина, где ссылками делятся постоянно, это прямые продажи.
  3. Цену считает серверВ заявку попадает название и сумма из каталога, а не то, что прислал браузер. Подменить цену через инструменты разработчика нельзя.
  4. Светлая тема выбрана осознанноДля техники светлый фон честнее: товар видно, а не тонет в подсветке.

Замеренные цифры

Ответ сервера0,32–0,42 с
Первый экран293 КБ
Разметка главной7 КБ
Страница каталога5 КБ, ответ 0,40 с
Все снимки сайта573 КБ на 11 кадров
Действий до подборки2 тапа

Проверено вручную: фильтры прогнаны на живом сайте — 10 позиций стартово, 3 после «Ноутбуки», 1 после «до 60 000», 0 с внятным пустым состоянием; русские окончания считаются правильно — позиция, позиции, позиций; заявка отправлена насквозь, получен номер KT-1001, в базу легла цена из каталога, а не из браузера; тестовая запись удалена.

Десять правок по замерам

  • Первая цена на странице через 2 165 px прокруткина первом экране
  • Снимок товара начинался на 733 pxна 88 px
  • Путь до формы заявки 3 940 px3 047 px
  • Цели касания меньше нормы 10
  • Лента наличия ехала вбок без намёка ничегосчётчик «6 из 10» и затухание у края
  • Плитки задач без цен без цен«от N ₽» на каждой
  • Подборку нельзя переслать фильтры в состоянии страницыадрес несёт весь набор
  • Обещание звучало как оправдание «десять позиций, которые готовы объяснить»«меняем 14 дней без причины, чиним 2 года»
  • Абзац про удобные фильтры вода для дизайнерапольза для покупателя
  • Разметка для поиска нетмагазин, часы, адрес, 10 товаров с ценами

Про ошибку, которую я повторил

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

Кейс 04Оборот — движение без единой строки скрипта

Сайт автосервиса обычно продаёт словами: «команда профессионалов», «современное оборудование». Ни одно из этих слов не снимает страх, с которым человек едет в сервис. Страхов ровно три: навяжут лишнее, цену назовут в конце, машина зависнет без объяснений.

Решения

  1. Смысловой стержень: видно, что чинятИз него выросло всё остальное, включая главную анимацию. Сайт показывает процесс: что смотрят, за сколько, в каком порядке и где сейчас машина.
  2. Сталь с лаймом вместо графита с оранжевымГрафит с оранжевым — самый частый штамп для «технично и брутально». Лайм взят из цеха: так красят суппорты и метят инструмент. И он не совпадает ни с красным, ни с золотым, ни с кобальтом трёх предыдущих работ.
  3. Первый экран — векторная сцена, а не фотографияМашина заезжает на двухстоечный подъёмник и поднимается по мере прокрутки. Сцена нарисована вручную в SVG, без библиотек и без видео.
  4. Статус ремонта закрыт вторым полемПо одному номеру заказ-наряда чужой заказ открывался бы перебором, поэтому спрашиваю ещё четыре последние цифры телефона владельца. С неверными цифрами сайт отвечает «такого заказ-наряда не нашли» — проверено.
  5. Цену считает серверВ заявку попадает название работы, нормо-часы и сумма из прайса по идентификатору, а не то, что прислал браузер.
  6. Выбранная работа живёт в адресеСсылка вида ?work=struts открывает форму с уже подставленной строкой — из прайса можно отправить человеку ссылку на конкретную работу.

Замеренные цифры

Ответ сервера, главная0,40–0,45 с
Прайс0,31 с при 16,8 КБ
Статус0,43 с при 8,9 КБ
Первый экран на телефоне142 КБ, снимков ноль
Полная загрузка285 КБ за 9 запросов
Работ в прайсе21 в пяти узлах
Целей касания меньше 44 px0 на трёх страницах
Горизонтальная прокрутканет

Проверено вручную: заявка отправлена насквозь — ссылка из прайса подставила «Замена стоек амортизаторов», получен заказ-наряд № 1001, статус открылся по номеру и четырём цифрам телефона, тестовая запись удалена. В базу легла цена 5 400 и 1,9 нормо-часа из прайса, а не из браузера. С неверными цифрами телефона заказ не открывается. В отданном HTML есть разметка AutoRepair и 26 предложений с ценами.

Восемь приёмов движения — и ни одной строки скрипта

Всё движение живёт на таймлайнах прокрутки CSS. Скрипта анимации нет вообще: положение считает браузер, поэтому прокрутка не дёргается даже на слабом телефоне. Исходное состояние каждого элемента видимое — при отключённой анимации страница просто статична.

  1. Подъёмник в две фазыЗаезд с вращением колёс, затем подъём с заполнением штока, сжатием тени и проявлением подписей узлов.
  2. Тахометр вместо полоскиОтмеряет прочитанную часть страницы. Сервис называется «Оборот» — отсюда и форма индикатора.
  3. Карта диагностикиЛуч идёт слева направо, галочки загораются по мере его прохода. Момент появления каждой отметки считается из её координаты на кузове, а не подобран на глаз: в первой версии галочки жили по своему расписанию и успевали загореться раньше луча.
  4. Взрыв-схема тормозного узлаДиск, колодки, суппорт и крепёж разъезжаются по своим осям. Плюс барабанный счётчик, лента этапов ремонта, доворачивающийся болт и набегающие волной строки прайса.

Движение проверено замером, а не на глаз

Панель предпросмотра не проигрывает таймлайны прокрутки, поэтому живой сайт прогнан через headless Chromium с замером состояний на каждой позиции.

0 pxмашина сдвинута на 152 px влево, стоит на полу
180 pxпочти заехала, сдвиг 17,8
360 pxподнимается, высота 44,8 из 92
540 pxнаверху, подписи узлов видны
900 pxгорит 6 галочек из 12
1400 pxгорят все 12
5600 и 6000 pxлента этапов заполнена на 0,50 и на 1,00

Честно

Что проверяемо

  1. Сайты на собственном кодеНе конструктор, не тема WordPress. Исходники отдаются заказчику.
  2. Серверный рендерингОтвет сервера около трети секунды, тексты есть в исходном HTML — страницы индексируются.
  3. Рабочие формы с базойЗаявка и бронь сохраняются с номером обращения, часы работы проверяются на сервере.
  4. Мобильная версия доведена замерамиНе на глаз: в кейсах 02 и 03 — по десять правок, каждая подтверждена повторным замером. В кейсе 04 движение прогнано через headless Chromium с замером состояний.
  5. Лицензии в порядкеШрифты Manrope, IBM Plex Mono, Prata, PT Sans, Onest, JetBrains Mono, Oswald и Golos Text — по свободной лицензии, коммерческое использование разрешено.

И чего здесь нет

Ни одного отзыва — потому что коммерческих заказчиков пока не было, а придуманным отзывам грош цена.

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

Все четыре работы помечены словом «Концепт»: это ответы на бриф, а не заказы реальных бизнесов. Бренды, меню, товары, прайс, цены и адреса придуманы.

Про картинки честно и по каждому кейсу. В 02 и 03 — съёмка со свободного стока Unsplash, обработана под палитру проекта: это не моя съёмка. В 04 снимки сгенерированы под проект — это тоже не съёмка в цехе. В 01 видео, логотип и иконки нарисованы с нуля, и векторные сцены в 04 — тоже.

Напишите — отвечу и назову цену

Есть сайт — пришлите ссылку. Сайта нет — расскажите, чем занимаетесь. Цену и срок назову в ответном сообщении, они фиксированные. Если работаем впервые и так спокойнее — оформляйте заказ через Kwork: деньги держит площадка и переводит их мне только после того, как вы примете работу.