Skip to content
Report designer

Show it. Build it. Ship it.

Upload a report design — a photo, a PDF, or an existing .repx. Forma reads its geometry and returns a written specification, a live in-browser mockup, and valid DevExpress XML you can open in the designer. Three artifacts, one request.

See how it reads a page

Bring your own Gemini key — Forma ships with none, and keeps yours in this tab unless you ask it to save an encrypted copy.

invoice-scan.pdf
0
artifacts per request
0export formats
PDF, Excel, CSV, Word, RTF, HTML and a picture
0pages / PDF
read and text-extracted per file
0
API keys Forma holds
Output

One request comes back as three finished things.

Not a chat answer you have to interpret. The model writes the report file and nothing else; Forma reads the mockup and the specification out of that file, so all three describe the report you download, and none of your tokens go on writing it twice.

request
analyzeReportDesign()
attachments
2 images · 1 text layer
answer
the .repx, as raw XML
temperature
0

Written specification

A component inventory, band by band — every element, its coordinates, its font, the fields it prints, the totals and the grouping. Read out of the .repx itself, so it cannot describe a different report from the one you download.

markdown

Live layout mockup

The report’s bands drawn in the browser at true proportions, on a sheet that stays white in both light and dark themes — because a report does. Drawn from the .repx, so what you check on screen is the file, not an approximation of it.

bands

DevExpress XML

Real XtraReportsLayoutSerializer markup, syntax-coloured with line numbers and a copy action. A parse check runs before you ever download it, so a malformed generation shows up here — not when the designer refuses the file.

.repx
Scope

Built for the documents you already have.

Most reporting work starts from something that already exists — a printed form, a PDF a client sent, a report someone built years ago. Forma starts there too. And when it is not one document but a folder of them, the Batch panel takes the whole set and gives back one .repx per file.

Invoices and statements

Header block, addressed party, a line-item grid with totals underneath, payment terms in the footer. The shape Forma handles best.

Purchase orders and packing slips

Multi-column grids with merged headers, quantity and unit columns, and boxed totals — the widest layouts Forma is asked for.

Payslips and remittance advice

Dense two-column arithmetic with right-aligned figures and rule-separated bands. Alignment and per-side borders are carried through.

Certificates and letters

Centred typography, a signature block, a stamp or a seal — each one located as its own element rather than flattened into the background.

Legacy paper forms

A scan or a phone photo of a form nobody has the source for. Forma reads its words with OCR in your browser and its layout from the picture, and gives you a designer file to start from.

Redesigning an existing .repx

Upload the report file itself. It is parsed and validated as XML in the browser, then handed over as exact text — so refinements edit what is there.

Workflow

Three steps, and the middle one is the only one you wait for.

01 — SHOW IT

Give it something to read

Drag in a screenshot, a scan, a multi-page PDF, or a .repx you already have. Images are downscaled and re-encoded, and their words read by OCR, in your browser; a .repx is parsed and validated as XML there first.

  • Pictures, PDF, .repx and data files, several at once
  • Multi-page PDFs read and text-extracted, up to 8 pages
  • Every file you add is confirmed on screen before it is sent
PNG
PDF
REPX
3 files staged
02 — BUILD IT

Let it work

While Forma works the reply shows three dots, every step behind the scenes, and Stop aborts the request in flight. With a report open, the chat edits it in place rather than starting again.

  • Three dots and Stop, as in the chat apps you know
  • Edits made in place, each listed, with Undo and Redo
  • Plain chat stays chat — asking a question does not build a report
working · Stop aborts the request
03 — SHIP IT

Take the file

Download the .repx, named after the report title, and open it in the DevExpress designer. Or print it from the Preview, which pages it as DevExpress does.

  • Parsed and checked in the viewer before you download
  • Exported from the Preview as PDF, Excel, CSV, Word, RTF, HTML or a picture
  • Saved as you work, to your account or on this device
Invoice_2026_0431.repx
Accuracy

It reads the file. Not a picture of the file.

A digital PDF already contains every string and its exact position. Rasterising it and asking a model to read the text back out of pixels throws that away — and the coordinates come back approximate.

Forma reads each page twice, for two different purposes. It renders the page as an image for visual structure — borders, fills, logos — and it extracts the page's own text layer, converting every position from PDF points into the report grid before anything is sent. The prompt ranks the extracted text above the image for content and position. A scan or a photo has no text layer, so its words are read by OCR in your browser instead.

612 × 792 pt  →  × 100 / 72  →  850 × 1100 report units
ytop = pageHeight − (baseline + height)

A scanned PDF has no text layer. Its words are read by OCR in your browser instead, so expect the odd misread string where a digital PDF would have been exact.

read from pixelsread from the file
INVOICE~40, ~44
Bill To~40, ~228
Acme Industrial~41, ~252
Subtotal~566, ~772
$ 4,180.00~648, ~800
INVOICE40, 45
Bill To40, 225
Acme Industrial40, 250
Subtotal570, 770
$ 4,180.00652, 798
Same page, same model. The difference is what it was given to work from.
Precision

Accurate down to the hundredth of an inch.

These are the details Forma carries through from your design into the XML, so the report opens in the designer ready to work with.

coordinate grid
100 units = 1 in

LocationFloat and SizeF in the report’s unit: hundredths of an inch unless a report you bring says otherwise, the unit DevExpress stores.

page
850 × 1100

Letter, A4, Legal or Tabloid, portrait or landscape: worked out from your page, your words or your region, and written as the paper DevExpress prints on.

tables
real rows

An XRTable with populated rows and cells, weighted relatively — not a grid faked out of loose labels.

borders
4 sides, separately

Top, right, bottom and left carried individually, with their colour — a single underline stays a single underline.

type
family · weight

Bold, italic, font family and size, horizontal and vertical alignment, and whether text wraps.

pictures
located, not guessed

Each logo is located in your upload and cut out of it for the mockup, and placed and sized as a picture box in the .repx, ready for you to point at the image in the designer.

users/{uid}/vault/geminiKey
your key, in the browser
AIzaSyD7k2Qx9LmV4pR8tN3bW6eH1oU5cZ0jY
PBKDF2-SHA256 · 310,000 iterations
what Forma stores
—
AES-GCM ciphertext with its salt, IV and iteration count. Nothing that can decrypt it.
what the operator can read
nothing
The passphrase never leaves your browser.
Your key

Forma ships with no API key, and cannot be given one.

You supply your own Gemini key and your browser calls Google directly with it. It never touches Forma's server — there is no generation endpoint there to touch. No shared quota, no waiting behind anyone else, no per-user cost to whoever runs it.

The working copy lives in sessionStorage, which the browser erases when the tab closes. If you want it on more than one machine, it is encrypted in your browser under a passphrase you choose, and only the ciphertext is uploaded.

Only you can decrypt it. There is deliberately no reset path, because a reset would mean whoever runs Forma could read your key. Keep your passphrase somewhere safe and the key stays yours alone.
Forma
Ready when you are

Let's build something precise.

Bring a design and your own Gemini key. Once the key is in, there is nothing else to set and nothing to pay for.

Read the documentation