Přehled

signed by Lollyoverview.htmlHTMLAI generatedgenerated by ClaudeOvěř si to sámGet the signed filepixels, not shapes12 KB

Ikona Lolly - velký zelený a bílý lízátkový bonbon

Tento dokument zachycuje účel, strukturu a architektonická rozhodnutí platformy Lolly. Odráží jak produktovou vizi, tak aktuální stav kódové základny.

Stav: Lolly je interní prototyp v uzavřeném pilotu, který ještě neskončil. Engine je deterministický a vnitřně konzistentní, ale produkt je raný - SUSE je zákazník číslo jedna - a jeho kryptografie a enginy pro parsování souborů právě procházejí přísným zpevňováním infrastruktury SUSE, přípravou na podnikové měřítko (v tomhle jsme fakt dobří). Čti architekturu níže jako designový záměr v testování, ne jako hotový, certifikovaný produkt. Viz Přijetí a řízení, jak je pilot veden a měřen.

Jak číst tuto stránku. Nese dva druhy materiálu, v tomto pořadí. První polovina je proč tohle existuje: problém, pozicování a životní cyklus, kterým prochází jeden asset. Od Celkový obraz dál je to jak vrstvy do sebe zapadají: architektonický dokument pro přispěvatele, pokrývající oddělení engine/shell/pack, uspořádání repozitáře, cílové platformy nasazení a závazky, které omezují každou změnu platformy. Pokud jsi tu proto, abys měnil kódovou základnu, ne abys pochopil produkt, začni u celkového obrazu.

Dva doprovodné dokumenty jdou dál než tato stránka. engine/README.md v repozitáři je mapa enginu modul po modulu, s generovanou tabulkou každého modulu a toho, co parsuje nebo zapisuje. Model hrozeb a hranice důvěry je stejná architektura čtená jako hranice důvěry, a je to správná stránka pro jakoukoli otázku o tom, co engine považuje za nedůvěryhodné.


Proč tohle existuje

Týmy narážejí na opakující se problém: opakovatelná kreativní a obsahová práce, která je příliš predikovatelná na to, aby ospravedlnila zapojení odborníků pokaždé znovu, ale příliš citlivá na kvalitu na to, aby se předala bez mantinelů. Výsledkem je buď pomalá propustnost (úzké hrdlo specialisty), nekonzistence (lidé používají, co zrovna mají po ruce) nebo uzamčení u dodavatele (SaaS DAM, který ovládá tvé šablony).

Tahle platforma je přímá odpověď:

Programová tvorba kreativy a obsahu ve velkém měřítku - generování assetů bez lidské práce, s pravidly pod centrální kontrolou, pro zaměstnance, dodavatele a partnery.

Lolly není místo, kde design systém vzniká - je to místo, kde se vyrábí. Představ si to jako prodejní automat na design: vyber si, dostaneš výsledek. Pokaždé. Engine usiluje o nejvyšší kvalitu, jakou daný formát dokáže na hardwaru před tebou vyprodukovat, a stejný engine vytvoří stejný soubor na každé platformě, na kterou se dodává.

Výsledkem je hojnost: každá akce má správnou signage, každé upozornění na CVE odpovídá firemnímu stylu, každý štítek se vytiskne čistě, každý e-mailový podpis je aktuální - to vše bez designového ticketu. Platforma zvládá opakující se operacionalizovanou kreativu. Záměrně to není nástroj pro zakázkovou kreativu - vlajkovou práci si stále vlastní designéři.

Inovuj pravděpodobnostně, škáluj deterministicky

Každá debata o AI v kreativním procesu uvízne na stejné otázce: která část je práce stroje? Je to stará otázka s dávno danou odpovědí. Písaři a iluminátoři už pracovali mezi dvěma nástroji - volnou skicou, kde nic nebylo pevně dané a všechno se dalo zkoušet, a tiskařským lisem, děsivým právě proto, že se zavazoval. Skici byly tam, kde vznikalo umění. Lis byl způsob, jak se dostat ke komukoli. Nikdo ty dva nezaměňoval a oba se dál vyvíjely - nové inkousty, nová písma, nové lisy - každý se zdokonaloval v souladu s řemeslem a záměrem, kterému sloužil.

Lolly vede stejnou hranici. Zkoumej pravděpodobnostně: model, designér, hrubý nápad, prompt, který se vydá tam, kam nikdo neplánoval. Pak škáluj deterministicky - to, co se dostane k deseti tisícům výstupů, je nástroj, a nástroj se vykresluje pokaždé stejně ze vstupů, které si můžeš přečíst. Zkoumání zůstává svobodné, protože na tom, aby dopadlo pokaždé stejně, nic dalšího nezávisí. Výstup si získává důvěru, protože není odhadem. Dostat AI experimentování do předvídatelných, reprodukovatelných výsledků není nová disciplína; je to stejná dělba práce, díky které stálo za to důvěřovat tištěné práci už od začátku.

Důvěřuj kreativnímu procesu, škáluj s rigorózností.

Oproti alternativám

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

