概要

signed by Lollyoverview.htmlHTMLAI generatedgenerated by Claude自分で確認するGet the signed filepixels, not shapes12 KB

Lollyアイコン - 大きな緑と白のロリポップキャンディ

このドキュメントは、Lollyプラットフォームの目的、構造、アーキテクチャ上の決定事項をまとめたものです。プロダクトビジョンとコードベースの現状の両方を反映しています。

ステータス: Lollyはまだ完了していないクローズドパイロットの中にある社内プロトタイプです。エンジンは決定論的で内部的に一貫していますが、プロダクトとしてはまだ初期段階です - SUSEが最初の顧客です - そして暗号化とファイル解析エンジンは現在、エンタープライズ規模に備えたSUSEの厳格なインフラ強化を受けています(これは私たちの得意分野です)。以下のアーキテクチャは、完成し認証されたプロダクトとしてではなく、テスト中の設計意図として読んでください。パイロットの運用方法と評価方法についてはAdoption & Governanceを参照してください。

このページの読み方。 ここには2種類の内容が順に書かれています。前半は これが存在する理由です。問題、ポジショニング、1つのアセットがたどるライフサイクル を扱います。The big picture以降は レイヤーがどう組み合わさるかです。コントリビューター向けのアーキテクチャドキュメントで、engine/shell/packの 分離、リポジトリのレイアウト、配信対象、プラットフォームへのあらゆる変更を制約するコミットメントを扱います。プロダクトを理解するためではなくコードベースを変更するためにここに来たなら、big pictureから始めてください。

このページより詳しく踏み込む2つの関連ドキュメントがあります。リポジトリ内のengine/README.mdは、エンジンのモジュールごとのマップで、各モジュールが何を解析し何を書き出すかを示す生成済みの表を含みます。Threat Model & Trust Boundaries は同じアーキテクチャをトラストバウンダリとして読み解いたもので、エンジンが何を信頼できないものとして扱うかについての質問には、こちらのページが適しています。


これが存在する理由

チームは繰り返し同じ問題に直面します。反復的なクリエイティブおよびコンテンツ制作の作業は、毎回熟練者の手を借りるほどではないほど予測可能でありながら、ガードレールなしに任せるにはあまりに品質に敏感です。その結果は、遅いスループット(専門家がボトルネックになる)、一貫性の欠如(手元にあるツールを各自が使う)、またはベンダーロックイン(テンプレートを支配するSaaS DAM)のいずれかに行き着きます。

このプラットフォームはその直接的な答えです。

プログラムによる大規模なクリエイティブとコンテンツ - 従業員、ベンダー、パートナー向けに、ルールを一元管理しながら、労力ゼロでアセットを生成します。

Lollyはデザインシステムが生み出される場所ではなく、それが生産される場所です。デザインの自動販売機だと考えてください: 選択すれば、結果が出てきます。毎回必ず。エンジンは目の前のハードウェアで各フォーマットが出せる最高品質を目指して動作し、同じエンジンが、出荷先のどの環境でも同じファイルを作ります。

その結果得られるのは豊富さです。あらゆるイベントに正しいサイネージが用意され、あらゆるCVEアラートが自社のスタイルに準拠し、あらゆるラベルがきれいに印刷され、あらゆるメール署名が最新の状態を保つ - これらすべてがデザインチケットなしに実現します。このプラットフォームが担うのは、反復的でオペレーション化されたクリエイティブです。あえてオーダーメイドのクリエイティブツールにはしていません - フラッグシップの制作は引き続きデザイナーが担います。

確率的に革新し、決定論的にスケールする

クリエイティブパイプラインにおけるAIをめぐる議論は、いつも同じ問いで行き詰まります。この作業のどの部分が機械の仕事なのか、と。これは古い問いであり、すでに答えは出ています。写字生や装飾写本の画家たちは、すでに2つの道具の間で仕事をしていました - 何も固定されず何でも試せるラフスケッチと、まさに確定してしまうがゆえに恐れられた印刷機です。芸術が生まれたのはスケッチの中でした。それを誰の手にも届けたのは印刷機でした。誰もこの2つを混同することはなく、両方とも進化を続けました - 新しいインク、新しい書体、新しい印刷機 - それぞれが、その技巧と目的に調和しながら進歩していったのです。

Lollyも同じ線引きをしています。探索は確率的に行います - モデル、デザイナー、ラフなアイデア、誰も計画していなかった場所へ行き着くプロンプト。そしてスケールは決定論的に行います - 1万件の出力に届くのはツールであり、ツールは読み取り可能な入力から毎回同じようにレンダリングします。探索が自由でいられるのは、それが2回とも同じ結果に着地することに何も依存していないからです。出力が信頼を勝ち得るのは、それが当て推量ではないからです。AIによる実験を予測可能で再現性のある結果へと落とし込むことは、新しい規律ではありません。そもそも印刷物を信頼に足るものにしたのと同じ、分業の姿なのです。

クリエイティブなプロセスを信頼し、厳密さをもってスケールする。

代替手段との比較

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

現在のクリエイティブツール群における機能の充実度、2026年8月調査。スコアリング:0=なし、25=回避策レベル、50=実装済みだが制限付きまたは部分的、75=注意点付きで強力、100=中核機能。

