REFERENCE · THE .LABR FILE

What is a
.labr file?

A .labr file is LilLabr’s capture archive: a plain ZIP that holds the editable scene of a webpage and the images it captured. Here is how to download one from Chrome, open it in Figma and read it without any LilLabr software.

Inside the archive.

A .labr file is a standard ZIP with the extension changed and a few deliberate rules. Entries are stored, never compressed, because the images inside are already compressed and a store-only archive is easier to read in a browser and to reproduce byte for byte. The first two entries are always the same, timestamps are fixed at the ZIP epoch of 1 January 1980, and remaining entries are sorted by path.

EntryWhat it holdsWhy it matters
mimetypeThe text application/vnd.lillabr.capture+zip, nothing else.Lets a reader recognize the file before parsing anything.
manifest.jsonFormat and version fields, the generator that wrote it, the source page address and title, and a list of captures with their mode, viewport and scene path.Read this first. A reader that does not understand a listed required feature must not guess.
captures/<id>/legacy-figsnap-v1.jsonThe scene: page metadata, the layer tree of frames, text, images and vectors, the fonts used, and the images as base64 and the SVGs as markup.This is what the Figma plugin builds layers from. It is data, not a screenshot. A recoverable asset loss in its ledger blocks import in the current plugin, by design; a structural limit, such as an embedded frame that could not be read, is disclosed without blocking.
captures/<id>/report.jsonA short migration record: the scene format and version that was wrapped (figsnap 1), the SHA-256 of the original scene bytes and how they were preserved.Lets a reader check that the scene bytes are the ones that were packed. The capture-time warnings and the asset-failure ledger are in the scene’s meta.stats, not here.

The format allows several captures in one archive, for instance a desktop and a mobile view of the same page, or every page of a flow. When an archive contains more than one, the plugin asks which to import. The full contract is versioned so that an older plugin can refuse a newer file instead of misreading it.

Download one from Chrome.

After a capture, the Latest capture card in the panel offers Copy to Figma and Download capture. Choose Download capture. Chrome downloads the file into your usual download folder, named after the page title or the picked element plus the date and time, like pricing-20260913-1430.labr. A pending download stays pending until Chrome reports that it completed.

The latest capture also stays in the extension’s local storage for up to 24 hours so you can download or copy it again. Forget latest capture in Settings removes it sooner; a file you already downloaded is yours and stays. Downloading a file does not upload anything; Save captures is a separate switch in Settings. While Save captures is on, the panel’s Recent tab lists the pages uploaded in the current flow, and Download all N pages saves the whole flow as one .labr file; the plugin’s Import a file tab then lists its pages so you can choose one.

Open it in Figma.

Run LilLabr Import in a Figma Design file and open its Import a file tab. Press Choose .labr file or drop the file anywhere in the plugin window. The file view shows the title, source address, capture mode, counts and a fonts line with the fonts that are missing. Pick the capture if the archive has several, check Import options if you want to change them (Use auto layout and Place at viewport center, both on by default), then choose Import into Figma. Cancel import stops the build. A successful import is one frame named after the page, selected and zoomed to.

This route needs no setup code, no LilLabr account and no network to read the file. It is also the route that keeps inline SVG vectors editable when they use gradients or masks, where the clipboard paste would send one image. More about the plugin, its options and synced captures.

Read it yourself.

Because the archive is an ordinary ZIP, any unzip tool opens it, and a script or an AI agent can read the scene without LilLabr. Read the manifest first to find the scene path, then walk the layer tree.

unzip -o page.labr -d page/
cat page/manifest.json

In the scene, meta holds the address, title, mode (page, viewport or element), the viewport size, the device pixel ratio, and stats with the counts, the capture-time warnings and the asset-failure ledger. root is the layer tree: each node has a type of frame, text, image or svg, a position and size, fills, strokes, radius, effects and children. A text node carries its characters and its runs with font family, size, weight, color, line height and letter spacing. fonts lists the families used; images holds each image by id with its MIME type, base64 bytes, dimensions and the address it came from; svgs holds each vector by id as SVG markup with its name and the address it came from.

import json, zipfile
z = zipfile.ZipFile('page.labr')
manifest = json.loads(z.read('manifest.json'))
scene = json.loads(z.read(manifest['captures'][0]['scene']))
print(scene['meta']['title'], scene['meta']['viewport'])

The same data is what the local LilLabr MCP server, lillabr-mcp on npm, gives an AI assistant as a summary, a layer tree and individual images. The captures it makes for an assistant are .labr files in ~/Lillabr/captures/ on your computer; the server never sends the file anywhere, though what the assistant reads from it goes to the AI app you connected, as anything you paste into its chat does.

Limits and privacy.

Related: the website-to-Figma guide and what to do when an import is blocked.