Огляд

signed by Lollyoverview.htmlHTMLAI generatedgenerated by ClaudeПеревірте саміGet the signed filepixels, not shapes12 KB

Іконка Lolly - велика зелено-біла карамелька на паличці

Цей документ фіксує мету, структуру та архітектурні рішення платформи Lolly. Він відображає як бачення продукту, так і поточний стан кодової бази.

Статус: Lolly - внутрішній прототип у закритому пілоті, який ще не завершено. Двигун детермінований і внутрішньо узгоджений, але продукт ранній - SUSE це клієнт номер один - і його криптографічні механізми та механізми розбору файлів наразі проходять сувору інфраструктурну загартовку SUSE, готуючись до масштабу enterprise (ми справді добре це вміємо). Читайте архітектуру нижче як задум дизайну під тестуванням, а не готовий, сертифікований продукт. Див. Впровадження та управління про те, як ведеться і вимірюється пілот.

Як читати цю сторінку. Вона містить два види матеріалу, за порядком. Перша половина - це навіщо це існує: проблема, позиціювання і життєвий цикл, через який проходить один актив. Від Загальна картина і далі йде як складаються шари: архітектурний документ для контриб'юторів, що охоплює розділення engine/shell/pack, структуру репозиторію, цілі постачання та зобов'язання, що обмежують кожну зміну платформи. Якщо ви тут, щоб змінювати кодову базу, а не щоб зрозуміти продукт, почніть із загальної картини.

Два супутники йдуть глибше за цю сторінку. engine/README.md у репозиторії - це карта двигуна модуль за модулем, зі згенерованою таблицею кожного модуля і того, що він розбирає чи записує. Модель загроз і межі довіри - та сама архітектура, прочитана як межі довіри, і це правильна сторінка для будь-якого питання про те, що двигун вважає недовіреним.


Навіщо це існує

Команди стикаються з повторюваною проблемою: рутинна творча й контентна робота, надто передбачувана, щоб виправдовувати залучення кваліфікованих рук щоразу, але надто чутлива до якості, щоб передавати її без запобіжників. Результат - або повільна пропускна здатність (вузьке місце спеціаліста), або неузгодженість (люди користуються яким завгодно інструментом), або залежність від постачальника (SaaS DAM, що контролює ваші шаблони).

Ця платформа - пряма відповідь:

Програмний творчий і контентний вивід у масштабі - генерація активів без ручної праці, з правилами під централізованим контролем, для працівників, постачальників і партнерів.

Lolly — це не те місце, де вигадують дизайн-систему, а те, де її виробляють. Уявіть це як торговельний автомат для дизайну: робите вибір — отримуєте результат. Щоразу. Рушій працює на найвищу якість, яку кожен формат здатен видати на обладнанні перед вами, і той самий рушій створює той самий файл на кожній платформі, куди він постачається.

Результат - достаток: кожна подія має правильні вивіски, кожне сповіщення про CVE відповідає фірмовому стилю, кожна етикетка друкується чисто, кожен email-підпис актуальний - усе без заявки в дизайн. Платформа обробляє повторювану операціоналізовану творчість. Це навмисно не інструмент для унікальної творчої роботи - дизайнери й далі володіють флагманською роботою.

Досліджуйте ймовірнісно, масштабуйте детерміновано

Кожна суперечка про ШІ в творчому конвеєрі впирається в те саме питання: яка частина цього - робота машини? Це старе питання з усталеною відповіддю. Переписувачі й ілюстратори вже працювали між двома інструментами - вільним ескізом, де нічого не було фіксованим і все можна було пробувати, і друкарським верстатом, лячним саме тому, що він фіксував остаточно. Ескізи - це де відбувалося мистецтво. Верстат - це як воно доходило до когось. Ніхто не плутав ці дві речі, і обидві продовжували розвиватися - нові чорнила, нові шрифти, нові верстати - кожна вдосконалювалася в гармонії з ремеслом і задумом, якому служила.

Lolly проводить ту саму межу. Досліджуйте ймовірнісно: модель, дизайнер, груба ідея, підказка, що веде туди, куди ніхто не планував. Потім масштабуйте детерміновано - те, що досягає десяти тисяч виводів, це інструмент, а інструмент рендериться однаково щоразу з вхідних даних, які можна прочитати. Дослідження лишається вільним, бо нічого нижче за течією не залежить від того, чи вийде воно однаково двічі. Вивід заслуговує довіри, бо це не здогадка. Перетворення експериментів зі ШІ на передбачувані, відтворювані результати - не нова дисципліна; це той самий розподіл праці, що зробив друковану роботу вартою довіри від самого початку.

Довіряйте творчому процесу, масштабуйте зі строгістю.

Проти альтернатив

