সংক্ষিপ্ত বিবরণ
![]()
এই ডকুমেন্টে 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
প্ল্যাটফর্ম ডেলিভারি মডেল
প্ল্যাটফর্মটি একাধিক সারফেসজুড়ে চলে—web PWA, Tauri ডেস্কটপ/মোবাইল, স্ক্রিপ্টযোগ্য CLI, এবং ইন্টারঅ্যাক্টিভ TUI। এগুলো সবই একই ইঞ্জিন এবং একই টুল ফাইল ব্যবহার করে।
Web (PWA) — প্রধান ডিস্ট্রিবিউশন

একটি SUSE-নিয়ন্ত্রিত URL-এ হোস্ট করা। সার্ভিস ওয়ার্কার টুল ও অ্যাসেট ক্যাশ করে ফেললে অফলাইনে কাজ করে। এখানেই বেশিরভাগ কর্মচারী, ভেন্ডর এবং পার্টনার প্ল্যাটফর্মটি ব্যবহার করবেন। কোনো অ্যাকাউন্টের প্রয়োজন নেই—স্টেট প্রতি ডিভাইসে IndexedDB-তে সংরক্ষিত হয়।
web শেল একটি লেআউট থেকেই রেসপনসিভ। ডেস্কটপে একটি টুল হলো একটি প্রিভিউ স্টেজের পাশে একটি রিসাইজযোগ্য কন্ট্রোল সাইডবার, যাতে থাকে ট্র্যাকপ্যাড-নেটিভ ক্যানভাস নেভিগেশন (Cmd/Ctrl-হুইল বা কার্সারকে কেন্দ্র করে জুম করতে পিঞ্চ, প্যান করতে Space- বা মিডল-ড্র্যাগ, 0/1/+/− কী, এবং একটি Fit/% HUD)। মোবাইলে (≤640px) কন্ট্রোলগুলো একটি স্ট্যাটিক ফুল-স্ক্রিন প্রিভিউয়ের উপর একটি টপ-অ্যাঙ্করড শিটে পরিণত হয়, যাতে একটি ড্র্যাগ গ্রিপ থাকে যা peek/half/full-এ স্ন্যাপ করে (ট্যাপ করলে টগল হয়), এবং একটি ভাসমান Render বোতাম একটি বটম-শিট পপআপে Export কন্ট্রোল খোলে। টাচে প্রিভিউয়ের উপর পিঞ্চ-জুম ও ড্র্যাগ-প্যান পাওয়া যায়। রেন্ডার পাথ এবং এক্সপোর্ট কন্ট্রোল উভয়ের ক্ষেত্রেই অভিন্ন—শুধু ক্রোমটাই নতুন করে সাজে।
একই টুল ফোনের প্রস্থে, দ্বিতীয় কোনো লেআউট রক্ষণ করার দরকার নেই: কন্ট্রোলগুলো উপরে একটা শিট হয়ে যায়, প্রিভিউ পুরো স্ক্রিন দখল করে, আর রেন্ডার পিল তার উপরে ভেসে থাকে।
ব্যাচ মোড (/pro)। web শেল একটি স্প্রেডশিট-স্টাইল ব্যাচ গ্রিডও (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 সার্ভার যেটি ইনস্টল করে, একই সেটি) যা চাহিদামতো raster/PDF/video এবং লাইভ-URL ক্যাপচার তৈরি করে—web শেলের একটি বিল্ট কপি চালিয়ে, যাতে আউটপুট অভিন্ন হয়, এবং আপনি প্রথমবার এমন একটি ফরম্যাট এক্সপোর্ট করলে তবেই চালু হয়। ফলে url-shot (ক্রপ + রিকালার + ভেক্টর PDF/SVG সহ) এবং প্রতিটি raster/pdf টুলও টার্মিনালে চলে। TUI গাইড দেখুন।
আপনি যে সারফেসেই থাকুন, ড্যাশবোর্ডের সক্ষমতা ট্যাবটি প্ল্যাটফর্ম যা যা করতে পারে বলে ঘোষণা করে তার পূর্ণ নকশা — গ্রুপে সাজানো আর একটাও টুল না খুলেই পড়ে নেওয়ার মতো।
টুল ক্যাটাগরি

