Genel Bakış

signed by Lollyoverview.htmlHTMLAI generatedgenerated by ClaudeKendin kontrol etGet the signed filepixels, not shapes12 KB

Lolly Simgesi - Büyük yeşil ve beyaz lolipop şeker

Bu belge, Lolly platformunun amacını, yapısını ve mimari kararlarını kayıt altına alır. Hem ürün vizyonunu hem de kod tabanının mevcut durumunu yansıtır.

Durum: Lolly, tamamlanmamış kapalı bir pilot aşamasındaki bir dahili prototiptir. Motor deterministik ve dahili olarak tutarlıdır, ancak ürün henüz erken aşamadadır - SUSE bir numaralı müşteridir - ve kriptografi ile dosya ayrıştırma motorları şu anda SUSE'nin katı altyapı sağlamlaştırma sürecinden geçmektedir, kurumsal ölçeğe hazırlanmaktadır (bu konuda gerçekten iyiyiz). Aşağıdaki mimariyi bitmiş, sertifikalı bir ürün olarak değil, test altındaki tasarım niyeti olarak oku. Pilotun nasıl yürütüldüğü ve ölçüldüğü için bkz. Benimseme ve Yönetişim.

Bu sayfa nasıl okunur. İki tür içerik taşır, sırayla. İlk yarısı bunun neden var olduğudur: sorun, konumlandırma ve tek bir varlığın geçtiği yaşam döngüsü. Büyük resim bölümünden itibaren ise katmanların nasıl bir araya geldiğidir: motor/kabuk/paket ayrımını, depo düzenini, teslimat hedeflerini ve platforma yapılan her değişikliği kısıtlayan taahhütleri kapsayan, katkıda bulunanlar için mimari belgedir. Eğer buraya ürünü anlamak için değil de kod tabanını değiştirmek için geldiysen, büyük resimden başla.

Bu sayfadan daha derine giden iki tamamlayıcı belge var. Depodaki engine/README.md, motorun modül modül haritasıdır; her modülün ne ayrıştırdığı veya yazdığını gösteren üretilmiş bir tablo içerir. Tehdit Modeli ve Güven Sınırları aynı mimarinin güven sınırları olarak okunmuş halidir ve motorun neyi güvenilmez saydığına dair her sorunun doğru sayfasıdır.


Bunun neden var olduğu

Ekipler tekrar eden bir sorunla karşılaşır: her seferinde yetenekli ellere ihtiyaç duyulmayacak kadar öngörülebilir, ama korkuluklar olmadan devredilemeyecek kadar kalite hassasiyeti yüksek, tekrarlanabilir yaratıcı ve içerik işleri. Sonuç ya yavaş verimdir (uzman darboğazı), ya tutarsızlıktır (insanların ellerindeki her aracı kullanması) ya da satıcı bağımlılığıdır (şablonlarını kontrol eden bir SaaS DAM).

Bu platform bunun doğrudan cevabıdır:

Ölçekte programatik yaratıcılık ve içerik - kuralların merkezi kontrol altında olduğu, çalışanlar, tedarikçiler ve iş ortakları için sıfır emekle varlık üretimi.

Lolly bir tasarım sisteminin icat edildiği yer değil - üretildiği yerdir. Onu tasarım için bir otomat gibi düşün: bir seçim yap, bir sonuç al. Her seferinde. Motor, önündeki donanımın her biçimde üretebileceği en yüksek kaliteyi hedefler ve aynı motor, dağıtıldığı her yüzeyde aynı dosyayı üretir.

Sonuç bolluktur: her etkinliğin doğru tabelası vardır, her CVE uyarısı kurumsal stille eşleşir, her etiket temiz basılır, her e-posta imzası günceldir - hepsi bir tasarım talebi olmadan. Platform, tekrar eden, operasyonelleştirilmiş yaratıcı işleri yönetir. Bilinçli olarak özel bir yaratıcı araç değildir - tasarımcılar amiral gemisi işleri hâlâ kendi ellerinde tutar.

Olasılıksal olarak yenilik yap, deterministik olarak ölçeklendir

Yaratıcı bir iş akışında yapay zeka hakkındaki her tartışma aynı soruda tıkanır: bunun hangi kısmı makinenin işi? Bu, cevabı çoktan verilmiş eski bir sorudur. Yazıcılar ve tezhipçiler zaten iki araç arasında çalışıyordu - hiçbir şeyin sabit olmadığı, her şeyin denenebildiği gevşek eskiz ve tam da bir taahhütte bulunduğu için ürkütücü olan baskı makinesi. Sanat, eskizlerde gerçekleşiyordu. Baskı ise onu herkese ulaştıran araçtı. Kimse ikisini birbirine karıştırmadı ve ikisi de ilerlemeye devam etti - yeni mürekkepler, yeni yazı karakterleri, yeni baskı makineleri - her biri, hizmet ettiği zanaat ve niyetle uyum içinde gelişerek.

Lolly aynı çizgiyi çizer. Olasılıksal olarak keşfet: bir model, bir tasarımcı, kaba bir fikir, kimsenin planlamadığı bir yere giden bir prompt. Sonra deterministik olarak ölçeklendir - on bin çıktıya ulaşan şey bir araçtır ve bir araç, okuyabildiğin girdilerden her seferinde aynı şekilde render edilir. Keşif özgür kalır, çünkü aşağı akıştaki hiçbir şey onun iki kez aynı şekilde sonuçlanmasına bağlı değildir. Çıktı güven kazanır, çünkü bir tahmin değildir. Yapay zeka deneyselliğini öngörülebilir, yeniden üretilebilir sonuçlara dönüştürmek yeni bir disiplin değildir; basılı işi baştan güvenilir kılan iş bölümünün ta kendisidir.

