AnyTool
Your files never leave your device. All processing happens locally in your browser.

How do I generate many documents from a template and a spreadsheet for free, without uploading?

AnyTool Bulk Document Generator is a 100% client-side mail-merge. You write one template with {{placeholder}} tokens (such as {{name}}, {{company}} or {{id}}), then paste a CSV — its header row defines the field names and each row becomes one document — or build the same data in an editable table. The tool auto-detects every placeholder, flags any token that has no matching column, and merges each row into the template to produce one personalized document per row. A live preview shows the merged result with a 1-of-N navigator, and you export a ZIP of individual .txt, .md or .html files (named with a filename pattern like {{_index}}-{{name}}), a single combined text file, or a combined PDF. Your template and your data never leave the browser — nothing is uploaded, logged or stored, so it is safe for sensitive mail-merge.

  • One template with {{placeholders}} + a CSV/table where each row = one document
  • Auto-detected fields; unmapped tokens flagged so nothing silently goes blank
  • Live merged preview with a 1-of-N row navigator and per-document filename
  • Export a ZIP of .txt/.md/.html files, a combined text file, or a combined PDF
  • 100% client-side — template and data never uploaded; ideal for sensitive mail-merge

What is

Mail merge (bulk document generation)

A mail merge takes a single template containing merge fields — typically written as {{placeholders}} — and a data source where each row holds the values for one recipient (a CSV or spreadsheet whose header row names the fields). For every row, the placeholders are replaced with that row’s values, producing one personalized document per row: bulk letters, certificates, labels, contracts or notices. The output is usually a set of individual files or one combined document. AnyTool performs the whole merge in the browser, so the template and data are never uploaded.

Generators

Related terms

Merge fieldsPlaceholdersCSVBulk lettersCertificate generatorFilename pattern

Frequently Asked Questions

Write a template with {{placeholder}} tokens, paste a CSV (header = field names, one row per document) or fill the table, and it merges each row into the template to produce one document per row.

You start with a template and mark the variable parts with {{placeholder}} tokens, for example {{name}}, {{event}} or {{id}}. Then you supply the data: paste a CSV whose first row is the header of field names and where every following row is one document’s values, or switch to the editable table and type the same thing. The tool scans the template for tokens, lists the detected fields, and highlights in amber any token that does not match a column. For each data row it replaces the tokens with that row’s values to build a finished document, and the live preview lets you page through the results one at a time so you can check the merge before generating in bulk.

A ZIP of one .txt, .md or .html file per row (named with a pattern like {{_index}}-{{name}}), a single combined text file, or a combined PDF with one document per section.

There are three bundles. A ZIP contains one file per data row in your chosen format — plain text (.txt), Markdown (.md), or styled HTML (.html), where Markdown is rendered to a clean, self-contained HTML document. Filenames come from a pattern you control, using any {{field}} plus {{_index}} for the row number; illegal characters are stripped and any clashes get -2, -3 and so on. A combined text file concatenates every document with clear separators into a single download. A combined PDF lays out each merged document as its own paginated section. All three are assembled on your device with lazily-loaded libraries, so the export still involves no upload.

No. The template, the CSV or table, and every generated file are produced entirely in your browser. Nothing is uploaded, logged or stored.

The Bulk Document Generator is 100% client-side. The template you write, the data you paste, the merge itself and the ZIP, combined file and PDF are all built in the page — there is no server round-trip and no CDN, and not a single name, address or row is sent anywhere. That makes it suitable for sensitive mail-merge such as payroll letters, medical or legal notices and customer lists that cannot be put through a cloud document service. Close the tab and nothing is kept; the tool works offline once cached.

It is flagged in amber and left visible as {{token}} in every document, rather than silently disappearing, so you can fix the column name or the token.

Matching between template tokens and data fields is case-insensitive, so {{First Name}} finds a “First Name” column. Any token that has no matching column is highlighted in amber in the detected-fields list, called out in a warning, and intentionally left in the merged document as {{token}} so it is obvious in the preview instead of producing a blank. Always review the merged preview and page through a few rows before generating in bulk, and for rich formatting write the template in Markdown and export HTML, which is rendered with a clean stylesheet.

Detailed Explanation

How It Works

A Local Mail-Merge: One Template × Many Rows