Capability Lollyconstraint-first Penpotopen design CanvaAffinity
Cavalry
Adobedesktop pro Brand DAMFrontify
Bynder
Cloudinarymedia pipeline Figmaonline pro Render APIsBannerbear
Placid
Creatomate
Overall completenessunweighted mean - weight rows for your own context · columns are sorted by this row 84 70 57 48 41 41 41 34
Production maturity & track recordCanva, Adobe, Figma, Bynder/Frontify: a decade-plus at massive scale. Render APIs: years in production pipelines. Penpot: shipping, large community, younger at enterprise scale. Lolly: closed pilot, security hardening underway, no public case studies. Cloudinary: 2012, enterprise media infrastructure at global scale.
25 75 100 100 100 100 100 75
Mass generation from data (CSV / API)Lolly: batch grid + CLI, one file per row. Canva: Bulk Create + Autofill API - real, but Enterprise-gated, async, text/image fields only; Affinity Publisher adds desktop data merge. Adobe: InDesign data merge and scripting. Figma: Buzz fills templates from CSV or XLSX, free in beta (Aug 2026) - cloud- and account-gated, 50. Penpot: open API/MCP, not purpose-built. Render APIs: this is their entire product - account- and cloud-gated, so 75 under the method rule. DAM: Studio-style batch create and resize. Cloudinary: URL-driven overlays and named transforms derive variants at scale - account-gated, 75.
100 50 50 50 75 75 50 75
Offline & air-gap operationLolly: static deploy, no server in the render path, MDM/air-gap. The Canva column is scored on its best family member: Affinity (free since Oct 2025) runs offline as a desktop suite once a verified account activates it - 75, the same deduction Adobe takes. Canva's own Offline (2026) still edits pre-synced designs only, per device, in a 14-day window. Adobe: desktop apps run offline; licensing phones home. Figma: cached-file viewing and limited editing. Penpot: self-host on your infra behind a firewall (server required). Cloud APIs and DAM: none.
100 75 75 75 0 0 25 0
On-device rendering - data never leavesLolly: renders and converts in-browser or CLI, locally; zero upload. Adobe: local desktop rendering, but cloud services and telemetry in the suite. Figma: canvas renders locally, files live in Figma's cloud. Penpot: 90 - rendering happens in the browser and the save target is a server that can be your own sovereign private cloud, even your own laptop, with private export throughout; only the server hop separates it from Lolly. Canva itself is server-side by design; the column's 75 is Affinity - local desktop rendering, account activation and telemetry, the same shape as Adobe. Render APIs, DAM: server-side by design.
100 90 75 75 0 0 25 0
Hard brand constraints (structural)Lolly: rules compiled into template code - off-brand output is impossible, not just discouraged. Canva: element locks - permission-based, admin-set and static: no template logic such as conditional logo switching or responsive recomposition at fill time, and Canva AI does not yet respect Brand Controls - 50. Render APIs: templates are fixed (only declared fields vary) but no governance layer. DAM: locked templates with restrictions. Figma: Buzz templates hold locked guidelines at fill time; the design surface stays review-enforced - 50. Penpot: tokens and systems enforced by review, not runtime. Adobe: libraries, little enforcement. Cloudinary: presets and Enterprise-gated transformation templates fix operations, not brand layout - 50.
100 50 50 25 75 50 50 75
C2PA provenance, signed at creationAdobe: the broadest shipped implementation (Photoshop, Lightroom, Premiere, Firefly) - signing happens locally in the desktop apps and in the cloud for the Content Authenticity web app, and nothing signs without an Adobe account and an Adobe-provisioned identity, so it is account-gated end to end: 75 under the method rule. Lolly: on-device key generation, offline signing, plus pixel imprint - no account anywhere; the on-device key reads as unverified in stock validators (the interim trust list froze Jan 2026) until an identity or an organization's own CA vouches for it, and the stack is pilot-stage and unaudited, so 75. Penpot: 50 via the official Lolly Export plugin - the same on-device engine signing Lolly uses, opt-in rather than default (and disclosed plainly: it is Lolly's own plugin). No evidence of C2PA writing in Canva, Figma, render APIs or DAM as of Aug 2026. Cloudinary: 50 - signs images on delivery (fl_c2pa, CAI member since 2020), attesting delivery by Cloudinary rather than creation by you.
75 50 0 75 0 50 0 0
CLI, pipeline & AI-agent automationLolly: CLI, TUI, MCP server, URL mode - one engine everywhere. Render APIs: API-first, webhooks, integrations - account- and cloud-gated, so 75 under the method rule. Penpot: open API, plugins, official MCP server. Canva: Connect API - Enterprise-gated, async, rate-limited. Adobe: UXP/ExtendScript plus Firefly APIs. Figma: strong REST/plugin API, no render pipeline. DAM: asset-management APIs. Cloudinary: API-first media pipeline - account-gated, 75.
100 75 50 50 50 75 50 75
Live collaboration (real-time co-editing)The capability that trades most directly against offline. Figma: the scale benchmark - 200 simultaneous editors, up to 500 people in a file - account and cloud required. Canva: mature real-time editing across the product, same precondition. Penpot: real-time multiplayer with live cursors; self-hosting lifts the vendor-account precondition, but a server is still required. Lolly: pairwise P2P shipped - an invite/accept ceremony (QR, link or code), LAN-first, zero server, no account, works fully air-gapped - no large rooms, so Partial; the only column that collaborates with no internet at all. Adobe: Live Co-Editing in beta, cloud documents only. Render APIs: no editing surface. DAM: comments and approvals, not canvas co-editing. Cloudinary: DAM comments and workflows, no canvas co-editing.
50 75 75 25 25 25 75 0
No design skill requiredCanva: the category benchmark for ease. DAM: fill a locked template. Lolly: fill in fields - but someone technical must author tools first (the cold-start cost sits with builders, not producers). Render APIs: swaps design skill for developer skill. Adobe, Figma, Penpot: professional tools. Cloudinary: the media library is easy; transformations are developer territory.
100 25 100 25 100 50 25 50
Open source, self-hosted, no lock-inPenpot: MPL-licensed, 51k+ stars, self-host via Docker/K8s - fully verifiable today. Lolly: MPL-2.0, the repository is public (github.com/lolly-tools/lolly), OBS builds, no contributor agreement - and it is young: months in public, no external audit, a community still forming, with SUSE maintaining it as a user of its own systems. 75 while youth is the honest deduction. Everything else is proprietary SaaS or proprietary desktop.
75 100 0 0 0 0 0 0
Cost at production scaleLolly and Penpot: zero marginal cost on your own hardware. Render APIs: metered - roughly $0.005–0.049 per image, credits often expiring monthly. Canva/Figma: per-seat; Canva's automation needs Enterprise, though Affinity itself is free since Oct 2025. Adobe: premium per-seat suite. DAM: sales-led enterprise quotes, MAU or seat models. Cloudinary: credit-metered across transforms, storage and bandwidth - 25.
100 100 50 25 25 25 50 25
Annual medium enterprise spendIndicative list-price arithmetic for a medium enterprise - think 500-5000 people - August 2026: a guess range, not a quote; deals vary and the seat mix dominates. Ring = how much of the board's largest annual spend (US$500k) you keep; the number in the ring is each range's upper bound. Canva (US$75k-400k; Affinity free since Oct 2025 pulls the design-seat share down), Adobe (US$100k-500k) and Figma (US$30k-250k) assume the realistic creative-seat share of an organisation this size - tens to hundreds of seats, not a licence for every employee. Render APIs price by usage (US$5k-60k). DAM is quote-only, commonly US$50k-250k and up. Penpot is hand-set at 99: "your server" can be your own laptop - a small technical hurdle at well under 1% of an Adobe-scale spend. Lolly: US$0 by licence - the apps ship free, run offline and keep working in perpetuity; works on devices immediately, config optional; hosting an instance is an organisation's choice, not a cost of entry. Cloudinary: US$30k-150k, credit-based; enterprise contracts commonly sit near US$82k.
$0 $0 $400k $500k $250k+ $150k $250k $60k

Повнота можливостей серед сьогоднішніх творчих інструментів, досліджено у серпні 2026. Оцінка: 0 відсутнє, 25 рівень обхідного рішення, 50 реальне, але обмежене або часткове, 75 сильне з застереженнями, 100 основна компетенція.

signed by Lollypositioning-comparison.htmlHTMLAI generatedgenerated by ClaudeПеревірте саміGet the signed filepixels, not shapes38 KB

Розрив очевидний: ніщо з того, що постачається сьогодні, не дає нам вивід constraints-first, придатний для офлайну, з низьким порогом навичок, внутрішньо доступний. Lolly навіть включає відкрите полотно - Design - де кольори, шрифти та активи узгоджуються з глобальними параметрами бренду, тож вільне компонування лишається constraints-first. Чим воно не є - це необмеженим дизайн-пакетом: дизайнери й далі використовують Illustrator і Figma для унікальної флагманської роботи. Перестановки можна складати цим інструментом.

