Lolly Tools

Powerfully reproducible assets & tools. Deterministic, fast, open-source platform — bring your own brand.

Lolly Icon - Large green and white lollipop candy

What is Lolly Tools

A platform that hosts a library of small, focused tools that produce deterministic creative assets. Users need no design skill, vendor lock-in or internet and the platform is designed to add premium production-quality rendering certainty to variable data.

It's also your personal DAM — every logo, palette, font and upload lives in an on-device catalog, hydrated and supercharged by your design system and tools.

Tools can be used via a:

Why deploy Lolly in your organization?

What this is not

It does include an open canvas — Layout Studio — but even there, colours, type and assets conform to the brand globals, so free arrangement never becomes off-brand output. See docs/positioning.md for the full landscape comparison.

Repository layout

lolly is an umbrella repo: the app core lives here, and each shippable unit is a git submodule hosted under github.com/lolly-tools. Every submodule is mounted at its original path, so the monorepo builds and runs exactly as before.

lolly/                              # umbrella — engine + glue (this repo)
├── engine/                         # platform-agnostic core (the open-source heart)
├── schemas/                        # JSON Schemas for tool.json, assets, AssetRef
├── scripts/                        # catalog build/validate + scripts/subrepo/ split toolkit
├── tests/                          # engine + contract tests
├── api/                            # Vercel functions (mcp, ca)
├── brands/lolly-start/             # blank starter brand (neutral tokens only) — parent-owned
├── tools/                          # VIEW: the active profile's merged tool set (gitignored)
├── catalog/                        # VIEW: the active profile's brand catalog (gitignored)
│                                   #  ── submodules (github.com/lolly-tools/*) ──
├── docs/              → lolly-docs             # architecture, guides, /info generator
├── community/         → lolly-tools            # community-safe tools (data, not code; MPL-2.0)
├── brands/suse/       → suse-lolly             # PRIVATE: SUSE tools + brand catalog
├── services/mcp/      → lolly-mcp-server       # Model Context Protocol server
├── services/ca/       → lolly-ca               # device-credential Certificate Authority
└── shells/
    ├── web/           → lolly-web              # installable PWA
    ├── cli/           → lolly-cli              # command line
    ├── tui/           → lolly-tui              # terminal UI
    ├── tauri-desktop/ → lolly-desktop          # macOS / Linux / Windows
    ├── tauri-mobile/  → lolly-mobile           # iOS / Android
    └── chrome-extension/ → lolly-chrome-extension

Critical separation: engine/ knows nothing about SUSE. Brand-specific content lives in brand packs (brands/suse — private; brands/lolly-start — the blank starter brand), brand-agnostic tools in community/; the shells, services, engine and docs are MPL-2.0. The repo-root tools/ and catalog/ paths every script and shell consumes are profile views built by scripts/use-profile.ts from profiles.json — switch brands with npm run profile:suse / npm run profile:start. Keeping each unit in its own repo lets it ship on its own cadence while the umbrella pins a known-good combination.

Architectural commitments

These decisions are settled. Changing any of them is a major undertaking:

  1. Declarative tools. A tool is a manifest + template + assets. Inputs are declared in the manifest, not inferred from template tokens. hooks.js is an optional escape hatch for tools that need imperative behavior (chart.js rendering, QR encoding).
  1. Tools and assets are data, not bundled code. Clients sync them from a signed manifest URL. New tools and assets don't require app updates.
  1. Capability bridge. Tools never touch the filesystem, network, or DOM-outside-template directly. They call a versioned host.* API. This is what makes the same tool work in browser, Tauri, and CLI.
  1. Stable asset IDs forever. suse/logo/primary is a contract. Never reuse, never rename. Version in the manifest, never in the path.
  1. URL mode is first-class. Every input must be expressible as URL params. CLI mode = hidden browser + URL mode + file output. One render path.
  1. Storage via the bridge. Tools call host.state.save() / host.state.load(). The bridge picks IndexedDB (web), filesystem (Tauri), or memory (CLI). Tools never know which.
  1. Maturity tags. Every tool declares status: official | community | experimental. Experimental tools watermark their exports. This is the structural answer to the "brand approved by default" risk.

Getting started

Because the shippable units are submodules, clone recursively:

git clone --recurse-submodules https://github.com/lolly-tools/lolly.git
cd lolly
# already cloned non-recursively? → git submodule update --init --recursive

npm install                    # workspaces need every submodule's package.json — init submodules FIRST
                               # (postinstall picks a content profile automatically — see below)

npm run dev:web                # run the web shell
npm run cli -- qr-code --url=https://suse.com --output=./qr.svg   # run a tool headlessly
npm run validate:catalog       # validate the catalog

