Обновить
256K+

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

Делаем веб лучше

327,47
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

CalDAV в дикой природе: как «простой календарь для себя» превратился в клиент для семьи, друзей и четырёх облаков

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели6.1K

Протокол CalDAV существует с 2007 года (RFC 4791), и за это время он стал стандартом де-факто для синхронизации календарей. Казалось бы, стандарт — значит, всё одинаково. На практике же каждый крупный провайдер реализовал его по-своему, зачастую отходя от стандарта.

Для меня всё началось с простой задачи: автоматизировать управление своими календарями. Один pet-проект, один провайдер — ничего сложного. Но когда я решил попробовать поддержать второй, третий, четвёртый — оказалось, что CalDAV у каждого свой. В этой статье я расскажу, с чем вы столкнётесь, если решите написать клиент, работающий одновременно с Google, Apple, Яндексом и Mail.ru.

Читать далее

Как мы встроили React в 20-летний Ruby-монолит, сделали Канбан и ушли в Open Core. Релиз Redmarc v0.5 Beta

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели6.6K

Интернет полон историй безупречного успеха: «Мы взяли модный фреймворк, переписали систему с нуля, и всё стало летать». Но реальный мир корпоративной разработки – это legacy. Это системы вроде Redmine, которые живут десятилетиями, хранят в себе терабайты критических данных, и чья миграция обойдется бизнесу слишком дорого.

Мы в команде ArcFront решили, что хватит терпеть интерфейсы из 2006 года. Вместо того чтобы убегать на платные облачные трекеры, мы совершили хирургическую инъекцию. Мы внедрили молниеносный React SPA прямо в ядро старого Ruby-монолита. Без микросервисов. Без CORS.

Рассказываем, как мы заставили старого пса выучить новые трюки: от архитектуры инъекции и парсинга Textile до психологии интерфейсов и нашего официального перехода на бизнес-модель Open Core.

Читать далее

Codex жрёт контекст? Я дал ему локальную память на SQLite — и перестал кормить его простынями промптов

Уровень сложностиСредний
Время на прочтение11 мин
Охват и читатели16K

Codex хорош, пока не приходится в пятый раз объяснять ему одни и те же правила проекта: где проверки прав, как запускать тесты, почему не надо тащить старые alias-модули и что мы уже решали в прошлом чате.

Поэтому я сделал Hermes Codex Plugin — плагин, который хранит правила, summaries и прошлые решения в SQLite, ищет их через FTS5 и подкладывает Codex только маленький релевантный кусок контекста.

Читать далее

Проблемы поддержания анонимности платформы в 2026

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели9.5K

MyPrepod — крупнейший портал отзывов о преподавателях российских ВУЗов. Он стал таким не только за счет того, что даже на момент MVP 2017 года он был UX‑удобнее для студентов, чем СтудИзба или professorrating, но и за счет полной анонимности.

Переписали анонимный портал отзывов на преподавателей с PHP 5.4 на современный стек. Сайт грузился 15 секунд, рекламодатели не шли, хостинги блокировали без предупреждения в 2 ночи. Разбираем, как выстроить инфраструктуру, которая переезжает на новый сервер за одну команду и выживает, когда всё вокруг пытается тебя снести.

Чуть подробнее

Race Condition в веб-приложениях: три типа уязвимости и как их находить

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели8.3K

Для начала разберёмся, что такое Race Condition и почему эта уязвимость заслуживает внимания.

Race Condition — это класс уязвимостей, которые возникают из-за того, что сервер обрабатывает несколько запросов одновременно без должной синхронизации. Когда два или более запроса приходят на сервер в один и тот же момент и затрагивают одни и те же данные, между ними происходит коллизия.

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

Перейдём к тому, какие виды этой уязвимости вообще бывают.

Можно выделить 3 вида:

Читать далее

verified by n8n: Как мы сгенерировали ноду из OpenAPI и почему пришлось выбросить рукописную версию

Уровень сложностиСредний
Время на прочтение11 мин
Охват и читатели8.7K

Привет, Хабр! Меня зовут Андрей и я развиваю портал для разработчиков в корпоративном мессенджере Пачка. Эта статья про то, как мы превратили рукописную ноду для n8n в артефакт, который генерируется из одного файла спецификации, и как она прошла официальную верификацию и встала в каталог n8n со статусом verified by n8n.

По дороге мы выбросили целиком первую версию ноды и перевели всю документацию API на новый процесс генерации. Ниже — как это устроено внутри, с кодом и граблями.

Если коротко, что получилось: правка в одном .tsp-файле автоматически расходится в документацию, CLI, SDK и n8n-ноду, а CI публикует всё по реестрам. Нода больше не может отстать от API, потому что собирается из того же источника.

