formfeed
Official# Formfeed packages
Client libraries, command line tools and integrations for [Formfeed](https://formfeed.dev/?utm_source=github), the API
for generating PDFs and images from templates. Documentation lives at
[docs.formfeed.dev](https://docs.formfeed.dev).
| Package | Registry | What it is |
|---|---|---|
| [`@formfeed/sdk`](packages/sdk-ts) | [npm](https://www.npmjs.com/package/@formfeed/sdk) | TypeScript client: renders, batches, templates, webhooks. No dependencies, Web APIs only |
| [`formfeed`](packages/sdk-python) | [PyPI](https://pypi.org/project/formfeed/) | Python client, sync and async |
| [`formfeed`](packages/cli) | [npm](https://www.npmjs.com/package/formfeed) | CLI: templates as files, offline preview and validation, renders through the API |
| [`@formfeed/engine`](packages/engine) | [npm](https://www.npmjs.com/package/@formfeed/engine) | The template engine (Jinja2, Liquid, Handlebars) the API and the editor use |
| [`@formfeed/devkit`](packages/devkit) | [npm](https://www.npmjs.com/package/@formfeed/devkit) | Template folders, project config and local rendering |
| [`@formfeed/testing`](packages/testing) | [npm](https://www.npmjs.com/package/@formfeed/testing) | Vitest and Jest matchers for templates |
| [`@formfeed/mcp`](packages/mcp) | [npm](https://www.npmjs.com/package/@formfeed/mcp) | Model Context Protocol server for AI agents [](https://glama.ai/mcp/servers/formfeed-dev/formfeed) |
| [`n8n-nodes-formfeed`](packages/n8n-nodes-formfeed) | [npm](https://www.npmjs.com/package/n8n-nodes-formfeed) | n8n community node |
Every npm package is built and published from this repository by
[GitHub Actions](.github/workflows/release.yml) with
[provenance](https://docs.npmjs.com/generating-provenance-statements), and the Python package with
[trusted publishing](https://docs.pypi.org/trusted-publishers/), so each release can be traced to
the commit and workflow run it came from.
## Development
Node 22 or newer and pnpm (the version in `package.json`, `corepack enable` picks it up):
```bash
pnpm install
pnpm nx run-many -t lint test --exclude sdk-python # TypeScript packages
pnpm nx run-many -t bundle smoke # build, pack and try every npm package
cd packages/sdk-python && pip install pytest httpx pydantic && python -m pytest -q
```
This repository is generated from Formfeed's main repository, where the packages are developed
together with the API they talk to. See [CONTRIBUTING.md](CONTRIBUTING.md) for how issues and pull
requests are handled.
## Licence
MIT, see [LICENSE](LICENSE). Bundled third-party code keeps its own licence; the CLI and MCP packages
list it in `THIRD_PARTY_LICENSES.md`.
TDQS
Scored across 10 tools
Most tools target a clearly distinct operation (listing, reading source, reading schema, saving, validating, rendering, converting, checking status, validating invoices, workspace info), and the descriptions explicitly cross-reference each other (e.g. render vs convert_to_pdf, validate_template vs render). The remaining soft overlaps are get_template_schema vs get_template_source (both 'read about a template') and validate_template vs check_invoice (both 'validate'), but the descriptions disambiguate them well enough to avoid misselection.
Names follow a consistent snake_case verb_noun pattern: get_template_source, get_template_schema, get_render, get_workspace, list_templates, save_template, validate_template, convert_to_pdf, check_invoice. The lone deviation is `render`, a bare verb with no object, which slightly breaks the pattern but is unambiguous in context.
Ten tools is well within the sweet spot and each earns its place: discovery, schema, source, edit, validation, render, conversion, polling, e-invoice check, and workspace context. Nothing feels padded or redundant.
The core lifecycle is covered: list/read/schema/save-draft/validate/render/convert/poll, with a deliberate human publish step and invoice validation for e-invoicing. Gaps exist around template housekeeping (no archive/delete, no list of versions or past renders beyond a single id), but agents can work around these via the review_url and Formfeed UI.