What is FigureLab?
FigureLab is a single HTML file for assembling publication-quality scientific figures — microscopy, western blots, histology, gels, clinical photos, or any image-based figure. It runs 100% in your browser: no installation, no server, no sign-in.
Your images and data never leave your computer — nothing is uploaded anywhere. Because everything runs locally, it also works completely offline.
60-second quick start
- Open figure_lab.html in your browser (Chrome or Firefox recommended).
- Drag images onto the drop zone — or click it to browse and pick files.
- Set your grid: choose the number of rows and columns in the Layout section.
- Adjust panel labels (A/B/C) and turn on scale bars where you need them.
- Press R (or click ⟳ Render) to preview the figure.
- Set a file name and DPI, then export in your chosen format.
Tip Press R any time you change a setting to refresh the preview. A "render outdated" cue appears when the canvas is behind your latest edits.
The interface at a glance
The window has three zones:
- Left — the image list and settings. Each image gets its own panel with adjustments (brightness, scale bar, label, crop, and more), plus the Layout section for grid size and gaps.
- Center — the canvas, where your rendered figure appears. A toolbar above it holds zoom, fit, labels, and annotation tools; an info bar below shows pixel dimensions and physical size in mm.
- Right / Export — the Export panel for file name, format, and DPI, plus a Figure notes scratchpad and metadata exports.
Core workflow, step by step
1. Add and arrange panels
Drop images to add panels. To reorder them, drag the ⠿ handle in the image list. To turn a photo, click it on the canvas and drag the round grip above it — any angle, Shift snaps to 15°, [ and ] nudge by 1°, and the panel's own controls take an exact angle. Locked panels cannot be moved — toggle Lock panel to protect one from accidental drag-reorder. Use ⎘ (Duplicate) to reuse a panel's settings on a similar image.
2. Adjust each panel
Open a panel's settings to fine-tune it with live preview: Brightness, Contrast, and Gamma sliders (gamma is great for dim fluorescence), plus grayscale/invert, black/white points, fluorescence LUTs, rotate, and flip. Apply to all copies brightness, contrast, gamma, LUT, and B/W points to every panel at once.
3. Add a calibrated scale bar
Automatic: when you import a TIFF that carries pixel-size metadata — OME-TIFF, ImageJ, Zeiss LSM, or a centimetre-resolution tag — FigureLab reads the µm/px and calibrates the panel on import (you'll see a toast; print-DPI resolution is ignored so it's never mistaken for a scale). 📎 Read TIFF metadata in a panel re-applies it.
Manual: click 🔬 Calibrate from image in a panel's settings, click two points a known distance apart, and enter the real-world distance — FigureLab computes the µm/px ratio. (Objective presets from 4× to 100× are also available.) Then enable the scale bar; Auto SB picks a clean length automatically.
Tip Pick the bar's unit (nm / µm / mm) next to its length — handy for EM (nm) or gross specimens (mm). You can also drag the left end of the scale bar on the canvas to resize it (it snaps to clean values).
Note An uncalibrated warning badge (⚠) appears on a scale bar when µm/px has not been set. Calibrate first so the bar is accurate.
4. Label the panels
Turn on panel labels and choose a format — A/B/C, a/b/c, 1/2/3, or i/ii/iii — with control over position, size, colour, font, and bold/italic.
5. Space panels apart
Hover the seam between two panels on the canvas: a blue divider with a gap pill appears. Drag it (or tap + / −) to push them apart — horizontal seams control row spacing, vertical seams control column spacing. For independent gaps, tick Per-gutter spacing; Reset gutters returns to a uniform grid.
6. Annotate
Draw directly on the rendered figure with the toolbar tools: arrow, double-headed arrow, ruler, rectangle, ellipse, line, text, inset, and counter. Switch to ↖ Select (or press Esc) to move, resize, restyle, or delete an annotation. Hold Shift while drawing to snap to 45° or force squares and circles.
Tip Annotations are baked into the exported figure, so finalise your layout before annotating. Full undo/redo is available if you change your mind.
7. Export
In the Export panel, set a file name and DPI (72 / 150 / 300 / 600 / 1200), then export as PNG, JPEG, WebP, TIFF, PDF, or SVG. For print and journal submission, use 300–600 DPI — raster exports are re-rendered at the true target-DPI pixel count (supersampled), so text, scale bars, and lines stay crisp. TIFF or lossless PDF at 300–600 DPI on a white background is preferred by most journals.
Saving your work
Save the entire figure — grid, panel settings, calibrations, annotations, figure notes, and the images themselves — as a JSON file (Ctrl+S), and load it again later to pick up exactly where you left off.
Note Session files embed your image pixels, so loading one restores the whole figure — no need to re-drop anything. (Very old sessions saved before this was added will prompt you to re-drop those images.)
Keyboard shortcuts
| Key | Action |
| R | Render figure |
| Esc | Exit tool / deselect |
| Ctrl+Z | Undo |
| Ctrl+Y | Redo (also Ctrl+Shift+Z) |
| Ctrl+S | Save session JSON |
| Space+drag | Pan the canvas |
| Shift+draw | Snap to 45° / square |
What's new in v3.17.0 · updated 27 September 2026
Built by making real figures end to end — a western blot, a time-lapse, a multichannel row — and fixing every place the work stalled, then reviewing those fixes adversarially and fixing what the review found. Plus six features for getting a figure through submission.
- Rows hug their panels. A blot or gel in a tall cell floated in dead space that no gap setting could reach, because the space was inside the cell. Tick Rows hug their panels and each row shrinks to its tallest panel; widths, lanes, headings, bands and every export follow. Blot lane numbers, MW ladders and splice markers now land on the blot, not on the whole sheet.
- ✎ Write Methods paragraph. The image-processing disclosure journals ask for — software and version, uniform or per-panel adjustments, gamma, pseudocolour, projections, splices, where each pixel size came from — written from what the figure actually records, and shipped in the submission package. Where the app does not know something, it does not say it.
- Each panel's real print resolution. Every panel reads "412 ppi" or "180 ppi · enlarged 1.7×", and the compliance check and Save dialog name any panel under 300 ppi — a 300 DPI export of an enlarged panel is still interpolated pixels.
- ⊕ Merge ticked channel files, ↓ split keeps the field. Tick C1-DAPI.tif, C2-GFP.tif… and merge them into one panel, originals hidden not deleted; + Add channel opens TIFFs. Splitting a merge now gives the single-channel panels the merge's crop and rotation instead of the whole uncropped frame.
- ⧉ Repeat an annotation on the row, the match group or every panel — on the same pixels when the panels show the same picture — and LZW-compressed TIFF, switched on by the PLOS preset and verified lossless with an independent decoder.
- Things that silently went wrong. Straightening a panel then made cropping it impossible. Typed row and column headings vanished on a resize and came back as "Col 3". Greyscale, Invert and Reset could not be undone. Files imported in decode order, not the order picked. The submission package captioned hidden panels and dropped a visible one. Frames 2…N of an OME-TIFF arrived uncalibrated. All fixed.
- 540 Playwright tests (up from 466).
v3.16.0 · 15 September 2026
Three things people went looking for and could not find, and several places the interface said something that was not true. If you have ever set a gap and watched nothing move, the second item is why.
- ↻ Turn a photo from the canvas. Click a panel and a grip appears above it — drag for any angle (Shift snaps to 15°), or nudge with [ and ], or type an exact angle. ↺ ↻ ⌐ in the toolbar turn the selected photo, or every photo when none is selected — a folder of captures that all arrived on their side is one click. Fixed: a quarter-turned panel was drawn at half the size in a cell it exactly fits, with its letter floating off the picture onto the background.
- ↔ Spacing that actually responds. Four separate faults, each of which made "I cannot change the space between panels" literally true. A divider drag released anywhere but the canvas never ended, so the spacing then ran away on plain hover with no button held. The − and + chips beside a divider were unclickable at any gap under about 41 px — the default is 6. A single per-gutter override silently outranked Tighten spacing, every journal preset and every loaded template, which all reported success and moved nothing. And the freeform editor had no spacing control at all: Distribute needs three objects and returned in silence with two. It now has Space: N px.
- ⌘K finds what you mean. The palette matched your whole query as one literal substring, then fell back to a letters-in-order guess that hit almost anything — and drew those guesses to look exactly like real answers. Typing undo and pressing Enter ran Reset all crops, because there was no Undo command at all. Now every word must land somewhere, a guess is announced as a guess, and 24 commands were added for things it could not reach: Undo, Redo, the panel gaps, panel size, export DPI, printed width, the arrow and shape tools, calibrating a scale bar, panel letters, merging and splitting channels, opening a session. Entries can also take you to a setting — opening its section, scrolling to it and flashing it.
- ⚠ Things that were not true. The Save dialog — the last screen before the file is written — reported 2.03× the real size whenever a column width was set (2131×2069 px for a file that is 1051×1020). The compliance report claimed "Nature/Science/Cell" even with the PLOS preset applied. The ⚠ beside an uncalibrated panel was an inert 5 px glyph; it now reads ⚠ calibrate and opens the dialog. Two headings that named the wrong thing were renamed. Page 2 of a multi-page PDF drew page 1's row gutters.
- 466 Playwright tests (up from 440). Most of this release was found by driving the app with a real pointer rather than reading the code.
v3.15.0 · 14 September 2026
Channels, time, and three labels that looked draggable and were not. If you build multi-channel or time-lapse figures, the first two items are the ones to read.
- ≡ Sync display range by channel. Send one panel's black and white points to every other panel and extra channel showing the same channel — DAPI levels to every DAPI, GFP to every GFP — and change nothing else. The compliance check now warns when compared panels show one channel at different ranges ("GFP: A 10–200, B 0–255"), with this as its one-click fix. Each extra channel also gained its own black/white sliders: the values existed and were saved, but nothing in the interface could set them.
- ⏱ Tag a time-lapse from the times already in the file. Reads OME-TIFF
DeltaT (honouring its unit), an ImageJ frame interval, or the plain TIFF DateTime tag, and tags the panels with the elapsed time from the earliest — in whichever of s / min / h keeps the numbers small. Panels whose file carried no time are left alone, and a figure mixing relative and absolute times is refused rather than given an invented zero.
- ▤ A channel key for the figure: every channel the visible panels show, once, with its swatch, derived from the panels themselves so it cannot drift out of step. Plus ✛ Axes, an orientation marker (D V A P by default, or any four letters you type) for histology and embryo panels.
- Three labels that could not be dragged, now can. Panel tags, the numbers on an intensity bar and group band headings were all found by the hit test and all had nowhere to store the offset — the cursor said "grabbing" and nothing moved. A tag sent to the same corner as the panel letter also steps below it now instead of sitting on top of it.
- Vector where it was raster. Inset outlines, their letters and connector lines are written into the SVG as shapes rather than baked into the picture — and counter markers reach the SVG at all for the first time; they had been dropped silently.
- A quiet empty figure. With no images loaded, the Images section used to show a wall of inert panel tools — including a red Delete hidden panels button. They now appear once there is something for them to act on; one line says so.
- The command palette box is full width — a global input rule had been shrinking it to 76 px. The icon browser shows a few per group with “Show all”; search still shows everything that matches. Suggested AI prompts fold away under the prompt box.
- Every labelled control is now a real label — 40 inputs a screen reader announced as unlabelled are associated with the text beside them. Helper text no longer goes below 10 px. Fixed: the footer had its own hard-coded version and had drifted behind the badge above it.
- 440 Playwright tests, up from 425 — the new ones read exported bytes and real TIFF metadata fixtures, which is what found the silently dropped counters and the dead drags.
v3.14.0 · 14 September 2026
A feature release, two days after the audit. Most of it is cropping and what a reader needs to find their way round a figure; some of it came from looking at what QuickFigures, OMERO.figure and FigureJ do that FigureLab did not.
- 📏 Straighten a crop by reference or by search. 📐 Level: click two points along any edge that should be straight. ✨ Auto: a search for the tilt at which the straight features in the box line up, which declines rather than guess. Batch crop keeps a tilt per image. A ratio lock, pixel-exact X/Y/W/H, ▣ Trim borders for saved plots and scans, and a loupe showing full-resolution pixels under the pointer while you drag. Crops are stored to 0.01 % instead of whole percents.
- ⧈ Insets you can place. Draw the inset region in the crop editor; the region is outlined on the parent with the inset's letter, optionally connected by lines to the inset, and the outline can be dragged to move the region. The caption says "Magnified view of the boxed region in (A), 2.0× relative to (A)".
- 🏷 Panel tags. A short text on each panel besides its letter — typed, generated as a series (0 min, 5 min…), or the channel names each in its LUT colour (DAPI in blue, GFP in green). Vector text in SVG and PDF. Plus a per-panel intensity bar in native units.
- ⬆ Max and mean projections of ticked panels; blank cells you can insert and remove; ❖ Fit grid to panels; ⛶ Crop to fill cells; ≡ Same bar on all calibrated panels.
- ◢ Spotlight annotation that dims everything but a region, on a panel or the whole figure, exported as an editable SVG path. Auto contrast for letters, tags and scale bars. A ▨ clipped-pixel preview (ImageJ's HiLo) on the canvas toolbar. Field of view in the caption and metadata CSV.
- Fixed. The multi-page PDF is now the same writer as the single-page one — lossless by default, labels as selectable text, page 2 with its own row labels. The label-format dropdown (A/a/1/i) had never done anything; it does. An empty grid cell broke the caption and the session save and was drawn into exports with its ghost number; all three fixed. "Reset all crops" also resets the tilt. Enter applies and Escape closes the crop editor.
- 425 Playwright tests (up from 378).
v3.13.1 · 12 September 2026
A correctness release, from an independent audit. No new features — but if you have exported a figure at a journal column width, or pasted a generated caption into a manuscript, please read this.
- 📏 "Printed width" now reaches the file. Choosing a column width (for example 183 mm — double column) at 300 DPI produced a PNG, TIFF and PDF tagged 210 dpi and 261 mm — 43% oversize and below the 300 dpi bar this app's own compliance check had just told you it cleared. The on-screen readout said 183 mm the whole time. Every column preset was affected, and the error grew as the column got narrower. Re-export any figure you made with a column width set.
- ❌ The caption no longer invents a magnification. It printed 1/(µm per pixel) as "×" — a 100× objective on a 6.5µm camera pixel was captioned "(15×)". FigureLab never knows your objective, so it now reports the µm/px it does know. Check any legend you have already pasted into a manuscript.
- ⚖ The caption discloses every adjustment, not just levels. Gamma, brightness, contrast, invert, the LUT and background keying all reached the pixels undeclared — and gamma is exactly the non-linear adjustment Nature, JCB and Cell require in the legend. The caption now names each one, and says whether the settings were the same on every panel.
- 🔍 A scale bar that cannot be drawn now fails the check. A bar outside the drawable range was silently not painted while compliance reported "All calibrated ✓". There is a new failing row, a pre-flight warning, and a badge in the panel list. Bars are also no longer rounded to whole logical pixels, so their length is exact and matches between grid and freeform.
- 📦 The submission package is honest. Per-panel PNGs were cropped in the wrong coordinate system under a column width (some were blank, some included their neighbour), and any artifact that failed to build was dropped from the ZIP while the toast still said "ready". Both fixed; anything missing is now named on screen and in the package's README.
- 📄 Multi-page PDF used the un-supersampled preview canvas and declared pages roughly three times too small; it now matches the single-page export. A failure mid-export can no longer take your panel list with it.
- 🔒 Zero network requests. The app fetched a Google Fonts stylesheet on every open, and one icon pulled a font from excalidraw.com. Both are gone: FigureLab now contacts nothing at all, which is what it always claimed. A test fails the build if that changes.
- SVG export honours the printed width too, and 378 Playwright tests (up from 359) — the new ones read the exported bytes, which is what found all of this.
v3.13.0 · 24 August 2026
- 🧬 The duplication check now finds repeated regions — a lane cloned inside a blot, a patch of one micrograph reappearing in another, rotated or mirrored, within one panel or across two. This is what journal screens (Proofig, ImageTwin) actually flag; ASM's pilot found duplications in 3.9% of accepted manuscripts. Matches are shown boxed, side by side. Flat background is excluded and the report says so — a duplicate hiding in blank sky is not findable by correlation, and pretending otherwise would be worse than saying it.
- It finds candidates; it does not judge them. Repeated texture, a deliberate inset, shared background can all trigger a match. The report says exactly that, every time.
- 41 Servier Medical Art & DBCLS icons (CC-BY) — the attribution-required artwork held back from the last release until ⚖ Credits existed to honour it. Place one and the credit line writes itself, pointing at the author's own site. The library is now 210 icons.
v3.12.0 · 11 August 2026
- 82 more icons, imported from Bioicons. Full-colour scientific illustrations — GHS hazard pictograms, nucleotide bases, fluorescent beads, capsules, plasmids, lab apparatus, molecular-modelling notation, plots. The library is now 169 icons.
- CC0 and MIT only, deliberately. Those are the licences that oblige you nothing: no attribution line, no publication licence, no watermark, no per-figure fee. Share-alike icons were excluded (it can be read as reaching the figure itself), and software logos were excluded outright — a CC0 file grants copyright permission, not trademark permission.
- Illustrations are placed as drawn. FigureLab's own icons are single-colour line art you can recolour; these are artwork whose colours are the content. They carry a "full colour" flag, and the colour picker hides for them rather than flattening a drawn cell to a black silhouette.
- Every icon still carries its licence record into your session and into ⚖ Credits.
v3.11.0 · 11 August 2026
- ✨ Edit schematics with AI — and never your data. AI-generated and hand-drawn objects gain Edit in Gemini (your own tab, nothing sent) and Edit via API, plus variations and style references. Imported experimental images and grid panels are refused, loudly: journals treat AI alteration of data images as misconduct. One rule decides every entry point, and a test asserts refused paths make zero network requests.
- Export stops if the journal says no. Exporting a figure containing AI content under the Nature, Science or Cell preset shows that journal's actual position, dated with a link to verify. Continuing writes the disclosure sentence — tool, model, version, prompt — into your figure notes, where the caption generator and submission package pick it up.
- ⚖ Homogenize styles. Finds every font, text size, stroke width and line colour that has drifted across the figure and collapses each to one value in a single undoable step. This is what makes a figure look authored rather than assembled.
- ⧈ Linked insets. A magnified daughter panel that stays bound to its parent by id: adjust the parent and the inset follows, reorder panels and it still follows, and the magnification lands in the metadata CSV. A hand-made inset silently diverges the moment the parent is touched.
- 36 new icons — anatomy and clinical, study-design and workflow, and the microbiology set this tool is actually used for (phage, plaque assay, colonies, biofilm, plasmid, CRISPR). Every icon now carries a licence record, and ⚖ Credits generates the attribution paragraph for anything that needs one. FigureLab's own icons need none: no publication licence, no watermark, no per-figure fee.
- Per-panel processing history in the submission package — every operation applied to every panel, in order, as text and JSON. Honest about being unsigned.
- Deliverable presets (graphical abstract, TOC image, A0 poster, 16:9 slide), labels built from filename fields ({condition} {time}), and duplicate row / column.
v3.10.0 · 11 August 2026
- 🎨 Generate figures with your own Gemini account. Write a prompt, click Generate with your Gemini account, and FigureLab copies the prompt and opens gemini.google.com. Generate there — free on a consumer Google account — copy the image, come back and paste. It lands as a schematic object, tagged AI-generated. FigureLab sends nothing: the clipboard does the travelling, and it never sees your Google login.
- Why there's no "sign in with Google" button. Google's image API publishes no OAuth scopes; web OAuth needs a client secret a single offline HTML file cannot hold; and routing a consumer Gemini session through a third-party app breaks Google's terms — they have suspended accounts for it. Handing the prompt to your own tab is the most FigureLab can honestly do, and it is the only path that spends your free usage.
- The direct API path works again. It had been calling a retired model since 2025 and could not have succeeded. Now on the current endpoint with the Nano Banana family selectable (Flash, Flash Lite, Pro), aspect ratio and 1K/2K/4K size, cancel mid-flight, and errors that say what to do — including the one everyone hits: creating a key is free, but Google removed the free tier for image models, so generation needs billing linked.
- Disclosure got stronger. Exports now carry the exact model id and the prompt that produced each object, plus a note that Gemini output is invisibly watermarked with SynthID. The compliance check has a new AI row. Removed the "photo-realistic microscopy" style — a fabricated micrograph is fabricated data however it is labelled.
- Privacy, stated precisely. Your experimental images never leave your machine under any feature. Bridge mode transmits nothing at all. API mode sends your prompt, and says so at the button.
v3.9.5 · 11 August 2026
- ↻ Crops can be tilted. Specimens do not always sit square to the camera. Drag the round grip above the crop box to turn it, or type an angle — Shift snaps to 15°, [ and ] nudge by 1°. The region turns; the panel comes out upright. This is different from rotating a panel, which turns the whole cropped picture inside its cell.
- Tilt is per region in multi-crop. Every region still shares one size, so the panels stay uniform, but each keeps its own angle — six plates photographed at six slightly different angles all straighten independently.
- Banked regions can be edited. Multi-crop used to be forward-only: a region placed slightly wrong three back could not be reached, because Undo only removes the last one. Click any region chip to pull it back into the editor, move, tilt or rename it, then Update. × drops one outright. Leaving the name blank keeps the name it already had.
- What a tilt costs, stated plainly. Every other crop selects existing pixels. A tilted crop has to resample them, so that panel's displayed pixels are interpolated — the editor says so while you turn it, the metadata CSV has CropAngle and Resampling columns, and the deep audit names the tilted panels. Measurements are not affected: a region you measure is mapped back through the rotation and read from the original samples, never from the resampled display.
v3.9.4 · 3 August 2026
Everything in this release came from building a real spot-dilution figure and hitting the places the tool got in the way.
- ⤢ Fit panels to images — panel cells were a fixed square while a plate photo is 4:3, so every panel was drawn with white bars above and below: a quarter of each cell wasted. This reshapes the cell to your content, keeping the panel width so the figure's overall width — what a journal specifies — doesn't move. ⥒ Tighten spacing closes the gaps and margins. Multi-crop now fits the cells automatically, since every region shares one crop size.
- Row and column headers can sit right against the figure. A row header used to be centred in the left margin, so the distance to the panel was whatever the margin happened to be and you could only close it by moving the whole figure. New Gap to figure control: the number you type is the gap, on both axes.
- 👁 Show a subset of your panels. Cutting six plates into three regions gives eighteen panels for a figure that may show six — and deleting the rest throws away the expensive part. Hidden panels leave the figure but stay in the list and in your session, and the grid closes up around them. Tick and Show only ticked, or use the eye on any row. Relabelling letters only the panels a reader will see, so a subset reads A, B, C, D with no gaps.
- Group bands — the outer level of labelling a spot-dilution figure needs: “No ATC” and “+5µM ATC” spanning three rows each, with a bracket. Build them by range, in repeating blocks of N, or from the panels' own group tags; they work down rows or across columns, and the bracket can be a solid bar, a square bracket, or nothing at all.
- Fixed: the internal helpers for reading and writing controls did nothing useful on a checkbox — writing was a no-op and reading always came back true. No feature depended on it, but it was a trap waiting for the next change.
What's new in v3.9.3 · updated 1 August 2026
A findability release. Everything is where you'd look for it, and nothing is hidden from you any more.
- The sidebar is organised by what you're doing — Images → Arrange → Templates → Crop & Scale → Annotate & Draw → Look → Measure → Check → Export. Measure and Check are new sections; they used to be buried inside Export.
- ✂ All the crop tools are in one place. They were spread across five surfaces, and the two biggest — Batch Crop and Multi-Crop — sat under a heading called “Scale Tools” inside Style, hidden from anyone not in Advanced mode. Searching the command palette for “crop” now returns ten tools; it used to return one.
- Name your crops as you cut them. Cutting six plates into three regions each gives eighteen panels — they used to arrive as A…R and you had to work out afterwards which was which. Type a name for each region (Enter banks it), name the source image once, and the panels come out as “Plate 3 T7”. Naming stays optional; anything you skip still gets A, B, C.
- Multi-crop works in freeform, where it used to refuse outright. Each region becomes a placed object.
- Importing no longer forces a crop. That dialog used to open on every image and physically cut the pixels — including the 16-bit samples your measurements depend on. Images now go straight in and you crop afterwards, non-destructively. The old flow is one checkbox away in Crop & Scale.
- Annotation tools work in freeform. Arrows, boxes and text were silently dead there — the figure drew them, you just had no way to make one. They now draw, select and drag in both modes, and export as vector.
- Simple/Advanced is gone. One switch was hiding about thirty-five controls, which is exactly how Batch Crop became impossible to find. Sections collapse instead; deeper tools stay visible, grouped under a “More” rule.
- Nothing pretends to work when it can't. Tools that do nothing in the current layout mode are hidden or disabled with the reason, instead of accepting your click and ignoring it.
- One name per thing. “Presets” used to mean four different things in three sections; “Save” five; “Themes” two.
What's new in v3.9.2 · updated 1 August 2026
PDF exports now contain real text, not a picture of text.
- Live text in PDF. Your figure title, panel letters, row/column headers and scale-bar labels are written into the PDF as genuine text operators laid over the image — so they are selectable, searchable, and razor-sharp at any zoom, and a production editor asking for “text as vector / fonts embedded” is satisfied. Previously the whole page was one raster, and labels visibly softened in the proof.
- Nothing is bundled. It uses the PDF base-14 fonts (Helvetica, Times, Courier) that every reader already has, so the single-file promise is untouched — there is no font file inside the PDF and none inside FigureLab. Bold, italic and serif/monospace label fonts map to the matching face.
- It never mangles a label. Base-14 text can only encode the WinAnsi character set, so any string containing something outside it — Greek (α-tubulin), ≥, ✓, CJK — is left in the image instead of being silently substituted. µm encodes correctly and stays live text.
- Annotations you draw on the figure (arrows, boxes, free text) remain part of the image for now; use SVG if you need those as vector too.
What's new in v3.9.1 · updated 24 July 2026
A hardening release. An audit read the whole app looking for places a number could be wrong while looking authoritative — here is what it found, plus two features that came out of it.
- 🧬 Duplicate-panel self-check. Compares the pixels of every pair of panels, including rotated and mirrored reuse, and flags anything near-identical. Journals run duplication screens on submitted figures; this is your chance to catch an accidental reuse first. In Analysis, and inside the Deep Figure Audit.
- Printed width in millimetres. Journals specify figure width in mm, not pixels. Pick your target column width and the export lands at exactly that size at your chosen DPI — and FigureLab tells you the true point size your text will print at, warning you below ~5 pt.
- Scale bars on cropped freeform panels were drawn too short. Magnification used the full image width instead of the cropped width, so a panel cropped in half showed a “20 µm” bar at the length of 10 µm. Fixed, along with the Auto bar length.
- Channel merges ignored the crop. Extra channels were drawn from the full frame into the cropped panel, displacing them by up to half a field — which can show colocalisation that isn't in your data. Every channel is now cropped to the same field of view.
- Raw measurements could read pixels that aren't in your figure. A selection over a panel's blank margin, or spilling past a cropped edge, could report a confident raw value computed from pixels you had cropped away. Measurements are now clipped to what's visible, say when they were clipped, and fall back to the display reading rather than guess. Exposure analysis got the same fix.
- µm² is now withheld rather than guessed when a panel can't be mapped back to source pixels — it was previously wrong by the display scale.
- GenBank features crossing the origin are drawn as their two real arcs instead of being inflated to the whole plasmid, so an AmpR or ori spanning position 1 imports correctly.
- Duplicating a gene map or chart no longer breaks the canvas.
What's new in v3.9 · updated 24 July 2026
Two big additions: measurements that read your real pixel data, and a bp-scaled gene-map / genetic-circuit tool. Still one offline file, still nothing uploaded.
- Measure the raw data, not the picture. When you import a 16-bit or float TIFF, FigureLab now keeps the native samples alongside the 8-bit display image. ROI, line profile, cell count and exposure read those — so you get absolute intensities at the acquisition bit depth, before any brightness/contrast/gamma/LUT. Every result says which pixels produced it, and the CSV records it per row.
- True saturation, at last. Exposure analysis now reports the fraction of pixels sitting at the sensor maximum — the number that actually matters — instead of inferring clipping from the display.
- Correct areas. A raw ROI is measured in source pixels, so µm² finally uses the calibration's own coordinate space rather than on-screen pixels.
- Honest fallback. Where the mapping back to source pixels can't be exact — a rotated or flipped panel, a shaped crop, a multi-channel composite, or any image with no raw data (PNG/JPEG) — FigureLab measures the display and says so, rather than guessing.
- 🧬 Gene maps & genetic circuits. A new element draws DNA constructs scaled by base pairs, linear or circular, with SBOL Visual glyphs — promoter, RBS, CDS, terminator, operator, origin, primer, ribozyme, insulator, scar and more. Features carry strand direction, labels stagger instead of overprinting, and a bp ruler shows the scale.
- Build it however you like. Paste a feature table from a spreadsheet, add features one at a time, or drop a GenBank / FASTA file on the canvas. Set the backbone length in bp and everything scales; Rescale… multiplies every coordinate so a design keeps its proportions at a new size.
- Vector out. Gene maps export as true SVG geometry with real text — crisp at any DPI and editable in Illustrator or Inkscape, exactly like charts.
What's new in v3.8 · updated 21 July 2026
A transparency, honesty & polish release driven by a deep look at what scientists actually need — same single, offline, private file.
- Show every data point — bar and box charts can now overlay all raw replicate values as jittered dots (deterministic, so the SVG matches), exposing the n and spread a bare bar hides. Two new distribution kinds join them: violin (kernel-density) and beeswarm (dots with mean ± SD).
- Smarter significance brackets — brackets now sit just above the bars they compare (and stack when nested) instead of floating at a fixed height. Still your own typed symbol; FigureLab never computes a p-value.
- Reference / threshold lines on charts — a dashed line at a limit of detection, baseline, or cutoff you supply, drawn as vector.
- Submission-ready by default — the package now writes a Source Data CSV for every chart (with the error-metric formula noted), and a bar chart whose y-axis doesn't start at zero is flagged as visually exaggerating differences.
- Honest measurements — ROI, line-profile, cell-count and exposure results now disclose that they read the 8-bit display (after any brightness/contrast/LUT), not raw data — with a stronger note when the panel has adjustments applied.
- Full adjustments on freeform panels — gamma, black/white levels, fluorescence LUTs, grayscale and invert are now available on freeform images too (🎚 More…), matching grid mode.
- Snappier & cleaner — image adjustment sliders now preview live as you drag; the freeform render loop is faster; and chart legends auto-size to fit long labels instead of clipping.
What's new in v3.7 · updated 20 July 2026
FigureLab now makes the data figures, flowcharts and asset-rich schematics that used to send you to a separate tool — all in the same single, offline, private file. Every chart draws as true vector, so it exports crisp at any DPI and editable as SVG.
- Data charts from a CSV 📊 — drop a
.csv/.tsv or paste from Excel and get a bar, grouped/stacked bar, line, scatter (with an OLS fit), or box-and-whisker plot that sits beside your image panels. Colourblind-safe palettes (Okabe–Ito default). Error bars are SD (n−1) or SEM (SD/√n), named in the UI and the generated code. Significance brackets are the symbol you enter — FigureLab never computes a p-value.
- Heatmaps & survival curves — omics-style matrices with a mandatory colourbar and perceptually-ordered scales, and Kaplan–Meier survival curves with censoring ticks. Plotting transforms only; inference stays your own test.
- Charts export as real vector — SVG carries true
<rect>/<line>/<text> (editable in Illustrator/Inkscape), and every chart emits self-contained matplotlib & ggplot code with the error-metric formula spelled out.
- Flowcharts with real connectors — a connector line stays attached to two objects and reroutes as you move them. One-click PRISMA 2020, CONSORT and fishbone (Ishikawa) templates with editable placeholder counts.
- Group & ungroup (Ctrl+G) so a box and its label move as one, plus ~50 recolourable icons across cells, molecules, organisms & lab equipment with a search box.
- One-click themes — Grayscale-for-print, high-contrast, fluorescence-dark & poster looks, applied over your figure's chrome in a single undo step.
- Honest background removal — make a flat background transparent with a tolerance slider and eyedropper; it's a non-destructive adjustment, so the original pixels are kept and it undoes cleanly.
- Accessibility & disclosure — generate factual figure alt-text (on-device, embedded in PNG metadata); AI-generated schematics are tagged in the layer list and export metadata, and generative AI is never applied to your imported experimental images.
- Fixed: freeform figures now export at the true target DPI (they were silently capped at screen resolution).
What's new in v3.6 · updated 10 July 2026
FigureLab grew a friendly, direct-manipulation editor and finally opens the image formats scientists actually have — same single file, still 100% offline & private.
- Friendly figure editor (Freeform mode) — click to select, drag to move, resize with handles, and a rotate handle that snaps to 0/45/90°. Objects snap into alignment with magenta guides, and a floating toolbar puts duplicate, lock, layer-order & delete right next to your selection.
- Real text editing — double-click any text to edit it in place; set font family, size, bold/italic, colour and alignment per object.
- Cover patch 🩹 — the honest way to hide or replace baked-in text: drop an opaque, movable patch (with “match background”) and type new text on top. It’s an object — reversible and recorded in the session, never a hidden pixel edit.
- Paint layer 🖌 — a brush & eraser that draw on a separate overlay: your original image pixels are never modified, the layer shows in the layer list, and every stroke is recorded in the figure’s provenance. Non-destructive by design, so it can’t be used to quietly alter data.
- Science icon library — drop in recolourable vector arrows, brackets, scale bars, cell/nucleus, significance asterisks & error-bar caps; they stay crisp forever and re-export as vector.
- Relabel A, B, C… — one click renumbers panels in reading order (grid or freeform), honouring your label format.
- Starter templates — begin from a 2×2 / 3×3 grid, a before/after pair, or a freeform pathway diagram instead of a blank canvas.
- Pop out to free layout — convert a grid into freely-movable panels in one click, then drag & arrange by hand.
- Format painter — copy one object’s look (colour, fill, stroke, font) and apply it to others.
- Opens TIFF files — a built-in decoder finally opens
.tif/.tiff that browsers can’t decode: uncompressed, LZW, PackBits, Deflate & JPEG-compressed; 8/16-bit & float; grayscale, RGB, RGBA, CMYK & palette; strips or tiles; little/big-endian; and multi-page TIFFs (every page added as a panel). 16-bit is linearly scaled to 8-bit for display.
- SVG stays vector — imported SVGs keep their vector source, so they stay crisp at any size and re-export as vector in SVG output (editable in Illustrator/Inkscape).
- Scale auto-calibration — importing a TIFF with pixel-size metadata (OME-TIFF, ImageJ, Zeiss LSM, cm-resolution) sets µm/px automatically, so the scale bar is calibrated with no clicking (print-DPI is ignored; you can override).
- Save dialog — every export opens a dialog to set the file name, format & DPI first; on Chrome/Edge you pick the folder in your system’s native Save window.
- Duplicate (Ctrl+D), lock, and multi-object layer ordering for Freeform objects.
What's new in v3.5 · updated 8 July 2026
A big usability & integrity update — same single file, still 100% offline and private.
- Simple / Advanced mode — a header toggle hides advanced tools so beginners see just the core workflow. Switch back anytime.
- Start screen — a blank canvas now guides you: drop images, start from a template, load a session, or try the example figure.
- Load example figure — one click drops in a labelled, scale-barred demo so you can explore instantly.
- Command palette (Ctrl/⌘+K) — search and run any action, from export to audit.
- Export preflight — see format, final pixel dimensions, physical size, estimated file size, and integrity warnings before you export.
- Colour-vision-deficiency preview — check that your fluorescence merges stay distinguishable for colourblind readers (display only; never changes exports).
- Submission package 📦 — one ZIP with everything a journal or lab needs: PNG, TIFF, lossless PDF, SVG, session file, metadata CSV, caption, notes, R + Python scripts, reproducibility log, each panel as a separate image, and a provenance manifest.
- Editable PowerPoint (.pptx) 📊 — export each panel as a separate, movable picture with the title as an editable text box, and finish the figure in PowerPoint.
- Smart import — image cards show dimensions, aspect ratio, and a channel chip detected from the filename (DAPI, GFP, mCherry…); one click sorts panels by name or assigns colourblind-safe LUTs from those channel names.
- Split-channel row ⑃ — explode a multi-channel panel into separate single-channel panels plus a merge, in one click.
- Matched panels ⇉ — give panels a group name and sync brightness/contrast/gamma/LUT/levels across the whole comparison group, so it's processed identically (fair & integrity-safe).
- Gel/blot splice marker — drop a visible lane-divider line where blot lanes were spliced, as journals require.
- House styles — save your lab's look (fonts, labels, scale-bar style, border, background) and apply it to any figure in one click, so every figure in a paper matches.
- Editable PowerPoint export is validated to open in PowerPoint, Google Slides, and LibreOffice — no Microsoft Office needed.
- Autosave & crash recovery — a local snapshot lets you recover your work after an accidental close (toggle in Session).
- Actionable audit — the compliance check now offers one-click fixes (Set 300 DPI, Make white, Calibrate, Show labels).
- Before/after slider, layer panel (rename/hide/lock annotations), filename parser, crop copy-to-group/all + arrow-nudge, more journal presets (eLife/PLOS/EMBO/PNAS), lightweight sessions, provenance SHA-256, PWA install, and a replayable guided tour (⌘K → "Replay guided tour").
- Session library 🗂️ — keep multiple named figures (with thumbnails) and switch between them anytime, in Export → My sessions.
- Make it yours — a ⚙ Customize panel greets you by name and lets you set your theme and the animated science background (molecules & cells now drift by too).
- On-device AI caption polish 🤖 — optional; uses Chrome's built-in Gemini Nano to refine your figure legend entirely on your machine (nothing is uploaded), and falls back to the built-in caption if your browser doesn't support it.
- "?" info chips — plain-language, methods-aware help on DPI, formats, LUTs, scale bars, and adjustments.
- Lossless PDF and true-DPI PDF export, colourblind-safe default LUTs, auto-arrange, and this in-app Help & FAQ.
Tip Prefer the full toolset? Everything advanced is one click away via the Advanced toggle (top-right) or the command palette.
See the full history in the project README changelog.
Tutorials
Each tutorial builds a small demo figure and walks you through the real controls, one step at a time. When a step asks you to do something, the card waits and moves on once you have done it. Do it for me does that step for you, and Esc ends the tutorial at any point. Your own figure is replaced while a tutorial runs; Ctrl+Z brings it back.
1 · Multi-panel microscopy figure
The flagship workflow: assemble several micrographs into a tidy A/B/C grid with matching scale bars, ready for a results figure. Good when you have 3–6 related images that belong in one composite.
- Drag all your images onto the drop zone (or click to browse). Each becomes a panel.
- In the Layout section, set rows × columns to your target grid (e.g. 1 × 3 for A/B/C, or 2 × 2). Watch the mini grid map to confirm panel assignments.
- Reorder panels by dragging the ⠿ handle in the image list until A/B/C run in the right order.
- Turn on Panel labels and pick the A/B/C format, then set position, size, and colour.
- Calibrate the first panel: open its settings, click 🔬 Calibrate from image, click two known points, and enter the real distance — or choose the matching objective preset (4× – 100×).
- Enable the scale bar on that panel and click Auto SB to pick a clean length (≈ 20% of panel width).
- Space panels out: hover the seam between two panels until the blue gap divider appears, then drag it (or tap +) to set the gutter.
- Press R (or click ⟳ Render) to preview, then use ⊡ Fit to check the whole layout.
Tip Calibrate and dial in one panel, then use Apply to all to copy brightness, contrast, gamma, LUT, and B/W points to every panel at once — a fast way to keep a grid visually consistent.
2 · Fluorescence multi-channel merge
For confocal or widefield fluorescence: import separate channel images, assign colourblind-safe LUTs, tune the intensity range, and composite them into a single merged panel.
- Drop your base channel image in as a panel and open its settings.
- Assign a colourblind-safe LUT from Fluorescence LUTs — Magenta for the first channel and Green for the second read cleanly for most viewers.
- Under Black / White point, raise the black point to kill background haze and lower the white point to stretch the signal without clipping real structure.
- For dim staining, nudge the Gamma correction slider to lift mid-tones without blowing out bright puncta.
- Add the second channel with Add channel — it overlays with an independent LUT using a screen blend, so co-localised signal reads white. New channels default to colourblind-safe LUTs automatically.
- Repeat black/white-point tuning per channel until the merge is balanced.
- Calibrate with 🔬 Calibrate from image, enable the scale bar, and press R to render.
Tip Magenta + green (rather than red + green) keeps overlap visible as white and stays readable for red–green colourblind reviewers — a common journal accessibility ask.
3 · Western blot / gel panel
For blots and gels where you need clean grayscale lanes, honest contrast, and a lossless print-ready export. Use when preparing a loading-control or knockdown figure.
- Drop the scanned blot in and open its panel settings.
- Toggle Grayscale on. If your scan is white-bands-on-black, use Invert to show dark bands on a white ground.
- Trim to the lanes you need with Per-panel crop — set edge percentages or use the interactive crop editor. In the editor, 📐 Level straightens a gel by two clicks along its edge, ✨ Auto finds the angle itself, ▣ Trim borders strips a scan's margin, and a loupe shows the full-resolution pixels under the pointer while you drag.
- Adjust Brightness and Contrast only enough to make bands clear; keep it linear and even across the whole image.
- Press R to render, then label with the Text tool (molecular weights, lanes) and point at a band of interest with the Arrow tool.
- Set a file name and DPI of 300–600, then export as TIFF or PDF (lossless) for a lossless submission file.
Tip Keep adjustments uniform across the entire blot — cropping a lane out or applying local contrast can be flagged as image manipulation. Annotations are baked into the export, so finalise the crop and levels before you label.
4 · Histology / brightfield panel with annotations
For H&E, IHC, or other brightfield sections where you want to call out features, add a magnified inset, and show a calibrated scale bar.
- Drop your section image in and set brightness/contrast so the stain colours read true.
- Calibrate: click 🔬 Calibrate from image and enter a known distance, or pick the objective preset used at the scope. Enable the scale bar and click Auto SB.
- Press R to render, then draw a magnified region with the Inset tool — it magnifies the region and drops it into a panel corner automatically.
- Point at structures with the Arrow tool; hold Shift while drawing to snap to 45° increments.
- Add labels with the Text tool, or double-click the panel to type a pinned label with a readability halo over the image.
- Fine-tune anything: press Esc to enter ↖ Select mode, click an annotation, and reposition or restyle it from the floating toolbar. Use Ctrl+Z to undo.
Tip Use 📌 Panel annotations mode so arrows and insets pin to their panel — they follow the image if you later reorder panels, so callouts never drift onto the wrong section.
5 · Before/after or time-series row
For a single row that tells a story across conditions or timepoints (0 h → 24 h → 48 h, or control → treated). The key is identical adjustments on every panel plus clear headers.
- Drop all timepoint/condition images in and set the Layout to 1 × N so they form one row.
- Drag the ⠿ handles to order them left-to-right in time or treatment sequence.
- Adjust brightness, contrast, gamma, and B/W points on the first panel only.
- Click Apply to all to push those exact settings to every panel — essential so intensity differences reflect biology, not editing.
- Turn on Axis labels to add column headers (e.g. "0 h", "24 h", "48 h") and an optional row header for the condition.
- Enable a scale bar on the first panel and use Auto SB; add labels via Panel labels if the row also needs A/B/C.
- Press R to render and ⊡ Fit to review the sequence.
Tip If one panel needs its own breathing room, tick Per-gutter spacing in the Layout panel and drag just that gutter; Reset gutters restores a uniform row.
6 · Preparing a journal submission figure
The final-mile checklist: match a journal's spec, export a lossless high-resolution file, and generate the caption plus reproducibility records your methods section needs.
- Apply a Journal preset (Nature, Science, Cell, or Poster) for one-click sizing that fits the target.
- Confirm a white background and that scale bars are calibrated — any ⚠ uncalibrated warning badge on a scale bar must be resolved first.
- Set a clear file name and choose DPI of 300–600. Check the info bar below the canvas for the physical size in mm at that DPI.
- Export as TIFF (uncompressed, or LZW-compressed and lossless when you tick Compress TIFF; pixel count scaled to the true DPI) or PDF (lossless) — journals prefer these over JPEG.
- Add a short note to each image in its settings, then click ✦ Generate Caption to produce a structured A/B/C caption with scale-bar text.
- Click ⬇ CSV Metadata to export every panel's settings (µm/px, scale bar, brightness, gamma, crop, notes) for your methods and lab records.
- Export an R script (magick) or Python script (Pillow + matplotlib) so anyone can recreate the figure from the original image files.
- Press Ctrl+S to save the session JSON (images included) so you can reopen and revise the whole figure later.
Tip The reproducibility script plus the CSV metadata together document exactly how each panel was processed — pasting the key values into your methods section pre-empts the "how were images adjusted?" reviewer question.
7 · Quantifying intensity from a 16-bit image
Most figure tools measure the picture on your screen. If you import a 16-bit or 32-bit float TIFF, FigureLab keeps the camera's own numbers and measures those instead.
- Import the .tif directly — not a PNG or JPEG export of it. The import toast confirms "native samples kept for measurement".
- Pick 📐 Measure ROI or 📈 Line profile and drag over the panel.
- Read the result. A green ✓ line means the numbers came from the raw samples: you get the mean, min, max and SD in absolute intensity units, the bit depth, and the count of source pixels measured.
- Run ⚡ Exposure Analysis for the number that matters most — the percentage of pixels sitting at the sensor maximum, measured before any adjustment.
- ⬇ Export measurements writes a CSV whose Measured on column states, row by row, whether each figure came from raw samples or the 8-bit display.
When it falls back An exact mapping back to source pixels isn't always possible. If the panel is rotated or flipped, uses a circle/ellipse crop, is a multi-channel composite, or has no raw data (PNG/JPEG, JPEG-compressed TIFF, or a reloaded session), FigureLab measures the 8-bit display and says so with the usual amber warning. It never guesses a mapping.
Tip Raw samples live in memory only — they are deliberately not written into saved sessions (a 16-bit array is far too large). Reopen a session and measurements fall back to the display path, so re-import the TIFF when you need raw numbers.
8 · Drawing a gene map or genetic circuit
Construct maps, plasmid diagrams and SBOL-style circuits, scaled by base pairs and exported as true vector.
- In freeform mode, click 🧬 Linear or ⭕ Plasmid — or drop a .gb / .gbk / .fasta file straight onto the canvas to build the map from it.
- Set Backbone length (bp). Everything is positioned by base pair, so this one number sets the scale of the whole drawing.
- Edit the feature table — one line per feature: name, type, start, end, strand, separated by tabs, commas, or two spaces. Paste it straight out of a spreadsheet, or use + Add feature to build a design from scratch.
- Choose the glyph type per feature: promoter, RBS, CDS, terminator, operator, origin, primer, restriction site, ribozyme, insulator, scar, ncRNA or tag. Strand − points the glyph the other way.
- Toggle the bp ruler, labels, and strand splitting (forward above the backbone, reverse below). Pick SBOL Visual colours by feature type, or Okabe–Ito for a colourblind-safe palette.
- Use ⤢ Rescale… to multiply every coordinate at once — the design keeps its proportions at a new total length.
- Export as SVG for real vector geometry and editable text, or at 300–600 DPI for a raster figure.
What import reads GenBank import takes the LOCUS length, the circular/linear flag, and the FEATURES table (using /label, /gene or /product for names, and honouring complement() for the reverse strand). Nothing is inferred and no feature is invented — a join() is drawn as its overall span, so exon structure isn't represented. FASTA gives you a correctly sized empty backbone to annotate.
Privacy & data
Is my data uploaded anywhere?
No. FigureLab runs entirely in your browser — everything happens on your own computer and no image or setting ever leaves it. There is no server, no account, and no telemetry. You can even work fully offline (see the browser question below).
Does FigureLab work offline?
Yes, completely. The whole tool is a single HTML file and it fetches nothing from the network — no fonts, no scripts, no stylesheets, no icons. Opening it contacts no server at all, so nothing about you or your images is disclosed to anyone, online or off. The interface uses whichever of its preferred faces you happen to have installed and falls back to your system fonts otherwise; the figure itself is unaffected either way.
Tip To guarantee an offline copy, just save figure_lab.html locally and open it directly.
Which browsers work best?
Chrome and Firefox are recommended and give the most reliable canvas rendering and export behaviour. Other Chromium-based browsers generally work too, but if you hit an export or clipboard quirk, try Chrome first.
Is it free? Is it open source?
Yes — FigureLab is free and open source under the MIT licence. You may use, modify, and redistribute it, including for commercial and academic work.
Images & formats
What image formats can I import?
Drag any common raster image the browser can decode onto the drop zone (or click to browse) — microscopy exports, western blots, histology, gels, or clinical photos. FigureLab automatically reads µm/px scale calibration from OME-TIFF, ImageJ, Zeiss LSM and cm-resolution TIFF metadata on import, so a calibrated scale bar is ready with no clicking (you can always override it).
What can I export, and which format should I use?
Pick the format that matches where the figure is going:
- PNG — lossless raster with true DPI embedded; a safe default for most submissions.
- TIFF — RGB scaled to your target DPI, uncompressed or LZW-compressed (lossless; PLOS asks for LZW); preferred by most journals.
- PDF / PDF (lossless) — embedded raster at the correct physical page size; use lossless for line art and blots.
- SVG — background raster plus your annotations as native vector elements (labels and scale bars stay razor-sharp).
- JPEG — smallest file, but lossy; fine for drafts and slides, not for line art.
- WebP — a good size/quality balance for the web.
How do I make a multi-channel fluorescence merge?
Open a panel's settings and use Add channel to layer extra images, each with its own fluorescence LUT (Fire, Green, Cyan, Magenta, Yellow, Blue); the channels are combined with a screen blend. New channels default to a colourblind-safe magenta / green pairing rather than red / green, so overlap reads white and the merge stays readable for viewers with red-green colour vision deficiency.
My fluorescence image is too dim to see — what should I adjust?
Use the per-panel Gamma slider for nonlinear brightening that lifts dim signal without blowing out bright areas, and set the Black / White point to clip and stretch the useful intensity range. Brightness and Contrast are also available with live preview. Use Apply to all to copy these settings to every panel for consistency.
Scale bars & calibration
Why does my scale bar say "uncalibrated" (⚠)?
The warning badge appears whenever a panel's µm/px ratio has not been set, so FigureLab cannot know the real-world length of the bar. Calibrate the panel and the badge disappears.
How do I calibrate a panel?
Two ways:
- Two-point calibration — click 🔬 Calibrate from image in the panel settings, click two points a known distance apart (e.g. a stage micrometer), and enter the real distance. FigureLab computes µm/px automatically.
- Objective preset — pick your objective (4×–100×) to apply an approximate µm/px value.
Tip Once calibrated, press Auto SB to snap the bar to a clean length (about 20% of the panel width).
Can I match the physical scale across several panels?
Yes. After calibrating, use the scale-matching option so panels imaged at the same magnification share one consistent µm/px, keeping bar lengths comparable across the figure.
Measurement & quantification
Do measurements read my real pixel values, or what's on screen?
Both are possible, and every result tells you which one you got. Import a 16-bit or 32-bit float TIFF and FigureLab keeps the camera's native samples in memory alongside the 8-bit display image; ROI, line profile, cell count and exposure then read those, reporting absolute intensity at the acquisition bit depth with a green ✓ note. For everything else — PNG and JPEG imports, JPEG-compressed TIFFs, 8-bit TIFFs, or a reloaded session — measurements read the rendered 8-bit canvas after any brightness/contrast/gamma/LUT, and carry the amber warning saying so.
The mapping has to be exact Reading raw values means mapping a point on the figure back to a source pixel. Where that can't be done exactly — a rotated or flipped panel, a circle/ellipse crop, or a multi-channel composite — FigureLab deliberately falls back to the disclosed display measurement instead of risking a wrong correspondence.
Why does exposure analysis report two different saturation numbers?
Because they mean different things. Display clipping counts pixels that ended up at 255 on the rendered canvas — which can happen purely because you raised the brightness. Raw saturation counts pixels sitting at the sensor's own maximum, measured before any adjustment; that is the number that tells you whether the acquisition itself was blown out. The raw line only appears for panels that kept their native samples.
Should I use FigureLab instead of ImageJ/FIJI for analysis?
No. FigureLab is a figure-assembly tool that measures honestly, not an image-analysis package. Its ROI statistics and threshold-based counting are simple, documented operations useful for sanity checks and for reporting values in a figure. Segmentation, tracking, deconvolution, colocalisation and any real quantitative pipeline belong in FIJI, CellProfiler or napari — and FigureLab says so in the result panel rather than implying otherwise.
Gene maps & genetic circuits
How does the bp scale work?
Every feature is positioned by its base-pair coordinates against the backbone length, so that single number sets the scale of the whole drawing. Change the length and features stay at their bp positions while the drawing rescales; resize the element and the bp-per-pixel readout in the properties bar updates. To scale a design rather than the drawing, use ⤢ Rescale…, which multiplies every coordinate so the construct keeps its proportions at a new total size.
What does GenBank import actually read?
The LOCUS length, the circular/linear flag, and the FEATURES table — feature keys mapped onto SBOL glyphs, /label, /gene or /product used for names, and complement() honoured as the reverse strand. The sequence itself is ignored, the record-wide source feature is skipped, and a join() is drawn as its overall span, so spliced exon structure is not represented. Nothing is inferred: the map shows what the file declares and no more. FASTA gives a correctly sized empty backbone for you to annotate.
Are gene maps vector in the export?
Yes. Like charts, a gene map's geometry is written once and replayed into either the canvas or an SVG backend, so Export SVG gives you real <polyline>/<rect> glyphs and live <text> labels you can restyle in Illustrator or Inkscape. Raster exports redraw the map at the target DPI rather than upscaling a preview, so it stays crisp at 600 dpi.
Export & print quality
What DPI should I use for journal submission?
Use 300 DPI for photographic / greyscale images and 600–1200 DPI for line art and combination figures (charts, blots with sharp text). The DPI selector offers 72 / 150 / 300 / 600 / 1200. FigureLab re-renders the figure at the true target-DPI pixel count (supersampled), so text, lines, and scale bars stay crisp — it is not merely tagging the DPI.
Tip The export health check warns you if you try to export below 300 DPI.
What is the difference between PDF and PDF (lossless)?
The standard PDF embeds the figure as a JPEG-compressed raster — small, but lossy, which can add ringing artefacts around sharp edges. A lossless PDF uses Flate (non-lossy) compression instead. Prefer lossless for line art, western blots, and sharp text, where JPEG artefacts are visible and some journals reject JPEG-in-PDF for line art. For photographic panels the standard PDF is usually fine.
My exported PNG opens at the wrong size or DPI in Photoshop / ImageJ — why?
This is fixed. FigureLab now writes a standard pHYs resolution chunk into the PNG, which is what Photoshop, GIMP, and ImageJ/FIJI actually read for physical resolution. Older versions embedded the DPI only as a text field, so editors reported the browser default (72 DPI) at a giant pixel size. Re-export and the true DPI will be reported correctly.
The figure looks blurry when zoomed or after export — what do I do?
Export at a higher DPI (300–600, or 1200 for line art): raster exports are re-rendered at the real pixel count, not upscaled, so more DPI gives text, lines and scale bars genuinely more detail. An image panel cannot print more detail than its source pixels, though: a 512 px field stretched across a column is enlarged at any DPI. Each image-list row shows the ppi a panel actually prints at, and the Save dialog and the compliance check name any panel below 300 ppi. On screen, FigureLab keeps a separate high-resolution preview layer matched to your display (HiDPI/Retina) so labels and annotations stay sharp when you zoom in — the underlying measurement buffer is left untouched so quantification stays exact.
Tip Very large renders are capped at about 60 megapixels to stay within browser memory; if you hit the cap, a toast tells you and the export is scaled down rather than crashing.
How do I get a clean white background for print?
For journal submission, use TIFF at 300–600 DPI with a white background. You can also press Ctrl + P for a print-ready view that hides all the app chrome.
Saving & reproducibility
Do my images get saved in the session JSON?
Yes — the session file embeds your image pixel data along with the layout, per-panel settings, annotations, and figure notes, so loading it restores the entire figure with no re-dropping. Everything still stays on your computer; the JSON is just a local file you save yourself. (Sessions saved by very old versions, before pixel data was embedded, will prompt you to re-drop those images.)
How do I save and reload a figure?
Save the whole figure as a JSON file with Ctrl + S (or the Save button), and load it later to restore the grid, adjustments, annotations, and images. The Figure notes scratchpad in the Export panel is also stored in the session — handy for antibody dilutions or reviewer comments.
Can I reproduce a figure programmatically?
Yes. Export an R script (using magick) or a Python script (using Pillow + matplotlib) that recreates the figure from your original image files. You can also export CSV metadata listing every panel's name, label, µm/px, scale bar, brightness, gamma, crop, and caption — useful for methods sections and lab records.
Can FigureLab write my figure caption?
Add a short note to each image in its settings, then click ✦ Generate Caption to assemble a structured, journal-style caption with panel letters and scale-bar lengths — e.g. "Figure. (A) Control cells. Scale bar, 10µm. (B) Treated cells. Scale bar, 10µm." Edit the result to taste.
What is the "on-device AI" caption polish, and is it private?
Optional. After generating a caption you can click 🤖 Polish with on-device AI to have it rewritten more fluently by Chrome's built-in Gemini Nano model. It runs entirely on your own machine — no server, no API key, and nothing is uploaded, so it keeps FigureLab's privacy promise. If your browser doesn't support the built-in model, FigureLab just keeps the standard rule-based caption. It needs a recent Chrome (138+) with built-in AI; the model downloads once and then works offline.
Tip The AI only rewrites wording — it's instructed never to invent results and to keep your panel letters and scale-bar values exactly. Always read the output before using it.
Troubleshooting
My annotations moved or look wrong after I changed the layout.
Annotations are baked into the exported figure, so finalise your grid and panel order before annotating. To keep an annotation tied to a specific panel, draw it in 📌 panel mode — it will follow that panel if you reorder. Full Undo / Redo (Ctrl+Z / Ctrl+Y) covers layout, per-panel adjustments, and annotations, one step per edit.
A panel won't drag to reorder.
It is probably locked. Locked panels cannot be dragged (this prevents accidental reordering). Unlock the panel, then drag the ⠿ handle in the image list to move it.
How should I cite FigureLab?
FigureLab is archived on Zenodo with a citable DOI. Use the concept DOI — it always resolves to the latest version:
Awuah, M. B. (2026). FigureLab: a browser-based tool for assembling publication-quality scientific figures. Zenodo. https://doi.org/10.5281/zenodo.21269456
To cite the exact version you used, use its version DOI instead — e.g. v3.13.0 = 10.5281/zenodo.22084181. The repository also ships a CITATION.cff, so GitHub shows a "Cite this repository" button with ready-made APA & BibTeX metadata.