Блог AfterPack
announcementjavascript obfuscationsecurityAI

Представляємо AfterPack: безкоштовний JavaScript-обфускатор для вебу

від Nikita Savchenko9 хв читання

Сьогодні ми запускаємо три речі:

  • AfterPack — сучасний JavaScript-обфускатор для епохи ШІ. Він перетворює вашу продакшн-збірку на іншу програму щоразу: нова форма на кожній збірці, і на кожному запиті всередині Cloudflare Worker.
  • Оновлений сканер сайтів, що знаходить усе читабельне в коді будь-якого сайту: публічні source map, читабельну логіку й витік облікових даних.
  • Онлайн playground, щоб спробувати AfterPack на власному коді прямо в браузері.

AfterPack (afterpack.dev), JavaScript-обфускатор, працює з будь-яким фреймворком. CLI і плагіни мають відкритий код, локальний рушій безкоштовний, а хмарні збірки Pro коштують від $49 на місяць. Почніть із npx afterpack@latest після збірки, або попросіть свого кодового агента додати його.

Знайомтеся, AfterPack: безкоштовний інструмент збірки, який робить ваш відвантажений код нечитабельним для сканерів і людей — і рухомою мішенню для ШІ. Кожна збірка відвантажує зовсім інший код, тож скрипт, написаний під патч одного релізу — чит, юзерскрипт, обхід — не підійде до наступного. Інструмент, написаний під ваш код, має перестати працювати з вашим наступним релізом, а тепер, усередині вашого власного Cloudflare Worker, він може перестати працювати вже з наступним запитом.

Навіщо обфускувати JavaScript, якщо ШІ вже вміє його читати?

Бо все, що вміє читати ШІ, воно вміє й переписати та перепакувати. Направте кодового агента на свій бандл — і за кілька хвилин хтось матиме ваші правила ціноутворення, перевірку пейволу чи антибот-логіку як чистий, редагований вихідний код, разом зі скриптом, що патчить або обходить їх. Раніше це було роботою для спеціаліста; тепер це просто промпт. І патч продовжує працювати, доки ваш код зберігає свою форму. Мініфікація цей код ніколи не ховала: «витік» Claude Code був читабельним бандлом, що лежав на npm від самого запуску. Що мініфікований бандл усе ще видає і як перевірити власний сайт, розказано в пості про те, що користувачі бачать у вашому JavaScript і як його захистити.

У травні 2026 року я віддав флагманські демо двох популярних обфускаторів у Claude Code з одним промптом на чотири абзаци. Claude Opus 4.6 повернувся з чистим вихідним кодом за 10 хвилин; Claude Opus 4.7 знадобилося 20. Це були невеликі демо, а не цілі застосунки, і ці моделі вже на покоління відстають від сьогоднішніх.

Ваші правила ціноутворення, перевірки ліцензій, антифрод-евристики й неанонсовані функції завжди були в бандлі. Змінилося те, хто може їх прочитати, і як швидко. Те, що ви й досі контролюєте, — це скільки з цієї роботи переноситься на ваш наступний реліз.

Чи можна відновити обфускований JavaScript?