signed by Lollypositioning-comparison.htmlHTMLAI generatedgenerated by Claude自分で確認するGet the signed filepixels, not shapes38 KB

ギャップは明白です。現在出荷されているものの中に、制約優先、オフライン対応、低スキルでも使え、社内で誰でもアクセスできる出力を提供するものはありません。Lollyにはオープンなキャンバス - Design - もあり、そこでは色、タイプ、アセットがブランドのグローバル設定に従うため、自由な配置であっても制約優先のままです。Lollyがそうではないのは、制約のないデザインスイートである、という点です。オーダーメイドのフラッグシップ制作には、デザイナーは引き続きIllustratorとFigmaを使います。バリエーションの組み立てにはこのツールを使えます。

ライブラリ内のすべてのツールがカードとしてカテゴリ別にまとめられ、プロデューサーが1つを選んで作業を始められる様子signed by Lollyvector SVG自分で確認するGet the signed file281 paths~38k nodes443 groups6 images2,269 KBライブラリ内のすべてのツールがカードとしてカテゴリ別にまとめられ、プロデューサーが1つを選んで作業を始められる様子signed by Lollyvector SVG自分で確認するGet the signed file281 paths~38k nodes443 groups6 images2,270 KB

こんな用途に: オペレーション化されたクリエイティブアセットの高速生成 - イベントタイル、名札、署名、CVEアラート、QRコード、ソーシャルカード、出荷ラベル、構造化レポート。

こんな用途には向きません: オーダーメイドのヒーローコンテンツ。


キャンペーンのライフサイクル

Lollyが何であるかを理解する最も明快な方法は、機能一覧を眺めることではありません - 1つのアセットが人から人へと渡っていく様子を追うことです。ローカライズされた1枚のキャンペーンカードが組織の中を動いていく様子を見てみましょう。

  1. クリエイティブがルールを定める。 デザイナーがDesignツールでベーステンプレートを作成し、ブランドのタイポグラフィと色の変数をハードコードします。彼らが作っているのは1枚のカードではありません - 二度と手作業でローカライズしなくて済むように、基礎となる作業を一度だけ行っているのです。
  2. 開発者がそれをスケールさせる。 同じテンプレートがCLI経由で夜間パイプラインに組み込まれ、新しいチャートや新しい言語バリアントが自動的に生成されます - デザイナーがファイルを開き直すことはありません。
  3. プロデューサーはただ使うだけ。 飛行機の中でオフラインの営業担当者が同じツールを開き、クライアントとの打ち合わせ用に完璧にオンブランドなデッキを生成します。デザインスキルもネットワークも待ち時間も不要です。

ステップ2の「新しいチャート」とは、まさにこのようなレンダリングのことです。データ文字列といくつかのパラメーターだけから、誰もデザインファイルを開くことなく生成されます。

タイトル付きの積み上げエリアチャート。3つの系列がクールなパレットで色分けされ、軸・凡例・タイトルはすべて手動ではなくテンプレートによって配置されているsigned by Lollyvector SVG自分で確認するGet the signed file15 paths~1.3k nodes4 groups21 KBタイトル付きの積み上げエリアチャート。3つの系列がクールなパレットで色分けされ、軸・凡例・タイトルはすべて手動ではなくテンプレートによって配置されているsigned by Lollyvector SVG自分で確認するGet the signed file15 paths~1.3k nodes4 groups21 KB

重要なのは、Lollyがデザイナーにとって良い、かつ開発者にとって良い、かつ営業にとって良い、という話がそれぞれ独立して成り立つことではありません。これはリレー競走です。クリエイティブが最初に行った仕事を開発者がスケールさせ、それが今度はプロデューサーの力になります。飛行機の中の非技術者の担当者が労せずして得られる体験は、デザイナーが定めて開発者が展開した厳密さがあってこそ初めて可能になるのです。

これが力を何倍にも増幅させる仕組みです。Lollyは役割ごとに別々のツールを詰め込んだ引き出しではありません - すべての役割が触れる、1つの決定論的なアセットライフサイクルであり、渡っていく手ごとに前の価値を何倍にも増やしていきます。


承認は1回、アセットは1万件

承認がファイルではなくツールに宿るため(How Lolly comparesを参照)、スケールはもはやレビューの問題ではなくなります。ローカライズされたソーシャルカードツールを一度承認すれば、スプレッドシートから12言語にわたる1万件のアセットを生成できます - そのどれ1つとして、法務やブランドによる新たなコンプライアンスチェックを必要としません。すべてが生まれるもとになったテンプレートが、すでに承認されているからです。

同じ決定論的なツールが、3つの方法でその規模に到達します。いずれも同一の、事前承認済みの出力を生み出します。

新規インストール直後のBatchモード:ツールを待つ1つの空の行。データが届く前から、スプレッドシート全体とRenderボタンが用意されているsigned by Lollyvector SVG自分で確認するGet the signed file348 paths~77k nodes537 groups7 images3,100 KB新規インストール直後のBatchモード:ツールを待つ1つの空の行。データが届く前から、スプレッドシート全体とRenderボタンが用意されているsigned by Lollyvector SVG自分で確認するGet the signed file348 paths~77k nodes544 groups7 images3,103 KB

