Files
Reactive-Resume/docs/guides/exporting-your-resume.mdx
T
Amruth Pillai b404dbd42a Add application tracker (#3220)
* feat(applications): job application tracker with AI copilot

Add an Applications module at /dashboard/applications: pipeline board
(dnd-kit), table view with bulk actions, Insights (fit tiles, funnel,
sources, shareable funnel-flow SVG), campaigns, tags, CSV import, and
Add/Edit/Detail slide-overs. Each application links a live Reactive
Resume.

AI "Application Copilot" (applications.ai.*): job-posting autofill,
resume↔job match score (fit ring), resume tailoring, and cover-letter /
follow-up drafting — via the user's configured provider.

Board cards + table rows get context menus (edit / move / archive /
delete). Charts are CSS/SVG (no new chart dep); adds a UI Checkbox.

Also includes local TanStack devtools setup and toolchain bumps.

Claude-Session: https://claude.ai/code/session_01TEeRHnEayw2MFCShFRyL5f

* feat(applications): close follow-up gaps + squash migrations

Finish the deferred/open items on the applications tracker:

- Cover-letter upload re-enabled. Fix the storage blocker by deriving the
  key extension from content type (buildFileKey/EXTENSION_BY_CONTENT_TYPE)
  instead of hardcoding .jpeg, so PDFs serve correctly and non-JPEG image
  avatars keep working under FLAG_DISABLE_IMAGE_PROCESSING. Add
  coverLetterUrl/coverLetterName columns + Documents-section upload/remove.
- Contacts editor in the detail sheet (add/edit/remove, keyed per app).
- Board caps rendered cards per column (COLUMN_PAGE_SIZE=50 + "Show more").
- Extract new Lingui messages across locales.
- Guard coverLetterUrl to http(s)/relative at the API boundary.

Squash the five branch-only application-table migrations (create -> +tags
-> +cover-letter -> drop -> re-add) into a single clean CREATE TABLE via
drizzle-kit generate.

Claude-Session: https://claude.ai/code/session_01TEeRHnEayw2MFCShFRyL5f

* chore: update dependencies

* fix(web): address React Doctor findings — compiler, purity, query, component structure

prefer-module-scope-pure-function: hoist buildSubtitle, getDecimalPlaces,
handleLocaleChange, onLocaleChange, stop, listContent/groupedListContent to
module scope so they aren't rebuilt on every render.

react-compiler-todo (??=): rewrite draft.metadata.styleRules ??= [] to the
non-assignment form to unblock auto-memoization.

set-state-in-effect: derive updatedAtLabel at render time instead of syncing
it through useState + useEffect.

query-destructure-result: destructure useQuery results at call site in
resume-analysis and resume-thumbnail to follow TanStack Query v5 convention.

only-export-components: extract non-component exports to sibling .ts files so
Fast Refresh can preserve component state:
  - getNextWeights → typography/get-next-weights.ts
  - detectJsonImportType + ImportType → dialogs/resume/import.utils.ts
  - getLocaleOptions → features/locale/locale-options.tsx
  - preview helpers + DEFAULT_PDF_PAGE_SIZE → preview.shared.utils.ts
  - resolveHighlightToolbarState + defaultHighlightColor → rich-input.utils.ts
  - computeDelta + getSparklinePoints → statistics.utils.ts

no-multi-comp: split multi-component files into focused companions:
  - ResumePane + ToolbarButton → routes/agent/-components/resume-pane.tsx
  - DesktopBuilderShell → builder/$resumeId/-components/desktop-builder-shell.tsx
  - MobileBuilderShell + helpers → builder/$resumeId/-components/mobile-builder-shell.tsx
  - setBuilderLayout/getBuilderLayout moved to -store/sidebar.ts

fix(tests): add Resume type import to section-builder mocks and cast partial
mock data as unknown as Resume to satisfy stricter type checking; fix
noExplicitAny Biome errors in the same mocks.

* feat(applications): improve performance

* chore: fix knip issues

* perf(builder): halve per-keystroke render cost

Section-form fields called `form.handleSubmit()` on every keystroke, which
re-validated the whole form and toggled submit state — firing the render
cascade twice per character (~6809 renders/keystroke, FPS dropping to 9).

Persist via a form-level `listeners.onChange` instead and drop the per-field
`handleSubmit()` (basics, custom-fields, design). Narrow header/dock resume
subscriptions to metadata slices so they no longer re-render on content edits.

Cuts renders 6809 -> 3403 per keystroke (50%), 0 frame drops. Save, preview,
and design controls verified working; 449/449 web tests pass.

* perf(home): eliminate hero CLS from unreserved video box

The hero <section> is `flex items-center` (shrink-to-fit), so the video
wrapper's width depended on the video's intrinsic size, which only resolves
after the media loads. aspect-ratio couldn't reserve height without a definite
width, so the video grew from ~190px to ~563px after first paint and shoved the
centered hero text down ~373px (CLS ~0.095).

Give the wrapper a definite width (w-full + mx-auto on the CometCard) and set an
explicit aspect ratio + width/height on the video so its box is reserved before
load. CLS 0.095 -> 0; hero stays visually centered at max-w-4xl.

* docs: add application tracker guides

* chore(db): squash application migrations

* fix(email): import React in auth template for server-side rendering compatibility

* chore(release): v5.2.1

* Refactor resume rendering and builder workflows

* fix: address application tracker review findings
2026-07-05 23:44:04 +02:00

122 lines
5.0 KiB
Plaintext

---
title: "Exporting your resume"
description: "Download your resume or cover letter from Reactive Resume as PDF, DOCX, Markdown, or JSON, and pick the right format for each situation."
---
Reactive Resume can export your resume, and your cover letter separately when you have one, in four formats.
| Format | Best for |
| --- | --- |
| **PDF** | Job applications, recruiter emails, printing, and public resume downloads. |
| **DOCX** | Further editing in Microsoft Word, Google Docs, or Pages. |
| **Markdown** | Plain-text edits and sharing structured content with AI tools. |
| **JSON** | Backups, restoring a resume later, or importing into another Reactive Resume account. |
## Open the download dialog
Every export runs from the same **Download** dialog. You can open it two ways.
<Steps>
<Step title="Open your resume in the builder">
Go to the dashboard and open the resume you want to export.
</Step>
<Step title="Click Download">
Select the **Download** button in the top-right of the builder header, next to the sidebar toggle. You can also open the same dialog from the **Export** section of the right sidebar.
</Step>
<Step title="Pick what to export">
At the top of the dialog, use the tabs to choose **Resume** or **Cover letter**. The **Cover letter** tab is only available when your resume contains a visible cover letter section.
</Step>
<Step title="Choose a format">
Select **Download** on the format you want. The dialog closes and your browser saves the file using the resume name as the filename.
</Step>
</Steps>
<Tip>
While an export is running, the trigger button and format buttons show a spinner and stay disabled until the file is ready.
</Tip>
## Export the resume and cover letter separately
If your resume includes a [cover letter section](/guides/adding-a-cover-letter), the download dialog treats the resume and cover letter as two distinct documents.
- The **Resume** tab exports only your resume content and excludes cover letter sections.
- The **Cover letter** tab exports only visible cover letter sections, rendered full width on their own page.
You no longer need to reorder pages or hide sections manually to produce a resume-only or cover-letter-only PDF. Select the tab that matches what you want, then pick a format.
<Info>
The **Cover letter** tab is disabled when the resume has no cover letter section, or when every cover letter section or item is hidden.
</Info>
## Export as PDF
Choose **PDF** when you need a file that preserves your resume layout.
Use PDF for:
- uploading to job applications;
- emailing recruiters or hiring managers;
- printing from your browser or a print service;
- sharing a finished copy outside Reactive Resume.
<Info>
The PDF is generated from your current resume data, template, typography, design, layout, and page settings.
</Info>
## Export as DOCX
Choose **DOCX** when you want to continue editing your resume or cover letter in a word processor.
Use DOCX for:
- making final manual edits in Microsoft Word;
- collaborating with someone who prefers Word or Google Docs;
- submitting to a system that requires a Word document.
<Warning>
DOCX exports are useful for editing, but the visual layout may not match the PDF exactly. Use PDF when exact visual fidelity matters.
</Warning>
## Export as Markdown
Choose **Markdown** when you want a plain-text version of your resume or cover letter that is easy to edit anywhere and easy to feed into AI tools.
Use Markdown for:
- pasting into an AI assistant to review, rewrite, or tailor content;
- quick edits in any text editor without formatting overhead;
- storing a lightweight, diff-friendly copy in version control.
Section headings, lists, links, and rich-text formatting from the builder are preserved as standard Markdown.
For examples and common workflows, see [Exporting a resume to Markdown](/guides/exporting-resume-to-markdown).
## Export as JSON
Choose **JSON** when you want a structured backup of your resume.
The JSON export includes your full resume content and settings. You can import it later from the dashboard to restore the resume or create another version.
JSON is also useful when working with AI assistants that understand structured data. Export JSON, ask an assistant to review or edit the fields, then import the revised JSON as a new resume.
<Info>
JSON export is only available on the **Resume** tab. Cover letters are exported through PDF, DOCX, or Markdown.
</Info>
<Warning>
Review AI-generated changes before importing or using them. AI assistants can make mistakes or add details that do not reflect your experience.
</Warning>
## Printing your resume
To print, export a **PDF** and print it from your PDF viewer or browser. This gives you the same layout that recruiters see when you send them the file.
## Public resume downloads
If your resume is public, visitors can download a PDF from the public resume page. You can enable public access in the builder's **Sharing** section.
For the full public sharing workflow, see [Sharing your resume publicly](/guides/sharing-your-resume-publicly).