Кожен інструмент у бібліотеці як картка, згрупована за категорією, тож продюсер обирає одну і починаєsigned by Lollyvector SVGПеревірте саміGet the signed file281 paths~38k nodes443 groups6 images2 269 KBКожен інструмент у бібліотеці як картка, згрупована за категорією, тож продюсер обирає одну і починаєsigned by Lollyvector SVGПеревірте саміGet the signed file281 paths~38k nodes443 groups6 images2 270 KB

Використовуйте для: Швидка генерація операціоналізованих творчих активів - плиток подій, бейджів з іменами, підписів, сповіщень про CVE, QR-кодів, соціальних карток, етикеток вантажів, структурованих звітів.

Не використовуйте для: Унікального флагманського контенту.


Життєвий цикл кампанії

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

  1. Творча особа встановлює правила. Дизайнер створює базовий шаблон в інструменті Design, жорстко закодовуючи типографіку й колірні змінні бренду. Вони роблять не одну картку - вони виконують основоположну роботу один раз, щоб більше ніколи не локалізувати її вручну.
  2. Розробник масштабує це. Той самий шаблон підключається до нічного конвеєра через CLI, тож свіжий графік чи нова мовна варіація генерується автоматично - жоден дизайнер не відкриває файл повторно.
  3. Продюсер просто користується цим. Торговий представник, офлайн у літаку, відкриває той самий інструмент і генерує ідеально відповідну бренду презентацію для зустрічі з клієнтом. Без дизайнерських навичок, без мережі, без очікування.

«Свіжий графік» на кроці два - це рендер на кшталт цього, вироблений з рядка даних і жменьки параметрів без відкривання файлу дизайну кимось:

Заголовна складена діаграма областей, її три ряди згруповано в холодній палітрі з осями, легендою та заголовком, розміщеними шаблоном, а не вручнуsigned by Lollyvector SVGПеревірте саміGet the signed file15 paths~1.3k nodes4 groups21 KBЗаголовна складена діаграма областей, її три ряди згруповано в холодній палітрі з осями, легендою та заголовком, розміщеними шаблоном, а не вручнуsigned by Lollyvector SVGПеревірте саміGet the signed file15 paths~1.3k nodes4 groups21 KB

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

Це і є множник сили. Lolly - не шухляда окремих інструментів для окремих ролей - це один детермінований життєвий цикл активу, якого торкається кожна роль, і кожна пара рук, через які він проходить, множить цінність попередньої.


Одне погодження, десять тисяч активів

Оскільки погодження живе в інструменті, а не у файлі (див. Як Lolly порівнюється), масштаб перестає бути проблемою перевірки. Погодьте локалізований інструмент для соціальних карток один раз, потім згенеруйте 10 000 активів 12 мовами з таблиці - і жоден з них не потребує нової перевірки на відповідність від юридичного відділу чи бренду, бо шаблон, з якого вони всі походять, уже погоджено.

Той самий детермінований інструмент досягає цього масштабу трьома способами, і всі виробляють ідентичний, заздалегідь погоджений вивід:

Пакетний режим на свіжому встановленні: один порожній рядок очікує на інструмент, з усією поверхнею електронної таблиці й кнопкою «Рендер» на місці ще до появи будь-яких данихsigned by Lollyvector SVGПеревірте саміGet the signed file348 paths~77k nodes537 groups7 images3 100 KBПакетний режим на свіжому встановленні: один порожній рядок очікує на інструмент, з усією поверхнею електронної таблиці й кнопкою «Рендер» на місці ще до появи будь-яких данихsigned by Lollyvector SVGПеревірте саміGet the signed file348 paths~77k nodes544 groups7 images3 103 KB

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


Загальна картина: як складаються шари

Усе звідси й нижче - архітектура. Діаграма - це вся система в одному погляді: інструменти - це дані нагорі, двигун посередині нічого не знає про жодну платформу, оболонки під ним реалізують один контракт, а каталоги постачають вміст.

                ┌─────────────────────────────────────────────┐
                │              Tools (data, not code)         │
                │   tool.json + template.html + hooks.js?     │
                └─────────────────────────────────────────────┘
                                    ▲
                                    │ talks to via Capability Bridge v1
                                    ▼
                ┌─────────────────────────────────────────────┐
                │                  Engine                     │
                │   loader · validator · runtime · template   │
                │   inputs · url-mode                         │
                │   PLATFORM AGNOSTIC. Knows nothing of DOM,  │
                │   filesystem, or You.                       │
                └─────────────────────────────────────────────┘
                                    ▲
                                    │ implements HostV1
                                    ▼
        ┌──────────────┬──────────────┬──────────────┬──────────────┐
        │  Web Shell   │ Tauri Desktop│ Tauri Mobile │  CLI Shell   │
        │   (PWA)      │              │              │              │
        └──────────────┴──────────────┴──────────────┴──────────────┘
                                    ▲
                                    │ fetches from
                                    ▼
                ┌─────────────────────────────────────────────┐
                │              Catalogs                       │
                │   catalog/tools/index.json + tool dirs      │
                │   catalog/assets/index.json + asset files   │
                └─────────────────────────────────────────────┘

Структура репозиторію

Вміст підключається як пакети: community/, docs/, кожен shells/, обидва services/ і brands/suse - кожен свій окремий репозиторій, підключений як git-підмодулі цього. Батьківський репозиторій володіє engine/, schemas/, scripts/, tests/, api/, brands/lolly-start/ і profiles.json. Див. Посібник зі збірки » Отримання джерела щодо команди отримання коду і крос-репозиторного робочого процесу.