গ্যালারি গ্রুপিংয়ের জন্য টুলগুলোকে তাদের ম্যানিফেস্টে একটি category দিয়ে ট্যাগ করা হয়।
রো-গুলো গ্যালারি সেকশন অনুসারে তালিকাবদ্ধ করা হয়। utility সেকশনটি সবসময় গ্যালারিতে সবার শেষে রেন্ডার হয় (অন্য প্রতিটি ক্যাটাগরির পরে, ভবিষ্যতের ক্যাটাগরিসহ)—এটি অন-ডিভাইস "Offline Utilities" ড্রয়ার।
| ক্যাটাগরি | শিপ করা টুল | পরিকল্পিত |
|---|---|---|
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 | Unit/format converters, more on-device privacy utilities |
টুলগুলোকে স্ট্যাটাস অনুসারেও শ্রেণিবদ্ধ করা হয়: 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-এর ছবিগুলো পুনরায় কম্প্রেস করে সেটিকে ছোট করে, আবারও পুরোপুরি অন-ডিভাইসে। তিনটিতেই ব্যাজ টেক্সট "Runs on your device — nothing is uploaded" থাকে। এটি একটি প্রাইভেসি-ইউটিলিটি ক্যাটাগরির সূচনা যা গোপনীয় ফাইলগুলোকে একক-উদ্দেশ্যের ওয়েবসাইটে হস্তান্তরের বিকল্প হিসেবে কাজ করে।
নোট:
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. টুল ও অ্যাসেট হলো ডেটা, বান্ডেল করা কোড নয়
web ও Tauri অ্যাপ বুটের সময় একটি পরিচিত URL থেকে টুল ও অ্যাসেট ক্যাটালগ ফেচ করে, স্থানীয়ভাবে ক্যাশ করে এবং সেখানে যা আছে তার উপর কাজ করে। একটি নতুন ইভেন্ট টাইল বা সিজনাল অ্যাসেট যোগ করতে কোনো অ্যাপ রিলিজের প্রয়োজন হয় না।
CDN পয়জনিং প্রতিরোধ করতে অ্যাসেট বাইটগুলো SHA-256 চেকসাম করা হয়। অ্যাসেট id + version ক্যাশ ইনভ্যালিডেশন চালায়।
3. ক্যাপাবিলিটি ব্রিজই একমাত্র API যা টুল দেখে
টুল কখনো তাদের টেমপ্লেট এলাকার বাইরে DOM স্পর্শ করে না, কখনো সরাসরি fetch কল করে না, কখনো ফাইলসিস্টেম পড়ে না। এগুলো ভার্সনযুক্ত host.* মেথড কল করে। ব্রিজটি engine/src/bridge/host-v1.ts-এ সংজ্ঞায়িত:
| Bridge API | এটি কী করে |
|---|---|
host.profile | ব্যবহারকারীর ফার্স্টনেম, ইমেইল, হেডশট, শহর, ইত্যাদি। bindToProfile-এর মাধ্যমে ইনপুট প্রি-ফিল করে। |
host.assets | ক্যাটালগ কোয়েরি, অ্যাসেট রেজলিউশন, হোস্ট-সরবরাহকৃত পিকার UI। |
host.state | ইনপুট স্লট সেভ / লোড করা। web-এ 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 (প্যাকড স্টেট—"Shortest link" টোকেন), 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. স্টোরেজ ব্রিজের মধ্য দিয়ে যায়, সরাসরি নয়
web শেল: 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}}}হলো অপ্ট-ইন raw। - টেমপ্লেটে কোনো ইচ্ছামতো JS না থাকার মানে প্রতি-টেমপ্লেট XSS অডিট সারফেস নেই।
লজিক থাকে hooks.js-এ যেখানে এটি সুস্পষ্ট ও রিভিউযোগ্য। উপলব্ধ Handlebars হেল্পার: {{default}}, {{upper}}, {{lower}}, {{eq}}, {{markdown}}, {{asset ref}}, {{asset ref "property"}} (এছাড়া সিবলিং .ics/.vcf/.csv টেমপ্লেটের ব্যবহৃত ডেটা-ফরম্যাট হেল্পার icsStamp/rfcText/csvCell)।
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 বা PDF-এ এক্সপোর্ট করলে একটি SVG চাইল্ড একটি সত্যিকারের ভেক্টর থাকে এবং PNG-এর জন্য পরিষ্কারভাবে র্যাস্টারাইজ হয়; PNG/JPG/WEBP চাইল্ড ছবি হিসেবে এমবেড হয়। compose ক্যাপাবিলিটি প্রয়োজন। কম্পোজ করা চাইল্ডগুলো ইন্টারমিডিয়েট—কখনো ওয়াটারমার্ক বা প্রোভেন্যান্স-স্ট্যাম্প করা হয় না—এবং কম্পোজিশন সুন্দরভাবে ডিগ্রেড করে: যে শেল একটি চাইল্ড রেন্ডার করতে পারে না সেটি কেবল স্লটটি বাদ দেয় এবং প্যারেন্ট তবুও রেন্ডার হয়।
আমরা সুস্পষ্টভাবে যা না করা বেছে নিয়েছি
- কোনো EJS নয় / টেমপ্লেটে কোনো ইচ্ছামতো JS নয়। XSS সারফেস শূন্য। লজিক থাকে
hooks.js-এ। - কোনো বাধ্যতামূলক অ্যাসেট CMS নয়। ব্যক্তিরা তাদের নিজের ক্রিয়েটিভ ফাইল অ্যাপের মধ্যেই সরাসরি তাদের ক্যাটালগে ইনজেস্ট করেন (ক্যাটালগ ভিউ এবং Brand Studio) এবং Layout Studio সেশন সেভ করে নিজের টুল তৈরি করেন—কোনো সার্ভার নেই, কোনো অ্যাডমিন কনসোল নেই। একটি শেয়ার্ড, গভর্নড ক্যাটালগের জন্য, একটি প্রতিষ্ঠান অ্যাসেট ডিরেক্টরিকে git হিসেবে ম্যানেজ করতে এবং PR রিভিউয়ের মাধ্যমে আপডেট গেট করতে পারে—এটি একটি উপলব্ধ গভর্ন্যান্স মডেল, অ্যাপের কোনো প্রয়োজনীয়তা নয়।
- কোনো বাধ্যতামূলক RBAC নয়। ওপেন অ্যাপটি ডিফল্টভাবে পাবলিক-অ্যাক্সেস; ব্র্যান্ড ঝুঁকি ম্যাচিউরিটি ট্যাগ + ওয়াটারমার্ক দিয়ে সামলানো হয়। যে প্রতিষ্ঠান আরও কঠোর নিয়ন্ত্রণ চায় সে তার নিজের auth এবং উপরের git-রিভিউড ক্যাটালগ যুক্ত করে।
- কোনো কেন্দ্রীয় ডেটাবেস নয়। সমস্ত ব্যবহারকারীর স্টেট প্রতি-ডিভাইস। SUSE ID ইন্টিগ্রেশন রোডম্যাপে আছে কিন্তু লঞ্চ ব্লকার নয়।
- কোনো শেয়ার্ড টুল/ইঞ্জিন কোড পাথ নয়। ইঞ্জিন ওপেন সোর্স;
tools/এবংassets/তাদের নিজস্ব রিপোজিটরিতে প্রোপ্রাইটারি SUSE কনটেন্ট হিসেবে থাকে। বিভাজন বলবৎ করা হয় (কোনো ক্রস-ইমপোর্ট নেই) যাতে বিভাজনটি পরিষ্কার থাকে।
লাইফসাইকেল, শুরু থেকে শেষ
একজন ব্যবহারকারী lolly.tools/#/tool/qr-code?url=https://suse.com&ecl=H খোলেন:
- বুট। web শেল 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-ওয়াকিং ভেক্টরাইজারের মধ্য দিয়ে যায়) → blob →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 → সত্যিকারের পেজ পয়েন্ট, raster → একটিpHYsচাঙ্কসহ DPI-তে পিক্সেল)। অথরশিপ/প্রোভেন্যান্স মেটাডেটা (লেখক, টুল, সোর্স—engine/src/metadata.tsদ্বারা নির্মিত) প্রতি ফরম্যাটে এমবেড করা হয়: PNG iTXt, JPEG EXIF, PDF info dict, 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 — web শেল লাইভ |
| বর্তমান টুলিং উন্নত করা | 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 মেটাডেটা, host.pdf ব্রিজের মাধ্যমে PDF) এবং Text Helper (প্রতিদিনের পেস্ট-ইনটু-আ-ওয়েবসাইট কাজের জন্য অন-ডিভাইস ওয়ার্কবেঞ্চ—JSON ফরম্যাট, JWT ডিকোড, Base64, URL এনকোড/ডিকোড, SHA হ্যাশিং, এছাড়া একটি Novelty গ্রুপ)। পরবর্তী: ক্রপ/রিসাইজ, ইমেজ কনভার্ট/কম্প্রেস; তারপর একটি 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) হিসেবে যোগ করুন বা একটি bearer টোকেন দিয়ে একটি CLI/HTTP ক্লায়েন্ট এর দিকে নির্দেশ করুন। mcp.lolly.tools-এ লাইভ (সম্পূর্ণ এন্ডপয়েন্ট: হোস্টেড হেডলেস ব্রাউজারের মাধ্যমে raster/PDF/animation/video) এবং 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, নির্দিষ্ট প্ল্যাটফর্ম, বা রানটাইম পরিবেশ সম্পর্কে জানে এমন সবকিছু এর বাইরে থাকে।