Skip to content
Capability

Everything it does, and where it stops.

A page of capabilities is easy to write and hard to trust. So everything below is read out of the code that actually runs — and where Forma stops short, it says so in the same table where it says what it does, not in a footnote at the bottom.

See what it carries over
0kinds of file
pictures, PDF, .repx and seven data formats
0pages / PDF
rendered and text-extracted
0artifacts
the .repx, and the spec and mockup read off it
0
plaintext copies of your key on any server
Intake

Hand it what you already have.

Nothing needs converting first. Files are prepared in your browser — resized, rendered, parsed — and anything that cannot be used says so on screen instead of failing quietly.

Screenshots, photos and scans

PNG · JPG

Resized and re-encoded in your browser before anything is sent, so a phone photo of a printed form uploads as fast as a screenshot. Its words are read by OCR in your browser too, and go with the picture as exact text.

Multi-page documents

PDF

Up to 8 pages, each rendered at print resolution and text-extracted in the same pass. Anything past that is reported on screen rather than quietly dropped.

Reports you already have

.repx

Read as text, then parsed and validated as XML in your browser before a request is spent. It goes up as exact markup, so a refinement edits what is actually there.

Several files at once

several

Drag them in or pick them — both routes run the same intake. Text recovered from your files is ordered ahead of the page images so exact strings are in context first.

The data it will print

CSV · XLSX · JSON

A CSV, TSV, JSON, text, SQL, Excel or Word file is read in your browser for its columns and first rows, so the report is bound to the fields you actually have.

Your SQL Server database

SQL Server

Its layout, from a read-only script you run in SSMS, and a few sample rows if you like; on your own PC its companion reads them straight from the database. Forma in the browser never connects to your server: the report reads your database by connection name, as your application’s config knows it, never with a password.

Every page is read twice, for two different reasons.

A digital PDF already knows every string and exactly where it sits. Forma renders the page as an image and pulls its text layer, converting each position out of PDF points into the report's own grid before anything is sent. The prompt then ranks that extracted text above the image for content and position, and leaves the image authoritative for borders, fills and logos.

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

Rendered at print resolution on a white ground. Authoritative for borders, fills, logos and visual structure.

the page as text

Every string with its exact position, converted into the report’s unit. Authoritative for content.

no text layer found

A scan or a photo is read by OCR in your browser (English, and Arabic, Urdu, Hindi, French, German or Spanish when the page is in one), and its words go with the image.

Every file you add is confirmed on screen — anything unsupported or too large is named, not silently skipped

Setup

Nothing to set before it builds.

What used to be a dialog of settings is worked out from what you bring, and anything else is a sentence in the chat. Settings shows what was worked out for the last request, and why.

DevExpress version

read from your report · 23.2 if there is none

The version a .repx you bring declares, otherwise the version of the last one you brought, otherwise 23.2. The tag is a label rather than a gate: a report targeting a newer release still opens, and the designer rewrites the version when it saves.

Report unit

hundredths of an inch · tenths of a millimetre · pixels

Read from a .repx you bring, or the last one, else DevExpress’s own default, hundredths of an inch. Every coordinate in the file, and every conversion behind the preview, goes through it.

Paper

Letter · A4 · Legal · Tabloid, portrait or landscape

From the page you attach, then your words (“on A4, landscape”), then your region: Letter in the Americas and the Philippines, A4 elsewhere. Written as the paper DevExpress prints on.

Direction

left to right · right to left

Right to left when the text you bring reads that way, written into the report so it prints that way.

Data

fields · a SQL Server query · a stored procedure

The fields from a data file you attach or the columns your words name. With your SQL Server database’s layout shared, the table, view or procedure the AI chose, every name checked against the layout and written as DevExpress’s own data source.

The model is found for you, and still yours to change. Google retires models "for new users", so a hard-coded id is a time bomb — an existing project keeps working while every freshly created key gets a 404. Forma probes the models your key can actually reach, once per session, and uses the best one that answers. The box offers Fast and Balanced beside Auto, and Settings → AI swaps Gemini for a local AI or OpenRouter’s free models.
Fidelity

What survives the trip.

The AI writes the .repx, and the mockup and the spec are read off it, so the three always agree; the Preview prints the same file as DevExpress would. This is what the file carries, and where the mockup draws less than the file holds.

PropertyIn the mockupIn the .repx
Text and its position

Content, x and y, width and height, in the report’s own unit (hundredths of an inch unless the report says otherwise).