lolly/
├── engine/           # Platform-agnostic core. Open source (MPL-2.0).
│   └── src/
│       ├── index.ts          # public surface - loader, runtime, template, inputs, url-mode
│       ├── loader.ts         # fetches and validates tool files
│       ├── runtime.ts        # orchestrates the 5-step lifecycle
│       ├── template.ts       # Handlebars hydration + annotateTemplate
│       ├── inputs.ts         # manifest → runtime input model
│       ├── url-mode.ts       # URL ↔ input state round-trip
│       ├── validate.ts       # JSON Schema validation of manifests
│       ├── compose.ts        # resolve nested tool renders (composes)
│       ├── embed.ts          # parse portable lolly.tools embed URLs
│       └── bridge/
│           └── host-v1.ts    # type re-export of the @lolly-tools/core contract
│
├── shells/
│   ├── web/          # PWA - hosted online; primary distribution
│   │   └── src/
│   │       ├── main.ts           # boot, routing
│   │       ├── theme.ts          # theme apply/persist (FOUC prevention)
│   │       ├── bridge/           # web implementations of HostV1 APIs
│   │       │   ├── index.ts      # compose all bridge pieces
│   │       │   ├── db.ts         # IndexedDB setup
│   │       │   ├── state.ts      # host.state - saved edits
│   │       │   ├── profile.ts    # host.profile - user details
│   │       │   ├── assets.ts     # host.assets - catalog + user uploads
│   │       │   ├── clipboard.ts  # host.clipboard
│   │       │   ├── export.ts     # host.export - rasterise/serialize
│   │       │   ├── net.ts        # host.net - allowlisted fetch
│   │       │   └── media.ts      # host.media - live camera frames (onFrame)
│   │       ├── catalog/
│   │       │   └── sync.ts       # boot-time catalog sync + offline cache
│   │       ├── styles/           # app-wide CSS (app.css, picker.css, tokens.css)
│   │       └── views/
│   │           ├── gallery.ts    # tool library listing + saved-state cards
│   │           ├── tool.ts       # mounts one tool (inputs + canvas + actions)
│   │           ├── picker.ts     # asset picker UI (invoked by host.assets)
│   │           ├── profile.ts    # user details editor
│   │           ├── projects.ts   # /p - folders of saved sessions (nested; folder/selection export)
│   │           └── free-canvas.ts # free-canvas editor overlay for render.layout:"editor" tools
│   │
│   ├── cli/          # Node.js CLI - same engine, headless jsdom
│   │   ├── bin/lolly.ts
│   │   └── src/
│   │       ├── run.ts    # loadTool → createRuntime → export → write file
│   │       └── bridge.ts # CLI implementation of HostV1
│   │
│   ├── tui/          # Interactive terminal shell (Ink) - reuses the CLI bridge
│   │   └── src/
│   │       ├── main.tsx  # full-screen app: Gallery / Projects / Profile / ToolView
│   │       └── bridge.ts # CLI bridge + on-disk state under ~/.lolly
│   │
│   ├── tauri-desktop/ # downloadable desktop app
│   └── tauri-mobile/  # iOS/Android app
│
├── tools/            # profile VIEW (gitignored) - data, not code. Merged from packs:
│                     #   community/ (public, brand-agnostic, MPL) + brands/<active>/tools (brand-owned).
│                     #   A SELECTION follows - the mounted set depends on the profile.
│   ├── qr-code/
│   ├── quotes/
│   ├── email-signature/
│   ├── snippet/
│   ├── countdown-timer/
│   ├── color-palette/
│   ├── color-block/           # typed/heterogeneous blocks (addMenu discriminator)
│   ├── dynamic-layout/
│   ├── tool-logo/         # "Logo" - auto-switching brand logo
│   ├── street-map/        # offline vector city-block maps
│   ├── url-shot/          # "URL Screenshot" (capture capability)
│   ├── strip-data/        # on-device metadata strip - JPEG/PNG/SVG/PDF (file in → clean file out)
│   ├── compress-pdf/      # on-device PDF compressor - recompresses images (file in → smaller file out)
│   ├── brand-lockup/      # "Brand Lockup" - SUSE logo lockups; HarfBuzz text-to-path (wasm)
│   ├── chart-creator/     # SVG charts from structured data
│   ├── filter/            # photo effects in one tool - halftone/scanline/posterize/voronoi (vector), duotone/pixel-stretch/imperfections (raster)
│   ├── meeting-planner/   # global timezone meeting scheduler
│   ├── calendar-ics/      # event → .ics calendar file plus a card
│   ├── digi-ad/           # "Animated Ad" - looping banner from scenes
│   ├── event-name-badge/  # conference badges - composes qr-code as an SVG
│   ├── wayfinding-signage/ # event signage; directions blocks auto-fit label text
│   ├── text-helper/       # on-device text workbench (format/decode/hash/de-identify)
│   ├── design/     # "Design" - freeform WYSIWYG editor canvas (render.layout: editor)
│   ├── multi-page-pdf/    # multi-page PDF document - cover, flowing content blocks, back page
│   ├── diagram-builder/   # org / layercake / process / cycle / pyramid diagrams
│   ├── logo-wall/         # many logos → auto-packed grid
│   ├── logo-lockup-partner/ # SUSE + partner co-brand lockup
│   ├── icon/          # favicon .ico / png / svg from text + colours
│   ├── lottie-digi-ad/    # animated Lottie ad banners
│   └── pose-geeko/        # pose the SUSE Geeko mascot - print-ready stills
│
├── catalog/
│   ├── tools/index.json        # tool registry
│   └── assets/
│       ├── index.json          # asset registry
│       └── suse/...            # logo, palette, etc.
│
├── schemas/          # JSON Schema for tool.json, asset entries, AssetRef
├── scripts/          # build-catalog-index.ts, checksum-assets.ts, validate-catalog.ts
├── tests/            # engine tests
└── docs/             # this file + authoring guides + positioning

Модель постачання платформи

Платформа працює на кількох поверхнях - веб-PWA, Tauri desktop/mobile, скриптований CLI та інтерактивний TUI. Усі вони використовують той самий двигун і ті самі файли інструментів.

Веб (PWA) - основне поширення

Розміщено за URL, контрольованим SUSE. Працює офлайн, щойно service worker кешував інструменти й активи. Тут більшість працівників, постачальників і партнерів користуватимуться платформою. Обліковий запис не потрібен - стан зберігається в IndexedDB на кожному пристрої.

Веб-оболонка адаптивна з одного макета. На комп'ютері інструмент - це бокова панель керування, яку можна змінювати розміром, поруч зі сценою попереднього перегляду з навігацією полотном, природною для трекпада (Cmd/Ctrl-колесо або щипок для масштабування навколо курсора, Space- або перетягування середньою кнопкою для панорамування, клавіші 0/1/+/ і HUD Fit/%). На мобільному (≤640px) керування стає аркушем, закріпленим зверху, з ручкою перетягування, що клацає в положення peek/half/full (дотик перемикає) над статичним повноекранним попереднім переглядом, а плаваюча кнопка Render відкриває керування Export у спливному аркуші знизу. Дотик отримує щипок-масштабування і перетягування-панорамування на попередньому перегляді. Шлях рендерингу і керування експортом ідентичні в обох випадках - переставляється лише хром.

Розділений вигляд для настільних пристроїв - елементи керування згенеровано з маніфесту зліва, робоче полотно в реальному часі справаsigned by Lollyvector SVGПеревірте саміGet the signed file5 paths989 nodes11 groups14 KBРозділений вигляд для настільних пристроїв - елементи керування згенеровано з маніфесту зліва, робоче полотно в реальному часі справаsigned by Lollyvector SVGПеревірте саміGet the signed file5 paths989 nodes11 groups14 KB

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

