Один Gmail = тысячи адресов для сервиса: что мы случайно нашли в админке

Одна точка в Gmail — и для сервиса перед вами уже другой пользователь. Мы наткнулись на это случайно, а потом решили проверить, насколько далеко можно зайти.

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

Одна точка в Gmail — и для сервиса перед вами уже другой пользователь. Мы наткнулись на это случайно, а потом решили проверить, насколько далеко можно зайти.

Недавно в BotFather у меня появилось сообщение о раннем доступе к Telegram Serverless. Telegram предлагает запускать код ботов прямо на своей инфраструктуре — без отдельного VPS, Docker, nginx и даже внешней базы данных.
Решил разобраться, что именно они сделали, как выглядит разработка и можно ли теперь действительно собрать Telegram‑бота, у которого вообще нет своего сервера.
Сразу оговорюсь: пока это early access. Есть ограничения, а привычный Python + aiogram туда просто так не перенести. Но сама идея получилась довольно интересной.
Странно говорить о современном стеке и одновременно предлагать новым сотрудникам вручную вписывать данные паспорта в кадровую анкету. Автоматизируя процесс онбординга, мы пошли дальше стандартной OCR. На базе LLM VL-модели разработали цифровой продукт Sminex Start, который проводит процесс оформления.
Ручные трудозатраты свелись к минимуму, данные не покидают внутренний контур, новые сотрудники с первого дня понимают, что пришли в технологичную компанию. Как нам это удалось и какие преимущества в цифрах и отзывах мы уже видим — рассказываем в статье.
Представь очередь. В ней все, кто когда-либо жил на Земле — от первого человека до ребёнка, родившегося минуту назад. Очередь длиной примерно в сто семнадцать миллиардов. Где-то в ней стоишь ты. Место у тебя есть с рождения, его никто не отнимет и не отдаст другому. Просто до сих пор никто его не называл.
Как посчитать порядковый номер человека по дате рождения, почему таблица из пятидесяти точек честнее плавной кривой, и как заставить Postgres держать анонимность ответов конструкцией, а не политикой — с одной дырой, которую я нашёл у себя сам.

В Diablo II характеристики навыков хранятся в обычных текстовых файлах, поэтому для изменения баланса игру не нужно пересобирать. В Prince of Persia 1989 года поведение персонажа описано через состояния и переходы, а в градостроительных стратегиях сборщик налогов сам выбирает следующее действие по набору правил.
Игры давно решили многие задачи, с которыми фронтенд разбирается до сих пор. В этой статье я покажу, какие инженерные подходы из геймдева можно перенести в веб-разработку и что это дает на практике.
Речь пойдет о контрактах и моках, конечных автоматах, событийной модели, pattern matching и деревьях поведения.

В первом приложении мне было легко понять, чем заняться дальше. Всегда находилась ещё одна функция, которую можно добавить: новый экран, аналитика, AI, оплата. Каждая закрытая задача давала понятное ощущение прогресса. Продукт становился больше, код — сложнее, релизы — заметнее.
После большого релиза я задал себе неприятный вопрос: что именно я доказал? Что могу довести приложение до работающего состояния — да. Что людям нужна каждая из реализованных функций и они готовы возвращаться — уже не факт.
Со вторым проектом я решил поменять порядок работы. Не начинать с большого roadmap и каталога возможностей, а сначала сформулировать одно повторяемое действие, которое можно проверить. Так появился Prosnix — Telegram Mini App для личных экспериментов после пробуждения.
Это не история успешного запуска. Пользователей пилота и подтверждённых результатов пока нет. Это история о том, как попытка сделать более узкий MVP изменила мои технические решения — и почему даже одна простая продуктовая метрика потребовала state machine, нескольких версий и отдельного отношения к исходным данным.