Yaratıcı sürece güven, titizlikle ölçeklendir.

Alternatiflere karşı

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

Ağustos 2026'da araştırılan, günümüzün yaratıcı araçları arasındaki yetenek eksiksizliği. Puanlama: 0 yok, 25 iş bitirici düzey, 50 gerçek ama kısıtlı veya kısmi, 75 çekincelerle güçlü, 100 temel yetkinlik.

signed by Lollypositioning-comparison.htmlHTMLAI generatedgenerated by ClaudeKendin kontrol etGet the signed filepixels, not shapes38 KB

Aradaki fark açık: bugün piyasaya sürülen hiçbir şey bize kısıtlar öncelikli, çevrimdışı çalışabilen, düşük beceri gerektiren, dahili olarak erişilebilir bir çıktı vermiyor. Lolly, renklerin, tipografinin ve varlıkların marka geneline uyduğu açık bir tuval bile içerir - Design - böylece serbest düzenleme kısıtlar öncelikli kalır. Olmadığı şey kısıtsız bir tasarım paketidir: tasarımcılar özel amiral gemisi işleri için Illustrator ve Figma kullanmaya devam eder. Permütasyonlar bu araçla bir araya getirilebilir.

Kütüphanedeki her araç birer kart olarak, kategoriye göre gruplanmış, böylece bir üretici birini seçip başlayabilirsigned by Lollyvector SVGKendin kontrol etGet the signed file281 paths~38k nodes443 groups6 images2.269 KBKütüphanedeki her araç birer kart olarak, kategoriye göre gruplanmış, böylece bir üretici birini seçip başlayabilirsigned by Lollyvector SVGKendin kontrol etGet the signed file281 paths~38k nodes443 groups6 images2.270 KB

Şunun için kullan: Operasyonelleştirilmiş yaratıcı varlıkların hızlı üretimi - etkinlik döşemeleri, isim kartları, imzalar, CVE uyarıları, QR kodları, sosyal medya kartları, sevkiyat etiketleri, yapılandırılmış raporlar.

Şunun için kullanma: Özel amiral gemisi içerik.


Bir kampanyanın yaşam döngüsü

Lolly'nin ne olduğunu görmenin en net yolu bir özellik listesi değil - tek bir varlığın elden ele geçişini takip etmektir. Yerelleştirilmiş bir kampanya kartının kuruluş içinde nasıl ilerlediğini izle:

  1. Yaratıcı kuralları belirler. Bir tasarımcı, markanın tipografi ve renk değişkenlerini sabit kodlayarak Design aracında temel şablonu oluşturur. Tek bir kart yapmıyorlar - bunu bir daha asla elle yerelleştirmek zorunda kalmamak için bir kez temel işi yapıyorlar.
  2. Geliştirici onu ölçeklendirir. Aynı şablon, CLI aracılığıyla gece çalışan bir hatta bağlanır, böylece yeni bir grafik veya yeni bir dil varyantı otomatik olarak üretilir - hiçbir tasarımcı dosyayı yeniden açmaz.
  3. Üretici onu sadece kullanır. Bir uçakta çevrimdışı olan bir satış temsilcisi aynı aracı açar ve bir müşteri toplantısı için markaya tamamen uygun bir sunum üretir. Tasarım becerisi yok, ağ bağlantısı yok, bekleme yok.

İkinci adımdaki "yeni grafik", kimsenin bir tasarım dosyası açmadan, bir veri dizesi ve bir avuç parametreden üretilen, tam olarak buna benzer bir render'dır:

Başlıklı yığılmış bir alan grafiği; üç serisi soğuk bir palette bantlanmış, eksenler, açıklama ve başlık hepsi elle değil şablon tarafından yerleştirilmişsigned by Lollyvector SVGKendin kontrol etGet the signed file15 paths~1.3k nodes4 groups21 KBBaşlıklı yığılmış bir alan grafiği; üç serisi soğuk bir palette bantlanmış, eksenler, açıklama ve başlık hepsi elle değil şablon tarafından yerleştirilmişsigned by Lollyvector SVGKendin kontrol etGet the signed file15 paths~1.3k nodes4 groups21 KB

Mesele Lolly'nin tasarımcılar için iyi ve geliştiriciler için iyi ve satış için iyi olması değil, her biri kendi başına. Bu bir bayrak yarışı: yaratıcının ilk işi geliştirici tarafından ölçeklendirilir, bu da üreticiyi güçlendirir. Uçaktaki teknik olmayan temsilci için zahmetsiz deneyim, ancak tasarımcının belirlediği ve geliştiricinin devreye aldığı titizlik sayesinde mümkündür.

İşte güç çarpanı bu. Lolly, ayrı roller için ayrı araçların bulunduğu bir çekmece değildir - her rolün dokunduğu tek bir deterministik varlık yaşam döngüsüdür ve geçtiği her el, bir öncekinin değerini katlar.


Bir onay, on bin varlık

Onay dosyada değil araçta yaşadığı için (bkz. Lolly nasıl karşılaştırılır), ölçek bir inceleme sorunu olmaktan çıkar. Yerelleştirilmiş bir sosyal medya kartı aracını bir kez onayla, ardından bir e-tablodan 12 dilde 10.000 varlık üret - ve hiçbiri hukuk veya markadan yeni bir uyum kontrolü gerektirmez, çünkü hepsinin geldiği şablon zaten onaylanmıştı.

Aynı deterministik araç bu ölçeğe üç yoldan ulaşır, hepsi aynı, önceden onaylanmış çıktıyı üretir:

