# Resume: instructions for an AI assistant

Your user wants a resume as a PDF. Pressa fills its resume template with the details you collect and returns a link to the finished PDF. It needs no install, and no account or API key for up to 3 PDFs a day.

Every design takes exactly the same details, so you can type once and switch between them until one feels right: the classic serif layout recruiters and applicant tracking systems read without trouble, a clean modern sans-serif, a bold coloured header, a two-column layout with a sidebar, and an elegant layout with the headings in the margin. Each comes in five colours.

Preview: https://pressa.dev/template-previews/classic-resume.png

## Designs

Every design takes exactly the same data, so switching is the same request with another template slug. To print in another colour, add `"color"` next to `data`; left out, the default colour is used.

- `classic-resume` - Classic (use this one unless your user asks for another): A one-page resume in a serif typeface with blue section rules. Safe for any industry. Colours: navy, teal, burgundy, forest, graphite (default navy). Preview: https://pressa.dev/template-previews/classic-resume.png
- `modern-resume` - Modern: A clean sans-serif resume with a teal accent and a skills table. Suits tech, design and startups. Colours: teal, navy, burgundy, forest, graphite (default teal). Preview: https://pressa.dev/template-previews/modern-resume.png
- `banner-resume` - Banner: A resume with your name in a bold coloured band across the top and clear section markers. Stands out without shouting. Colours: navy, teal, burgundy, forest, graphite (default navy). Preview: https://pressa.dev/template-previews/banner-resume.png
- `sidebar-resume` - Sidebar: A two-column resume with a coloured sidebar for contact details, skills and education. Modern and easy to scan. Colours: teal, navy, burgundy, forest, graphite (default teal). Preview: https://pressa.dev/template-previews/sidebar-resume.png
- `elegant-resume` - Elegant: A refined serif resume with small-caps headings in the margin. Suits law, finance, academia and senior roles. Colours: burgundy, navy, teal, forest, graphite (default burgundy). Preview: https://pressa.dev/template-previews/elegant-resume.png

## 1. Collect the details

Keep it to one page for up to about ten years of experience. Write each highlight as one line that starts with a verb and ends with a result, with a number where there is one. Put the most relevant job first. Never invent employers, dates, degrees or numbers; if a field does not apply, pass an empty string rather than making something up.

Ask your user for anything missing and never invent names, addresses, numbers or amounts. Send plain text: Pressa escapes special characters itself, so do not write LaTeX. Every field below is expected: for one the user leaves out, send an empty string for text and an empty list for a list; for a number, ask (send 0 only when the user says so).

Fields:

- `name` (text)
- `headline` (text)
- `location` (text)
- `email` (text)
- `phone` (text)
- `website` (text)
- `summary` (text)
- `experience`: a list, each entry with:
  - `title` (text)
  - `company` (text)
  - `location` (text)
  - `dates` (text)
  - `highlights`: a list of text
- `projects`: a list, each entry with:
  - `name` (text)
  - `description` (text)
- `skills`: a list, each entry with:
  - `category` (text)
  - `items` (text)
- `education`: a list, each entry with:
  - `degree` (text)
  - `school` (text)
  - `location` (text)
  - `dates` (text)

A complete example of the data:

```json
{
  "name": "Alex Rivera",
  "headline": "Backend Engineer",
  "location": "Chicago, IL",
  "email": "alex.rivera@example.com",
  "phone": "(312) 555-0142",
  "website": "alexrivera.example.com",
  "summary": "Backend engineer with 8 years of experience building payment and logistics systems in Python and Go. Comfortable owning a service from design to on-call, and at my best on high-volume, event-driven platforms.",
  "experience": [
    {
      "title": "Senior Backend Engineer",
      "company": "Lumen Logistics",
      "location": "Chicago, IL",
      "dates": "2021 - present",
      "highlights": [
        "Rebuilt the shipment tracking service in Go, cutting p95 latency from 900 ms to 180 ms at 40 million events a day.",
        "Designed the Kafka event pipeline that replaced nightly batch jobs, so customers see status changes within seconds.",
        "Led a team of four engineers and introduced design reviews and on-call runbooks; paging incidents fell by 60%.",
        "Moved 30 services from EC2 to Kubernetes on AWS with no customer-facing downtime."
      ]
    },
    {
      "title": "Backend Engineer",
      "company": "Harbor Payments",
      "location": "Chicago, IL",
      "dates": "2017 - 2021",
      "highlights": [
        "Built card payment and refund APIs in Python (Django) handling $2 billion in annual volume.",
        "Added idempotency keys and retry-safe webhooks, ending duplicate charges during partner outages.",
        "Wrote the PostgreSQL partitioning plan that kept the ledger fast past 1 billion rows.",
        "Mentored three junior engineers, two of whom were promoted within a year."
      ]
    }
  ],
  "projects": [
    {
      "name": "queuewatch",
      "description": "Open-source Go tool that alerts on consumer lag in Kafka and RabbitMQ; used in production by several teams."
    }
  ],
  "skills": [
    {
      "category": "Languages",
      "items": "Go, Python, SQL, TypeScript"
    },
    {
      "category": "Infrastructure",
      "items": "PostgreSQL, Kafka, Redis, Docker, Kubernetes, AWS, Terraform"
    },
    {
      "category": "Practices",
      "items": "API design, event-driven architecture, observability, incident response, mentoring"
    }
  ],
  "education": [
    {
      "degree": "B.S. in Computer Science",
      "school": "Lakeshore University",
      "location": "Chicago, IL",
      "dates": "2013 - 2017"
    }
  ]
}
```