drawn
XRLabel
Type

Font family, size and weight, with bold and italic carried as their own flags rather than baked into a name.

drawn
Font
Alignment and wrapping

Horizontal and vertical alignment, and whether a cell wraps its text or clips it.

drawn
TextAlignment
Borders

Each of the four sides separately, with its colour — so a single underline stays a single underline.

drawn
Borders
Tables

One table with real rows and cells, weighted relatively the way XRTableCell does — not a grid faked out of loose labels.

real rows
XRTable
Pictures and logos

Each one located in your upload and cut out of it for the mockup. In the .repx it is a picture box placed and sized where the logo was, for you to point at the image in the designer: the image itself is not written into the file.

cropped
placed, empty
Barcodes

A decorative stand-in on screen — positioned and sized, with its content left undrawn — and a real XRBarCode carrying its symbology in the file.

placeholder
XRBarCode
Charts

A real XRChart, with a series bound to the fields the axes name rather than a picture built from labels and rectangles — bar, column, line, area, scatter and pie. The mockup draws it stylised from its type and values, because there is no charting library behind the mockup; the file carries the control.

stylised
XRChart
Gauges and sparklines

A dial or a trend line in the source becomes a real XRGauge or XRSparkline, with its value, range and target carried through. On screen it stays a positioned placeholder — the mockup draws no needle.

placeholder
XRGauge
Check boxes

A tick box, checked or not, or bound to a yes-or-no field.

drawn
XRCheckBox
Panels

A box that holds other controls and moves them as one. The mockup draws what is inside it.

contents
XRPanel
Shapes and cross-band lines

Rectangles, ellipses and lines, and the lines and boxes DevExpress draws from one band to another, as on a form with a border round the whole page.

Preview
XRShape
Cross-tabs

A pivot of rows against columns, written with the layout DevExpress generates for it. The Preview draws its grid over test data.

labelled box
XRCrossTab
Subreports and a table of contents

Kept from a report you bring: Forma does not invent a subreport. A table of contents is built from the report’s bookmarks.

labelled box
XRSubreport
A SQL Server data source

Its queries, joins, parameters, lookup lists and master-detail bands, by connection name, as DevExpress writes them; the Preview prints your sample rows typed as SQL Server hands them over, and the Data tab checks the report against a newer export of your database.

Preview
SqlDataSource
100 units = 1 inchDevExpress’s own default grid; a report in millimetres or pixels keeps its unit, and every conversion goes through one place
Control

The run stays out of your way.

A generation takes real time. The chat shows that Forma is working and how to stop it, and keeps every step behind the scenes.

Three dots, and Stop

While Forma works the reply shows three dots, and the send button becomes Stop, which aborts the request in flight rather than hiding a loader. Every step happens behind the scenes, as in the chat apps you know.

A queue while it works

What you type meanwhile waits in a queue over the box. Steer sends one now and changes course; Stop pauses the queue until you resume it.

Say what is wrong, not what to build

It is a conversation, not a one-shot generator. Point at the part that came out wrong — "the totals block should sit under the table" — and ask again. Most reports take two or three passes, and each one starts from the last.

Edits in place, not a regenerate

With a report open, the chat reads its outline and answers a question, edits the file in place (a move, a font, a colour, a border, a number format, a binding, a page number, a table’s row or column), or asks before a redesign for what an edit cannot reach. Each reply lists what changed, with Undo and Redo.

It recovers on its own

Google retires models and runs out of capacity. If the model you were using disappears, Forma re-detects and retries once. If Google is briefly overloaded, it waits and tries the same model again. You see a result, not an error to interpret.

Come back to it later

A saved project reopens with its whole conversation — the design you uploaded, the specification, the layout and the XML — so you can carry on refining it days later instead of starting again.

Scale

Forty reports you have never read.

You can describe one report to an assistant. You cannot describe the forty in a folder nobody has opened since the person who wrote them left — which is the whole of the migration problem. Two panels answer it: Batch turns a queue of files into a queue of reports, and Revisions keeps every version of each one.

A queue, not a batch button

Choose as many files as you like and each one becomes its own report — the opposite of attaching several pages to build one. They run one at a time by default, because your key carries the quota and forty simultaneous requests turn a slow success into a fast 429; a key whose quota allows it can run two or three at once.

A verdict on every row