Úplnost schopností napříč dnešními kreativními nástroji, zkoumáno v srpnu 2026. Hodnocení: 0 chybí, 25 úroveň obcházení, 50 reálné, ale omezené nebo částečné, 75 silné s výhradami, 100 klíčová kompetence.

signed by Lollypositioning-comparison.htmlHTMLAI generatedgenerated by ClaudeOvěř si to sámGet the signed filepixels, not shapes38 KB

Mezera je jasná: nic, co se dnes dodává, nedává omezení-na-prvním-místě, offline schopnost, nízkou náročnost na dovednosti a interně dostupný výstup. Lolly dokonce obsahuje otevřené plátno - Design - kde barvy, typografie a assety odpovídají globálním brand hodnotám, takže volné uspořádání zůstává omezení-na-prvním-místě. Co to není, je neomezená designová sada: designéři nadále používají Illustrator a Figma pro zakázkovou vlajkovou práci. Permutace lze sestavit tímto nástrojem.

Každý nástroj v knihovně jako karta, seskupené podle kategorie, aby si producent jeden vybral a začalsigned by Lollyvector SVGOvěř si to sámGet the signed file281 paths~38k nodes443 groups6 images2 269 KBKaždý nástroj v knihovně jako karta, seskupené podle kategorie, aby si producent jeden vybral a začalsigned by Lollyvector SVGOvěř si to sámGet the signed file281 paths~38k nodes443 groups6 images2 270 KB

Použij ho pro: Rychlou tvorbu operacionalizovaných kreativních assetů - dlaždice na akce, jmenovky, podpisy, CVE upozornění, QR kódy, sociální karty, štítky na zásilky, strukturované reporty.

Nepoužívej ho pro: Zakázkový hero obsah.


Životní cyklus kampaně

Nejjasnější způsob, jak vidět, co Lolly je, není seznam funkcí - je to sledovat jeden asset, jak putuje z ruky do ruky. Sleduj jednu lokalizovanou kartu kampaně, jak prochází organizací:

  1. Kreativec nastaví pravidla. Designér vytvoří základní šablonu v nástroji Design, natvrdo zakóduje typografii a barevné proměnné brandu. Nedělá jednu kartu - dělá zásadní práci jednou, aby ji už nikdy nemusel ručně lokalizovat znovu.
  2. Vývojář ji škáluje. Tatáž šablona je zapojená do nočního pipeline přes CLI, takže nový graf nebo nová jazyková varianta vzniká automaticky - žádný designér soubor znovu neotevírá.
  3. Producent ji prostě používá. Obchodní zástupce, offline v letadle, otevře stejný nástroj a vygeneruje dokonale on-brand prezentaci pro schůzku s klientem. Žádná designová dovednost, žádná síť, žádné čekání.

"Nový graf" ve druhém kroku je render jako tento, vytvořený z datového řetězce a hrstky parametrů, aniž by kdokoli otevřel designový soubor:

Skládaný plošný graf s titulkem, jehož tři řady jsou v chladné paletě, s osami, legendou a titulkem rozmístěnými šablonou, a ne ručněsigned by Lollyvector SVGOvěř si to sámGet the signed file15 paths~1.3k nodes4 groups21 KBSkládaný plošný graf s titulkem, jehož tři řady jsou v chladné paletě, s osami, legendou a titulkem rozmístěnými šablonou, a ne ručněsigned by Lollyvector SVGOvěř si to sámGet the signed file15 paths~1.3k nodes4 groups21 KB

Smysl není v tom, že Lolly je dobrá pro designéry a dobrá pro vývojáře a dobrá pro obchod, každého zvlášť ve vakuu. Je to štafeta: počáteční práci kreativce škáluje vývojář, což zase posiluje producenta. Bezproblémový zážitek pro netechnického zástupce v letadle je vůbec možný jen díky rigoróznosti, kterou nastavil designér a nasadil vývojář.

To je ten násobitel síly. Lolly není zásuvka samostatných nástrojů pro samostatné role - je to jeden deterministický životní cyklus assetu, kterého se dotkne každá role, a s každou rukou, kterou projde, se násobí hodnota té předchozí.


Jedno schválení, deset tisíc assetů

Protože schválení žije v nástroji, ne v souboru (viz Jak si Lolly stojí ve srovnání), škálování přestává být problém revizí. Schval lokalizovaný nástroj na sociální karty jednou, pak vygeneruj 10 000 assetů ve 12 jazycích z tabulky - a ani jeden z nich nepotřebuje novou kontrolu shody od právního nebo brand oddělení, protože šablona, ze které všechny vznikly, už byla schválená.

Stejný deterministický nástroj dosahuje toho škálování třemi způsoby, všechny produkují identický, předem schválený výstup:

Dávkový režim při čerstvé instalaci: jeden prázdný řádek čekající na nástroj, s celou plochou tabulky a tlačítkem Render už na místě, než dorazí jakákoli datasigned by Lollyvector SVGOvěř si to sámGet the signed file348 paths~77k nodes537 groups7 images3 100 KBDávkový režim při čerstvé instalaci: jeden prázdný řádek čekající na nástroj, s celou plochou tabulky a tlačítkem Render už na místě, než dorazí jakákoli datasigned by Lollyvector SVGOvěř si to sámGet the signed file348 paths~77k nodes544 groups7 images3 103 KB

