Combine multiple photos into a single labeled figure for manuscripts, posters, and presentations.
Figora is a desktop app for arranging photos, micrographs, or other panel images into a single publication-ready grid figure — with panel labels (A, B, C…), consistent spacing and sizing, an optional scale bar, and export to PNG, TIFF, JPEG, or PDF at a controlled DPI.
- Download
- Features
- Requirements
- Install & Run from Source
- Quick Start
- Keyboard Shortcuts
- Saving & Loading Projects
- Building the Standalone Executables
- Contributing
- License
- Author
Pre-built, standalone versions of Figora — no Python installation required — are published on the Releases page.
| Platform | Download |
|---|---|
| 🪟 Windows (x64) | figora-windows-x64.exe |
| 🍎 macOS (Intel) | figora-macos-x64.zip |
| 🍎 macOS (Apple Silicon) | figora-macos-arm64.zip |
| 🐧 Linux (x64) | figora-linux-x64 |
These links always resolve to the latest release once one is published. Figora bundles its own Python runtime, so nothing else needs to be installed.
First run:
- Windows — SmartScreen may warn the app is unrecognized (it isn't code-signed). Click More info → Run anyway.
- macOS — Unzip, then right-click (Control-click)
Figora.appand choose Open the first time, since the app isn't notarized. If macOS still blocks it, allow it under System Settings → Privacy & Security. - Linux — Make it executable first:
chmod +x figora-linux-x64 && ./figora-linux-x64
- Flexible grid layout — set rows/columns manually or auto-fit rows to your photo count; fill the grid by row or by column
- Live, accurate, zoomable preview — what you see is what gets saved; pan by click-drag, zoom with the scroll wheel/+−/slider up to 300%, or double-click to fit
- Panel labels — A/B/C, a/b/c, 1/2/3, or your own custom text, in four formats (
A,A.,(A),A)) and five positions (above the panel, or any inside corner) - Robust font handling — pick a common family or browse for any
.ttf/.otffile; falls back to a real scalable system font even if your exact choice isn't installed, so label size always works - Panel borders, grayscale conversion, and auto-contrast adjustment
- Figure-wide caption/title, above or below the whole grid
- Calibrated scale bar — give a length in source-photo pixels and Figora scales it correctly for each panel's individual resize factor
- Background color or transparency (PNG)
- Export to PNG, TIFF (LZW-compressed), JPEG, or PDF, with DPI control and optional resizing to an exact output width
- Project save/load (
.json) to save and resume a layout later - Reorder, remove, or add photos anytime, with live thumbnails; labels always follow list order
Only needed if running from source — the standalone downloads above need nothing installed.
- Python 3.9+
tkinter(bundled with the standard Windows/macOS Python installers; see below for Linux)- customtkinter and Pillow — see
requirements.txt
git clone https://github.com/asmpro7/figora.git
cd figora
pip install -r requirements.txt
python figora.pytkinter ships with Python on Windows and macOS. On Linux, if you get ModuleNotFoundError: No module named 'tkinter', install it separately:
sudo apt install python3-tk # Debian/Ubuntu
sudo dnf install python3-tkinter # Fedora- Add Photos — click Add Photos (or the button in the empty preview) and select your images.
- Arrange the grid — expand Grid & Spacing to set columns (rows auto-fit by default), spacing, margin, panel size, and fill order (by row or by column).
- Label the panels — expand Panel Labels to choose a style, format, position, and font.
- Polish it — optionally add a border, convert to grayscale, add a figure caption, or a calibrated scale bar.
- Export — pick a format (PNG by default) and DPI under Output, then Save Figure. The confirmation dialog can open the file or its folder directly.
Reorder photos anytime with the ↑ / ↓ buttons in the photo list — panel labels always follow that order, regardless of grid fill direction.
| Shortcut | Action |
|---|---|
Ctrl+O |
Add photos |
Ctrl+S |
Save figure |
Ctrl+= / Ctrl+- |
Zoom preview in / out |
Ctrl+0 |
Reset preview zoom to 100% |
| Double-click preview | Zoom to fit |
Under Project, Save Project… writes a .json file with your full layout (photo file paths and every setting). Load Project… restores it later — useful for a figure you'll revisit, or as a starting template for a similar one. Photos are referenced by file path, so keep the originals in place; Figora will list any it can't find when loading.
The downloads above are built with PyInstaller. PyInstaller doesn't cross-compile — build on each target OS separately (a Windows .exe must be built on Windows, a macOS app on macOS, and so on). A CI matrix (e.g. GitHub Actions with windows-latest, macos-13 for Intel, macos-14 for Apple Silicon, and ubuntu-latest runners) is the usual way to produce all four from one commit.
pip install pyinstaller
pip install -r requirements.txtcustomtkinter ships its theme and font files as package data, which PyInstaller doesn't pick up automatically — --collect-all customtkinter is required, or the built app will fail on startup looking for its theme file.
Windows:
pyinstaller --noconfirm --onefile --windowed --name figora-windows-x64 --collect-all customtkinter figora.pyProduces dist\figora-windows-x64.exe.
macOS (run once on an Intel Mac, once on Apple Silicon):
pyinstaller --noconfirm --onefile --windowed --name Figora --collect-all customtkinter figora.pyProduces dist/Figora.app.
Linux:
pyinstaller --noconfirm --onefile --windowed --name figora-linux-x64 --collect-all customtkinter figora.pyProduces dist/figora-linux-x64.
Issues and pull requests are welcome. For larger changes, please open an issue first to discuss what you'd like to change.
This project is licensed under the GNU General Public License v3.0 (GPL-3.0).
You are free to use, study, modify, and distribute this software under the terms of the GPL-3.0 license. Any derivative work or redistribution must also be licensed under GPL-3.0 and include the corresponding source code as required by the license.
For the full license text, see the LICENSE file in this repository or visit the GNU GPL v3.0 license page.
Ahmed Abdelmageed
- GitHub: @asmpro7
- ORCID: 0009-0002-7902-690X
- LinkedIn: asmpro
- Email: AhmedElSaeedMassad@gmail.com
