अवलोकन

signed by Lollyoverview.htmlHTMLAI generatedgenerated by Claudeखुद जाँचेंGet the signed filepixels, not shapes12 KB

Lolly Icon - बड़ी हरी और सफ़ेद लॉलीपॉप कैंडी

यह दस्तावेज़ Lolly प्लेटफ़ॉर्म के उद्देश्य, संरचना और आर्किटेक्चरल निर्णयों को दर्ज करता है। यह प्रोडक्ट विज़न और कोडबेस की वर्तमान स्थिति, दोनों को दर्शाता है।

स्थिति: Lolly एक आंतरिक प्रोटोटाइप है जो एक क्लोज़्ड पायलट में है जो अभी पूरा नहीं हुआ है। इंजन डिटरमिनिस्टिक और आंतरिक रूप से सुसंगत है, लेकिन प्रोडक्ट अभी शुरुआती चरण में है - SUSE ग्राहक नंबर एक है - और इसके क्रिप्टोग्राफ़ी और फ़ाइल-पार्सिंग इंजन इस समय SUSE की सख़्त इन्फ़्रास्ट्रक्चर हार्डनिंग से गुज़र रहे हैं, एंटरप्राइज़ स्केल के लिए तैयारी करते हुए (हम इसमें वाक़ई अच्छे हैं)। नीचे दिए गए आर्किटेक्चर को परीक्षण के दौरान डिज़ाइन इरादे के रूप में पढ़ें, न कि किसी तैयार, प्रमाणित प्रोडक्ट के रूप में। पायलट कैसे चलाया और मापा जाता है, इसके लिए देखें Adoption & Governance

इस पेज को कैसे पढ़ें। इसमें दो तरह की सामग्री है, क्रम में। पहला आधा हिस्सा है यह क्यों मौजूद है: समस्या, पोज़िशनिंग और वह जीवनचक्र जिससे एक एसेट गुज़रता है। The big picture से आगे यह है लेयर्स कैसे फ़िट होती हैं: योगदानकर्ताओं के लिए आर्किटेक्चर दस्तावेज़, जो engine/shell/pack पृथक्करण, रिपॉज़िटरी लेआउट, डिलीवरी लक्ष्य और उन प्रतिबद्धताओं को कवर करता है जो प्लेटफ़ॉर्म में हर बदलाव को सीमित करती हैं। अगर आप प्रोडक्ट समझने के बजाय कोडबेस बदलने के लिए यहाँ हैं, तो big picture से शुरू करें।

दो साथी दस्तावेज़ इस पेज से आगे गहराई में जाते हैं। रिपॉज़िटरी में engine/README.md इंजन का मॉड्यूल-दर-मॉड्यूल मानचित्र है, हर मॉड्यूल और वह क्या पार्स या लिखता है, इसकी जनरेट की गई तालिका के साथ। Threat Model & Trust Boundaries वही आर्किटेक्चर है जिसे ट्रस्ट बाउंड्री के रूप में पढ़ा गया है, और इंजन किसे अविश्वसनीय मानता है, इस बारे में किसी भी सवाल के लिए यही सही पेज है।


यह क्यों मौजूद है

टीमों को बार-बार आने वाली एक समस्या का सामना करना पड़ता है: दोहराया जाने वाला क्रिएटिव और कंटेंट काम जो हर बार कुशल हाथों को जोड़ने के लायक होने के लिए बहुत पूर्वानुमानित है, लेकिन बिना किसी सुरक्षा उपाय के सौंपने के लिए बहुत गुणवत्ता-संवेदनशील है। नतीजा या तो धीमी गति (विशेषज्ञ बॉटलनेक), असंगति (लोग जो भी टूल उनके पास है उसका उपयोग करते हुए) या वेंडर लॉक-इन (एक SaaS DAM जो आपके टेम्पलेट को नियंत्रित करता है) होता है।

यह प्लेटफ़ॉर्म इसका सीधा जवाब है:

बड़े पैमाने पर प्रोग्रामेटिक क्रिएटिव और कंटेंट - बिना श्रम के एसेट जनरेशन, नियमों पर केंद्रीय नियंत्रण के साथ, कर्मचारियों, वेंडर्स और पार्टनर्स के लिए।

Lolly वह जगह नहीं है जहाँ एक डिज़ाइन सिस्टम का आविष्कार होता है - यह वह जगह है जहाँ इसका उत्पादन होता है। इसे डिज़ाइन के लिए एक वेंडिंग मशीन की तरह सोचें: एक चयन करें, एक नतीजा पाएँ। हर बार। इंजन उस हार्डवेयर पर हर फ़ॉर्मैट जितनी बेहतरीन गुणवत्ता दे सकता है, उसके लिए काम करता है जो आपके सामने है, और वही इंजन हर सतह पर वही फ़ाइल बनाता है जिस पर यह शिप होता है।

नतीजा है प्रचुरता: हर इवेंट में सही साइनेज है, हर CVE अलर्ट हाउस स्टाइल से मेल खाता है, हर लेबल साफ़ प्रिंट होता है, हर ईमेल हस्ताक्षर मौजूदा है - यह सब बिना किसी डिज़ाइन टिकट के। यह प्लेटफ़ॉर्म दोहराए जाने वाले संचालित क्रिएटिव काम को संभालता है। यह जान-बूझकर कोई कस्टम क्रिएटिव टूल नहीं है - डिज़ाइनर अब भी फ़्लैगशिप काम के मालिक बने रहते हैं।

प्रायिकतापूर्वक नवाचार करें, निश्चयात्मक रूप से स्केल करें

क्रिएटिव पाइपलाइन में AI को लेकर हर बहस एक ही सवाल पर अटक जाती है: इसका कौन-सा हिस्सा मशीन का काम है? यह एक पुराना सवाल है जिसका जवाब पहले ही तय है। शास्त्री और चित्रकार पहले से ही दो औज़ारों के बीच काम करते थे - ढीला स्केच, जहाँ कुछ भी तय नहीं था और सब कुछ आज़माया जा सकता था, और प्रिंटिंग प्रेस, जो ठीक इसलिए डरावनी थी क्योंकि वह प्रतिबद्ध हो जाती थी। स्केच वह जगह थी जहाँ कला घटती थी। प्रेस वह तरीक़ा था जिससे वह किसी तक पहुँचती थी। किसी ने भी इन दोनों को उलझाया नहीं, और दोनों आगे बढ़ते रहे - नई स्याहियाँ, नए टाइपफ़ेस, नए प्रेस - हर एक शिल्प और उसके इरादे के साथ तालमेल में बेहतर होता गया।

Lolly वही रेखा खींचता है। प्रायिकतापूर्वक अन्वेषण करें: एक मॉडल, एक डिज़ाइनर, एक कच्चा विचार, एक प्रॉम्प्ट जो किसी अनियोजित जगह जा पहुँचता है। फिर निश्चयात्मक रूप से स्केल करें - जो चीज़ दस हज़ार आउटपुट तक पहुँचती है वह एक टूल है, और एक टूल हर बार इनपुट से एक जैसा रेंडर होता है जिन्हें आप पढ़ सकते हैं। अन्वेषण स्वतंत्र बना रहता है क्योंकि उसके बाद कुछ भी इस पर निर्भर नहीं करता कि वह दोबारा एक जैसा हो। आउटपुट भरोसा कमाता है क्योंकि वह अनुमान नहीं है। AI प्रयोग को पूर्वानुमेय, दोहराए जा सकने वाले नतीजों में बदलना कोई नई अनुशासन नहीं है; यह वही श्रम-विभाजन है जिसने प्रिंटेड काम को शुरू से भरोसेमंद बनाया।

क्रिएटिव प्रक्रिया पर भरोसा करें, कठोरता के साथ स्केल करें।

विकल्पों के मुक़ाबले

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

आज के क्रिएटिव टूल्स में क्षमता की पूर्णता, अगस्त 2026 में शोध की गई। स्कोरिंग: 0 अनुपस्थित, 25 वर्कअराउंड-स्तर, 50 असली लेकिन गेटेड या आंशिक, 75 मज़बूत पर सीमाओं के साथ, 100 मूल क्षमता।

signed by Lollypositioning-comparison.htmlHTMLAI generatedgenerated by Claudeखुद जाँचेंGet the signed filepixels, not shapes38 KB

