Lolly Beta
Launch App

Creative rights, credits and what stays yours

You should be able to use good work made by other people without becoming an expert in licensing, and without quietly dropping the people who made it. So Lolly keeps the source of every work it draws, reads the licence that was recorded for it, works out what that licence asks of the use you are actually making, does the part a program can do and tells you the part only you can do.

None of this is legal advice and none of it is a ruling about your project. Lolly records facts, applies a small set of rules that were read from the licences' own legal texts and shows its working. A licence with conditions is a normal, permitted choice. It is never presented as a broken asset.

Three facts, kept apart

"CC BY 4.0", "this use needs a credit" and "the credit is in the file you just downloaded" are three different statements, and Lolly keeps them apart:

Where you meet this first

The emoji sets are the everyday case. Twemoji is CC BY 4.0, so a heading with an emoji in it exports with the artwork credited and nothing left for you to do. Both OpenMoji sets are CC BY-SA 4.0, so recolouring one of their glyphs with a brand treatment is an adaptation, and sharing that adaptation asks you to pick a compatible licence once. Choosing the set is never blocked, and the set control shows the licence where you choose it. The same rules answer for a catalog illustration, a LUT, a font and any other recorded work.

The words Lolly uses

One vocabulary across the export panel, Verify, the command line and the machine result.

What you seeWhat it means
Source credits will be included.The credit is prepared and the route can carry it. Nothing has been written yet, so this is not a success message.
Credits included in this file's metadata.The delivered bytes were read back, the credential verified and every required source was found in it.
Credits and credentials are in the download package.The credit travels as a companion file beside the artifact. Keep them together when you pass them on.
Add this credit to the post description.The chosen route carries neither a credential nor a readable credit, so the credit text is yours to paste.
If you share this adaptation, it needs a compatible licence.A ShareAlike source was changed and the result is headed somewhere other than private use. Choosing is one action, not a dialog per placement.
Source licence not recorded.Nothing was recorded for this source. That is a gap to fill, not a finding against the work.
Conditions recorded, not yet interpreted.The identifier is recognised and its conditions are listed, and no rule here reads them. No automatic pass, no automatic ban.
Two licence declarations disagree.Two records name different licences and nothing has selected which grant applies.
No required credit under the recorded CC0 dedication.The dedication asks for nothing. A courtesy credit is offered anyway.
The credits are not in the file that was delivered.A credit was promised, the readback did not find it and the file is still yours. Export again, or use the credit text by hand.

Lolly does not use "copyright verified", "legally safe", "fully cleared" or "rights cleared", and there is no single green licence badge anywhere in the product. Those words would claim something no program can check.

The licences Lolly has reviewed

Rules version rights-rules-2026-09-13.2. Each rule below was read from the licence's own legal text, and the section it came from is cited beside it in engine/src/rights-profiles.ts as well as here. A version and a port are kept as recorded: a CC BY 3.0 declaration keeps its own version rather than being reported as 4.0 because the app's chooser prefers 4.0.

LicenceWhat it asks of a use Lolly can makeRead from
CC BY 4.0The creator, the title, the copyright notice, the licence name and link, the source link and an indication of changes, each one when the source supplied it. No use is excluded, commercial use included.Legal code, sections 2(a)(1) and 3(a)
CC BY-SA 4.0The same credit. In addition, if you share an adaptation, it goes out under a compatible licence: CC BY-SA 4.0, the Free Art License 1.3 or GPL-3.0-or-later, which runs one way only. Those three are carried as data from the Creative Commons list, never matched by name.Legal code, sections 3(a) and 3(b); the compatible-licences list
CC0 1.0Nothing. The dedication carries no condition, so Lolly offers a courtesy credit and never presents one as required.The dedication, sections 2 and 3; the CC FAQ on crediting
CC-PDDCNothing. What is recorded is the assertion itself and who made it, because a certification is one party's statement rather than proof.The dedication and certification paragraphs
Apache License 2.0The notices from the source and the NOTICE file's attribution text travel with a distributed work. A runtime use asks nothing. A licence that asks for a notice text and a work that carries none is reported as a gap.Apache License 2.0, section 4, conditions 1 to 4
MITThe copyright line and the permission notice travel with copies and substantial portions. Runtime and reference uses ask nothing.MIT, the permission-notice condition
SIL OFL 1.1Rendering text with the font asks nothing of the text. Passing the font file on carries the licence, the copyright notice and the reserved-name rule.OFL 1.1, conditions 2, 3 and 5; the OFL FAQ on documents