Внешний API возвращает данные в своей модели. Названия полей, вложенные объекты, изображения, цены и правила пагинации принадлежат provider. UI приложения обычно работает с другой моделью. Если компонент читает event._embedded.venues[0].city.name напрямую, структура внешнего ответа распространяется по интерфейсу. Изменение API затрагивает карточки, detail page, search, metadata и тесты.
В App Router внешний запрос можно выполнять на сервере. Server Components работают с fetch, а серверный код не попадает в клиентский bundle. API key при такой схеме остаётся вне браузера. Документация Next.js описывает server-side data fetching для App Router. В учебном проекте EventMap внешний источник событий проходит через server API слой.
7 лет назад я опубликовал в npm свою первую библиотеку — custom‑border‑mixin. Тогда я на неделю пропал, просто чтобы в своё удовольствие написать SCSS‑миксин. Если вам интересно, что весёлого может быть в SCSS, просто посмотрите на хелпер:

11 недель назад я начал делать социальную сеть, в которой гражданство зависело только от имени.
Если тебя зовут Егор, Георгий или одной из форм имени, происходящего от Georgios, то это место для тебя, 100%! Остальные становятся Наблюдателями: могут читать, реагировать, писать в личку, жить в своих районах — что-то вроде ВНЖ.
На этом месте проект вполне мог закончиться хорошей шуткой, которой и являлся ИЗНАЧАЛЬНО. Но пользователи начали спрашивать, кто здесь главный.
Так в Егороде появился мэр. Потом люди спросили, кто выбирает мэра. Появились выборы.
Затем — партии, депутаты, кабинет, указы, вето и импичмент, а социальная сеть начала подозрительно напоминать государство, состоящее преимущественно из Node.js, SQLite и людей по имени Егор.
Сейчас в проекте около 11,9 тысячи регистраций, обычный DAU — примерно 30–35 человек, кодовая база выросла примерно до 210 тысяч строк, 176 таблиц и 2625 тестов.
И именно небольшой ежедневный онлайн в итоге сильнее всего повлиял на архитектуру, потому что город на 30 человек может позволить себе довольно простую инфраструктуру.
Но он не может позволить себе переставать существовать, когда эти 30 человек уходят спать.

Всем привет, на связи Дима Котиков! Я все еще люблю разрабатывать под Android/KMP, разбираться с инструментами для упрощения работы и латте на фундучном молоке. За пять лет мобильной разработки я неоднократно сталкивался с ситуацией, когда бэкенд запаздывает, а дедлайн горит.
Зимой 2026 мы получили задачу: новый финансовый инструмент, дедлайн через три месяца, готовность бэкенда — через полтора. Команда начала работу на моках и успела. В статье я расскажу, какие инструменты перехвата и мокирования трафика помогли нам выпустить фичу в срок без готового бэкенда, как настроить их за один вечер и почему понимание принципов работы TLS и MITM-атаки экономит часы отладки.

Привет, Habr.
Я разрабатываю менеджер паролей «Сэйфком» для личного и командного использования.
Почти все серьёзные проблемы, которые я находил, были не в самих криптографических примитивах. Они появлялись рядом с ними: в авторизации, сериализации ключей, rate limit, SMTP, WebAuthn и обычной бизнес‑логике.
Ограничения модели безопасности и текущее состояние сервиса описаны отдельно, на странице безопасности. Формального внешнего аудита на момент публикации не было.

До нового этапа маркировки меньше месяца. Компания зарегистрирована в «Честном знаке», ЭДО подключён, сотрудники знают, что товары маркируются. На первый взгляд основные приготовления уже закончены.
Но проблемы обычно начинаются не с регистрации. Поставщик отправляет УПД, а товар в учётной системе называется иначе. На приёмке обнаруживается расхождение между фактом и документом. Менеджер оформляет отгрузку по старой схеме. Возврат приходится разбирать вручную. Формально компания готова к маркировке, но реальный процесс приёмки и отгрузки ещё не готов.

Angular — отличный фреймворк. А ещё он очень заботливый: множество вещей уже продумано за вас, а когда всё-таки требуется что-то нестандартное — существующее поведение обычно легко переопределить или расширить.
Сегодня я хочу поговорить об одном таком случае и показать инструмент, который я создал много лет назад и с тех пор считаю абсолютной базой для Angular. Речь пойдёт о маленькой библиотеке Polymorpheus, которую мы в Taiga UI используем буквально повсюду, когда нужно отобразить какой-нибудь динамический контент.