अंतर साफ़ है: आज कुछ भी जो शिप हो रहा है वह हमें बाधा-केंद्रित, ऑफ़लाइन-सक्षम, कम-कौशल, आंतरिक रूप से सुलभ आउटपुट नहीं देता। Lolly में एक ओपन कैनवास भी शामिल है - Design - जहाँ रंग, टाइप और एसेट ब्रांड ग्लोबल्स के अनुरूप रहते हैं, ताकि मुक्त व्यवस्था भी बाधा-केंद्रित बनी रहे। जो यह नहीं है वह है एक असीमित डिज़ाइन सुइट: डिज़ाइनर बेस्पोक फ़्लैगशिप काम के लिए Illustrator और Figma का उपयोग जारी रखते हैं। इस टूल से क्रमचय संयोजित किए जा सकते हैं।

लाइब्रेरी का हर टूल एक कार्ड के रूप में, श्रेणी के अनुसार समूहीकृत, ताकि एक निर्माता एक चुनकर शुरू कर सकेsigned by Lollyvector SVGखुद जाँचेंGet the signed file281 paths~38k nodes443 groups6 images2,269 KBलाइब्रेरी का हर टूल एक कार्ड के रूप में, श्रेणी के अनुसार समूहीकृत, ताकि एक निर्माता एक चुनकर शुरू कर सकेsigned by Lollyvector SVGखुद जाँचेंGet the signed file281 paths~38k nodes443 groups6 images2,270 KB

इसका उपयोग करें: संचालित क्रिएटिव एसेट का तेज़ जनरेशन - इवेंट टाइल, नेम बैज, हस्ताक्षर, CVE अलर्ट, QR कोड, सोशल कार्ड, कंसाइनमेंट लेबल, संरचित रिपोर्ट।

इसका उपयोग न करें: बेस्पोक हीरो कंटेंट के लिए।


एक अभियान का जीवनचक्र

Lolly क्या है यह देखने का सबसे स्पष्ट तरीक़ा फ़ीचर सूची नहीं है - यह है एक अकेले एसेट का पीछा करना जब वह हाथ-दर-हाथ गुज़रता है। एक स्थानीयकृत कैंपेन कार्ड को संगठन में घूमते देखें:

  1. क्रिएटिव नियम तय करता है। एक डिज़ाइनर Design टूल में बेस टेम्पलेट लिखता है, ब्रांड के टाइपोग्राफ़ी और रंग वेरिएबल को हार्ड-कोड करते हुए। वे एक कार्ड नहीं बना रहे - वे बुनियादी काम एक बार कर रहे हैं ताकि उन्हें दोबारा हाथ से स्थानीयकरण न करना पड़े।
  2. डेवलपर इसे स्केल करता है। वही टेम्पलेट CLI के ज़रिए एक रात की पाइपलाइन में जोड़ा जाता है, ताकि हर बार एक ताज़ा चार्ट या नया भाषा वेरिएंट अपने आप जनरेट हो - कोई डिज़ाइनर फ़ाइल दोबारा नहीं खोलता।
  3. निर्माता बस इसका उपयोग करता है। एक सेल्स प्रतिनिधि, विमान में ऑफ़लाइन, वही टूल खोलता है और क्लाइंट मीटिंग के लिए पूरी तरह से ऑन-ब्रांड डेक जनरेट करता है। कोई डिज़ाइन कौशल नहीं, कोई नेटवर्क नहीं, कोई इंतज़ार नहीं।

दूसरे चरण में "ताज़ा चार्ट" ऐसा ही एक रेंडर है, जो एक डेटा स्ट्रिंग और कुछ पैरामीटर से बनता है, बिना किसी के डिज़ाइन फ़ाइल खोले:

एक शीर्षक वाला स्टैक्ड एरिया चार्ट, जिसकी तीन सीरीज़ एक कूल पैलेट में बैंड की गई हैं, जिसमें एक्सिस, लेजेंड और टाइटल हाथ से नहीं बल्कि टेम्पलेट द्वारा रखे गए हैंsigned by Lollyvector SVGखुद जाँचेंGet the signed file15 paths~1.3k nodes4 groups21 KBएक शीर्षक वाला स्टैक्ड एरिया चार्ट, जिसकी तीन सीरीज़ एक कूल पैलेट में बैंड की गई हैं, जिसमें एक्सिस, लेजेंड और टाइटल हाथ से नहीं बल्कि टेम्पलेट द्वारा रखे गए हैंsigned by Lollyvector SVGखुद जाँचेंGet the signed file15 paths~1.3k nodes4 groups21 KB

मुद्दा यह नहीं है कि Lolly डिज़ाइनरों के लिए और डेवलपर्स के लिए और सेल्स के लिए अलग-अलग अच्छा है, हर एक अकेले में। यह एक रिले रेस है: क्रिएटिव का शुरुआती काम डेवलपर द्वारा स्केल किया जाता है, जो बदले में निर्माता को सशक्त बनाता है। विमान में मौजूद ग़ैर-तकनीकी प्रतिनिधि के लिए सहज अनुभव तभी संभव है क्योंकि डिज़ाइनर ने कठोरता तय की और डेवलपर ने उसे डिप्लॉय किया।

यही फ़ोर्स मल्टीप्लायर है। Lolly अलग-अलग भूमिकाओं के लिए अलग-अलग टूल की दराज नहीं है - यह एक डिटरमिनिस्टिक एसेट जीवनचक्र है जिसे हर भूमिका छूती है, और हर हाथ जिससे यह गुज़रता है वह पिछले के मूल्य को बढ़ा देता है।


एक स्वीकृति, दस हज़ार एसेट

क्योंकि स्वीकृति फ़ाइल में नहीं, टूल में रहती है (देखें How Lolly compares), स्केल एक समीक्षा समस्या नहीं रह जाती। एक स्थानीयकृत सोशल-कार्ड टूल को एक बार स्वीकृत करें, फिर एक स्प्रेडशीट से 12 भाषाओं में 10,000 एसेट जनरेट करें - और इनमें से किसी को भी क़ानूनी या ब्रांड टीम से नई अनुपालन जाँच की ज़रूरत नहीं होती, क्योंकि वह टेम्पलेट जिससे ये सब आते हैं पहले ही स्वीकृत हो चुका था।

वही डिटरमिनिस्टिक टूल इस स्केल तक तीन तरीक़ों से पहुँचता है, सब एक जैसा, पहले से स्वीकृत आउटपुट देते हुए:

फ़्रेश इंस्टॉल पर Batch मोड: किसी टूल का इंतज़ार करती एक खाली पंक्ति, जिसमें कोई डेटा आने से पहले ही पूरी स्प्रेडशीट सतह और उसका Render बटन मौजूद हैsigned by Lollyvector SVGखुद जाँचेंGet the signed file348 paths~77k nodes537 groups7 images3,100 KBफ़्रेश इंस्टॉल पर Batch मोड: किसी टूल का इंतज़ार करती एक खाली पंक्ति, जिसमें कोई डेटा आने से पहले ही पूरी स्प्रेडशीट सतह और उसका Render बटन मौजूद हैsigned by Lollyvector SVGखुद जाँचेंGet the signed file348 paths~77k nodes544 groups7 images3,103 KB

एक ही ब्रांड बाधाओं का सेट, एक डिज़ाइनर द्वारा एक बार तय किया गया; समान पूर्व-स्वीकृत आउटपुट तक तीन रास्ते - और मशीन वाला रास्ता सबसे आगे तक स्केल होता है, क्योंकि फ़ाइलें आते समय यह कभी नहीं थकता।


बड़ी तस्वीर: लेयर्स कैसे फ़िट होती हैं

यहाँ से नीचे सब कुछ आर्किटेक्चर है। यह डायग्राम पूरे सिस्टम को एक नज़र में दिखाता है: टूल ऊपर डेटा हैं, बीच में इंजन किसी भी प्लेटफ़ॉर्म के बारे में कुछ नहीं जानता, उसके नीचे शेल एक कॉन्ट्रैक्ट को लागू करते हैं, और कैटलॉग कंटेंट देते हैं।

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

रिपॉज़िटरी लेआउट