Content profiles. tools/ and catalog/ are gitignored views assembled from the mounted packs (profiles.json): the private brands/suse pack (skipped automatically on clone if you don't have access — it's update = none) plus the public community/ tools. Without SUSE access you land on the blank lolly-start brand and everything still builds and runs. Switch explicitly:

npm run profile          # show the active profile + what's available
npm run profile:suse     # SUSE brand pack (needs: git submodule update --init --checkout brands/suse)
npm run profile:start    # blank starter brand — community tools only

See docs/authoring-tools.md to build your first tool, and Development below for the submodule workflow. A new brand pack can be generated from design tokens with npm run ingest:brand (DTCG / Tokens Studio / Penpot exports).

Development

Lolly is an umbrella repo composed of git submodules (see Repository layout). That changes two things: how you clone, and where each change is committed.

Clone / update

git clone --recurse-submodules https://github.com/lolly-tools/lolly.git
git submodule update --init --recursive     # in an existing clone — run BEFORE npm install

Each submodule is checked out on its own main, tracking its repo under github.com/lolly-tools/*.

Where your changes go — the umbrella pins a specific commit of each submodule, so a change is committed to the repo that owns the file, then the umbrella records the new pointer:

You edit…Commits to
engine/, schemas/, scripts/, tests/, api/, root filesthe umbrella (lolly)
docs/lolly-docs
community/ (or a community tool via the tools/ view)lolly-tools
brands/suse/ (or SUSE tools/catalog via the views)suse-lolly (private)
brands/lolly-start/, profiles.jsonthe umbrella (lolly)
services/mcp, services/calolly-mcp-server, lolly-ca
any shells/*lolly-web · lolly-cli · lolly-tui · lolly-desktop · lolly-mobile · lolly-chrome-extension

⚠️ Committing from the umbrella root does not capture edits made inside a submodule — git only sees the pointer. Commit inside the submodule, or use loldev (below). The tools/ and catalog/ views are symlinks into the packs, so editing through them lands in the right pack checkout automatically. Editing a SUSE tool touches two repos (suse-lolly + umbrella pointer); a community tool touches three (lolly-tools manifest, suse-lolly regenerated index, umbrella pointer).

loldev — one command to ship a change. A helper that does the multi-repo dance for you. Install it on your PATH:

ln -sf "$PWD/scripts/subrepo/loldev" /usr/local/bin/loldev   # or any dir on your PATH
loldev gtg -m "replaced suse logomark"   # build catalog → commit + push every changed
                                         # submodule to its repo → commit + push the umbrella
loldev gtg                               # same, with an empty commit message
loldev ship -m "…"                       # gtg, THEN deploy to Vercel prod (lolly.tools); --preview for a preview URL
loldev status                            # what's dirty / ahead, per repo
loldev profile suse|lolly-start          # switch the content profile (rebuilds tools/ + catalog views)
loldev pull                              # pull umbrella + update all submodules + refresh views
loldev dev                               # run the web shell
loldev cli -- qr-code --url=…            # run a tool headlessly
loldev help                              # every command

loldev operates on ~/Build/lolly by default (override with LOLLY_ROOT). The underlying scripts live in scripts/subrepo/sync.sh, status.sh, verify.sh, plus migrate.sh/snap-history.sh (the one-time split).

Current tools

<!-- tools-table:start --> The SUSE catalog ships 57 tools today — 56 listed in the gallery, plus one unlisted helper (Asset Export). Generated from catalog/tools/index.json by npm run build:readme-tools:

ToolWhat it makes
3DLoad a 3D model into a lit scene, orbit and pose the camera, and render a still or a turntable animation.
Animated AdBuild animated ads from layered scenes for any standard size.
AudiogramTurn a voice clip or song into a branded waveform video — animated bars, wave or ring, ready for social.
Bag VideoAn animated, on-brand video for bag visuals.
Booth StudioDress a 3D event booth with sponsor artwork. Click any panel to drop an image on it, pick a booth design, and render a still or a turntable for a sponsor pitch.
Brand LockupOfficial SUSE logo lockups — chameleon, wordmark and a name.
Calendar ICSTurn event details into a calendar (.ics) file for any calendar app.
Carousel MakerDesign a multi-page carousel on one canvas — set 1–6 same-size pages, drop objects onto each page, export an image sequence or a multi-page PDF.
Chart CreatorOn-brand charts from your data — bar, donut, pie or stacked.
Code CanvasTurn code snippets into clean, syntax-highlighted, shareable images.
Color BlockColour blocks — text, image, logo — auto-arranged into a grid.
Color PaletteBrowse SUSE brand colors — click a swatch to copy it.
Compress PDFShrink a PDF by recompressing its images — on your device.
Convert ImageTurn HEIC, TIFF or any photo into WebP, JPEG or PNG — on your device.
Countdown TimerA focused countdown with a live progress ring. Click to pause.
D3 Chart StudioPowerful data-driven charts with D3 — paste a table and it charts itself. Bars, lines, areas, scatter, pie, radar, treemap, heatmap and more, on-brand and vector-clean.
Day BriefQuote of the day with live weather, time and a map for any city.
Deck BuilderBuild a slide deck with a live on-canvas editor — edit text, colours and images directly on each slide.
Deck StudioBuild a native, editable PowerPoint deck — real text, bullets, tables and brand theme — from a simple slide builder, pasted Markdown, or a JSON spec. Charts and diagrams come from your other Lolly tools. Exports .pptx (editable), plus PDF and PNG.
Diagram BuilderOrg charts, flowcharts, timelines and more — from cards, text, Mermaid or CSV.
Doc StudioWrite a multi-page document on the canvas — rich text, headings, tables and inserted Lolly renders that flow onto pages and export as a PDF.
Dynamic LayoutA do-anything layout that recomposes around whatever you add, at any size.
Email SignatureAn on-brand SUSE email signature, ready to paste into any client.
Event Name BadgeConference name badges with a colour-coded role and optional QR.
Filter: DuotoneA two-color duotone for any photo — shadows one color, highlights another.
Filter: HalftoneVector halftone from any photo — dots sized by brightness.
Filter: Pixel StretchSmear a column of pixels across a photo from a threshold line. Works live.
Filter: Posterize BitmapTrace any photo into flat, screenprint-style vector colour separations.
Filter: ScanlineHorizontal 'infinity lines' scanline vector effect from any photo
Filter: Voronoi CellsShatter any photo into a Voronoi cell mosaic — each cell filled with the nearest colour, as flat vector.
Flow ChartBuild flow charts on an open canvas — drag cards, connect them, and the lines route and stick to the boxes.
Layout Studio
LogoPlace the SUSE logo — it auto-picks the right variant and exports vector.
Logo Lockup: Grid (NASCAR)Arrange a pile of logos into a clean, even sponsor grid — the “NASCAR” wall.
Logo Lockup: PartnerThe SUSE logo beside a partner's, with a divider between — light or dark.
Lottie AdBuild animated ads from layered scenes, each carrying a Lottie motion asset, for any standard size.
Meeting PlannerPlan a global meeting and see the time for every teammate's timezone.
Mesh GradientSoft mesh-style gradients from your brand swatches. Drag the colour points right on the canvas.
Multi-Page PDFBuild a multi-page PDF — a cover, flowing content blocks, and a back page.
Pose GeekoPose the SUSE Geeko with sliders — eyes, blink and limbs. No animation, just a still you can dial in and export print-ready.
Prompt to ImageAI models are cheaper at processing images than they are text
QR Code GeneratorQR codes for any URL, with full color and style control.
Quote CardOn-brand quote cards for social posts and slides.
Rebrand a DeckUpload a PowerPoint deck and snap its colours and fonts to your brand — rebuilt on your device, nothing uploaded.
RecordDesign your own top and tail cards, then record a clip and Lolly wraps them around it automatically.
Screen CaptureScreenshot or record your whole screen, a window, or a browser tab. Drag on the canvas to crop — the export stays the exact pixels you captured.
SlidesBuild a deck where every slide arranges other Lolly tools in a chosen layout, with its own title, background and speaker notes — then export to PowerPoint, PDF, GIF or MP4.
Street MapClean vector street-block maps of any city. Works offline.
Strip Hidden DataReveal and remove hidden metadata from images and PDFs — on your device.
Text HelperFormat, decode, hash and de-identify text — JSON, JWT and more.
Top & Tail VideoRecord a clip in any orientation, then auto-wrap it with branded intro and outro bookends, a lower-third, and a music bed.
URL ScreenshotAny web page, at any scroll-depth, with custom CSS
Voice RecorderRecord a voice note with a live level meter and gentle coaching, then save it as MP3.
Wayfinding SignageDirectional event signs — destinations, each with an arrow. Print-ready.
Web Icon MakerFavicon and app-icon maker — a multi-size .ico, plus PNG and SVG.
WordmarkType a word, get a pure-path vector wordmark in your brand font — recipients never need the font installed.

<!-- tools-table:end -->

The utility "Offline Utilities" section always renders last in the gallery.

Licensing & structure

Every unit now lives in its own repo under github.com/lolly-tools, pinned as a submodule of this umbrella (see Repository layout).

Bundled third-party attributions are listed in THIRD-PARTY-NOTICES.md.