Lolly
ऐप खोलें

अवलोकन

signed by Lollyoverview.htmlHTMLpixels, not shapes12 KBAI generatedgenerated by Claudeखुद जाँचेंसाइन की हुई फ़ाइल पाएँ

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

signed by Lollypositioning-comparison.htmlHTMLpixels, not shapes40 KBAI generatedgenerated by GPT-6खुद जाँचेंसाइन की हुई फ़ाइल पाएँ

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

लाइब्रेरी का हर टूल एक कार्ड के रूप में, श्रेणी के अनुसार समूहीकृत, ताकि एक निर्माता एक चुनकर शुरू कर सके signed by Lollyvector SVG367 paths~62k nodes773 groups3 images1,453 KBखुद जाँचेंसाइन की हुई फ़ाइल पाएँलाइब्रेरी का हर टूल एक कार्ड के रूप में, श्रेणी के अनुसार समूहीकृत, ताकि एक निर्माता एक चुनकर शुरू कर सके signed by Lollyvector SVG367 paths~62k nodes776 groups3 images1,454 KBखुद जाँचेंसाइन की हुई फ़ाइल पाएँ

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

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


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

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

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

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

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

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

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


एक टूल, कई आउटपुट

ब्रांड नियम टूल में रहते हैं, हर उस फ़ाइल में नहीं जिसे यह बनाता है (देखें Lolly की तुलना कैसे की जाए)। टूल को एक बार ठीक कर लें, तो हर आउटपुट वही टाइप, रंग और स्पेसिंग अपनाता है, चाहे वह एक कार्ड हो या एक दर्जन भाषाओं में पंक्तियों की एक स्प्रेडशीट। आप अपने काम की जाँच कैसे करते हैं, और कौन करता है, यह आप पर ही रहता है; Lolly जाँचने लायक़ चीज़ को छोटा और आउटपुट को बनाने में तेज़ बनाता है।

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

फ़्रेश इंस्टॉल पर Batch मोड: किसी टूल का इंतज़ार करती एक खाली पंक्ति, जिसमें कोई डेटा आने से पहले ही पूरी स्प्रेडशीट सतह और उसका Render बटन मौजूद है signed by Lollyvector SVG133 paths~15k nodes185 groups1 image195 KBखुद जाँचेंसाइन की हुई फ़ाइल पाएँफ़्रेश इंस्टॉल पर Batch मोड: किसी टूल का इंतज़ार करती एक खाली पंक्ति, जिसमें कोई डेटा आने से पहले ही पूरी स्प्रेडशीट सतह और उसका Render बटन मौजूद है signed by Lollyvector SVG133 paths~15k nodes185 groups1 image195 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   │
                └─────────────────────────────────────────────┘

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