デザイナーによって一度定められた1組のブランド制約。同一の事前承認済み出力へと至る3つの経路 - そして機械による経路がもっとも遠くまでスケールします。ファイルが次々と生成される間、決して疲れることがないからです。


全体像:レイヤーがどう組み合わさるか

ここから先はすべてアーキテクチャの話です。この図はシステム全体を1つのビューにまとめたものです。上部ではツールが データであり、中央のエンジンはどのプラットフォームについても何も知らず、その下のシェルは 1つの契約を実装し、カタログがコンテンツを供給します。

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

リポジトリのレイアウト

コンテンツはパックとしてマウントされます。community/docs/、すべてのshells/services/の両方、そしてbrands/suseは、それぞれ独立したリポジトリであり、このリポジトリのgitサブモジュールとしてチェックアウトされます。親リポジトリが所有するのはengine/schemas/scripts/tests/api/brands/lolly-start/profiles.jsonです。チェックアウトコマンドとリポジトリ横断のワークフローについてはBuild Guide » Getting the sourceを参照してください。

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

プラットフォーム配信モデル

このプラットフォームは複数のサーフェス - Web PWA、Tauriデスクトップ/モバイル、スクリプト可能なCLI、対話型のTUI - にまたがって動作します。そのすべてが同じエンジンと同じツールファイルを使用します。

Web (PWA) - 主要な配信経路

SUSEが管理するURLでホストされます。サービスワーカーがツールとアセットをキャッシュした後はオフラインでも動作します。ほとんどの従業員、ベンダー、パートナーがプラットフォームを利用するのはここです。アカウントは不要です - 状態はデバイスごとにIndexedDBに保存されます。

Webシェルは1つのレイアウトからレスポンシブに対応します。デスクトップでは、ツールはサイズ変更可能なコントロールサイドバーがプレビューステージの横に並び、トラックパッドネイティブなキャンバスナビゲーションを備えます(Cmd/Ctrl+ホイールまたはピンチでカーソル位置を中心にズーム、Spaceまたは中クリックドラッグでパン、0/1/+/キーとFit/%のHUD)。モバイル(640px以下)では、コントロールは上部固定のシートになり、ドラッググリップでpeek/half/fullにスナップし(タップでも切り替わり)、その下には静的なフルスクリーンプレビューが表示されます。フローティングのRenderボタンを押すと、Exportコントロールがボトムシートのポップアップで開きます。タッチではプレビュー上でピンチズームとドラッグパンが使えます。レンダーパスとエクスポートコントロールはどちらでも同一です - 変化するのはクロームだけです。

デスクトップのスプリットビュー - マニフェストから生成されたコントロールが左側、ライブキャンバスが右側signed by Lollyvector SVG自分で確認するGet the signed file5 paths989 nodes11 groups14 KBデスクトップのスプリットビュー - マニフェストから生成されたコントロールが左側、ライブキャンバスが右側signed by Lollyvector SVG自分で確認するGet the signed file5 paths989 nodes11 groups14 KB

同じツールをスマートフォン幅で表示した場合も、維持すべき第2のレイアウトはありません。コントロールは上部のシートになり、プレビューが画面全体を占め、レンダーピルがその上に浮かびます。

幅430pxの画面上のオーディオグラム - 上部にコントロールシート、下部に完成した正方形のアートワーク、フローティングのレンダリングピルsigned by Lollyvector SVG自分で確認するGet the signed file47 paths~1.9k nodes84 groups1 image212 KB幅430pxの画面上のオーディオグラム - 上部にコントロールシート、下部に完成した正方形のアートワーク、フローティングのレンダリングピルsigned by Lollyvector SVG自分で確認するGet the signed file47 paths~1.9k nodes84 groups1 image211 KB

バッチモード(/pro)。 Webシェルには、1つまたは複数のツールにまたがる多数の行を一度にレンダリングする、スプレッドシート形式のバッチグリッド(shells/web/src/pro/)も搭載されています。CSV/TSVの相互変換とスプレッドシートからの貼り付け、行ごとのテンプレート/フォーマット/サイズ/単位/DPI、ライブプレビュー付きのブロックエディタサイドパネル、折りたたみ可能なエクスポート列、行ごとの「関連性」タグバー、左側のドラッグハンドルによる行の並べ替え、2段階の削除確認、保存されたバッチセッション、.zipダウンロードを備えています。これが「大量コンテンツ生成」というポジショニングを支える1対多のサーフェスです。

Tauriデスクトップ / モバイル

Tauriによるパッケージ化されたネイティブアプリ(小さなフットプリント)。完全なオフライン利用、CLI依存ツール(PDF Smasher、Font Outliner)のファイルシステムアクセス、カメラアクセスを提供します。2026年半ばのツール強化が予定されています。

CLI

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

デスクトップユーザーは、多くのツールをターミナルから実行できます。CLIシェルは同じエンジンを読み込み、jsdom DOMを作成し、同じレンダーパスを実行してファイルを書き出します。URLモードがトランスポートであり、CLIは別個の実装ではありません。これにより、CLIとGUIの出力が同一であることが保証されます。

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

TUI

npm run tui