AnyTool Bulk Document Generator is a 100% client-side mail-merge. You write a single template and mark the variable parts with {{placeholder}} tokens — for example {{name}}, {{event}}, {{date}} or {{id}} — then supply a data source: a pasted CSV whose first row is the header of field names and where each subsequent row holds the values for one document, or an editable mini-table of the same shape. The engine scans the template with a regular expression to build an ordered, de-duplicated list of fields, then for every data row replaces each token with that row’s value (matching is case-insensitive, so {{First Name}} resolves a “First Name” column) to produce one personalized document per row. This is the classic mail-merge pattern used for bulk letters, certificates, labels, contracts, notices and personalized emails — done entirely on the user’s device.

  • Single template with {{placeholder}} merge fields, auto-detected by regex
  • Data source is a CSV (header = field names, one row per document) or an editable table
  • Each row is merged into the template to produce one personalized document
  • Token-to-column matching is case-insensitive
  • Built for bulk letters, certificates, labels, contracts and notices
Technical Details

RFC 4180 CSV Parsing, Filename Patterns, ZIP / Combined / PDF

The CSV parser is RFC 4180-ish: it walks the text character by character, correctly handling quoted fields, delimiters and newlines embedded inside quotes, and "" escaped quotes, and supports comma, semicolon or tab delimiters. Unmapped tokens — placeholders with no matching column — are flagged in amber and deliberately left visible as {{token}} in the merged output rather than silently producing a blank, and a live preview pages through the merged documents one at a time (1 of N) with the computed filename shown. Export offers three bundles, all assembled on-device with lazily-imported libraries: a ZIP (built with JSZip) of one file per row in the chosen format — plain text (.txt), Markdown (.md), or styled HTML (.html) where the merged Markdown is rendered to a self-contained document with the marked library — named from a filename pattern using any {{field}} plus {{_index}} for the row number, with illegal characters stripped and clashes disambiguated as -2, -3; a single combined text file with clear separators; or a combined PDF (built with pdf-lib) that lays out each merged document as its own wrapped, paginated section. The batch is capped at 2,000 documents to protect the tab.

  • Character-by-character RFC 4180-ish CSV parsing; comma / semicolon / tab delimiters
  • Unmapped {{tokens}} flagged in amber and left visible, never silently blanked
  • Filename pattern with {{field}} + {{_index}}; illegal chars stripped, clashes get -2/-3
  • Export: ZIP of .txt/.md/.html (JSZip + marked), combined .txt, or combined PDF (pdf-lib)
  • Live 1-of-N merged preview; batch capped at 2,000 documents
Privacy & Security

Privacy and the Honest Caveats

Everything runs in the browser. The template you write, the CSV or table you paste, the merge itself, and every generated file — the ZIP, the combined text file and the PDF — are produced right here with no server round-trip and no CDN, so not a single name, address or row is uploaded, logged or stored; the tool works offline once cached. That privacy is the point: it is well suited to sensitive mail-merge such as payroll letters, medical or legal notices and customer lists that cannot go through a cloud document service. The tool is honest about its nature. It is a local mail-merge, so the output is only as good as the mapping: it urges reviewing the merged preview and paging through a few rows before generating in bulk, and checking that every {{placeholder}} matches a column header. Large batches use memory and a moment of CPU on the device, which is why the count is capped; for rich formatting it recommends writing the template in Markdown and exporting HTML (rendered with a clean stylesheet) or generating Markdown and styling it afterwards, and it is explicit that the combined PDF is a plain, paginated text layout for printing or filing rather than a designed page.

Bulk document generation: AnyTool vs typical mail-merge services
CapabilityAnyToolTypical online services
ProcessingRuns entirely in your browserUploads template + data to a server
TemplatePlain text/Markdown with {{placeholders}}Often a proprietary or .docx template
Data sourcePaste CSV or an editable tableUpload a spreadsheet / connect Sheets
Field mappingAuto-detected; unmapped tokens flaggedManual mapping step
OutputZIP (.txt/.md/.html), combined .txt, or PDFWord/PDF, sometimes behind a paywall
FilenamesConfigurable {{field}}/{{_index}} patternOften fixed naming
PrivacyNothing uploaded; safe for sensitive dataRequires an account; data leaves device

AnyTool performs the whole mail-merge locally and never uploads your template or your data.