use vite+

This commit is contained in:
Amruth Pillai
2026-03-18 22:03:24 +01:00
parent d1dac8aeca
commit 192880e416
427 changed files with 58915 additions and 58759 deletions
+65 -65
View File
@@ -53,95 +53,95 @@ rss: true
</Update>
<Update label="v5.0.9" description="9th February 2026">
- Add Computer Modern web fonts to the font selector, allowing the user to choose from a variety of "Computer Modern"
(LaTeX) fonts. - This lets you create a resume that looks just like a LaTeX document, with the same fonts and styles.
- Update dependencies to the latest versions.
- Add Computer Modern web fonts to the font selector, allowing the user to choose from a variety of "Computer Modern"
(LaTeX) fonts. - This lets you create a resume that looks just like a LaTeX document, with the same fonts and styles.
- Update dependencies to the latest versions.
</Update>
<Update label="v5.0.8" description="9th February 2026">
- Remove Passkey support from the authentication system, as it was causing issues with the authentication provider. -
Update dependencies to the latest versions.
- Remove Passkey support from the authentication system, as it was causing issues with the authentication provider. -
Update dependencies to the latest versions.
</Update>
<Update label="v5.0.7" description="9th February 2026">
- Introduce a new **MCP (Model Context Protocol) server** that lets you manage and edit resumes from any
MCP-compatible AI tool — Claude Desktop, Cursor, Codex, and more. Supports listing, reading, creating, deleting,
locking/unlocking, and patching resumes via natural language. [(guide)](/guides/using-the-mcp-server) - Add an **AI
Chat** panel to the resume builder, allowing you to modify your resume through conversational AI directly within the
editor. The chat uses tool-calling to apply JSON Patch operations to your resume in real-time, with visual feedback
for each change. - Add a system prompt and `patch_resume` tool for the AI chat, enabling structured, minimal-diff
resume edits following RFC 6902 JSON Patch operations. - Chat history is now persisted per resume in localStorage, so
conversations are preserved across sessions. - Fix rendering issues in the Lapras and Onyx resume templates. -
Improvements to the Combobox and ScrollArea UI components. - Fix an issue with skills item rendering in the shared
resume components. - Update authentication configuration and auth route handling. - Update the JSON Schema to reflect
the latest resume data model. - Update dependencies to the latest versions.
- Introduce a new **MCP (Model Context Protocol) server** that lets you manage and edit resumes from any
MCP-compatible AI tool — Claude Desktop, Cursor, Codex, and more. Supports listing, reading, creating, deleting,
locking/unlocking, and patching resumes via natural language. [(guide)](/guides/using-the-mcp-server) - Add an **AI
Chat** panel to the resume builder, allowing you to modify your resume through conversational AI directly within the
editor. The chat uses tool-calling to apply JSON Patch operations to your resume in real-time, with visual feedback
for each change. - Add a system prompt and `patch_resume` tool for the AI chat, enabling structured, minimal-diff
resume edits following RFC 6902 JSON Patch operations. - Chat history is now persisted per resume in localStorage, so
conversations are preserved across sessions. - Fix rendering issues in the Lapras and Onyx resume templates. -
Improvements to the Combobox and ScrollArea UI components. - Fix an issue with skills item rendering in the shared
resume components. - Update authentication configuration and auth route handling. - Update the JSON Schema to reflect
the latest resume data model. - Update dependencies to the latest versions.
</Update>
<Update label="v5.0.6" description="8th February 2026">
- Implement Atomic Resume Patching API for fine-grained resume updates, allowing partial, atomic updates to resumes
via a new PATCH endpoint. [#2692](https://github.com/amruthpillai/reactive-resume/pull/2692) - The API endpoint `PUT
/resume/{id}` now returns the updated resume object instead of void. Also, resume routing/services now use explicit
DTOs for input and output schemas. [#2688](https://github.com/amruthpillai/reactive-resume/pull/2688) - Add error
logging for API server errors (server-side only) to improve debugging and reliability. - Refactor and clean up
imports/exports for clarity and maintainability. - Added `.devcontainer` configuration for improved contributor
development environment. - Update dependencies to the latest versions. - Add build status badge and documentation link
to README. - Sync latest translations from Crowdin (notably: French, other languages). - Other minor fixes and
improvements.
- Implement Atomic Resume Patching API for fine-grained resume updates, allowing partial, atomic updates to resumes
via a new PATCH endpoint. [#2692](https://github.com/amruthpillai/reactive-resume/pull/2692) - The API endpoint `PUT
/resume/{id}` now returns the updated resume object instead of void. Also, resume routing/services now use explicit
DTOs for input and output schemas. [#2688](https://github.com/amruthpillai/reactive-resume/pull/2688) - Add error
logging for API server errors (server-side only) to improve debugging and reliability. - Refactor and clean up
imports/exports for clarity and maintainability. - Added `.devcontainer` configuration for improved contributor
development environment. - Update dependencies to the latest versions. - Add build status badge and documentation link
to README. - Sync latest translations from Crowdin (notably: French, other languages). - Other minor fixes and
improvements.
</Update>
<Update label="v5.0.5" description="31st January 2026">
- Implement Cover Letter functionality in the resume builder, allowing the user to create cover letters as custom
sections. [(link)](/guides/adding-a-cover-letter) - Implement full-screen mode for the rich text editor in the resume
builder, allowing the user to write in a more focused environment. - Implement a new custom section type: `summary`,
which allows the user to add another "summary" like section to the resume. - Implement a `useFormBlocker` hook to
prevent the user from closing a dialog while the form has unsaved changes. - Fix an issue where keywords spacing was
not consistent in the interests section. [#2631](https://github.com/amruthpillai/reactive-resume/pull/2631) - Fix an
issue where the AI connection test was not working correctly, also return appropriate error messages for AI provider
issues.
- Implement Cover Letter functionality in the resume builder, allowing the user to create cover letters as custom
sections. [(link)](/guides/adding-a-cover-letter) - Implement full-screen mode for the rich text editor in the resume
builder, allowing the user to write in a more focused environment. - Implement a new custom section type: `summary`,
which allows the user to add another "summary" like section to the resume. - Implement a `useFormBlocker` hook to
prevent the user from closing a dialog while the form has unsaved changes. - Fix an issue where keywords spacing was
not consistent in the interests section. [#2631](https://github.com/amruthpillai/reactive-resume/pull/2631) - Fix an
issue where the AI connection test was not working correctly, also return appropriate error messages for AI provider
issues.
</Update>
<Update label="v5.0.4" description="28th January 2026">
- Bring back Undo/Redo functionality in the resume builder for improved editing experience. - Arrange the sidebar
builder dynamically based on the section type in each template.
[#2564](https://github.com/amruthpillai/reactive-resume/pull/2603) - Remove extra spacing when proficiency is empty.
[#2607](https://github.com/amruthpillai/reactive-resume/pull/2626) - Fix rendering in Pikachu template: conditionally
render header and page picture using `isFirstPage`, and respect the `fullWidth` property for page layout. - Fixes to
templates to improve layout and rendering consistency. - Fix GitHub OAuth login for users migrated from previous
versions. - Improve communication with the printer service and reduce resource usage for better PDF generation
reliability. - Update and sync translations from Crowdin (Afrikaans, Persian, Portuguese/Brazilian, and other
languages). - Update translation sources and configuration. - Fix "empty" Git merge remnants in codebase. - Update
package dependencies and fix self-hosting guide links in README. - Remove dead code, update screenshots, and add PWA
(Progressive Web App) support. - Update links to PDF example files in documentation. - Other bug fixes and minor
improvements (#2542, #2573, #2598).
- Bring back Undo/Redo functionality in the resume builder for improved editing experience. - Arrange the sidebar
builder dynamically based on the section type in each template.
[#2564](https://github.com/amruthpillai/reactive-resume/pull/2603) - Remove extra spacing when proficiency is empty.
[#2607](https://github.com/amruthpillai/reactive-resume/pull/2626) - Fix rendering in Pikachu template: conditionally
render header and page picture using `isFirstPage`, and respect the `fullWidth` property for page layout. - Fixes to
templates to improve layout and rendering consistency. - Fix GitHub OAuth login for users migrated from previous
versions. - Improve communication with the printer service and reduce resource usage for better PDF generation
reliability. - Update and sync translations from Crowdin (Afrikaans, Persian, Portuguese/Brazilian, and other
languages). - Update translation sources and configuration. - Fix "empty" Git merge remnants in codebase. - Update
package dependencies and fix self-hosting guide links in README. - Remove dead code, update screenshots, and add PWA
(Progressive Web App) support. - Update links to PDF example files in documentation. - Other bug fixes and minor
improvements (#2542, #2573, #2598).
</Update>
<Update label="v5.0.3" description="25th January 2026">
- Implement the ability to print Free-Form PDFs which do not have a fixed page height, allowing the user to fit the
content on a page as they see fit. [(link)](/guides/selecting-page-format) - Allow the user to override the default
endpoint for all AI providers, not just Ollama. Also display the default endpoint for each provider in the AI settings
page. - Updated the chip input component, to allow the user to add, edit, remove or reorder keywords for skills and
other sections. - Improved RTL support across the app, thanks to @obreo for the contribution.
[(link)](https://github.com/amruthpillai/reactive-resume/pull/2583) - Updates to the translation configuration to
remove line numbers from the translation files, as this was causing unnecessary diffs. - Updated the video on the
homepage to be lighter and faster to load, while still maintaining the same quality. - Increased the screenshot TTL
for resumes, to avoid regenerating screenshots unnecessarily unless the resume has been updated recently (in the last
hour). - Update dependencies and translations to the latest versions.
- Implement the ability to print Free-Form PDFs which do not have a fixed page height, allowing the user to fit the
content on a page as they see fit. [(link)](/guides/selecting-page-format) - Allow the user to override the default
endpoint for all AI providers, not just Ollama. Also display the default endpoint for each provider in the AI settings
page. - Updated the chip input component, to allow the user to add, edit, remove or reorder keywords for skills and
other sections. - Improved RTL support across the app, thanks to @obreo for the contribution.
[(link)](https://github.com/amruthpillai/reactive-resume/pull/2583) - Updates to the translation configuration to
remove line numbers from the translation files, as this was causing unnecessary diffs. - Updated the video on the
homepage to be lighter and faster to load, while still maintaining the same quality. - Increased the screenshot TTL
for resumes, to avoid regenerating screenshots unnecessarily unless the resume has been updated recently (in the last
hour). - Update dependencies and translations to the latest versions.
</Update>
<Update label="v5.0.2" description="24th January 2026">
- Added an agent skill `skills/resume-builder` for agentic AI assistants to build resumes for Reactive Resume through
conversational AI. - Added a new guide on how to fit content on a page, to avoid issues when exporting to PDF.
[(link)](/guides/fitting-content-on-a-page) - Display an alert when the content is too tall for a page, to help the
user fit the content on a page. - Fix an issue with the Ditgar template, where the page was not respecting the
`fullWidth` setting. - Updated the JSON Schema to conform to a proper format. - Updated the Discord Server invite link
to a new one. - Updated dependencies to the latest versions.
- Added an agent skill `skills/resume-builder` for agentic AI assistants to build resumes for Reactive Resume through
conversational AI. - Added a new guide on how to fit content on a page, to avoid issues when exporting to PDF.
[(link)](/guides/fitting-content-on-a-page) - Display an alert when the content is too tall for a page, to help the
user fit the content on a page. - Fix an issue with the Ditgar template, where the page was not respecting the
`fullWidth` setting. - Updated the JSON Schema to conform to a proper format. - Updated the Discord Server invite link
to a new one. - Updated dependencies to the latest versions.
</Update>
<Update label="v5.0.1" description="23th January 2026">
- Updated translations from Crowdin. - Added a Community Spotlight section to the documentation. - Remove `-r
require-metadata` from the Dockerfile as it was not needed. - Fixed inconsistencies in the docker compose examples in
the documentation. - Fixed an issue with usernames not allowing hyphens in them. - Fixed issues with the printer
service, when using the `getResumeScreenshot` or `printResumeAsPDF` endpoints.
- Updated translations from Crowdin. - Added a Community Spotlight section to the documentation. - Remove `-r
require-metadata` from the Dockerfile as it was not needed. - Fixed inconsistencies in the docker compose examples in
the documentation. - Fixed an issue with usernames not allowing hyphens in them. - Fixed issues with the printer
service, when using the `getResumeScreenshot` or `printResumeAsPDF` endpoints.
</Update>
<Update label="v5.0.0" description="22th January 2026">
+3 -3
View File
@@ -4,9 +4,9 @@ description: "A showcase of articles, videos, and social media posts from the Re
---
<Note>
Have you created something that makes use of Reactive Resume, or spread the word about it in your own way? I'd love to
feature it here! Send me an email at [hello@amruthpillai.com](mailto:hello@amruthpillai.com) and I'll make sure to add
it to this page.
Have you created something that makes use of Reactive Resume, or spread the word about it in your own way? I'd love to
feature it here! Send me an email at [hello@amruthpillai.com](mailto:hello@amruthpillai.com) and I'll make sure to add
it to this page.
</Note>
---
+26 -26
View File
@@ -12,14 +12,14 @@ This guide provides a comprehensive overview of Reactive Resume's architecture a
Reactive Resume is built with a modern, type-safe stack:
<CardGroup cols={2}>
<Card title="Frontend" icon="browser">
- **React 19** with TanStack Start - **TypeScript** for type safety - **Tailwind CSS** for styling - **Radix UI**
for accessible components
</Card>
<Card title="Backend" icon="server">
- **ORPC** for type-safe RPC - **Drizzle ORM** with PostgreSQL - **Better Auth** for authentication - **Sharp** for
image processing
</Card>
<Card title="Frontend" icon="browser">
- **React 19** with TanStack Start - **TypeScript** for type safety - **Tailwind CSS** for styling - **Radix UI**
for accessible components
</Card>
<Card title="Backend" icon="server">
- **ORPC** for type-safe RPC - **Drizzle ORM** with PostgreSQL - **Better Auth** for authentication - **Sharp** for
image processing
</Card>
</CardGroup>
---
@@ -183,10 +183,10 @@ The database schema is defined using Drizzle ORM in `src/integrations/drizzle/sc
import { pgTable, text, timestamp, uuid } from "drizzle-orm/pg-core";
export const resume = pgTable("resume", {
id: uuid("id").primaryKey().defaultRandom(),
title: text("title").notNull(),
slug: text("slug").notNull(),
// ... more fields
id: uuid("id").primaryKey().defaultRandom(),
title: text("title").notNull(),
slug: text("slug").notNull(),
// ... more fields
});
```
@@ -206,12 +206,12 @@ export const resume = pgTable("resume", {
import { cn } from "@/utils/style";
interface MyComponentProps {
title: string;
className?: string;
title: string;
className?: string;
}
export const MyComponent = ({ title, className }: MyComponentProps) => {
return <div className={cn("p-4", className)}>{title}</div>;
return <div className={cn("p-4", className)}>{title}</div>;
};
```
@@ -226,11 +226,11 @@ export const MyComponent = ({ title, className }: MyComponentProps) => {
import { createFileRoute } from "@tanstack/react-router";
export const Route = createFileRoute("/my-page")({
component: MyPage,
component: MyPage,
});
function MyPage() {
return <div>My Page Content</div>;
return <div>My Page Content</div>;
}
```
@@ -246,9 +246,9 @@ import { z } from "zod";
import { publicProcedure, router } from "../server";
export const myRouter = router({
hello: publicProcedure.input(z.object({ name: z.string() })).handler(async ({ input }) => {
return { message: `Hello, ${input.name}!` };
}),
hello: publicProcedure.input(z.object({ name: z.string() })).handler(async ({ input }) => {
return { message: `Hello, ${input.name}!` };
}),
});
```
@@ -313,10 +313,10 @@ const title = t`Welcome`;
## Need Help?
<CardGroup cols={2}>
<Card title="GitHub Discussions" icon="comments" href="https://github.com/amruthpillai/reactive-resume/discussions">
Ask questions and discuss ideas with the community.
</Card>
<Card title="GitHub Issues" icon="bug" href="https://github.com/amruthpillai/reactive-resume/issues">
Report bugs or request features.
</Card>
<Card title="GitHub Discussions" icon="comments" href="https://github.com/amruthpillai/reactive-resume/discussions">
Ask questions and discuss ideas with the community.
</Card>
<Card title="GitHub Issues" icon="bug" href="https://github.com/amruthpillai/reactive-resume/issues">
Report bugs or request features.
</Card>
</CardGroup>
+11 -11
View File
@@ -4,8 +4,8 @@ description: "Set up a local development environment for Reactive Resume"
---
<Info>
**Prerequisites**: - [Node.js](https://nodejs.org/) v20 or higher - [pnpm](https://pnpm.io/) v10.28.0 or higher
(package manager) - [Docker](https://docs.docker.com/get-docker/) and Docker Compose - [Git](https://git-scm.com/)
**Prerequisites**: - [Node.js](https://nodejs.org/) v20 or higher - [pnpm](https://pnpm.io/) v10.28.0 or higher
(package manager) - [Docker](https://docs.docker.com/get-docker/) and Docker Compose - [Git](https://git-scm.com/)
</Info>
This guide walks you through setting up Reactive Resume for local development. Whether you're contributing to the project or customizing it for your needs, these steps will get you up and running.
@@ -265,9 +265,9 @@ pnpm run typecheck
```
<Tip>
Configure your IDE to use Oxlint for automatic linting and Oxfmt for automatic formatting on save. For VS Code,
install the [Oxlint extension](https://marketplace.visualstudio.com/items?itemName=oxc.oxc-vscode) and configure the
settings in `.vscode/settings.json`.
Configure your IDE to use Oxlint for automatic linting and Oxfmt for automatic formatting on save. For VS Code,
install the [Oxlint extension](https://marketplace.visualstudio.com/items?itemName=oxc.oxc-vscode) and configure the
settings in `.vscode/settings.json`.
</Tip>
---
@@ -303,10 +303,10 @@ pnpm run typecheck
## Next Steps
<CardGroup cols={2}>
<Card title="Project Architecture" icon="folder-open" href="/contributing/architecture">
Deep dive into the project architecture and codebase structure.
</Card>
<Card title="GitHub Repository" icon="github" href="https://github.com/amruthpillai/reactive-resume">
View the source code and contribute to the project.
</Card>
<Card title="Project Architecture" icon="folder-open" href="/contributing/architecture">
Deep dive into the project architecture and codebase structure.
</Card>
<Card title="GitHub Repository" icon="github" href="https://github.com/amruthpillai/reactive-resume">
View the source code and contribute to the project.
</Card>
</CardGroup>
+24 -24
View File
@@ -12,8 +12,8 @@ Reactive Resume is used by people all around the world, and translations help ma
Reactive Resume uses [Crowdin](https://crowdin.com/) as its localization management platform. Crowdin provides a user-friendly interface where translators can contribute translations without needing to write code or work with files directly.
<Info>
The Reactive Resume Crowdin project is available at
[https://crowdin.com/project/reactive-resume](https://crowdin.com/project/reactive-resume).
The Reactive Resume Crowdin project is available at
[https://crowdin.com/project/reactive-resume](https://crowdin.com/project/reactive-resume).
</Info>
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.
@@ -94,8 +94,8 @@ Some technical terms (like "PDF", "URL", "JSON") are often kept in English acros
If your language is not listed in the Crowdin project, you can request it to be added.
<Warning>
Before requesting a new language, please check if it's already available in the [Crowdin
project](https://crowdin.com/project/reactive-resume).
Before requesting a new language, please check if it's already available in the [Crowdin
project](https://crowdin.com/project/reactive-resume).
</Warning>
To request a new language:
@@ -115,8 +115,8 @@ Once approved, the language will be added to Crowdin and you can begin translati
Translations submitted on Crowdin are synced to the codebase periodically. Once merged, they will be included in the next release of Reactive Resume.
<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.
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>
---
@@ -124,18 +124,18 @@ Translations submitted on Crowdin are synced to the codebase periodically. Once
## Tips for Effective Translation
<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>
<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>
---
@@ -143,12 +143,12 @@ Translations submitted on Crowdin are synced to the codebase periodically. Once
## Need Help?
<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/amruthpillai/reactive-resume/issues">
Report issues or request new languages.
</Card>
<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/amruthpillai/reactive-resume/issues">
Report issues or request new languages.
</Card>
</CardGroup>
---
+148 -148
View File
@@ -1,150 +1,150 @@
{
"$schema": "https://mintlify.com/docs.json",
"theme": "mint",
"name": "Reactive Resume",
"favicon": "/favicon.svg",
"description": "A one-of-a-kind resume builder that keeps your privacy in mind. Completely secure, customizable, portable, open-source and free forever. Try it out today!",
"seo": {
"indexing": "all",
"metatags": {
"canonical": "https://docs.rxresu.me",
"og:image": "https://rxresu.me/opengraph/banner.jpg"
}
},
"fonts": {
"heading": {
"family": "IBM Plex Sans"
},
"body": {
"family": "IBM Plex Sans"
}
},
"colors": {
"primary": "#166534",
"light": "#07C983",
"dark": "#15803D"
},
"navigation": {
"tabs": [
{
"icon": "book",
"tab": "Documentation",
"groups": [
{
"group": "Getting Started",
"pages": [
"getting-started/index",
"getting-started/quickstart",
"guides/checking-service-status",
"guides/accessing-the-previous-version"
]
},
{
"group": "Account",
"pages": [
"guides/creating-an-account",
"guides/updating-your-profile",
"guides/linking-social-accounts",
"guides/deleting-your-account"
]
},
{
"group": "Resume Builder",
"pages": [
"guides/creating-your-first-resume",
"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/exporting-your-resume",
"guides/sharing-your-resume-publicly",
"guides/using-private-notes",
"guides/using-custom-css"
]
},
{
"group": "Security",
"pages": ["guides/setting-up-two-factor-authentication", "guides/setting-up-passkeys"]
},
{
"group": "Integrations",
"pages": [
"guides/using-the-api",
"guides/using-the-patch-api",
"guides/using-the-mcp-server",
"guides/using-ai",
"guides/json-resume-schema"
]
},
{
"group": "Self-Hosting",
"pages": ["self-hosting/docker", "self-hosting/examples", "self-hosting/sso", "self-hosting/migration"]
},
{
"group": "Contributing",
"pages": ["contributing/architecture", "contributing/development", "contributing/translations"]
},
{
"group": "Community",
"pages": ["community/spotlight"]
},
{
"group": "Legal",
"pages": ["legal/license", "legal/privacy-policy", "legal/terms-of-service"]
}
]
},
{
"icon": "clock",
"tab": "Changelog",
"pages": ["changelog/index"]
},
{
"icon": "code",
"tab": "API Reference",
"openapi": "/spec.json"
}
],
"global": {
"anchors": [
{
"icon": "link",
"anchor": "Reactive Resume",
"href": "https://rxresu.me"
},
{
"icon": "github",
"anchor": "Source Code",
"href": "https://github.com/amruthpillai/reactive-resume"
}
]
}
},
"logo": {
"light": "/logo/light.svg",
"dark": "/logo/dark.svg"
},
"navbar": {
"links": [
{
"label": "Support",
"href": "https://github.com/amruthpillai/reactive-resume/issues"
}
],
"primary": {
"type": "button",
"label": "Get Started",
"href": "https://rxresu.me"
}
},
"contextual": {
"options": ["copy", "view"]
},
"footer": {
"socials": {
"website": "https://rxresu.me",
"github": "https://github.com/amruthpillai/reactive-resume"
}
}
"$schema": "https://mintlify.com/docs.json",
"theme": "mint",
"name": "Reactive Resume",
"favicon": "/favicon.svg",
"description": "A one-of-a-kind resume builder that keeps your privacy in mind. Completely secure, customizable, portable, open-source and free forever. Try it out today!",
"seo": {
"indexing": "all",
"metatags": {
"canonical": "https://docs.rxresu.me",
"og:image": "https://rxresu.me/opengraph/banner.jpg"
}
},
"fonts": {
"heading": {
"family": "IBM Plex Sans"
},
"body": {
"family": "IBM Plex Sans"
}
},
"colors": {
"primary": "#166534",
"light": "#07C983",
"dark": "#15803D"
},
"navigation": {
"tabs": [
{
"icon": "book",
"tab": "Documentation",
"groups": [
{
"group": "Getting Started",
"pages": [
"getting-started/index",
"getting-started/quickstart",
"guides/checking-service-status",
"guides/accessing-the-previous-version"
]
},
{
"group": "Account",
"pages": [
"guides/creating-an-account",
"guides/updating-your-profile",
"guides/linking-social-accounts",
"guides/deleting-your-account"
]
},
{
"group": "Resume Builder",
"pages": [
"guides/creating-your-first-resume",
"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/exporting-your-resume",
"guides/sharing-your-resume-publicly",
"guides/using-private-notes",
"guides/using-custom-css"
]
},
{
"group": "Security",
"pages": ["guides/setting-up-two-factor-authentication", "guides/setting-up-passkeys"]
},
{
"group": "Integrations",
"pages": [
"guides/using-the-api",
"guides/using-the-patch-api",
"guides/using-the-mcp-server",
"guides/using-ai",
"guides/json-resume-schema"
]
},
{
"group": "Self-Hosting",
"pages": ["self-hosting/docker", "self-hosting/examples", "self-hosting/sso", "self-hosting/migration"]
},
{
"group": "Contributing",
"pages": ["contributing/architecture", "contributing/development", "contributing/translations"]
},
{
"group": "Community",
"pages": ["community/spotlight"]
},
{
"group": "Legal",
"pages": ["legal/license", "legal/privacy-policy", "legal/terms-of-service"]
}
]
},
{
"icon": "clock",
"tab": "Changelog",
"pages": ["changelog/index"]
},
{
"icon": "code",
"tab": "API Reference",
"openapi": "/spec.json"
}
],
"global": {
"anchors": [
{
"icon": "link",
"anchor": "Reactive Resume",
"href": "https://rxresu.me"
},
{
"icon": "github",
"anchor": "Source Code",
"href": "https://github.com/amruthpillai/reactive-resume"
}
]
}
},
"logo": {
"light": "/logo/light.svg",
"dark": "/logo/dark.svg"
},
"navbar": {
"links": [
{
"label": "Support",
"href": "https://github.com/amruthpillai/reactive-resume/issues"
}
],
"primary": {
"type": "button",
"label": "Get Started",
"href": "https://rxresu.me"
}
},
"contextual": {
"options": ["copy", "view"]
},
"footer": {
"socials": {
"website": "https://rxresu.me",
"github": "https://github.com/amruthpillai/reactive-resume"
}
}
}
+33 -33
View File
@@ -4,7 +4,7 @@ description: "Welcome to the documentation for Reactive Resume, a free and open-
---
<Frame>
<img src="/images/getting-started/banner.webp" alt="Reactive Resume Banner" />
<img src="/images/getting-started/banner.webp" alt="Reactive Resume Banner" />
</Frame>
## What is Reactive Resume?
@@ -12,24 +12,24 @@ description: "Welcome to the documentation for Reactive Resume, a free and open-
**Reactive Resume** is a free and open-source resume builder designed to simplify the process of creating, updating, and sharing your professional resume. Built with privacy as a core principle, it gives you complete control over your data while providing a powerful, modern experience.
<CardGroup cols={2}>
<Card title="Privacy First" icon="shield-check">
Your data stays yours. No tracking, no ads, and complete transparency with our open-source codebase.
</Card>
<Card title="Beautiful Templates" icon="palette">
Choose from professionally designed templates that make your resume stand out from the crowd.
</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>
<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>
<Card title="Privacy First" icon="shield-check">
Your data stays yours. No tracking, no ads, and complete transparency with our open-source codebase.
</Card>
<Card title="Beautiful Templates" icon="palette">
Choose from professionally designed templates that make your resume stand out from the crowd.
</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>
<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>
</CardGroup>
## Key Features
<Frame>
<img src="/images/getting-started/infographic.webp" alt="An infographic of the major features of Reactive Resume" />
<img src="/images/getting-started/infographic.webp" alt="An infographic of the major features of Reactive Resume" />
</Frame>
<AccordionGroup>
@@ -68,12 +68,12 @@ description: "Welcome to the documentation for Reactive Resume, a free and open-
Whether you want to use our hosted version or run your own instance, Reactive Resume has got you covered.
<CardGroup cols={2}>
<Card title="Quickstart" icon="rocket" href="/getting-started/quickstart">
Get up and running in minutes with our hosted version or deploy your own instance.
</Card>
<Card title="Development Setup" icon="code" href="/contributing/development">
Set up a local development environment to contribute or customize Reactive Resume.
</Card>
<Card title="Quickstart" icon="rocket" href="/getting-started/quickstart">
Get up and running in minutes with our hosted version or deploy your own instance.
</Card>
<Card title="Development Setup" icon="code" href="/contributing/development">
Set up a local development environment to contribute or customize Reactive Resume.
</Card>
</CardGroup>
## Tech Stack
@@ -95,20 +95,20 @@ Reactive Resume is built with modern web technologies:
## Community & Support
<CardGroup cols={2}>
<Card title="GitHub" icon="github" href="https://github.com/amruthpillai/reactive-resume">
Star the repo, report issues, and contribute to the project.
</Card>
<Card title="Reddit" icon="reddit" href="https://reddit.com/r/reactiveresume">
Join our Reddit community to get help and connect with other users.
</Card>
<Card title="Discord" icon="discord" href="https://discord.gg/aSyA5ZSxpb">
Join our Discord server to get help and connect with other users.
</Card>
<Card title="Sponsor" icon="heart" href="https://opencollective.com/reactive-resume">
Support the development and long-term sustainability of Reactive Resume.
</Card>
<Card title="GitHub" icon="github" href="https://github.com/amruthpillai/reactive-resume">
Star the repo, report issues, and contribute to the project.
</Card>
<Card title="Reddit" icon="reddit" href="https://reddit.com/r/reactiveresume">
Join our Reddit community to get help and connect with other users.
</Card>
<Card title="Discord" icon="discord" href="https://discord.gg/aSyA5ZSxpb">
Join our Discord server to get help and connect with other users.
</Card>
<Card title="Sponsor" icon="heart" href="https://opencollective.com/reactive-resume">
Support the development and long-term sustainability of Reactive Resume.
</Card>
</CardGroup>
<Note>
**Need help?** Feel free to reach out via [email](mailto:hello@amruthpillai.com) or open an issue on GitHub.
**Need help?** Feel free to reach out via [email](mailto:hello@amruthpillai.com) or open an issue on GitHub.
</Note>
+24 -24
View File
@@ -8,12 +8,12 @@ description: "Get started with Reactive Resume in minutes — use our hosted ver
Reactive Resume offers flexibility in how you want to use it. Choose the option that best fits your needs:
<CardGroup cols={2}>
<Card title="Use the Cloud Version" icon="cloud" href="#use-the-cloud-version">
The fastest way to get started. **Recommended for most users.**
</Card>
<Card title="Self-Host with Docker" icon="docker" href="#self-host-with-docker">
Deploy your own instance with complete control. **Requires some technical knowledge.**
</Card>
<Card title="Use the Cloud Version" icon="cloud" href="#use-the-cloud-version">
The fastest way to get started. **Recommended for most users.**
</Card>
<Card title="Self-Host with Docker" icon="docker" href="#self-host-with-docker">
Deploy your own instance with complete control. **Requires some technical knowledge.**
</Card>
</CardGroup>
---
@@ -59,8 +59,8 @@ Before you begin, ensure you have the following installed:
- [Docker Compose](https://docs.docker.com/compose/install/) (v2.0 or higher)
<Info>
There is <strong>no difference in features</strong> between the cloud-hosted version and the self-hosted option. Both
provide the same privacy, customization, and functionality. Choose whichever deployment type suits your needs!
There is <strong>no difference in features</strong> between the cloud-hosted version and the self-hosted option. Both
provide the same privacy, customization, and functionality. Choose whichever deployment type suits your needs!
</Info>
### Quick Deployment
@@ -166,17 +166,17 @@ Here's a complete list of environment variables you can configure:
> **Note:** Some variables are only required for using related features (OAuth, SMTP, S3, etc.) and can be left unset if unused.
<Note>
**Hybrid Setup Note**: The `PRINTER_APP_URL` variable is required when running Reactive Resume outside of Docker while
the printer service is running inside Docker. In this scenario, the printer needs to reach your local app to render
resumes for PDF generation. Since Docker containers cannot access `localhost` on your host machine directly, you must
set `PRINTER_APP_URL` to `http://host.docker.internal:3000`. This special hostname allows Docker containers to
communicate with services running on your host machine.
**Hybrid Setup Note**: The `PRINTER_APP_URL` variable is required when running Reactive Resume outside of Docker while
the printer service is running inside Docker. In this scenario, the printer needs to reach your local app to render
resumes for PDF generation. Since Docker containers cannot access `localhost` on your host machine directly, you must
set `PRINTER_APP_URL` to `http://host.docker.internal:3000`. This special hostname allows Docker containers to
communicate with services running on your host machine.
</Note>
<Note>
**Alternative Printer Options**: If you don't want to use browserless, you can use any headless Chrome/Chromium
instance with its remote debugging port open. For example, run `chromium --remote-debugging-port=9222` and point
`PRINTER_ENDPOINT` to that instance.
**Alternative Printer Options**: If you don't want to use browserless, you can use any headless Chrome/Chromium
instance with its remote debugging port open. For example, run `chromium --remote-debugging-port=9222` and point
`PRINTER_ENDPOINT` to that instance.
</Note>
---
@@ -184,15 +184,15 @@ Here's a complete list of environment variables you can configure:
## 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>
<Card title="Project Architecture" icon="folder-open" href="/contributing/architecture">
Learn about the project structure and architecture.
</Card>
<Card title="Development Setup" icon="code" href="/contributing/development">
Set up a development environment to contribute or customize Reactive Resume.
</Card>
<Card title="Project Architecture" icon="folder-open" href="/contributing/architecture">
Learn about the project structure and architecture.
</Card>
</CardGroup>
<Note>
**Having trouble?** Check our [GitHub Issues](https://github.com/amruthpillai/reactive-resume/issues) or reach out via
[email](mailto:hello@amruthpillai.com).
**Having trouble?** Check our [GitHub Issues](https://github.com/amruthpillai/reactive-resume/issues) or reach out via
[email](mailto:hello@amruthpillai.com).
</Note>
@@ -22,8 +22,8 @@ There are several reasons why v4 remains available:
The previous version will continue to run for as long as possible—until the maintainer runs out of breath or funds to keep the server active. There are no immediate plans to shut it down.
<Warning>
While v4 will remain accessible for the foreseeable future, I recommend gradually transitioning to the latest version
to benefit from new features, improvements, and ongoing support.
While v4 will remain accessible for the foreseeable future, I recommend gradually transitioning to the latest version
to benefit from new features, improvements, and ongoing support.
</Warning>
## Accessing your v4 resumes
@@ -57,8 +57,8 @@ If you'd like to move your resumes to the latest version of Reactive Resume, you
4. Use the import feature to upload your JSON file (select the "Reactive Resume v4 (JSON)" option)
<Info>
Your existing resumes should already be available in the new version. If you don't see them, you can manually import
them using the steps above.
Your existing resumes should already be available in the new version. If you don't see them, you can manually import
them using the steps above.
</Info>
## Questions or issues?
+18 -18
View File
@@ -20,16 +20,16 @@ A cover letter is a personalized document that accompanies your resume when appl
</Step>
<Step title="Scroll to Custom Sections">
In the left sidebar, scroll down to find the **Custom Sections** area at the bottom.
In the left sidebar, scroll down to find the **Custom Sections** area at the bottom.
</Step>
<Step title="Add a new custom section">
Click <Badge>Add a new custom section</Badge> to open the section creation dialog.
Click <Badge>Add a new custom section</Badge> to open the section creation dialog.
</Step>
<Step title="Select 'Cover Letter' as the type">
In the dialog: - Enter a **Title** for your section (e.g., "Cover Letter" or "Cover Letter - [Company Name]") - Select
**Cover Letter** from the **Type** dropdown - Click **Create** to add the section
In the dialog: - Enter a **Title** for your section (e.g., "Cover Letter" or "Cover Letter - [Company Name]") - Select
**Cover Letter** from the **Type** dropdown - Click **Create** to add the section
</Step>
<Step title="Add a cover letter item">
@@ -77,8 +77,8 @@ The **Content** field is where you write the body of your cover letter. Include:
- **Sign-off**: "Sincerely," followed by your name
<Info>
The recipient and content are both rendered directly on your resume without a section header, giving your cover letter
a clean, professional appearance.
The recipient and content are both rendered directly on your resume without a section header, giving your cover letter
a clean, professional appearance.
</Info>
## Using fullscreen mode for writing
@@ -91,13 +91,13 @@ For a distraction-free writing experience, use the fullscreen mode in the rich t
</Step>
<Step title="Expand the editor">
In either the Recipient or Content field, click the **expand icon** (arrows pointing outward) in the bottom-right
corner of the editor.
In either the Recipient or Content field, click the **expand icon** (arrows pointing outward) in the bottom-right
corner of the editor.
</Step>
<Step title="Write in fullscreen">
The editor will expand to nearly fill your screen, giving you a focused writing environment with all formatting tools
available.
The editor will expand to nearly fill your screen, giving you a focused writing environment with all formatting tools
available.
</Step>
<Step title="Exit fullscreen">
@@ -139,8 +139,8 @@ Cover letters are typically on their own page, separate from the resume content.
</Steps>
<Warning>
When exporting as PDF, pages are rendered in order. If you want the cover letter first, place it on page 1 and move
your resume content to subsequent pages.
When exporting as PDF, pages are rendered in order. If you want the cover letter first, place it on page 1 and move
your resume content to subsequent pages.
</Warning>
## Tips for effective cover letters
@@ -148,18 +148,18 @@ Cover letters are typically on their own page, separate from the resume content.
<Tip>**Keep it concise**: Aim for 250-400 words. Recruiters spend about one minute reading cover letters.</Tip>
<Tip>
**Tailor each letter**: Customize your cover letter for each application. Reference specific job requirements and
company values.
**Tailor each letter**: Customize your cover letter for each application. Reference specific job requirements and
company values.
</Tip>
<Tip>
**Use the same styling**: Your cover letter will inherit the fonts and colors from your resume template, ensuring a
cohesive look.
**Use the same styling**: Your cover letter will inherit the fonts and colors from your resume template, ensuring a
cohesive look.
</Tip>
<Tip>
**Proofread carefully**: Spelling and grammar errors can disqualify your application. Review your letter before
exporting.
**Proofread carefully**: Spelling and grammar errors can disqualify your application. Review your letter before
exporting.
</Tip>
## Managing multiple cover letters
+12 -12
View File
@@ -8,7 +8,7 @@ description: "Learn how to check the status of Reactive Resume's servers and wha
You can monitor the health and availability of Reactive Resume's servers at any time by visiting our 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.
View real-time server metrics including uptime, CPU usage, memory usage, and more.
</Card>
The status page provides information such as:
@@ -48,8 +48,8 @@ If you notice the servers are experiencing high load or downtime, here are some
## A Note on Server Capacity
<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.
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>
The reality is:
@@ -67,17 +67,17 @@ If you find Reactive Resume valuable and want to help keep the servers running s
Your donations directly help cover server costs, improve infrastructure, and keep Reactive Resume free for everyone.
<Card title="Donate on Open Collective" icon="heart" href="https://opencollective.com/reactive-resume">
Support Reactive Resume's development and server costs through Open Collective. Every contribution helps keep the
service running.
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>
<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>
---
@@ -87,7 +87,7 @@ Your donations directly help cover server costs, improve infrastructure, and kee
If you need guaranteed uptime or want to avoid shared server limitations, you can always 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.
Learn how to deploy Reactive Resume on your own servers using Docker.
</Card>
Self-hosting gives you:
+18 -18
View File
@@ -20,7 +20,7 @@ Changing your resume template is simple and can be done at any time without losi
</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.
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">
@@ -66,13 +66,13 @@ Changing your resume template is simple and can be done at any time without losi
</Accordion>
<Accordion title="Think about content length" icon="ruler">
If you have a lot of experience to showcase, choose a template with efficient space usage. For shorter resumes,
templates with more white space can make your content feel more substantial.
If you have a lot of experience to showcase, choose a template with efficient space usage. For shorter resumes,
templates with more white space can make your content feel more substantial.
</Accordion>
<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.
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>
<Accordion title="Test with real content" icon="file-lines">
@@ -87,8 +87,8 @@ Changing your resume template is simple and can be done at any time without losi
Reactive Resume includes a variety of professionally designed templates. Each template can be further customized with your choice of colors, fonts, and layout options.
<Info>
All templates support the same features and sections. The difference is purely in how they present your information
visually.
All templates support the same features and sections. The difference is purely in how they present your information
visually.
</Info>
<div className="grid grid-cols-1 sm:grid-cols-2 gap-4">
@@ -97,47 +97,47 @@ Reactive Resume includes a variety of professionally designed templates. Each te
</Frame>
<Frame caption="Bronzor">
<img src="/images/templates/bronzor.webp" alt="Bronzor template preview" style={{ aspectRatio: "210/297" }} />
<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" }} />
<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" }} />
<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" }} />
<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" }} />
<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" }} />
<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" }} />
<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" }} />
<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" }} />
<img src="/images/templates/leafish.webp" alt="Leafish template preview" style={{ aspectRatio: "210/297" }} />
</Frame>
<Frame caption="Onyx">
<img src="/images/templates/onyx.webp" alt="Onyx template preview" style={{ aspectRatio: "210/297" }} />
<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" }} />
<img src="/images/templates/pikachu.webp" alt="Pikachu template preview" style={{ aspectRatio: "210/297" }} />
</Frame>
<Frame caption="Rhyhorn">
+6 -6
View File
@@ -59,12 +59,12 @@ description: "Learn how to create an account on Reactive Resume and get started
## Account Security Tips
<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>
<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>
---
+1 -1
View File
@@ -23,7 +23,7 @@ description: "Learn how to create your first resume in Reactive Resume, set a na
</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.
In the Resumes Dashboard, click on the <Badge>Create a new resume</Badge> card to open the creation form.
</Step>
<Step title="Name your resume">
+2 -2
View File
@@ -9,8 +9,8 @@ description: "Learn how to permanently delete your Reactive Resume account and a
</Step>
<Step title="Navigate to Danger Zone">
Once you're in the dashboard, look for the sidebar navigation on the left. Under the <Badge>Settings</Badge> section,
click on <Badge>Danger Zone</Badge>.
Once you're in the dashboard, look for the sidebar navigation on the left. Under the <Badge>Settings</Badge> section,
click on <Badge>Danger Zone</Badge>.
</Step>
<Step title="Type the confirmation text">
File diff suppressed because it is too large Load Diff
+22 -22
View File
@@ -6,16 +6,16 @@ description: "Learn how to reorganize and format your resume content to fit with
When your resume content overflows the page, Reactive Resume displays a warning just below the page. This guide explains how to reorganize and adjust your content so everything fits within your chosen page format.
<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"
/>
<img
src="/images/guides/fitting-content-on-a-page/screenshot-1.webp"
alt="Screenshot of the overflow warning message in the resume builder"
/>
</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.
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
@@ -36,8 +36,8 @@ With Free-Form:
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>
Since most resumes are viewed digitally today, Free-Form is often the best choice unless you specifically need to
print physical copies.
Since most resumes are viewed digitally today, Free-Form is often the best choice unless you specifically need to
print physical copies.
</Tip>
### 2. Shorten text blocks
@@ -58,10 +58,10 @@ 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"
/>
<img
src="/images/guides/fitting-content-on-a-page/screenshot-2.webp"
alt="Screenshot of the columns setting for a section"
/>
</Frame>
Good candidates for multi-column layouts:
@@ -75,8 +75,8 @@ Good candidates for multi-column layouts:
| Certifications (if brief) | > 2 columns |
<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.
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>
### 4. Move items to another page
@@ -92,8 +92,8 @@ Use the **Move to** feature to relocate items:
For detailed instructions, see [Moving items between sections](/guides/moving-items-between-sections).
<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.
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.
</Tip>
### 5. Adjust layout and design settings
@@ -112,9 +112,9 @@ Open the right sidebar and explore these options:
| **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.
**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
@@ -141,8 +141,8 @@ Try this order:
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 combined
with slightly smaller margins can recover enough space for several lines of content.
Use the live preview to see changes as you make them. Small adjustments add up—reducing font size by 0.5pt combined
with slightly smaller margins can recover enough space for several lines of content.
</Tip>
## Troubleshooting
File diff suppressed because it is too large Load Diff
+4 -4
View File
@@ -9,13 +9,13 @@ description: "Learn how to connect or disconnect social sign-in providers like G
</Step>
<Step title="Navigate to Authentication settings">
Once you're in the dashboard, look for the sidebar navigation on the left. Under the <Badge>Settings</Badge> section,
click on the <Badge>Authentication</Badge> link.
Once you're in the dashboard, look for the sidebar navigation on the left. Under the <Badge>Settings</Badge> section,
click on the <Badge>Authentication</Badge> link.
</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.
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">
@@ -42,8 +42,8 @@ If you have a long work history or extensive project list, you may want to split
</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.
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">
@@ -115,18 +115,18 @@ A common use case is when your work history is too long to fit on a single page.
## Tips for organizing multi-page resumes
<Tip>
**Keep it logical**: Maintain chronological order within each page. Move complete job entries rather than splitting a
single role across pages.
**Keep it logical**: Maintain chronological order within each page. Move complete job entries rather than splitting a
single role across pages.
</Tip>
<Tip>
**Use custom section names**: After moving items to a new custom section, you can rename it (e.g., "Earlier
Experience" or "Additional Projects") to provide context for recruiters.
**Use custom section names**: After moving items to a new custom section, you can rename it (e.g., "Earlier
Experience" or "Additional Projects") to provide context for recruiters.
</Tip>
<Warning>
Moving items reorganizes your content but doesn't affect the data itself. You can always move items back or to
different sections as needed.
Moving items reorganizes your content but doesn't affect the data itself. You can always move items back or to
different sections as needed.
</Warning>
## Troubleshooting
+32 -32
View File
@@ -39,8 +39,8 @@ Free-Form is a modern format designed for digital-first resumes. Instead of conf
| Height | Unlimited |
<Info>
With Free-Form, there are no page breaks. Your entire resume renders as one seamless document, regardless of how much
content you have.
With Free-Form, there are no page breaks. Your entire resume renders as one seamless document, regardless of how much
content you have.
</Info>
## Why Free-Form exists
@@ -57,8 +57,8 @@ When your resume is processed digitally:
Since physical page constraints no longer matter for most use cases, Free-Form lets you focus on content rather than worrying about fitting everything into arbitrary page limits.
<Tip>
If you don't plan on printing your resume, Free-Form is often the simplest choice. You never have to worry about
content overflowing or awkward page breaks.
If you don't plan on printing your resume, Free-Form is often the simplest choice. You never have to worry about
content overflowing or awkward page breaks.
</Tip>
## How to change your page format
@@ -69,11 +69,11 @@ Since physical page constraints no longer matter for most use cases, Free-Form l
</Step>
<Step title="Open the right sidebar">
In the resume builder, look for the right sidebar on the right side of the screen.
In the resume builder, look for the right sidebar on the right side of the screen.
</Step>
<Step title="Navigate to the Page section">
In the right sidebar, find and click on the **Page** section to expand it.
In the right sidebar, find and click on the **Page** section to expand it.
</Step>
<Step title="Select your format">
@@ -105,8 +105,8 @@ Use this quick reference to decide which format fits your needs:
| Traditional industries (law, finance) | A4 or Letter |
<Warning>
If you switch from Free-Form to A4 or Letter, your content will be split across multiple pages. Review the result
carefully to ensure page breaks don't occur in awkward places.
If you switch from Free-Form to A4 or Letter, your content will be split across multiple pages. Review the result
carefully to ensure page breaks don't occur in awkward places.
</Warning>
## Example PDFs
@@ -114,24 +114,24 @@ Use this quick reference to decide which format fits your needs:
Download these sample resumes to see how different formats affect the final PDF output:
<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>
<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>
## Frequently asked questions
@@ -142,18 +142,18 @@ Download these sample resumes to see how different formats affect the final PDF
</Accordion>
<Accordion title="Can I switch formats after creating my resume?">
Absolutely. You can change the format at any time from the Page section in the right sidebar. Your content is
preserved—only the layout changes.
Absolutely. 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>
<Accordion title="What if a job posting asks for a 'one-page resume'?">
If the employer specifically requests a one-page resume and expects a traditional format, use A4 or Letter and ensure
your content fits within a single page. See [Fitting content on a page](/guides/fitting-content-on-a-page) for tips.
If the employer specifically requests a one-page resume and expects a traditional format, use A4 or Letter and ensure
your content fits within a single page. See [Fitting content on a page](/guides/fitting-content-on-a-page) for tips.
</Accordion>
<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.
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>
<Accordion title="Which format should I use for LinkedIn?">
+5 -5
View File
@@ -18,17 +18,17 @@ For more details and technical updates, see the <a href="https://github.com/bett
</Step>
<Step title="Navigate to Authentication settings">
Once you're in the dashboard, look for the sidebar navigation on the left. Under the <Badge>Settings</Badge> section,
click on the <Badge>Authentication</Badge> link.
Once you're in the dashboard, look for the sidebar navigation on the left. Under the <Badge>Settings</Badge> section,
click on the <Badge>Authentication</Badge> link.
</Step>
<Step title="Register a new device">
In the <Badge>Passkeys</Badge> section, click on the <Badge>Register New Device</Badge> button.
In the <Badge>Passkeys</Badge> section, click on the <Badge>Register New Device</Badge> button.
</Step>
<Step title="Name your passkey">
You'll be prompted to enter a name for the passkey. Use something descriptive so you can recognize it later (for
example, “MacBook Touch ID” or “iPhone Face ID”).
You'll be prompted to enter a name for the passkey. Use something descriptive so you can recognize it later (for
example, “MacBook Touch ID” or “iPhone Face ID”).
</Step>
<Step title="Complete the passkey prompt">
@@ -23,13 +23,13 @@ description: "Learn how to enable two-factor authentication (2FA) to add an extr
</Step>
<Step title="Navigate to Authentication settings">
Once you're in the dashboard, look for the sidebar navigation on the left. Under the <Badge>Settings</Badge> section,
click on the <Badge>Authentication</Badge> link.
Once you're in the dashboard, look for the sidebar navigation on the left. Under the <Badge>Settings</Badge> section,
click on the <Badge>Authentication</Badge> link.
</Step>
<Step title="Click on Enable 2FA">
On the Authentication page, find the <Badge>Two-Factor Authentication</Badge> section and click on the{" "}
<Badge>Enable 2FA</Badge> button.
On the Authentication page, find the <Badge>Two-Factor Authentication</Badge> section and click on the{" "}
<Badge>Enable 2FA</Badge> button.
</Step>
<Step title="Enter your password">
+34 -34
View File
@@ -8,18 +8,18 @@ Reactive Resume lets you share your resume via a **public URL** that anyone can
## Key benefits of public sharing
<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 how many times your resume has been viewed and downloaded.
</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">
A simple URL that works anywhere—email signatures, LinkedIn, portfolios, job applications.
</Card>
<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 how many times your resume has been viewed and downloaded.
</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">
A simple URL that works anywhere—email signatures, LinkedIn, portfolios, job applications.
</Card>
</CardGroup>
## How to enable public sharing
@@ -32,7 +32,7 @@ Reactive Resume lets you share your resume via a **public URL** that anyone can
<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. Once enabled, your resume will be accessible via its public URL.
Turn on the **Allow Public Access** switch. Once enabled, your resume will be accessible via its public URL.
</Step>
<Step title="Copy your public URL">
@@ -48,8 +48,8 @@ Reactive Resume lets you share your resume via a **public URL** that anyone can
</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.
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>
## How the public URL works
@@ -62,8 +62,8 @@ When someone visits your public resume URL:
4. **Views are tracked** - Each visit is counted in your resume statistics (see below)
<Info>
Changes you make in the builder are reflected immediately on the public URL. There's no separate "publish" step—your
public resume is always in sync.
Changes you make in the builder are reflected immediately on the public URL. There's no separate "publish" step—your
public resume is always in sync.
</Info>
## Tracking views and downloads
@@ -84,8 +84,8 @@ You'll see:
| **Last downloaded** | The date when your resume was last downloaded |
<Info>
Statistics are only tracked when your resume is **public**. If you turn off public access, tracking pauses but your
existing stats are preserved.
Statistics are only tracked when your resume is **public**. If you turn off public access, tracking pauses but your
existing stats are preserved.
</Info>
### What counts as a view?
@@ -97,8 +97,8 @@ A view is counted each time someone loads your public resume page. This includes
- Search engine visits (if your resume is indexed)
<Note>
Only **you** can see your resume's statistics. Visitors to your public URL cannot see how many views or downloads your
resume has.
Only **you** can see your resume's statistics. Visitors to your public URL cannot see how many views or downloads your
resume has.
</Note>
## Password protecting your resume
@@ -121,7 +121,7 @@ When password protection is enabled:
<Step title="Click 'Set Password'">Below the public URL, click the **Set Password** button.</Step>
<Step title="Enter your password">
Type a password (6-64 characters) and confirm. This password will be required to view your resume.
Type a password (6-64 characters) and confirm. This password will be required to view your resume.
</Step>
<Step title="Share the password separately">
@@ -130,7 +130,7 @@ When password protection is enabled:
</Steps>
<Warning>
Choose a password you're comfortable sharing. Anyone with the password can view and download your resume.
Choose a password you're comfortable sharing. Anyone with the password can view and download your resume.
</Warning>
### How to remove password protection
@@ -151,19 +151,19 @@ Your resume will become accessible to anyone with the public URL.
</Accordion>
<Accordion title="Email signature" icon="envelope">
Include your resume link in your email signature. Anyone you correspond with can quickly access your resume.
Include your resume link in your email signature. Anyone you correspond with can quickly access your resume.
</Accordion>
<Accordion title="Portfolio website" icon="globe">
Embed or link to your resume from your personal website. The link always shows your latest resume.
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 ask for a link to your resume. Your public URL is a professional alternative to file uploads.
Some applications ask for a link to your resume. Your public URL is a professional alternative to file uploads.
</Accordion>
<Accordion title="Networking events" icon="users">
Share your resume URL via QR code or NFC. Update your resume before the event and everyone gets the latest version.
Share your resume URL via QR code or NFC. Update your resume before the event and everyone gets the latest version.
</Accordion>
<Accordion title="Confidential job search" icon="lock">
@@ -186,8 +186,8 @@ When public access is disabled:
- Password protection settings are preserved
<Tip>
If you only want to temporarily hide your resume, consider using password protection instead of disabling public
access entirely. This way, your URL remains active for people who have the password.
If you only want to temporarily hide your resume, consider using password protection instead of disabling public
access entirely. This way, your URL remains active for people who have the password.
</Tip>
## Frequently asked questions
@@ -198,17 +198,17 @@ When public access is disabled:
</Accordion>
<Accordion title="Will search engines index my public resume?">
Public resumes may be indexed by search engines. If you want to prevent indexing, use password protection or keep your
resume private.
Public resumes may be indexed by search engines. If you want to prevent indexing, use password protection or keep your
resume private.
</Accordion>
<Accordion title="Do views from my own visits count?">
Views are only counted when someone visits your public resume URL while not logged in. Visits made while you're logged
in to your account are not included in the view statistics.
Views are only counted when someone visits your public resume URL while not logged in. Visits made while you're logged
in to your account are not included in the view statistics.
</Accordion>
<Accordion title="Can I see who viewed my resume?">
No, Reactive Resume only tracks view and download counts, not the identity of visitors. This protects visitor privacy.
No, Reactive Resume only tracks view and download counts, not the identity of visitors. This protects visitor privacy.
</Accordion>
<Accordion title="What happens if I change my username?">
+2 -2
View File
@@ -14,8 +14,8 @@ description: "Learn how to update your profile information including your name,
</Step>
<Step title="Navigate to Profile settings">
Once you're in the dashboard, look for the sidebar navigation on the left. Under the <Badge>Settings</Badge> section,
click on the <Badge>Profile</Badge> link.
Once you're in the dashboard, look for the sidebar navigation on the left. Under the <Badge>Settings</Badge> section,
click on the <Badge>Profile</Badge> link.
</Step>
<Step title="Update your information">
+6 -6
View File
@@ -9,8 +9,8 @@ description: "Learn how to configure an AI provider and API key for AI-assisted
</Step>
<Step title="Navigate to Artificial Intelligence settings">
Once you're in the dashboard, look for the sidebar navigation on the left. Under the <Badge>Settings</Badge> section,
click on <Badge>Artificial Intelligence</Badge>.
Once you're in the dashboard, look for the sidebar navigation on the left. Under the <Badge>Settings</Badge> section,
click on <Badge>Artificial Intelligence</Badge>.
</Step>
<Step title="How your data is stored and sent">
@@ -35,8 +35,8 @@ description: "Learn how to configure an AI provider and API key for AI-assisted
</Step>
<Step title="Enter a model name">
In the <Badge>Model</Badge> field, enter the model you want to use (for example, <code>gpt-5.2</code>,{" "}
<code>claude-4.5-opus</code>, or <code>gemini-3-flash</code>).
In the <Badge>Model</Badge> field, enter the model you want to use (for example, <code>gpt-5.2</code>,{" "}
<code>claude-4.5-opus</code>, or <code>gemini-3-flash</code>).
</Step>
<Step title="Paste your API key">
@@ -68,8 +68,8 @@ CORS is a browser feature that prevents web pages from making requests to a diff
Because of this restriction, the app has to **forward your AI requests (along with your credentials) through our server**, which then contacts the AI provider and returns the response to your browser. **Your credentials are not stored on our server; they are only used to make the request you initiated, and are not logged or retained.**
<Info>
If you're curious or would like to audit how your AI requests are forwarded, you can review the code yourself. See the
relevant implementation in <code>src/integrations/orpc/router/ai.ts</code> within the codebase.
If you're curious or would like to audit how your AI requests are forwarded, you can review the code yourself. See the
relevant implementation in <code>src/integrations/orpc/router/ai.ts</code> within the codebase.
</Info>
---
+45 -45
View File
@@ -12,10 +12,10 @@ The **Custom CSS** panel lets you write your own CSS rules to change how your re
- **Scoped styling (mostly)**: to avoid affecting the rest of the app, your CSS is _usually_ scoped to the resume preview.
<Frame caption="Screenshot of the Custom CSS section in the right sidebar">
<img
src="/images/guides/using-custom-css/screenshot-1.webp"
alt="Screenshot of the Custom CSS section in the right sidebar"
/>
<img
src="/images/guides/using-custom-css/screenshot-1.webp"
alt="Screenshot of the Custom CSS section in the right sidebar"
/>
</Frame>
## Where to find it
@@ -48,14 +48,14 @@ Example:
```css
/* Normal rules: rely on auto-scoping */
.page a {
text-decoration: none;
text-decoration: none;
}
/* At-rules: manually scope selectors */
@media print {
.resume-preview-container .page a {
text-decoration: none;
}
.resume-preview-container .page a {
text-decoration: none;
}
}
```
@@ -65,7 +65,7 @@ Keep each rule's selector on **one line**, for example:
```css
.page-section-experience .section-item-title {
font-weight: 700;
font-weight: 700;
}
```
@@ -99,7 +99,7 @@ To apply styles only on one template, prefix with the template wrapper:
```css
.template-azurill .page-header {
gap: 12pt;
gap: 12pt;
}
```
@@ -109,7 +109,7 @@ Each page has a class like `.page-0`, `.page-1`, etc.
```css
.page-0 .page-header {
margin-bottom: 6pt;
margin-bottom: 6pt;
}
```
@@ -119,8 +119,8 @@ Custom sections include a dynamic class: `.page-section-<sectionId>`.
```css
.page-section-custom {
border-top: 1pt solid color-mix(in srgb, var(--page-text-color) 15%, transparent);
padding-top: 6pt;
border-top: 1pt solid color-mix(in srgb, var(--page-text-color) 15%, transparent);
padding-top: 6pt;
}
```
@@ -142,9 +142,9 @@ Example (tighten spacing without changing your layout settings):
```css
.page {
--page-margin-x: 10pt;
--page-margin-y: 10pt;
--page-gap-y: 6pt;
--page-margin-x: 10pt;
--page-margin-y: 10pt;
--page-gap-y: 6pt;
}
```
@@ -154,10 +154,10 @@ Example (tighten spacing without changing your layout settings):
```css
.page-section > h6 {
margin-bottom: 2pt;
font-weight: 800;
letter-spacing: 0.02em;
text-transform: uppercase;
margin-bottom: 2pt;
font-weight: 800;
letter-spacing: 0.02em;
text-transform: uppercase;
}
```
@@ -165,12 +165,12 @@ Example (tighten spacing without changing your layout settings):
```css
.page-section {
padding-bottom: 8pt;
border-bottom: 1pt solid color-mix(in srgb, var(--page-text-color) 12%, transparent);
padding-bottom: 8pt;
border-bottom: 1pt solid color-mix(in srgb, var(--page-text-color) 12%, transparent);
}
.page-section:last-child {
border-bottom: none;
border-bottom: none;
}
```
@@ -178,8 +178,8 @@ Example (tighten spacing without changing your layout settings):
```css
.section-item-metadata {
font-size: calc(var(--page-body-font-size) * 0.9pt);
opacity: 0.75;
font-size: calc(var(--page-body-font-size) * 0.9pt);
opacity: 0.75;
}
```
@@ -187,16 +187,16 @@ Example (tighten spacing without changing your layout settings):
```css
.section-item-description {
opacity: 0.95;
opacity: 0.95;
}
.section-item-description ul {
margin-left: 12pt;
padding-left: 0;
margin-left: 12pt;
padding-left: 0;
}
.section-item-description li {
margin: 2pt 0;
margin: 2pt 0;
}
```
@@ -204,11 +204,11 @@ Example (tighten spacing without changing your layout settings):
```css
.section-item-website a {
display: inline-block;
padding: 3pt 9pt;
border-radius: 999pt;
border: 2pt solid color-mix(in srgb, var(--page-primary-color) 45%, transparent);
text-decoration: none;
display: inline-block;
padding: 3pt 9pt;
border-radius: 999pt;
border: 2pt solid color-mix(in srgb, var(--page-primary-color) 45%, transparent);
text-decoration: none;
}
```
@@ -216,7 +216,7 @@ Example (tighten spacing without changing your layout settings):
```css
.page-picture {
display: none;
display: none;
}
```
@@ -224,12 +224,12 @@ Example (tighten spacing without changing your layout settings):
```css
.page-header {
gap: 6pt;
padding-bottom: 6pt;
gap: 6pt;
padding-bottom: 6pt;
}
.basics-headline {
opacity: 0.8;
opacity: 0.8;
}
```
@@ -237,16 +237,16 @@ Example (tighten spacing without changing your layout settings):
```css
.skills-item-name {
font-weight: 700;
font-weight: 700;
}
.skills-item-proficiency {
margin-top: 1pt;
margin-top: 1pt;
}
.skills-item-keywords {
display: block;
opacity: 0.85;
display: block;
opacity: 0.85;
}
```
@@ -254,9 +254,9 @@ Example (tighten spacing without changing your layout settings):
```css
.page-section-profiles {
background: color-mix(in srgb, var(--page-primary-color) 10%, transparent);
border-radius: 8pt;
padding: 8pt 12pt;
background: color-mix(in srgb, var(--page-primary-color) 10%, transparent);
border-radius: 8pt;
padding: 8pt 12pt;
}
```
+10 -10
View File
@@ -10,7 +10,7 @@ The **Private Notes** section is a dedicated space for storing personal informat
Think of it as a built-in notebook attached to each resume where you can jot down anything relevant to your job search.
<Info>
Private Notes are stored securely with your resume data and are only visible to you when editing your resume.
Private Notes are stored securely with your resume data and are only visible to you when editing your resume.
</Info>
## Where to find it
@@ -18,10 +18,10 @@ Think of it as a built-in notebook attached to each resume where you can jot dow
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"
/>
<img
src="/images/guides/using-private-notes/screenshot-1.webp"
alt="Screenshot of the Notes section in the right sidebar"
/>
</Frame>
## Use cases
@@ -42,8 +42,8 @@ Keep a record of where you've sent this particular resume:
Paste links to the original job postings so you can quickly reference them when preparing for interviews or following up.
<Tip>
Job postings often get taken down after a position is filled. Consider copying key requirements or responsibilities
into your notes as a backup.
Job postings often get taken down after a position is filled. Consider copying key requirements or responsibilities
into your notes as a backup.
</Tip>
### Interview preparation
@@ -79,7 +79,7 @@ Track your follow-up schedule:
</Step>
<Step title="Write your notes">
Use the rich text editor to add your notes. You can format text with bold, italics, bullet points, and more.
Use the rich text editor to add your notes. You can format text with bold, italics, bullet points, and more.
</Step>
<Step title="Notes save automatically">
@@ -90,8 +90,8 @@ Track your follow-up schedule:
## Privacy guarantee
<Warning>
Private Notes are for your eyes only. They will **never** appear on: - Your exported PDF or other file formats - Your
publicly shared resume link - Any printed version of your resume
Private Notes are for your eyes only. They will **never** appear on: - Your exported PDF or other file formats - Your
publicly shared resume link - Any printed version of your resume
</Warning>
This makes it safe to store sensitive information like salary expectations, candid thoughts about opportunities, or personal reminders that you wouldn't want an employer to see.
+2 -2
View File
@@ -9,8 +9,8 @@ description: "Learn how to create API keys and authenticate requests to the Reac
</Step>
<Step title="Navigate to API Keys settings">
Once you're in the dashboard, look for the sidebar navigation on the left. Under the <Badge>Settings</Badge> section,
click on the <Badge>API Keys</Badge> link.
Once you're in the dashboard, look for the sidebar navigation on the left. Under the <Badge>Settings</Badge> section,
click on the <Badge>API Keys</Badge> link.
</Step>
<Step title="Open the API reference">
+20 -20
View File
@@ -30,14 +30,14 @@ If your client supports the `url` field (e.g. **Cursor**), use this — no extra
```json
{
"mcpServers": {
"reactive-resume": {
"url": "https://rxresu.me/mcp",
"headers": {
"x-api-key": "your-api-key"
}
}
}
"mcpServers": {
"reactive-resume": {
"url": "https://rxresu.me/mcp",
"headers": {
"x-api-key": "your-api-key"
}
}
}
}
```
@@ -47,12 +47,12 @@ If your client only supports `command` / `args` (e.g. **Claude Desktop**), use [
```json
{
"mcpServers": {
"reactive-resume": {
"command": "npx",
"args": ["mcp-remote", "https://rxresu.me/mcp", "--header", "x-api-key:your-api-key"]
}
}
"mcpServers": {
"reactive-resume": {
"command": "npx",
"args": ["mcp-remote", "https://rxresu.me/mcp", "--header", "x-api-key:your-api-key"]
}
}
}
```
@@ -72,10 +72,10 @@ If you're running a self-hosted Reactive Resume instance, replace `https://rxres
```json
{
"url": "https://resume.example.com/mcp",
"headers": {
"x-api-key": "your-api-key"
}
"url": "https://resume.example.com/mcp",
"headers": {
"x-api-key": "your-api-key"
}
}
```
@@ -160,8 +160,8 @@ Once your MCP client is connected, you can use natural language to interact with
- "Tailor my resume for this job description: ..." (uses `tailor_resume`)
<Tip>
The AI will use `get_resume` to inspect your current resume before making changes with `patch_resume`. This ensures
the correct JSON paths are used.
The AI will use `get_resume` to inspect your current resume before making changes with `patch_resume`. This ensures
the correct JSON paths are used.
</Tip>
## Troubleshooting
+8 -8
View File
@@ -17,8 +17,8 @@ This is based on the [JSON Patch (RFC 6902)](https://datatracker.ietf.org/doc/ht
| Replace the entire resume data at once | **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.
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>
## Authentication
@@ -26,7 +26,7 @@ This is based on the [JSON Patch (RFC 6902)](https://datatracker.ietf.org/doc/ht
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.
<Info>
If you're self-hosting, replace `https://rxresu.me` with your instance URL. The API is served under `/api/openapi`.
If you're self-hosting, replace `https://rxresu.me` with your instance URL. The API is served under `/api/openapi`.
</Info>
## Endpoint
@@ -41,7 +41,7 @@ The resume ID is taken from the URL path, so the request body only requires the
```json
{
"operations": [{ "op": "replace", "path": "/basics/name", "value": "Jane Doe" }]
"operations": [{ "op": "replace", "path": "/basics/name", "value": "Jane Doe" }]
}
```
@@ -101,8 +101,8 @@ curl -X PATCH "https://rxresu.me/api/openapi/resume/YOUR_RESUME_ID" \
```
<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.
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>
### Remove an Item from a Section
@@ -179,8 +179,8 @@ curl -X PATCH "https://rxresu.me/api/openapi/resume/YOUR_RESUME_ID" \
| `403` | `RESUME_LOCKED` | The resume is locked and cannot be modified. Unlock it first. |
<Warning>
All operations in a single request are applied atomically. If any operation fails (including a `test`), none of the
operations are applied.
All operations in a single request are applied atomically. If any operation fails (including a `test`), none of the
operations are applied.
</Warning>
## Tips
+3 -3
View File
@@ -17,9 +17,9 @@ Reactive Resume is open-source and can be operated in different ways (for exampl
If you are self-hosting, **you** are the Service Operator and responsible for compliance (including configuring email delivery, storage, and logging appropriately).
<Note>
**Note for self-hosted deployments:** If you are using the official hosted service at <code>rxresu.me</code>, the
project's published support contact is <code>hello@amruthpillai.com</code>. Replace the placeholders above with the
correct operator details for your deployment if you are self-hosting.
**Note for self-hosted deployments:** If you are using the official hosted service at <code>rxresu.me</code>, the
project's published support contact is <code>hello@amruthpillai.com</code>. Replace the placeholders above with the
correct operator details for your deployment if you are self-hosting.
</Note>
---
+3 -3
View File
@@ -15,9 +15,9 @@ These Terms of Service (the “Terms”) govern your access to and use of **Reac
If you do not agree, do not use the Service.
<Note>
Replace the placeholders above with the correct operator details for your deployment. If you are using the official
hosted service at <code>rxresu.me</code>, the project's published support contact is{" "}
<code>hello@amruthpillai.com</code>.
Replace the placeholders above with the correct operator details for your deployment. If you are using the official
hosted service at <code>rxresu.me</code>, the project's published support contact is{" "}
<code>hello@amruthpillai.com</code>.
</Note>
---
+68 -68
View File
@@ -8,14 +8,14 @@ description: "A comprehensive guide to self-host Reactive Resume with Docker (Po
Reactive Resume can be self-hosted using Docker in a matter of minutes, and this guide will walk you through the process. Here are some of the services you'll need to get started:
<CardGroup cols={2}>
<Card title="PostgreSQL">Stores accounts, resumes, and application data.</Card>
<Card title="Printer">Generates PDFs and screenshots using a headless Chromium browser.</Card>
<Card title="Email (optional)">
SMTP for verification emails, password reset, etc. If not configured, emails are logged to the server console.
</Card>
<Card title="Storage (optional)">
Use S3-compatible storage, or local persistent storage via <code>/app/data</code>.
</Card>
<Card title="PostgreSQL">Stores accounts, resumes, and application data.</Card>
<Card title="Printer">Generates PDFs and screenshots using a headless Chromium browser.</Card>
<Card title="Email (optional)">
SMTP for verification emails, password reset, etc. If not configured, emails are logged to the server console.
</Card>
<Card title="Storage (optional)">
Use S3-compatible storage, or local persistent storage via <code>/app/data</code>.
</Card>
</CardGroup>
You can pull the latest app image from:
@@ -26,9 +26,9 @@ You can pull the latest app image from:
## Minimum requirements
<CardGroup cols={1}>
<Card title="Docker + Docker Compose">Docker Engine + Docker Compose plugin (or Docker Desktop).</Card>
<Card title="Compute">2 vCPU / 2 GB RAM minimum (4 GB recommended if Postgres + Printer run on the same host).</Card>
<Card title="Storage">Enough for Postgres + uploads (start with 10-20 GB and scale as needed).</Card>
<Card title="Docker + Docker Compose">Docker Engine + Docker Compose plugin (or Docker Desktop).</Card>
<Card title="Compute">2 vCPU / 2 GB RAM minimum (4 GB recommended if Postgres + Printer run on the same host).</Card>
<Card title="Storage">Enough for Postgres + uploads (start with 10-20 GB and scale as needed).</Card>
</CardGroup>
## Quickstart using Docker Compose
@@ -249,45 +249,45 @@ docker compose logs -f reactive-resume
## How startup works (database migrations)
<Info>
On every start, the server <b>automatically runs database migrations</b> before serving traffic. If migrations fail
(usually due to a DB connection issue), the container will exit with an error.
On every start, the server <b>automatically runs database migrations</b> before serving traffic. If migrations fail
(usually due to a DB connection issue), the container will exit with an error.
</Info>
## Environment variables
<CardGroup cols={2}>
<Card title="Required">
<ul>
<li>
<code>APP_URL</code>
</li>
<li>
<code>DATABASE_URL</code>
</li>
<li>
<code>PRINTER_ENDPOINT</code>
</li>
<li>
<code>AUTH_SECRET</code>
</li>
</ul>
</Card>
<Card title="Optional">
<ul>
<li>
SMTP (<code>SMTP_&#42;</code>)
</li>
<li>
Social auth (<code>GOOGLE_&#42;</code>, <code>GITHUB_&#42;</code>)
</li>
<li>
S3 storage (<code>S3_&#42;</code>)
</li>
<li>
Feature flags (<code>FLAG_&#42;</code>)
</li>
</ul>
</Card>
<Card title="Required">
<ul>
<li>
<code>APP_URL</code>
</li>
<li>
<code>DATABASE_URL</code>
</li>
<li>
<code>PRINTER_ENDPOINT</code>
</li>
<li>
<code>AUTH_SECRET</code>
</li>
</ul>
</Card>
<Card title="Optional">
<ul>
<li>
SMTP (<code>SMTP_&#42;</code>)
</li>
<li>
Social auth (<code>GOOGLE_&#42;</code>, <code>GITHUB_&#42;</code>)
</li>
<li>
S3 storage (<code>S3_&#42;</code>)
</li>
<li>
Feature flags (<code>FLAG_&#42;</code>)
</li>
</ul>
</Card>
</CardGroup>
<AccordionGroup>
@@ -317,8 +317,8 @@ docker compose logs -f reactive-resume
</Accordion>
<Accordion title="Database (PostgreSQL)">
- **`DATABASE_URL`**: Postgres connection string in the format `postgresql://USER:PASSWORD@HOST:PORT/DATABASE`. - In
Docker Compose, set `HOST` to the Postgres service name (e.g. `postgres`), not `localhost`.
- **`DATABASE_URL`**: Postgres connection string in the format `postgresql://USER:PASSWORD@HOST:PORT/DATABASE`. - In
Docker Compose, set `HOST` to the Postgres service name (e.g. `postgres`), not `localhost`.
</Accordion>
<Accordion title="Authentication">
@@ -361,15 +361,15 @@ openssl rand -hex 32
</Accordion>
<Accordion title="Storage (S3 or local)">
- **Default (local)**: If all `S3_*` values are empty, uploads are stored under `/app/data`. Mount it to persistent
storage (for example `./data:/app/data`) or uploads can be lost on container recreation. - **S3/S3-compatible**:
Configure these to store uploads in an S3-compatible service (SeaweedFS, MinIO, AWS S3, etc.): -
**`S3_ACCESS_KEY_ID`** - **`S3_SECRET_ACCESS_KEY`** - **`S3_REGION`** - **`S3_ENDPOINT`** (for S3-compatible
providers; may be blank for AWS depending on your setup) - **`S3_BUCKET`** - **`S3_FORCE_PATH_STYLE`**: Controls how
the bucket is addressed in URLs. Defaults to `"false"`. - Set to `"true"` for **path-style** URLs
(`https://s3-server.com/bucket`). Common with **MinIO**, **SeaweedFS**, and other self-hosted S3-compatible services.
- Set to `"false"` for **virtual-hosted-style** URLs (`https://bucket.s3-server.com`). Common with **AWS S3**,
**Cloudflare R2**, and most cloud providers.
- **Default (local)**: If all `S3_*` values are empty, uploads are stored under `/app/data`. Mount it to persistent
storage (for example `./data:/app/data`) or uploads can be lost on container recreation. - **S3/S3-compatible**:
Configure these to store uploads in an S3-compatible service (SeaweedFS, MinIO, AWS S3, etc.): -
**`S3_ACCESS_KEY_ID`** - **`S3_SECRET_ACCESS_KEY`** - **`S3_REGION`** - **`S3_ENDPOINT`** (for S3-compatible
providers; may be blank for AWS depending on your setup) - **`S3_BUCKET`** - **`S3_FORCE_PATH_STYLE`**: Controls how
the bucket is addressed in URLs. Defaults to `"false"`. - Set to `"true"` for **path-style** URLs
(`https://s3-server.com/bucket`). Common with **MinIO**, **SeaweedFS**, and other self-hosted S3-compatible services.
- Set to `"false"` for **virtual-hosted-style** URLs (`https://bucket.s3-server.com`). Common with **AWS S3**,
**Cloudflare R2**, and most cloud providers.
</Accordion>
<Accordion title="Feature Flags">
@@ -445,8 +445,8 @@ Most reverse proxies (such as **Traefik**, **Caddy**, or **nginx** with upstream
This is particularly useful in high-availability setups where you have multiple instances of Reactive Resume. If one instance becomes unhealthy (for example, it loses its database connection), the reverse proxy will stop routing traffic to it until it recovers.
<Tip>
If you're using **Traefik**, it automatically respects Docker health checks when using the Docker provider. Unhealthy
containers are excluded from routing without any additional configuration.
If you're using **Traefik**, it automatically respects Docker health checks when using the Docker provider. Unhealthy
containers are excluded from routing without any additional configuration.
</Tip>
### Manually checking health
@@ -476,25 +476,25 @@ A healthy response returns HTTP 200. Any other response (or a connection failure
</Accordion>
<Accordion title="Can't sign in / redirects loop / cookies don't stick">
- **Common cause**: `APP_URL` doesn't match the URL you're actually using (especially behind a reverse proxy). -
**Fix**: set `APP_URL` to the public URL (preferably HTTPS) and restart the container.
- **Common cause**: `APP_URL` doesn't match the URL you're actually using (especially behind a reverse proxy). -
**Fix**: set `APP_URL` to the public URL (preferably HTTPS) and restart the container.
</Accordion>
<Accordion title="PDF export fails / printing is stuck">
- **Common cause**: Reactive Resume can't reach the printer or the printer can't reach your app. - **Checks**: -
`PRINTER_ENDPOINT` should usually be `http://printer:3000` in Compose. - If you use
`PRINTER_APP_URL="http://host.docker.internal:3000"`, ensure `extra_hosts: host-gateway` is present for the printer
service.
- **Common cause**: Reactive Resume can't reach the printer or the printer can't reach your app. - **Checks**: -
`PRINTER_ENDPOINT` should usually be `http://printer:3000` in Compose. - If you use
`PRINTER_APP_URL="http://host.docker.internal:3000"`, ensure `extra_hosts: host-gateway` is present for the printer
service.
</Accordion>
<Accordion title="Uploads disappear after restart">
- **Cause**: you didn't mount persistent storage for `/app/data` (when not using S3). - **Fix**: add a volume mount
like `./data:/app/data` and redeploy.
- **Cause**: you didn't mount persistent storage for `/app/data` (when not using S3). - **Fix**: add a volume mount
like `./data:/app/data` and redeploy.
</Accordion>
<Accordion title="Emails aren't being delivered">
- **Expected behavior**: if SMTP vars are empty, the app logs emails to the console instead. - **Fix**: configure SMTP
and verify your provider's TLS/port settings.
- **Expected behavior**: if SMTP vars are empty, the app logs emails to the console instead. - **Fix**: configure SMTP
and verify your provider's TLS/port settings.
</Accordion>
<Accordion title="S3 storage error: ENOTFOUND bucket.endpoint">
+11 -11
View File
@@ -10,9 +10,9 @@ Every self-hosted setup is unique. You might be running on a single VPS, a Kuber
These examples go beyond the basic setup in the [Self-Hosting with Docker](/self-hosting/docker) guide, showing production-ready configurations with reverse proxies, SSL termination, and other common patterns.
<Info>
**Help others by sharing your setup!** If you have a working configuration that isn't covered here, I'd love to
include it. Simply [open a pull request](https://github.com/amruthpillai/reactive-resume) with your example added to
this page. Your contribution helps the community and makes self-hosting easier for everyone.
**Help others by sharing your setup!** If you have a working configuration that isn't covered here, I'd love to
include it. Simply [open a pull request](https://github.com/amruthpillai/reactive-resume) with your example added to
this page. Your contribution helps the community and makes self-hosting easier for everyone.
</Info>
---
@@ -22,8 +22,8 @@ These examples go beyond the basic setup in the [Self-Hosting with Docker](/self
This example uses [Traefik](https://traefik.io/) as a reverse proxy with automatic SSL certificate management via Let's Encrypt. Only the Reactive Resume app is exposed through Traefik—Postgres and the printer remain on an internal network.
<Tip>
Traefik automatically discovers services via Docker labels and handles SSL certificates, making it ideal for setups
where you want minimal configuration.
Traefik automatically discovers services via Docker labels and handles SSL certificates, making it ideal for setups
where you want minimal configuration.
</Tip>
```yaml compose-traefik.yml lines expandable
@@ -294,8 +294,8 @@ http {
```
<Tip>
For automatic SSL certificates with nginx, consider using [certbot](https://certbot.eff.org/) with the `--nginx`
plugin, or a companion container like [nginx-proxy-acme](https://github.com/nginx-proxy/acme-companion).
For automatic SSL certificates with nginx, consider using [certbot](https://certbot.eff.org/) with the `--nginx`
plugin, or a companion container like [nginx-proxy-acme](https://github.com/nginx-proxy/acme-companion).
</Tip>
---
@@ -305,8 +305,8 @@ http {
This example demonstrates a production-grade Docker Swarm deployment with multiple replicas, health checks, rolling updates, and Traefik integration. It includes SeaweedFS for S3-compatible storage and a PostgreSQL database with custom configuration.
<Tip>
Docker Swarm is great for multi-node deployments where you need high availability and easy scaling. The app service is
configured with 2 replicas and rolling update strategy.
Docker Swarm is great for multi-node deployments where you need high availability and easy scaling. The app service is
configured with 2 replicas and rolling update strategy.
</Tip>
```yaml compose-swarm.yml lines expandable
@@ -477,8 +477,8 @@ docker stack rm reactive_resume
```
<Note>
This example assumes you have an external Traefik network already set up. Adjust the `traefik_network` reference and
labels based on your Traefik configuration.
This example assumes you have an external Traefik network already set up. Adjust the `traefik_network` reference and
labels based on your Traefik configuration.
</Note>
---
+56 -56
View File
@@ -8,8 +8,8 @@ description: "A step-by-step guide to migrate your Reactive Resume instance from
This guide walks you through migrating your Reactive Resume installation from **v4 to v5**. The migration process involves setting up a new v5 instance alongside your existing v4 instance, then transferring your users and resumes to the new system.
<Warning>
**Keep your v4 instance running** until you have successfully migrated all data to v5 and verified everything works
correctly. This ensures you have a fallback in case anything goes wrong during the migration.
**Keep your v4 instance running** until you have successfully migrated all data to v5 and verified everything works
correctly. This ensures you have a fallback in case anything goes wrong during the migration.
</Warning>
## Prerequisites
@@ -17,15 +17,15 @@ This guide walks you through migrating your Reactive Resume installation from **
Before starting the migration, ensure you have:
<CardGroup cols={2}>
<Card title="Running v4 Instance">Your existing Reactive Resume v4 instance should be running and accessible.</Card>
<Card title="New v5 Instance">
A fresh Reactive Resume v5 instance set up and running. Follow the [Self-Hosting with Docker](/self-hosting/docker)
guide if you haven't done this yet.
</Card>
<Card title="Database Access">
Access to both your v4 PostgreSQL database (source) and v5 PostgreSQL database (target).
</Card>
<Card title="Backup">A recent backup of your v4 database. Always backup before any migration.</Card>
<Card title="Running v4 Instance">Your existing Reactive Resume v4 instance should be running and accessible.</Card>
<Card title="New v5 Instance">
A fresh Reactive Resume v5 instance set up and running. Follow the [Self-Hosting with Docker](/self-hosting/docker)
guide if you haven't done this yet.
</Card>
<Card title="Database Access">
Access to both your v4 PostgreSQL database (source) and v5 PostgreSQL database (target).
</Card>
<Card title="Backup">A recent backup of your v4 database. Always backup before any migration.</Card>
</CardGroup>
## Choosing a Migration Method
@@ -33,14 +33,14 @@ Before starting the migration, ensure you have:
The best migration approach depends on the size of your instance:
<CardGroup cols={2}>
<Card title="Manual Migration" icon="hand">
**Best for**: Small instances with a handful of resumes. Uses the built-in Import Dialog to manually convert resumes
one at a time.
</Card>
<Card title="Automated Migration" icon="robot">
**Best for**: Large instances with many users and resumes. Uses migration scripts to batch-process all users and
resumes automatically.
</Card>
<Card title="Manual Migration" icon="hand">
**Best for**: Small instances with a handful of resumes. Uses the built-in Import Dialog to manually convert resumes
one at a time.
</Card>
<Card title="Automated Migration" icon="robot">
**Best for**: Large instances with many users and resumes. Uses migration scripts to batch-process all users and
resumes automatically.
</Card>
</CardGroup>
## Manual Migration (Small Instances)
@@ -53,9 +53,9 @@ If you have only a few resumes to migrate, the simplest approach is to use the *
</Step>
<Step title="Import into v5">
In your new v5 instance: 1. Log in or create a new account 2. Click **Create Resume** or use the **Import** option 3.
Select the **Reactive Resume v4** format 4. Upload your exported JSON file The import process automatically converts
the v4 format to v5.
In your new v5 instance: 1. Log in or create a new account 2. Click **Create Resume** or use the **Import** option 3.
Select the **Reactive Resume v4** format 4. Upload your exported JSON file The import process automatically converts
the v4 format to v5.
</Step>
<Step title="Verify and repeat">
@@ -64,8 +64,8 @@ If you have only a few resumes to migrate, the simplest approach is to use the *
</Steps>
<Tip>
The Import Dialog handles the schema conversion automatically, so you don't need to worry about format differences
between v4 and v5.
The Import Dialog handles the schema conversion automatically, so you don't need to worry about format differences
between v4 and v5.
</Tip>
## Automated Migration (Large Instances)
@@ -77,17 +77,17 @@ For instances with many users and resumes, use the migration scripts to automate
To run the migration scripts, you need the following installed on your host machine:
<CardGroup cols={1}>
<Card title="Node.js Runtime">
**tsx** - TypeScript execution environment. Install globally with: ```bash npm install -g tsx ```
</Card>
<Card title="Environment Loader">
**dotenvx** (or any tool to load `.env` files). Install globally with: ```bash npm install -g @dotenvx/dotenvx ```
Alternatively, you can use `dotenv`, `direnv`, or export the variables manually.
</Card>
<Card title="Reactive Resume Source Code">
Clone the Reactive Resume repository to access the migration scripts: ```bash git clone
https://github.com/amruthpillai/reactive-resume.git cd reactive-resume pnpm install ```
</Card>
<Card title="Node.js Runtime">
**tsx** - TypeScript execution environment. Install globally with: ```bash npm install -g tsx ```
</Card>
<Card title="Environment Loader">
**dotenvx** (or any tool to load `.env` files). Install globally with: ```bash npm install -g @dotenvx/dotenvx ```
Alternatively, you can use `dotenv`, `direnv`, or export the variables manually.
</Card>
<Card title="Reactive Resume Source Code">
Clone the Reactive Resume repository to access the migration scripts: ```bash git clone
https://github.com/amruthpillai/reactive-resume.git cd reactive-resume pnpm install ```
</Card>
</CardGroup>
### Environment Setup
@@ -103,8 +103,8 @@ PRODUCTION_DATABASE_URL="postgresql://user:password@localhost:5432/reactive_resu
```
<Warning>
Double-check your connection strings! `DATABASE_URL` should point to your **new v5 database** and
`PRODUCTION_DATABASE_URL` should point to your **old v4 database**. Mixing these up could cause data loss.
Double-check your connection strings! `DATABASE_URL` should point to your **new v5 database** and
`PRODUCTION_DATABASE_URL` should point to your **old v4 database**. Mixing these up could cause data loss.
</Warning>
### Step 1: Migrate Users
@@ -124,8 +124,8 @@ dotenvx run -- tsx scripts/migration/user.ts
- Creates a mapping file (`scripts/migration/user-id-map.json`) that links old user IDs to new ones
<Info>
The script saves progress automatically. If interrupted (Ctrl+C), you can run it again and it will resume from where
it left off.
The script saves progress automatically. If interrupted (Ctrl+C), you can run it again and it will resume from where
it left off.
</Info>
**Expected output:**
@@ -196,8 +196,8 @@ Both migration scripts support graceful shutdown and resume:
- **Resume migration**: Run the script again to continue from where you left off
<Tip>
If you need to restart the migration from scratch, delete the progress files and the user ID mapping file before
running the scripts again.
If you need to restart the migration from scratch, delete the progress files and the user ID mapping file before
running the scripts again.
</Tip>
## Post-Migration Steps
@@ -210,12 +210,12 @@ After completing the migration:
</Step>
<Step title="Test functionality">
- Create a test resume and export it as PDF - Verify social logins work (if configured) - Check that two-factor
authentication works for migrated users
- Create a test resume and export it as PDF - Verify social logins work (if configured) - Check that two-factor
authentication works for migrated users
</Step>
<Step title="Update DNS/Proxy">
Once verified, update your DNS records or reverse proxy to point to the new v5 instance.
Once verified, update your DNS records or reverse proxy to point to the new v5 instance.
</Step>
<Step title="Decommission v4">
@@ -231,18 +231,18 @@ After completing the migration:
</Accordion>
<Accordion title="Profile pictures are not migrated">
User profile pictures (avatars) are stored as references in the database. If you were using S3 storage, ensure your v5
instance has access to the same bucket, or users may need to re-upload their avatars.
User profile pictures (avatars) are stored as references in the database. If you were using S3 storage, ensure your v5
instance has access to the same bucket, or users may need to re-upload their avatars.
</Accordion>
<Accordion title="Resume images and uploads">
Similar to profile pictures, any images embedded in resumes need to be accessible from your v5 instance. Consider
migrating your storage bucket or updating references as needed.
Similar to profile pictures, any images embedded in resumes need to be accessible from your v5 instance. Consider
migrating your storage bucket or updating references as needed.
</Accordion>
<Accordion title="OAuth provider changes">
If you're using custom OAuth providers, ensure the same providers are configured in v5 with matching client IDs. Users
authenticate with the same provider ID, so mismatched configurations will cause login failures.
If you're using custom OAuth providers, ensure the same providers are configured in v5 with matching client IDs. Users
authenticate with the same provider ID, so mismatched configurations will cause login failures.
</Accordion>
<Accordion title="Schema differences">
@@ -263,18 +263,18 @@ After completing the migration:
</Accordion>
<Accordion title="Users are skipped during migration">
Users are skipped if: - Their email already exists in the v5 database - Their username already exists in the v5
database - They were already migrated in a previous run Check the console output for skip reasons.
Users are skipped if: - Their email already exists in the v5 database - Their username already exists in the v5
database - They were already migrated in a previous run Check the console output for skip reasons.
</Accordion>
<Accordion title="Resumes are skipped during migration">
Resumes are skipped if: - The associated user wasn't migrated (user ID not in mapping file) - A resume with the same
slug already exists for that user - They were already migrated in a previous run
Resumes are skipped if: - The associated user wasn't migrated (user ID not in mapping file) - A resume with the same
slug already exists for that user - They were already migrated in a previous run
</Accordion>
<Accordion title="Resume data parsing fails">
If a resume can't be parsed from v4 format, it will be created with default empty data. Check the console output for
warnings about specific resumes, and consider manually importing those using the Import Dialog.
If a resume can't be parsed from v4 format, it will be created with default empty data. Check the console output for
warnings about specific resumes, and consider manually importing those using the Import Dialog.
</Accordion>
<Accordion title="Migration is slow">
+24 -24
View File
@@ -12,8 +12,8 @@ Reactive Resume supports custom OAuth providers, allowing you to integrate with
- Integrate with existing LDAP/Active Directory infrastructure
<Info>
Custom OAuth is designed for **self-hosted instances**. If you're using the hosted version at
[rxresu.me](https://rxresu.me), you can use the built-in Google and GitHub sign-in options.
Custom OAuth is designed for **self-hosted instances**. If you're using the hosted version at
[rxresu.me](https://rxresu.me), you can use the built-in Google and GitHub sign-in options.
</Info>
## Environment Variables
@@ -82,8 +82,8 @@ https://resume.example.com/api/auth/oauth2/callback/custom
```
<Warning>
Make sure the callback URL exactly matches what you configure in your OAuth provider. A mismatch will cause
authentication to fail.
Make sure the callback URL exactly matches what you configure in your OAuth provider. A mismatch will cause
authentication to fail.
</Warning>
## Profile Mapping
@@ -98,7 +98,7 @@ Reactive Resume automatically maps user profile data from the OAuth provider. Th
| **Avatar** | `image` → `picture` → `avatar_url` |
<Info>
The OAuth provider **must** return an email address. If no email is provided, authentication will fail with an error.
The OAuth provider **must** return an email address. If no email is provided, authentication will fail with an error.
</Info>
## Provider-Specific Setup
@@ -273,9 +273,9 @@ OAUTH_DISCOVERY_URL="https://auth.company.com/application/o/reactive-resume/.wel
</Accordion>
<Accordion title="Redirect URI mismatch error">
The callback URL configured in your OAuth provider must exactly match: ```
{APP_URL}/api/auth/oauth2/callback/custom ``` Common issues: - Trailing slash mismatch - HTTP vs HTTPS mismatch - Port
number differences - Path case sensitivity
The callback URL configured in your OAuth provider must exactly match: ```
{APP_URL}/api/auth/oauth2/callback/custom ``` Common issues: - Trailing slash mismatch - HTTP vs HTTPS mismatch - Port
number differences - Path case sensitivity
</Accordion>
<Accordion title="Custom OAuth button not appearing">
@@ -288,9 +288,9 @@ OAUTH_DISCOVERY_URL="https://auth.company.com/application/o/reactive-resume/.wel
</Accordion>
<Accordion title="CORS or network errors during authentication">
If running behind a reverse proxy: - Ensure `APP_URL` matches your public URL - Verify the proxy passes the correct
headers (`X-Forwarded-Proto`, `X-Forwarded-Host`) - Check that your OAuth provider allows the redirect URI from your
domain
If running behind a reverse proxy: - Ensure `APP_URL` matches your public URL - Verify the proxy passes the correct
headers (`X-Forwarded-Proto`, `X-Forwarded-Host`) - Check that your OAuth provider allows the redirect URI from your
domain
</Accordion>
<Accordion title="User profile data is missing or incorrect">
@@ -307,17 +307,17 @@ OAUTH_DISCOVERY_URL="https://auth.company.com/application/o/reactive-resume/.wel
## Security Considerations
<CardGroup cols={2}>
<Card title="Use HTTPS" icon="lock">
Always use HTTPS for both your Reactive Resume instance and OAuth provider in production. OAuth tokens should never
be transmitted over unencrypted connections.
</Card>
<Card title="Protect secrets" icon="key">
Never commit `OAUTH_CLIENT_SECRET` to version control. Use environment variables or a secrets manager.
</Card>
<Card title="Verify redirect URIs" icon="shield-check">
Configure your OAuth provider to only allow the exact redirect URI. Avoid wildcards in redirect URI configurations.
</Card>
<Card title="Review scopes" icon="list-check">
Only request the scopes you need. The default (`openid profile email`) is sufficient for Reactive Resume.
</Card>
<Card title="Use HTTPS" icon="lock">
Always use HTTPS for both your Reactive Resume instance and OAuth provider in production. OAuth tokens should never
be transmitted over unencrypted connections.
</Card>
<Card title="Protect secrets" icon="key">
Never commit `OAUTH_CLIENT_SECRET` to version control. Use environment variables or a secrets manager.
</Card>
<Card title="Verify redirect URIs" icon="shield-check">
Configure your OAuth provider to only allow the exact redirect URI. Avoid wildcards in redirect URI configurations.
</Card>
<Card title="Review scopes" icon="list-check">
Only request the scopes you need. The default (`openid profile email`) is sufficient for Reactive Resume.
</Card>
</CardGroup>
+3095 -3095
View File
File diff suppressed because it is too large Load Diff