CLIに対応するインタラクティブな存在です。ツールの閲覧、入力の記入、プロジェクトの保存、エクスポートをGUIなしで行える、フルスクリーンでキーボード操作を前提としたターミナルアプリ(Ink製)です。そのホストブリッジは、DOMを使わないフォーマット(SVG/EMF/EPS/HTML + テキスト/データ)についてはCLIの実装を再利用し、さらに~/.lolly配下のオンディスク状態と、オプトインのインラインプレビューを追加します。それに加えてブラウザレンダー層を備えています。これは、必要になったときにラスター/PDF/動画とライブURLキャプチャを生成する、スコープ限定のヘッドレスChromium(MCPサーバーがインストールするものと同一)で、Webシェルのビルド済みコピーを動かすことで出力を同一に保ち、そのフォーマットを最初にエクスポートするときにのみ起動します。そのため、url-shot(クロップ + 色の再設定 + ベクターPDF/SVG付き)をはじめ、あらゆるラスター/PDFツールもターミナル上で動作します。詳しくはTUIガイドを参照してください。

どのサーフェスを使っていても、ダッシュボードのCapabilitiesタブは、プラットフォームが実行できると宣言している内容の完全なマップであり、1つのツールも開かずにグループ化された形で読むことができます。


ツールカテゴリ

ツールは、ギャラリーでのグループ化のために、マニフェスト内でcategoryがタグ付けされています。

行はギャラリーのセクション順に並んでいます。utilityセクションは、(将来追加されるものも含め)他のすべてのカテゴリの後、ギャラリー内で常に最後に表示されます - これはオンデバイスの「Offline Utilities」ドロワーです。

カテゴリ計画中
everyoneQR Code Generator, Quote Card, Email Signature, Logo, Wordmark, Audiogram, Battlecards, Sequence Studio, RecordEmployee Image Stationery
designerBrand Lockup, Design, Chart, Darkroom, Filter, Pose Geeko, Multi-Page PDFFont Outliner
eventMeeting Planner, Event Name Badge, Wayfinding Signage, Calendar ICS, Booth StudioEvent Stationery, Bulk Name Badges, Room Agenda Cards
product-CVE Alert, Product Release Announcement, Blog OG Image
utilityStrip Hidden Data, Text Helper, Compress PDF, Convert Image, Convert Font, Redact, Run Web Code, Screen Capture, URL ScreenshotUnit/format converters, more on-device privacy utilities

これらのセルは在庫一覧ではなく例です。どのツールが存在するかは、このページではなく、マウントしたプロファイルのプロパティです。ブランドパックは独自のツールを追加でき、出荷したくないコミュニティツールを除外することもできます。catalog/tools/index.json - マニフェストから生成され、ギャラリーが実際に読み込むレジストリ - が正式なリストです。あるプロファイルが何をマウントしているかを数えるには、ここに書かれた数を信用するのではなく、マニフェスト(ls community//tool.json brands//tools/*/tool.json)を数えてください。(2つのパックに存在するツールidは、勝ったパックから1回だけマウントされます。)

ツールはステータスによっても分類されます: official(ブランド承認済み、透かしなし)、community(外部からの貢献)、experimental(透かし入りエクスポート)。ライブラリの大部分はofficialですが、新しめのスタジオやキャプチャ系ツールは、安定するまでcommunityまたはexperimentalに位置することが多くなっています。どのサーフェスにもバッジが表示されるため、読者は開く前に自分が何を手に取っているかがわかります - そして、上のカテゴリのセルと同様、ステータスごとの所属はここで列挙するには変化が速すぎます。ギャラリーまたは生成されたインデックスから確認してください。

Designは、render.layout: "editor"のフリーキャンバスモードで構築された最初のツールです - テキスト、図形、画像のボックスをドラッグ、リサイズ、回転、スナップできる、UI装飾を排した直接操作サーフェスであり、他のすべてのツールと同じレンダーパスでエクスポートされます。

Strip Hidden Dataは、最初のオンデバイスユーティリティprivacy: "on-device")です。あなたが提供したファイルを受け取り、完全にブラウザ内で処理してクリーンなコピーを返すコンテンツ変換ツールで、アップロードされることも、透かしが入ることも、来歴(プロビナンス)が刻まれることもありません。Text Helperが2つ目です - JSON整形、JWTデコード、Base64、URLエンコード/デコード、SHAハッシュ化など、日常的にウェブサイトへ貼り付ける作業のためのオンデバイスワークベンチです。Compress PDFが3つ目で、画像を再圧縮することでPDFを縮小します。これも完全にオンデバイスです。このマーカーとバッジテキスト「Runs on your device - nothing is uploaded」は、現在、変換系ツール全体をカバーしています: Strip Hidden Data、Text Helper、Compress PDF、Convert Image(HEIC/TIFF/AVIF → WebP/JPG/PNG)、Convert FontRedact(画像、SVG、PDFの特定領域を破壊)、Prompt to Image、そしてプロファイルがマウントしている場合はRebrand a Deck.pptxをその場でリテーマ)です。これは、機密ファイルを単機能のウェブサイトに渡す代わりとなる、プライバシーユーティリティのカテゴリです。

