---
title: PDF Export
description: Export your entire docs site as a single PDF. Downloadable from the dashboard and delivered by email. Paid plans only.
---

Export your documentation site as a single PDF from the dashboard. Jamdesk renders every published page into one file, emails you a download link when it's ready, and keeps the PDF available for redownload until your next docs build.

<Card title="Download a sample PDF" icon="file-pdf" href="https://github.com/jamdesk/jamdesk-docs/releases/download/sample-pdf-v1/jamdesk-docs.pdf">
  See what a real export looks like. The full Jamdesk documentation site, rendered through this same pipeline. 408 pages, 6.6 MB.
</Card>

PDF export is useful for:

- Sharing documentation with reviewers who don't have dashboard access
- Offline reading on planes, in secure facilities, or at customer sites
- Compliance and audit snapshots at a specific commit
- Customer handoff packages

## Who can use it

PDF export is included on every **paid plan** at no extra charge, and there is no add-on to purchase. Each project can generate up to **3 PDFs per day**, with the counter resetting at midnight UTC.

## Generate a PDF

<Steps>
  <Step title="Open Settings → PDF Exports">
    In the dashboard, select the project from the sidebar, click **Settings**, and scroll to the **PDF Exports** section beneath project metadata.
  </Step>
  <Step title="Click Generate PDF">
    The button changes to **Generating…** while Jamdesk renders the site in a headless browser and writes the PDF to storage. Time to finish scales with the number of pages and how much imagery they contain. Most sites complete in a few minutes.
  </Step>
  <Step title="Watch for the email">
    When the PDF is ready, we email the signed-in user with a link back to the Settings page. You can also just leave the page open; the status updates live.
  </Step>
  <Step title="Download">
    Click **Download PDF**. See [Download link lifetime](#download-link-lifetime) if the link ever expires.
  </Step>
</Steps>

## Multi-language projects

If your `docs.json` has more than one language configured, a locale dropdown appears next to the **Generate PDF** button.

```json docs.json
{
  "navigation": {
    "languages": [
      { "language": "en", "default": true },
      { "language": "es" },
      { "language": "fr" }
    ]
  }
}
```

Each export covers a single language. To ship all three to a reviewer, pick `en`, export, then `es`, export, then `fr`.

## Caching and Regenerate

The Settings page remembers only the **most recent** completed export per project. When you click **Regenerate**, Jamdesk checks whether the last export matches both the current build *and* the locale you're asking for:

- **Same build and locale** → the cached PDF is handed back immediately. You'll see a notice explaining that nothing has changed since your last export.
- **New build or different locale** → a fresh render kicks off. Clicking **Rebuild** counts as a new build, even when the commit is unchanged.

Because the cache is a single slot, exporting a second locale or a new build replaces whatever was there before. The earlier PDF isn't deleted, but it's no longer the one surfaced on the Settings page.

To get a fresh PDF after updating your docs:

<Steps>
  <Step title="Ship new content">
    Push your changes to GitHub, or use `jamdesk deploy` from the CLI.
  </Step>
  <Step title="Wait for the build to finish">
    The Builds list in the dashboard shows **Completed** on the new commit.
  </Step>
  <Step title="Regenerate">
    Back on the Settings page, click **Regenerate**. A new build has completed since the cached export, so Jamdesk kicks off a fresh render.
  </Step>
</Steps>

Regenerate is safe to click liberally. If no new build has completed, it won't re-render or re-email.

## Rate limiting

Each project has two limits:

- **3 completed exports per day.** The counter resets at midnight UTC. The dashboard shows how many you've used.
- **5 minutes between exports.** Requests inside that window return `Try again in a few minutes`.

Cache hits (same build and locale as the previous export) bypass both limits, so repeat downloads of an unchanged PDF never hit the wall.

A PDF that has been generating for more than twenty minutes is treated as stale. You can click **Generate PDF** again to re-enqueue.

## What gets exported

The PDF includes every page listed in your `docs.json` navigation for the chosen language, in declaration order. External links in the nav are skipped. Orphan pages (files in your repo that aren't wired into navigation) are not included.

Each page is rendered via the same URL a reader would hit (`https://<slug>.jamdesk.app/<path>`), so anything that shows up in the browser shows up in the PDF.

## Password-protected sites

If your site is [password protected](/setup/password-protection), a PDF will not be generated. Disable password protection to run the export, then re-enable it afterward.

## Email delivery

When the PDF is ready, the person who clicked **Generate PDF** gets an email with a link back to the Settings → PDF Exports section, plus the page count, timestamp, and locale (for multi-language projects). The dashboard itself also flips to the ready state live; you don't need the email to download.

Only the requester is emailed. Other collaborators see the new PDF the next time they open the Settings page.

<Warning>
  If the email doesn't arrive within a few minutes of completion, check your spam folder. The PDF is still available from the dashboard regardless of whether the email lands.
</Warning>

## Download link lifetime

Email download links are valid for **72 hours** from the time the PDF finishes. The dashboard mints a fresh URL every time you open the Settings page, so downloads from the dashboard don't expire. If an email link ever 403s, head to the dashboard and click **Download PDF** there.

## Troubleshooting

<Accordion title="'No completed build found — trigger a build first'">
  PDF export renders a built site, not your source MDX. You need at least one successful build on your default branch. Push a commit or click **Rebuild** on the Builds page, wait for it to finish, then try again.
</Accordion>

<Accordion title="'PDF export requires a paid plan'">
  Your project is on the free trial. Upgrade from **Settings → Billing**.
</Accordion>

<Accordion title="'Daily PDF export limit reached (3/day). Try again tomorrow.'">
  Each project is capped at 3 completed exports per UTC day. The counter resets at midnight UTC.
</Accordion>

<Accordion title="'Try again in a few minutes'">
  You hit the five-minute gap between exports. Wait and retry.
</Accordion>

<Accordion title="Regenerate didn't produce a new file">
  The cached PDF was reused because no new build has completed since the last export. Push a commit, or click **Rebuild** on the Builds page, then try Regenerate again once the build finishes. See [Caching and Regenerate](#caching-and-regenerate).
</Accordion>

<Accordion title="The PDF is missing pages that exist on my site">
  The exporter only pulls pages that are in your `docs.json` navigation, in the language you selected. Orphan pages (authored but not navigated) and external links won't appear. Check that the missing pages load cleanly in a browser at `<slug>.jamdesk.app`.
</Accordion>

<Accordion title="The PDF is enormous">
  Large diagrams, videos, and unoptimized images inflate PDF size fast. Turn on [Automatic Image Conversion](/builds/image-optimization) to cut image bytes by 60-80%. Videos render as a poster frame with a play icon, so they don't bloat the file.
</Accordion>

## What's Next?

<Columns cols={2}>
  <Card title="Triggering Builds" icon="hammer" href="/builds/triggering">
    PDF export runs against the most recent completed build. Kick one off manually or on push.
  </Card>
  <Card title="Image Optimization" icon="image" href="/builds/image-optimization">
    Convert PNG/JPG to WebP at build time to keep PDFs small.
  </Card>
</Columns>