Читать далее

Вебхуки оплаты ЮKassa, IP-check, event log, idempotency и аварийный capture

Время на прочтение11 мин
Охват и читатели7.6K

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

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

В одном из проектов этот узел был собран так, первый платеж создается с capture=False, входящий webhook проверяется по IP, каждое событие сначала пишется в журнал, потом маршрутизируется в обработчик, capture подтверждается стабильным idempotence key, успешный платеж валидируется по сумме, валюте и metadata, а на случай расхождения остается отдельный ручной confirm, который умеет дочитать фактический статус из ЮKassa и синхронизировать локальную базу.

То есть задача тут не просто принять webhook, а построить платежный контур, которому можно верить.

Читать далее

Как выжать из HTML/CSS динамику, или создание IRC клиента без JS

Уровень сложностиСредний
Время на прочтение14 мин
Охват и читатели12K

Когда возникает идея создать браузерный IRC-клиент без JavaScript, приходится сталкиваться с классической проблемой фронтенда: все насколько привыкли гнать динамику через JavaScript, что перестали замечать возможности HTML/CSS с щепоткой серверной магии по реализации многих фич. HTTP Streaming существует с давних времён, а CSS эволюционировал настолько, что может справиться с логикой состояний — но мы упорно продолжаем грузить мегабайты JavaScript (и иногда даже WebAssembly) для решений, которые вполне можно реализовать иначе.

Идея создать IRC клиент без JavaScript не совсем нова (хоть это и выяснилось уже после создания такого :) ). Ещё в нулевых появился CGI:IRC — настоящий IRC клиент, который может работать полностью без JavaScript, позволяя людям общаться в реальном времени через браузер, даже если JavaScript по каким-то причинам не работал. Но это было в эру table-layouts, и когда CSS не был так развит, как сейчас. Сегодня возможностей больше, и мы воспользуемся ими, чтобы навернуть функциональность, которая не видана CGI:IRC.

Результат можно глянуть (хоть и с дополнительной стилизацией и изменениями, которые не так важны для статьи) здесь, а ещё на GitHub

Читать далее

Повторная обработка сообщений в Kafka Consumer

Время на прочтение4 мин
Охват и читатели7K

Привет! Меня зовут Дмитрий Михеев, я ведущий разработчик в MAGNIT OMNI — бизнес-группе ритейлера «Магнит», которая отвечает за развитие омниканального опыта для клиентов.

В своих сервисах для межсервисных коммуникаций помимо gRPC-запросов мы используем брокер сообщений Kafka. Если описывать его в двух словах, Kafka — это распределённый журнал событий (event log), через который сервисы обмениваются данными в реальном времени.

Не буду подробно останавливаться на устройстве Kafka — это хорошо описано в документации. В этой статье хочу подсветить один неочевидный момент, который может привести к проблемам при работе с consumer’ами — повторную обработку сообщений (retry).

Читать далее

Управление сайтами, мультисайтовость и структура проектов в Matomo

Уровень сложностиПростой
Время на прочтение11 мин
Охват и читатели5.9K

Сегодня я подробно разберу раздел Websites в opensource системе аналитики Matomo. Как Matomo хранит сайты внутри системы, чем различаются Website, Mobile App и Roll-Up, как правильно строить архитектуру аналитики, какие ошибки почти все совершают при масштабировании Matomo.

Читать далее

Бум ИИ — это твой шанс стать тем, кем ты хочешь

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели10K

Наступило время, когда рынок ИТ-специалистов начал чётко разделяться на суперпрофессионалов и вечных джунов. Промежуточного звена больше не будет.

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

Забудьте о привычном карьерном росте, который вы знали. Правила уже поменялись. Вас заменила не нейронная сеть. Вас заменили четырёхрукие сеньоры-Шивы, которые в одиночку выдают результат за целую команду.

Каково ваше место за этим столом? Давайте разбираться вместе.

Читать далее

Как мы делаем онлайн звонки: Введение в WebRTC и LiveKit

Уровень сложностиПростой
Время на прочтение9 мин
Охват и читатели8.8K

Хотим рассказать о том, как мы делаем платформу для онлайн звонков и видео конференций с ИИ, но чтобы не слишком сложно было. Начнем с самого низкого уровня - с механизма передачи данных между клиентами в созвоне. В этой статье мы расскажем про WebRTC, NAT, STUN/TURN и немного про LiveKit

Читать далее

NoiR Code: QR-код из мира мрачной ночной романтики

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели9.9K

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

Это NoiR Code. Он кодирует текст в изображение, которое читается как чёрно-белый нуар-кадр: полутоновый силуэт города, луна, штрихованные тени. Наводишь камеру в специальном приложении или веб-сервисе, созданном для поддержки этого формата, и получаешь своё сообщение обратно. Попробовать можно здесь: noir-code.suncake.xyz