Utilitiesドロワー - すべてのカードが、すでに持っているファイルを変換するツールですsigned by Lollyvector SVG自分で確認するGet the signed file154 paths~40k nodes234 groups802 KBUtilitiesドロワー - すべてのカードが、すでに持っているファイルを変換するツールですsigned by Lollyvector SVG自分で確認するGet the signed file154 paths~40k nodes234 groups803 KB

注: categorystatusは、各tool.jsonからcatalog/tools/index.json(ギャラリーが読み込むレジストリ)に非正規化されています。マニフェストが唯一の正となる情報源であり、インデックスはnpm run build:catalogによって生成され、コミット済みのインデックスがマニフェストとずれている場合、npm run validate:catalogはCIを失敗させます。


アーキテクチャ上のコミットメント

これらの決定は確定済みです。いずれかを変更することは大掛かりな作業であり、コードベース内の他のあらゆる決定を形作っています。

1. 宣言的なツール、命令的な逃げ道付き

ツールは、マニフェスト(tool.json)+ テンプレート(template.html)+ オプションのhooks.jsで構成されます。

入力を宣言するのはマニフェストです。 テンプレートではありません。入力はHandlebarsのトークンから推測されることはありません。マニフェストが契約であり、テンプレートは{{id}}によって名前付き変数を利用します。

Street Mapのコントロールスタック - 都市ドロップダウン、テーマ選択、太さのスライダー、色のトリガー、そのすべてがマニフェストの1行から描画されていますsigned by Lollyvector SVG自分で確認するGet the signed file39 paths~3.4k nodes70 groups2 images50 KBStreet Mapのコントロールスタック - 都市ドロップダウン、テーマ選択、太さのスライダー、色のトリガー、そのすべてがマニフェストの1行から描画されていますsigned by Lollyvector SVG自分で確認するGet the signed file39 paths~3.4k nodes70 groups2 images50 KB

フックはオプションです。 ほとんどのツールは純粋に宣言的で、マニフェスト+テンプレートだけで十分です。計算された値を必要とするツール(QRエンコード、チャートデータの整形)は、名前付きのライフサイクル関数(onInitonInputonFrame - モーションリアクティブなツール向けのフレームごとのライブカメラフック - onLevelbeforeExportafterExportexportFile - Strip Hidden Dataのようなオンデバイスユーティリティが使うファイルイン/ファイルアウトの変換パス - および、独自の深いラスターを持つツール向けのexportStill)を公開するhooks.jsを提供します。ホストは、ケイパビリティブリッジをクロージャースコープとして注入しつつ、new Function('host', …)経由でフックを読み込みます。これはポータビリティの契約であり、セキュリティサンドボックスではありません。フックはページのレルム内で実行され続けるため、ブラウザシェルではwindow/fetch/document到達できてしまいます - host.はサポートされたポータブルなサーフェスであり、強制される境界ではありません。非同期フックの結果には時間制限があり(onInit 5秒、onInput 2秒、beforeExport/afterExport 5秒、exportFile/exportStill 10秒)、遅延した結果は破棄されますが、暴走する同期*フックはプリエンプトできません。したがって、信頼できないサードパーティのフックコードは、Worker分離が実装されるまで安全に実行できません。

これが重要な理由: 宣言的なツールは、開発者でなくても作成できます。もしすべてのツールがWebアプリだったなら、「主力となるテンプレートを作成・保守するスキルが限られている」というリスク上の注記が、恒久的なボトルネックになってしまいます。

2. ツールとアセットはバンドルされたコードではなくデータである

WebアプリとTauriアプリは、起動時に既知のURLからツールとアセットのカタログを取得し、ローカルにキャッシュして、そこにあるものに対して動作します。新しいイベントタイルや季節のアセットを追加するのに、アプリのリリースは不要です。

アセットのバイトはCDNポイズニングを防ぐためにSHA-256でチェックサム化されています。アセットのid + versionがキャッシュの無効化を駆動します。

3. ケイパビリティブリッジがツールから見える唯一のAPIである

ツールは、テンプレート領域の外でDOMに触れることも、fetchを直接呼び出すことも、ファイルシステムを読み取ることも一切ありません。バージョン管理されたhost.*メソッドを呼び出すだけです。この契約の正規の定義はpackages/core/src/host-v1.tsにあります - これはツール作者向けSDKである@lolly-tools/coreであり、サードパーティがエンジンに依存せずにこれを利用して開発できるようにするためのものです。engine/src/bridge/host-v1.tsはそれを型として再エクスポートしたものであり、エンジンおよびシェルのコードは引き続きそのパスから変更なくインポートします:

ブリッジAPI機能
host.profileユーザーの名、メール、顔写真、市区町村など。bindToProfile経由で入力欄を事前入力します。
host.assetsカタログのクエリ、アセットの解決、ホスト提供のピッカーUI。
host.state入力スロットの保存・読み込み。Webでは IndexedDB、Tauriではファイルシステム、CLIではメモリ。
host.clipboardテキストまたは画像をクリップボードに書き込みます(プラットフォームごとのフォールバック付き)。
host.exportレンダーターゲットをラスタライズまたはシリアライズします。experimentalなツールには透かしを適用します。
host.net許可リスト方式のfetch - ツールが"network"ケイパビリティを宣言している場合にのみ利用可能です。(現在出荷されているツールでこれを使用しているものはありません。)

