Lolly
Spustit aplikaci

Přehled

signed by Lollyoverview.htmlHTMLpixels, not shapes12 KBAI generatedgenerated by ClaudeOvěř si to sámStáhni podepsaný soubor

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 vydaná. Verze 1.0 vyšla jako open source pod licencí MPL-2.0 dne 30. srpna 2026 a funkce, výchozí hodnoty i katalog nástrojů se mezi vydáními stále mění. Engine je deterministický, s jednou renderovací cestou za každým shellem. Jeho zabezpečení zatím neprošlo nezávislým auditem a důkazy o přijetí jsou několik měsíců staré. Viz Přijetí a řízení, jaký je aktuální stav a jak se přijetí měří.

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

Opakovatelná kreativní práce je příliš předvídatelná, než aby ospravedlnila nasazení odborníků pokaždé, a zároveň příliš citlivá na kvalitu, než aby se dala předat bez mantinelů. Ponechána bez zásahu skončí jedním ze tří způsobů: pomalá, nekonzistentní, nebo uvězněná v šablonách dodavatele.

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

Programová tvorba kreativy a obsahu ve velkém měřítku - assety generované ze vstupů, s pravidly nastavenými jednou, pro každého, kdo je potřebuje.

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 z nástrojů, které pravidla už nesou. 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 stává mnoha výstupy, 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

Lolly includes lolly.work, the same project's separately deployed organisation service. Local creation needs no account; shared work and server rendering use the configured instance. Competitor scores: August 2026. Lolly coverage: 28 September 2026.

Capability Lolly+ lolly.work 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: version 1.0 public since 30 August 2026 under MPL-2.0, and SUSE runs it as an internal deployment; no usage data is shared yet and there are no public case studies yet. 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 and CLI, plus lolly.work's recoverable server jobs and batches with retries, cancellation and retained outputs. 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: standalone creation works offline once its assets are available; lolly.work's organisation services need a reachable instance, which can run on an internal network. 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: local rendering and conversion in-browser or CLI need no upload. Choosing lolly.work's shared storage, work collabs or server rendering sends the relevant data to the configured instance. 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: templates fix layout rules and expose permitted inputs. lolly.work adds group access, input policies, shared catalogues, approvals and audit records. Copy and usage rights can still need review. 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: optional on-device signing without an account, plus lolly.work server signing with a configured organisation identity. A verifier must trust the signer's root to show a trusted identity. Version 1.0 is public and SUSE runs it internally, but no usage data is shared yet, so 75. Penpot: 50 via the official Lolly Export plugin - the same on-device engine signing Lolly uses, opt-in, as in Lolly (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 and URL mode, plus lolly.work's authenticated render API, recoverable batches and governed delivery. One engine across the local and server paths. 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)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: direct two-device private collabs without an account, plus authenticated work collabs through lolly.work with shared edits, cursors and saved team sessions. Partial reflects the current single-node work deployment and limited operating history. Private collabs work without internet on a shared network; work collabs need the organisation's instance. 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 using an existing tool, or publish a tool from Design through Share with rules. lolly.work manages access and input policy for the team. 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 and lolly.work: MPL-2.0 open source in separate repositories, both self-hostable. lolly.work provides the organisation services as part of the project. The current 75 reflects the young project and limited deployment history. Everything else is proprietary SaaS or proprietary desktop.
75 100 0 0 0 0 0 0
Cost at production scaleLolly + lolly.work and Penpot: no per-seat software licence charge for the open-source self-hosted path; hardware, storage and operations remain costs. 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 + lolly.work: US$0 in software licence charges for self-hosting. The figure excludes devices, organisation hosting, storage, support and administration; these need a separate budget. Standalone Lolly does not need the organisation service. 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.htmlHTMLpixels, not shapes40 KBAI generatedgenerated by GPT-6Ověř si to sámStáhni podepsaný soubor

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čal signed by Lollyvector SVG367 paths~62k nodes773 groups3 images1 453 KBOvěř si to sámStáhni podepsaný souborKaždý nástroj v knihovně jako karta, seskupené podle kategorie, aby si producent jeden vybral a začal signed by Lollyvector SVG367 paths~62k nodes776 groups3 images1 454 KBOvěř si to sámStáhni podepsaný soubor

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 SVG15 paths~1.3k nodes4 groups20 KBOvěř si to sámStáhni podepsaný souborSklá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 SVG15 paths~1.3k nodes4 groups20 KBOvěř si to sámStáhni podepsaný soubor

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í.


Jeden nástroj, mnoho výstupů

Pravidla značky žijí v nástroji, ne v každém souboru, který vytvoří (viz Jak si Lolly stojí ve srovnání). Nastav nástroj správně jednou a každý výstup zdědí stejný typ, barvu a rozestupy, ať už jde o jednu kartu, nebo tabulku řádků v tuctu jazyků. Jak kontroluješ svou práci a kdo to dělá, zůstává na tobě; Lolly zmenšuje to, co stojí za kontrolu, a zrychluje výrobu výstupu.

Stejný deterministický nástroj dosahuje tohoto škálování třemi způsoby, všechny produkují identický 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 data signed by Lollyvector SVG133 paths~15k nodes185 groups1 image195 KBOvěř si to sámStáhni podepsaný souborDá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 data signed by Lollyvector SVG133 paths~15k nodes185 groups1 image195 KBOvěř si to sámStáhni podepsaný soubor

Jedna sada brand omezení, jednou pevně stanovená designérem; tři cesty k identickému výstupu.


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

Lolly je jeden repozitář. engine/, schemas/, scripts/, tests/, api/, docs/, community/, brands/lolly-start/, každý shells/ a oba services/ jsou v něm obyčejné adresáře. Jedinou výjimkou je brands/suse, soukromý git submodul obsahující sadu nástrojů a katalog SUSE, volitelný a chybějící ve veřejném klonu. Které balíčky daný build čte, určuje obsahový profil (profiles.json), řešený pro každý proces zvlášť, nikoli přepínaný globálně. Příkaz pro klonování a postup, jak se commituje změna uvnitř soukromého balíčku, najdeš v Build Guide » Získání zdrojového kódu.

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
│
├── community/        # the brand-agnostic tool pack - data, not code. Public (MPL-2.0).
│                     #   A SELECTION follows; a profile mounts these plus whatever
│                     #   tools the active brand pack carries of its own.
│   ├── qr-code/
│   ├── snippet/
│   ├── countdown-timer/
│   ├── color-palette/
│   ├── 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)
│   ├── chart/             # 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
│   ├── 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
│   ├── icon/              # favicon .ico / png / svg from text + colours
│   └── lottie-digi-ad/    # animated Lottie ad banners
│
├── brands/            # brand packs - a catalog each, and optionally tools of their own
│   ├── lolly-start/   # the blank starter brand, owned here
│   │   └── catalog/
│   │       ├── tools/index.json    # tool registry, generated per brand
│   │       └── assets/
│   │           ├── index.json      # asset registry
│   │           └── lolly/...       # logo, palette, tokens
│   └── suse/          # PRIVATE submodule - the SUSE tools and the SUSE catalog
│
├── 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 vpravo signed by Lollyvector SVG131 paths~6.1k nodes158 groups1 image142 KBOvěř si to sámStáhni podepsaný soubor

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 SVG97 paths~3.3k nodes113 groups99 KBOvěř si to sámStáhni podepsaný souborAudiogram 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 SVG97 paths~3.3k nodes113 groups100 KBOvěř si to sámStáhni podepsaný soubor

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