## 2. Make the PDF: use the first option you can

**A. You can send HTTP requests** (Claude Code, Cursor, Codex, a script, n8n). Send the details as JSON under `data` (and `color` if your user picked one). Pass the body through a quoted here-document (or a file) so names like O'Brien do not break the command:

```bash
curl -X POST https://api.pressa.dev/api/v1/public_templates/classic-resume/render \
  -H "Content-Type: application/json" \
  -d @- <<'JSON'
{"color": "navy", "data": { ...same shape as the example above... }}
JSON
```

The response has `pdf_url`. Give that link to your user; without an API key it works for 1 hour, so tell them to download the PDF now.

**B. Pressa is connected to you as an MCP server.** Call the tool `render_public_template` with `template: "classic-resume"` and `data` shaped like the example (and `color` for another colour), then give your user the `pdf_url`. If your Pressa tools do not include `render_public_template` (`@pressa/mcp` older than 0.10.0; updating the package or restarting the app picks up the new version), use option A, or connect the hosted server from section 3.

**C. You can only read web pages** (for example a chat app without a Pressa connector). You cannot make the PDF yourself through Pressa yet. Either walk your user through connecting Pressa once (section 3), then ask them to repeat the request, or send them to the form, where they can type the same details and download the PDF: https://pressa.dev/templates/resume

## 3. Connecting Pressa (one time, no account needed)

Explain the steps for the app your user is in, in plain words:

- **Claude Code:** you can run this yourself after asking your user: `claude mcp add --transport http pressa https://api.pressa.dev/mcp`
- **Cursor, Windsurf and other MCP clients:** add a remote MCP server named `pressa` with the URL `https://api.pressa.dev/mcp`.
- **claude.ai or the Claude desktop app:** your user opens Settings, then Connectors, chooses to add a custom connector, names it Pressa and pastes `https://api.pressa.dev/mcp`. Then they start a new chat and ask again.
- **ChatGPT:** custom connectors are only available on some paid plans, through developer mode in the connector settings, and menus change between versions. If your user has it, they add a connector with the URL `https://api.pressa.dev/mcp`; otherwise send them to the form: https://pressa.dev/templates/resume

## 4. If something goes wrong

- `anonymous_quota_exhausted`: the 3 free PDFs for today are used. A free account at https://pressa.dev/users/sign_up (no card) gives 50 a month, used through an API key. Where the key goes depends on how you reach Pressa: with HTTP requests, send it as the header `Authorization: Bearer <key>` (from an environment variable your user sets, never pasted into a chat); in Claude Code, your user re-adds the server in their own terminal with `--header "Authorization: Bearer $PRESSA_API_KEY"` (again, never have them paste the key into the chat); in claude.ai a key cannot be used at all, so suggest the form at https://pressa.dev/templates/resume (signed-in visitors get their account's PDFs there) or Claude Code.
- `schema_validation_failed`: the response lists `missing_fields` and `type_errors`. Fix the data and send it again yourself.
- `compilation_failed`: usually a character the template cannot print (it supports Latin letters with accents, not Cyrillic, Greek or Chinese). Tell your user which value to change.

## Other templates

Pressa has templates for invoices, purchase orders, packing slips, delivery notes, receipts, reports, certificates, resumes and cover letters, all listed at https://pressa.dev/templates and by `GET https://api.pressa.dev/api/v1/public_templates`. Each has its own instructions at `https://pressa.dev/templates/<slug>/agent.md`.
