अवलोकन
![]()
यह दस्तावेज़ Lolly प्लेटफ़ॉर्म का उद्देश्य, संरचना और आर्किटेक्चर संबंधी निर्णय दर्ज करता है। यह प्रोडक्ट विज़न और कोडबेस की मौजूदा स्थिति — दोनों को दर्शाता है।
स्थिति: Lolly एक आंतरिक प्रोटोटाइप है, जो एक अभी पूरे नहीं हुए क्लोज़्ड पायलट में है। इंजन डिटर्मिनिस्टिक और आंतरिक रूप से सुसंगत है, लेकिन प्रोडक्ट अभी शुरुआती दौर में है — SUSE ग्राहक नंबर एक है — और इसके क्रिप्टोग्राफ़ी तथा फ़ाइल-पार्सिंग इंजन इस समय SUSE की सख़्त इन्फ्रास्ट्रक्चर हार्डनिंग से गुज़र रहे हैं, ताकि एंटरप्राइज़ पैमाने की तैयारी हो सके (इसमें हम वाक़ई माहिर हैं)। नीचे दिए आर्किटेक्चर को परीक्षणाधीन डिज़ाइन-इरादे के रूप में पढ़ें, न कि किसी तैयार, प्रमाणित प्रोडक्ट के रूप में। पायलट कैसे चलाया और मापा जाता है, इसके लिए अपनाना और गवर्नेंस देखें।
यह क्यों मौजूद है
टीमों के सामने एक बार-बार आने वाली समस्या है: ऐसा दोहराया जाने वाला क्रिएटिव और कंटेंट कार्य जो इतना अनुमानित है कि हर बार कुशल हाथों को लगाना उचित नहीं ठहरता, लेकिन गुणवत्ता के लिहाज़ से इतना संवेदनशील है कि उसे बिना गार्डरेल के सौंपा भी नहीं जा सकता। नतीजा या तो धीमा थ्रूपुट होता है (विशेषज्ञ की अड़चन), या असंगति (लोग जो भी टूल उनके पास हो उसी से काम चलाते हैं), या वेंडर लॉक-इन (एक ऐसा SaaS DAM जो आपके टेम्पलेट्स को नियंत्रित करता है)।
यह प्लेटफ़ॉर्म इसका संरचनात्मक उत्तर है:
बड़े पैमाने पर प्रोग्रामेटिक क्रिएटिव और कंटेंट — शून्य-श्रम ऐसेट निर्माण, जिसमें नियम केंद्रीय नियंत्रण में रहते हैं — कर्मचारियों, वेंडरों और पार्टनरों के लिए।
परिणाम है प्रचुरता: हर इवेंट के पास सही साइनेज है, हर CVE अलर्ट हाउस स्टाइल से मेल खाता है, हर लेबल साफ़ प्रिंट होता है, हर ईमेल सिग्नेचर अद्यतन रहता है — और यह सब बिना किसी डिज़ाइन टिकट के। प्लेटफ़ॉर्म बार-बार दोहराए जाने वाले, ऑपरेशनल बना दिए गए क्रिएटिव को संभालता है। यह जान-बूझकर कोई बीस्पोक क्रिएटिव टूल नहीं है — फ़्लैगशिप काम अब भी डिज़ाइनरों के हाथ में रहता है।
परिदृश्य में यह कहाँ फ़िट बैठता है

