Dokumen ini merakamkan tujuan, struktur dan keputusan seni bina bagi platform Lolly. Ia mencerminkan visi produk dan juga keadaan semasa pangkalan kod.
Status: Lolly telah dikeluarkan. Versi 1.0 dilancarkan sebagai sumber terbuka di bawah MPL-2.0 pada 30 Ogos 2026, dan ciri, lalai serta katalog alat masih berubah antara keluaran. Enjin ini deterministik, dengan satu laluan render di sebalik setiap shell. Keselamatannya belum menjalani audit bebas, dan bukti penerimaannya sudah berusia beberapa bulan. Lihat Adoption & Governance untuk keadaan semasa dan cara penerimaan diukur.
Cara membaca halaman ini. Ia membawa dua jenis bahan, secara berurutan. Separuh pertama ialah sebab ini wujud: masalah, kedudukan dan kitaran hayat yang dilalui oleh satu aset. Daripada Gambaran besar dan seterusnya ia ialah cara lapisan-lapisan sepadan: dokumen seni bina untuk penyumbang, merangkumi pemisahan engine/shell/pack, susun atur repositori, sasaran penghantaran dan komitmen yang mengekang setiap perubahan pada platform. Jika anda di sini untuk mengubah pangkalan kod dan bukan untuk memahami produk, mulakan di gambaran besar.
Dua rakan menyelam lebih dalam daripada halaman ini.
engine/README.mddalam repositori ialah peta modul-demi-modul bagi engine, dengan jadual yang dijana bagi setiap modul dan apa yang dihurai atau ditulisnya. Threat Model & Trust Boundaries ialah seni bina yang sama dibaca sebagai sempadan kepercayaan, dan ia halaman yang tepat untuk sebarang soalan tentang apa yang dianggap tidak dipercayai oleh engine.
Sebab ini wujud
Kerja kreatif yang boleh diulang terlalu boleh diramal untuk mewajarkan tangan mahir setiap kali, dan terlalu sensitif kualiti untuk diserahkan tanpa garis panduan. Jika dibiarkan, ia akan berakhir dengan salah satu daripada tiga cara: perlahan, tidak konsisten atau terkunci dalam templat vendor.
Platform ini ialah jawapan langsung:
Kreatif dan kandungan berprogram pada skala - aset yang dijana daripada input, dengan peraturan ditetapkan sekali, untuk sesiapa sahaja yang memerlukannya.
Lolly bukan tempat sistem jenama dicipta - ia tempat sistem itu dihasilkan. Anggap ia seperti mesin layan diri untuk reka bentuk: buat pilihan, dapatkan hasil. Setiap kali. Enjin itu berusaha untuk kualiti tertinggi yang boleh dihasilkan oleh setiap format pada perkakasan yang ada di hadapan anda, dan enjin yang sama menghasilkan fail yang sama pada setiap permukaan yang menerimanya.
Hasilnya ialah kelimpahan: setiap acara mempunyai papan tanda yang betul, setiap amaran CVE sepadan dengan gaya rumah, setiap label dicetak bersih, setiap tandatangan e-mel terkini - semuanya daripada alat yang sudah membawa peraturan itu. Platform ini mengendalikan kerja kreatif berulang yang telah dioperasikan. Ia sengaja bukan alat kreatif tersuai - pereka masih memiliki kerja unggulan.
Berinovasi secara kebarangkalian, berskala secara deterministik
Setiap hujah tentang AI dalam saluran kreatif tersekat pada soalan yang sama: bahagian manakah ini kerja mesin? Ia soalan lama dengan jawapan yang sudah selesai. Jurutulis dan pengilum sudah pun bekerja antara dua instrumen - lakaran longgar, di mana tiada apa yang tetap dan segalanya boleh dicuba, dan mesin cetak, yang menggerunkan tepat kerana ia mengikat. Lakaran itulah tempat seni berlaku. Mesin cetak itulah cara ia sampai kepada sesiapa sahaja. Tiada siapa mengelirukan kedua-duanya, dan kedua-duanya terus maju - dakwat baharu, muka taip baharu, mesin cetak baharu - setiap satu bertambah baik selaras dengan kraf dan niat yang dikhidmatinya.
Lolly melukis garis yang sama. Terokai secara kebarangkalian: model, pereka, idea kasar, prompt yang pergi ke tempat yang tiada siapa rancang. Kemudian skala secara deterministik - benda yang menjadi banyak output ialah alat, dan alat merender dengan cara yang sama setiap kali daripada input yang boleh anda baca. Penerokaan itu kekal bebas kerana tiada apa di hiliran bergantung pada ia mendarat dengan cara yang sama dua kali. Output itu memperoleh kepercayaan kerana ia bukan tekaan. Membawa eksperimentasi AI kepada hasil yang boleh diramal dan boleh dihasilkan semula bukanlah disiplin baharu; ia pembahagian kerja yang sama yang menjadikan kerja bercetak layak dipercayai sejak awal lagi.
Percayai proses kreatif, skala dengan ketelitian.
Berbanding alternatif
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 |
Kelengkapan keupayaan merentasi alat kreatif hari ini, dikaji pada Ogos 2026. Pemarkahan: 0 tiada, 25 gred jalan pintas, 50 nyata tetapi terhad atau separa, 75 kukuh dengan kaveat, 100 kecekapan teras.
signed by Lollypositioning-comparison.htmlHTMLpixels, not shapes40 KBAI generatedgenerated by GPT-6Semak sendiriDapatkan fail yang ditandatanganiJurang itu jelas: tiada apa yang dihantar hari ini memberi kita output keutamaan-kekangan, mampu luar talian, kemahiran rendah, boleh diakses secara dalaman. Lolly malah merangkumi kanvas terbuka - Design - di mana warna, jenis taip dan aset mematuhi globals jenama, jadi susunan bebas kekal keutamaan-kekangan. Apa yang ia bukan ialah suite reka bentuk tanpa kekangan: pereka terus menggunakan Illustrator dan Figma untuk kerja unggulan tersuai. Permutasi boleh disusun dengan alat ini.
signed by Lollyvector SVG367 paths~62k nodes773 groups3 images1,453 KBSemak sendiriDapatkan fail yang ditandatangani
signed by Lollyvector SVG367 paths~62k nodes776 groups3 images1,454 KBSemak sendiriDapatkan fail yang ditandatangani
Gunakan untuk: Penjanaan pantas aset kreatif yang telah dioperasikan - jubin acara, lencana nama, tandatangan, amaran CVE, kod QR, kad sosial, label penghantaran, laporan berstruktur.
Jangan gunakan untuk: Kandungan hero tersuai.
Kitaran hayat kempen
Cara paling jelas untuk melihat apa itu Lolly bukanlah senarai ciri - tetapi mengikuti satu aset ketika ia berpindah dari tangan ke tangan. Perhatikan satu kad kempen dilokalkan bergerak melalui organisasi:
- Pihak kreatif menetapkan peraturan. Seorang pereka mencipta templat asas dalam alat Design, mengekod keras pembolehubah tipografi dan warna jenama. Mereka bukan membuat satu kad - mereka melakukan kerja asas sekali sahaja supaya mereka tidak perlu melokalkan secara manual lagi.
- Pembangun menskalakannya. Templat yang sama itu disambungkan ke dalam saluran paip harian melalui CLI, supaya carta baharu atau varian bahasa baharu dijana secara automatik - tiada pereka membuka semula fail itu.
- Pengeluar hanya menggunakannya. Seorang wakil jualan, luar talian di dalam kapal terbang, membuka alat yang sama dan menjana dek yang sepenuhnya mematuhi jenama untuk mesyuarat pelanggan. Tiada kemahiran reka bentuk, tiada rangkaian, tiada menunggu.
"Carta baharu" dalam langkah kedua ialah render seperti yang ini, dihasilkan daripada rentetan data dan segelintir parameter tanpa sesiapa membuka fail reka bentuk:
signed by Lollyvector SVG15 paths~1.3k nodes4 groups20 KBSemak sendiriDapatkan fail yang ditandatangani
signed by Lollyvector SVG15 paths~1.3k nodes4 groups20 KBSemak sendiriDapatkan fail yang ditandatangani
Intinya bukanlah Lolly bagus untuk pereka dan bagus untuk pembangun dan bagus untuk jualan, setiap satu secara berasingan. Ia ialah larian berganti-ganti (relay): kerja awal pihak kreatif diskalakan oleh pembangun, yang seterusnya memperkasakan pengeluar. Pengalaman tanpa usaha untuk wakil bukan-teknikal di dalam kapal terbang hanya mungkin kerana ketelitian yang ditetapkan oleh pereka dan digunakan oleh pembangun.
Itulah pengganda kuasa. Lolly bukan laci alat berasingan untuk peranan berasingan - ia satu kitaran hayat aset deterministik yang disentuh oleh setiap peranan, dan setiap tangan yang dilaluinya menggandakan nilai yang sebelumnya.
Satu alat, banyak output
Peraturan jenama berada dalam alat, bukan dalam setiap fail yang dihasilkannya (lihat Bagaimana Lolly berbanding). Betulkan alat itu sekali dan setiap output mewarisi jenis huruf, warna dan jarak yang sama, sama ada itu satu kad atau satu hamparan baris dalam sedozen bahasa. Cara anda menyemak kerja anda, dan siapa yang melakukannya, kekal terpulang kepada anda; Lolly menjadikan perkara yang patut disemak lebih kecil dan output lebih pantas dihasilkan.
Alat deterministik yang sama itu mencapai skala tersebut dengan tiga cara, semuanya menghasilkan output yang serupa:
- Seorang manusia, dalam apl. Grid kelompok
/pro: tampal atau import baris, dapatkan satu aset siap bagi setiap baris, muat turun zip. Tiada kemahiran reka bentuk, tiada menunggu. - Seorang pembangun, daripada baris arahan. CLI menjalankan engine yang sama dan laluan render yang sama tanpa antara muka, supaya alat boleh dijujukkan merentasi setiap baris dalam skrip atau saluran paip harian. Panggilan
lolly <tool> --field=…dalam gelung ialah keseluruhan integrasi. - Sistem atau ejen AI, melalui MCP. Alat yang sama dikendalikan secara berprogram, pada kesetiaan yang sama, untuk sebanyak mana baris yang diperlukan oleh kerja itu.
signed by Lollyvector SVG133 paths~15k nodes185 groups1 image195 KBSemak sendiriDapatkan fail yang ditandatangani
signed by Lollyvector SVG133 paths~15k nodes185 groups1 image195 KBSemak sendiriDapatkan fail yang ditandatangani
Satu set kekangan jenama, ditetapkan sekali oleh pereka; tiga laluan kepada output yang serupa.
Gambaran besar: cara lapisan-lapisan sepadan
Segala-galanya dari sini ke bawah adalah seni bina. Rajah itu ialah keseluruhan sistem dalam satu pandangan: alat ialah data di atas, engine di tengah tidak mengetahui apa-apa tentang mana-mana platform, shells di bawahnya melaksanakan satu kontrak, dan catalogs membekalkan kandungan.
┌─────────────────────────────────────────────┐
│ 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 │
└─────────────────────────────────────────────┘Susun atur repositori
Lolly ialah satu repositori. engine/, schemas/, scripts/, tests/, api/, docs/, community/, brands/lolly-start/, setiap shells/ dan kedua-dua services/ adalah direktori biasa di dalamnya. Satu pengecualian ialah brands/suse, satu submodul git peribadi yang menyimpan pek alat dan katalog SUSE, bersifat opt-in dan tiada dalam klon awam. Pek mana yang dibaca oleh sesuatu binaan ditentukan oleh profil kandungan (profiles.json), yang diselesaikan bagi setiap proses dan bukan ditukar secara global. Lihat Build Guide » Getting the source untuk arahan klon dan cara perubahan dalam pek peribadi itu dikomit.
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 + positioningModel penghantaran platform
Platform ini berjalan merentasi beberapa permukaan - web PWA, Tauri desktop/mudah alih, CLI boleh skrip dan TUI interaktif. Kesemuanya menggunakan engine yang sama dan fail alat yang sama.
Web (PWA) - pengedaran utama
Dihoskan di URL yang dikawal SUSE. Berfungsi luar talian sebaik sahaja service worker telah cache alat dan aset. Di sinilah kebanyakan pekerja, vendor dan rakan kongsi akan menggunakan platform ini. Tiada akaun diperlukan - keadaan disimpan dalam IndexedDB bagi setiap peranti.
Web shell responsif daripada satu susun atur. Pada desktop, alat ialah sidebar kawalan yang boleh diubah saiz di sebelah pentas pratonton dengan navigasi kanvas asli-trackpad (Cmd/Ctrl-roda atau cubit untuk zum sekitar kursor, Space- atau seret-tengah untuk pan, kekunci 0/1/+/− dan HUD Fit/%). Pada mudah alih (≤640px) kawalan menjadi helaian berlabuh-atas dengan pemegang seret yang klik ke peek/half/full (ketik untuk togol) di atas pratonton skrin-penuh statik, dan butang terapung Render membuka kawalan Export dalam popup helaian bawah. Sentuhan mendapat cubit-zum dan seret-pan pada pratonton. Laluan render dan kawalan eksport adalah serupa pada kedua-duanya - hanya chrome yang mengalir semula.
signed by Lollyvector SVG131 paths~6.1k nodes158 groups1 image142 KBSemak sendiriDapatkan fail yang ditandatangani
Alat yang sama pada lebar telefon, tanpa susun atur kedua untuk diselenggara: kawalan menjadi helaian di bahagian atas, pratonton mengambil keseluruhan skrin dan pil render terapung di atasnya.
signed by Lollyvector SVG97 paths~3.3k nodes113 groups99 KBSemak sendiriDapatkan fail yang ditandatangani
signed by Lollyvector SVG97 paths~3.3k nodes113 groups100 KBSemak sendiriDapatkan fail yang ditandatangani
Mod kelompok (/pro). Cangkerang web juga membawakan grid kelompok bergaya hamparan (shells/web/src/pro/) yang merender banyak baris sekali gus merentasi satu atau banyak alat. Ia melakukan pusing ulang CSV/TSV serta tampal hamparan, templat/format/saiz/unit/dpi setiap baris, panel sisi editor blok dengan pratonton langsung, lajur eksport yang boleh dikuncupkan, bar tag "relevance" setiap baris, susun semula baris melalui pemegang seret di sebelah kiri, pengesahan padam dua langkah, sesi kelompok yang disimpan dan muat turun .zip. Inilah permukaan satu-kepada-banyak di sebalik pemposisian "penjanaan kandungan pukal".
Desktop / mudah alih Tauri
Apl asli berbungkus (jejak kecil melalui Tauri). Menyediakan ketersediaan luar talian sepenuhnya, akses sistem fail untuk alat bergantung CLI (PDF Smasher, Font Outliner) dan akses kamera. Dijadualkan untuk peningkatan perkakasan pertengahan 2026.
CLI
lolly <tool-id> [--input=value ...] --output=file.png
Pengguna desktop boleh memanggil banyak alat daripada terminal. Cangkerang CLI memuatkan enjin yang sama, mencipta DOM jsdom, menjalankan laluan render yang sama dan menulis fail. Mod URL adalah pengangkutannya - CLI bukan pelaksanaan berasingan. Ini menjamin output CLI dan GUI adalah sama.
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 toolTUI
pnpm run tui
Rakan interaktif kepada CLI: apl terminal skrin penuh yang mengutamakan papan kekunci (dibina atas Ink) untuk meneroka alat, mengisi input, menyimpan projek dan mengeksport - semuanya tanpa GUI. Jambatan hosnya menggunakan semula pelaksanaan CLI untuk format bebas DOM (SVG/EMF/EPS/HTML + teks/data), dan menambah keadaan atas cakera di bawah ~/.lolly serta pratonton dalam baris pilihan-masuk. Selain itu ia mempunyai peringkat render pelayar: Chromium tanpa kepala terhad (yang sama dipasang oleh pelayan MCP) yang menghasilkan raster/PDF/video dan tangkapan URL langsung mengikut permintaan - memacu salinan terbina cangkerang web supaya output adalah sama, dan hanya dilancarkan apabila anda mula-mula mengeksport format sedemikian. Jadi url-shot (dengan potong + tukar warna + PDF/SVG vektor) dan setiap alat raster/pdf turut berjalan dalam terminal. Lihat panduan TUI.
Tidak kira permukaan mana anda berada, tab Capabilities pada papan pemuka adalah peta penuh apa yang platform ini isytiharkan boleh dilakukan, dikumpulkan dan boleh dibaca tanpa membuka mana-mana alat.
Kategori alat
Alat ditanda dengan category dalam manifesnya untuk pengumpulan galeri.
Baris disenaraikan mengikut susunan bahagian galeri. Bahagian utility sentiasa dirender terakhir dalam galeri (selepas setiap kategori lain, termasuk yang akan datang) - ia adalah laci "Utiliti Luar Talian" pada peranti.
| Kategori | Contoh | Dirancang |
|---|---|---|
everyone | QR Code Generator, Quote Card, Email Signature, Logo, Wordmark, Audiogram, Battlecards, Sequence, Record | Employee Image Stationery |
designer | Brand Lockup, Design, Chart, Darkroom, Filter, Pose Geeko, Booklet | Font Outliner |
event | Meeting Planner, Event Name Badge, Wayfinding Signage, Calendar ICS, Booth Studio | Event Stationery, Bulk Name Badges, Room Agenda Cards |
product | - | CVE Alert, Product Release Announcement, Blog OG Image |
utility | Strip Hidden Data, Text, Compress PDF, Convert Image, Convert Font, Redact, Run Web Code, Screen Capture, URL Screenshot | Penukar unit/format, lebih banyak utiliti privasi pada peranti |
Sel-sel itu adalah contoh, bukan inventori. Alat mana yang wujud adalah ciri profil yang anda pasang, bukan ciri halaman ini: pek jenama menambah miliknya sendiri, dan boleh mengecualikan alat komuniti yang tidak mahu dibawakannya. catalog/tools/index.json - dijana daripada manifes, dan daftar yang sebenarnya dibaca oleh galeri - adalah senarai yang berwibawa; untuk mengira apa yang dipasang oleh sesuatu profil, kira manifesnya (ls community//tool.json brands//tools/*/tool.json) dan bukan mempercayai nombor yang ditulis di sini. (Id alat yang hadir dalam dua pek dipasang sekali sahaja, daripada pek yang menang.)
Alat juga dikelaskan mengikut status: official (diluluskan jenama, tiada tera air), community (sumbangan luaran), experimental (eksport bertera air). Kebanyakan pustaka adalah official; studio yang lebih baharu dan alat tangkapan cenderung berada pada community atau experimental semasa ia matang. Setiap permukaan menunjukkan lencana, jadi pembaca tahu apa yang mereka ambil sebelum membukanya - dan, seperti sel kategori di atas, keahlian setiap status bergerak terlalu pantas untuk disenaraikan di sini. Bacanya daripada galeri atau indeks yang dijana.
Design adalah alat pertama yang dibina atas mod kanvas bebas render.layout: "editor" - permukaan tanpa chrome, manipulasi langsung di mana anda seret, saiz semula, putar dan lekat kotak teks, bentuk dan imej, kemudian eksport melalui laluan render yang sama seperti setiap alat lain.
Strip Hidden Data ialah utiliti pada peranti (on-device) pertama (privacy: "on-device"): alat transformasi kandungan yang mengambil fail yang anda bekalkan, memprosesnya sepenuhnya dalam pelayar dan memulangkan salinan bersih - tidak pernah dimuat naik, tidak pernah ditera air, tiada cap asal usul (provenance) disematkan. Text ialah yang kedua - ruang kerja pada peranti untuk tugas harian tampal-ke-laman-web (format JSON, nyahkod JWT, Base64, kod/nyahkod URL, cincangan SHA). Compress PDF ialah yang ketiga - ia mengecilkan PDF dengan memampatkan semula imej di dalamnya, sekali lagi sepenuhnya pada peranti. Penanda dan teks lencana "Runs on your device - nothing is uploaded" ("Berjalan pada peranti anda - tiada apa dimuat naik") kini merangkumi keseluruhan set transformasi: Strip Hidden Data, Text, Compress PDF, Convert Image (HEIC/TIFF/AVIF → WebP/JPG/PNG), Convert Font, Redact (memusnahkan kawasan dalam imej, SVG atau PDF), Prompt Card dan Rebrand (menukar tema .pptx di tempatnya) apabila profil memasangnya. Ini ialah kategori utiliti privasi yang menggantikan penyerahan fail sulit kepada laman web tujuan tunggal.
signed by Lollyvector SVG124 paths~29k nodes324 groups395 KBSemak sendiriDapatkan fail yang ditandatangani
signed by Lollyvector SVG124 paths~29k nodes324 groups396 KBSemak sendiriDapatkan fail yang ditandatangani
Nota:
categorydanstatusdinyahnormalisasi ke dalamcatalog/tools/index.json(daftar yang dibaca oleh galeri) daripada setiaptool.json. Manifest adalah sumber kebenaran - indeks itu dijana olehpnpm run build:catalogdanpnpm run validate:catalogakan gagal CI jika indeks yang dikomit menyimpang daripada manifest.
Komitmen seni bina
Keputusan ini sudah muktamad. Menukar mana-mana satu daripadanya adalah usaha besar - ia membentuk setiap keputusan lain dalam kod pangkalan.
1. Alat deklaratif, dengan pintu keluar kecemasan imperatif
Alat adalah manifes (tool.json) + templat (template.html) + hooks.js pilihan.
Manifes mengisytiharkan input. Bukan templat. Input tidak disimpulkan daripada token Handlebars. Manifes adalah kontrak; templat menggunakan pemboleh ubah bernama melalui {{id}}.
signed by Lollyvector SVG39 paths~2.6k nodes54 groups2 images43 KBSemak sendiriDapatkan fail yang ditandatangani
signed by Lollyvector SVG39 paths~2.6k nodes54 groups2 images43 KBSemak sendiriDapatkan fail yang ditandatangani
Hooks adalah pilihan. Kebanyakan alat adalah deklaratif tulen - manifes + templat sudah memadai. Alat yang memerlukan nilai terkira (pengekodan QR, pembentukan data carta) menyediakan hooks.js yang mendedahkan fungsi kitaran hayat bernama (onInit, onInput, onFrame - hook kamera langsung setiap bingkai untuk alat responsif gerakan - onLevel, beforeExport, afterExport, exportFile - laluan transformasi fail-masuk/fail-keluar yang digunakan oleh utiliti pada peranti seperti Strip Hidden Data - dan exportStill, untuk alat yang memiliki raster mendalamnya sendiri). Hos memuatkan hooks melalui new Function('host', …) dengan jambatan keupayaan disuntik sebagai skop penutupan. Ini adalah kontrak kemudahalihan, bukan kotak pasir keselamatan: hooks masih berjalan dalam realm halaman dan boleh mencapai window/fetch/document dalam cangkerang pelayar - host. adalah permukaan disokong dan mudah alih, bukan sempadan yang dikuatkuasakan. Keputusan hook tak segerak diberi had masa (onInit 5s, onInput 2s, beforeExport/afterExport 5s, exportFile/exportStill 10s) dan keputusan lewat dibuang; hook segerak* yang larat tidak boleh dihentikan. Oleh itu kod hook pihak ketiga yang tidak dipercayai belum selamat dijalankan sehingga pengasingan Worker dilancarkan.
Ini penting kerana: alat deklaratif boleh diusahakan oleh bukan pembangun. Jika setiap alat adalah apl web, nota risiko "kemahiran terhad untuk mencipta/menyelenggara templat kuda tunggangan" menjadi kesesakan kekal.
2. Alat dan aset adalah data, bukan kod berbungkus
Apl web dan Tauri mengambil katalog alat dan aset daripada URL yang diketahui semasa but, cache secara setempat dan beroperasi atas apa yang ada di sana. Menambah jubin acara baharu atau aset bermusim tidak memerlukan keluaran apl.
Bait aset diberi checksum SHA-256 untuk mengelakkan peracunan CDN. id + version aset memacu pembatalan cache.
3. Jambatan Keupayaan adalah satu-satunya API yang dilihat alat
Alat tidak pernah menyentuh DOM di luar kawasan templatnya, tidak pernah memanggil fetch secara terus, tidak pernah membaca sistem fail. Ia memanggil kaedah host.* berversi. Definisi kanonik kontrak ini adalah packages/core/src/host-v1.ts - SDK pengarang-alat @lolly-tools/core, supaya pihak ketiga boleh membina berdasarkannya tanpa bergantung kepada enjin; engine/src/bridge/host-v1.ts adalah eksport semula jenis daripadanya, dan kod enjin/cangkerang terus mengimport daripada laluan itu tanpa berubah:
| API Jambatan | Apa yang dilakukannya |
|---|---|
host.profile | Nama pertama, e-mel, gambar kepala, bandar pengguna, dsb. Pra-isi input melalui bindToProfile. |
host.assets | Pertanyaan katalog, resolusi aset, UI pemilih yang disediakan hos. |
host.state | Simpan / muat slot input. IndexedDB pada web, sistem fail pada Tauri, memori pada CLI. |
host.clipboard | Tulis teks atau imej ke papan keratan (dengan sandaran platform). |
host.export | Rasterkan atau siri sasaran render. Menggunakan tera air untuk alat eksperimental. |
host.net | Fetch berdaftar-benar - hanya tersedia jika alat mengisytiharkan keupayaan "network". (Tiada alat yang dibawakan kini menggunakannya.) |
Permukaan pilihan dan tambahan hanya muncul apabila cangkerang menyediakannya. Sesetengah adalah berpagar-keupayaan - hanya didedahkan apabila alat mengisytiharkan bendera yang sepadan: host.compose (benamkan render alat lain - compose), host.capture (tangkapan halaman untuk URL Screenshot - capture) dan host.recorder (tangkapan mikrofon/kamera/paparan untuk alat rakaman - microphone / camera / screen). Selebihnya dikesan-ciri - hadir apabila sahaja cangkerang boleh menyediakannya, dengan alat mengekalkan sandaran untuk cangkerang yang tidak boleh.
Beberapa permukaan utama, untuk menunjukkan skopnya - Host API mendokumenkan setiap satu, dan packages/core/src/host-v1.ts adalah kontrak itu sendiri:
| Surface | Sejak | Apa yang ditambahnya |
|---|---|---|
host.tokens | 1.0 | Token reka bentuk DTCG - primitif milik jenama sendiri |
host.text | 1.0 | Text-to-path melalui HarfBuzz WASM (keupayaan wasm menandakan alat yang bergantung kepadanya) |
host.media | 1.4 | Bingkai kamera langsung yang menggerakkan hook onFrame. Peningkatan progresif, sengaja tidak digating oleh flag camera - alat sedemikian masih berfungsi sebagai alat still-image biasa |
host.color | 1.40 | Matematik warna perseptual: ΔEOK, kontras WCAG + APCA, ramp OKLab, class-break, palet kategori, skema harmoni (1.60), pencampuran CSS Color 4 dan gradient baking (1.68). Tulen dan segerak - shell menyambungkan makeColorApi() milik enjin dan bukannya melaksanakan apa-apa sendiri, jadi ia tidak boleh menyimpang |
host.images | 1.60 | Nyahkod / saiz semula / kod semula byte pada peranti - laluan penukaran (HEIC → JPEG, mampatkan ke WebP, downscale). Dihantar dalam web shell sebagai lazy facade, jadi penyahkod HEIC tidak pernah masuk ke dalam boot chunk |
host.geom | 1.64 | Geometri vektor tepat: boolean laluan, offsetting, stroke-to-fill, spline lowering, penyederhanaan, hit testing. Turut tulen, segerak dan disambungkan daripada enjin (makeGeomApi()); kegagalan dikembalikan, tidak pernah di-throw |
Selebihnya mengikut peraturan yang sama dan didokumenkan bersama: pdf (1.8) dan pptx (1.58) untuk pembedahan dokumen pada peranti, audio (1.71) dan speech (1.96) untuk analisis klip dan TTS/transkripsi pada peranti, viz (1.72) untuk kontrak pengganti MilkDrop, codec (1.100) dan layers (1.102) untuk output bit-dalam dan bitmap berlapis, upscale (1.101) dan matte (1.103) untuk model pada peranti, raster (1.105) untuk hooks yang melakukan kerja piksel sendiri, connectors (1.106) untuk anak panah selamat-eksport dan c2pa (1.85) untuk menandatangani bait siap. Bilangannya berkembang; peraturannya tidak.
Keupayaan yang boleh diisytiharkan ialah: network, filesystem, clipboard, camera, microphone, screen, ffmpeg, wasm, capture, compose. (screen, ditambah dalam 1.54, adalah tangkapan paparan melalui host.recorder - pengguna memilih skrin/tetingkap/tab dalam UI asli pelayar; berbeza daripada capture, yang merasterkan URL yang dinamakan oleh alat itu sendiri.)
Alat yang sama berjalan dalam pelayar, Tauri dan CLI tanpa kepala kerana setiap cangkerang melaksanakan antara muka ini - alat itu tidak pernah tahu di mana ia berada.
Jambatan ini berversi. Menambah kaedah adalah versi minor. Membuang atau menukar tandatangan adalah kenaikan versi major. Apabila v2 dilancarkan, v1 mesti terus berfungsi.
4. ID aset adalah kekal selamanya
suse/logo/primary adalah kontrak. Sebaik sahaja diterbitkan:
- ID tidak pernah berubah, tidak pernah digunakan semula.
- Perubahan bait → naikkan
versiondalam manifes. - Digantikan dengan aset baharu → tetapkan
deprecated: truedan secara pilihanreplacedBy. - Rujukan sedia ada sentiasa dapat diselesaikan.
Ini menjadikan keadaan alat yang disimpan dan pautan berkongsi-URL tahan lama merentasi tahun.
5. Mod URL adalah kelas pertama
Setiap input mesti boleh diungkapkan sebagai parameter URL:
lolly.tools/#/tool/qr-code?url=https://suse.com&ecl=H signed by Lollyvector SVG55 paths~2.6k nodes38 groups60 KBSemak sendiriDapatkan fail yang ditandatangani
signed by Lollyvector SVG55 paths~2.6k nodes38 groups61 KBSemak sendiriDapatkan fail yang ditandatangani
Mod CLI adalah mod URL di bawah pengangkutan berbeza - cangkerang CLI membina objek keadaan-URL daripada argv dan menjalankan paip enjin yang sama. Terdapat satu laluan render. CLI tidak boleh menyimpang daripada GUI kerana ia bukan pelaksanaan berasingan.
url-mode.ts mengendalikan pusing ulang (hurai dan siri). Satu set parameter terperuntuk tidak pernah dihantar kepada alat sebagai input: kawalan output (format, export, copy, filename, width/w, height/h, unit, dpi), dail cetakan dan asal usul (bleed, marks, profile, password, c2pa, imprint, durable, meta, hdr, depth, cuts) dan pembawa keadaan (template, z - token padat "Shortest link" - dan zx, yang sama disulitkan di bawah kata laluan). Set RESERVED dalam engine/src/url-mode.ts adalah pihak berkuasa dan disemat oleh satu ujian; URL Mode mendokumenkan setiap satu daripadanya, termasuk beberapa yang tidak disenaraikan di sini. Input aset dalam mod URL disirikan mengikut id-nya; masa jalan menyelesaikannya melalui host.assets.get() sebelum penghidratan. width/height adalah nilai dalam unit (lalai px, juga mm/cm/in/pt/pc); dengan unit fizikal, dpi menetapkan resolusi raster. Ia menetapkan saiz dokumen kanvas dan pra-isi panel dimensi eksport.
Kerana setiap input mengembara dalam pautan, perubahan parameter adalah aset siap yang berbeza. Keseluruhan palet ini adalah satu warna benih, satu harmoni dan satu kiraan langkah:
signed by Lollyvector SVG10 groups25 KBSemak sendiriDapatkan fail yang ditandatangani
signed by Lollyvector SVG10 groups25 KBSemak sendiriDapatkan fail yang ditandatangani
6. Storan melalui titi, bukan terus
Kelongsong web: IndexedDB. Tauri: sistem fail. CLI: dalam-memori. Alat hanya nampak host.state.save(slot, data) dan host.state.load(slot). localStorage tidak digunakan - ia terlalu kecil dan tidak boleh menyimpan blob.
Pengguna boleh menyimpan pelbagai slot suntingan bernama bagi setiap alat dan kembali ke setiap sesi kemudian. Tiada penciptaan akaun diperlukan; keadaan adalah setiap peranti. Oleh kerana titi adalah satu-satunya sempadan, keadaan setiap peranti itu juga mudah alih: shells/web/src/data-transfer.ts membaca semula segala-galanya melalui host.profile/host.state/host.assets ke dalam satu zip lolly-backup yang diimport pada mana-mana pemasangan lain - jawapan luar talian kepada "pindah ke peranti baharu" yang tidak memerlukan pelayan (spesifikasi penuh: docs/data-transfer.md). Penyegerakan pelbagai peranti sudah berjalan di atas ini, menghantar bungkusan yang sama ke storan pilihan pengguna (docs/sync.md).
7. Tag kematangan menyatakan apa sesuatu alat itu
Setiap alat mengisytiharkan status: official | community | experimental dalam manifesnya. Galeri diisih mengikut status. Alat eksperimen menandatera eksport mereka secara automatik - tanda air dikenakan oleh host.export.render, bukan oleh alat, jadi ia tidak boleh dipilih keluar oleh pengarang alat bukan-rasmi.
Ini ialah jawapan struktural kepada risiko persepsi bahawa setiap alat dalam galeri membawa bobot yang sama. Apa-apa proses yang diletakkan oleh sesebuah pasukan di sekeliling katalog terletak di atasnya.
8. Input alat ditaip melalui manifes, termasuk aset
Input mengisytiharkan type: text, longtext, number, boolean, color, select, asset, date, time, datetime-local, url, blocks, vector, table dan file. Hos merender kawalan generik bagi setiap jenis daripada manifes - alat menulis sifar kod kawalan. (Pra-isi daripada profil pengguna bukan satu jenis - mana-mana input boleh membawa bindToProfile.) Tiga membawa lebih banyak berat berbanding yang lain:
asset(denganfilterdanallowUpload) ialah titi kepada sistem aset global;allowUpload: falseialah tuas penguatkuasaan jenama untuk perkara seperti logo jubin penajaan yang mana hanya aset pustaka dibenarkan. Muat naik pengguna menggunakan bentukAssetRefyang sama seperti aset pustaka, jadi alat mengendalikannya secara sama.blocksialah kumpulan medan berulang - jadual mini di dalam satu input, disunting dalam panel sisi, dengan menu tambah yang ditaip/dibezakan dan medan aset setiap blok. Klik pada blok yang dirender di atas kanvas memfokuskan baris blok itu. Digunakan olehmeeting-planner,chart-creator,event-name-badge,wayfinding-signage,color-blockdandigi-ad.vectormengumpulkan set nombor tetap (contohnya transformasi) ke dalam satu kawalan sebatian;filemenyimpan fail pengguna sendiri sebagai bait dalam memori untuk utiliti transformasi pada peranti (contohnyastrip-datadancompress-pdf).
9. Templat tanpa logik (Handlebars, bukan EJS)
Handlebars dipilih berbanding EJS secara sengaja:
- Tanpa logik. Templat boleh dikarang oleh bukan pembangun.
- Selamat secara lalai.
{{x}}melarikan diri HTML;{{{x}}}adalah mentah pilih-masuk. - Tiada JS sembarangan dalam templat bermakna tiada permukaan audit XSS setiap templat.
Logik tinggal dalam hooks.js di mana ia eksplisit dan boleh disemak. Pembantu Handlebars yang tersedia: {{default}}, {{upper}}, {{lower}}, {{eq}}, {{markdown}}, {{asset ref}}, {{asset ref "property"}} (ditambah pembantu format-data icsStamp/rfcText/csvCell digunakan oleh templat .ics/.vcf/.csv yang berkaitan).
10. Alat menggubah alat
Satu alat boleh membenamkan render alat lain tanpa import alat-ke-alat - gubahan diselesaikan oleh enjin, bukan sekali-kali oleh kod alat. Terdapat dua permukaan:
- Manifes deklaratif -
composes: [{ id, tool, inputs, format?, width?, height? }]. Enjin merender anak bernama dan meletakkan hasil dalam templat tanpa logik sebagai{{asset <id>}}.event-name-badgemenggubahqr-codesebagai SVG hari ini. - URL benam mudah alih -
<img src="https://lolly.tools/tool/<id>.<ext>?<inputs>">. Kelongsong merender anak itu secara tempatan (piksel pemegang tempat dipaparkan sehingga render tempatan selesai); tiada apa yang pernah diambil daripadalolly.tools.
Gubah render mana-mana alat: anak SVG kekal sebagai vektor sebenar apabila induk mengeksport kepada SVG atau PDF dan merasterkan dengan tajam untuk PNG; anak PNG/JPG/WEBP dibenamkan sebagai imej. Memerlukan keupayaan compose. Anak gubahan adalah perantaraan - tidak pernah ditanda air atau distempel provenans - dan gubahan merosot dengan anggun: kelongsong yang tidak dapat merender anak hanya mengetepikan slot itu dan induk tetap dirender.
Apa yang kami sengaja pilih untuk tidak dilakukan
- Tiada EJS / tiada JS sewenang-wenangnya dalam templat. Permukaan XSS adalah sifar. Logik berada dalam
hooks.js. - Tiada CMS aset yang wajib. Individu memasukkan fail kreatif mereka sendiri terus ke dalam Aset di dalam aplikasi (Aset dan Studio Jenama) - tiada pelayan, tiada konsol pentadbir. Kerja diserahkan sebagai satu sesi: satu pautan kongsi membawa input dan tetapannya (fail dimuat naik bergerak dalam satu
.lolly), dan sesi yang sama turut serta dalam sandaran atau melalui sesi kerjasama. Sesiapa yang mengawal penggunaan itu kemudiannya boleh mengunci satu sesi kongsi sebagai satu templat - buka pautan itu, rekodkan nilainya sebagai entri templat dalam direktori alat itu di dalam pek jenama dan commit - selepas itu ia muncul dalam pemilih "New from template" alat itu dan boleh dipaut terus sebagai?template=<id>. Git ialah langkah kunci pemilik penggunaan, bukan sekali-kali langkah pencipta. Untuk katalog yang dikongsi dan ditadbir, sesebuah organisasi boleh menguruskan direktori aset dengan cara yang sama dan mengawal kemas kini melalui semakan PR - satu model tadbir urus yang tersedia, bukan satu keperluan aplikasi. - Tiada RBAC yang dipaksa. Aplikasi terbuka bersifat akses awam secara lalai; risiko jenama diuruskan melalui tag kematangan + tera air. Organisasi yang mahukan kawalan lebih ketat melapiskan pengesahan miliknya sendiri di atas katalog yang disemak git di atas.
- Tiada pangkalan data pusat. Semua keadaan pengguna adalah bagi setiap peranti; penyegerakan pilihan menyalinnya ke storan pilihan pengguna, tidak sekali-kali ke pangkalan data Lolly.
- Tiada laluan kod alat/enjin yang dikongsi. Enjin itu bersumber terbuka dan begitu juga alat tanpa jenama dalam
community/; satu pek jenama sepertibrands/suse/yang persendirian membawa alat dan katalog miliknya sendiri di bawah terma tersendiri. Walau apa pun caranya, pemisahan itu dikuatkuasakan (tiada import silang daripadaengine/ke dalam kandungan alat) supaya pemisahan itu kekal bersih.
Kitaran hayat satu render
Seorang pengguna membuka lolly.tools/#/tool/qr-code?url=https://suse.com&ecl=H:
- Boot. Cangkang web membuka IndexedDB, membina jambatan keupayaan, menyegerakkan katalog alat dan aset (atau memuatkan daripada cache apabila luar talian).
- Route. Hash URL → paparan
tool, denganqr-codedan parameter URL diekstrak. - Load.
loadTool('qr-code', fetchFile)mengambiltool.json, mengesahkannya terhadap Skema JSON, mengambil sumbertemplate.html,styles.cssdanhooks.js. - Parse URL state.
parseUrlStatementerjemah parameter URL kepada nilai input awal. Rujukan aset (?logo=suse/logo/primary) dihurai sebagai objek ringan{ id, _unresolved: true }. - Runtime.
createRuntime(tool, host, initialValues)membina model input (menggabungkan data profil, nilai lalai dan nilai awal), menyelesaikan rujukan aset melaluihost.assets.get(), memuatkan hook (hostbersfera penutupan, bukan disandkotak), memanggilhooks.onInit. - Render. Cangkang melanggan runtime; pada setiap perubahan keadaan ia menerima
{ model, hydrated }. Ia merender kawalan input daripada model dan menulis HTML templat yang telah dihidrat ke dalam#tool-canvas. - Interact. Pengguna menaip dalam satu input →
runtime.setInput(id, value)→ kekangan dikenakan →hooks.onInputdipanggil → hidrat semula → render semula. Kanvas dikemas kini secara langsung. - Export. Pengguna klik Muat Turun(PNG) →
runtime.export(canvasNode, 'png')→host.export.render(merasterkan melalui dom-to-image-more; SVG/PDF melalui vektorisasi khusus yang melintasi DOM) → blob →host.export.download. Julat format yang boleh dipilih oleh sesuatu alat adalah luas, dan enumrender.formatsdalamschemas/tool.schema.jsonadalah rujukan muktamad baginya - raster dan raster apung, vektor dan fail potong, cetak/CMYK, pergerakan, dokumen boleh sunting (pptx,docx,odt), palet dan output data/teks, fail audio dan fon. URL Mode menamakan setiap id dan apa yang dihasilkannya. Audio berada dalam enum itu seperti yang lain (wav,mp3,m4a,opus, diisytiharkan oleh audiogram dan alat rakaman); secara berasingan, modrender.capturesesuatu alat rakaman memacuhost.recorder, yang hasil rakamannya tiba sebagai Blob siap dalam bekas apa jua yang dirakam oleh pelayar. (Alat yang menetapkanrender.export: false- contohnya Color Palette, Countdown Timer, Strip Hidden Data, Text, Compress PDF - menyembunyikan kawalan muat turun/format/dimensi.) Unit fizikal ditukar mengikut format di sini (PDF → titik halaman sebenar, raster → piksel pada DPI dengan cebisanpHYs). Metadata pengarangan/asal usul (pengarang, alat, sumber - dibina olehengine/src/metadata.ts) disematkan mengikut format: PNG iTXt, JPEG EXIF, kamus info PDF,<metadata>SVG, komen GIF. Alat eksperimen mendapat tera air yang disisipkan oleh host, bukan oleh alat itu sendiri.
signed by Lollyvector SVG77 paths~6.0k nodes87 groups3 images88 KBSemak sendiriDapatkan fail yang ditandatangani
signed by Lollyvector SVG77 paths~6.0k nodes87 groups3 images88 KBSemak sendiriDapatkan fail yang ditandatangani
Kitaran hayat sama dalam Tauri. Kitaran hayat sama dalam CLI - jsdom menyediakan DOM tanpa kepala; output pergi ke fail atau stdout.
Status sumber terbuka
Kod adalah MPL-2.0. engine/, shells/, services/, schemas/ dan docs/*.ts adalah sumber terbuka di bawah MPL-2.0 - platform perancah neutral-vendor untuk perkakas jenama, semuanya dalam satu repositori awam, lolly-tools/lolly.
Kandungan alat dihantar sebagai pek jenama, setiap satu dengan terma tersendiri (lihat NOTICE.md pek berkenaan). community/ ialah direktori repositori ini dan alatnya yang neutral-jenama juga MPL-2.0. brands/suse/ ialah pek suse-lolly yang peribadi, satu-satunya submodul: alat SUSE dan katalog SUSE, hak milik SUSE, termasuk muzik PremiumBeat berlesennya. brands/lolly-start/ ialah jenama permulaan kosong yang dimiliki oleh repositori ini. Fon dihantar di dalam pek di bawah SIL Open Font License 1.1 - pek SUSE membawa taip aksara SUSE dan SUSE Mono.
Tiada direktori tools/ atau catalog/ pada akar repositori. packages/node-shell/src/content-roots.ts menjawab "di mana alat <id> berada" dan "di mana katalog berada" daripada profiles.json pada masa bacaan, jadi profil adalah jawapan bagi setiap proses dan tiada pepohon perlu disusun terlebih dahulu. Pasangan tools/ + catalog/ sebenar hanya ditulis ke dalam output binaan - dist/, muatan RPM, imej bekas - kerana pelayar mengambil kedua-dua laluan itu melalui HTTP.
Pemisahan itu dikuatkuasakan - tiada import silang daripada engine/ ke dalam kandungan alat - supaya sempadan platform/kandungan kekal bersih.
Di mana enjin berakhir dan hos bermula
Jika anda boleh menghuraikannya dalam data tulen + Handlebars → enjin. Jika ia menyentuh DOM, sistem fail, rangkaian atau mana-mana API pelayar/OS → hos.
Garisan itu tajam dengan sengaja. Enjin ialah bahagian sumber terbuka. Segala yang mengetahui tentang SUSE, platform khusus atau persekitaran masa jalan kekal di luarnya.
Untuk peringkat butiran seterusnya, engine/README.md menyenaraikan setiap modul enjin dan apa yang menjadi tanggungjawabnya, dan Model Ancaman & Sempadan Amanah merekodkan di mana garisan yang sama itu turut menjadi sempadan amanah.