Аудіограма на екрані шириною 430 пікселів - аркуш керування вгорі, готова квадратна робота внизу і плаваюча пігулка рендерингуsigned by Lollyvector SVGПеревірте саміGet the signed file47 paths~1.9k nodes84 groups1 image212 KBАудіограма на екрані шириною 430 пікселів - аркуш керування вгорі, готова квадратна робота внизу і плаваюча пігулка рендерингуsigned by Lollyvector SVGПеревірте саміGet the signed file47 paths~1.9k nodes84 groups1 image211 KB

Пакетний режим (/pro). Веб-оболонка також постачається з пакетною сіткою у стилі електронної таблиці (shells/web/src/pro/), яка рендерить багато рядків одночасно для одного або кількох інструментів. Вона підтримує обмін CSV/TSV, вставку з електронної таблиці, шаблон/формат/розмір/одиницю/dpi для кожного рядка, бічну панель редактора блоків із живим попереднім переглядом, згортані стовпці експорту, панель тегів "релевантності" для кожного рядка, перетягування рядків за лівий маркер, підтвердження видалення у два кроки, збережені пакетні сеанси та завантаження .zip. Це поверхня "один-до-багатьох" за позиціюванням "масове створення контенту".

Tauri для настільних і мобільних пристроїв

Пакетований нативний застосунок (невеликий обсяг завдяки Tauri). Забезпечує повну офлайн-доступність, доступ до файлової системи для інструментів, залежних від CLI (PDF Smasher, Font Outliner), і доступ до камери. Заплановано розширення інструментарію на середину 2026 року.

CLI

lolly <tool-id> [--input=value ...] --output=file.png

Користувачі настільних пристроїв можуть викликати багато інструментів із терміналу. Оболонка CLI завантажує той самий рушій, створює DOM через jsdom, виконує той самий шлях рендерингу і записує файл. Транспортом є режим URL - CLI не є окремою реалізацією. Це гарантує, що результати CLI та GUI ідентичні.

lolly qr-code --url=https://suse.com --output=qr.svg
lolly quotes --quote="Ship it." --output=quote.png
lolly                        # lists available tools
lolly qr-code                # lists inputs for that tool

TUI

npm run tui

Інтерактивний аналог CLI: повноекранний, орієнтований на клавіатуру термінальний застосунок (побудований на Ink) для перегляду інструментів, заповнення полів уведення, збереження проєктів та експорту - усе без графічного інтерфейсу. Його міст хоста повторно використовує реалізацію CLI для форматів без DOM (SVG/EMF/EPS/HTML + текст/дані) і додає стан на диску в ~/.lolly та опційний вбудований попередній перегляд. Окрім цього, він має рівень рендерингу в браузері: обмежений headless-Chromium (той самий, який встановлює сервер MCP), що створює растр/PDF/відео та захоплення живих URL за запитом - керуючи зібраною копією веб-оболонки, тож результат ідентичний, і запускається лише тоді, коли ви вперше експортуєте такий формат. Тож url-shot (із обрізкою, перефарбуванням та векторним PDF/SVG) і кожен інструмент растру/pdf теж працюють у терміналі. Дивіться посібник з TUI.

Незалежно від того, якою поверхнею ви користуєтеся, вкладка Capabilities на панелі керування - це повна карта того, що платформа заявляє як свої можливості, згрупована й зрозуміла без відкриття жодного інструмента.


Категорії інструментів

Інструменти позначені category у своєму маніфесті для групування в галереї.

Рядки перелічені в порядку секцій галереї. Секція utility завжди рендериться останньою в галереї (після всіх інших категорій, включно з майбутніми) - це шухляда "Офлайн-утиліти" на пристрої.

КатегоріяПрикладиЗаплановано
everyoneQR Code Generator, Quote Card, Email Signature, Logo, Wordmark, Audiogram, Battlecards, Sequence Studio, RecordEmployee Image Stationery
designerBrand Lockup, Design, Chart, Darkroom, Filter, Pose Geeko, Multi-Page PDFFont Outliner
eventMeeting Planner, Event Name Badge, Wayfinding Signage, Calendar ICS, Booth StudioEvent Stationery, Bulk Name Badges, Room Agenda Cards
product-CVE Alert, Product Release Announcement, Blog OG Image
utilityStrip Hidden Data, Text Helper, Compress PDF, Convert Image, Convert Font, Redact, Run Web Code, Screen Capture, URL ScreenshotUnit/format converters, more on-device privacy utilities

