Open Source · Offline · Browser-native

OfflineGram Composer

Compose Instagram-style square posts in your browser — fully offline, no accounts, no cloud, no Electron.

Now on the roadmap

Three phases for what comes next

The next stretch focuses on hardening today's workflow first, then making presets reusable, and finally packaging the app for smoother high-volume batch work.

Read the full roadmap →
Phase 1 Highest priority

Stabilize the shipped core

Tighten validation, clarify preset behavior, persist lightweight session state, and deepen test coverage around the current compose and batch flows.

Phase 2 High priority

Make presets and exports first-class

Add preset editing, richer typography controls, export profiles, and structured import options so more of the workflow is reusable from the UI.

Phase 3 Medium priority

Package and polish batch use

Improve cross-platform file picking, batch progress and retry handling, startup diagnostics, and the install/run experience for larger real-world jobs.

OfflineGram Composer interface — wide layout

What it does

🖼️

Drop an image

Drag-and-drop or use the native Windows picker to load JPEG, PNG, WebP, or BMP files.

✏️

Type your text

Enter overlay text in one place. Multi-line, uppercase, or mixed — handled automatically.

🎨

Pick a preset

One click applies a full style — fonts, colors, shadow, outline, position, opacity.

👁️

Live preview

See the composited square canvas instantly before you commit to export.

💾

Export PNG

Save to any local folder. No watermarks, no compression, no upload.

🗂️

Batch mode

Pair one image folder with either a quote list or a structured preset-driven text file and export the whole run in one pass.

🔒

100% offline

Nothing leaves your machine. No telemetry, no login, no internet required.

OfflineGram Composer — full interface view

Quick start

Requires Python 3.11 (recommended) or 3.9+. Any modern browser.

Clone or download the repo

git clone https://github.com/09ashishkapoor/offlinegram-composer.git

Run setup

Double-click setup.bat — creates a virtual environment and installs all dependencies.

Launch the app

Double-click launch.bat, then open http://127.0.0.1:8000 in your browser.

Compose and export

Drop an image, type your text, choose a preset, preview, and click Export PNG. On Windows, Choose buttons open native file/folder dialogs.

If native dialogs are unavailable in the current runtime, the app falls back to its built-in browser picker.

Batch mode

Use Quotes to images when you want to process a whole folder with one preset and either a simple quote list or a structured preset-driven text file.

Choose an image folder

Select the source folder that contains the images you want to process in order.

Add a quotes file

Upload or choose a UTF-8 text file. The exact format depends on the preset selected from the root preset config.

Pick the preset from the root config

Batch behavior is driven by presets.json in the project root. Use those preset definitions as-is, or edit that file to change layout and field mapping.

Preview sample pairings

Render the first few image and quote pairs before exporting the full batch.

Export the batch

Choose an output folder and save every rendered PNG in one operation.

Single-zone presets expect one quote per non-empty line. Structured presets activate when the selected root preset exposes text zones such as number, name, caption, title, or subtitle.

Structured batch files

Important: preset configs live in presets.json in the project root, next to app.py. That root file is the source of truth for preset layout and batch field mapping.

The built-in preset_3 is the shipped example for structured batch rendering. Each non-empty line fills the number, name, and caption zones using the format 1. Name: Caption.

1. Shhmashhana kalika: The dark-bodied Goddess of the cremation ground, the power of death and dissolution.
2. Kali: The Black Goddess, ruler of Time.
3. Bhadra kali: The all-auspicious Dark Mother.

The repository includes sample_file_Preset3.txt in the root folder as a longer example. Structured batch export also requires the image count and structured-entry count to match exactly.

OfflineGram Composer batch mode for quotes to images
OfflineGram Composer batch mode using preset 3 structured text

Stack

LayerLibrary
BackendFastAPI + Uvicorn
Image renderingskia-python
Image loadingPillow
FrontendVanilla HTML / CSS / JS
Testspytest + FastAPI TestClient

Structured batch presets

Shipped

Multi-zone batch text files

Structured batch files are now supported. Use preset_3 or your own root-level preset definitions in presets.json to map one line of input into multiple zones such as number, name, caption, title, or subtitle.