116 lines (72 loc) · 22.66 KB
  1+++
  2draft = false
  3date = '2026-06-28T03:31:34+02:00'
  4title = "Я строю свой уголок интернета — и вот почему"
  5description = "Почему личный сайт вместо соцсетей: одностороннее пространство без алгоритмов, комментариев и регуляций — только текст, пять цветов и мгновенные переходы."
  6cover = "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9e/Paul_Klee%2C_Swiss_-_Fish_Magic_-_Google_Art_Project.jpg/960px-Paul_Klee%2C_Swiss_-_Fish_Magic_-_Google_Art_Project.jpg"
  7tags = ['meta', 'web']
  8+++
  9
 10## Введение
 11Каждый раз посещая [HackerNews](https://news.ycombinator.com/), я тратил часы на просмотр сайтов разработчиков. Иногда они максимально простенькие: обычная страница, будто цветной лист бумаги, с несколькими постами. А иногда полноценный сайт с кучей разделов, фич и сложной навигацией. После пары таких вечеров я полез в Гугл со следующим вопросом: «Какой фреймворк использовать для блога?», где и познакомился с [SSG](https://en.wikipedia.org/wiki/Static_site_generator) (Static Site Generator) и с [Hugo](https://gohugo.io/) — одним из самых популярных генераторов.
 12
 13## Зачем мне веб-сайт
 14Изначально целью было создание простенького сайта-визитки на базе [SSG](https://en.wikipedia.org/wiki/Static_site_generator), чтобы люди всегда могли найти мои контакты, ведь я и мои друзья неоднократно теряли связь после того, как удаляли свои аккаунты. Казалось бы, решение простое: не удалять аккаунты и использовать одинаковые юзернеймы. Но обстоятельства бывают разными.
 15
 16Также у меня есть друзья из России, но с новой политикой закрытого интернета и объявлениями об ограничении доступа к мессенджерам и соцсетям я начал переживать, что потеряю и их.
 17
 18Со временем идея переросла во что-то большее. Мне захотелось создать уголок, где я смогу публиковать свои мысли, заметки, проекты, наблюдения и просто сохранять часть своей жизни в открытом виде. Поэтому этот сайт — моё одностороннее социальное пространство.
 19
 20## Социальные сети
 21Но почему не социальные сети?
 22Честно, у меня к ним аллергия. Не знаю почему, но я просто не могу воспринимать их как что-то «своё». Да и не хочу тратить на это ни внимание, ни время.
 23
 24Сейчас существует огромное количество платформ с разной аудиторией, из-за чего появляется другая проблема — нет единого места, куда человек может просто зайти, открыть страницу и спокойно посмотреть контент без всплывающих уведомлений о куки, рекламы, просьб зарегистрироваться, установить приложение или подписаться, скрывающих сам контент.
 25
 26Особенно в свете грядущей политики верификации возраста. Несколько стран уже ввели обязательную верификацию в социальных сетях: Австралия запретила детям до 16 лет пользоваться платформами, следом Бразилия, Индонезия, Малайзия. Великобритания и ряд штатов США движутся в том же направлении. Платформы обязаны соблюдать эти требования и вместе с ними усиливается сбор личных данных пользователей. Личный сайт под эти регуляции не попадает: он не платформа, не собирает данные и не требует от читателя ничего, кроме браузера.
 27
 28Да, существуют [ActivityPub](https://activitypub.rocks/) и [ATProto](https://atproto.com/), попытки построить более открытый интернет, но с намного меньшим количеством активных участников (что не является главным) и всё равно чужой платформой, где я завишу не от конкретного сервера, а от технологии в целом. Тем более они тоже будут вынуждены следовать требованиям местного законодательства.
 29
 30Вторая проблема — рекомендации и сама культура потребления контента. Мне не интересно ежедневно следить за чужой жизнью или бесконечно листать предлагаемую алгоритмами ленту. Возможно, дело в том, что многие люди пытаются показать себя лучше, чем они есть: самые красивые фотографии, натянутые улыбки, идеальные моменты жизни. Но меня это никогда не цепляло.
 31
 32Мне совершенно не важно, какая у вас машина, что вы ели сегодня, где отдыхали, какой букет подарили или почему вас бросил партнёр. Конечно, иногда социальные сети полезны — например, чтобы понять, чем человек живёт и что ему интересно. Но лично для меня куда ценнее разговор: живой, искренний, полный эмоций, мыслей и души. Сам формат современного контента редко помогает раскрыть человека по-настоящему. Он показывает образ, но не личность.
 33
 34Впрочем, я не отрицаю социальные сети — охват, алгоритмы рекомендаций и виральность делают их отличным инструментом для продвижения и личного бренда. Возможно, я буду их использовать, но не как основную площадку.
 35
 36## Односторонность
 37Под односторонностью я имею в виду однонаправленный канал общения. К примеру, возьмём монолог спикера на сцене, где вы __можете__ только слушать, не задавая вопросов. Противоположное — дискуссия: ты не просто слушаешь, но и отвечаешь, споришь, реагируешь. Односторонний формат лишает автора ненужного внимания к реакции аудитории и позволяет сосредоточиться на содержании. Конечно, в конце речи спикер может ответить на вопросы, но только тогда, когда вся информация уже услышана и вопросы возникают по существу.
 38
 39Аудитория при этом никуда не исчезает. Напротив, именно читатель определяет выбор темы, язык и подачу. Разница в том, что автор принимает эти решения заранее, без оглядки на реакцию в реальном времени. Монолог требует большей подготовки, чем диалог: нельзя уточнить, нельзя переспросить, нужно сказать всё правильно с первого раза.
 40
 41Выделив слово «можете», я подчеркнул возможность, а не обязанность. Вы всегда вольны высказать своё мнение или поправить меня, чему я буду искренне рад. Но для этого лучше подойдут мессенджеры: все контакты на странице [связи](/contact/).
 42
 43## Комментарии
 44
 45Отдельно о комментариях под постами. Существует немало готовых решений: [Giscus](https://giscus.app/), [Utterances](https://utteranc.es/), [Cusdis](https://cusdis.com/), [Disqus](https://disqus.com/). Но я отказался от них по двум причинам: дизайн и уместность.
 46
 47Причины взаимосвязаны. При небольшой аудитории комментарии оставит ничтожная доля читателей. Это известное [правило 1%](https://en.wikipedia.org/wiki/1%25_rule). Пустой раздел комментариев выглядит хуже, чем его отсутствие: создаёт ощущение заброшенности и отпугивает новых читателей. При этом не все комментарии несут смысл, а с ростом аудитории неизбежно возникает потребность в модерации.
 48
 49Я разделяю позицию [Sonia Simone](https://copyblogger.com/removing-blog-comments/): комментарии уместнее в других местах: в блогах других людей, в мессенджерах или в социальных сетях (как бы парадоксально это ни звучало). Первое предполагает тот же монолог, о котором я писал выше. Второе подходит для живой дискуссии, где проще прийти к консенсусу. Третье хотя бы пропиарит.
 50
 51## Дизайн
 52Изначально, когда я хотел сделать сайт-визитку, мне хотелось чего-то изысканного — уникального дизайна, запоминающегося визуально. Показать идентичность через эстетику. Для этого я взял образ балерины в технике halftone, танцующей на кругах. Но вскоре я понял, что абстрактные и сумбурные конструкции — далеко не самое главное на сайте: читателю важен контент, то есть текст. Поэтому я принялся разрабатывать максимально лаконичный дизайн, где читателю не придётся отвлекаться на анимации или непонятную раскладку. Всё должно быть нативным.
 53
 54### Раскладка
 55Вниманием пользователя можно управлять по-разному: главное, чтобы объекты либо следовали определённой раскладке, либо намеренно выбивались из неё. Я выбрал другой способ — не думать. Чтобы добиться максимально нативного дизайна, мне буквально пришлось отключить голову и сфокусироваться на читабельности.
 56
 57### 5 цветов более чем достаточно
 58Цвет — это инструмент. Он отвечает на один вопрос: что важно, а что нет. Как только цвет начинает решать другую задачу, он превращается в шум.
 59
 60Мне хватило пяти:
 61
 62- **Фон** — думаю, тут всё понятно
 63- **Текст** — основное содержание, ради которого человек пришёл
 64- **Яркий** — отвечает за структуру: заголовки и опорные точки страницы
 65- **Мрачный** — всё, что тише основного текста: даты, подписи, навигация, описания
 66- **Акцент** — цепляет взгляд на деталях, которые стоит подметить: ссылки, важные слова, элементы дизайна, которые нужно выделить
 67
 68Со временем «мрачный» я разделил на два: один для текста, который всё-таки читают, вроде описаний и цитат; другой для служебного, вроде дат и навигации. Кроме этих пяти есть ещё пара цветов под отдельные элементы вроде карточек и границ, но это не самостоятельные цвета, а оттенки тех же категорий.
 69
 70### Почему я не хочу делать этот сайт многоязычным
 71
 72Сейчас я нахожусь в Бельгии, где три национальных языка. В каждом регионе вывески в основном на одном: французском, немецком или нидерландском. Всё зависит от местного населения. Нужно ли мне знать все три, чтобы свободно путешествовать по этой замечательной стране? Нет! Я могу воспользоваться вспомогательными средствами, спросить людей или заранее спланировать маршрут.
 73
 74Я не хочу переводить каждую страницу на все языки, которые знаю или изучаю, поэтому предпочитаю международный — английский. Почему?
 75
 76- **Во-первых**, сложность поддержки: изменил одну страницу — будь любезен отредактировать и остальные версии. Я хочу, чтобы перевод оставался приятным занятием, а не обязанностью, иначе его рано или поздно захочется свалить на ИИ;
 77- **во-вторых**, в браузеры уже встроен достаточно хороший переводчик.
 78
 79Поэтому я сосредоточусь на переводе блогов как на интересном хобби и практике.
 80
 81## Технокухня
 82Сам сайт появился из интереса к [SSG](https://en.wikipedia.org/wiki/Static_site_generator), поэтому я отправился искать программу, которая будет лёгкой, быстрой и с возможностью вести блог на Markdown.
 83
 84Вот список генераторов, которые я просмотрел:
 85- [Hugo](https://gohugo.io/) — один из самых популярных: быстрый, удобный, есть всё, что нужно, и даже больше
 86- [Zola](https://www.getzola.org/) — хороший аналог Hugo
 87- [Zine](https://zine-ssg.io/) — минималистичный, написан на Zig
 88- [Eleventy](https://www.11ty.dev/) — на JavaScript, по умолчанию не отдаёт клиентский JS, понимает почти любой шаблонизатор
 89- [Astro](https://astro.build/) — громоздкий фреймворк с SPA и подходом server-first
 90
 91Также можете поискать [тут](https://github.com/myles/awesome-static-generators).
 92
 93Я остановился на [Hugo](https://gohugo.io/) из-за его зрелости и популярности. Честно, мне больше нечего добавить, кроме одного: я не стал брать готовую тему или шаблон (хотя другим советую, это экономит кучу времени). В остальном я очень доволен своим выбором.
 94
 95### Загружаем только часть страницы
 96Во время разработки всплыла ещё одна причина — белая вспышка при переходах по внутренним ссылкам. Каждый раз браузер загружает и рендерит страницу заново, и хотя уходит на это лишь пара десятков миллисекунд, их хватает, чтобы глаз поймал неприятный блик и первое впечатление было испорчено. Я подумал: зачем заново тянуть и отрисовывать CSS и HTML, если можно обновлять только `body` и `header`? Сначала мне показалось, что получается что-то вроде [SPA](https://en.wikipedia.org/wiki/Single-page_application).
 97
 98Но это не SPA: страницы остаются настоящими, просто подменяется их часть. А у самого приёма, как я узнал позже, есть имя — [PJAX](https://github.com/MoOx/pjax): подменять часть страницы вместо полной перезагрузки. Велосипед оказался изобретён до меня, но собрать его с нуля всё равно было приятнее, хотя бы чтобы не тащить целую библиотеку ради одной идеи: весь роутер уместился меньше чем в две сотни строк.
 99
100И всё это — лишь надстройка. Отключите JavaScript, и подмена просто исчезнет, а сайт останется обычным набором статических страниц: каждая ссылка настоящая, каждая страница — реальный HTML-файл. Ломаться нечему.
101
102### Встраивать или выносить
103
104CSS раньше был инлайн прямо в каждой странице: всего 5,7 КБ, и лишний round-trip перед первой отрисовкой не стоил такой экономии. Но с тех пор стили перевалили за 28 КБ, а главное, сайт превратился в тот самый SPA-подобный роутер, о котором я писал выше: переходы внутри сайта подменяют страницу без полной перезагрузки, переиспользуя то, что уже лежит в кэше. Инлайн означал, что один и тот же CSS оплачивается заново на каждой странице вместо одного раза навсегда. Поэтому его вынесли обратно во внешний файл с fingerprint-хэшем в имени, закэшированный навечно (`immutable`, год `max-age`), который браузер скачивает один раз и переиспользует по всему сайту.
105
106Единственное, что было важно не упустить при переносе: преload. `<link rel="preload" as="style" crossorigin>` в заголовках ответа запускает загрузку раньше, чем браузер вообще дойдёт до `<link>` со стилями в `<head>`, так что даже самый первый визит не платит за это лишний round-trip, а все последующие платят ещё меньше.
107
108С иконками всё так же было и остаётся: встраивать их в страницу я не стал, а сложил в один внешний SVG-спрайт, где каждая иконка становится `<symbol>`, а на странице от неё остаётся только короткая ссылка `<use href="…">`. Спрайт грузится один раз, кэшируется и обслуживает все иконки разом. Теперь то же самое и с CSS, и с JS: всё блокирующее, но статичное живёт в своём закэшированном навсегда файле, скачивается раз и переиспользуется везде, вместо того чтобы ехать заново с каждой страницей.
109
110
111### Хостинг для статических сайтов
112
113Пару слов о хостинге. Вариантов куча, и многие бесплатны или с очень щедрым бесплатным планом. Чтобы ускорить и без того быстрый сайт, я бы советовал [Vercel](https://vercel.com/) или [Cloudflare Pages](https://pages.cloudflare.com/): у них есть [CDN](https://ru.wikipedia.org/wiki/Content_Delivery_Network), который раздаёт файлы с ближайших к читателю серверов.
114
115## Моё место
116Я создал свой укромный и независимый уголок, где могу делать всё, что пожелаю. Нужен ли такой вам — решать не мне. Но я рад, что он мой.