pnpm 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, RecordEmployee Image Stationery
designerBrand Lockup, Design, Chart, Darkroom, Filter, Pose Geeko, BookletFont 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, Compress PDF, Convert Image, Convert Font, Redact, Run Web Code, Screen Capture, URL ScreenshotPřevodníky jednotek/formátů, další soukromí respektující nástroje 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ím nástrojem na zařízení (privacy: "on-device"): nástroj na transformaci obsahu, který vezme soubor dodaný tebou, zpracuje ho celý v prohlížeči a vrátí čistou kopii - nikdy se nikam nenahrává, nikdy se neopatřuje vodoznakem, neotiskuje se do něj žádný původ. Text je druhý - pracovní plocha na zařízení pro běžné úkoly 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, Compress PDF, Convert Image (HEIC/TIFF/AVIF → WebP/JPG/PNG), Convert Font, Redact (zničí oblasti obrázku, SVG nebo PDF), Prompt Card a Rebrand (přeznačkuje .pptx na místě) tam, kde ho profil obsahuje. Jde o kategorii nástrojů na ochranu 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 SVG124 paths~29k nodes324 groups395 KBOvěř si to sámStáhni podepsaný souborZásuvka Utilities, kde je každá karta nástroj transformující soubor, který už máš signed by Lollyvector SVG124 paths~29k nodes324 groups396 KBOvěř si to sámStáhni podepsaný soubor

Poznámka: category a status jsou denormalizovány do catalog/tools/index.json (registr, který čte galerie) z každého tool.json. Zdrojem pravdy je manifest - index je generovaný příkazem pnpm run build:catalog a pnpm run validate:catalog selže v CI, pokud se commitnutý index rozejde s manifesty.


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 manifestu signed by Lollyvector SVG39 paths~2.6k nodes54 groups2 images43 KBOvěř si to sámStáhni podepsaný souborOvlá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 manifestu signed by Lollyvector SVG39 paths~2.6k nodes54 groups2 images43 KBOvěř si to sámStáhni podepsaný soubor

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ý asset signed by Lollyvector SVG55 paths~2.6k nodes38 groups60 KBOvěř si to sámStáhni podepsaný souborTenhle odkaz sám o sobě, bez ničeho dalšího, je hotový asset signed by Lollyvector SVG55 paths~2.6k nodes38 groups61 KBOvěř si to sámStáhni podepsaný soubor

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 odkazu signed by Lollyvector SVG10 groups25 KBOvěř si to sámStáhni podepsaný souborDevět kroků napříč čtyřmi odstíny, všechny vzešlé z jediné výchozí barvy neseené v odkazu signed by Lollyvector SVG10 groups25 KBOvěř si to sámStáhni podepsaný soubor

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 naimportuje na jakékoli jiné instalaci - offline odpověď na "přesun na nové zařízení", která nepotřebuje server (celá specifikace: docs/data-transfer.md). Synchronizace napříč zařízeními už na tomto základu běží a posílá stejný balíček do úložiště, které si zvolí uživatel (docs/sync.md).

