Issue #6
“Финальная неделя. Дедлайн прошёл, код заморожен, дневники дописаны. Шесть недель — от первого коммита до работающих проектов. В этом выпуске: песочница для исполнения чужого кода в браузере, Supabase который тайно стирал прогресс игры, и анимация, которая знает когда промолчать.”
1 апреля 2026 г. в 0934 teams
Герой недели
Песочница для храбрых, или Как elrouss построил тюрьму для чужого кода
elroussJSGods
Большинство студентов, столкнувшись с задачей «запустить пользовательский код в браузере», берут `new Function` и идут дальше. elrouss из JSGods остановился и задал вопрос, который отличает инженера от кодера: «А что, если этот код — враждебный?»
Начал с `iframe` + CSP — классика песочниц. Поймал гонки `postMessage` и проблемы с Angular dev server, потерял время — но вынес чёткое понимание границ подхода. Переключился на QuickJS: WASM-интерпретатор, отдельная JS-машина внутри Web Worker. «Хотелось хотя бы осознанный компромисс, — пишет он, — код крутится в отдельной JS-машине, а не в том же контексте, что и приложение.»
Дальше — отладка криптовой ошибки `magic word wasm`, когда Emscripten в dev-режиме тянул HTML вместо бинарника. Решение: вынести `.wasm` в assets и задать путь через `newVariant`. Потом — протокол `builtinFns`, чтобы протаскивать колбэки через JSON-границу без дублирования строк. И наконец — честная фиксация: «Абсолютной безопасности на фронте нет. DoS по CPU остаётся — я оставил прерывание по дедлайну.»
Результат — полностью изолированный code runner с документированной моделью угроз. В студенческом проекте. На шестой неделе.
Highlights
- elrouss: два подхода к песочнице (iframe+CSP → QuickJS WASM), выбор с обоснованием
- Web Worker + QuickJS-emscripten: пользовательский код не видит DOM, fetch, контекст приложения
- Протокол builtinFns для сериализации колбэков через JSON-границу воркера
- Осознанный компромисс: deadline-based terminate как защита от DoS при невозможности полной изоляции
Грабли недели
Амнезия по расписанию: как Supabase тайно управлял игрой
isalukAuto-Team 4
isaluk из Auto-Team 4 собрала полноценный игровой цикл — квиз с таймером, анимациями, вложенными маршрутами. Всё работало, пока тестировщик не переключился на соседнюю вкладку. При возврате квиз молча сбрасывался на первый вопрос. Прогресс — испарялся.
Корень проблемы оказался неочевидным: Supabase под капотом подписывается на событие фокуса окна. При возврате на вкладку он обновляет сессию и стреляет событием в Store. А Store, не разбираясь, вызывал полную перерисовку — уничтожая DOM вместе с состоянием квиза.
Решение: сравнивать маршруты через JSON.stringify перед перерисовкой. Если роут не изменился — блокировать рендер. Просто, но до диагноза пришлось докопаться до внутренностей Supabase.
Параллельно выяснилось, что pre-commit хук Husky честно запускал lint-staged, но в package.json не было указано, какие файлы проверять. Хук работал вхолостую, пропуская грязный код в репозиторий.
Урок: сторонние SDK живут своей жизнью. Если ваш Store реагирует на внешние события — фильтруйте, что именно изменилось, прежде чем перерисовывать мир.
Highlights
- Supabase отслеживает фокус окна и обновляет сессию при возврате на вкладку — это вызывало полный ре-рендер и сброс прогресса квиза
Кейс недели
Анимация, которая знает, когда промолчать
Когда dukhd из JSGods подключила Angular View Transitions API для анимации переходов между страницами, команда единогласно отвергла горизонтальный слайд в пользу плавного появления контента сверху — fade-from-top. Решение казалось чисто эстетическим, но за ним скрывалась архитектурная ловушка.
На главной странице уже работала якорная навигация с плавным скроллом через ScrollSpyService, который dukhd написала неделями ранее. И вот проблема: View Transitions API не различает переход на другую страницу и клик по anchor-ссылке внутри той же страницы. Каждый клик по навигации лендинга запускал и скролл, и анимацию перехода одновременно — визуальная каша.
Решение нашлось в skipTransition() у провайдера withViewTransitions. Dukhd написала логику, которая определяет тип навигации: если это anchor — анимация пропускается, если переход между роутами — воспроизводится. Элегантно, но с побочным эффектом: каждый вызов skipTransition() генерировал AbortError в консоли. Ошибка не критичная, но при четырёх anchor-ссылках консоль превращалась в поток красных строк.
После долгих экспериментов dukhd приняла прагматичное решение: фильтрация ошибок по сигнатуре AbortError + skipped. Не самое элегантное, но рабочее — и честно задокументированное в дневнике.
Главный урок: анимации — это не только CSS. Это архитектурное решение, которое должно учитывать все типы навигации в приложении. А умение остановиться на «работает, хоть и не идеально» вместо бесконечной полировки — навык не менее ценный, чем сама анимация.
dukhdJSGodsFade-from-top анимация через View Transitions API с кастомной логикой skipTransition() для разделения роутерных переходов и anchor-скролла
Tandi Recognition
Те, кого Tandi заметила за 6 недель
Жюри на защитах оценивает результат. Эта рубрика — про путь. 18 человек, чьи дневники стали примером: глубокая рефлексия, стабильное усилие, мужество честности. Ни один из них не попал в основные рубрики — но Tandi видела их каждую неделю.
tosigaevaTuple TroubleTandi заметила
Раз за разом превращала каждую задачу в архитектурный вызов: CI/CD за один день, виджетный движок на Strategy Pattern, валидация через Server Actions — и каждая следующая итерация оказывалась глубже предыдущей, словно ей мало просто решить задачу, нужно обязательно переосмыслить подход.
coicoinStrict ModeTandi заметила
Методично воссоздал ядро React Router с нуля на чистом TypeScript — HistoryAPI, параметры, хуки навигации, хранение состояния — проводя за кодом по восемь часов подряд, пока каждый edge case не был закрыт. Редкое упорство в стремлении понять механику, а не просто использовать готовое.
ngInitGang of FourTandi заметила
Взял на себя всё, что обычно никто не хочет делать: Figma-макеты до двух ночи, перенос задач из Trello в GitHub Issues вручную, обучающее видео по MUI для команды, диаграммы GitFlow — и параллельно собрал многотемный Bug Hunter виджет на десять часов чистой работы.
SabinaBatrakovaDev JourneyTandi заметила
С нулевым опытом в CI/CD за один вечер прошла путь от чтения документации до зелёного пайплайна: разобралась в GitHub Actions, отладила два последовательных сбоя сборки, починила конфигурацию TypeScript и подключила Netlify — с энергией и рефлексией, которые чувствуются в каждой записи дневника.
sobselenaOrangeCatsTandi заметила
Провела ночь за проектированием полной UX-архитектуры — маршруты, сценарии авторизации, макеты — перебрала несколько вариантов дизайна, задеплоила рабочий прототип и фактически задала продуктовое видение, которое команда приняла за основу.
karinavdUnexpected CaseTandi заметила
В одиночку несла визуальное направление всей команды: полный UI в Figma на пять страниц, тёмная и светлая темы, десять часов дизайна в первый же день — и это от человека на треке разработки, а не дизайна. Параллельно подняла тестовую инфраструктуру на Vitest.
ViktorElenichGrowLabTandi заметила
Последовательно выстраивал архитектуру бэкенда как инженерную дисциплину: Data Contracts First, чтобы не блокировать команду, разделение сервисов ради чистого SoC, осознанный отказ от SDK в пользу нативного fetch — каждое решение в дневнике обосновано принципом, а не удобством.
Nck1969JSGodsTandi заметила
Спроектировал CI/CD-пайплайн с продуманной последовательностью этапов — линтинг до тестов, тесты до сборки — чтобы не тратить ресурсы раннера впустую. Взял полную ответственность за DevOps-инфраструктуру команды: фронт на gh-pages, бэкенд на Railway, защита веток, токены.
Yuriyli111 Blind KittensTandi заметила
Тянет на себе весь технический фундамент проекта: .NET API, Docker с нуля, SQLite, CI/CD, конфигурация линтеров — и за один сеанс способен закрыть шесть разных тем от кроссплатформенных багов до JWT-авторизации, погружаясь в каждую с одинаковой основательностью.
NickKoolasyncmindTandi заметила
Собирал полноценные фичи с первого касания фреймворка: лендинг со слайдером и адаптивом параллельно с изучением React, затем Library page с пагинацией, фильтрами, i18n и миграцией данных на Firebase за четыре дня — масштаб самостоятельной работы растёт от выпуска к выпуску.
t-gladkayaSkillsZen teamСтабильно замечен
Замечен в 5 выпусках (герой, грабли, кейс, инсайт)
KarpovDmitriyДжунгли зовут!Стабильно замечен
Замечен в 5 выпусках (герой, кейс, инсайт)
mikhalenkadaniilJSGodsСтабильно замечен
Замечен в 5 выпусках (герой, инсайт, грабли)
imagineaprilАлекс и его друзьяСтабильно замечен
Замечен в 5 выпусках (грабли, инсайт, герой)
SidoryakaSergeySAA CatСтабильно замечен
Замечен в 5 выпусках (грабли, кейс, герой)
AnnStarrySky111 Blind KittensЧестный голос
Написала «я обычно не люблю писать эмоции» — и тут же сделала именно это. Призналась в усталости и в том, что не успевает, прямо в дневнике, который читают другие. Это редкое мужество — не прятаться за техническими отчётами, а показать себя настоящую. Отдельно ценно: честное осознание своей роли пришло не в начале, а в самом конце — и она не побоялась это зафиксировать.
BerserkBatTypocalypseЧестный голос
Открыто написал, что чувствует себя медленным и неэффективным, что не видит прогресса. Не спрятал растерянность за списком задач — признался, что у него нет ментальной модели проекта и что переход к новым инструментам даётся тяжело. В мире, где все стараются выглядеть уверенно, такая откровенность — акт мужества.
artkoro94Team42Честный голос
Не побоялся описать стресс от командной работы и то, как завышенные внутренние стандарты давят, когда пишешь код не только для себя. Честно зафиксировал свои ошибки и их последствия, не пытаясь приуменьшить масштаб. Дневник читается как разговор с самим собой — без фильтров и без попытки произвести впечатление.
Teams
23ok
10caution
1alert
/
ngKittyDebug
ok▶
RainbowUnicorn
ok▶
RSSAgents
caution▶
Team42
ok▶
Джунгли зовут!
ok▶
GrowLab
caution▶
Strict Mode
ok▶
Дрим Тим
caution▶
JSGods
ok▶
Алекс и его друзья
ok▶
VueJS Tandem
ok▶
Tuple Trouble
ok▶
asyncmind
ok▶
Nova
ok▶
DevCraft
ok▶
Outstanding Alex And Smeshariki
ok▶
Gang of Four
ok▶
Devtones
ok▶
404 Skill Not Found
caution▶
DevBand
ok▶
JustBuildIt
ok▶
Auto-Team 3
ok▶
Auto-Team 4
caution▶
Auto-Team 5
caution▶
SAA Cat
ok▶
Auto-Team 7
ok▶
Т-8
ok▶
Auto-Team 9
caution▶
SkillsZen team
caution▶
Unexpected Case
caution▶
TetraTeam
caution▶
111 Blind Kittens
ok▶
CodePain
ok▶
Tandem Trauma Team
alert▶
Над выпуском работали: Статист · Скаут · Жюри · Перо · Корректор · Курьер