Recorded, not interpreted

CC BY-NC, CC BY-ND and the NC-SA and NC-ND combinations are recognised, their conditions are listed and no rule here reads them. They report licence.unknown with a line naming the conditions. A commercial context cannot be read off a price or an account, and each combined text needs its own review before a rule touches it.

Three more honest answers, none of which is permission:

Missing licence information is never read as evidence that a work is free to pass on.

What Lolly does for you

What stays yours

On the command line

A render prints a Rights: block to standard error when the evaluation has a required credit or an issue. It carries the status, one line per issue as code - summary, what the delivered file was read back as and the credit text to paste.

Rights: actions-required
  licence.adaptation-choice - If you share this adaptation, it needs a compatible licence.
  Credential intact. It records 1 source. The exporter recorded it; the source did not sign a credential of its own.
  Credits included in this file's metadata.
  "water wave (OpenMoji Color 17.0.0)" by Vanessa Boutzikoudi (OpenMoji), CC BY-SA 4.0 https://creativecommons.org/licenses/by-sa/4.0/, source https://raw.githubusercontent.com/hfg-gmuend/openmoji/f9fc506a3f913be9897ab0181d611d4c910a4104/color/svg/1F30A.svg, changes: recoloured.

Those two statements are independent, which is the point of keeping them apart: the credit is in the file, and a licence decision is still owed before the file is shared. The file is written either way.

StatusMeaningExit
readyNothing is waiting on a person.0
actions-requiredA decision remains before the file is shared. The file is still written.4
use-not-coveredA reviewed rule says the licence does not cover this use.4
unknownThe only issues are gaps: a licence that was not recorded, or conditions that are not interpreted.0
delivery-failedSet by a receipt, never by an evaluation: a promised credit was not found in the delivered bytes. The export panel shows it; the CLI reports the same fact in its readback line instead.not printed

Exit 4 is the code this CLI already gives a protective check that said no. It is deliberately not 3, which means "retry on another runner", and a licence decision will be waiting on every runner there is.

--rights=private states that this render is not being delivered to anyone. The block still prints and the credit is still there to copy; what stands down is the condition that applies on sharing, and no delivery claim is recorded. There is no flag for ignoring a condition: --rights=ignore is a usage error.

The issue codes are stable and machine-readable, independent of the translated copy:

attribution.source-missing, attribution.delivery-missing, licence.adaptation-choice, licence.use-not-covered, licence.grant-conflict, licence.unknown, source.redistribution-unknown, credential.ingredient-missing.

Over MCP, lolly_verify returns a rights payload with the summary, one row per recorded source and the stated limits; a browser-free lolly_render returns status, issues, credits, fingerprint and a creditsInFile flag that is measured by reading the bytes back.

Where the rules live

Four engine modules, all pure: no network, no clock, no filesystem. The rule data is versioned and in the repository, never fetched.

ModuleWhat it holds
engine/src/rights-profiles.tsThe identifier table, the minimal SPDX expression reader, the reviewed profiles with their citations and the one rule for a link a credit may print.
engine/src/rights-evaluate.tsClassification, issues, the attribution plan and the fingerprint. Deterministic: the same facts in a different order give the same answer.
engine/src/rights-attribution.tsReadable credits, the companion files, the source ingredients and the receipt measured after writing.
engine/src/rights-report.tsA verified credential read back as the three questions Verify asks.

The expectation files in tests/fixtures/rights/ were authored from the licence texts rather than from the evaluator's output, and its README cites the section behind each expectation.

What this does not do

Stated plainly, because a gap that is not named reads as a promise.