Ці клітинки - приклади, а не повний перелік. Які інструменти існують - це властивість змонтованого вами профілю, а не цієї сторінки: пакет бренду додає власні й може виключити інструмент спільноти, який не хоче постачати. catalog/tools/index.json - згенерований з маніфестів реєстр, який фактично читає галерея, - це авторитетний список; щоб порахувати, що монтує профіль, порахуйте маніфести (ls community//tool.json brands//tools/*/tool.json), а не покладайтеся на число, записане тут. (Ідентифікатор інструмента, наявний у двох пакетах, монтується один раз - із пакета-переможця.)

Інструменти також класифікуються за статусом: official (схвалено брендом, без водяного знака), community (зовнішній внесок), experimental (експорт із водяним знаком). Більшість бібліотеки має статус official; новіші студії та інструменти захоплення частіше мають статус community або experimental, поки не стабілізуються. Кожна поверхня показує значок, тож читач знає, що отримує, ще до відкриття - і, як і клітинки категорій вище, належність за статусом змінюється надто швидко, щоб перераховувати її тут. Дивіться це в галереї або в згенерованому індексі.

Design - перший інструмент, побудований на вільному режимі полотна render.layout: "editor" - безхромній поверхні прямого маніпулювання, де ви перетягуєте, змінюєте розмір, обертаєте та прив'язуєте блоки тексту, фігур і зображень, а потім експортуєте тим самим шляхом рендерингу, що й будь-який інший інструмент.

Strip Hidden Data - перша утиліта на пристрої (privacy: "on-device"): інструмент перетворення вмісту, який бере файл, наданий вами, обробляє його повністю в браузері й повертає чисту копію - ніколи не завантажується на сервер, ніколи не отримує водяний знак, жодного штампа походження. Text Helper - друга така утиліта - робоче середовище на пристрої для повсякденних завдань "вставити на сайт" (форматування JSON, декодування JWT, Base64, кодування/декодування URL, хешування SHA). Compress PDF - третя - вона зменшує розмір PDF, повторно стискаючи його зображення, теж повністю на пристрої. Позначка та текст її значка "Працює на вашому пристрої - нічого не завантажується" тепер охоплюють увесь набір перетворень: Strip Hidden Data, Text Helper, Compress PDF, Convert Image (HEIC/TIFF/AVIF → WebP/JPG/PNG), Convert Font, Redact (знищення ділянок зображення, SVG або PDF), Prompt to Image і Rebrand a Deck (перетематизація .pptx на місці), якщо профіль її монтує. Це категорія утиліт приватності, яка замінює передавання конфіденційних файлів вузькоспеціалізованим сайтам.

Шухляда Utilities, де кожна картка - це інструмент, що перетворює файл, який у вас уже єsigned by Lollyvector SVGПеревірте саміGet the signed file154 paths~40k nodes234 groups802 KBШухляда Utilities, де кожна картка - це інструмент, що перетворює файл, який у вас уже єsigned by Lollyvector SVGПеревірте саміGet the signed file154 paths~40k nodes234 groups803 KB

Примітка: category і status денормалізовані в catalog/tools/index.json (реєстр, який читає галерея) з кожного tool.json. Маніфест - джерело істини - індекс генерується командою npm run build:catalog, і npm run validate:catalog завершується з помилкою в CI, якщо закомічений індекс розходиться з маніфестами.


Архітектурні зобов'язання

Ці рішення остаточні. Зміна будь-якого з них - масштабне завдання - вони формують кожне інше рішення в кодовій базі.

1. Декларативні інструменти з імперативним запасним шляхом

Інструмент - це маніфест (tool.json) + шаблон (template.html) + опційний hooks.js.

Маніфест декларує вхідні дані. Не шаблон. Вхідні дані не виводяться з токенів Handlebars. Маніфест - контракт; шаблон споживає іменовані змінні через {{id}}.

Стек елементів керування Street Map - випадний список міста, вибір теми, повзунки товщини та кольорові перемикачі, кожен з яких намальовано з рядка маніфестуsigned by Lollyvector SVGПеревірте саміGet the signed file39 paths~3.4k nodes70 groups2 images50 KBСтек елементів керування Street Map - випадний список міста, вибір теми, повзунки товщини та кольорові перемикачі, кожен з яких намальовано з рядка маніфестуsigned by Lollyvector SVGПеревірте саміGet the signed file39 paths~3.4k nodes70 groups2 images50 KB

Хуки опційні. Більшість інструментів є суто декларативними - маніфесту й шаблону достатньо. Інструменти, що потребують обчислюваних значень (кодування QR, формування даних діаграм), надають hooks.js, який експортує іменовані функції життєвого циклу (onInit, onInput, onFrame - хук живої камери для кожного кадру для реактивних до руху інструментів - onLevel, beforeExport, afterExport, exportFile - шлях перетворення файл-у/файл-з, що використовується утилітами на пристрої на кшталт Strip Hidden Data - та exportStill, для інструмента, що самостійно керує глибоким растром). Хост завантажує хуки через new Function('host', …) з мостом можливостей, інжектованим як область замикання. Це контракт переносимості, а не пісочниця безпеки: хуки досі виконуються в реалмі сторінки й можуть сягати window/fetch/document в оболонці браузера - host. є підтримуваною, переносимою поверхнею, а не примусовою межею. Асинхронні результати хуків обмежені за часом (onInit 5с, onInput 2с, beforeExport/afterExport 5с, exportFile/exportStill 10с), а запізнілі результати відкидаються; неконтрольований синхронний* хук неможливо витіснити. Тому виконання ненадійного стороннього коду хуків небезпечне, доки не з'явиться ізоляція через Worker.

Це важливо, тому що: декларативні інструменти можуть створювати люди без досвіду розробки. Якби кожен інструмент був окремим веб-застосунком, ризик "обмежені навички для створення/підтримки робочих шаблонів" перетворився б на постійне вузьке місце.

2. Інструменти й активи - це дані, а не вбудований код

Веб- і Tauri-застосунки отримують каталоги інструментів і активів з відомої URL-адреси під час запуску, кешують їх локально та працюють із тим, що там є. Додавання нової плитки для події чи сезонного активу не потребує релізу застосунку.

Байти активів контролюються сумою SHA-256 для запобігання отруєнню CDN. id активу + version керують інвалідацією кешу.

3. Міст можливостей - єдиний API, який бачать інструменти

Інструменти ніколи не торкаються DOM поза областю свого шаблону, ніколи не викликають fetch напряму, ніколи не читають файлову систему. Вони викликають версіоновані методи host.*. Канонічне визначення контракту - packages/core/src/host-v1.ts - SDK для авторів інструментів @lolly-tools/core, тож сторонній розробник може будувати на його основі, не залежачи від рушія; engine/src/bridge/host-v1.ts - це реекспорт типів із нього, і код рушія/оболонок продовжує імпортувати з цього шляху без змін:

API мостаЩо робить
host.profileІм'я, електронна пошта, фото, місто користувача тощо. Попередньо заповнює поля через bindToProfile.
host.assetsЗапити до каталогу, розв'язання активів, наданий хостом інтерфейс вибору.
host.stateЗбереження / завантаження слотів уведення. IndexedDB у вебі, файлова система в Tauri, пам'ять у CLI.
host.clipboardЗапис тексту або зображення в буфер обміну (із запасними варіантами для платформ).
host.exportРастеризує або серіалізує ціль рендерингу. Застосовує водяний знак для експериментальних інструментів.
host.netFetch зі списком дозволених адрес - доступний лише якщо інструмент задекларував можливість "network". (Наразі жоден інструмент у постачанні цим не користується.)

Опційні, адитивні поверхні з'являються лише тоді, коли оболонка їх надає. Деякі з них обмежені можливостями - розкриваються лише коли інструмент декларує відповідний прапорець: host.compose (вбудовування рендеру іншого інструмента - compose), host.capture (захоплення сторінки для URL Screenshot - capture) і host.recorder (захоплення мікрофона/камери/екрана для інструментів запису - microphone / camera / screen). Решта - виявляються за можливостями функції: присутні, коли оболонка може їх надати, а інструмент має запасний варіант для оболонок, які не можуть.

Кілька ключових поверхонь, щоб показати, що вона охоплює - Host API документує кожну з них, а packages/core/src/host-v1.ts - сам контракт:

ПоверхняЗ версіїЩо вона додає
host.tokens1.0Дизайн-токени DTCG - власні примітиви бренду
host.text1.0Текст у шлях через HarfBuzz WASM (прапорець можливості wasm позначає інструменти, що на це покладаються)
host.media1.4Живі кадри камери, що керують хуком onFrame. Прогресивне покращення, свідомо не заблоковане прапорцем camera - такий інструмент усе одно працює як звичайний інструмент для нерухомих зображень
host.color1.40Перцептивна колірна математика: ΔEOK, контраст WCAG + APCA, рампи OKLab, розбиття на класи, категоріальні палітри, гармонійні схеми (1.60), змішування CSS Color 4 та запікання градієнтів (1.68). Чиста й синхронна - оболонки під’єднують власний makeColorApi() рушія, а не реалізують щось самі, тому розбіжність неможлива
host.images1.60Декодування/зміна розміру/перекодування байтів на пристрої - шлях конвертації (HEIC → JPEG, стиснення у WebP, зменшення масштабу). У веб-оболонці постачається як лінива фасадна обгортка, тому декодер HEIC ніколи не потрапляє до завантажувального чанка
host.geom1.64Точна векторна геометрія: булеві операції над шляхами, зміщення, перетворення штриха на заливку, зниження сплайнів, спрощення, перевірка влучання. Також чиста, синхронна й під’єднана від рушія (makeGeomApi()); помилки повертаються, а не кидаються

Решта дотримуються тих самих правил і задокументовані поруч із ними: pdf (1.8) і pptx (1.58) для операцій над документами на пристрої, audio (1.71) і speech (1.96) для аналізу кліпів та TTS/транскрипції на пристрої, viz (1.72) для контракту-заглушки MilkDrop, codec (1.100) і layers (1.102) для глибокобітового та шаруватого растрового виведення, upscale (1.101) і matte (1.103) для моделей на пристрої, raster (1.105) для хуків, що самі виконують піксельну роботу, connectors (1.106) для безпечних для експорту стрілок і c2pa (1.85) для підпису готових байтів. Кількість зростає; правила - ні.

Декларовані можливості: network, filesystem, clipboard, camera, microphone, screen, ffmpeg, wasm, capture, compose. (screen, додано в 1.54, - це захоплення екрана через host.recorder - користувач обирає екран/вікно/вкладку в нативному інтерфейсі браузера; відрізняється від capture, яка растеризує URL, названу самим інструментом.)

Той самий інструмент працює в браузері, Tauri та headless CLI, тому що кожна оболонка реалізує цей інтерфейс - інструмент ніколи не знає, в якій з них він перебуває.

Міст версіонований. Додавання методів - мінорна версія. Видалення або зміна сигнатур - мажорне підвищення версії. Коли вийде v2, v1 має продовжувати працювати.

4. Ідентифікатори активів - назавжди

suse/logo/primary - це контракт. Після публікації:

Це робить збережені стани інструментів і посилання, якими поділилися через URL, довговічними на роки.

5. Режим URL - першокласний

Кожне вхідне значення має бути виражуваним як параметр URL:

lolly.tools/#/tool/qr-code?url=https://suse.com&ecl=H

Це посилання саме собою, без нічого іншого в ньому, і є готовим активомsigned by Lollyvector SVGПеревірте саміGet the signed file17 paths~2.0k nodes39 groups24 KBЦе посилання саме собою, без нічого іншого в ньому, і є готовим активомsigned by Lollyvector SVGПеревірте саміGet the signed file17 paths~2.0k nodes39 groups24 KB

Режим CLI - це режим URL під іншим транспортом - оболонка CLI будує об'єкт стану URL з argv і запускає той самий конвеєр рушія. Існує один шлях рендерингу. CLI не може розійтися з GUI, тому що не є окремою реалізацією.

url-mode.ts обробляє циклічне перетворення (розбір і серіалізацію). Набір зарезервованих параметрів ніколи не передається інструменту як вхідні дані: елементи керування виведенням (format, export, copy, filename, width/w, height/h, unit, dpi), перемикачі друку й походження (bleed, marks, profile, password, c2pa, imprint, durable, meta, hdr, depth, cuts) і носії стану (template, z - запакований токен "Найкоротше посилання" - і zx, те саме, зашифроване паролем). Набір RESERVED у engine/src/url-mode.ts є авторитетним джерелом і зафіксований тестом; URL Mode документує кожен із них, включно з тими кількома, що не перелічені тут. Вхідні дані активів у режимі URL серіалізуються за їхнім id; середовище виконання розв'язує їх через host.assets.get() перед гідратацією. width/height - це значення в unit (типово px, також mm/cm/in/pt/pc); з фізичною одиницею dpi задає роздільну здатність растру. Вони визначають розмір документа полотна й попередньо заповнюють панель розмірів експорту.

Оскільки кожне вхідне значення подорожує в посиланні, зміна параметра - це інший готовий актив. Уся ця палітра - це один початковий колір, гармонія та кількість кроків:

Дев'ять кроків у чотирьох відтінках, усі вирощені з одного початкового кольору, переданого в посиланніsigned by Lollyvector SVGПеревірте саміGet the signed file10 groups24 KBДев'ять кроків у чотирьох відтінках, усі вирощені з одного початкового кольору, переданого в посиланніsigned by Lollyvector SVGПеревірте саміGet the signed file10 groups24 KB

6. Збереження проходить через міст, а не напряму

Web-оболонка: IndexedDB. Tauri: файлова система. CLI: у пам'яті. Інструменти бачать лише host.state.save(slot, data) і host.state.load(slot). localStorage не використовується - він занадто малий і не вміщує blob-и.

Користувачі можуть зберігати кілька іменованих слотів редагування для кожного інструмента й повертатися до кожної сесії пізніше. Створення облікового запису не потрібне; стан прив'язаний до пристрою. Оскільки міст - єдина точка з'єднання, цей стан на пристрої також переносний: shells/web/src/data-transfer.ts зчитує все назад через host.profile/host.state/host.assets в один zip-архів lolly-backup, який імпортується на будь-якому іншому встановленні - офлайн-відповідь на питання "перенести на новий пристрій", яка не потребує сервера (повна специфікація: docs/data-transfer.md). Інтеграція SUSE ID (синхронізація між пристроями) - майбутня віха поверх цього.

7. Мітки зрілості за задумом відповідають на ризик "схвалено брендом"

Кожен інструмент оголошує status: official | community | experimental у своєму маніфесті. Галерея сортує за статусом. Експериментальні інструменти автоматично додають водяний знак на експортовані файли - водяний знак застосовує host.export.render, а не сам інструмент, тому автор інструмента, що не є офіційним, не може від нього відмовитися.

Це структурна відповідь на ризик сприйняття, за яким використання будь-якого інструмента нібито означає схвалення бренду. Процесні відповіді (черга перевірки, обмеження за SUSE ID) додаються поверх цього.

8. Вхідні дані інструментів типізовані через маніфест, включно з активами

Вхідні дані оголошують type: text, longtext, number, boolean, color, select, asset, date, time, datetime-local, url, blocks, vector, table і file. Хост рендерить типовий елемент керування для кожного типу з маніфесту - інструменти не пишуть жодного коду елементів керування. (Попереднє заповнення з профілю користувача - не тип; будь-яке поле може мати bindToProfile.) Три з них мають більшу вагу, ніж решта:

9. Шаблони без логіки (Handlebars, не EJS)

Handlebars було обрано замість EJS свідомо:

Логіка живе в hooks.js, де вона явна й перевірна. Доступні хелпери Handlebars: {{default}}, {{upper}}, {{lower}}, {{eq}}, {{markdown}}, {{asset ref}}, {{asset ref "property"}} (плюс хелпери форматування даних icsStamp/rfcText/csvCell, які використовують суміжні шаблони .ics/.vcf/.csv).

10. Інструменти складаються з інструментів

Один інструмент може вбудувати рендер іншого інструмента без імпорту одного інструмента в інший - композицію вирішує двигун, а не код інструмента. Є дві поверхні:

Складайте рендер будь-якого інструмента: дочірній елемент SVG залишається справжнім вектором, коли батьківський експортує в SVG або PDF, і чітко растеризується для PNG; дочірні елементи PNG/JPG/WEBP вбудовуються як зображення. Потребує можливості compose. Складені дочірні елементи - проміжні: їх ніколи не позначають водяним знаком чи метаданими походження, а композиція деградує плавно: оболонка, що не може відрендерити дочірній елемент, просто пропускає слот, і батьківський елемент усе одно рендериться.


Що ми свідомо вирішили не робити


Життєвий цикл, від початку до кінця

Користувач відкриває lolly.tools/#/tool/qr-code?url=https://suse.com&ecl=H:

  1. Завантаження. Web-оболонка відкриває IndexedDB, будує міст можливостей, синхронізує каталоги інструментів і активів (або завантажує з кешу в офлайні).
  2. Маршрут. Хеш URL → перегляд tool, з витягнутими параметрами qr-code та URL.
  3. Завантаження інструмента. loadTool('qr-code', fetchFile) отримує tool.json, перевіряє за JSON Schema, отримує template.html, styles.css і вихідний код hooks.js.
  4. Розбір стану URL. parseUrlState перетворює параметри URL на початкові значення полів. Посилання на активи (?logo=suse/logo/primary) розбираються як легкі об'єкти { id, _unresolved: true }.
  5. Виконання. createRuntime(tool, host, initialValues) будує модель вхідних даних (об'єднуючи дані профілю, значення за замовчуванням і початкові значення), розв'язує посилання на активи через host.assets.get(), завантажує хуки (з host у межах замикання, без пісочниці), викликає hooks.onInit.
  6. Рендер. Оболонка підписується на виконання; при кожній зміні стану вона отримує { model, hydrated }. Вона рендерить елементи керування вхідними даними з моделі й записує гідратований HTML шаблону в #tool-canvas.
  7. Взаємодія. Користувач вводить дані в поле → runtime.setInput(id, value) → застосовуються обмеження → викликається hooks.onInput → повторна гідратація → повторний рендер. Полотно оновлюється в реальному часі.
  8. Експорт. Користувач натискає Download(PNG) → runtime.export(canvasNode, 'png')host.export.render (растеризує через dom-to-image-more; SVG/PDF проходять через спеціалізовані векторизатори, що обходять DOM) → blob → host.export.download. Діапазон форматів, які може підтримувати інструмент, широкий, і перелік render.formats у schemas/tool.schema.json є авторитетним джерелом щодо цього - растри й растри з плаваючою точкою, вектори та файли для різання, друк/CMYK, рух, редаговані документи (pptx, docx, odt), палітри та вихідні дані/текст, аудіо- та файли шрифтів. Режим URL називає кожен ідентифікатор і те, що він виробляє. Аудіо в цьому переліку так само, як усе інше (wav, mp3, m4a, opus, оголошені інструментом audiogram та інструментами запису); окремо, режим render.capture інструмента запису керує host.recorder, чий результат надходить як готовий Blob у тому контейнері, в якому браузер записав. (Інструменти, що встановлюють render.export: false - наприклад, Color Palette, Countdown Timer, Strip Hidden Data, Text Helper, Compress PDF - приховують елементи керування завантаженням/форматом/розміром.) Фізичні одиниці тут конвертуються для кожного формату (PDF → справжні пункти сторінки, растр → пікселі при DPI із chunk pHYs). Метадані авторства/походження (автор, інструмент, джерело - формуються engine/src/metadata.ts) вбудовуються для кожного формату: PNG iTXt, JPEG EXIF, PDF info dict, SVG <metadata>, коментар GIF. Експериментальні інструменти отримують водяний знак, вставлений хостом, а не інструментом.

Панель експорту, яку відкриває ?options: пара назви файлу й формату, розмір виводу та елементи керування, що записують файлsigned by Lollyvector SVGПеревірте саміGet the signed file49 paths~3.3k nodes61 groups3 images74 KBПанель експорту, яку відкриває ?options: пара назви файлу й формату, розмір виводу та елементи керування, що записують файлsigned by Lollyvector SVGПеревірте саміGet the signed file49 paths~3.3k nodes61 groups3 images74 KB

Той самий життєвий цикл у Tauri. Той самий життєвий цикл у CLI - jsdom забезпечує безголовий DOM; вихід іде у файл або stdout.


Статус відкритого коду

Код — MPL-2.0. engine/, shells/, services/, schemas/ та docs/ мають відкритий код за ліцензією MPL-2.0 — платформа-каркас, нейтральна щодо постачальника, для бренд-інструментарію, де кожен окремий модуль постачання — у власному репозиторії під github.com/lolly-tools.

Вміст інструментів постачається як бренд-паки, кожен зі своїми умовами (див. NOTICE.md пака). community/ — це публічний репозиторій lolly-tools, і його бренд-незалежні інструменти теж під MPL-2.0. brands/suse/ — приватний пак suse-lolly: інструменти SUSE та каталог SUSE, власність SUSE, включно з ліцензованою музикою PremiumBeat. brands/lolly-start/ — порожній стартовий бренд, яким володіє цей репозиторій. Шрифти постачаються всередині пака за ліцензією SIL Open Font License 1.1 — пак SUSE несе гарнітури SUSE та SUSE Mono.

Кореневі tools/ та catalog/ репозиторію — це ігноровані git подання: профіль збирає їх з community/ плюс активного бренд-пака, тому кожен скрипт і shell читають саме ці два шляхи, а не пак напряму.

Поділ забезпечується примусово — немає перехресних імпортів з engine/ у вміст інструментів — тож межа між платформою та вмістом лишається чистою.


Де закінчується двигун і починається хост

Якщо це можна описати чистими даними + Handlebars → двигун. Якщо це торкається DOM, файлової системи, мережі чи будь-якого API браузера/ОС → хост.

Ця межа гостра навмисно. Двигун - це частина з відкритим кодом. Усе, що знає про SUSE, конкретні платформи чи середовища виконання, залишається поза ним.

Для наступного рівня деталізації engine/README.md перелічує кожен модуль двигуна і за що він відповідає, а Модель загроз і межі довіри фіксує, де ця сама межа водночас є межею довіри.