Опенсорс QR-генератор на Cloudflare Workers + демо-сайт за один вечер с Claude

Franky

У руля
Запилил штуку, которой самому давно не хватало — генератор QR-кодов в виде чистого SVG, который отдаёт CF Worker с edge-кешированием. Работает на Cloudflare Pages, так что демо-сайт, если вы заходите из России - не откроется.

Проблема: все генераторы выдают PNG/SVG по 60–80 KB с кучей мусора внутри (маски, clipPath, float-координаты). Вставлять такое в вёрстку — боль.

Решение: https://github.com/investblog/qr-generator — один Worker, один <path> с run-length encoding, целочисленные координаты. На выходе ~5 KB вместо 80. Кешируется на edge на год по каноническому URL.

API бесплатный и открытый — без ключей, без регистрации, без лимитов:
Код:
https://qr.qrcgen.com/qr.inline?data=https://example.com
Получаете SVG напрямую. Можно встраивать через <img>, можно через fetch как inline. Есть пресеты размеров, уровни коррекции ошибок, настройка quiet zone.

Демо-сайт: https://qrcgen.com — тыкаете, генерируете, копируете SVG или URL.

Весь демо-сайт (фронт на Vite + TypeScript, Worker с проксированием API, деплой на CF, SEO, тёмная/светлая тема) собрал за один вечер вместе с Claude. От git init до рабочего продакшена на домене. Сорцы воркера подключены сабмодулем, всё деплоится одной командой.

Исходники воркера: https://github.com/investblog/qr-generator
🔥 Если хотите свой приватный инстанс — воркер ставится за 10 минут, даже если вы ничего не знаете о коде. Достаточно импортнуть гит-репо прямо в Cloudflare Dashboard → Workers & Pages → Create → Import repository. CF сам соберёт и задеплоит. Можно прикрутить свой домен и закрыть API-ключом — всё описано в README.
Пользуйтесь, воркер на бесплатном тарифе CF и всё равно выдержит — ответ из кеша за миллисекунды.
 
При TTL на годик и публичном API без лимитов ты ограничиваешь длину data?
Да, ограничиваешь 😉. В src/params.ts:17-19:

const maxLen = Number(env.MAX_DATA_LEN ?? '2048');
if (data.length > maxLen) {
return { ok: false, status: 413, message: `Data exceeds maximum length of ${maxLen}` };
}

Дефолт — 2048 символов, задаётся через MAX_DATA_LEN в wrangler.toml:9.

Но если ты намекаешь на проблему — она есть. Cloudflare Cache API evict'ит записи по LRU, когда ему нужно место. max-age=31536000 — это максимум, а не гарантия. Непопулярные ключи вылетят задолго до года. Это их инфраструктура, их проблемы с хранением.

⁉️ Хочешь, чтобы я добавил rate limiting или это был просто вопрос?
 
Последнее редактирование:
Сделал мини-расширение для браузера, чтобы иметь QR-коды под рукой. Если честно, то сам использую только для того, чтобы быстро подать текущую страничку браузера себе в телефон 😉

👉 Качаем из Crome Web Store.
440x280_ru.png
 
Последнее редактирование:
Назад
Сверху