オプションの追加的なサーフェスは、シェルがそれらを提供する場合にのみ現れます。一部はケイパビリティによってゲートされており、ツールが対応するフラグを宣言している場合にのみ公開されます: host.compose(他のツールのレンダーを埋め込む - compose)、host.capture(URL Screenshot用のページキャプチャ - capture)、host.recorder(録画系ツール向けのマイク/カメラ/画面キャプチャ - microphone / camera / screen)。残りは機能検出方式で、シェルが提供できる場合には常に存在し、提供できないシェルに対してはツール側がフォールバックを保持します。

カバー範囲を示すための、主要なサーフェスをいくつか紹介します - Host APIがそのすべてを文書化しており、packages/core/src/host-v1.tsが契約そのものです:

サーフェス導入バージョン追加される機能
host.tokens1.0DTCGデザイントークン - ブランド自身のプリミティブ
host.text1.0HarfBuzz WASMによるテキストからパスへの変換(wasmケイパビリティがこれに依存するツールを示します)
host.media1.4onFrameフックを駆動するライブカメラフレーム。プログレッシブエンハンスメントであり、意図的にcameraフラグでゲートされていません - そのようなツールも通常の静止画ツールとして動作します
host.color1.40知覚的なカラー演算:ΔEOK、WCAG + APCAコントラスト、OKLabランプ、クラスブレーク、カテゴリカルパレット、ハーモニー配色(1.60)、CSS Color 4によるミキシングとグラデーションベイク(1.68)。純粋かつ同期的で、シェルは何かを独自実装するのではなくエンジンのmakeColorApi()をアタッチするだけなので、ずれが生じません
host.images1.60デバイス上でのバイトのデコード/リサイズ/再エンコード - 変換パス(HEIC → JPEG、WebPへの圧縮、ダウンスケール)。Webシェルではレイジーファサードとして提供されるため、HEICデコーダーがブートチャンクに含まれることはありません
host.geom1.64正確なベクタージオメトリ:パスのブーリアン演算、オフセット、ストローク→フィル変換、スプラインの低次化、単純化、ヒットテスト。こちらも純粋・同期的でエンジンからアタッチされ(makeGeomApi())、失敗は例外を投げず戻り値として返されます

残りも同じルールに従っており、それらと並んで文書化されています: オンデバイスでのドキュメント編集のためのpdf(1.8)とpptx(1.58)、クリップ解析とオンデバイスTTS/文字起こしのためのaudio(1.71)とspeech(1.96)、MilkDropプレースホルダー契約のためのviz(1.72)、ディープビットおよびレイヤー化ビットマップ出力のためのcodec(1.100)とlayers(1.102)、オンデバイスモデルのためのupscale(1.101)とmatte(1.103)、独自のピクセル処理を行うフックのためのraster(1.105)、エクスポートセーフな矢印のためのconnectors(1.106)、完成したバイト列に署名するためのc2pa(1.85)。数は増えていきますが、ルールは変わりません。

宣言可能なケイパビリティは次のとおりです: networkfilesystemclipboardcameramicrophonescreenffmpegwasmcapturecompose。(1.54で追加されたscreenは、host.recorder経由の画面キャプチャで、ユーザーがブラウザネイティブのUIで画面/ウィンドウ/タブを選択します。ツール自身が指定したURLをラスタライズするcaptureとは異なります。)

同じツールがブラウザ、Tauri、ヘッドレスCLIで動作するのは、各シェルがこのインターフェースを実装しているためです - ツール自身は、自分がどのシェルの中にいるかを一切知りません。

ブリッジはバージョン管理されています。メソッドの追加はマイナーバージョンです。削除やシグネチャの変更はメジャーバージョンアップとなります。v2がリリースされても、v1は動作し続けなければなりません。

4. アセットIDは永久に不変である

suse/logo/primaryは契約です。一度公開されると:

これにより、保存されたツールの状態やURLで共有されたリンクは、何年経っても有効なままです。

5. URLモードはファーストクラスである

すべての入力は、URLパラメータとして表現できなければなりません:

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

そのリンク単体で、他に何もなくても、完成したアセットになりますsigned by Lollyvector SVG自分で確認するGet the signed file17 paths~2.0k nodes39 groups24 KBそのリンク単体で、他に何もなくても、完成したアセットになりますsigned by Lollyvector SVG自分で確認するGet the signed file17 paths~2.0k nodes39 groups24 KB

CLIモードは、別のトランスポート上で動くURLモードです - CLIシェルはargvからURL状態オブジェクトを構築し、同じエンジンパイプラインを実行します。レンダーパスは1つしかありません。CLIは別個の実装ではないため、GUIからずれることはありません。