Распутать дело

Ближайшие события

Пауза, двойственная по природе: контракт хука и протокол воркера

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели10K

Предположим, вы пишете интерпретатор машины Тьюринга, запущенный в Web Worker’е. UI должен показывать трейс — как машина шагает от состояния к состоянию, что пишется на ленту, как двигается каретка. Чтобы пользователь успевал считывать изменения в UI, между итерациями движка нужна короткая задержка — миллисекунды, регулярно, на каждом шаге. Это приостановка движка между итерациями — регулярная и предсказуемая, не «пауза» в смысле UI-кнопки «Пауза» (та останавливает машину до клика «Продолжить»).

Возникает вопрос: где именно в цикле итерации воркеру нужно реализовать приостановку? Кандидатов два, и выбор между ними фиксирует сразу два контракта: хуков движка и протокола между воркером и основным потоком. Выбрать точку — это спроектировать обе стороны сразу; промахнуться — испортить обе. Эта статья — про этот выбор.

Где живёт пауза

Всё о Supabase: установка, примеры, аналоги

Время на прочтение9 мин
Охват и читатели11K

Шесть лет назад, в начале 2020 года, группа разработчиков оглянулась на Firebase и подумала: «А давайте сделаем то же самое, но открытым кодом и на SQL!» Так родился Supabase: проект с искренней целью дать разработчикам контроль над данными и избавить от проприетарных заморочек.

А с распространением Vibe Coding, когда нейросети удобнее работать с API, а не писать логику для СУБД, взлёт Supabase пошел по экспоненте.

Читать далее

CSR для SSL: разбор частых ошибок в SAN и wildcard

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели12K

Большинство проблем с SSL-сертификатами возникает не при настройке TLS, а на этапе создания CSR: забытые SAN-домены, неправильные ожидания от wildcard, ручные ошибки в openssl.cnf. Разбираем, почему с сокращением срока действия сертификатов до 47 дней к 2029 году ручной выпуск перестаёт быть жизнеспособным, и какие инструменты приходят ему на замену.

Читать далее

«Превед, медвед!» возвращается? Как мы сделали мультиконтекстный сайт на статике для 47 аудиторий быстро-дёшево-сердито

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели8.2K

Мультиконтекстный сайт на статических страницах без генерации на лету. Почему мы выбрали ручную вычитку и фиксированные версии

Читать далее

Я создал два сайта через Claude, потому что не хотел мучить дизайнера и верстальщика

Уровень сложностиПростой
Время на прочтение10 мин
Охват и читатели8.5K

Я не программист, но я создал два сайта. Один с нуля, второй перенёс с Tilda, оба через Claude Code и с админ-панелью через Claude же. В процессе я прошёл через ИИшный газлайтинг, сотню правок уровня «перемести это выше, еще выше, теперь ниже» и получил два проекта, которыми теперь могу проще управлять.

Рассказываю, как, зачем и почему (и стоит ли так делать).

Читать далее

Server Actions без ручного API, предсказуемый useActionState для inline CRUD в Next.js

Время на прочтение10 мин
Охват и читатели6.3K

В Next.js формы и inline CRUD довольно быстро упираются в одну и ту же развилку. Можно пойти привычным путём и собрать ручной API: отдельный route handler, fetch из клиента, локальные флаги pending, error, success, плюс своя логика для blur, Enter, Escape и закрытия редактора. На небольшом примере это выглядит терпимо. Но как только в проекте появляются создание, переименование, удаление и несколько inline-форм на одном экране, код начинает расползаться не по бизнес-логике, а по обвязке.

Проблема в количестве промежуточных слоёв между формой и записью данных. Отдельный endpoint, отдельный клиентский submit, отдельный формат ответа, отдельные флаги состояния, отдельная синхронизация UI после успеха или ошибки. Для таких сценариев Server Actions в App Router нужны потому, что для форм и inline-редактирования дают более короткую и предсказуемую write-точку.

В проекте примере Workbench покажем на создании, переименовании и удалении проектов, секций и заметок. У формы есть action, серверная функция получает FormData, возвращает типизированное состояние, а клиент живёт вокруг одного паттерна: state, formAction, isPending. В результате форма собирается как связанный цикл, а не как набор разрозненных обработчиков.

Читать далее

Маленький файл robots.txt и большие последствия одной строки

Время на прочтение12 мин
Охват и читатели7.3K

Разбираемся, как работает robots.txt, почему его часто путают с инструментами индексации и какую роль он играет в эпоху ИИ-сканеров.

Читать далее