Lolly एक रिपॉजिटरी है। इसमें engine/, schemas/, scripts/, tests/, api/, docs/, community/, brands/lolly-start/, हर shells/ और दोनों services/ सामान्य डायरेक्टरी हैं। एक अपवाद है brands/suse, जो एक निजी git सबमॉड्यूल है जिसमें SUSE टूल पैक और कैटलॉग हैं, यह ऑप्ट-इन है और सार्वजनिक क्लोन में मौजूद नहीं होता। किसी बिल्ड में कौन-से पैक पढ़े जाते हैं यह एक कंटेंट प्रोफ़ाइल (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
│
├── community/        # the brand-agnostic tool pack - data, not code. Public (MPL-2.0).
│                     #   A SELECTION follows; a profile mounts these plus whatever
│                     #   tools the active brand pack carries of its own.
│   ├── qr-code/
│   ├── snippet/
│   ├── countdown-timer/
│   ├── color-palette/
│   ├── street-map/        # offline vector city-block maps
│   ├── url-shot/          # "URL Screenshot" (capture capability)
│   ├── strip-data/        # on-device metadata strip - JPEG/PNG/SVG/PDF (file in → clean file out)
│   ├── compress-pdf/      # on-device PDF compressor - recompresses images (file in → smaller file out)
│   ├── chart/             # SVG charts from structured data
│   ├── filter/            # photo effects in one tool - halftone/scanline/posterize/voronoi (vector), duotone/pixel-stretch/imperfections (raster)
│   ├── meeting-planner/   # global timezone meeting scheduler
│   ├── calendar-ics/      # event → .ics calendar file plus a card
│   ├── wayfinding-signage/ # event signage; directions blocks auto-fit label text
│   ├── text-helper/       # on-device text workbench (format/decode/hash/de-identify)
│   ├── design/     # "Design" - freeform WYSIWYG editor canvas (render.layout: editor)
│   ├── multi-page-pdf/    # multi-page PDF document - cover, flowing content blocks, back page
│   ├── diagram-builder/   # org / layercake / process / cycle / pyramid diagrams
│   ├── logo-wall/         # many logos → auto-packed grid
│   ├── icon/              # favicon .ico / png / svg from text + colours
│   └── lottie-digi-ad/    # animated Lottie ad banners
│
├── brands/            # brand packs - a catalog each, and optionally tools of their own
│   ├── lolly-start/   # the blank starter brand, owned here
│   │   └── catalog/
│   │       ├── tools/index.json    # tool registry, generated per brand
│   │       └── assets/
│   │           ├── index.json      # asset registry
│   │           └── lolly/...       # logo, palette, tokens
│   └── suse/          # PRIVATE submodule - the SUSE tools and the SUSE catalog
│
├── schemas/          # JSON Schema for tool.json, asset entries, AssetRef
├── scripts/          # build-catalog-index.ts, checksum-assets.ts, validate-catalog.ts
├── tests/            # engine tests
└── docs/             # this file + authoring guides + positioning

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

यह प्लेटफ़ॉर्म कई सतहों पर चलता है - 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 SVG131 paths~6.1k nodes158 groups1 image142 KBखुद जाँचेंसाइन की हुई फ़ाइल पाएँ

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

430px चौड़ी स्क्रीन पर एक ऑडियोग्राम - ऊपर कंट्रोल शीट, नीचे तैयार वर्गाकार आर्टवर्क और फ़्लोटिंग रेंडर पिल signed by Lollyvector SVG97 paths~3.3k nodes113 groups99 KBखुद जाँचेंसाइन की हुई फ़ाइल पाएँ430px चौड़ी स्क्रीन पर एक ऑडियोग्राम - ऊपर कंट्रोल शीट, नीचे तैयार वर्गाकार आर्टवर्क और फ़्लोटिंग रेंडर पिल signed by Lollyvector SVG97 paths~3.3k nodes113 groups100 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

pnpm 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, RecordEmployee Image Stationery
designerBrand Lockup, Design, Chart, Darkroom, Filter, Pose Geeko, BookletFont Outliner
eventMeeting Planner, Event Name Badge, Wayfinding Signage, Calendar ICS, Booth StudioEvent Stationery, Bulk Name Badges, Room Agenda Cards
product-CVE Alert, Product Release Announcement, Blog OG Image
utilityStrip Hidden Data, Text, Compress PDF, Convert Image, Convert Font, Redact, Run Web Code, Screen Capture, URL 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 दूसरा है - रोज़मर्रा के पेस्ट-इनटू-अ-वेबसाइट कामों के लिए एक ऑन-डिवाइस वर्कबेंच (JSON फ़ॉर्मेट, JWT डिकोड, Base64, URL एनकोड/डिकोड, SHA हैशिंग)। Compress PDF तीसरा है - यह किसी PDF की छवियों को दोबारा कंप्रेस करके उसका आकार घटाता है, यह भी पूरी तरह ऑन-डिवाइस। मार्कर और इसका बैज टेक्स्ट "Runs on your device - nothing is uploaded" अब पूरे ट्रांसफ़ॉर्म सेट को कवर करता है: Strip Hidden Data, Text, Compress PDF, Convert Image (HEIC/TIFF/AVIF → WebP/JPG/PNG), Convert Font, Redact (किसी इमेज, SVG या PDF के हिस्सों को नष्ट करना), Prompt Card और Rebrand (किसी .pptx को उसी जगह री-थीम करना) जहाँ प्रोफ़ाइल इसे माउंट करती है। यह एक प्राइवेसी-यूटिलिटी श्रेणी है जो गोपनीय फ़ाइलों को सिंगल-पर्पज़ वेबसाइटों को सौंपने की जगह लेती है।

Utilities ड्रॉअर, जहाँ हर कार्ड एक ऐसा टूल है जो आपके पास पहले से मौजूद फ़ाइल को ट्रांसफ़ॉर्म करता है signed by Lollyvector SVG124 paths~29k nodes324 groups395 KBखुद जाँचेंसाइन की हुई फ़ाइल पाएँUtilities ड्रॉअर, जहाँ हर कार्ड एक ऐसा टूल है जो आपके पास पहले से मौजूद फ़ाइल को ट्रांसफ़ॉर्म करता है signed by Lollyvector SVG124 paths~29k nodes324 groups396 KBखुद जाँचेंसाइन की हुई फ़ाइल पाएँ

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


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

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

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

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

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

Street Map का कंट्रोल स्टैक - एक सिटी ड्रॉपडाउन, एक थीम सिलेक्ट, वेट स्लाइडर और कलर ट्रिगर, इनमें से हर एक मैनिफ़ेस्ट की एक पंक्ति से लिया गया signed by Lollyvector SVG39 paths~2.6k nodes54 groups2 images43 KBखुद जाँचेंसाइन की हुई फ़ाइल पाएँStreet Map का कंट्रोल स्टैक - एक सिटी ड्रॉपडाउन, एक थीम सिलेक्ट, वेट स्लाइडर और कलर ट्रिगर, इनमें से हर एक मैनिफ़ेस्ट की एक पंक्ति से लिया गया signed by Lollyvector SVG39 paths~2.6k nodes54 groups2 images43 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 SVG55 paths~2.6k nodes38 groups60 KBखुद जाँचेंसाइन की हुई फ़ाइल पाएँवह लिंक अपने आप में, उसमें कुछ और न होने पर भी, तैयार एसेट है signed by Lollyvector SVG55 paths~2.6k nodes38 groups61 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 SVG10 groups25 KBखुद जाँचेंसाइन की हुई फ़ाइल पाएँचार रंगों में फैले नौ चरण, सभी लिंक में मौजूद एक ही बीज रंग से उत्पन्न signed by Lollyvector SVG10 groups25 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)। मल्टी-डिवाइस सिंक पहले से इसी के ऊपर चलता है, और वही बंडल उस स्टोरेज पर भेजता है जो व्यक्ति चुनता है (docs/sync.md)।