कंटेंट पैक के रूप में माउंट होता है: community/, docs/, हर shells/, दोनों services/ और brands/suse हर एक अपनी ख़ुद की रिपॉज़िटरी है, जो इस रिपॉज़िटरी के git सबमॉड्यूल के रूप में चेक आउट की जाती है। पैरेंट के पास engine/, schemas/, scripts/, tests/, api/, brands/lolly-start/ और profiles.json हैं। चेकआउट कमांड और क्रॉस-रिपॉज़िटरी वर्कफ़्लो के लिए देखें Build Guide » Getting the source

lolly/
├── engine/           # Platform-agnostic core. Open source (MPL-2.0).
│   └── src/
│       ├── index.ts          # public surface - loader, runtime, template, inputs, url-mode
│       ├── loader.ts         # fetches and validates tool files
│       ├── runtime.ts        # orchestrates the 5-step lifecycle
│       ├── template.ts       # Handlebars hydration + annotateTemplate
│       ├── inputs.ts         # manifest → runtime input model
│       ├── url-mode.ts       # URL ↔ input state round-trip
│       ├── validate.ts       # JSON Schema validation of manifests
│       ├── compose.ts        # resolve nested tool renders (composes)
│       ├── embed.ts          # parse portable lolly.tools embed URLs
│       └── bridge/
│           └── host-v1.ts    # type re-export of the @lolly-tools/core contract
│
├── shells/
│   ├── web/          # PWA - hosted online; primary distribution
│   │   └── src/
│   │       ├── main.ts           # boot, routing
│   │       ├── theme.ts          # theme apply/persist (FOUC prevention)
│   │       ├── bridge/           # web implementations of HostV1 APIs
│   │       │   ├── index.ts      # compose all bridge pieces
│   │       │   ├── db.ts         # IndexedDB setup
│   │       │   ├── state.ts      # host.state - saved edits
│   │       │   ├── profile.ts    # host.profile - user details
│   │       │   ├── assets.ts     # host.assets - catalog + user uploads
│   │       │   ├── clipboard.ts  # host.clipboard
│   │       │   ├── export.ts     # host.export - rasterise/serialize
│   │       │   ├── net.ts        # host.net - allowlisted fetch
│   │       │   └── media.ts      # host.media - live camera frames (onFrame)
│   │       ├── catalog/
│   │       │   └── sync.ts       # boot-time catalog sync + offline cache
│   │       ├── styles/           # app-wide CSS (app.css, picker.css, tokens.css)
│   │       └── views/
│   │           ├── gallery.ts    # tool library listing + saved-state cards
│   │           ├── tool.ts       # mounts one tool (inputs + canvas + actions)
│   │           ├── picker.ts     # asset picker UI (invoked by host.assets)
│   │           ├── profile.ts    # user details editor
│   │           ├── projects.ts   # /p - folders of saved sessions (nested; folder/selection export)
│   │           └── free-canvas.ts # free-canvas editor overlay for render.layout:"editor" tools
│   │
│   ├── cli/          # Node.js CLI - same engine, headless jsdom
│   │   ├── bin/lolly.ts
│   │   └── src/
│   │       ├── run.ts    # loadTool → createRuntime → export → write file
│   │       └── bridge.ts # CLI implementation of HostV1
│   │
│   ├── tui/          # Interactive terminal shell (Ink) - reuses the CLI bridge
│   │   └── src/
│   │       ├── main.tsx  # full-screen app: Gallery / Projects / Profile / ToolView
│   │       └── bridge.ts # CLI bridge + on-disk state under ~/.lolly
│   │
│   ├── tauri-desktop/ # downloadable desktop app
│   └── tauri-mobile/  # iOS/Android app
│
├── tools/            # profile VIEW (gitignored) - data, not code. Merged from packs:
│                     #   community/ (public, brand-agnostic, MPL) + brands/<active>/tools (brand-owned).
│                     #   A SELECTION follows - the mounted set depends on the profile.
│   ├── qr-code/
│   ├── quotes/
│   ├── email-signature/
│   ├── snippet/
│   ├── countdown-timer/
│   ├── color-palette/
│   ├── color-block/           # typed/heterogeneous blocks (addMenu discriminator)
│   ├── dynamic-layout/
│   ├── tool-logo/         # "Logo" - auto-switching brand logo
│   ├── street-map/        # offline vector city-block maps
│   ├── url-shot/          # "URL Screenshot" (capture capability)
│   ├── strip-data/        # on-device metadata strip - JPEG/PNG/SVG/PDF (file in → clean file out)
│   ├── compress-pdf/      # on-device PDF compressor - recompresses images (file in → smaller file out)
│   ├── brand-lockup/      # "Brand Lockup" - SUSE logo lockups; HarfBuzz text-to-path (wasm)
│   ├── chart-creator/     # SVG charts from structured data
│   ├── filter/            # photo effects in one tool - halftone/scanline/posterize/voronoi (vector), duotone/pixel-stretch/imperfections (raster)
│   ├── meeting-planner/   # global timezone meeting scheduler
│   ├── calendar-ics/      # event → .ics calendar file plus a card
│   ├── digi-ad/           # "Animated Ad" - looping banner from scenes
│   ├── event-name-badge/  # conference badges - composes qr-code as an SVG
│   ├── wayfinding-signage/ # event signage; directions blocks auto-fit label text
│   ├── text-helper/       # on-device text workbench (format/decode/hash/de-identify)
│   ├── design/     # "Design" - freeform WYSIWYG editor canvas (render.layout: editor)
│   ├── multi-page-pdf/    # multi-page PDF document - cover, flowing content blocks, back page
│   ├── diagram-builder/   # org / layercake / process / cycle / pyramid diagrams
│   ├── logo-wall/         # many logos → auto-packed grid
│   ├── logo-lockup-partner/ # SUSE + partner co-brand lockup
│   ├── icon/          # favicon .ico / png / svg from text + colours
│   ├── lottie-digi-ad/    # animated Lottie ad banners
│   └── pose-geeko/        # pose the SUSE Geeko mascot - print-ready stills
│
├── catalog/
│   ├── tools/index.json        # tool registry
│   └── assets/
│       ├── index.json          # asset registry
│       └── suse/...            # logo, palette, etc.
│
├── schemas/          # JSON Schema for tool.json, asset entries, AssetRef
├── scripts/          # build-catalog-index.ts, checksum-assets.ts, validate-catalog.ts
├── tests/            # engine tests
└── docs/             # this file + authoring guides + positioning

प्लेटफ़ॉर्म डिलीवरी मॉडल

यह प्लेटफ़ॉर्म कई सतहों पर चलता है - web PWA, Tauri desktop/mobile, स्क्रिप्ट योग्य CLI और इंटरैक्टिव TUI। इन सबका इंजन और टूल फ़ाइलें एक जैसी हैं।

Web (PWA) - मुख्य वितरण

एक SUSE-नियंत्रित URL पर होस्ट किया गया। सर्विस वर्कर द्वारा टूल और एसेट कैश किए जाने के बाद ऑफ़लाइन काम करता है। यहीं ज़्यादातर कर्मचारी, वेंडर और पार्टनर प्लेटफ़ॉर्म का उपयोग करेंगे। किसी खाते की ज़रूरत नहीं - स्थिति हर डिवाइस पर IndexedDB में संग्रहित होती है।

वेब शेल एक ही लेआउट से रिस्पॉन्सिव है। डेस्कटॉप पर एक टूल एक आकार बदली जा सकने वाली नियंत्रण साइडबार होती है जो प्रीव्यू स्टेज के बग़ल में होती है, ट्रैकपैड-नेटिव कैनवास नेविगेशन के साथ (Cmd/Ctrl-व्हील या पिंच से कर्सर पर ज़ूम, Space- या मिडिल-ड्रैग से पैन, 0/1/+/ कुंजियाँ और एक Fit/% HUD)। मोबाइल पर (≤640px) नियंत्रण एक टॉप-एंकर्ड शीट बन जाते हैं जिसमें एक ड्रैग ग्रिप होती है जो peek/half/full में स्नैप होती है (टैप टॉगल करता है) एक स्थिर फ़ुल-स्क्रीन प्रीव्यू के ऊपर, और एक फ़्लोटिंग Render बटन नीचे-शीट पॉपअप में Export नियंत्रण खोलता है। टच को प्रीव्यू पर पिंच-ज़ूम और ड्रैग-पैन मिलता है। रेंडर पाथ और एक्सपोर्ट नियंत्रण दोनों में एक जैसे हैं - सिर्फ़ क्रोम पुनर्व्यवस्थित होता है।