Так. Маючи досить часу, вивід будь-якого обфускатора можна розвернути, зокрема й AfterPack. AfterPack змінює перенесення: скільки з роботи над розвертанням одного релізу ще працює для наступного. За нашим власним вимірюванням (вересень 2026, шість сідів × п'ять зразків), менше 6% того, що деобфускатор відновив з однієї збірки, ще розв'язувалося на наступній (як ми міряли).

І логіка, яку хтось уже прочитав, лишається прочитаною: якщо людина одного разу розібралася з вашим правилом знижок, нова збірка не змусить її це забути.

Застаріти може інструмент, збудований на цьому прочитанні. Скрипт, що вирізає перевірку ліцензії, патчер для пейволу, екстрактор, що витягує ваші правила скорингу з кожного релізу: кожен із них написаний під структуру однієї збірки. Найпопулярніший open-source обфускатор видає фіксовані форми виводу, а безкоштовні публічні деобфускатори мають для них захардкоджені розпізнавачі, тож інструмент, написаний один раз, продовжує працювати на кожній майбутній збірці.

AfterPack починає з нового випадкового сіда на кожну збірку. Імена ідентифікаторів, закодовані рядки, сигнатура декодера, нумерація станів і масковані константи — усе виходить інакшим, тож деталі, які інструмент захардкоджує, щоразу змінюються. Запустіть рушій у Worker — і вікно скорочується з релізу до одного запиту.

Що є в AfterPack?

CLI, плагіни для бандлерів, якими ви вже користуєтеся, збірка на WebAssembly для Workers, хмарні збірки Pro, звіт про те, що захистила кожна збірка, і безкоштовний сканер сайтів.

ФактAfterPack
Що цеJavaScript-обфускатор для продакшн-збірок: переписує те, що видає ваш бандлер, а не ваші вихідні файли
РушійRust, запускається локально через CLI і плагіни або як WebAssembly (@afterpack/wasm) у вашому власному Worker
ВивідЗа замовчуванням інший на кожній збірці в CLI і плагінах; фіксуйте сід лише тоді, коли потрібні ідентичні байти
ЛіцензіяCLI і плагіни — Apache-2.0; рушій безкоштовний для використання за AfterPack Engine License
ЦінаЛокальний рушій безкоштовний; Pro від $49 на місяць (тарифи)
Стартnpx afterpack@latest після збірки або плагін для фреймворка

Чого не видно в таблиці:

  • Плагіни для фреймворків: Next.js, Vite, webpack, Astro, Nuxt, SvelteKit, Svelte, Vue, Angular, Parcel, esbuild, Rollup і Electron. Ваша звичайна продакшн-збірка видає обфускований вивід.
  • Pro: передайте ключ, і той самий виклик виконається в хмарі AfterPack, з директивами, що спрямовують посилений захист на код, який має значення. Якщо ключ чи хмара недоступні, збірка падає, а не тихо відвантажує слабший захист.
  • Protection Map: HTML-звіт по вашому оригінальному вихідному коду, де кожен токен розфарбовано за тим, скільки перетворень він пройшов. Він створюється, коли ваша збірка видає source map; плагіни можуть увімкнути це за вас.
  • Безкоштовний сканер безпеки, також доступний як npx afterpack audit <url>.

Який вигляд має обфускований вивід AfterPack?

Ідентифікатори зникають, а рядкові літерали кодуються за декодером часу виконання; наскільки більше відбувається — залежить від пресету. light (за замовчуванням) кодує рядки й переписує синтаксис, не додаючи структурних шарів — правильна база для більшості проєктів. medium робить продакшн-код помітно важчим для читання; hard — для коду, який має значення: ціноутворення, доступ, перевірки ліцензій; extreme задає найвищу складність серед пресетів, і його краще спрямовувати на одну функцію чи файл, а не на весь бандл.

Функція на 139 байтів, до:

1export function discount(plan, seats) {
2 if (plan === "team" && seats >= 10) return 0.2;
3 if (plan === "team") return 0.1;
4 return 0;
5}

І після одного запуску npx afterpack@latest на пресеті за замовчуванням light (27 вересня 2026 року):

1export function discount(N, O) {
2 if (N === Jr("T|P4") && O >= 10) return 0.2;
3 if (N === Jr("T|P4")) return 0.1;
4 return 0;
5}

Рядка "team" немає, замість нього — шифротекст і виклик декодера; запустіть ще раз — і імена, шифротекст та сигнатура декодера вийдуть інакшими. На light числа на кшталт 10, 0.2 і 0.1 лишаються читабельними; medium і вищі ще й маскують цілочисельні константи на кшталт того 10. Сам декодер додає накладні витрати, тож такий маленький файл виходить пропорційно більшим, ніж вийшов би реальний бандл: на реальному бандлі light дає в 1,9–2,4 раза більше за вхід після gzip (пресети).

Вставте свою функцію в playground, щоб побачити, що робить із нею кожен пресет — без встановлення, без акаунта.

Спробуйте AfterPack прямо зараз

  • Вставте код: playground обфускує все, що ви вставите, прямо в браузері, без встановлення.
  • Проскануйте свій сайт: сканер безпеки показує, що ваш продакшн JavaScript уже видає.
  • Один промпт: дайте його кодовому агенту — Add AfterPack to this project: read afterpack.dev/llms.txt, follow the quickstart for my framework, then run a production build and show me the Protection Map.
  • Одна команда: запустіть npx afterpack@latest після наступної збірки.

Обфускуйте JavaScript на кожен запит у Cloudflare Worker

@afterpack/wasm запускає рушій як WebAssembly у вашому власному Worker, тож свіжий сід на кожен виклик обфускує кожну відповідь по-іншому:

1import { obfuscate } from "@afterpack/wasm";
2
3export default {
4 async fetch(request) {
5 const upstream = await fetch("https://example.com/app.js"); // your origin's bundle
6 if (!upstream.ok) return upstream;
7 const source = await upstream.text();
8 const result = await obfuscate(
9 { path: "app.js", source },
10 { preset: "hard", seed: crypto.randomUUID() },
11 );
12 return new Response(result.bytes, {
13 headers: { "content-type": "application/javascript" },
14 });
15 },
16};

Якщо запустити цей обробник у Node на Apple M2 Max (27 вересня 2026 року), віддаючи файл discount з локального origin, чотири запити повертають чотири різні виводи, кожен із правильними знижками. Коли модуль прогрітий, кожна обфускація займає менше 4 мс; перший виклик, що ініціалізує рушій, — близько 40 мс. Це вхід на 139 байтів; справжній бандл коштує набагато більше CPU, і платите ви за це на кожній відповіді. У гайді з Workers описано ліміти планів і коли краще кешувати одну форму на вікно ротації.

Повне налаштування, з конфігом wrangler, однією кешованою формою на вікно часу та реальним виводом curl, — у туторіалі про те, як обфускувати JavaScript на кожен запит у Cloudflare Workers.

Як обфускувати збірку Next.js, Vite, webpack чи будь-яку іншу

Запустіть CLI після збірки або встановіть плагін для свого бандлера, щоб кожна продакшн-збірка виходила обфускованою. CLI не потребує налаштування; запустіть це в корені проєкту після збірки:

npx afterpack@latest

Він знаходить вивід збірки (dist/, .next/, .output/, build/ або out/), переписує його на місці й зберігає бекап; npx afterpack@latest restore скасовує запуск.

Щоб обфускація стала частиною самої збірки, встановіть плагін для свого бандлера:

npm install -D @afterpack/next # or @afterpack/vite, @afterpack/webpack

Кожен плагін потребує однієї невеликої зміни в конфігу, наприклад обгорнути конфіг Next.js у withAfterpack(config); на сторінці фреймворків це показано для кожного підтримуваного бандлера, від Astro до Parcel. Щоб побачити, що ваш живий сайт відкриває сьогодні, спершу проженіть його через сканер.

Які обмеження в AfterPack?

AfterPack підвищує ціну читання вашого коду й повторного використання інструментів проти нього; він не може сховати значення від того, хто інструментує запущену програму, тож секретам і всьому, що дає доступ, місце на вашому сервері. А те, що він дає, приходить разом зі збіркою, яку ви вже запускаєте: кожен реліз — нова мішень, без додаткового кроку, про який треба пам'ятати.

Що далі для AfterPack?

Далі — обфускація мережі: network transport cloaking проганятиме ваші API-запити й відповіді крізь кодек, який змінюється з кожною збіркою. Обфускація між модулями зв'яже логіку через межі модулів, а AfterPack on Workers for Platforms віддаватиме нову форму на кожен запит — без нічого встановлювати. Після JavaScript — курс на HTML і CSS.

Часті запитання про AfterPack

AfterPack безкоштовний?

Так. CLI, плагіни для фреймворків і локальний рушій безкоштовні, а ваш вихідний код ніколи не залишає вашу машину. Pro додає хмарні збірки та директиви для окремих ділянок коду від $49 на місяць, а зареєстрований Free-воркспейс отримує 10 МБ збірок Pro на місяць. Повна таблиця — на сторінці тарифів.

AfterPack має відкритий код?

CLI і плагіни для фреймворків — так, під Apache-2.0, на GitHub. Рушій, який вони запускають, безкоштовний для використання за AfterPack Engine License.

Чи сповільнює обфускація мій код?

Помірно, і сильніше на потужніших пресетах. За замовчуванням стоїть light. Підніміть пресет для всього проєкту або скористайтеся Pro-директивою, щоб спрямувати hard чи extreme лише на функції, яким це потрібно.

Чим AfterPack відрізняється від інших JavaScript-обфускаторів?

Він працює з вашою продакшн-збіркою через плагін для бандлера, яким ви вже користуєтеся, і за замовчуванням кожна збірка дає інший вивід, тож деобфускатор, написаний під один реліз, здебільшого перестає працювати на наступному. Час збірки, розмір виводу й перенесення, виміряні поруч з іншими обфускаторами, — на сторінці порівняння.

Чи ховає обфускація API-ключі?

Ні. Усе, що використовує ваш запущений код, може підглянути той, хто запускає його в браузері під своїм контролем, тож тримайте API-ключі та інші секрети на сервері. Кодування таки не дає знайти ключ через grep чи автоматичними сканерами секретів, і це дає час замінити ключ, який потрапив у збірку випадково (найкращі практики).


Знайшли баг або хочете бандлер, якого ми ще не підтримуємо? Відкрийте issue на GitHub і вкажіть свій бандлер і його версію — саме там я читаю фідбек.

Код, який ви публікуєте, завжди можна було прочитати. Від сьогодні те, що хтось дізнається з одного релізу, не обов'язково годиться для наступного.

— Nikita

Залишайтеся в курсі

Слідкуйте за AfterPack, щоб отримувати нотатки до релізів і статті.