| क्षमता | Canva | ब्रांड पोर्टल | Illustrator | Figma / Penpot | Lolly |
|---|---|---|---|---|---|
| बड़े पैमाने पर कंटेंट निर्माण | आंशिक | ✗ | ✗ | ✗ | ✓ |
| पूरी तरह ऑफ़लाइन काम करता है | ✗ | ✗ | ✓ | आंशिक | ✓ |
| टेम्पलेट लॉजिक और सख़्त बाधाएँ | ✗ | आंशिक | ✗ | आंशिक | ✓ |
| डिज़ाइन कौशल की ज़रूरत नहीं | आंशिक | ✓ | ✗ | ✗ | ✓ |
| स्वचालित Content Credentials | ✗ | ✗ | आंशिक | ✗ | ✓ |
| टूल दूसरे टूलों को कंपोज़ करते हैं | ✗ | ✗ | ✗ | ✗ | ✓ |
| ओपन इंजन, SaaS-लॉक नहीं | ✗ | ✗ | ✗ | आंशिक | ✓ |
| C2PA कंटेंट क्रेडेंशियल | ✗ | ✗ | ✗ | ✗ | ✓ |
| ऑप्ट-इन फ़ोरेंसिक-स्तर की प्रोवेनेंस | ✗ | ✗ | ✗ | ✗ | ✓ |
| मोबाइल और डेस्कटॉप ऐप | ✓ | ✗ | ✗ | आंशिक | ✓ |
| कमांड लाइन और TUI | ✗ | ✗ | ✗ | ✗ | ✓ |
कमी साफ़ है: मौजूदा परिदृश्य में कुछ भी हमें कंस्ट्रेंट-फ़र्स्ट, ऑफ़लाइन-सक्षम, कम-कौशल, आंतरिक रूप से सुलभ आउटपुट नहीं देता। Lolly में एक खुला कैनवास भी शामिल है — Layout Studio — जहाँ रंग, टाइप और ऐसेट ब्रांड ग्लोबल्स के अनुरूप रहते हैं, ताकि मुक्त संयोजन भी कंस्ट्रेंट-फ़र्स्ट बना रहे। जो यह नहीं है, वह है एक अनियंत्रित डिज़ाइन सुइट: बीस्पोक फ़्लैगशिप काम के लिए डिज़ाइनर Illustrator और Figma का ही उपयोग करते रहते हैं। इस टूल से परम्यूटेशन असेंबल किए जा सकते हैं।
इसके लिए इस्तेमाल करें: ऑपरेशनल बनाए गए क्रिएटिव ऐसेट का तेज़ निर्माण — इवेंट टाइलें, नाम बैज, सिग्नेचर, CVE अलर्ट, QR कोड, सोशल कार्ड, कंसाइनमेंट लेबल, संरचित रिपोर्टें।
इसके लिए इस्तेमाल न करें: बीस्पोक हीरो कंटेंट।
एक कैंपेन का जीवनचक्र
Lolly क्या है, यह देखने का सबसे साफ़ तरीक़ा फ़ीचर की सूची नहीं है — बल्कि एक ही ऐसेट का पीछा करना है, जैसे वह एक हाथ से दूसरे हाथ पहुँचता है। एक लोकलाइज़्ड कैंपेन कार्ड को संगठन से गुज़रते हुए देखें:
- क्रिएटिव नियम तय करता है। एक डिज़ाइनर Layout Studio में बेस टेम्पलेट लिखता है और उसमें ब्रांड की टाइपोग्राफ़ी तथा रंग वेरिएबल हार्ड-कोड कर देता है। वह एक कार्ड नहीं बना रहा — वह बुनियादी काम एक बार कर रहा है, ताकि उसे फिर कभी हाथ से लोकलाइज़ न करना पड़े।
- डेवलपर उसे स्केल करता है। वही टेम्पलेट CLI के ज़रिए एक नाइटली पाइपलाइन में जुड़ जाता है, इसलिए ताज़ा चार्ट या किसी नई भाषा का वेरिएंट अपने-आप बन जाता है — कोई डिज़ाइनर फ़ाइल दोबारा नहीं खोलता।
- निर्माता बस उसका इस्तेमाल करता है। हवाई जहाज़ में ऑफ़लाइन बैठा एक सेल्स प्रतिनिधि वही टूल खोलता है और क्लाइंट मीटिंग के लिए बिलकुल ऑन-ब्रांड डेक बना लेता है। कोई डिज़ाइन कौशल नहीं, कोई नेटवर्क नहीं, कोई इंतज़ार नहीं।
चरण दो का वह "ताज़ा चार्ट" ठीक इस तरह का एक रेंडर है, जो एक डेटा स्ट्रिंग और मुट्ठी भर पैरामीटर से बना है, और किसी ने कोई डिज़ाइन फ़ाइल खोली ही नहीं:
बात यह नहीं है कि Lolly डिज़ाइनरों के लिए अच्छा है और डेवलपरों के लिए अच्छा है और सेल्स के लिए अच्छा है, तीनों अलग-अलग खाँचों में। यह एक रिले दौड़ है: क्रिएटिव के शुरुआती काम को डेवलपर स्केल करता है, और वही निर्माता को ताक़त देता है। जहाज़ में बैठे उस ग़ैर-तकनीकी प्रतिनिधि का बिना मेहनत वाला अनुभव संभव ही इसलिए है क्योंकि डिज़ाइनर ने कठोरता तय की और डेवलपर ने उसे तैनात किया।
यही फ़ोर्स मल्टिप्लायर है। Lolly अलग-अलग भूमिकाओं के लिए अलग-अलग टूलों की दराज़ नहीं है — यह एक ही डिटर्मिनिस्टिक ऐसेट जीवनचक्र है जिसे हर भूमिका छूती है, और जिस हर हाथ से यह गुज़रता है, वह पिछले हाथ के मूल्य को कई गुना कर देता है।
एक अनुमोदन, दस हज़ार ऐसेट
क्योंकि अनुमोदन फ़ाइल में नहीं, टूल में रहता है (Lolly की तुलना देखें), इसलिए पैमाना समीक्षा की समस्या रहता ही नहीं। एक लोकलाइज़्ड सोशल-कार्ड टूल को एक बार अनुमोदित करें, फिर एक स्प्रेडशीट से 12 भाषाओं में 10,000 ऐसेट बनाएँ — और उनमें से किसी एक को भी लीगल या ब्रांड से नई अनुपालन जाँच की ज़रूरत नहीं, क्योंकि जिस टेम्पलेट से वे सब आए हैं, वह पहले से अनुमोदित था।
वही डिटर्मिनिस्टिक टूल तीन रास्तों से इस पैमाने तक पहुँचता है, और तीनों एक-जैसा, पहले से अनुमोदित आउटपुट देते हैं:
- एक इंसान, ऐप में।
/proबैच ग्रिड: पंक्तियाँ पेस्ट या इम्पोर्ट करें, प्रति पंक्ति एक तैयार ऐसेट पाएँ, zip डाउनलोड करें। कोई डिज़ाइन कौशल नहीं, कोई टिकट नहीं, कोई इंतज़ार नहीं। - एक डेवलपर, कमांड लाइन से। CLI वही इंजन और वही रेंडर पथ हेडलेस चलाता है, इसलिए टूल को किसी स्क्रिप्ट या नाइटली पाइपलाइन में पूरी 10,000 पंक्तियों पर क्रम से चलाया जा सकता है। एक लूप में
lolly <tool> --field=…कॉल — पूरा इंटीग्रेशन इतना ही है। - एक सिस्टम या AI एजेंट, MCP के ज़रिए। वही टूल प्रोग्राम से चलाया जाता है, उसी फ़िडेलिटी पर और उससे भी बड़े पैमाने पर — क्योंकि हज़ारों फ़ाइलें आते हुए देखकर मशीन बोर नहीं होती।
ब्रांड कंस्ट्रेंट का एक सेट, डिज़ाइनर ने एक बार तय किया; उसी पहले से अनुमोदित आउटपुट तक तीन रास्ते — और मशीन का रास्ता सबसे दूर तक जाता है, क्योंकि फ़ाइलें आती रहें तो भी वह थकता नहीं।
बड़ी तस्वीर
┌─────────────────────────────────────────────┐
│ 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/ # 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 # TypeScript interface — the bridge 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).
│ ├── qr-code/
│ ├── quotes/
│ ├── email-signature/
│ ├── daily-card/ # "Day Brief" — weather/time/map (fetched by an inline template script)
│ ├── code-canvas/
│ ├── 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)
│ ├── bag-video/
│ ├── chart-creator/ # SVG charts from structured data
│ ├── filter-duotone/ # two-color photo treatment
│ ├── filter-halftone/ # photo → vector halftone dot grid
│ ├── filter-scanline/ # photo → retro posterised scanline grid (SVG / transparent 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)
│ ├── layout-studio/ # "Layout Studio" — 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
│ ├── web-icon/ # favicon .ico / png / svg from text + colours
│ ├── filter-posterize/ # photo → flat posterised vector separations
│ ├── filter-pixel-stretch/ # photo → pixel-smear effect
│ ├── 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
प्लेटफ़ॉर्म डिलीवरी मॉडल
यह प्लेटफ़ॉर्म कई सतहों पर चलता है — वेब PWA, Tauri डेस्कटॉप/मोबाइल, स्क्रिप्ट-योग्य CLI और इंटरैक्टिव TUI। ये सभी एक ही इंजन और एक ही टूल फ़ाइलों का उपयोग करते हैं।
वेब (PWA) — प्राथमिक वितरण