Yeni bir kurulumda toplu mod: bir araç bekleyen boş bir satır, henüz hiçbir veri gelmeden yerinde duran tüm hesap tablosu yüzeyi ve Render düğmesiyle birliktesigned by Lollyvector SVGKendin kontrol etGet the signed file348 paths~77k nodes537 groups7 images3.100 KBYeni bir kurulumda toplu mod: bir araç bekleyen boş bir satır, henüz hiçbir veri gelmeden yerinde duran tüm hesap tablosu yüzeyi ve Render düğmesiyle birliktesigned by Lollyvector SVGKendin kontrol etGet the signed file348 paths~77k nodes544 groups7 images3.103 KB

Bir tasarımcı tarafından bir kez sabitlenmiş tek bir marka kısıtları kümesi; aynı önceden onaylanmış çıktıya giden üç yol - ve makine yolu hepsinden daha uzağa ölçeklenir, çünkü dosyalar gelirken hiç yorulmaz.


Büyük resim: katmanlar nasıl bir araya gelir

Buradan aşağısı tamamen mimaridir. Diyagram, tüm sistemi tek bir görünümde gösterir: en üstte veri olan araçlar, ortada hiçbir platform hakkında bir şey bilmeyen motor, onun altında tek bir sözleşmeyi uygulayan kabuklar ve içeriği sağlayan kataloglar.

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

Depo düzeni

İçerik paketler olarak bağlanır: community/, docs/, her shells/, her ikisi de services/ ve brands/suse her biri kendi deposudur, bu deponun git alt modülleri olarak checkout edilir. Üst depo engine/, schemas/, scripts/, tests/, api/, brands/lolly-start/ ve profiles.json'a sahiptir. Checkout komutu ve depolar arası iş akışı için bkz. Build Guide » Kaynağı Alma.

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

Platform teslimat modeli

Platform, birden çok yüzeyde çalışır - web PWA, Tauri masaüstü/mobil, betiklenebilir CLI ve etkileşimli TUI. Hepsi aynı motoru ve aynı araç dosyalarını kullanır.

Web (PWA) - birincil dağıtım

SUSE kontrolündeki bir URL'de barındırılır. Service worker araçları ve varlıkları önbelleğe aldıktan sonra çevrimdışı çalışır. Çoğu çalışan, tedarikçi ve iş ortağının platformu kullanacağı yer burasıdır. Hesap gerekmez - durum, cihaz başına IndexedDB'de saklanır.

