mesh-avatar-studio
일러스트를 코딩 에이전트와 로컬 편집기로 2D 메쉬 애니메이션 아바타로 변환
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
MVP веб-застосунку (і Telegram Mini App) для створення анімованих емодзі в стилі Auto Emoji Maker: вводите текст або завантажуєте SVG-логотип, обираєте персонажів, кольори та розмір і отримуєте готові файли .tgs для Telegram (або Lottie JSON). Усе працює в браузері, без сервера, акаунтів і кабінетів.README 전문 보기 ↗
MVP веб-застосунку (і Telegram Mini App) для створення анімованих емодзі в стилі Auto Emoji Maker:
вводите текст або завантажуєте SVG-логотип, обираєте персонажів, кольори та розмір і отримуєте готові
файли .tgs для Telegram (або Lottie JSON). Усе працює в браузері, без сервера, акаунтів і кабінетів.
opentype.js), тож у файлі немає текстових шарів, які Telegram не підтримує.
13 вбудованих шрифтів із кирилицею (Nunito, Rubik, Unbounded, Montserrat, Russo One, Dela Gothic, Lobster…), до 3 рядків,
обводка, міжлітерний і міжрядковий інтервали, ВЕЛИКІ ЛІТЕРИ. Можна завантажити свій шрифт (TTF / OTF / WOFF).path, rect, circle, ellipse, line, polyline, polygon, <use>, вкладених <svg>, трансформацій,
CSS-класів із <style>, прозорості, fill-rule, обводок і лінійних/радіальних градієнтів. Режими «оригінальні кольори» або «перефарбувати»,
плюс контур-наліпка навколо лого. SVG ніколи не вставляється в сторінку (безпечно щодо скриптів у файлі).[ ] з клавіатури) або пальцями (одним — рух, двома — масштаб і поворот)..json, .tgs і .lottie (dotLottie з LottieFiles, з картинками всередині).
Вирази After Effects (wiggle, loopOut, прив'язки між шарами…) виконує лише повний веб-плеєр — ні Telegram, ні прев'ю їх не
запускають, тож такі файли виглядали поламаними. Під час імпорту анімація один раз програється повним плеєром (він
завантажується окремо й лише для таких файлів), а значення кожної властивості з виразом записуються звичайними ключовими
кадрами (прямі відрізки зливаються, щоб файл не ріс). Неквадратні сцени (1920×1080, 800×600…) вписуються в 512×512 у
композиції розміру свого кадру, тож те, що було за краєм, не вилазить у поля; у списку шарів ця рамка не показується.
Якщо у файлі лишилося те, чого Telegram не показує (ефекти шарів, текст, картинки, 3D, Merge Paths), панель шарів про це
попереджає. Перевірено на 93 анімаціях з прикладів rlottie і 228 анімаціях самого Telegram.t.me/addstickers/…,
t.me/addemoji/…, чи вставте його в редакторі на плитці «Пак стікерів») — редактор завантажить усі анімовані стікери,
приведе їх до формату Telegram (512×512, 60 FPS), сам знайде лого/напис, спільний для всіх стікерів паку (порівнює
контури незалежно від положення й розміру; копії-обводки ховає), і підставить замість нього ваш текст чи лого. Паки
з'являються в «Мої паки»; адміністратор бота може додати пак у «Шаблони бота» — їх бачать усі користувачі..tgs (gzip + "tgs": 1) або Lottie JSON, окремо чи одним ZIP. Для кожного файлу перевіряються ліміти Telegram:
512×512, 60 FPS, ≤ 3 с, ≤ 64 КБ. Типовий розмір — 1–5 КБ.localStorage.Звичайний користувач бачить простий застосунок (мобільний у першу чергу): Головна · Створити · Мої · PRO · Профіль, зверху — баланс «✨ Генерації: N» (дотик — поповнення).
cost генерацій на бекенді атомарно (Lua-скрипт у Redis): баланс не піде в мінус, а повторне
натискання, перезавантаження чи повтор запиту з тим самим id не спише вдруге. Результат — у «Мої генерації» (файли
зберігаються на пристрої, список — на сервері): завантажити .tgs, надіслати в Telegram, створити емодзі-пак. Бот
доставляє клієнтам лише оплачені дизайни (gens у /api/send, /api/pack перевіряються).POST /api/app/wallet), і оплата йде з нього одним
дотиком; або посилання ton://transfer / вручну з унікальним коментарем. Ціна в GRAM — за курсом Crypto Pay
(getExchangeRates, GRAM або TON) або GRAM_USD_RATE.
Генерації зараховуються тільки після підтвердження платіжною системою (Crypto Pay getInvoices / підписаний вебхук,
транзакція GRAM у блокчейні TON через toncenter — коментар, сума, не bounced) і рівно один раз. Незавершений платіж
запам'ятовується — після повернення з гаманця перевірка продовжується сама.ADMIN_IDS, PRO — оплачений строк). Адміну в профілі доступні
адмін-панель (стартові генерації, ціна дизайну, пакети, PRO, які шаблони бачать клієнти й які PRO, нарахування
користувачу, платежі) і (шари, шрифти, позиції — увесь попередній функціонал); у ньому кнопка
«Опублікувати для клієнтів» на стікерах паку шаблонів зберігає, куди підставляються фото/логотип/текст. Усі адмін-дії
перевіряються на бекенді ( → 403 для не-адмінів).Налаштування (Vercel → Settings → Environment Variables, потім Redeploy):
KV_REST_API_URL і KV_REST_API_TOKEN (або UPSTASH_REDIS_REST_URL/_TOKEN; з власним префіксом —
<PREFIX>_REST_API_URL/_TOKEN, теж підхоплюються). Без нього генерації безкоштовні,
а адмін усе одно бачить розширений редактор.ADMIN_IDS — ваш Telegram ID (бот покаже на /id).CRYPTO_PAY_TOKEN
(для тестів — @CryptoTestnetBot і CRYPTO_PAY_NETWORK=testnet). Там же в Webhooks
увімкнути й вказати https://<проєкт>.vercel.app/api/app/cryptopay (без нього оплата підтверджується опитуванням).GRAM_WALLET (або старе TON_WALLET) — адреса гаманця для прийому; за бажанням TONCENTER_API_KEY (ключ
від @tonapibot, без нього 1 запит/с), GRAM_USD_RATE (фіксований курс), GRAM_NETWORK=testnet.Якщо рахунок не створюється, у вікні оплати тепер видно причину й код: accounts-off — не підключене сховище (п. 1);
method-off — немає токена/гаманця; UNAUTHORIZED — токен Crypto Pay не той або з іншої мережі (токен з
@CryptoTestnetBot працює лише з CRYPTO_PAY_NETWORK=testnet, з @CryptoBot — без неї); інші коди — помилка Crypto Pay
(див. документацію). Якщо Crypto Pay не приймає кнопку «повернутися в
застосунок» (paid_btn_url), рахунок створюється без неї.
API: POST /api/app/me | generate | pay | pay-status | wallet | admin, GET /api/app/catalog | template-edits,
POST /api/app/cryptopay (вебхук) — одна функція Vercel api/app/[action].ts.
npm install
npm run dev # http://localhost:5173
npm test # юніт-тести (vitest)
npm run build # типізація + продакшн-збірка в dist/
npm run preview # перегляд збірки
Потрібен Node.js 20+.
/newemojipack..tgs./publish.dist/ — це статичний сайт, тож його можна розмістити на будь-якому HTTPS-хостингу. У репозиторії налаштовано
GitHub Pages (.github/workflows/pages.yml): кожен пуш у main проганяє тести, збирає застосунок і публікує його на
https://oxytarget.github.io/lottie-emoji-editor/. Запустити деплой вручну можна з вкладки Actions → Deploy to GitHub Pages → Run workflow.
Одноразове налаштування: Settings → Pages → Build and deployment → Source: GitHub Actions.
Для приватного репозиторію Pages доступні лише на платних тарифах GitHub (Pro / Team); на безкоштовному — зробіть
репозиторій публічним або використайте Netlify, Vercel чи Cloudflare Pages (команда збірки npm run build, тека dist).
Потім у @BotFather → Bot Settings → Menu Button / Configure Mini App вкажіть URL застосунку.
Налаштування бота (.github/workflows/telegram-bot.yml, запуск вручну): кнопка меню «Emoji Studio» відкриває редактор,
команда /start, опис і короткий опис (uk / ru / en). Потрібен секрет TELEGRAM_BOT_TOKEN
(Settings → Secrets and variables → Actions). Токен ніколи не комітьте в репозиторій.
Бекенд бота (api/ + worker/src/app.ts, звичайні Web Request → Response):
POST /api/send — у Telegram кнопка «Надіслати в чат» у вікні експорту відправляє файли сюди; бекенд перевіряє
підпис initData і бот надсилає .tgs файлами користувачу в чат (альбомами по 10). Якщо користувач ще не натискав Start,
Mini App попросить дозвіл на повідомлення й повторить спробу;POST /api/pack — бот сам створює емодзі-пак користувача (createNewStickerSet, тип custom_emoji, власник — користувач)
або дописує в пак, створений раніше (addStickerToSet, до 200 емодзі). У вікні експорту задаються назва паку й звичайний емодзі
для кожного персонажа; після створення бот надсилає посилання t.me/addemoji/.... Великі паки: Telegram створює пак
одразу лише з 50 емодзі, а решту дозволяє додавати по одному й лише певну кількість за кілька хвилин, потім відповідає
«retry after N s». Редактор додає рівним темпом, а таку паузу відчікує скільки треба (зворотний відлік, кнопка
«Зупинити»; пауза запам'ятовується й для наступних запитів, бо ранній запит її лише подовжує). Прогрес зберігається
(можна закрити застосунок і потім натиснути «Додати решту»), або пак можна розбити на кілька по 50 — вони створюються
без очікування. Повтор запиту безпечний: новий пак названо за nonce клієнта, а для наявного клієнт передає, скільки
емодзі в ньому нарахував (size) — бекенд звіряє з getStickerSet і не додає вдруге те, що вже потрапило в пак
(Telegram іноді приймає емодзі й одразу відповідає «зачекайте», або відповідь губиться через обрив зв'язку чи тайм-аут);
обірвані запити редактор повторює сам. Один запит додає не довше ~40 с (ліміт функції Vercel), решта — наступним. Файли перетворюються на полотно 100×100
(формат кастомних емодзі); якщо Telegram відхилить його, бекенд автоматично повторить із 512×512;POST /api/telegram — вебхук: на /start бот відповідає привітанням і кнопкою «Відкрити редактор»; на /start link —
кодом для редактора в браузері (див. нижче); на стікер, кастомне
емодзі чи посилання на пак — кнопкою «Відкрити як шаблони» (адміністраторам ще й «Додати в шаблони бота для всіх»);
/templates — список шаблонів бота, /id — ваш Telegram ID;GET /api/stickerset?name=…, GET /api/sticker?id=… — анімовані стікери паку для редактора (публічні дані, кешуються CDN;
файли віддаються через бекенд, бо посилання Telegram містять токен; віддаються лише .tgs);GET /api/templates — паки, які адміністратор додав у шаблони бота;GET /api/link?code=… — чи дійсний код прив'язки браузера;GET /api/health — перевірка, чи задано токен, і @username бота.Паки з браузера. У Mini App бот знає користувача з підпису initData. Редактор, відкритий у звичайному браузері,
у вікні «Завантажити» пропонує «Створити пак у Telegram»: кнопка «Відкрити бота» веде на t.me/<бот>?start=link, бот
відповідає кодом і кнопкою «Повернутися в редактор» (#tglink=<код> в адресі) — або код можна вставити вручну. Після цього
бот сам створює паки й надсилає файли в чат так само, як у Mini App. Код — це ID користувача й строк дії (90 днів),
підписані HMAC від токена бота: без бази даних і без /setdomain у BotFather. Код зберігається лише в цьому браузері
(вимкнути — у вікні експорту чи в профілі); прострочений бекенд відхиляє, і редактор попросить підключитися знову.
Шаблони бота для всіх. Додайте у Vercel змінну ADMIN_IDS — свій Telegram ID (бот покаже його на /id; кілька — через
кому) і зробіть Redeploy. Тоді на надісланий пак бот покаже адміністратору кнопку «➕ Додати в шаблони бота для всіх».
Список зберігається без бази даних — у повідомленні, яке бот закріплює в чаті першого адміністратора (не відкріплюйте його).
lottie-emoji-editor (Framework Preset визначиться як Vite).TELEGRAM_BOT_TOKEN = токен бота → Deploy..env.production (VITE_BOT_API_URL=https://lottie-emoji-editor.vercel.app) —
і GitHub Pages-версія, і Vercel надсилають файли через нього. Для іншого проєкту змініть цю адресу.backend_url вкажіть https://<проєкт>.vercel.app —
зареєструється вебхук (повідомлення й натискання кнопок). Після оновлень бота запустіть його ще раз.Workflow .github/workflows/bot-backend.yml деплоїть worker/, передає йому токен, реєструє вебхук і перезбирає сайт.
Секрети репозиторію: TELEGRAM_BOT_TOKEN, CLOUDFLARE_API_TOKEN (шаблон Edit Cloudflare Workers на
https://dash.cloudflare.com/profile/api-tokens), CLOUDFLARE_ACCOUNT_ID (32 символи в адресі панелі після dash.cloudflare.com/).
Перед першим деплоєм відкрийте https://dash.cloudflare.com/?to=/:account/workers/onboarding, щоб створився піддомен *.workers.dev.
Локально: cd worker && npm install, створіть worker/.dev.vars з TELEGRAM_BOT_TOKEN=... і ALLOWED_ORIGINS=http://localhost:5173,
запустіть npx wrangler dev, а сайт — VITE_BOT_API_URL=http://127.0.0.1:8787 npm run dev.
Скрипт telegram-web-app.js підвантажується лише тоді, коли сторінку відкрито як Mini App (є параметри tgWebApp*):
застосунок розгортається на весь екран, підхоплює мову користувача та дає тактильний відгук.
Деякі клієнти Telegram (зокрема iOS) блокують завантаження файлів із міні-застосунку, тому у вікні експорту є кнопка «Відкрити в браузері».
src/
lottie/ генерація Lottie: кейфрейми, шейпи, Безьє, заливки/градієнти, збирання, експорт TGS/ZIP, імпорт, перефарбування
розбір імпортованих анімацій на частини й їх переміщення (parts.ts), пошук спільного лого в паку (packs.ts)
content/ текст → контури (opentype.js), SVG → контури, каталог шрифтів
templates/ анімовані персонажі (builtin.ts) і векторні деталі (kit.ts)
state/ стан (zustand), пресети, компіляція у Web Worker (з кешем), завантаження паків, постери плиток (posters.ts)
components/ інтерфейс
lib/ інтеграція з Telegram Mini App і надсилання файлів у чат
api/ функції Vercel (бекенд бота)
worker/ спільний код бекенда + вхід для Cloudflare Workers
scripts/ налаштування бота й вебхука
Ключова ідея: будь-який контент (текст чи лого) спершу перетворюється на незалежні від роздільності контури (VectorArt),
а шаблон лише задає «слот», куди контент вписується, і анімацію. Згенеровані файли використовують тільки те, що підтримує rlottie
(рендерер Telegram): шейп-шари, null-шари для анімації, групи, контури, еліпси, прямокутники, заливки, обводки й градієнти.
Під час розробки всі шаблони перевірено рендерингом у rlottie.
clip-path, фільтри й візерунки пропускаються (редактор про це попереджає) —
переведіть текст у криві та спростіть файл перед імпортом..tgs) стікери й емодзі; відео (.webm) і статичні пропускаються. Лого шукається за
однаковими контурами в більшості стікерів паку — якщо в паку лого немає або кожен стікер різний, редактор кладе ваш текст
поверх (це можна вимкнути), а замінну частину можна вибрати вручну в «Частинах анімації»./api/app/admin