Lolly
啟動應用程式

Brand pages

A brand page is one published folder that works as a press kit and an agent kit. A person sees the logos, colours, type, colourways, rules and real examples. An agent, a partner's tool or a build reads the same facts from files beside the page.

The folder is static: no scripts, no tracking and nothing loaded from another site. You can host the folder anywhere that serves files.

See the Lolly Demo brand page. The web build makes that page with the same command described below, for the Lolly Demo design system only.

What is in the folder

FileWhat it is for
index.htmlThe page for people, drawn with the brand's own tokens, in light and dark. Colourway and mode switches work without scripts.
index.mdThe same page in Markdown.
brand.jsonThe manifest: every file with its digest, the logos and the surface each one is for, the design system's colour roles if it declares any, what was held back and why.
DESIGN.mdThe default colourway and mode in the DESIGN.md format. Lolly targets the format's alpha version.
design/A DESIGN.md for each colourway and mode.
AGENTS.mdText to paste or download into a project, so an agent working there follows the brand. A design system with colour roles lists them here in its own words, as data, with what Lolly reads each as.
llms.txtAn index of the folder for agents, with relative links.
checks.jsonWhat was measured for each colourway and mode.
tokens/The design system as DTCG tokens, plus resolved copies per colourway and mode.
logos/Logos, when their rights allow. See what goes public.
fonts/Font files and their licence text, when their rights allow.
skills/Public brand skills as standard Agent Skills folders.
examples/Examples drawn with the design system, as SVG.

Publish a page

Either route only writes a folder, and nothing goes public until you put the folder on a host.

In the app. Open Lolly Design System Setup and choose Publish a brand page, under Versions & publishing. You see the live page, every file that goes public, what was held back and why, and the checks. Download folder saves a ZIP. An instance that serves brand pages also offers Publish to its address.

In a terminal.

lolly system publish --out=./brand-page --origin=https://example.com/brand/acme

The source is --file=<tokens>, then a content profile you name with --profile=<name>, then the active design system in the terminal. The command lists what it wrote and what it held back, then stops. Nothing goes public until you put the folder on a host. The CLI reference lists every flag.

Read the folder before you host the folder. index.html opens from disk, and "Not published here" at the foot of the page lists everything left out, with the reason.

The same design system and options always give the same bytes, because nothing in the folder records a clock or a random id. A second publish with no changes gives an identical folder, so a version-control diff shows only what really changed.

Host the folder

Any static host works. The page's links are relative, so its address needs a trailing slash: /brand/acme/, not /brand/acme. Most static hosts redirect a folder address to the form with the slash. With nginx you can add the redirect yourself:

location = /brand/acme { absolute_redirect off; return 308 /brand/acme/$is_args$args; }

Serve .md as text/markdown and .ttf as font/ttf.

On Lolly Work, an administrator can turn brand pages on, and then lw brand-pages publish ./brand-page sends the folder to the instance. The feature is off by default, and a published page is public even on a sign-in gated instance. Host a brand page has the permissions, the optional approval step and what the server checks.

What goes public

The rights recorded in your catalog decide which bytes go in the folder. Everything left out is listed with its reason, on the page and in brand.json.

ItemWhen the file is published
Logo with a recorded licenceWhen a reviewed licence allows passing the file on.
Your own mark, on your own termsWhen its rights record says own-work, with the owner and the terms. See Publish your own marks.
Logo with no licence on recordHeld back, unless you name the logo with --include, which records your stated choice.
Logo under a brand lockNever. --include does not change this.
Font fileOnly when a recorded licence allows passing the file on and the font's own embedding field does not restrict the file. --include does not change this.
Font you cannot publishThe file stays out. The page gives the family's name, can link to where to get the face, and shows a specimen as outlined vector text, so readers still see the face.
Brand skillsPublic skills only. An audience: internal skill never appears, not even by name.
Reviewers' namesNever. A public file does not name who reviewed a rule.
A managed design systemHeld until its manager allows publishing, stated with --manager-allows.

A licence with conditions is not an error. A font published under the SIL Open Font License, for example, carries its licence text beside the file, and the page links to the text.

Publish your own marks

Your own logos are rarely under an open licence, and they do not need one to appear on your own page. Record your ownership and your terms on the asset row, and the file travels as "Owner-published, not an open licence":

{
  "license": "LicenseRef-Acme-Marks",
  "rights": {
    "works": [{
      "id": "acme/logo/primary",
      "creators": [{ "name": "Acme Ltd", "role": "owner" }],
      "rights": [{ "declaration": "LicenseRef-Acme-Marks", "assertedBy": "catalog", "evidence": "catalog-entry", "status": "unparsed" }],
      "grants": [{ "kind": "own-work", "scope": "Your terms, in your own words.", "asserted": true }]
    }]
  }
}

The page says which logos are owner-published, and your terms appear under "Using this brand". A record with no owner, blank terms or no declaration stays held back, and the reason says what is missing. A reviewed licence on the same row answers first, and a brand lock still holds the file back.

This reads what your catalog states. Lolly does not check that you own a mark, and your words grant nobody anything Lolly can confirm. Write this record only for your own marks: a partner's logo needs its own licence on record, or your stated choice with --include. The Lolly Demo page publishes Lolly's marks this way.

Lead back from your files

Your exports can name your page, so a file someone finds later leads back to the source. This is off until you turn it on, per design system. It records one thing, the page's address, in the design-system record. Nothing else in the file changes.