Web kabuğu tek bir düzenden duyarlıdır. Masaüstünde bir araç, imleç etrafında yakınlaştırmak için trackpad-yerel tuval gezinmesine (Cmd/Ctrl-tekerlek veya sıkıştırma, kaydırmak için Boşluk veya orta tuşla sürükleme, 0/1/+/ tuşları ve bir Fit/% HUD'u) sahip bir önizleme sahnesinin yanında yeniden boyutlandırılabilir bir kontroller kenar çubuğudur. Mobilde (≤640px) kontroller, statik tam ekran bir önizlemenin üzerinde peek/half/full arasında yerleşen (dokunma değiştirir) bir sürükleme tutamacına sahip üstten sabitlenmiş bir sayfaya dönüşür ve yüzen bir Render düğmesi, alt sayfa açılır penceresinde Export kontrollerini açar. Dokunma, önizlemede sıkıştırarak yakınlaştırma ve sürükleyerek kaydırma alır. Render yolu ve dışa aktarma kontrolleri her ikisinde de aynıdır - yalnızca arayüz kabuğu yeniden akar.

Masaüstü bölünmüş görünüm - solda manifestten oluşturulan kontroller, sağda canlı tuvalsigned by Lollyvector SVGKendin kontrol etGet the signed file5 paths989 nodes11 groups14 KBMasaüstü bölünmüş görünüm - solda manifestten oluşturulan kontroller, sağda canlı tuvalsigned by Lollyvector SVGKendin kontrol etGet the signed file5 paths989 nodes11 groups14 KB

Aynı araç telefon genişliğinde, korunması gereken ikinci bir düzen olmadan: kontroller üstte bir sayfaya dönüşür, önizleme tüm ekranı kaplar ve render hapı üzerinde yüzer.

430 piksel genişliğinde bir ekranda bir audiogram - üstte kontrol sayfası, altta bitmiş kare grafik ve yüzen render hapısigned by Lollyvector SVGKendin kontrol etGet the signed file47 paths~1.9k nodes84 groups1 image212 KB430 piksel genişliğinde bir ekranda bir audiogram - üstte kontrol sayfası, altta bitmiş kare grafik ve yüzen render hapısigned by Lollyvector SVGKendin kontrol etGet the signed file47 paths~1.9k nodes84 groups1 image211 KB

Toplu mod (/pro). Web kabuğu ayrıca bir veya birçok araç genelinde tek seferde birçok satır render eden, tablo tarzı bir toplu ızgara da (shells/web/src/pro/) sunar. CSV/TSV gidiş-dönüşü ve tablodan yapıştırma, satır başına şablon/format/boyut/birim/dpi, canlı önizlemeli bir bloklar-editörü yan paneli, daraltılabilir dışa aktarma sütunları, satır başına bir "ilgililik" etiket çubuğu, soldan sürükle-tutamaçlı satır yeniden sıralama, iki adımlı silme onayı, kaydedilmiş toplu iş oturumları ve bir .zip indirmesi sunar. "Kitlesel içerik üretimi" konumlandırmasının arkasındaki bire-çok yüzey budur.

Tauri masaüstü / mobil

Paketlenmiş yerel uygulama (Tauri sayesinde küçük ayak izi). Tam çevrimdışı kullanılabilirlik, CLI'ye bağımlı araçlar (PDF Smasher, Font Outliner) için dosya sistemi erişimi ve kamera erişimi sağlar. 2026 ortası için araç geliştirmesi planlanıyor.

CLI

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

Masaüstü kullanıcıları birçok aracı terminalden çalıştırabilir. CLI kabuğu aynı motoru yükler, bir jsdom DOM'u oluşturur, aynı render yolunu çalıştırır ve dosyayı yazar. URL modu taşıma katmanıdır - CLI ayrı bir uygulama değildir. Bu, CLI ve GUI çıktılarının aynı olmasını garanti eder.

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'nin etkileşimli karşılığı: araçlara göz atmak, girdileri doldurmak, projeleri kaydetmek ve dışa aktarmak için - hepsi bir GUI olmadan - tam ekran, klavye öncelikli bir terminal uygulaması (Ink üzerine kurulu). Host köprüsü, DOM'suz formatlar (SVG/EMF/EPS/HTML + metin/veri) için CLI'nin uygulamasını yeniden kullanır ve ~/.lolly altında disk üzerinde durum ile isteğe bağlı satır içi önizleme ekler. Bunun ötesinde bir tarayıcı render katmanına sahiptir: talep üzerine raster/PDF/video ve canlı-URL yakalama üreten, kapsamlandırılmış bir başsız Chromium (MCP sunucusunun kurduğuyla aynısı) - çıktının aynı olması için web kabuğunun derlenmiş bir kopyasını çalıştırır ve yalnızca böyle bir formatı ilk dışa aktardığında başlar. Böylece url-shot (kırpma + yeniden renklendirme + vektör PDF/SVG ile) ve her raster/pdf aracı terminalde de çalışır. Bkz. TUI kılavuzu.

Hangi yüzeyde olursan ol, panonun Yetenekler sekmesi, platformun yapabileceğini beyan ettiği her şeyin tek bir aracı bile açmadan okunabilir, gruplanmış tam haritasıdır.


Araç kategorileri

Araçlar, galeri gruplaması için manifestlerinde bir category ile etiketlenir.

Satırlar galeri bölüm sırasına göre listelenir. utility bölümü her zaman en son render edilir (gelecektekiler dahil diğer her kategoriden sonra) - bu, cihaz üzerinde çalışan "Çevrimdışı Yardımcı Programlar" çekmecesidir.

KategoriÖrneklerPlanlanan
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 ScreenshotBirim/format dönüştürücüleri, cihaz üzerinde daha fazla gizlilik aracı

Bu hücreler örneklerdir, envanter değil. Hangi araçların var olduğu bu sayfanın değil, mount ettiğin profilin bir özelliğidir: bir marka paketi kendi araçlarını ekler ve göndermek istemediği bir topluluk aracını hariç tutabilir. catalog/tools/index.json - manifestlerden üretilen ve galerinin fiilen okuduğu kayıt defteri - yetkili listedir; bir profilin ne mount ettiğini saymak için, burada yazılı bir sayıya güvenmek yerine manifestleri say (ls community//tool.json brands//tools/*/tool.json). (İki pakette bulunan bir araç id'si, kazanan paketten bir kez mount edilir.)

Araçlar ayrıca duruma göre sınıflandırılır: official (marka onaylı, filigransız), community (dış katkı), experimental (filigranlı dışa aktarımlar). Kütüphanenin çoğu officialdır; daha yeni stüdyolar ve yakalama araçları otururken community veya experimental durumunda kalma eğilimindedir. Her yüzey rozeti gösterir, böylece okuyucu bir şeyi açmadan önce neyi aldığını bilir - ve yukarıdaki kategori hücreleri gibi, duruma göre üyelik de burada saymak için çok hızlı değişir. Bunu galeriden veya üretilen dizinden oku.

Design, render.layout: "editor" serbest tuval modu üzerine kurulan ilk araçtır - metin, şekil ve görsel kutularını sürükleyip boyutlandırdığın, döndürdüğün ve hizaladığın çerçevesiz, doğrudan-manipülasyonlu bir yüzey; ardından diğer her araçla aynı render yolundan dışa aktarır.

Strip Hidden Data, ilk cihaz üzerinde çalışan yardımcı programdır (privacy: "on-device"): senin sağladığın bir dosyayı tamamen tarayıcıda işleyip temiz bir kopyasını geri veren bir içerik dönüştürme aracı - asla yüklenmez, asla filigranlanmaz, hiçbir köken damgalanmaz. Text Helper ikincisidir - günlük siteye-yapıştır işleri için cihaz üzerinde bir çalışma tezgahı (JSON format, JWT çözme, Base64, URL kodlama/çözme, SHA hashleme). Compress PDF üçüncüsüdür - bir PDF'i görsellerini yeniden sıkıştırarak küçültür, yine tamamen cihaz üzerinde. İşaretçi ve rozet metni "Cihazında çalışır - hiçbir şey yüklenmez" artık tüm dönüştürme setini kapsıyor: Strip Hidden Data, Text Helper, Compress PDF, Convert Image (HEIC/TIFF/AVIF → WebP/JPG/PNG), Convert Font, Redact (bir görselin, SVG'nin veya PDF'in bölgelerini yok et), Prompt to Image ve profilin mount ettiği yerde Rebrand a Deck (bir .pptx'i yerinde yeniden temalandır). Bu, gizli dosyaları tek amaçlı sitelere teslim etmenin yerini alan bir gizlilik-yardımcı-program kategorisidir.

Utilities çekmecesi, her kartın zaten sahip olduğun bir dosyayı dönüştüren bir araç olduğu yersigned by Lollyvector SVGKendin kontrol etGet the signed file154 paths~40k nodes234 groups802 KBUtilities çekmecesi, her kartın zaten sahip olduğun bir dosyayı dönüştüren bir araç olduğu yersigned by Lollyvector SVGKendin kontrol etGet the signed file154 paths~40k nodes234 groups803 KB

Not: category ve status, her tool.jsondan catalog/tools/index.jsona (galerinin okuduğu kayıt defteri) denormalize edilir. Manifest tek doğru kaynaktır - dizin npm run build:catalog ile üretilir ve commit edilmiş dizin manifestlerden saparsa npm run validate:catalog CI'yi başarısız kılar.


Mimari taahhütler

Bu kararlar netleşmiştir. Herhangi birini değiştirmek büyük bir girişimdir - bunlar kod tabanındaki her diğer kararı şekillendirir.

1. Deklaratif araçlar, buyurgan bir kaçış kapısıyla

Bir araç bir manifest (tool.json) + bir şablon (template.html) + isteğe bağlı hooks.jsdir.

Manifest girdileri bildirir. Şablon değil. Girdiler Handlebars token'larından çıkarılmaz. Manifest sözleşmedir; şablon adlandırılmış değişkenleri {{id}} ile tüketir.

Street Map'in kontrol yığını - bir şehir açılır menüsü, bir tema seçimi, kalınlık kaydırıcıları ve renk tetikleyicileri, her biri bir manifest satırından çizilmişsigned by Lollyvector SVGKendin kontrol etGet the signed file39 paths~3.4k nodes70 groups2 images50 KBStreet Map'in kontrol yığını - bir şehir açılır menüsü, bir tema seçimi, kalınlık kaydırıcıları ve renk tetikleyicileri, her biri bir manifest satırından çizilmişsigned by Lollyvector SVGKendin kontrol etGet the signed file39 paths~3.4k nodes70 groups2 images50 KB

Hook'lar isteğe bağlıdır. Çoğu araç saf deklaratiftir - manifest + şablon yeterlidir. Hesaplanmış değerlere ihtiyaç duyan araçlar (QR kodlama, grafik verisi şekillendirme) adlandırılmış yaşam döngüsü fonksiyonları sunan bir hooks.js sağlar (onInit, onInput, onFrame - hareket-tepkili araçlar için kare başına canlı kamera hook'u - onLevel, beforeExport, afterExport, exportFile - Strip Hidden Data gibi cihaz üzerinde çalışan yardımcı programların kullandığı dosya-girer/dosya-çıkar dönüştürme yolu - ve kendi derin raster'ına sahip bir araç için exportStill). Host, hook'ları kapsam olarak enjekte edilen yetenek köprüsüyle new Function('host', …) üzerinden yükler. Bu bir taşınabilirlik sözleşmesidir, güvenlik korumalı alanı değil: hook'lar hâlâ sayfa gerçekliğinde çalışır ve bir tarayıcı kabuğunda window/fetch/document'a ulaşabilir - host. desteklenen, taşınabilir yüzeydir, uygulanan bir sınır değil. Eşzamansız hook sonuçları zaman sınırlıdır (onInit 5s, onInput 2s, beforeExport/afterExport 5s, exportFile/exportStill 10s) ve geç sonuçlar atılır; kaçak bir eşzamanlı* hook önlenemez. Bu yüzden güvenilmeyen üçüncü taraf hook kodu, Worker izolasyonu gelene kadar çalıştırmak için güvenli değildir.

Bunun önemi şu: deklaratif araçlar geliştirici olmayanlar tarafından yazılabilir. Eğer her araç bir web uygulaması olsaydı, "iş atı şablonları oluşturacak/sürdürecek sınırlı beceri" risk notu kalıcı bir darboğaz haline gelirdi.

2. Araçlar ve varlıklar veridir, paketlenmiş kod değil

Web ve Tauri uygulamaları, önyüklemede bilinen bir URL'den araç ve varlık kataloglarını getirir, yerel olarak önbelleğe alır ve orada ne varsa onunla çalışır. Yeni bir etkinlik karosu veya mevsimlik varlık eklemek bir uygulama sürümü gerektirmez.

Varlık baytları, CDN zehirlenmesini önlemek için SHA-256 ile sağlama toplamı alınır. Varlık id + version, önbellek geçersiz kılmayı yönlendirir.

3. Yetenek Köprüsü, araçların gördüğü tek API'dir

Araçlar şablon alanları dışında DOM'a asla dokunmaz, fetch'i asla doğrudan çağırmaz, dosya sistemini asla okumaz. Sürümlenmiş host.* metotlarını çağırırlar. Sözleşmenin kanonik tanımı packages/core/src/host-v1.tsdir - araç-yazarı SDK'sı @lolly-tools/core, böylece bir üçüncü taraf motora bağımlı olmadan buna karşı geliştirme yapabilir; engine/src/bridge/host-v1.ts bunun bir tip yeniden dışa aktarımıdır ve motor/kabuk kodu bu yoldan içe aktarmaya değişmeden devam eder:

Köprü API'siNe yapar
host.profileKullanıcının adı, e-postası, vesikalık fotoğrafı, şehri vb. bindToProfile ile girdileri önceden doldurur.
host.assetsKatalog sorguları, varlık çözümleme, host tarafından sağlanan seçici arayüzü.
host.stateGirdi yuvalarını kaydet / yükle. Webde IndexedDB, Tauri'de dosya sistemi, CLI'de bellek.
host.clipboardPanoya metin veya görsel yaz (platform yedekleriyle).
host.exportRender hedefini raster'a çevirir veya serileştirir. Deneysel araçlar için filigran uygular.
host.netİzin listesine alınmış fetch - yalnızca araç "network" yeteneğini beyan ettiyse kullanılabilir. (Şu anda kullanılan hiçbir araç bunu kullanmıyor.)

İsteğe bağlı, eklenebilir yüzeyler yalnızca bir kabuk onları sağladığında görünür. Bazıları yeteneğe bağlıdır - yalnızca araç eşleşen bayrağı beyan ettiğinde açığa çıkar: host.compose (başka bir aracın render'ını göm - compose), host.capture (URL Screenshot için sayfa yakalama - capture) ve host.recorder (kayıt araçları için mikrofon/kamera/ekran yakalama - microphone / camera / screen). Geri kalanı özellik-algılamalıdır - kabuk bunları sağlayabildiği her yerde mevcuttur, araç ise sağlayamayan kabuklar için bir yedek tutar.

Kapsadığını göstermek için birkaç önemli yüzey - Host API her birini belgeler ve packages/core/src/host-v1.ts sözleşmenin kendisidir:

YüzeySürümden beriNe ekler
host.tokens1.0DTCG tasarım tokenları - markanın kendi ilkel öğeleri
host.text1.0HarfBuzz WASM üzerinden metinden yola dönüşüm (wasm yetenek bayrağı buna dayanan araçları işaretler)
host.media1.4onFrame hook'unu tetikleyen canlı kamera kareleri. Kademeli iyileştirme, kasıtlı olarak camera bayrağına bağlı değildir - böyle bir araç yine de sıradan bir sabit görsel aracı gibi çalışır
host.color1.40Algısal renk matematiği: ΔEOK, WCAG + APCA kontrastı, OKLab rampaları, sınıf kesimleri, kategorik paletler, uyum şemaları (1.60), CSS Color 4 karıştırma ve gradyan pişirme (1.68). Saf ve senkron - kabuklar herhangi bir şey uygulamak yerine motorun makeColorApi()'sini ekler, böylece sapma olamaz
host.images1.60Cihazda bayt kodunu çözme / yeniden boyutlandırma / yeniden kodlama - dönüştürme yolu (HEIC → JPEG, WebP'ye sıkıştırma, küçültme). Web kabuğunda tembel bir cephe olarak sunulur, böylece HEIC kod çözücü asla başlangıç paketine girmez
host.geom1.64Kesin vektör geometrisi: yol boole işlemleri, ofsetleme, kontur-doldurmaya dönüştürme, spline düşürme, basitleştirme, çarpışma testi. Ayrıca saf, senkron ve motordan eklenir (makeGeomApi()); hatalar asla fırlatılmaz, döndürülür

Geri kalanı aynı kuralları izler ve onların yanında belgelenir: cihaz üzerinde belge ameliyatı için pdf (1.8) ve pptx (1.58), klip analizi ve cihaz üzerinde TTS/transkripsiyon için audio (1.71) ve speech (1.96), MilkDrop yer tutucu sözleşmesi için viz (1.72), derin-bit ve katmanlı-bitmap çıktısı için codec (1.100) ve layers (1.102), cihaz üzerinde modeller için upscale (1.101) ve matte (1.103), kendi piksel işini yapan hook'lar için raster (1.105), dışa aktarıma dayanıklı oklar için connectors (1.106) ve bitmiş baytları imzalamak için c2pa (1.85). Sayı büyüyor; kurallar büyümüyor.

Beyan edilebilir yetenekler şunlardır: network, filesystem, clipboard, camera, microphone, screen, ffmpeg, wasm, capture, compose. (1.54'te eklenen screen, host.recorder üzerinden ekran yakalamadır - kullanıcı tarayıcı-yerel arayüzde bir ekran/pencere/sekme seçer; aracın kendisinin adlandırdığı bir URL'yi raster'a çeviren capture'dan farklıdır.)

Aynı araç tarayıcıda, Tauri'de ve başsız CLI'de çalışır çünkü her kabuk bu arayüzü uygular - araç hangisinde olduğunu asla bilmez.

Köprü sürümlenmiştir. Metot eklemek küçük bir sürümdür. Kaldırmak veya imzaları değiştirmek büyük bir sürüm sıçramasıdır. v2 gönderildiğinde, v1 çalışmaya devam etmelidir.

4. Varlık ID'leri sonsuzadır

suse/logo/primary bir sözleşmedir. Yayınlandıktan sonra:

Bu, kaydedilmiş araç durumlarını ve URL ile paylaşılan bağlantıları yıllar boyunca kalıcı kılar.

5. URL modu birinci sınıftır

Her girdi bir URL parametresi olarak ifade edilebilmelidir:

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

Başka hiçbir şey içermeyen o bağlantının tek başına kendisi, bitmiş varlıktırsigned by Lollyvector SVGKendin kontrol etGet the signed file17 paths~2.0k nodes39 groups24 KBBaşka hiçbir şey içermeyen o bağlantının tek başına kendisi, bitmiş varlıktırsigned by Lollyvector SVGKendin kontrol etGet the signed file17 paths~2.0k nodes39 groups24 KB

CLI modu farklı bir taşıma katmanı altında URL modudur - CLI kabuğu argv'den bir URL-durum nesnesi kurar ve aynı motor ardışık düzenini çalıştırır. Tek bir render yolu vardır. CLI, ayrı bir uygulama olmadığı için GUI'den sapamaz.

url-mode.ts gidiş-dönüşü (ayrıştırma ve serileştirme) yönetir. Bir dizi ayrılmış parametre, girdi olarak araca asla iletilmez: çıktı kontrolleri (format, export, copy, filename, width/w, height/h, unit, dpi), baskı ve köken kadranları (bleed, marks, profile, password, c2pa, imprint, durable, meta, hdr, depth, cuts) ve durum taşıyıcıları (template, "En kısa bağlantı" paketlenmiş token'ı olan z - ve aynısının bir parola altında şifrelenmişi olan zx). engine/src/url-mode.ts içindeki RESERVED seti yetkili kaynaktır ve bir testle sabitlenmiştir; URL Mode burada listelenmeyen birkaçı dahil hepsini belgeler. URL modundaki varlık girdileri idleriyle serileştirilir; runtime bunları hidrasyondan önce host.assets.get() üzerinden çözer. width/height, unit cinsinden değerlerdir (varsayılan px, ayrıca mm/cm/in/pt/pc); fiziksel bir birimle dpi raster çözünürlüğünü ayarlar. Bunlar tuval belge boyutunu belirler ve dışa aktarma boyutları panelini önceden doldurur.

Her girdi bağlantıda taşındığından, bir parametre değişikliği farklı bir bitmiş varlık demektir. Bu paletin tamamı tek bir tohum rengi, bir uyum ve bir adım sayısıdır:

Bağlantıdaki tek bir tohum renkten türeyen, dört renk tonunda dokuz adımsigned by Lollyvector SVGKendin kontrol etGet the signed file10 groups24 KBBağlantıdaki tek bir tohum renkten türeyen, dört renk tonunda dokuz adımsigned by Lollyvector SVGKendin kontrol etGet the signed file10 groups24 KB

6. Depolama doğrudan değil, köprü üzerinden yapılır

Web kabuğu: IndexedDB. Tauri: dosya sistemi. CLI: bellek içi. Araçlar yalnızca host.state.save(slot, data) ve host.state.load(slot) görür. localStorage kullanılmaz - hem çok küçük hem de blob tutamıyor.

Kullanıcılar araç başına birden çok adlandırılmış düzenleme yuvası kaydedebilir ve her oturuma sonradan dönebilir. Hesap oluşturmaya gerek yoktur; durum cihaz başınadır. Köprü tek dikiş noktası olduğundan, bu cihaz başına durum aynı zamanda taşınabilir: shells/web/src/data-transfer.ts, host.profile/host.state/host.assets üzerinden her şeyi geri okuyarak tek bir lolly-backup zip dosyasına aktarır ve bu dosya başka herhangi bir kuruluma sunucu gerektirmeden içe aktarılabilir - "yeni bir cihaza geçme" sorusunun çevrimdışı yanıtı budur (tam özellik: docs/data-transfer.md). SUSE ID entegrasyonu (çoklu cihaz senkronizasyonu) bunun üzerine kurulacak gelecekteki bir kilometre taşıdır.

7. Olgunluk etiketleri "marka onaylı" riskini tasarım yoluyla yanıtlar

Her araç, manifestosunda status: official | community | experimental beyan eder. Galeri, duruma göre sıralanır. Deneysel araçlar dışa aktarımlarını otomatik olarak filigranlar - filigran, araç tarafından değil host.export.render tarafından uygulanır, bu yüzden resmi olmayan bir araç yazarı bunu devre dışı bırakamaz.

Bu, herhangi bir aracın kullanılmasının marka onayı anlamına geldiği algı riskine yönelik yapısal bir yanıttır. Süreç yanıtları (bir inceleme kuyruğu, SUSE ID sınırlaması) bunun üzerine eklenir.

8. Araç girdileri, varlıklar dahil, manifesto üzerinden tiplenir

Girdiler bir type beyan eder: text, longtext, number, boolean, color, select, asset, date, time, datetime-local, url, blocks, vector, table ve file. Host, manifestodan tipe göre genel bir kontrol oluşturur - araçlar sıfır kontrol kodu yazar. (Kullanıcının profilinden ön doldurma bir tip değildir - herhangi bir girdi bindToProfile taşıyabilir.) Üçü diğerlerinden daha fazla ağırlık taşır:

9. Şablonlar mantıksızdır (EJS değil, Handlebars)

Handlebars, EJS yerine bilinçli olarak seçildi:

Mantık, açık ve incelenebilir olduğu hooks.js içinde yaşar. Kullanılabilir Handlebars yardımcıları: {{default}}, {{upper}}, {{lower}}, {{eq}}, {{markdown}}, {{asset ref}}, {{asset ref "property"}} (ayrıca kardeş .ics/.vcf/.csv şablonlarının kullandığı icsStamp/rfcText/csvCell veri biçimi yardımcıları).

10. Araçlar araçları bileştirir

Bir araç, araçtan araca içe aktarım olmadan başka bir aracın çıktısını gömebilir - bileşim motor tarafından çözülür, hiçbir zaman araç kodu tarafından değil. İki yüzey vardır:

Herhangi bir aracın çıktısını bileştir: bir SVG alt öğe, üst öğe SVG veya PDF'ye dışa aktarıldığında gerçek bir vektör olarak kalır ve PNG için keskin şekilde rasterleştirilir; PNG/JPG/WEBP alt öğeleri görüntü olarak gömülür. compose yeteneğini gerektirir. Bileştirilmiş alt öğeler ara ürünlerdir - asla filigranlanmaz veya provenans damgası taşımaz - ve bileşim zarifçe bozulur: bir alt öğeyi oluşturamayan bir kabuk yalnızca o yuvayı atlar ve üst öğe yine de oluşturulur.


Bilinçli olarak yapmamayı seçtiğimiz şeyler


Yaşam döngüsü, baştan sona

Bir kullanıcı lolly.tools/#/tool/qr-code?url=https://suse.com&ecl=H adresini açar:

  1. Başlatma. Web kabuğu IndexedDB'yi açar, yetenek köprüsünü oluşturur, araç ve varlık kataloglarını senkronize eder (veya çevrimdışıyken önbellekten yükler).
  2. Yönlendirme. URL hash'i → tool görünümü, qr-code ve URL parametreleri ayıklanarak.
  3. Yükleme. loadTool('qr-code', fetchFile), tool.json'u getirir, JSON Schema'ya karşı doğrular, template.html, styles.css ve hooks.js kaynağını getirir.
  4. URL durumunu ayrıştırma. parseUrlState, URL parametrelerini başlangıç girdi değerlerine çevirir. Varlık referansları (?logo=suse/logo/primary), hafif { id, _unresolved: true } nesneleri olarak ayrıştırılır.
  5. Çalışma zamanı. createRuntime(tool, host, initialValues), girdi modelini oluşturur (profil verisini, varsayılanları ve başlangıç değerlerini birleştirerek), host.assets.get() üzerinden varlık referanslarını çözer, kancaları yükler (kapsamı belirlenmiş host, izole edilmemiş), hooks.onInit'i çağırır.
  6. Oluşturma. Kabuk, çalışma zamanına abone olur; her durum değişikliğinde { model, hydrated } alır. Modelden girdi kontrollerini oluşturur ve hidratlanmış şablon HTML'sini #tool-canvas'a yazar.
  7. Etkileşim. Kullanıcı bir girdiye yazar → runtime.setInput(id, value) → kısıtlamalar uygulanır → hooks.onInput çağrılır → yeniden hidrat → yeniden oluşturma. Tuval canlı olarak güncellenir.
  8. Dışa aktarma. Kullanıcı İndir (PNG) düğmesine tıklar → runtime.export(canvasNode, 'png')host.export.render (dom-to-image-more üzerinden rasterleştirir; SVG/PDF özel DOM dolaşan vektörleştiricilerden geçer) → blob → host.export.download. Bir aracın seçebileceği biçim aralığı geniştir ve schemas/tool.schema.json içindeki render.formats numaralandırması bu konuda yetkilidir - rasterler ve kayan noktalı rasterler, vektörler ve kesim dosyaları, baskı/CMYK, hareket, düzenlenebilir belgeler (pptx, docx, odt), palet ve veri/metin çıktıları, ses ve font dosyaları. URL Modu her kimliği ve ne ürettiğini adlandırır. Ses, diğer her şey gibi bu numaralandırmadadır (wav, mp3, m4a, opus, audiogram ve kayıt araçları tarafından beyan edilir); ayrı olarak, bir kayıt aracının render.capture modu host.recorder'ı yönlendirir ve alınan kayıt, tarayıcının kaydettiği hangi konteynerdeyse o şekilde bitmiş bir Blob olarak gelir. (render.export: false ayarlayan araçlar - ör. Color Palette, Countdown Timer, Strip Hidden Data, Text Helper, Compress PDF - indirme/biçim/boyut kontrollerini gizler.) Fiziksel birimler burada biçim başına dönüştürülür (PDF → gerçek sayfa puntoları, raster → DPI'de piksel, bir pHYs yığınıyla). Yazarlık/provenans meta verisi (yazar, araç, kaynak - engine/src/metadata.ts tarafından oluşturulur) biçim başına gömülür: PNG iTXt, JPEG EXIF, PDF bilgi sözlüğü, SVG <metadata>, GIF yorumu. Deneysel araçlara, araç tarafından değil host tarafından eklenen bir filigran uygulanır.

?options'ın açtığı dışa aktarma paneli: dosya adı ve biçim çifti, çıktı boyutu ve dosyayı yazan kontrollersigned by Lollyvector SVGKendin kontrol etGet the signed file49 paths~3.3k nodes61 groups3 images74 KB?options'ın açtığı dışa aktarma paneli: dosya adı ve biçim çifti, çıktı boyutu ve dosyayı yazan kontrollersigned by Lollyvector SVGKendin kontrol etGet the signed file49 paths~3.3k nodes61 groups3 images74 KB

Tauri'de aynı yaşam döngüsü. CLI'de aynı yaşam döngüsü - jsdom başsız DOM'u sağlar; çıktı bir dosyaya veya stdout'a gider.


Açık kaynak durumu

Kod MPL-2.0'dır. engine/, shells/, services/, schemas/ ve docs/, marka araçları için satıcıdan bağımsız bir iskele platformu olarak MPL-2.0 altında açık kaynaktır; her dağıtılabilir birim github.com/lolly-tools altında kendi deposundadır.

Araç içeriği marka paketleri olarak dağıtılır, her biri kendi koşullarıyla (paketin NOTICE.md dosyasına bak). community/, herkese açık lolly-tools deposudur ve markadan bağımsız araçları da MPL-2.0'dır. brands/suse/, özel suse-lolly paketidir: SUSE araçları ve SUSE kataloğu, lisanslı PremiumBeat müziği dahil, SUSE'ye özeldir. brands/lolly-start/, bu deponun sahip olduğu boş başlangıç markasıdır. Yazı tipleri bir paket içinde SIL Open Font License 1.1 altında dağıtılır - SUSE paketi SUSE ve SUSE Mono yazı tiplerini taşır.

Depo kökündeki tools/ ve catalog/, gitignore'lanmış görünümlerdir: bir profil bunları community/ ve etkin marka paketinden bir araya getirir; bu yüzden her betik ve kabuk bu iki yolu okur, hiçbir zaman bir paketi doğrudan okumaz.

Bu ayrım zorlanır - engine/'den araç içeriğine çapraz içe aktarma yoktur - böylece platform/içerik sınırı temiz kalır.


Motorun bittiği ve hostun başladığı yer

Eğer bunu saf veri + Handlebars ile tanımlayabiliyorsan → motor. Eğer DOM'a, dosya sistemine, ağa veya herhangi bir tarayıcı/işletim sistemi API'sine dokunuyorsa → host.

Bu sınır bilinçli olarak keskindir. Motor açık kaynaklı kısımdır. SUSE'yi, belirli platformları veya çalışma zamanı ortamlarını bilen her şey bunun dışında kalır.

Bir sonraki ayrıntı düzeyi için engine/README.md, her motor modülünü ve neyden sorumlu olduğunu sayar, ve Tehdit Modeli ve Güven Sınırları aynı sınırın aynı zamanda bir güven sınırı olarak nerede işlediğini kaydeder.