Skip to main content

Limelight

Limelight is a portable package format for data-driven figures and analysis stories, and a desktop app for reading them.

A Limelight package is a folder, or an archive with the same layout, named with either a .limelight or a .ll extension, holding a project.dhall manifest alongside the datasets it describes, the figure specs drawn from them, and a story that walks a reader through the analysis. The app opens either form, validates the manifest, resolves the data, renders the figures, and follows the story.

Packages are meant to be produced by libraries and tools rather than by hand; limelight.writer is the Python library for building them, and limelight.reader for opening them without the app.

Installing

pip install "limelight-app[gui]"    # the desktop app, the CLI and the library
pip install limelight-app           # the library and CLI only: no Qt

The distribution is limelight-app (PyPI would not allow plain limelight), but the package imports as limelight and the commands are named as below. The gui extra is Qt (PySide6), which only the desktop app and LL pdf need, and Typst, which LL pdf sets the story's PDF with; a program that builds or reads packages with limelight.writer and limelight.reader leaves it out.

A package's project.dhall manifest is read by a built-in evaluator, so nothing beyond the Python dependencies is needed. A hand-written manifest that uses Dhall features beyond what the writer emits (functions, if, merge, interpolation) is handed to dhall-to-json instead, if one is on PATH or named by LIMELIGHT_DHALL_TO_JSON.

Native installers for Windows, macOS and Linux are built by packaging/; see packaging/README.md.

Using it

limelight-gui example.limelight            # open a package in the desktop app
limelight-cli summary example.limelight    # print a summary of a package
limelight-cli verify example.limelight     # validate one or more packages
limelight-cli pdf example.limelight        # render a package's story to PDF
limelight-cli meta example.limelight       # print a package's metadata as JSON

LL is the short form of both: LL example.limelight opens the app, and LL verify example.limelight (or summary, json, pdf) runs the CLI.

On a Linux desktop, LL desktop-entry gives a pip or uv install what the native installers have: an entry in the applications menu, a taskbar icon, and .limelight files that open with Limelight. LL desktop-entry --remove takes it away again.

The scripts in examples/ build sample packages into _build/examples/, and src/limelight/language-reference/ holds the Dhall types a manifest is written against; the writer copies them into every package it builds.

Type

A document says how every kind of its text is set - body, headings, code, captions, figure titles, axis and tick labels, legends, annotations, table text - in the typography block of its story: a stack of fonts, a size in points, a weight and a slant for each, so the document reads the same on every machine, on screen and in its PDF. The block also sets two of the figures' distances, in points: axisLabelPadPt between an axis and its label and figureTitlePadPt between the axes and the title. Maths is set in its own face, mathsFont - new-computer-modern (the default) or fira, a sans-serif - at mathsScale times the size of the text around it; both faces ship with Limelight, for the screen and the PDF, so a document's maths is set the same way on every machine, with or without a network. The writer fills the block in; Typography and TextStyle change it. File › Document Information shows what a document is set in, and which face each style really gets on this machine.

Syntax styles

A tool that writes a document can label the names and words in its maths and code, and the document says how each kind is set: the syntax list in its typography gives a colour, a weight and a slant to a style name. Names are dotted, general to particular, and are the labelling tool's own - LSP semantic token types (variable, function, variable.readonly), TextMate scopes (keyword.control), Pygments token types (name.builtin) - plus any of its own, such as symbol.velocity for one name in particular. A label is a list of names, general to particular; each name also stands for its dotted prefixes, and each property comes from the last name in that order that sets it, so variable symbol.velocity takes the variables' style unless symbol.velocity sets its own. A label with no style is set plain.

Tokens are labelled in three places:

  • in maths, \llrole{variable symbol.velocity}{v};
  • on inline code, `velocity`{role="variable symbol.velocity"};
  • in a code block, by a file of tokens beside the story, so the code stays as written. The fence names it after the code's language, ```python {tokens=listing}, and the file, story/code/listing.json, is {"tokens": [[line, start, length, label], ...]}, lines and columns from 0 in Unicode code points. It is declared in the manifest's codeTokens list; Project.add_code_tokens writes both, and any lexer can make them - examples/create_example02_signal_filters.py uses Python's own tokenize. A fence without tokens is set plain on screen; in the PDF Typst highlights it by its language.

A reader can override any style by name in the syntax object of their limelight-setting.json, for instance {"syntax": {"keyword": {"colour": "#d73a49", "weight": 700}}}; File › Document Information lists every style and where each property came from.

Fonts are declared in the manifest's fonts list. Limelight ships Ubuntu, Ubuntu Mono, Noto Sans, and matplotlib's DejaVu Sans and DejaVu Sans Mono, so a document that names only those (the default: Ubuntu, falling back to Noto Sans) needs nothing installed. A system font is used where the reader's machine has it and skipped where it does not, so it goes first in a stack, never last. A bundled font travels in the package, one static file per weight with its licence beside it (Project.add_bundled_font); most open licences allow this and ask for exactly that, while a font that came with an operating system usually may not be redistributed. The fonts Limelight ships are under the Ubuntu Font Licence and the SIL Open Font Licence, in src/limelight/fonts/ with their licence texts.

Developing

uv sync --all-extras --all-groups
uv run pytest

Metadata

Release files for limelight-app 0.0.22

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for limelight-app 0.0.22
File Size Uploaded Provenance Actions
limelight_app-0.0.22.tar.gz 11.1 MB With provenance Details for limelight_app-0.0.22.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for limelight-app 0.0.22
File Interpreter ABI Platform Actions
limelight_app-0.0.22-py3-none-any.whl Python 3 none any Details for limelight_app-0.0.22-py3-none-any.whl

Total release size: 19.4 MB

Release files / limelight_app-0.0.22.tar.gz

Download URL limelight_app-0.0.22.tar.gz
Size 11.1 MB
Tags Source
SHA-256 checksum
How to use checksums
83c4e4c1a332f16d7a0f2fb9a3a3dd938d6d278e1abd64a28c6636b9e2cf892f
BLAKE2b-256 checksum
How to use checksums
0ab609651c6f08efe4086b8e220d1b46e8f51600dab523e4d84418a8302c1633
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 28, 2026.

Transparency log

Release files / limelight_app-0.0.22-py3-none-any.whl

Download URL limelight_app-0.0.22-py3-none-any.whl
Size 8.3 MB
Tags Python 3
SHA-256 checksum
How to use checksums
6cccd2b66e998623c3bd40fba539de46245e4453fefd3a8464b4d4c78f8d412a
BLAKE2b-256 checksum
How to use checksums
c9abac2ed778709e4b6112e08103c4587fba5bf54a4d4de103ed71281fcb5eed
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 28, 2026.

Transparency log

Security for limelight-app 0.0.22

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for limelight_app-0.0.22.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 28, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page