Jedna sada brand omezení, jednou pevně stanovená designérem; tři cesty ke stejnému předem schválenému výstupu - a strojová cesta škáluje nejdál ze všech, protože se nikdy neunaví, zatímco soubory přicházejí.


Celkový obraz: jak zapadají vrstvy

Všechno odtud dál je architektura. Diagram je celý systém v jednom pohledu: nástroje jsou data nahoře, engine uprostřed neví nic o žádné platformě, shelly pod ním implementují jednu smlouvu a katalogy dodávají obsah.

                ┌─────────────────────────────────────────────┐
                │              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   │
                └─────────────────────────────────────────────┘

Struktura repozitáře

Obsah je připojen jako balíčky: community/, docs/, každý shells/, oba services/ i brands/suse jsou každý svým vlastním repozitářem, checkoutnutým jako git submoduly tohoto. Rodič vlastní engine/, schemas/, scripts/, tests/, api/, brands/lolly-start/ a profiles.json. Viz Průvodce sestavením » Získání zdrojového kódu pro příkaz checkoutu a workflow napříč repozitáři.

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

Model doručování platformy

Platforma běží napříč několika povrchy - webová PWA, desktopová/mobilní Tauri aplikace, skriptovatelné CLI a interaktivní TUI. Všechny používají stejný engine a stejné soubory nástrojů.

Web (PWA) - primární distribuce

Hostováno na URL spravované SUSE. Funguje offline, jakmile service worker nacachuje nástroje a assety. Tady bude platformu používat většina zaměstnanců, dodavatelů a partnerů. Účet není potřeba - stav se ukládá do IndexedDB na jednotlivém zařízení.

Webový shell je responzivní z jednoho layoutu. Na desktopu je nástroj měnitelný sidebar s ovládáním vedle náhledové plochy s trackpadovou navigací plátna (Cmd/Ctrl-kolečko nebo sevření pro přiblížení kolem kurzoru, mezerník nebo tažení prostředním tlačítkem pro posun, klávesy 0/1/+/ a HUD Fit/%). Na mobilu (≤640px) se ovládání stává listem ukotveným nahoře s úchytem pro tažení, který zaklapne do peek/half/full (ťuknutí přepíná) nad statickým celoobrazovkovým náhledem, a plovoucí tlačítko Render otevírá ovládání Export ve vyskakovacím listu zdola. Dotyk získává sevření-přiblížení a tažení-posun na náhledu. Renderovací cesta a ovládání exportu jsou identické na obou - přeuspořádá se jen chrome.

Desktopové rozdělené zobrazení - ovládání generované z manifestu vlevo, živé plátno vpravosigned by Lollyvector SVGOvěř si to sámGet the signed file5 paths989 nodes11 groups14 KBDesktopové rozdělené zobrazení - ovládání generované z manifestu vlevo, živé plátno vpravosigned by Lollyvector SVGOvěř si to sámGet the signed file5 paths989 nodes11 groups14 KB

Stejný nástroj na šířku telefonu, bez druhého layoutu k udržování: ovládání se stává listem nahoře, náhled zabírá celou obrazovku a pilulka renderu se nad ním vznáší.

Audiogram na obrazovce o šířce 430 px - list ovládacích prvků nahoře, hotová čtvercová grafika dole a plovoucí pilulka renderovánísigned by Lollyvector SVGOvěř si to sámGet the signed file47 paths~1.9k nodes84 groups1 image212 KBAudiogram na obrazovce o šířce 430 px - list ovládacích prvků nahoře, hotová čtvercová grafika dole a plovoucí pilulka renderovánísigned by Lollyvector SVGOvěř si to sámGet the signed file47 paths~1.9k nodes84 groups1 image211 KB

Dávkový režim (/pro). Webový shell dodává i dávkovou mřížku ve stylu tabulky (shells/web/src/pro/), která vykresluje mnoho řádků najednou napříč jedním nebo více nástroji. Zvládá roundtrip CSV/TSV plus vkládání z tabulek, šablonu/formát/velikost/jednotku/dpi na řádek, boční panel editoru bloků s živým náhledem, sbalitelné exportní sloupce, lištu tagů "relevance" na řádek, přeuspořádání řádků tažením za levý úchyt, dvoukrokové potvrzení smazání, uložené dávkové relace a stažení .zip. Toto je povrch jeden-k-mnoha za pozicováním "hromadné generování obsahu".

Tauri desktop / mobil

Zabalená nativní aplikace (malá stopa díky Tauri). Poskytuje plnou offline dostupnost, přístup k souborovému systému pro nástroje závislé na CLI (PDF Smasher, Font Outliner) a přístup ke kameře. Naplánováno na vylepšení nástrojů v polovině roku 2026.

CLI

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