У ремонта есть неприятная привычка: ответ на один вопрос почти сразу порождает следующий.
Посчитал плитку, теперь хочется понять, как она ляжет возле двери. Выбрал ламинат, надо решить, в какую сторону пойдут доски. С количеством профиля разобрался, осталось понять, как его нарезать. Желательно без коллекции обрезков «когда-нибудь пригодится».
С этих вопросов мой «Мастерок» и начал обрастать раскладками, объёмными комнатами и другими инструментами. С 17 августа по 16 сентября на сайте было 6 536 посетителей. В сравнении, которое показывает Метрика, это рост на 26,32%. Платное продвижение я не запускал. Большинство посетителей приходит из поиска.
Мне было интересно посмотреть, какие именно страницы люди открывают. Раскладки плитки и ламината по просмотрам заметно обгоняют главную. Это ещё не доказательство, что новые функции вызвали рост. Но уже хороший повод посмотреть, что происходит, когда калькулятор начинает показывать результат, а не только выдавать число.
Расскажу, что добавилось, где картинка помогает разобраться, а где может обмануть. Будут немного кода, рулон обоев с подозрительно большим остатком и мультяшный прораб. Он тоже появился по ходу дела.
Устал смотреть в логи: опять подбор пароля к ssh, опять лезут в несуществующие файлы сайта. Fail2ban ставил — утонул в настройках. Написал своё: обходит свой сайт, запоминает нормальные адреса, по лишним 404 и по ssh режет IP в nftables. Рассказываю — зачем и как ставил. Код покажу там, где самому было интересно.

Когда я выкладывал первую часть, я, если честно, рассчитывал на десяток лайков и тишину в комментариях: ну кто будет всерьёз разбирать змейку, слеплённую за два вечера. Не угадал — комментариев набралось прилично, и добрая половина оказалась не «мило, годно», а разбором полётов: кто-то поймал баг, кто-то — нечестный спавн змей вплотную к игроку, кто-то сравнил игру то с Pac-Man, то с Asteroids. И вот сижу я, читаю это всё по второму кругу и понимаю: технически игра работала, но местами работала не на 100 процентов своей идеи, а это не то же самое, что работала хорошо. В общем, решил пройтись по всему списку, а не отделаться сердечком в ответ.

«Закину промпт в ИИ, а через секунду получу готовый интерфейс, свой сайт или дашборд» — такая идея наверняка приходила каждому, кто не связан с дизайном или разработкой. ИИ-инструменты для этих сфер активно распространяются и обещают такие фантастические результаты, что закрадывается мысль: а что, если скоро дизайнеры будут не нужны?
Все же между картинкой и рабочим прототипом большая пропасть. Иерархия элементов на экране, адаптивность, доступность, логика сценариев и продуктовые метрики — это лишь ограниченный список пунктов, которые очень сложно уложить в один промпт.
Забыла представиться: меня зовут Камила, я проектировщик интерфейсов в Selectel. Вместе с бумом ИИ коллеги чаще начали ко мне приходить с вопросами такого рода: «Мне ИИшка макет сделала, сделай ревью, пожалуйста». Так что я решила разобраться со своей дизайн-колокольни — где ИИ может помочь, а где создает привлекательную, но не самую работающую концепцию.

«Просто прикрутить вход через Steam и цены из маркета» — примерно так это выглядит из бэклога. На деле: OpenID 2.0 образца 2007 года вместо OAuth, звёздочка ★ в имени ножа, из-за которой одно и то же название готовится для двух соседних эндпоинтов противоположными способами, и цена, приходящая строкой в чужой локали. Собрал все проблемы в одном месте.

Открыл кейс — получил предмет. Между этими двумя событиями лежат HMAC, миллион тикетов и RTP, который кто-то посчитал заранее. Я написал сайт с кейсами CS2 целиком и выложил под MIT: про то, где в «provably fair» проходит граница между «проверяемым» и «выгодным», и почему 0,023% перекоса я оставил осознанно.

Я всё меньше пишу первую версию кода сам.
Раньше backend-задача чаще начиналась для меня с реализации. Сейчас я могу описать её Codex, получить diff и уже от него идти дальше: разбираться в коде, проверять поведение системы, находить недостающий контекст и отдавать задачу на следующую итерацию.
Недавно этот процесс хорошо проявился на интеграции между несколькими сервисами. Codex написал рабочий код, но end-to-end задача осталась незакрытой.