7. Značky zralosti říkají, co nástroj je

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 každý nástroj v galerii nese stejnou váhu. Jakýkoli proces, který tým postaví kolem katalogu, 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 jednoho vykreslení

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

  1. Spuštění. Webová schránka otevře IndexedDB, sestaví most schopností, synchronizuje katalogy nástrojů a assetů (nebo je při offline stavu načte z mezipaměti).
  2. Směrování. Hash URL → zobrazení tool, s extrakcí qr-code a parametrů URL.
  3. Načtení. loadTool('qr-code', fetchFile) načte tool.json, ověří ho proti JSON Schema, načte zdroje template.html, styles.css a hooks.js.
  4. Rozbor stavu z URL. 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čením dat profilu, výchozích hodnot a počátečních hodnot), rozřeší odkazy na assety přes host.assets.get(), načte hooky (host v uzávěru, nikoli v sandboxu) a zavolá hooks.onInit.
  6. Vykreslení. Schránka se přihlásí k odběru runtime; při každé změně stavu obdrží { model, hydrated }. Z modelu vykreslí ovládací prvky vstupů a hydratované HTML šablony zapíše do #tool-canvas.
  7. Interakce. Uživatel píše do vstupu → runtime.setInput(id, value) → uplatní se omezení → zavolá se hooks.onInput → re-hydratace → nové vykreslení. Plátno se aktualizuje živě.
  8. Export. Uživatel klikne na Download(PNG) → runtime.export(canvasNode, 'png') → host.export.render (rastruje přes dom-to-image-more; SVG/PDF prochází vyhrazenými vektorizéry procházejícími DOM) → blob → host.export.download. Rozsah formátů, které nástroj může nabídnout, je široký a autoritou je výčet render.formats ve schemas/tool.schema.json - rastry i plovoucí rastry, vektory a řezové soubory, tisk/CMYK, pohyb, editovatelné dokumenty (pptx, docx, odt), paleta a datové/textové výstupy, zvukové a fontové soubory. URL Mode uvádí každé id a co produkuje. Zvuk je v tomto výčtu jako cokoli jiného (wav, mp3, m4a, opus, deklarované audiogramem a nahrávacími nástroji); odděleně od toho řídí režim render.capture nahrávacího nástroje host.recorder, jehož záznam přijde jako hotový Blob v tom kontejneru, ve kterém ho prohlížeč nahrál. (Nástroje, které nastaví render.export: false - např. Color Palette, Countdown Timer, Strip Hidden Data, Text, Compress PDF - skryjí ovládací prvky pro stažení, formát a rozměry.) Fyzické jednotky se zde převádí podle formátu (PDF → skutečné body stránky, rastr → pixely při DPI s blokem pHYs). Metadata autorství/původu (autor, nástroj, zdroj - sestavená 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ý hostitelem, 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í soubor signed by Lollyvector SVG77 paths~6.0k nodes87 groups3 images88 KBOvěř si to sámStáhni podepsaný souborPanel exportu, který otevírá ?options: dvojice název souboru a formát, výstupní rozměry a ovládací prvky, které zapisují soubor signed by Lollyvector SVG77 paths~6.0k nodes87 groups3 images88 KBOvěř si to sámStáhni podepsaný soubor

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 licencí MPL-2.0. engine/, shells/, services/, schemas/ a docs/*.ts jsou open source pod licencí MPL-2.0 - platforma pro nástroje značek nezávislá na dodavateli, celá v jednom veřejném repozitáři, lolly-tools/lolly.

Obsah nástrojů se dodává jako balíčky značek, každý s vlastními podmínkami (viz NOTICE.md daného balíčku). community/ je adresář tohoto repozitáře a jeho nástroje nezávislé na značce jsou také pod MPL-2.0. brands/suse/ je soukromý balíček suse-lolly, jediný submodul: nástroje SUSE a katalog SUSE, v majetku SUSE, včetně licencované hudby PremiumBeat. brands/lolly-start/ je prázdná výchozí značka, kterou vlastní tento repozitář. Fonty se dodávají uvnitř balíčku pod licencí SIL Open Font License 1.1 - balíček SUSE obsahuje řezy písma SUSE a SUSE Mono.

V kořeni repozitáře neexistuje adresář tools/ ani catalog/. packages/node-shell/src/content-roots.ts v okamžiku čtení zodpoví otázky "kde žije nástroj <id>" a "kde je katalog" z profiles.json, takže profil je odpověď pro každý proces zvlášť a žádný strom se nejprve nemusí sestavovat. Skutečná dvojice tools/ + catalog/ se zapisuje pouze do výstupu buildu - dist/, payloadu RPM, obrazu kontejneru - protože prohlížeč tyto dvě cesty načítá přes HTTP.

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.