Uživatelé desktopu mohou vyvolat mnoho nástrojů z terminálu. CLI shell nahraje stejný engine, vytvoří jsdom DOM, spustí stejnou renderovací cestu a zapíše soubor. URL režim je transport - CLI není samostatná implementace. Tím je zaručeno, že výstupy CLI a GUI jsou identické.

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

Interaktivní protějšek CLI: celoobrazovková, na klávesnici založená terminálová aplikace (postavená na Ink) pro procházení nástrojů, vyplňování vstupů, ukládání projektů a export - to vše bez GUI. Její bridge k hostiteli znovu používá implementaci CLI pro formáty bez DOM (SVG/EMF/EPS/HTML + text/data) a přidává stav na disku pod ~/.lolly plus volitelný inline náhled. Kromě toho má vrstvu prohlížečového renderu: omezený headless Chromium (stejný, jaký instaluje MCP server), který na vyžádání vytváří rastr/PDF/video a zachytávání živých URL - řídí sestavenou kopii webového shellu, takže je výstup identický, a spouští se jen při prvním exportu takového formátu. Takže url-shot (s ořezem + přebarvením + vektorovým PDF/SVG) a každý rastrový/pdf nástroj běží i v terminálu. Viz průvodce TUI.

Ať jsi na jakémkoli povrchu, záložka Capabilities v dashboardu je úplná mapa toho, co platforma deklaruje, že umí, seskupené a čitelné, aniž bys otevřel jediný nástroj.


Kategorie nástrojů

Nástroje jsou ve svém manifestu označeny category pro seskupení v galerii.

Řádky jsou vypsány v pořadí sekcí galerie. Sekce utility se v galerii vždy vykresluje jako poslední (po všech ostatních kategoriích, včetně budoucích) - jde o zásuvku „Offline nástroje“ přímo v zařízení.

KategoriePříkladyPlánováno
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 ScreenshotPřevodníky jednotek/formátů, další nástroje pro soukromí fungující na zařízení