SUSE-नियंत्रित URL पर होस्टेड। सर्विस वर्कर द्वारा टूल और ऐसेट कैश कर लिए जाने के बाद ऑफ़लाइन काम करता है। अधिकांश कर्मचारी, वेंडर और पार्टनर प्लेटफ़ॉर्म का उपयोग यहीं करेंगे। किसी खाते की ज़रूरत नहीं — स्थिति (state) हर डिवाइस पर IndexedDB में संग्रहीत होती है।
वेब शेल एक ही लेआउट से रिस्पॉन्सिव है। डेस्कटॉप पर टूल एक आकार बदलने योग्य कंट्रोल साइडबार होता है, जिसके बगल में प्रीव्यू स्टेज है — ट्रैकपैड-नेटिव कैनवास नेविगेशन के साथ (कर्सर के इर्द-गिर्द ज़ूम के लिए Cmd/Ctrl-व्हील या पिंच, पैन के लिए Space- या मिडल-ड्रैग, 0/1/+/− कुंजियाँ, और एक Fit/% HUD)। मोबाइल (≤640px) पर कंट्रोल ऊपर से जुड़ी एक शीट बन जाते हैं, जिसकी ड्रैग ग्रिप पीक/हाफ़/फ़ुल पर स्नैप होती है (टैप से टॉगल), नीचे स्थिर फ़ुल-स्क्रीन प्रीव्यू रहता है, और एक तैरता Render बटन Export कंट्रोल्स को बॉटम-शीट पॉपअप में खोलता है। टच पर प्रीव्यू में पिंच-ज़ूम और ड्रैग-पैन मिलता है। रेंडर पथ और एक्सपोर्ट कंट्रोल दोनों जगह एक जैसे हैं — केवल UI का ढाँचा (क्रोम) रीफ़्लो होता है।
वही टूल फ़ोन की चौड़ाई पर, और कोई दूसरा लेआउट संभालने की ज़रूरत नहीं: कंट्रोल ऊपर एक शीट बन जाते हैं, प्रीव्यू पूरी स्क्रीन ले लेता है, और रेंडर पिल उसके ऊपर तैरती रहती है।
बैच मोड (/pro)। वेब शेल में एक स्प्रेडशीट-शैली की बैच ग्रिड (shells/web/src/pro/) भी शामिल है, जो एक या कई टूलों में एक साथ कई पंक्तियाँ रेंडर करती है। इसमें है CSV/TSV राउंड-ट्रिप और स्प्रेडशीट पेस्ट, प्रति-पंक्ति टेम्पलेट/फ़ॉर्मैट/आकार/इकाई/dpi, लाइव प्रीव्यू वाला ब्लॉक्स-एडिटर साइड पैनल, समेटे जा सकने वाले एक्सपोर्ट कॉलम, प्रति-पंक्ति "प्रासंगिकता" टैग बार, बाएँ ड्रैग-हैंडल से पंक्ति पुनर्क्रम, दो-चरणीय डिलीट पुष्टि, सहेजे गए बैच सत्र, और .zip डाउनलोड। "बड़े पैमाने पर कंटेंट निर्माण" पोज़िशनिंग के पीछे यही वन-टू-मेनी सतह है।
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 गाइड देखें।
आप जिस भी सतह पर हों, डैशबोर्ड का क्षमताएँ टैब इस बात का पूरा नक़्शा है कि प्लेटफ़ॉर्म क्या-क्या कर सकने का दावा करता है — समूहों में बँटा और एक भी टूल खोले बिना पढ़ने योग्य।
टूल श्रेणियाँ

