docs: rewrite the documentation for v6

Rewrite every guide for the redesigned app, add guides for new features (documents, editor modes, check, cover letters, assistant, applications, self-hosting upgrade and environment reference), remove v5-only pages with redirects, and replace every screenshot.
This commit is contained in:
Amruth Pillai
2026-09-30 05:07:06 +02:00
parent 883045b14c
commit d46b4b5815
345 changed files with 8233 additions and 6387 deletions
+260 -215
View File
@@ -1,149 +1,236 @@
---
title: "Applying Custom Styles"
description: "Use Reactive Resume Semantic CSS to make safe, targeted, and portable changes to your resume PDF."
title: "Applying custom styles"
description: "Write CSS rules that change how your resume PDF looks: pick an element on the page, style it, and learn what the PDF engine supports."
---
Custom Styles let you make focused changes that are not available in the regular **Design**, **Typography**, **Layout**,
**Page**, and **Picture** settings. They use Semantic CSS, a CSS-like language designed for
resume PDFs.
Custom styles let you change details the Design controls don't cover, such as the color of one entry, the spacing
between skills, or a border under every section heading. You write them in a CSS-like language called Semantic CSS,
and they apply to the PDF: the page preview, PDF downloads, and your public resume. DOCX and Markdown exports
don't use them.
Try the regular **Design** controls first (template, type, color, page and layout). They cover most changes and keep
working when you switch templates. Reach for custom styles when you want something specific.
## Before you start
- Custom styles are per resume. Each resume has its own stylesheet.
- Nothing checks your CSS as you type. A rule the PDF can't use is skipped without a warning, and the rest still
applies. If you see no change on the page, the rule didn't apply. See [When a rule has no effect](#when-a-rule-has-no-effect).
- Custom styles can't add content, load fonts or images, or change what a section contains. They only restyle what's
already on the page.
## Open the stylesheet editor
<Steps>
<Step title="Switch to Design">
Open your resume and select **Design** at the top of the editor, or press <kbd>2</kbd> when you're not typing in a
field.
</Step>
<Step title="Open Advanced">
Select **Advanced** in the row of groups at the top of the Design panel. The Advanced group opens and scrolls into
view.
</Step>
<Step title="Find Custom Styles">
Scroll to **Custom Styles**, near the end of the Advanced group, just above **Reset to template defaults**.
</Step>
</Steps>
<Frame caption="The Custom Styles editor, at the end of Design → Advanced">
<img src="/images/guides/applying-custom-styles/custom-styles-editor.webp" alt="The Custom Styles heading with a toolbar of five icons (undo, redo, copy, format, focus mode), two hint lines, and an empty code editor" />
</Frame>
On a phone, Design opens as a sheet over the page. Select the **Page** tab, then select **Advanced** under the page
settings.
<Note>
Semantic CSS styles the PDF output, not the browser interface. It cannot load fonts, images, scripts, or other resources, and
it cannot create new resume content.
**Reset to template defaults** doesn't touch your custom styles. It resets the look (fonts, colors, spacing) and
keeps your stylesheet, paper size, language, date format and section layout.
</Note>
## Convert existing Custom Styles
## Style one section or entry
If a resume still uses the previous Custom Styles form, Reactive Resume creates a converted stylesheet draft. Your
current rules remain active while you review it.
The quickest way to start is to pick the thing you want to change on the page.
<Steps>
<Step title="Open Custom Styles">
Open the resume in the builder, select **Design**, then select **Custom Styles**.
<Step title="Click it on the page">
With the Custom Styles editor open, click the resume header, an entry (for example a job under Experience), or a
section without entries (such as Summary) on the page.
</Step>
<Step title="Review the converted draft">
Check the preview against the legacy result.
<Step title="Type your declarations">
The editor adds a rule for it at the end of your stylesheet, with a comment naming what you picked, and puts the
cursor inside the rule. Type the declarations you want, for example `color: #0f766e;`.
</Step>
<Step title="Activate Semantic CSS">
Select **Activate Semantic CSS** only after the preview matches the legacy result. Reactive Resume never applies both
systems at once, and keeps the original legacy rules available for rollback.
<Step title="Check the page">
The page updates as you type. While your cursor is inside a rule, everything the rule styles is outlined with a
dashed line on the page.
</Step>
</Steps>
## Make your first change
<Frame caption="Clicking the University of Washington entry added a rule for it; the dashed outline shows what the rule styles">
<img src="/images/guides/applying-custom-styles/pick-an-entry-on-the-page.webp" alt="The stylesheet editor with a rule for the Education entry University of Washington, and the same entry on the page shown in teal inside a dashed outline" />
</Frame>
Open the resume you want to style, select **Design**, then select **Custom Styles**. Start with a complete stylesheet:
A picked rule looks like this:
```css
section[type="experience"] > section-heading {
/* Education › University of Washington */
section[id="education"] item[id="019bef5a-93e4-7746-ad39-48455f6cef9e"] {
color: #0f766e;
text-transform: uppercase;
}
```
<Steps>
<Step title="Paste one focused rule">
Add the stylesheet to the editor. Start with one visual change so it is easy to review in the preview.
</Step>
<Step title="Check the preview">
The preview updates as you type. If nothing changes, the rule didn't apply; check the selector and property.
</Step>
<Step title="Build on the working rule">
Add one related change at a time. Your changes use the normal resume autosave and undo history.
</Step>
</Steps>
If the stylesheet already has a rule with that exact selector, clicking the element moves your cursor into the existing
rule instead of adding another one.
## Style one element
Rules made this way use the entry's ID, so they only affect that one entry in this resume. To style every entry of a
kind, use the section type instead (see [Target the right part of your resume](#target-the-right-part-of-your-resume)).
The quickest way to style a single section or entry is to pick it on the page:
## Find an entry by name
1. Open **Design → Advanced → Custom Styles**.
2. Click the section or entry on the page. The editor adds a rule for it, named in a comment, and puts the cursor
inside:
You can also add an entry's selector without clicking the page. Where a selector goes (outside any `{ }`), start
typing part of the entry's title, such as `Senior`. The suggestions include matching sections and entries, shown as
"Section › Entry". Choose one to insert its selector.
```css
/* Experience › Senior Game Developer */
section[id="experience"] item[id="019bef5a-93e4-7746-ad39-3a132360f823"] {
color: #0f766e;
}
```
<Frame caption="Typing “Senior” suggests the Senior Game Developer entry; choosing it inserts its selector">
<img src="/images/guides/applying-custom-styles/find-an-entry-by-name.webp" alt="Autocomplete suggestions under the word Senior, led by Experience › Senior Game Developer with its section and item selector" />
</Frame>
3. Type the declarations you want. Clicking an element that already has a rule moves the cursor into it.
Autocomplete also suggests element names and attributes in selectors, property names inside a rule, and values after
a colon, including your own variables and the read-only `--resume-*` variables. Press <kbd>Ctrl</kbd>
<kbd>Space</kbd> to open the suggestions without typing.
While the cursor is inside a rule, everything that rule styles is outlined on the page. You can also type part of an
entry's name (for example `Senior`) in a selector and pick it from the suggestions.
A few more editor helpers:
To style an entry by position instead, use `:nth-of-type`, which counts entries only:
- **Hover** an element name, property or `--resume-*` variable to see a short description.
- **Color swatches** appear after color values. Click one to pick a color from presets or a custom picker; the value
in your CSS changes with it.
- **Search** with <kbd>⌘</kbd> <kbd>F</kbd> (<kbd>Ctrl</kbd> <kbd>F</kbd> on Windows and Linux).
```css
/* The first experience entry */
section[type="experience"] item:nth-of-type(1) {
margin-bottom: 12pt;
}
```
## Use the editor toolbar
## Target the right part of your resume
Semantic CSS selectors describe resume content rather than a template's internal HTML. Selector and attribute names are
lowercase and case-sensitive. Prefer semantic selectors when you want a style to work across resumes and templates.
### Start with the resume structure
| Selector | Targets | Typical use |
| --- | --- | --- |
| `resume` | The complete resume | Scope a rule to one template. |
| `page` | A rendered PDF page | Set a page size. |
| `region` | Header, main, sidebar, or featured region | Style a layout area. |
| `header` | The resume header | Style the identity and contact area. |
| `section` | A resume section | Target a section type or placement. |
| `section-heading` | A section title | Change heading typography or decoration. |
| `section-items` | The items in a section | Adjust item layout and gaps. |
| `item` | One resume item | Control spacing or pagination for an experience, project, or similar item. |
| `item-header` | An item's summary row | Align the title, company, dates, or similar details. |
### Target header and item content
| Selector | Targets | Typical use |
| --- | --- | --- |
| `picture` | The profile picture | Change dimensions, crop, border, or picture shadow. |
| `name`, `headline` | Header name and headline | Change the main identity typography. |
| `contact-list`, `contact-item` | Header contact details | Space or restyle contact details. |
| `combined-text` | A template-combined value | Style an item value that combines fields. |
| `field` | A named content field | Target a position, company, date, or other field. |
| `link` | A structured link | Change linked text or layout. |
| `icon`, `level` | An icon or level indicator | Restyle decorative elements. |
### Target rich text and lists
| Selector | Targets |
| Button | What it does |
| --- | --- |
| `rich-text`, `rich-heading`, `blockquote`, `paragraph` | Rich-text blocks in descriptions and summaries. |
| `list`, `list-item`, `list-marker`, `list-item-content` | Lists, the outer item row, its bullet or number, and its content. |
| `strong`, `emphasis`, `underline`, `strike`, `code`, `text-span`, `mark` | Inline rich-text formatting. |
| `hard-break`, `horizontal-rule` | A forced line break or horizontal rule. |
| `template-part` | A template-provided extension point. Use only with a template guard. |
| **Undo stylesheet edit** / **Redo stylesheet edit** | Steps back or forward through your resume's changes. |
| **Copy stylesheet** | Copies the whole stylesheet to your clipboard. |
| **Format stylesheet** | Tidies indentation and spacing. |
| **Open focus mode** | Opens the editor in a larger side panel titled **Semantic CSS stylesheet**. Select **Exit focus mode** or close the panel to go back. |
Undo and redo in the stylesheet editor, including <kbd>⌘</kbd> <kbd>Z</kbd> and <kbd>⌘</kbd> <kbd>Shift</kbd>
<kbd>Z</kbd> while you type in it, use your resume's shared undo history. If your last change was somewhere else, such
as a template switch, undo reverses that first. See [Undoing changes and version history](/guides/undoing-changes-and-version-history).
Your stylesheet saves automatically with the rest of the resume, and it's part of every saved version in **History**.
## When a rule has no effect
There's no error list or validity checker. The PDF engine applies what it understands and skips the rest: an
unsupported declaration is skipped on its own, and a rule with an invalid selector is skipped as a whole. If a change
doesn't show:
1. **Check the selector matches something.** Put your cursor inside the rule. If nothing is outlined on the page, the
selector matches nothing. Check spelling (names are lowercase and case-sensitive), attribute values, and whether
the current template has that part.
2. **Check the property is supported** for that element. See the [properties](#properties) and
[engine limits](#engine-limits) below. For example, `background-color` works on containers such as `section` and
`header`, but not on text elements such as `field`.
3. **Simplify.** Reduce the rule to one selector and one declaration, confirm it works, then add more.
4. **Check the size.** A stylesheet larger than 128 KB, or with more than 1,024 rules, is ignored completely.
<Warning>
Check the downloaded PDF before you send or share a resume with custom styles. Page breaks and template-specific
details can make a rule look different from what you intended.
</Warning>
### Engine limits
The PDF engine accepts these without an error but doesn't draw them:
- Rotation (`transform: rotate(...)`). The picture's rotation setting has no effect for the same reason.
- Dashed and dotted borders. They draw as solid lines.
- Percentages for padding, margin, gaps and font sizes. Percentages work only for `width`, `height`, their `min-` and
`max-` forms, `flex-basis`, `left` and `right`.
- `z-index`, `max-lines`, `text-indent`, `vertical-align`, `object-position` and `-resume-min-presence-ahead`.
Two text limits apply whether or not you use custom styles: right-to-left lines are laid out left to right and then
aligned right, and characters outside the basic range, such as most emoji, don't draw.
## Copy styles to another resume
Section types, element names and field names work in any resume. Rules that use an entry's `id` only match that
entry, and template parts only exist in their template.
1. In the source resume, select **Copy stylesheet**.
2. In the other resume, open **Design → Advanced → Custom Styles** and paste.
3. Remove or rewrite rules with `item[id=...]` selectors, and template-part rules for a different template.
4. Check the page and the downloaded PDF.
## Reference
### Target the right part of your resume
Semantic CSS selectors describe resume content, not a template's internal layout. Element names and attribute names
are lowercase and case-sensitive.
**Resume structure**
| Element | Targets | Typical use |
| --- | --- | --- |
| `resume` | The whole resume | Scope a rule to one template. |
| `page` | One PDF page | Set a page size. |
| `region` | The header, main, sidebar or featured area of a page | Style a layout area. |
| `header` | The resume header | Style the name and contact area. |
| `section` | A section | Target a section type or placement. |
| `section-heading` | A section's title | Change heading type or add a rule under it. |
| `section-items` | The entries in a section | Adjust entry layout and gaps. |
| `item` | One entry | Space or keep together a job, project or similar entry. |
| `item-header` | An entry's top row | Align the title, company, dates or similar details. |
**Header and entry content**
| Element | Targets |
| --- | --- |
| `picture` | The profile picture. |
| `name`, `headline` | The name and headline in the header. |
| `contact-list`, `contact-item` | The contact details in the header. |
| `combined-text` | A value the template builds from several fields. |
| `field` | A named field, such as a position, company or date. |
| `link` | A link. |
| `icon`, `level` | An icon, or a skill or language level indicator. |
**Rich text and lists**
| Element | Targets |
| --- | --- |
| `rich-text`, `rich-heading`, `blockquote`, `paragraph` | Formatted text blocks in descriptions and the summary. |
| `list`, `list-item`, `list-marker`, `list-item-content` | A list, one list row, its bullet or number, and its text. |
| `strong`, `emphasis`, `underline`, `strike`, `code`, `text-span`, `mark` | Inline formatting. |
| `hard-break`, `horizontal-rule` | A line break or horizontal rule. |
| `template-part` | A template-specific detail. Always guard it with a template (see below). |
### Narrow a selector with attributes
Use attributes to make a rule specific without relying on a template layout.
| Attribute | Use it with | Example |
| --- | --- | --- |
| `type` | `section` | `section[type="experience"]` |
| `placement` | `region` and `section` | `region[placement="sidebar"]` |
| `region` | `region` | `region[region="sidebar"]` |
| `type` | `section`, `icon` | `section[type="experience"]` |
| `placement` | `region`, `section` | `region[placement="sidebar"]` |
| `region` | `region`, `header` | `region[region="featured"]` |
| `origin` | `section` | `section[origin="main"]` |
| `part` | `region`, `section`, `contact-item`, and `item-header` | `region[part~="sidebar-background"]` |
| `part` | `region`, `section`, `contact-item`, `item-header` | `region[part~="sidebar-background"]` |
| `template` | `resume` | `resume[template="azurill"]` |
| `name` | `field` and `template-part` | `field[name="position"]` |
| `name` | `field`, `contact-item`, `combined-text`, `template-part` | `field[name="position"]` |
| `level` | `rich-heading` | `rich-heading[level="2"]` |
| `direction` | `list-item-content` | `list-item-content[direction="rtl"]` |
| `id` | Any semantic node when present | `section[id="projects"]` |
| `role` | Any semantic node when present | `field[role~="secondary-text"]` |
| `page-number` | `page` | `page[page-number="1"]` |
| `id` | Any element that has one | `section[id="projects"]` |
| `role` | Any element with roles | `field[role~="secondary-text"]` |
Semantic CSS supports selector lists, descendant (` `), child (`>`), adjacent sibling (`+`), and general sibling (`~`)
combinators. It also supports `:root`, `:first-child`, `:last-child`, `:only-child`, `:is()`, `:where()`, `:not()`,
`:nth-child()`, and `:nth-of-type()`.
Attribute matchers `=`, `~=`, `^=` and `*=` are supported. `#projects` is shorthand for `[id="projects"]` when the ID
is a plain word (section IDs such as `experience` are; entry IDs aren't, so use `item[id="..."]`).
Selectors can be combined with commas, and with the descendant (space), child (`>`), next-sibling (`+`) and
later-sibling (`~`) combinators. Supported pseudo-classes: `:root`, `:first-child`, `:last-child`, `:only-child`,
`:nth-child()`, `:nth-of-type()`, `:is()`, `:where()` and `:not()`. `:nth-of-type` counts elements of the same kind,
so `item:nth-of-type(1)` is the first entry.
```css
section[type="experience"] > section-heading {
@@ -155,18 +242,15 @@ region[placement="sidebar"] {
padding: 18pt;
}
section[id="projects"] {
break-inside: avoid;
section[type="experience"] item:nth-of-type(1) {
margin-bottom: 12pt;
}
```
Use an exact `id` only for a resume-specific adjustment. A type, placement, role, or field name is usually a better
choice when you expect to copy the stylesheet to another resume.
### Reuse your Design settings
## Reuse your builder settings
Semantic CSS exposes the resolved builder settings as read-only `--resume-*` variables. Define your own variables in `:root`, then
reuse the builder values instead of duplicating colors or dimensions.
Your Design settings are available as read-only `--resume-*` variables. Define your own variables in `:root` and
reuse the resume's values, so your styles follow when you change a color or size in Design.
```css
:root {
@@ -177,41 +261,38 @@ reuse the builder values instead of duplicating colors or dimensions.
section-heading {
color: var(--accent);
border-bottom: 1pt solid var(--rule);
font-size: 11pt;
font-weight: 600;
letter-spacing: 0.4pt;
}
```
Changing the primary color or related setting in the builder updates the corresponding variable automatically. Do not
assign a value to a `--resume-*` variable; create an author variable such as `--accent` instead.
Don't assign a value to a `--resume-*` variable; create your own, such as `--accent`, instead.
| Builder setting | Read-only variables |
| Design setting | Read-only variables |
| --- | --- |
| Colors | `--resume-primary-color`, `--resume-text-color`, `--resume-background-color` |
| Typography | `--resume-body-font-size`, `--resume-body-line-height`, `--resume-heading-font-size`, `--resume-heading-line-height` |
| Type | `--resume-body-font-size`, `--resume-body-line-height`, `--resume-heading-font-size`, `--resume-heading-line-height` |
| Page and layout | `--resume-page-gap-x`, `--resume-page-gap-y`, `--resume-page-margin-x`, `--resume-page-margin-y`, `--resume-page-width`, `--resume-page-height`, `--resume-sidebar-width` |
| Picture | `--resume-picture-size`, `--resume-picture-rotation`, `--resume-picture-aspect-ratio`, `--resume-picture-border-radius`, `--resume-picture-border-width`, `--resume-picture-border-color`, `--resume-picture-shadow-width`, `--resume-picture-shadow-color` |
Use `pt` for predictable PDF spacing and type sizes. Semantic CSS also accepts `px`, `in`, `mm`, `cm`, `%`, `em`, and `rem`
where the property supports a length.
Use `pt` for predictable sizes in a PDF. Lengths also accept `px`, `in`, `mm`, `cm`, `em` and `rem`, and `%` where the
[engine limits](#engine-limits) allow it. `inherit` and `initial` work as values, and `!important` is respected.
## Style common resume content
### Properties
The most useful declarations usually fall into a few groups:
| Goal | Common declarations |
| Goal | Properties |
| --- | --- |
| Typography | `color`, `font-size`, `font-style`, `font-weight`, `letter-spacing`, `line-height`, `text-align`, `text-decoration`, `text-transform` |
| Spacing and layout | `margin`, `padding`, `gap`, `width`, `height`, `display`, `flex`, `flex-direction`, `justify-content`, `align-items`, `order` |
| Visual treatment | `background-color`, `border`, `border-radius`, `opacity`, `transform` |
| Picture treatment | `object-fit`, `object-position`, `-resume-shadow-color`, `-resume-shadow-width` |
| PDF structure | `break-before`, `break-inside`, `orphans`, `widows`, `-resume-min-presence-ahead`, `size` |
| Text | `color`, `font-size`, `font-style`, `font-weight`, `letter-spacing`, `line-height`, `text-align`, `text-decoration`, `text-transform`, `text-overflow`, `direction` |
| Spacing and size | `margin`, `padding` (and their side forms), `gap`, `row-gap`, `column-gap`, `width`, `height`, `min-width`, `max-width`, `min-height`, `max-height`, `aspect-ratio` |
| Layout | `display` (`flex` or `none`), `flex`, `flex-direction`, `flex-wrap`, `justify-content`, `align-items`, `align-self`, `order`, `position`, `top`, `right`, `bottom`, `left`, `overflow` |
| Look | `background-color`, `border` (and its side, width, style, color and radius forms), `opacity`, `transform`, `transform-origin` |
| Picture | `object-fit`, `-resume-shadow-color`, `-resume-shadow-width` |
| Page breaks | `break-before`, `break-inside`, `orphans`, `widows`, `size` (on `page` only) |
Use `display: none` only to hide an existing semantic node. Semantic CSS cannot add, remove, duplicate, or re-parent resume
data.
`background-color` and borders apply to container elements (such as `header`, `section`, `item`, `region`), not to
text elements. `display: none` hides an element that's already there; to remove content, hide it in **Write** instead,
so it's also left out of exports.
Semantic CSS keeps background styling PDF-safe. Use a flat color for headers and regions:
Backgrounds must be flat colors. Gradients such as `linear-gradient(...)` aren't supported:
```css
header {
@@ -219,13 +300,9 @@ header {
}
```
Gradient declarations such as `background-image: linear-gradient(...)` remain unsupported; use `background-color` instead.
An unsupported declaration is left out while the declarations around it still apply.
### Style common details
### Style rich-text lists
`list-item` is the outer row that holds a marker and its content. Use it for row layout and spacing. Use `list-marker`
for the bullet or number, and `list-item-content` for the text flow.
List rows, markers and text:
```css
rich-text list-item {
@@ -241,9 +318,7 @@ list-item-content {
}
```
### Space level indicators
Target `level` to adjust the space between a skill's circles, icons, or other level decorations:
Space between a skill's level icons (`gap` works too; `row-gap` doesn't change this single row):
```css
section[type="skills"] level {
@@ -251,13 +326,7 @@ section[type="skills"] level {
}
```
This sets a 4pt horizontal gap between decorations. `gap: 4pt` also works; `gap: 0` removes the gap.
`row-gap` does not change horizontal spacing within the single level row.
### Style fields inside an item
Named fields let you make a focused change without styling every item value. Use the selector only where that field
exists in the selected resume and template.
Named fields inside entries:
```css
section[type="experience"] field[name="position"] {
@@ -269,49 +338,18 @@ section[type="experience"] field[name="company"] {
}
```
## Use template-specific parts carefully
### Control page breaks and page size
Template parts expose optional visual details that are not shared by every template. Always guard a template-part rule
with `resume[template="..."]`; otherwise the selector may match nothing after a template change.
```css
resume[template="azurill"] template-part[name="timeline-line"] {
background-color: #94a3b8;
}
```
Some template parts are wrappers, while others are attributes on an existing semantic node. Use the matching selector
below.
| Template | Available selectors |
| --- | --- |
| Azurill | `template-part[name="timeline-content"]`, `template-part[name="timeline-dot"]`, `template-part[name="timeline-line"]`, `template-part[name="timeline-marker"]` |
| Bronzor | `section[part~="interleaved-section-row"]` |
| Chikorita | `template-part[name="contact-row-primary"]`, `template-part[name="contact-row-secondary"]` |
| Ditgar | `template-part[name="featured-summary"]`, `item-header[part~="item-header-border"]`, `region[part~="sidebar-background"]` |
| Ditto | `template-part[name="contact-offset"]`, `template-part[name="header-band"]`, `template-part[name="picture-anchor"]` |
| Gengar | `template-part[name="featured-summary"]`, `region[part~="sidebar-background"]` |
| Glalie | `region[part~="sidebar-background"]` |
| Leafish | `template-part[name="header-body"]`, `template-part[name="header-contact-band"]`, `template-part[name="header-intro"]` |
| Meowth | `template-part[name="education-grade-row"]`, `template-part[name="inline-item-header-leading"]`, `template-part[name="inline-item-header-middle"]`, `template-part[name="inline-item-header-trailing"]` |
| Pikachu | `template-part[name="header-divider"]` |
| Rhyhorn | `template-part[name="contact-item-content"]`, `contact-item[part~="contact-item-last"]` |
| Scizor | `template-part[name="header-name-rule"]` |
Kakuna, Lapras, and Onyx do not expose template-specific parts. Use shared semantic selectors for portable styles.
## Control pagination and PDF dimensions
Use structural declarations sparingly and review the exported PDF after each change. You can keep an item together,
leave space before a section, or set a custom page size.
Start a section on a new page, keep entries whole, or set a custom page size. Review the downloaded PDF after each
change.
```css
page {
size: 210mm 297mm;
}
section {
-resume-min-presence-ahead: 72pt;
section[type="projects"] {
break-before: page;
}
item {
@@ -319,8 +357,10 @@ item {
}
```
`size` applies only to `page` and must be outside `@media`. PDF media queries use the authored PDF dimensions, not the
browser viewport.
`size` takes `A4`, `letter`, or a width and height. It applies only to `page` and can't be inside `@media`.
`@media` queries use the PDF page's dimensions, not your browser window. Supported features are `width`, `min-width`,
`max-width`, `height`, `min-height`, `max-height` and `orientation` (`portrait` or `landscape`).
```css
@media (max-width: 600pt) {
@@ -330,41 +370,46 @@ browser viewport.
}
```
Supported media features are `width`, `min-width`, `max-width`, `height`, `min-height`, `max-height`, and
`orientation: portrait` or `orientation: landscape`.
### Template-specific parts
## Diagnose and recover safely
Some templates expose extra details that others don't have. Always guard these rules with `resume[template="..."]`, so
they don't apply by accident after a template change.
The editor saves whatever you write. Anything it can't apply (an unknown property, a value it doesn't accept, a selector
that doesn't parse) is left out, and everything else still appears in the preview and PDF export. If you see no change,
the rule didn't apply.
```css
resume[template="azurill"] template-part[name="timeline-line"] {
background-color: #94a3b8;
}
```
If a rule does not work:
| Template | Selectors |
| --- | --- |
| Azurill | `template-part[name="timeline-content"]`, `template-part[name="timeline-dot"]`, `template-part[name="timeline-line"]`, `template-part[name="timeline-marker"]` |
| Bronzor | `section[part~="interleaved-section-row"]` |
| Chikorita | `template-part[name="contact-row-primary"]`, `template-part[name="contact-row-secondary"]` |
| Ditgar | `template-part[name="featured-summary"]`, `item-header[part~="item-header-border"]`, `region[part~="sidebar-background"]` |
| Ditto | `template-part[name="contact-offset"]`, `template-part[name="header-band"]`, `template-part[name="picture-anchor"]` |
| Gengar | `template-part[name="featured-summary"]`, `region[part~="sidebar-background"]` |
| Glalie | `template-part[name="sidebar-background"]` |
| Leafish | `template-part[name="header-body"]`, `template-part[name="header-contact-band"]`, `template-part[name="header-intro"]` |
| Meowth | `template-part[name="education-grade-row"]`, `template-part[name="inline-item-header-leading"]`, `template-part[name="inline-item-header-middle"]`, `template-part[name="inline-item-header-trailing"]` |
| Pikachu | `template-part[name="header-divider"]` |
| Rhyhorn | `template-part[name="contact-item-content"]`, `contact-item[part~="contact-item-last"]` |
| Scizor | `template-part[name="header-name-rule"]` |
1. Check the selector's spelling, attribute value, placement, and template guard. A selector that matches nothing usually
means the resume does not contain that semantic node.
2. Simplify the rule to one selector and one declaration, then add more once it shows in the preview.
3. Use the stylesheet undo and redo controls to restore an earlier source.
Kakuna, Lapras and Onyx have no template-specific parts.
Select **Open focus mode** when you need a taller editor. On mobile, it opens a full-width sheet; switch to
**Preview** to inspect the result.
Every template also has `template-part[name="item-header-row"]`: the row with the title and date in Awards,
Certifications, Projects and Publications entries. It doesn't need a template guard.
<Warning>
Review the PDF preview before exporting or sharing a resume with Custom Styles. PDF pagination and template-specific
details can make a valid stylesheet look different from what you intended.
</Warning>
### Not supported
## Keep styles portable
Classes, pseudo-elements (`::before`, `::after`), CSS Grid, `@import`, `@font-face` and other at-rules except
`@media`, `url()` and any external file, gradients, general box shadows, filters, animations and transitions. Use the
Design controls for fonts, the picture and broader layout changes.
When you copy a stylesheet to another resume, semantic section types, placements, roles, and fields are the safest
starting point. Exact IDs and template parts are intentionally specific to a resume or template.
## Related guides
1. Select **Copy stylesheet** in the source resume.
2. Open **Design → Custom Styles** in the destination resume.
3. Paste the stylesheet.
4. Replace or remove exact IDs and template-part rules that do not apply.
5. Compare the preview and exported PDF.
Semantic CSS does not support classes, pseudo-elements, CSS Grid, arbitrary at-rules, `@import`, `@font-face`, `url()`,
browser APIs, animations, filters, gradients, general box shadows, or external assets. Use the normal builder settings
when you need a font, image, or broader layout change.
- [Choosing a template](/guides/choosing-a-template): a different template may get you most of the way without CSS.
- [Customizing typography](/guides/customizing-typography): fonts, sizes and line height from Design.
- [Arranging the layout](/guides/arranging-the-layout): columns, sidebar and page breaks without CSS.
- [Undoing changes and version history](/guides/undoing-changes-and-version-history): get back to a stylesheet that worked.
+5 -2
View File
@@ -1,13 +1,14 @@
---
title: Sponsors
description: "The sponsors whose support funds ongoing development and hosting of Reactive Resume."
description: "The sponsors whose support funds ongoing development and hosting of Reactive Resume, and how you or your company can sponsor the project."
---
Sponsors pay for hosting, maintenance, and ongoing development, which is what keeps Reactive Resume free and independent. Thank you to everyone who chips in.
## Atlas Cloud
<img src="/images/sponsors/atlas-cloud-logo-white.svg" alt="Atlas Cloud" width="360" />
<img src="/images/sponsors/atlas-cloud-logo-black.svg" alt="Atlas Cloud" width="360" className="block dark:hidden" />
<img src="/images/sponsors/atlas-cloud-logo-white.svg" alt="Atlas Cloud" width="360" className="hidden dark:block" />
[Atlas Cloud](https://www.atlascloud.ai/?utm_source=github&utm_medium=link&utm_campaign=reactive-resume) supports Reactive Resume as a project sponsor. Atlas Cloud provides a unified AI platform for developers, with access to hundreds of models for chat, image generation, video generation, media processing, and GPU cloud workloads through one API key, one endpoint, and one billing account.
@@ -15,4 +16,6 @@ Learn more at [atlascloud.ai](https://www.atlascloud.ai/?utm_source=github&utm_m
## Sponsor Reactive Resume
If Reactive Resume has helped you, you can support its development through [GitHub Sponsors](https://github.com/sponsors/AmruthPillai) or [Open Collective](https://opencollective.com/reactive-resume/donate).
If your company would like to sponsor Reactive Resume, email [hello@amruthpillai.com](mailto:hello@amruthpillai.com).
@@ -12,8 +12,8 @@ Adobe Express has a resume maker inside a general creative editor. Reactive Resu
| Consideration | Reactive Resume | Adobe Express |
| --- | --- | --- |
| Primary workflow | Resume-specific fields and templates | General visual editing with resume templates |
| Editing scope | Resume layout, typography, colors, spacing, and sections | Document, image, layout, and graphic editing |
| Exports | PDF, DOCX, Markdown, and Reactive Resume JSON | Resume creation and export options in Adobe Express |
| Editing scope | 15 resume templates, typography, accent colour, page layout, and sections | Document, image, layout, and graphic editing |
| Exports | PDF, Word (DOCX), Markdown, and Reactive Resume JSON | Resume creation and export options in Adobe Express |
| Content reuse | Structured data can be reused across resume versions | Reuse designs and assets in the Adobe Express workflow |
| Deployment | Hosted use or self-hosting under an MIT license | Adobe-hosted service |
| Free plan | Core hosted resume workflow has no premium tier | Free-plan features and asset access have defined limits |
@@ -28,7 +28,7 @@ The wider editor is the real advantage. It handles work that falls outside a res
## Where Reactive Resume is a better fit
Use Reactive Resume when work history and other sections should stay structured rather than sit on the page as arranged elements. That makes it easier to prepare targeted versions, switch templates, or keep a data backup next to your document exports. The [exporting guide](/guides/exporting-your-resume) covers PDF, DOCX, Markdown, and JSON.
Use Reactive Resume when work history and other sections should stay structured rather than sit on the page as arranged elements. That makes it easier to copy a resume for each job, switch templates, write a matching cover letter that reuses the resume's design, or keep a data backup next to your document exports. The [exporting guide](/guides/exporting-your-resume) covers PDF, DOCX, Markdown, and JSON.
There are also options beyond the hosted app. The project is [open source](/use-cases/open-source-resume-builder) under MIT and supports [self-hosting](/use-cases/self-hosted-resume-builder). Those only matter if you need them; for a single visual document, Adobe Express is the more direct editor.
@@ -12,8 +12,8 @@ Both tools make resumes, but they start from different models. Canva is a genera
| Consideration | Reactive Resume | Canva |
| --- | --- | --- |
| Primary workflow | Structured resume sections with a live preview | Freeform visual editing across many design types |
| Design controls | Resume templates, colors, typography, layout, and spacing | Flexible composition, elements, and a broad design library |
| Exports | PDF, DOCX, Markdown, and Reactive Resume JSON | See Canva's export options and template terms |
| Design controls | 15 resume templates, font pairings or about 500 fonts, accent colour, density, margins, and custom CSS | Flexible composition, elements, and a broad design library |
| Exports | PDF, Word (DOCX), Markdown, and Reactive Resume JSON | See Canva's export options and template terms |
| Data portability | JSON export can back up or restore a resume | Depends on the design and export format you choose |
| Deployment | Hosted use or self-hosting under the MIT license | Canva-hosted service |
| Plan boundary | The hosted core resume workflow has no premium tier | Some Canva content and features have plan-specific availability |
@@ -28,7 +28,7 @@ Canva is also the convenient option when you are preparing related design materi
## Where Reactive Resume is a better fit
Choose Reactive Resume when the content should stay in recognizable resume fields and you expect to reuse it across versions. You can change a template without re-entering the underlying sections, adjust resume layout settings, and export in several document and data formats.
Choose Reactive Resume when the content should stay in recognizable resume fields and you expect to reuse it across versions. You can change between 15 templates without re-entering the underlying sections, adjust layout settings, and export in several document and data formats. Cover letters are their own documents that share the resume's design, and Check mode flags lines that applicant tracking systems may read poorly.
It also fits when you care about infrastructure. Reactive Resume is [MIT-licensed](/legal/license), its source is public, and you can deploy it yourself. The [self-hosting guide](/self-hosting/docker) covers the Docker path, and hosted use stays available if you would rather not run the service.
@@ -9,15 +9,15 @@ CareerCircle puts resume drafting next to job listings, courses, and professiona
| Consideration | Reactive Resume | CareerCircle |
| --- | --- | --- |
| Resume workflow | Structured resume editor with reusable versions | Resume builder within a career-services platform |
| Downloads | PDF, DOCX, Markdown, and JSON | PDF and Microsoft Word downloads |
| Writing support | Direct editing and optional AI | Guidance and tips from staffing experts |
| Career services | Resume and application tools | Jobs, courses, and professional-development resources |
| Account | An account stores resume versions | Sign-up is required to use the service |
| Resume workflow | Structured resume and cover-letter editor with a copy per job | Resume builder within a career-services platform |
| Downloads | PDF, Word (DOCX), Markdown, and JSON | PDF and Microsoft Word downloads |
| Writing support | Direct editing, Check mode, and an optional AI assistant using your own provider | Guidance and tips from staffing experts |
| Career services | Job application tracker with board, calendar, and insights views; no job listings or courses | Jobs, courses, and professional-development resources |
| Account | An account stores your documents and applications | Sign-up is required to use the service |
CareerCircle documents PDF and Microsoft Word downloads from its resume builder. It puts staffing-expert guidance, job search, courses, and professional-development resources in the same service.
Reactive Resume supports [PDF, DOCX, Markdown, and JSON exports](/guides/exporting-your-resume), and its [dashboard](/guides/managing-resumes-from-the-dashboard) keeps separate resume versions. Its source is public under the [MIT license](/legal/license), with a Docker self-hosting path.
Reactive Resume supports [PDF, DOCX, Markdown, and JSON exports](/guides/exporting-your-resume), and its [Documents page](/guides/managing-documents) keeps your resumes and cover letters side by side. Its [application tracker](/guides/tracking-job-applications) follows each job from saved to offer. Its source is public under the [MIT license](/legal/license), with a Docker self-hosting path.
## Where CareerCircle is a better fit
@@ -25,7 +25,7 @@ Choose CareerCircle when you want the resume builder connected to job search, co
## Where Reactive Resume is a better fit
Pick Reactive Resume to keep several resume versions and export them in document or data formats. You can also run the software yourself; see the [self-hosting guide](/self-hosting/docker).
Pick Reactive Resume to keep a resume for each job, track where you applied, and export in document or data formats. You can also run the software yourself; see the [self-hosting guide](/self-hosting/docker).
## Which should you choose?
@@ -33,7 +33,7 @@ Choose CareerCircle for a sign-up-based career service with its resume builder,
## Reactive Resume limitations in this comparison
Reactive Resume has none of CareerCircle's course, job, and community services. If those resources should sit alongside the resume workflow, CareerCircle is the closer fit.
Reactive Resume has none of CareerCircle's course, job-listing, and community services. Its tracker records jobs you find elsewhere; it does not find jobs for you. If those resources should sit alongside the resume workflow, CareerCircle is the closer fit.
## Sources
@@ -9,15 +9,15 @@ Freesumes is built for making one resume in a browser session, without an accoun
| Consideration | Reactive Resume | Freesumes |
| --- | --- | --- |
| Account | Account-backed resume management | No account or credit card for the builder |
| Builder templates | Select a template for each saved resume | Six current builder templates |
| Account | Account-backed resumes, cover letters, and applications | No account or credit card for the builder |
| Builder templates | 15 templates; switch at any time without retyping | Six current builder templates |
| PDF | PDF export | PDF download |
| Other template formats | DOCX, Markdown, and JSON exports | Separate Word and Google Docs templates |
| Other template formats | Word (DOCX), Markdown, and JSON exports | Separate Word and Google Docs templates |
| Data handling | Resumes persist in the account and server storage | Builder data is wiped when the tab is refreshed or closed |
Freesumes documents a no-account, no-card builder with six templates and PDF output. It offers Word and Google Docs templates separately. Its builder says it does not collect or store what you enter, and that the data is wiped when you refresh or close the browser tab.
Reactive Resume keeps resume versions in its [dashboard](/guides/managing-resumes-from-the-dashboard), with [PDF, DOCX, Markdown, and JSON exports](/guides/exporting-your-resume). It can also [share resumes](/use-cases/export-and-share-resumes) and run API or MCP automation.
Reactive Resume keeps your resumes and cover letters on its [Documents page](/guides/managing-documents), with [PDF, DOCX, Markdown, and JSON exports](/guides/exporting-your-resume). It can also [share resumes](/use-cases/export-and-share-resumes) through password-protected links, track job applications, and run API or MCP automation.
## Where Freesumes is a better fit
@@ -25,7 +25,7 @@ Choose Freesumes for a one-off browser session without an account or card, if yo
## Where Reactive Resume is a better fit
Reactive Resume holds on to your resume versions so you can share them or export them in several formats. It can also be self-hosted; see the [Docker guide](/self-hosting/docker).
Reactive Resume holds on to your resumes, with version history, so you can come back to them, share them, or export them in several formats. It can also be self-hosted; see the [Docker guide](/self-hosting/docker).
## Which should you choose?
@@ -33,7 +33,7 @@ Choose Freesumes for a no-account, browser-session PDF workflow or its separate
## Reactive Resume limitations in this comparison
Reactive Resume needs an account and stores resumes on the server. That is a drawback if you want a one-off local browser session where the builder data disappears on refresh or close.
Reactive Resume's editor needs an account and stores resumes on the server. That is a drawback if you want a one-off local browser session where the builder data disappears on refresh or close. Only its public [ATS checker](/guides/using-the-ats-checker) works without an account, and it checks an existing PDF rather than building one.
## Sources
@@ -3,20 +3,20 @@ title: "Reactive Resume vs Jobscan"
description: "Compare Reactive Resume and Jobscan by free PDF creation, ATS parse checking, job matching, exports, open source, and automation."
---
Jobscan makes sense when your workflow revolves around its hosted resume scanner and the match rate it reports against a job description. Reactive Resume gives you structured resume data, several export formats, open-source deployment, and API or MCP automation, plus a free ATS checker that measures how well your file parses rather than predicting an outcome.
Jobscan makes sense when your workflow revolves around its hosted resume scanner and the match rate it reports against a job description. Reactive Resume gives you structured resume data, several export formats, open-source deployment, and API or MCP automation, plus free checks that measure how well your file parses rather than predicting an outcome.
## Quick comparison
| Consideration | Reactive Resume | Jobscan |
| --- | --- | --- |
| Resume creation | Structured editor with PDF, DOCX, Markdown, and JSON exports | Free builder with nine current templates and PDF download |
| Import | Supported resume imports | Existing-resume and LinkedIn import |
| Analysis | Built-in ATS checker, free: a parse-quality score, a pass/warn/fail checklist, and optional job-description keyword coverage, all computed in your browser | Separate resume scanner producing a match rate against a job description |
| Automation | Authenticated API and MCP workflows | Separate scanner workflow |
| Resume creation | Structured editor with 15 templates and PDF, Word (DOCX), Markdown, and JSON exports | Free builder with nine current templates and PDF download |
| Import | PDF, Word (with your own AI provider), LinkedIn data export, JSON Resume, and Reactive Resume files | Existing-resume and LinkedIn import |
| Analysis | Free, in two places: Check mode in the editor (readability score, issues pinned to lines, posting terms you have and lack) and a public ATS checker that reads a PDF in your browser | Separate resume scanner producing a match rate against a job description |
| Automation | Authenticated API and MCP workflows, including job applications | Separate scanner workflow |
Jobscan's builder documents a free PDF-creation workflow, LinkedIn import, and nine ATS-friendly templates. Its separate scanner lists resume scoring, formatting checks, and job-listing analysis as product features. Those are vendor claims about the product, not guarantees about ATS handling or hiring outcomes.
Reactive Resume exports PDF, DOCX, Markdown, and JSON, and it supports authenticated automation through its API and MCP server. Its [ATS checker](/guides/using-the-ats-checker) scores how faithfully software can extract your PDF and lists which of a posting's terms already appear in it. It reports no match rate and predicts no rejection, because neither is knowable from the file.
Reactive Resume exports PDF, DOCX, Markdown, and JSON, and it supports authenticated automation through its API and MCP server. Its public [ATS checker](/guides/using-the-ats-checker) scores how faithfully software can extract your PDF, shows the text as software reads it, and lists which of a posting's terms already appear in it. Inside the editor, [Check mode](/guides/checking-your-resume) runs the same kind of checks live as you type, pins each issue to its line on the page, and matches your resume against the posting saved with a job application. Neither reports a match rate or predicts a rejection, because neither is knowable from the file.
## Where Jobscan is a better fit
@@ -24,7 +24,7 @@ Choose Jobscan when a match rate against a specific posting, and the recommendat
## Where Reactive Resume is a better fit
Reactive Resume is the better choice when you want to own structured resume data, pick a template, export in several formats, or automate authenticated resume workflows. Its API and MCP server support scripts, integrations, and compatible AI clients.
Reactive Resume is the better choice when you want to own structured resume data, pick a template, fix issues where they appear on the page, track your applications, export in several formats, or automate authenticated resume workflows. Its API and MCP server support scripts, integrations, and compatible AI clients.
## Which should you choose?
@@ -32,13 +32,14 @@ Choose Jobscan when a match rate against each posting is your primary need. Choo
## Reactive Resume limitations in this comparison
Reactive Resume's ATS checker measures file properties: whether the text extracts, in what order, and whether your facts survive. It produces no match rate against a posting and makes no claim about predicting a rejection. If you want a documented match-rate score, Jobscan is the more direct fit.
Reactive Resume's checks measure file properties: whether the text extracts, in what order, and whether your facts survive. Job match lists which posting terms you have and lack, but produces no match rate and makes no claim about predicting a rejection. If you want a documented match-rate score, Jobscan is the more direct fit.
## Sources
- [Jobscan resume builder](https://www.jobscan.co/resume-builder)
- [Jobscan resume scanner](https://www.jobscan.co/resume-scanner)
- [Reactive Resume: using the ATS checker](/guides/using-the-ats-checker)
- [Reactive Resume: checking your resume](/guides/checking-your-resume)
- [Reactive Resume: exporting your resume](/guides/exporting-your-resume)
- [Reactive Resume: using the API](/guides/using-the-api)
- [Reactive Resume: using the MCP server](/guides/using-the-mcp-server)
@@ -9,15 +9,15 @@ Kickresume bundles AI writing, imports, examples, and related career documents i
| Consideration | Reactive Resume | Kickresume |
| --- | --- | --- |
| AI | Optional; connect and configure your own provider | Integrated AI writing and rewriting tools |
| Content help | Direct editing and AI assistance after provider setup | Examples, guides, and AI-generated drafts |
| Imports | Supported resume imports | LinkedIn and PDF/DOCX import paths |
| Documents | Resume-focused exports and versions | Resumes, cover letters, websites, and related tools |
| AI | Optional assistant that proposes edits you accept one by one; connect your own provider | Integrated AI writing and rewriting tools |
| Content help | Direct editing, Check mode issues, and AI assistance after provider setup | Examples, guides, and AI-generated drafts |
| Imports | PDF, Word (with your own AI provider), LinkedIn data export, JSON Resume, and Reactive Resume files | LinkedIn and PDF/DOCX import paths |
| Documents | Resumes and cover letters, a copy per job, and a job application tracker | Resumes, cover letters, websites, and related tools |
| Free plan | Core hosted workflow has no premium tier | Unlimited documents and downloads when using free customization options |
Kickresume's help center documents AI writing, LinkedIn import, PDF import, examples, guides, and cover-letter and website workflows. Its free-plan FAQ says documents and downloads are unlimited when you use free customization options; premium-marked options fall outside that.
Reactive Resume exports PDF, DOCX, Markdown, and JSON. Its AI stays optional: you connect a provider, a model, an endpoint when one is needed, and an API key. The provider may charge you separately.
Reactive Resume exports PDF, DOCX, Markdown, and JSON, and cover letters are separate documents that share the resume's design. Its AI stays optional: you connect a provider, a model, an endpoint when one is needed, and an API key. The provider may charge you separately.
## Where Kickresume is a better fit
@@ -25,7 +25,7 @@ Choose Kickresume when you want prewritten examples, guided prompts, built-in AI
## Where Reactive Resume is a better fit
Reactive Resume is the better choice when you want AI to stay optional and want to pick the provider that handles your resume content. It is open source, can be self-hosted, and has API and MCP workflows for authenticated automation.
Reactive Resume is the better choice when you want AI to stay optional and want to pick the provider that handles your resume content. It is open source, can be self-hosted, tracks your job applications, and has API and MCP workflows for authenticated automation.
## Which should you choose?
@@ -33,7 +33,7 @@ Choose Kickresume for a bundled writing, examples, and career-document workflow.
## Reactive Resume limitations in this comparison
Reactive Resume has a smaller built-in library of content examples and needs provider setup before its AI features work. It does not bundle Kickresume's wider guided career-document workflow.
Reactive Resume has a smaller built-in library of content examples and needs provider setup before its AI features work. Beyond resumes and cover letters, it does not bundle Kickresume's wider guided career-document workflow, such as personal websites.
## Sources
@@ -3,20 +3,20 @@ title: "Reactive Resume vs LiveCareer"
description: "Compare Reactive Resume and LiveCareer by free downloads, guided content, resume checks, templates, open source, and self-hosting."
---
LiveCareer gives you ready-made content, spell-checking, writing tips, and ResumeCheck while you draft. Reactive Resume has no built-in checker; it gives you PDF or DOCX export and access to the source.
LiveCareer gives you ready-made content, spell-checking, writing tips, and ResumeCheck while you draft. Reactive Resume gives you free PDF or DOCX export, a built-in Check mode, and access to the source.
## Quick comparison
| Consideration | Reactive Resume | LiveCareer |
| --- | --- | --- |
| Free download | PDF, DOCX, Markdown, and JSON | TXT |
| Free download | PDF, Word (DOCX), Markdown, and JSON | TXT |
| PDF and Word | Included export formats | Require premium access for unlimited downloads |
| Drafting support | Direct editing and optional AI | Ready-made content, spell-checking, and writing tips |
| Resume review | No native checker product | ResumeCheck identifies common issues |
| Drafting support | Direct editing and an optional AI assistant using your own provider | Ready-made content, spell-checking, and writing tips |
| Resume review | Check mode: readability score, issues pinned to lines, and job-posting terms | ResumeCheck identifies common issues |
LiveCareer documents TXT as the free builder's download format, and unlimited PDF and Word downloads under premium access. The product also documents ready-made content, spell-checking, writing tips, and ResumeCheck.
Reactive Resume supports [PDF, DOCX, Markdown, and JSON exports](/guides/exporting-your-resume). Its [AI workflow](/guides/using-ai) is optional and provider-configured, and its source is public under the [MIT license](/legal/license).
Reactive Resume supports [PDF, DOCX, Markdown, and JSON exports](/guides/exporting-your-resume). Its [Check mode](/guides/checking-your-resume) flags issues as you edit, its [AI features](/guides/using-ai) are optional and provider-configured, and its source is public under the [MIT license](/legal/license).
## Where LiveCareer is a better fit
@@ -32,7 +32,7 @@ Choose LiveCareer when its guided content and checker suit how you draft and TXT
## Reactive Resume limitations in this comparison
Reactive Resume has a smaller guided-content and checker surface. It has no equivalent to LiveCareer's ready-made content, spell-checking, writing tips, or its ResumeCheck product.
Reactive Resume has a smaller guided-content surface. It has no equivalent to LiveCareer's ready-made content library or writing tips, and its Check mode focuses on how software reads your resume rather than spelling. An AI writing review is available only after you connect your own provider.
## Sources
@@ -3,7 +3,7 @@ title: "Reactive Resume vs MyPerfectResume"
description: "Compare Reactive Resume and MyPerfectResume by free downloads, writing guidance, templates, AI, open source, and self-hosting."
---
MyPerfectResume is built around guided writing: step-by-step prompts, expert-written content suggestions, and a resume checker. Reactive Resume is an open-source editor whose core hosted workflow has no premium tier and includes PDF, DOCX, Markdown, and JSON exports, but it has no equivalent content library or specialized checker.
MyPerfectResume is built around guided writing: step-by-step prompts, expert-written content suggestions, and a resume checker. Reactive Resume is an open-source editor whose core hosted workflow has no premium tier and includes PDF, DOCX, Markdown, and JSON exports and a built-in Check mode, but it has no equivalent library of prewritten content.
## Quick comparison
@@ -11,8 +11,8 @@ MyPerfectResume is built around guided writing: step-by-step prompts, expert-wri
| --- | --- | --- |
| Free final download | PDF, DOCX, Markdown, and JSON | Plain-text TXT |
| Designed PDF and Word | Included exports | Require premium access |
| Writing help | Direct editing; optional provider-configured AI | Step-by-step prompts, tips, and content suggestions |
| Checking tools | No equivalent specialized checker | ResumeCheck feedback is listed with premium access |
| Writing help | Direct editing; optional AI assistant using your own provider | Step-by-step prompts, tips, and content suggestions |
| Checking tools | Free Check mode (contact details, dates, layout, headings, job-posting terms) and a public ATS checker | ResumeCheck feedback is listed with premium access |
| Deployment | Hosted use or self-hosting | Hosted service |
MyPerfectResume's free-builder guide says free accounts get tailored content suggestions, expert tips, and unlimited plain-text downloads, and that PDF or Word template downloads need a premium plan. Its pricing page lists TXT downloads with basic access and puts PDF, Word, and ResumeCheck behind premium access.
@@ -27,19 +27,19 @@ Its cover-letter workflow is another reason to pick it if you want guided relate
## Where Reactive Resume is a better fit
Reactive Resume fits when you have the content and want a designed export without picking a premium plan. Make your template and layout choices in the editor, then export a PDF or DOCX for document use, Markdown for text workflows, or JSON for a backup that keeps the structured resume data. The [template selection guide](/guides/choosing-a-template) covers the template workflow.
Reactive Resume fits when you have the content and want a designed export without picking a premium plan. Make your template and layout choices in the editor, fix what Check mode flags, then export a PDF or DOCX for document use, Markdown for text workflows, or JSON for a backup that keeps the structured resume data. A matching cover letter is its own document that reuses the resume's design, with the same free downloads. The [template selection guide](/guides/choosing-a-template) covers the template workflow.
You also get control over the application itself. Reactive Resume is [MIT-licensed](/legal/license), its source is public, and you can self-host it. The hosted service stays available if you would rather not run the stack.
## Which should you choose?
Choose MyPerfectResume if you want prompts, prewritten suggestions, and a dedicated resume-checking tool while you draft. Choose Reactive Resume if you already have the content and want designed exports, portable JSON, or the option to run the software yourself.
Choose MyPerfectResume if you want prompts, prewritten suggestions, and its resume-checking tool while you draft. Choose Reactive Resume if you already have the content and want designed exports, portable JSON, or the option to run the software yourself.
Neither choice promises an application outcome. The question is whether guided content and checking tools are worth a paid workflow for formatted downloads.
## Reactive Resume limitations in this comparison
Reactive Resume has no equivalent library of role-specific prewritten bullets, no step-by-step writing prompts, and no specialized resume checker. Its optional AI integration asks you to configure a provider and review whatever it suggests. If you want a hosted product that supplies the drafting prompts and the feedback in one place, MyPerfectResume has the broader built-in writing surface.
Reactive Resume has no equivalent library of role-specific prewritten bullets and no step-by-step writing prompts. Its Check mode looks at how software reads your resume, not at what you should write. Its optional AI assistant asks you to configure a provider and review whatever it suggests. If you want a hosted product that supplies the drafting prompts and the feedback in one place, MyPerfectResume has the broader built-in writing surface.
## Sources
@@ -9,14 +9,14 @@ Novorésumé is the stronger choice when guided design, writing advice, a conten
| Consideration | Reactive Resume | Novorésumé |
| --- | --- | --- |
| Saved resumes | Manage separate resume versions | Basic permits one document |
| Document length | Use the length your content requires | Basic permits one page; Premium permits longer documents |
| Drafting support | Direct editing and optional AI | Guided design, writing advice, content library, and integrated assistant |
| Exports | PDF, DOCX, Markdown, and JSON | See Novorésumé plan and export options |
| Saved resumes | Unlimited resumes and cover letters | Basic permits one document |
| Document length | As many pages as your content requires | Basic permits one page; Premium permits longer documents |
| Drafting support | Direct editing, Check mode, and an optional AI assistant using your own provider | Guided design, writing advice, content library, and integrated assistant |
| Exports | PDF, Word (DOCX), Markdown, and JSON | See Novorésumé plan and export options |
Novorésumé's current Basic plan permits exactly one document, capped at one page. Its Premium plan lists 72 documents and documents up to 10 pages. The product also documents templates, a content library, real-time advice, and an integrated assistant.
Reactive Resume keeps resume versions in the [dashboard](/guides/managing-resumes-from-the-dashboard) and supports [PDF, DOCX, Markdown, and JSON exports](/guides/exporting-your-resume). Its source is public under the [MIT license](/legal/license), and it runs with Docker.
Reactive Resume keeps your resumes and cover letters on its [Documents page](/guides/managing-documents), offers 15 templates, and supports [PDF, DOCX, Markdown, and JSON exports](/guides/exporting-your-resume). Its source is public under the [MIT license](/legal/license), and it runs with Docker.
## Where Novorésumé is a better fit
@@ -32,7 +32,7 @@ Choose Novorésumé when its guided drafting tools come first and its Basic or P
## Reactive Resume limitations in this comparison
Reactive Resume has a smaller guidance and content surface. It has no equivalent to Novorésumé's content library and assistant inside a guided drafting workflow.
Reactive Resume has a smaller guidance and content surface. It has no equivalent to Novorésumé's content library or guided drafting workflow, and its AI assistant works only after you connect your own provider.
## Sources
@@ -12,10 +12,10 @@ The two products use different authoring models. Overleaf is an online LaTeX edi
| Consideration | Reactive Resume | Overleaf |
| --- | --- | --- |
| Primary workflow | Visual resume editing with structured sections | LaTeX source editing and compilation |
| Template model | Built-in resume templates and layout settings | Community CV and resume LaTeX templates |
| Template model | 15 built-in resume templates with font, colour, and layout settings | Community CV and resume LaTeX templates |
| Source control | Resume JSON export, not LaTeX source | Direct editing of LaTeX project files |
| Collaboration | Resume sharing and export workflow | Project collaboration with plan-dependent limits |
| Output | PDF, DOCX, Markdown, and Reactive Resume JSON | Compiled document PDFs and project source |
| Collaboration | No shared editing; public links with optional password for readers | Project collaboration with plan-dependent limits |
| Output | PDF, Word (DOCX), Markdown, and Reactive Resume JSON | Compiled document PDFs and project source |
| Free plan | Core hosted resume workflow has no premium tier | Free plan has documented collaboration and compile limits |
Overleaf's [CV and résumé gallery](https://www.overleaf.com/latex/templates/tagged/cv) collects community templates, and its [plans documentation](https://docs.overleaf.com/getting-started/free-and-premium-plans) explains the differences between free and paid accounts. Reactive Resume keeps the task narrower: enter resume content, pick a template, tune its settings, and export the result.
@@ -28,7 +28,7 @@ Overleaf also has a document-collaboration workflow. Its plan pages describe col
## Where Reactive Resume is a better fit
Use Reactive Resume if you prefer a visual editor and do not want to maintain LaTeX source. It keeps common resume content in fields for profile details, experience, education, skills, projects, and other sections, then shows the result in a live preview. You can switch templates and adjust resume layout settings without touching a document class or a compilation config.
Use Reactive Resume if you prefer a visual editor and do not want to maintain LaTeX source. It keeps common resume content in fields for profile details, experience, education, skills, projects, and other sections, then shows the result in a live preview. You can switch templates, fix layout issues that Check mode points out on the page, and adjust layout settings without touching a document class or a compilation config. For finer control, you can add your own CSS under **Advanced** in Design mode.
Reactive Resume also has [PDF, DOCX, Markdown, and JSON exports](/guides/exporting-your-resume). The JSON export preserves resume content and settings so you can restore it later or branch another version. If you need to run the software on your own infrastructure, the project is [MIT-licensed](/legal/license) and [self-hostable](/self-hosting/docker).
@@ -9,9 +9,9 @@ Reactive Resume and Resume.com both let you create and download a PDF resume wit
| Consideration | Reactive Resume | Resume.com |
| --- | --- | --- |
| Free final download | PDF, DOCX, Markdown, and JSON | PDF and plain text |
| Free final download | PDF, Word (DOCX), Markdown, and JSON | PDF and plain text |
| Accounts | Account required for the hosted builder and saved resume management | An email is requested to save work in the dashboard |
| Workflow | Structured sections, template settings, and live preview | Hosted builder with templates and saved resumes |
| Workflow | Structured sections, 15 templates, live preview, and Check mode | Hosted builder with templates and saved resumes |
The common ground here is the download boundary. Resume.com says its builder has no paid membership tier and that PDF and plain-text downloads are free. Reactive Resume is not a cheaper way to get a Resume.com PDF: both produce one without a premium upgrade.
@@ -25,7 +25,7 @@ That is the less technical choice if you only need a browser-based editor and a
## Where Reactive Resume is a better fit
Reactive Resume fits when the resume should stay portable as data as well as a document. The editor keeps sections separate from templates, so changing a template does not mean re-entering your work history or education.
Reactive Resume fits when the resume should stay portable as data as well as a document. The editor keeps sections separate from templates, so changing a template does not mean re-entering your work history or education. Cover letters, a job application tracker, and version history sit in the same account.
Deployment is your call too. Use the hosted product, read the source, or run it on your own infrastructure. For programmatic access, Reactive Resume exposes [MCP tools](/guides/using-the-mcp-server) and API capabilities. AI assistance is optional and uses a provider you configure; ordinary editing does not need it.
@@ -9,9 +9,9 @@ Resume.io is a commercial, guided builder with sample content and a template-foc
| Consideration | Reactive Resume | Resume.io |
| --- | --- | --- |
| Free final download | PDF, DOCX, Markdown, and JSON | PDF with the Vancouver template or TXT |
| Other designed templates | Included templates | Premium trial or subscription workflow |
| Content support | Direct editing; optional provider-configured AI | Sample resumes, pre-generated sentences, and tips |
| Free final download | PDF, Word (DOCX), Markdown, and JSON | PDF with the Vancouver template or TXT |
| Other designed templates | All 15 templates included | Premium trial or subscription workflow |
| Content support | Direct editing, Check mode, a sample resume, and an optional AI assistant using your own provider | Sample resumes, pre-generated sentences, and tips |
| Deployment | Hosted use or self-hosting | Hosted service |
| Pricing availability | No premium resume tier | Plans can vary by location |
@@ -27,7 +27,7 @@ The Vancouver template makes it workable for someone who likes that design and n
## Where Reactive Resume is a better fit
Reactive Resume fits when you want to pick from the included templates and export a designed document without a template tier in the way. Its [export guide](/guides/exporting-your-resume) covers PDF, DOCX, Markdown, and JSON. The data export keeps your structured content and settings alongside the document download.
Reactive Resume fits when you want to pick from all 15 templates and export a designed document without a template tier in the way. Cover letters are separate documents with the same design and the same free downloads. Its [export guide](/guides/exporting-your-resume) covers PDF, DOCX, Markdown, and JSON. The data export keeps your structured content and settings alongside the document download.
You also get source access and self-hosting. Reactive Resume is [MIT-licensed](/legal/license), and its [Docker guide](/self-hosting/docker) documents the self-hosted route. Its optional AI integration lets you configure a provider if you want help, while ordinary editing does not depend on it.
@@ -39,7 +39,7 @@ Both services can make a resume for free. What matters is whether the free downl
## Reactive Resume limitations in this comparison
Reactive Resume has a smaller built-in guided-content library. It has no equivalent to Resume.io's collection of sample resumes, pre-generated cover-letter sentences, and tips. Its optional AI features also require you to choose and configure a provider, which is less convenient if you want a commercial writing workflow already assembled.
Reactive Resume has a smaller built-in guided-content library. It offers one sample resume to start from rather than a collection, and no pre-generated cover-letter sentences or tips. Its optional AI features, including cover-letter drafts from a job posting, also require you to choose and configure a provider, which is less convenient if you want a commercial writing workflow already assembled.
## Sources
@@ -9,10 +9,10 @@ Resume-Now is built around guided drafting, with content suggestions, AI writing
| Consideration | Reactive Resume | Resume-Now |
| --- | --- | --- |
| Free final download | PDF, DOCX, Markdown, and JSON | Plain-text TXT |
| Free final download | PDF, Word (DOCX), Markdown, and JSON | Plain-text TXT |
| Designed PDF and Word | Included exports | Paid access required |
| Writing workflow | Direct fields and optional provider-configured AI | Career questions, suggested bullets, and AI enhancement |
| Analysis tools | No equivalent specialized checker | Resume checker, summary generator, skills generator, and AI review |
| Writing workflow | Direct fields and an optional AI assistant using your own provider | Career questions, suggested bullets, and AI enhancement |
| Analysis tools | Free Check mode and public ATS checker; AI writing review with your own provider | Resume checker, summary generator, skills generator, and AI review |
| Deployment | Hosted use or self-hosting | Hosted service |
Resume-Now's free-builder guide says the no-cost download is a TXT file, and that downloading with a premium template requires paid access. Its FAQ says premium file formats require an upgrade. So free creation is not the same as a designed PDF or Word document.
@@ -39,7 +39,7 @@ Both workflows still leave you to verify that every statement is accurate and th
## Reactive Resume limitations in this comparison
Reactive Resume has a smaller built-in writing-guidance surface. It has no equivalent to Resume-Now's prewritten suggestions, resume checker, summary generator, skills generator, or AI review. Its optional AI path also asks you to choose and configure a provider, which is more setup than a hosted suggestion workflow.
Reactive Resume has a smaller built-in writing-guidance surface. It has no equivalent to Resume-Now's prewritten suggestions, summary generator, or skills generator. Its Check mode focuses on how software reads the resume, and its AI writing review, like the rest of its AI path, asks you to choose and configure a provider, which is more setup than a hosted suggestion workflow.
## Sources
@@ -10,8 +10,8 @@ ResumeGemini offers prewritten examples and job-targeted AI suggestions while yo
| Consideration | Reactive Resume | ResumeGemini |
| --- | --- | --- |
| Writing help | Direct editing; optional provider-configured AI | Prewritten expert content and job-specific examples |
| Job targeting | Manual edits or optional AI assistance | AI optimization, keyword alignment, and content tips for a target job |
| PDF | PDF export | Site documents free-plan PDF download and free/premium templates |
| Job targeting | Check mode's job match lists posting terms you have and lack; optional AI assistant | AI optimization, keyword alignment, and content tips for a target job |
| PDF | PDF export, plus Word (DOCX), Markdown, and JSON | Site documents free-plan PDF download and free/premium templates |
ResumeGemini describes prewritten, job-specific examples, AI recommendations, keyword alignment, and content tips for a target job. Its product page documents free and premium templates plus a free-plan resume download. That covers at least one free template and free PDF path; it does not mean every template is free.
@@ -23,15 +23,15 @@ Choose ResumeGemini when you want a content library and job-targeted AI optimiza
## Where Reactive Resume is a better fit
Use Reactive Resume to inspect or deploy the software yourself, keep resumes as structured data, or pick your own AI provider. It also exposes authenticated API and MCP workflows for automation.
Use Reactive Resume to inspect or deploy the software yourself, keep resumes as structured data, copy a resume for each job you track, or pick your own AI provider. It also exposes authenticated API and MCP workflows for automation.
## Which should you choose?
Choose ResumeGemini for built-in examples and keyword-oriented suggestions. Choose Reactive Resume for open-source access, self-hosting, and control over the AI provider and automation workflow.
Choose ResumeGemini for built-in examples and AI keyword optimization. Choose Reactive Resume for open-source access, self-hosting, and control over the AI provider and automation workflow.
## Reactive Resume limitations in this comparison
Reactive Resume has no built-in library of content examples and no native keyword-optimization product. Its AI workflow also needs provider credentials before you can use it.
Reactive Resume has no built-in library of content examples. Its job match shows which posting terms are missing but does not rewrite your resume for them on its own. Its AI assistant also needs provider credentials before you can use it.
## Sources
@@ -9,16 +9,16 @@ Resumod suits you when you want role-specific sample categories alongside its AT
| Consideration | Reactive Resume | Resumod |
| --- | --- | --- |
| Content help | Direct editing; optional provider-configured AI | Role-specific sample categories and a named AI Resume Builder |
| Checking tools | No equivalent built-in tool | Named ATS Resume Checker |
| Content help | Direct editing; optional AI assistant using your own provider | Role-specific sample categories and a named AI Resume Builder |
| Checking tools | Check mode in the editor and a free public ATS checker | Named ATS Resume Checker |
Resumod's [product page](https://resumod.co/) lists role-specific sample categories and links to an [ATS Resume Checker](https://resumod.co/ats-resume-checker) and an [AI Resume Builder](https://resumod.co/ai-resume-builder). Those pages do not document how the tools work, what they output, or their full plan limits.
Reactive Resume exports PDF, DOCX, Markdown, and JSON. Its AI is optional: you connect and enable a provider with your own credentials, and that provider can cost extra.
Reactive Resume exports PDF, DOCX, Markdown, and JSON. Its [Check mode](/guides/checking-your-resume) and public [ATS checker](/guides/using-the-ats-checker) score how reliably software reads a resume. Its AI is optional: you connect and enable a provider with your own credentials, and that provider can cost extra.
## Where Resumod is a better fit
Choose Resumod when role-specific examples and its named ATS-checker and AI-builder tools are worth more to you than picking your own provider.
Choose Resumod when role-specific examples and its AI Resume Builder are worth more to you than picking your own provider.
## Where Reactive Resume is a better fit
@@ -30,7 +30,7 @@ Choose Resumod for its bundled samples and named tools. Choose Reactive Resume f
## Reactive Resume limitations in this comparison
Reactive Resume has no built-in role-specific content library and no named ATS-checker tool. Its AI features also need provider setup before they work.
Reactive Resume has no built-in role-specific content library. Its AI features also need provider setup before they work.
## Sources
+4 -4
View File
@@ -9,8 +9,8 @@ Rezi suits you when you want its score, keyword targeting, AI writing, interview
| Consideration | Reactive Resume | Rezi |
| --- | --- | --- |
| AI | Optional; connect your own provider | Integrated AI writing and editing |
| Targeting | Manual edits or optional AI assistance | Rezi Score and keyword-targeting features |
| AI | Optional assistant; connect your own provider | Integrated AI writing and editing |
| Targeting | Check mode's job match lists posting terms you have and lack, without a score | Rezi Score and keyword-targeting features |
| Review | No specialist human-review service | Expert resume-review option |
| Interview help | No equivalent built-in interview tool | AI Interview feature |
| Free limits | Core hosted workflow has no premium tier | One resume and three PDF downloads |
@@ -18,7 +18,7 @@ Rezi suits you when you want its score, keyword targeting, AI writing, interview
Rezi's pricing page documents the free plan's one-resume and three-PDF-download limits, plus integrated AI writing and editing. It also lists Rezi Score, keyword targeting, AI Interview, and an expert resume-review option. Those are documented product features, not a promise of ATS passage, interviews, or hiring results.
Reactive Resume's AI is optional and bring-your-own-provider: you configure the credentials, and provider use can cost extra. It has no equivalent to Rezi Score, keyword targeting, AI Interview, or expert review.
Reactive Resume's AI is optional and bring-your-own-provider: you configure the credentials, and provider use can cost extra. Its Check mode gives a readability score for how well software reads the resume and lists which posting terms are missing, but it has no equivalent to Rezi Score, AI Interview, or expert review.
## Where Rezi is a better fit
@@ -34,7 +34,7 @@ Choose Rezi for a scoring and review-oriented workflow. Choose Reactive Resume f
## Reactive Resume limitations in this comparison
Reactive Resume has no equivalent to Rezi's score, keyword targeting, interview tool, or human review. Its AI features need provider setup and may cost extra through the provider.
Reactive Resume has no equivalent to Rezi's score, interview tool, or human review, and its job match does not score keyword coverage. Its AI features need provider setup and may cost extra through the provider.
## Sources
+6 -6
View File
@@ -3,16 +3,16 @@ title: "Reactive Resume vs Zety"
description: "Compare Reactive Resume and Zety by free downloads, guided writing, resume checks, templates, open source, and self-hosting."
---
Zety is a guided resume builder with writing assistance, a cover-letter workflow, a resume check, and job-matching tools. Reactive Resume is an open-source editor with designed PDF and DOCX exports, and it has no equivalent prewritten guidance or job matching.
Zety is a guided resume builder with writing assistance, a cover-letter workflow, a resume check, and job-matching tools. Reactive Resume is an open-source editor with designed PDF and DOCX exports, and it has no equivalent prewritten guidance or job-listing matches.
## Quick comparison
| Consideration | Reactive Resume | Zety |
| --- | --- | --- |
| Free final download | PDF, DOCX, Markdown, and JSON | Plain-text TXT |
| Free final download | PDF, Word (DOCX), Markdown, and JSON | Plain-text TXT |
| PDF and Word | Included exports | Paid formats |
| Guidance | Direct editing; optional provider-configured AI | Guided builder, templates, and writing resources |
| Related job tools | No equivalent job matching | Resume Check and Instant Job Matches listed in the free package |
| Guidance | Direct editing, Check mode, and an optional AI assistant using your own provider | Guided builder, templates, and writing resources |
| Related job tools | Cover letters and a job application tracker; no job-listing matches | Resume Check and Instant Job Matches listed in the free package |
| Deployment | Hosted use or self-hosting | Hosted service |
Zety's pricing page lists a TXT download in its free package. Its plan comparison names PDF, Word, and TXT among its download formats and shows TXT only for the free package. So the free package can write and export text, while a designed PDF or Word download sits in the paid workflow.
@@ -27,7 +27,7 @@ That suits you if you want help choosing words, a matching cover letter, or a se
## Where Reactive Resume is a better fit
Reactive Resume fits when you want to download a designed PDF or DOCX without upgrading. Its templates render structured resume sections, and the [template guide](/guides/choosing-a-template) covers how to pick one. JSON export keeps your structured data for backup or reuse, separately from the final PDF or DOCX.
Reactive Resume fits when you want to download a designed PDF or DOCX without upgrading. Its templates render structured resume sections, and the [template guide](/guides/choosing-a-template) covers how to pick one. JSON export keeps your structured data for backup or reuse, separately from the final PDF or DOCX. Cover letters and a job application tracker are included at no cost, and Check mode flags parsing issues before you export.
You also control where it runs. The source is public under the [MIT license](/legal/license), and the [Docker self-hosting guide](/self-hosting/docker) covers running your own instance. AI help is optional and uses a provider you configure.
@@ -39,7 +39,7 @@ Either way, check the final wording and layout yourself. The tools help you prep
## Reactive Resume limitations in this comparison
Reactive Resume has no built-in library of prewritten writing guidance, no dedicated resume-check product, and no job matching. Its optional AI route needs provider setup, and self-hosting means running a server. Zety is more convenient if you want those hosted services next to the builder and do not need a free PDF or Word export.
Reactive Resume has no built-in library of prewritten writing guidance and no job-listing matches; its tracker records jobs you find elsewhere. Its optional AI route needs provider setup, and self-hosting means running a server. Zety is more convenient if you want those hosted services next to the builder and do not need a free PDF or Word export.
## Sources
+100 -96
View File
@@ -1,143 +1,147 @@
---
title: "Project architecture"
description: "How the Reactive Resume monorepo is laid out, the runtime boundaries between the web and server apps, and the package ownership model."
description: "How the Reactive Resume monorepo fits together: the web and server apps, shared packages, runtime boundaries, and where new code belongs."
---
Reactive Resume is a pnpm/Turborepo monorepo. Docker runs one Node.js process. Vercel deploys two services from one project: `frontend` serves static assets through its CDN, and `backend` runs the same Hono application in a Node.js Function. Both targets share the web app, API, authentication, renderers, and database schema.
Reactive Resume is a TypeScript monorepo managed with pnpm workspaces and Turborepo. This page explains how the pieces fit together, so you can find the code behind a feature and know where a change belongs. To get a working checkout first, see [Development setup](/contributing/development).
Internal packages are source-consumed through their `package.json` export maps. Import package subpaths, not another workspace's private `src` files.
## The big picture
---
There are two apps and a set of shared packages:
## Runtime shape
- **`apps/web`** is a client-rendered React 19 single-page app built with Vite, TanStack Router, TanStack Query, Tailwind CSS, and Lingui for translations.
- **`apps/server`** is a Hono application on Node.js. It serves the API, authentication, the MCP server, uploads, OpenAPI, and the built web app.
- **`packages/*`** hold everything the apps share: API business logic, authentication, database access, schemas, PDF and DOCX rendering, and UI primitives.
The browser talks to the server through [oRPC](https://orpc.unnoq.com/) at `/api/rpc`. [Better Auth](https://www.better-auth.com/) handles sign-in, sessions, passkeys, two-factor authentication, API keys, and the OAuth provider used by MCP clients. [Drizzle](https://orm.drizzle.team/) talks to PostgreSQL.
```mermaid
flowchart TD
Browser["Browser"] --> WebRoutes["apps/web routes"]
WebRoutes --> ORPCClient["oRPC client"]
ORPCClient --> RPC["/api/rpc"]
Browser["Browser: apps/web SPA"] -->|"oRPC /api/rpc"| Server
Browser -->|"Forme (WebAssembly)"| BrowserPDF["PDF in the browser"]
MCPClient["MCP client"] -->|"/mcp"| Server
subgraph NodeProcess["Node process"]
Server["apps/server Hono adapter"]
API["packages/api feature routers"]
Auth["packages/auth"]
subgraph Server["apps/server (Hono)"]
RPC["RPC and OpenAPI handlers"]
AuthRoutes["/api/auth"]
MCP["packages/mcp"]
PDFServer["@reactive-resume/pdf/server"]
end
Server --> RPC
RPC --> API
Server --> Auth
Server --> MCP
API --> PDFServer
API --> DB["packages/db"]
API --> Storage["Local disk, S3, or private Vercel Blob"]
DB --> Postgres["PostgreSQL"]
RPC --> API["packages/api feature routers"]
MCP --> API
AuthRoutes --> Auth["packages/auth (Better Auth)"]
API --> DB["packages/db (Drizzle)"] --> Postgres[("PostgreSQL")]
API --> Storage[("Local disk, S3, or Vercel Blob")]
API --> Redis[("Redis (optional)")]
API --> ServerPDF["@reactive-resume/pdf/server"]
```
`apps/web` owns the React SPA with TanStack Router and Vite. `apps/server` owns the Hono application and mounts RPC, auth, OpenAPI, MCP, static uploads, schema JSON, and the built web app.
### How it runs
---
- **Development.** `pnpm dev` starts Vite on `PORT` (default `3000`), the Hono server on `SERVER_PORT` (default `3001`), and the email template preview on port `3002`. Vite proxies `/api`, `/mcp`, `/uploads`, `/.well-known`, and `/schema.json` to Hono, so you always open `http://localhost:3000`.
- **Docker.** The production image runs one Node.js process on port `3000`. Hono mounts the API, auth, MCP, and static routes, then serves the built web app.
- **Vercel.** One project deploys two services: `frontend` serves the static web build from the CDN, and `backend` runs the same Hono app in a Node.js Function. See [Deployment checks](/contributing/deployment-checks).
There is no request-time React server rendering. The web build prerenders the marketing homepage for each locale, and `apps/server/src/static/web.ts` serves HTML shells with OpenGraph, canonical, and JSON-LD metadata injected.
### What happens at startup
The server checks the environment, applies database migrations, and verifies the migrated schema before it initializes auth and accepts traffic. With `STRICT_SCHEMA_CHECK=true`, schema drift stops the server; otherwise it logs the drift and continues.
## Workspace map
| Workspace | Ownership |
| Workspace | What it owns |
| --- | --- |
| `apps/web` | TanStack Router routes, web features, browser PDF.js preview/viewer code, PWA setup, oRPC browser client |
| `apps/server` | Hono route composition, production HTTP adapters, MCP transport, OpenAPI/well-known handlers, static file serving, startup checks |
| `packages/api` | oRPC procedures and feature-owned business behavior under `src/features/*` |
| `packages/auth` | Better Auth config, auth helpers, and exported auth types |
| `packages/db` | Drizzle client and schema; root `migrations/` stores generated migrations |
| `packages/env` | Server environment validation and root `.env` loading |
| `packages/schema` | Zod schemas and typed resume/page/template models |
| `packages/resume` | Pure resume-domain helpers, including JSON Patch behavior and network icon mapping |
| `packages/pdf` | Resume document, template primitives, Forme conversion, templates, font registration, and browser/server generation adapters |
| `packages/docx` | DOCX export generation |
| `packages/mcp` | MCP tools, prompts, resources, server card, and tool metadata |
| `packages/ui` | Shared Base UI/shadcn-style primitives and hooks |
| `packages/ai` | AI provider types, prompts, resume parsing/sanitization helpers, and model-facing tool contracts |
| `apps/web` | Routes (`src/routes`, file-based), user-facing features (`src/features`), the PDF.js preview and public viewer, the PWA, and the oRPC browser client |
| `apps/server` | Hono route composition (`src/http`), RPC and OpenAPI adapters, the MCP transport, static and upload handlers, SEO for HTML shells, and startup checks |
| `packages/api` | oRPC procedures and business logic, one folder per feature under `src/features/*` |
| `packages/auth` | Better Auth configuration, helpers, and types |
| `packages/db` | Drizzle client and schema; generated migrations live in the root `migrations/` folder |
| `packages/env` | Server environment validation; loads the root `.env` |
| `packages/schema` | Zod schemas for resumes, cover letters, applications, pages, and templates |
| `packages/resume` | Pure resume logic with no database, HTTP, or DOM dependencies, such as JSON Patch helpers and social network icons |
| `packages/pdf` | Resume templates (which also lay out cover letters), the Forme adapter, font resolution, custom-style support, and browser and server PDF adapters |
| `packages/docx` | DOCX export |
| `packages/mcp` | MCP tools, prompts, resources, and the server card |
| `packages/ai` | AI provider types, prompts, and model-facing helpers |
| `packages/import` | Resume importers |
| `packages/ui` | Shared UI primitives and hooks in the Base UI / shadcn style |
| `packages/fonts` | Font metadata |
| `packages/email` | Email transport and templates |
| `packages/utils` | Narrow cross-cutting utilities with explicit export subpaths |
| `packages/config` | Shared development configuration |
| `tooling` | Development-only scripts and repo tooling |
| `packages/utils` | Narrow cross-cutting helpers behind explicit export subpaths |
| `packages/config` | Shared TypeScript and tooling configuration |
| `packages/dsh-plugin` | A separately built and published plugin that connects a DeepSeek Harness session to Reactive Resume over MCP |
| `tooling` | Development-only scripts: PDF translation catalog, semantic CSS reference, icon builds, database reset, deployment smoke test |
---
Internal packages are consumed as source through the `exports` map in each `package.json`, which points at `src` files. Don't expect a `dist` folder unless a package builds one explicitly.
## Where new code goes
| You are changing | Put it here |
| --- | --- |
| A page, loader, or user workflow | A route in `apps/web/src/routes` plus the feature folder in `apps/web/src/features/<area>` |
| An authenticated API procedure or business rule | `packages/api/src/features/<area>` |
| Pure resume data behavior | `packages/resume` |
| The shape of resume data | `packages/schema` first, then API DTOs, importers, PDF templates, and web forms that use it |
| A PDF template or rendering behavior | `packages/pdf` |
| PDF.js canvas or viewer UI | `apps/web/src/features/resume` (never `packages/pdf`) |
| DOCX export | `packages/docx` |
| An MCP tool, prompt, or resource | `packages/mcp` |
| A generic UI primitive or hook | `packages/ui`; workflow-specific UI stays in its web feature |
| A database column or table | `packages/db/src/schema/*`, then `pnpm db:generate` |
| A server environment variable | `packages/env/src/server.ts`, `.env.example`, and `globalEnv` in `turbo.json` |
| A dev-only script | `tooling/` |
A new template touches several places: `packages/schema/src/templates.ts`, `packages/pdf/src/templates/index.ts`, the template source under `packages/pdf/src/templates/<name>/`, and preview images under `apps/web/public/templates/{jpg,pdf}`.
Add a helper to `packages/utils` only when no domain package is a better owner. JSON Patch behavior belongs in `@reactive-resume/resume/patch`, and DOCX builders belong in `@reactive-resume/docx`.
## Boundary rules
- Use `@reactive-resume/*` package exports for cross-workspace imports.
- Do not import another workspace through `apps/**`, `packages/**`, `@reactive-resume/*/src/**`, or a TypeScript path alias to another workspace's `src`.
- Keep browser-only code in web features or explicit browser subpaths.
- Keep server-only code in server packages or explicit server subpaths.
- Keep environment-neutral domain packages free of DB, HTTP, DOM, and app imports.
- Add public package exports deliberately. Wildcard exports are reserved for leaf-style public surfaces such as UI components/hooks and schema resume files.
Turborepo enforces these rules with `pnpm exec turbo boundaries`:
The checks are executable:
- Import other workspaces by package name and export subpath, such as `@reactive-resume/pdf/browser`. Never reach into another workspace's `src` through a relative path, `@reactive-resume/*/src/*`, or a TypeScript path alias.
- Each workspace's `turbo.json` declares tags. `app:web` and `app:server` mark the apps. `runtime:server` marks server-only packages (API, auth, database, environment, email, MCP), `runtime:browser` marks browser-only UI, and `runtime:universal` marks environment-neutral domain packages.
- Runtime-specific code sits behind explicit subpaths such as `@reactive-resume/pdf/browser`, `@reactive-resume/pdf/server`, and `@reactive-resume/env/server`. Keep root exports environment-neutral unless the whole package is server-only.
- Wildcard exports are reserved for leaf libraries with a file-like surface: `@reactive-resume/ui/components/*`, `@reactive-resume/ui/hooks/*`, and the schema model files. Everything else uses explicit exports.
```bash
pnpm exec turbo boundaries
pnpm exec biome check biome.json turbo.json tooling/grit/no-cross-workspace-src-imports.grit apps/web/tsconfig.json apps/*/turbo.json packages/*/turbo.json
```
After you change a shared contract, an export, or an import path, run `pnpm exec turbo boundaries` and check the affected consumers.
---
## The web app
## Feature placement
`apps/web/src/routes` stays route-owned: route files handle the URL, loaders, redirects, and metadata. Implementation lives in `apps/web/src/features`, grouped by product area: `documents`, `resume` (editor, preview, export, sharing, custom styles), `letters`, `applications`, `assistant`, `ats-checker`, `settings`, `command-palette`, `auth`, `homepage`, `theme`, `locale`, and `user`.
When adding code, choose the owner by behavior:
`apps/web/src/router.tsx` creates the router context with `queryClient`, `orpc`, `theme`, `locale`, `session`, and `flags`. Read these from route context instead of fetching them again. Never edit `routeTree.gen.ts` by hand; Vite regenerates it when you add or rename a route.
| Change | Put it here |
| --- | --- |
| Route, loader, route-level server handler, or web workflow | `apps/web/src/routes` plus `apps/web/src/features/<domain>` |
| API procedure or authenticated business behavior | `packages/api/src/features/<domain>` |
| Pure resume data logic | `packages/resume` |
| Resume schema or template list shape | `packages/schema` |
| PDF template/rendering behavior | `packages/pdf` |
| PDF.js canvas/viewer UI | `apps/web/src/features/resume` |
| DOCX export behavior | `packages/docx` |
| MCP tool/prompt/resource behavior | `packages/mcp` |
| Shared UI primitive/hook | `packages/ui` |
| Cross-cutting helper | Prefer a domain package first; otherwise add an explicit `packages/utils` export |
The oRPC client in `apps/web/src/libs/orpc/client.ts` calls `/api/rpc` with credentials. On Vercel, `apps/web/src/libs/orpc/fetch.ts` stages large request bodies through Blob storage.
---
When you add a public marketing route, also update its server fallback and SEO handling in `apps/server/src/static/web.ts`. Vite's dev fallback can hide a production 404.
## Web layout
## The API
`apps/web/src/routes` stays route-owned. Route files handle URL shape, loaders, redirects, metadata, and SSR flags.
`packages/api/src/routers/index.ts` combines the feature routers (`resume`, `coverLetters`, `documents`, `applications`, `agent`, `ai`, `aiProviders`, `auth`, `storage`, `statistics`, `flags`) into the contract served at `/api/rpc`. Each feature folder owns its procedures, services, helpers, and tests.
Domain UI and browser-heavy implementation code lives under `apps/web/src/features`. Current feature areas include resume preview/export/public pages, command palette, auth, settings, theme, locale, and user menu behavior.
Use `protectedProcedure` from `packages/api/src/context.ts` for authenticated procedures, and check resource ownership inside the feature logic. API keys, bearer tokens, and cookies all resolve through the same shared auth path; don't add a separate one.
Generic app-local components remain in `apps/web/src/components`; shared reusable primitives live in `packages/ui`.
Keep helpers inside the feature that uses them. Don't reintroduce technical-layer folders such as `services/` or `helpers/` at the package root.
Dialog runtime state is centralized in `apps/web/src/dialogs/store.ts`, while dialog schemas and renderers are registered by domain under `apps/web/src/dialogs/{auth,api-key,resume}`.
## PDF rendering
---
`packages/pdf` renders every PDF. Templates are React components built from the package's primitives. The code in `src/forme` renders them with a small React reconciler and converts the result into a [Forme](https://www.formepdf.com/) document. The Forme engine, compiled to WebAssembly, lays out and draws the pages. No Chromium, Browserless, or print service is involved.
## API layout
- `@reactive-resume/pdf/browser` creates PDFs in the browser. The editor's download and preview use it.
- `@reactive-resume/pdf/server` creates PDFs on the server, for the public resume download and API exports.
- `packages/pdf/src/templates/shared/filtering.ts` holds the section filtering shared by all templates. Template-specific visual exceptions stay in that template's folder.
- `packages/pdf/src/hooks/use-register-fonts.ts` resolves font families, weights, and fallback stacks for other scripts.
`packages/api/src/routers/index.ts` exports the top-level oRPC contract. Feature modules under `packages/api/src/features/*` own their procedure modules, services, helpers, tests, and public package exports.
Default section titles in the PDF come from a generated catalog, `packages/pdf/src/section-title-catalog.json`, built from the web app's translations. See [Contributing translations](/contributing/translations#updating-catalogs-in-a-checkout).
Avoid reintroducing technical-layer folders such as `services/` or `helpers/` at the package root. If a helper is used by one feature, keep it in that feature. If it becomes shared, name the shared capability explicitly and export it intentionally.
## MCP
---
`packages/mcp` implements the MCP server with canonical, unprefixed tool names such as `list_resumes`, `read_resume`, `apply_resume_patch`, `list_cover_letters`, and `list_applications`. The server process imports it from `@reactive-resume/mcp` and injects an in-process oRPC router client, so MCP tools run the same business logic as the web app. MCP must never import code from `apps/web`. For the user-facing side, see [Using the MCP server](/guides/using-the-mcp-server).
## PDF and export boundaries
## Related pages
`packages/pdf` owns PDF generation. Templates are written with React primitives; `src/forme` renders them with a small React renderer and converts the result into a [Forme](https://www.formepdf.com/) document, which the Forme engine (WebAssembly) lays out and draws:
- `@reactive-resume/pdf/browser` creates browser PDF blobs.
- `@reactive-resume/pdf/server` creates server PDF files.
- Template code stays under `packages/pdf/src/templates`.
Localized section-title resolution stays in the caller because it depends on web/server locale context. PDF.js preview and viewer code stays in `apps/web/src/features/resume`, not in `packages/pdf`.
DOCX export generation lives in `packages/docx`.
---
## MCP boundary
MCP implementation lives in `packages/mcp`. It exposes canonical unprefixed tool names such as `list_resumes`, `read_resume`, and `apply_resume_patch`.
The server process imports MCP from `@reactive-resume/mcp` and injects the in-process oRPC router client. It must not import MCP code from `apps/web/src`.
- [Development setup](/contributing/development): run the app locally and learn the everyday commands.
- [Deployment checks](/contributing/deployment-checks): how CI verifies the Vercel build and how to smoke-test an installation.
- [Contributing translations](/contributing/translations): Crowdin, the glossary, and catalog commands.
+38 -19
View File
@@ -1,51 +1,70 @@
---
title: "Deployment checks"
description: "How CI verifies the Vercel build artifact, and how to run the deployment smoke test against Vercel or Docker."
description: "How CI verifies the Vercel build artifact on every pull request, and how to run the deployment smoke test against a Vercel or Docker installation."
---
The **Vercel compatibility** workflow (`.github/workflows/vercel.yml`) has two jobs.
Reactive Resume ships as a Docker image and as a Vercel project. The **Vercel compatibility** workflow (`.github/workflows/vercel.yml`) catches problems that only show up in a deployed build. It has two jobs: an offline artifact build that runs on every pull request, and a live smoke test you start by hand. You can run the same smoke test against your own installation.
## Artifact build
Runs on every pull request and every push to `main`. It needs no Vercel account and no secrets, so fork pull requests run it safely.
The `artifact` job runs on every pull request, every push to `main`, and every manual run. It needs no Vercel account and no secrets, so pull requests from forks run it safely.
The job:
1. Starts an isolated PostgreSQL service.
2. Writes a local `.vercel/project.json` with the `services` framework and runs `vercel build --prod` offline, with placeholder Blob credentials. This also applies migrations to the isolated database.
2. Writes a local `.vercel/project.json` with the `services` framework, then runs `vercel build --prod` offline with placeholder Blob credentials. The build applies migrations to the isolated database.
3. Checks the `backend` service Function:
- runtime is `nodejs24.x`, `maxDuration` is `300`, and the handler is `apps/server/vercel.mjs`;
- a copy of the Function outside the checkout loads with `--no-experimental-require-module`, which matches the Vercel runtime, so a dependency the build left out fails the job;
- the copy rejects an unauthenticated staging request and serves the prerendered homepage.
- its runtime is `nodejs24.x`, `maxDuration` is `300`, and its handler is `apps/server/vercel.mjs`;
- a copy of the Function outside the checkout loads with `--no-experimental-require-module`, like the Vercel runtime does, so a dependency the build left out fails the job;
- the copy rejects an unauthenticated upload-staging request with `401` and serves the prerendered homepage with its JSON-LD metadata.
If a new server dependency fails the loading check, add it and its own dependencies to `bundledInteropPackages` in `apps/server/tsdown.config.ts`. CommonJS dependencies need this: Vercel's service builder loads them through pnpm links that it leaves out of the Function.
### When the loading check fails
If a new server dependency breaks the loading check, add it and its own dependencies to `bundledInteropPackages` in `apps/server/tsdown.config.ts`. CommonJS dependencies need this, because Vercel's service builder leaves out the pnpm links they load through.
## Live smoke test
Runs only when started manually (`workflow_dispatch`). It uses the `vercel-smoke` GitHub environment and runs `tooling/deployment/smoke.mjs` against `VERCEL_SMOKE_URL`.
The `live-smoke` job runs only when you start the workflow manually (`workflow_dispatch`). It uses the `vercel-smoke` GitHub environment and runs `tooling/deployment/smoke.mjs` against the installation at `VERCEL_SMOKE_URL`.
<Warning>
Point the smoke test only at a dedicated test installation. It creates an account, a public resume, and files, then deletes them.
Point the smoke test only at a dedicated test installation. It signs up a new account, publishes a resume, and uploads files, then deletes the account and everything in it.
</Warning>
The script checks health, public pages, signup, resume CRUD, public PDF rendering, a 10 MiB upload and download, and one-time use of staged requests.
The script checks, in order:
To also check a 25 MiB agent attachment, configure a deterministic OpenAI-compatible test provider that serves the model `smoke-model`:
1. `/api/health` reports `healthy`, and `/`, `/auth/login`, `/robots.txt`, `/sitemap.xml`, and `/.well-known/oauth-protected-resource` respond. A missing asset returns `404`.
2. An email sign-up creates a session.
3. A resume created from sample data can be read back and made public, and its public page and server-rendered public PDF load.
4. A 10 MiB file uploads, downloads intact, and is deleted. On Vercel the upload goes through a staged request, and the script checks that a staged request can't be replayed.
5. Optionally, a 25 MiB assistant attachment uploads and is deleted (see below).
6. The account is deleted, even if an earlier check failed.
The installation must allow sign-ups and email sign-in, so `FLAG_DISABLE_SIGNUPS` and `FLAG_DISABLE_EMAIL_AUTH` must not be `true`.
### Attachment check
To include the 25 MiB attachment check, configure an OpenAI-compatible test provider that answers a connection test for the model `smoke-model`. No paid AI model is needed; a deterministic stub works.
| Name | Kind | Value |
| --- | --- | --- |
| `VERCEL_SMOKE_URL` | Variable | Test installation origin |
| `VERCEL_SMOKE_AI_BASE_URL` | Variable | Test provider base URL |
| `VERCEL_SMOKE_AI_API_KEY` | Secret | Test provider API key |
| `VERCEL_SMOKE_URL` | Variable | Origin of the test installation |
| `VERCEL_SMOKE_AI_BASE_URL` | Variable | Base URL of the test provider |
| `VERCEL_SMOKE_AI_API_KEY` | Secret | API key for the test provider |
No paid AI model is needed.
The installation needs `ENCRYPTION_SECRET` set to save the provider. A provider on a private or `http://` address also needs `FLAG_ALLOW_UNSAFE_AI_BASE_URL=true`, which is only safe on an isolated test installation.
## Run the smoke test locally
## Run the smoke test yourself
Against a local Docker installation:
The script needs only Node.js 24 and a checkout. Set `SMOKE_URL` to the installation's origin:
```bash
SMOKE_URL=http://localhost:3000 node tooling/deployment/smoke.mjs
```
Add `SMOKE_AI_BASE_URL` and `SMOKE_AI_API_KEY` to include the attachment check.
Add `SMOKE_AI_BASE_URL` and `SMOKE_AI_API_KEY` to include the attachment check. The script detects the platform on its own: on Docker, the staging endpoint returns `404` and uploads go directly to the server.
## Related pages
- [Development setup](/contributing/development): run the app and the test suites locally.
- [Deploying to Vercel](/self-hosting/vercel): set up your own Vercel installation.
- [Self-hosting with Docker](/self-hosting/docker): run the production image.
+217 -244
View File
@@ -1,324 +1,297 @@
---
title: "Development setup"
description: "Set up a local development environment for Reactive Resume with pnpm, Docker services, environment variables, and the web and server apps."
description: "Run Reactive Resume locally with Node.js 24, pnpm, and Docker, then use the everyday commands for the database, tests, linting, and pull requests."
---
<Info>
**Prerequisites**: - [Node.js](https://nodejs.org/) v24 - [pnpm](https://pnpm.io/) v11.21.0 -
[Docker](https://docs.docker.com/get-docker/) and Docker Compose - [Git](https://git-scm.com/)
</Info>
This guide takes you from a fresh clone to a running local copy of Reactive Resume, then covers the commands you'll use while working on it. For how the code is organized, read [Project architecture](/contributing/architecture).
These steps set up Reactive Resume for local development, whether you're contributing to the project or customizing it for yourself.
## Before you start
---
You need:
## Setting up your development environment
- **[Node.js](https://nodejs.org/) 24.** The version is pinned in `.nvmrc` and the root `engines` field, so `nvm use` or `fnm use` picks it up.
- **[pnpm](https://pnpm.io/installation) 12.** The root `packageManager` field pins the exact version (currently `pnpm@12.8.1`), and pnpm switches to it automatically when you run it inside the repository.
- **[Docker](https://docs.docker.com/get-docker/) with Docker Compose** for PostgreSQL, Redis, and S3-compatible storage. Start the Docker daemon first.
- **[Git](https://git-scm.com/).**
## Set up your checkout
Run every command from the repository root unless a step says otherwise.
<Steps>
<Step title="Clone the Repository">
```bash
git clone https://github.com/reactive-resume/reactive-resume.git reactive-resume
cd reactive-resume
```
</Step>
<Step title="Install Dependencies">
Install [pnpm](https://pnpm.io/installation) directly, then install the project dependencies:
<Step title="Clone the repository">
```bash
git clone https://github.com/reactive-resume/reactive-resume.git
cd reactive-resume
```
</Step>
```bash
pnpm install
```
</Step>
<Step title="Start Infrastructure Services">
If you want to run the app directly on your machine with `pnpm dev`, start only the infrastructure services:
```bash
docker compose -f compose.dev.yml up -d postgres redis seaweedfs seaweedfs_create_bucket
```
This starts the following infrastructure services:
- **PostgreSQL** — Database (port 5432)
- **Redis** — AI Agent workspace streams/state (port 6379)
- **SeaweedFS** — S3-compatible storage (port 8333)
<Step title="Install dependencies">
```bash
pnpm install --frozen-lockfile
```
<Info>
**From v5.1.0 onwards** — PDF generation now runs entirely in the browser with the Forme PDF engine (WebAssembly), so no Browserless or Chromium container is required for development.
</Info>
<Tip>
`compose.dev.yml` can also run the app in a development container with `docker compose -f compose.dev.yml up -d`.
Use the service-filtered command above when you want local editor tooling and `pnpm dev` on the host.
</Tip>
<Tip>
Wait for all services to be healthy before proceeding. Check with `docker compose -f compose.dev.yml ps`.
</Tip>
</Step>
<Step title="Configure Environment Variables">
Copy `.env.example` to `.env.local` in the project root:
The install also sets up the [Lefthook](https://github.com/evilmartians/lefthook) Git hooks described in [Commits and pull requests](#commits-and-pull-requests).
</Step>
```bash
cp .env.example .env.local
```
<Step title="Start the infrastructure services">
```bash
docker compose -f compose.dev.yml up -d postgres redis seaweedfs seaweedfs_create_bucket
docker compose -f compose.dev.yml ps
```
Then edit `.env.local` as needed. For local development on the host, set at minimum:
This starts:
```bash
# Application
PORT=3000
SERVER_PORT=3001
APP_URL=http://localhost:3000
| Service | Purpose | Port |
| --- | --- | --- |
| `postgres` | The database | `5432` |
| `redis` | Optional: shared rate limits, resumable assistant replies, live resume events, and view de-duplication | `6379` |
| `seaweedfs` | S3-compatible storage for uploads | `8333` |
| `seaweedfs_create_bucket` | Creates the `reactive-resume` bucket, then exits | — |
# Database
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/postgres
Wait until `ps` shows the services as healthy. PDF generation runs on the Forme engine in WebAssembly, so you don't need a Chromium or Browserless container.
</Step>
# Authentication
AUTH_SECRET=development-secret-change-in-production
<Step title="Create your environment file">
Copy the template only if you don't have a `.env.local` yet:
# Storage (SeaweedFS)
S3_ACCESS_KEY_ID=seaweedfs
S3_SECRET_ACCESS_KEY=seaweedfs
S3_ENDPOINT=http://localhost:8333
S3_BUCKET=reactive-resume
S3_FORCE_PATH_STYLE=true
```bash
test -e .env.local || cp .env.example .env.local
```
# Email (Mailpit for local development)
SMTP_HOST=localhost
SMTP_PORT=1025
SMTP_FROM="Reactive Resume <noreply@rxresu.me>"
The template uses container hostnames. Because the app runs on your machine, change these values in `.env.local` to `localhost`:
# AI Agent workspace and saved AI providers
REDIS_URL=redis://localhost:6379
ENCRYPTION_SECRET=change-me-to-a-secure-agent-secret-in-production
```
```dotenv
APP_URL=http://localhost:3000
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/postgres
S3_ENDPOINT=http://localhost:8333
REDIS_URL=redis://localhost:6379
```
<Tip>
**Email testing**: The development stack includes [Mailpit](https://mailpit.axllent.org/). Emails the app sends are captured there and viewable at [http://localhost:8025](http://localhost:8025), so nothing reaches a real address during development.
</Tip>
Then generate the secrets:
</Step>
<Step title="Run Database Migrations If Needed">
The server startup path runs migrations before serving traffic. To apply migrations manually without starting the app,
run the root migration script, which loads `.env.local` before invoking Drizzle Kit:
```bash
pnpm run db:migrate
```
</Step>
<Step title="Start the Development Server">
```bash
pnpm run dev
```
Your local Reactive Resume instance will be available at [http://localhost:3000](http://localhost:3000).
</Step>
```bash
openssl rand -hex 32 # paste the output into AUTH_SECRET
openssl rand -hex 32 # paste the output into ENCRYPTION_SECRET
```
`AUTH_SECRET` is required. `ENCRYPTION_SECRET` (at least 32 characters) is needed only for saved AI providers and the assistant, but it's easiest to set it now. Redis is optional; with it, assistant replies survive a page reload and rate limits are shared between server processes. Every variable is described in [Environment variables](/self-hosting/environment-variables).
<Tip>
Working on something that doesn't need uploads? Start only `postgres` and set `STORAGE_BACKEND=local`. Files then go to the `data/` folder in your checkout.
</Tip>
</Step>
<Step title="Start the app">
```bash
pnpm dev
```
Open [http://localhost:3000](http://localhost:3000). The server applies database migrations on startup, so a fresh database is ready as soon as the app loads.
</Step>
<Step title="Create a local account">
Select **Sign up** and create an account. Without SMTP settings, the app doesn't send email: verification and password-reset links are printed in the terminal running `pnpm dev`. Copy the link from there into your browser.
</Step>
</Steps>
---
### What `pnpm dev` runs
## Available scripts
`pnpm dev` loads `.env.local` through dotenvx and starts three processes with Turborepo:
The scripts you will use most during development:
| Process | Address | Notes |
| --- | --- | --- |
| Vite (web app) | `http://localhost:3000` (`PORT`) | Hot reload. Proxies `/api`, `/mcp`, `/uploads`, `/.well-known`, and `/schema.json` to the server. |
| Hono (server) | `http://localhost:3001` (`SERVER_PORT`) | Restarts on change through `tsx watch`. |
| Email preview | `http://localhost:3002` | Previews the email templates in `packages/email`. |
### Development
Use `pnpm dev:web` to start only Vite. API calls still need a server running.
| Command | Description |
| ------------------------------ | ----------------------------------------------------------- |
| `pnpm dev` | Start the web and server development processes |
| `pnpm build` | Build the production web bundle and server bundle |
| `pnpm start` | Start the built production server |
| `pnpm typecheck` | Run TypeScript type checking |
| `pnpm test` | Run Vitest across workspaces |
| `pnpm exec biome check .` | Run a non-mutating Biome check |
| `pnpm check` | Run Biome with write/fix behavior (`--write --unsafe`) |
| `pnpm exec turbo boundaries` | Check workspace/package boundary rules |
## Everyday commands
### Database
| Command | What it does |
| --- | --- |
| `pnpm dev` | Start the web app, server, and email preview |
| `pnpm dev:web` | Start only the web app |
| `pnpm build` | Build the web app and server for production (regenerates PDF translations first) |
| `NODE_ENV=production pnpm start` | Run the built server on `PORT`. It reads exported variables or the root `.env`, not `.env.local`. |
| `pnpm typecheck` | Type-check every workspace with `tsgo` |
| `pnpm test` | Run the Vitest suites of every workspace |
| `pnpm test:e2e` | Run the Playwright browser tests (see [Browser tests](#browser-tests)) |
| `pnpm exec biome check <paths>` | Lint and format-check without changing files |
| `pnpm check` | **Changes files:** regenerates PDF translations and runs Biome with `--write --unsafe` |
| `pnpm exec turbo boundaries` | Check package boundary rules |
| `pnpm knip` | Find unused files, exports, and dependencies |
| `pnpm lingui:extract` | Extract new UI strings into `apps/web/locales/*.po` |
| `pnpm docs:gen` | Regenerate the OpenAPI spec and the custom-styles CSS reference |
| Command | Description |
| ---------------------- | -------------------------------------------- |
| `pnpm db:generate` | Generate migration files from schema changes |
| `pnpm db:migrate` | Apply pending migrations |
| `pnpm db:studio` | Open Drizzle Studio (database GUI) |
### Internationalization
| Command | Description |
| ------------------------- | -------------------------------------- |
| `pnpm run lingui:extract` | Extract translatable strings from code |
## Understanding the project structure
```
reactive-resume/
├── apps/
│ ├── web/ # TanStack Router routes, web features, and browser UI
│ └── server/ # Hono production server, HTTP adapters, static serving
├── packages/
│ ├── api/ # oRPC features and business behavior
│ ├── auth/ # Better Auth configuration and helpers
│ ├── db/ # Drizzle client and schema
│ ├── docx/ # DOCX export generation
│ ├── mcp/ # MCP tools, prompts, resources, and metadata
│ ├── pdf/ # PDF rendering (Forme) and PDF generation adapters
│ ├── resume/ # Pure resume-domain helpers
│ ├── schema/ # Zod schemas and typed models
│ ├── ui/ # Shared Base UI/shadcn-style primitives
│ └── ...
├── tooling/ # Development-only scripts and repository tooling
├── migrations/ # Generated database migrations
├── docs/ # Documentation
└── data/ # Local development data and uploads
```
---
## Working with the database
### Viewing the database
Use Drizzle Studio to explore and manage your database:
Prefer package-scoped commands while you work. Package names come from each `package.json`: the apps are `web` and `server`, and shared packages are `@reactive-resume/<name>`.
```bash
pnpm run db:studio
pnpm --filter web typecheck
pnpm --filter @reactive-resume/pdf test
pnpm exec biome check apps/web/src/features/resume
```
This opens a web-based GUI at [https://local.drizzle.studio](https://local.drizzle.studio).
## Work with the database
### Making schema changes
| Command | What it does |
| --- | --- |
| `pnpm db:generate` | Generate a migration from schema changes |
| `pnpm db:migrate` | Apply pending migrations without starting the app |
| `pnpm db:studio` | Open Drizzle Studio at [local.drizzle.studio](https://local.drizzle.studio) |
1. Edit the schema in `packages/db/src/schema/*`
2. Generate a migration:
```bash
pnpm run db:generate
```
3. Apply the migration:
```bash
pnpm run db:migrate
```
All three load `.env.local` before calling Drizzle Kit, which doesn't read `.env` files by itself.
<Warning>Always review generated migrations before applying them, especially when working with existing data.</Warning>
To change the schema:
---
1. Edit the tables in `packages/db/src/schema/*`.
2. Run `pnpm db:generate`. The migration is written to the root `migrations/` folder.
3. Read the generated SQL, then apply it with `pnpm db:migrate` or by restarting `pnpm dev`.
## Working with translations
<Warning>
Review every generated migration before you apply it. Don't reset the database or delete Docker volumes to work around a setup error; find the cause instead.
</Warning>
Reactive Resume uses [Lingui](https://lingui.dev/) for internationalization.
## Run tests
### Adding translatable text
### Unit and integration tests
Use the `t` macro for strings or `<Trans>` component for JSX:
Tests use [Vitest](https://vitest.dev/) and sit next to the code they cover as `*.test.ts(x)` or `*.spec.ts(x)`. Most packages run in Node; `packages/ui` uses `happy-dom`.
```bash
# One package
pnpm --filter @reactive-resume/pdf test
# One file (the path is relative to the package)
pnpm --filter @reactive-resume/pdf test src/templates/shared/filtering.test.ts
# One test by name
pnpm --filter @reactive-resume/pdf exec vitest run src/templates/shared/filtering.test.ts -t "filterItems"
# Coverage (V8, written to the package's coverage/ folder)
pnpm --filter @reactive-resume/pdf test:coverage
```
Pass file paths straight after `test`. An extra `--` stops Vitest from filtering the run. Most test scripts use `--passWithNoTests`, so a green run with zero tests proves nothing about your change.
Two suites need a real PostgreSQL database: set `COVER_LETTER_TEST_DATABASE_URL` and `OAUTH_TEST_DATABASE_URL`. Give the OAuth suite its own database, because it writes signing keys. Never point test variables at a database with real data. `.github/workflows/e2e.yml` shows the full setup.
### Browser tests
End-to-end tests use [Playwright](https://playwright.dev/) and live in `tests/e2e/specs`, with fixtures in `tests/e2e/fixtures`. They cover sign-up and sign-in, section editing and autosave, JSON export and import, public sharing with statistics and passwords, OAuth consent for MCP clients, and the assistant against a scripted AI provider.
Playwright starts the **built** server (`node apps/server/dist/index.mjs`) in production mode and waits for `/api/health`, so build first. Use a disposable database, and export the variables yourself; these scripts don't load `.env.local`.
```bash
pnpm exec playwright install chromium
export APP_URL=http://localhost:3000 PORT=3000
export DATABASE_URL=postgresql://postgres:postgres@localhost:5432/postgres
export AUTH_SECRET=$(openssl rand -hex 32) ENCRYPTION_SECRET=$(openssl rand -hex 32)
export LOCAL_STORAGE_PATH="$PWD/data/e2e"
export FLAG_DISABLE_SIGNUPS=false FLAG_DISABLE_EMAIL_AUTH=false FLAG_DISABLE_API_RATE_LIMIT=true
export FLAG_ALLOW_UNSAFE_AI_BASE_URL=true # lets the assistant spec reach its local stub
pnpm db:migrate
pnpm build
pnpm test:e2e # all specs
pnpm test:e2e tests/e2e/specs/auth.spec.ts # one spec
pnpm test:e2e:ui # Playwright's interactive UI
```
Without `FLAG_ALLOW_UNSAFE_AI_BASE_URL=true`, the assistant spec skips itself. Playwright runs Chromium with no retries. Locally it reuses a server that's already running on `PORT`. See `tests/e2e/README.md` for the full recipe.
<Note>
Keep the unsafe AI and OAuth redirect flags for isolated test installations. They relax SSRF and redirect protections.
</Note>
## Add translatable text
The web app uses [Lingui](https://lingui.dev/). Wrap every user-facing string in a macro:
```tsx
import { t } from "@lingui/core/macro";
import { Trans } from "@lingui/react/macro";
// For plain strings
const message = t`Hello, World!`;
const label = t`Download PDF`;
// For JSX content
<Trans>Welcome to Reactive Resume</Trans>;
<Trans>Your resume is ready.</Trans>;
```
### Extracting translations
Then run `pnpm lingui:extract`. It updates the catalogs in `apps/web/locales/*.po` and regenerates the PDF section-title catalog. You only add English strings; translators handle the rest on Crowdin. See [Contributing translations](/contributing/translations).
After adding new translatable text, extract them to the locale files:
## Code style
```bash
pnpm run lingui:extract
```
- TypeScript is strict, including `exactOptionalPropertyTypes` and `noUncheckedIndexedAccess`. Packages type-check with `tsgo --noEmit`.
- [Biome](https://biomejs.dev/) formats and lints: tabs, double quotes, 120-column lines, separated type imports, organized imports, and sorted Tailwind classes in `clsx`, `cva`, and `cn`. Set your editor to use Biome.
- React components with explicit props use a named props type, such as `type FooProps = {...}` with `function Foo(props: FooProps)`.
Translation files live in `apps/web/locales`, in `.po` format.
## Commits and pull requests
---
The Git hooks run automatically:
## Code quality
- **Before each commit**, Lefthook checks staged files for merge conflict markers and runs Biome with `--write --unsafe` on them, then stages the fixes.
- **On each commit message**, commitlint enforces [Conventional Commits](https://www.conventionalcommits.org/), such as `fix(pdf): keep the timeline dot round` or `docs: update the development guide`.
### Linting & formatting
Before you open a pull request:
Uses [Biome](https://biomejs.dev/) for linting, formatting, import organization, and Tailwind class sorting:
1. Run the type checks and tests for the packages you changed, plus a non-mutating Biome check.
2. Run `pnpm exec turbo boundaries` if you changed imports, exports, or shared contracts.
3. Run `pnpm build` if you changed runtime or bundling behavior.
4. Keep the pull request focused. Describe the problem, the new behavior, and the checks you ran, and link the related [GitHub issue](https://github.com/reactive-resume/reactive-resume/issues).
```bash
# Non-mutating check
pnpm exec biome check .
Pull requests run these GitHub Actions workflows:
# Project script with write/fix behavior
pnpm check
```
| Workflow | What it checks |
| --- | --- |
| `e2e.yml` | Unit tests for every workspace (`turbo run test:ci --concurrency=1`), a production build, and the Playwright suite |
| `vercel.yml` | Builds the Vercel artifact offline and checks the backend Function. See [Deployment checks](/contributing/deployment-checks). |
| `autofix.yml` | Runs `pnpm knip --fix` and `pnpm check`, then pushes any fixes to your branch |
### Type checking
Run TypeScript type checking:
```bash
pnpm run typecheck
```
<Tip>
Configure your IDE to use Biome for formatting and lint diagnostics. The repo uses tabs, double quotes, 120-column
lines, and organized import groups.
</Tip>
---
Keep credentials and personal resume data out of code, logs, test fixtures, issues, and pull requests.
## Troubleshooting
<AccordionGroup>
<Accordion title="Port 3000 or 3001 is already in use">
The Vite web server uses `PORT` (default `3000`), and the Hono server uses `SERVER_PORT` (default `3001`).
Either stop the conflicting process or choose alternate ports:
```bash
PORT=3002 SERVER_PORT=3003 pnpm dev
```
Stop the other process, or set different values for `PORT` and `SERVER_PORT` in `.env.local` and change `APP_URL` to match. Keep port `3002` free for the email preview.
</Accordion>
<Accordion title="Database connection refused">
Ensure Docker containers are running:
```bash
docker compose -f compose.dev.yml ps
docker compose -f compose.dev.yml up -d
```
Check that PostgreSQL is healthy and accessible on port 5432.
<Accordion title="The database connection is refused">
Check that the containers are healthy with `docker compose -f compose.dev.yml ps`. Code on your machine connects to `localhost`; code inside a container uses the service name, such as `postgres`.
</Accordion>
<Accordion title="S3/Storage errors">
Verify SeaweedFS is running and the bucket exists:
<Accordion title="Uploads fail with S3 errors">
Read the storage logs:
```bash
docker compose -f compose.dev.yml logs seaweedfs
docker compose -f compose.dev.yml logs seaweedfs_create_bucket
```
If the bucket wasn't created, restart the bucket creation service:
```bash
docker compose -f compose.dev.yml restart seaweedfs_create_bucket
docker compose -f compose.dev.yml logs seaweedfs seaweedfs_create_bucket
```
Check that `S3_ENDPOINT` is `http://localhost:8333` and the bucket exists. If you don't need S3, set `STORAGE_BACKEND=local`.
</Accordion>
<Accordion title="Type errors after pulling changes">
The route tree may need regeneration. Run the dev server which auto-generates routes:
```bash
pnpm run dev
```
Or run type checking to see specific errors:
```bash
pnpm run typecheck
```
<Accordion title="Type errors about routes after pulling or adding a route">
`apps/web/src/routeTree.gen.ts` is generated. Start `pnpm dev` (or run `pnpm build`) to regenerate it, and never edit it by hand.
</Accordion>
<Accordion title="AI providers are unavailable">
Saved AI providers and the assistant need `ENCRYPTION_SECRET` (at least 32 characters). Set it in `.env.local` and restart `pnpm dev`.
</Accordion>
<Accordion title="A server dependency fails to load on Vercel">
CommonJS server dependencies must be bundled. Add the package and its dependencies to `bundledInteropPackages` in `apps/server/tsdown.config.ts`. See [Deployment checks](/contributing/deployment-checks).
</Accordion>
</AccordionGroup>
---
## Next steps
<CardGroup cols={2}>
<Card title="Project Architecture" icon="folder-open" href="/contributing/architecture">
How the project and codebase are structured.
</Card>
<Card title="GitHub Repository" icon="github" href="https://github.com/reactive-resume/reactive-resume">
View the source code and contribute to the project.
</Card>
<Card title="Project architecture" icon="sitemap" href="/contributing/architecture">
Learn where each part of the code lives and where new code belongs.
</Card>
<Card title="GitHub repository" icon="github" href="https://github.com/reactive-resume/reactive-resume">
Browse the source, open issues, and send pull requests.
</Card>
</CardGroup>
+66 -110
View File
@@ -1,162 +1,118 @@
---
title: "Contributing translations"
description: "Contribute translations for Reactive Resume through Crowdin by joining the project, proposing strings, requesting new languages, and syncing updates."
description: "Help translate Reactive Resume on Crowdin: read the glossary, keep placeholders intact, request a new language, and update catalogs in a checkout."
---
Reactive Resume is used all over the world. If you speak a language other than English, you can help by contributing translations.
Reactive Resume is available in more than 50 languages, and every translation comes from volunteers. If you speak a language other than English, you can help people build their resume in it. You don't need to write code: translations happen in your browser on Crowdin.
---
## How translations reach the app
## How translations work
1. Developers write every interface string in English. The strings are collected in one source catalog, `apps/web/locales/en-US.po`.
2. Translators work on that catalog in the [Reactive Resume project on Crowdin](https://crowdin.com/project/reactive-resume).
3. After each change to the `main` branch, a GitHub workflow uploads the source catalog, downloads the latest translations, and opens a pull request titled "Sync Translations from Crowdin".
4. Once that pull request is merged, your translations ship with the next release of the app. There's usually a delay of a few days to a few weeks, depending on the release cycle.
Reactive Resume uses [Crowdin](https://crowdin.com/) as its localization management platform. Crowdin gives translators an interface for contributing translations without writing code or editing files directly.
The same translations also label the default section headings in downloaded PDFs, such as "Experience" and "Education", and the word "Present" in date ranges.
<Info>
The Reactive Resume Crowdin project is available at
[https://crowdin.com/project/reactive-resume](https://crowdin.com/project/reactive-resume).
</Info>
## Read the glossary first
Once translations are submitted and approved on Crowdin, they are automatically synced to the codebase and will be available in the next release of the app.
Most of the interface is made of short, standalone labels like `Board`, `Resume`, or `Check`. Without a sentence around them, it's easy to pick the wrong meaning. For example, **Resume** is always the document, never the verb "to resume".
---
The [glossary](https://github.com/reactive-resume/reactive-resume/blob/main/GLOSSARY.md) explains what each recurring term means in Reactive Resume, lists the wrong senses that earlier translations used, and names the terms that stay in English: the product name, technology names such as PDF, DOCX, JSON, API, and MCP, AI provider names, and template names such as Azurill and Pikachu. Read the entry for a term before you translate it.
## Updating catalogs in a checkout
The PDF renderer uses a generated subset of the same translations for default section headings. Run `pnpm pdf:translations` after editing or syncing the PO catalogs. The root `pnpm lingui:extract`, `pnpm check`, and `pnpm build` commands also regenerate this file automatically.
Commit `packages/pdf/src/section-title-catalog.json` with the catalog updates. Edit the source PO files rather than the generated JSON; a tooling test checks that they stay synchronized.
## Getting started
## Translate on Crowdin
<Steps>
<Step title="Create a Crowdin Account">
If you don't already have an account, sign up at [crowdin.com](https://crowdin.com/). You can register using your
email or sign up with Google, Facebook, Twitter, GitHub, or GitLab.
<Tip>
For detailed instructions on creating an account and getting started, see Crowdin's official [For
Translators](https://support.crowdin.com/for-translators/) documentation.
</Tip>
<Step title="Create a Crowdin account">
Sign up at [crowdin.com](https://crowdin.com/) with your email or an existing account such as GitHub or Google. Crowdin's [guide for translators](https://support.crowdin.com/for-translators/) explains the basics.
</Step>
<Step title="Join the Reactive Resume Project">
Navigate to the [Reactive Resume project on Crowdin](https://crowdin.com/project/reactive-resume) and click **Join**
to become a contributor.
</Step>
<Step title="Join the project">
Open the [Reactive Resume project](https://crowdin.com/project/reactive-resume) and select **Join**.
</Step>
<Step title="Select Your Language">
From the project dashboard, click on the language you want to translate. You'll see a list of files that need
translation along with the progress for each.
</Step>
<Step title="Start Translating">
Click on a file to open the Crowdin Editor. You'll see the source text (English) on the left and a text field for
your translation on the right. - Translate the text accurately while preserving any placeholders or formatting - Use
the suggestions from Translation Memory and Machine Translation as a starting point - Vote on existing translations
if you agree with them
</Step>
<Step title="Save Your Translations">
Your translations are saved automatically as you work. Once reviewed, they'll be included in the next app release.
</Step>
<Step title="Choose your language">
Select your language on the project dashboard to see how much is already translated.
</Step>
<Step title="Translate strings">
Open the file to start the Crowdin editor. The English source is on one side and your translation on the other. Use translation memory and machine suggestions as a starting point, and vote for existing translations you agree with. Crowdin saves your work as you go.
</Step>
</Steps>
---
If a string is unclear, leave a comment on it in Crowdin. You can also search the source code for the English text to see where it appears.
## Translation guidelines
To maintain consistency across all translations, please follow these guidelines:
### Keep placeholders unchanged
### Preserve placeholders
Some strings contain placeholders like `{name}` or `{count}`. These must remain unchanged in your translation:
Words in curly braces are filled in by the app. Keep them exactly as they are, but move them wherever your grammar needs them. For example:
```
English: "Hello, {name}!"
Spanish: "¡Hola, {name}!"
English: “{name}” moved to Trash
German: „{name}“ in den Papierkorb verschoben
```
### Keep formatting
Numbered placeholders such as `{0}` often come with a note in Crowdin, like `placeholder {0}: application.role`, that tells you what the value is.
Preserve any HTML tags or markdown formatting in the source text:
### Keep numbered tags around the same words
Tags such as `<0>` and `</0>` mark text that gets a link or emphasis. Keep each pair, and wrap the words that carry the same meaning in your language. For example:
```
English: "Click <1>here</1> to continue"
German: "Klicken Sie <1>hier</1>, um fortzufahren"
English: Have a resume already? <0>Import it</0>
French: Vous avez déjà un CV ? <0>Importez-le</0>
```
### Use formal or informal tone consistently
### Translate every plural form
Choose either formal or informal language based on what's standard for software in your language, and stick with it throughout.
Some strings change with a number. They use this pattern:
### Technical terms
```
{0, plural, one {# application ready to import} other {# applications ready to import}}
```
Some technical terms (like "PDF", "URL", "JSON") are often kept in English across languages. Use your judgment based on what's common in your language's software community.
Translate the text inside each set of braces, keep `#` where the number goes, and don't translate the keywords `plural`, `one`, and `other`. Crowdin shows the plural categories your language needs.
---
### Be consistent
## Requesting a new language
- Choose a formal or informal tone based on what's normal for software in your language, and use it everywhere.
- Where your language normally calls this document a CV, use CV.
- Reuse the same word for a term throughout. The glossary lists the terms that matter most.
If your language is not listed in the Crowdin project, you can request it to be added.
## Request a new language
<Warning>
Before requesting a new language, please check if it's already available in the [Crowdin
project](https://crowdin.com/project/reactive-resume).
</Warning>
First check whether your language is already listed in the [Crowdin project](https://crowdin.com/project/reactive-resume). If it isn't:
To request a new language:
1. Open a new issue on [GitHub](https://github.com/reactive-resume/reactive-resume/issues/new/choose).
2. Title it "Add [language name] translation".
3. Include the language name and its locale code, such as `ja-JP` for Japanese.
1. Go to the [GitHub Issues](https://github.com/reactive-resume/reactive-resume/issues) page
2. Click **New Issue**
3. Select the appropriate template or create a blank issue
4. Title it something like: "Add [Language Name] to Reactive Resume"
5. Include the language name and locale code (e.g., "Japanese - ja-JP") in the issue description.
Once a maintainer adds the language, you can start translating it on Crowdin.
Once approved, the language will be added to Crowdin and you can begin translating.
## Updating catalogs in a checkout
---
This section is for developers working in the repository.
## When will my translations appear?
After you add or change user-facing strings with Lingui macros, extract them:
Translations submitted on Crowdin are synced to the codebase periodically. Once merged, they will be included in the next release of Reactive Resume.
```bash
pnpm lingui:extract
```
<Info>
There may be a delay between submitting translations and seeing them live in the app. This is normal and depends on
the release cycle.
</Info>
This updates every catalog in `apps/web/locales/*.po` and then runs `pnpm pdf:translations`, which regenerates two files from the catalogs:
---
- `packages/pdf/src/section-title-catalog.json`: default section titles for PDFs.
- `packages/schema/src/resume/present-labels.json`: the translated word for "Present" in date ranges.
## Tips for effective translation
`pnpm check` and `pnpm build` also regenerate them. Commit the generated files together with the catalog changes. Edit the `.po` files, never the JSON; a test in `tooling/locales` fails when the two drift apart.
<CardGroup cols={2}>
<Card title="Use Context" icon="eye">
Crowdin often shows context, screenshots, or comments to help you understand where the text appears in the app.
</Card>
<Card title="Check Existing Translations" icon="check">
Review translations by other contributors and vote for accurate ones to help maintain quality.
</Card>
<Card title="Ask Questions" icon="comment">
Use Crowdin's comment feature to ask about unclear strings or discuss translations with other contributors.
</Card>
<Card title="Stay Consistent" icon="book">
Check the project glossary (if available) to ensure terminology is used consistently across the app.
</Card>
</CardGroup>
Only edit `en-US.po` by extracting it from code. Other catalogs arrive through the Crowdin pull request, so change translations on Crowdin rather than in the repository, or your edit is overwritten by the next sync.
---
To add a new locale, a maintainer adds its code to `locales` in `apps/web/lingui.config.ts`, to `localeSchema` in `packages/utils/src/locale.ts`, and to `localeMap` in `apps/web/src/libs/locale.ts`, then runs `pnpm lingui:extract`.
## Need help?
## Related pages
<CardGroup cols={2}>
<Card icon="book-open" title="Crowdin Translator Docs" href="https://support.crowdin.com/for-translators/">
Official Crowdin documentation for translators.
</Card>
<Card icon="github" title="GitHub Issues" href="https://github.com/reactive-resume/reactive-resume/issues">
Report issues or request new languages.
</Card>
</CardGroup>
---
Thank you for helping translate Reactive Resume.
- [Changing appearance and language](/guides/changing-appearance-and-language): switch the app's language.
- [Development setup](/contributing/development): run Reactive Resume locally.
- [Crowdin translator docs](https://support.crowdin.com/for-translators/): how the Crowdin editor works.
+99 -33
View File
@@ -12,6 +12,30 @@
{
"source": "/guides/semantic-css-reference",
"destination": "/applying-custom-styles"
},
{
"source": "/guides/managing-resumes-from-the-dashboard",
"destination": "/guides/managing-documents"
},
{
"source": "/guides/moving-items-between-sections",
"destination": "/guides/editing-entries"
},
{
"source": "/guides/adding-a-cover-letter",
"destination": "/guides/writing-a-cover-letter"
},
{
"source": "/guides/using-the-builder-dock",
"destination": "/guides/editor-overview"
},
{
"source": "/guides/using-ai-in-the-builder",
"destination": "/guides/using-the-assistant"
},
{
"source": "/guides/using-ai-agent",
"destination": "/guides/using-the-assistant"
}
],
"seo": {
@@ -45,6 +69,9 @@
"pages": [
"getting-started",
"getting-started/quickstart",
"guides/whats-new-in-v6",
"guides/using-the-command-bar",
"guides/keyboard-shortcuts",
"guides/checking-service-status",
"guides/accessing-the-previous-version"
]
@@ -53,56 +80,93 @@
"group": "Account",
"pages": [
"guides/creating-an-account",
"guides/signing-in",
"guides/updating-your-profile",
"guides/changing-appearance-and-language",
"guides/linking-social-accounts",
"guides/setting-up-two-factor-authentication",
"guides/setting-up-passkeys",
"guides/exporting-your-data",
"guides/deleting-your-account"
]
},
{
"group": "Resume Builder",
"group": "Documents",
"pages": [
"guides/creating-your-first-resume",
"guides/managing-resumes-from-the-dashboard",
"guides/importing-resumes",
"guides/choosing-a-template",
"guides/selecting-page-format",
"guides/moving-items-between-sections",
"guides/fitting-content-on-a-page",
"guides/adding-a-cover-letter",
"guides/using-the-builder-dock",
"guides/undoing-changes-and-version-history",
"applying-custom-styles",
"guides/using-the-ats-checker",
"guides/using-ai-in-the-builder",
"guides/using-ai-agent",
"guides/using-private-notes",
"guides/exporting-your-resume",
"guides/exporting-resume-to-markdown",
"guides/sharing-your-resume-publicly"
"guides/managing-documents",
"guides/organizing-with-tags",
"guides/using-the-trash",
"guides/importing-resumes"
]
},
{
"group": "Resume Editor",
"pages": [
"guides/editor-overview",
"guides/filling-in-your-details",
"guides/formatting-text",
"guides/managing-sections",
"guides/editing-entries",
"guides/entering-dates",
"guides/undoing-changes-and-version-history",
"guides/using-private-notes",
"guides/editing-on-mobile"
]
},
{
"group": "Design",
"pages": [
"guides/choosing-a-template",
"guides/customizing-typography",
"guides/choosing-colors",
"guides/selecting-page-format",
"guides/arranging-the-layout",
"guides/fitting-content-on-a-page",
"applying-custom-styles"
]
},
{
"group": "Checking Your Resume",
"pages": ["guides/checking-your-resume", "guides/using-the-ats-checker"]
},
{
"group": "Cover Letters",
"pages": ["guides/writing-a-cover-letter"]
},
{
"group": "Sharing and Exporting",
"pages": [
"guides/sharing-your-resume-publicly",
"guides/exporting-your-resume",
"guides/exporting-resume-to-markdown"
]
},
{
"group": "AI Assistant",
"pages": ["guides/using-ai", "guides/using-the-assistant", "guides/ai-agent-tools"]
},
{
"group": "Application Tracker",
"pages": [
"guides/tracking-job-applications",
"guides/importing-applications-from-csv",
"guides/managing-applications-with-mcp"
"guides/adding-an-application",
"guides/managing-an-application",
"guides/scheduling-interviews",
"guides/tailoring-a-resume-for-a-job",
"guides/viewing-application-insights",
"guides/importing-applications-from-csv"
]
},
{
"group": "Security",
"pages": ["guides/setting-up-two-factor-authentication", "guides/setting-up-passkeys"]
},
{
"group": "Integrations",
"pages": [
"guides/using-the-api",
"guides/large-rpc-requests",
"guides/using-the-patch-api",
"guides/json-resume-schema",
"guides/using-the-mcp-server",
"guides/using-ai",
"guides/ai-agent-tools",
"guides/json-resume-schema"
"guides/managing-applications-with-mcp",
"guides/large-rpc-requests"
]
},
{
@@ -143,20 +207,22 @@
"group": "Self-Hosting",
"pages": [
"self-hosting/docker",
"self-hosting/vercel",
"self-hosting/kubernetes",
"self-hosting/environment-variables",
"self-hosting/examples",
"self-hosting/kubernetes",
"self-hosting/vercel",
"self-hosting/sso",
"self-hosting/upgrading-to-v6",
"self-hosting/migration"
]
},
{
"group": "Contributing",
"pages": [
"contributing/architecture",
"contributing/development",
"contributing/deployment-checks",
"contributing/translations"
"contributing/architecture",
"contributing/translations",
"contributing/deployment-checks"
]
},
{
+53 -78
View File
@@ -1,114 +1,89 @@
---
title: "Introduction to Reactive Resume"
description: "Reactive Resume is a free, open-source resume builder that lets you create, update, export, and share professional resumes without accounts or paywalls."
title: "Introduction"
description: "Reactive Resume is a free, open-source resume builder. Write resumes and cover letters, track job applications, and share or download your work."
---
<Frame>
<img src="/images/getting-started/banner.webp" alt="Reactive Resume Banner" />
Reactive Resume is a free and open-source resume builder. You write your resume on one side of the screen and see the finished page on the other, then download it as a PDF or share it with a link. There are no ads, no tracking and no paid tier.
<Frame caption="The editor: your details on the left, the page as it will print on the right">
<img src="/images/getting-started/editor-overview.webp" alt="The Reactive Resume editor with a game developer's resume. The Basics card with name, headline, email and phone fields is on the left, and the rendered resume page with a photo, contact line, Profiles, Skills, Summary and Education is on the right." />
</Frame>
## What is Reactive Resume?
Reactive Resume is a free and open-source resume builder that makes it easy to create, update, and share your resume. Built with privacy as a core principle, it gives you complete control over your data.
## What you can do with it
<CardGroup cols={2}>
<Card title="Privacy First" icon="shield-check">
Your data stays yours. No tracking, no ads, and an open-source codebase you can read.
<Card title="Write resumes and cover letters" icon="file-lines">
Keep every resume and letter in **Documents**. Start blank, from a sample, or by importing a PDF, Word file, JSON
or LinkedIn export.
</Card>
<Card title="Beautiful Templates" icon="palette">
Choose from a set of professionally designed templates.
<Card title="Design the page" icon="palette">
Pick from 15 templates, then adjust fonts, colors, page size and layout. The page updates as you type.
</Card>
<Card title="Real-time Preview" icon="eye">
See changes instantly as you type. What you see is exactly what you'll get when you export.
<Card title="Check before you send" icon="list-check">
**Check** mode points out issues on the lines they belong to and compares your resume with a job posting.
</Card>
<Card title="Export Anywhere" icon="file-export">
Download your resume as PDF, share it via a unique link, or print it directly from your browser.
<Card title="Share and download" icon="share-nodes">
Download a PDF, Word, Markdown or JSON file, or publish a link that you can protect with a password.
</Card>
<Card title="Track job applications" icon="briefcase">
Follow each application from saved to offer in a list, board or calendar, and see what's working in Insights.
</Card>
<Card title="Get help from an assistant" icon="sparkles">
Connect your own AI provider, and the assistant proposes edits you accept or reject one by one.
</Card>
</CardGroup>
## Key features
## Who it's for
<Frame>
<img src="/images/getting-started/infographic.webp" alt="An infographic of the major features of Reactive Resume" />
</Frame>
Reactive Resume is for anyone applying for jobs. You don't need design skills or an account with any other service.
The app is available in 55 languages, works on phones, tablets and computers, and has light and dark themes.
<AccordionGroup>
<Accordion title="Completely Free & Open Source" icon="code-branch">
Reactive Resume is licensed under MIT. You can use it for free, modify it, and even host your own instance. The
entire codebase is available on [GitHub](https://github.com/reactive-resume/reactive-resume).
</Accordion>
You can use it in two ways:
<Accordion title="Multiple Templates" icon="grid-2">
Choose from a variety of professionally designed templates including Azurill, Bronzor, Chikorita, Ditgar, Ditto,
Gengar, Glalie, Kakuna, Lapras, Leafish, Meowth, Onyx, Pikachu, Rhyhorn, and Scizor, each with its own layout and style.
</Accordion>
- **The hosted version at [rxresu.me](https://rxresu.me).** Create a free account and start writing. This is the
right choice for most people.
- **Your own copy.** Reactive Resume is open source under the MIT license, so you or your organization can run it on
your own server with Docker. Self-hosted copies have the same features as the hosted version.
<Accordion title="Rich Text Editor" icon="text">
Format your content with bold, italic, links, lists, and more using the rich text editor, powered by Tiptap.
</Accordion>
## Your data
<Accordion title="Multi-language Support" icon="globe">
Reactive Resume is available in multiple languages. Contribute translations to help us reach more people.
</Accordion>
Your resumes belong to you. You can download any document as JSON and import it back later, export everything in your
account from **Settings**, and delete your account at any time. The source code is public on
[GitHub](https://github.com/reactive-resume/reactive-resume), so anyone can check what the app does with your data.
<Accordion title="Dark Mode" icon="moon">
Built-in dark mode support, so you can work comfortably in any lighting condition.
</Accordion>
<Accordion title="Self-hosting Ready" icon="server">
Deploy your own instance of Reactive Resume using Docker. Keep complete control over your data and infrastructure.
</Accordion>
</AccordionGroup>
## Getting started
Use the hosted version, or run your own instance.
## Get started
<CardGroup cols={2}>
<Card title="Quickstart" icon="rocket" href="/getting-started/quickstart">
Start with the hosted version, or deploy your own instance.
Create an account, build a resume from a sample and download your first PDF in about ten minutes.
</Card>
<Card title="Development Setup" icon="code" href="/contributing/development">
Set up a local development environment to contribute or customize Reactive Resume.
<Card title="What's new in v6" icon="star" href="/guides/whats-new-in-v6">
Used Reactive Resume before? See what changed and where things moved.
</Card>
<Card title="Self-host with Docker" icon="docker" href="/self-hosting/docker">
Run Reactive Resume on your own server.
</Card>
<Card title="Contribute" icon="code" href="/contributing/development">
Set up a development environment to fix bugs or add features.
</Card>
</CardGroup>
## Tech stack
| Category | Technology |
| ---------------- | ------------------------------- |
| Framework | TanStack Start (React 19, Vite) |
| Runtime | Node.js |
| Language | TypeScript |
| Database | PostgreSQL with Drizzle ORM |
| API | ORPC (Type-safe RPC) |
| Auth | Better Auth |
| Styling | Tailwind CSS |
| UI Components | Base UI + shadcn-style package |
| State Management | Zustand + TanStack Query |
## Community & support
## Get help
<CardGroup cols={2}>
<Card title="GitHub" icon="github" href="https://github.com/reactive-resume/reactive-resume">
Star the repo, report reproducible bugs, propose features, and contribute to the project.
</Card>
<Card title="GitHub Discussions" icon="comments" href="https://github.com/reactive-resume/reactive-resume/discussions/categories/q-a">
Ask questions about setup, configuration, and using Reactive Resume.
Ask questions about using or hosting Reactive Resume.
</Card>
<Card title="Reddit" icon="reddit" href="https://reddit.com/r/reactiveresume">
Get help and talk to other users on our subreddit.
<Card title="GitHub Issues" icon="github" href="https://github.com/reactive-resume/reactive-resume/issues">
Report a bug you can reproduce, or propose a feature.
</Card>
<Card title="Discord" icon="discord" href="https://discord.gg/aSyA5ZSxpb">
Get help and talk to other users on our Discord server.
Talk to other people who use Reactive Resume.
</Card>
<Card title="Sponsor" icon="heart" href="https://opencollective.com/reactive-resume/donate">
Help fund the continued development of Reactive Resume.
<Card title="Reddit" icon="reddit" href="https://reddit.com/r/reactiveresume">
Share tips and ask for help on the subreddit.
</Card>
</CardGroup>
<Note>
**Need help?** Start a [GitHub Discussion](https://github.com/reactive-resume/reactive-resume/discussions/categories/q-a).
GitHub Issues are reserved for reproducible bugs and actionable feature proposals.
</Note>
Reactive Resume is kept free by donations. If it helps you, consider
[supporting the project on Open Collective](https://opencollective.com/reactive-resume/donate).
+107 -193
View File
@@ -1,237 +1,151 @@
---
title: "Quickstart"
description: "Sign in to the hosted version of Reactive Resume, or deploy your own self-hosted instance with Docker Compose."
description: "Create a free account, build a resume from the sample, make it yours, try a template and download your first PDF in about ten minutes."
---
## Options
In this tutorial you'll create a Reactive Resume account, open a sample resume, put your own name on it, try a different
template and download it as a PDF. It takes about ten minutes, and at the end you'll know your way around the editor.
There are two ways to use Reactive Resume:
You only need a web browser. The steps use the hosted version at [rxresu.me](https://rxresu.me); if your organization
runs its own copy, use its address instead.
<CardGroup cols={2}>
<Card title="Use the Cloud Version" icon="cloud" href="#using-the-cloud-version">
The fastest way to get started, and the right choice for most people.
</Card>
<Card title="Self-Host with Docker" icon="docker" href="#self-host-with-docker">
Deploy your own instance and keep full control. Requires some technical knowledge.
</Card>
</CardGroup>
---
## Using the cloud version
The easiest way to use Reactive Resume is our cloud version at [rxresu.me](https://rxresu.me). It is free, and it will stay free.
## 1. Create your account
<Steps>
<Step title="Create an Account">
Visit [rxresu.me](https://rxresu.me) and sign up for free using your email, or sign in with your GitHub or Google
account.
</Step>
<Step title="Create Your First Resume">
Click the **Create Resume** button on your dashboard. Give your resume a name and select a template to get started.
</Step>
<Step title="Fill in Your Details">
Use the builder to add your personal information, work experience, education, skills, projects, and
anything else the resume needs.
</Step>
<Step title="Export & Share">
When you're ready, export your resume as a PDF or share it at its public URL.
</Step>
<Step title="Open the sign-up page">
Go to [rxresu.me/auth/register](https://rxresu.me/auth/register).
</Step>
<Step title="Fill in your details">
Enter your **Name**, a **Username**, your **Email Address** and a **Password**, then select **Sign up**. If you'd
rather use an existing Google, GitHub or other account, pick it below the form instead.
</Step>
<Step title="Continue to your documents">
Reactive Resume sends you an email to verify your address. Verifying is optional, but you need it to reset a
forgotten password. Select **Continue** to carry on now and verify later.
</Step>
</Steps>
<Tip>Your resume updates in real-time as you type. The preview panel shows exactly how your final PDF will look.</Tip>
You land on **Documents**, the home page that holds all your resumes and cover letters. It's empty for now.
---
<Frame caption="Documents is empty until you create or import something">
<img src="/images/getting-started/quickstart/documents-empty.webp" alt="The empty Documents page with the heading &quot;Let's start with what you have&quot;, a drop zone for a PDF, Word or JSON file with a Choose a file button, and Start blank and Try a sample links underneath." />
</Frame>
## Self-host with Docker
## 2. Open the sample resume
You can deploy Reactive Resume on your own infrastructure using Docker.
Select **Try a sample**. Reactive Resume creates a complete resume for a game developer and opens it in the editor.
<Info>
**From v5.1.0 onwards** — PDF generation now runs entirely client-side with the Forme PDF engine (WebAssembly). Self-hosted deployments no longer require Browserless, Chromium, or any external print service as a dependency. The `PRINTER_*` and `BROWSERLESS_*` environment variables are no longer read and can be removed from your `.env`.
</Info>
Starting from the sample lets you see what a finished resume looks like before you replace its content with yours.
The editor has two halves:
### Prerequisites
- **The panel** on the left, where you write. It starts with the **Basics** card (your name and contact details),
followed by your sections, such as Summary, Education and Experience.
- **The page** on the right, which shows exactly what your PDF will look like. It updates as you type.
Before you begin, ensure you have the following installed:
The sample's document name and the name on the resume are a random three-word phrase, such as "Slippery Blush
Marlin". You'll fix both next.
- [Docker](https://docs.docker.com/get-docker/) (v20.10 or higher)
- [Docker Compose](https://docs.docker.com/compose/install/) (v2.0 or higher)
## 3. Name your document
<Info>
There is <strong>no difference in features</strong> between the cloud-hosted version and the self-hosted option. Both
offer the same privacy and customization. Pick whichever deployment type suits you.
</Info>
### Quick deployment
The document name is only for you; it's how you find the resume in **Documents**.
<Steps>
<Step title="Clone the Repository">
```bash
git clone https://github.com/reactive-resume/reactive-resume.git reactive-resume
cd reactive-resume
```
</Step>
<Step title="Configure Environment Variables">
Create a `.env` file in the root directory with the following variables:
```bash .env
# Application
APP_URL=http://localhost:3000
# Database
DATABASE_URL=postgresql://postgres:postgres@postgres:5432/postgres
# Authentication (generate a secure secret)
AUTH_SECRET=your-secure-secret-key-here
# Storage (S3-compatible via SeaweedFS)
S3_ACCESS_KEY_ID=seaweedfs
S3_SECRET_ACCESS_KEY=seaweedfs
S3_ENDPOINT=http://seaweedfs:8333
S3_BUCKET=reactive-resume
S3_FORCE_PATH_STYLE=true
# AI features (optional; ENCRYPTION_SECRET for saved providers, plus REDIS_URL for the agent)
REDIS_URL=redis://redis:6379
ENCRYPTION_SECRET=your-secure-encryption-secret-here
```
<Warning>
For production deployments, always use strong, unique values for `AUTH_SECRET`, `ENCRYPTION_SECRET`, and
database credentials.
</Warning>
</Step>
<Step title="Start the Services">
```bash
docker compose up -d
```
This starts:
- **PostgreSQL** — Database for storing user data and resumes
- **Redis** — Required for the AI Agent workspace
- **SeaweedFS** — S3-compatible storage for file uploads
- **Reactive Resume** — The main application
</Step>
<Step title="Access Your Instance">
Once all services are running, access your Reactive Resume instance at:
```text
http://localhost:3000
```
</Step>
<Step title="Open the document menu">
Select the document name at the top left of the editor.
</Step>
<Step title="Rename it">
Select **Rename…**, type a name such as "Game Developer Resume" in **Name**, then select **Save Changes**.
</Step>
</Steps>
### Docker Compose services
## 4. Put your name on the page
Here's what each service in the stack does:
<Steps>
<Step title="Edit the Basics card">
In the **Basics** card, replace the text in **Full name** with your own name.
</Step>
<Step title="Watch the page">
The name at the top of the page changes as you type. Try changing **Headline** to the job title you want too.
</Step>
</Steps>
| Service | Port | Description |
| ----------------- | ---- | ---------------------------------------------------- |
| `postgres` | 5432 | PostgreSQL database for storing all application data |
| `redis` | 6379 | Redis instance required by the AI Agent workspace |
| `seaweedfs` | 8333 | S3-compatible object storage for file uploads |
| `reactive_resume` | 3000 | The main Reactive Resume application |
<Frame caption="What you type in the panel appears on the page right away">
<img src="/images/getting-started/quickstart/basics-and-page.webp" alt="The Basics card with Full name set to David Kowalski and a headline, email, phone and location, next to the resume page showing the same name and contact details under a photo." />
</Frame>
<Note>
Saved AI provider management requires `ENCRYPTION_SECRET`, and the AI Agent workspace requires both `REDIS_URL` and
`ENCRYPTION_SECRET`. Other Reactive Resume features can run without them. Agent attachments and other private objects
require S3-compatible storage; local storage rejects private objects.
</Note>
You don't need to save. Under the document name, the status changes to **Saving…** and then **Saved**.
### Health checks
<Tip>
Made a mistake? Press <kbd>⌘</kbd> <kbd>Z</kbd> (<kbd>Ctrl</kbd> <kbd>Z</kbd> on Windows and Linux) to undo it.
</Tip>
All services include health checks. To verify that everything is running:
## 5. Try another template
```bash
docker compose ps
```
<Steps>
<Step title="Switch to Design">
Select **Design** at the top of the editor, or press <kbd>2</kbd>.
</Step>
<Step title="Pick a template">
**Template**, at the top of Design, shows all 15 templates filled with your own content. Select one, such as
**Bronzor**, and the page switches to it. Your content stays the same; only the look changes.
</Step>
<Step title="Go back to writing">
Select **Write**, or press <kbd>1</kbd>, to return to your content.
</Step>
</Steps>
You should see all services with a `healthy` status.
<Frame caption="Design mode's template gallery">
<img src="/images/getting-started/quickstart/design-template-gallery.webp" alt="The Template tab in Design mode with filters for All, One column, Two columns and ATS-safe, the text &quot;15 of 15 shown&quot;, and previews of the Azurill (selected), Bronzor, Chikorita and Ditgar templates filled with the sample resume." />
</Frame>
---
## 6. Download your PDF
## Environment variables reference
<Steps>
<Step title="Select Download PDF">
Select **Download PDF** at the top right of the editor. Your browser saves the file, named after the name on your
resume (for example, `David-Kowalski-Resume.pdf`).
</Step>
<Step title="Open the file">
Open the PDF. It matches the page you saw in the editor.
</Step>
</Steps>
A complete list of the environment variables you can configure:
<Frame caption="Download PDF and the arrow next to it, which opens more formats">
<img src="/images/getting-started/quickstart/editor-bar-actions.webp" alt="The right side of the editor bar with the History and Assistant icon buttons, a Share button and a green Download PDF button with a small arrow on its right." />
</Frame>
### Required variables
To download a different format, select the arrow next to **Download PDF**. The **Share & export** panel opens on its
**Download** tab, where you can choose **PDF**, **Word**, **Markdown** or **JSON** and change the file name.
| Variable | Description | Example |
| -------------- | ------------------------------ | ------------------------------------- |
| `DATABASE_URL` | PostgreSQL connection string | `postgresql://user:pass@host:5432/db` |
| `AUTH_SECRET` | Secret key for authentication | Generate with `openssl rand -hex 32` |
| `APP_URL` | Public URL of your Application | `https://rxresu.me` |
<Frame caption="The Download tab of Share & export">
<img src="/images/getting-started/quickstart/share-download-tab.webp" alt="The Share and export panel with Link, Download and History tabs. The Download tab lists PDF (Best for applying), Word, Markdown and JSON, a File name field set to David-Kowalski-Resume, a note that Check has 3 things to review, and a Download PDF button." />
</Frame>
### Optional variables
## What you've done
| Variable | Description | Default |
| ------------------------------------- | ----------------------------------------------------------- | ---------------------- |
| `GOOGLE_CLIENT_ID` | Google OAuth Client ID | — |
| `GOOGLE_CLIENT_SECRET` | Google OAuth Client Secret | — |
| `GITHUB_CLIENT_ID` | GitHub OAuth Client ID | — |
| `GITHUB_CLIENT_SECRET` | GitHub OAuth Client Secret | — |
| `LINKEDIN_CLIENT_ID` | LinkedIn OAuth Client ID | — |
| `LINKEDIN_CLIENT_SECRET` | LinkedIn OAuth Client Secret | — |
| `OAUTH_PROVIDER_NAME` | Custom OAuth Provider Name | — |
| `OAUTH_CLIENT_ID` | Custom OAuth Client ID | — |
| `OAUTH_CLIENT_SECRET` | Custom OAuth Client Secret | — |
| `OAUTH_DISCOVERY_URL` | OIDC Discovery URL (use this OR manual URLs below) | — |
| `OAUTH_AUTHORIZATION_URL` | OAuth Authorization URL (manual config) | — |
| `OAUTH_TOKEN_URL` | OAuth Token URL (manual config) | — |
| `OAUTH_USER_INFO_URL` | OAuth User Info URL (manual config) | — |
| `OAUTH_SCOPES` | OAuth Scopes (space-separated) | `openid profile email` |
| `BETTER_AUTH_API_KEY` | Better Auth dashboard API key | — |
| `SMTP_HOST` | SMTP Server Host (for email features) | — |
| `SMTP_PORT` | SMTP Server Port | `587` |
| `SMTP_USER` | SMTP Username | — |
| `SMTP_PASS` | SMTP Password | — |
| `SMTP_FROM` | Default FROM address for emails | — |
| `SMTP_SECURE` | Use secure SMTP connection (`true` or `false`) | `false` |
| `S3_ACCESS_KEY_ID` | S3 Access Key | — |
| `S3_SECRET_ACCESS_KEY` | S3 Secret Key | — |
| `S3_REGION` | S3 Region | `us-east-1` |
| `S3_ENDPOINT` | S3-compatible Endpoint URL | — |
| `S3_BUCKET` | S3 Bucket Name | — |
| `S3_FORCE_PATH_STYLE` | Use path-style URLs for S3 (set `true` for MinIO/SeaweedFS) | `false` |
| `REDIS_URL` | Redis connection string for the AI Agent workspace | — |
| `ENCRYPTION_SECRET` | Encryption secret for saved AI provider credentials | — |
| `FLAG_DISABLE_SIGNUPS` | Disables new user signups | `false` |
| `FLAG_DISABLE_EMAIL_AUTH` | Disables email/password login (SSO only) | `false` |
| `FLAG_DISABLE_IMAGE_PROCESSING` | Disables image processing | `false` |
| `FLAG_ALLOW_UNSAFE_OAUTH_REDIRECT_URI` | Allows arbitrary dynamic OAuth redirect URIs | `false` |
| `FLAG_ALLOW_UNSAFE_AI_BASE_URL` | Allows unsafe/private/non-public AI provider base URLs | `false` |
> **Note:** Some variables are only required for using related features (OAuth, SMTP, S3, etc.) and can be left unset if unused.
> **AI features:** Saved AI provider management requires `ENCRYPTION_SECRET`, and the AI Agent workspace requires both `REDIS_URL` and `ENCRYPTION_SECRET`. Live web research depends on the selected AI provider/model supporting native web search. Keep `FLAG_ALLOW_UNSAFE_AI_BASE_URL` disabled unless this is a trusted self-hosted deployment; public HTTPS provider URLs are the safe default.
> **OAuth redirect safety:** Keep `FLAG_ALLOW_UNSAFE_OAUTH_REDIRECT_URI` disabled unless this is a trusted self-hosted deployment. Enabling it allows dynamic OAuth clients to register any parseable redirect URI, including custom schemes, private hosts, and non-loopback `http://` URLs, which can enable phishing or token exfiltration on public or multi-tenant instances.
> **Health check behavior:** `/api/health` reports status for database and storage. A failure in either dependency returns HTTP `503`.
---
You created an account, built a resume from the sample, made it yours, tried a template and downloaded a PDF. From
here, replace the rest of the sample with your own experience, or start a fresh resume from **New** in the sidebar
(press <kbd>N</kbd>).
## Next steps
<CardGroup cols={2}>
<Card title="Development Setup" icon="code" href="/contributing/development">
Set up a development environment to contribute or customize Reactive Resume.
<Card title="Create your first resume" icon="file-circle-plus" href="/guides/creating-your-first-resume">
Start from scratch, or import the resume you already have.
</Card>
<Card title="Project Architecture" icon="folder-open" href="/contributing/architecture">
Learn about the project structure and architecture.
<Card title="Get to know the editor" icon="table-columns" href="/guides/editor-overview">
Learn the editor bar, the three modes and the page view.
</Card>
<Card title="Check your resume" icon="list-check" href="/guides/checking-your-resume">
Fix the issues Check finds and compare your resume with a job posting.
</Card>
<Card title="Share your resume" icon="share-nodes" href="/guides/sharing-your-resume-publicly">
Publish a link that recruiters can open in their browser.
</Card>
</CardGroup>
<Note>
**Having trouble?** Check our [GitHub Issues](https://github.com/reactive-resume/reactive-resume/issues) or reach out via
[email](mailto:hello@amruthpillai.com).
</Note>
## Run your own copy
Want to host Reactive Resume on your own server instead? Follow [Self-hosting with Docker](/self-hosting/docker); the
[environment variables reference](/self-hosting/environment-variables) lists every setting. Developers who want to
change the code should start with the [development setup](/contributing/development).
+49 -58
View File
@@ -1,80 +1,71 @@
---
title: "Accessing the previous version"
description: "Access the previous version (v4) of Reactive Resume to retrieve old resumes, and export them for import into the latest version."
description: "Your v5 resumes carried over to Reactive Resume v6. Learn how to move resumes from a v5 or v4 copy into v6 by exporting and importing JSON."
---
## Check whether the previous version is available
Reactive Resume v6 replaced v5 on rxresu.me. This page explains what happened to your v5 work, and how to bring resumes
over from an older copy of Reactive Resume (v5 or v4) that you still have access to.
If you've used Reactive Resume for a while, you may have resumes saved in version 4 (v4). Access depends on whether
your self-hosted instance or the hosted previous-version service is currently available.
## Your v5 work is already in v6
<Info>
When the hosted previous version is available, its address is
[https://v4.rxresu.me](https://v4.rxresu.me). Availability is not guaranteed.
</Info>
If you used v5 on rxresu.me, you don't need to do anything. Your account, resumes, cover letters and applications moved
to v6 automatically. Sign in at [rxresu.me](https://rxresu.me) as before to find them in **Documents** and
**Applications**.
Self-hosted operators control their own v4 instance and backups. The [v4 to v5 migration
guide](/self-hosting/migration) applies only to infrastructure they are authorized to operate. It does not authorize
access to hosted databases or backups.
A few things look different after the move:
## When v4 is accessible
- Cover letters that were sections inside a resume are now separate letters in **Documents**, linked to that resume.
- Dates were converted to months and years. Any date that couldn't be read exactly still prints as you wrote it.
Open, export, and securely back up each resume you need. Import the export into v5 as a new resume; keep the v5 version
until you have compared both copies.
[What's new in v6](/guides/whats-new-in-v6) explains these and the other changes.
## Accessing your v4 resumes
## Is v5 still available?
There's no hosted copy of v5 that you can count on. If you need a resume exactly as it was in v5, your best option is a
JSON file you downloaded from v5 earlier, or a v5 copy that you or your organization runs.
People who host Reactive Resume themselves can keep running v5 by pinning the `v5` image tag (for example,
`amruthpillai/reactive-resume:v5`) on a database that hasn't been upgraded. v5 isn't meant to run on a database that v6
has already upgraded, so back up the database first. Server owners should read
[Upgrading to v6](/self-hosting/upgrading-to-v6) before they update.
## Move a resume from v5 into v6
If you have access to a v5 copy, export each resume there and import it into v6.
<Steps>
<Step title="Visit the v4 application">
Go to [https://v4.rxresu.me](https://v4.rxresu.me) in your browser.
<Step title="Export the resume from v5">
In v5, open the resume and download it as **JSON**. Repeat for each resume you want to keep.
</Step>
<Step title="Sign in with your existing credentials">
Use the same account credentials you used when you originally created your resumes in v4.
<Tip>
If you used social sign-in (Google, GitHub, etc.) in v4, use the same method to sign in.
</Tip>
<Step title="Open the New document dialog in v6">
Sign in at [rxresu.me](https://rxresu.me) (or your own address) and select **New** in the sidebar, or press
<kbd>N</kbd>.
</Step>
<Step title="Access your resumes">
If the dashboard contains your resumes, export each one as JSON before making more changes.
<Step title="Import the file">
Select **Import a resume** and choose the JSON file. Reactive Resume recognizes the format and shows how many
sections and entries it found. Select **Open in editor**.
</Step>
<Step title="Review what came in">
The editor tells you what it imported, including any dates to check. If the resume contained a cover letter, it's
saved as a separate letter in **Documents**.
</Step>
</Steps>
## Migrating to the new version
The import always creates a new resume. It never replaces one you already have, so compare the two before deleting
either. For more on importing, including other file types, see [Importing resumes](/guides/importing-resumes).
If you'd like to move your resumes to the latest version of Reactive Resume, you can export them from v4 and import them into the new version:
## Resumes from v4
1. In v4, open the resume you want to migrate
2. Export it as a JSON file
3. In the new version at [https://rxresu.me](https://rxresu.me), create a new account or sign in
4. Use the import feature to upload your JSON file (select the "Reactive Resume v4 (JSON)" option)
Version 4 is two versions old. At the time of writing, a copy may still be reachable at
[v4.rxresu.me](https://v4.rxresu.me), but its availability isn't guaranteed. If you can sign in there, open each resume,
export it as JSON, and import it into v6 as described above. v6 recognizes v4 files automatically.
<Info>
Import creates a separate resume. It should not be used to replace a newer v5 copy until you have compared both
versions.
</Info>
Server owners moving a self-hosted v4 installation should follow the [v4 to v5 migration guide](/self-hosting/migration)
first, then [Upgrading to v6](/self-hosting/upgrading-to-v6).
## When hosted v4 or a resume is unavailable
## If something is missing
Only an authorized hosted service operator can determine whether a source snapshot exists. Open a GitHub issue without
including resume contents, account credentials, reset links, or other private data. A useful request identifies the
approximate time of the missing edits, the sign-in method, and whether the resume is missing or merely not visible.
Recovery is handled per owner. Before accessing content, the operator must record a private case with source snapshot
time, owner verification, source-to-target mapping, target resume ID, content hashes, and proposed outcome. A matching
email address, username, or resume title alone is not proof of ownership.
Default recovery result is a private JSON export delivered through an approved channel to a verified recipient. Old-only
or divergent content must remain a separate copy; it must not overwrite a current v5 resume. If no source snapshot is
available, the factual outcome is that the records cannot be recovered from the service. Local tooling cannot recreate
missing source data.
An empty workspace with successful create responses or name conflicts can instead be a listing or account-mapping
problem. That requires a separate session, create, list, and reload diagnosis; a v4 recovery export does not resolve it.
## Questions or issues?
If you run into problems accessing v4, or have questions about migrating your resumes, open an issue on [GitHub](https://github.com/reactive-resume/reactive-resume/issues).
If a resume you expect is missing from v6, ask for help in
[GitHub Discussions](https://github.com/reactive-resume/reactive-resume/discussions/categories/q-a). Describe what's
missing and roughly when you last edited it. Don't post resume contents, passwords, reset links or other private
details.
-64
View File
@@ -1,64 +0,0 @@
---
title: "Adding a cover letter"
description: "Write a cover letter in Reactive Resume as a document of its own, match it to your resume's design, attach it to a job application, and export it."
---
A cover letter goes alongside your resume when you apply for a job. In Reactive Resume a cover letter is a document of its own, next to your resumes in **Documents**. It is not a section inside a resume.
## Create a cover letter
<Steps>
<Step title="Open New">
In **Documents**, click **New**, then **New cover letter instead**.
</Step>
<Step title="Pick who it's from">
Under **From**, choose the resume the letter goes with. The letter uses that resume's name, contact details and design, and follows them when you change the resume.
</Step>
<Step title="Pick who it's for">
Under **For**, link the job application the letter is for. The recipient fills in from the application, and the application lists the letter as the one you sent.
</Step>
<Step title="Write">
Write the body. The greeting and sign-off follow the recipient's name and your name.
</Step>
</Steps>
You can also start a letter from an application: open it in **Applications** and click **Write a letter** under **What you sent**.
## Match your resume, or design it on its own
By default a letter matches its resume's template, type and colors. Turn off **Match** in the letter's **Design** mode to give it a template, type, colors and page settings of its own.
## Attach a letter to an application
A letter linked to an application under **For** is that application's letter. Each application has one letter; linking a letter to another application moves it there. When the application reaches **Applied**, the letter is saved in its History as the version you sent.
## Export a letter
Open the letter and click **Share & export**, then **Download**, and pick PDF or DOCX. When you download a resume whose application has a letter, the resume's **Download** tab offers to include the letter as a second file.
## Letters written inside a resume
Older versions of Reactive Resume let you add a cover letter as a section of a resume. Those letters have moved to **Documents**:
- Each one is a letter of its own, named after its resume and section, for example "Frontend Resume — Cover Letter".
- It stays linked to that resume's details and design, so it looks as it did.
- If the resume was used by one application that had no letter, the letter is attached to that application.
- The resume no longer contains the letter. Older versions of the resume in its History still do; restoring one saves those letters again as letters.
Importing a resume file that contains cover letters, or sending one through the API, does the same: the letters are saved as letters and the resume keeps none.
## Tips for effective cover letters
<Tip>**Keep it concise**: Aim for 250-400 words. Recruiters spend about one minute reading cover letters.</Tip>
<Tip>
**Tailor each letter**: Write one letter per application. Reference specific job requirements and company values.
</Tip>
<Tip>
**Proofread carefully**: Spelling and grammar errors can disqualify your application. Review your letter before
exporting.
</Tip>
+59
View File
@@ -0,0 +1,59 @@
---
title: "Adding an application"
description: "Add a job to Applications by pasting its link or posting. Reactive Resume saves the posting so Check, the assistant and your letter can use it."
---
Add an application as soon as you find a job you like, or right after you apply. You paste the job link or the posting text, check the role and company, pick a stage, and you're done. The posting is saved with the application, so [Check](/guides/checking-your-resume), [the assistant](/guides/using-the-assistant) and [your cover letter](/guides/writing-a-cover-letter) can refer to it later.
## Add an application
<Steps>
<Step title="Open the Add dialog">
In **Applications**, select **Add application**. You can also press <kbd>⌘</kbd> <kbd>K</kbd> (<kbd>Ctrl</kbd> <kbd>K</kbd> on Windows and Linux) and run **New Application**.
</Step>
<Step title="Paste the job link or posting">
Paste into **Job link or posting text**. A single web address counts as a link; anything else counts as posting text. Reactive Resume starts reading it a moment after you stop typing. The line under the field tells you what it found.
</Step>
<Step title="Check the role and company">
**Role** and **Company** fill in from what was found. Correct them if needed, or type them yourself. Both are required.
</Step>
<Step title="Pick a stage">
Choose **Saved**, **Applied** (the default) or **Interview**. You can move the application to any stage later.
</Step>
<Step title="Add it">
Select **Add** to save it and open its details. Or select **Add and tailor a resume** to save it and go straight to making a copy of your resume for this job. See [Tailoring a resume for a job](/guides/tailoring-a-resume-for-a-job).
</Step>
</Steps>
<Frame caption="The Add an application dialog with pasted posting text">
<img src="/images/guides/adding-an-application/add-an-application-dialog.webp" alt="Add an application dialog with posting text pasted, a hint to fill in the role and company, Role set to Level Designer, Company set to Brightline Studios, the Stage control on Applied, and the Add and Add and tailor a resume buttons" />
</Frame>
## What gets read from a posting
What Reactive Resume can read depends on what you paste and whether you've [connected an AI provider](/guides/using-ai):
| You paste | Without an AI provider | With an AI provider |
| --- | --- | --- |
| A job link | Role, company and location, if the page includes structured job details. Many job boards do. | Role, company, location, salary and a short list of what the job asks for. |
| Posting text | Nothing is read. Fill in the role and company yourself. | Role, company, location, salary and a short list of what the job asks for. |
Either way, the posting text is saved with the application (up to 20,000 characters). For a link, Reactive Resume saves the page's text and keeps the link.
<Note>
Only public `https://` pages can be read. If a link can't be read, for example because the page needs you to sign in, you see "That link couldn't be read. Paste the posting text instead." Copy the posting from the page and paste it instead.
</Note>
## Add more details
The Add dialog keeps things short on purpose. Once the application is saved, its details sheet opens, where you can add the salary, source, contacts, tags, notes and a follow-up date. To edit everything in one form, including the job posting link, location and linked resume, open the **⋯** menu in the details sheet and select **Edit details…**. See [Managing an application](/guides/managing-an-application).
## Other ways to add applications
- **From a spreadsheet**: import many at once from a CSV file. See [Importing applications from CSV](/guides/importing-applications-from-csv).
- **From an AI client**: create applications over MCP. See [Managing applications with MCP](/guides/managing-applications-with-mcp).
## Next steps
- [Managing an application](/guides/managing-an-application): move it through stages and keep notes.
- [Tailoring a resume for a job](/guides/tailoring-a-resume-for-a-job): make a version of your resume for this posting.
+51 -63
View File
@@ -1,88 +1,76 @@
---
title: "AI Agent tools"
description: "Reference for the tools the Reactive Resume AI Agent can call to read, edit, patch, and preview resume drafts inside an isolated workspace."
title: "Assistant tools"
description: "Reference for the tools the Reactive Resume assistant can call: reading your document and attachments, proposing edits, asking questions and searching the web."
---
The AI Agent workspace has a fixed set of tools it can use while it chats with you. You do not call these tools directly. The agent picks them when your request needs resume data, supported provider web context, attachments, questions, or a resume patch.
The assistant works through a small, fixed set of tools. You never call them yourself: the assistant picks one when your request needs it, and the conversation shows a short status line for each step. This page lists every tool, what it does, and when it's available.
## Tool activity in chat
Tool activity appears inside the conversation. Some activity is collapsed by default so the chat stays readable.
Applied resume patches are shown as a small inline **Patch applied** item. Open it to inspect the raw JSON payload.
<Frame caption="Patch details and tool activity in the AI Agent chat">
<img
src="/images/guides/ai-agent-tools/screenshot-1.webp"
alt="AI Agent chat showing an applied patch with raw JSON details"
/>
<Frame caption="Tool steps appear as short status lines in the conversation">
<img src="/images/guides/ai-agent-tools/tool-status-in-conversation.webp" alt="A request to tighten the summary, followed by the status line Read the resume with a checkmark and the start of a card titled 1 of 1 applied" />
</Frame>
## Available tools
## Tools
| Tool | What it does | Example request |
| --- | --- | --- |
| `read_resume` | Reads the current AI draft and gives the agent the resume data it can safely edit. | "What are the weakest parts of this resume?" |
| `web_search` | Uses the selected provider's native web search when that provider/model supports it. | "Research this company and adjust the summary for its product area." |
| `read_attachment` | Reads extracted text from attached plain text, Markdown, or JSON files. Other supported attachments, such as images or PDFs, are passed to the model when the selected provider can use them. | "Use the attached notes to update the keywords." |
| `ask_user_question` | Shows a question card with answer choices when the agent needs your decision. | "Ask me before changing the career narrative." |
| `apply_resume_patch` | Applies a JSON Patch to the AI draft and stores a rollback snapshot. | "Change the visible name to Amruth Pillai." |
| Tool | What it does | Shown in the conversation as | Available when |
| --- | --- | --- | --- |
| `read_resume` | Reads the open resume: its full text, plus every passage an edit can target (each paragraph of the summary, each bullet or paragraph of an entry's description), each with an ID. Hidden sections and entries are left out. | **Read the resume** | You're in a resume and the document chip is included in your message. |
| `read_letter` | Reads the open cover letter's body, sender and recipient, plus the text of the resume it's linked to, if any. The greeting and sign-off aren't editable through the assistant. | **Read the letter** | You're in a letter and the document chip is included in your message. |
| `propose_edits` | Proposes a set of up to 12 edits with a short title. Each edit either rewrites one passage or adds a new passage after it, and comes with a one-line reason. Nothing changes until you accept. | **Preparing edits…**, then the proposed edits card | Same as the read tool. |
| `ask_user_question` | Asks you a short question, with up to four suggested answers, before the assistant continues. | A blue question card | Always. |
| `read_attachment` | Reads a file attached to a message. Text, Markdown and JSON files return their content (up to 40,000 characters). | **Read the attachment** | Always; useful only when the message has attachments. |
| `web_search` | Searches the web through the provider's own search tool and returns sources. | **Searched the web**, with **Sources** under the reply | Only with an OpenAI provider on its default base URL and a supported model. |
## Resume patches
## How edits are placed
Resume patches are rooted at the resume data object. For example, the visible resume name is patched at `/basics/name`.
Every edit targets one passage by the ID the read tool returned. When you accept, the new text replaces that passage (or is added after it) in your document, as a single step you can undo.
When a patch is applied:
If you or another change edits a passage after the assistant read it, the edit can no longer be placed. The card then says, for example, "1 edit couldn't be placed: its text changed. Ask again to redo it." Edits that were placed but whose passage changed afterwards show **Out of date: the text has changed since.**
- the AI draft updates immediately;
- the raw JSON Patch is available from the **Patch applied** details;
- a snapshot is stored so the draft can be restored to the state before that patch;
- the resume preview refreshes to show the updated draft.
The assistant is instructed to rewrite only what your document already says: it doesn't add employers, titles, dates, numbers, skills or achievements that aren't in the document or the conversation. When a job posting asks for something your document doesn't mention, it uses `ask_user_question` first, and only drafts it from your answer.
Restoring an older patch rolls back that patch and any patches applied after it. If the resume changed after the latest agent patch, restore or apply can fail with a version conflict. In that case, ask the agent to retry from the latest draft.
## What the assistant also sees
## Web access
Besides what the tools return, each message can include:
Live web research is handled only by the selected AI provider's native web search tool. When the provider/model supports it, the agent can use `web_search` for current company, industry, role, or URL-based context.
- **The job posting**: the role, the company, the job description (or its requirements list) and your notes from the linked application. A resume uses the application it was made for, or else the most recently updated application it's linked to. A letter uses only the application it was made for. Removing the posting chip leaves it out.
- **Attachments**: images, PDFs and MP3 or WAV audio are passed to the model directly, when the provider supports them. Other types are only listed by name.
- **The conversation so far**: earlier messages, tool results and your answers.
Provider-native `web_search` is not JSearch and does not restore the removed structured job-listings experience. It supplies web context to the agent; it does not provide a structured job-results API or guarantee that a provider/model can search.
## Web search support
When the provider/model does not support native web search, the agent still works for normal resume editing. If you ask it to browse, search the web, fetch a URL, or use current online context, it should tell you that live web research is unavailable with the selected provider/model and ask you to paste or attach the relevant content instead.
`web_search` uses OpenAI's native search, so it's only offered when all of these are true:
For a controlled workflow that works without live research, follow [Tailor a resume to a supplied job description](/guides/using-ai-agent#tailor-a-resume-to-a-supplied-job-description). Configure, test, and enable providers as described in [Using artificial intelligence](/guides/using-ai).
- The provider is **OpenAI** (not OpenAI-compatible or a gateway).
- The base URL is the default, `https://api.openai.com/v1`.
- The model is one of `gpt-5.5-pro`, `gpt-5.5`, `gpt-5.4`, `gpt-5.4-pro`, `gpt-5.4-mini`, `gpt-5.4-nano`, `gpt-5`, `gpt-5-mini`, `gpt-5-nano`, `gpt-4.1`, `gpt-4.1-mini` or `o4-mini`, or a dated snapshot of one of them (such as `gpt-4.1-2025-04-14`).
For self-hosted deployments:
Otherwise, the assistant tells you it can't browse with this model and asks you to paste what it needs, such as the text of a job page.
- app-owned URL crawling is not available;
- web access depends on the selected provider/model supporting native web search;
- unsafe/private AI provider base URLs require `FLAG_ALLOW_UNSAFE_AI_BASE_URL=true`, which should only be used on trusted self-hosted deployments.
## Limits
## Attachments
| Limit | Value |
| --- | --- |
| Edits per proposal set | 12 |
| Tool steps per reply | 30 |
| Length of one reply | About 4 minutes, then "Time limit reached. Your progress is saved. Ask me to continue." |
| Attachments per message | 10 |
| Size per attachment | 25 MB |
| Attachments per conversation | 100 MB in total |
| Text read from one attachment | 40,000 characters |
Attach files from the chat composer when the agent needs extra context, such as:
## Earlier conversations
- a job description PDF;
- a portfolio brief;
- a screenshot;
- a plain text note with constraints.
Before v6, the AI agent changed resumes directly with an `apply_resume_patch` tool. Conversations from that time still open. Those steps show as **Changed the resume directly (an earlier conversation)**, and the assistant no longer has that tool.
Self-hosted deployments need S3-compatible storage for private agent attachments. Local filesystem storage rejects private objects.
The assistant's tools are separate from the MCP server, which lets outside AI clients such as Claude or Cursor work with your resumes. See [Using the MCP server](/guides/using-the-mcp-server).
## Good prompts for tool use
## Related guides
Use direct prompts that tell the agent what context to use and how cautious to be:
- "Research this role, identify the most important keywords, and apply a conservative patch."
- "Read the attached job description and ask me before changing anything outside the summary."
- "Compare my current projects against this company page and suggest only truthful wording."
- "Apply a patch for the visible resume name, then show me what changed."
## When tools are unavailable
Tool use can be limited by the selected provider, deployment configuration, or thread state.
- A deleted provider makes the thread read-only; a disabled or untested provider blocks new agent runs until it is enabled and tested again.
- A deleted working resume makes the thread read-only.
- Archived threads cannot receive new messages.
- Live web research is unavailable when the selected provider/model does not support native web search.
- Attachments may fail if private object storage is not configured.
<CardGroup cols={2}>
<Card title="Using the assistant" href="/guides/using-the-assistant">
Ask for changes and review proposed edits.
</Card>
<Card title="Connecting an AI provider" href="/guides/using-ai">
Choose the provider and model the assistant uses.
</Card>
</CardGroup>
+95
View File
@@ -0,0 +1,95 @@
---
title: "Arranging the layout"
description: "Move the sidebar left or right, change its width, move sections between columns and pages, split sections into columns, and control page breaks."
---
Every resume has a layout: a list of pages, and on each page a **main** column and a **sidebar**. This guide shows how to change the sidebar, move sections between columns and pages, show a section's entries in several columns, and decide where pages break.
## How the layout works
- **Pages.** You decide which sections start on which page. If a page's sections don't fit, the rest runs onto an extra page; see [Fitting content on a page](/guides/fitting-content-on-a-page).
- **Main and sidebar.** On a two-column template, the sidebar prints as its own narrow column. On a one-column template, sidebar sections print after the main sections.
- **Print order.** In Write, the list of sections shows them in the order they print: page by page, the main column first and then the sidebar. Dividers mark where each page and each sidebar starts.
<Frame caption="Write lists sections in print order, with dividers for pages and sidebars">
<img src="/images/guides/arranging-the-layout/write-outline-pages.webp" alt="The Write panel's section list headed Sections, print order, with a Page 1 divider over Summary, Education and Experience, a Sidebar divider over Profiles and Skills, and a Page 2 divider over Experience and Awards" />
</Frame>
## Move the sidebar and change its width
On a two-column template, a **Sidebar** panel appears under the template gallery in **Design → Template**.
<Frame caption="The Sidebar panel under the template gallery">
<img src="/images/guides/arranging-the-layout/sidebar-panel.webp" alt="The Sidebar panel with a Left and Right switch, Left selected, and a Width slider set to 30%" />
</Frame>
- **Left** / **Right** puts the sidebar on that side, whatever the template's usual side is.
- **Width** sets the sidebar's share of the page, from 26% to 42%.
For a width outside that range, use **Sidebar Width** in **Advanced → Layout**, which goes from 10% to 50%.
## Reorder sections and move them between columns
In **Write**:
- Drag a section by its handle (the dotted grip on the left) to a new place in the list. Dragging it below a **Sidebar** divider moves it into the sidebar; dragging it past a **Page** divider moves it to that page.
- Or focus a section's title and press <kbd>⌥</kbd> <kbd>↑</kbd> or <kbd>⌥</kbd> <kbd>↓</kbd> (<kbd>Alt</kbd> <kbd>↑</kbd> or <kbd>Alt</kbd> <kbd>↓</kbd> on Windows and Linux).
- Or open the section's **⋯** menu and select **Move up** or **Move down**.
For more on the section menu, see [Managing sections](/guides/managing-sections).
## Manage pages in Advanced → Layout
**Advanced → Layout** shows every page as a box with its **Main** and **Sidebar** columns. Open **Advanced** at the bottom of the Design panel to find it.
<Frame caption="A page in Advanced → Layout">
<img src="/images/guides/arranging-the-layout/advanced-layout-page.webp" alt="The Layout editor showing Page 1 with a Full Width switch and a Delete Page button, a Sidebar column containing Profiles and Skills, and a Main column containing Summary, Education and Experience" />
</Frame>
Here you can:
- **Drag** sections between columns and between pages.
- Select **Add Page** (below the last page) to add an empty page.
- Select **Delete Page** to remove a page. Its sections move to the first page (or to the second page, if you delete the first). You can't delete the only page.
- Turn on **Full Width** to print that page in a single column. Its sidebar sections move into the main column.
Each section also has a **⋮** menu:
<Frame caption="A section's menu in Advanced → Layout">
<img src="/images/guides/arranging-the-layout/layout-move-to-menu.webp" alt="The menu for the Summary section with Move to open, listing Page 1, Page 2, Page 3 and New Page, and below it Keep together with the note Only applies when the section fits on a single page, and Start on new page" />
</Frame>
- **Move to** → a page → **Main** or **Sidebar** moves the section there. **New Page** moves it onto a page of its own at the end. Sidebar isn't offered on full-width pages or with one-column templates.
- **Keep together** and **Start on new page** control page breaks, described below.
## Show a section's entries in columns
Short entries, such as skills, languages or interests, can sit side by side. In **Write**, open the section's **⋯** menu, point to **Columns** and choose **1 column** to **6 columns**.
<Frame caption="The Columns submenu in a section's ⋯ menu">
<img src="/images/guides/arranging-the-layout/section-columns-menu.webp" alt="The Skills section's menu in Write with Columns open, listing 1 column (checked) through 6 columns and 1 column, inline, and further items Keyword layout, Keep on one page, Start on a new page and Clear section" />
</Frame>
The Skills section has two extra choices:
- **1 column, inline** runs skills together on one line instead of stacking them.
- **Keyword layout** shows each skill's keywords **Inline** (on one line) or as a **Bulleted list**.
## Control page breaks
Two switches decide how a section behaves at the end of a page. You find them in the section's **⋯** menu in Write and in its **⋮** menu in Advanced → Layout; both places change the same setting.
| In Write | In Advanced → Layout | What it does |
| --- | --- | --- |
| **Keep on one page** | **Keep together** | Moves the whole section to the next page instead of splitting it. It only works when the section fits on one page. |
| **Start on a new page** | **Start on new page** | Always begins the section at the top of a new page. |
<Tip>
Keeping a section together can leave a large gap at the bottom of the previous page. If that happens, move a shorter section into the gap or turn the switch off.
</Tip>
## Related guides
- [Choosing a template](/guides/choosing-a-template): one- and two-column templates.
- [Managing sections](/guides/managing-sections): add, rename, hide and remove sections.
- [Fitting content on a page](/guides/fitting-content-on-a-page): keep to the pages you planned.
@@ -0,0 +1,66 @@
---
title: "Changing appearance and language"
description: "Switch Reactive Resume between light, dark and system themes, change the interface language, and see how the app handles reduced motion."
---
You can choose how the app looks and which language its menus and buttons use. These settings change the app only. Your resumes always print on white paper, in the language set for each resume.
## Change the theme
<Steps>
<Step title="Open Preferences">
Select your name at the bottom of the sidebar, then **Settings**, then **Preferences**.
</Step>
<Step title="Pick a theme under Appearance">
- **Light**: a light background all the time.
- **Dark**: a dark background all the time.
- **System**: follows your device's light or dark setting and switches when it does. This is the default.
</Step>
</Steps>
The change applies at once. Reactive Resume remembers it in this browser, so another device or browser keeps its own choice.
<Frame caption="The Preferences page">
<img src="/images/guides/changing-appearance-and-language/preferences-page.webp" alt="The Preferences page with Light, Dark and System theme tiles under Appearance, an English language picker under Language, and a Motion note" />
</Frame>
### Other ways to switch
- Select your name at the bottom of the sidebar, point to **Theme**, and choose **Light**, **Dark** or **System**.
- Press <kbd>⌘</kbd> <kbd>K</kbd> (<kbd>Ctrl</kbd> <kbd>K</kbd> on Windows and Linux), choose **Change theme to…**, then pick a theme.
<Frame caption="The theme options in the account menu">
<img src="/images/guides/changing-appearance-and-language/account-menu-theme.webp" alt="The account menu opened from the sidebar with Settings, Language, Theme and Sign out, and a Theme submenu listing Light, Dark and System with System checked" />
</Frame>
## Change the interface language
<Steps>
<Step title="Open Preferences">
Go to **Settings → Preferences**.
</Step>
<Step title="Choose a language under Language">
Open the picker and choose from more than 50 languages. You can type to filter the list.
</Step>
</Steps>
The page reloads in the new language. Like the theme, the choice is saved in this browser.
You can also change it from your name in the sidebar (**Language**), or with <kbd>⌘</kbd> <kbd>K</kbd> and **Change language to…**.
The interface language doesn't translate your resume. Each resume has its own **Language** setting in the **Page** group of the editor's **Design** mode, which sets the section titles and date words on the page. See [Set the language](/guides/selecting-page-format#set-the-language).
<Tip>
Spotted a wrong or missing translation? Select **Help translate** under the language picker to suggest a fix on Crowdin. See [Translations](/contributing/translations).
</Tip>
## Reduce motion
Reactive Resume has no motion switch of its own. It follows your operating system's reduced-motion setting: turn that on, and the app replaces movement with simple fades. Nothing in the app animates on its own without you doing something first.
## Related guides
- [Using the command bar](/guides/using-the-command-bar): change settings and jump anywhere from the keyboard.
- [Updating your profile](/guides/updating-your-profile): your name, photo, username and email.
+43 -66
View File
@@ -1,89 +1,66 @@
---
title: "Checking service status"
description: "Check the current uptime and incident status for Reactive Resume's hosted servers, and see what to do when the service is down or slow."
description: "Find out whether rxresu.me is up, see its recent uptime, and learn what to do when Reactive Resume is slow or unreachable."
---
## Status page
If rxresu.me won't load, is slow, or something that normally works keeps failing, check the status page first. It tells
you whether the problem is on our side or yours.
You can check the health of Reactive Resume's servers at any time on the status page:
## Check the status page
<Card title="Status Page" icon="signal" href="https://status.rxresu.me">
View real-time server metrics including uptime, CPU usage, memory usage, and more.
Open [status.rxresu.me](https://status.rxresu.me). The page shows:
- Whether the service is **Online** right now, and for how long.
- Uptime for the last 24 hours, the last 7 days and each recent month.
- When it last checked. The service is checked every minute from several locations around the world.
<Card title="Reactive Resume status" icon="signal" href="https://status.rxresu.me">
Live and recent uptime for rxresu.me.
</Card>
The status page shows:
- **Uptime**: How long the servers have been running without interruption
- **CPU Usage**: Current processor utilization
- **Memory Usage**: RAM consumption across services
- **Response Times**: How quickly the servers are responding to requests
---
## What to do if servers are down
If the servers are under high load or unreachable:
## If the service is down or slow
<Steps>
<Step title="Check the status page">
Visit [status.rxresu.me](https://status.rxresu.me) to confirm if there's an ongoing issue. The page will show you the current state of all services.
<Step title="Confirm it on the status page">
If the status page shows a problem, it's on our side. You don't need to do anything else.
</Step>
<Step title="Wait and try again later">
If the servers are under heavy load, wait a while and try again. Peak usage times can cause temporary slowdowns.
<Info>
Reactive Resume is a **free, open-source service** used by thousands of people worldwide. During peak times, the servers may experience higher than usual load.
</Info>
<Step title="Wait and try again">
Most outages and slowdowns are short. Try again in a few minutes. Your documents are safe on the server while it's
unavailable.
</Step>
<Step title="Check for announcements">
For major outages or planned maintenance, announcements may be posted on our [GitHub repository](https://github.com/reactive-resume/reactive-resume).
<Step title="Look for announcements">
Longer outages and planned maintenance are announced on
[GitHub](https://github.com/reactive-resume/reactive-resume) and the
[Discord server](https://discord.gg/aSyA5ZSxpb).
</Step>
</Steps>
---
## If the status page says everything is fine
## A note on server capacity
The problem is probably between your device and the service. Try these in order:
<Warning>
Reactive Resume is a **free service** that runs on limited server resources. As an open-source project maintained by a
single developer, it's not feasible to invest in powerful dedicated servers without community support.
</Warning>
1. Reload the page.
2. Check your internet connection by opening another website.
3. Open rxresu.me in a private window. If it works there, a browser extension, such as an ad or script blocker, may be
getting in the way.
4. Try a different browser or device.
Thousands of people use the service every day. Because it is free and has no venture funding behind it, server capacity stays constrained.
If you lose your connection while editing, the editor says so under the document name and keeps your changes on this
device. They're sent as soon as you're back online. Downloading and sharing are unavailable until then.
If Reactive Resume is useful to you and you want to help keep the servers running (and maybe scale them up), consider supporting the project.
Still stuck? Ask in [GitHub Discussions](https://github.com/reactive-resume/reactive-resume/discussions/categories/q-a).
If you can reproduce a bug, [open an issue](https://github.com/reactive-resume/reactive-resume/issues).
---
## If you run your own copy
## Support the project
The status page only covers rxresu.me. A self-hosted copy reports its own health at `/api/health` on your address, for
example `https://resume.example.com/api/health`. It returns `healthy` when the database, file storage and (if you use it)
Redis are working, and an HTTP `503` error when any of them fails. See [Self-hosting with Docker](/self-hosting/docker) for setup and
health checks.
Donations go directly toward server costs, better infrastructure, and keeping Reactive Resume free for everyone.
## Help keep the service running
<Card title="Donate on Open Collective" icon="heart" href="https://opencollective.com/reactive-resume/donate">
Support Reactive Resume's development and server costs through Open Collective. Every contribution helps keep the
service running.
</Card>
<CardGroup cols={2}>
<Card title="One-time Donation" icon="gift">
Make a single contribution of any amount to help with immediate server costs.
</Card>
<Card title="Recurring Support" icon="repeat">
Become a backer with a monthly contribution to provide sustainable support.
</Card>
</CardGroup>
---
## Self-hosting as an alternative
If you need guaranteed uptime, or want to avoid the limits of a shared server, you can self-host Reactive Resume on your own infrastructure.
<Card title="Self-Hosting Guide" icon="server" href="/self-hosting/docker">
Learn how to deploy Reactive Resume on your own servers using Docker.
</Card>
Self-hosting gives you full control over your data and infrastructure, availability that depends only on your own server capacity, and no resources shared with other users.
Reactive Resume is free and has no ads or investors. Server costs are paid by donations, so busy periods can still slow
it down. If Reactive Resume helps you, consider
[donating on Open Collective](https://opencollective.com/reactive-resume/donate). If you need guaranteed availability,
you can [host your own copy](/self-hosting/docker).
+177
View File
@@ -0,0 +1,177 @@
---
title: "Checking your resume before you apply"
description: "Use Check mode to see how well software reads your resume, fix issues pinned to their lines, match a job posting and review your wording."
---
Before you send a resume, open **Check** in the editor. It shows how reliably an applicant tracking system (ATS) can read your resume, pins each problem to the line it's about, and compares your resume with a job posting. Everything except the optional writing review runs in your browser.
<Frame caption="Check mode: the score and issues on the left, numbered pins on the page">
<img src="/images/guides/checking-your-resume/check-mode-overview.webp" alt="The resume editor in Check mode, with a score of 86, three numbered issue cards in the panel and a matching numbered pin in the page margin" />
</Frame>
## Open Check
In the editor bar, select **Check**, or press <kbd>3</kbd> when you aren't typing in a field. The tab shows how many issues are open, or a check mark when there are none.
Check updates as you edit. Switch to **Write**, change something, and the score and issues follow straight away.
## Read the score
The panel starts with a score from 0 to 100 and a short verdict: **Reads cleanly** (80 and above), **Mostly readable** (50 to 79) or **Hard for software to read** (below 50).
<Frame caption="The score, what it counts, and the first issue card">
<img src="/images/guides/checking-your-resume/score-and-issues.webp" alt="Score card reading 86, Reads cleanly, 19 of 22 checks pass, 3 things to review, above the Issues, Job match and Writing tabs and an issue card titled Sidebar is read after the main column" />
</Frame>
The score is the share of checks your resume passes, for example **19 of 22 checks pass**. There are 22 checks, grouped into five categories:
| Category | What it looks at |
| --- | --- |
| **Contact details** | Your name, email, phone and location are there, email and links are in a form software recognises, and whether a photo is showing. |
| **Dates** | Every experience and education entry has dates, in a form software reads, that don't run backwards or start in the future. |
| **Layout** | Every section with entries is placed on a page, text reads in order (sidebars, multi-column sections), and body text size, line height and page margins aren't too small. |
| **Section headings** | Headings are ones software looks for, such as Experience, Education and Skills, and some work history shows. |
| **Writing** | Every role describes what you did. |
The heading check only runs when your resume's language is English, so resumes in other languages have 21 checks.
<Note>
The score measures how reliably software can read your resume. It doesn't predict whether you'll be shortlisted.
</Note>
Below the issues, **Checks by category** lists each category with how many checks pass, or how many need a look. Select a row to read what it covers.
<Frame caption="Checks by category, with the exported PDF check below">
<img src="/images/guides/checking-your-resume/checks-by-category.webp" alt="Checks by category list: Contact details 1 to review, Dates 5 of 5, Layout 2 to review, Section headings 2 of 2, Writing 1 of 1, followed by the button Also check the exported PDF" />
</Frame>
## Fix issues
The **Issues** tab lists every open issue as a numbered card, most serious first. Each card names its category, says what's wrong in plain words, and offers a fix.
<Steps>
<Step title="Find the issue on the page">
Each issue about a specific part of your resume has a matching numbered pin in the page margin, with a wavy underline under that part. Select a card, or its **Show on page** button, to outline the line on the page and scroll to it. Select a pin on the page to jump to its card.
<Frame caption="Issue 2 selected: its pin and outline on the page">
<img src="/images/guides/checking-your-resume/issue-pinned-on-page.webp" alt="The Volunteer section of a resume outlined in amber, with a numbered pin 2 in the left margin" />
</Frame>
</Step>
<Step title="Apply the fix">
Many issues fix in one step. The card's main button says what it does, for example **Hide the photo**, **Use one column**, **Switch to one column** or **Use the standard heading**. A message confirms the change and offers **Undo**.
Other issues need you to write something, such as a missing phone number or a role with no description. Their button, for example **Add a phone number** or **Describe the role**, switches to **Write** and opens the right field.
</Step>
<Step title="Or set the issue aside">
If an issue doesn't apply to you, select **Ignore**. For a choice that is yours to make, such as a two-column design, the button reads **Keep** instead. Ignored issues no longer count against the score. To bring them back, select **Show them again** under the list.
</Step>
</Steps>
When every check passes, the tab reads **Nothing to fix.**
<Tip>
On a phone, selecting a pin opens a bar at the top of the page that reads "Issue 1 of 3". Use the arrows to step through the issues and fix each one from the card at the bottom, without leaving the page.
</Tip>
## See what a parser reads
At the top of the page, switch from **What a person sees** to **What a parser reads**. The page is replaced by the text software pulls out of your resume's PDF, in the order it comes out, with the name, email, phone, location, links, section headings and dates it recognised.
<Frame caption="What a parser reads. On this two-column resume, the location was picked up from the wrong line">
<img src="/images/guides/checking-your-resume/parser-view.webp" alt="The parser view, listing the name, email, phone, location, links and sections software found in the resume's PDF, marked as text layer with 2 columns" />
</Frame>
Use it to spot content that lands in the wrong place, for example a sidebar read after your experience, or a field picked up from the wrong line. Switch back with **What a person sees**.
## Match your resume to a job
The **Job match** tab picks out the terms a job posting stresses and shows which ones your resume already has. It isn't part of the score.
<Steps>
<Step title="Give it a posting">
If the resume is linked to an application that has a saved posting, Job match uses that posting. If the linked application has no posting yet, paste it into the box and select **Save to the application**. Otherwise, choose an application from the list, or paste the posting into the box and select **Match this posting**.
A pasted posting is kept for this visit only. To keep it, select **Save as application…**, enter the **Company** and **Role**, and select **Save and link**. This creates an application and links the resume to it.
</Step>
<Step title="Review the terms">
The tab shows how many posting terms appear, for example **19 of 25 posting terms appear**. Terms under **Not in your resume · add only if true** are missing. Terms under **Already covered** are there already: select one to highlight where it appears on the page.
</Step>
<Step title="Add a missing term, if it's true">
Select a missing term to see how often the posting uses it, then choose:
- **Add to Skills** to add it as a keyword on your first visible skill, which the button names (for example **Add to Skills · Unity Engine**). If you have no skills, it creates one.
- **Ask the assistant to work it in** to open the Assistant, which asks you before it adds anything.
- **Not true for me, hide it** to leave it out of the match. Hidden terms are listed under the tab with **Show again**.
</Step>
</Steps>
<Frame caption="Job match with a pasted posting and a missing term selected">
<img src="/images/guides/checking-your-resume/job-match-pasted-posting.webp" alt="Job match tab showing a pasted posting, 19 of 25 posting terms appear, missing terms such as Perforce and agile, the options for Perforce, and a list of terms already covered" />
</Frame>
Once a resume is linked, the top of the tab names the application. Select **Change** to link a different application or to unlink it.
<Frame>
<img src="/images/guides/checking-your-resume/job-match-linked-application.webp" alt="Job match source card reading Senior Gameplay Engineer at Northwind Games, Posting from the linked application, with a Change button" />
</Frame>
## Check the exported PDF
The checks above read your resume's content and settings. To test the actual file a recruiter receives, select **Also check the exported PDF** at the bottom of the **Issues** tab. Reactive Resume creates the PDF in your browser and runs the full file check on it, the same one the [ATS checker](/guides/using-the-ats-checker) uses. Nothing is uploaded.
A message tells you whether the PDF reads cleanly or how many more things there are to look at. Anything it finds is pinned to the page with a PDF icon and a dashed outline.
<Frame caption="A pin from the exported PDF check">
<img src="/images/guides/checking-your-resume/exported-pdf-pin.webp" alt="A blue PDF pin in the page margin next to a dashed outline around the resume's profile links" />
</Frame>
Select **Show** in the message, or any PDF pin, to open the full report. It gives a score out of 100, a score for each category (**Readability**, **Layout**, **Sections**, **Contact details**, **Dates**), and each finding with what to do about it. **Writing** holds tips that don't affect the score.
<Frame caption="The exported PDF report">
<img src="/images/guides/checking-your-resume/exported-pdf-report.webp" alt="Dialog titled The exported PDF, with a score of 96 out of 100, 54 of 56 applicable checks passed, and the Layout category open showing two warnings" />
</Frame>
The pins show while the **Issues** tab is open, until you change the resume. After an edit, run the check again.
## Get a second opinion on your wording
The checks are mechanical. The **Writing** tab asks an AI model how a reader might react to your summary and bullets, and suggests rewrites. It needs your own AI provider; see [Connecting an AI provider](/guides/using-ai). Without one, the tab offers **Open AI settings**. Issues and Job match work without AI.
<Steps>
<Step title="Choose the model">
The tab says where your resume's text goes, for example "Sends your resume's text only to OpenAI · gpt-5-mini, with your key." To use another of your providers, select **Change** and pick it.
<Frame>
<img src="/images/guides/checking-your-resume/writing-review-start.webp" alt="Writing tab titled A second opinion on your wording, stating the resume text is sent only to OpenAI gpt-5-mini, with a Change link, a provider picker and a Review writing button" />
</Frame>
</Step>
<Step title="Run the review">
Select **Review writing**. The review reads up to 120 bullets and paragraphs.
</Step>
<Step title="Accept or reject the suggestions">
Rewrites of your own bullets appear as **Proposed edits**, numbered in the page margin. Select **Accept** or **Reject** on each, or **Accept all**. With an edit focused, <kbd>A</kbd> accepts it, <kbd>R</kbd> rejects it, and <kbd>↑</kbd> <kbd>↓</kbd> move between edits.
Advice that isn't a rewrite appears as a note marked **High**, **Medium** or **Low**, with **Show on page**. **What's working** lists your strengths. Select **Run again** for a fresh review.
</Step>
</Steps>
<Warning>
A model's opinion can be wrong, and the review never changes the score. Accept only the rewrites that are true to your experience.
</Warning>
## Related guides
<CardGroup cols={2}>
<Card title="Using the ATS checker" href="/guides/using-the-ats-checker">
Check any resume PDF, from any tool, without signing in.
</Card>
<Card title="Tailoring a resume for a job" href="/guides/tailoring-a-resume-for-a-job">
Copy a resume for an application and adjust it to the posting.
</Card>
<Card title="Using the Assistant" href="/guides/using-the-assistant">
Ask the AI assistant to rework parts of your resume.
</Card>
<Card title="Arranging the layout" href="/guides/arranging-the-layout">
Move sections between columns and pages.
</Card>
</CardGroup>
+133 -133
View File
@@ -1,166 +1,166 @@
---
title: "Choosing a template"
description: "Compare the built-in Reactive Resume templates, preview each layout, and switch between them from the builder to pick the best design for your resume."
description: "Browse the 15 Reactive Resume templates drawn with your own content, preview one on the page, and apply it without losing any of your work."
---
Reactive Resume includes many templates, each with its own design. This guide covers how they differ and how to switch between them.
A template decides the layout of your resume: where the header sits, whether there is a sidebar, and how headings and entries look. You can switch templates at any time. Your content, fonts and colors stay the same.
## How to change your template
You can change templates at any time without losing your content.
## Open the template gallery
<Steps>
<Step title="Open your resume in the builder">
Navigate to your Dashboard and click on the resume you want to edit.
<Frame caption="Screenshot of your resumes dashboard showing all your resume">
<img src="/images/guides/choosing-a-template/screenshot-1.webp" alt="Screenshot of your resumes dashboard showing all your resume" />
</Frame>
<Step title="Open your resume">
From **Documents**, open the resume you want to change.
</Step>
<Step title="Open the right sidebar">
In the resume builder, look for the right sidebar. This is where you'll find all the design and layout options.
</Step>
<Step title="Navigate to the Template section">
In the right sidebar, find and click on the **Template** section to expand it.
<Frame caption="Screenshot of the template section in the right sidebar">
<img src="/images/guides/choosing-a-template/screenshot-2.webp" alt="Screenshot of the template section in the right sidebar" />
</Frame>
<Step title="Switch to Design">
Select **Design** at the top of the editor, or press <kbd>2</kbd> while you are not typing in a field.
</Step>
<Step title="Select your new template">
Browse the available templates and click the one you want. Your resume updates immediately.
<Frame caption="Screenshot of selecting a new template from the gallery">
<img src="/images/guides/choosing-a-template/screenshot-3.webp" alt="Screenshot of selecting a new template from the gallery" />
</Frame>
</Step>
<Step title="Review and adjust">
After changing the template, review your resume in the live preview. You may want to adjust spacing, colors, or layout to optimize for the new design.
<Frame caption="Screenshot of the resume with a new template applied">
<img src="/images/guides/choosing-a-template/screenshot-4.webp" alt="Screenshot of the resume with a new template applied" />
</Frame>
<Tip>
Different templates may display your content differently. Some templates work better with shorter content, while others are designed to handle more detailed information.
</Tip>
<Step title="Find the Template group">
**Template** is the first group in the Design panel. Use the row of links at the top of the panel (**Template**, **Type**, **Color**, **Page**, **Advanced**) to jump between groups.
</Step>
</Steps>
## Tips for choosing the right template
<Frame caption="The template gallery, with filters and the current template checked">
<img src="/images/guides/choosing-a-template/template-gallery.webp" alt="The Template group in the Design panel, showing the All, One column, Two columns and ATS-safe filters, a count of 15 of 15 shown, and thumbnails of the Azurill, Bronzor, Chikorita and Ditgar templates with Azurill checked" />
</Frame>
<AccordionGroup>
<Accordion title="Consider your industry" icon="briefcase">
Different industries have different expectations:
- **Creative fields** (design, marketing, arts): Templates with more visual flair like Gengar or Pikachu
- **Corporate/Traditional** (finance, law, consulting): Clean, minimal templates like Onyx or Ditto
- **Tech/Startups**: Modern, balanced templates like Chikorita or Leafish
</Accordion>
Each thumbnail shows the first page of **your** resume in that template, so you can judge it with your real content. While the thumbnails are being drawn, you briefly see a sample image instead.
<Accordion title="Think about content length" icon="ruler">
If you have a lot of experience to fit, choose a template that uses space efficiently. For shorter resumes,
templates with more white space can make your content feel more substantial.
</Accordion>
## Filter the gallery
<Accordion title="Match your personal brand" icon="palette">
Your resume is part of your personal brand. Choose a template that reflects your personality while remaining
professional and appropriate for your target roles.
</Accordion>
The chips above the thumbnails narrow the list:
<Accordion title="Test with real content" icon="file-lines">
Don't choose a template based on how it looks empty. Fill in your actual content and see how it flows across pages. What looks great with sample data might not work as well with your specific information.
</Accordion>
</AccordionGroup>
| Filter | Shows |
| --- | --- |
| **All** | All 15 templates. |
| **One column** | Templates that read top to bottom in a single column. |
| **Two columns** | Templates with a separate sidebar column. |
| **ATS-safe** | Templates with one reading order and plain text headings, which applicant tracking systems read cleanly. |
---
The counter on the right (for example "7 of 15 shown") tells you how many templates match.
## Available templates
## Preview and apply a template
Each template can be customized further with your choice of colors, fonts, and layout options.
<Steps>
<Step title="Preview it on the page">
Hover over a thumbnail, or move to it with <kbd>Tab</kbd>. The page on the right redraws in that template, and a label above it reads "Previewing *name* · click to apply". Nothing is saved yet.
</Step>
<Step title="Apply it">
Click the thumbnail. The template is applied and a message confirms the change, with an **Undo** button if you change your mind.
</Step>
<Step title="Or go back">
Move the pointer away from the thumbnails, or press <kbd>Esc</kbd>, to return to your current template.
</Step>
</Steps>
<Info>
All templates support the same features and sections. They differ only in how they present your information.
</Info>
<Frame caption="Hovering over Chikorita previews it on the page before you apply it">
<img src="/images/guides/choosing-a-template/template-hover-preview.webp" alt="The Design panel with the pointer over the Chikorita thumbnail, and the page on the right showing the resume in the Chikorita template with a dark label reading Previewing Chikorita, click to apply" />
</Frame>
<Tip>
On a phone or tablet, press and hold a thumbnail to preview it, then tap it to apply it. On phones, Design opens as a sheet over the lower half of the page and the templates scroll sideways in a strip.
</Tip>
## The 15 templates
All templates support the same sections and features. They differ only in how they arrange your information. The images below use the same resume in each template.
| Template | Columns | ATS-safe | Sidebar side |
| --- | --- | --- | --- |
| Azurill | Two | No | Left |
| Bronzor | One | Yes | — |
| Chikorita | Two | No | Right |
| Ditgar | Two | No | Left |
| Ditto | Two | No | Left |
| Gengar | Two | No | Left |
| Glalie | Two | No | Left |
| Kakuna | One | Yes | — |
| Lapras | One | Yes | — |
| Leafish | Two | No | Right |
| Meowth | One | Yes | — |
| Onyx | One | Yes | — |
| Pikachu | Two | No | Left |
| Rhyhorn | One | Yes | — |
| Scizor | One | Yes | — |
In a one-column template, sections you placed in the sidebar print after the main sections instead of beside them. Bronzor prints them as labelled rows. On two-column templates you can move the sidebar to the other side; see [Arranging the layout](/guides/arranging-the-layout).
<div className="grid grid-cols-1 sm:grid-cols-2 gap-4">
<Frame caption="Azurill">
<img src="/images/templates/azurill.webp" alt="Azurill template preview" style={{ aspectRatio: "210/297" }} />
<img src="/images/templates/azurill.webp" alt="First page of a resume in the Azurill template: centred photo and header, sidebar on the left" style={{ aspectRatio: "210/297" }} />
</Frame>
<Frame caption="Bronzor">
<img src="/images/templates/bronzor.webp" alt="First page of a resume in the Bronzor template: one column with labelled section rows" style={{ aspectRatio: "210/297" }} />
</Frame>
<Frame caption="Chikorita">
<img src="/images/templates/chikorita.webp" alt="First page of a resume in the Chikorita template: header over the main column and a colored sidebar on the right" style={{ aspectRatio: "210/297" }} />
</Frame>
<Frame caption="Ditgar">
<img src="/images/templates/ditgar.webp" alt="First page of a resume in the Ditgar template: header inside a colored left sidebar" style={{ aspectRatio: "210/297" }} />
</Frame>
<Frame caption="Ditto">
<img src="/images/templates/ditto.webp" alt="First page of a resume in the Ditto template: colored header band across the page, sidebar on the left" style={{ aspectRatio: "210/297" }} />
</Frame>
<Frame caption="Gengar">
<img src="/images/templates/gengar.webp" alt="First page of a resume in the Gengar template: header in a colored left sidebar with a tinted summary band" style={{ aspectRatio: "210/297" }} />
</Frame>
<Frame caption="Glalie">
<img src="/images/templates/glalie.webp" alt="First page of a resume in the Glalie template: header and contact details in a light left sidebar" style={{ aspectRatio: "210/297" }} />
</Frame>
<Frame caption="Kakuna">
<img src="/images/templates/kakuna.webp" alt="First page of a resume in the Kakuna template: centred header, one column" style={{ aspectRatio: "210/297" }} />
</Frame>
<Frame caption="Lapras">
<img src="/images/templates/lapras.webp" alt="First page of a resume in the Lapras template: one column with sections in outlined boxes" style={{ aspectRatio: "210/297" }} />
</Frame>
<Frame caption="Leafish">
<img src="/images/templates/leafish.webp" alt="First page of a resume in the Leafish template: tinted header across the page, sidebar on the right" style={{ aspectRatio: "210/297" }} />
</Frame>
<Frame caption="Meowth">
<img src="/images/templates/meowth.webp" alt="First page of a resume in the Meowth template: one column with position, organization and period on one line" style={{ aspectRatio: "210/297" }} />
</Frame>
<Frame caption="Onyx">
<img src="/images/templates/onyx.webp" alt="First page of a resume in the Onyx template: one column with the photo beside the header" style={{ aspectRatio: "210/297" }} />
</Frame>
<Frame caption="Pikachu">
<img src="/images/templates/pikachu.webp" alt="First page of a resume in the Pikachu template: colored header block over the main column, sidebar on the left" style={{ aspectRatio: "210/297" }} />
</Frame>
<Frame caption="Bronzor">
<img src="/images/templates/bronzor.webp" alt="Bronzor template preview" style={{ aspectRatio: "210/297" }} />
</Frame>
<Frame caption="Chikorita">
<img src="/images/templates/chikorita.webp" alt="Chikorita template preview" style={{ aspectRatio: "210/297" }} />
</Frame>
<Frame caption="Ditto">
<img src="/images/templates/ditto.webp" alt="Ditto template preview" style={{ aspectRatio: "210/297" }} />
</Frame>
<Frame caption="Ditgar">
<img src="/images/templates/ditgar.webp" alt="Ditgar template preview" style={{ aspectRatio: "210/297" }} />
</Frame>
<Frame caption="Gengar">
<img src="/images/templates/gengar.webp" alt="Gengar template preview" style={{ aspectRatio: "210/297" }} />
</Frame>
<Frame caption="Glalie">
<img src="/images/templates/glalie.webp" alt="Glalie template preview" style={{ aspectRatio: "210/297" }} />
</Frame>
<Frame caption="Kakuna">
<img src="/images/templates/kakuna.webp" alt="Kakuna template preview" style={{ aspectRatio: "210/297" }} />
</Frame>
<Frame caption="Lapras">
<img src="/images/templates/lapras.webp" alt="Lapras template preview" style={{ aspectRatio: "210/297" }} />
</Frame>
<Frame caption="Leafish">
<img src="/images/templates/leafish.webp" alt="Leafish template preview" style={{ aspectRatio: "210/297" }} />
</Frame>
<Frame caption="Meowth">
<img src="/images/templates/meowth.webp" alt="Meowth template preview" style={{ aspectRatio: "210/297" }} />
</Frame>
<Frame caption="Onyx">
<img src="/images/templates/onyx.webp" alt="Onyx template preview" style={{ aspectRatio: "210/297" }} />
</Frame>
<Frame caption="Pikachu">
<img src="/images/templates/pikachu.webp" alt="Pikachu template preview" style={{ aspectRatio: "210/297" }} />
</Frame>
<Frame caption="Rhyhorn">
<img src="/images/templates/rhyhorn.webp" alt="Rhyhorn template preview" style={{ aspectRatio: "210/297" }} />
<img src="/images/templates/rhyhorn.webp" alt="First page of a resume in the Rhyhorn template: minimal top header and one column" style={{ aspectRatio: "210/297" }} />
</Frame>
<Frame caption="Scizor">
<img src="/images/templates/scizor.webp" alt="Scizor template preview" style={{ aspectRatio: "210/297" }} />
<img src="/images/templates/scizor.webp" alt="First page of a resume in the Scizor template: one column with uppercase section headings" style={{ aspectRatio: "210/297" }} />
</Frame>
</div>
---
## Tips for choosing
## Customizing your template
- **Applying through job portals?** Start with the **ATS-safe** filter. Two-column layouts can be read out of order by applicant tracking systems, and Check mode warns you when sidebar sections might be affected. See [Checking your resume](/guides/checking-your-resume).
- **Lots of experience?** Compare how full each thumbnail's first page looks. After you apply a template, the page count in the zoom bar at the bottom of the page tells you the total.
- **Judge with real content.** Because the gallery draws your own resume, fill in your details first and then pick.
After selecting a template, you can adjust:
## Reset the design settings
| Setting | Description |
| -------------- | ------------------------------------------------------------ |
| **Colors** | Change the primary color scheme to match your personal brand |
| **Typography** | Choose from various Google Fonts for headings and body text |
| **Layout** | Adjust sidebar width, section order, and page margins |
| **Spacing** | Fine-tune gaps between sections and elements |
If you have changed a lot of design settings and want a clean slate, open **Advanced** at the bottom of the Design panel and select **Reset to template defaults**. This resets fonts, text size, line height, colors, level style, sidebar width, margins, spacing and the icon and underline switches. Your template, paper size, language, date format, section placement and custom CSS stay as they are. A message offers **Undo**.
Despite the name, the reset doesn't depend on the template: every template goes back to the same standard settings (IBM Plex Serif at 10 pt, a red accent, circle levels and hidden section icons). Pick a font pairing and accent color again afterwards if you want a different starting point.
<Note>
If Design's controls are greyed out, the resume is locked. Open the document name menu at the top left and select **Unlock editing**.
</Note>
## Related guides
<CardGroup cols={2}>
<Card title="Customizing typography" icon="font" href="/guides/customizing-typography">
Pick a font pairing, text size and density.
</Card>
<Card title="Choosing colors" icon="palette" href="/guides/choosing-colors">
Set the accent color and check it reads well.
</Card>
<Card title="Arranging the layout" icon="table-columns" href="/guides/arranging-the-layout">
Move the sidebar, change its width and split sections across pages.
</Card>
<Card title="Fitting content on a page" icon="compress" href="/guides/fitting-content-on-a-page">
Keep your resume to the number of pages you planned.
</Card>
</CardGroup>
+78
View File
@@ -0,0 +1,78 @@
---
title: "Choosing colors"
description: "Pick an accent color for your resume headings and icons, check its contrast, and change the text, background and skill level styles."
---
Your resume uses one accent color for headings, icons and colored bands such as a template's header or sidebar. Body text stays near-black so it prints well and reads cleanly in applicant tracking systems. This guide shows how to choose the accent, check that it's readable, and adjust the other colors and the level indicators.
## Pick an accent color
<Steps>
<Step title="Open Color">
In the editor, select **Design** (or press <kbd>2</kbd>), then select **Color** in the row of links at the top of the panel.
</Step>
<Step title="Choose a swatch">
Select one of the eight swatches: Moss, Ink blue, Teal, Plum, Rust, Burgundy, Ochre or Graphite. Hover over a swatch to see its name. All eight are dark enough to read on white.
</Step>
</Steps>
<Frame caption="The Color group with Ink blue selected and its contrast ratio">
<img src="/images/guides/choosing-colors/color-group.webp" alt="The Color group with eight round swatches, Ink blue selected, a hex field reading #2F5A8A with a contrast ratio of 7.1:1, and a note that the accent is used for headings, icons and the header band" />
</Frame>
## Use your own color
Type a six-digit hex code, such as `#1F6E73`, in the field under the swatches. The `#` is optional. The page updates as soon as the code is complete, and the square on the left shows the color.
Next to the field is the color's **contrast ratio** against white. Headings need at least 4.5:1 to read comfortably. Below that, the ratio turns amber and a warning appears:
<Frame caption="A light blue accent triggers the contrast warning">
<img src="/images/guides/choosing-colors/contrast-warning.webp" alt="The Color group with a custom color #0084D1 at 4.0:1, and an amber warning reading Too light for headings on white. It may be hard to read and print faintly, with a Use a darker shade button" />
</Frame>
Select **Use a darker shade** to keep the same hue but darken it until it reads well on white (at least 4.6:1).
## Change text and background colors
The Color group only sets the accent. For the other colors, open **Advanced** at the bottom of the Design panel and find its **Design** section:
- The row of 22 swatches sets the accent (primary) color. These include bright colors that may not pass the contrast check.
- **Primary Color** is the accent.
- **Text Color** is the color of body text.
- **Background Color** is the page color.
Each has a color picker (the circle) and a text field that shows the value in the form `rgba(47, 90, 138, 1)`. Use the picker, or type a new value in the same form.
<Frame caption="Advanced → Design: color fields and the Level style">
<img src="/images/guides/choosing-colors/advanced-colors-and-level.webp" alt="The Advanced Design section showing 22 square color swatches, the Primary Color, Text Color and Background Color fields with rgba values, and the Level area with a preview of three out of five stars, an Icon picker set to a star and Type set to Icon" />
</Frame>
<Warning>
Colored or dark backgrounds, and light text, can be hard to read when printed and may confuse some applicant tracking systems. The contrast check in the Color group doesn't look at these fields.
</Warning>
## Change how skill levels look
Skills and languages can show a level, for example 4 out of 5. Under **Level** in **Advanced → Design**, choose how every level on your resume is drawn. The preview above the controls shows level 3 in your accent color.
| Type | Looks like |
| --- | --- |
| **Hidden** | No level is shown. |
| **Circle** | Filled and empty dots. |
| **Square** | Filled and empty squares. |
| **Rectangle** | Short bars. |
| **Rectangle (Full Width)** | Bars that stretch across the column. |
| **Progress Bar** | One continuous bar. |
| **Icon** | A repeated icon, such as a star. Choose it with the **Icon** button. |
You set each entry's level while writing it; see [Editing entries](/guides/editing-entries).
<Note>
Cover letters have the same Color controls in their own Design mode. See [Writing a cover letter](/guides/writing-a-cover-letter).
</Note>
## Related guides
- [Customizing typography](/guides/customizing-typography): fonts, size and density.
- [Choosing a template](/guides/choosing-a-template): templates decide where the accent appears.
- [Checking your resume](/guides/checking-your-resume): find readability issues before you apply.
+55 -67
View File
@@ -1,88 +1,76 @@
---
title: "Creating an account"
description: "Sign up for a Reactive Resume account with email and password or social sign-in from Google or GitHub so you can start building and saving resumes."
description: "Sign up for Reactive Resume with an email and password, a passkey, or a social account, and choose the username that appears in your public links."
---
You need a free account to save resumes, cover letters and job applications. Signing up takes under a minute, and you can start building right after.
## Sign up with email and password
<Steps>
<Step title="Visit the homepage">
Head over to [https://rxresu.me](https://rxresu.me) and click on the <Badge>Get Started</Badge> button.
<Step title="Open the sign-up page">
Go to [rxresu.me](https://rxresu.me) and select **Build your resume**. On the sign-in page, select **Create one now**.
If you run your own copy of Reactive Resume, use its address instead of `rxresu.me`.
</Step>
<Step title="Navigate to the sign up page">
You should see a link that says <Badge>Don't have an account? Create one now →</Badge>. Click on that link to go to the sign up page and you should see a form.
</Step>
<Step title="Fill in your details">
Complete the sign up form with the following information:
- **Name**: Your full name
- **Email Address**: A valid email address you have access to.
- **Username**: Choose a unique username (this will be used in your public resume URLs)
- **Password**: Create a strong password
- **Name**: your name as you want it shown in the app (3 to 64 characters).
- **Username**: 3 to 64 characters, using lowercase letters, numbers, dots, hyphens and underscores. It becomes part of every public resume link, for example `rxresu.me/alexmorgan/game-developer`.
- **Email Address**: an address you can open. You need it to reset a forgotten password.
- **Password**: at least 8 characters, up to 64.
</Step>
<Warning>
Make sure to choose a username you're happy with, as it will be part of your public resume URL (e.g., `rxresu.me/your-username/resume-slug`).
</Warning>
<Step title="Select Sign up">
Your account is created and you are signed in straight away.
</Step>
</Step>
<Step title="Sign up and sign in">
After filling in all the required fields, click the **Sign up** button. You will be signed in immediately and can start using Reactive Resume right away.
<Tip>
No email verification is required to get started, but verifying your email is strongly recommended for account security.
</Tip>
</Step>
<Step title="Verify your email (recommended)">
Email verification is optional, but strongly recommended. Verifying your email:
- confirms you have access to the address on the account
- lets you reset your password if you forget it
<Info>
You can verify your email at any time from your account settings. Look for the verification prompt in your dashboard or navigate to **Settings → Account**.
</Info>
</Step>
<Step title="Access your dashboard">
Click on **Continue** and you should be taken to your Dashboard, where you can:
- Create your first resume
- Import an existing resume
- Manage your account settings
<Step title="Continue to your documents">
A **You've got mail!** screen confirms that a verification link is on its way. Verifying is optional, so you can select **Continue** and start working, then open the link from your inbox later.
</Step>
</Steps>
---
<Frame caption="The sign-up form. The buttons under it depend on what the site has turned on.">
<img src="/images/guides/creating-an-account/sign-up-form.webp" alt="The Create a new account form with Name, Username, Email Address and Password fields, a Sign up button, and Passkey, Google, GitHub and LinkedIn buttons below" />
</Frame>
## Account security tips
<Frame caption="After signing up, you can verify your email now or later">
<img src="/images/guides/creating-an-account/check-your-email.webp" alt="The You've got mail! screen saying to check your email for a verification link, with a note that the step is optional and a Continue button" />
</Frame>
<CardGroup cols={2}>
<Card title="Use a strong password" icon="lock">
Create a password that's at least 8 characters long and includes a mix of letters, numbers, and special characters.
</Card>
<Card title="Setup 2FA/Passkeys" icon="key">
Setup two-factor authentication or passkeys on your account to add an extra layer of security.
</Card>
</CardGroup>
<Tip>
You can change your name, username and email later in **Settings → Account**. Changing your username changes every public link you have shared, so pick one you are happy to keep.
</Tip>
---
## Sign up with a social account
## Troubleshooting
Under **or continue with**, select **Google**, **GitHub** or **LinkedIn** and approve the request on that site. Reactive Resume creates your account from the name, email and photo the provider shares, and picks a username for you. You can change it afterwards in **Settings → Account**.
These buttons only appear when the site has set them up. On a self-hosted copy you may see none of them, or a single button for your organization's sign-in service.
## If sign-up doesn't work
<AccordionGroup>
<Accordion title="Username already taken">
If your username is already taken, try a different variation. Usernames must be unique across all users.
</Accordion>
<Accordion title="The username or email is already taken">
Usernames and email addresses are unique. Try another username. If the email is yours, you already have an account: go back to the sign-in page and use **Forgot Password?** to get back in.
</Accordion>
<Accordion title="Email already registered">
If your email is already registered, you can use the **Forgot Password** link on the login page to reset your
password and regain access to your account.
</Accordion>
<Accordion title="Didn't receive the verification email">
Check your spam folder first. If it isn't there, request a new verification email from your account settings.
</Accordion>
<Accordion title="The verification email didn't arrive">
Check your spam folder. You can ask for a new link from **Settings → Account**: under the **Email** field, select **Not verified yet. Resend the link**. On self-hosted copies without email delivery, the field says so instead, and no email is sent.
</Accordion>
<Accordion title="There is no Create one now link">
The site's owner has turned off new sign-ups. Only existing accounts can sign in.
</Accordion>
</AccordionGroup>
## Next steps
<CardGroup cols={2}>
<Card title="Create your first resume" icon="file-lines" href="/guides/creating-your-first-resume">
Start from a blank page, a sample or an existing file.
</Card>
<Card title="Protect your account" icon="shield" href="/guides/setting-up-two-factor-authentication">
Add two-step verification or a passkey.
</Card>
</CardGroup>
+92 -70
View File
@@ -1,85 +1,107 @@
---
title: "Creating your first resume"
description: "Create your first resume in Reactive Resume by naming it, choosing a URL slug, and opening it in the builder to start filling in your details."
description: "Start a blank resume in Reactive Resume, add your name and contact details, fill in your first section, and download it as a PDF."
---
This guide takes you from an empty account to a first resume you can download. It takes a few minutes. If you already have a resume as a PDF, Word or JSON file, you can [import it](/guides/importing-resumes) instead of starting blank.
## Before you start
You need a Reactive Resume account. If you don't have one yet, see [Creating an account](/guides/creating-an-account). Sign in at [rxresu.me](https://rxresu.me), or at your own address if you host Reactive Resume yourself.
## Start a blank resume
<Steps>
<Step title="Sign in to your account">
Head over to [https://rxresu.me](https://rxresu.me) and sign in with your account credentials.
<Tip>
If you haven't created an account yet, follow the guide on [Creating an account](/guides/creating-an-account).
</Tip>
<Step title="Open Documents">
After you sign in, you land on **Documents**, the page that lists all your resumes and cover letters. On your first visit it's empty and offers three ways to begin.
<Frame caption="Documents on your first visit">
<img src="/images/guides/creating-your-first-resume/documents-first-visit.webp" alt="The empty Documents page with the heading Let's start with what you have, a Choose a file button, and Start blank and Try a sample links" />
</Frame>
</Step>
<Step title="Open the Resumes Dashboard">
After signing in, go to your Dashboard, where all of your resumes live.
<Step title="Choose Start blank">
Select **Start blank**. You can also select **New** in the sidebar (or press <kbd>N</kbd>) and choose **Start blank** in the **New document** dialog.
<Info>
This is where you can create, import, organize, and manage multiple resumes for different roles or versions.
</Info>
<Frame caption="The New document dialog">
<img src="/images/guides/creating-your-first-resume/new-document-dialog.webp" alt="The New document dialog with Import a resume, Copy a resume for a job, Start blank, New cover letter instead and Try with a sample resume" />
</Frame>
</Step>
<Step title="Click “Create a new resume”">
In the Resumes Dashboard, click on the <Badge>Create a new resume</Badge> card to open the creation form.
<Frame caption="Create a new resume dialog">
<img
src="/images/guides/creating-your-first-resume/screenshot-1.webp"
alt="Create a new resume dialog with name, slug, and tags fields"
/>
</Frame>
</Step>
<Step title="Name your resume">
Fill in the resume name. This can be generic (e.g., "General Resume") or tied to the position you're applying for.
<Tip>
If you can't think of a name yet, click the magic wand button to generate one.
</Tip>
</Step>
<Step title="Review (or edit) the slug">
The <Badge>Slug</Badge> field is auto-filled based on the name, but you can change it to anything you like.
<Warning>
If you choose to publicly share your resume, it will be accessible at `https://rxresu.me/{username}/{slug}`.
</Warning>
</Step>
<Step title="Add tags (optional)">
Add any <Badge>Tags</Badge> you want. Think of tags like folders or labels to help organize many resumes.
<Info>
You can filter resumes by tags later from the Dashboard. The tag filter appears after you have at least one tag.
</Info>
</Step>
<Step title="Choose a blank or sample resume">
Click **Create** to start with an empty resume, or open the split-button menu and choose **Create a Sample Resume** to start with sample content.
<Tip>
A sample resume is useful when you want to try templates, layout controls, and exports before entering your own
information.
</Tip>
</Step>
<Step title="Open the resume in the builder">
Once created, a new card for your resume will appear on the Dashboard. Click it to open the resume builder and start editing.
Reactive Resume creates the resume straight away and opens it in the editor. There's no name or address to fill in first.
</Step>
</Steps>
## What you can do next
<Tip>
Want to look around before typing anything? Choose **Try a sample** (or **Try with a sample resume** in the dialog) to get a filled-in resume you can explore and delete later.
</Tip>
After creating your first resume, you can:
## Add your name and contact details
- change the template in [Choosing a template](/guides/choosing-a-template);
- adjust the page format in [Selecting the right page format](/guides/selecting-page-format);
- download a copy in [Exporting your resume](/guides/exporting-your-resume);
- organize, duplicate, lock, or delete resumes in [Managing resumes from the dashboard](/guides/managing-resumes-from-the-dashboard).
The editor opens in **Write** mode with the cursor in **Full name**. The page on the right updates as you type, and every change saves on its own. The editor bar shows **Saved** under the document name.
<Steps>
<Step title="Fill in the basics">
Type your **Full name**, then a **Headline** (for example, the job title you're aiming for), your **Email**, **Phone** and **Location**. Add a **Website** if you have one.
</Step>
<Step title="Check the document name">
A new blank resume is called "Untitled resume". Until you name it yourself, it takes its name from your **Headline**, so it's easy to find later. To pick your own name, open the document name menu at the top left and choose **Rename…**, or rename it from Documents.
</Step>
</Steps>
<Frame caption="The editor with the basics filled in">
<img src="/images/guides/creating-your-first-resume/editor-with-basics.webp" alt="The resume editor in Write mode with name, headline, email, phone and location filled in on the left and the same details on the page preview on the right" />
</Frame>
## Add your first section
Below your details, under **Sections · print order**, Reactive Resume suggests the sections most resumes have.
<Frame caption="Suggested sections on a new resume">
<img src="/images/guides/creating-your-first-resume/starter-sections.webp" alt="The Sections list on a new resume with buttons for Experience, Education, Skills and Summary, an Import it link, and an Add section button" />
</Frame>
<Steps>
<Step title="Add a section">
Select **Experience** (or any other suggestion). For anything else, select **Add section**.
</Step>
<Step title="Fill in the entry">
The section opens with an empty entry. Fill in **Position** and **Company**, then **Location** and **Dates**. Turn on **Present** if you still work there. An experience entry appears on the page once it has a company.
</Step>
<Step title="Add more">
Select **Add experience** below the entry for your next job, or add more sections the same way.
</Step>
</Steps>
<Frame caption="An experience entry and how it prints">
<img src="/images/guides/creating-your-first-resume/first-entry.webp" alt="An Experience entry for Gameplay Programmer at Northwind Studios in the editor, with the same entry showing on the page preview" />
</Frame>
## Download your resume
When you're happy with it, select **Download PDF** in the top right corner of the editor. The arrow next to it opens other formats.
<Frame caption="Download PDF in the editor bar">
<img src="/images/guides/creating-your-first-resume/download-pdf-button.webp" alt="The right side of the editor bar with the History and Assistant icons, the Share button and the Download PDF button" />
</Frame>
To come back later, select the arrow at the top left of the editor to return to Documents, where your resume now has its own card.
## Next steps
<CardGroup cols={2}>
<Card title="Get to know the editor" href="/guides/editor-overview">
Write, Design and Check modes, and what each part of the screen does.
</Card>
<Card title="Fill in your details" href="/guides/filling-in-your-details">
Photo, extra contact fields and a summary.
</Card>
<Card title="Choose a template" href="/guides/choosing-a-template">
Change how your resume looks without retyping anything.
</Card>
<Card title="Manage your documents" href="/guides/managing-documents">
Rename, duplicate, lock and organize your resumes.
</Card>
</CardGroup>
+101
View File
@@ -0,0 +1,101 @@
---
title: "Customizing typography"
description: "Choose a font pairing, text size and density for your resume, or pick any of about 500 fonts with exact sizes, weights and line height."
---
The **Type** group in Design controls how your text looks: the fonts, the text size and how tightly lines and sections are spaced. Five ready-made font pairings cover most resumes. If you need a specific font, **Advanced** lets you choose from about 500.
## Pick a font pairing
<Steps>
<Step title="Open Type">
In the editor, select **Design** (or press <kbd>2</kbd>), then select **Type** in the row of links at the top of the panel.
</Step>
<Step title="Choose a pairing">
Select one of the five pairings. The page updates straight away. Each pairing shows the fonts it uses next to its name.
</Step>
</Steps>
<Frame caption="The Type group with the Balanced pairing, 10 pt text and Normal density">
<img src="/images/guides/customizing-typography/type-group.webp" alt="The Type group showing five font pairings (Classic, Traditional, Balanced, Professional, Clean) with Balanced selected, a Custom row, the Text size slider at 10 pt with the hint 10 to 11 recommended, and Density set to Normal" />
</Frame>
| Pairing | Heading font | Body font |
| --- | --- | --- |
| **Classic** | EB Garamond | EB Garamond |
| **Traditional** | Tinos | Tinos |
| **Balanced** | Source Serif 4 | Source Sans 3 |
| **Professional** | Carlito | Carlito |
| **Clean** | Lato | Lato |
A pairing sets body text in Regular and Bold, and headings in a single bolder weight. Tinos and Carlito match the widths of Times New Roman and Calibri, so they suit employers who expect a traditional look.
If your resume uses fonts that aren't one of the pairings, no pairing is selected and the **Custom** row shows your current fonts instead.
## Set the text size
Drag the **Text size** slider. It goes from 9 pt to 12.5 pt in half-point steps, and the current value shows on the right. Headings grow and shrink with it, keeping the same proportion to the body text. The panel suggests 10–11 pt, which reads comfortably on screen and on paper.
<Tip>
Dragging a slider counts as one change, so a single <kbd>⌘</kbd> <kbd>Z</kbd> (<kbd>Ctrl</kbd> <kbd>Z</kbd> on Windows and Linux) undoes the whole drag.
</Tip>
## Choose a density
**Density** sets the line height of your body text and the vertical spacing in and between entries:
| Density | Line height | Vertical spacing |
| --- | --- | --- |
| **Compact** | 1.35 | 4 pt |
| **Normal** | 1.5 | 6 pt |
| **Roomy** | 1.65 | 8 pt |
If you set an exact body line height or **Spacing (Vertical)** in Advanced that doesn't match one of these, no density is selected.
## Use any font
<Steps>
<Step title="Open the font editor">
Select the **Custom** row under the pairings. Design opens **Advanced** and moves you to its **Typography** editor, with the body font picker ready.
</Step>
<Step title="Choose a body font">
Open **Font Family** under **Body** and type part of a font's name to search. Each font is shown in its own typeface. Choose one to apply it.
</Step>
<Step title="Choose a heading font">
Do the same under **Heading**.
</Step>
</Steps>
<Frame caption="Searching the body font list in Advanced → Typography">
<img src="/images/guides/customizing-typography/font-family-search.webp" alt="The Typography editor with the body Font Family picker open, the search box containing Merri, and the results Merriweather and Merriweather Sans each drawn in its own font" />
</Frame>
The list contains Google Fonts plus the PDF standard fonts Helvetica, Courier and Times-Roman. Fonts for Chinese, Japanese, Korean, Arabic, Hebrew and Thai text are included, and missing characters fall back to a matching Noto font so they still print.
### Exact typography settings
**Advanced → Typography** has the same fields for **Body** and **Heading**, plus one **Hyphenation** switch for both:
<Frame caption="The body fields in Advanced → Typography">
<img src="/images/guides/customizing-typography/advanced-typography.webp" alt="The Typography editor's Body fields: Font Family set to Source Sans 3, Font Weights set to 400, 700, and Font Size set to 10 pt" />
</Frame>
| Field | What it does |
| --- | --- |
| **Font Family** | The font, from the full list. Choosing a new family also picks two of its weights, usually 400 and 600. Adjust them in the weights field if you want real bold (700). |
| **Font Weights** (body) / **Font Weight** (heading) | Which weights to use, from those the font offers. Body text can use several (for example 400 for regular and 700 for bold). |
| **Font Size** | Any size from 6 to 24 pt, in steps of 0.1 pt. |
| **Line Height** | A multiple of the font size, from 0.5 to 4. |
| **Hyphenation** (one switch for all text) | Breaks long words between syllables, using the language set in **Page**. Useful for languages with long compound words, such as German. |
The **Text size** slider in Type only goes from 9 to 12.5 pt. If you type a size outside that range in Advanced, the slider stops at its nearest end but your exact size is kept.
<Note>
Cover letters have the same Type controls in their own Design mode, without the Custom row. See [Writing a cover letter](/guides/writing-a-cover-letter).
</Note>
## Related guides
- [Choosing colors](/guides/choosing-colors): set the accent color that headings use.
- [Fitting content on a page](/guides/fitting-content-on-a-page): use size and density to fit your pages.
- [Applying custom styles](/applying-custom-styles): change styles that Design doesn't cover, with CSS.
+33 -41
View File
@@ -1,59 +1,51 @@
---
title: "Deleting your account"
description: "Export a full archive of your Reactive Resume data from the Danger Zone, then permanently delete your account, resumes, and settings."
description: "Permanently delete your Reactive Resume account, including every resume, cover letter, job application, API key and public link. Export a copy first."
---
## Export all of your data
Deleting your account removes it and everything in it for good. There is no grace period and no way to restore it, so download a copy of your data first if you might want it later.
Before you delete your account, you can download a copy of everything Reactive Resume stores for you.
## Before you start
<Steps>
<Step title="Open Danger Zone">
In the dashboard sidebar, under **Settings**, click **Danger Zone**.
</Step>
<Step title="Click Export My Data">
Reactive Resume gathers your account profile, resumes, and settings into a single archive and downloads it to your
browser.
</Step>
</Steps>
Keep this archive somewhere safe. It's the easiest way to restore your resumes if you delete your account and later change your mind.
[Export your data](/guides/exporting-your-data) from **Settings → Account → Your data**. The zip holds your resumes, cover letters and job applications as JSON files.
## Delete your account
<Warning>
Deleting your account is permanent. Export a copy of your data first if you might need it later.
</Warning>
<Steps>
<Step title="Sign in to the dashboard">
Head over to [https://rxresu.me](https://rxresu.me) and sign in with your account credentials.
<Step title="Open Your data">
Select your name at the bottom of the sidebar, then **Settings**. On the **Account** page, scroll to **Your data**.
</Step>
<Step title="Navigate to Danger Zone">
In the dashboard sidebar on the left, under <Badge>Settings</Badge>, click the <Badge>Danger Zone</Badge> link.
</Step>
<Step title="Type the confirmation text">
On the Danger Zone page, type <Badge>delete</Badge> into the confirmation input.
<Info>
The <Badge>Delete Account</Badge> button will stay disabled until the confirmation text matches exactly.
</Info>
<Step title="Select Delete…">
Next to **Delete account**, select **Delete…**. The **Delete your account?** dialog lists how many documents, applications and API keys will go.
</Step>
<Step title="Delete your account">
Click <Badge>Delete Account</Badge>, then confirm the final prompt.
<Warning>
This action cannot be undone. All your data will be permanently deleted.
</Warning>
<Step title="Type delete to confirm">
Type `delete` into the box. The **Delete** button stays unavailable until the word matches. To back out, select **Keep account**.
</Step>
<Step title="You will be signed out">
After deletion completes, you will be signed out and redirected to the homepage.
<Step title="Select Delete">
Reactive Resume deletes your account, signs you out and takes you to the home page.
</Step>
</Steps>
<Frame caption="The dialog names what will be removed before you confirm">
<img src="/images/guides/deleting-your-account/delete-account-dialog.webp" alt="The Delete your account? dialog saying 1 document, 0 applications, 0 API keys and every public link are removed permanently, with delete typed in the confirmation box and Keep account and Delete buttons" />
</Frame>
## What gets deleted
- Every resume and cover letter, including those in the trash, and their version history.
- Every job application.
- Every public resume link. Anyone who opens one sees a page that no longer exists.
- Your uploaded files, such as photos.
- Your assistant conversations, API keys, saved AI providers, passkeys and linked social accounts.
<Warning>
This can't be undone from the app. To use Reactive Resume again, [create a new account](/guides/creating-an-account) and [import](/guides/importing-resumes) resumes you saved as JSON or PDF.
</Warning>
## Related guides
- [Exporting your data](/guides/exporting-your-data): download everything before you delete.
- [Exporting your resume](/guides/exporting-your-resume): keep a PDF or JSON of a single resume.
+165
View File
@@ -0,0 +1,165 @@
---
title: "Editing entries"
description: "Add, reorder, duplicate, hide, move and delete the entries in your resume sections, and learn the fields each kind of entry has, including job roles."
---
An entry is one item inside a section: a single job, degree, skill or award. This guide shows how to add and change entries in **Write** mode, move them between sections and pages, and use the fields that only some entries have, such as skill levels and job roles.
## Before you start
Open a resume in **Write** mode and open the section you want to work in by selecting its title in the **Sections · print order** list. If the section isn't there yet, add it first: see [Managing sections](/guides/managing-sections#add-a-section).
## Open and edit an entry
A closed entry shows its title and a line of details, such as the company, location and dates. Select it to open its fields. Only one entry is open at a time, and the open entry is outlined on the page with an **Editing** tag. You can also select any block on the page to open the matching entry.
Everything you type saves as you go. There is no save button.
<Tip>
The Description field is a rich text editor with bold, lists, links and more. See [Formatting text](/guides/formatting-text).
</Tip>
## Add an entry
<Steps>
<Step title="Select the add button">
At the bottom of an open section, select the add button named after the section, such as **Add experience** or **Add skill**. You can also open the section's **⋯** menu and select **Add entry**.
</Step>
<Step title="Fill in the main field">
The new entry opens at the end of the section with its first field ready for typing. It's marked **Draft** until its main field has text, and a note tells you which field that is, for example "Appears on the page once it has a company."
</Step>
</Steps>
<Frame caption="A new Experience entry, still a draft">
<img src="/images/guides/editing-entries/new-draft-entry.webp" alt="An open Experience entry titled Untitled with a Draft badge and the note Appears on the page once it has a company, followed by empty Position, Company, Location, Dates, Link and Description fields and an Add role button." />
</Frame>
The main field for each kind of entry is listed in [Fields by section type](#fields-by-section-type). Drafts are kept, but they don't print until that field is filled.
## Reorder entries
Entries print in the order they're listed. To move one:
- Hover over the entry and **drag** it by the handle on its left edge.
- Or select the entry's title and press <kbd>⌥ Option</kbd> + <kbd>↑</kbd> or <kbd>↓</kbd> (<kbd>Alt</kbd> + <kbd>↑</kbd> or <kbd>↓</kbd> on Windows and Linux).
For Experience and Education, **Sort by date** in the section's **⋯** menu orders all entries at once, newest first.
## The entry menu
Each entry has its own **⋯** menu on the right of its title.
<Frame caption="The entry menu with Move to… open on Page 2">
<img src="/images/guides/editing-entries/entry-move-to-menu.webp" alt="An Experience entry's menu showing Hide from page, Duplicate, Move to… and Delete. The Move to… submenu lists Page 1, Page 2, Page 3 and New page, and Page 2 is open, offering the Earlier Experience section and New section." />
</Frame>
### Hide an entry from the page
Select **Hide from page**. The entry gets a **Hidden** badge and stops printing, but keeps all its content. Select **Show on page** in the same menu to bring it back. This is useful for keeping an older job on file without showing it on every version of your resume.
### Duplicate an entry
Select **Duplicate**. An exact copy appears right below the original and opens, so you can change the details. Use it when two entries share most of their text.
### Move an entry to another section or page
Select **Move to…**, then a page. For each page you see:
- The sections on that page that hold the same kind of entry. An Experience entry can only move to another Experience-type section, including custom ones.
- **New section**, which creates a new custom section of the same type at the end of that page, named after the section the entry came from.
At the bottom, **New page** adds a page to the resume with a new section holding the entry.
When you move the last entry out of a custom section, that empty section is removed. If this leaves a page empty (other than the first page), the page is removed too.
<Tip>
Moving older jobs into a second section on page 2 is a tidy way to split a long work history. Rename the new section, for example to "Earlier Experience", from its **⋯** menu.
</Tip>
### Delete an entry
Select **Delete** in the entry menu, or the trash icon that appears next to an open entry's title. The entry is removed right away, and the **Entry deleted** message has an **Undo** button if you change your mind.
## Fields by section type
The **main field** is the one an entry needs before it prints.
| Section type | Fields | Main field |
| --- | --- | --- |
| Experience | Position, Company, Location, Dates, Link, Description, roles | Company |
| Education | School, Degree, Area of study, Grade, Location, Dates, Link, Description | School |
| Projects | Name, Dates, Link, Description | Name |
| Skills | Name, Proficiency, Keywords; in **More options**: Level, icon and Icon colour | Name |
| Languages | Language, Fluency; in **More options**: Level | Language |
| Interests | Name, Keywords; in **More options**: icon and Icon colour | Name |
| Awards | Title, Awarder, Date, Link, Description | Title |
| Certifications | Title, Issuer, Date, Link, Description | Title |
| Publications | Title, Publisher, Date, Link, Description | Title |
| Volunteer | Organization, Location, Dates, Link, Description | Organization |
| References | Name, Position, Phone, Link, Description | Name |
| Profiles | Network, Username, Link; in **More options**: icon and Icon colour | Network |
| Summary (custom sections only) | Text | None |
Awards, Certifications and Publications have a single **Date**; the others have a start and end. See [Entering dates](/guides/entering-dates).
### Links
Most entries have a **Link** field for a web address; you can type it with or without `https://`. The tag icon in the field adds a label, so the page shows text such as "Portfolio" instead of the full address. Tick **Show link in title** to turn the entry's title into the link instead of printing the link on its own line.
### Keywords
Skills and Interests take a list of keywords, such as the tools behind a skill. Type a keyword and press <kbd>Enter</kbd> or <kbd>,</kbd> to add it. Use the pencil on a keyword to edit it, or the × to remove it. To print keywords as a bulleted list instead of a line, use **Keyword layout** in the Skills section's **⋯** menu.
### Level, icon and colour
Select **More options** below a skill, language, interest or profile to see the less common fields.
<Frame caption="A skill with More options open">
<img src="/images/guides/editing-entries/skill-more-options.webp" alt="An open Skills entry named Unity Engine with Proficiency Expert, three keywords, and More options expanded to show a Level slider at 5 / 5, an icon button and an Icon colour button." />
</Frame>
- **Level** is a slider from 0 to 5 that prints as dots, bars or icons next to the skill or language. At 0 it reads **Hidden** and no level prints. The shape of the level marker is chosen in **Design** → **Advanced**.
- The **icon** button picks an icon to print before the entry, and **Icon colour** sets its colour. Leave the colour empty to use the template's. Entry icons print only while **Icons in contact line** is on in **Design** → **Page**.
## Show career progression with roles
If you held several positions at the same company, add them as roles under one Experience entry instead of repeating the company.
<Steps>
<Step title="Open the Experience entry">
Open the entry for the company.
</Step>
<Step title="Add roles">
Select **Add role** at the bottom of the entry. Each role has its own **Position**, **Dates** and **Description**. Add one role per position you held.
</Step>
<Step title="Order the roles">
Use the up and down arrows on each role to change the order, usually the most recent first. The trash icon removes a role.
</Step>
</Steps>
<Frame caption="Two roles under one Experience entry">
<img src="/images/guides/editing-entries/experience-roles.webp" alt="Role 1, Senior Game Developer from March 2024 to Present, and Role 2, Game Developer from March 2022 to February 2024, each with Position, Dates and Description fields and move and delete buttons, followed by an Add role button." />
</Frame>
The page prints the company and the entry's own details first, then each role with its dates:
<Frame caption="How the roles print">
<img src="/images/guides/editing-entries/roles-on-page.webp" alt="The Experience section on the page: Cascade Studios, Seattle, WA, March 2022 to Present, followed by Senior Game Developer, March 2024 to Present, and Game Developer, March 2022 to February 2024." />
</Frame>
Some things to know about roles:
- Once an entry has at least one role, the entry's own **Description** field is replaced by the role descriptions. Text you wrote there earlier is kept but doesn't print; remove all roles to see it again.
- The entry's own **Position** and **Dates** still print above the roles. Leave the entry's Position empty and use its Dates for the whole time at the company, as in the example above.
- A role without a Position doesn't print.
## On a phone
On a phone, an open entry fills the screen. The back button at the top is named after the section and takes you back to the list, and the trash icon deletes the entry. Everything else works the same way.
## Related guides
- [Managing sections](/guides/managing-sections): add, hide, rename and reorder whole sections.
- [Entering dates](/guides/entering-dates): start and end dates, year-only dates and the date format.
- [Formatting text](/guides/formatting-text): bold, lists and links in descriptions.
- [Undoing changes and version history](/guides/undoing-changes-and-version-history): go back to an earlier version.
+123
View File
@@ -0,0 +1,123 @@
---
title: "Editing on a phone or tablet"
description: "How the Reactive Resume editor works on phones and tablets: the Write, Page, Design and Check tabs, full-screen entries, the design sheet and the panel drawer."
---
You can build and edit a resume entirely from a phone or tablet. The editor has the same features as on a computer, arranged to fit a smaller screen. This page explains what changes and where to find things.
## On a phone
On a phone (any screen narrower than 640 pixels), the editor shows one thing at a time: either the page or a panel. Tabs at the bottom switch between them.
<Frame caption="The Write view on a phone, with the tab bar at the bottom">
<img
src="/images/guides/editing-on-mobile/phone-write-view.webp"
alt="The editor on a phone showing the Basics card, with Write, Page, Design and Check tabs along the bottom"
style={{ maxWidth: "360px", margin: "0 auto" }}
/>
</Frame>
| Tab | What it shows |
| --- | --- |
| **Write** | Your details, summary, sections and entries. |
| **Page** | The resume as it will print. |
| **Design** | The page, with design settings in a sheet over its lower half. |
| **Check** | Issues found in your resume, job match and writing review. |
### The editor bar on a phone
The bar at the top keeps the back arrow, the document name (which opens the document menu) and the save status. On the right are three icons:
- **Assistant** opens the AI assistant full screen.
- **Share** opens the Share sheet.
- **Download PDF** downloads the PDF straight away. For other formats, open **Share** and use its **Download** tab.
There's no **History** button on a phone. Open **Share** and use the **History** tab instead.
### Edit an entry from the page
<Steps>
<Step title="Open the Page tab">
Scroll to the part of the resume you want to change.
</Step>
<Step title="Tap the line">
The block is outlined with an **Editing** tag, and an **Edit entry** button appears.
</Step>
<Step title="Tap Edit entry">
The editor switches to **Write** and opens that entry.
</Step>
</Steps>
<Frame caption="Tapping an entry on the page offers Edit entry">
<img
src="/images/guides/editing-on-mobile/phone-page-edit-entry.webp"
alt="The Page view on a phone with an experience entry outlined and tagged Editing, and an Edit entry button floating above the zoom bar"
style={{ maxWidth: "360px", margin: "0 auto" }}
/>
</Frame>
Tap an empty part of the page to dismiss the button. The zoom bar works as it does on a computer, and your zoom level stays the same when you switch tabs.
### Entries open full screen
When you open an entry in **Write**, it slides in and fills the screen, with larger fields that are easier to tap. The top of the screen names the section, for example **Experience**. Tap it to go back to the list. The bin icon (**Delete entry**) deletes the entry, and a message offers **Undo**.
<Frame caption="An experience entry open full screen">
<img
src="/images/guides/editing-on-mobile/phone-entry-screen.webp"
alt="A full-screen experience entry on a phone with a back button labelled Experience, a delete icon, and Position, Company, Location, Dates, Link and Description fields"
style={{ maxWidth: "360px", margin: "0 auto" }}
/>
</Frame>
When you type in a description or the summary, the formatting toolbar docks just above the keyboard. See [Formatting text](/guides/formatting-text#on-a-phone).
### Change the design
The **Design** tab keeps the page visible in the top half of the screen, so you can see each change as you make it. The settings sit in a sheet with four tabs: **Template**, **Type**, **Color** and **Page**. The **Advanced** settings are at the bottom of the **Page** tab.
To see more of the settings, tap the handle at the top of the sheet (**Raise the design sheet**). Tap it again to lower it.
<Frame caption="The design sheet over the lower half of the page">
<img
src="/images/guides/editing-on-mobile/phone-design-sheet.webp"
alt="The Design view on a phone with the resume page above and a sheet below showing Template, Type, Color and Page tabs and a strip of template thumbnails"
style={{ maxWidth: "360px", margin: "0 auto" }}
/>
</Frame>
### Check your resume
The **Check** tab lists the issues found in your resume. Select **Show on page** on an issue to jump to the **Page** tab: a bar at the top reads, for example, "Issue 1 of 3" with **Previous issue** and **Next issue** buttons, and a card at the bottom explains the issue and offers a fix. See [Checking your resume](/guides/checking-your-resume).
## On a tablet
On a tablet, the page fills the screen and the panel opens as a drawer over it. This layout applies to screens from 640 to 1023 pixels wide, which covers most tablets held upright. A tablet held sideways that is 1024 pixels or wider gets the same layout as a computer. You switch modes with **Write**, **Design** and **Check** in the editor bar, as on a computer.
<Frame caption="The panel drawer open over the page on a tablet">
<img
src="/images/guides/editing-on-mobile/tablet-panel-drawer.webp"
alt="The editor on a tablet in landscape with the Write panel open as a drawer on the left and the resume page behind it"
/>
</Frame>
- **Show or hide the panel.** Select the panel button next to the back arrow (**Show panel** / **Hide panel**).
- **Tap a line on the page** to open the drawer on that entry. Tap an empty part of the page to close the drawer again; your selection stays.
- **Keep the panel beside the page.** Held sideways (landscape), a second button appears next to the panel button: **Keep the panel beside the page**. Select it to pin the panel next to the page instead of over it. Select it again to go back to the drawer.
- The assistant opens as a drawer too. **Download PDF** shows only its icon, and **History** is in the Share sheet's **History** tab.
## Install Reactive Resume as an app
You can add Reactive Resume to your home screen so it opens in a window of its own, without the browser's address bar.
- **iPhone and iPad (Safari):** open Reactive Resume, select the **Share** button in Safari, then **Add to Home Screen**.
- **Android (Chrome):** open Reactive Resume, open Chrome's menu, then select **Add to Home screen** or **Install app**.
- **Computer (Chrome or Edge):** select the install icon at the right of the address bar, then **Install**.
The installed app is the same website: you sign in the same way, and your documents stay in your account, not on the device.
## Related guides
- [Getting to know the resume editor](/guides/editor-overview): the editor on a computer, saving and locking.
- [Editing entries](/guides/editing-entries): adding, moving and deleting entries.
- [Keyboard shortcuts](/guides/keyboard-shortcuts): faster editing with a keyboard.
+174
View File
@@ -0,0 +1,174 @@
---
title: "Getting to know the resume editor"
description: "A tour of the Reactive Resume editor: the editor bar, the Write, Design and Check modes, the page canvas, autosave, and locking a resume."
---
The editor is where you write and shape a resume. This page explains what each part of it does, how your work is saved, and how to lock a finished resume so it doesn't change by accident.
<Frame caption="The editor in Write mode: the editor bar across the top, the panel on the left and the page on the right">
<img
src="/images/guides/editor-overview/editor-write-mode.webp"
alt="The resume editor showing the editor bar, the Write panel with the Basics card and section outline, and the rendered resume page"
/>
</Frame>
The editor has three parts:
- **The editor bar** across the top, with the document name, the mode switcher and actions such as **Share** and **Download PDF**.
- **The panel** on the left. What it shows depends on the mode you're in.
- **The page canvas** on the right. It shows your resume exactly as it will print and updates as you type.
To leave the editor, select the back arrow (**Back to documents**) at the far left of the bar.
## The editor bar
<Frame caption="The editor bar">
<img
src="/images/guides/editor-overview/editor-bar.webp"
alt="The editor bar with the back arrow, the document name and Saved status, the Write, Design and Check switcher, and the History, Assistant, Share and Download PDF buttons"
/>
</Frame>
From left to right:
| Part | What it does |
| --- | --- |
| Back arrow | Returns to your Documents. Any unsaved changes are saved first. |
| Document name | Opens the document menu (see below). Under the name is the save status. |
| **Write** · **Design** · **Check** | Switches the panel between modes. **Check** shows how many issues are open, or a check mark when there are none. |
| **History** (clock icon) | Opens the **History** tab of the Share sheet, where you can see and restore earlier versions. |
| **Assistant** (sparkle icon) | Opens or closes the AI assistant. |
| **Share** | Opens the Share sheet on its **Link** tab. When the resume is public, the button also shows a **Public** badge. |
| **Download PDF** | Downloads the resume as a PDF straight away. The arrow next to it (**More download formats**) opens the **Download** tab with every other format. |
On narrower screens some buttons show only their icon, and **History** moves into the Share sheet. See [Editing on a phone or tablet](/guides/editing-on-mobile).
### The document menu
Select the document name to open the document menu.
<Frame caption="The document menu">
<img
src="/images/guides/editor-overview/document-menu.webp"
alt="The document menu open under the resume name, listing Rename, Duplicate, Lock editing, Notes, Details, Print and Move to Trash"
/>
</Frame>
| Item | What it does |
| --- | --- |
| **Rename…** | Changes the resume's name and tags. |
| **Duplicate** | Makes a copy of the resume. |
| **Lock editing** / **Unlock editing** | Makes the resume read-only, or editable again. See [Locking a resume](#locking-a-resume). |
| **Notes** | Opens your private notes for this resume. See [Using private notes](/guides/using-private-notes). |
| **Details** | Shows when the resume was created and last edited, its template, language, length in pages and whether it's shared. |
| **Print** | Prepares the PDF and opens your browser's print dialog. |
| **Move to Trash** | Moves the resume to Trash and takes you back to Documents. A message offers **Undo**, and the resume stays in Trash for 30 days. See [Using the trash](/guides/using-the-trash). |
## The three modes
The mode switcher in the middle of the bar changes what the panel shows. The page stays in view in every mode.
- **Write** is for content: your name and contact details, the summary, and every section and entry. See [Filling in your details](/guides/filling-in-your-details) and [Managing sections](/guides/managing-sections).
- **Design** is for the look of the page: template, fonts, colors, page format and layout. See [Choosing a template](/guides/choosing-a-template).
- **Check** reviews the resume for problems, and can compare it with a job posting. See [Checking your resume](/guides/checking-your-resume).
When you're not typing in a field, press <kbd>1</kbd>, <kbd>2</kbd> or <kbd>3</kbd> to switch to Write, Design or Check. The mode is part of the page address, so reloading the page or opening a bookmark keeps you in the same mode.
## The page canvas
The page on the right is a live preview of the PDF you'll download. Each page has a label above it, such as **Page 1**.
- **Click a line on the page to edit it.** Hovering over the page tints the block under the pointer. Clicking it selects that entry, marks it with an **Editing** tag, and opens it in the Write panel. Clicking your name or contact details opens the Basics card. Press <kbd>Esc</kbd> to clear the selection.
- **Proposed edits** from the assistant or from Check appear on the page, with old text struck through and new text highlighted. Nothing changes until you accept them.
- **Overflow warning.** If your content runs onto an extra page, the label above the first page says so, for example "Runs onto page 2 by about 6 lines", and offers **Fit to one page**. See [Fitting content on a page](/guides/fitting-content-on-a-page).
### Zooming
A small zoom bar floats at the bottom of the canvas.
<Frame caption="The zoom bar">
<img
src="/images/guides/editor-overview/zoom-bar.webp"
alt="The zoom bar with a minus button, the Fit button, a plus button and the page count"
/>
</Frame>
- Select **−** or **+** to zoom out or in, in 10% steps from 60% to 150%.
- Select the middle button to fit the page to the width of the canvas. It reads **Fit** when the page is fitted, and the zoom level otherwise. You can also press <kbd>⌘</kbd> <kbd>0</kbd> (<kbd>Ctrl</kbd> <kbd>0</kbd> on Windows and Linux).
- The number on the right is how many pages the resume has.
Zoom only changes what you see in the editor. It has no effect on the PDF or any other download.
## How your work is saved
Reactive Resume saves as you type. There is no save button. Changes are sent about half a second after you stop typing, and the status under the document name tells you where things stand:
| Status | Meaning |
| --- | --- |
| **Saved** | Everything you see is saved to your account. |
| **Saving…** | Your latest change is on its way. |
| **Offline · saved on this device** | You've lost your connection. Your changes are kept in this browser and sent when you're back online. |
| **Not saved · Retry** | The server couldn't save your changes. They're kept in this browser. Select **Retry** to try again. |
<Frame caption="The editor while offline">
<img
src="/images/guides/editor-overview/offline-save-status.webp"
alt="The save status reading Offline, saved on this device, above a notice that says you can keep editing and that Download and Share need a connection"
/>
</Frame>
A few things to know:
- **You can keep editing offline.** A notice at the top of the panel explains that changes sync when you're back online. **Share** and **Download PDF** are unavailable until then.
- **Unsaved changes survive a reload or a closed tab.** If you come back to a resume whose last changes never reached the server, the editor restores them and says "Restored changes that hadn't been saved yet."
- **Leaving the editor waits for the save.** If saving takes more than about 10 seconds, you stay in the editor and see a message that your changes are still open.
- Pressing <kbd>⌘</kbd> <kbd>S</kbd> (<kbd>Ctrl</kbd> <kbd>S</kbd>) only reminds you that changes are saved automatically.
Each visit in which you make changes also leaves an autosave version in History, so you can go back to how the resume looked before. Within a visit, press <kbd>⌘</kbd> <kbd>Z</kbd> (<kbd>Ctrl</kbd> <kbd>Z</kbd>) while you're not typing in a field to undo your last change, and <kbd>⇧</kbd> <kbd>⌘</kbd> <kbd>Z</kbd> (<kbd>Ctrl</kbd> <kbd>Y</kbd>) to redo it. There's no undo button in the editor bar. See [Undoing changes and version history](/guides/undoing-changes-and-version-history).
### Editing in more than one place
If the same resume changes somewhere else while you have it open (in another browser tab, on another device, or through an AI agent or app connected to your account), the editor picks up the change on its own and shows a short message: "Synced changes made in another tab." or "This resume was updated by an AI agent."
- If you're typing in a field at that moment, the update waits until you leave the field, so your typing isn't interrupted.
- If you have changes of your own that haven't been saved yet, your changes win.
- After an outside change, <kbd>⌘</kbd> <kbd>Z</kbd> can't undo past it. Use History to go further back.
## Locking a resume
Lock a resume when it's finished, or when you've sent it for an application and want to keep it exactly as it was. You can still view, download, print and duplicate a locked resume, and a public link you already made keeps working, but the content and design can't change.
<Steps>
<Step title="Open the document menu">
Select the document name in the editor bar.
</Step>
<Step title="Select Lock editing">
The resume locks straight away. There's no confirmation, because unlocking is one click. A lock icon appears next to the document name.
</Step>
</Steps>
While a resume is locked:
- The Write panel shows **Locked. Unlock to edit.** and every field is read-only.
- The Design panel is read-only.
- **Rename…** and **Move to Trash** are unavailable in the document menu.
- Share link settings can't be changed, and History can't restore an older version over it.
<Frame caption="A locked resume">
<img
src="/images/guides/editor-overview/locked-document.webp"
alt="The document name with a lock icon, and a notice in the panel reading Locked. Unlock to edit, with an Unlock button"
/>
</Frame>
To edit it again, select **Unlock** in the notice, or choose **Unlock editing** from the document menu.
You can also lock and unlock resumes from the Documents page. See [Managing documents](/guides/managing-documents).
## Related guides
- [Filling in your details](/guides/filling-in-your-details): your name, contact details, photo and summary.
- [Formatting text](/guides/formatting-text): bold, lists, links and the formatting toolbar.
- [Editing on a phone or tablet](/guides/editing-on-mobile): how the editor changes on smaller screens.
- [Keyboard shortcuts](/guides/keyboard-shortcuts): every shortcut in one list.
- [Exporting your resume](/guides/exporting-your-resume): PDF, Word, Markdown and JSON.
+97
View File
@@ -0,0 +1,97 @@
---
title: "Entering dates"
description: "Type start and end dates, year-only dates and current roles in Reactive Resume, fix dates that need a look, and choose how every date prints."
---
Dates in Reactive Resume are structured: you type a month and year (or only a year), and the resume prints every date in one consistent format that you choose. This keeps your resume tidy, lets **Sort by date** work, and helps applicant tracking systems read your timeline.
## Enter dates for an entry
Experience, Education, Projects and Volunteer entries have a start and an end date. Each job role has its own pair too.
<Steps>
<Step title="Open the entry">
In **Write** mode, open the entry you want to date. See [Editing entries](/guides/editing-entries) if you're not sure how.
</Step>
<Step title="Type the start date">
In the first box under **Dates**, type the date the way you normally write it, for example `Mar 2022`, `March 2022`, `03/2022`, `2022-03`, or only `2022`. A date that can be read saves as you type. When you leave the box, it switches to your resume's date format.
</Step>
<Step title="Type the end date, or turn on Present">
Type the end date in the second box. If you're still in the role or still studying, turn on **Present** instead. The end box then shows the word "Present" and can't be edited.
</Step>
</Steps>
<Frame caption="A current role: the start date and Present">
<img src="/images/guides/entering-dates/dates-present.webp" alt="The Dates field with Mar 2022 in the start box, the end box greyed out showing Present, and the Present switch turned on." />
</Frame>
Awards, Certifications and Publications have a single **Date** box and no Present switch.
## Year-only dates
If you don't remember the month, or prefer not to show it, type only the year, such as `2014`. Year-only dates are exact, not guesses: they print as the year alone whatever date format you choose, for example "2014 – 2018".
## How dates print
The page shows the start and end joined by a dash. If there's only a start date, only that date prints; with **Present** on, the end reads "Present".
<Frame caption="Dates on the page: year-only for Education, month and year with Present for Experience">
<img src="/images/guides/entering-dates/dates-on-page.webp" alt="The Education section showing University of Washington with 2014 – 2018, and the Experience section showing Cascade Studios with March 2022 – Present and two roles with their own dates." />
</Frame>
Month names and the word "Present" follow the resume's language, which you set in **Design** → **Page** → **Language**. For example, a resume in German prints "März 2022 – Heute". You can also type month names in the resume's language.
## Choose the date format
<Steps>
<Step title="Open Advanced in Design mode">
Select **Design** in the editor bar, then open **Advanced** at the bottom of the panel.
</Step>
<Step title="Pick a date format">
Choose one of the four formats in **Date format**. Every date on the resume changes at once.
</Step>
</Steps>
<Frame caption="The Date format setting in Design → Advanced">
<img src="/images/guides/entering-dates/design-advanced-date-format.webp" alt="The Advanced group in Design mode, with a Date format dropdown set to March 2022." />
</Frame>
| Option | Prints as |
| --- | --- |
| **Mar 2022** | Short month name and year (the default) |
| **March 2022** | Full month name and year |
| **03/2022** | Month number and year |
| **2022-03** | Year and month number (ISO) |
Resumes brought over from an earlier version of Reactive Resume start with whichever of these formats is closest to how their dates were typed. **Reset to template defaults** in the same panel doesn't change your date format.
## Fix dates that need a look
The Dates field tells you when something is off.
- **"Use a month and year, like Mar 2022, or just a year."** The text you typed can't be read. The entry keeps the last date that could be read until you correct it.
- **"The end is before the start."** The two dates are the wrong way round. Swap them, or the entry sorts to the end when you use **Sort by date**.
<Frame caption="A date that can't be read">
<img src="/images/guides/entering-dates/dates-unreadable-error.webp" alt="The Dates field with Spring typed in the start box and 2024 in the end box, and a red message below: Use a month and year, like Mar 2022, or just a year." />
</Frame>
### Dates from imports and older resumes
When you import a resume, or open one made before dates were structured, Reactive Resume converts each date from its text. Dates it can't read exactly, such as "Summer 2016", are flagged:
- The section's row in the list shows a **to check** badge with the number of entries to look at.
- The entry's Dates field explains what happened, for example: We read "Summer 2016". Pick a month so it sorts and prints consistently.
- Until you edit the dates, the entry prints the original text as it was written.
Type the dates, or change any part of them, and the note clears.
<Note>
**Check** mode also flags entries without dates, dates that can't be read, dates that run backwards and dates in the future. See [Checking your resume](/guides/checking-your-resume).
</Note>
## Related guides
- [Editing entries](/guides/editing-entries): the other fields in each entry, including job roles.
- [Managing sections](/guides/managing-sections): sort Experience and Education by date from the section menu.
- [Importing resumes](/guides/importing-resumes): bring in an existing resume and review what was read.
+55 -60
View File
@@ -1,104 +1,99 @@
---
title: "Exporting a resume to Markdown"
description: "Export your Reactive Resume as a portable Markdown file for AI tools, personal websites, notes, version control, or quick plain-text edits."
description: "Download your resume as a Markdown file: plain text with headings for application forms, AI tools, notes, websites and version control."
---
Use Markdown when you want the content of your resume in a portable plain-text format. Markdown keeps headings, lists, links, bold text, and italic text, but it does not try to preserve the visual template, page layout, colors, or spacing from the PDF.
Markdown is plain text with a few symbols for headings, lists and links. A Markdown export gives you the words of your resume without its design, which is what you want when you paste into a form, feed an AI tool or keep your resume in a notes app.
Use PDF when you are submitting the finished resume. Use Markdown when you want to reuse, review, transform, or store the resume content.
For applying to jobs, download a PDF instead. See [Downloading your resume](/guides/exporting-your-resume).
## Export Markdown
## Download the Markdown file
<Steps>
<Step title="Open your resume">
Go to the dashboard and open the resume you want to export.
<Step title="Open the Download tab">
In the editor, select the arrow beside **Download PDF**, or press <kbd>⌘</kbd> <kbd>⇧</kbd> <kbd>E</kbd> (<kbd>Ctrl</kbd> <kbd>Shift</kbd> <kbd>E</kbd> on Windows and Linux).
</Step>
<Step title="Open Download">
Click **Download** in the builder header, or open the **Export** section in the right sidebar and click **Download**.
<Step title="Choose Markdown">
Select **Markdown**. The file name ends in `.md`; change the name in **File name** if you like.
</Step>
<Step title="Download Markdown">
In the **Markdown** row, click **Download**. Your browser saves a `.md` file.
<Step title="Download">
Select **Download Markdown**. Your browser saves the file.
</Step>
</Steps>
<Frame caption="Download dialog with the Markdown export option">
<img
src="/images/guides/exporting-resume-to-markdown/screenshot-1.webp"
alt="Download dialog showing PDF, DOCX, Markdown, and JSON export options for a resume"
/>
<Frame caption="Markdown selected on the Download tab">
<img src="/images/guides/exporting-resume-to-markdown/download-tab-markdown.webp" alt="Download tab of the Share and export sheet with Markdown selected, the file name David-Kowalski-Resume.md and a Download Markdown button" />
</Frame>
## Use cases
## What the file looks like
Markdown export is useful when you need readable resume content outside the PDF.
| Use case | Why Markdown helps |
| --- | --- |
| **AI agents and assistants** | Markdown gives the model structured text with headings and lists, without the layout noise of a PDF. |
| **File search and retrieval systems** | `.md` files are easy to index, search, chunk, and cite in retrieval workflows. |
| **GitHub profile or portfolio repositories** | GitHub renders Markdown files, so you can reuse resume content in a profile README or portfolio repo. |
| **Personal websites and static sites** | Many site generators and CMS workflows accept Markdown as source content. |
| **Notes and knowledge bases** | Apps like Obsidian use Markdown syntax, so your resume can live next to job-search notes and interview prep. |
| **Version control** | Markdown diffs cleanly, making it easier to review what changed between resume versions. |
| **Quick editing** | Open the file in any text editor, make content edits, then copy the text wherever you need it. |
## Example Markdown
A shortened export of the built-in sample resume looks like this:
This is the start of a Markdown export of the sample resume, shortened:
```md
# David Kowalski
_Game Developer | Unity & Unreal Engine Specialist_
david.kowalski@email.com - +1 (555) 291-4756 - Seattle, WA - [davidkowalski.games](https://davidkowalski.games)
david.kowalski@email.com · +1 (555) 291-4756 · Seattle, WA · [davidkowalski.games](https://davidkowalski.games) · [github.com/dkowalski-dev](https://github.com/dkowalski-dev) · [itch.io/dkowalski](https://itch.io/dkowalski)
## Summary
**Passionate game developer with 5+ years of professional experience** creating engaging gameplay systems and polished player experiences across multiple platforms. Specialized in Unity and Unreal Engine with strong expertise in C#, C++, and game design principles.
## Experience
### Cascade Studios - Senior Game Developer (March 2022 - Present)
_Seattle, WA_
- Lead gameplay programmer on an unannounced AAA action-adventure title built in Unreal Engine 5 for PC and next-gen consoles
- Architected and implemented core combat system including hit detection, combo mechanics, and enemy AI behavior trees serving 15+ enemy types
- Developed custom editor tools in C++ that reduced level designer iteration time by 40% and improved workflow efficiency across the team
- Optimized rendering pipeline and gameplay systems to maintain 60 FPS performance target on all supported platforms
**Passionate game developer with 5+ years of professional experience** creating engaging gameplay systems and polished player experiences across multiple platforms.
## Education
### University of Washington - Bachelor of Science, Computer Science (2014 - 2018)
### University of Washington — Bachelor of Science, Computer Science (2014 – 2018)
_Seattle, WA - Grade: 3.6 GPA_
_Seattle, WA · Grade: 3.6 GPA_
Concentration in Game Development. Relevant Coursework: Game Engine Architecture, Computer Graphics, Artificial Intelligence, Physics Simulation, 3D Mathematics, Software Engineering, Data Structures & Algorithms
## Experience
## Skills
### Cascade Studios — Senior Game Developer (March 2022 – Present)
### Unity Engine - Expert
_Seattle, WA_
C# - Editor Tools - Performance Profiling
- Lead gameplay programmer on an unannounced AAA action-adventure title built in Unreal Engine 5
- Developed custom editor tools in C++ that reduced level designer iteration time by 40%
### Unreal Engine - Advanced
## Profiles
C++ - Blueprints - UE5 Features
- **GitHub** — dkowalski-dev ([github.com/dkowalski-dev](https://github.com/dkowalski-dev))
- **LinkedIn** — davidkowalski ([linkedin.com/in/davidkowalski](https://linkedin.com/in/davidkowalski))
```
## What Markdown includes
Your name becomes the top heading and each section a second-level heading. Entries such as jobs, schools and projects get a third-level heading with their dates; shorter entries such as skills, languages and profiles become one bullet each. Sections follow your pages in order, the main column first and then the sidebar.
Markdown export includes the visible resume content. It keeps the document structure, section headings, item headings, rich-text paragraphs, lists, links, bold text, and italic text.
## What's included
Markdown export does not include visual-only choices such as template design, page size, column layout, colors, icon styling, spacing, or PDF page breaks.
The file keeps:
- your name, headline and contact details;
- every visible section and entry, with section titles in your resume's language;
- paragraphs, lists, links, and **bold** and _italic_ text. Numbered lists become bullet points.
It leaves out:
- hidden sections and entries;
- your photo;
- the template, fonts, colors, columns, icons and page breaks.
## Ways to use it
| Use | Why Markdown helps |
| --- | --- |
| **Application forms** | Many job portals have plain text boxes. Markdown pastes cleanly, without the stray characters a PDF copy often brings. |
| **AI tools** | Headings and lists give an AI tool clear structure, without the layout noise of a PDF. Paste the job description alongside it and ask for suggestions. |
| **Notes apps** | Apps such as Obsidian use Markdown, so your resume can sit next to your interview notes. |
| **Websites and GitHub** | Many site builders take Markdown, and GitHub displays `.md` files, for example in a profile README. |
| **Version control** | Plain text shows clearly what changed from one version to the next. |
<Tip>
If you are sharing the file with an AI assistant, include the job description in the same prompt and ask for changes as Markdown. That makes the result easy to compare before you update the resume in Reactive Resume.
Reactive Resume has its own AI assistant that can edit your resume directly. See [Using the assistant](/guides/using-the-assistant).
</Tip>
## When not to use Markdown
If an AI tool rewrites your Markdown, review the changes, then copy the parts you want back into the editor. Reactive Resume doesn't import Markdown files.
Do not use Markdown as the final file for most job applications. Applicant portals and recruiters usually expect a PDF or DOCX file. Export Markdown when you need a working copy of the content, then export PDF when you are ready to submit.
## Related guides
- [Downloading your resume](/guides/exporting-your-resume): PDF, Word and JSON, and when to use each.
- [Sharing your resume with a link](/guides/sharing-your-resume-publicly): send a link instead of a file.
+45
View File
@@ -0,0 +1,45 @@
---
title: "Exporting your data"
description: "Download everything in your Reactive Resume account, including resumes, cover letters and job applications, as JSON files in a single zip archive."
---
You can download a copy of everything you have stored in Reactive Resume in one step. Use it as a backup, to keep a record before [deleting your account](/guides/deleting-your-account), or to take your data elsewhere.
## Download the archive
<Steps>
<Step title="Open Your data">
Select your name at the bottom of the sidebar, then **Settings**. On the **Account** page, scroll to **Your data**.
</Step>
<Step title="Select Export">
Next to **Export everything**, select **Export**. Your browser downloads a file named `reactive-resume-` followed by today's date, for example `reactive-resume-2026-09-30.zip`.
</Step>
</Steps>
<Frame caption="Export everything sits under Your data in Settings → Account">
<img src="/images/guides/exporting-your-data/your-data-section.webp" alt="The Your data section with an Export everything row and Export button, and a Delete account row with a Delete button" />
</Frame>
## What's in the zip
| File | Contents |
| --- | --- |
| `account.json` | Your name, email, username, photo address, whether your email is verified, and when the account was created and last updated. |
| `applications.json` | Every job application with its status, job details, notes, contacts, follow-ups and activity. |
| `resumes/` | One JSON file per resume, including those in the trash. Each holds the resume's name, public address, tags, sharing settings and the full resume content. |
| `letters/` | One JSON file per cover letter. |
Each resume and letter file is named after the document plus a unique ID, so two documents with the same name don't overwrite each other.
The archive doesn't include your password, passkeys, two-step verification codes, API keys or AI provider keys. Uploaded images, such as resume photos, are listed by their address rather than included as files.
<Tip>
To move one resume into another account or another Reactive Resume site, download it as **JSON** from the **Share** sheet's **Download** tab and import that file. The resume files in this archive wrap the content with extra details, so they aren't meant for **Import**. See [Exporting your resume](/guides/exporting-your-resume).
</Tip>
## Related guides
- [Exporting your resume](/guides/exporting-your-resume): PDF, Word, Markdown and JSON for a single resume.
- [Importing resumes](/guides/importing-resumes): bring a resume file into Reactive Resume.
- [Deleting your account](/guides/deleting-your-account): remove your account and everything in it.
+74 -143
View File
@@ -1,173 +1,104 @@
---
title: "Exporting your resume"
description: "Download your resume from Reactive Resume as PDF, DOCX, Markdown, or JSON, and pick the right format for each situation."
title: "Downloading your resume"
description: "Download your resume as a PDF in one click, or as Word, Markdown or JSON from the Share sheet. Learn which format to use and how to print."
---
Reactive Resume can export your resume in four formats.
When a job application asks for a file, download your resume from the editor. A PDF takes one click. Word, Markdown and JSON files are one step further, in the **Share & export** sheet.
| Format | Best for |
## Choose a format
| Format | Use it 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. |
| **PDF** (`.pdf`) | Applying for jobs and emailing recruiters. It looks exactly like the page in the editor. |
| **Word** (`.docx`) | Job portals or recruiters who ask for a Word document. The layout is simplified, so it won't match the PDF exactly. |
| **Markdown** (`.md`) | Plain text with headings, for pasting into application forms, notes or AI tools. See [Exporting a resume to Markdown](/guides/exporting-resume-to-markdown). |
| **JSON** (`.json`) | A complete backup of the resume that you can import back into Reactive Resume later. |
## Open the download dialog
If you're unsure, choose PDF. It's the format most employers expect.
Every export runs from the same **Download** dialog. You can open it two ways.
## Download a PDF
In the editor bar, select **Download PDF**, or press <kbd>⌘</kbd> <kbd>P</kbd> (<kbd>Ctrl</kbd> <kbd>P</kbd> on Windows and Linux). The button shows **Preparing…** while the file is made, then your browser saves it.
<Frame caption="The Download PDF button. The arrow beside it opens every format.">
<img src="/images/guides/exporting-your-resume/download-pdf-button.webp" alt="Green Download PDF button with a separate arrow segment on its right" />
</Frame>
The file is named after the full name on your resume, such as `David-Kowalski-Resume.pdf`. If the resume has no name yet, the document's name is used.
<Note>
In the editor, <kbd>⌘</kbd> <kbd>P</kbd> downloads the PDF instead of opening your browser's print dialog. To print, use **Print** in the document menu (see [Print your resume](#print-your-resume)).
</Note>
## Download another format
<Steps>
<Step title="Open your resume in the builder">
Go to the dashboard and open the resume you want to export.
</Step>
<Step title="Open the Download tab">
Select the arrow beside **Download PDF** (**More download formats**), or press <kbd>⌘</kbd> <kbd>⇧</kbd> <kbd>E</kbd> (<kbd>Ctrl</kbd> <kbd>Shift</kbd> <kbd>E</kbd>). The **Share & export** sheet opens on its **Download** tab.
<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.
On a phone, select **Share** in the editor bar, then the **Download** tab.
</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 title="Pick a format">
Select **PDF**, **Word**, **Markdown** or **JSON**. Each option says what it's best for.
</Step>
<Step title="Check the file name">
The **File name** field shows the name recruiters will see. Change it if you like; the extension is added for you. Characters that computers don't allow in file names, such as `/` or `:`, are removed as you type.
</Step>
<Step title="Download">
Select the download button at the bottom, for example **Download Word**. It shows its progress, and a message confirms the file name once it's saved.
</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>
<Frame caption="The Download tab of the Share & export sheet">
<img src="/images/guides/exporting-your-resume/share-sheet-download-tab.webp" alt="Download tab listing PDF (marked Best for applying), Word, Markdown and JSON, a File name field with David-Kowalski-Resume, a note that Check has 3 things to review, and a Download PDF button" />
</Frame>
## Cover letters
A few things you may see on this tab:
Cover letters are documents of their own. Export one from the letter itself: open it and click **Share & export**. See [Adding a cover letter](/guides/adding-a-cover-letter). When the resume's application has a letter, the **Download** tab offers to include it as a second file.
- **Check has _n_ things to review. You can still download.** Check mode found issues on your resume. They never block a download; select **Review** to see them first.
- **Also download the _company_ cover letter** appears when this resume belongs to a job application that has a cover letter. Tick it to get both files at once, in the same format.
- If a Word, Markdown or JSON file can't be made, the tab says so. Select **Try again**, or **Download PDF instead**.
## Export as PDF
## What each file contains
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 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.
- **PDF** keeps your template, fonts, colors, layout and page breaks. Hidden sections and entries are left out.
- **Word** keeps your content, headings and lists in an editable document. Visual details such as columns, colors and icons are simplified, your photo isn't included, and hidden content is left out.
- **Markdown** keeps headings, lists, links, bold and italic text. It leaves out hidden content and all visual design.
- **JSON** keeps everything: every section and entry, hidden ones included, your design settings and your private notes. To restore it, select **New**, then **Import a resume**, and choose the file. Importing creates a new resume; it doesn't overwrite one.
<Warning>
DOCX exports are useful for editing, but the visual layout may not match the PDF exactly. Use PDF when exact visual fidelity matters.
A JSON file includes your private notes and hidden entries. Treat it as a backup for yourself, not a file to send to employers.
</Warning>
## Export as Markdown
## Print your resume
Choose **Markdown** when you want a plain-text version of your resume that is easy to edit anywhere and easy to feed into AI tools.
<Steps>
<Step title="Open the document menu">
In the editor bar, select the resume's name.
</Step>
<Step title="Select Print">
Select **Print**. Reactive Resume prepares the same PDF you'd download and opens your browser's print dialog. If your browser blocks that, the PDF opens in a new tab so you can print it from there.
</Step>
</Steps>
Use Markdown for:
<Frame caption="Print in the document menu">
<img src="/images/guides/exporting-your-resume/document-menu-print.webp" alt="Document menu under the name Game Developer Resume, with Rename, Duplicate, Lock editing, Notes, Details, Print and Move to Trash" />
</Frame>
- 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.
Printing uses the PDF, so the printout matches the file recruiters receive.
Section headings, lists, links, and rich-text formatting from the builder are preserved as standard Markdown.
## Downloads by visitors
For examples and common workflows, see [Exporting a resume to Markdown](/guides/exporting-resume-to-markdown).
If your resume has a public link, visitors can download the PDF from the public page, unless you turn off **Visitors can download the PDF**. These downloads show up in your statistics. See [Sharing your resume with a link](/guides/sharing-your-resume-publicly).
## Export as JSON
<Note>
**Download PDF**, **Share** and their shortcuts are unavailable while you're offline. They come back when your connection does.
</Note>
Choose **JSON** when you want a structured backup of your resume.
## Related guides
The JSON export includes your full resume content and settings. Cover letters are exported on their own. 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 in the download dialog is only available on the **Resume** tab. To export an independent letter as JSON, open it from **Cover Letters** on the dashboard and select **Export JSON**.
</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>
## Keep JSON backups in a local Git repository
Git can keep owner-controlled versions of your exported resume and cover letter without changing Reactive Resume or connecting it to a Git provider. This workflow is manual and local only: Reactive Resume does not commit, synchronize, or upload the files for you.
### Choose the right exports
Reactive Resume provides three different JSON shapes:
| Export | How to create it | What it contains | Can you import it as one resume? |
| --- | --- | --- | --- |
| **Single resume** | In the builder, open **Download** and download **JSON**. | Resume content and settings. | Yes. |
| **Independent cover letter** | Open a letter from **Cover Letters** on the dashboard and select **Export JSON**. | That letter's content and copied resume styling in the Reactive Resume cover-letter format. | No. Import it through the cover-letter library instead. |
| **Account archive** | Open **Settings**, go to **Account**, and under **Your data** select **Export**. | A zip with `account.json` (profile and an `exportedAt` timestamp), each resume and cover letter as its own JSON file, and `applications.json`. | No. It is an archive, not a single-resume import file. |
Use the single-resume and independent-cover-letter exports for the Git workflow below. An account archive is an additional portability backup, not a replacement for those files. Because its `exportedAt` timestamp changes on every export, do not expect otherwise unchanged account archives to be byte-for-byte identical.
### Create the local backup
1. Create a folder outside your Reactive Resume source checkout.
2. Export the resume and each independent cover letter you want to keep.
3. Give the files stable, descriptive names. The example below uses `resume.json` and `cover-letter.json`; replace each file with its latest export instead of changing its name.
4. From that folder, initialize Git and inspect exactly what you are about to commit:
```bash
git init
git add -- resume.json cover-letter.json
git diff --cached --stat
git diff --cached -- resume.json cover-letter.json
git commit -m "Back up resume and cover letter"
```
After the first commit, replace the JSON files with fresh exports and inspect the visible changes before committing again:
```bash
git diff -- resume.json
```
Stable filenames and the exports' two-space indentation make field changes easier to review. Repeat the add, diff, and commit steps only after the changes look correct.
<Warning>
Resume JSON, cover-letter JSON, and especially an account archive can contain private data such as contact details, application text, profile metadata, and email address. A local Git repository does not publish anything. Inspect every diff and decide separately whether to publish it; if you use a remote, make it private and control who can access it.
</Warning>
<Info>
JSON exports store image URLs, not offline copies of image files. An imported backup can show an image only while the referenced storage remains available and accessible.
</Info>
### Recover an earlier resume without replacing the current one
Choose the committed revision of `resume.json` that you want to recover. List commits that changed the file, then inspect
the selected revision from the backup folder. Choose a fresh, unused output filename; the example assumes
`recovered-resume.json` does not already exist:
```bash
git log --oneline -- resume.json
git show <commit>:resume.json
git show <commit>:resume.json > recovered-resume.json
```
On the Reactive Resume dashboard, select **Import an existing resume**, choose `recovered-resume.json`, and complete the import. Import creates a new resume, so the current resume remains available for comparison or further editing.
Only a single-resume JSON export works for this recovery flow. Import independent cover letters through the cover-letter library. Restoring an account archive wholesale is outside this workflow.
Git backups complement Reactive Resume's rolling snapshots; they do not replace or synchronize with [undo and version history](/guides/undoing-changes-and-version-history).
## 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).
- [Exporting a resume to Markdown](/guides/exporting-resume-to-markdown): what the Markdown file looks like and where it's useful.
- [Writing a cover letter](/guides/writing-a-cover-letter): letters have their own **Download** tab in their Share sheet.
- [Fitting content on a page](/guides/fitting-content-on-a-page): tidy up page breaks before you download.
- [Exporting your data](/guides/exporting-your-data): download everything in your account at once.
- [Importing resumes](/guides/importing-resumes): bring a JSON backup back into Reactive Resume.
+150
View File
@@ -0,0 +1,150 @@
---
title: "Filling in your details"
description: "Add your name, headline, contact details, extra links, photo and summary to a Reactive Resume using the Basics card and the Summary section."
---
The top of a resume tells a recruiter who you are and how to reach you. In Reactive Resume that information lives in the **Basics** card at the top of the Write panel, with your summary just below it. Everything you type saves automatically and shows on the page as you go.
## Before you start
Open a resume in the editor and make sure **Write** is selected in the editor bar. If you're new to the editor, read [Getting to know the resume editor](/guides/editor-overview) first.
## Enter your name and contact details
<Frame caption="The Basics card">
<img
src="/images/guides/filling-in-your-details/basics-card.webp"
alt="The Basics card showing the photo row, Full name, Headline, Email, Phone, Location and Website fields, two extra fields with icons, and the Add field button"
/>
</Frame>
<Steps>
<Step title="Open the Basics card">
The card is at the top of the Write panel and shows your initials, name, headline and location. Select it to open or close it. You can also click your name on the page to jump straight to it.
</Step>
<Step title="Fill in the fields">
- **Full name**: your name as you want it printed. On a blank resume, this field is ready for typing as soon as the editor opens.
- **Headline**: a short line under your name, usually your job title or the role you're aiming for, for example "Game Developer".
- **Email** and **Phone**: how employers contact you. If an email address looks incomplete, the field tells you what's missing, for example "Add the domain after the @".
- **Location**: a city and region is enough, for example "Seattle, WA".
- **Website**: your personal site or portfolio. You can leave out `https://`; it's added for you.
</Step>
<Step title="Check the page">
Your details appear in the page header as you type. Leave a field empty to keep it off the page.
</Step>
</Steps>
<Tip>
To show friendly text instead of the full web address, select the tag icon inside the **Website** field (**Add a label to the URL**) and type a **Label**, such as "Portfolio".
</Tip>
## Add more links and contact details
Use custom fields for anything the standard fields don't cover, such as a GitHub profile, a portfolio on another site, or a second phone number.
<Steps>
<Step title="Select Add field">
**Add field** is under the **Website** field. A new row appears with an icon, a text box and a few buttons.
</Step>
<Step title="Type the text">
Enter what should appear on the page, for example `github.com/dkowalski-dev`.
</Step>
<Step title="Choose an icon">
Select the icon button at the start of the row (**Pick an icon**), then search for and pick an icon.
</Step>
<Step title="Add a link (optional)">
Select the link button (**Add a link**) and enter the web address. The button is highlighted once the field has a link (its name changes to **Edit link**), and the text on the page becomes clickable.
</Step>
</Steps>
To reorder custom fields, select the up arrow (**Move field up**) on a row. To delete one, select **×** (**Remove field**).
For social profiles you want listed in their own section, such as LinkedIn with a username, use the **Profiles** section instead. See [Managing sections](/guides/managing-sections).
## Add a photo
Whether to include a photo depends on where you're applying. Many applicant tracking systems ignore photos, while some countries expect one. The photo row at the top of the Basics card reminds you of this.
<Steps>
<Step title="Open the photo settings">
In the photo row, select **Add** (or **Edit** if the resume already has a photo). The photo settings open.
</Step>
<Step title="Upload a picture">
Select the empty square (**Upload picture**) and choose an image from your device. JPEG, PNG, WebP and GIF files up to 10 MB work.
You can also paste the address of an image that's already online into the **URL** field.
</Step>
<Step title="Crop it">
The **Crop picture** dialog opens. Drag the image to position it and use the **Zoom** slider to frame it, then select **Crop and Upload**. Select **Skip and Upload** to use the whole image, or **Cancel** to stop.
The crop frame follows the photo's **Aspect Ratio** setting, so set that first if you want a non-square photo. When **Fit** is set to **Contain**, the image uploads without the crop step.
</Step>
<Step title="Adjust how it looks">
Change the settings below and watch the page update. Your changes save as you make them.
</Step>
</Steps>
<Frame caption="The photo settings">
<img
src="/images/guides/filling-in-your-details/photo-popover.webp"
alt="The photo settings popover with the photo preview, URL field, visibility toggle, Fit, Size, Rotation, Aspect Ratio, Border Radius, Border Width and Shadow Width controls"
/>
</Frame>
| Setting | What it does |
| --- | --- |
| Eye icon next to **URL** | Hides the photo from the page without deleting it (**Hide picture** / **Show picture**). The photo row then says "Photo hidden from the page." |
| **Fit** | **Cover** fills the frame and trims the edges. **Contain** shows the whole image inside the frame. |
| **Size** | The photo's width on the page, from 32 to 512 pt. |
| **Rotation** | Turns the photo, from 0 to 360°. |
| **Aspect Ratio** | Width divided by height, from 0.5 to 2.5. The three buttons set square (1), landscape (1.5) or portrait (0.5). |
| **Border Radius** | Rounds the corners, from 0 to 100 pt. The buttons set square corners, slightly rounded, or a circle. |
| **Border Width** and color | Draws a border around the photo. Select the color circle to pick its color. |
| **Shadow Width** and color | Adds a shadow behind the photo. Select the color circle to pick its color. |
<Frame caption="Cropping a new photo before it uploads">
<img
src="/images/guides/filling-in-your-details/crop-picture-dialog.webp"
alt="The Crop picture dialog with the photo inside a square crop frame, a Zoom slider, and Cancel, Skip and Upload, and Crop and Upload buttons"
/>
</Frame>
To remove the photo, open the photo settings and select the photo preview (**Delete picture**).
<Warning>
The photo is deleted as soon as you select the preview, without asking first, and every photo setting goes back to its default. To take the photo off the page but keep it, use the eye icon instead.
</Warning>
<Note>
Uploaded photos are resized to at most 800 × 800 pixels and saved as JPEG, so transparent backgrounds become solid. Self-hosted installations can turn this processing off.
</Note>
## Write your summary
The summary is a short statement under your header that says who you are and what you offer.
<Steps>
<Step title="Find the Summary row">
Look for **Summary** in the section list under the Basics card, and select it to open it.
If there's no Summary row, select **Add section** at the bottom of the list, then **Summary**.
</Step>
<Step title="Write two or three sentences">
Click into the text box and type. While you're typing, the box shows the formatting toolbar, the hint "2–3 sentences reads best" and a character count.
</Step>
</Steps>
<Frame caption="The summary while you're editing it">
<img
src="/images/guides/filling-in-your-details/summary-editor.webp"
alt="The Summary section open, with the summary text, the formatting toolbar with an Improve button, and a footer reading 2–3 sentences reads best and 424 characters"
/>
</Frame>
To keep the summary but leave it off the page, select the eye icon on its row (**Hide Summary from the page**). For bold text, lists and links, see [Formatting text](/guides/formatting-text).
## Next steps
- [Managing sections](/guides/managing-sections): add experience, education, skills and more.
- [Editing entries](/guides/editing-entries): fill in jobs, degrees and other entries.
- [Formatting text](/guides/formatting-text): make text bold, add lists and links, and improve a line with AI.
+53 -145
View File
@@ -1,166 +1,74 @@
---
title: "Fitting content on a page"
description: "Reorganize sections, tune typography, adjust margins, and trim content to fit your Reactive Resume on a single A4 or Letter page without overflow."
description: "See when your resume runs onto an extra page, fit it back with one click, or tighten text size, density, margins and content yourself."
---
When your resume content overflows the page, Reactive Resume shows a warning just below the page. This guide covers how to reorganize and trim your content so everything fits your chosen page format.
Many employers expect a one-page resume, or two pages at most. Reactive Resume tells you as soon as your content runs past the pages you planned, and can tighten the design for you until it fits. This guide covers the automatic fit and the changes you can make by hand.
<Frame caption="Screenshot of the overflow warning message in the resume builder">
<img
src="/images/guides/fitting-content-on-a-page/screenshot-1.webp"
alt="Screenshot of the overflow warning message in the resume builder"
/>
## Know when content runs over
Your layout has a set number of pages (one, unless you add more; see [Arranging the layout](/guides/arranging-the-layout)). When the content needs more than that, three things show it:
- A warning above the first page says how far it runs over, for example "Runs onto page 2 by about 6 lines", next to a **Fit to one page** button.
- A dashed amber line with the page number marks where each extra page begins.
- The zoom bar at the bottom of the page shows the total number of pages.
<Frame caption="The warning above the first page, with its Fit button">
<img src="/images/guides/fitting-content-on-a-page/overflow-chip.webp" alt="Above the first page, the label Page 1 next to an amber warning reading Runs onto page 4 by about 35 lines and a button labelled Fit to 3 pages" />
</Frame>
<Warning>
While Reactive Resume supports multi-page resumes, each page has a fixed height based on your chosen format (A4 or
Letter). If a single page's content exceeds this height, parts of your resume may be rendered improperly when printed
or exported.
</Warning>
## Quick fixes
The fixes below are ordered from simplest to most involved.
### 1. Switch to Free-Form format
If you don't plan on printing your resume, switch to **Free-Form** format. Free-Form creates a single continuous page with no height limit, so nothing can overflow.
With Free-Form:
- Your resume renders as one continuous document
- There are no page breaks to manage
- ATS parsers and AI scanners can still read your content
- You can focus on the content instead of page limits
To switch formats, go to the **Page** section in the right sidebar and change the **Format** to Free-Form. For more details, see [Selecting the right page format](/guides/selecting-page-format).
<Tip>
Most resumes are read on a screen, so Free-Form is often the best choice unless you need printed copies.
</Tip>
### 2. Shorten text blocks
Long paragraphs take up space without adding proportional value. Review each section and cut ruthlessly:
- **Use bullet points** instead of paragraphs. Bullets are easier to scan and take less vertical space.
- **Remove filler words.** "Was responsible for managing" becomes "Managed."
- **Focus on impact.** Keep measurable achievements; cut generic descriptions.
- **Limit bullets per entry.** Three to five bullets per job is usually enough.
<Tip>Read each bullet point and ask: "Does this help me get an interview?" If not, cut it.</Tip>
### 3. Use multi-column layouts
Some sections work better in multiple columns, especially lists of short items.
In the left sidebar, find the section you want to adjust, click on the section heading (not an item), and change the **Columns** setting.
<Frame caption="Screenshot of the columns setting for a section">
<img
src="/images/guides/fitting-content-on-a-page/screenshot-2.webp"
alt="Screenshot of the columns setting for a section"
/>
<Frame caption="An extra page is marked with a dashed amber line">
<img src="/images/guides/fitting-content-on-a-page/page-boundary-marker.webp" alt="The bottom of page 3 and the top of an extra page 4, separated by a dashed amber line labelled Page 4, with the Projects section at the top of page 4" />
</Frame>
Good candidates for multi-column layouts:
<Frame caption="The zoom bar at the bottom of the page shows the page count">
<img src="/images/guides/fitting-content-on-a-page/zoom-bar-page-count.webp" alt="The zoom bar with a minus button, a Fit button, a plus button and the text 4 pages" />
</Frame>
| Section | Recommended Columns |
| ------------------------- | ------------------- |
| Skills | > 2 columns |
| Languages | > 3 columns |
| Interests | > 2 columns |
| Profiles | > 3 columns |
| Certifications (if brief) | > 2 columns |
The **Fit** button in the zoom bar (it shows a percentage after you zoom in or out) only zooms the page to fit your screen. It doesn't change your resume.
<Info>
Multi-column layouts work best for sections with short, uniform items. Sections with long descriptions (like
Experience or Projects) usually work better in a single column.
</Info>
## Fit it automatically
### 4. Move items to another page
Select **Fit to one page** in the warning (it reads **Fit to 2 pages**, **Fit to 3 pages** and so on when your layout has more pages). Reactive Resume tightens the design one step at a time and checks the result after each step:
If you have more content than fits on one page, move less important items to page two. This keeps your first page focused on your most relevant experience.
1. **Density**: Roomy, then Normal, then Compact.
2. **Margins**: Wide, then Normal, then Narrow.
3. **Text size**: half a point smaller each time, never below 9 pt.
Use the **Move to** feature to relocate items:
If your density or margins are exact values from Advanced rather than one of the presets, Fit goes straight to Compact or Narrow for that step. It stops as soon as everything fits and tells you what it changed, for example "Fits on one page: Compact, narrow margins, 10 pt". Select **Undo** in that message, or press <kbd>⌘</kbd> <kbd>Z</kbd> (<kbd>Ctrl</kbd> <kbd>Z</kbd> on Windows and Linux), to reverse the whole fit in one step.
1. Open the item's dropdown menu (three-dot icon)
2. Hover over **Move to**
3. Select the destination page
If the content still doesn't fit at 9 pt, the message says so ("Still 2 pages at 9 pt. Hide a section or shorten entries."). At that point, trim the content itself.
For detailed instructions, see [Moving items between sections](/guides/moving-items-between-sections).
## Tighten the design yourself
You can make the same changes by hand in **Design**, and go further in **Advanced**:
| Change | Where | Notes |
| --- | --- | --- |
| Smaller text | **Type → Text size** | 10–11 pt reads best. Below 9 pt, Check mode flags the text as too small. |
| Tighter lines and spacing | **Type → Density** | **Compact** saves the most space. |
| Smaller margins | **Page → Margins** | **Narrow** saves the most. Check mode flags margins below 8 pt. |
| Exact values | **Advanced → Typography** and **Advanced → Page** | Line height below 1.15 is flagged by Check mode. |
| Narrower sidebar | **Template → Sidebar → Width** | Gives the main column more room on two-column templates. |
| A different template | **Template** | Some templates fit more on a page. The thumbnails show your content, so compare how full each one looks. |
See [Customizing typography](/guides/customizing-typography) and [Choosing paper size, margins and language](/guides/selecting-page-format) for details.
## Trim or rearrange the content
Design changes only go so far. A resume that fits because its content is focused reads better than one squeezed into small type.
- **Shorten entries.** Cut filler words, keep measurable results, and aim for three to five bullet points per job.
- **Hide what doesn't help.** Hide older or less relevant entries and sections from the page without deleting them; see [Editing entries](/guides/editing-entries) and [Managing sections](/guides/managing-sections).
- **Put short sections in columns.** Skills, languages and interests take less height in two or three columns; see [Arranging the layout](/guides/arranging-the-layout#show-a-sections-entries-in-columns).
- **Plan a second page.** If two pages are acceptable, add a page and move less important sections onto it, so page one holds your strongest material. The warning then counts two planned pages.
<Tip>
Keep your most recent and relevant experience on page one. Move older positions or less critical sections (like older
projects or volunteer work) to subsequent pages.
If your resume will only be read on screen, the **Free-form** paper format makes each page as tall as its content, so nothing ever runs over. See [Choosing paper size, margins and language](/guides/selecting-page-format#free-form-one-long-page).
</Tip>
### 5. Adjust layout and design settings
## Related guides
The right sidebar contains settings that control how much space your content uses. Small adjustments here can make a big difference.
Open the right sidebar and explore these options:
| Setting | Where to find it | Effect |
| ----------------- | ---------------------- | ------------------------------------------------------ |
| **Font size** | Typography | Smaller fonts fit more text per line and per page |
| **Line height** | Typography | Tighter line spacing reduces vertical space |
| **Margins** | Page | Smaller margins give you more usable area |
| **Section gaps** | Page | Reducing gaps between sections saves space |
| **Sidebar width** | Layout | Adjusting the sidebar ratio can balance content better |
| **Picture size** | Picture (left sidebar) | A smaller photo leaves more room for text |
<Info>
**Reducing font size is the best option** when you need to fit more content while keeping A4 or Letter format.
Reducing body font from 11pt to 10.5pt (or even 10pt) can free up significant space while remaining readable. The
editor supports 0.1pt increments, so you can fine-tune precisely.
</Info>
### 6. Hide less important sections
If you're still short on space, consider hiding sections that aren't essential for your target role:
- **Interests**: nice to have, but rarely a deciding factor
- **References**: "Available upon request" is assumed, so you don't need to list them
- **Older certifications**: keep only the ones relevant to the job
- **Volunteer work**: include only if it strengthens your application
To hide a section, click on the section heading in the left sidebar and toggle the **Hidden** switch.
## Finding the right balance
If you need to stick with A4 or Letter format, start with content changes (steps 2-4) before adjusting design settings (steps 5-6). A resume that fits its content reads better than one crammed into the space.
Try this order:
1. Consider switching to Free-Form if printing isn't required
2. Cut unnecessary text first
3. Reorganize with columns where appropriate
4. Move secondary content to page two if needed
5. Fine-tune font size and spacing last
<Tip>
Use the live preview to see changes as you make them. Small adjustments add up. Reducing font size by 0.5pt along
with slightly smaller margins can recover enough space for several lines of content.
</Tip>
## Troubleshooting
### Content still overflows after trying everything
If you've tried all the above and content still overflows:
- **Re-evaluate what's essential.** Every item should earn its place. Cut aggressively.
- **Try a different template.** Some templates are more space-efficient than others.
### The preview looks different from the PDF
The PDF export matches the preview exactly. If they appear different, try:
- Refreshing the page
- Checking that all fonts have loaded
- Ensuring your browser zoom is at 100%
### I made the font too small and now it's hard to read
Resume fonts should stay between 9pt and 12pt for body text. If you've gone below 9pt to fit content, you're trying to include too much. Go back to step 1 and cut more content instead.
- [Checking your resume](/guides/checking-your-resume): Check mode flags small text, tight margins and other issues.
- [Undoing changes and version history](/guides/undoing-changes-and-version-history): go back to an earlier design.
- [Exporting your resume](/guides/exporting-your-resume): download the result as a PDF.
+118
View File
@@ -0,0 +1,118 @@
---
title: "Formatting text"
description: "Use bold, italics, bulleted and numbered lists, and links in your summary and descriptions, clear old formatting, and improve a line with AI."
---
Your summary and every description field accept formatted text. Use it to make achievements scannable: a bulleted list under each job, a bold phrase where it matters, a link to a project. This page covers the formatting toolbar, Markdown shortcuts, links, and the **Improve** button.
## The formatting toolbar
Click into a summary or description and a toolbar appears under the text. It stays out of the way until the text has focus, and clicking its buttons doesn't move your cursor.
<Frame caption="The formatting toolbar under the summary">
<img
src="/images/guides/formatting-text/formatting-toolbar.webp"
alt="The formatting toolbar with Bold, Italic, Link, Bulleted list, Numbered list and Clear formatting buttons, an Improve button, and a character count underneath"
/>
</Frame>
| Button | What it does |
| --- | --- |
| **Bold** | Makes the selected text bold. |
| **Italic** | Makes the selected text italic. |
| **Link** | Adds, changes or removes a link on the selected text. |
| **Bulleted list** | Turns the current paragraph into a bulleted list, or back into a paragraph. |
| **Numbered list** | Turns the current paragraph into a numbered list, or back into a paragraph. |
| **Clear formatting** | Removes all formatting from the selected text, including lists and alignment. |
| **Improve** | Suggests a better version of the line your cursor is in. Needs an AI provider. See [Improving a line with AI](#improving-a-line-with-ai). |
A button is highlighted when its formatting applies where your cursor is. Under the toolbar, a footer shows a hint for the field and how many characters it holds.
### Keyboard and Markdown shortcuts
You can format without the toolbar:
| Type or press | Result |
| --- | --- |
| <kbd>⌘</kbd> <kbd>B</kbd> (<kbd>Ctrl</kbd> <kbd>B</kbd>) | Bold |
| <kbd>⌘</kbd> <kbd>I</kbd> (<kbd>Ctrl</kbd> <kbd>I</kbd>) | Italic |
| `- ` or `* ` at the start of a line | Starts a bulleted list |
| `1. ` at the start of a line | Starts a numbered list |
| `**text**` | Makes "text" bold |
| `*text*` | Makes "text" italic |
Press <kbd>Enter</kbd> for a new bullet, and <kbd>Enter</kbd> twice to end the list.
Inside a text field, <kbd>⌘</kbd> <kbd>Z</kbd> (<kbd>Ctrl</kbd> <kbd>Z</kbd>) undoes your typing in that field. Click outside the field to undo changes across the whole resume.
## Add a link
<Steps>
<Step title="Select the text">
Highlight the words you want to link, for example a project name.
</Step>
<Step title="Select Link">
The **Link address** dialog opens with `https://` filled in.
</Step>
<Step title="Enter the address and confirm">
Type or paste the full web address, then select **Confirm**. The text becomes a link on the page and in the PDF.
</Step>
</Steps>
<Frame caption="The Link address dialog">
<img
src="/images/guides/formatting-text/link-address-dialog.webp"
alt="The Link address dialog with an https:// field, the hint Leave it empty to remove the link, and Cancel and Confirm buttons"
/>
</Frame>
To change a link, put your cursor in it and select **Link** again. To remove it, clear the address (or leave only `https://`) and select **Confirm**.
Links don't open when you click them in the editor, so you can click into linked text to edit it.
## Formatting the toolbar doesn't offer
The toolbar keeps to formatting that reads well on a resume and survives applicant tracking systems. Text you import, or wrote in an older version of Reactive Resume, may carry other formatting, such as headings, colors, highlights, underlines or centered text. That formatting is kept and still prints.
To remove it, select the text and choose **Clear formatting**.
If a description contains a table, the editor keeps the table as it is and shows "Original table formatting is preserved. This content is read-only because it cannot be edited safely." You can still see it on the page, but you can't edit it in the text box.
## Improving a line with AI
**Improve** rewrites one line at a time: a single paragraph of your summary or a single bullet.
<Steps>
<Step title="Put your cursor in the line">
Click anywhere in the line you want to improve. **Improve** is unavailable until the cursor is in a line with text.
</Step>
<Step title="Select Improve and pick a change">
Choose **Stronger verb**, **Add a result** or **Make it shorter**, or select **Ask for something else…**, describe what should change, and select **Ask**.
</Step>
<Step title="Review the suggestion">
Select **Replace** to use it, or **Keep mine** to leave your line as it was. If the suggestion adds facts, it asks you to check they're accurate.
</Step>
</Steps>
Only that one line changes, and only when you select **Replace**. If you edit the line while the suggestion is loading, it isn't applied.
Improve needs an AI provider. If you haven't connected one, selecting **Improve** opens the assistant so you can set one up. See [Connecting an AI provider](/guides/using-ai).
## On a phone
On screens narrower than 768 pixels, such as phones and small tablets held upright, the toolbar docks to the bottom of the screen, just above the keyboard, with larger buttons. To close the keyboard, select **Done** at the right end of the toolbar, or tap outside the text box.
<Frame caption="The formatting toolbar docked above the keyboard on a phone">
<img
src="/images/guides/formatting-text/phone-formatting-toolbar.webp"
alt="A description being edited on a phone, with the formatting toolbar pinned to the bottom of the screen"
/>
</Frame>
See [Editing on a phone or tablet](/guides/editing-on-mobile) for the rest of the mobile editor.
## Related guides
- [Filling in your details](/guides/filling-in-your-details): the summary and your contact details.
- [Editing entries](/guides/editing-entries): descriptions for jobs, projects and other entries.
- [Using the assistant](/guides/using-the-assistant): larger rewrites and questions about your whole resume.
+88 -99
View File
@@ -1,128 +1,117 @@
---
title: "Importing applications from CSV"
description: "Move existing job applications into the Reactive Resume Application Tracker by uploading a CSV file or pasting spreadsheet rows with headers."
description: "Move job applications from a spreadsheet into Reactive Resume with CSV import, check how columns are matched, and export your applications back to CSV."
---
Use CSV import when you already track applications in a spreadsheet and want to move them into Reactive Resume.
## Open CSV import
<Steps>
<Step title="Go to Applications">
In the dashboard sidebar, click **Applications**.
</Step>
<Step title="Click Import CSV">
If you have no applications yet, click **Import from CSV** in the empty state. Otherwise, click **Import CSV** in the
page header.
</Step>
</Steps>
<Frame caption="CSV import sheet with a recognized preview">
<img
src="/images/guides/importing-applications-from-csv/screenshot-1.webp"
alt="CSV import sheet showing upload, pasted CSV rows, recognized fields, and one application ready to import"
/>
</Frame>
## Prepare your CSV
The importer uses the first row as headers. Each imported row must include a company and role.
Supported headers include:
| Field | Recognized headers |
| --- | --- |
| **Company** | `Company`, `Employer`, `Organization` |
| **Role** | `Role`, `Title`, `Position`, `Job Title` |
| **Stage** | `Stage`, `Status` |
| **Location** | `Location` |
| **Salary** | `Salary`, `Salary Range`, `Compensation` |
| **Source** | `Source` |
| **Notes** | `Notes`, `Note` |
| **Job posting URL** | `URL`, `Link`, `Job URL`, `Job Posting` |
| **Tags** | `Tags` |
| **Contact name** | `Contact Name` |
| **Contact role** | `Contact Role` |
| **Contact label** | `Contact Type` |
| **Contact email** | `Contact Email` |
| **Contact phone** | `Contact Phone` |
Tags can be separated with commas, semicolons, or vertical bars.
Each row can carry one contact. A contact needs a `Contact Name`, and `Contact Email` must be a valid email address — if
either is wrong, the contact is dropped and the application still imports.
```csv
Company,Role,Stage,Location,Salary,Source,Tags,Contact Name,Contact Email,Contact Phone
Stripe,Frontend Engineer,applied,Remote,$180k,LinkedIn,remote;react,Jane Doe,jane@example.com,+1 555 0100
```
If you've been tracking your job search in a spreadsheet, you can bring it into **Applications** in one go. Save the sheet as CSV, paste or upload it, check how the columns were matched, and import. You can also export your applications to CSV at any time.
## Import applications
<Steps>
<Step title="Upload or paste rows">
Upload a `.csv` file, or paste CSV rows directly into the **CSV data** field.
<Step title="Open Import from CSV">
In **Applications**, select the import/export button (the two arrows next to **Add application**), then **Import from CSV…**. If you have no applications yet, select **Import from CSV** on the empty page.
</Step>
<Step title="Review the preview">
Reactive Resume shows how many rows are ready to import, which columns it recognized, and how many rows were skipped.
<Step title="Add your rows">
Select **Upload .csv** to choose a file, or paste rows into **CSV data**. The first row must be the column headings. Select **Use sample** to see an example.
</Step>
<Step title="Fix skipped rows">
Rows without a company or role are skipped. Add the missing values before importing if you want those rows included.
The preview also counts skipped contacts — those rows still import, just without the contact.
<Step title="Check the column matches">
Under **Columns**, each heading from your file points to the field it goes into. Reactive Resume matches common headings automatically. Change any match with its menu, or choose **Leave out** to skip a column.
</Step>
<Step title="Review the summary">
The summary says how many applications are ready to import, and how many rows or contacts will be skipped.
</Step>
<Step title="Import">
Click **Import**. Imported applications are added to your Application Tracker.
Select **Import *n* applications**. They're added to your Applications right away.
</Step>
</Steps>
## Use valid stages
<Frame caption="Columns matched automatically, with an unknown column left out">
<img src="/images/guides/importing-applications-from-csv/import-from-csv-column-matching.webp" alt="Import from CSV sheet with pasted rows, and a Columns list matching Company to Company, Position to Role, Status to Stage, Applied Date to Stage date, Location, Source, Tags, Contact Name and Contact Email to their fields, and Referrer to Leave out" />
</Frame>
The **Stage** column is optional. If you include it, use one of these values:
<Frame caption="The summary before importing">
<img src="/images/guides/importing-applications-from-csv/import-from-csv-ready-summary.webp" alt="Summary reading 2 applications ready to import and 1 row has no company or role and will be skipped, with a Download them link and an Import 2 applications button" />
</Frame>
- `saved`
- `applied`
- `screening`
- `interview`
- `offer`
- `rejected`
## Prepare your spreadsheet
If a row has an unrecognized stage, the importer ignores that stage value and uses the default application stage.
Each row becomes one application. Only **Company** and **Role** are required; rows missing either are skipped. Select **Download them** in the summary to get the skipped rows as a CSV file, fix them, and import them again.
These are the fields you can match columns to, with the headings that match automatically (capitals and extra spaces don't matter):
| Field | Headings matched automatically | Notes |
| --- | --- | --- |
| **Company** | Company, Employer, Organization | Required. |
| **Role** | Role, Title, Position, Job Title | Required. |
| **Stage** | Stage, Status | One of `saved`, `applied`, `screening`, `interview`, `offer` or `closed`. `rejected` is read as `closed`. Other values are ignored, and rows without a stage import as **Saved**. |
| **Stage date** | Applied Date, Stage Date, Stage Entered At | The date the application entered its stage, as `YYYY-MM-DD`. Other formats are ignored and today's date is used. |
| **Location** | Location | |
| **Salary** | Salary, Salary Range, Compensation | |
| **Source** | Source | Shows in the Insights sources chart. |
| **Link** | URL, Link, Job URL, Job Posting | The job posting's address. |
| **Notes** | Notes, Note | |
| **Tags** | Tags | Separate tags with commas, semicolons or vertical bars, such as `remote;unity`. |
| **Contact name**, **Contact role**, **Contact label**, **Contact email**, **Contact phone** | Contact Name, Contact Role, Contact Type, Contact Email, Contact Phone | One contact per row. |
| **Archived (closes it)** | Archived | For files exported from older versions: `true` imports the application as closed. |
A contact needs a name, and its email must be a valid address. If not, the summary counts it as skipped and the application imports without it.
Here's a small example:
```csv
Company,Role,Stage,Stage Date,Location,Source,Tags,Contact Name,Contact Email
Orchard Lane Games,Gameplay Programmer,applied,2026-09-02,Remote,LinkedIn,remote;unity,Nadia Brooks,nadia@orchardlane.example
Silverpine Interactive,AI Programmer,screening,2026-08-28,Stockholm,Referral,ai,,
```
## Import large files
Reactive Resume imports up to 500 applications at a time. If your CSV has more than 500 valid rows, split it into smaller files and import each file separately.
Up to 500 applications import at a time. If your file has more, the summary says how many were left out. Split the file and import the rest separately.
<Tip>
Import first, then use the table view to select multiple applications and apply tags, move stages, archive rows, or delete rows in bulk.
After importing, use the List view's checkboxes to tag, move or close many applications at once. See [Tracking job applications](/guides/tracking-job-applications#acting-on-several-applications-at-once).
</Tip>
<Tip>
MCP clients can also import application rows directly with `import_applications`. See [Managing applications with MCP](/guides/managing-applications-with-mcp) for agent prompt examples.
</Tip>
## Export applications to CSV
<Steps>
<Step title="Open Export to CSV">
Select the import/export button, then **Export to CSV…**.
</Step>
<Step title="Choose what to export">
Under **Applications to export**, choose **Current filters** (the applications matching your current search, closed ones included) or **All applications (including closed)**.
</Step>
<Step title="Limit by date, if you like">
Set **Application date from** and **Application date to** to export only applications from that period. Leave them empty to include every date.
</Step>
<Step title="Download">
Check the count of applications to export, then select **Download CSV**.
</Step>
</Steps>
<Frame caption="Export options">
<img src="/images/guides/importing-applications-from-csv/export-applications-sheet.webp" alt="Export applications sheet with Applications to export set to Current filters, empty Application date from and Application date to fields, and 11 applications to export" />
</Frame>
The file is named `applications-YYYY-MM-DD.csv` and opens in any spreadsheet app. It has these columns: Company, Role, Stage, Stage Date, Application Date, Location, Salary, Source, URL, Tags, Contacts, Notes, Closed Reason, Stage History, Timeline, Created At and Updated At.
You can import an exported file again; most columns match automatically. To download everything in your account, including documents, see [Exporting your data](/guides/exporting-your-data).
## Troubleshooting
### Some rows were skipped
<AccordionGroup>
<Accordion title="Some rows were skipped">
Every row needs a company and a role. Check that those columns are matched under **Columns**, then fill in the missing values. **Download them** gives you the skipped rows.
</Accordion>
<Accordion title="A column wasn't recognized">
Pick the right field from the column's menu under **Columns**, or rename the heading in your file to one from the table above.
</Accordion>
<Accordion title="A stage or date didn't import">
Use one of the stage values listed above, and write dates as `YYYY-MM-DD`, for example `2026-09-02`.
</Accordion>
<Accordion title="Tags didn't split correctly">
Separate tags with commas, semicolons or vertical bars. If you use commas, put the whole cell in double quotes, such as `"remote,unity"`, so the commas aren't read as new columns.
</Accordion>
</AccordionGroup>
Make sure every row has both a company and a role. These fields are required.
### A contact did not import
The contact needs a `Contact Name`, and `Contact Email` must be a valid address. The application imports either way — fix
the contact columns and import that row again if you want the contact.
### A column was not recognized
Rename the header to one of the recognized names in the table above, then import again.
### Tags did not split correctly
Separate tags with commas, semicolons, or vertical bars, such as `remote;react` or `frontend|senior`.
### A stage did not import
Use lowercase stage values such as `applied` or `interview`. Custom stages are not supported.
MCP clients can import applications too. See [Managing applications with MCP](/guides/managing-applications-with-mcp).
+72 -48
View File
@@ -1,82 +1,106 @@
---
title: "Importing resumes"
description: "Import a resume from JSON, JSON Resume, PDF, or Microsoft Word files with automatic format detection from the Reactive Resume dashboard."
title: "Importing a resume"
description: "Turn an existing resume into an editable Reactive Resume document from a PDF, Word file, LinkedIn export, JSON Resume or Reactive Resume JSON file."
---
Reactive Resume can create a new resume from several existing file formats. Use import when you are moving from another tool, restoring a backup, or converting an older Reactive Resume file.
If you already have a resume, you don't need to retype it. Import the file and Reactive Resume builds a new, editable resume from it, section by section. Your original file is never changed.
## Supported import formats
## Supported files
| Format | Requires AI integration? | Notes |
Reactive Resume works out the format from the file's contents, so you don't pick a type.
| File | Needs an AI provider? | Notes |
| --- | --- | --- |
| **Reactive Resume (JSON)** | No | Best option for backups exported from the current version of Reactive Resume. |
| **Reactive Resume v4 (JSON)** | No | Use this for files exported from Reactive Resume v4. |
| **JSON Resume** | No | Use this for files that follow the JSON Resume schema. |
| **PDF** | Yes | Reactive Resume asks your configured AI provider to parse the file into structured resume data. |
| **Microsoft Word** | Yes | Supports Word documents. Reactive Resume asks your configured AI provider to parse the document. |
| **Reactive Resume JSON** (versions 5 and 6) | No | Best for backups and moving between accounts or servers. Keeps everything, including design. |
| **Reactive Resume v4 JSON** | No | Exports from the old version 4 app. |
| **JSON Resume** (`.json`) | No | Files that follow the open [JSON Resume](https://jsonresume.org) standard. |
| **LinkedIn data export** (`.zip`) | No | Reads your profile, positions, education, skills, languages and certifications. |
| **PDF** | Optional | Read by your AI provider if you've set one up; otherwise read in your browser. |
| **Word** (`.docx`) | Yes | Read by your AI provider. |
A cover letter exported from Reactive Resume as JSON imports as a letter, not a resume.
<Info>
PDF and Word imports depend on your AI settings because those formats are not structured resume data. Configure AI in
**Settings → AI & developer** before using those import types.
An AI provider is an AI service you connect in **Settings → AI & developer**. Only a provider that is turned on and has passed its connection test counts. See [Connecting an AI provider](/guides/using-ai).
</Info>
## Import a resume
## Import a file
<Steps>
<Step title="Open the Resumes dashboard">
Sign in and go to **Dashboard → Resumes**.
<Step title="Open the import">
On Documents, select **New** in the sidebar (or press <kbd>N</kbd>), then select **Import a resume** and pick your file. On your first visit, the empty Documents page has a **Choose a file** button that opens the same dialog.
</Step>
<Step title="Or drop the file">
Drag the file from your computer anywhere onto the Documents page. The page shows **Drop to import**; let go and the import starts.
<Step title="Open the import dialog">
Click the **Import** card (or the header button if you already have resumes).
<Frame caption="Import an existing resume dialog">
<img
src="/images/guides/importing-resumes/screenshot-1.webp"
alt="Import dialog showing the file picker and detected import format"
/>
<Frame caption="Dropping a file on Documents">
<img src="/images/guides/importing-resumes/drop-to-import.webp" alt="The Documents page covered by a green drop area reading Drop to import, PDF, Word or JSON. We'll build a resume from it" />
</Frame>
</Step>
<Step title="Choose your file">
Select the resume file from your computer. Reactive Resume detects the format automatically from the file's contents
and shows the matching import type.
If auto-detection is uncertain, or you want to force a specific format, adjust the import type manually before continuing.
<Step title="Wait for the three steps">
The dialog shows **Reading the file**, **Finding sections** and **Filling in entries**, with a note beside each as it finishes. JSON and LinkedIn files take a moment; PDF and Word files read by an AI provider can take longer. Select **Cancel** to stop.
</Step>
<Step title="Open the new resume">
When the import finishes, the dialog tells you how many sections and entries it found. Select **Open in editor** to start reviewing, or **Stay here** to keep working on Documents. The new resume has a **New** badge on its card.
<Step title="Import">
Click **Import**. Reactive Resume creates a new resume and opens it in the builder when the import succeeds.
For PDF and Microsoft Word files, the dialog checks that you have a working AI provider configured before it starts.
If none is available, you'll get a link to **AI & developer** settings to set one up.
<Frame caption="A finished import">
<img src="/images/guides/importing-resumes/import-finished.webp" alt="The Importing dialog for David-Kowalski-Resume.pdf with all three steps checked, 9 sections and 58 entries found, and Stay here and Open in editor buttons" />
</Frame>
</Step>
</Steps>
## Choose the right import type
## Review what came in
If you have a file exported from Reactive Resume, choose **Reactive Resume (JSON)**. This preserves the most information because the file already matches Reactive Resume's data model.
When you open an imported resume from the dialog, the **Write** panel starts with a note naming the file you imported and counting its sections and entries.
If you are coming from Reactive Resume v4, choose **Reactive Resume v4 (JSON)**.
<Frame caption="The note after an import">
<img src="/images/guides/importing-resumes/imported-from-note.webp" alt="A green note reading Imported from David-Kowalski-Resume.pdf. 9 sections, 58 entries. Everything was read clearly" />
</Frame>
If your file is a standard JSON Resume document, choose **JSON Resume**.
If some dates couldn't be read exactly, the note says how many fields need a look, and each of those date fields shows the text it found, for example *We couldn't read "Summer 2019"*. Pick the right month and year so the entry sorts and prints consistently; the count goes down as you fix them. Close the note with **×** when you're done.
If you only have a PDF or Word document, choose **PDF** or **Microsoft Word**. After import, review every section carefully. AI parsing can save time, but it can also miss details, change wording, or place content in the wrong section.
Go through every section before you send the resume. PDF and Word files don't store which text belongs where, so parts can land in the wrong section, lose formatting or come out slightly reworded. Structured files (Reactive Resume JSON, JSON Resume, LinkedIn) come in far more reliably.
<Warning>
Always review an imported resume before sharing or exporting it. This is especially important for PDF and Word imports.
</Warning>
## Notes on each format
<AccordionGroup>
<Accordion title="Reactive Resume JSON">
Download it from another resume with **Download** and the JSON format (see [Exporting your resume](/guides/exporting-your-resume)). Custom styles written for the older styling system come in converted to the current one. If a version 5 resume contained cover letters, each one becomes its own letter in Documents, linked to the imported resume.
</Accordion>
<Accordion title="LinkedIn data export">
In LinkedIn's settings, request a copy of your data and download the archive when LinkedIn emails you. Import the `.zip` file as it is; don't unzip it. Reactive Resume reads `Profile.csv`, `Positions.csv`, `Education.csv`, `Skills.csv`, `Languages.csv` and `Certifications.csv` and ignores everything else, such as messages. The file never leaves your browser.
</Accordion>
<Accordion title="PDF">
With an AI provider set up, the PDF (up to 10 MB) is sent to that provider, which returns the resume's sections. Without one, Reactive Resume reads the PDF's text in your browser and sorts it into sections itself. This works best for simple, one-column resumes. A scanned PDF (a picture of a page) has no text to read and can't be imported this way.
</Accordion>
<Accordion title="Word">
Word files are always read by your AI provider, so set one up first. Use the modern `.docx` format; if you have an older `.doc` file, open it in Word and save it as `.docx`. Files can be up to 10 MB.
</Accordion>
</AccordionGroup>
## Troubleshooting
### The PDF or Word import says AI must be enabled
**"This file type can't be imported."** The file isn't one of the supported types. Export your resume as PDF, Word or JSON, or use your LinkedIn data export.
Open **Settings → AI & developer**, fill in your AI provider settings, test the connection, and enable AI features.
**"Reading Word files needs an AI provider."** Connect a provider in **Settings → AI & developer** and test it, or import a PDF or JSON version instead. **Choose another file** lets you pick a different file without closing the dialog, and **Start blank** gives you an empty resume.
### The imported resume is incomplete
<Frame caption="A Word file without an AI provider">
<img src="/images/guides/importing-resumes/import-word-needs-ai.webp" alt="The Couldn't import dialog for Resume.docx saying Reading Word files needs an AI provider, with Start blank and Choose another file buttons" />
</Frame>
Try importing a cleaner source file. Simple resumes with selectable text import more reliably than scanned documents, image-heavy PDFs, or files with complex tables.
**"This PDF is a scanned image."** Try the Word version of the resume, set up an AI provider, or start blank and paste your sections in.
### The JSON file is rejected
**"This ZIP doesn't look like a LinkedIn data export."** Make sure you're importing the archive LinkedIn sent you, not a ZIP you made yourself.
Make sure you selected the correct JSON import type. A Reactive Resume JSON export, a Reactive Resume v4 JSON export, and a JSON Resume file are different formats.
**"This PDF is password protected."** Save a copy without a password and import that instead.
**"The file couldn't be read as a resume"** (or **"The file could not be read as a valid resume"**, followed by the fields it couldn't read). The JSON file is damaged or isn't a resume. Check that it came from Reactive Resume or follows the JSON Resume standard.
**"Couldn't reach the AI provider."** Your provider didn't answer. Try again in a moment, or test the connection in **Settings → AI & developer**.
## Related guides
- [Creating your first resume](/guides/creating-your-first-resume): start from scratch instead.
- [Entering dates](/guides/entering-dates): fix dates that need a look.
- [Managing sections](/guides/managing-sections): rename, hide or reorder imported sections.
- [JSON Resume schema](/guides/json-resume-schema): the structure of Reactive Resume's JSON format.
+111
View File
@@ -0,0 +1,111 @@
---
title: "Keyboard shortcuts"
description: "The keyboard shortcuts in Reactive Resume: the command bar, Documents, the resume and letter editors, text formatting, the assistant and proposed edits."
---
This page lists the keyboard shortcuts in Reactive Resume, grouped by where they work.
On a Mac, use <kbd>⌘</kbd> (Command). On Windows and Linux, use <kbd>Ctrl</kbd> wherever this page shows <kbd>⌘</kbd>.
The app's tooltips and buttons show the Mac symbols on every system.
<Note>
Shortcuts made of a single key, such as <kbd>N</kbd> or <kbd>1</kbd>, don't work while you're typing in a text
field, so they never get in the way of your writing. Shortcuts with <kbd>⌘</kbd> work everywhere.
</Note>
## Everywhere
| Shortcut | What it does |
| --- | --- |
| <kbd>⌘</kbd> <kbd>K</kbd> | Open or close the [command bar](/guides/using-the-command-bar). |
| <kbd>Esc</kbd> | Close the command bar. |
| <kbd>↑</kbd> <kbd>↓</kbd>, <kbd>Enter</kbd> | In the command bar, move between rows and run the selected one. |
## Documents, Applications and Settings
| Shortcut | What it does |
| --- | --- |
| <kbd>N</kbd> | Open the **New document** dialog. |
| <kbd>/</kbd> | Jump to the search box on **Documents**. |
| <kbd>Enter</kbd> | Save a document name while renaming it on its card. |
| <kbd>Esc</kbd> | Cancel renaming a document on its card. |
## Resume editor
| Shortcut | What it does |
| --- | --- |
| <kbd>1</kbd> | Switch to **Write**. |
| <kbd>2</kbd> | Switch to **Design**. |
| <kbd>3</kbd> | Switch to **Check**. |
| <kbd>⌘</kbd> <kbd>Z</kbd> | Undo your last change. |
| <kbd>⇧</kbd> <kbd>⌘</kbd> <kbd>Z</kbd> | Redo. |
| <kbd>Ctrl</kbd> <kbd>Y</kbd> | Redo (Windows and Linux). |
| <kbd>⌘</kbd> <kbd>P</kbd> | Download the PDF. This replaces the browser's print dialog; to print, use **Print** in the document menu. |
| <kbd>⇧</kbd> <kbd>⌘</kbd> <kbd>S</kbd> | Open **Share & export** on the **Link** tab. |
| <kbd>⇧</kbd> <kbd>⌘</kbd> <kbd>E</kbd> | Open **Share & export** on the **Download** tab. |
| <kbd>⌘</kbd> <kbd>J</kbd> | Open or close the assistant. |
| <kbd>⌘</kbd> <kbd>0</kbd> | Fit the page to the window. |
| <kbd>⌘</kbd> <kbd>S</kbd> | Nothing to do: a message reminds you that changes are saved automatically. |
| <kbd>Esc</kbd> | Clear the block selected on the page. In **Design**, also stop previewing a template. |
| <kbd>⌥</kbd> <kbd>↑</kbd> / <kbd>⌥</kbd> <kbd>↓</kbd> | With a section or entry title focused in **Write**, move it up or down (use <kbd>Alt</kbd> on Windows and Linux). |
While your cursor is in a text field, <kbd>⌘</kbd> <kbd>Z</kbd> and <kbd>⇧</kbd> <kbd>⌘</kbd> <kbd>Z</kbd> undo and redo
your typing in that field instead of the last change to the resume.
The download and share shortcuts do nothing while you're offline, because they need a connection.
## Letter editor
| Shortcut | What it does |
| --- | --- |
| <kbd>1</kbd> | Switch to **Write**. |
| <kbd>2</kbd> | Switch to **Design**. |
| <kbd>⌘</kbd> <kbd>P</kbd> | Download the PDF. |
| <kbd>⇧</kbd> <kbd>⌘</kbd> <kbd>E</kbd> | Open **Share & export** on the **Download** tab. |
| <kbd>⌘</kbd> <kbd>J</kbd> | Open or close the assistant. |
| <kbd>⌘</kbd> <kbd>0</kbd> | Fit the page to the window. |
| <kbd>⌘</kbd> <kbd>S</kbd> | Send any unsaved edits right away, with a reminder that changes are saved automatically. |
## Formatting text
These work in rich text boxes, such as a summary or an entry's description. See
[Formatting text](/guides/formatting-text) for the toolbar.
| Shortcut | What it does |
| --- | --- |
| <kbd>⌘</kbd> <kbd>B</kbd> | Bold. |
| <kbd>⌘</kbd> <kbd>I</kbd> | Italic. |
| <kbd>⇧</kbd> <kbd>⌘</kbd> <kbd>8</kbd> | Bulleted list. |
| <kbd>⇧</kbd> <kbd>⌘</kbd> <kbd>7</kbd> | Numbered list. |
| `- ` or `* ` at the start of a line | Start a bulleted list. |
| `1. ` at the start of a line | Start a numbered list. |
| `**text**` | Make the text bold. |
| `*text*` | Make the text italic. |
| <kbd>Esc</kbd> | Close the **Improve selected line** panel. |
In fields that collect keywords, press <kbd>Enter</kbd> or <kbd>,</kbd> to add the keyword you typed.
## Assistant
| Shortcut | What it does |
| --- | --- |
| <kbd>Enter</kbd> | Send your message. |
| <kbd>⇧</kbd> <kbd>Enter</kbd> | Start a new line in your message. |
| <kbd>Esc</kbd> | Stop the assistant while it's replying. |
## Proposed edits
When the assistant or Check proposes edits, select an edit in the list to focus it, then:
| Shortcut | What it does |
| --- | --- |
| <kbd>↑</kbd> / <kbd>↓</kbd> | Move to the previous or next edit. |
| <kbd>A</kbd> | Accept the focused edit. |
| <kbd>R</kbd> | Reject the focused edit. |
## Related guides
- [Using the command bar](/guides/using-the-command-bar): search, jump anywhere and ask the assistant from one box.
- [Editor overview](/guides/editor-overview): the editor bar and the three modes these shortcuts switch between.
- [Undoing changes and version history](/guides/undoing-changes-and-version-history): undo, redo and restoring
earlier versions.
+34 -24
View File
@@ -1,27 +1,30 @@
---
title: "Large RPC requests"
description: "Reference for the staged-body protocol that lets RPC requests larger than the hosting request-body limit reach Reactive Resume on Vercel."
description: "Reference for the staged-body protocol that lets RPC requests larger than Vercel's 4.5 MB request limit reach a Reactive Resume installation."
---
Vercel limits Function request bodies to 4.5 MB. On Vercel installations, RPC requests larger than that are uploaded to private Blob staging first. The server then restores the original request and runs it with the normal authorization, validation, and quota checks.
Vercel limits the request body of a Function to 4.5 MB. On a Reactive Resume installation hosted on Vercel, larger RPC requests, such as big file uploads or assistant attachments, are first uploaded to private Blob storage. The server then restores the original request and runs it with the usual authentication, validation and limits.
The web app uses this protocol automatically for request bodies of 3 MiB or more. Docker installations do not need it.
The web app does this for you: it stages any RPC request body of 3 MiB or more, and sends smaller bodies directly. You only need this page if you write your own client for `/api/rpc` against a Vercel installation.
## Scope
| Item | Value |
| --- | --- |
| Applies to | `POST /api/rpc/...` only |
| Does not apply to | REST (`/api/openapi`) and MCP. Their bodies stay subject to the 4.5 MB limit. |
| Does not apply to | The REST API (`/api/openapi`) and MCP (`/mcp`). Their bodies stay subject to the 4.5 MB limit on Vercel. |
| Available on | Installations running on Vercel with Blob storage (`STORAGE_BACKEND=blob`, the default there). Everywhere else the prepare step returns `404` and you send the request directly. Staging also needs Redis; without it the prepare step returns `503`. |
| Maximum staged size | 160 MiB of serialized request bytes, including base64 and RPC framing |
| Reference lifetime | Upload URL: 5 minutes. Staging reference: 10 minutes. |
| Use count | One. A reference is consumed when a finalization request passes the user and path checks, whether the RPC call then succeeds or fails. |
| Rate limit | 30 staging requests per user per minute |
| Lifetimes | Upload URL: 5 minutes. Staging reference: 10 minutes. |
| Use count | One. The reference is used up as soon as a finalize request passes the user and path checks, whether the RPC call then succeeds or fails. |
| Rate limit | 30 prepare requests per user per minute |
## Protocol
### 1. Prepare
Tell the server what you are about to send.
```http
POST /api/storage/stage
Content-Type: application/json
@@ -33,10 +36,10 @@ x-api-key: YOUR_API_KEY
| Field | Type | Description |
| --- | --- | --- |
| `path` | string | Pathname and query string of the original RPC request. Must start with `/api/rpc`. |
| `contentType` | string | `Content-Type` header of the original request, including any multipart boundary. |
| `size` | integer | Exact byte length of the serialized original body. |
| `contentType` | string | The original request's `Content-Type` header, including any multipart boundary. |
| `size` | integer | Exact byte length of the serialized original body. At most 167,772,160 (160 MiB). |
Authenticate with a session cookie, an `x-api-key` header, or an OAuth bearer token. Browsers must send an `Origin` header that matches the application origin.
Authenticate with an `x-api-key` header, an OAuth bearer token or a session cookie. If the request carries an `Origin` header, it must match the installation's own origin.
Response `200`:
@@ -44,10 +47,12 @@ Response `200`:
{ "id": "3f2b9c1e-6a0d-4a57-9d0a-3c1f7b8e2d44", "url": "https://..." }
```
The endpoint returns `404` when the installation does not support staging, for example on Docker. Send the original request unchanged in that case.
If you get `404`, the installation doesn't stage bodies (for example, it runs in Docker). Send the original request unchanged, and skip staging for later requests too.
### 2. Upload
Upload the exact body bytes to the URL from step 1.
```http
PUT <url from step 1>
Content-Type: application/octet-stream
@@ -55,11 +60,11 @@ Content-Type: application/octet-stream
<exact serialized body bytes>
```
Do not send application credentials to this URL. The body must be exactly `size` bytes.
Don't send your Reactive Resume credentials to this URL. The body must be exactly `size` bytes, sent as `application/octet-stream`.
### 3. Finalize
Send the original request with an empty body and the staging reference header:
Send the original request with an empty body and the staging reference in the `x-resume-staged-body` header:
```http
POST /api/rpc/storage/uploadFile
@@ -67,21 +72,26 @@ x-api-key: YOUR_API_KEY
x-resume-staged-body: 3f2b9c1e-6a0d-4a57-9d0a-3c1f7b8e2d44
```
Use the same `path` and the same user as in step 1. The server replaces the body with the staged bytes, sets `Content-Type` to the stored `contentType`, and returns the normal RPC response.
Use the same `path` (including the query string) and the same user as in step 1. The server replaces the body with the staged bytes, sets `Content-Type` to the stored `contentType`, deletes the staged object and returns the normal RPC response.
## Errors
| Status | Step | Cause |
| --- | --- | --- |
| `400` | Prepare | Invalid JSON, `path` outside `/api/rpc`, or `size` above the maximum. |
| `400` | Finalize | Malformed reference, non-`POST` request, or staged object missing. |
| `401` | Prepare, finalize | Not authenticated, or `Origin` does not match. |
| `403` | Finalize | Reference belongs to another user or another path. |
| `404` | Prepare | Staging not available on this installation. |
| `409` | Finalize | Reference used by a parallel request. |
| `410` | Finalize | Reference expired or already used. |
| `413` | Finalize | Uploaded byte count differs from `size`. |
| `400` | Prepare | Invalid JSON, a `path` outside `/api/rpc` or on another origin, or `size` above the maximum. |
| `400` | Finalize | Malformed reference, a method other than `POST`, staging not available on this installation, or the staged object is missing. |
| `401` | Prepare, finalize | Not authenticated, or the `Origin` header doesn't match. |
| `403` | Finalize | The reference belongs to another user or another path. |
| `404` | Prepare | Staging isn't available on this installation. |
| `409` | Finalize | A parallel request already used the reference. |
| `410` | Finalize | The reference expired or was already used. |
| `413` | Finalize | The uploaded byte count differs from `size`. |
| `429` | Prepare | Rate limit exceeded. |
| `503` | Prepare | Redis unavailable. |
| `503` | Prepare | Redis isn't available. |
A reference cannot be retried. If a finalization response is lost, check the result of the mutation before you stage and send it again.
A reference can't be retried. If a finalize response is lost, check whether the change was saved before you stage and send the request again.
## Related pages
- [Using the API](/guides/using-the-api): the REST API, which most integrations should use.
- [Deploying to Vercel](/self-hosting/vercel): hosting requirements, including Blob storage and Redis.
+37 -26
View File
@@ -1,37 +1,48 @@
---
title: "Linking social accounts"
description: "Connect or disconnect social sign-in providers like Google and GitHub to your Reactive Resume account so you can sign in without a password."
description: "Connect Google, GitHub or LinkedIn to your Reactive Resume account so you can sign in with them, and disconnect a provider you no longer use."
---
Linking a social account lets you sign in with one click instead of typing a password. You can link several providers to the same account and disconnect them at any time.
## Before you start
Social sign-in only works when the site has set it up. On [rxresu.me](https://rxresu.me) the available providers appear in **Settings → Account**. On a self-hosted copy you may see none, some, or a provider named after your organization's sign-in service. If a provider isn't listed, it isn't available on that site.
## Connect a provider
<Steps>
<Step title="Sign in to the dashboard">
Head over to [https://rxresu.me](https://rxresu.me) and sign in with your account credentials.
<Step title="Open Sign-in & security">
Select your name at the bottom of the sidebar, then **Settings**. On the **Account** page, scroll to **Sign-in & security**.
</Step>
<Step title="Navigate to Authentication settings">
Open <Badge>Settings</Badge> from your avatar and choose <Badge>Account</Badge>. Everything about signing in is under **Sign-in & security**.
</Step>
<Step title="Find the social provider you want to link">
On the Authentication page, you may see sections for one or more providers (for example, <Badge>Google</Badge> or{" "}
<Badge>GitHub</Badge>), depending on what is enabled on your instance.
</Step>
<Step title="Connect your account">
Click the <Badge>Connect</Badge> button for the provider you want to link. You'll be redirected to the provider to authorize access, then returned to the Authentication settings page.
<Info>
After a successful link, the button will change to <Badge>Disconnect</Badge>.
</Info>
<Step title="Select Connect">
Each available provider has its own row, such as **Google**, **GitHub** or **LinkedIn**. Select **Connect** next to the one you want.
</Step>
<Step title="Disconnect a provider (optional)">
To unlink a provider, click <Badge>Disconnect</Badge> next to the connected account.
<Warning>
Before disconnecting, make sure you still have another way to sign in (for example, a password or another linked provider) so you don't get locked out.
</Warning>
<Step title="Approve the request">
Sign in to the provider if asked, and allow access. You return to **Settings → Account**, and the row now reads **Connected**.
</Step>
</Steps>
<Frame caption="Provider rows in Sign-in & security. Only providers the site has set up are listed.">
<img src="/images/guides/linking-social-accounts/sign-in-and-security-providers.webp" alt="The Sign-in and security section with Password, Two-step verification and Passkeys rows, followed by Google marked Not connected with a Connect button, GitHub marked Connected with a Disconnect button, and LinkedIn marked Not connected with a Connect button" />
</Frame>
From now on, select that provider's button on the sign-in page to get in.
<Tip>
If you sign in with Google, GitHub or LinkedIn using the same email address as your existing account, Reactive Resume links the provider to that account for you.
</Tip>
## Disconnect a provider
In **Sign-in & security**, select **Disconnect** next to a connected provider. You can no longer sign in with it, but your account and documents stay as they are.
You can't disconnect your last sign-in method. If you signed up with a social account and have only one provider, [set a password](/guides/updating-your-profile#change-your-password) or connect another provider first. A passkey doesn't count here.
## Related guides
- [Signing in](/guides/signing-in): all the ways to get into your account.
- [Setting up passkeys](/guides/setting-up-passkeys): sign in with your fingerprint, face or device PIN.
- [Single sign-on for self-hosters](/self-hosting/sso): how the site owner turns providers on.
+141
View File
@@ -0,0 +1,141 @@
---
title: "Managing an application"
description: "Use an application's details sheet to change its stage, plan the next step, see what you sent, keep notes and contacts, and close or delete it."
---
Everything about one application lives in its details sheet. Select an application in the List, Board or Calendar view to open it. The sheet slides in from the right (on a phone, it fills the screen).
<Frame caption="An application's details sheet">
<img src="/images/guides/managing-an-application/application-detail-sheet.webp" alt="Details sheet for Senior Gameplay Programmer at Northwind Games, showing the stage stepper, Next step, What you sent, salary, source, applied date, contact, tags, notes, and the Close application… and Prepare for next step buttons" />
</Frame>
At the top you see the role, the company and location, and **View posting** when a posting was saved. **View posting** shows the saved posting text and what the job asks for, or opens the job link if only a link was saved.
## Moving to another stage
The row of bars under the title is the stage stepper: **Saved**, **Applied**, **Screening**, **Interview** and **Offer**. Below it you see the current stage and how long the application has been there.
- To move one stage forward, select **Move to *next stage*** (for example **Move to Offer**).
- To jump to any stage, forwards or back, select its name in the stepper.
<Frame caption="The stage stepper and Move to button">
<img src="/images/guides/managing-an-application/detail-sheet-stage-stepper.webp" alt="Header of the details sheet with the stage stepper filled up to Interview, the text Interview for 8 days, and a Move to Offer button" />
</Frame>
Each move is added to the activity history with today's date. You can change that date later (see [Keeping notes and history](#keeping-notes-and-history)).
## Planning the next step
**Next step** shows what this application needs now. Reactive Resume works it out in this order:
1. The next interview that hasn't finished yet.
2. Otherwise, the follow-up you set.
3. Otherwise, for **Applied**, how long ago you applied, turning into "No reply in *n* days" after 10 days; for later stages, how long you've been waiting to hear back.
A **Saved** application shows "Not applied yet", and a closed one shows its reason. Overdue follow-ups and long waits are highlighted in amber.
<Frame caption="Next step showing an upcoming interview">
<img src="/images/guides/managing-an-application/detail-sheet-next-step.webp" alt="Next step card showing a Technical interview on Fri, Oct 2 at 4:00 PM with a video link, an Edit button and Add to calendar" />
</Frame>
Select **Edit** to **Schedule an interview…**, **Edit this interview…**, or **Set a follow-up…** (**Change the follow-up…** when one is set). When the next step has a date, **Add to calendar** downloads it as an `.ics` file. See [Scheduling interviews](/guides/scheduling-interviews).
## Seeing what you sent
**What you sent** shows the resume and cover letter linked to this application.
- Before the application reaches **Applied**, a linked document reads "Linked · not sent yet".
- Once it reaches **Applied** or later, Reactive Resume saves the version you sent. The row then reads "Version sent *date*", plus the resume's Check score at that moment.
- **Open** opens that sent version, read-only, in the document's history. Select **Back to now** there to return to the latest version.
<Frame caption="What you sent, with a linked resume">
<img src="/images/guides/managing-an-application/detail-sheet-what-you-sent.webp" alt="What you sent section with Game Developer Resume — Northwind Games, Version sent Sep 8 · Check 86, an Open button, a Write a letter button and the Attach a file instead link" />
</Frame>
If nothing is linked yet, **Tailor a resume** and **Write a letter** create one for this job. See [Tailoring a resume for a job](/guides/tailoring-a-resume-for-a-job). To link a resume you already have, open **⋯** > **Edit details…** and pick it under **Resume**.
### Attaching a PDF instead
If you sent a file made elsewhere, select **Attach a file instead**, then **Attach a resume file (PDF)** or **Attach a cover letter file (PDF)**. Only PDF files are accepted. Select the file name to open it, or **×** to remove it.
<Frame caption="Attaching PDF files">
<img src="/images/guides/managing-an-application/what-you-sent-attach-files.webp" alt="What you sent section with Tailor a resume and Write a letter buttons above two dashed fields: Attach a resume file (PDF) and Attach a cover letter file (PDF)" />
</Frame>
## Editing the key facts
Below **What you sent** are four facts:
- **Salary** and **Source**: select the value to edit it in place. Press <kbd>Enter</kbd> or select elsewhere to save, or <kbd>Esc</kbd> to cancel.
- **Applied**: the date you applied (a dash for **Saved** applications).
- **Contact**: the first contact's name, with "and *n* more" when there are others.
### Contacts
Select the **Contact** value to see every contact. Select **Add contact**, then enter a **Name** and, if you like, a role, a label (such as Recruiter, Hiring manager, Referral or Interviewer), an email and a phone number. Emails and phone numbers become links you can select. Select **×** next to a contact to remove it.
<Frame caption="The contacts list">
<img src="/images/guides/managing-an-application/detail-sheet-contacts.webp" alt="Contacts popover listing Priya Shah, Recruiter, Talent Partner with an email link, and Marcus Lee, Hiring manager, Lead Gameplay Engineer, with an Add contact button" />
</Frame>
### Tags
Type in **Add a tag** and press <kbd>Enter</kbd> to add a tag. Select **×** on a tag to remove it. Tags are searchable from the Applications page.
## Keeping notes and history
**Notes** is a free-form space for anything to remember about the job. It saves automatically a moment after you stop typing, and also when you close the sheet.
**Activity** is the dated history of the application: stage changes, notes and interviews, newest first.
- To add a dated note, type in **Add a note…** and select **Add**.
- To change an entry, hover over it, open its **⋯** menu and select **Edit…** (for a note, you can change the text and the date; for a stage change, the date). For an interview, the menu has **Edit interview…** instead, or select the interview itself.
- To remove an entry, select **Delete…** in the same menu and confirm. The entry that marks when the application entered its current stage can't be deleted.
<Frame caption="Tags, notes and activity">
<img src="/images/guides/managing-an-application/detail-sheet-notes-and-activity.webp" alt="Tags, Notes and Activity sections of the details sheet, with an Add a note field and a history of interviews, stage changes and a note, above the Close application… and Prepare for next step buttons" />
</Frame>
Dates matter: Insights uses stage dates to work out how quickly people reply. If you add an application after the fact, adjust the dates so they match what happened.
## Editing all details
Open **⋯** at the top of the sheet and select **Edit details…** to edit everything in one form: **Company**, **Role / title**, **Location**, **Salary range**, **Source**, **Stage**, **Job posting link**, the linked **Resume** or an uploaded resume PDF, a **Cover letter** PDF, **Tags**, **Follow-up date**, **Follow-up note** and **Notes**. Select **Save changes** when you're done.
If you've [connected an AI provider](/guides/using-ai), the form also has a **Job description** section at the top. Select it to expand it, then paste the full posting there and Reactive Resume fills in the company, role, location and salary; select **Fill fields** to run it again.
<Frame caption="The Edit application form">
<img src="/images/guides/managing-an-application/edit-application-sheet.webp" alt="Edit application sheet with a Job description section, Company, Role / title, Location, Salary range, Source, Stage, Job posting link, Resume with Game Developer Resume linked, Cover letter and Tags fields" />
</Frame>
## Closing an application
When an application ends, close it rather than deleting it, so its history still counts in Insights.
<Steps>
<Step title="Select Close application…">
It's at the bottom of the details sheet.
</Step>
<Step title="Choose a reason">
Pick **Not selected**, **I withdrew**, **Accepted another offer** or **No response**.
</Step>
<Step title="Confirm">
Select **Close application**. Linked documents aren't changed.
</Step>
</Steps>
<Frame caption="Choosing why the application closed">
<img src="/images/guides/managing-an-application/close-this-application-dialog.webp" alt="Close this application dialog with the reasons Not selected, I withdrew, Accepted another offer and No response, and Cancel and Close application buttons" />
</Frame>
You can also close applications from a board card's **⋯** menu, or several at once from the List view. To bring a closed application back, turn on **Show closed**, open it and select **Reopen**. It returns to **Applied**.
## Deleting an application
Open **⋯** at the top of the sheet, select **Delete…** and confirm. The application, its history and any PDF files you attached to it are deleted permanently; there is no Trash for applications. Your resumes and letters are not deleted.
## Related guides
- [Scheduling interviews](/guides/scheduling-interviews): add interviews and follow-ups, and put them in your calendar.
- [Tailoring a resume for a job](/guides/tailoring-a-resume-for-a-job): tailor a resume, write a letter, and prepare for the next step.
- [Undoing changes and version history](/guides/undoing-changes-and-version-history): how sent versions appear in a document's history.
+108 -225
View File
@@ -1,298 +1,181 @@
---
title: "Managing applications with MCP"
description: "Use a connected MCP client to track job applications, attach sent PDFs, run Application Copilot, and manage your pipeline with natural-language prompts."
description: "Track job applications from an AI client connected to Reactive Resume: add roles, move stages, schedule interviews, attach sent PDFs and draft letters."
---
Use this guide when you want an AI client to manage the **Application Tracker** for you. After the Reactive Resume MCP server is connected, the agent can use tools for the same application workflows available in the app: listing applications, creating records, importing rows, updating stages, adding notes, managing follow-ups, attaching documents, and running Application Copilot.
Once your AI client is connected to the Reactive Resume MCP server, you can run your job search from a chat: add roles you find, move applications through their stages, log notes and interviews, attach the PDFs you sent, and ask for match scores or tailored resumes. This guide gives you prompts that work well and explains what each one does behind the scenes.
## Prerequisites
## Before you start
<Steps>
<Step title="Connect the MCP server">
Follow [Using the MCP server](/guides/using-the-mcp-server) to connect your MCP client with OAuth or an API key.
</Step>
- Connect your client to the MCP server with OAuth or an API key. See [Using the MCP server](/guides/using-the-mcp-server).
- Ask the client to list its Reactive Resume tools. You should see `list_applications`, `create_application`, `update_application` and the other application tools.
- For match scores, tailored resumes, drafted letters and job-posting autofill, set up and test a default AI provider in Reactive Resume. See [Connecting an AI provider](/guides/using-ai). These tools send your resume and the job description to that provider.
<Step title="Confirm the application tools are visible">
Ask your client to list the Reactive Resume tools. You should see tools such as `list_applications`, `create_application`, `update_application`, `attach_application_document`, and `draft_application_message`.
</Step>
## How applications are organized
<Step title="Decide how destructive actions should be handled">
Tell your agent to ask before deleting applications, bulk-updating many records, or replacing attached documents.
</Step>
</Steps>
Every application sits in one stage: `saved`, `applied`, `screening`, `interview`, `offer` or `closed`. Closing an application takes a reason: `not-selected`, `withdrew`, `accepted-other` or `no-response`. Each application also has a timeline of stage changes, notes and interviews, optional contacts, tags, a follow-up date, a linked resume and letter, and the resume and cover-letter PDFs you sent.
<Info>
Application Copilot tools require the same AI provider setup used by the app. Match scoring and resume tailoring work best when the application has a linked Reactive Resume and a job description.
</Info>
These are the same applications you see in the app's List, Board, Insights and Calendar views. See [Tracking job applications](/guides/tracking-job-applications).
## Start with a pipeline review
## Review your pipeline first
Have the agent inspect your current pipeline first. That gives it valid application IDs and avoids duplicate records.
Start each session by having the client read what's already there. That gives it valid IDs and stops it from creating duplicates.
```text
List my active applications grouped by stage. Include company, role, tags, follow-up date, linked resume name, and whether a resume or cover-letter PDF is attached.
```
Useful review prompts:
```text
Show me applications that need follow-up this week.
List my applications grouped by stage. For each one show company, role, tags, follow-up date and linked resume.
```
```text
Find applications tagged remote that are still in saved or applied stage.
Which applications have a follow-up date this week?
```
```text
Summarize my pipeline stats by stage and source, then point out stale applications.
Show my pipeline counts by stage and by source.
```
The client uses `list_applications` (which can filter by stage and tags), `read_application` and `get_application_stats`.
## Add applications
When you know the details, ask for the application directly. Only `company` and `role` are required.
```text
Add an application for Senior Gameplay Engineer at Northwind Games. Stage: saved. Location: Remote. Source: LinkedIn. Tags: unreal, senior. Link my Game Developer Resume.
```
If you have a job posting, paste it and ask the client to read it first. The autofill tool works on pasted text; it doesn't open links.
```text
Read this job posting with the Reactive Resume autofill tool, then save it as an application in the saved stage with the job description included.
[Paste the job posting here]
```
To bring in many rows at once, paste them and ask for an import. `import_applications` takes up to 500 rows per call.
```text
Import these rows as applications. Map "Rejected" to the closed stage with the reason not-selected. Skip rows without a company or role and tell me which you skipped.
Company,Role,Stage,Location,Source
Northwind Games,Gameplay Engineer,applied,Remote,LinkedIn
Blue Harbor Studio,Technical Designer,interview,Seattle,Referral
```
For spreadsheets you can also import a CSV file in the app. See [Importing applications from CSV](/guides/importing-applications-from-csv).
## Move stages and add notes
```text
Move my Northwind Games application to screening and add a note: recruiter call went well, next step is a technical interview.
```
```text
List archived applications from the last 90 days.
```
## Create applications
Use `create_application` when you already know the role details.
```text
Create an application for Senior Product Engineer at Acme. Stage: saved. Location: Berlin or remote. Source: LinkedIn. Tags: remote, typescript, senior. Add a note that I want to tailor my platform resume before applying.
```
If you have a job posting, ask the agent to extract details first.
```text
Use the Reactive Resume application auto-fill tool on this job posting URL, then create a saved application from the extracted company, role, location, salary, and job description. Tag it with remote and backend.
```
If the posting is private, paste the description into your prompt:
```text
Create an application from this pasted job description. Use auto-fill if available, keep the stage as saved, and tag it with ai, platform, and high-priority.
[Paste the job description here]
```
## Import applications
Use `import_applications` when you already have spreadsheet rows. The Application Tracker accepts up to 500 imported rows at a time.
```text
Import these application rows into Reactive Resume. Normalize the stages to saved, applied, screening, interview, offer, or rejected. Skip rows that do not have both a company and role, and tell me what was skipped.
Company,Role,Stage,Location,Source,Tags
Acme,Frontend Engineer,applied,Remote,LinkedIn,remote;react
Globex,Staff Engineer,interview,Berlin,Referral,staff;platform
Close the Blue Harbor Studio application with the reason withdrew.
```
```text
I am pasting rows from my spreadsheet. Import them, tag every imported application with migrated-2026, and leave archived as false.
Add the recruiter Priya Shah (priya@example.com) as a contact on the Northwind Games application.
```
```text
Import these rejected applications and mark them as archived after import.
```
The client uses `update_application` for stages, contacts, tags and follow-up dates, and `add_application_note` for notes. When `update_application` changes a list such as contacts or tags, the list it sends replaces the old one, so a careful client reads the application first and sends the full list.
## Update stages and notes
Use `update_application` for structured changes and `add_application_note` when you want an activity timeline entry without changing other fields.
```text
Move my Acme Senior Product Engineer application to interview and add a note: Recruiter screen scheduled for July 12 at 10:00.
```
```text
Add a note to the Globex application: Submitted take-home assignment and waiting for review.
```
When an application with a linked resume reaches **Applied** or a later stage, Reactive Resume saves that resume, and the linked letter, as a sent version named after the company. You can see later exactly what you sent.
## Schedule interviews
Use `add_application_interview` to put an interview on an application. Each interview has a type (screening, technical, behavioral, onsite, or other), a start date-time, a duration, and an optional location and notes. Interviews show on the application timeline and on the Calendar view of the Applications page, and an application can have any number of them. Use `update_application_interview` to reschedule and `delete_application_timeline_entry` to cancel.
```text
Schedule a 30-minute screening call with Acme for October 1 at 10:30 Eastern, on Zoom.
Schedule a 45-minute technical interview with Northwind Games on October 8 at 3 pm Pacific, on Google Meet.
```
```text
Move my Globex technical interview to the following Tuesday at 2 pm and make it 90 minutes.
Move the Northwind Games interview to October 9 at the same time.
```
```text
Set a follow-up date for the Stripe application to next Monday, with the note: Ask whether they need more portfolio examples.
Cancel the onsite interview with Blue Harbor Studio.
```
Interviews have a type (`screening`, `technical`, `behavioral`, `onsite` or `other`), a start time, a duration (60 minutes if you don't say), and an optional location and notes. They appear on the application's timeline and on the Applications calendar. The client uses `add_application_interview`, `update_application_interview` and, to cancel, `delete_application_timeline_entry`. See [Scheduling interviews](/guides/scheduling-interviews).
## Attach what you sent
```text
Attach this PDF as the resume I sent to Northwind Games.
```
```text
Update the contacts on the Acme application. Recruiter: Priya Shah, priya@example.com. Hiring manager: Jordan Lee, LinkedIn URL https://www.linkedin.com/in/example.
Remove the cover-letter PDF from the Blue Harbor Studio application.
```
```text
Archive every rejected application older than 30 days, but show me the list and ask for confirmation before applying the bulk update.
```
## Attach sent documents
Use document attachment when you want the tracker to store the exact resume PDF or cover-letter PDF you sent for an application.
```text
Attach this PDF as the sent resume for the Acme application, then confirm the application now has a resume document.
```
```text
Attach this cover letter PDF to the Globex Staff Engineer application.
```
```text
Replace the resume PDF on the Stripe application with this updated PDF. Add a note that I resent the revised resume.
```
```text
Remove the cover-letter PDF from the Acme application, but keep the application record and timeline.
```
<Info>
`attach_application_document` accepts base64-encoded PDF bytes and `contentType: "application/pdf"`. Some MCP clients hide that detail when they can read local files. If your client cannot read local files, upload the PDF from the web app instead.
</Info>
## Run Application Copilot
Application Copilot tools let an agent use the same AI workflows available in the application detail panel.
```text
Score the resume linked to my Acme application against the saved job description. Summarize the biggest match gaps and do not change my resume.
```
```text
Create a tailored resume copy for the Globex Staff Engineer application. Keep the original resume unchanged, link the tailored copy back to the application, and tell me the new resume name.
```
```text
Draft a cover letter for the Stripe application using the linked resume and job description. Keep it concise and specific to the role.
```
```text
Draft a follow-up email for the recruiter on the Acme application. Mention that I enjoyed the technical screen and ask about next steps. Do not mark the email as sent.
```
```text
Review all interview-stage applications with linked resumes. For each one, score the match and list the top three tailoring opportunities.
```
`attach_application_document` accepts one resume PDF and one cover-letter PDF per application, up to 10 MB each, sent as base64. Attaching a new file replaces the old one.
<Warning>
Review AI-generated resumes, cover letters, and messages before sending them. MCP tools can draft and save context, but you are responsible for the final content.
Anyone with the address of an attached PDF can download it without signing in. Attaching a file never sends it to an employer.
</Warning>
## Maintain your pipeline
If your client can't read files from your computer, attach the PDF in the app instead. See [Managing an application](/guides/managing-an-application).
Ask the agent to do periodic cleanup with explicit confirmation before broad changes.
## Use AI on an application
These tools need a tested default AI provider. Scoring and tailoring also need a job description and a linked resume on the application. Drafting uses them when they're there.
```text
Find applications that have not changed in 21 days. Group them by stage and recommend which ones need a follow-up, archive, or no action.
Score my linked resume against the Northwind Games job description and list the biggest gaps. Don't change anything.
```
```text
Add the tag needs-follow-up to every active application with a follow-up date before today. Show me the list before updating.
Make a tailored copy of my resume for the Northwind Games application.
```
```text
Move all applications tagged offer to offer stage, unless they are already archived.
Draft a cover letter for the Northwind Games application.
```
```text
Archive rejected applications older than 60 days. Ask for confirmation before making changes.
Draft a short follow-up to the recruiter at Northwind Games asking about next steps.
```
| Tool | What it changes |
| --- | --- |
| `score_application_match` | Saves a new match score on the application, replacing the previous one. |
| `tailor_resume_for_application` | Creates a private copy of the linked resume with a rewritten summary, links the copy to the application in place of the original and adds a timeline note. The original resume is unchanged. |
| `draft_application_message` | In cover-letter mode, saves a new cover letter and returns its text and ID. In follow-up mode, returns the text only. It never sends anything. |
| `autofill_application_from_job` | Returns suggested company, role, location and salary from a pasted posting. It saves nothing. |
Read anything the AI writes before you use it. You can also tailor resumes and write letters from the app; see [Tailoring a resume for a job](/guides/tailoring-a-resume-for-a-job).
## Clean up
```text
Find applications that haven't changed in three weeks and suggest which to follow up on and which to close. Don't change anything yet.
```
```text
Delete these duplicate application records after confirming which one has the most complete timeline and documents.
Add the tag follow-up to every application in the applied stage with a follow-up date before today. Show me the list first.
```
## Prompt library
`bulk_update_applications` moves up to 200 applications to a stage or adds tags to them. `delete_application` and `bulk_delete_applications` delete permanently, including uploaded PDFs that no other application uses; there is no Trash for applications.
Use these prompts as starting points. Replace company names, roles, tags, dates, and file references with your own details.
## Suggested client instructions
### Daily review
Add this to your client's project or session instructions so it handles your applications carefully:
```text
Give me a daily application tracker brief. Include applications needing follow-up today, interviews coming up, stale saved roles, and any applications missing a linked resume.
```
```text
Show my active applications in table form with company, role, stage, source, tags, follow-up date, and last updated time.
```
```text
Which applications are missing job descriptions, contacts, sent resume PDFs, or cover-letter PDFs?
```
### Research and capture
```text
Create a saved application from this job post. Extract company, role, location, salary, source URL, and job description. Add tags for the main technologies mentioned.
```
```text
I am considering this role but have not applied. Add it as saved, link my backend resume, and add a note with the three reasons it looks relevant.
```
```text
Add this recruiter contact to the matching application and note that they reached out on LinkedIn today.
```
### Applying
```text
Move the Acme application from saved to applied. Set applied date to today, attach the resume PDF I sent, and add a note with the application portal confirmation number.
```
```text
I just applied to three roles. Create applications for each one, tag them applied-today, and remind me to follow up in one week.
```
```text
Find the best resume to link to this application based on role title and tags. Ask me before updating the application.
```
### Interviews and follow-ups
```text
Move the Globex application to screening and add a recruiter screen contact with the recruiter's name and email.
```
```text
Add a note that the onsite interview is scheduled for July 18. Set the follow-up date to July 19.
```
```text
Draft a short follow-up after my interview. Use the application's company, role, recruiter contact, and timeline notes.
```
### Reporting
```text
Summarize my job search this month: number applied, interviews, offers, rejections, top sources, and response rate.
```
```text
Which sources are producing interviews? Compare LinkedIn, referrals, company sites, recruiters, and other sources.
```
```text
Show applications by stage and tell me where the pipeline is blocked.
```
## Suggested agent instruction
Add this to your MCP client's project or session instructions when you want the agent to manage applications safely:
```text
Use Reactive Resume MCP for application tracking. Start by calling list_applications before creating a new record so you do not duplicate existing applications. Confirm before delete_application, bulk_delete_applications, bulk_update_applications, replacing attached documents, or archiving more than five applications. Prefer add_application_note for timeline updates. Use Application Copilot tools only when the application has enough context, and never present AI-generated cover letters or follow-ups as sent messages.
Use Reactive Resume MCP for job applications. Call list_applications before creating an application so you don't duplicate one. Before update_application changes contacts or tags, read the application and send the complete list. Ask me before delete_application, bulk_delete_applications, bulk_update_applications, or replacing an attached document. Score or tailor only when the application has a job description, and never describe a drafted letter or follow-up as sent.
```
## Troubleshooting
| Issue | What to do |
| Problem | What to do |
| --- | --- |
| The agent cannot see application tools | Reconnect the MCP server and ask the client to refresh tool discovery. Confirm you are connected to Reactive Resume v5.2.2 or later. |
| The agent creates duplicates | Ask it to run `list_applications` first and match by company, role, and source URL before creating records. |
| Document attachment fails | Attach only PDFs. If your MCP client cannot read local files, upload the document from the web app. |
| Match scoring or tailoring fails | Link a Reactive Resume to the application and add a job description. Confirm your AI provider is configured. |
| A bulk action changed too much | Use the application list and timeline to inspect what changed. For future sessions, require confirmation before bulk actions. |
| The client can't see application tools | Reconnect the server and ask the client to refresh its tools. |
| The client creates duplicates | Ask it to list applications first and match on company and role before creating one. |
| A stage change to `rejected` or an archive request fails | Those no longer exist. Use the `closed` stage with a reason. |
| Attaching a document fails | Only PDFs up to 10 MB are accepted. Attach from the app if your client can't read the file. |
| Scoring, tailoring or drafting fails | Check that a default AI provider is set up and tested. For scoring and tailoring, also check that the application has a job description and a linked resume. |
## Related guides
- [Using the MCP server](/guides/using-the-mcp-server): connecting a client, and the full tool list.
- [Tracking job applications](/guides/tracking-job-applications): the Applications views in the app.
- [Managing an application](/guides/managing-an-application): the application detail sheet.
+139
View File
@@ -0,0 +1,139 @@
---
title: "Managing your documents"
description: "Find, sort, rename, duplicate, lock and remove your resumes and cover letters from the Documents page in Reactive Resume."
---
**Documents** is the page you see after signing in. It holds every resume and cover letter in your account, so you can keep one version per role, company or language and find the right one fast.
<Frame caption="Documents in grid view">
<img src="/images/guides/managing-documents/documents-grid.webp" alt="The Documents page with All, Resumes and Letters tabs, a search field, a sort menu, grid and list buttons, tag chips, and four document cards" />
</Frame>
Each card shows the document's first page, its name, its type and when you last edited it. A card made on this device that you haven't opened yet has a **New** badge, and a locked document shows a lock icon. If a document is linked to a job application, the company name appears under it.
## Open a document
Select a card (or a name in list view) to open it. Resumes open in the resume editor and cover letters in the letter editor. You can also open the card's **⋯** menu and choose **Open**.
## Find a document
Use the controls above your documents:
<Frame caption="Type tabs, search, sort and view">
<img src="/images/guides/managing-documents/documents-toolbar.webp" alt="The Documents toolbar with All 4, Resumes 3 and Letters 1 tabs, a Search field showing the slash shortcut, a Last edited sort menu, grid and list buttons, and tag chips below" />
</Frame>
- **All**, **Resumes** and **Letters** show one type at a time. Each tab shows how many documents it holds.
- **Search** matches document names, tags, and the company or role of a linked application. Press <kbd>/</kbd> anywhere on the page to jump to it.
- The sort menu orders documents by **Last edited** (the default), **Name** or **Created**.
- Tag chips appear once any document has a tag. See [Organizing documents with tags](/guides/organizing-with-tags).
If nothing matches, select **Clear search and filters** to see everything again.
<Tip>
The page address keeps your tab, search, tags and sort, so you can bookmark a filtered view. To search across documents and applications from anywhere in the app, use the [command bar](/guides/using-the-command-bar).
</Tip>
## Switch between grid and list
Use the two buttons at the right of the toolbar. The grid shows page previews. The list is denser, with **Name**, **Type**, **Application** and **Edited** columns. Reactive Resume remembers your choice on this device.
<Frame caption="Documents in list view">
<img src="/images/guides/managing-documents/documents-list-view.webp" alt="Documents in list view with columns for Name, Type, Application and Edited, and a menu button at the end of each row" />
</Frame>
## Use the document menu
Every card and row has a **⋯** menu. You can also right-click a card or row (or press and hold on a touch screen) to open the same menu.
<Frame caption="The ⋯ menu for a resume">
<img src="/images/guides/managing-documents/document-options-menu.webp" alt="The options menu for Game Developer Resume with Open, Rename, Duplicate, Copy for a job, Tags, Lock editing and Move to Trash" />
</Frame>
| Item | What it does |
| --- | --- |
| **Open** | Opens the document in its editor. |
| **Rename** | Lets you edit the name in place. |
| **Duplicate** | Makes a copy named "… (copy)" with the same tags. |
| **Copy for a job…** | Resumes only. Makes a copy linked to a job application. |
| **Link to application…** | Letters only. Links the letter to one of your open applications, or unlinks it. |
| **Tags…** | Adds or removes tags. |
| **Lock editing** / **Unlock** | Protects the document from changes, or allows them again. |
| **Move to Trash** | Moves the document to Trash, where you can restore it for 30 days. |
## Rename a document
<Steps>
<Step title="Choose Rename">
Open the document's **⋯** menu and choose **Rename**. The name turns into a text field with the current name selected.
<Frame caption="Renaming a document in place">
<img src="/images/guides/managing-documents/rename-inline.webp" alt="A document card with its name field in edit mode showing Unity Developer Resume" />
</Frame>
</Step>
<Step title="Type the new name">
Names can be up to 100 characters.
</Step>
<Step title="Save or cancel">
Press <kbd>Enter</kbd> or click elsewhere to save. Press <kbd>Esc</kbd> to keep the old name.
</Step>
</Steps>
A new blank resume takes its name from its headline until you rename it. After you rename it, the name stays as you typed it.
## Duplicate a document
Choose **Duplicate** to make a separate copy. The copy is named "*name* (copy)" and keeps the original's tags. The copy appears at the top of the list with a **New** badge. Editing the copy never changes the original.
Duplicating is useful when you want a short and a long version, a version in another language, or a safe place to try a new template.
## Copy a resume for a job
**Copy for a job…** opens the **Copy a resume for a job** dialog with that resume selected under **Start from**. Pick an application under **For which job?** (or **No job yet**), check the suggested **Name**, and select **Create and open**.
<Frame caption="Copy a resume for a job">
<img src="/images/guides/managing-documents/copy-for-a-job.webp" alt="The Copy a resume for a job dialog with a list of resumes to start from, a No job yet chip, a Name field and a Create and open button" />
</Frame>
When you pick an application, the copy is linked to it, Check and the Assistant use that job's posting, and the copy opens with the Assistant ready to tailor it. For the full workflow, see [Tailoring a resume for a job](/guides/tailoring-a-resume-for-a-job).
## Lock a document
Choose **Lock editing** to protect a document you've already sent, so it can't change by accident. While a document is locked:
- its card shows a lock icon;
- **Rename**, **Tags…**, **Link to application…** and **Move to Trash** are unavailable;
- the editor shows it read-only. In the resume editor a note reads "Locked. Unlock to edit." with an **Unlock** button.
You can still open, duplicate and download it. Choose **Unlock** in the same menu to edit it again.
<Frame caption="A locked resume and its menu">
<img src="/images/guides/managing-documents/locked-document-menu.webp" alt="A resume card with a lock icon and its menu showing Rename, Tags and Move to Trash unavailable and an Unlock item" />
</Frame>
## Remove a document
Choose **Move to Trash**. The document leaves Documents right away and a message appears with **Undo**. Documents stay in Trash for 30 days before they're deleted for good. See [Using the Trash](/guides/using-the-trash).
## Create a new document
Select **New** in the sidebar, or press <kbd>N</kbd> anywhere outside a text field, to open the **New document** dialog.
<Frame caption="The New document dialog">
<img src="/images/guides/managing-documents/new-document-dialog.webp" alt="The New document dialog with Import a resume, Copy a resume for a job, Start blank, New cover letter instead and Try with a sample resume" />
</Frame>
- **Import a resume**: build a resume from a PDF, Word, JSON or LinkedIn file. See [Importing a resume](/guides/importing-resumes).
- **Copy a resume for a job**: copy one of your resumes, as described above.
- **Start blank**: create an empty resume and open it. See [Creating your first resume](/guides/creating-your-first-resume).
- **New cover letter instead**: create a letter. It takes your details and design from the resume you edited most recently. See [Writing a cover letter](/guides/writing-a-cover-letter).
- **Try with a sample resume**: create a filled-in example resume to explore.
You can also drop a file anywhere on the Documents page to import it.
## Related guides
- [Organizing documents with tags](/guides/organizing-with-tags): group documents and filter by tag.
- [Using the Trash](/guides/using-the-trash): restore a document or delete it for good.
- [Importing a resume](/guides/importing-resumes): bring in a resume you already have.
- [Sharing your resume publicly](/guides/sharing-your-resume-publicly): send a link instead of a file.
@@ -1,124 +0,0 @@
---
title: "Managing resumes from the dashboard"
description: "Search, sort, filter, open, duplicate, lock, update, and delete resumes from the Reactive Resume Resumes dashboard in grid or list view."
---
The **Resumes** dashboard is where you manage every resume in your account. Use it to keep separate versions for different roles, clients, locations, or application stages.
<Frame caption="Resumes dashboard in grid view">
<img
src="/images/guides/managing-resumes-from-the-dashboard/screenshot-1.webp"
alt="Resumes dashboard showing sort controls, grid view, create and import cards, and a sample resume"
/>
</Frame>
## Search your resumes
Once you have more than a few resumes, a **Search** field appears above the list. Type any part of a resume name to filter the dashboard in place.
You can also open the command palette from anywhere in the app with `Cmd/Ctrl+K`, or by clicking **Search** in the dashboard sidebar. From there you can jump to a resume, application, or agent thread by name, or run quick actions like **New Application** and **New Thread**. Select **Resumes**, **Applications**, or **Threads** to filter results to a single entity type.
## Choose a view
The dashboard supports two views:
- **Grid** shows each resume as a card. This is useful when you want a visual overview.
- **List** shows resumes in rows. This is useful when you have many resumes and want a denser view.
Use the **Grid** and **List** tabs in the top-right of the dashboard to switch between them.
<Frame caption="Resumes dashboard in list view">
<img
src="/images/guides/managing-resumes-from-the-dashboard/screenshot-2.webp"
alt="Resumes dashboard showing the same resume in list view"
/>
</Frame>
## Sort resumes
Use the **Sort by** menu to change the order of your resumes.
| Sort option | When to use it |
| --- | --- |
| **Last Updated** | Find the resume you worked on most recently. |
| **Created** | Review resumes by when they were first created. |
| **Name** | Keep resumes in alphabetical order. |
## Filter by tags
If you add tags to your resumes, the dashboard shows a **Filter by** menu. Select one or more tags to show only matching resumes.
Tags are useful for grouping resumes by:
- target role, such as `frontend` or `product`;
- application status, such as `draft` or `sent`;
- market, region, client, or company name.
<Tip>
You can add or change tags when creating, updating, or duplicating a resume.
</Tip>
## Open a resume
Click a resume card or row to open it in the builder.
You can also open the resume menu and choose **Open**.
<Info>
After you create or import a resume, Reactive Resume opens it directly in the builder instead of returning you to the
dashboard.
</Info>
## Update name, slug, and tags
Use **Update** when you want to change a resume's metadata.
<Steps>
<Step title="Open the resume menu">
On the dashboard, open the menu for the resume you want to edit.
</Step>
<Step title="Choose Update">
Select **Update** to open the resume details dialog.
</Step>
<Step title="Edit the fields">
Change the **Name**, **Slug**, or **Tags**.
</Step>
<Step title="Save changes">
Click **Save Changes**.
</Step>
</Steps>
<Warning>
The slug is part of the public URL. If a resume is public, changing the slug changes the link people use to view it.
</Warning>
## Duplicate a resume
Use **Duplicate** when you want to create a new version without changing the original.
The duplicate dialog starts with the same tags, a copied name, and a copied slug. Edit these before saving if you want the new version to be easier to identify.
Good reasons to duplicate a resume:
- tailoring one resume for a specific job posting;
- keeping a short and long version;
- testing a new template or layout;
- creating a localized version.
## Lock or unlock a resume
Use **Lock** to prevent accidental edits or deletion. A locked resume cannot be updated or deleted until you unlock it.
To edit a locked resume later, open the resume menu and choose **Unlock**.
## Delete a resume
Use **Delete** only when you no longer need the resume.
<Warning>
Deleting a resume cannot be undone. If you might need the content later, export a JSON backup first. See
[Exporting your resume](/guides/exporting-your-resume).
</Warning>
+127
View File
@@ -0,0 +1,127 @@
---
title: "Managing sections"
description: "Add, hide, rename, reorder and remove resume sections in Write mode, create custom sections, and control how each section prints."
---
A section is one block of your resume, such as Experience, Education or Skills. In **Write** mode you add the sections you need, put them in the order you want them printed, and choose how each one looks on the page. This guide covers everything you can do with a whole section. To work with the entries inside a section, see [Editing entries](/guides/editing-entries).
## Where your sections live
Open a resume and select **Write** in the editor bar. Below the Basics card is the **Sections · print order** list. It shows every section that has content, in the order it prints: page by page, and within each page the main column first, then the sidebar.
<Frame caption="The Sections · print order list with page and sidebar dividers">
<img src="/images/guides/managing-sections/outline-print-order.webp" alt="The Sections list in Write mode, showing Page 1 with Summary, Education and Experience, a Sidebar divider above Profiles and Skills, and Page 2 with Experience and Awards. Each row has a drag handle, an entry count, an eye icon, a chevron and a three-dot menu." />
</Frame>
Each row has, from left to right:
- A **drag handle** to reorder the section.
- The section **title**. Select it, or the chevron, to open the section and see its entries.
- The number of **entries** in the section.
- The **eye** icon, which hides or shows the section on the page.
- The **⋯** menu with the rest of the section's options.
Dividers mark where a new page starts (**Page 2**, **Page 3**) and, on templates with two columns, where the **Sidebar** begins. Built-in sections without any content aren't listed; they wait in **Add section** until you need them.
## Add a section
<Steps>
<Step title="Open Add section">
Scroll to the bottom of the sections list and select **Add section**. The menu lists every built-in section you aren't using yet.
On a brand-new blank resume you also see shortcuts for the sections most resumes have: **Experience**, **Education**, **Skills** and **Summary**. Select one to add it straight away.
<Frame caption="A blank resume suggests the most common sections">
<img src="/images/guides/managing-sections/start-suggestions.webp" alt="The empty sections list on a blank resume, with buttons for Experience, Education, Skills and Summary, an Import it link, and the Add section button below." />
</Frame>
</Step>
<Step title="Choose a section">
Select the section you want. It appears in its usual place in the layout (Skills, for example, goes in the sidebar on two-column templates) with one empty entry, already open and ready to type into. The Summary opens as a single text box instead.
</Step>
</Steps>
A new entry stays a **Draft** until you fill in its main field, such as the company for a job or the school for a degree. Drafts are saved but don't print. See [Editing entries](/guides/editing-entries) for the fields each section has.
## Create a custom section
Use a custom section when none of the built-in names fits, or when you want a second section of the same kind, such as "Earlier Experience" or "Teaching".
<Steps>
<Step title="Open the Custom section menu">
Select **Add section**, then **Custom section**. The menu asks **What goes in it?**
</Step>
<Step title="Pick the kind of entries">
Choose the type whose fields you want: Experience, Education, Projects, Skills, Languages, Interests, Awards, Certifications, Publications, Volunteer, References, Profiles, or Summary for a block of free text.
</Step>
<Step title="Rename it">
The new section is added at the end of your last page and takes the type's name. Open its **⋯** menu and select **Rename…** to give it your own title.
</Step>
</Steps>
<Frame caption="Add section, with the Custom section types open">
<img src="/images/guides/managing-sections/add-section-menu.webp" alt="The Add section menu listing built-in sections in two columns, and the Custom section submenu open beside it under the heading What goes in it?, listing thirteen section types." />
</Frame>
<Note>
Once every built-in section is in use, **Add section** lists the custom section types directly.
</Note>
## Hide or show a section
Select the **eye** icon on a section's row. A hidden section's title is struck through in the list and it disappears from the page, but its content stays in the resume. Hidden sections aren't printed, downloaded or shared. Select the eye again to bring the section back.
To hide a single entry instead of the whole section, use **Hide from page** in the entry's menu. See [Editing entries](/guides/editing-entries#hide-an-entry-from-the-page).
## Reorder sections
The list order is the print order, so moving a row moves the section on the page. You can:
- **Drag** a row by its handle.
- Select the section's title and press <kbd>⌥ Option</kbd> + <kbd>↑</kbd> or <kbd>↓</kbd> (<kbd>Alt</kbd> + <kbd>↑</kbd> or <kbd>↓</kbd> on Windows and Linux).
- Open the **⋯** menu and select **Move up** or **Move down**.
Moving a section past a divider moves it onto that page or column. For example, dragging a section below the **Sidebar** divider puts it in the sidebar. To change the columns, sidebar width or number of pages themselves, see [Arranging the layout](/guides/arranging-the-layout).
## Section options
Open a section's **⋯** menu to see everything else you can do with it.
<Frame caption="The ⋯ menu for the Skills section">
<img src="/images/guides/managing-sections/section-options-menu.webp" alt="The options menu for the Skills section, listing Add entry, Move up, Move down, Rename…, Icon…, Show heading (checked), Columns, Keyword layout, Keep on one page, Start on a new page and Clear section." />
</Frame>
| Option | What it does |
| --- | --- |
| **Add entry** | Adds an empty entry at the end of the section. Not shown for the built-in Summary. |
| **Sort by date** | Experience and Education only. Puts current entries first, then the rest from the most recent end date back. Entries without a start date, or whose end comes before the start, stay at the end, and a message names them. |
| **Move up** / **Move down** | Moves the section one place in the print order. |
| **Rename…** | Changes the title printed above the section. Leave the name empty to go back to the original title. |
| **Icon…** | Picks the icon shown next to the section title, on templates that show section icons. |
| **Show heading** | Clear it to print the section without its title. |
| **Columns** | Splits the section's entries into 1 to 6 columns. Skills also offers **1 column, inline**, which runs the skills together on one line. |
| **Keyword layout** | Skills only. Prints each skill's keywords **Inline** or as a **Bulleted list**. |
| **Keep on one page** | Stops the section from being split across two pages. |
| **Start on a new page** | Always starts the section at the top of a new page. |
| **Clear section** | Built-in sections: removes all entries (or the Summary text). |
| **Delete section** | Custom sections: removes the section and its entries. |
<Frame caption="Renaming a section">
<img src="/images/guides/managing-sections/rename-section-dialog.webp" alt="A dialog titled What do you want to rename this section to?, with the hint Leave empty to reset the title to the original, the name Earlier Experience typed in, and Cancel and Confirm buttons." />
</Frame>
## Remove a section
Open the section's **⋯** menu and select **Clear section** (built-in sections) or **Delete section** (custom sections). A message confirms the change with an **Undo** button, in case you didn't mean it. A cleared built-in section leaves the list and goes back into **Add section**, so you can add it again later.
<Tip>
If you only want a section off the page for now, hide it with the eye icon instead. Hiding keeps everything you wrote.
</Tip>
You can also undo any section change with <kbd>⌘</kbd> <kbd>Z</kbd> (<kbd>Ctrl</kbd> <kbd>Z</kbd> on Windows and Linux) while no text field is focused, or go back further from **History**. See [Undoing changes and version history](/guides/undoing-changes-and-version-history).
## Related guides
- [Editing entries](/guides/editing-entries): add, duplicate, move and hide the entries inside a section.
- [Entering dates](/guides/entering-dates): how dates are typed, checked and printed.
- [Arranging the layout](/guides/arranging-the-layout): columns, sidebar, pages, and moving sections between pages.
- [Fitting content on a page](/guides/fitting-content-on-a-page): what to do when your resume runs long.
@@ -1,142 +0,0 @@
---
title: "Moving items between sections"
description: "Move resume items between sections or across pages in the Reactive Resume builder to reorganize content and split lengthy sections cleanly."
---
If you have a long work history or a long list of projects, you may want to split items across multiple pages or reorganize them into different sections. The **Move to** feature relocates any item to another section or page.
## Why move items?
- Split long sections. If your Experience section spans more than one page, move older roles to a custom section on page 2.
- Reorganize content. Move a project from "Projects" to a custom "Open Source" section, or a skill to a different grouping.
- Control the page layout. Choose exactly which items appear on which page.
## How to move an item
<Steps>
<Step title="Open the resume builder">
Navigate to your resume and open it in the builder.
<Info>
Make sure you have at least one item in a section (e.g., an experience entry, project, or skill) before proceeding.
</Info>
</Step>
<Step title="Locate the item you want to move">
In the left sidebar, find the section containing the item you want to relocate. Click on the section to expand it and view all items.
<Frame caption="Screenshot of the left sidebar with an expanded section containing multiple items">
<img src="/images/guides/moving-items-between-sections/screenshot-1.webp" alt="Screenshot of the left sidebar with an expanded section containing multiple items" />
</Frame>
</Step>
<Step title="Open the item dropdown menu">
Each item has a **dropdown menu** (three-dot icon or chevron) on the right side. Click this icon to reveal the available actions.
<Frame caption="Screenshot of the dropdown menu icon on a section item">
<img src="/images/guides/moving-items-between-sections/screenshot-2.webp" alt="Screenshot of the dropdown menu icon on a section item" />
</Frame>
</Step>
<Step title="Hover over 'Move to'">
In the dropdown menu, hover over or click the <Badge>Move to</Badge> option. This will open a submenu showing all
available destinations.
</Step>
<Step title="Select a destination">
The submenu displays available destinations organized by:
- **Existing sections** of the same type (e.g., other Experience sections)
- **Pages** where you can place the item
- **Custom sections** if any exist
Click on your desired destination to move the item there.
<Frame caption="Screenshot of the 'Move to' submenu with destination options">
<img src="/images/guides/moving-items-between-sections/screenshot-3.webp" alt="Screenshot of the 'Move to' submenu with destination options" />
</Frame>
<Tip>
If a custom section of the same type doesn't exist on your target page, Reactive Resume creates one for you, so you can split a section across pages without setting it up first.
</Tip>
</Step>
<Step title="Verify the move">
After selecting a destination, the item will be moved immediately. You can verify by:
- Checking the destination section in the left sidebar
- Looking at the resume preview to see where the item now appears
<Frame caption="Screenshot of the item in its new location">
<img src="/images/guides/moving-items-between-sections/screenshot-4.webp" alt="Screenshot of the item in its new location" />
</Frame>
</Step>
</Steps>
## Example: splitting work experience across pages
A common case is a work history that is too long to fit on a single page.
<Steps>
<Step title="Identify items to move">
Review your Experience section and decide which roles should appear on page 1 (typically your most recent and relevant positions) and which can go on page 2.
</Step>
<Step title="Move older positions">
For each older position you want to relocate:
1. Open the item's dropdown menu
2. Click <Badge>Move to</Badge>
3. Select **Page 2** (or the appropriate page)
<Info>
If no Experience section exists on page 2, a new custom section will be created automatically with the same type, so your formatting stays consistent.
</Info>
</Step>
<Step title="Review the result">
Check the resume preview to ensure:
- Page 1 contains your most important, recent roles
- Page 2 continues with your earlier experience
- The section headings and styling remain consistent
</Step>
</Steps>
## Tips for organizing multi-page resumes
<Tip>
Keep chronological order within each page, and move complete job entries rather than splitting a single role across
pages.
</Tip>
<Tip>
After moving items to a new custom section, rename it (e.g., "Earlier Experience" or "Additional Projects") so
recruiters know what they are looking at.
</Tip>
<Warning>
Moving items reorganizes your content but doesn't change the data itself. You can always move items back, or to a
different section.
</Warning>
## Troubleshooting
### I don't see the "Move to" option
Make sure you're clicking the dropdown menu on a **section item** (like an individual job or project), not the section header itself. The Move to feature is only available for items within sections.
### The destination I want isn't listed
The Move to submenu shows destinations compatible with the item type. For example, an Experience item can only be moved to other Experience-type sections. If you need to change an item's type entirely, recreate it in the section you want.
### My custom section wasn't created
If you're moving to a page that already has a section of the same type, the item will be added to that existing section rather than creating a new one. This is by design to avoid duplicate sections.
+55
View File
@@ -0,0 +1,55 @@
---
title: "Organizing documents with tags"
description: "Add tags to your resumes and cover letters in Reactive Resume, then filter the Documents page by one or more tags to find the right version."
---
Tags are short labels you add to documents, such as the kind of role, the industry, or whether you've sent it. Once any document has a tag, Documents shows a row of tag chips you can use as filters.
## Add or remove tags
<Steps>
<Step title="Open the Tags dialog">
On Documents, open the document's **⋯** menu and choose **Tags…**.
</Step>
<Step title="Type a tag">
Type in the **Add a keyword...** field and press <kbd>Enter</kbd> or type a comma <kbd>,</kbd> to add it. Add as many as you like.
<Frame caption="The Tags dialog">
<img src="/images/guides/organizing-with-tags/tags-dialog.webp" alt="The Tags dialog with games and unity tags added and an empty Add a keyword field" />
</Frame>
</Step>
<Step title="Edit or remove a tag">
Select the pencil next to a tag to change it, or the **×** to remove it. You can drag tags to reorder them.
</Step>
<Step title="Save">
Select **Save**. Closing the dialog without saving discards your changes.
</Step>
</Steps>
Tags are unavailable while a document is locked. Unlock it first (see [Managing your documents](/guides/managing-documents#lock-a-document)).
<Tip>
Duplicating a resume, or copying it for a job, keeps its tags, so a family of versions stays grouped.
</Tip>
## Filter by tag
Select a chip above your documents, for example **#unity**, to show only documents with that tag. The chip turns green while it's active. Select more chips to narrow the list further: a document must have every selected tag to appear. Select an active chip again to turn it off.
<Frame caption="Documents filtered by one tag">
<img src="/images/guides/organizing-with-tags/tag-filter-active.webp" alt="The tag chips #games, #senior and #unity with #unity active, and a single matching resume card below" />
</Frame>
Tag filters work together with the **All**, **Resumes** and **Letters** tabs and with search. The search field also matches tag names, so typing a tag finds its documents too.
## Ideas for tags
- the kind of role: `frontend`, `product`, `teaching`;
- the stage: `draft`, `sent`;
- the market or language: `uk`, `german`;
- a version: `one-page`, `long`.
## Related guides
- [Managing your documents](/guides/managing-documents): search, sort, rename and duplicate.
- [Tracking job applications](/guides/tracking-job-applications): follow each application from saved to closed.
+122
View File
@@ -0,0 +1,122 @@
---
title: "Scheduling interviews"
description: "Add interviews and follow-up reminders to your applications, see them on the Calendar view, and add them to your own calendar with an .ics file."
---
Add each interview to its application so it shows as the application's next step, in its history and on the Calendar view. You can also set a follow-up reminder, and send any dated step to the calendar app you already use.
## Schedule an interview
You can start from the application or from the calendar.
<Tabs>
<Tab title="From an application">
<Steps>
<Step title="Open the application">
Select it in **Applications** to open its details.
</Step>
<Step title="Choose Schedule an interview…">
Under **Next step**, select **Edit**, then **Schedule an interview…**.
</Step>
</Steps>
<Frame caption="The Next step Edit menu">
<img src="/images/guides/scheduling-interviews/next-step-edit-menu.webp" alt="Next step card with the Edit menu open, listing Edit this interview…, Schedule an interview… and Set a follow-up…" />
</Frame>
</Tab>
<Tab title="From the calendar">
<Steps>
<Step title="Open the Calendar view">
In **Applications**, select the **Calendar** tab.
</Step>
<Step title="Start scheduling">
Select **Schedule interview**, or hover over a day and select **+** to start on that day.
</Step>
<Step title="Choose the application">
Under **Application**, pick the application the interview belongs to. Closed applications aren't listed.
</Step>
</Steps>
</Tab>
</Tabs>
Then fill in the interview:
<Steps>
<Step title="Pick the interview type">
Choose **Screening**, **Technical**, **Behavioral**, **Onsite** or **Other**. Each type has its own color on the calendar.
</Step>
<Step title="Set the date and time">
**Date & time** is required. It starts at 9:00 the next day, or on the day you picked in the calendar (the next full hour if that day is today), in your own time zone.
</Step>
<Step title="Set the duration">
Pick a **Duration** from 15 minutes to 4 hours. The default is 1 hour.
</Step>
<Step title="Add where and notes">
**Where** can be a video link, an office address or a phone number. Use **Notes** for who you're meeting and what to prepare.
</Step>
<Step title="Save">
Select **Schedule**.
</Step>
</Steps>
<Frame caption="The Schedule an interview dialog">
<img src="/images/guides/scheduling-interviews/schedule-an-interview-dialog.webp" alt="Schedule an interview dialog for Senior Gameplay Programmer at Northwind Games, with Behavioral selected as the interview type, a date and time, a 1 hr duration, Where set to a video call, notes, and Cancel and Schedule buttons" />
</Frame>
The interview appears in the application's **Activity**, on the calendar, and as the **Next step** until it has finished. Scheduling an interview doesn't change the application's stage, so move it to **Interview** yourself if you want to.
## Edit or delete an interview
Select the interview on the calendar, in **Upcoming interviews**, or in the application's **Activity** (or use **Edit** > **Edit this interview…** when it's the next step). Change what you need and select **Save changes**. To remove it, select **Delete** and confirm.
## Use the Calendar view
The **Calendar** tab shows one month of interviews across all your applications.
- Use the arrows to change month, and **This month** to come back to today.
- Each day shows up to three interviews, with the time and company. Select **+*n* more** to see the rest of a busy day.
- **Upcoming interviews**, on the right, lists every interview that hasn't finished yet, grouped by day. Select a card to edit the interview, or **View application** to open the application.
- The legend under the calendar shows the color of each interview type.
<Frame caption="The Calendar view with upcoming interviews">
<img src="/images/guides/scheduling-interviews/applications-calendar-view.webp" alt="Calendar view for September 2026 with interview chips on several days, the Schedule interview button, and an Upcoming interviews list with cards for Northwind Games, Brightline Studios and Redwood Arcade" />
</Frame>
The calendar follows the page's search and **Show closed** settings, so interviews for closed applications are hidden unless **Show closed** is on. The Calendar view isn't available on phones; use each application's **Next step** instead.
## Set a follow-up reminder
A follow-up is a reminder to check in, for example to email the recruiter a week after applying.
<Steps>
<Step title="Open Set a follow-up…">
In the application's details, under **Next step**, select **Edit**, then **Set a follow-up…** (or **Change the follow-up…**).
</Step>
<Step title="Pick a date and say what to do">
Choose a **Date** and, if you like, fill in **What to do**, such as "Email the recruiter". When you change an existing follow-up, the fields start empty, so enter the date and note again.
</Step>
<Step title="Save">
Select **Save**. To remove the reminder, select **Clear**.
</Step>
</Steps>
<Frame caption="The Follow-up dialog">
<img src="/images/guides/scheduling-interviews/follow-up-dialog.webp" alt="Follow-up dialog with Date set to 03.10.2026, What to do set to Email the recruiter, and Clear and Save buttons" />
</Frame>
The follow-up shows as the next step (unless an interview is coming up first) and turns amber once the date has passed. You can also set the follow-up date and note in **Edit details…**.
## Add a step to your calendar
When the next step is an interview or a follow-up, select **Add to calendar** under it. Reactive Resume downloads an `.ics` file named after the company and date. Open it to add the event to Apple Calendar, Google Calendar, Outlook or any other calendar app.
The event includes the type of step, the role and company, and the start and end time. Interviews also include where and your notes. Follow-ups are added as 30-minute events at 9:00 on the chosen day.
<Tip>
The `.ics` file is a one-time copy. If you change the interview in Reactive Resume later, download it again and update the event in your calendar.
</Tip>
## Related guides
- [Managing an application](/guides/managing-an-application): the rest of the details sheet.
- [Tailoring a resume for a job](/guides/tailoring-a-resume-for-a-job): use **Prepare for next step** to get ready for an interview.
+66 -135
View File
@@ -1,160 +1,91 @@
---
title: "Selecting the right page format"
description: "Compare the A4, Letter, and Free-Form page format options in Reactive Resume and pick the right size, margins, and orientation for your resume."
title: "Choosing paper size, margins and language"
description: "Set your resume to Letter, A4 or free-form, choose margins, set the language for section titles and dates, and toggle icons and link underlines."
---
Reactive Resume has three page formats: **A4**, **Letter**, and **Free-Form**. The format you pick changes how your resume is rendered and exported as a PDF.
The **Page** group in Design sets up the paper your resume is printed on: its size, its margins, the language of the words Reactive Resume adds for you, and whether contact details show icons and underlined links.
## Available formats
## Open the Page group
### A4
In the editor, select **Design** (or press <kbd>2</kbd>), then select **Page** in the row of links at the top of the panel.
A4 is the international standard paper size used in most countries outside North America. When you select A4, your resume pages conform to these dimensions:
<Frame caption="The Page group">
<img src="/images/guides/selecting-page-format/page-group.webp" alt="The Page group with Paper set to A4 (the other option is Letter), Language set to English with the hint Changes section titles and date words only, not your content, Margins set to Normal, and the Icons in contact line and Underline links switches both on" />
</Frame>
| Property | Value |
| -------- | -------------- |
| Width | 210mm (794px) |
| Height | 297mm (1123px) |
## Choose the paper size
Choose A4 if you're applying to jobs internationally or in regions that use the metric system.
Under **Paper**, select **Letter** or **A4**.
### Letter
| Paper | Size | Use it when |
| --- | --- | --- |
| **Letter** | 8.5 × 11 in (216 × 279 mm) | You're applying in the United States or Canada. |
| **A4** | 210 × 297 mm | You're applying almost anywhere else. |
Letter is the standard paper size in the United States and Canada. When you select Letter, your resume pages conform to these dimensions:
Your content keeps its place when you switch. Because Letter is shorter and wider than A4, entries can move between pages, so check the page breaks afterwards.
| Property | Value |
| -------- | -------------- |
| Width | 216mm (816px) |
| Height | 279mm (1056px) |
### Free-form: one long page
Choose Letter if you're applying to jobs in North America.
Free-form is for resumes that are only read on screen. It keeps the A4 width, but each page grows as tall as its content needs, so nothing ever runs onto an extra page. Each page is at least as tall as an A4 page.
### Free-Form
Free-Form is built for resumes that are only read on a screen. Instead of matching a physical page size, it produces a **single continuous page** with no height limit. The width matches A4 (210mm), and the height extends to fit all your content.
| Property | Value |
| -------- | ------------- |
| Width | 210mm (794px) |
| Height | Unlimited |
<Info>
With Free-Form, there are no page breaks. Your resume renders as one continuous document, no matter how much content
you have.
</Info>
## Why Free-Form exists
Most resumes are never printed. Yours is almost always read digitally: on a screen, in an applicant tracking system (ATS), or by an AI screening tool.
When your resume is processed digitally:
- ATS parsers extract the text regardless of page dimensions
- AI scanners analyze the full document as a single unit
- Recruiters scroll through PDFs on their screens rather than printing them
- PDF parsing tools read the whole file regardless of page height
Since physical page limits no longer apply in those cases, Free-Form lets you focus on the content instead of fitting it into a fixed page height.
<Tip>
If you don't plan on printing your resume, Free-Form is usually the simplest choice. Nothing overflows, and there are
no awkward page breaks.
</Tip>
## How to change your page format
<Steps>
<Step title="Open your resume in the builder">
Navigate to your Dashboard and click on the resume you want to edit.
</Step>
<Step title="Open the right sidebar">
The sidebar sits on the right edge of the resume builder.
</Step>
<Step title="Navigate to the Page section">
In the right sidebar, find and click on the **Page** section to expand it.
</Step>
<Step title="Select your format">
Find the **Format** dropdown and select your preferred option: A4, Letter, or Free-Form.
<Frame caption="Screenshot of the Format dropdown in the Page section">
<img src="/images/guides/selecting-page-format/screenshot-1.webp" alt="Screenshot of the Format dropdown in the Page section" />
</Frame>
</Step>
<Step title="Review the preview">
Your resume preview updates immediately to reflect the new format. Check that your content displays correctly.
</Step>
</Steps>
## Choosing the right format
| Situation | Recommended Format |
| --------------------------------------- | ------------------ |
| Applying to jobs in North America | Letter |
| Applying to jobs internationally | A4 |
| Digital-only applications (no printing) | Free-Form |
| Uploading to ATS or job portals | Free-Form |
| Need to print physical copies | A4 or Letter |
| Long resume with lots of content | Free-Form |
| Traditional industries (law, finance) | A4 or Letter |
To use it, open **Advanced** at the bottom of the Design panel and set **Page → Format** to **Free-form**. While a resume uses free-form, the **Paper** control in the Page group shows a third option, **Free-form**. Selecting **Letter** or **A4** there switches back, and the option disappears again.
<Warning>
If you switch from Free-Form to A4 or Letter, your content is split across multiple pages. Review the result and
check that the page breaks don't fall in awkward places.
A free-form resume prints poorly, because printers cut it into paper-sized pieces wherever it happens to break. Use Letter or A4 if anyone might print it, or if a job asks for a one- or two-page resume.
</Warning>
## Example PDFs
## Set the language
Download these sample resumes to see how different formats affect the final PDF output:
Choose a language under **Language**. It changes the words Reactive Resume writes for you, such as the default section titles ("Experience", "Education") and date words (month names, "Present"). It doesn't translate what you wrote.
<CardGroup cols={1}>
<Card
arrow
horizontal
title="A4 Format Example"
icon="file-pdf"
href="https://github.com/user-attachments/files/24849548/a4.pdf"
>
A sample resume in A4 format showing traditional page breaks and constraints.
</Card>
<Card
arrow
horizontal
title="Free-Form Example"
icon="file-lines"
href="https://github.com/user-attachments/files/24849552/free-form.pdf"
>
A sample resume in Free-Form format showing a continuous single-page layout.
</Card>
</CardGroup>
The language also:
## Frequently asked questions
- sets the rules **Hyphenation** uses, if you turn it on in **Advanced → Typography**;
- mirrors the layout for right-to-left languages such as Arabic and Hebrew, so a left sidebar moves to the right.
<AccordionGroup>
<Accordion title="Does Free-Form work with ATS systems?">
Yes. An ATS parses the text in your PDF, not the page dimensions. Free-Form resumes work with applicant tracking systems.
</Accordion>
To show dates as "Mar 2022", "March 2022", "03/2022" or "2022-03", use **Date format** in **Advanced**. See [Entering dates](/guides/entering-dates).
<Accordion title="Can I switch formats after creating my resume?">
Yes. You can change the format at any time from the Page section in the right sidebar. Your content is preserved.
Only the layout changes.
</Accordion>
## Choose margins
<Accordion title="What if a job posting asks for a 'one-page resume'?">
If the employer asks for a one-page resume and expects a traditional format, use A4 or Letter and fit your content on
a single page. See [Fitting content on a page](/guides/fitting-content-on-a-page) for tips.
</Accordion>
Under **Margins**, select **Narrow**, **Normal** or **Wide**. Margins are the white space around the page edges. They also set the gap between a template's columns, below the header and between sections.
<Accordion title="Does Free-Form affect the file size?">
Slightly. A longer single page may produce a marginally larger PDF than a paginated version of the same content, but
the difference is negligible for typical resume lengths.
</Accordion>
| Margins | Left and right | Top and bottom |
| --- | --- | --- |
| **Narrow** | 10 pt | 8 pt |
| **Normal** | 14 pt | 12 pt |
| **Wide** | 19 pt | 16 pt |
<Accordion title="Which format should I use for LinkedIn?">
LinkedIn doesn't display uploaded resumes in their original format; it extracts the content. Free-Form works fine for LinkedIn uploads.
</Accordion>
</AccordionGroup>
If you type exact margins in Advanced that don't match one of these, none of the three is selected.
## Show or hide icons and link underlines
- **Icons in contact line** shows small icons next to your email, phone, location and links. It also controls the icons on skills, profiles and interests.
- **Underline links** underlines your website and other links on the page.
## Exact page settings
**Advanced → Page** holds the exact values behind the Page group, plus a few extras:
<Frame caption="Advanced → Page">
<img src="/images/guides/selecting-page-format/advanced-page.webp" alt="The Advanced Page section with Format set to A4, Margin (Horizontal) 14 pt, Margin (Vertical) 12 pt, Spacing (Horizontal) 12 pt, Spacing (Vertical) 6 pt, and switches for Hide Link Underline, Hide Icons and Hide Section Icons" />
</Frame>
| Setting | What it does |
| --- | --- |
| **Format** | **A4**, **Letter** or **Free-form**. |
| **Margin (Horizontal)** / **Margin (Vertical)** | Exact margins, from 0 to 100 pt. |
| **Spacing (Horizontal)** | Space between items that sit side by side, for example in a section shown in several columns. |
| **Spacing (Vertical)** | Space in and between entries. Density in the Type group sets this too. The space between sections comes from **Margin (Vertical)**. |
| **Hide Link Underline** | The same as turning off **Underline links**. |
| **Hide Icons** | The same as turning off **Icons in contact line**. |
| **Hide Section Icons** | Hides the small icon before each section heading. You choose each section's icon from its **⋯** menu in Write, with **Icon…**. |
<Note>
Cover letters have the same Page controls in their own Design mode. See [Writing a cover letter](/guides/writing-a-cover-letter).
</Note>
## Related guides
- [Fitting content on a page](/guides/fitting-content-on-a-page): use margins and other settings to stay within your pages.
- [Arranging the layout](/guides/arranging-the-layout): columns, sidebar and multi-page layouts.
- [Exporting your resume](/guides/exporting-your-resume): download the PDF in the paper size you chose.
+41 -32
View File
@@ -1,44 +1,53 @@
---
title: "Setting up passkeys"
description: "Register WebAuthn passkeys on your Reactive Resume account to sign in with biometrics, a device PIN, or a security key instead of a password."
description: "Add a passkey to your Reactive Resume account to sign in with your fingerprint, face, device PIN or security key instead of a password."
---
A passkey lets you sign in with the same check you use to unlock your device: a fingerprint, your face, a PIN or a hardware security key. There is no password to type or leak, and a passkey only works on the real Reactive Resume site, so it resists phishing.
## Before you start
You need a device or password manager that supports passkeys. Recent versions of macOS, iOS, Windows, Android, Chrome, Safari, Edge and Firefox all do, as do password managers such as 1Password and Bitwarden.
## Add a passkey
<Steps>
<Step title="Sign in to the dashboard">
Head over to [https://rxresu.me](https://rxresu.me) and sign in with your account credentials.
<Step title="Open Sign-in & security">
Select your name at the bottom of the sidebar, then **Settings**. On the **Account** page, find **Passkeys** under **Sign-in & security**.
</Step>
<Step title="Navigate to Authentication settings">
Open <Badge>Settings</Badge> from your avatar and choose <Badge>Account</Badge>. Everything about signing in is under **Sign-in & security**.
</Step>
<Step title="Register a new device">
In the <Badge>Passkeys</Badge> section, click the <Badge>Register New Device</Badge> button.
</Step>
<Step title="Name your passkey">
Enter a descriptive name so you can recognize it later (for example, "MacBook Touch ID" or "iPhone Face ID").
</Step>
<Step title="Complete the passkey prompt">
Your browser or device shows a passkey prompt (WebAuthn). What it asks for depends on the authenticator you are registering: a biometric (Face ID / Touch ID / fingerprint), your device PIN, or inserting and touching a security key.
<Info>
Passkeys are tied to your device (or password manager) and are a more secure alternative to passwords.
</Info>
<Step title="Select Add passkey">
Your browser or device asks you to create a passkey. Follow its prompt: touch the fingerprint sensor, look at the camera, enter your device PIN, or insert and touch your security key.
</Step>
<Step title="Manage passkeys (optional)">
After registering, your passkey appears in the list. You can rename it or delete it from the same section.
<Step title="Name the passkey">
In **Name this passkey**, type a name you will recognize later, such as "MacBook Touch ID" or "Work laptop", and select **Save**.
<Warning>
Deleting a passkey cannot be undone. After deletion, you won't be able to sign in using that passkey anymore.
</Warning>
</Step>
<Step title="Sign in with a passkey">
On the login page, click <Badge>Sign in with Passkey</Badge> to authenticate without entering your password.
<Frame>
<img src="/images/guides/setting-up-passkeys/name-this-passkey.webp" alt="The Name this passkey dialog with the name MacBook Touch ID typed in, and Cancel and Save buttons" />
</Frame>
</Step>
</Steps>
The passkey appears under **Passkeys**. If you skip the name, it is listed as **Unnamed passkey**. You can add a passkey on each device you use.
<Frame caption="Your passkeys are listed under the Passkeys row">
<img src="/images/guides/setting-up-passkeys/passkeys-list.webp" alt="The Sign-in and security section with a passkey named MacBook Touch ID listed under Passkeys, with a Remove button" />
</Frame>
## Sign in with a passkey
On the sign-in page, select **Passkey** under **or continue with** and confirm on your device. Many browsers also suggest your passkey when you click the **Email Address** field. A passkey sign-in doesn't ask for a password or a two-step code.
## Remove a passkey
Select **Remove** next to the passkey. It is deleted straight away, without a confirmation, and can no longer sign you in. To finish the cleanup, also delete it from your device or password manager.
<Note>
Passkeys can't be renamed after you save them. To change a name, remove the passkey and add it again.
</Note>
## Related guides
- [Signing in](/guides/signing-in): all the ways to get into your account.
- [Setting up two-factor authentication](/guides/setting-up-two-factor-authentication): a second check for password sign-ins.
@@ -1,78 +1,86 @@
---
title: "Setting up two-factor authentication"
description: "Enable TOTP two-factor authentication on your Reactive Resume account with an authenticator app, save recovery codes, and manage 2FA settings."
description: "Turn on two-step verification in Reactive Resume with an authenticator app, save your backup codes, and turn it off again when you need to."
---
Two-step verification adds a second check when you sign in: after your password, you enter a 6-digit code from an authenticator app on your phone or computer. Someone who learns your password still can't get in without it.
## Before you start
- Install an authenticator app, such as Google Authenticator, Microsoft Authenticator, 1Password, Bitwarden or Authy.
- Your account needs a password. If you signed up with a social account, the **Two-step verification** row doesn't appear until you [set a password](/guides/updating-your-profile#change-your-password).
## Turn on two-step verification
<Steps>
<Step title="Ensure you have a password set">
The option to set up two-factor authentication only appears once your account has a password. If you signed in with Google or GitHub and never set one, you cannot follow this guide until you do.
<Warning>
Two-factor authentication requires a password to be set on your account. If you signed up using a social provider (Google or GitHub), you'll need to set a password first from the Authentication settings page.
</Warning>
<Step title="Open Sign-in & security">
Select your name at the bottom of the sidebar, then **Settings**. On the **Account** page, find **Two-step verification** under **Sign-in & security**.
</Step>
<Step title="Sign in to the dashboard">
Head over to [https://rxresu.me](https://rxresu.me) and sign in with your account credentials.
<Tip>
If you haven't created an account yet, follow the guide on [Creating an account](/guides/creating-an-account).
</Tip>
<Step title="Turn the switch on and enter your password">
The **Enable Two-Factor Authentication** dialog asks for your **Password**. Enter it and select **Continue**.
<Frame>
<img src="/images/guides/setting-up-two-factor-authentication/enter-password.webp" alt="The Enable Two-Factor Authentication dialog asking for your password, with a Continue button" />
</Frame>
</Step>
<Step title="Navigate to Authentication settings">
Open <Badge>Settings</Badge> from your avatar and choose <Badge>Account</Badge>. Everything about signing in is under **Sign-in & security**.
</Step>
<Step title="Click on Enable 2FA">
On the Authentication page, find the <Badge>Two-Factor Authentication</Badge> section and click the{" "}
<Badge>Enable 2FA</Badge> button.
</Step>
<Step title="Enter your password">
You are asked to re-enter your password to confirm it's really you. Enter it and click continue.
<Info>
The password check prevents someone else from enabling two-factor authentication on your account.
</Info>
<Step title="Add Reactive Resume to your authenticator app">
In **Setup Authenticator App**, scan the QR code with your app. If you can't scan it, select the copy button next to the secret key above the code and paste the key into your app.
<Frame>
<img src="/images/guides/setting-up-two-factor-authentication/scan-qr-code.webp" alt="The Setup Authenticator App dialog with a secret key and copy button, a QR code, six code boxes, and Cancel and Continue buttons" />
</Frame>
</Step>
<Step title="Scan the QR code">
After entering your password, you are shown a QR code. Scan it with your authenticator device and enter the 6-digit code the app gives you to continue.
<Tip>
Popular authenticator apps you can use include:
- **Google Authenticator** - Available on iOS and Android
- **Microsoft Authenticator** - Available on iOS and Android
- **Authy** - Available on iOS, Android, and desktop
- **1Password** - Available on multiple platforms
- **LastPass Authenticator** - Available on iOS and Android
</Tip>
<Info>
If you prefer manual entry, copy the secret key above the QR code and paste it into your authenticator app.
</Info>
<Step title="Enter the 6-digit code">
Type the code your app shows for Reactive Resume. The dialog moves on as soon as the code is complete, or you can select **Continue**.
</Step>
<Step title="Save your backup codes">
Once verified, you are prompted to save backup codes. Each code works only once, and they let you sign in if you lose access to your authenticator device.
<Warning>
Make sure to copy and store these backup codes in a safe place. If you lose your authenticator device and don't have backup codes, you may lose access to your account.
</Warning>
</Step>
<Step title="Sign in with 2FA">
The next time you sign in, you are asked for a one-time code from your authenticator app. Enter the 6-digit code shown there to finish signing in.
<Tip>
If you have lost access to your authenticator device, use one of your backup codes to sign in. Each backup code can only be used once.
</Tip>
**Copy Backup Codes** shows 10 one-time codes. Select **Download** to save them as a text file, or **Copy** to paste them somewhere safe, such as your password manager. Then select **Continue**.
<Frame>
<img src="/images/guides/setting-up-two-factor-authentication/backup-codes.webp" alt="The Copy Backup Codes dialog listing ten codes in two columns, with Download, Copy and Continue buttons" />
</Frame>
</Step>
</Steps>
The switch now shows two-step verification is on. From your next sign-in, Reactive Resume asks for a code after your password.
<Frame caption="Two-step verification turned on">
<img src="/images/guides/setting-up-two-factor-authentication/two-step-verification-on.webp" alt="The Sign-in and security section with the Two-step verification switch turned on" />
</Frame>
<Warning>
Two-step verification is on as soon as your code is accepted, even if you close the dialog before saving the backup codes. The codes are shown only once. If you lose your authenticator app and have no backup codes, you can't sign in with your password.
</Warning>
## Sign in with a code
After your password, enter the code from your app on the **Two-Factor Authentication** page. If you don't have your app, select **Lost access to your authenticator?** and enter a backup code. Each backup code works once. See [Signing in](/guides/signing-in#enter-a-two-step-code) for details.
Signing in with a [passkey](/guides/setting-up-passkeys) or a linked social account doesn't ask for a code.
## Turn off two-step verification
<Steps>
<Step title="Turn the switch off">
In **Sign-in & security**, turn off **Two-step verification**.
</Step>
<Step title="Confirm with your password">
In **Disable Two-Factor Authentication**, enter your **Password** and select **Disable 2FA**.
</Step>
</Steps>
<Frame caption="Turning off two-step verification needs your password">
<img src="/images/guides/setting-up-two-factor-authentication/disable-dialog.webp" alt="The Disable Two-Factor Authentication dialog with a Password field and a Disable 2FA button" />
</Frame>
To move to a new phone, turn two-step verification off and on again, then scan the new QR code on the new device. Your old codes and backup codes stop working.
## Related guides
- [Setting up passkeys](/guides/setting-up-passkeys): a faster sign-in that is also resistant to phishing.
- [Updating your profile](/guides/updating-your-profile#change-your-password): change or set your password.
+107 -204
View File
@@ -1,242 +1,145 @@
---
title: "Sharing your resume publicly"
description: "Publish your resume at a public URL, share it with recruiters, track views and downloads, and optionally protect it with a password."
title: "Sharing your resume with a link"
description: "Turn on a public link for your resume, choose its address, add a password, and see how many people viewed and downloaded it."
---
Reactive Resume can publish your resume at a **public URL**. Anyone with the link can open it, so you can send it to recruiters, collaborators, or people visiting your portfolio. Public resume URLs are not search-indexed by default.
A public link lets anyone you send it to open your resume in a browser, without an account. It always shows your latest changes, so you never have to send a new file after an edit. Links are off by default: until you turn one on, only you can see the resume.
## What public sharing gives you
## Before you start
<CardGroup cols={2}>
<Card title="Always up-to-date" icon="arrows-rotate">
Viewers always see the latest version of your resume. No need to send new files when you make updates.
</Card>
<Card title="Track engagement" icon="chart-line">
See public view counters in the builder.
</Card>
<Card title="Password protection" icon="lock">
Optionally require a password so only people you trust can access your resume.
</Card>
<Card title="Easy to share" icon="share">
One URL you can paste into an email signature, LinkedIn, a portfolio, or a job application.
</Card>
</CardGroup>
- Open the resume in the editor. Links belong to resumes; cover letters don't have one.
- Check your username in **Settings** → **Account**. It's part of every public address, for example `https://rxresu.me/dkowalski/game-developer`. If you host Reactive Resume yourself, your own address replaces `rxresu.me`.
## How to enable public sharing
## Turn on the public link
<Steps>
<Step title="Open your resume in the builder">
Navigate to your resume in the resume builder.
<Step title="Open the Share sheet">
In the editor bar, select **Share** (or press <kbd>⌘</kbd> <kbd>⇧</kbd> <kbd>S</kbd>, <kbd>Ctrl</kbd> <kbd>Shift</kbd> <kbd>S</kbd> on Windows and Linux). The **Share & export** sheet opens on its **Link** tab.
<Frame caption="Share and Download PDF in the editor bar. The Public badge shows while the link is on.">
<img src="/images/guides/sharing-your-resume-publicly/editor-bar-share-button.webp" alt="Editor bar with the History and Assistant icons, a Share button with a green Public badge, and the Download PDF button" />
</Frame>
</Step>
<Step title="Switch on Public link">
Turn on **Public link**. The link is live at once, and **Share** in the editor bar gains a **Public** badge so you can tell at a glance.
<Step title="Go to the Sharing section">In the **right sidebar**, select **Sharing**.</Step>
<Step title="Toggle 'Allow Public Access'">
Turn on the **Allow Public Access** switch. Your resume is then reachable at its public URL.
<Frame caption="Sharing section in the resume builder">
<img
src="/images/guides/sharing-your-resume-publicly/screenshot-1.webp"
alt="Sharing section showing the public access control"
/>
</Frame>
</Step>
<Step title="Copy your public URL">
Your public URL is displayed below the toggle. It follows this format:
```
https://rxresu.me/{username}/{slug}
```
Click the **copy** button to copy the URL to your clipboard.
<Frame caption="With the link off, only you can see the resume.">
<img src="/images/guides/sharing-your-resume-publicly/public-link-off.webp" alt="Link tab of the Share and export sheet with the Public link switch off, a greyed-out Address field and a message about counting views" />
</Frame>
</Step>
<Step title="Copy the address">
Select **Copy** next to the **Address** field. The button shows **Copied** for a moment. Paste the link into an email, a job application or your LinkedIn profile.
On a phone or tablet, you can also select **Share via…** to send the link through your device's share menu.
</Step>
</Steps>
<Tip>
The `{slug}` is the unique, URL-safe name you assign to your resume when you create it. If you want to change your
slug, go to the dashboard, right-click your resume card, and choose "Update" to edit its details.
</Tip>
<Frame caption="The Link tab with the public link on">
<img src="/images/guides/sharing-your-resume-publicly/share-sheet-link-tab.webp" alt="Link tab with Public link on, the address and a Copy button, switches for visitor downloads and a password, Open public page and QR code buttons, and view and download counts" />
</Frame>
## How the public URL works
With the link on, the tab also offers:
When someone visits your public resume URL:
- **Visitors can download the PDF**: on by default. Turn it off if you want people to read the resume on the page but not save a copy. It also stops visitors from printing the page.
- **Open public page**: opens the resume in a new tab, the way visitors see it.
- **QR code**: shows a code that opens the link, handy for a printed card or a slide.
1. They see the live version. The page renders your current resume data, including your latest changes.
2. No account is required. Visitors don't need a Reactive Resume account to view or download your resume.
3. They can download a PDF. The public page shows an identity header with your name, headline, and picture, plus a **Download PDF** action.
4. Link previews work. Reactive Resume generates per-resume Open Graph and Twitter card previews, so links you paste into LinkedIn, Slack, iMessage, and similar apps show your name and headline instead of a generic placeholder.
5. Views are tracked. Visits are counted in your resume statistics (see below).
Public links aren't listed anywhere and ask search engines not to index them. People find your resume only through a link you share.
<Info>
Changes you make in the builder show up immediately on the public URL. There is no separate "publish" step. Treat the
link as something you send to people directly, not as a search profile page.
</Info>
## Change the address
## Resume language
The last part of the address is yours to choose. It starts out based on the resume's name.
Set **Page → Language** in the builder's right sidebar to choose the language of default section headings. Public visitors and PDF downloads use this saved resume language, even when the visitor's app interface uses another language. Section titles you rename remain as written.
<Steps>
<Step title="Edit the Address field">
With the link on, type a new ending in the **Address** field. Use lowercase letters, numbers and single dashes; spaces turn into dashes as you type.
</Step>
<Step title="Wait for the check">
Reactive Resume checks the address as you type. When it shows **Available**, the new address is saved on its own. Until then, the old address keeps working.
</Step>
</Steps>
The interface language selected in Preferences is stored in the current browser. It does not change the resume's language or sync to other browsers.
<Frame caption="An address with characters that aren't allowed">
<img src="/images/guides/sharing-your-resume-publicly/address-invalid.webp" alt="Address field outlined in red containing game_developer, with the message: Use lowercase letters, numbers and single dashes" />
</Frame>
## Tracking public engagement
If another of your resumes already uses that address, the message names it and suggests a free one. Select **Try** followed by the suggestion to use it.
When your resume is public, Reactive Resume counts public views, so you can tell whether people are opening the link you shared.
After a change, the old address still leads to your resume for 30 days, so links you already sent keep working while you update them. Changing your username is different: every public address changes at once, and old links stop working.
### Where to find statistics
## Require a password
In the resume builder, open the **right sidebar** and select **Statistics**.
A password keeps the link private to the people you give it to, for example while you're job hunting and don't want a current employer to stumble on your resume.
You'll see public view information such as:
<Steps>
<Step title="Turn on Require a password">
On the **Link** tab, turn on **Require a password**.
</Step>
<Step title="Enter the password twice">
Type a password of 6 to 64 characters, type it again in **Confirm Password**, then select **Set Password**.
| Metric | Description |
| ------------------- | ---------------------------------------------------------------- |
| **Views** | Number of times your public resume page was visited |
| **Downloads** | Number of times a visitor downloaded your resume as a PDF |
| **Last viewed** | The date when your resume was last viewed |
<Frame caption="Setting a password for the public link">
<img src="/images/guides/sharing-your-resume-publicly/password-dialog.webp" alt="Dialog titled Protect your resume with a password, with Password and Confirm Password fields and Cancel and Set Password buttons" />
</Frame>
</Step>
<Step title="Send the password separately">
Share the password through a different channel than the link, such as a text message. Anyone with both can view and download the resume.
</Step>
</Steps>
Each metric also shows a 30-day sparkline and the change against the previous period, so you can see whether interest rose or fell after you shared the link.
To remove the password, turn off **Require a password** and select **Remove** to confirm. Anyone with the link can then view the resume.
<Info>
Statistics are only shown after public sharing is enabled. If you turn off public access, existing stats are
preserved.
</Info>
## What visitors see
### What counts as a view?
Visitors open your resume on a clean page with no Reactive Resume menus.
A view is counted each time someone loads your public resume page. This includes:
- **On a computer**, your name, headline and location sit at the top with **Copy link** and **Download PDF**. Below is the resume, exactly as it prints.
- **On a phone**, the resume reflows into readable text in the same order as the pages, with **Download PDF** and a share button pinned to the bottom of the screen.
- **With a password**, visitors first see **This resume is password protected** and enter the password you shared, then select **Unlock**. The page stays unlocked for about 10 minutes; after that, they enter it again. You see this screen too when you open your own link.
- **When the link is off**, or the resume is in Trash, visitors see **This resume isn't shared right now.** The page gives nothing away about you.
- Direct visits to your public URL
- Clicks from links you've shared
<Frame caption="The public page on a computer">
<img src="/images/guides/sharing-your-resume-publicly/public-resume-page.webp" alt="Public resume page with David Kowalski's name and headline in a top bar, Copy link and Download PDF buttons, and the resume page below" />
</Frame>
Owner self-visits while you are signed in to your account are not included in the view statistics.
<Frame caption="The same resume on a phone">
<img style={{ maxWidth: "320px" }} src="/images/guides/sharing-your-resume-publicly/public-resume-on-phone.webp" alt="Public resume on a phone screen, reflowed into text with contact buttons, Education and Experience sections, and a pinned Download PDF button" />
</Frame>
<Frame caption="The password screen visitors see first">
<img src="/images/guides/sharing-your-resume-publicly/password-gate.webp" alt="Page titled This resume is password protected, with a Password field and an Unlock button" />
</Frame>
Visitors never see your private notes, or any section or entry you've hidden. At the bottom of the page, a small **Made with Reactive Resume, free and open source** line links to the Reactive Resume home page.
## See views and downloads
The bottom of the **Link** tab shows **Views and downloads**. Only you see these numbers.
| Number | What it counts |
| --- | --- |
| **views · 30 days** | Visits to your public page in the last 30 days |
| **downloads** | PDFs visitors downloaded from the page in the last 30 days |
| **since last view** | How long ago someone last opened the page, such as `5m`, `2h` or `3d` |
A bar chart under the numbers shows views for each of the last 30 days.
- Your own visits and downloads don't count while you're signed in.
- Repeat visits from the same visitor within an hour count once.
- Counts are anonymous. Reactive Resume doesn't record who viewed your resume.
- Counting starts only once the link is on.
## Turn off the public link
Turn off **Public link** on the **Link** tab. The link stops working immediately, and visitors see **This resume isn't shared right now.** Your address is kept, so turning the link back on brings the same address back. Moving the resume to Trash also stops its link.
<Note>
Only **you** can see your resume's view statistics. Visitors to your public URL cannot see how many views your resume
has.
While a resume is locked, you can't change its link settings. Select the resume's name in the editor bar, then **Unlock editing** first. Share and Download are also unavailable while you're offline.
</Note>
## Password protecting your resume
## Related guides
To share your resume with specific people while keeping it away from everyone else, add password protection.
When password protection is enabled:
- Visitors must enter the correct password to view your resume
- The password prompt appears before any resume content is shown
- You can share the password separately with trusted individuals
### How to set a password
<Steps>
<Step title="Enable public access">
First, make sure **Allow Public Access** is turned on in the **Sharing** section.
</Step>
<Step title="Click Set Password">Below the public URL, click **Set Password**.</Step>
<Step title="Enter your password">
Type a password (6-64 characters) and confirm it. Viewers have to enter this password to see your resume.
</Step>
<Step title="Share the password separately">
Share the password with your intended audience through a secure channel (e.g., direct message, email).
</Step>
</Steps>
<Warning>
Choose a password you're comfortable sharing. Anyone with the password can view and download your resume.
</Warning>
### How to remove password protection
If you no longer need password protection:
1. Go to the **Sharing** section in the right sidebar
2. Click **Remove Password**
3. Confirm the action
Your resume is then open to anyone with the public URL.
## Use cases for public sharing
<AccordionGroup>
<Accordion title="LinkedIn profile" icon="linkedin">
Add your public resume URL to your LinkedIn profile's **Featured** section or **Contact Info**. Recruiters can view your detailed resume directly.
</Accordion>
<Accordion title="Email signature" icon="envelope">
Include your resume link in your email signature, so anyone you write to can open it.
</Accordion>
<Accordion title="Portfolio website" icon="globe">
Embed or link to your resume from your personal website. The link always shows your latest resume.
</Accordion>
<Accordion title="Job applications" icon="briefcase">
Some applications accept a link to your resume, while others require a file upload. Use the public URL when a link is
accepted, and export a PDF when an upload is required.
</Accordion>
<Accordion title="Networking events" icon="users">
Share your resume URL via QR code or NFC. Update the resume before the event and everyone gets the current version.
</Accordion>
<Accordion title="Confidential job search" icon="lock">
Use password protection to share your resume only with specific recruiters while keeping it hidden from your current employer.
</Accordion>
</AccordionGroup>
## Turning off public access
To make your resume private again:
1. Go to the **Sharing** section in the right sidebar
2. Turn off the **Allow Public Access** switch
When public access is disabled:
- Your public URL returns a "not found" error
- Existing links stop working immediately
- Your statistics are preserved (they'll resume if you re-enable public access)
- Password protection settings are preserved
<Tip>
To hide your resume temporarily, use password protection instead of turning off public access. The URL stays active
for people who have the password.
</Tip>
## Copying the URL from the builder dock
The builder dock has a **Copy URL** shortcut. It copies the same public URL shown in the **Sharing** section.
<Warning>
Copying the URL does not enable public access. Turn on **Allow Public Access** in the **Sharing** section before sending
the link to someone else.
</Warning>
## Frequently asked questions
<AccordionGroup>
<Accordion title="Can I customize my public URL?">
Yes. The URL is based on your **username** and the resume's **slug**. You can change the slug in the **Update Resume** dialog. To open it, right-click your resume card in the dashboard and select "Update". The username is set in your account settings.
</Accordion>
<Accordion title="Are public resumes meant to be search-indexed pages?">
No. By default, public resume URLs are meant for human recipients who receive the link from you, not as search profile
pages. If you want tighter access control, use password protection or keep your resume private.
</Accordion>
<Accordion title="Do views from my own visits count?">
No. If you are signed in as the owner, your own visits are excluded from the view statistics.
</Accordion>
<Accordion title="Can I see who viewed my resume?">
No, Reactive Resume tracks public view counts, not the identity of visitors. This protects visitor privacy.
</Accordion>
<Accordion title="What happens if I change my username?">
Your public URL changes to match the new username, and the old URLs stop working immediately. Update any links you have already shared.
</Accordion>
</AccordionGroup>
- [Exporting your resume](/guides/exporting-your-resume): download a PDF, Word, Markdown or JSON file instead of sending a link.
- [Updating your profile](/guides/updating-your-profile): change the username that appears in your public addresses.
- [Checking your resume](/guides/checking-your-resume): review your resume before you share it.
- [Using the Trash](/guides/using-the-trash): what happens to a shared resume you delete.
+92
View File
@@ -0,0 +1,92 @@
---
title: "Signing in"
description: "Sign in to Reactive Resume with your email or username, a passkey, or a social account, reset a forgotten password, and enter two-step codes."
---
This guide covers every way to get into your account, including what to do when you have forgotten your password or lost your authenticator app.
## Sign in with your password
<Steps>
<Step title="Open the sign-in page">
Go to [rxresu.me](https://rxresu.me) and select **Build your resume**. If you are not signed in, Reactive Resume takes you to **Sign in to your account**.
</Step>
<Step title="Enter your email or username">
The **Email Address** field also accepts your username.
</Step>
<Step title="Enter your password and select Sign in">
Select the eye icon next to the field to check what you typed.
</Step>
</Steps>
If you have turned on two-step verification, Reactive Resume asks for a code next. See [Enter a two-step code](#enter-a-two-step-code) below.
<Frame caption="The sign-in page. Which buttons appear under or continue with depends on the site.">
<img src="/images/guides/signing-in/sign-in-page.webp" alt="The Sign in to your account page with Email Address and Password fields, a Forgot Password? link, a Sign in button, and Passkey, Google, GitHub and LinkedIn buttons" />
</Frame>
## Sign in with a passkey
If you have [added a passkey](/guides/setting-up-passkeys), select **Passkey** under **or continue with** and confirm with your fingerprint, face, device PIN or security key. Many browsers also offer your passkey as a suggestion when you click the **Email Address** field.
Signing in with a passkey skips the password and the two-step code.
## Sign in with Google, GitHub or LinkedIn
Select the provider's button and approve the request on its site. The buttons appear only when the site has set them up. Self-hosted copies may show a single button named after your organization's sign-in service instead.
A social button signs you in to the account that is [linked to that provider](/guides/linking-social-accounts). If no account uses that email yet, a new one is created, unless the site has turned off new sign-ups.
## Reset a forgotten password
<Steps>
<Step title="Select Forgot Password?">
The link sits next to the **Password** label on the sign-in page.
</Step>
<Step title="Enter your email and send the link">
Type the email address on your account and select **Send Password Reset Email**.
</Step>
<Step title="Open the link in the email">
On the **Reset your password** page, enter a **New Password** of at least 8 characters and select **Reset Password**. You return to the sign-in page, where you can use the new password.
</Step>
</Steps>
<Frame caption="Request a password reset link">
<img src="/images/guides/signing-in/forgot-password.webp" alt="The Forgot your password? page with an Email Address field and a Send Password Reset Email button" />
</Frame>
<Note>
Password reset needs email delivery. On a self-hosted copy without email set up, ask the person who runs it for help.
</Note>
## Enter a two-step code
After your password, the **Two-Factor Authentication** page asks for the 6-digit code from your authenticator app. Type it in. The page submits as soon as the sixth digit is in, or you can select **Verify**.
<Frame caption="Enter the code from your authenticator app">
<img src="/images/guides/signing-in/two-factor-code.webp" alt="The Two-Factor Authentication page with six code boxes, Back to sign in and Verify buttons, and a Lost access to your authenticator? link" />
</Frame>
### Use a backup code instead
If you don't have your authenticator app, select **Lost access to your authenticator?**, enter one of the backup codes you saved when you turned on two-step verification, and select **Verify**.
Each backup code works once. Type it without the hyphen: the field holds 10 characters, and the codes are shown as two groups of five (`82cNK-qaOiN` becomes `82cNKqaOiN`).
<Frame caption="Sign in with a saved backup code">
<img src="/images/guides/signing-in/backup-code.webp" alt="The Verify with a Backup Code page with a single text field, a Go Back button and a Verify button" />
</Frame>
## Sign out
Select your name at the bottom of the sidebar, then **Sign out**. You can also find **Sign out** at the bottom of **Settings → Account**.
## Related guides
- [Creating an account](/guides/creating-an-account): sign up if you don't have an account yet.
- [Setting up two-factor authentication](/guides/setting-up-two-factor-authentication): turn codes on or off and get backup codes.
- [Setting up passkeys](/guides/setting-up-passkeys): sign in without a password.
@@ -0,0 +1,84 @@
---
title: "Tailoring a resume for a job"
description: "Copy your resume for one job, write a matching cover letter, and use Prepare for next step to get help with fit, follow-ups and interviews."
---
A resume written for one job usually does better than a general one. From any application you can make a copy of your resume that's linked to that job, write a cover letter for it, and later ask the assistant to help you prepare for the next step. Because the copy is linked to the application, [Check](/guides/checking-your-resume) and [the assistant](/guides/using-the-assistant) can compare it with the saved job posting.
## Before you start
- Add the job to **Applications**, ideally with its posting. See [Adding an application](/guides/adding-an-application).
- Have at least one resume to start from. See [Creating your first resume](/guides/creating-your-first-resume).
- The assistant's suggestions need an AI provider. See [Connecting an AI provider](/guides/using-ai). You can still make the copy without one.
## Make a copy of your resume for the job
<Steps>
<Step title="Open the application">
In **Applications**, select the application to open its details.
</Step>
<Step title="Select Tailor a resume">
It's under **What you sent**, and only shows when no resume is linked yet. (When adding a new application, **Add and tailor a resume** takes you to the same place.)
</Step>
<Step title="Choose the resume to start from">
Under **Start from**, pick the resume to copy. Usually that's your main, general resume.
</Step>
<Step title="Check the job and the name">
Under **For which job?**, the application is already picked. **Name** is suggested from the resume and the company, such as "Game Developer Resume — Maple & Moss". Change it if you like.
</Step>
<Step title="Create the copy">
Select **Create and open**.
</Step>
</Steps>
<Frame caption="Copy a resume for a job">
<img src="/images/guides/tailoring-a-resume-for-a-job/copy-a-resume-for-a-job-dialog.webp" alt="Copy a resume for a job dialog with Game Developer Resume selected under Start from, Maple & Moss selected under For which job?, and the suggested name Game Developer Resume — Maple & Moss, with a Create and open button" />
</Frame>
Reactive Resume makes the copy, links it to the application (it becomes the application's resume if none was linked), and opens it in the editor with the assistant ready. Your original resume doesn't change.
To tailor the copy:
- In the assistant, pick **Tailor to the *company* posting**. The assistant reads the resume and the posting, and suggests edits you accept or reject one at a time. See [Using the assistant](/guides/using-the-assistant).
- Switch to **Check** mode to see how well the resume matches the posting. See [Checking your resume](/guides/checking-your-resume).
<Tip>
You can also start a copy from **Documents**: open a resume's **⋯** menu and select **Copy for a job…**, or select **New** and then **Copy a resume for a job**. Pick the application under **For which job?**, or **No job yet** for a plain copy.
</Tip>
<Frame caption="Tailor a resume and Write a letter, shown when nothing is linked yet">
<img src="/images/guides/tailoring-a-resume-for-a-job/what-you-sent-tailor-and-write-buttons.webp" alt="What you sent section with a Tailor a resume button, a Write a letter button and an Attach a file instead link" />
</Frame>
## Write a cover letter for the job
In the application's details, under **What you sent**, select **Write a letter**. Reactive Resume creates a cover letter named "Cover letter — *company*", fills in the recipient from the application, links it to the application and to the application's resume (if it has one), and opens it in the letter editor.
To link a letter you already have, go to **Documents**, open the letter's **⋯** menu and select **Link to application…**. See [Writing a cover letter](/guides/writing-a-cover-letter).
Once the application reaches **Applied**, the version of the resume and letter you sent is saved, so you can open exactly what went out later. See [Managing an application](/guides/managing-an-application#seeing-what-you-sent).
## Prepare for the next step
When an application has a linked resume or letter, **Prepare for next step** at the bottom of its details opens that document with the assistant and a set of suggestions for this job:
- **How well do I fit this role?** compares your resume with the posting.
- **Draft a follow-up email** writes a short, polite note for the recruiter.
- **Prepare me for the interview** lists likely questions, based on the posting and your resume.
- **Tailor to the *company* posting** suggests edits to fit the posting.
<Frame caption="The assistant after Prepare for next step">
<img src="/images/guides/tailoring-a-resume-for-a-job/prepare-for-next-step-suggestions.webp" alt="Assistant panel reading What should we work on? I can see this resume and the Northwind Games posting, with suggestions How well do I fit this role?, Draft a follow-up email, Prepare me for the interview and Tailor to the Northwind Games posting" />
</Frame>
Pick a suggestion, or type your own request. If the application has both a resume and a letter, the resume opens. The button is disabled until a resume or letter is linked.
<Note>
The assistant uses the posting of the application a resume was made for. A general resume linked to several applications uses the one you updated most recently, which may not be the one you started from. For the most relevant help, prepare from a copy made for this job.
</Note>
## Related guides
- [Using the assistant](/guides/using-the-assistant): how suggestions, accepting and rejecting work.
- [Checking your resume](/guides/checking-your-resume): see how your resume matches a job.
- [Viewing application insights](/guides/viewing-application-insights): compare replies for tailored and general resumes.
+86 -134
View File
@@ -1,161 +1,113 @@
---
title: "Tracking job applications"
description: "Use the Application Tracker to record jobs, link the resume you sent, manage follow-ups, and move applications through your hiring pipeline."
description: "Keep every job you apply for in one place: see what needs you next, move applications through stages, and switch between List, Board, Insights and Calendar."
---
The **Application Tracker** keeps your job search tied to the resumes you build in Reactive Resume. Each application can store the company, role, stage, job posting, resume, cover letter, contacts, notes, and follow-up details.
**Applications** is where you keep track of the jobs you're going for. Each application holds the role, the company, the saved job posting, the resume and letter you sent, your contacts, notes and a dated history. It also works out what each application needs next, such as an interview coming up or a follow-up that's due.
## Open the Application Tracker
To open it, select **Applications** in the sidebar (on a phone, it's in the bottom tab bar).
<Steps>
<Step title="Sign in">
Open Reactive Resume and sign in to your account.
</Step>
<Step title="Go to Applications">
In the dashboard sidebar, click **Applications**.
</Step>
</Steps>
<Frame caption="Application Tracker board view">
<img
src="/images/guides/tracking-job-applications/screenshot-1.webp"
alt="Application Tracker showing search, tag filters, board columns, and application cards grouped by stage"
/>
<Frame caption="The Applications page in the List view, with the follow-up reminder at the top">
<img src="/images/guides/tracking-job-applications/applications-list-view.webp" alt="Applications page showing a follow-up reminder banner, the List, Board, Insights and Calendar tabs, a search field, Show closed, and applications grouped under Interview, Offer, Screening, Applied and Saved" />
</Frame>
<Tip>
Press `Cmd/Ctrl+K` from anywhere in the app to open the command palette. Select **Applications** to search your pipeline by company or role, or run **New Application** to jump straight to the add form.
</Tip>
## How stages work
## Add an application
<Steps>
<Step title="Click Add application">
If this is your first application, use the button in the empty state. Otherwise, use **Add application** in the page header.
</Step>
<Step title="Fill in the role details">
Add the **Company** and **Role / title**. These two fields are required. You can also add the location, salary range,
source, tags, notes, and follow-up details.
</Step>
<Step title="Choose a stage">
Pick the current stage of the opportunity.
</Step>
<Step title="Link or upload the resume you sent">
Pick a Reactive Resume in the **Resume** field to keep a live link to it. You can also upload the exact resume PDF you
sent.
</Step>
<Step title="Attach a cover letter">
If you sent a cover letter, attach the PDF in the **Cover letter** field.
</Step>
<Step title="Save">
Click **Add to pipeline**.
</Step>
</Steps>
<Frame caption="Add application form">
<img
src="/images/guides/tracking-job-applications/screenshot-2.webp"
alt="Add application form with job posting auto-fill, company, role, stage, resume, cover letter, tags, and follow-up fields"
/>
</Frame>
<Tip>
Linking a Reactive Resume enables AI match scoring and resume tailoring for that application.
</Tip>
## Use AI to fill a job posting
If you have an AI provider configured, paste a job posting URL at the top of the add form and click **Auto-fill**. Reactive Resume reads the posting and fills in what it can, such as company, role, location, salary, and job description.
If auto-fill fails or the posting is private, paste the job description manually.
For AI setup, see [Using artificial intelligence](/guides/using-ai).
## Understand application stages
Applications move through a fixed set of stages:
Every application sits in one stage. The first five stages form a pipeline you move through in order:
| Stage | Use it when |
| --- | --- |
| **Saved** | You found a role but have not applied yet. |
| **Applied** | You submitted the application. |
| **Screening** | A recruiter, hiring manager, or automated process is reviewing you. |
| **Interview** | You are in an interview process. |
| **Saved** | You found the job but haven't applied yet. |
| **Applied** | You sent your application. |
| **Screening** | A recruiter or hiring manager got back to you, or you have a first call. |
| **Interview** | You're in the interview process. |
| **Offer** | You received an offer. |
| **Rejected** | The company declined or the opportunity ended. |
| **Closed** | The application ended, whatever the outcome. |
You can move applications by dragging cards on the board, using the action menu, using bulk actions in the table, or opening an application and clicking **Move to**.
You can close an application from any stage. Closing asks for a reason (**Not selected**, **I withdrew**, **Accepted another offer** or **No response**), which Insights uses later. Closed applications are hidden until you turn on **Show closed**. See [Managing an application](/guides/managing-an-application#closing-an-application).
## Choose a view
<Note>
When an application with a linked resume or letter reaches **Applied** or a later stage, Reactive Resume saves a copy of each as a "Sent to *company*" version. You can always open exactly what you sent, even after you keep editing the document.
</Note>
The Application Tracker has three views:
## Choosing a view
| View | Best for |
| --- | --- |
| **Board** | Moving applications through stages visually. |
| **Table** | Reviewing many applications, selecting rows, and making bulk updates. |
| **Insights** | Understanding your pipeline, response rate, interviews, offers, sources, and application velocity. |
Use the tabs above the list to switch views. Your choice is kept in the page address, so a bookmark opens the same view.
Use search, tag filters, sorting, and the archived toggle to narrow the list.
<Tabs>
<Tab title="List">
The default view. Applications are grouped by stage in the order that usually needs you first: **Interview**, **Offer**, **Screening**, **Applied**, **Saved**, then **Closed** when shown.
<Frame caption="Application Tracker insights view">
<img
src="/images/guides/tracking-job-applications/screenshot-4.webp"
alt="Application Tracker insights view showing pipeline metrics, a funnel chart, applications over time, and source counts"
/>
- Select a group heading to collapse or expand it.
- Select the **Role**, **Next step** or **Updated** column heading to sort within each group. Select it again to reverse the order.
- The **Next step** column shows the next interview, the follow-up you set, or how long you've been waiting. It turns amber when something is overdue or you've had no reply for 10 days or more.
- The **Sent** column shows an icon for a linked resume and a linked letter. It says **None** in amber when an application was sent without a linked document.
- Select a row to open its details.
</Tab>
<Tab title="Board">
One column per stage, with a card for each application. Drag a card to another column to move it to that stage. Each card also has a **⋯** menu with **Move to…**, **Close…** and **Delete…**, which is handy if you prefer the keyboard. When **Show closed** is on, a **Closed** column appears too. Dragging a card there closes it without a reason, so use **Close…** if you want Insights to know why.
<Frame caption="The Board view">
<img src="/images/guides/tracking-job-applications/applications-board-view.webp" alt="Board view with Saved, Applied, Screening and Interview columns, each card showing the role, company and next step" />
</Frame>
<Frame caption="A card's menu, with Move to… open">
<img src="/images/guides/tracking-job-applications/board-card-move-to-menu.webp" alt="Card menu with Move to…, Close… and Delete…, and the Move to submenu listing Saved, Applied, Screening, Interview and Offer" />
</Frame>
</Tab>
<Tab title="Insights">
Charts about how your applications are going: how far they get, how often and how quickly people reply, and where your applications come from. See [Viewing application insights](/guides/viewing-application-insights).
</Tab>
<Tab title="Calendar">
A month calendar of your interviews, with a list of upcoming ones beside it. See [Scheduling interviews](/guides/scheduling-interviews).
</Tab>
</Tabs>
On phones, the page shows **List** and **Insights** only, and list rows show the company and next step on a second line.
## Finding applications
Type in **Search role, company or contact** to filter the list as you type. Search looks at the role, company, location, contact names and tags. If nothing matches, select **Clear search**.
**Show closed** adds closed applications to the List, Board and Calendar views. Insights always counts every application.
## Acting on several applications at once
In the List view on a computer or tablet, select the checkboxes next to the applications you want. A bar appears at the bottom of the page with:
- **Move to…** to move them all to one stage
- **Add tag** to add the same tag to each
- **Close…** to close them all with one reason
- **Delete…** to delete them permanently (you're asked to confirm)
- **Clear** to deselect
<Frame caption="Two applications selected, with the bulk actions bar">
<img src="/images/guides/tracking-job-applications/list-bulk-actions-bar.webp" alt="Two application rows checked in the List view and a dark bar reading 2 selected with Move to…, Add tag, Close…, Delete… and Clear" />
</Frame>
## Update an application
## Follow-up reminders
Open an application from the board or table to view its detail panel. From there you can:
When an application has been at **Applied** for 10 days or more without a reply, a reminder appears above the list for the one that has waited longest, for example "Harborlight Labs: no reply for 17 days." Select **Open** to go to that application, or **×** to dismiss the reminder. Dismissing is remembered in this browser, so that application's reminder doesn't come back here.
- edit the application details;
- move it to the next stage;
- open the original job posting;
- attach or replace resume and cover letter PDFs;
- add contacts;
- add follow-up information;
- add notes to the timeline;
- archive, unarchive, mark rejected, or delete the application.
## Opening Applications from anywhere
Stage changes and notes appear in the timeline automatically.
Press <kbd>⌘</kbd> <kbd>K</kbd> (<kbd>Ctrl</kbd> <kbd>K</kbd> on Windows and Linux) and choose **Applications** to go to the page or to search your applications by company or role. Run **New Application** to open the add dialog. See [Using the command bar](/guides/using-the-command-bar).
<Frame caption="Application detail panel">
<img
src="/images/guides/tracking-job-applications/screenshot-3.webp"
alt="Application detail panel showing stage progress, linked resume, Application Copilot, contacts, and timeline activity"
/>
</Frame>
## Related guides
## Use Application Copilot
<CardGroup cols={2}>
<Card title="Adding an application" href="/guides/adding-an-application">
Paste a job link or posting and start tracking it.
</Card>
<Card title="Managing an application" href="/guides/managing-an-application">
Stages, next steps, what you sent, notes, contacts and history.
</Card>
<Card title="Tailoring a resume for a job" href="/guides/tailoring-a-resume-for-a-job">
Make a copy of your resume for one application, or write a letter.
</Card>
<Card title="Importing applications from CSV" href="/guides/importing-applications-from-csv">
Bring in a spreadsheet, or export your applications.
</Card>
</CardGroup>
Application Copilot appears in the application detail panel. It can:
- score how well the linked resume matches the job description;
- create a tailored copy of the linked resume;
- draft a cover letter;
- draft a follow-up message.
Match scoring and resume tailoring require both a linked Reactive Resume and a job description. Drafting also works from the application and resume context available in the tracker.
<Warning>
Review AI-generated content before sending it. You are responsible for the final resume, cover letter, and follow-up message.
</Warning>
## Manage applications from an MCP client
You can also manage the Application Tracker from an MCP-compatible AI client. This lets an agent list applications, create new records, move stages, add notes, attach the PDFs you sent, and run Application Copilot without opening the web app.
For setup and prompt examples, see [Managing applications with MCP](/guides/managing-applications-with-mcp).
## Archive or delete applications
Archive an application to hide it from the active board without losing its history. Use the **Archived** toggle to see archived applications and unarchive them later.
Delete an application only when you no longer need its record. Deleting an application removes its timeline and cannot be undone.
You can also manage applications from an AI client over MCP. See [Managing applications with MCP](/guides/managing-applications-with-mcp).
@@ -1,106 +1,127 @@
---
title: "Undoing changes and version history"
description: "Undo and redo edits with keyboard shortcuts in the Reactive Resume builder, and restore an earlier snapshot from the version history menu."
description: "Undo recent edits in the Reactive Resume editor, save named versions, and preview or restore an earlier version of a resume or cover letter."
---
Reactive Resume keeps two layers of change history for every resume:
- **Undo and redo**: a live timeline of the changes you've made in the current builder session.
- **Version history**: server-side snapshots taken at meaningful moments, kept even after you close the builder.
Use undo for a quick correction. Use version history to jump back to an earlier editing snapshot, import, or AI/API edit.
Reactive Resume gives you two ways back. **Undo** reverses your last few edits while the resume is open. **History**
keeps saved versions of the document on the server, so you can look at yesterday's resume, or the one you sent to a
company, and bring it back.
## Undo and redo
Every change in the builder is undoable: typing, drag-and-drop reordering, template and layout switches, and edits applied by the AI assistant.
In the resume editor, undo steps back through your changes: typing, adding or deleting entries, moving sections,
template and design changes, custom styles, and edits you accept from the Assistant.
<Steps>
<Step title="Open your resume in the builder">
Undo history is scoped to the resume you have open.
</Step>
| Action | Mac | Windows and Linux |
| --- | --- | --- |
| Undo | <kbd>⌘</kbd> <kbd>Z</kbd> | <kbd>Ctrl</kbd> <kbd>Z</kbd> |
| Redo | <kbd>⌘</kbd> <kbd>Shift</kbd> <kbd>Z</kbd> | <kbd>Ctrl</kbd> <kbd>Shift</kbd> <kbd>Z</kbd> or <kbd>Ctrl</kbd> <kbd>Y</kbd> |
<Step title="Undo or redo">
Use either the toolbar buttons on the floating dock or a keyboard shortcut:
These shortcuts undo resume-wide changes when your cursor isn't in a text field. Inside a field, they undo your typing
in that field. Click outside the field first to undo a change such as a template switch.
| Shortcut | Action |
| --- | --- |
| `Cmd/Ctrl+Z` | Undo the last change |
| `Cmd/Ctrl+Shift+Z` | Redo the last undone change |
Many actions also show a message with an **Undo** button right after you make them, for example deleting an entry,
switching template, **Fit to one page** or **Reset to template defaults**.
Rapid typing collapses into a single step, so one undo removes a phrase rather than one letter.
</Step>
</Steps>
How undo behaves:
- **Typing groups into one step.** Edits to the same field less than a second apart undo together, so one undo
removes a phrase rather than a letter.
- **Up to 200 steps** are kept.
- **Undo lasts while the resume is open.** Reloading the page or opening the resume again starts a fresh undo history.
So does restoring a version, or a change arriving from somewhere else, such as another tab or an API client.
The cover letter editor has no document-wide undo. Use <kbd>⌘</kbd> <kbd>Z</kbd> inside the text you're editing, or
restore a version from History.
<Tip>
When your cursor is inside a text field, `Cmd/Ctrl+Z` falls back to your browser's native input undo, so you can undo
just the characters you typed. Click outside the field, or use the dock buttons, to undo builder-wide changes such as
a template switch.
Changes that couldn't be saved, for example because you went offline or closed the tab, are kept on your device. The
next time you open the resume, they come back and are saved, and the editor tells you it restored them.
</Tip>
Undo history lives in your browser for the current session. Reloading the builder clears it, so use version history for anything older.
## Open History
## Version history
On a desktop-width window, select the **History** icon (a clock) in the editor bar, next to the Assistant icon.
History opens in the **Share & export** panel on its **History** tab. On a narrower window, select **Share**, then the
**History** tab.
Reactive Resume snapshots your resume automatically:
<Frame caption="History lists Now at the top, then saved versions from newest to oldest">
<img src="/images/guides/undoing-changes-and-version-history/history-tab.webp" alt="The History tab of the Share & export panel: a field to name the current version, then a timeline with Now, a named version marked with a bookmark, an Editing session and Created" />
</Frame>
- when you import a resume;
- when the AI assistant or API applies edits;
- on periodic saves during editing, including template switches;
- when you restore a version.
Each version shows a title, when it was saved (for example "Today 14:02", "Yesterday 09:15" or a date), and how it was
saved. History shows the 100 most recent versions.
Snapshots are stored on the server, per resume, and are kept across sessions.
## What gets saved automatically
Reactive Resume keeps a rolling window of the 30 most recent snapshots for each resume. Periodic editing snapshots, including template changes, are throttled to at most one every two minutes. Imports, AI/API edits, and restores create their own checkpoints.
You don't need to save anything for History to work. Versions are added when:
### Open version history
| Title in History | Saved when | Kept |
| --- | --- | --- |
| **Created** / **Imported** | You create or import the resume. | Until you delete the resume |
| **Editing session** | You edit. Each visit to the editor keeps one version with its latest state, refreshed at most every two minutes. | 90 days |
| **AI edit** | A change arrives through the API, for example from an MCP client or another AI tool connected to your account. Edits you accept from the Assistant in the editor count as part of your editing session. | 90 days |
| **Sent to** *company* | An application linked to this resume first moves to **Applied**, **Screening**, **Interview** or **Offer**. | Until you delete the resume |
| **Before restore** | Just before you restore a version. | Until you delete the resume |
| **Restored a version** | Right after you restore a version. | 90 days |
| *Your name* | You save a named version. | Until you delete it |
Click the **clock** icon in the builder header, next to the resume name, to open the version history menu.
Resumes and cover letters both have History. A letter's versions work the same way; only the kinds that apply to
letters appear.
The menu lists recent snapshots newest first, each with a label describing what triggered it and a relative timestamp such as *2 hours ago*.
## Save a named version
### Restore a version
Name a version before a big change, or when you send the resume somewhere, so it's easy to find later.
<Steps>
<Step title="Open the version history menu">
Click the clock icon in the builder header.
<Step title="Open History">
Select the **History** icon, or **Share** then **History**.
</Step>
<Step title="Pick a snapshot">
Select the entry you want to restore. Reactive Resume asks you to confirm before replacing the current data.
<Step title="Type a name">
In **Name this version**, type a short name such as "Sent to Lumen" or "Before tailoring" (up to 80 characters).
</Step>
<Step title="Confirm the restore">
The resume is updated to the snapshot's contents and reloads in the preview.
<Step title="Save">
Select **Save**. The version appears in the timeline with a bookmark icon and the detail "named".
</Step>
</Steps>
Restoring is **non-destructive**: it writes the older snapshot back through the normal update path, so:
To rename or delete a named version, point to it, select **⋯**, then choose **Rename…** or **Delete**. Only named
versions can be renamed or deleted; the others are kept for as long as the table above says.
- your previous versions are still listed in the menu;
- the restore itself becomes a new snapshot;
- if you change your mind, you can restore the pre-restore version, or press `Cmd/Ctrl+Z` to undo the restore.
## Preview and restore a version
<Info>
Only the resume owner can list or restore versions. A locked resume cannot be edited or restored until you unlock it
from the dashboard.
</Info>
<Steps>
<Step title="Select a version">
Select any version in the timeline. The page shows that version, read-only, and a bar at the top of History says
which version you're viewing.
</Step>
<Step title="Restore it, or go back">
Select **Restore this version** to make it your current resume, or **Back to now** to leave it. Closing the panel
also takes you back to now.
</Step>
</Steps>
## Keep longer owner-managed history with Git
<Frame caption="Previewing a named version: the page shows it read-only until you restore it or go back to now">
<img src="/images/guides/undoing-changes-and-version-history/history-viewing-a-named-version.webp" alt="The History tab with a dark bar reading Viewing Today 01:44 AM · Original for game studios · read-only, with Restore this version and Back to now buttons, and the named version selected in the timeline" />
</Frame>
In-app version history and Git backups solve different problems:
Restoring never throws anything away. Before it replaces your resume, Reactive Resume saves the current state as
**Before restore**, then adds **Restored a version** after it. To undo a restore, restore **Before restore**.
- **In-app version history** is automatic, stored by Reactive Resume, and limited to the 30 most recent rolling snapshots for one resume.
- **Git history** contains only the JSON exports you choose to commit. It is stored in your own local repository, uses your commit messages, and follows the retention you choose.
<Frame caption="After a restore, the state you replaced is saved as Before restore">
<img src="/images/guides/undoing-changes-and-version-history/history-after-restoring.webp" alt="The History timeline after a restore: Now, Restored a version, Before restore, the named version, Editing session and Created" />
</Frame>
Git backup is manual. Reactive Resume does not create commits, synchronize with a repository, or upload files to a remote. To set up a local repository and recover a committed export as a new resume, see [Keep JSON backups in a local Git repository](/guides/exporting-your-resume#keep-json-backups-in-a-local-git-repository).
<Note>
Restoring clears the editor's undo history, so <kbd>⌘</kbd> <kbd>Z</kbd> can't reverse it. Use **Before restore**
instead. A locked resume can't be restored over; select **Unlock editing** in the document menu first.
</Note>
## Which to use when
A version holds the whole resume: content, design, custom styles and private notes. Its public link settings aren't
part of it.
| Situation | Use |
| --- | --- |
| You typed a wrong word or moved an item you didn't mean to. | Undo (`Cmd/Ctrl+Z`) |
| You just switched templates and want the old one back. | Undo; version history can help only after a periodic editing snapshot captures the switch. |
| You imported a resume and want to compare with what you had before. | Version history |
| The AI assistant applied edits you no longer want. | Undo the batch, or restore the pre-AI snapshot. |
| You closed the browser and want to roll back yesterday's changes. | Version history |
| You want selected backups beyond the 30-snapshot rolling window. | Export JSON and commit it to your own Git repository. |
## Related guides
- [Tracking job applications](/guides/tracking-job-applications): applications keep the exact version you sent.
- [Using the Assistant](/guides/using-the-assistant): accepted edits can be undone like any other change.
- [Keyboard shortcuts](/guides/keyboard-shortcuts): every editor shortcut in one place.
+61 -30
View File
@@ -1,41 +1,72 @@
---
title: "Updating your profile"
description: "Update your Reactive Resume profile information, including your display name, username, email address, and profile picture from account settings."
description: "Change your account photo, name, username, email address and password in Reactive Resume's Settings, and learn what each change affects."
---
Your profile is the name, photo, username and email tied to your account. You can change any of them in **Settings → Account**. This page also covers changing your password.
<Note>
Your profile is separate from your resumes. Changing your account name or photo does not change the name or picture on any resume. Those live in each resume's **Basics** section.
</Note>
## Open your profile
Select your name at the bottom of the sidebar, then **Settings**. **Account** opens first, with **Profile** at the top.
On a phone, **Settings** opens a short list first. Tap **Account**.
<Frame caption="The Profile section in Settings → Account">
<img src="/images/guides/updating-your-profile/profile-section.webp" alt="The Profile section with an initials avatar, a Change photo button, Name and Username fields, and an Email field with a hint about confirmation" />
</Frame>
## Change your name, username or email
Click a field, type the new value, then press <kbd>Enter</kbd> or click anywhere else. The change saves as soon as you leave the field. Press <kbd>Esc</kbd> before leaving to undo what you typed.
If a value can't be saved, it stays in the field with the reason underneath, for example when a username is already taken.
- **Name**: up to 64 characters. Shown in the app, not on your resumes.
- **Username**: 3 to 64 characters, using lowercase letters, numbers, dots, hyphens and underscores. The field shows your site address in front of it, because the username is part of every public resume link.
- **Email**: see below. Changing it takes an extra step.
<Warning>
Changing your username changes the address of every public resume. Links you have already shared, such as the one on a job application, stop working. Share the new links after the change.
</Warning>
### Confirm a new email address
When you change **Email**, Reactive Resume sends a confirmation link to the new address and shows a message saying so. Your account keeps the old address until you open that link. Check the new inbox, including spam, and follow the link to finish.
If your current address isn't verified yet, the hint under the field offers **Not verified yet. Resend the link**. On self-hosted copies without email delivery, the hint says the address can't be verified instead.
## Change your photo
Select **Change photo** and choose an image. It uploads right away and replaces your initials across the app. Images up to 10 MB work; the site usually shrinks them to fit 800 × 800 pixels. Select **Remove** to go back to your initials.
## Change your password
<Steps>
<Step title="Sign in to the dashboard">
Head over to [https://rxresu.me](https://rxresu.me) and sign in with your account credentials.
<Tip>
If you haven't created an account yet, follow the guide on [Creating an account](/guides/creating-an-account).
</Tip>
<Step title="Open the password dialog">
In **Sign-in & security**, next to **Password**, select **Change**.
</Step>
<Step title="Navigate to Profile settings">
Open <Badge>Settings</Badge> from your avatar and choose <Badge>Account</Badge>. Your name, username, email and photo are under **Profile**, and each change saves when you leave the field.
</Step>
<Step title="Update your information">
On the Profile page, you can update the following information:
- **Name**: Your full name as it appears in your account
- **Username**: Your unique username (used in public resume URLs)
- **Email Address**: Your account email address
<Warning>
If you update your email address, you will receive a verification link on your current email address. The change will only be accepted after you click on the verification link.
</Warning>
<Step title="Enter your current and new password">
Fill in **Current Password** and **New Password**. The new password must be different from the current one and at least 8 characters long.
</Step>
<Step title="Verify email changes (if applicable)">
If you've updated your email address, check your current email inbox for a verification link. Click on the link to confirm the email change.
<Tip>
Check your spam folder if the verification email isn't in your inbox. The email address change only completes after you click the link.
</Tip>
<Step title="Select Update Password">
A message confirms the change. You stay signed in on this device.
</Step>
</Steps>
<Frame caption="The Update your password dialog">
<img src="/images/guides/updating-your-profile/update-password-dialog.webp" alt="The Update your password dialog with Current Password and New Password fields and an Update Password button" />
</Frame>
If you signed up with a social account, the **Password** row reads **You sign in without one**, and the button says **Set a password**. It takes you to the password reset page, where you can have a link emailed to you to create one.
## Related guides
- [Linking social accounts](/guides/linking-social-accounts): sign in with Google, GitHub or LinkedIn.
- [Changing appearance and language](/guides/changing-appearance-and-language): theme and interface language.
- [Filling in your details](/guides/filling-in-your-details): the name, photo and contact details on a resume.
-151
View File
@@ -1,151 +0,0 @@
---
title: "Using the AI Agent workspace"
description: "Start an isolated AI draft in the Reactive Resume Agent workspace, chat with the agent, review proposed resume patches, and resume prior threads."
---
The AI Agent workspace is where you work with an AI assistant on a resume draft. It keeps the conversation, the tool activity, and a read-only resume preview in one full-screen view.
<Info>
Agent threads edit an AI draft copy of your resume. Your original resume is not changed when you start from an existing resume.
</Info>
## Before you start
You need at least one AI provider that is tested and enabled in **Settings → AI & developer**. For setup, see [Using artificial intelligence](/guides/using-ai).
If you self-host Reactive Resume, the agent workspace also requires the server-side agent configuration described in [Self-hosting with Docker](/self-hosting/docker).
## Open the agent workspace
From the dashboard sidebar, click **Agents**.
The agent page always shows your thread sidebar. Use it to continue an existing thread, or click **New thread** to start another one.
You can also open the agent from the builder dock. When you do this, the current resume is preselected in the new thread setup screen.
<Tip>
Press `Cmd/Ctrl+K` from anywhere in the app to open the command palette. Select **Threads** to search existing threads by title, resume, or provider, or run **New Thread** to jump straight to the setup screen.
</Tip>
## Start a new thread
<Steps>
<Step title="Choose an agent model">
Pick the provider/model combo the agent should use. This choice is locked once the thread starts.
</Step>
<Step title="Choose a resume draft">
Select an existing resume to duplicate as an AI draft, or choose **Create from scratch** for a blank draft.
</Step>
<Step title="Start the thread">
Click **Start Thread** to create the draft and open the workspace.
<Frame caption="Starting an AI Agent thread">
<img
src="/images/guides/using-ai-agent/screenshot-1.webp"
alt="AI Agent new thread setup with model and resume selectors"
/>
</Frame>
</Step>
</Steps>
## Use the three-pane workspace
The desktop workspace is split into three panes:
- **Threads** on the left: continue, archive, delete, or start agent threads.
- **Chat** in the center: send prompts, upload files, answer agent questions, and review tool activity.
- **Resume** on the right: read the current AI draft, adjust zoom, open it in the builder, or download a PDF.
<Frame caption="AI Agent workspace with chat and resume preview">
<img
src="/images/guides/using-ai-agent/screenshot-2.webp"
alt="AI Agent workspace showing thread sidebar, chat, and resume preview"
/>
</Frame>
On smaller screens, the workspace uses tabs/sheets so you can switch between threads, chat, and preview without losing the active conversation.
## Ask for resume changes
The agent works best with concrete instructions:
- "Tailor this resume to this job description: `https://example.com/job`"
- "Find weak bullets and rewrite them with stronger outcomes."
- "Compare this draft against a product manager role and update the keywords."
- "Ask me before changing anything that looks uncertain."
You can attach files or images from the composer. The agent reads uploaded attachments when they are relevant to your request.
For supplied text, paste the content directly into the chat. Plain text, Markdown, and JSON attachments are available to the agent as extracted text. Images and supported files such as PDFs are passed directly to the selected provider when it can use them. If an attachment format is unsupported by the selected provider, paste the relevant text instead.
<Note>
Text input is supported. Voice input is not supported in the agent workspace yet.
</Note>
## Tailor a resume to a supplied job description
Use this controlled workflow to test tailoring without relying on live web research:
<Steps>
<Step title="Set up an AI provider">
In **Settings → AI & developer**, configure a supported AI provider, test it, and make sure it is enabled. Then return to **Agents**.
</Step>
<Step title="Open a sample resume draft">
Start a new thread and select a resume containing sample experience data. The agent creates an isolated AI draft, so the source resume remains unchanged.
</Step>
<Step title="Supply the target role">
Paste this sample job description into the chat:
```text
Target role: backend engineer. Required: TypeScript and PostgreSQL.
```
Then ask: "Tailor the existing experience for this role. Do not invent qualifications or experience."
</Step>
<Step title="Review the draft">
Review the updated draft. To approve patches before they are applied, inspect their JSON, or restore an earlier state, follow [Review edits and patches](#review-edits-and-patches).
</Step>
</Steps>
This workflow also works when the selected provider/model has no live web search. Supplying the job description gives the agent the context it needs for ordinary resume editing.
## Review edits and patches
By default, the agent applies resume patches immediately to the AI draft. Turn on **Review edits** in the thread menu if you want to approve or deny patches before they are applied. Applied patches appear in chat as a small **Patch applied** line.
Open the line to inspect the raw JSON Patch and use **Restore** if you want to roll the draft back to the state before that patch. Restoring an older patch also rolls back patches applied after it.
<Warning>
AI-generated changes can still be inaccurate. Review the draft in the preview or builder before exporting or sharing it.
</Warning>
## Answer agent questions
If the agent needs a decision, it may show a question card with recommended answers. Click the answer you want to send it back to the agent.
That happens when your instructions are ambiguous, job context is missing, or a change depends on your preference.
## Use the resume preview
The resume pane is read-only. Use the toolbar to:
- decrease or increase zoom;
- set an exact zoom percentage;
- open the AI draft in the builder;
- download the draft as a PDF.
Zoom settings are remembered across refreshes.
## Manage threads
Threads are ordered by the newest message. Use the thread menu to archive or delete a thread.
- **Archive** keeps the conversation but makes the thread read-only.
- **Delete** removes the thread conversation and its attachments. The generated resume draft remains in your dashboard.
Threads can also become read-only if the working resume is deleted, the selected provider is deleted, or the thread is archived. If a provider is disabled or no longer tested, re-enable and test it before sending new messages.
-76
View File
@@ -1,76 +0,0 @@
---
title: "Using AI in the builder"
description: "Chat with the built-in AI assistant in the builder to review proposed resume changes before applying them, and add an optional AI review to the ATS check."
---
Reactive Resume includes two AI-assisted builder workflows:
- The **AI assistant** opens as a side panel in the builder, scoped to the open resume, so you can chat and apply edits inline.
- The **ATS Check** section can add an optional AI review of your writing on top of its deterministic report.
<Info>
These features require a tested and enabled AI provider in **Settings → AI & developer**. For setup, see
[Using artificial intelligence](/guides/using-ai).
</Info>
## Review the writing from the ATS check
The **ATS Check** section in the right sidebar runs without AI: its checks are deterministic and run in your browser. Once a deep check has produced a report, it offers an optional AI review of the writing: weak phrasing, bullets that describe duties rather than outcomes, and where a rewrite would land better.
The review sends the text already extracted from your rendered PDF to the provider you pick, and returns no score. See [Using the ATS checker](/guides/using-the-ats-checker).
## Open the AI assistant
Click the **Sparkle** button in the builder header, next to the resume name, to open the assistant.
The assistant opens as a side panel next to your resume. It uses the same chat interface as the AI Agent workspace, but stays scoped to the resume you are editing. Its edits land in the builder immediately, appear in the preview, and are captured in undo history and version history.
If AI is unavailable, the panel shows a link to **AI & developer** settings so you can configure a provider.
<Tip>
The Sparkle button is the in-builder assistant. The chat-bubble icon on the floating dock opens the full **AI Agent**
workspace in a new page, which suits longer, standalone conversations that create their own draft. See [Using the AI
Agent Workspace](/guides/using-ai-agent).
</Tip>
## Ask for targeted changes
The assistant works best when you ask for specific, incremental changes.
Good prompts:
- "Rewrite my summary for a senior frontend engineer role."
- "Tighten the bullets in my most recent job."
- "Add measurable impact to my project descriptions."
- "Adapt this resume for the job description below."
Avoid asking it to rewrite everything at once unless you are prepared to review many changes.
## Review proposals before applying them
When the assistant proposes edits, Reactive Resume shows a review card with:
- a proposal title and summary;
- badges for the proposed operations;
- before and after previews;
- the raw JSON Patch for users who want to inspect the exact operations.
You can:
- **Accept** one proposal;
- **Reject** one proposal;
- move between proposals with **Prev** and **Next**;
- **Accept all** or **Reject all** from the split-button menu.
Accepted edits are saved through the normal update path, so they show up in the preview, in undo history, and in version history. If you change your mind, use `Cmd/Ctrl+Z` or restore an earlier snapshot from the clock menu. See [Undoing changes and version history](/guides/undoing-changes-and-version-history).
<Warning>
Review AI proposals before accepting them. AI can introduce wording that is inaccurate, too generic, or not aligned
with your actual experience.
</Warning>
## When a proposal cannot be applied
A proposal can fail if the resume changed after the assistant generated it, if the resume is locked, or if the proposed patch no longer matches the current resume data.
If that happens, ask the assistant to regenerate the change from the latest version of the resume.
+124 -69
View File
@@ -1,94 +1,149 @@
---
title: "Using artificial intelligence"
description: "Configure an OpenAI, Anthropic, Gemini, OpenRouter, or Ollama provider to power AI edits, resume reviews, agent drafts, and PDF imports."
title: "Connecting an AI provider"
description: "Add your own AI provider key in Reactive Resume, test the connection, and choose which provider the assistant and other AI features use."
---
Reactive Resume uses AI providers for features such as AI-assisted resume changes, the optional AI review in the ATS checker, AI agent drafts, and PDF or Word imports.
Reactive Resume doesn't include an AI model of its own. To use the assistant, AI imports, drafting and the other AI features, you connect a provider you already have an account with (such as OpenAI, Anthropic or Google Gemini) using your own API key. Everything else in the app works without AI.
## Open AI provider settings
## Before you start
<Steps>
<Step title="Sign in to the dashboard">
Head over to [https://rxresu.me](https://rxresu.me) and sign in with your account credentials.
</Step>
<Step title="Open AI & developer settings">
Open **Settings** from your avatar and choose **AI & developer**.
<Frame caption="AI provider settings in AI & developer">
<img
src="/images/guides/using-ai/screenshot-1.webp"
alt="AI & developer settings showing AI provider configuration"
/>
</Frame>
</Step>
</Steps>
- Get an API key from your provider's dashboard. You pay the provider directly for what you use.
- Know which model you want to use, such as `gpt-4.1` or `claude-3-5-sonnet-latest`. Reactive Resume suggests a default for each provider, but your account may not have access to every model.
## Add a provider
In the **AI Providers** section, fill out the **Add Provider** form. The form is staged: pick a **Provider** and paste an **API Key** first. **Model** and **Base URL** sit behind the **Advanced settings** toggle, and you only need them for gateways, proxies, local providers, or OpenAI-compatible endpoints.
| Field | Description |
| --- | --- |
| **Label** | A name that helps you recognize the provider, such as `Work OpenAI` or `Personal OpenRouter`. |
| **Provider** | The provider type, such as OpenAI, Anthropic Claude, Google Gemini, Vercel AI Gateway, OpenRouter, Ollama, or OpenAI-compatible. |
| **API Key** | The key Reactive Resume should use when sending AI requests to that provider. |
| **Model** *(advanced)* | The exact model name expected by that provider. |
| **Base URL** *(advanced)* | The provider endpoint. Leave the default unless you use a gateway, proxy, local provider, or OpenAI-compatible endpoint. |
Click **Save Provider** when the form is complete. The connection is tested as part of the save, so the success or failure status appears right away.
<Frame caption="Saved AI provider in AI & developer">
<img
src="/images/guides/using-ai/screenshot-2.webp"
alt="AI & developer settings showing a saved and tested AI provider"
/>
</Frame>
<Warning>
Treat API keys like passwords. Anyone with a key can use the connected provider account and may incur costs.
</Warning>
## Test and enable a provider
After saving a provider, test it before using it.
<Steps>
<Step title="Click Test">
Reactive Resume sends a small request to verify the provider, model, base URL, and key.
<Step title="Open AI settings">
Select your name at the bottom of the sidebar, choose **Settings**, then choose **AI & developer**. You can also go to `https://rxresu.me/dashboard/settings/ai` directly. Self-hosted instances use their own address.
</Step>
<Step title="Review the status">
A successful provider is marked **Tested**. A failed provider is marked **Failed** and may show an error message.
<Step title="Start adding a provider">
Under **AI providers**, select **Add provider** (the dashed button below your saved providers).
</Step>
<Step title="Choose the provider and fill in the fields">
Pick your provider from the **Provider** list. Reactive Resume fills in that provider's usual **Model** and **Base URL** for you. Paste your key into **API key**, and change the model if you want a different one.
<Step title="Enable the provider">
Turn on **Use** for the tested provider you want Reactive Resume to use.
<Frame caption="The Add provider dialog">
<img src="/images/guides/using-ai/add-provider-dialog.webp" alt="Add provider dialog with Provider set to OpenAI, a hidden API key, Model gpt-4.1, Name Personal OpenAI and the default OpenAI base URL" />
</Frame>
</Step>
<Step title="Save and test">
Select **Save and test**. Reactive Resume saves the provider, then sends it a tiny request to check that the key, model and address work. If the test passes, the dialog closes and the provider is ready to use.
</Step>
</Steps>
<Info>
Only tested providers can be used for AI-assisted features.
</Info>
If the test fails, the dialog shows the provider's own error message, such as an invalid key or an unknown model. The provider is still saved, so you can fix it later with **Edit** instead of starting again.
## How credentials are stored
### The fields
AI provider credentials are encrypted on the server and are never shown again after saving. The settings page only shows a preview of the saved key.
| Field | What to enter |
| --- | --- |
| **Provider** | The company or service that runs the model. |
| **API key** | The key from your provider's dashboard. Required. |
| **Model** | The model name exactly as your provider writes it. Required. |
| **Name** | A label you'll recognize, such as "Work OpenAI". If you leave it empty, the provider's name is used. |
| **Base URL** | The address requests go to. Leave the default unless you use a gateway, a proxy or an OpenAI-compatible service. |
If provider management is unavailable, your self-hosted deployment may be missing required server configuration.
### Supported providers
| Provider | Default model | Default base URL |
| --- | --- | --- |
| OpenAI | `gpt-4.1` | `https://api.openai.com/v1` |
| Anthropic Claude | `claude-3-5-sonnet-latest` | `https://api.anthropic.com/v1` |
| Google Gemini | `gemini-2.0-flash` | `https://generativelanguage.googleapis.com/v1beta` |
| Vercel AI Gateway | `openai/gpt-4.1` | `https://ai-gateway.vercel.sh/v3/ai` |
| OpenRouter | `openai/gpt-4.1` | `https://openrouter.ai/api/v1` |
| Mistral AI | `mistral-large-latest` | `https://api.mistral.ai/v1` |
| Cohere | `command-a-03-2025` | `https://api.cohere.com/v2` |
| xAI Grok | `grok-4` | `https://api.x.ai/v1` |
| Groq | `llama-3.3-70b-versatile` | `https://api.groq.com/openai/v1` |
| DeepSeek | `deepseek-chat` | `https://api.deepseek.com/v1` |
| Together.ai | `meta-llama/Meta-Llama-3.3-70B-Instruct-Turbo` | `https://api.together.xyz/v1` |
| Fireworks | `accounts/fireworks/models/llama-v3p3-70b-instruct` | `https://api.fireworks.ai/inference/v1` |
| Cerebras | `llama3.3-70b` | `https://api.cerebras.ai/v1` |
| Perplexity | `sonar-pro` | `https://api.perplexity.ai` |
| Ollama Cloud | `llama3.1` | `https://ollama.com/api` |
| OpenAI-compatible | none, enter your own | none, enter your own |
Choose **OpenAI-compatible** for any other service that speaks the OpenAI API, such as a company gateway or LiteLLM. It needs both a model and a base URL.
The base URL must start with `https://` and point to a public address. On the hosted instance, that means a model running on your own computer (for example, a local Ollama) can't be connected. Self-hosters can allow local and `http://` addresses; see [Environment variables](/self-hosting/environment-variables).
## Test a provider again
Each saved provider appears as a row under **AI providers**, showing its name, model and the last four characters of the key. The row shows **Off** next to the name when the provider isn't in use.
<Frame caption="A provider after a successful test">
<img src="/images/guides/using-ai/provider-row-connected.webp" alt="AI providers section with one provider named Work gateway, model gpt-5-mini, and a Test button reading Connected · 40 ms, followed by the Add provider button" />
</Frame>
Select **Test** on a row to check it again. The button changes to **Connected** with the round-trip time (for example, **Connected · 420 ms**), or to **Failed** with the provider's error message underneath. A passed test turns the provider on; a failed test turns it off, so the app never uses a provider that isn't answering.
## Edit, turn off or delete a provider
Select **Edit** on a provider's row.
<Frame caption="Editing a saved provider">
<img src="/images/guides/using-ai/edit-provider-dialog.webp" alt="Edit dialog for a provider named Work gateway, with an empty API key field reading Leave empty to keep the saved key, the model, name and base URL fields, the Use this provider switch turned on, Delete provider and Save and test" />
</Frame>
- **Change the key, model, name or base URL**, then select **Save and test**. Leave **API key** empty to keep the saved key. Changing the key, model or base URL turns the provider off until the new test passes.
- **Turn it on or off** with **Use this provider**. Only a provider that passed its test can be turned on. A provider that is off stays saved but isn't offered anywhere in the app.
- **Delete it** with **Delete provider**. The provider and its stored key are removed right away, without a confirmation step.
<Warning>
AI provider management requires the server-side services used to encrypt credentials. If the page says provider
management is unavailable, check your deployment configuration before using AI features.
Deleting a provider can't be undone. Assistant conversations that used it become read-only until you pick another model in the conversation. Documents and edits you already accepted aren't affected.
</Warning>
## Where AI is used
## Which provider is used
After a provider is tested and enabled, you can use AI in:
You can save several providers, for example one per account or one per model.
- the optional **AI review** in the ATS Check section of the builder's right sidebar;
- **AI-assisted resume changes** from the builder;
- **Agent** workflows that create isolated AI drafts;
- **PDF and Microsoft Word imports** from the dashboard import dialog.
- The **assistant** starts new conversations with the provider you used most recently. You can switch models from the model menu in the assistant's header at any time. See [Using the assistant](/guides/using-the-assistant).
- **Check → Writing** lets you pick the provider for each review.
- Other AI features (reading Word and PDF files on import, **Improve selected line**, drafting a letter, and reading a pasted job posting) use the oldest provider you added that is turned on.
For the builder workflow, see [Using AI in the builder](/guides/using-ai-in-the-builder). For the dedicated agent workspace, see [Using the AI Agent workspace](/guides/using-ai-agent) and [AI Agent tools](/guides/ai-agent-tools). For AI-assisted imports, see [Importing resumes](/guides/importing-resumes).
## Connect from the assistant instead
If no provider is connected yet, opening the assistant in the editor shows **Connect an AI provider** with OpenAI, Anthropic and **Other · OpenAI-compatible**. Enter your key and model there and select **Connect**. It saves and tests the provider the same way as settings. For the other providers, use **AI & developer**.
<Frame caption="Connecting a provider from the assistant panel">
<img src="/images/guides/using-ai/assistant-connect-provider.webp" alt="Assistant panel showing Connect an AI provider, with OpenAI, Anthropic and Other · OpenAI-compatible options and a link to Settings for more providers" />
</Frame>
## How your key is stored
Your API key is encrypted on the Reactive Resume server with AES-256-GCM before it's saved, and it's never shown again. Settings only ever show the last four characters. When a feature needs the key, the server decrypts it just long enough to call your provider.
Self-hosted instances encrypt keys with the `ENCRYPTION_SECRET` environment variable. Until it's set, **AI & developer** shows "AI providers aren't available on this server until ENCRYPTION_SECRET is set." If the secret changes later, saved keys can no longer be decrypted and have to be entered again.
## What is sent to your provider
Requests go from the Reactive Resume server to the provider you chose, using your key. Nothing is sent until you use an AI feature, and each feature sends only what it needs:
| Feature | What is sent |
| --- | --- |
| Assistant | Your message, the open resume or letter (unless you remove it from the message), the job posting and your notes on the linked application (unless you remove the posting), attachments you add, and the earlier messages in the conversation. |
| **Improve selected line** | The line you're improving and the rest of that field. |
| **Check → Writing** | The text of your resume. |
| Importing a PDF or Word file | The file you import. |
| Drafting a letter | The linked resume and the application's job posting. |
| Adding an application | Job posting text you paste in. |
Your provider handles that data under its own terms and privacy policy. Reactive Resume keeps assistant conversations and their attachments in your account until you delete the conversation.
## Related guides
<CardGroup cols={2}>
<Card title="Using the assistant" href="/guides/using-the-assistant">
Ask for changes and review the edits it proposes.
</Card>
<Card title="Assistant tools" href="/guides/ai-agent-tools">
What the assistant can read and do in a conversation.
</Card>
<Card title="Checking your resume" href="/guides/checking-your-resume">
Get an AI review of your wording in Check mode.
</Card>
<Card title="Importing resumes" href="/guides/importing-resumes">
Turn an existing PDF or Word resume into an editable one.
</Card>
</CardGroup>
+40 -89
View File
@@ -1,104 +1,55 @@
---
title: "Using private notes"
description: "Use the private notes section in Reactive Resume to track job applications, company details, and other personal reminders for each resume."
description: "Keep private notes with a resume in Reactive Resume, such as where you sent it and what you changed. Notes never appear on the resume or its public page."
---
## What are private notes?
Every resume has a private notes area for anything you want to remember about it: where you sent it, who the recruiter
was, what you tailored, or links to job postings. Notes stay out of the resume itself.
The **Notes** section stores personal information about one resume. Nothing you write there appears on the resume itself, whether it is viewed publicly or exported as a PDF.
It is a notebook attached to each resume, where you can jot down anything relevant to your job search.
<Info>
Your notes are stored with that resume's data and are only visible to you when editing the resume.
</Info>
## Where to find it
In the resume builder, open the **right sidebar** and select **Notes** from the available sections.
<Frame caption="Screenshot of the Notes section in the right sidebar">
<img
src="/images/guides/using-private-notes/screenshot-1.webp"
alt="Screenshot of the Notes section in the right sidebar"
/>
</Frame>
## Use cases
Some practical ways to use them:
### Track job applications
Keep a record of where you've sent this particular resume:
- Company names and positions applied for
- Application dates and deadlines
- Recruiter or hiring manager contact information
- Application status (submitted, interviewing, offer, rejected)
### Save job description links
Paste links to the original job postings so you can quickly reference them when preparing for interviews or following up.
<Tip>
Job postings often come down once a position is filled. Copy the main requirements or responsibilities into your notes
as a backup.
</Tip>
### Interview preparation
Keep notes to help you prepare:
- Questions you want to ask the interviewer
- Key points to highlight from your experience
- Salary expectations and negotiation notes
- Company research and talking points
### Version control reminders
If you maintain multiple versions of your resume, use notes to remind yourself:
- What makes this version unique
- Which types of roles this resume is tailored for
- What was changed from your base resume
### Follow-up reminders
Track your follow-up schedule:
- When you last followed up with a company
- Next steps and deadlines
- Response notes from recruiters
## How to use it
## Write notes for a resume
<Steps>
<Step title="Open the Notes section">
In the resume builder, click on **Notes** in the right sidebar to expand the section.
<Step title="Open the document menu">
In the editor, select the resume's name at the top left. The document menu opens.
</Step>
<Step title="Write your notes">
Use the rich text editor to write your notes. You can format text with bold, italics, bullet points, and more.
</Step>
<Step title="Notes save automatically">
Your notes are saved automatically as you type. There's no need to click a save button.
<Step title="Select Notes">
Select **Notes**. The Notes dialog opens with the editor ready for typing.
</Step>
<Step title="Write your notes">
Type your notes. The toolbar under the text offers bold, italic, links, bulleted and numbered lists, and clear
formatting, and Markdown shortcuts such as `- ` for a list work too.
</Step>
<Step title="Close the dialog">
Notes save automatically as you type. Close the dialog when you're done.
</Step>
</Steps>
## Privacy guarantee
<Frame caption="The Notes dialog, opened from the document menu">
<img src="/images/guides/using-private-notes/notes-dialog.webp" alt="The Notes dialog with two paragraphs about sending the resume to Lumen Games and a follow-up date, above a formatting toolbar and a character count" />
</Frame>
<Warning>
Your notes are for your eyes only. They will **never** appear in your exported files, on your public resume URL, or
in a printed version of your resume.
</Warning>
## Who can see your notes
That makes it safe to store sensitive details: salary expectations, candid thoughts about an opportunity, or reminders you would not want an employer to see.
Notes are for you. They aren't printed on the resume, and they're left out of:
## Tips for effective note-taking
- the page preview and the downloaded PDF
- DOCX and Markdown exports
- your public resume page, for anyone who isn't you
- Use a similar format across all your resumes, so information is easy to find
- Add dates when you note an application submission or a follow-up
- Keep the notes specific to this version of the resume and the roles it targets
- Update them as your job search moves along
Two places do keep your notes, because they hold the whole resume:
- **JSON export.** The JSON file is a full copy of the resume's data, notes included. Remove them before you share
that file.
- **History.** Every saved version includes the notes as they were, and restoring a version restores its notes too.
## Notes for applications
If you're tracking where you applied, each application in **Applications** has its own notes, next to its stage,
contacts and interviews. Use application notes for things about one job, and resume notes for things about this
version of your resume, such as which roles it's tailored for. Cover letters don't have a notes area.
## Related guides
- [Managing an application](/guides/managing-an-application): notes, contacts and next steps for one job.
- [Undoing changes and version history](/guides/undoing-changes-and-version-history): name a version when you send the resume.
- [Formatting text](/guides/formatting-text): the text toolbar and Markdown shortcuts.
+172 -74
View File
@@ -1,98 +1,196 @@
---
title: "Using the API"
description: "Create Reactive Resume API keys, authenticate REST requests with bearer tokens, and integrate resume data into your own scripts, apps, or automations."
description: "Create a Reactive Resume API key, send authenticated REST requests to read and edit your resumes, and revoke keys you no longer need."
---
The Reactive Resume REST API lets your own scripts, extensions and automations read and change your documents and job applications. You authenticate with an API key that you create in Settings. This guide walks you through creating a key, making your first request and revoking the key when you're done.
## Before you start
- You need a Reactive Resume account. The examples use the hosted instance at `https://rxresu.me`. If you self-host, replace it with your own address.
- An API key acts as you. Anyone who has it can read and edit your documents, so treat it like a password.
## Create an API key
<Steps>
<Step title="Sign in to the dashboard">
Head over to [https://rxresu.me](https://rxresu.me) and sign in with your account credentials.
<Step title="Open AI & developer settings">
Select your name at the bottom of the sidebar, choose **Settings**, then open **AI & developer**. You can also press <kbd>⌘</kbd> <kbd>K</kbd> (<kbd>Ctrl</kbd> <kbd>K</kbd> on Windows and Linux) and type "API keys".
</Step>
<Step title="Open AI & developer settings">
Open <Badge>Settings</Badge> from your avatar and choose <Badge>AI & developer</Badge>. API keys are listed under **API keys**.
</Step>
<Step title="Open the API reference">
The endpoints, request format and authentication are described in the [API Reference](https://docs.rxresu.me/api-reference).
<Step title="Start a new key">
In the **API keys** section, select **New key**.
</Step>
<Step title="Name the key and choose when it expires">
Under **What's it for?**, enter a name that reminds you where the key is used, such as "Resume sync script". Under **Expires**, choose **30 days**, **90 days** or **Never**, then select **Create key**.
<Step title="Create a new API key">
Click <Badge>New key</Badge>. Fill in:
- **What's it for?**: A name to help you identify what you use this key for
- **Expires**: 30 days, 90 days or Never
<Frame caption="The New API key dialog">
<img src="/images/guides/using-the-api/new-api-key-dialog.webp" alt="New API key dialog with the name Resume sync script entered and 90 days selected under Expires" />
</Frame>
</Step>
<Step title="Copy the key">
Select **Copy**, store the key somewhere safe (a password manager or your deployment's secret store), then select **Done**.
<Step title="Copy the API key (important)">
The secret key is shown once, right after you create it. Copy it and store it somewhere safe.
<Frame caption="The key is shown once, right after you create it">
<img src="/images/guides/using-the-api/api-key-shown-once.webp" alt="New API key dialog showing the generated key with a Copy button and the warning Copy it now. For your security, it won't be shown again." />
</Frame>
<Warning>
For security reasons, your API key is only displayed once. If you lose it, you must create a new one.
Reactive Resume shows the key only once. If you lose it, revoke it and create a new one.
</Warning>
</Step>
<Step title="Authenticate requests with x-api-key">
To authenticate API requests, include your key in the <Badge>x-api-key</Badge> header.
<Info>
If you're self-hosting, replace <code>https://rxresu.me</code> with your instance URL. The API is served under <code>/api/openapi</code>.
</Info>
```bash
curl "https://rxresu.me/api/openapi/resumes" \
-H "x-api-key: YOUR_API_KEY"
```
</Step>
<Step title="Delete an API key (optional)">
In the API keys table, click <Badge>Revoke</Badge> next to a key.
<Warning>
A revoked key stops working immediately. Undo in the message that appears brings it back; once the message goes, the key is deleted for good.
</Warning>
</Step>
</Steps>
## Cover-letter REST endpoint migration
Your keys are listed in the **API keys** table with the date each was created, the date it was last used and when it expires. Expired keys disappear from the list and stop working.
Cover-letter REST operations now use `/cover-letters` resource paths and HTTP methods instead of the automatically generated `/coverLetters/*` POST endpoints. This is a **breaking change for REST clients**: the old REST URLs are no longer served and return `404`. There are no compatibility aliases.
<Frame caption="The API keys section in AI & developer settings">
<img src="/images/guides/using-the-api/api-keys-section.webp" alt="API keys table listing two keys, Claude Desktop that never expires and Resume sync script that expires on 29 Dec 2026, each with a Revoke button" />
</Frame>
All paths below are relative to `/api/openapi` on your instance. Authentication with `x-api-key` is unchanged.
## Make your first request
| Previous endpoint | Replacement endpoint |
| --- | --- |
| `POST /coverLetters/list` | `GET /cover-letters` |
| `POST /coverLetters/getById` | `GET /cover-letters/{id}` |
| `POST /coverLetters/create` | `POST /cover-letters` |
| `POST /coverLetters/update` | `PUT /cover-letters/{id}` |
| `POST /coverLetters/refreshStyle` | `POST /cover-letters/{id}/refresh-style` |
| `POST /coverLetters/duplicate` | `POST /cover-letters/{id}/duplicate` |
| `POST /coverLetters/delete` | `DELETE /cover-letters/{id}` |
| `POST /coverLetters/copyEmbedded` | `POST /cover-letters/from-resume` |
| `POST /coverLetters/export` | `GET /cover-letters/{id}/export` |
| `POST /coverLetters/import` | `POST /cover-letters/import` |
Update request inputs as well as the URL and method:
- Move `id` from the JSON body into the URL path wherever `{id}` appears. URL-encode the ID as a single path segment.
- For listing, send `search`, `resumeId`, `applicationId`, `limit`, and `offset` as query parameters, not a JSON body. The get-by-ID and export operations also have no request body.
- Keep the remaining inputs as JSON for POST, PUT, and DELETE requests, with `Content-Type: application/json`. In particular, `expectedRevision` remains required in the JSON body for update, refresh-style, and delete; refreshing style also requires `resumeId`.
- Create, copy-from-resume, and import keep their existing JSON inputs. Update still modifies only the supplied fields; it does not replace the entire document.
- Successful operations return `200`, including create and delete. Delete has an empty response body; do not expect `204` or parse a JSON document from it. Other response shapes are unchanged.
For example, list cover letters with query parameters:
The REST API lives under `/api/openapi` on your instance. Send your key in the `x-api-key` header.
```bash
curl --get "https://rxresu.me/api/openapi/cover-letters" \
-H "x-api-key: YOUR_API_KEY" \
--data-urlencode "search=Engineer" \
--data-urlencode "limit=20"
curl "https://rxresu.me/api/openapi/resumes" \
-H "x-api-key: YOUR_API_KEY"
```
If you generate an SDK, regenerate it from your instance's `/api/openapi/spec.json` after upgrading: operation IDs have changed too (for example, `coverLetters.getById` is now `getCoverLetter`). Self-hosted clients should use the spec from the version they are running.
The response is a JSON array of your resumes, without their full content:
This migration applies only to REST under `/api/openapi`. Existing oRPC clients under `/api/rpc` continue to use the same `coverLetters.*` procedure names and RPC protocol; do not apply the REST path or payload changes to them.
```json
[
{
"id": "01a0efa5-6529-745e-950a-521ef5b8afc7",
"name": "Game Developer Resume",
"slug": "game-developer-resume",
"tags": ["games"],
"isPublic": false,
"showDownloadButtons": true,
"isLocked": false,
"createdAt": "2026-09-30T00:09:49.101Z",
"updatedAt": "2026-09-30T00:09:49.101Z"
}
]
```
Fetch one resume with its full data, using an ID from the list:
```bash
curl "https://rxresu.me/api/openapi/resumes/01a0efa5-6529-745e-950a-521ef5b8afc7" \
-H "x-api-key: YOUR_API_KEY"
```
For request bodies, send JSON with `Content-Type: application/json`. For example, create a resume filled with sample content:
```bash
curl -X POST "https://rxresu.me/api/openapi/resumes" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "name": "Product Designer Resume", "tags": ["design"], "withSampleData": true }'
```
The response is the new resume's ID as a JSON string.
<Tip>
To change a few fields in a resume without sending the whole document, use [JSON Patch](/guides/using-the-patch-api).
</Tip>
## Find the endpoint you need
Every endpoint, with its parameters, request body and responses, is listed in the **API Reference** tab of these docs. Your own instance also serves the machine-readable OpenAPI document at `/api/openapi/spec.json` (for example `https://rxresu.me/api/openapi/spec.json`). Use the spec from the version you run when you generate a client.
| Area | Paths | What you can do |
| --- | --- | --- |
| Resumes | `/resumes`, `/resumes/{id}` | List, read, create, import, update, patch, lock, duplicate, move to Trash, set a sharing password, download a PDF, read version history and statistics |
| Cover letters | `/cover-letters` | List, read, create, update, duplicate, export and import letters, restore versions, refresh their design from a resume |
| Documents | `/documents` | Work across resumes and letters: rename, tag, lock, link to an application, move to Trash, restore, delete now |
| Applications | `/applications` | Track job applications: stages, notes, interviews, attached PDFs, bulk changes, import, statistics |
| AI | `/ai-providers`, `/ai`, `/agent` | Manage your AI providers, run AI tools such as resume import from PDF, work with assistant conversations |
| Account | `/auth/account/export`, `/auth/account` | Export your account data, delete your account |
`GET /api/health` (outside `/api/openapi`) reports whether the instance and its database and storage are healthy. It needs no key.
## Authentication methods
The API accepts three kinds of credentials:
1. `x-api-key: <key>`: an API key from Settings. Use this for scripts and servers.
2. `Authorization: Bearer <token>`: an OAuth access token, which MCP clients get when you connect them with OAuth. See [Using the MCP server](/guides/using-the-mcp-server).
3. The session cookie of a signed-in browser.
Send one of them. If a request has an `x-api-key` header, the API ignores any bearer token, so a wrong key isn't rescued by a valid token.
A request without valid credentials gets `401` with the code `UNAUTHORIZED`.
## Limits
| Limit | Value |
| --- | --- |
| Requests per API key | 1,000 per hour |
| Changes to one resume, document or application (create, update, patch, lock, duplicate, delete) | 300 per minute |
| PDF downloads of one resume (`GET /resumes/{id}/pdf`) | 5 per minute |
| AI requests | 20 per minute |
| Request body size on Vercel installations | 4.5 MB (see [Large RPC requests](/guides/large-rpc-requests)) |
When you hit a limit, the API responds with `429`. On a self-hosted installation, `FLAG_DISABLE_API_RATE_LIMIT` turns off the per-key limit together with the sign-in limits; the other limits stay on (see [Environment variables](/self-hosting/environment-variables)).
## Errors
Errors come back as JSON with a machine-readable `code`, the HTTP `status` and a `message`. Validation errors also include the failing fields in `data.issues`.
```json
{ "defined": false, "code": "NOT_FOUND", "status": 404, "message": "Not Found" }
```
Branch on `code` rather than on the message text.
## Revoke a key
<Steps>
<Step title="Find the key">
Open **Settings**, then **AI & developer**. In the **API keys** table, find the key you want to stop.
</Step>
<Step title="Revoke it">
Select **Revoke**. The key stops working at once, and a message confirms which key you revoked.
<Frame caption="Revoking a key shows an Undo action">
<img src="/images/guides/using-the-api/revoke-key-undo-toast.webp" alt="Message reading Revoked Claude Desktop. Apps using it stop working now, with an Undo link" />
</Frame>
</Step>
<Step title="Undo if you revoked the wrong key">
Select **Undo** in the message to turn the key back on. When the message closes, the key is deleted for good.
</Step>
</Steps>
## The RPC endpoint
The web app talks to the server through oRPC at `/api/rpc`, using the same procedures, authorization and validation as the REST API. It uses oRPC's own wire format, and its procedure names follow the app's source code rather than a published contract. For integrations, use the REST API under `/api/openapi`, which has a documented, generated specification.
## Changes from v5
If you built against the v5 API, check these changes:
- **Structured dates.** Dated entries have a `dates` object (`start`, `end`, `present`). The text fields `period` and `date` are still returned, but the server rewrites them from `dates` on every save, so writing only the text has no effect. See [Using the patch API](/guides/using-the-patch-api#dates).
- **Cover letters are their own documents.** Resumes no longer hold cover letters. Use the `/cover-letters` endpoints. If you send a resume that still contains a cover-letter section (for example an old export), the server saves each letter as a separate cover letter and removes the section from the resume.
- **No cover-letter PDF from resumes.** `GET /resumes/{id}/pdf` only accepts `target=resume` (or no target). Old signed download links that ask for a cover letter return `404`.
- **Delete moves to Trash.** `DELETE /resumes/{id}` and `DELETE /cover-letters/{id}` move the document to Trash for 30 days. Use the `/documents/restore` and `/documents/purge` endpoints to bring it back or delete it at once.
- **Application stages.** The `rejected` stage and the `archived` flag are gone. Close an application with the `closed` stage and a `closedReason` (`not-selected`, `withdrew`, `accepted-other` or `no-response`).
- **Resume versions.** Versions have a `kind` and an optional `name` instead of a free-text label.
Self-hosters upgrading an installation can read [Upgrading to v6](/self-hosting/upgrading-to-v6).
## Related guides
<CardGroup cols={2}>
<Card title="Using the patch API" href="/guides/using-the-patch-api">
Change individual fields of a resume with JSON Patch.
</Card>
<Card title="Using the MCP server" href="/guides/using-the-mcp-server">
Let AI clients such as Claude or Cursor work with your documents.
</Card>
<Card title="JSON resume schema" href="/guides/json-resume-schema">
The structure of resume data, for validation and code generation.
</Card>
<Card title="Large RPC requests" href="/guides/large-rpc-requests">
How large request bodies reach Vercel installations.
</Card>
</CardGroup>
+142
View File
@@ -0,0 +1,142 @@
---
title: "Using the assistant"
description: "Ask the AI assistant to improve your resume or cover letter, then accept or reject each edit it proposes. Nothing changes until you accept."
---
The assistant is an AI chat panel beside your document in the editor. It reads the resume or letter you have open, and the job posting when the document is linked to an application, then suggests changes as edits you accept or reject one at a time. It never changes your document on its own.
## Before you start
Connect an AI provider with your own API key. See [Connecting an AI provider](/guides/using-ai). If you open the assistant before connecting one, it offers to connect one on the spot.
## Open the assistant
In the editor, select **Assistant** (the sparkle button) in the editor bar, just before **Share**, or press <kbd>⌘</kbd> <kbd>J</kbd> (<kbd>Ctrl</kbd> <kbd>J</kbd> on Windows and Linux). Press it again, or select **Close the assistant** (×) in the panel, to close it.
<Frame caption="The assistant beside a resume, ready for a first request">
<img src="/images/guides/using-the-assistant/assistant-beside-the-page.webp" alt="Resume editor with the Assistant panel open on the right, showing What should we work on? and three suggestions: Find weak bullets, Tighten to one page and Draft a summary" />
</Frame>
On wide screens the assistant opens as a third column. On smaller laptops it takes the place of the left panel, on tablets it slides in as a drawer, and on phones it fills the screen.
You can also reach it from elsewhere:
- In the command bar (<kbd>⌘</kbd> <kbd>K</kbd>), type a question and choose **Ask the assistant**. Outside the editor, this opens the document you edited last and sends the question there. See [Using the command bar](/guides/using-the-command-bar).
- On an application, **Prepare for next step** opens its linked resume or letter with the assistant and suggestions such as **How well do I fit this role?**, **Draft a follow-up email** and **Prepare me for the interview**. See [Managing an application](/guides/managing-an-application).
## Ask for a change
<Steps>
<Step title="Pick a suggestion or write your own">
A new conversation starts with a few suggestions, such as **Find weak bullets**, **Tighten to one page** and **Draft a summary** for a resume, or **Make the opening stronger** and **Make it shorter** for a letter. When the document is linked to an application, **Tailor to the … posting** appears first.
Or type in the box (**Ask, or describe a change…**) and press <kbd>Enter</kbd>. Use <kbd>Shift</kbd> <kbd>Enter</kbd> for a new line.
</Step>
<Step title="Let it read and reply">
The assistant reads your document, then answers in a sentence or two and shows its suggestions as a set of proposed edits. You can keep editing your document while it works.
</Step>
</Steps>
Specific requests work best: "Rewrite my summary for a senior frontend role", "Make the bullets in my latest job lead with results", or "Shorten this letter to under 250 words". When you only ask a question, such as "Which bullet is the weakest?", the assistant answers without proposing edits.
## Review proposed edits
Each proposed edit shows where it lands (for example, **Summary · paragraph 1**), the current text struck through, the new text highlighted, and a short reason. The same change is marked on the page, and the section shows a **proposed** badge, so you can read it in place.
<Frame caption="A proposed edit, shown on the page and in the assistant">
<img src="/images/guides/using-the-assistant/proposed-edit-on-page.webp" alt="Resume editor where the summary on the page shows the old text struck through and the new text below it, with a banner reading 1 proposed edit on this page · nothing changes until you accept, and the matching card in the Assistant panel" />
</Frame>
<Frame caption="The proposed edit card">
<img src="/images/guides/using-the-assistant/proposed-edit-card.webp" alt="Card titled 1 proposed edit, with the location Summary · paragraph 1, the old summary struck through, the shorter new summary highlighted in green, the reason, and Accept and Reject buttons" />
</Frame>
- Select **Accept** to apply an edit, or **Reject** to dismiss it.
- When a set has more than one edit waiting, **Accept all** applies them together.
- With an edit focused, press <kbd>A</kbd> to accept, <kbd>R</kbd> to reject, and <kbd>↑</kbd> <kbd>↓</kbd> to move between edits.
Accepted edits show **Applied** and the set's title changes to, for example, **1 of 1 applied**. If you change a passage yourself before deciding, its edit shows **Out of date: the text has changed since.** Ask again to get a fresh suggestion.
The assistant only rewrites what your document already says. When a posting asks for something your document doesn't mention, it asks you first instead of inventing it.
## Undo an accepted edit
Accepting shows a toast, **Edit applied**, with **Undo**. You can also press <kbd>⌘</kbd> <kbd>Z</kbd> (<kbd>Ctrl</kbd> <kbd>Z</kbd>) like any other change, or restore an earlier version from History. An edit you undo becomes pending again in the conversation, so you can accept it later. See [Undoing changes and version history](/guides/undoing-changes-and-version-history).
## Answer a question
When the assistant needs a fact or a choice from you, it shows a blue question card with a few answers. Select one, or type your own under **Or in your own words…** and select **Send**. The assistant then continues with your answer.
<Frame caption="A clarifying question from the assistant">
<img src="/images/guides/using-the-assistant/clarifying-question-card.webp" alt="A request to add accessibility work, followed by a blue question card asking whether the user has done accessibility work, with the answers Yes, I have and No, skip it and a box to answer in your own words" />
</Frame>
## Choose what's shared with each message
Above the message box, chips show what goes with your next message: the document, and the job posting when the document is linked to an application. Once a conversation has started, select the **×** on a chip to leave it out of your next messages. Without the document, the assistant can't read or edit it for that message. The line under the box always says what will be sent and to which provider, and nothing is sent until you press send.
## Attach files
Once a conversation has started, select the paperclip in the message box to attach files, such as a job description PDF or your notes. Each file shows as a chip; select its **×** to remove it before sending.
- Plain text, Markdown and JSON files are read as text (up to the first 40,000 characters).
- Images, PDFs and MP3 or WAV audio are passed to the model directly. Whether the model can use them depends on your provider.
- Other file types are attached but not read. Paste the relevant text instead.
- You can attach up to 10 files per message, each up to 25 MB, and 100 MB per conversation.
<Note>
On self-hosted instances, attachments need S3-compatible or Vercel Blob storage. Local file storage can't hold them.
</Note>
## Search the web
With an **OpenAI** provider on its default base URL and a model that supports web search (such as `gpt-5`, `gpt-5-mini`, `gpt-4.1` or `o4-mini`), the assistant can look things up, such as a company or a public job page. The conversation shows **Searched the web**, and the reply lists its **Sources** as links. With any other provider or model, the assistant says it can't browse and asks you to paste what it needs.
## Switch models
The model chip in the assistant's header shows the model in use. Select it to switch to another connected provider for this conversation, or choose **Connect another…** to add one in settings.
<Frame caption="The model menu">
<img src="/images/guides/using-the-assistant/model-menu.webp" alt="Model menu open under the gpt-5-mini chip, listing the provider Work gateway with its model gpt-5-mini and a checkmark, and Connect another…" />
</Frame>
## Stop, retry or copy a conversation
- **Stop a reply** with the stop button that replaces send while the assistant is working, or press <kbd>Esc</kbd> in the message box. If it stopped before proposing anything, you'll see **Stopped. No edits were proposed.** with **Continue**.
- **When the provider returns an error**, your message is kept. Select **Retry**, or **Switch model** to try another provider.
- **Copy transcript** at the end of the conversation copies the messages as plain text, speaker by speaker, without the tool steps.
A single reply can run for about four minutes. If it hits that limit, the assistant says "Time limit reached. Your progress is saved. Ask me to continue."
## Past conversations
Each conversation belongs to one document. Opening the assistant continues that document's latest conversation. Select **New conversation** (the pencil) to start fresh, or **Past conversations** (the clock) to see earlier ones.
<Frame caption="Past conversations for this document">
<img src="/images/guides/using-the-assistant/past-conversations.webp" alt="Past conversations list under This document, showing three conversations titled by their first message, each with its time and outcome such as 1 of 1 edits accepted or no edits" />
</Frame>
Conversations are titled by your first message and show how many edits you accepted. Conversations about your other documents appear under **Other documents**; opening one takes you to that document. To delete a conversation, hover over it, select **×**, then confirm. Its messages and attachments are deleted, but edits you accepted stay in your document.
A conversation becomes read-only if its document is locked or deleted, or its provider was deleted. Unlock the document, or pick another model from the model chip, to continue.
<Info>
Replies stream while the conversation is open. On instances without Redis (some self-hosted setups), a reply that's still running when you reload the page can't be picked up again; its finished messages are still saved.
</Info>
## Related guides
<CardGroup cols={2}>
<Card title="Connecting an AI provider" href="/guides/using-ai">
Add, test and manage the providers the assistant uses.
</Card>
<Card title="Assistant tools" href="/guides/ai-agent-tools">
Everything the assistant can read and do.
</Card>
<Card title="Tailoring a resume for a job" href="/guides/tailoring-a-resume-for-a-job">
Link a resume to an application so the assistant sees the posting.
</Card>
<Card title="Writing a cover letter" href="/guides/writing-a-cover-letter">
Use the assistant on letters, too.
</Card>
</CardGroup>
+79 -33
View File
@@ -1,55 +1,101 @@
---
title: "Using the ATS checker"
description: "Check whether an applicant tracking system can read your resume PDF, from the free public page or from inside the builder, without uploading the file anywhere."
title: "Checking any resume PDF with the ATS checker"
description: "Find out whether applicant tracking software can read your resume PDF. Free, no account needed, and the file never leaves your browser."
---
The ATS checker answers one question: **can software read your resume?**
The ATS checker answers one question: can software read your resume? It opens a PDF the way an applicant tracking system (ATS) does, pulls out the text, and shows you what survived and what didn't. It works with a PDF made in any tool, not only Reactive Resume.
It opens your PDF the way a parser would, pulls the text out, and reports what survived and what did not. Everything runs in your browser. The file is never uploaded, nothing is stored, and no account is needed.
The check runs entirely in your browser. The file isn't uploaded or stored, and you don't need an account.
<Info>
Use it at [rxresu.me/ats-checker](https://rxresu.me/ats-checker), or from **Check** in the editor.
</Info>
## Before you start
## What it measures
- Have your resume as a PDF, up to 25 MB. Password-protected PDFs can't be checked; save an unprotected copy first.
- Optionally, copy the text of a job posting you're applying for.
- Whether the file carries real text, or is a picture of one.
- Whether the text extracts in the order a person reads it, which is where multi-column layouts usually fail.
- Whether your name, email, phone number, links, and dates survive extraction intact.
- Whether the conventional sections are present and can be told apart.
- Whether the file itself is readable: fonts, encryption, forms, size, page geometry.
## Check your PDF
Optionally, paste a job description and it will tell you which of the posting's terms already appear in your resume.
<Steps>
<Step title="Open the checker">
Go to [rxresu.me/ats-checker](https://rxresu.me/ats-checker). If you host Reactive Resume yourself, add `/ats-checker` to your own address.
</Step>
<Step title="Paste a job posting (optional)">
Paste the posting into **Job posting**. The report then shows which of its terms your resume already has. Do this before you add the file.
</Step>
<Step title="Add your PDF">
Drag the file onto the box, or select **Drop a PDF here or choose a file** to pick it. To see how the checker works first, select **Check a sample file**.
## What it does not measure
<Frame caption="The drop zone and the optional job posting">
<img src="/images/guides/using-the-ats-checker/drop-zone-and-posting.webp" alt="Drop zone reading Drop a PDF here or choose a file, Up to 25 MB, checked in your browser, never uploaded, with a Check a sample file button and an empty Job posting box below" />
</Frame>
</Step>
<Step title="Wait for the three steps">
The checker shows its progress: **Opening the file**, **Reading the text**, then **Checking layout and content**. This usually takes a few seconds.
</Step>
</Steps>
<Warning>
No tool can tell you whether an application will be rejected. That depends on the role, the screening questions, and
the person reading. Anything that claims otherwise is guessing.
</Warning>
## Read the report
The checker deliberately does not:
The report has the score and issues on the left and your file on the right.
- repeat the widely quoted claim that most resumes are discarded automatically, because that figure comes from marketing copy rather than research;
- enforce a one-page rule;
- treat a font choice, a photo, or an employment gap as a defect.
<Frame caption="A finished check">
<img src="/images/guides/using-the-ats-checker/checker-result.webp" alt="ATS checker results page with a score of 88, Reads cleanly, issue rows for Readability, Layout and Terms from the posting, a Fix these in the editor button, and the sample resume PDF on the right" />
</Frame>
Employment gaps, writing style, and length are reported as **unscored tips**. They never move the score.
**The score.** A number from 0 to 100 with a verdict: **Reads cleanly** (80 and above), **Mostly readable** (50 to 79) or **Hard for software to read** (below 50). It combines five categories, and a serious problem (a blocker) caps it: a PDF with no real text can't score well because its margins are tidy. The score reflects how reliably text comes out of the file, not your chances of getting the job.
## Reading the report
**The issue rows.** Each category with something to fix gets a row, worst first. Open a row to see each problem in bold, followed by what to do about it. If you pasted a posting, the last row, **Terms from the posting**, counts the terms found (for example 4/14) and lists the missing ones.
**A score from 0 to 100.** It is the weighted result of five categories: readability, layout, sections, contact details, and dates. A blocking problem puts a hard ceiling on it: a file with no text layer cannot score well just because its margins are tidy. The score reflects how reliably text is extracted, not your chances.
<Frame caption="The score, issue rows and the fix card">
<img src="/images/guides/using-the-ats-checker/report-and-fix.webp" alt="Score of 88 with the Readability row open, listing a ligature problem and icon-font glyphs with their fixes, then Layout and Terms from the posting rows and the Fix these in a few minutes card" />
</Frame>
**What could cost you a match.** Each category with something to fix opens to say what went wrong and what to do about it. If you pasted a job posting, a last row counts the posting's terms your resume already has and lists the missing ones.
The five scored categories are:
**Your file, two ways.** **Original page** shows the PDF as a person sees it. **As software reads it** shows the text a parser extracts, in the order it comes out, so you can see a sidebar landing in the middle of your experience or icons turning into boxes.
| Category | What it checks |
| --- | --- |
| **Readability** | Whether software can recover the words at all: a real text layer rather than a picture, fonts that map to letters, no hidden text, encryption or form fields in the way, and a sensible file and page size. |
| **Layout** | Whether the page geometry keeps the reading order: columns, tables, lines stored out of order, tight spacing, very small text and narrow margins. |
| **Sections** | Whether the resume is split into sections software expects. |
| **Contact details** | Whether a recruiter can reach you: name, email, phone and links survive intact. |
| **Dates** | Whether your timeline can be reconstructed from the dates. |
## Fixing the issues
The checker's start page also lists **Writing**: advice for the person reading your resume, such as numbers that show impact, first-person pronouns and long bullets. It never affects the score, and the results page doesn't show it. To see that advice, import the file (see below) and use **Also check the exported PDF** in [Check](/guides/checking-your-resume#check-the-exported-pdf).
**Fix these in the editor** imports the same file into a free Reactive Resume and opens it in **Check**, with the same issues waiting there. If you aren't signed in, you create an account first; the file waits in your browser meanwhile and is imported as soon as you're back. It's read in your browser, as the check was.
Only the first 30 pages of a long file are checked; the report says so when that happens.
## Checking from the editor
## See your file as software reads it
**Check** in the editor runs the same kind of checks as you type, against your resume rather than a file, and pins each issue to its line. **Deep check** renders your resume to a PDF in your browser and runs the full file check against those bytes, which is the same file a recruiter would receive.
Above your file, switch between two views:
For a review of the writing itself, use **Check → Writing**, which asks your own AI provider for suggested rewrites. See [Using Artificial Intelligence](/guides/using-ai).
- **Original page** shows the PDF as a person sees it.
- **As software reads it** shows the plain text a parser extracts, in the order it comes out.
Compare the two. Look for a sidebar landing in the middle of your experience, contact details split across lines, or icons turning into empty boxes.
<Frame caption="As software reads it: icons from an icon font come out as empty boxes">
<img src="/images/guides/using-the-ats-checker/as-software-reads-it.webp" alt="Plain text extracted from the sample resume in a monospace font, with empty box characters where the section icons were" />
</Frame>
## Fix the issues in Reactive Resume
Select **Fix these in the editor** to import the same file into a free Reactive Resume account. The file is read in your browser, the same way the check read it, and the new resume opens in **Check** with the issues waiting for you.
- **If you're signed in,** the import starts straight away.
- **If you aren't,** you're taken to create an account first. The file waits in your browser in the meantime and is imported as soon as you're back, then removed from the browser.
To start over with a different file, select **Check another file**.
<Note>
No tool can tell you whether an application will be rejected. That depends on the employer's system, the screening questions and the person reading. The checker measures one thing: how faithfully software can extract your file's text.
</Note>
## Related guides
<CardGroup cols={2}>
<Card title="Checking your resume before you apply" href="/guides/checking-your-resume">
Check mode in the editor: live checks, job match and a writing review.
</Card>
<Card title="Importing resumes" href="/guides/importing-resumes">
Bring an existing resume into Reactive Resume from a PDF, Word or JSON file.
</Card>
</CardGroup>
-76
View File
@@ -1,76 +0,0 @@
---
title: "Using the builder dock"
description: "Use the builder dock for undo and redo, zoom controls, page stacking, opening the AI Agent, and copying the public resume URL."
---
The builder dock is the floating toolbar at the bottom of the resume builder. It holds undo and redo, preview controls, the AI Agent workspace, and the resume's public URL, so you can reach them without leaving the canvas.
<Frame caption="Resume builder with the floating dock">
<img
src="/images/guides/using-the-builder-dock/screenshot-1.webp"
alt="Resume builder showing the floating dock with undo, redo, zoom controls, page stacking toggle, AI agent and copy URL buttons"
/>
</Frame>
## Undo and redo
The dock starts with **Undo** and **Redo** buttons. They apply to every change in the builder: typing, drag-and-drop, template switches, layout changes, and AI edits.
You can also use keyboard shortcuts:
| Shortcut | Action |
| --- | --- |
| `Cmd/Ctrl+Z` | Undo the last change |
| `Cmd/Ctrl+Shift+Z` | Redo the last undone change |
Rapid typing collapses into a single undo step, so one undo removes a phrase rather than one letter.
<Tip>
When your cursor is inside a text field, the shortcut falls back to your browser's native input undo. Click outside the
field, or use the dock buttons, to undo builder-wide changes.
</Tip>
For longer-range recovery, such as jumping back to a template switch, an import, or an AI edit, see [Undoing changes and version history](/guides/undoing-changes-and-version-history).
## Zoom controls
Use the zoom controls to adjust the preview.
| Control | What it does |
| --- | --- |
| **Zoom out** | Decreases the preview zoom. |
| **Zoom level (%)** | Shows the current zoom. Opens a menu with **Actual size (100%)** and **Fit to view**. |
| **Zoom in** | Increases the preview zoom. |
Press `Cmd/Ctrl+0` to reset the zoom to fit.
Zoom only affects the editor preview. It does not change the exported PDF, DOCX, or JSON file.
## Toggle page stacking
Use the page-stacking button to switch between stacked pages (vertical) and side-by-side pages (horizontal). This only affects the editor preview.
## Open the AI Agent
Click the chat button to open the **AI Agent** workspace in a new page, pre-scoped to the current resume. The agent suits larger, standalone conversations that create their own draft.
For chatting about the open resume without leaving the builder, use the AI assistant in the builder header instead. See [Using AI in the builder](/guides/using-ai-in-the-builder).
## Copy the public URL
Click **Copy URL** to copy the resume's public URL.
The URL is based on your username and the resume slug:
```txt
https://rxresu.me/{username}/{slug}
```
<Warning>
Copying the URL does not make the resume public by itself. To allow visitors to open the link, enable public access in
the **Sharing** section of the right sidebar.
</Warning>
## Downloading your resume
Downloads are no longer on the dock. Use the primary **Download PDF** button in the builder header, or open the dropdown next to it for **DOCX**, **JSON**, and **Print**. See [Exporting your resume](/guides/exporting-your-resume).
+91
View File
@@ -0,0 +1,91 @@
---
title: "Using the command bar"
description: "Open the command bar with ⌘K to search your resumes and applications, jump to any page, change theme or language, or ask the assistant a question."
---
The command bar is a search box that runs commands. Use it to open a resume or application by name, jump to any page,
switch the theme or language, or send a question straight to the assistant, without reaching for the mouse.
<Frame caption="The command bar when it first opens">
<img src="/images/guides/using-the-command-bar/command-bar-root.webp" alt="The command bar with the placeholder &quot;Type a command or search…&quot; and three groups: Search for… with Resumes, Applications and Assistant conversations; Preferences with Change theme to… and Change language to…; and Go to… with Home, Documents and New document." />
</Frame>
## Open the command bar
Press <kbd>⌘</kbd> <kbd>K</kbd> on a Mac or <kbd>Ctrl</kbd> <kbd>K</kbd> on Windows and Linux. It works on every page,
including inside the editor. On **Documents**, **Applications** and **Settings**, you can also select **Search or
run…** at the top of the sidebar.
To close it, press <kbd>Esc</kbd> or press <kbd>⌘</kbd> <kbd>K</kbd> again.
## Run a command
<Steps>
<Step title="Type what you're looking for">
Start typing to filter the list. For example, type "theme" to find **Change theme to…**, or "trash" to find
**Trash**.
</Step>
<Step title="Pick a row">
Use <kbd>↑</kbd> and <kbd>↓</kbd> to move, then press <kbd>Enter</kbd>, or select the row with the mouse.
</Step>
<Step title="Start over if you need to">
Some rows open a second list, such as your resumes or the list of languages. To get back to the first list, press
<kbd>Esc</kbd> to close the command bar, then open it again.
</Step>
</Steps>
## What you can do
The command bar groups its rows by what they do. Rows that need an account appear or become available once you're
signed in.
### Search for…
| Row | What it does |
| --- | --- |
| **Resumes** | Lists your resumes, most recently edited first. Type to filter by name, then press <kbd>Enter</kbd> to open one in the editor. The first row, **Create a new resume**, opens the **New document** dialog. |
| **Applications** | Lists your job applications. Type a company or role to filter, then open one to see its details. **New Application** starts a new one. |
| **Assistant conversations** | Lists your past conversations with the assistant. Opening one takes you to its document with the conversation showing. |
### Preferences
| Row | What it does |
| --- | --- |
| **Change theme to…** | Choose **Light theme**, **Dark theme** or **Match system theme**. |
| **Change language to…** | Choose one of the 55 languages the app is available in. |
### Go to…
| Row | Where it goes |
| --- | --- |
| **Home** | The Reactive Resume home page. |
| **Documents** | Your resumes and cover letters. |
| **New document** | Opens the **New document** dialog. |
| **Trash** | Documents you moved to Trash. |
| **ATS Checker** | The public [ATS checker](/guides/using-the-ats-checker) for any PDF resume. |
| **Applications** | Your job application tracker. |
| **New Application** | Opens the dialog to add an application. |
| **Settings** | Opens a second list with **Account**, **Preferences** and **AI & developer**. |
## Ask the assistant
When you're signed in, anything you type also appears as a last row: **Ask the assistant "…"**, with your text in the
quotes. Choosing it sends your text to the [assistant](/guides/using-the-assistant).
<Frame caption="Type a request, then choose the Ask row">
<img src="/images/guides/using-the-command-bar/command-bar-ask.webp" alt="The command bar with &quot;Make my summary shorter&quot; typed in the search box and a single row under Ask: Ask the assistant &quot;Make my summary shorter&quot;." />
</Frame>
- **In the editor**, the question is about the document you have open. The assistant panel opens and sends it.
- **Anywhere else**, Reactive Resume opens the document you edited most recently, opens the assistant and sends your
question there. If you don't have any documents yet, it asks you to create a resume first.
The assistant needs an AI provider. If you haven't connected one, the assistant panel helps you set one up first. See
[Connecting an AI provider](/guides/using-ai).
## Related guides
- [Keyboard shortcuts](/guides/keyboard-shortcuts): the shortcuts for Documents, the editor and the assistant.
- [Managing documents](/guides/managing-documents): search, sort and organize your documents from their own page.
- [Changing appearance and language](/guides/changing-appearance-and-language): the same theme and language choices
in Settings.
+176 -306
View File
@@ -1,379 +1,249 @@
---
title: "Using the MCP server"
description: "Connect Reactive Resume to AI tools like Claude Desktop, Cursor, and Codex through the Model Context Protocol to edit and manage resumes via chat."
description: "Connect Claude, Cursor, Codex or any MCP client to Reactive Resume with OAuth or an API key, and see every tool, prompt and resource it offers."
---
The Reactive Resume MCP server lets you manage your resumes and job applications from any MCP-compatible AI tool: Claude Desktop, Cursor, Codex, and others. It connects to the Reactive Resume API and exposes tools for resume editing, Application Tracker workflows, and AI-assisted job application tasks, driven by natural language.
Reactive Resume runs a [Model Context Protocol (MCP)](https://modelcontextprotocol.io) server, so AI clients such as Claude, Cursor and Codex can read and edit your resumes, cover letters and job applications when you ask them to in plain language. This guide shows you how to connect a client and lists everything the server offers.
## What is MCP?
## Before you start
The [Model Context Protocol (MCP)](https://modelcontextprotocol.io) is a standard that lets LLM-powered tools connect to external services. Instead of being limited to the built-in chat UI, you can use any MCP client to interact with your resumes.
- You need a Reactive Resume account.
- Your MCP client must support remote servers over Streamable HTTP, or be able to run the [`mcp-remote`](https://www.npmjs.com/package/mcp-remote) bridge.
- Decide how the client signs in:
- **OAuth (recommended).** You approve the client in your browser. No secret is copied anywhere.
- **API key.** For clients that can't do OAuth but can send a custom header. Create a key first, as described in [Using the API](/guides/using-the-api).
## Prerequisites
## Find your server address
The server address is your instance's address followed by `/mcp`. On the hosted instance it's `https://rxresu.me/mcp`. You can copy it from **Settings** → **AI & developer**, in the **MCP server** section.
<Frame caption="The MCP server section in AI & developer settings">
<img src="/images/guides/using-the-mcp-server/mcp-server-settings.webp" alt="MCP server section showing the address https://rxresu.me/mcp with a Copy button and a Setup guide link" />
</Frame>
## Connect with OAuth
<Steps>
<Step title="Choose your authentication method">
Reactive Resume MCP supports two authentication methods:
- **OAuth2 (recommended):** best user experience for clients that support MCP OAuth.
- **API key (fallback):** works in all clients that can send custom headers.
Use OAuth2 whenever your MCP client supports it. Use API key only when OAuth is unavailable in that client.
<Step title="Add the server to your client">
Add a remote MCP server with the address `https://rxresu.me/mcp` and no headers. Client-specific steps are in [Set up popular clients](#set-up-popular-clients).
</Step>
<Step title="Sign in to Reactive Resume">
Your client opens a browser window. If you aren't signed in, Reactive Resume asks you to sign in first.
</Step>
<Step title="Approve the connection">
Check the application name under **Connect an application**, read what it will be able to do, and select **Allow access**. Select **Deny** if you don't recognize the application.
<Step title="If using API key, create one">
Head over to [https://rxresu.me](https://rxresu.me) (or your self-hosted instance), sign in, and navigate to **Settings → AI & developer**. Under **API keys**, click **New key**, give it a name, and copy the secret. It is shown only once.
For the full walkthrough, see [Using the API](/guides/using-the-api).
<Frame caption="The consent screen for a new MCP client">
<img src="/images/guides/using-the-mcp-server/oauth-consent.webp" alt="Connect an application screen for a client named Claude, listing access to resumes and job applications, profile information, email address and offline access, with Deny and Allow access buttons" />
</Frame>
</Step>
<Step title="Return to your client">
The browser hands control back to your client, which can now use the Reactive Resume tools.
</Step>
</Steps>
## Configuration
## Connect with an API key
There are two transport options, and each can use either OAuth2 or API key depending on your client capabilities.
### Method 1: Streamable HTTP (recommended)
If your client supports the `url` field (e.g. **Cursor**, **Codex**, Claude custom connectors), use this.
#### Option A: OAuth2 (recommended)
Most OAuth-capable clients only need the MCP URL:
```json
{
"mcpServers": {
"reactive-resume": {
"url": "https://rxresu.me/mcp"
}
}
}
```
Then connect/sign in from the client UI (or with the client's OAuth login command).
#### Option B: API key (fallback)
If OAuth is not supported in your client, send `x-api-key`:
If your client can't do OAuth, send your API key in the `x-api-key` header:
```json
{
"mcpServers": {
"reactive-resume": {
"url": "https://rxresu.me/mcp",
"headers": {
"x-api-key": "your-api-key"
}
"headers": { "x-api-key": "YOUR_API_KEY" }
}
}
}
```
### Method 2: mcp-remote
If your client only supports `command` / `args` (for example, local-only Claude Desktop config), use [`mcp-remote`](https://www.npmjs.com/package/mcp-remote) as a bridge. This requires [Node.js](https://nodejs.org) **20 or later**.
`mcp-remote` is most commonly used with API keys:
If your client only runs local commands, use `mcp-remote` as a bridge. It needs a current version of [Node.js](https://nodejs.org):
```json
{
"mcpServers": {
"reactive-resume": {
"command": "npx",
"args": ["mcp-remote", "https://rxresu.me/mcp", "--header", "x-api-key:your-api-key"]
"args": ["mcp-remote", "https://rxresu.me/mcp", "--header", "x-api-key:YOUR_API_KEY"]
}
}
}
```
<Info>Replace `your-api-key` with the API key you created in the prerequisites step.</Info>
<Warning>
An API key in a config file gives full access to your documents. Keep the file private, and revoke the key in Settings if it leaks.
</Warning>
### Where to put the config
## Set up popular clients
| Client | Config file |
| ----------------- | ------------------------------------------------------------------------------------------------ |
| Cursor | `.cursor/mcp.json` in your project or home directory |
| Claude Desktop | `claude_desktop_config.json` ([docs](https://modelcontextprotocol.io/quickstart/user)) |
| Codex | `~/.codex/config.toml` or `.codex/config.toml` ([docs](https://developers.openai.com/codex/mcp)) |
| Other MCP clients | Refer to the client's documentation |
<AccordionGroup>
<Accordion title="Claude (web, desktop and mobile)">
Add a custom connector with the URL `https://rxresu.me/mcp`, then connect it and approve access in the browser. See Anthropic's guide to [custom connectors](https://claude.com/docs/connectors/custom/remote-mcp).
</Accordion>
<Accordion title="Claude Code">
```bash
claude mcp add --transport http reactive-resume https://rxresu.me/mcp
```
## Authentication details (how Reactive Resume MCP works)
Then run `/mcp` inside Claude Code and choose **reactive-resume** to sign in.
</Accordion>
<Accordion title="Cursor">
Add the server to `.cursor/mcp.json` in your project, or `~/.cursor/mcp.json` for all projects:
Reactive Resume MCP accepts authentication in this order:
1. **Bearer token (OAuth2 access token)** via `Authorization: Bearer <token>`
2. **API key fallback** via `x-api-key: <key>`
If neither is valid, the MCP endpoint responds with `401` and advertises OAuth metadata using:
- `WWW-Authenticate: Bearer resource_metadata="<instance>/.well-known/oauth-protected-resource"`
OAuth-capable MCP clients use this to discover and complete the OAuth flow automatically.
### OAuth2 flow used by this server
Reactive Resume is configured as an OAuth authorization server for MCP clients:
- The MCP endpoint is `https://rxresu.me/mcp`.
- OAuth discovery metadata is exposed under `/.well-known/*` endpoints.
- The login/authorization route is `/api/auth/oauth`.
- If the user is not signed in, `/api/auth/oauth` redirects to `/auth/login`, then resumes OAuth.
- If the user is signed in, `/api/auth/oauth` uses the OAuth provider to validate the signed request, registered redirect URI, scopes, resource grants, and PKCE before issuing an authorization code, and redirects back to the client.
- PKCE parameters (`code_challenge`, `code_challenge_method`) are preserved in the authorization flow.
## Popular client setup
### Cursor
**OAuth2 (recommended):**
```json
{
"mcpServers": {
"reactive-resume": {
"url": "https://rxresu.me/mcp"
}
}
}
```
**API key fallback:**
```json
{
"mcpServers": {
"reactive-resume": {
"url": "https://rxresu.me/mcp",
"headers": {
"x-api-key": "your-api-key"
```json
{
"mcpServers": {
"reactive-resume": { "url": "https://rxresu.me/mcp" }
}
}
}
}
```
```
### Codex (CLI / IDE extension)
Cursor offers to sign in when it first connects. To use an API key instead, add the `headers` object shown in [Connect with an API key](#connect-with-an-api-key).
</Accordion>
<Accordion title="Codex">
```bash
codex mcp add reactive-resume --url https://rxresu.me/mcp
codex mcp login reactive-resume
```
Add server:
To use an API key instead, add this to `~/.codex/config.toml`:
```bash
codex mcp add reactive-resume --url https://rxresu.me/mcp
```
```toml
[mcp_servers.reactive-resume]
url = "https://rxresu.me/mcp"
http_headers = { "x-api-key" = "YOUR_API_KEY" }
```
</Accordion>
<Accordion title="Other clients">
Use the server address with your client's remote MCP (Streamable HTTP) option. If it asks for a transport, choose HTTP. If it can't do OAuth, send the `x-api-key` header.
</Accordion>
</AccordionGroup>
Then sign in with OAuth:
<Note>
Self-hosting? Replace `https://rxresu.me` with your own address everywhere on this page, for example `https://resume.example.com/mcp`.
</Note>
```bash
codex mcp login reactive-resume
```
## Try it
API key fallback (`config.toml`):
Ask your client something like:
```toml
[mcp_servers."reactive-resume"]
url = "https://rxresu.me/mcp"
http_headers = { "x-api-key" = "your-api-key" }
```
- "List my resumes."
- "Change the headline on my Game Developer Resume to Senior Game Developer."
- "Add Unreal Engine 5 to my skills with the level Expert."
- "Make a copy of my Game Developer Resume for a technical designer role."
- "Review my resume and give me a score." (uses the `review_resume` prompt)
### Claude (web app custom connector)
Before it edits, the client reads the resume with `read_resume`, then changes it with `apply_resume_patch`. Every change it makes appears in the resume's history as **AI edit**, so you can restore an earlier version. See [Undoing changes and version history](/guides/undoing-changes-and-version-history).
Add `https://rxresu.me/mcp` as a custom remote MCP connector, then connect with OAuth in Claude's connector UI.
For job applications, see [Managing applications with MCP](/guides/managing-applications-with-mcp).
### Claude Desktop (local config file)
## Tools
Use `mcp-remote` bridge with API key (example shown above in **Method 2**).
The server offers 43 tools. Each carries MCP annotations (`readOnlyHint`, `destructiveHint` and others), so clients can run read-only tools freely and ask you before tools that change or delete data.
## External references
### Resumes
- [Cursor MCP docs](https://cursor.sh/docs/mcp)
- [MCP quickstart for users (Claude Desktop example)](https://modelcontextprotocol.io/quickstart/user)
- [OpenAI Codex MCP docs](https://developers.openai.com/codex/mcp)
- [Claude custom connectors (remote MCP)](https://claude.com/docs/connectors/custom/remote-mcp)
- [MCP Authorization spec](https://modelcontextprotocol.io/specification/latest/basic/authorization)
| Tool | What it does |
| --- | --- |
| `list_resumes` | Lists your resumes (ID, name, slug, tags, public and locked status, dates). Filter by `tags`, sort by `lastUpdatedAt`, `createdAt` or `name`. |
| `list_resume_tags` | Lists every tag used across your resumes. |
| `read_resume` | Returns a resume's full data. |
| `download_resume_pdf` | Returns a signed PDF download link that expires in 10 minutes. |
| `create_resume` | Creates a resume with a `name` and `slug`, empty or with sample content (`withSampleData`). |
| `import_resume` | Creates a resume from a full resume data object, such as a JSON export. |
| `duplicate_resume` | Copies a resume under a new `name` and `slug`. |
| `apply_resume_patch` | Changes a resume's content with JSON Patch operations. See [Using the patch API](/guides/using-the-patch-api). |
| `update_resume` | Changes the name, slug, tags or public setting, and returns the public address. Passwords can only be set in the app. |
| `delete_resume` | Moves a resume to Trash, where it stays for 30 days. |
| `lock_resume` | Locks a resume so it can't be edited or deleted. |
| `unlock_resume` | Unlocks a resume. |
| `get_resume_statistics` | Returns view and download counts, and when the resume was last viewed and downloaded. |
## Self-hosting
### Cover letters
If you're running a self-hosted Reactive Resume instance, replace `https://rxresu.me/mcp` with your instance URL:
| Tool | What it does |
| --- | --- |
| `list_cover_letters` | Lists your cover letters. Filter by name (`search`), `resumeId` or `applicationId`. |
| `read_cover_letter` | Returns one letter, including its `revision`. |
| `create_cover_letter` | Creates a letter, optionally linked to a resume (for its sender details and design) or an application. |
| `update_cover_letter` | Changes a letter's text, recipient, template or links. Needs the latest `revision` as `expectedRevision`. |
| `refresh_cover_letter_style` | Copies the sender details and design from a resume, keeping the letter's text and template. Needs `expectedRevision`. |
| `duplicate_cover_letter` | Copies a letter. |
| `delete_cover_letter` | Moves a letter to Trash for 30 days. Needs `expectedRevision`. |
| `export_cover_letter` | Returns a letter as versioned cover-letter JSON. |
| `import_cover_letter` | Creates a letter from cover-letter JSON produced by `export_cover_letter`. |
```json
{
"url": "https://resume.example.com/mcp",
"headers": {
"x-api-key": "your-api-key"
}
}
```
### Applications
### Reconnecting after the OAuth provider upgrade
| Tool | What it does |
| --- | --- |
| `list_applications` | Lists your applications with contacts, documents and timeline. Filter by stage (`status`) or `tags`. |
| `read_application` | Returns one application in full. |
| `list_application_tags` | Lists every tag used across applications. |
| `get_application_stats` | Counts applications by stage and source. |
| `create_application` | Creates an application. `company` and `role` are required. |
| `update_application` | Changes fields, moves the stage, edits contacts, follow-up and tags, or links a resume and letter. Lists you send replace the old ones. |
| `add_application_note` | Adds a note to the activity timeline. |
| `add_application_interview` | Schedules an interview (`screening`, `technical`, `behavioral`, `onsite` or `other`). |
| `update_application_interview` | Reschedules or edits an interview. |
| `update_application_timeline_entry` | Changes the date of a stage or note entry, or a note's text. |
| `delete_application_timeline_entry` | Deletes a note, an interview or an older stage entry. |
| `delete_application` | Permanently deletes an application and the PDFs uploaded to it. |
| `bulk_update_applications` | Moves several applications to a stage or adds tags to them. |
| `bulk_delete_applications` | Permanently deletes several applications. |
| `import_applications` | Creates up to 500 applications from parsed rows. |
| `attach_application_document` | Attaches a resume or cover-letter PDF (base64, up to 10 MB) as what you sent. |
| `remove_application_document` | Removes an attached PDF. |
| `autofill_application_from_job` | Reads a pasted job posting with your AI provider and suggests company, role, location and salary. |
| `score_application_match` | Scores the linked resume against the job description with your AI provider. |
| `tailor_resume_for_application` | Makes a private copy of the linked resume with a summary rewritten for the job by your AI provider, and links the copy to the application. |
| `draft_application_message` | Drafts a cover letter (saved as a new letter) or a recruiter follow-up with your AI provider. |
Self-hosted instances automatically apply the additive OAuth schema migration at startup. This preserves existing client and token records and adds the provider's resource and client-resource tables.
The last four tools send data to the AI provider you set up in Reactive Resume and need a tested default provider. See [Connecting an AI provider](/guides/using-ai).
Clients registered before OAuth provider 1.7 do not have per-resource grants. Remove the old connection from your MCP client and add it again so it dynamically registers a new client, then sign in again. Refreshing an existing token does not create these grants. New registrations receive only the resources configured for this instance; existing clients are not automatically granted access.
## Prompts
## Available tools
Prompts are ready-made instructions your client can start from. Each takes a resume `id` and includes that resume and the schema.
Tool names use canonical unprefixed `snake_case` names.
| Prompt | What it does |
| --- | --- |
| `build_resume` | Walks you through building a resume section by section. |
| `improve_resume` | Suggests concrete improvements to wording, impact and structure. |
| `review_resume` | Gives a structured critique with a scorecard and prioritized recommendations, without changing anything. |
| Tool | Description |
| ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| `list_resumes` | List all resumes with IDs, names, tags, and status. Supports filtering by tags and sorting by last updated, creation date, or name |
| `list_resume_tags` | List every distinct tag in use across your resumes (sorted) |
| `read_resume` | Get the full data of a specific resume by ID |
| `download_resume_pdf` | Create a 10-minute authenticated PDF download URL for a resume |
| `create_resume` | Create a new, empty resume with a name and slug. Optionally pre-fill with sample data |
| `import_resume` | Create a resume from a full ResumeData JSON export (random name/slug). Large files may exceed client limits |
| `duplicate_resume` | Create a copy of an existing resume with a new name and slug |
| `apply_resume_patch` | Apply JSON Patch (RFC 6902) operations to modify a resume's data |
| `update_resume` | Update metadata only: name, slug, tags, `isPublic`. Returns canonical share URL; passwords are not managed via MCP |
| `delete_resume` | Permanently delete a resume and all associated files. **Irreversible** |
| `lock_resume` | Lock a resume to prevent edits, patches, and deletion |
| `unlock_resume` | Unlock a previously locked resume to re-enable editing |
| `get_resume_statistics` | Get view and download statistics for a resume |
| `list_cover_letters` | List the account's cover letters, which are documents of their own |
| `read_cover_letter` | Read one independent library cover letter by ID |
| `create_cover_letter` | Create an independent library cover letter, optionally linked to a resume or application |
| `update_cover_letter` | Update an independent cover letter with revision-checked concurrency |
| `refresh_cover_letter_style` | Refresh independent-letter styling from a resume without changing its content or template |
| `duplicate_cover_letter` | Create an independent copy of a library cover letter |
| `delete_cover_letter` | Permanently delete an independent library cover letter; requires its current revision |
| `export_cover_letter` | Export one independent library cover letter as versioned cover-letter JSON |
| `import_cover_letter` | Import versioned cover-letter JSON as a new independent library letter |
| `list_applications` | List tracked job applications. Supports stage, tag, and archived filters |
| `read_application` | Read one full application record with contacts, follow-up details, documents, and timeline |
| `list_application_tags` | List every distinct tag used across applications |
| `get_application_stats` | Get aggregate application counts by stage and source |
| `create_application` | Create a tracked job application |
| `update_application` | Update fields, move stage, archive/unarchive, edit contacts/follow-ups/tags, or link a resume |
| `add_application_note` | Append a note to an application's activity timeline |
| `add_application_interview` | Schedule an interview (screening, technical, behavioral, onsite, other) on an application's timeline and calendar |
| `update_application_interview` | Reschedule or edit an interview's type, duration, location, or notes |
| `delete_application` | Permanently delete one application and its owned uploaded documents |
| `bulk_update_applications` | Move, archive/unarchive, or add tags to multiple applications |
| `bulk_delete_applications` | Permanently delete multiple applications |
| `import_applications` | Bulk-create parsed application rows, up to 500 items |
| `attach_application_document` | Attach a sent resume or cover-letter PDF from base64-encoded PDF bytes |
| `remove_application_document` | Remove a sent resume or cover-letter PDF |
| `autofill_application_from_job` | Use AI to extract job details from a URL or pasted job description |
| `score_application_match` | Score the linked resume against the application job description |
| `tailor_resume_for_application` | Create and link a tailored resume copy for an application |
| `draft_application_message` | Draft a cover letter or recruiter follow-up from application and resume context |
## Resources
### Breaking change (tool names)
| URI | Contents |
| --- | --- |
| `resume://_meta/schema` | The resume data JSON Schema, listed in `resources/list`. Clients use it to build valid patches. |
| `resume://{id}` | One resume's full data as JSON. This is a resource template (`resources/templates/list`); find IDs with `list_resumes`. |
Older clients may refer to prefixed or dot-separated names. Those names are no longer registered; update automations and saved prompts to the canonical names above.
Your instance also publishes a server card at `/.well-known/mcp/server-card.json` that summarizes the tools, prompts and resources, for clients that discover servers without connecting.
### Independent and embedded cover letters
## How authentication works
Reactive Resume has two cover-letter scopes:
This section is for client developers and self-hosters.
- **Independent library letters** live in the **Cover Letters** dashboard and have their own IDs, revisions, templates, exports, and lifecycle. Use `list_cover_letters`, `read_cover_letter`, `create_cover_letter`, `update_cover_letter`, `refresh_cover_letter_style`, `duplicate_cover_letter`, `delete_cover_letter`, `export_cover_letter`, and `import_cover_letter` for this scope.
- **Embedded letters** live as cover-letter items inside a resume's custom sections. They are part of that resume's `ResumeData`; use `read_resume` and `apply_resume_patch` to inspect or edit them. Use `copy_embedded_cover_letter` when you want to create a separate independent library copy. Copying does not remove or change the embedded item.
Updating or deleting an independent letter requires its latest `revision` as `expectedRevision`. This prevents concurrent MCP clients from overwriting newer edits.
## Available resources
Resources follow MCP conventions: **static** items appear in `resources/list`; **parameterized** access is declared in `resources/templates/list` and read via `resources/read` once you know the ID.
| Discovery | What you get |
| ------------------------------------- | --------------------------------------------------------------------------------------------- |
| `resources/list` | Static resources only: currently **`resume://_meta/schema`** (ResumeData JSON Schema) |
| `resources/templates/list` | **`resume://{id}`**: template for reading full resume JSON by ID (not enumerated per resume) |
| `list_resumes` (tool) | **Primary way to discover resume IDs**; resumes are not listed as separate MCP resources |
| URI | Description |
| ----------------------- | ------------------------------------------------------------------------ |
| `resume://_meta/schema` | ResumeData JSON Schema; use for valid JSON Patch paths and value types |
| `resume://{id}` | Full resume data as JSON; use an ID from `list_resumes` |
### Breaking change (schema URI)
The schema resource was previously `resume://schema`. It is now **`resume://_meta/schema`**. Update any saved prompts, automations, or client configs that referenced the old URI.
### Static server card (`/.well-known/mcp/server-card.json`)
`GET /.well-known/mcp/server-card.json` returns a JSON document ([SEP-1649](https://github.com/modelcontextprotocol/modelcontextprotocol/issues/1649)) with `serverInfo`, optional authentication metadata, and summaries of tools, resources, resource templates, and prompts. It is generated to match the live MCP server, and a client that cannot run a full capability scan against `/mcp/` can use it for discovery.
## Available prompts
Prompts are pre-built workflows that give the AI structured instructions and context. Each prompt embeds the resume data and the schema resource (`resume://_meta/schema`) automatically.
| Prompt | Description |
| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `build_resume` | Guide you step-by-step through building a resume from scratch: basics, summary, experience, education, skills, and design |
| `improve_resume` | Review your resume and suggest concrete improvements to wording, impact, metrics, and structure |
| `review_resume` | Get a structured, professional critique with a scorecard (1–10 across seven dimensions) and prioritized recommendations. **Read-only**; no changes are made |
## Usage examples
Once your MCP client is connected, you can work with your resumes in natural language:
### Browsing
- "List my resumes"
- "Show me my resume named 'Software Engineer'"
- "What skills are listed on my resume?"
- "Show me the stats for my resume"
### Tracking applications
- "Create an application for Senior Frontend Engineer at Acme, stage saved, source LinkedIn."
- "List my archived applications tagged remote."
- "Move my Acme application to interview and add a note that the technical screen is next Tuesday."
- "Attach this resume PDF to the Acme application."
- "Score the resume linked to this application against the job description."
- "Create a tailored resume copy for this application."
- "Draft a follow-up message for the recruiter."
For a complete workflow and prompt library, see [Managing applications with MCP](/guides/managing-applications-with-mcp).
### Creating and managing
- "Create a new resume called 'Frontend Engineer 2026'"
- "Import this exported ResumeData JSON as a new resume"
- "What tags do I use across my resumes?"
- "Duplicate my 'Software Engineer' resume for a product manager role"
- "Make my resume public and give me the share link"
- "Lock my finalized resume so it can't be accidentally edited"
- "Delete my old draft resume"
- "Download a PDF of my Software Engineer resume"
- "Download the visible cover letter from my Software Engineer resume as a PDF"
### Editing
- "Update my name to Jane Doe"
- "Change my headline to Senior Software Engineer"
- "Add TypeScript to my skills with an Advanced proficiency level"
- "Add a new experience entry for my role as Staff Engineer at Acme Corp from Jan 2024 to Present"
- "Remove the third item from my skills section"
### Styling
- "Change the template to bronzor"
- "Set the primary color to blue"
- "Hide the interests section"
### Using prompts
- "Help me build my resume from scratch" (uses `build_resume`)
- "Review my resume and give me a score" (uses `review_resume`)
- "Improve the wording on my resume" (uses `improve_resume`)
<Tip>
The AI reads your current resume with `read_resume` before making changes with `apply_resume_patch`, so it targets the
correct JSON paths. Use `update_resume` for name, slug, tags, and public visibility, not for section content.
</Tip>
- The server accepts `Authorization: Bearer <token>` (an OAuth access token) first, then `x-api-key: <key>`.
- A request with neither gets `401` and a `WWW-Authenticate: Bearer resource_metadata="<instance>/.well-known/oauth-protected-resource"` header. OAuth clients use it to discover the authorization server.
- Authorization server metadata is at `/.well-known/oauth-authorization-server`. The authorization server supports dynamic client registration and PKCE with `S256`.
- The consent screen always lists API access, plus the scopes the client asked for: `profile`, `email` and `offline_access` (which lets the client refresh its token while you're away).
## Troubleshooting
| Issue | Solution |
| ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
| "Unauthorized" with no login prompt | Your client may not support MCP OAuth discovery. Use API key mode (`x-api-key`) |
| OAuth login opens but fails redirect/callback | Confirm your client's MCP OAuth callback settings and retry the connection |
| "API error (401)" | Your API key is invalid or expired. Create a new one in **Settings → AI & developer** |
| "API error (404)" | The resume ID doesn't exist. Use `list_resumes` to find valid IDs |
| "API error (403)" | The resume is locked. Unlock it in the Reactive Resume dashboard |
| Connection refused | Check that the URL is correct and the instance is running |
| "ReferenceError: File is not defined" when using `mcp-remote` | You're running Node.js 18. `mcp-remote` requires **Node.js 20 or later**; upgrade with `nvm use 20` or `nvm alias default 20` |
| "Application documents must be PDF files" | `attach_application_document` only accepts `contentType: "application/pdf"` and base64-encoded PDF bytes |
| Problem | What to do |
| --- | --- |
| "Unauthorized" and no sign-in window | Your client doesn't support MCP OAuth. Connect with an API key. |
| The sign-in window says the request is invalid or has expired | Start the connection again from your client. |
| `401` with an API key | The key is wrong, revoked or expired. Create a new one in **Settings** → **AI & developer**. |
| A tool says the resume is locked | Unlock it in the app, or ask the client to run `unlock_resume`. |
| A tool says an ID wasn't found | Ask the client to list resumes, letters or applications first to get valid IDs. |
| An edit to dates doesn't stick | The client changed the `period` or `date` text. Ask it to write the `dates` object instead. |
| `import_resume` fails on a large file | Your client's message size limit is too small. Import the file in the app instead. |
| A self-hosted connection made before an upgrade stops working | Remove the server from your client and add it again, so it registers afresh and you approve it again. |
## Related guides
- [Managing applications with MCP](/guides/managing-applications-with-mcp): prompts for tracking your job search from an AI client.
- [Using the patch API](/guides/using-the-patch-api): how resume edits are expressed.
- [Using the API](/guides/using-the-api): API keys and the REST API.
+159 -120
View File
@@ -1,191 +1,230 @@
---
title: "Using the patch API"
description: "Partially update a Reactive Resume with JSON Patch (RFC 6902) operations to add, remove, replace, and move fields without sending the full document."
description: "Change individual fields of a Reactive Resume with JSON Patch (RFC 6902): add, remove, replace and move items, set dates and avoid overwriting edits."
---
The Patch API lets you make small, targeted changes to your resume without sending the entire data object. Instead of replacing the whole resume with a `PUT`, you send a list of **JSON Patch** operations that describe exactly what to change.
The patch endpoint lets you make small, targeted changes to a resume's content without sending the whole document. You send a list of [JSON Patch (RFC 6902)](https://datatracker.ietf.org/doc/html/rfc6902) operations, and the server applies them together and returns the updated resume. This is the same mechanism the MCP server's `apply_resume_patch` tool uses.
This is based on the [JSON Patch (RFC 6902)](https://datatracker.ietf.org/doc/html/rfc6902) standard.
## Before you start
## When to use PATCH vs PUT
- Create an API key and try a first request, as described in [Using the API](/guides/using-the-api).
- Find the resume's ID with `GET /api/openapi/resumes`, then fetch its current content with `GET /api/openapi/resumes/{id}`. Paths in your operations point into the `data` object of that response.
- Keep the [JSON resume schema](/guides/json-resume-schema) at hand. It lists every field, its type and which fields a new item needs.
| Use case | Method |
| -------------------------------------------- | --------- |
| Update a single field (e.g., name, headline) | **PATCH** |
| Add or remove an item in a section | **PATCH** |
| Change template, colors, or fonts | **PATCH** |
| Replace the entire resume data at once | **PUT** |
## Choose PATCH or PUT
<Info>
The PATCH endpoint only modifies the resume `data` (the JSONB column). To update top-level resume properties like
`name`, `slug`, `tags`, or `isPublic`, use the existing `PUT /resume/{id}` endpoint.
</Info>
| You want to | Use |
| --- | --- |
| Change one field, such as the headline or a company name | `PATCH /resumes/{id}` |
| Add, remove or reorder entries in a section | `PATCH /resumes/{id}` |
| Change the template, colors, fonts or layout | `PATCH /resumes/{id}` |
| Rename the resume, change its slug or tags, or make it public | `PUT /resumes/{id}` |
| Replace the whole resume content at once | `PUT /resumes/{id}` with `data` |
## Authentication
PATCH only changes the resume's `data`. The name, slug, tags and public setting sit outside `data`, so change them with `PUT`, which updates only the fields you send.
All requests require your API key in the `x-api-key` header. See [Using the API](/guides/using-the-api) for how to create one.
## Send a patch
<Info>
If you're self-hosting, replace `https://rxresu.me` with your instance URL. The API is served under `/api/openapi`.
</Info>
## Endpoint
```
PATCH /api/openapi/resume/{id}
```http
PATCH /api/openapi/resumes/{id}
x-api-key: YOUR_API_KEY
Content-Type: application/json
```
### Request body
The resume ID is taken from the URL path, so the request body only requires the `operations` array:
The body holds the operations, and optionally the version of the resume you based them on:
```json
{
"operations": [{ "op": "replace", "path": "/basics/name", "value": "Jane Doe" }]
"expectedUpdatedAt": "2026-09-30T00:10:08.197Z",
"operations": [
{ "op": "replace", "path": "/basics/headline", "value": "Senior Game Developer" }
]
}
```
Each operation is an object with the following properties:
| Field | Required | Description |
| --- | --- | --- |
| `operations` | Yes | At least one JSON Patch operation. They run in order. |
| `expectedUpdatedAt` | No | The resume's `updatedAt` when you read it. If the resume has changed since, the patch is rejected with `409`. See [Avoid overwriting other edits](#avoid-overwriting-other-edits). |
| Property | Required | Description |
| -------- | ---------------------------- | ------------------------------------------------------------------------------- |
| `op` | Yes | The operation to perform: `add`, `remove`, `replace`, `move`, `copy`, or `test` |
| `path` | Yes | A JSON Pointer (RFC 6901) to the target location in the resume data |
| `value` | For `add`, `replace`, `test` | The value to use for the operation |
| `from` | For `move`, `copy` | A JSON Pointer to the source location |
Each operation has these properties:
| Property | Required | Description |
| --- | --- | --- |
| `op` | Yes | `add`, `remove`, `replace`, `move`, `copy` or `test` |
| `path` | Yes | A [JSON Pointer (RFC 6901)](https://datatracker.ietf.org/doc/html/rfc6901) into the resume data, such as `/basics/name` |
| `value` | For `add`, `replace` and `test` | The value to write or compare |
| `from` | For `move` and `copy` | A JSON Pointer to the source |
A successful patch returns `200` with the full updated resume, including its new `updatedAt`.
## Examples
### Replace a basic field
Update the resume holder's name and headline:
### Replace basic fields
```bash
curl -X PATCH "https://rxresu.me/api/openapi/resume/YOUR_RESUME_ID" \
curl -X PATCH "https://rxresu.me/api/openapi/resumes/YOUR_RESUME_ID" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operations": [
{ "op": "replace", "path": "/basics/name", "value": "Jane Doe" },
{ "op": "replace", "path": "/basics/headline", "value": "Senior Software Engineer" }
{ "op": "replace", "path": "/basics/name", "value": "David Kowalski" },
{ "op": "replace", "path": "/basics/headline", "value": "Senior Game Developer" }
]
}'
```
### Add an experience entry
Append a new item to the experience section:
A new entry must be a complete item: include every required field of that item type, a unique `id` (a UUID) and `"hidden": false`. Set its dates in `dates` and leave `period` empty; the server fills it in.
```bash
curl -X PATCH "https://rxresu.me/api/openapi/resume/YOUR_RESUME_ID" \
curl -X PATCH "https://rxresu.me/api/openapi/resumes/YOUR_RESUME_ID" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operations": [
{
"op": "add",
"path": "/sections/experience/items/-",
"path": "/sections/experience/items/0",
"value": {
"id": "a1b2c3d4-0000-0000-0000-000000000000",
"id": "019a0000-0000-7000-8000-000000000001",
"hidden": false,
"company": "Acme Corp",
"position": "Staff Engineer",
"location": "San Francisco, CA",
"period": "Jan 2024 - Present",
"website": { "url": "https://acme.example.com", "label": "Acme Corp" },
"description": "<p>Leading the platform team.</p>"
"company": "Northwind Games",
"position": "Senior Gameplay Engineer",
"location": "Remote",
"period": "",
"dates": { "start": "2024-01", "end": null, "present": true },
"website": { "url": "", "label": "" },
"description": "<p>Leading the combat systems team.</p>",
"roles": []
}
}
]
}'
```
<Tip>
The path `/sections/experience/items/-` uses the special `-` index, which means "append to the end of the array". To
insert at a specific position, use a numeric index like `/sections/experience/items/0` for the beginning.
</Tip>
A numeric index inserts at that position (`0` puts the entry first). The special index `-` appends to the end, as in `/sections/skills/items/-`.
### Remove an item from a section
### Remove an entry
Remove the second skill (index `1`) from the skills section:
Remove the second skill:
```bash
curl -X PATCH "https://rxresu.me/api/openapi/resume/YOUR_RESUME_ID" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operations": [
{ "op": "remove", "path": "/sections/skills/items/1" }
]
}'
```json
{ "operations": [{ "op": "remove", "path": "/sections/skills/items/1" }] }
```
### Update metadata (template, colors, fonts)
### Move an entry within a section
Switch the template and update the primary color:
Move the first experience entry to the third position:
```bash
curl -X PATCH "https://rxresu.me/api/openapi/resume/YOUR_RESUME_ID" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operations": [
{ "op": "replace", "path": "/metadata/template", "value": "bronzor" },
{ "op": "replace", "path": "/metadata/design/colors/primary", "value": "rgba(37, 99, 235, 1)" }
]
}'
```json
{ "operations": [{ "op": "move", "from": "/sections/experience/items/0", "path": "/sections/experience/items/2" }] }
```
### Test then replace (optimistic concurrency)
### Change the design
The `test` operation checks that a value matches before the rest of the patch runs. If the test fails, the whole patch is rejected, which keeps you from overwriting changes made by another client:
Switch the template and the primary color:
```bash
curl -X PATCH "https://rxresu.me/api/openapi/resume/YOUR_RESUME_ID" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operations": [
{ "op": "test", "path": "/basics/name", "value": "Albert Einstein" },
{ "op": "replace", "path": "/basics/name", "value": "Jane Doe" }
]
}'
```json
{
"operations": [
{ "op": "replace", "path": "/metadata/template", "value": "bronzor" },
{ "op": "replace", "path": "/metadata/design/colors/primary", "value": "rgba(37, 99, 235, 1)" }
]
}
```
If `/basics/name` is not `"Albert Einstein"` at the time of the request, the entire patch will fail with a `400` error and no changes will be applied.
### Hide a section
### Move an item within a section
Move the first experience item to the third position:
```bash
curl -X PATCH "https://rxresu.me/api/openapi/resume/YOUR_RESUME_ID" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operations": [
{ "op": "move", "from": "/sections/experience/items/0", "path": "/sections/experience/items/2" }
]
}'
```json
{ "operations": [{ "op": "replace", "path": "/sections/interests/hidden", "value": true }] }
```
## Error handling
## Dates
| Status | Error Code | Description |
| ------ | -------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
| `400` | `INVALID_PATCH_OPERATIONS` | The operations are structurally invalid, target a non-existent path, or produce resume data that fails schema validation. |
| `401` | `UNAUTHORIZED` | Missing or invalid API key. |
| `404` | `NOT_FOUND` | The resume does not exist or does not belong to the authenticated user. |
| `403` | `RESUME_LOCKED` | The resume is locked and cannot be modified. Unlock it first. |
Experience (and its roles), education, projects and volunteer entries, and awards, certifications and publications, have a structured `dates` object:
<Warning>
All operations in a single request are applied atomically. If any operation fails (including a `test`), none of the
operations are applied.
</Warning>
```json
"dates": { "start": "2022-03", "end": null, "present": true }
```
## Tips
| Field | Value |
| --- | --- |
| `start` | A year (`"2022"`) or a year and month (`"2022-03"`), or `null`. Single-date entries (awards, certifications, publications) use only `start`. |
| `end` | A year or year and month, or `null` while the entry is ongoing or for single dates. |
| `present` | `true` when the entry is ongoing. It prints as "Present" in the resume's language. |
| `raw` | Optional. Original text that couldn't be read exactly, such as "Summer 2016". It prints as written until the dates are edited. |
- Fetch first, then patch. Use `GET /resume/{id}` to inspect the current structure before writing your operations, so you target the correct paths and array indices.
- Use `test` for safety. When you expect a field to hold a specific value, combine `test` + `replace` so you don't overwrite a concurrent change.
- Batch related changes. You can send multiple operations in one request. They are applied in order, so a later operation can depend on an earlier one.
- The `-` index appends. When adding items to arrays, use `-` as the index (e.g., `/sections/skills/items/-`) to append to the end.
**Write `dates`, not the text.** Each entry also has a text field, `period` (ranges) or `date` (single dates). On every save, the server rewrites that text from `dates`, in the resume's language and date format (`/metadata/page/dateFormat`: `short`, `long`, `numeric` or `iso`). A patch that changes only `period` or `date` is overwritten, and the resume keeps its old dates.
To change an entry's dates, replace the whole object:
```json
{
"operations": [
{
"op": "replace",
"path": "/sections/experience/items/0/dates",
"value": { "start": "2021", "end": "2024-06", "present": false }
}
]
}
```
With the `long` date format, that entry's `period` becomes "2021 – June 2024". An entry sent without `dates` (for example from an older export) gets them read from its text.
## Avoid overwriting other edits
Someone might edit the resume in the browser between your read and your write. Two tools protect you:
**`expectedUpdatedAt`** rejects the whole patch if the resume changed after you read it. Send the `updatedAt` value from your last read:
```json
{
"expectedUpdatedAt": "2026-09-30T00:10:08.197Z",
"operations": [{ "op": "replace", "path": "/basics/headline", "value": "Lead Game Developer" }]
}
```
If the resume has moved on, you get `409` with the code `RESUME_VERSION_CONFLICT` and the current `updatedAt` in `data`. Read the resume again, rebuild your operations and retry.
**`test`** checks a value before the other operations run. If it doesn't match, nothing is applied:
```json
{
"operations": [
{ "op": "test", "path": "/basics/name", "value": "David Kowalski" },
{ "op": "replace", "path": "/basics/name", "value": "Dave Kowalski" }
]
}
```
## What happens when a patch is applied
- **All or nothing.** The operations run in order inside one transaction. If any operation fails, or the result doesn't match the resume schema, none of them are saved.
- **Validation.** The patched resume must pass the same validation as any other save. For example, `/metadata/template` must be one of the available templates. Rich-text fields such as `description` and `/summary/content` are HTML strings, so send HTML (`<p>…</p>`) rather than plain text or Markdown.
- **History.** Each successful patch saves a version in the resume's history. It appears as **AI edit**, described as "from the assistant or API", and you can restore an earlier version from the editor. See [Undoing changes and version history](/guides/undoing-changes-and-version-history).
- **Cover letters leave the resume.** If a patch adds a section of type `cover-letter`, the server saves its letter as a separate cover letter linked to the resume and removes the section. Manage letters with the `/cover-letters` endpoints instead.
- **Public resumes update at once.** If the resume is public, the change is visible on its public page straight away.
## Errors
| Status | Code | Cause |
| --- | --- | --- |
| `400` | `BAD_REQUEST` | The body is malformed, for example `operations` is empty or an operation lacks `value` or `from`. |
| `400` | `INVALID_PATCH_OPERATIONS` | An operation targets a path that doesn't exist, a `test` failed, or the result doesn't match the schema. `data` holds the failing `index`, the `operation` and a `code` such as `TEST_OPERATION_FAILED` or `OPERATION_PATH_UNRESOLVABLE`. |
| `401` | `UNAUTHORIZED` | The API key is missing, revoked or expired. |
| `404` | `NOT_FOUND` | The resume doesn't exist or belongs to someone else. |
| `409` | `RESUME_VERSION_CONFLICT` | The resume changed after `expectedUpdatedAt`. |
| — | `RESUME_LOCKED` | The resume is locked. Unlock it with `POST /resumes/{id}/lock` and `{ "isLocked": false }`, or in the app. |
<Note>
A locked resume currently answers with HTTP status `500` rather than a `4xx` status. Check the `code` field for `RESUME_LOCKED` instead of relying on the status.
</Note>
## Related guides
- [Using the API](/guides/using-the-api): keys, authentication and the other endpoints.
- [JSON resume schema](/guides/json-resume-schema): every path and value type you can patch.
- [Using the MCP server](/guides/using-the-mcp-server): let an AI client write these patches for you.
+75
View File
@@ -0,0 +1,75 @@
---
title: "Using the Trash"
description: "Move resumes and cover letters to Trash in Reactive Resume, undo it, restore them within 30 days, or delete them for good."
---
When you remove a resume or cover letter, it goes to **Trash** instead of disappearing. It stays there for 30 days, so you can bring it back if you change your mind.
## Move a document to Trash
On Documents, open the document's **⋯** menu and choose **Move to Trash**. In the editor, open the document name menu at the top left and choose **Move to Trash**; you return to Documents.
Reactive Resume doesn't ask you to confirm, because the move can be undone. A message appears at the bottom of the screen. Select **Undo** to put the document back straight away.
<Frame caption="The message after moving a document to Trash">
<img src="/images/guides/using-the-trash/moved-to-trash-toast.webp" alt="A message reading One-Page Resume (copy) moved to Trash with an Undo button" />
</Frame>
While a resume is in Trash, its public link stops working. Restoring it brings the resume back as it was.
<Note>
Locked documents can't be moved to Trash. Choose **Unlock** in the document's menu first.
</Note>
## Open the Trash
Once Trash holds something, a **Trash** item with a count appears at the bottom of the sidebar. Select it to open the Trash page.
<Frame caption="Trash in the sidebar">
<img src="/images/guides/using-the-trash/trash-in-sidebar.webp" alt="The Trash item in the sidebar with a count of 1" />
</Frame>
You can also open the [command bar](/guides/using-the-command-bar) with <kbd>⌘</kbd> <kbd>K</kbd> (<kbd>Ctrl</kbd> <kbd>K</kbd> on Windows and Linux) and choose **Trash**, or go to `https://rxresu.me/dashboard/trash`. Self-hosters use their own address.
The Trash page lists each document with its **Type**, linked **Application**, and how many days are left under **Deleted in**. When it's empty, it says **Trash is empty**.
## Restore a document
<Steps>
<Step title="Open the row's menu">
On the Trash page, select **⋯** at the end of the document's row.
<Frame caption="The Trash page with a row's menu open">
<img src="/images/guides/using-the-trash/trash-page-row-menu.webp" alt="The Trash page listing One-Page Resume (copy) with 30 days left and a menu showing Restore and Delete now" />
</Frame>
</Step>
<Step title="Choose Restore">
Select **Restore**. The document goes back to Documents with its content, tags and links intact.
</Step>
</Steps>
## Delete a document for good
Documents are deleted permanently 30 days after you moved them to Trash. To delete one sooner:
<Steps>
<Step title="Choose Delete now…">
On the Trash page, open the row's **⋯** menu and choose **Delete now…**.
</Step>
<Step title="Confirm">
Select **Delete now** to confirm, or **Keep in Trash** to change your mind.
<Frame caption="Confirming a permanent delete">
<img src="/images/guides/using-the-trash/delete-now-confirmation.webp" alt="A dialog asking Delete One-Page Resume (copy) now? It will be deleted for good and can't be restored, with Keep in Trash and Delete now buttons" />
</Frame>
</Step>
</Steps>
<Warning>
A deleted document can't be restored, and neither can its version history. If you might need it again, download a JSON copy first (see [Exporting your resume](/guides/exporting-your-resume)).
</Warning>
## Related guides
- [Managing your documents](/guides/managing-documents): rename, duplicate and lock documents.
- [Exporting your data](/guides/exporting-your-data): keep a copy of everything in your account.
@@ -0,0 +1,52 @@
---
title: "Viewing application insights"
description: "See how far your applications get, how often and how fast people reply, whether tailored resumes do better, and export a picture of your job search pipeline."
---
The **Insights** view turns your applications into a few simple numbers and charts. Use it to spot where things stall, for example lots of applications but few replies, and to see whether tailoring your resume is paying off.
To open it, go to **Applications** and select the **Insights** tab. Insights counts all of your applications, including closed ones, whatever you've typed in the search field.
<Info>
Insights appears once at least one application has reached **Applied**. Until then you see a short message instead.
</Info>
## Read the charts
<Frame caption="How far applications get, reply figures, and tailored vs. base resume">
<img src="/images/guides/viewing-application-insights/insights-funnel-and-reply-figures.webp" alt="Insights view with a How far applications get chart showing 9 applied, 4 screening, 3 interview and 1 offer, tiles for 56% heard back and 8 days median to first reply, and a Tailored vs. base resume summary" />
</Frame>
- **How far applications get**: For each stage from **Applied** to **Offer**, the number of applications that ever reached it. This uses each application's stage history, so an application that reached **Interview** and was later closed still counts for **Applied**, **Screening** and **Interview**.
- **heard back**: The share of sent applications that got a reply. A reply means the application moved on to **Screening** or later, or was closed as **Not selected**.
- **median to first reply**: The typical number of days between sending an application and that first reply. It uses the dates in each application's **Activity**, so correct those dates if you added applications after the fact.
- **Tailored vs. base resume**: Compares applications sent with a resume made for that job (with **Tailor a resume** or **Copy for a job…**) against those sent with another resume. It only counts applications with a linked resume. With fewer than 10 of those, it reminds you the numbers are small.
## The pipeline picture
**Where your applications went** draws your pipeline as a flow from **Saved** to **Offer**. The number above each bar is how many of your current, not-closed applications are at that stage or beyond, and the percentage under it is how many made it on from the stage before. The top line shows how many applications you're tracking in total, and how many are closed.
<Frame caption="The pipeline picture, ready to export">
<img src="/images/guides/viewing-application-insights/insights-pipeline-chart.webp" alt="Where your applications went panel with an Export PNG button and a dark Job search pipeline chart showing bars for Saved, Applied, Screening, Interview and Offer with conversion percentages and 2 closed" />
</Frame>
Select **Export PNG** to download the picture as `pipeline-flow.png`, a high-resolution image with a small Reactive Resume mark in the corner. It's made for sharing, for example with a mentor or career coach.
<Note>
The pipeline picture counts only applications that aren't closed, while **How far applications get** includes closed ones. That's why their numbers can differ.
</Note>
## Weekly activity and sources
<Frame caption="Applications over time and where they come from">
<img src="/images/guides/viewing-application-insights/insights-weekly-and-source-charts.webp" alt="Applications over time bar chart for the last 8 weeks, and a Where applications come from chart with LinkedIn 5, Indeed 3, Company website 2 and Referral 1" />
</Frame>
- **Applications over time**: How many applications you applied for each week over the last 8 weeks. Saved applications count in the week you added them, and closed applications aren't included.
- **Where applications come from**: How many applications have each **Source**, such as LinkedIn or Referral. Fill in the source on each application to make this useful. Applications without a source aren't shown.
## Related guides
- [Managing an application](/guides/managing-an-application): fix stage dates and sources so the numbers are right.
- [Tailoring a resume for a job](/guides/tailoring-a-resume-for-a-job): make tailored copies to compare against your base resume.
- [Tracking job applications](/guides/tracking-job-applications): the other views.
+175
View File
@@ -0,0 +1,175 @@
---
title: "What's new in v6"
description: "A guide for returning users: how Reactive Resume v6 reorganizes documents, the editor, sharing, the assistant, cover letters, applications and settings."
---
Reactive Resume v6 is a full redesign. Your resumes, letters and applications carry over, but many things live in new
places. This page explains what changed from v5 and where to find what you used before.
<Frame caption="The v6 editor">
<img src="/images/getting-started/editor-overview.webp" alt="The Reactive Resume v6 editor with the Write, Design and Check modes at the top, the Basics card on the left and the rendered resume page on the right." />
</Frame>
## At a glance
| In v5 | In v6 |
| --- | --- |
| Separate **Resumes** and **Cover Letters** dashboards | One **Documents** page with **All**, **Resumes** and **Letters** tabs |
| Builder with left and right sidebars and a dock | Editor with three modes: **Write**, **Design** and **Check** |
| Export panel, sharing section and version history | One **Share & export** panel with **Link**, **Download** and **History** tabs |
| **Agents** page and the builder's AI sheet | The **Assistant** panel inside the editor (<kbd>⌘</kbd> <kbd>J</kbd>) |
| Cover letters inside resumes, or in their own library | Cover letters are documents of their own |
| Applications table, board and insights | Applications **List**, **Board**, **Insights** and **Calendar** |
| Dates typed as free text | Structured dates: a month and year, or just a year |
| Six settings pages | **Settings** with **Account**, **Preferences** and **AI & developer** |
## Documents replaces the dashboards
The **Resumes** and **Cover Letters** pages are now one page, **Documents**. Use the tabs to show everything, only
resumes or only letters, search with <kbd>/</kbd>, sort by **Last edited**, and switch between a grid and a list.
Old links to the resume and letter dashboards still open **Documents**.
Everything you create starts from **New** in the sidebar (or press <kbd>N</kbd>). The **New document** dialog offers
**Import a resume**, **Copy a resume for a job**, **Start blank**, **New cover letter instead** and **Try with a sample
resume**. You can also drop a file anywhere on **Documents** to import it.
Deleting a document now moves it to **Trash**, with an undo. Documents stay in Trash for 30 days, and you can restore
them or delete them for good before then. The **Trash** link appears in the sidebar only while Trash has something in
it.
Learn more in [Managing documents](/guides/managing-documents) and [Using the Trash](/guides/using-the-trash).
## The editor has three modes
The builder's sidebars, dock and panels are replaced by one editor with three modes. Switch with the control at the top
of the editor, or press <kbd>1</kbd>, <kbd>2</kbd> or <kbd>3</kbd>.
- **Write** holds your content: the **Basics** card (name, photo, contact details and custom fields), then your
sections in print order. Each section and entry has a **⋯** menu for options such as hiding, duplicating or moving
it. You can also select a block on the page to jump to it in the panel.
- **Design** holds the look: **Template**, **Type**, **Color**, **Page** and **Advanced** (custom fonts, the date
format, custom CSS and more). The template gallery shows all 15 templates filled with your own content.
- **Check** reviews your resume. It lists issues pinned to the lines they belong to and gives a readability score, a
**Job match** against a posting, and an AI **Writing** review. It replaces the ATS section of the old builder; the
public [ATS checker](/guides/using-the-ats-checker) page is still available.
The document name at the top left opens the document menu: **Rename…**, **Duplicate**, **Lock editing**, **Notes**,
**Details**, **Print** and **Move to Trash**. Private notes and printing moved here.
Learn more in [Editor overview](/guides/editor-overview) and [Checking your resume](/guides/checking-your-resume).
## Sharing, downloads and history live in one place
**Share** in the editor bar opens the **Share & export** panel. It has three tabs:
- **Link** turns your public link on or off, sets its address, can **Require a password**, and shows views and
downloads for the last 30 days. The public address moved here from the old "edit details" dialog.
- **Download** saves a **PDF**, **Word**, **Markdown** or **JSON** file, with a file name you can change.
- **History** lists earlier versions of your document. You can name a version (for example, the one you sent to a
company), preview it and restore it. Restoring no longer asks for confirmation, because it can be undone: your
state before the restore is kept as a version called **Before restore**.
**Download PDF** in the editor bar downloads right away, and <kbd>⌘</kbd> <kbd>P</kbd> now downloads the PDF instead of
opening the print dialog. To print, use **Print** in the document menu.
Learn more in [Sharing your resume publicly](/guides/sharing-your-resume-publicly),
[Exporting your resume](/guides/exporting-your-resume) and
[Undoing changes and version history](/guides/undoing-changes-and-version-history).
## The Assistant replaces Agents
The separate **Agents** page is gone. The AI assistant now opens as a panel beside the page in the editor, for resumes
and letters alike. Open it with the sparkle button in the editor bar or <kbd>⌘</kbd> <kbd>J</kbd>.
The biggest change: the assistant never edits your document directly. It proposes edits, showing the old text struck
through, the new text and why, and you accept or reject each one. It can ask you a clarifying question
when a request is unclear. Your earlier conversations are under **Past conversations** in the panel, and old Agents
links open the right document with the conversation showing.
The assistant, **Improve** on a line of text, and Check's **Writing** review use an AI provider you connect yourself in
**Settings → AI & developer**.
Learn more in [Connecting an AI provider](/guides/using-ai) and [Using the assistant](/guides/using-the-assistant).
## Cover letters are documents of their own
In v5, a cover letter could be a section inside a resume. In v6, every letter is its own document in **Documents**,
with its own editor (**Write** and **Design** modes), downloads and history. A letter can be linked to a resume, and it
then uses that resume's contact details and design unless you give the letter its own design.
When your account moved to v6, every cover-letter section in your resumes was saved as a separate letter linked to that
resume, named after the resume and the section. The resumes themselves no longer contain letters. Letters don't have
public links.
Learn more in [Writing a cover letter](/guides/writing-a-cover-letter).
## Applications got a redesign
The job tracker now has four views: **List**, **Board**, **Insights** and **Calendar**. On phones, the list is used
in place of the board and calendar.
- **Add application** starts from a job link or a pasted posting.
- Each application moves through **Saved**, **Applied**, **Screening**, **Interview** and **Offer**. When it ends, you
close it with a reason instead of marking it rejected or archiving it. Use **Show closed** to see closed ones.
- Selecting an application opens its detail sheet with the stage, the next step (interviews and follow-ups), what you
sent, notes, contacts and activity.
- The **Calendar** view shows your interviews. **Add to calendar** on an interview saves it as an `.ics` file for your
own calendar app.
- From an application, you can tailor a resume or write a letter for that job.
Learn more in [Tracking job applications](/guides/tracking-job-applications) and
[Tailoring a resume for a job](/guides/tailoring-a-resume-for-a-job).
## Dates are structured
Dates used to be free text. Now each date is a month and year (such as Mar 2022) or just a year, and ongoing entries
use **Present**. Because Reactive Resume understands the dates, it can sort entries and check them, and every date on
your resume prints the same way. Choose how they print in **Design → Advanced → Date format**: Mar 2022, March 2022,
03/2022 or 2022-03.
Your existing dates were converted automatically. Anything that couldn't be read exactly, such as "Summer 2016", still
prints as you wrote it until you edit that date.
Learn more in [Entering dates](/guides/entering-dates).
## A new PDF engine that runs in your browser
The page you see in the editor is the real PDF, rendered in your browser as you type. Downloads are made in your
browser too, so they match the preview exactly and don't wait for a server. The engine runs in the background, so
typing stays responsive even on long resumes.
## Settings are consolidated
The six settings pages are now three. To open them, select your name at the bottom of the sidebar, then **Settings**:
- **Account**: your profile and photo, password, two-step verification, passkeys and linked sign-in methods, exporting
all your data, and deleting your account. **Sign out** is here too.
- **Preferences**: appearance (**Light**, **Dark**, or following your system), language and motion.
- **AI & developer**: AI providers, API keys and the MCP server.
Old settings links open the matching new page.
Learn more in [Updating your profile](/guides/updating-your-profile) and
[Changing appearance and language](/guides/changing-appearance-and-language).
## Faster ways to get around
Press <kbd>⌘</kbd> <kbd>K</kbd> (<kbd>Ctrl</kbd> <kbd>K</kbd> on Windows and Linux) anywhere to open the command bar.
Search your resumes, applications and assistant conversations, jump to a page, change the theme or language, or type a
question to ask the assistant. See [Using the command bar](/guides/using-the-command-bar) and the full list of
[keyboard shortcuts](/guides/keyboard-shortcuts).
## What was removed
A few v5 features didn't make it into v6:
- The compact view on the resume dashboard (grid and list remain) and the collapsible sidebar.
- Automatically applied AI edits. Every assistant edit is now a proposal you review.
- Adding a cover letter inside a resume, and the cover-letter tab in a resume's downloads. Use a separate letter.
- Archiving assistant conversations and showing token counts.
- The fit score stored on applications.
## If you self-host
Upgrading your own server from v5 to v6 involves database migrations and a few API changes. Follow
[Upgrading to v6](/self-hosting/upgrading-to-v6) before you update.
+190
View File
@@ -0,0 +1,190 @@
---
title: "Writing a cover letter"
description: "Create a cover letter as its own document, link it to a resume and a job application, match your resume's design, and download it."
---
In Reactive Resume, a cover letter is a document of its own. It sits next to your resumes in **Documents**, under the **Letters** tab. A letter can take your name, contact details and design from one of your resumes, and its recipient from a job application, so you only write the body.
## Create a letter
You can start a letter from an application or from **Documents**.
<Tabs>
<Tab title="From an application">
Starting from the job you're applying for is quickest, because the letter is set up for that job.
<Steps>
<Step title="Open the application">
In **Applications**, select the application to open its details.
</Step>
<Step title="Select Write a letter">
Under **What you sent**, select **Write a letter**. The button shows only while the application has no letter.
<Frame>
<img src="/images/guides/writing-a-cover-letter/application-write-a-letter.webp" alt="The What you sent section of an application, listing the linked Game Developer Resume with a Write a letter button below it" />
</Frame>
</Step>
</Steps>
The new letter is named after the company, for example "Cover letter — Northwind Games". It becomes this application's letter, takes its recipient from the application (the company, and the first contact's name if there is one), and takes your details and design from the application's resume, if it has one.
</Tab>
<Tab title="From Documents">
<Steps>
<Step title="Open New">
In **Documents**, select **New**, or press <kbd>N</kbd>.
</Step>
<Step title="Select New cover letter instead">
At the bottom of the dialog, select **New cover letter instead**.
<Frame>
<img src="/images/guides/writing-a-cover-letter/new-dialog-cover-letter.webp" alt="The New document dialog, with Import a resume, Copy a resume for a job and Start blank, and New cover letter instead at the bottom left" />
</Frame>
</Step>
</Steps>
The new letter, named "Untitled letter", takes its details and design from the resume you edited most recently. You can link an application and change the resume in the editor.
</Tab>
</Tabs>
To bring back a letter you downloaded as JSON from Reactive Resume, import the file from the **New** dialog as you would a resume; it comes back as a letter. See [Importing resumes](/guides/importing-resumes).
## Fill in the letter
The letter editor looks like the resume editor, with two modes: **Write** and **Design**. The panel on the left holds the letter's details, and the page on the right shows the letter as it will print, updating as you type.
<Frame caption="The letter editor in Write mode">
<img src="/images/guides/writing-a-cover-letter/letter-editor-write.webp" alt="The letter editor with For, To and From sections in the left panel and a printed letter from David Kowalski to Priya Shah at Northwind Games on the right" />
</Frame>
<Steps>
<Step title="For: the application">
Under **For**, select **Link an application** to choose the job the letter is for, or **Change** to pick another. Closed applications aren't listed. Linking fills the recipient's company and name. Choose **No application** to unlink it. Without an application, you fill in the recipient yourself.
</Step>
<Step title="To: the recipient">
Under **To**, check **Name or team**, **Company** and **Date**. The greeting follows the name: "Dear Priya," for Priya Shah, or a greeting to the hiring team when the name is empty.
</Step>
<Step title="From: your details">
Under **From**, choose the **Resume** your details come from. With **Use details from** that resume turned on, your name, headline, email, phone and location stay linked: when you change them on the resume, the letter changes too, and tells you the next time you open it.
Turn the switch off to keep a copy of your details in the letter instead. The copy doesn't change when the resume does.
<Frame>
<img src="/images/guides/writing-a-cover-letter/letter-from-resume.webp" alt="The From section with Game Developer Resume selected and the switch Use details from Game Developer Resume turned on, labelled Linked" />
</Frame>
</Step>
<Step title="Letter: the body">
Under **Letter**, select **Write it myself** and type the body. The greeting and sign-off are added around it for you. The editor has the same formatting tools as the resume; see [Formatting text](/guides/formatting-text).
</Step>
</Steps>
Below the body, **Length** counts your words against the 180 to 320 words most recruiters read, and says whether the letter is short, comfortable or getting long. It's a guide, not a rule.
<Frame>
<img src="/images/guides/writing-a-cover-letter/letter-length-and-design.webp" alt="The Length section showing 85 words and the note Short and direct, fine if the posting asks for brevity, above the Design section reading Matches the resume (Azurill), Change it in Design" />
</Frame>
Changes save automatically. The status under the letter's name in the editor bar shows **Saving…**, **Saved** or, if something went wrong, **Not saved** with **Retry**.
## Draft the body with AI
If you've connected an AI provider, an empty body offers a first draft. See [Connecting an AI provider](/guides/using-ai) to set one up.
<Frame>
<img src="/images/guides/writing-a-cover-letter/letter-body-empty.webp" alt="An empty letter body reading Start typing, or draft from what we know: the Northwind Games posting and your resume, with Draft from the posting and Write it myself buttons" />
</Frame>
<Steps>
<Step title="Start the draft">
Select **Draft from the posting** when the letter is linked to an application, or **Draft from your resume** when it only has a resume. The draft uses only what the letter is linked to: the posting, your resume, or both. Select **Stop** to cancel it while it's being written.
</Step>
<Step title="Refine it">
When the draft is ready, ask for **Shorter** or **More personal** versions, or select **Discard** to drop it.
</Step>
<Step title="Keep it">
Select **Keep** to put the draft in the body. Until you do, the draft never replaces anything, and you can edit it freely afterwards.
</Step>
</Steps>
To draft, a letter needs a linked resume or application. You can also open the Assistant with <kbd>⌘</kbd> <kbd>J</kbd> (<kbd>Ctrl</kbd> <kbd>J</kbd> on Windows and Linux) to rework the letter; see [Using the Assistant](/guides/using-the-assistant).
## Match your resume's design
By default, a letter linked to a resume uses the resume's template, type and colors, so the two always look like a pair. When you change the resume's design, the letter follows.
<Steps>
<Step title="Open Design">
Select **Design** in the editor bar, or press <kbd>2</kbd>.
</Step>
<Step title="Keep it matching, or give it its own design">
With **Match** turned on, the letter follows the resume. Select **Change the resume's design** to open the resume in **Design**.
<Frame>
<img src="/images/guides/writing-a-cover-letter/letter-design-matching.webp" alt="Matching the resume section with the switch Match Game Developer Resume turned on and a link Change the resume's design" />
</Frame>
Turn **Match** off to give the letter a design of its own. It keeps the current design as a starting point, and **Template**, **Type**, **Color** and **Page** settings appear for the letter alone. Hover over a template to preview it on the page.
<Frame>
<img src="/images/guides/writing-a-cover-letter/letter-design-own.webp" alt="Design panel with Match turned off, labelled The letter keeps a design of its own, and a Template grid with Azurill selected" />
</Frame>
</Step>
</Steps>
Turn **Match** back on at any time to follow the resume again. A letter with no resume chosen under **From** always has its own design.
## Download the letter
Select **Download PDF** in the editor bar, or press <kbd>⌘</kbd> <kbd>P</kbd> (<kbd>Ctrl</kbd> <kbd>P</kbd>). The PDF includes the header with your name and contact details, and is named after you, for example `David-Kowalski-Cover-Letter.pdf`.
For other formats, select **Share**, or press <kbd>⌘</kbd> <kbd>Shift</kbd> <kbd>E</kbd> (<kbd>Ctrl</kbd> <kbd>Shift</kbd> <kbd>E</kbd>). The **Share & export** sheet opens on **Download**:
<Frame caption="Download options for a letter">
<img src="/images/guides/writing-a-cover-letter/letter-share-download.webp" alt="The Share and export sheet for a letter with Download selected, listing PDF, Resume plus letter (2 files), Word, Markdown and JSON, a File name field and a Download PDF button" />
</Frame>
| Option | What you get |
| --- | --- |
| **PDF** | The letter exactly as it looks on the page. Best for applying. |
| **Resume + letter** | The linked resume and this letter as two PDFs, named to match. Shows only when the letter has a resume. |
| **Word** | A `.docx` file with simplified layout, for portals that ask for Word. |
| **Markdown** | Plain text with headings, to paste into application forms. |
| **JSON** | A backup of the letter that imports back into Reactive Resume as a letter. |
Edit **File name** if you like, then select the download button.
Letters have no public link. To share one, download it and attach the file.
When you download a resume from its own Share sheet and the resume's application has a letter, you can also tick **Also download the … cover letter** (the label names the company) to get both files at once. See [Exporting your resume](/guides/exporting-your-resume).
## Letters and applications
- Each application has one letter. If you link a letter to an application that already has one, the new letter takes its place.
- When the application moves to **Applied** or a later stage, the letter as it reads then is saved in its **History** as the version you sent. The application shows it under **What you sent** as "Version sent" with the date.
- In **Documents**, a letter's menu has **Link to application…** to link or unlink it without opening it.
To see earlier versions of a letter, open **History** in the editor bar (the clock icon) or the **History** tab in **Share & export**. It works like resume history; see [Undoing changes and version history](/guides/undoing-changes-and-version-history).
## Manage a letter
Select the letter's name in the editor bar to **Rename…**, **Duplicate**, **Lock editing** or **Move to Trash**. A locked letter can't be edited until you select **Unlock editing**. A letter in Trash can be restored for 30 days; see [Using the trash](/guides/using-the-trash).
<Note>
In earlier versions, a cover letter could be a section inside a resume. Those letters are now letters of their own in **Documents**, named after the resume and the letter (for example "Frontend Resume — Cover Letter"), still linked to the resume's details and design. The resume no longer contains them. These older letters keep their recipient block as you wrote it under **To**, instead of separate name, company and date fields.
</Note>
## Related guides
<CardGroup cols={2}>
<Card title="Tailoring a resume for a job" href="/guides/tailoring-a-resume-for-a-job">
Copy a resume for an application and write its letter.
</Card>
<Card title="Managing an application" href="/guides/managing-an-application">
Track stages, what you sent and next steps.
</Card>
<Card title="Choosing a template" href="/guides/choosing-a-template">
Pick the design your resume and letter share.
</Card>
<Card title="Checking your resume before you apply" href="/guides/checking-your-resume">
Make sure software can read the resume you send with your letter.
</Card>
</CardGroup>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 188 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Some files were not shown because too many files have changed in this diff Show More