डेस्कटॉप स्प्लिट व्यू - बाईं ओर मैनिफ़ेस्ट से जनरेट किए गए नियंत्रण, दाईं ओर लाइव कैनवसsigned by Lollyvector SVGखुद जाँचेंGet the signed file5 paths989 nodes11 groups14 KBडेस्कटॉप स्प्लिट व्यू - बाईं ओर मैनिफ़ेस्ट से जनरेट किए गए नियंत्रण, दाईं ओर लाइव कैनवसsigned by Lollyvector SVGखुद जाँचेंGet the signed file5 paths989 nodes11 groups14 KB

वही टूल फ़ोन चौड़ाई पर, बनाए रखने के लिए कोई दूसरा लेआउट नहीं: नियंत्रण शीर्ष पर एक शीट बन जाते हैं, प्रीव्यू पूरी स्क्रीन घेर लेता है और रेंडर पिल उसके ऊपर तैरती है।

430px चौड़ी स्क्रीन पर एक ऑडियोग्राम - ऊपर कंट्रोल शीट, नीचे तैयार वर्गाकार आर्टवर्क और फ़्लोटिंग रेंडर पिलsigned by Lollyvector SVGखुद जाँचेंGet the signed file47 paths~1.9k nodes84 groups1 image212 KB430px चौड़ी स्क्रीन पर एक ऑडियोग्राम - ऊपर कंट्रोल शीट, नीचे तैयार वर्गाकार आर्टवर्क और फ़्लोटिंग रेंडर पिलsigned by Lollyvector SVGखुद जाँचेंGet the signed file47 paths~1.9k nodes84 groups1 image211 KB

बैच मोड (/pro)। वेब शेल एक स्प्रेडशीट-शैली की बैच ग्रिड (shells/web/src/pro/) भी प्रदान करता है जो एक या कई टूल में एक साथ कई पंक्तियाँ रेंडर करती है। यह CSV/TSV राउंड-ट्रिप के साथ-साथ स्प्रेडशीट पेस्ट, प्रति-पंक्ति टेम्पलेट/फ़ॉर्मैट/आकार/यूनिट/dpi, लाइव प्रीव्यू सहित एक ब्लॉक्स-एडिटर साइड पैनल, संकुचनीय एक्सपोर्ट कॉलम, प्रति-पंक्ति "प्रासंगिकता" टैग बार, बाईं ओर ड्रैग-हैंडल से पंक्ति पुनर्क्रम, दो-चरण डिलीट पुष्टि, सहेजे गए बैच सत्र और .zip डाउनलोड करती है। यह "mass content generation" पोज़िशनिंग के पीछे की वन-टू-मैनी सतह है।

Tauri डेस्कटॉप / मोबाइल

पैकेज्ड नेटिव ऐप (Tauri के ज़रिए छोटा फ़ुटप्रिंट)। पूर्ण ऑफ़लाइन उपलब्धता, CLI-निर्भर टूल (PDF Smasher, Font Outliner) के लिए फ़ाइलसिस्टम एक्सेस और कैमरा एक्सेस प्रदान करता है। 2026 के मध्य के लिए टूलिंग वृद्धि निर्धारित है।

CLI

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

डेस्कटॉप उपयोगकर्ता टर्मिनल से कई टूल चला सकते हैं। CLI शेल वही इंजन लोड करता है, एक jsdom DOM बनाता है, वही रेंडर पथ चलाता है और फ़ाइल लिखता है। URL मोड ही ट्रांसपोर्ट है - CLI कोई अलग इम्प्लीमेंटेशन नहीं है। यह सुनिश्चित करता है कि CLI और GUI आउटपुट समान हों।

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

TUI

npm run tui

CLI का इंटरैक्टिव समकक्ष: टूल ब्राउज़ करने, इनपुट भरने, प्रोजेक्ट सहेजने और एक्सपोर्ट करने के लिए एक फ़ुल-स्क्रीन, कीबोर्ड-फ़र्स्ट टर्मिनल ऐप (Ink पर बना) - यह सब बिना किसी GUI के। इसका होस्ट ब्रिज DOM-रहित फ़ॉर्मैट (SVG/EMF/EPS/HTML + टेक्स्ट/डेटा) के लिए CLI के इम्प्लीमेंटेशन का पुनः उपयोग करता है, और ~/.lolly के अंतर्गत ऑन-डिस्क स्टेट के साथ-साथ एक ऑप्ट-इन इनलाइन प्रीव्यू जोड़ता है। इसके अलावा इसमें एक ब्राउज़र रेंडर टियर है: एक स्कोप्ड हेडलेस Chromium (वही जिसे MCP सर्वर इंस्टॉल करता है) जो मांग पर रास्टर/PDF/वीडियो और लाइव-URL कैप्चर तैयार करता है - यह वेब शेल की एक बिल्ट कॉपी चलाता है ताकि आउटपुट समान रहे, और तभी लॉन्च होता है जब आप पहली बार ऐसा फ़ॉर्मैट एक्सपोर्ट करते हैं। इसलिए url-shot (क्रॉप + रीकलर + वेक्टर PDF/SVG सहित) और हर रास्टर/pdf टूल टर्मिनल में भी चलता है। TUI गाइड देखें।

आप चाहे किसी भी सतह पर हों, डैशबोर्ड का Capabilities टैब उस पूरे नक्शे को दिखाता है जो प्लेटफ़ॉर्म घोषित करता है कि वह क्या कर सकता है, समूहीकृत और बिना कोई टूल खोले पढ़ने योग्य।


टूल श्रेणियाँ

टूल को गैलरी समूहीकरण के लिए उनके मैनिफ़ेस्ट में एक category से टैग किया जाता है।

पंक्तियाँ गैलरी सेक्शन क्रम में सूचीबद्ध हैं। utility सेक्शन गैलरी में हमेशा सबसे अंत में रेंडर होता है (हर दूसरी श्रेणी के बाद, भविष्य की श्रेणियों सहित) - यह ऑन-डिवाइस "Offline Utilities" ड्रॉअर है।

श्रेणीउदाहरणयोजनाबद्ध
everyoneQR Code Generator, Quote Card, Email Signature, Logo, Wordmark, Audiogram, Battlecards, Sequence Studio, RecordEmployee Image Stationery
designerBrand Lockup, Design, Chart, Darkroom, Filter, Pose Geeko, Multi-Page PDFFont Outliner
eventMeeting Planner, Event Name Badge, Wayfinding Signage, Calendar ICS, Booth StudioEvent Stationery, Bulk Name Badges, Room Agenda Cards
product-CVE Alert, Product Release Announcement, Blog OG Image
utilityStrip Hidden Data, Text Helper, Compress PDF, Convert Image, Convert Font, Redact, Run Web Code, Screen Capture, URL ScreenshotUnit/format converters, more on-device privacy utilities