Tyto buňky jsou příklady, ne úplný výčet. Které nástroje existují, je vlastnost namontovaného profilu, ne této stránky: brand pack přidává vlastní nástroje a může vyloučit komunitní nástroj, který dodávat nechce. catalog/tools/index.json - generovaný z manifestů, a registr, který galerie skutečně čte - je autoritativní seznam; chceš-li spočítat, co profil namontuje, spočítej manifesty (ls community//tool.json brands//tools/*/tool.json), místo abys věřil číslu zapsanému zde. (Id nástroje přítomné ve dvou packech se namontuje jednou, z vítězného packu.)

Nástroje jsou také klasifikovány podle stavu: official (schváleno brandem, bez vodoznaku), community (externí příspěvek), experimental (exporty s vodoznakem). Většina knihovny je official; novější studia a nástroje pro záznam bývají spíš community nebo experimental, dokud se neustálí. Každá plocha zobrazuje odznak, takže čtenář ví, co si bere, ještě než to otevře - a stejně jako buňky kategorií výše se i příslušnost ke stavu mění příliš rychle na to, aby se dala vypsat zde. Přečti si to z galerie nebo z generovaného indexu.

Design je první nástroj postavený na režimu volného plátna render.layout: "editor" - plocha bez chromu s přímou manipulací, kde přetahuješ, měníš velikost, otáčíš a přichytáváš boxy textu, tvarů a obrázků a pak exportuješ stejnou renderovací cestou jako každý jiný nástroj.

Strip Hidden Data je první nástroj na zařízení (privacy: "on-device"): nástroj transformující obsah, který vezme soubor dodaný tebou, celý ho zpracuje v prohlížeči a vrátí čistou kopii - nikdy se nikam nenahrává, nikdy se neopatří vodoznakem, nerazí se do něj žádná provenience. Text Helper je druhý - pracovní stůl na zařízení pro každodenní úlohy typu vlož-do-webu (formátování JSON, dekódování JWT, Base64, kódování/dekódování URL, hashování SHA). Compress PDF je třetí - zmenšuje PDF rekompresí jeho obrázků, opět celé na zařízení. Značka a text jejího odznaku „Runs on your device - nothing is uploaded“ nyní pokrývají celou sadu transformací: Strip Hidden Data, Text Helper, Compress PDF, Convert Image (HEIC/TIFF/AVIF → WebP/JPG/PNG), Convert Font, Redact (zničit oblasti obrázku, SVG nebo PDF), Prompt to Image a Rebrand a Deck (přeznačkovat .pptx na místě), pokud ho profil namontuje. Jde o kategorii nástrojů pro soukromí, která nahrazuje předávání důvěrných souborů jednoúčelovým webům.

Zásuvka Utilities, kde je každá karta nástroj transformující soubor, který už mášsigned by Lollyvector SVGOvěř si to sámGet the signed file154 paths~40k nodes234 groups802 KBZásuvka Utilities, kde je každá karta nástroj transformující soubor, který už mášsigned by Lollyvector SVGOvěř si to sámGet the signed file154 paths~40k nodes234 groups803 KB

Poznámka: category a status jsou denormalizovány do catalog/tools/index.json (registru, který galerie čte) z jednotlivých tool.json. Manifest je zdroj pravdy - index je generovaný příkazem npm run build:catalog a npm run validate:catalog shodí CI, pokud committovaný index odchyluje od manifestů.


Architektonické závazky

Tato rozhodnutí jsou pevně daná. Změna kteréhokoli z nich je zásadní podnik - utvářejí každé další rozhodnutí v kódové bázi.

1. Deklarativní nástroje s imperativní únikovou cestou

Nástroj je manifest (tool.json) + šablona (template.html) + volitelný hooks.js.

Vstupy deklaruje manifest. Ne šablona. Vstupy se neodvozují z tokenů Handlebars. Manifest je smlouva; šablona spotřebovává pojmenované proměnné přes {{id}}.

Ovládací sada Street Map - rozbalovací nabídka měst, výběr motivu, posuvníky tloušťky a barevné spouštěče, každý z nich odvozen z řádku manifestusigned by Lollyvector SVGOvěř si to sámGet the signed file39 paths~3.4k nodes70 groups2 images50 KBOvládací sada Street Map - rozbalovací nabídka měst, výběr motivu, posuvníky tloušťky a barevné spouštěče, každý z nich odvozen z řádku manifestusigned by Lollyvector SVGOvěř si to sámGet the signed file39 paths~3.4k nodes70 groups2 images50 KB

Hooky jsou volitelné. Většina nástrojů je čistě deklarativní - manifest + šablona stačí. Nástroje potřebující počítané hodnoty (kódování QR, tvarování dat grafu) poskytují hooks.js, který vystavuje pojmenované životní funkce (onInit, onInput, onFrame - hook pro živý obraz z kamery po jednotlivých snímcích pro nástroje reagující na pohyb - onLevel, beforeExport, afterExport, exportFile - transformační cesta soubor-dovnitř/soubor-ven, kterou používají nástroje na zařízení jako Strip Hidden Data - a exportStill pro nástroj, který si spravuje vlastní hloubkový rastr). Host načítá hooky přes new Function('host', …) s vloženým bridge schopností do closure scope. Toto je smlouva o přenositelnosti, ne bezpečnostní sandbox: hooky stále běží v realmu stránky a v prohlížečovém shellu se mohou dostat k window/fetch/document - host. je podporovaná, přenositelná plocha, ne vynucená hranice. Asynchronní výsledky hooků mají časový limit (onInit 5 s, onInput 2 s, beforeExport/afterExport 5 s, exportFile/exportStill 10 s) a pozdní výsledky se zahazují; utíkající synchronní* hook nelze přerušit. Nedůvěryhodný kód hooků třetích stran proto není bezpečné spouštět, dokud nepřijde izolace ve Workeru.

Na tom záleží, protože: deklarativní nástroje mohou vytvářet i lidé bez vývojářských dovedností. Kdyby byl každý nástroj webovou aplikací, poznámka o riziku „omezené dovednosti na vytváření/údržbu pracovních šablon“ se stává trvalým hrdlem lahve.

2. Nástroje a assety jsou data, ne zabalený kód

Webová a Tauri aplikace načítají katalogy nástrojů a assetů ze známé URL při startu, ukládají je lokálně do cache a pracují s tím, co tam je. Přidání nové dlaždice pro událost nebo sezónního assetu nevyžaduje vydání aplikace.

Bajty assetu mají kontrolní součet SHA-256, aby se zabránilo otrávení CDN. id + version assetu řídí invalidaci cache.

3. Capability Bridge je jediné API, které nástroje vidí

Nástroje se nikdy nedotýkají DOM mimo oblast své šablony, nikdy nevolají fetch přímo, nikdy nečtou souborový systém. Volají verzované metody host.*. Kanonická definice smlouvy je packages/core/src/host-v1.ts - SDK pro autory nástrojů @lolly-tools/core, takže třetí strana může stavět proti němu bez závislosti na enginu; engine/src/bridge/host-v1.ts je jeho typový re-export a kód enginu/shellu z té cesty importuje beze změny:

Bridge APICo dělá
host.profileUživatelovo křestní jméno, e-mail, portrét, město atd. Předvyplňuje vstupy přes bindToProfile.
host.assetsDotazy do katalogu, resoluce assetů, hostem poskytnuté UI pro výběr.
host.stateUkládání / načítání slotů vstupů. IndexedDB na webu, souborový systém na Tauri, paměť na CLI.
host.clipboardZápis textu nebo obrázku do schránky (s náhradními variantami podle platformy).
host.exportRasterizuje nebo serializuje cíl vykreslení. Aplikuje vodoznak u experimentálních nástrojů.
host.netFetch se seznamem povolených adres - dostupný jen pokud nástroj deklaroval schopnost "network". (Žádný nasazený nástroj to aktuálně nepoužívá.)

Volitelné, přídavné plochy se objeví jen tehdy, když je shell poskytne. Některé jsou řízené schopností - vystavené jen když nástroj deklaruje odpovídající příznak: host.compose (vložit vykreslení jiného nástroje - compose), host.capture (zachycení stránky pro URL Screenshot - capture) a host.recorder (záznam z mikrofonu/kamery/obrazovky pro nahrávací nástroje - microphone / camera / screen). Zbytek je zjišťovaný podle funkce - přítomný kdykoli ho shell dokáže poskytnout, přičemž nástroj si drží záložní řešení pro shelly, které nemohou.

Několik hlavních ploch pro ilustraci, co to pokrývá - Host API dokumentuje každou z nich a packages/core/src/host-v1.ts je samotná smlouva:

RozhraníOd verzeCo přidává
host.tokens1.0Designové tokeny DTCG - vlastní primitiva značky
host.text1.0Převod textu na cestu přes HarfBuzz WASM (schopnostní flag wasm označuje nástroje, které na tom závisí)
host.media1.4Živé snímky z kamery pohánějící hook onFrame. Postupné vylepšení, záměrně ne podmíněné flagem camera - takový nástroj dál funguje jako obyčejný nástroj pro statické obrázky
host.color1.40Percepční matematika barev: ΔEOK, kontrast WCAG + APCA, rampy OKLab, dělení do tříd, kategorické palety, harmonická schémata (1.60), míchání CSS Color 4 a pečení gradientů (1.68). Čisté a synchronní - shelly připojují makeColorApi() jádra místo toho, aby cokoli implementovaly, takže to nemůže rozjet
host.images1.60Dekódování / změna velikosti / překódování bajtů na zařízení - cesta konverze (HEIC → JPEG, komprese do WebP, zmenšení). Dodáváno ve webovém shellu jako líný fasádový modul, takže se dekodér HEIC nikdy nedostane do startovacího balíčku
host.geom1.64Přesná vektorová geometrie: booleovské operace nad cestami, offsetování, převod obrysu na výplň, snížení splajnů, zjednodušení, testování zásahů. Také čisté, synchronní a připojené z jádra (makeGeomApi()); chyby se vracejí, nikdy se nevyhazují

Zbytek se řídí stejnými pravidly a je zdokumentován vedle nich: pdf (1.8) a pptx (1.58) pro chirurgii dokumentů na zařízení, audio (1.71) a speech (1.96) pro analýzu klipů a TTS/přepis na zařízení, viz (1.72) pro zástupnou smlouvu MilkDrop, codec (1.100) a layers (1.102) pro hloubkově-bitový a vrstvený bitmapový výstup, upscale (1.101) a matte (1.103) pro modely na zařízení, raster (1.105) pro hooky dělající vlastní pixelovou práci, connectors (1.106) pro exportu-bezpečné šipky a c2pa (1.85) pro podepisování hotových bajtů. Počet roste; pravidla ne.

Deklarovatelné schopnosti jsou: network, filesystem, clipboard, camera, microphone, screen, ffmpeg, wasm, capture, compose. (screen, přidané v 1.54, je záznam obrazovky přes host.recorder - uživatel vybere obrazovku/okno/kartu v nativním UI prohlížeče; liší se od capture, které rasterizuje URL, kterou si nástroj sám pojmenuje.)

Stejný nástroj běží v prohlížeči, Tauri i bezhlavém CLI, protože každý shell implementuje toto rozhraní - nástroj nikdy neví, ve kterém z nich je.

Bridge je verzovaný. Přidání metod je vedlejší (minor) verze. Odebrání nebo změna signatur je hlavní (major) navýšení verze. Až vyjde v2, v1 musí dál fungovat.

4. ID assetů jsou navždy

suse/logo/primary je smlouva. Jakmile je publikováno:

Díky tomu jsou uložené stavy nástrojů a přes URL sdílené odkazy trvanlivé napříč lety.

5. Režim URL je prvotřídní

Každý vstup musí být vyjádřitelný jako parametr URL:

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

Tenhle odkaz sám o sobě, bez ničeho dalšího, je hotový assetsigned by Lollyvector SVGOvěř si to sámGet the signed file17 paths~2.0k nodes39 groups24 KBTenhle odkaz sám o sobě, bez ničeho dalšího, je hotový assetsigned by Lollyvector SVGOvěř si to sámGet the signed file17 paths~2.0k nodes39 groups24 KB

Režim CLI je režim URL pod jiným přenosem - CLI shell sestaví objekt stavu URL z argv a spustí stejný pipeline enginu. Existuje jedna renderovací cesta. CLI se nemůže odchýlit od GUI, protože není samostatná implementace.

url-mode.ts obstarává obousměrný převod (parsování a serializaci). Sada rezervovaných parametrů se nástroji nikdy nepředává jako vstupy: ovládací prvky výstupu (format, export, copy, filename, width/w, height/h, unit, dpi), voliče tisku a provenience (bleed, marks, profile, password, c2pa, imprint, durable, meta, hdr, depth, cuts) a nosiče stavu (template, z - zabalený token „Nejkratší odkaz“ - a zx, totéž zašifrované heslem). Sada RESERVED v engine/src/url-mode.ts je autorita a je zapíchnutá testem; URL Mode dokumentuje každou z nich, včetně několika málo, které tu vypsané nejsou. Vstupy assetů v režimu URL jsou serializovány přes své id; runtime je před hydratací vyřeší přes host.assets.get(). width/height jsou hodnoty v unit (výchozí px, také mm/cm/in/pt/pc); u fyzické jednotky nastavuje dpi rastrové rozlišení. Nastavují velikost dokumentu plátna a předvyplňují panel rozměrů exportu.

Protože každý vstup cestuje v odkazu, změna parametru je jiný hotový asset. Celá tato paleta je jedna výchozí barva, harmonie a počet kroků:

Devět kroků napříč čtyřmi odstíny, všechny vzešlé z jediné výchozí barvy neseené v odkazusigned by Lollyvector SVGOvěř si to sámGet the signed file10 groups24 KBDevět kroků napříč čtyřmi odstíny, všechny vzešlé z jediné výchozí barvy neseené v odkazusigned by Lollyvector SVGOvěř si to sámGet the signed file10 groups24 KB

6. Ukládání jde přes bridge, ne přímo

Web shell: IndexedDB. Tauri: souborový systém. CLI: v paměti. Nástroje vidí pouze host.state.save(slot, data) a host.state.load(slot). localStorage se nepoužívá - je příliš malý a neumí uchovat blob.

Uživatelé si mohou uložit více pojmenovaných edit slotů na nástroj a vrátit se ke každé relaci později. Vytváření účtu není potřeba, stav je per-device. Protože bridge je jediný švík, tento per-device stav je zároveň přenositelný: shells/web/src/data-transfer.ts čte vše zpět přes host.profile/host.state/host.assets do jednoho lolly-backup zipu, který se dá naimportovat na jakékoli jiné instalaci - offline odpověď na "přesun na nové zařízení", která nepotřebuje server (celá specifikace: docs/data-transfer.md). Integrace SUSE ID (synchronizace napříč zařízeními) je budoucí milník nad tímto základem.

7. Značky zralosti řeší riziko "schváleno značkou" už v návrhu

Každý nástroj deklaruje status: official | community | experimental ve svém manifestu. Galerie řadí podle statusu. Experimentální nástroje automaticky vodoznakují své exporty - vodoznak vkládá host.export.render, ne nástroj sám, takže ho autor neoficiálního nástroje nemůže vypnout.

Toto je strukturální odpověď na riziko vnímání, že použití jakéhokoli nástroje znamená schválení značkou. Procesní odpovědi (schvalovací fronta, gating přes SUSE ID) se vrství navrch.

8. Vstupy nástrojů jsou typované přes manifest, včetně assetů

Vstupy deklarují type: text, longtext, number, boolean, color, select, asset, date, time, datetime-local, url, blocks, vector, table a file. Host vykresluje obecný ovládací prvek pro každý typ z manifestu - nástroje nepíšou žádný kód pro ovládací prvky. (Předvyplnění z uživatelského profilu není typ - bindToProfile může nést jakýkoli vstup.) Tři z nich mají větší váhu než ostatní:

9. Šablony jsou bez logiky (Handlebars, ne EJS)

Handlebars byl vybrán oproti EJS záměrně:

Logika žije v hooks.js, kde je explicitní a přezkoumatelná. Dostupné pomocné funkce Handlebars: {{default}}, {{upper}}, {{lower}}, {{eq}}, {{markdown}}, {{asset ref}}, {{asset ref "property"}} (plus pomocné funkce pro datové formáty icsStamp/rfcText/csvCell používané sesterskými šablonami .ics/.vcf/.csv).

10. Nástroje skládají nástroje

Nástroj může vložit vykreslení jiného nástroje bez importů mezi nástroji navzájem - skládání řeší engine, nikdy kód nástroje. Existují dvě plochy:

Skládat lze vykreslení jakéhokoli nástroje: potomek SVG zůstane skutečným vektorem, když rodič exportuje do SVG nebo PDF, a ostře se rasterizuje pro PNG; potomci PNG/JPG/WEBP se vkládají jako obrázky. Vyžaduje schopnost compose. Skládaní potomci jsou mezistupně - nikdy nejsou vodoznakováni ani opatřeni razítkem původu - a skládání elegantně degraduje: shell, který potomka neumí vykreslit, slot prostě vynechá a rodič se přesto vykreslí.


Co jsme se záměrně rozhodli nedělat


Životní cyklus, od začátku do konce

Uživatel otevře lolly.tools/#/tool/qr-code?url=https://suse.com&ecl=H:

  1. Boot. Web shell otevře IndexedDB, sestaví bridge schopností, synchronizuje katalogy nástrojů a assetů (nebo je offline načte z cache).
  2. Route. URL hash → pohled tool, s extrahovanými parametry qr-code a URL.
  3. Load. loadTool('qr-code', fetchFile) stáhne tool.json, validuje ho proti JSON Schema, stáhne template.html, styles.css a zdroj hooks.js.
  4. Parse URL state. parseUrlState převádí parametry URL na počáteční hodnoty vstupů. Odkazy na assety (?logo=suse/logo/primary) se parsují jako odlehčené objekty { id, _unresolved: true }.
  5. Runtime. createRuntime(tool, host, initialValues) sestaví model vstupů (sloučí data profilu, výchozí hodnoty a počáteční hodnoty), rozřeší odkazy na assety přes host.assets.get(), načte hooky (host v uzávěru, ne v sandboxu), zavolá hooks.onInit.
  6. Render. Shell se odebírá na runtime; při každé změně stavu dostane { model, hydrated }. Vykreslí ovládací prvky vstupů z modelu a zapíše hydratovaný HTML šablony do #tool-canvas.
  7. Interact. Uživatel napíše do vstupu → runtime.setInput(id, value) → aplikují se omezení → zavolá se hooks.onInput → re-hydratace → re-render. Plátno se aktualizuje živě.
  8. Export. Uživatel klikne na Download (PNG) → runtime.export(canvasNode, 'png')host.export.render (rasterizuje přes dom-to-image-more; SVG/PDF jdou přes vyhrazené vektorizéry procházející DOM) → blob → host.export.download. Rozsah formátů, do kterých se nástroj může zapojit, je široký a autoritou je enum render.formats ve schemas/tool.schema.json - rastery a plovoucí rastery, vektory a řezací soubory, tisk/CMYK, pohyb, editovatelné dokumenty (pptx, docx, odt), paletové a datové/textové výstupy, audio a fontové soubory. Režim URL pojmenovává každé id a to, co produkuje. Audio je v tomto enumu jako cokoli jiného (wav, mp3, m4a, opus, deklarované audiogramem a nahrávacími nástroji); odděleně, režim render.capture u nahrávacího nástroje řídí host.recorder, jehož záznam přichází jako hotový Blob v jakémkoli kontejneru, který prohlížeč nahrál. (Nástroje, které nastaví render.export: false - např. Color Palette, Countdown Timer, Strip Hidden Data, Text Helper, Compress PDF - skrývají ovládací prvky pro stažení/formát/rozměry.) Fyzické jednotky se převádí podle formátu přímo tady (PDF → skutečné body stránky, raster → pixely při DPI s chunkem pHYs). Metadata o autorství/původu (autor, nástroj, zdroj - sestavuje engine/src/metadata.ts) se vkládají podle formátu: PNG iTXt, JPEG EXIF, PDF info dict, SVG <metadata>, komentář GIF. Experimentální nástroje dostávají vodoznak vložený hostem, ne nástrojem.

Panel exportu, který otevírá ?options: dvojice název souboru a formát, výstupní rozměry a ovládací prvky, které zapisují souborsigned by Lollyvector SVGOvěř si to sámGet the signed file49 paths~3.3k nodes61 groups3 images74 KBPanel exportu, který otevírá ?options: dvojice název souboru a formát, výstupní rozměry a ovládací prvky, které zapisují souborsigned by Lollyvector SVGOvěř si to sámGet the signed file49 paths~3.3k nodes61 groups3 images74 KB

Stejný životní cyklus v Tauri. Stejný životní cyklus v CLI - jsdom poskytuje bezhlavý DOM; výstup jde do souboru nebo na stdout.


Stav open source

Kód je pod MPL-2.0. engine/, shells/, services/, schemas/ a docs/ jsou open source pod MPL-2.0 - platforma pro scaffolding nezávislá na dodavateli pro nástroje značky, kde každá dodávaná jednotka má vlastní repozitář pod github.com/lolly-tools.

Obsah nástrojů se dodává jako brand packy, každý s vlastními podmínkami (viz NOTICE.md daného packu). community/ je veřejný repozitář lolly-tools a jeho nástroje nezávislé na značce jsou také pod MPL-2.0. brands/suse/ je privátní pack suse-lolly: nástroje SUSE a katalog SUSE, proprietární pro SUSE, včetně licencované hudby PremiumBeat. brands/lolly-start/ je prázdná startovní značka, kterou vlastní tento repozitář. Písma se dodávají uvnitř packu pod licencí SIL Open Font License 1.1 - pack SUSE nese písma SUSE a SUSE Mono.

tools/ a catalog/ v kořeni repozitáře jsou pohledy ignorované gitem: profil je sestaví z community/ plus aktivního brand packu, a proto každý skript a shell čte tyto dvě cesty a nikdy pack přímo.

Toto oddělení je vynucené - neexistují cross-importy z engine/ do obsahu nástrojů - takže hranice mezi platformou a obsahem zůstává čistá.


Kde končí engine a začíná host

Pokud to lze popsat čistě daty + Handlebars → engine. Pokud se to dotýká DOM, souborového systému, sítě nebo jakéhokoli API prohlížeče/OS → host.

Hranice je záměrně ostrá. Engine je open-source část. Vše, co ví o SUSE, konkrétních platformách nebo běhových prostředích, z něj zůstává vně.

Pro další úroveň detailu engine/README.md vyjmenovává každý modul enginu a za co odpovídá, a Model hrozeb a hranice důvěry zaznamenává, kde stejná hranice zároveň funguje jako hranice důvěry.