In the app. On exports, in the same sheet, has a switch: Record the page address in exports. For a folder you host yourself, type the address under Where it will live, then turn the switch on once the page is live there. For an instance that serves pages, the switch opens after you publish, and it uses the address the instance gives back. Turn the switch off and later exports hold no address.

In a terminal. Add --record-address to lolly system publish --origin=<address>, and --no-record-address removes the setting. Both change the active terminal design system.

For a managed design system. A managed design system is read-only on people's devices, so its manager sets this for everyone. On a Lolly Work instance that lets you edit it, choose Edit for that instance, turn the switch on in the same sheet, then choose Send to that instance. With no instance, set the address in the source tokens, at $extensions["com.suse.lolly"].exportRecord.brandPage. Everyone using that system then records the address, and each person's card shows the address and can leave it out. A content profile's tokens work the same way.

The setting does not travel. A record in a signed file reads as the signer's own. If the setting moved with the design system, importing someone's pack would write their address into your signed exports, and a hostile pack could point everyone's files at a page of its choosing. So the setting stays with the design system it was turned on for:

To record your own page on a copy or an import, turn the switch on and type your address. Lolly does not offer the publisher's address as a starting value.

The addresses Lolly refuses. A record travels with a file, long after anyone can explain what a private address meant, so only a plain https address on a named host can be recorded. Lolly refuses http and every other scheme, a user name or password, a query or fragment, an IP address, localhost, a host with no dot such as https://brand/, whitespace and hidden format characters, and anything over 512 characters. An instance served from an IP address or a single-label host cannot be recorded, even when its page is live.

What people see. Each export's Design system card shows the address before anything is written, and unticking the card leaves the address out of that export, with the rest of the record. _madewith=0, --no-madewith and madeWith: false do the same. The command line and the MCP server say when the address is recorded.

What a reader sees. Lolly Verify shows your host and says the signer recorded this address. It does not say the page is yours, because a signer can record any address and a page can be forged. Tell people which address is really yours somewhere they already trust.

The setting stays out of the published folder, so turning it on or off does not change the page's files.

Your words on use

Lolly writes no licence or legal claim for you. A usage statement and a contact are your own words:

lolly system publish --out=./brand-page --usage-file=usage.json
{
  "statement": "Ask before you change the mark.",
  "contact": "brand@example.com",
  "url": "https://example.com/brand-terms",
  "fonts": { "Acme Sans": { "url": "https://example.com/acme-sans", "licence": "Licensed separately" } }
}

A plain text file works too, and becomes the statement. fonts says where to get a face whose file is not in the folder. The terms on owner-published marks follow your statement, so your statement cannot replace them.

What the checks say

checks.json holds contrast measurements for the colour pairs in every colourway and mode, and house rule checks on example documents. A design system with colour roles gets a pair per role, in its own words: the colour that sits on the role, and the role on the background. The page shows the same results under "What was checked".

These are measurements of token pairs and examples. They do not judge a finished piece, and a person still decides.

"Made with Lolly"

The page's footer links to Lolly. To leave the link out, publish with --no-made-with-link.

Take a logo from someone's page

A partner's page can replace a logo sent by email. Any tool with a list that takes dropped pictures, such as Lolly Logo Wall, can take the current logo from a page:

lolly run logo-wall \
  --logos-from=https://example.com/brand/acme/ \
  --logos-from=./partners/orbit-brand-page \
  --logos-surface=dark \
  --output=wall.svg

Lolly takes the logo the page declares for that surface. The surface comes from --logos-surface, then a literal --background colour, and otherwise light. The command then prints what the page says about use, with its contact, or says that the page states no terms.

Lolly reads a page as data from someone else:

What the digest does not tell you. A digest shows that a file is the one the manifest lists. Nothing yet shows who published a page, so check the address yourself. The usage statement is the publisher's text. Lolly reports the words and does not read them as permission.

In the web app. The hosted app's Content Security Policy allows named hosts only, so the app cannot fetch a stranger's address. Trusting a site does not change that. Add from… in Lolly Design System Setup takes a page's folder or a ZIP of the folder, checks every file against brand.json and adds the tokens for your review.

What you get in the file. The logo goes into the row as a picture, as a dropped file does. The row does not remember the page, so a newer logo on the page does not change a file you already made.

For agent authors

Start with llms.txt, which lists the folder with relative links. Then read brand.json, or go straight to the file you need.

You wantRead
The colours, type and components for one lookDESIGN.md, or design/<colourway>.<mode>.DESIGN.md
Every token, with theme groupstokens/tokens.json
Resolved values for one colourway and modetokens/<colourway>.<mode>.tokens.json
The logo for a surfacelogos in brand.json: each row has surface, mono and, for the logo the brand leads with, primary
The brand's own words for its colourscolourRoles in brand.json: each row has id, label, an optional description, the token to use and the slots it fills. An empty fills means no tool picks the colour by itself. The key is absent when the design system declares none
How to write, photograph or animate for the brandskills/
What was measuredchecks.json
What is missing, and whyheld in brand.json

Five rules for your agent:

To bring a DESIGN.md into Lolly, run lolly system import DESIGN.md, which reads the tokens into a new design system. --dry-run reads the file and changes nothing. DESIGN.md in Design Tokens says what maps to what.

To draw with the brand rather than read about the brand, use Lolly's MCP server or the CLI. A page cannot render anything by itself, and runs no tools or hooks.

What is not built yet

Where to go next