Each finished file carries the structural audit’s answer in the words the REPX pane uses: clean, N warnings, or N errors and content will be lost. The point of running forty is knowing which of the forty are worth opening.

Stop and retry mean what they say

Stop cancels what has not started and leaves the request in flight alone, since it is billed either way. Retry requeues only what failed. A quota or key failure halts the run rather than producing forty identical errors.

Out in one archive

Any finished row opens in the workspace or downloads on its own, and Download as .zip takes the lot. Drop a folder onto the panel, or choose one, and every report in it is queued with its path.

Every revision, and what it changed

Generations, refinements and binding passes are all kept, newest first, with a structural difference by control name — added, removed, moved, resized, retyped. Not a line diff of the XML, which would be almost entirely noise.

Going back does not lose going forward

Restoring an earlier version is itself recorded, so the newer one is still there. Signed in, the newest ten are saved with the project; signed out they last the session, and the panel says which you are getting.

Output

Checked before you download it.

A malformed generation should show up here, in the browser, and not when the DevExpress designer refuses the file.

The written specification

A component inventory in markdown, read off the .repx: every band and control, its coordinates, its font and its borders. The document you would otherwise have written by hand.

The live mockup

Read off the .repx too, and drawn at true proportions on a sheet that stays white in both light and dark themes, because a printed report does. It scales to your viewport without reflowing the layout.

The XML, parsed and checked

Syntax-coloured with line numbers and a copy action. Before you download, it is parsed, asserted to have the right root element and a Bands section, and audited for what DevExpress would drop or print wrong.

The Preview, and every export

The Preview pages the report as DevExpress prints it, over test data Forma can make, and exports it as PDF (with an outline, a password, or as PDF/A), Excel, CSV, Word, RTF, HTML or a picture, all in your browser. Open in designer hands the file to the DevExpress designer on Windows.

The file itself

Downloads as a .repx named after the report title. A generation that ends without a complete file says so, and is not handed to you as a broken one.

invoice_report.repxparse check passed
1<XtraReportsLayoutSerializer
2 ControlType="XtraReport"
3 PageWidth="850" PageHeight="1100">
4 <Bands>
5 <Item1 ControlType="DetailBand"
6 HeightF="640">
7 <Controls>
8 <Item1 ControlType="XRLabel"
9 Text="INVOICE"
10 LocationFloat="40,45" />
11 <Item2 ControlType="XRTable" />
12 </Controls>
13 </Item1>
14 </Bands>
15</XtraReportsLayoutSerializer>
Rendered as text nodes, never as markup — the viewer cannot be made to inject anything.
Custody

Your key, and your saved work.

Forma ships with no API key and cannot be given one. Yours is a working copy in this tab, and leaves it only encrypted, if you ask it to.

working copysessionStorage

Erased by the browser when the tab closes — a guarantee an unload handler cannot make, since it never fires on a crash or a force-quit.

durable copy · opt-inAES-GCM ciphertext

Encrypted in your browser under a passphrase you choose, with only the ciphertext uploaded. There is deliberately no reset path.

Saved projects follow the same rule.

Signed in, a project is written to your own account and appears on every device you sign in from. Signed out, it stays in this browser — reload the page and it is still there. Either way the API key is never part of what gets saved.

  • Uploads travel inside the transcript, so a large design can outgrow a cloud record — Forma re-saves it without the thumbnails and tells you, rather than losing the spec and the XML.
  • Signing out clears the workspace as well as the credential: the design, the extracted text and the generated report all go.
  • A session ended in another tab clears this one too.
Only you can decrypt the stored key. A reset path would mean whoever runs Forma could read it, so there is not one. Keep your passphrase somewhere safe.
Cost

Free, and there is no upgrade to sell you.

Forma is open source under the Apache-2.0 licence. There is no seat count and no plan above the one you are on, because there are no plans.

The application
free

Open source and yours to read, run and change. Nothing is held back behind a paid tier.

The generation
Google’s free tier

You bring your own Gemini key, and Forma is built to stay inside Google’s free tier. If you turn on billing for your key, Google bills you directly; Forma takes no cut and never sees the transaction. A local AI costs nothing at all.

Your queue
yours alone

No shared quota means nobody else’s traffic slows you down, and nothing runs out halfway through a busy afternoon.

Forma
Your own key, nothing else to set

Read the claims. Then go and test them.

Bring a design and your own Gemini key. Everything on this page is something you can check in a few minutes, on your own file.

Read the documentation