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.
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 · JPGResized 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
PDFUp 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
.repxRead 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
severalDrag 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 · JSONA 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 ServerIts 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.
ytop = pageHeight − (baseline + height)
Rendered at print resolution on a white ground. Authoritative for borders, fills, logos and visual structure.
Every string with its exact position, converted into the report’s unit. Authoritative for content.
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
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
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
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
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
Right to left when the text you bring reads that way, written into the report so it prints that way.
Data
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.
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.
Content, x and y, width and height, in the report’s own unit (hundredths of an inch unless the report says otherwise).
Font family, size and weight, with bold and italic carried as their own flags rather than baked into a name.
Horizontal and vertical alignment, and whether a cell wraps its text or clips it.
Each of the four sides separately, with its colour — so a single underline stays a single underline.
One table with real rows and cells, weighted relatively the way XRTableCell does — not a grid faked out of loose labels.
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.
A decorative stand-in on screen — positioned and sized, with its content left undrawn — and a real XRBarCode carrying its symbology in the file.
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.
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.
A tick box, checked or not, or bound to a yes-or-no field.
A box that holds other controls and moves them as one. The mockup draws what is inside it.
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.
A pivot of rows against columns, written with the layout DevExpress generates for it. The Preview draws its grid over test data.
Kept from a report you bring: Forma does not invent a subreport. A table of contents is built from the report’s bookmarks.
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.
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.
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.
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.
1<XtraReportsLayoutSerializer2 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>
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.
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.
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.
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.
Open source and yours to read, run and change. Nothing is held back behind a paid 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.
No shared quota means nobody else’s traffic slows you down, and nothing runs out halfway through a busy afternoon.


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.