7. परिपक्वता टैग बताते हैं कि कोई टूल क्या है

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

यह इस धारणा-जोखिम का संरचनात्मक उत्तर है कि गैलरी का हर टूल एक ही भार रखता प्रतीत हो। कोई टीम कैटलॉग के इर्द-गिर्द जो भी प्रक्रिया जोड़े, वह इसके ऊपर एक परत के रूप में ही जुड़ती है।

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. Boot. वेब शेल IndexedDB खोलता है, कैपेबिलिटी ब्रिज बनाता है, टूल और एसेट कैटलॉग सिंक करता है (या ऑफ़लाइन होने पर कैश से लोड करता है)।
  2. Route. URL hash → tool व्यू, जिसमें qr-code और URL पैरामीटर निकाले जाते हैं।
  3. Load. loadTool('qr-code', fetchFile) tool.json को फ़ेच करता है, JSON Schema के विरुद्ध सत्यापित करता है, और template.html, styles.css तथा hooks.js सोर्स फ़ेच करता है।
  4. Parse URL state. parseUrlState URL पैरामीटर को प्रारंभिक इनपुट मानों में बदलता है। एसेट संदर्भों (?logo=suse/logo/primary) को हल्के { id, _unresolved: true } ऑब्जेक्ट के रूप में पार्स किया जाता है।
  5. Runtime. createRuntime(tool, host, initialValues) इनपुट मॉडल बनाता है (प्रोफ़ाइल डेटा, डिफ़ॉल्ट और प्रारंभिक मान मिलाकर), host.assets.get() के ज़रिए एसेट संदर्भ हल करता है, हुक्स लोड करता है (क्लोज़र-स्कोप्ड host, सैंडबॉक्स्ड नहीं), और hooks.onInit को कॉल करता है।
  6. Render. शेल रनटाइम को सब्सक्राइब करता है; हर स्टेट बदलाव पर उसे { model, hydrated } मिलता है। यह मॉडल से इनपुट नियंत्रण रेंडर करता है और हाइड्रेटेड टेम्पलेट HTML को #tool-canvas में लिखता है।
  7. Interact. उपयोगकर्ता किसी इनपुट में टाइप करता है → runtime.setInput(id, value) → बाध्यताएँ लागू होती हैं → hooks.onInput कॉल होता है → री-हाइड्रेट → री-रेंडर। कैनवस लाइव अपडेट होता है।
  8. Export. उपयोगकर्ता 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, ऑडियोग्राम और रिकॉर्डिंग टूल द्वारा घोषित); अलग से, किसी रिकॉर्डिंग टूल का render.capture मोड host.recorder चलाता है, जिसका टेक एक तैयार Blob के रूप में उसी कंटेनर में आता है जिसमें ब्राउज़र ने रिकॉर्ड किया। (जो टूल render.export: false सेट करते हैं - जैसे Color Palette, Countdown Timer, Strip Hidden Data, Text, Compress PDF - वे डाउनलोड/फ़ॉर्मेट/डायमेंशन नियंत्रण छिपा देते हैं।) भौतिक इकाइयाँ यहाँ प्रति फ़ॉर्मेट परिवर्तित होती हैं (PDF → वास्तविक पेज पॉइंट्स, रास्टर → DPI पर पिक्सेल और एक pHYs chunk के साथ)। लेखकत्व/प्रोवेनेंस मेटाडेटा (author, tool, source - engine/src/metadata.ts द्वारा बनाया गया) प्रति फ़ॉर्मेट एम्बेड किया जाता है: PNG iTXt, JPEG EXIF, PDF info dict, SVG <metadata>, GIF comment। एक्सपेरिमेंटल टूल में वॉटरमार्क होस्ट द्वारा डाला जाता है, टूल द्वारा नहीं।