गैलरी में समूहन के लिए टूलों को उनके मैनिफ़ेस्ट में एक category से टैग किया जाता है।
पंक्तियाँ गैलरी सेक्शन के क्रम में सूचीबद्ध हैं। utility सेक्शन गैलरी में हमेशा सबसे अंत में रेंडर होता है (हर दूसरी श्रेणी के बाद, भविष्य की श्रेणियों सहित) — यह ऑन-डिवाइस "ऑफ़लाइन यूटिलिटीज़" दराज़ है।
| श्रेणी | शिप किए गए टूल | नियोजित |
|---|---|---|
everyone | QR Code Generator, Quote Card, Email Signature, Day Brief, Code Canvas, Color Block, Dynamic Layout, Logo, Web Icon Maker | Employee Image Stationery |
designer | Brand Lockup, Bag Video, Chart Creator, Street Map, Animated Ad, Multi-Page PDF, Diagram Builder, Logo Lockup: Grid (NASCAR), Logo Lockup: Partner, Filter: Duotone, Filter: Halftone, Filter: Scanline, Filter: Posterize Bitmap, Filter: Pixel Stretch | Font Outliner |
event | Meeting Planner, Event Name Badge, Wayfinding Signage, Calendar ICS | Event Stationery, Bulk Name Badges, Room Agenda Cards |
product | — | CVE Alert, Product Release Announcement, Blog OG Image |
utility | Countdown Timer, Color Palette, URL Screenshot, Strip Hidden Data, Text Helper, Compress PDF, Layout Studio | इकाई/फ़ॉर्मैट कन्वर्टर, और ऑन-डिवाइस प्राइवेसी यूटिलिटी |
टूलों को स्थिति के आधार पर भी वर्गीकृत किया जाता है: official (ब्रांड-अनुमोदित, कोई वॉटरमार्क नहीं), community (बाहरी योगदान), experimental (एक्सपोर्ट पर वॉटरमार्क)। Dynamic Layout, URL Screenshot, Logo Lockup: Grid (NASCAR), Filter: Posterize Bitmap और Diagram Builder फ़िलहाल experimental स्थिति में हैं; Web Icon Maker और Layout Studio community टूल के रूप में शिप होते हैं।
Layout Studio render.layout: "editor" फ़्री-कैनवास मोड पर बना पहला टूल है — एक क्रोम-रहित, प्रत्यक्ष-हेरफेर सतह, जहाँ आप टेक्स्ट, आकृतियों और छवियों के बॉक्स खींचते, आकार बदलते, घुमाते और स्नैप करते हैं, फिर हर दूसरे टूल की तरह उसी रेंडर पथ से एक्सपोर्ट करते हैं।
Strip Hidden Data पहली ऑन-डिवाइस यूटिलिटी है (privacy: "on-device"): एक कंटेंट-ट्रांसफ़ॉर्म टूल, जो आपकी दी हुई फ़ाइल लेता है, उसे पूरी तरह ब्राउज़र में प्रोसेस करता है और एक साफ़ प्रति लौटा देता है — कभी अपलोड नहीं, कभी वॉटरमार्क नहीं, कोई प्रोवेनेंस स्टैम्प नहीं। Text Helper दूसरी है — रोज़मर्रा के 'किसी वेबसाइट में पेस्ट करने' वाले कामों के लिए ऑन-डिवाइस वर्कबेंच (JSON फ़ॉर्मैट, JWT डिकोड, Base64, URL एनकोड/डिकोड, SHA हैशिंग)। Compress PDF तीसरी है — यह PDF की छवियों को फिर से संपीड़ित करके उसे छोटा करती है, यह भी पूरी तरह ऑन-डिवाइस। तीनों पर बैज टेक्स्ट है "आपके डिवाइस पर चलता है — कुछ भी अपलोड नहीं होता"। यह उस प्राइवेसी-यूटिलिटी श्रेणी की शुरुआत है, जो गोपनीय फ़ाइलों को एकल-उद्देश्य वेबसाइटों को सौंपने की जगह लेती है।
नोट:
categoryऔरstatusप्रत्येकtool.jsonसेcatalog/tools/index.json(वह रजिस्ट्री जिसे गैलरी पढ़ती है) में डीनॉर्मलाइज़ किए जाते हैं। मैनिफ़ेस्ट ही सत्य का स्रोत है — इंडेक्सnpm run build:catalogसे जनरेट होता है, और यदि कमिट किया गया इंडेक्स मैनिफ़ेस्ट से भटक जाए तोnpm run validate:catalogCI को विफल कर देता है।
आर्किटेक्चर संबंधी प्रतिबद्धताएँ
ये निर्णय तय हो चुके हैं। इनमें से किसी को भी बदलना एक बड़ा काम है — ये कोडबेस के हर दूसरे निर्णय को आकार देते हैं।
1. डिक्लेरेटिव टूल, साथ में एक इम्परेटिव एस्केप हैच
एक टूल है: मैनिफ़ेस्ट (tool.json) + टेम्पलेट (template.html) + वैकल्पिक hooks.js।
इनपुट मैनिफ़ेस्ट घोषित करता है। टेम्पलेट नहीं। इनपुट Handlebars टोकनों से अनुमानित नहीं किए जाते। मैनिफ़ेस्ट ही अनुबंध है; टेम्पलेट {{id}} के ज़रिए नामित वेरिएबल का उपभोग करता है।
हुक वैकल्पिक हैं। अधिकांश टूल विशुद्ध डिक्लेरेटिव हैं — मैनिफ़ेस्ट + टेम्पलेट पर्याप्त है। जिन टूलों को परिकलित मान चाहिए (QR एनकोडिंग, चार्ट डेटा को आकार देना), वे hooks.js प्रदान करते हैं, जो नामित लाइफ़साइकल फ़ंक्शन उजागर करता है (onInit, onInput, onFrame — मोशन-रिएक्टिव टूलों के लिए प्रति-फ़्रेम लाइव-कैमरा हुक — beforeExport, afterExport, और exportFile — फ़ाइल-इन/फ़ाइल-आउट ट्रांसफ़ॉर्म पथ, जिसका उपयोग Strip Hidden Data जैसी ऑन-डिवाइस यूटिलिटी करती हैं)। (beforeRender हुक अनुबंध में आरक्षित है, लेकिन फ़िलहाल इसे कहीं से बुलाया नहीं जाता — इस पर निर्भर न रहें।) होस्ट हुकों को new Function('host', …) के ज़रिए लोड करता है, जिसमें कैपेबिलिटी ब्रिज क्लोज़र स्कोप के रूप में इंजेक्ट होता है। यह एक पोर्टेबिलिटी अनुबंध है, सुरक्षा सैंडबॉक्स नहीं: हुक अब भी पेज रेल्म में चलते हैं और ब्राउज़र शेल में window/fetch/document तक पहुँच सकते हैं — host. समर्थित, पोर्टेबल सतह है, कोई लागू की गई सीमा नहीं। असिंक्रोनस हुक परिणाम समय-सीमित हैं (onInit 5s, onInput 2s, बाक़ी 5s) और देर से आए परिणाम त्याग दिए जाते हैं; बेक़ाबू सिंक्रोनस* हुक को रोका नहीं जा सकता। इसलिए जब तक Worker आइसोलेशन नहीं आता, अविश्वसनीय थर्ड-पार्टी हुक कोड चलाना सुरक्षित नहीं है।
यह इसलिए मायने रखता है: डिक्लेरेटिव टूल ग़ैर-डेवलपर भी बना सकते हैं। अगर हर टूल एक वेब ऐप होता, तो जोखिम-टिप्पणी "वर्कहॉर्स टेम्पलेट बनाने/बनाए रखने के सीमित कौशल" एक स्थायी अड़चन बन जाती।
2. टूल और ऐसेट डेटा हैं, बंडल किया हुआ कोड नहीं
वेब और Tauri ऐप बूट पर एक ज्ञात URL से टूल और ऐसेट कैटलॉग लाते हैं, उन्हें स्थानीय रूप से कैश करते हैं, और जो भी वहाँ है उसी पर काम करते हैं। नई इवेंट टाइल या सीज़नल ऐसेट जोड़ने के लिए ऐप रिलीज़ की ज़रूरत नहीं पड़ती।
CDN पॉइज़निंग रोकने के लिए ऐसेट बाइट्स का SHA-256 चेकसम रखा जाता है। ऐसेट का id + version कैश अमान्यकरण चलाता है।
3. कैपेबिलिटी ब्रिज ही एकमात्र API है जिसे टूल देखते हैं
टूल अपने टेम्पलेट क्षेत्र के बाहर DOM को कभी नहीं छूते, कभी सीधे fetch नहीं बुलाते, कभी फ़ाइलसिस्टम नहीं पढ़ते। वे वर्शन-बद्ध host.* मेथड बुलाते हैं। ब्रिज engine/src/bridge/host-v1.ts में परिभाषित है:
| ब्रिज API | यह क्या करता है |
|---|---|
host.profile | उपयोगकर्ता का पहला नाम, ईमेल, हेडशॉट, शहर आदि। bindToProfile के ज़रिए इनपुट पहले से भरता है। |
host.assets | कैटलॉग क्वेरी, ऐसेट रिज़ॉल्यूशन, होस्ट-प्रदत्त पिकर UI। |
host.state | इनपुट स्लॉट सहेजना / लोड करना। वेब पर IndexedDB, Tauri पर फ़ाइलसिस्टम, CLI पर मेमोरी। |
host.clipboard | क्लिपबोर्ड पर टेक्स्ट या छवि लिखना (प्लेटफ़ॉर्म फ़ॉलबैक सहित)। |
host.export | रेंडर लक्ष्य को रास्टराइज़ या सीरियलाइज़ करना। एक्सपेरिमेंटल टूलों पर वॉटरमार्क लगाता है। |
host.net | अनुमति-सूचीबद्ध fetch — केवल तभी उपलब्ध जब टूल ने "network" क्षमता घोषित की हो। (फ़िलहाल कोई शिपिंग टूल इसका उपयोग नहीं करता।) |
वैकल्पिक, जोड़ी जाने वाली सतहें तभी दिखती हैं जब कोई शेल उन्हें प्रदान करे। दो क्षमता-गेटेड हैं — तभी उजागर होती हैं जब टूल मेल खाता फ़्लैग घोषित करे: host.compose (किसी दूसरे टूल का रेंडर एम्बेड करना — compose) और host.capture (URL Screenshot के लिए पेज कैप्चर — capture)। बाक़ी फ़ीचर-डिटेक्टेड हैं — जब भी शेल उन्हें दे सके, मौजूद रहती हैं: host.text (HarfBuzz WASM के ज़रिए टेक्स्ट-टू-पाथ; wasm क्षमता उन टूलों को चिह्नित करती है जो इस पर निर्भर हैं), host.pdf (PDF पार्सिंग/संपीड़न, Strip Hidden Data और Compress PDF द्वारा प्रयुक्त), और host.tokens (DTCG डिज़ाइन टोकन)। घोषणा-योग्य क्षमताएँ हैं: network, filesystem, clipboard, camera, ffmpeg, wasm, capture, compose।
वही टूल ब्राउज़र, Tauri और हेडलेस CLI में चलता है, क्योंकि हर शेल इस इंटरफ़ेस को लागू करता है — टूल को कभी पता नहीं चलता कि वह किसमें है।
ब्रिज वर्शन-बद्ध है। मेथड जोड़ना माइनर वर्शन है। सिग्नेचर हटाना या बदलना मेजर वर्शन बंप है। जब v2 आए, तो v1 को काम करते रहना होगा।
4. ऐसेट ID हमेशा के लिए हैं
suse/logo/primary एक अनुबंध है। एक बार प्रकाशित होने पर:
- ID कभी नहीं बदलती, कभी दोबारा इस्तेमाल नहीं होती।
- बाइट बदले → मैनिफ़ेस्ट में
versionबढ़ाएँ। - नए ऐसेट से प्रतिस्थापित हुआ →
deprecated: trueसेट करें और वैकल्पिक रूप सेreplacedBy। - मौजूदा संदर्भ हमेशा हल होते हैं।
इससे सहेजी गई टूल स्थितियाँ और URL से साझा किए गए लिंक वर्षों तक टिकाऊ रहते हैं।
5. URL मोड प्रथम-श्रेणी का है
हर इनपुट को URL पैरामीटर के रूप में व्यक्त किया जा सकना चाहिए:
lolly.tools/#/tool/qr-code?url=https://suse.com&ecl=H
CLI मोड एक अलग ट्रांसपोर्ट के नीचे URL मोड ही है — CLI शेल argv से एक URL-स्टेट ऑब्जेक्ट बनाता है और वही इंजन पाइपलाइन चलाता है। रेंडर पथ एक ही है। CLI, GUI से भटक नहीं सकता, क्योंकि वह कोई अलग इम्प्लीमेंटेशन नहीं है।
url-mode.ts राउंड-ट्रिप (पार्स और सीरियलाइज़) संभालता है। आरक्षित पैरामीटर (कभी इनपुट के रूप में टूल तक नहीं भेजे जाते): format, export, copy, slot, output, filename, _v, z (पैक्ड स्टेट — "सबसे छोटा लिंक" टोकन), width/w, height/h, unit, dpi, profile, password, bleed, marks, full, options, nostage। URL मोड में ऐसेट इनपुट अपनी id से सीरियलाइज़ होते हैं; रनटाइम उन्हें हाइड्रेशन से पहले host.assets.get() के ज़रिए हल करता है। width/height वे मान हैं जो unit में व्यक्त होते हैं (डिफ़ॉल्ट px, साथ ही mm/cm/in/pt/pc); भौतिक इकाई के साथ dpi रास्टर रिज़ॉल्यूशन तय करता है। ये कैनवास दस्तावेज़ का आकार सेट करते हैं और एक्सपोर्ट आयाम पैनल को पहले से भर देते हैं।
चूँकि हर इनपुट लिंक में ही सफ़र करता है, किसी एक पैरामीटर का बदलना एक अलग तैयार ऐसेट है। यह पूरा पैलेट एक सीड रंग, एक हार्मनी और एक स्टेप संख्या से बना है:
6. संग्रहण ब्रिज से होकर जाता है, सीधे नहीं
वेब शेल: IndexedDB। Tauri: फ़ाइलसिस्टम। CLI: इन-मेमोरी। टूल केवल host.state.save(slot, data) और host.state.load(slot) देखते हैं। localStorage का उपयोग नहीं होता — वह बहुत छोटा है और ब्लॉब नहीं रख सकता।
उपयोगकर्ता प्रति टूल कई नामित एडिट स्लॉट सहेज सकते हैं और बाद में हर सत्र पर लौट सकते हैं। खाता बनाने की ज़रूरत नहीं; स्थिति प्रति-डिवाइस है। चूँकि ब्रिज ही एकमात्र सीवन है, वह प्रति-डिवाइस स्थिति पोर्टेबल भी है: shells/web/src/data-transfer.ts सब कुछ host.profile/host.state/host.assets के ज़रिए वापस पढ़कर एक अकेले lolly-backup zip में डाल देता है, जो किसी भी दूसरे इंस्टॉल पर इम्पोर्ट होता है — "नए डिवाइस पर जाने" का ऑफ़लाइन उत्तर, जिसे किसी सर्वर की ज़रूरत नहीं (पूरा विनिर्देश: docs/data-transfer.md)। SUSE ID एकीकरण (मल्टी-डिवाइस सिंक) इसी के ऊपर एक भावी माइलस्टोन है।
7. मैच्योरिटी टैग "ब्रांड-अनुमोदित" जोखिम का संरचनात्मक उत्तर देते हैं
हर टूल अपने मैनिफ़ेस्ट में status: official | community | experimental घोषित करता है। गैलरी स्थिति के अनुसार क्रमबद्ध करती है। एक्सपेरिमेंटल टूल अपने एक्सपोर्ट पर स्वतः वॉटरमार्क लगाते हैं — वॉटरमार्क host.export.render लगाता है, टूल नहीं, इसलिए कोई ग़ैर-आधिकारिक टूल लेखक इससे बच नहीं सकता।
यह उस धारणा-जोखिम का संरचनात्मक उत्तर है कि किसी भी टूल का उपयोग ब्रांड-अनुमोदन का संकेत देता है। प्रक्रिया-आधारित उत्तर (समीक्षा कतार, SUSE ID गेटिंग) इसके ऊपर परत बनते हैं।
8. टूल इनपुट मैनिफ़ेस्ट के ज़रिए टाइप्ड होते हैं, ऐसेट सहित
इनपुट एक type घोषित करते हैं: text, longtext, number, boolean, color, select, asset, date, time, datetime-local, url, profile, blocks, vector, और file। होस्ट मैनिफ़ेस्ट से हर टाइप के लिए एक सामान्य नियंत्रण रेंडर करता है — टूल शून्य कंट्रोल कोड लिखते हैं। तीन बाक़ियों से ज़्यादा वज़न रखते हैं:
asset(filterऔरallowUploadके साथ) वैश्विक ऐसेट सिस्टम तक का सेतु है;allowUpload: falseस्पॉन्सरशिप-टाइल लोगो जैसी चीज़ों के लिए ब्रांड-प्रवर्तनीयता का लीवर है, जहाँ केवल लाइब्रेरी ऐसेट की अनुमति है। उपयोगकर्ता अपलोड लाइब्रेरी ऐसेट जैसी हीAssetRefआकृति का उपयोग करते हैं, इसलिए टूल उन्हें एक जैसे संभालते हैं।blocksएक दोहराया जाने वाला फ़ील्ड-समूह है — एक इनपुट के भीतर मिनी-टेबल, जिसे साइड पैनल में संपादित किया जाता है, टाइप्ड/डिस्क्रिमिनेटेड ऐड मेनू और प्रति-ब्लॉक ऐसेट फ़ील्ड के साथ। कैनवास पर रेंडर हुए किसी ब्लॉक पर क्लिक करने से उस ब्लॉक की पंक्ति फ़ोकस होती है।meeting-planner,chart-creator,event-name-badge,wayfinding-signage,color-block, औरdigi-adइसका उपयोग करते हैं।vectorसंख्याओं के एक निश्चित समूह (जैसे कोई ट्रांसफ़ॉर्म) को एक संयुक्त नियंत्रण में समेटता है;fileऑन-डिवाइस ट्रांसफ़ॉर्म यूटिलिटियों (जैसेstrip-dataऔरcompress-pdf) के लिए उपयोगकर्ता की अपनी फ़ाइल को बाइट्स के रूप में मेमोरी में रखता है।
9. टेम्पलेट लॉजिक-रहित हैं (Handlebars, EJS नहीं)
EJS की जगह Handlebars जान-बूझकर चुना गया:
- लॉजिक-रहित। टेम्पलेट ग़ैर-डेवलपर भी लिख सकते हैं।
- डिफ़ॉल्ट रूप से सुरक्षित।
{{x}}HTML-एस्केप करता है;{{{x}}}ऑप्ट-इन रॉ है। - टेम्पलेट में कोई मनमाना JS न होने का मतलब है प्रति-टेम्पलेट कोई XSS ऑडिट सतह नहीं।
लॉजिक hooks.js में रहता है, जहाँ वह स्पष्ट और समीक्षा-योग्य है। उपलब्ध Handlebars हेल्पर: {{default}}, {{upper}}, {{lower}}, {{eq}}, {{markdown}}, {{asset ref}}, {{asset ref "property"}} (साथ ही डेटा-फ़ॉर्मैट हेल्पर icsStamp/rfcText/csvCell, जिन्हें सहोदर .ics/.vcf/.csv टेम्पलेट उपयोग करते हैं)।
10. टूल दूसरे टूलों को कंपोज़ करते हैं
कोई टूल दूसरे टूल का रेंडर बिना किसी टूल-से-टूल इम्पोर्ट के एम्बेड कर सकता है — कंपोज़िशन इंजन हल करता है, टूल कोड कभी नहीं। इसकी दो सतहें हैं:
- डिक्लेरेटिव मैनिफ़ेस्ट —
composes: [{ id, tool, inputs, format?, width?, height? }]। इंजन नामित चाइल्ड को रेंडर करता है और परिणाम को लॉजिक-रहित टेम्पलेट में{{asset <id>}}के रूप में रखता है।event-name-badgeआजqr-codeको SVG के रूप में कंपोज़ करता है। - पोर्टेबल एम्बेड URL —
<img src="https://lolly.tools/tool/<id>.<ext>?<inputs>">। शेल उस चाइल्ड को स्थानीय रूप से रेंडर करता है (स्थानीय रेंडर पूरा होने तक एक प्लेसहोल्डर पिक्सेल दिखता है);lolly.toolsसे कभी कुछ नहीं लाया जाता।
Slides टूल उसी दूसरी सतह पर बना है: किसी भी स्लाइड का कोई भी स्लॉट इमेज की जगह कोई दूसरा Lolly टूल रख सकता है।
किसी भी टूल का रेंडर कंपोज़ करें: SVG चाइल्ड तब सच्चा वेक्टर बना रहता है जब पैरेंट SVG या PDF में एक्सपोर्ट करता है, और PNG के लिए साफ़-सुथरा रास्टराइज़ होता है; PNG/JPG/WEBP चाइल्ड छवियों के रूप में एम्बेड होते हैं। इसके लिए compose क्षमता चाहिए। कंपोज़ किए गए चाइल्ड मध्यवर्ती होते हैं — उन पर कभी वॉटरमार्क या प्रोवेनेंस स्टैम्प नहीं लगता — और कंपोज़िशन शालीनता से डिग्रेड होता है: जो शेल किसी चाइल्ड को रेंडर नहीं कर सकता, वह बस उस स्लॉट को छोड़ देता है और पैरेंट फिर भी रेंडर होता है।
जो हमने स्पष्ट रूप से नहीं करना चुना
- कोई EJS नहीं / टेम्पलेट में कोई मनमाना JS नहीं। XSS सतह शून्य है। लॉजिक
hooks.jsमें रहता है। - कोई अनिवार्य ऐसेट CMS नहीं। व्यक्ति अपनी क्रिएटिव फ़ाइलें सीधे ऐप के भीतर अपने कैटलॉग में लाते हैं (कैटलॉग व्यू और Brand Studio) और Layout Studio सत्र सहेजकर अपने टूल स्वयं बनाते हैं — न कोई सर्वर, न कोई एडमिन कंसोल। साझा, शासित कैटलॉग के लिए कोई संगठन ऐसेट डायरेक्टरी को git के रूप में प्रबंधित कर सकता है और अपडेट को PR समीक्षा से गुज़ार सकता है — यह एक उपलब्ध गवर्नेंस मॉडल है, ऐप की कोई अनिवार्यता नहीं।
- कोई ज़बरदस्ती का RBAC नहीं। खुला ऐप डिफ़ॉल्ट रूप से सार्वजनिक-पहुँच वाला है; ब्रांड जोखिम मैच्योरिटी टैग + वॉटरमार्क से प्रबंधित होता है। जिस संगठन को कड़ा नियंत्रण चाहिए, वह अपनी ऑथ और ऊपर बताए git-समीक्षित कैटलॉग की परतें जोड़ता है।
- कोई केंद्रीय डेटाबेस नहीं। सारी उपयोगकर्ता स्थिति प्रति-डिवाइस है। SUSE ID एकीकरण रोडमैप पर है, लेकिन लॉन्च के लिए बाधक नहीं।
- टूल/इंजन का कोई साझा कोड पथ नहीं। इंजन ओपन सोर्स है;
tools/औरassets/अपनी-अपनी रिपॉज़िटरियों में SUSE की स्वामित्व-सामग्री बने रहते हैं। यह अलगाव लागू किया जाता है (कोई क्रॉस-इम्पोर्ट नहीं), ताकि विभाजन साफ़ बना रहे।
जीवनचक्र, शुरू से अंत तक
एक उपयोगकर्ता lolly.tools/#/tool/qr-code?url=https://suse.com&ecl=H खोलता है:
- बूट। वेब शेल IndexedDB खोलता है, कैपेबिलिटी ब्रिज बनाता है, टूल और ऐसेट कैटलॉग सिंक करता है (या ऑफ़लाइन होने पर कैश से लोड करता है)।
- रूट। URL हैश →
toolव्यू, जिसमेंqr-codeऔर URL पैरामीटर निकाल लिए जाते हैं। - लोड।
loadTool('qr-code', fetchFile)tool.jsonलाता है, JSON Schema के विरुद्ध सत्यापित करता है, फिरtemplate.html,styles.cssऔरhooks.jsका सोर्स लाता है। - URL स्थिति पार्स।
parseUrlStateURL पैरामीटरों को आरंभिक इनपुट मानों में बदलता है। ऐसेट रेफ़ (?logo=suse/logo/primary) हल्के{ id, _unresolved: true }ऑब्जेक्ट के रूप में पार्स होते हैं। - रनटाइम।
createRuntime(tool, host, initialValues)इनपुट मॉडल बनाता है (प्रोफ़ाइल डेटा, डिफ़ॉल्ट और आरंभिक मानों को मिलाकर), ऐसेट रेफ़host.assets.get()से हल करता है, हुक लोड करता है (क्लोज़र-स्कोप्डhost, सैंडबॉक्स नहीं),hooks.onInitबुलाता है। - रेंडर। शेल रनटाइम को सब्सक्राइब करता है; हर स्थिति-परिवर्तन पर उसे
{ model, hydrated }मिलता है। वह मॉडल से इनपुट नियंत्रण रेंडर करता है और हाइड्रेटेड टेम्पलेट HTML को#tool-canvasमें लिखता है। - इंटरैक्ट। उपयोगकर्ता किसी इनपुट में टाइप करता है →
runtime.setInput(id, value)→ बाधाएँ लागू →hooks.onInputकी कॉल → पुनः-हाइड्रेट → पुनः-रेंडर। कैनवास लाइव अपडेट होता है। - एक्सपोर्ट। उपयोगकर्ता Download(PNG) क्लिक करता है →
runtime.export(canvasNode, 'png')→host.export.render(dom-to-image-more से रास्टराइज़ करता है; SVG/PDF समर्पित DOM-वॉकिंग वेक्टराइज़रों से गुज़रते हैं) → ब्लॉब →host.export.download। टूल जिन फ़ॉर्मैट में ऑप्ट कर सकता है, उनकी रेंज व्यापक है:svg,png,jpg/jpeg,webp,avif,pdf, वेक्टर फ़ॉर्मैटemf,eps, साथ ही प्रिंट/CMYK फ़ॉर्मैटpdf-cmyk,cmyk-tiff,eps-cmyk; वीडियो फ़ॉर्मैटwebm,mp4,gif; और डेटा/टेक्स्ट फ़ॉर्मैटhtml,md,txt,json,csv,ics,vcf,ico,zip। (जो टूलrender.export: falseसेट करते हैं — जैसे Color Palette, Countdown Timer, Strip Hidden Data, Text Helper, Compress PDF — वे डाउनलोड/फ़ॉर्मैट/आयाम नियंत्रण छिपा देते हैं।) भौतिक इकाइयाँ यहीं प्रति फ़ॉर्मैट रूपांतरित होती हैं (PDF → वास्तविक पेज पॉइंट, रास्टर → DPI पर पिक्सेल,pHYsचंक के साथ)। लेखकत्व/प्रोवेनेंस मेटाडेटा (लेखक, टूल, स्रोत —engine/src/metadata.tsद्वारा निर्मित) प्रति फ़ॉर्मैट एम्बेड होता है: PNG iTXt, JPEG EXIF, PDF इन्फ़ो डिक्ट, SVG<metadata>, GIF टिप्पणी। एक्सपेरिमेंटल टूलों पर वॉटरमार्क होस्ट डालता है, टूल नहीं।
Tauri में वही जीवनचक्र। CLI में वही जीवनचक्र — jsdom हेडलेस DOM देता है; आउटपुट फ़ाइल या stdout में जाता है।
ओपन-सोर्स स्थिति
engine/, shells/, schemas/, और docs/ डायरेक्टरियाँ MPL-2.0 के अंतर्गत ओपन सोर्स हैं — ब्रांड टूलिंग के लिए एक वेंडर-तटस्थ स्कैफ़ोल्डिंग प्लेटफ़ॉर्म, जिसकी हर शिप-योग्य इकाई github.com/lolly-tools के अंतर्गत अपनी अलग रिपॉज़िटरी में विभाजित है। tools/ और catalog/assets/ SUSE-विशिष्ट सामग्री हैं और SUSE की स्वामित्व-सामग्री बनी रहती हैं (सर्वाधिकार सुरक्षित — हर रिपो की NOTICE.md देखें); वे MPL के दायरे में नहीं आतीं।
यह विभाजन लागू किया जाता है — engine/ से tools/ या assets/ में कोई क्रॉस-इम्पोर्ट नहीं है — ताकि प्लेटफ़ॉर्म/कंटेंट की सीमा साफ़ बनी रहे।
रोडमैप
| माइलस्टोन | लक्ष्य | क्या |
|---|---|---|
| आरंभिक टूल | ✅ पूर्ण | QR Code, Quote Card, Email Signature, Day Brief, Code Canvas, Countdown Timer, Color Palette, Brand Lockup, Bag Video, Chart Creator, Filter: Duotone, Meeting Planner — वेब शेल लाइव |
| मौजूदा टूलिंग का संवर्धन | मध्य 2026 ✅ पूर्ण | डाउनलोड-योग्य ऑफ़लाइन ऐप (Tauri); अतिरिक्त कर्मचारी और इवेंट टूल; समृद्ध एक्सपोर्ट पाइपलाइन (टेक्स्ट-टू-पाथ स्थिरता, मेटाडेटा, अतिरिक्त फ़ॉर्मैट — plans.md देखें) |
| इंजन को ओपन सोर्स करना | 2026 के अंत में ✅ पूर्ण | इंजन, शेल, स्कीमा, दस्तावेज़ सार्वजनिक होते हैं — ब्रांडेड टूल/ऐसेट नहीं |
| डिवाइस-से-डिवाइस स्थानांतरण | ✅ पूर्ण | पोर्टेबल lolly-backup बंडल प्रोफ़ाइल, सहेजे गए सत्र, अपलोड की गई छवियाँ और प्राथमिकताएँ किन्हीं दो इंस्टॉल के बीच ले जाता है — ऑफ़लाइन या ऑनलाइन, बिना खाते के। फ़ॉरवर्ड-कम्पैटिबल, अखंडता-जाँचा हुआ एनवेलप (विनिर्देश: docs/data-transfer.md) |
| औपचारिक टूल रोडमैप स्थापित करना | 2026 के अंत में | ग्राहक रेफ़रेंस किट, AI डिज़ाइन इनजेस्ट, GET/URL अनुरोध मोड |
| ऑन-डिवाइस प्राइवेसी यूटिलिटी | 🚧 प्रगति पर | कंटेंट-ट्रांसफ़ॉर्म टूल जो आपकी अपनी फ़ाइल को स्थानीय रूप से प्रोसेस करते हैं (फ़ाइल अंदर → साफ़ फ़ाइल बाहर), और एकल-उद्देश्य SaaS को डेटा भेजने की जगह लेते हैं। पूर्ण: file इनपुट टाइप + exportFile ट्रांसफ़ॉर्म पथ + privacy:"on-device" परिपाटियाँ (कोई वॉटरमार्क/प्रोवेनेंस नहीं) + Strip Hidden Data (JPEG/PNG/SVG/PDF मेटाडेटा, PDF host.pdf ब्रिज के ज़रिए) और Text Helper (रोज़मर्रा के 'किसी वेबसाइट में पेस्ट करने' वाले कामों का ऑन-डिवाइस वर्कबेंच — JSON फ़ॉर्मैट, JWT डिकोड, Base64, URL एनकोड/डिकोड, SHA हैशिंग, साथ में एक नॉवेल्टी समूह)। आगे: क्रॉप/रीसाइज़, छवि रूपांतरण/संपीड़न; फिर एक host.image कोडेक ब्रिज (विनिर्देश: plans/exfiltration-app-content.md) |
| डिज़ाइन टोकन (DTCG) | 🚧 रंग शिप हो चुके | ब्रांड प्रिमिटिव कैननिकल W3C डिज़ाइन टोकन (DTCG) के रूप में — वही फ़ॉर्मैट जो Penpot इम्पोर्ट/एक्सपोर्ट करता है। पूर्ण: रंग टोकन (suse/tokens/brand), host.tokens ब्रिज, पिकर स्वैच + संदर्भ-लिंक्ड मान (विनिर्देश: docs/design-tokens.md)। आगे: आयाम/टाइप टोकन, Penpot इम्पोर्ट/एक्सपोर्ट, स्थानांतरण बंडल में उपयोगकर्ता टोकन (tokens.json) |
| MCP एजेंट एंडपॉइंट (रेंडर) | ✅ पूर्ण | एक MCP सर्वर कैटलॉग + रेंडर पथ को कॉल-योग्य टूलों (lolly_list_tools / describe_tool / build_url / render / transform) के रूप में उजागर करता है, ताकि कोई भी एजेंट तैयार, नियम-बद्ध ऐसेट बना सके — इसे किसी भी MCP क्लाइंट में कस्टम कनेक्टर (OAuth 2.1) के रूप में जोड़ें या बियरर टोकन के साथ किसी CLI/HTTP क्लाइंट को इस पर इंगित करें। mcp.lolly.tools (पूर्ण एंडपॉइंट: होस्टेड हेडलेस ब्राउज़र के ज़रिए रास्टर/PDF/एनिमेशन/वीडियो) और lolly.tools/api/mcp (सर्वरलेस, ब्राउज़र-रहित स्तर) पर लाइव। नीचे दिए Penpot ऑथरिंग MCP से अलग, जो टूल निर्माण के बारे में है (विनिर्देश: plans/mcp-server.md; गाइड: docs/mcp.md + docs/ai-agents.md) |
| Penpot फ़ाइल इनजेस्ट टूल के रूप में | 2027+ | कोई Penpot फ़ाइल इम्पोर्ट करें और उसे एक Lolly टूल के रूप में सामने लाएँ (डिक्लेरेटिव, कंस्ट्रेंट-फ़र्स्ट), जिससे Penpot में बनाए गए डिज़ाइन डिटर्मिनिस्टिक जनरेटर बन जाएँ |
| MCP + Penpot एक्सटेंशन (केवल-ऑनलाइन ऑथरिंग) | 2027+ | एक Penpot MCP सर्वर AI के साथ नए टूल गढ़ता है — डिटर्मिनिस्टिक टेम्पलेट बनाने का सबसे विज़ुअल तरीक़ा: ब्रांड-सूचित पहला दौर, लूप में मौजूद इंसान के साथ परिष्कृत, समय के साथ वन-शॉट नए संदर्भों का लक्ष्य। टूल निर्माण केवल-ऑनलाइन है; इससे बने टूल कहीं भी चलते हैं |
| RBAC + SUSE ID | 2027+ | विशिष्ट टूलों को SUSE ID के पीछे गेट करना; मल्टी-डिवाइस सहेजी गई स्थिति; Google Drive इनजेस्ट/एक्सपोर्ट |
इंजन कहाँ ख़त्म होता है और होस्ट कहाँ शुरू होता है
अगर आप उसे विशुद्ध डेटा + Handlebars में व्यक्त कर सकते हैं → इंजन। अगर वह DOM, फ़ाइलसिस्टम, नेटवर्क या किसी ब्राउज़र/OS API को छूता है → होस्ट।
यह रेखा जान-बूझकर तीखी रखी गई है। इंजन ही ओपन-सोर्स हिस्सा है। जो कुछ भी SUSE, विशिष्ट प्लेटफ़ॉर्म या रनटाइम परिवेशों के बारे में जानता है, वह इससे बाहर रहता है।