url-mode.tsが往復変換(パースとシリアライズ)を処理します。予約済みパラメータの集合は、入力としてツールに渡されることは決してありません: 出力コントロール(formatexportcopyfilenamewidth/wheight/hunitdpi)、印刷と来歴のダイヤル(bleedmarksprofilepasswordc2paimprintdurablemetahdrdepthcuts)、状態キャリア(template、「Shortest link」のパックされたトークンであるz、そしてパスワードで暗号化された同等物であるzx)です。engine/src/url-mode.ts内のRESERVED集合が正であり、テストによって固定されています。URL Modeがそのすべて、ここに列挙されていないわずかな項目も含めて文書化しています。URLモードでのアセット入力は、そのidによってシリアライズされます。ランタイムはハイドレーション前にhost.assets.get()経由でそれらを解決します。width/heightunit(デフォルトはpx、他にmm/cm/in/pt/pcも可)での値です。物理単位を使う場合、dpiがラスター解像度を設定します。これらはキャンバスのドキュメントサイズを設定し、エクスポート寸法パネルを事前入力します。

すべての入力がリンクの中を伝わるため、パラメータを変えれば、それは別の完成アセットになります。このパレット全体は、1つのシード色、1つのハーモニー、1つのステップ数だけでできています:

4色相にわたる9段階、すべてリンクに含まれる単一のシード色から生成されていますsigned by Lollyvector SVG自分で確認するGet the signed file10 groups24 KB4色相にわたる9段階、すべてリンクに含まれる単一のシード色から生成されていますsigned by Lollyvector SVG自分で確認するGet the signed file10 groups24 KB

6. ストレージは直接ではなくブリッジ経由

Webシェル: IndexedDB。Tauri: ファイルシステム。CLI: インメモリ。ツールが目にするのは host.state.save(slot, data)host.state.load(slot) のみです。localStorage は使用されません - 容量が小さすぎ、blobを保持できないためです。

ユーザーはツールごとに複数の名前付き編集スロットを保存し、後で各セッションに戻ることができます。アカウント作成は不要で、状態はデバイス単位です。ブリッジが唯一の接点であるため、そのデバイス単位の状態も可搬です。shells/web/src/data-transfer.tshost.profile/host.state/host.assets を通じてすべてを読み出し、単一の lolly-backup zipにまとめます。これは他の環境でもインポートでき、サーバーを必要としない「新しいデバイスへの移行」のオフライン向けの答えです(完全な仕様は docs/data-transfer.md を参照)。SUSE ID連携(マルチデバイス同期)はこの上に構築される今後のマイルストーンです。

7. 成熟度タグが「ブランド承認済み」というリスクに設計上答える

すべてのツールはマニフェストで status: official | community | experimental を宣言します。ギャラリーはステータスでソートされます。実験的なツールは自動的にエクスポートに透かしが入ります - 透かしは host.export.render によって適用されるため、公式でないツール作成者がオプトアウトすることはできません。

これは、任意のツールを使うことがブランド承認を意味してしまうという認識上のリスクへの構造的な答えです。プロセス面の答え(レビューキュー、SUSE IDによるゲーティング)はこの上に重ねられます。

8. ツール入力はマニフェストを介して型指定される(アセットも含む)

入力は type を宣言します: textlongtextnumberbooleancolorselectassetdatetimedatetime-localurlblocksvectortablefile。ホストはマニフェストから型ごとに汎用コントロールをレンダリングします - ツール側はコントロールのコードを一切書きません。(ユーザーのプロフィールからの事前入力は型ではなく、どの入力も bindToProfile を持てます。)このうち3つは他より重要です:

9. テンプレートはロジックレス(EJSではなくHandlebars)

HandlebarsはEJSよりも意図的に選ばれました:

ロジックは hooks.js に置かれ、明示的でレビュー可能です。利用できるHandlebarsヘルパー: {{default}}{{upper}}{{lower}}{{eq}}{{markdown}}{{asset ref}}{{asset ref "property"}}(加えて、姉妹となる .ics/.vcf/.csv テンプレートで使われるデータフォーマットヘルパー icsStamp/rfcText/csvCell)。

10. ツールはツールを合成する

あるツールは、ツール間のインポートなしに別のツールのレンダリングを埋め込むことができます - 合成はエンジンによって解決され、ツールのコードによっては行われません。表面は2つあります:

任意のツールのレンダリングを合成できます: SVG の子は、親がSVGまたはPDFにエクスポートする際は真のベクターのままとなり、PNGの場合はくっきりとラスタライズされます。PNG/JPG/WEBP の子は画像として埋め込まれます。compose ケーパビリティが必要です。合成された子は中間生成物です - 透かしやプロベナンスのスタンプが入ることは決してなく、合成は段階的に劣化します: 子をレンダリングできないシェルは単にそのスロットを省略し、親は問題なくレンダリングされます。


あえてやらないと決めたこと


ライフサイクル、始めから終わりまで