वह एक्सपोर्ट पैनल जिसे ?options खोलता है: फ़ाइलनाम और फ़ॉर्मेट जोड़ी, आउटपुट साइज़ और फ़ाइल लिखने वाले कंट्रोल्स signed by Lollyvector SVG77 paths~6.0k nodes87 groups3 images88 KBखुद जाँचेंसाइन की हुई फ़ाइल पाएँवह एक्सपोर्ट पैनल जिसे ?options खोलता है: फ़ाइलनाम और फ़ॉर्मेट जोड़ी, आउटपुट साइज़ और फ़ाइल लिखने वाले कंट्रोल्स signed by Lollyvector SVG77 paths~6.0k nodes87 groups3 images88 KBखुद जाँचेंसाइन की हुई फ़ाइल पाएँ

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


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

Code is MPL-2.0. engine/, shells/, services/, schemas/ और docs/*.ts MPL-2.0 के अंतर्गत ओपन सोर्स हैं - ब्रांड टूलिंग के लिए एक वेंडर-न्यूट्रल स्कैफ़ोल्डिंग प्लेटफ़ॉर्म, यह सब एक ही सार्वजनिक रिपॉजिटरी में, lolly-tools/lolly।

टूल कंटेंट ब्रांड पैक के रूप में शिप होता है, प्रत्येक की अपनी शर्तें होती हैं (पैक की NOTICE.md देखें)। community/ इसी रिपॉजिटरी की एक डायरेक्टरी है और इसके ब्रांड-निरपेक्ष टूल भी 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/ डायरेक्टरी नहीं है। packages/node-shell/src/content-roots.ts पढ़ने के समय profiles.json से "टूल <id> कहाँ है" और "कैटलॉग कहाँ है" का उत्तर देता है, इसलिए प्रोफ़ाइल हर प्रोसेस के लिए अलग उत्तर होती है और पहले किसी ट्री को असेंबल करने की ज़रूरत नहीं होती। एक वास्तविक tools/ + catalog/ जोड़ी केवल किसी बिल्ड आउटपुट में लिखी जाती है - dist/, कोई RPM पेलोड, कोई कंटेनर इमेज - क्योंकि ब्राउज़र उन दो पथों को HTTP पर फ़ेच करता है।

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


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

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

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

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