ये सेल उदाहरण हैं, सूची नहीं। कौन-से टूल मौजूद हैं यह आपके माउंट किए गए प्रोफ़ाइल का गुण है, इस पेज का नहीं: एक ब्रांड पैक अपने खुद के टूल जोड़ता है, और किसी कम्युनिटी टूल को शिप न करने का विकल्प चुन सकता है। catalog/tools/index.json - जो मैनिफ़ेस्ट से जनरेट होती है, और वही रजिस्ट्री है जिसे गैलरी वास्तव में पढ़ती है - आधिकारिक सूची है; कोई प्रोफ़ाइल क्या माउंट करती है यह गिनने के लिए, यहाँ लिखी किसी संख्या पर भरोसा करने के बजाय मैनिफ़ेस्ट गिनें (ls community//tool.json brands//tools/*/tool.json)। (दो पैक में मौजूद टूल id एक ही बार माउंट होती है, जीतने वाले पैक से।)

टूल को स्टेटस के अनुसार भी वर्गीकृत किया जाता है: official (ब्रांड द्वारा स्वीकृत, कोई वॉटरमार्क नहीं), community (बाहरी योगदान), experimental (वॉटरमार्क किए गए एक्सपोर्ट)। अधिकांश लाइब्रेरी official है; नए स्टूडियो और कैप्चर टूल स्थिर होने तक community या experimental में रहते हैं। हर सतह बैज दिखाती है, ताकि पाठक टूल खोलने से पहले जान सके कि वह क्या ले रहा है - और, ऊपर की श्रेणी सेल की तरह, प्रति-स्टेटस सदस्यता इतनी तेज़ी से बदलती है कि इसे यहाँ सूचीबद्ध नहीं किया जा सकता। इसे गैलरी या जनरेट की गई इंडेक्स से पढ़ें।

Design पहला टूल है जो render.layout: "editor" फ़्री-कैनवस मोड पर बना है - एक क्रोमलेस, डायरेक्ट-मैनिपुलेशन सतह जहाँ आप टेक्स्ट, आकार और इमेज के बॉक्स को खींच, रीसाइज़, रोटेट और स्नैप कर सकते हैं, फिर हर दूसरे टूल की तरह उसी रेंडर पथ से एक्सपोर्ट कर सकते हैं।

Strip Hidden Data पहला ऑन-डिवाइस यूटिलिटी (privacy: "on-device") है: एक कंटेंट-ट्रांसफ़ॉर्म टूल जो आपके द्वारा दी गई फ़ाइल लेता है, उसे पूरी तरह ब्राउज़र में प्रोसेस करता है और एक साफ़ कॉपी वापस देता है - न कभी अपलोड होती है, न वॉटरमार्क होती है, न कोई प्रोवेनेंस स्टैम्प लगता है। Text Helper दूसरा है - रोज़मर्रा के पेस्ट-इनटू-अ-वेबसाइट कामों (JSON फ़ॉर्मैट, JWT डिकोड, Base64, URL एनकोड/डिकोड, SHA हैशिंग) के लिए एक ऑन-डिवाइस वर्कबेंच। Compress PDF तीसरा है - यह किसी PDF की इमेज को पुनः कंप्रेस करके उसे छोटा करता है, फिर से पूरी तरह ऑन-डिवाइस। मार्कर और उसका बैज टेक्स्ट "Runs on your device - nothing is uploaded" अब पूरे ट्रांसफ़ॉर्म सेट को कवर करता है: Strip Hidden Data, Text Helper, Compress PDF, Convert Image (HEIC/TIFF/AVIF → WebP/JPG/PNG), Convert Font, Redact (किसी इमेज, SVG या PDF के हिस्सों को नष्ट करना), Prompt to Image और Rebrand a Deck (किसी .pptx को जगह पर ही री-थीम करना) जहाँ प्रोफ़ाइल इसे माउंट करती है। यह एक प्राइवेसी-यूटिलिटी श्रेणी है जो गोपनीय फ़ाइलों को सिंगल-पर्पस वेबसाइट को सौंपने की जगह लेती है।

Utilities ड्रॉअर, जहाँ हर कार्ड एक ऐसा टूल है जो आपके पास पहले से मौजूद फ़ाइल को ट्रांसफ़ॉर्म करता हैsigned by Lollyvector SVGखुद जाँचेंGet the signed file154 paths~40k nodes234 groups802 KBUtilities ड्रॉअर, जहाँ हर कार्ड एक ऐसा टूल है जो आपके पास पहले से मौजूद फ़ाइल को ट्रांसफ़ॉर्म करता हैsigned by Lollyvector SVGखुद जाँचेंGet the signed file154 paths~40k nodes234 groups803 KB

नोट: category और status को हर tool.json से catalog/tools/index.json (वह रजिस्ट्री जिसे गैलरी पढ़ती है) में डीनॉर्मलाइज़ किया जाता है। मैनिफ़ेस्ट ही सत्य का स्रोत है - इंडेक्स को npm run build:catalog द्वारा जनरेट किया जाता है और यदि कमिट किया गया इंडेक्स मैनिफ़ेस्ट से भटक जाए तो npm run validate:catalog CI को विफल कर देता है।


आर्किटेक्चरल प्रतिबद्धताएँ

ये निर्णय तय हो चुके हैं। इनमें से किसी को भी बदलना एक बड़ा उपक्रम है - ये कोडबेस के हर दूसरे निर्णय को आकार देते हैं।

1. घोषणात्मक टूल, एक इम्पेरेटिव एस्केप हैच के साथ

एक टूल एक मैनिफ़ेस्ट (tool.json) + एक टेम्पलेट (template.html) + वैकल्पिक hooks.js है।

मैनिफ़ेस्ट इनपुट घोषित करता है। टेम्पलेट नहीं। इनपुट को Handlebars टोकन से अनुमानित नहीं किया जाता। मैनिफ़ेस्ट ही अनुबंध है; टेम्पलेट {{id}} द्वारा नामित वेरिएबल का उपयोग करता है।

Street Map का कंट्रोल स्टैक - एक सिटी ड्रॉपडाउन, एक थीम सिलेक्ट, वेट स्लाइडर और कलर ट्रिगर, इनमें से हर एक मैनिफ़ेस्ट की एक पंक्ति से लिया गयाsigned by Lollyvector SVGखुद जाँचेंGet the signed file39 paths~3.4k nodes70 groups2 images50 KBStreet Map का कंट्रोल स्टैक - एक सिटी ड्रॉपडाउन, एक थीम सिलेक्ट, वेट स्लाइडर और कलर ट्रिगर, इनमें से हर एक मैनिफ़ेस्ट की एक पंक्ति से लिया गयाsigned by Lollyvector SVGखुद जाँचेंGet the signed file39 paths~3.4k nodes70 groups2 images50 KB

हुक्स वैकल्पिक हैं। अधिकांश टूल शुद्ध रूप से घोषणात्मक हैं - मैनिफ़ेस्ट + टेम्पलेट ही काफी है। जिन टूल को गणना किए गए मान चाहिए (QR एनकोडिंग, चार्ट डेटा शेपिंग) वे hooks.js प्रदान करते हैं जो नामित लाइफ़साइकल फ़ंक्शन एक्सपोज़ करता है (onInit, onInput, onFrame - मोशन-रिएक्टिव टूल के लिए प्रति-फ़्रेम लाइव-कैमरा हुक - onLevel, beforeExport, afterExport, exportFile - Strip Hidden Data जैसी ऑन-डिवाइस यूटिलिटी द्वारा उपयोग किया जाने वाला फ़ाइल-इन/फ़ाइल-आउट ट्रांसफ़ॉर्म पथ - और exportStill, उस टूल के लिए जो अपना खुद का डीप रास्टर संभालता है)। होस्ट हुक्स को new Function('host', …) के ज़रिए लोड करता है, जिसमें capability bridge को क्लोज़र स्कोप के रूप में इंजेक्ट किया जाता है। यह एक पोर्टेबिलिटी अनुबंध है, सुरक्षा सैंडबॉक्स नहीं: हुक्स फिर भी पेज रीयल्म में चलते हैं और ब्राउज़र शेल में window/fetch/document तक पहुँच सकते हैं - host. समर्थित, पोर्टेबल सतह है, कोई लागू सीमा नहीं। असिंक्रोनस हुक परिणाम समय-सीमित हैं (onInit 5s, onInput 2s, beforeExport/afterExport 5s, exportFile/exportStill 10s) और देर से आए परिणाम त्याग दिए जाते हैं; एक बेकाबू सिंक्रोनस* हुक को रोका नहीं जा सकता। इसलिए Worker आइसोलेशन आने तक अविश्वसनीय थर्ड-पार्टी हुक कोड चलाना सुरक्षित नहीं है।

यह इसलिए मायने रखता है: घोषणात्मक टूल को गैर-डेवलपर भी बना सकते हैं। यदि हर टूल एक वेब ऐप होता, तो जोखिम नोट "वर्कहॉर्स टेम्पलेट बनाने/बनाए रखने के लिए सीमित कौशल" एक स्थायी बॉटलनेक बन जाता।

2. टूल और एसेट डेटा हैं, बंडल किया गया कोड नहीं

वेब और Tauri ऐप बूट के समय एक ज्ञात URL से टूल और एसेट कैटलॉग फ़ेच करते हैं, उन्हें स्थानीय रूप से कैश करते हैं और जो भी वहाँ मौजूद है उस पर काम करते हैं। कोई नई इवेंट टाइल या सीज़नल एसेट जोड़ने के लिए ऐप रिलीज़ की ज़रूरत नहीं है।

CDN पॉइज़निंग रोकने के लिए एसेट बाइट्स को SHA-256 चेकसम किया जाता है। एसेट id + version कैश इनवैलिडेशन को नियंत्रित करता है।

3. Capability Bridge ही एकमात्र API है जो टूल देखते हैं

टूल कभी भी अपने टेम्पलेट क्षेत्र के बाहर DOM को नहीं छूते, कभी सीधे fetch कॉल नहीं करते, कभी फ़ाइलसिस्टम नहीं पढ़ते। वे संस्करणबद्ध host.* मेथड कॉल करते हैं। अनुबंध की प्रामाणिक परिभाषा packages/core/src/host-v1.ts में है - टूल-लेखक SDK @lolly-tools/core, ताकि कोई थर्ड पार्टी इंजन पर निर्भर हुए बिना इसके आधार पर बना सके; engine/src/bridge/host-v1.ts इसका एक टाइप री-एक्सपोर्ट है, और इंजन/शेल कोड उसी पथ से इम्पोर्ट करना जारी रखता है:

Bridge APIयह क्या करता है
host.profileउपयोगकर्ता का पहला नाम, ईमेल, हेडशॉट, शहर, आदि। bindToProfile के ज़रिए इनपुट को पहले से भरता है।
host.assetsकैटलॉग क्वेरी, एसेट रिज़ॉल्यूशन, होस्ट द्वारा प्रदान किया गया पिकर UI।
host.stateइनपुट स्लॉट सहेजें/लोड करें। वेब पर IndexedDB, Tauri पर फ़ाइलसिस्टम, CLI पर मेमोरी।
host.clipboardक्लिपबोर्ड पर टेक्स्ट या इमेज लिखें (प्लेटफ़ॉर्म फ़ॉलबैक सहित)।
host.exportरेंडर टारगेट को रास्टराइज़ या सीरियलाइज़ करता है। एक्सपेरिमेंटल टूल के लिए वॉटरमार्क लगाता है।
host.netअनुमति-सूची में शामिल फ़ेच - केवल तभी उपलब्ध जब टूल ने "network" capability घोषित की हो। (फिलहाल कोई शिपिंग टूल इसका उपयोग नहीं करता।)

वैकल्पिक, एडिटिव सतहें केवल तभी दिखाई देती हैं जब कोई शेल उन्हें प्रदान करता है। कुछ capability-gated हैं - केवल तभी एक्सपोज़ होती हैं जब टूल संबंधित फ़्लैग घोषित करता है: host.compose (किसी अन्य टूल के रेंडर को एम्बेड करना - compose), host.capture (URL Screenshot के लिए पेज कैप्चर - capture) और host.recorder (रिकॉर्डिंग टूल के लिए माइक/कैमरा/डिस्प्ले कैप्चर - microphone / camera / screen)। बाकी फ़ीचर-डिटेक्टेड हैं - जब भी शेल उन्हें प्रदान कर सकता है तब मौजूद रहती हैं, और जो शेल नहीं कर सकते उनके लिए टूल एक फ़ॉलबैक रखता है।

यह दिखाने के लिए कि यह क्या-क्या कवर करता है, कुछ प्रमुख सतहें - Host API इनमें से हर एक का दस्तावेज़ीकरण करता है, और packages/core/src/host-v1.ts स्वयं अनुबंध है:

सरफ़ेसकब सेयह क्या जोड़ता है
host.tokens1.0DTCG डिज़ाइन टोकन - ब्रांड के अपने प्रिमिटिव
host.text1.0HarfBuzz WASM के ज़रिए टेक्स्ट-टू-पाथ (wasm क्षमता उन टूल को फ़्लैग करती है जो इस पर निर्भर हैं)
host.media1.4onFrame हुक चलाने वाले लाइव कैमरा फ़्रेम। प्रोग्रेसिव एन्हांसमेंट, जानबूझकर camera फ़्लैग से गेट नहीं किया गया - ऐसा टूल फिर भी एक सामान्य स्टिल-इमेज टूल की तरह काम करता है
host.color1.40परसेप्चुअल कलर मैथ्स: ΔEOK, WCAG + APCA कॉन्ट्रास्ट, OKLab रैम्प, क्लास-ब्रेक, केटेगोरिकल पैलेट, हार्मनी स्कीम (1.60), CSS Color 4 मिक्सिंग और ग्रेडिएंट बेकिंग (1.68)। शुद्ध और सिंक्रोनस - शेल इंजन का makeColorApi() जोड़ते हैं न कि खुद कुछ लागू करते हैं, इसलिए इसमें ड्रिफ़्ट नहीं हो सकता
host.images1.60डिवाइस पर बाइट्स को डिकोड / रीसाइज़ / री-एन्कोड करना - कन्वर्ट पाथ (HEIC → JPEG, WebP में कंप्रेस, डाउनस्केल)। वेब शेल में एक lazy facade के रूप में शिप किया गया, इसलिए HEIC डिकोडर कभी बूट चंक में नहीं जाता
host.geom1.64सटीक वेक्टर ज्यामिति: पाथ बूलियन, ऑफ़सेटिंग, स्ट्रोक-टू-फ़िल, स्प्लाइन लोअरिंग, सरलीकरण, हिट टेस्टिंग। यह भी शुद्ध, सिंक्रोनस और इंजन से जुड़ा हुआ है (makeGeomApi()); विफलताएँ लौटाई जाती हैं, कभी थ्रो नहीं की जातीं

बाकी सतहें भी वही नियम मानती हैं और उनके साथ ही दस्तावेज़ीकृत हैं: ऑन-डिवाइस डॉक्यूमेंट सर्जरी के लिए pdf (1.8) और pptx (1.58), क्लिप विश्लेषण और ऑन-डिवाइस TTS/ट्रांसक्रिप्शन के लिए audio (1.71) और speech (1.96), MilkDrop प्लेसहोल्डर अनुबंध के लिए viz (1.72), डीप-बिट और लेयर्ड-बिटमैप आउटपुट के लिए codec (1.100) और layers (1.102), ऑन-डिवाइस मॉडल के लिए upscale (1.101) और matte (1.103), अपना पिक्सेल कार्य खुद करने वाले हुक्स के लिए raster (1.105), एक्सपोर्ट-सेफ़ ऐरो के लिए connectors (1.106) और तैयार बाइट्स पर हस्ताक्षर करने के लिए c2pa (1.85)। संख्या बढ़ती है; नियम नहीं।

घोषित की जा सकने वाली capability हैं: network, filesystem, clipboard, camera, microphone, screen, ffmpeg, wasm, capture, compose। (screen, जो 1.54 में जोड़ी गई, host.recorder के ज़रिए डिस्प्ले कैप्चर है - उपयोगकर्ता ब्राउज़र-नेटिव UI में स्क्रीन/विंडो/टैब चुनता है; यह capture से अलग है, जो टूल द्वारा खुद नामित किसी URL को रास्टराइज़ करता है।)

वही टूल ब्राउज़र, Tauri और हेडलेस CLI में चलता है क्योंकि हर शेल इस इंटरफ़ेस को लागू करता है - टूल को कभी पता नहीं होता कि वह किसमें चल रहा है।

ब्रिज संस्करणबद्ध है। मेथड जोड़ना एक माइनर वर्शन है। हटाना या सिग्नेचर बदलना एक मेजर वर्शन बंप है। जब v2 शिप होगा, तब भी v1 को काम करते रहना चाहिए।

4. एसेट ID हमेशा के लिए हैं

suse/logo/primary एक अनुबंध है। एक बार प्रकाशित होने पर:

इससे सहेजी गई टूल स्थितियाँ और URL-साझा लिंक वर्षों तक टिकाऊ बने रहते हैं।

5. URL मोड फ़र्स्ट-क्लास है

हर इनपुट को URL पैरामीटर के रूप में व्यक्त किया जा सकना चाहिए:

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

वह लिंक अपने आप में, उसमें कुछ और न होने पर भी, तैयार एसेट हैsigned by Lollyvector SVGखुद जाँचेंGet the signed file17 paths~2.0k nodes39 groups24 KBवह लिंक अपने आप में, उसमें कुछ और न होने पर भी, तैयार एसेट हैsigned by Lollyvector SVGखुद जाँचेंGet the signed file17 paths~2.0k nodes39 groups24 KB

CLI मोड एक अलग ट्रांसपोर्ट के तहत URL मोड ही है - CLI शेल argv से एक URL-स्टेट ऑब्जेक्ट बनाता है और वही इंजन पाइपलाइन चलाता है। रेंडर पथ एक ही है। CLI GUI से भटक नहीं सकता क्योंकि यह कोई अलग इम्प्लीमेंटेशन नहीं है।

url-mode.ts राउंड-ट्रिप (पार्स और सीरियलाइज़) संभालता है। reserved params का एक सेट कभी भी टूल को इनपुट के रूप में आगे नहीं भेजा जाता: आउटपुट नियंत्रण (format, export, copy, filename, width/w, height/h, unit, dpi), प्रिंट और प्रोवेनेंस डायल (bleed, marks, profile, password, c2pa, imprint, durable, meta, hdr, depth, cuts) और स्टेट कैरियर (template, z - "Shortest link" पैक्ड टोकन - और zx, वही पासवर्ड के तहत एन्क्रिप्ट किया गया)। engine/src/url-mode.ts में RESERVED सेट ही प्राधिकारी है और एक टेस्ट द्वारा पिन किया गया है; URL Mode इनमें से हर एक का दस्तावेज़ीकरण करता है, यहाँ सूचीबद्ध न किए गए कुछ के साथ भी। URL मोड में एसेट इनपुट को उनकी id से सीरियलाइज़ किया जाता है; रनटाइम उन्हें हाइड्रेशन से पहले host.assets.get() के ज़रिए रिज़ॉल्व करता है। width/height unit में मान हैं (डिफ़ॉल्ट px, साथ ही mm/cm/in/pt/pc); किसी भौतिक यूनिट के साथ dpi रास्टर रिज़ॉल्यूशन तय करता है। ये कैनवस डॉक्यूमेंट साइज़ सेट करते हैं और एक्सपोर्ट डाइमेंशन पैनल को पहले से भर देते हैं।

चूँकि हर इनपुट लिंक में यात्रा करता है, एक पैरामीटर बदलने पर एक अलग तैयार एसेट बनती है। यह पूरा पैलेट बस एक सीड कलर, एक हार्मनी और एक स्टेप काउंट है:

चार रंगों में फैले नौ चरण, सभी लिंक में मौजूद एक ही बीज रंग से उत्पन्नsigned by Lollyvector SVGखुद जाँचेंGet the signed file10 groups24 KBचार रंगों में फैले नौ चरण, सभी लिंक में मौजूद एक ही बीज रंग से उत्पन्नsigned by Lollyvector SVGखुद जाँचेंGet the signed file10 groups24 KB

6. स्टोरेज ब्रिज से होकर जाता है, सीधे नहीं

वेब शेल: IndexedDB। Tauri: फ़ाइल सिस्टम। CLI: इन-मेमोरी। टूल्स को केवल host.state.save(slot, data) और host.state.load(slot) दिखते हैं। localStorage का उपयोग नहीं किया जाता - यह बहुत छोटा है और blobs रख नहीं सकता।

उपयोगकर्ता प्रति टूल कई नामित एडिट स्लॉट सेव कर सकते हैं और बाद में हर सेशन पर वापस लौट सकते हैं। किसी अकाउंट बनाने की आवश्यकता नहीं है; स्टेट प्रति-डिवाइस होता है। चूँकि ब्रिज ही एकमात्र सीम है, वह प्रति-डिवाइस स्टेट भी पोर्टेबल है: shells/web/src/data-transfer.ts host.profile/host.state/host.assets के ज़रिए सब कुछ वापस पढ़कर एक ही lolly-backup ज़िप में डाल देता है, जिसे किसी भी दूसरे इंस्टॉल पर इम्पोर्ट किया जा सकता है - "नए डिवाइस पर जाने" का ऑफ़लाइन जवाब, जिसे किसी सर्वर की ज़रूरत नहीं (पूरा स्पेक: docs/data-transfer.md)। SUSE ID इंटीग्रेशन (मल्टी-डिवाइस सिंक) इसके ऊपर एक भावी माइलस्टोन है।

7. मैच्योरिटी टैग "ब्रांड द्वारा स्वीकृत" जोखिम का उत्तर डिज़ाइन से देते हैं

हर टूल अपने मैनिफ़ेस्ट में status: official | community | experimental घोषित करता है। गैलरी स्टेटस के अनुसार क्रमबद्ध होती है। एक्सपेरिमेंटल टूल्स अपने एक्सपोर्ट पर स्वचालित रूप से वॉटरमार्क लगाते हैं - वॉटरमार्क host.export.render द्वारा लगाया जाता है, टूल द्वारा नहीं, इसलिए किसी गैर-आधिकारिक टूल लेखक द्वारा इसे बंद नहीं किया जा सकता।

यह इस धारणा-जोखिम का संरचनात्मक उत्तर है कि किसी भी टूल का उपयोग करना ब्रांड की स्वीकृति दर्शाता है। प्रक्रिया-आधारित उत्तर (एक रिव्यू क्यू, SUSE ID गेटिंग) इसके ऊपर परत के रूप में जुड़ते हैं।

8. टूल इनपुट, एसेट्स सहित, मैनिफ़ेस्ट के ज़रिए टाइप किए जाते हैं

इनपुट एक type घोषित करते हैं: text, longtext, number, boolean, color, select, asset, date, time, datetime-local, url, blocks, vector, table और file। होस्ट मैनिफ़ेस्ट से हर टाइप के लिए एक जेनेरिक कंट्रोल रेंडर करता है - टूल्स कोई कंट्रोल कोड नहीं लिखते। (उपयोगकर्ता की प्रोफ़ाइल से प्री-फ़िल करना कोई टाइप नहीं है - कोई भी इनपुट bindToProfile रख सकता है।) तीन बाकियों से ज़्यादा महत्वपूर्ण हैं:

9. टेम्पलेट लॉजिक-रहित होते हैं (Handlebars, EJS नहीं)

Handlebars को जानबूझकर EJS के बजाय चुना गया:

लॉजिक hooks.js में रहता है, जहाँ यह स्पष्ट और समीक्षा योग्य होता है। उपलब्ध Handlebars हेल्पर्स: {{default}}, {{upper}}, {{lower}}, {{eq}}, {{markdown}}, {{asset ref}}, {{asset ref "property"}} (साथ ही डेटा-फ़ॉर्मेट हेल्पर्स icsStamp/rfcText/csvCell, जो साथी .ics/.vcf/.csv टेम्पलेट्स में उपयोग होते हैं)।

10. टूल्स, टूल्स को कंपोज़ करते हैं

कोई टूल बिना किसी टूल-टू-टूल इम्पोर्ट के दूसरे टूल के रेंडर को एम्बेड कर सकता है - कंपोज़िशन को इंजन हल करता है, कभी टूल कोड नहीं। इसके दो सरफ़ेस हैं:

किसी भी टूल के रेंडर को कंपोज़ करें: एक SVG चाइल्ड, जब पैरेंट SVG या PDF में एक्सपोर्ट करता है, तब भी सच्चा वेक्टर बना रहता है और PNG के लिए स्पष्ट रूप से रास्टराइज़ होता है; PNG/JPG/WEBP चाइल्ड्स इमेज के रूप में एम्बेड होते हैं। इसके लिए compose क्षमता चाहिए। कंपोज़ किए गए चाइल्ड्स इंटरमीडिएट होते हैं - इन्हें कभी वॉटरमार्क या प्रोवेनन्स-स्टैम्प नहीं किया जाता - और कंपोज़िशन सुचारू रूप से डिग्रेड होती है: जो शेल किसी चाइल्ड को रेंडर नहीं कर सकता, वह बस उस स्लॉट को छोड़ देता है और पैरेंट फिर भी रेंडर होता रहता है।


हमने जानबूझकर क्या नहीं करने का चुनाव किया


जीवनचक्र, आरंभ से अंत तक

एक उपयोगकर्ता lolly.tools/#/tool/qr-code?url=https://suse.com&ecl=H खोलता है:

  1. बूट। वेब शेल IndexedDB खोलता है, क्षमता ब्रिज का निर्माण करता है, टूल और एसेट कैटलॉग सिंक करता है (या ऑफ़लाइन होने पर कैश से लोड करता है)।
  2. रूट। URL हैश → tool व्यू, जिसमें qr-code और URL पैरामीटर निकाले जाते हैं।
  3. लोड। loadTool('qr-code', fetchFile) tool.json फ़ेच करता है, JSON Schema के विरुद्ध वैलिडेट करता है, template.html, styles.css और hooks.js सोर्स फ़ेच करता है।
  4. URL स्टेट पार्स करें। parseUrlState URL पैरामीटर को प्रारंभिक इनपुट मानों में अनुवादित करता है। एसेट रेफ़ (?logo=suse/logo/primary) को हल्के { id, _unresolved: true } ऑब्जेक्ट के रूप में पार्स किया जाता है।
  5. रनटाइम। createRuntime(tool, host, initialValues) इनपुट मॉडल बनाता है (प्रोफ़ाइल डेटा, डिफ़ॉल्ट्स और प्रारंभिक मानों को मर्ज करके), host.assets.get() के ज़रिए एसेट रेफ़ हल करता है, हुक्स लोड करता है (क्लोज़र-स्कोप्ड host, सैंडबॉक्स्ड नहीं), और hooks.onInit को कॉल करता है।
  6. रेंडर। शेल रनटाइम को सब्सक्राइब करता है; हर स्टेट परिवर्तन पर उसे { model, hydrated } मिलता है। यह मॉडल से इनपुट कंट्रोल्स रेंडर करता है और हाइड्रेटेड टेम्पलेट HTML को #tool-canvas में लिखता है।
  7. इंटरैक्ट। उपयोगकर्ता किसी इनपुट में टाइप करता है → runtime.setInput(id, value) → कंस्ट्रेंट्स लागू होते हैं → hooks.onInput कॉल होता है → री-हाइड्रेट → री-रेंडर। कैनवस लाइव अपडेट होता है।
  8. एक्सपोर्ट। उपयोगकर्ता Download(PNG) पर क्लिक करता है → runtime.export(canvasNode, 'png')host.export.render (dom-to-image-more के ज़रिए रास्टराइज़ करता है; SVG/PDF समर्पित DOM-वॉकिंग वेक्टराइज़र्स से गुज़रते हैं) → blob → host.export.download। कोई टूल जिस फ़ॉर्मेट रेंज को अपना सकता है वह व्यापक है, और schemas/tool.schema.json में render.formats enum ही इस पर प्राधिकारी है - रास्टर और फ़्लोट रास्टर, वेक्टर और कट फ़ाइलें, प्रिंट/CMYK, मोशन, संपादन योग्य दस्तावेज़ (pptx, docx, odt), पैलेट और डेटा/टेक्स्ट आउटपुट, ऑडियो और फ़ॉन्ट फ़ाइलें। URL Mode हर id और वह क्या उत्पन्न करता है, दोनों बताता है। ऑडियो भी उसी enum में बाकियों की तरह शामिल है (wav, mp3, m4a, opus, जो audiogram और रिकॉर्डिंग टूल्स द्वारा घोषित किए जाते हैं); अलग से, किसी रिकॉर्डिंग टूल का render.capture मोड host.recorder चलाता है, जिसका टेक ब्राउज़र द्वारा रिकॉर्ड किए गए कंटेनर में एक पूर्ण Blob के रूप में आता है। (जो टूल render.export: false सेट करते हैं - जैसे Color Palette, Countdown Timer, Strip Hidden Data, Text Helper, Compress PDF - वे डाउनलोड/फ़ॉर्मेट/डाइमेंशन कंट्रोल्स छिपा देते हैं।) भौतिक इकाइयाँ यहाँ प्रति फ़ॉर्मेट परिवर्तित की जाती हैं (PDF → सच्चे पेज पॉइंट्स, रास्टर → DPI पर पिक्सेल एक pHYs चंक के साथ)। लेखकत्व/प्रोवेनन्स मेटाडेटा (लेखक, टूल, स्रोत - engine/src/metadata.ts द्वारा निर्मित) प्रति फ़ॉर्मेट एम्बेड किया जाता है: PNG iTXt, JPEG EXIF, PDF info dict, SVG <metadata>, GIF comment। एक्सपेरिमेंटल टूल्स में वॉटरमार्क होस्ट द्वारा डाला जाता है, टूल द्वारा नहीं।

वह एक्सपोर्ट पैनल जिसे ?options खोलता है: फ़ाइलनाम और फ़ॉर्मेट जोड़ी, आउटपुट साइज़ और फ़ाइल लिखने वाले कंट्रोल्सsigned by Lollyvector SVGखुद जाँचेंGet the signed file49 paths~3.3k nodes61 groups3 images74 KBवह एक्सपोर्ट पैनल जिसे ?options खोलता है: फ़ाइलनाम और फ़ॉर्मेट जोड़ी, आउटपुट साइज़ और फ़ाइल लिखने वाले कंट्रोल्सsigned by Lollyvector SVGखुद जाँचेंGet the signed file49 paths~3.3k nodes61 groups3 images74 KB

Tauri में भी वही जीवनचक्र। CLI में भी वही जीवनचक्र - jsdom हेडलेस DOM प्रदान करता है; आउटपुट किसी फ़ाइल या stdout में जाता है।


ओपन-सोर्स स्थिति

कोड MPL-2.0 है। engine/, shells/, services/, schemas/ और docs/ MPL-2.0 के तहत ओपन सोर्स हैं - ब्रांड टूलिंग के लिए एक वेंडर-न्यूट्रल स्कैफ़ोल्डिंग प्लेटफ़ॉर्म, जिसमें हर शिप करने योग्य इकाई github.com/lolly-tools के तहत अपनी खुद की रिपॉज़िटरी में है।

टूल कंटेंट ब्रांड पैक के रूप में शिप होता है, हर एक अपनी शर्तों के साथ (पैक की NOTICE.md देखें)। community/ सार्वजनिक lolly-tools रिपॉज़िटरी है और इसके ब्रांड-अज्ञेय टूल भी MPL-2.0 हैं। brands/suse/ निजी suse-lolly पैक है: SUSE टूल और SUSE कैटलॉग, SUSE की स्वामित्व वाली संपत्ति, इसके लाइसेंस प्राप्त PremiumBeat संगीत सहित। brands/lolly-start/ वह खाली स्टार्टर ब्रांड है जिसका स्वामित्व इस रिपॉज़िटरी के पास है। फ़ॉन्ट एक पैक के भीतर SIL Open Font License 1.1 के तहत शिप होते हैं - SUSE पैक में SUSE और SUSE Mono टाइपफ़ेस हैं।

रिपॉज़िटरी-रूट के tools/ और catalog/ गिटइग्नोर्ड व्यू हैं: एक प्रोफ़ाइल इन्हें community/ और सक्रिय ब्रांड पैक से मिलाकर बनाती है, यही कारण है कि हर स्क्रिप्ट और शेल इन दोनों पथों को पढ़ते हैं और कभी सीधे किसी पैक को नहीं।

यह विभाजन लागू किया जाता है - engine/ से टूल कंटेंट में कोई क्रॉस-इम्पोर्ट नहीं है - ताकि प्लेटफ़ॉर्म/कंटेंट सीमा साफ़ बनी रहे।


जहाँ इंजन समाप्त होता है और होस्ट शुरू होता है

अगर इसे शुद्ध डेटा + Handlebars में वर्णित किया जा सकता है → इंजन। अगर यह DOM, फ़ाइल सिस्टम, नेटवर्क या किसी ब्राउज़र/OS API को छूता है → होस्ट

यह सीमा जानबूझकर स्पष्ट रखी गई है। इंजन ओपन-सोर्स हिस्सा है। जो कुछ भी SUSE, विशिष्ट प्लेटफ़ॉर्म या रनटाइम वातावरण के बारे में जानता है, वह इससे बाहर रहता है।

अगले स्तर के विवरण के लिए, engine/README.md हर इंजन मॉड्यूल और उसकी ज़िम्मेदारी को सूचीबद्ध करता है, और Threat Model & Trust Boundaries यह दर्ज करता है कि वही सीमा कहाँ एक ट्रस्ट बाउंड्री का भी काम करती है।