ユーザーが lolly.tools/#/tool/qr-code?url=https://suse.com&ecl=H を開きます:

  1. 起動。 WebシェルがIndexedDBを開き、ケーパビリティブリッジを構築し、ツールとアセットのカタログを同期します(オフライン時はキャッシュから読み込みます)。
  2. ルーティング。 URLハッシュ → tool ビュー、qr-code とURLパラメータが抽出されます。
  3. 読み込み。 loadTool('qr-code', fetchFile)tool.json をフェッチし、JSON Schemaに対して検証し、template.htmlstyles.csshooks.js のソースをフェッチします。
  4. URL状態のパース。 parseUrlState がURLパラメータを初期入力値に変換します。アセット参照(?logo=suse/logo/primary)は軽量な { id, _unresolved: true } オブジェクトとしてパースされます。
  5. ランタイム。 createRuntime(tool, host, initialValues) が入力モデルを構築し(プロフィールデータ、デフォルト値、初期値をマージ)、host.assets.get() 経由でアセット参照を解決し、フック(クロージャスコープの host、サンドボックス化はされていません)を読み込み、hooks.onInit を呼び出します。
  6. レンダリング。 シェルはランタイムを購読し、状態が変化するたびに { model, hydrated } を受け取ります。モデルから入力コントロールをレンダリングし、ハイドレートされたテンプレートHTMLを #tool-canvas に書き込みます。
  7. 操作。 ユーザーが入力欄に入力する → runtime.setInput(id, value) → 制約が適用される → hooks.onInput が呼ばれる → 再ハイドレート → 再レンダリング。キャンバスはライブで更新されます。
  8. エクスポート。 ユーザーがダウンロード(PNG)をクリック → runtime.export(canvasNode, 'png')host.export.render(dom-to-image-more経由でラスタライズ。SVG/PDFは専用のDOMウォーキング・ベクタライザーを通ります) → blob → host.export.download。ツールがオプトインできるフォーマットの範囲は広く、schemas/tool.schema.jsonrender.formats enumがその権威です - ラスター画像とfloatラスター、ベクターとカットファイル、印刷/CMYK、モーション、編集可能なドキュメント(pptxdocxodt)、パレットとデータ/テキスト出力、音声とフォントファイル。URL Mode がすべてのidと生成物を列挙しています。音声もこのenumに他と同様に含まれます(wavmp3m4aopus。オーディオグラムとレコーディング系ツールが宣言します)。別途、レコーディングツールの render.capture モードは host.recorder を駆動し、その録画結果はブラウザが録画したコンテナ形式のまま完成したBlobとして届きます。(render.export: false を設定したツール - 例えばColor Palette、Countdown Timer、Strip Hidden Data、Text Helper、Compress PDF - はダウンロード/フォーマット/寸法コントロールを非表示にします。)物理単位はここでフォーマットごとに変換されます(PDF → 真のページポイント、ラスター → DPIに応じたピクセル、pHYs チャンク付き)。作者/プロベナンスのメタデータ(作者、ツール、ソース - engine/src/metadata.ts によって構築)はフォーマットごとに埋め込まれます: PNG iTXt、JPEG EXIF、PDF情報辞書、SVG <metadata>、GIFコメント。実験的なツールにはツール自身ではなくホストによって透かしが挿入されます。

?options が開くエクスポートパネル: ファイル名とフォーマットの組み合わせ、出力サイズ、ファイルを書き出すコントロールsigned by Lollyvector SVG自分で確認するGet the signed file49 paths~3.3k nodes61 groups3 images74 KB?options が開くエクスポートパネル: ファイル名とフォーマットの組み合わせ、出力サイズ、ファイルを書き出すコントロールsigned by Lollyvector SVG自分で確認するGet the signed file49 paths~3.3k nodes61 groups3 images74 KB

Tauriでも同じライフサイクル。CLIでも同じライフサイクル - jsdomがヘッドレスDOMを提供し、出力はファイルまたはstdoutに送られます。


オープンソースのステータス

コードはMPL-2.0です。 engine/shells/services/schemas/docs/MPL-2.0のもとでオープンソース化されています - ブランドツーリングのためのベンダー非依存なスキャフォールディングプラットフォームであり、出荷可能な各ユニットはgithub.com/lolly-tools配下の独自のリポジトリに置かれています。

ツールのコンテンツはブランドパックとして提供され、それぞれ独自の条件を持ちます(パックのNOTICE.mdを参照)。community/は公開のlolly-toolsリポジトリであり、そのブランド非依存のツールもMPL-2.0です。brands/suse/は非公開のsuse-lollyパックです: SUSEのツールとSUSEカタログで、ライセンス供与されたPremiumBeatの音楽を含めSUSEの専有物です。brands/lolly-start/は、このリポジトリが所有する白紙のスターターブランドです。フォントはパック内にSIL Open Font License 1.1のもとで同梱され、SUSEパックにはSUSEおよびSUSE Monoの書体が含まれます。

リポジトリルートのtools/catalog/はgitignoreされたビューです: プロファイルがこれらをcommunity/と有効なブランドパックから組み立てるため、すべてのスクリプトとシェルはこの2つのパスを読み取り、パックを直接読み取ることは決してありません。

この分割は強制されており - engine/からツールコンテンツへのクロスインポートは存在しません - プラットフォームとコンテンツの境界はクリーンに保たれます。


エンジンが終わりホストが始まるところ

純粋なデータとHandlebarsで表現できるなら → エンジン。 DOM、ファイルシステム、ネットワーク、あるいはブラウザ/OSのAPIに触れるなら → ホスト

この線引きは意図的に明確にされています。エンジンはオープンソースの部分です。SUSE、特定のプラットフォーム、実行環境について知っているものはすべてその外側に置かれます。

さらに詳しいレベルについては、engine/README.md がすべてのエンジンモジュールとそれぞれの責務を列挙しており、脅威モデルと信頼境界 は同じ線がどこで信頼境界を兼ねているかを記録しています。