# Spyde > Declarative PDF layout for Node on top of PDFKit. Describe a document as a tree of functions; Spyde lays out the pages, breaks them, and draws them. No browser, one runtime dependency. Install: `npm install @grandbusta/spyde`. Node 20 or newer. TypeScript types included. Repository: https://github.com/Grandbusta/spyde ## Docs - [Getting started](https://grandbusta.github.io/spyde/guide/getting-started): Install Spyde, build a one-page invoice from a tree of functions, and get PDF bytes back. No coordinates, one runtime dependency. - [Pages](https://grandbusta.github.io/spyde/guide/pages): How Spyde breaks a document across pages: columns and tables split, keep and pageBreak give control, box options and alignment on rows and columns. - [Tables](https://grandbusta.github.io/spyde/guide/tables): Spyde tables take plain data. Columns say which field to show, how to format it, its width and alignment; the header repeats on every page. - [Text, fonts, images](https://grandbusta.github.io/spyde/guide/text-and-images): Text styles, PDFKit's built-in fonts, registering your own font, images that keep their aspect ratio, and the render options. - [Live preview](https://grandbusta.github.io/spyde/guide/live-preview): Render the same Spyde layout as an HTML fragment for a live preview that matches the PDF line for line, with data-field hooks for forms. - [Example](https://grandbusta.github.io/spyde/guide/examples): A complete Spyde example, the one-page invoice from examples/invoice.ts, shown as its code and the page it produces. - [How it works](https://grandbusta.github.io/spyde/guide/how-it-works): Spyde's two-pass layout: constraints down, sizes up, then paint through one interface with a PDFKit painter and a recorder for HTML. - [Using Spyde with an AI assistant](https://grandbusta.github.io/spyde/guide/for-llms): Rules for writing Spyde code with an AI coding assistant: the conventions a model gets wrong without being told, in a block you can paste into your own agent instructions. - [API](https://grandbusta.github.io/spyde/api): Every Spyde function and its settings: leaves, containers, wrappers, and the three outputs render, renderHtml, and renderDisplayList. - [Performance](https://grandbusta.github.io/spyde/performance): Measured generation times for Spyde against raw PDFKit: a 67-page statement in 84 ms, and why a headless browser is ten to fifty times slower. - [Changelog](https://grandbusta.github.io/spyde/changelog): What changed in each Spyde release, including the breaking changes in 0.2.0: Uint8Array output and multi-page documents. ## Optional - [Everything in one file](https://grandbusta.github.io/spyde/llms-full.txt)