diff --git a/docs/docs.json b/docs/docs.json index 3f8a4552d..fdcd65757 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -52,11 +52,15 @@ "group": "Resume Builder", "pages": [ "guides/creating-your-first-resume", + "guides/managing-resumes-from-the-dashboard", + "guides/importing-resumes", "guides/choosing-a-template", "guides/selecting-page-format", "guides/moving-items-between-sections", "guides/fitting-content-on-a-page", "guides/adding-a-cover-letter", + "guides/using-the-builder-dock", + "guides/using-ai-in-the-builder", "guides/exporting-your-resume", "guides/sharing-your-resume-publicly", "guides/using-private-notes" diff --git a/docs/guides/creating-your-first-resume.mdx b/docs/guides/creating-your-first-resume.mdx index c10119b4c..fa4fa1890 100644 --- a/docs/guides/creating-your-first-resume.mdx +++ b/docs/guides/creating-your-first-resume.mdx @@ -17,20 +17,27 @@ description: "Learn how to create your first resume in Reactive Resume, set a na After logging in, navigate to your Dashboard where all of your resumes live. - This is where you can create, organize, and manage multiple resumes for different roles or versions. + This is where you can create, import, organize, and manage multiple resumes for different roles or versions. In the Resumes Dashboard, click on the Create a new resume card to open the creation form. + + + Create a new resume dialog with name, slug, and tags fields + Fill in the resume name. This can be a generic name (e.g., “General Resume”) or something tied to the position you’re applying for. - If you can’t think of a name yet, click the Magic Wand button to generate a random name for you. + If you can’t think of a name yet, click the magic wand button to generate a random name for you. @@ -48,12 +55,31 @@ description: "Learn how to create your first resume in Reactive Resume, set a na Add any Tags you want. Think of tags like folders or labels to help organize many resumes. - You can filter resumes by tags later from the Dashboard. + You can filter resumes by tags later from the Dashboard. The tag filter appears after you have at least one tag. + + Click **Create** to start with an empty resume, or open the split-button menu and choose **Create a Sample Resume** to start with sample content. + + + A sample resume is useful when you want to explore templates, layout controls, and exports before entering your own + information. + + + + Once created, a new card for your resume will appear on the Dashboard. Click it to open the resume builder and start editing. + +## What you can do next + +After creating your first resume, you can: + +- change the template in [Choosing a template](/guides/choosing-a-template); +- adjust the page format in [Selecting the right page format](/guides/selecting-page-format); +- download a copy in [Exporting your resume](/guides/exporting-your-resume); +- organize, duplicate, lock, or delete resumes in [Managing resumes from the dashboard](/guides/managing-resumes-from-the-dashboard). diff --git a/docs/guides/exporting-your-resume.mdx b/docs/guides/exporting-your-resume.mdx index f4d199de8..71ff6ebd2 100644 --- a/docs/guides/exporting-your-resume.mdx +++ b/docs/guides/exporting-your-resume.mdx @@ -1,1207 +1,96 @@ --- title: "Exporting your resume" -description: "Learn how to export your resume as a PDF or JSON file, and discover how JSON exports can be used with AI assistants like ChatGPT or Claude." +description: "Learn how to export your resume as PDF, DOCX, or JSON from the builder." --- -Reactive Resume lets you export your resume in two formats: **PDF** and **JSON**. Each format serves a different purpose—PDFs are ideal for sharing with recruiters and uploading to job applications, while JSON files are perfect for backups, importing into other tools, or working with AI assistants. +Reactive Resume can export your resume in three formats: -## Where to find the Export section +| Format | Best for | +| --- | --- | +| **PDF** | Job applications, recruiter emails, printing, and public resume downloads. | +| **DOCX** | Further editing in Microsoft Word, Google Docs, or another word processor. | +| **JSON** | Backups, restoring a resume later, importing into another Reactive Resume account, or sharing structured data with an AI assistant. | -In the resume builder, open the **right sidebar** and select **Export**. +## Export from the right sidebar -You'll see two export options: + + + Go to the dashboard and open the resume you want to export. + -- **JSON** - Download a machine-readable copy of your resume data -- **PDF** - Download a print-ready version of your resume + + In the right sidebar, select **Export**. -## Exporting as PDF + + Export section showing JSON, DOCX, and PDF download buttons + + -Click the **PDF** button to generate and download a PDF version of your resume. + + Click **JSON**, **DOCX**, or **PDF**. + + + + Your browser downloads the exported file using the resume name as the filename. + + + +## Export from the builder dock + +The floating dock at the bottom of the builder also includes quick download buttons for **JSON**, **DOCX**, and **PDF**. + +Use the dock when you already know which format you need. Use the right sidebar's **Export** section when you want the format descriptions next to each button. + +For more dock controls, see [Using the builder dock](/guides/using-the-builder-dock). + +## Export as PDF + +Choose **PDF** when you need a file that preserves your resume layout. + +Use PDF for: + +- uploading to job applications; +- emailing recruiters or hiring managers; +- printing; +- sharing a finished copy outside Reactive Resume. - The PDF is rendered server-side using your current resume data and template settings. What you see in the preview is - what you'll get in the PDF, split into multiple pages if necessary. + The PDF is generated from your current resume data, template, typography, design, layout, and page settings. -### When to use PDF exports +## Export as DOCX -- **Job applications** - Most applicant tracking systems (ATS) accept PDF uploads -- **Sharing with recruiters** - PDFs are universally readable and preserve your formatting -- **Printing** - PDFs are print-ready and maintain exact layout on paper -- **Email attachments** - Easy to attach and share via email +Choose **DOCX** when you want to continue editing your resume in a word processor. -Before exporting, double-check your resume in the live preview. +Use DOCX for: -## Exporting as JSON - -Click the **JSON** button to download your resume as a JSON file. - -The JSON file contains your **complete resume data**, including: - -- Personal information (name, email, phone, location, etc.) -- All sections (experience, education, projects, skills, etc.) -- Custom sections -- Template and design settings (colors, fonts, layout, spacing) -- Metadata (page format, margins, typography) - -### When to use JSON exports - - - - Keep local backups of your resume data. If you ever need to restore or compare versions, you can import the JSON file back into Reactive Resume. - - - - You can import a JSON export back into Reactive Resume to create a new resume based on that data. This is useful for - creating variations or restoring from a backup. - - - - JSON files are structured data that AI assistants can read and understand. You can share your resume JSON with an AI to get suggestions, rewrites, or entirely new content tailored to a specific job. - - - -## Using JSON exports with AI assistants - -One of the most powerful uses for JSON exports is working with AI assistants like **ChatGPT**, **Claude**, or other LLMs. Because the JSON file contains structured, machine-readable data, AI assistants can: - -1. **Read and understand your resume** - The AI can parse your experience, skills, and other sections -2. **Suggest improvements** - Ask the AI to rewrite bullet points, improve descriptions, or suggest keywords -3. **Tailor your resume** - Provide a job description and ask the AI to modify your resume to match -4. **Generate cover letters** - Use your resume data to draft a matching cover letter -5. **Create multiple versions** - Ask the AI to create variations for different roles or industries - -### Example workflow with an AI assistant - - - - In the resume builder, go to **Export** and click **JSON** to download your resume data. - - - - Upload the JSON file to ChatGPT, Claude, or paste its contents into the chat. You can say something like: - - > "Here is my resume in JSON format. Please review it and suggest improvements for a Senior Software Engineer role at a fintech company." - - - - - The AI can make changes directly to the JSON structure. For example: - - > "Please update my experience descriptions to be more quantitative and action-oriented. Return the modified JSON." - - - - - 1. Go to your **Dashboard** - 2. Click **Import an existing resume** - 3. Select **Reactive Resume (JSON)** as the type - 4. Upload the modified JSON file - - A new resume will be created with the AI's changes applied. - - - +- making final manual edits in Microsoft Word; +- collaborating with someone who prefers Word or Google Docs; +- submitting to a system that requires a Word document. - Always review AI-generated changes before using them. AI assistants can make mistakes or suggest content that doesn't - accurately reflect your experience. + DOCX exports are useful for editing, but the visual layout may not match the PDF exactly. Use PDF when exact visual + fidelity matters. -### Example prompts for AI assistants +## Export as JSON -Here are some prompts you can use after sharing your resume JSON: +Choose **JSON** when you want a structured backup of your resume. -| Goal | Example Prompt | -| --------------------- | ---------------------------------------------------------------------------------------------------------- | -| General review | "Review my resume and suggest 3-5 improvements to make it more impactful." | -| Tailor to a job | "Here's a job description for [role]. Update my resume JSON to better match this position." | -| Improve bullet points | "Rewrite my experience descriptions to start with strong action verbs and include metrics where possible." | -| Add keywords | "Add relevant keywords for [industry/role] to my skills and experience sections." | -| Shorten resume | "Condense my resume to fit on one page while keeping the most important information." | -| Create a summary | "Write a compelling 2-3 sentence professional summary based on my experience." | +The JSON export includes your resume content and settings. You can import it later from the dashboard to restore the resume or create another version. -## JSON schema reference +JSON is also useful when working with AI assistants. You can export JSON, ask an assistant to review or edit the structured data, then import the revised JSON as a new resume. -The exported JSON follows the Reactive Resume schema. Here's a high-level overview of the structure: + + Review AI-generated changes before importing or using them. AI assistants can make mistakes or add details that do not + reflect your experience. + -```json -{ - "$schema": "http://json-schema.org/draft-07/schema", - "type": "object", - "properties": { - "picture": { - "type": "object", - "properties": { - "hidden": { "type": "boolean", "description": "Whether to hide the picture from the resume." }, - "url": { - "type": "string", - "description": "The URL to the picture to display on the resume. Must be a valid URL with a protocol (http:// or https://). Leave blank to hide." - }, - "size": { - "type": "number", - "minimum": 32, - "maximum": 512, - "description": "The size of the picture to display on the resume, defined in points (pt)." - }, - "rotation": { - "type": "number", - "minimum": 0, - "maximum": 360, - "description": "The rotation of the picture to display on the resume, defined in degrees (°)." - }, - "aspectRatio": { - "type": "number", - "minimum": 0.5, - "maximum": 2.5, - "description": "The aspect ratio of the picture to display on the resume, defined as width / height (e.g. 1.5 for 1.5:1 or 0.5 for 1:2)." - }, - "borderRadius": { - "type": "number", - "minimum": 0, - "maximum": 100, - "description": "The border radius of the picture to display on the resume, defined in points (pt)." - }, - "borderColor": { - "type": "string", - "description": "The color of the border of the picture to display on the resume, defined as rgba(r, g, b, a)." - }, - "borderWidth": { - "type": "number", - "minimum": 0, - "description": "The width of the border of the picture to display on the resume, defined in points (pt)." - }, - "shadowColor": { - "type": "string", - "description": "The color of the shadow of the picture to display on the resume, defined as rgba(r, g, b, a)." - }, - "shadowWidth": { - "type": "number", - "minimum": 0, - "description": "The width of the shadow of the picture to display on the resume, defined in points (pt)." - } - }, - "required": [ - "hidden", - "url", - "size", - "rotation", - "aspectRatio", - "borderRadius", - "borderColor", - "borderWidth", - "shadowColor", - "shadowWidth" - ], - "additionalProperties": false, - "description": "Configuration for photograph displayed on the resume" - }, - "basics": { - "type": "object", - "properties": { - "name": { "type": "string", "description": "The full name of the author of the resume." }, - "headline": { "type": "string", "description": "The headline of the author of the resume." }, - "email": { - "anyOf": [ - { - "type": "string", - "format": "email", - "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" - }, - { "type": "string", "const": "" } - ], - "description": "The email address of the author of the resume. Leave blank to hide." - }, - "phone": { - "type": "string", - "description": "The phone number of the author of the resume. Leave blank to hide." - }, - "location": { "type": "string", "description": "The location of the author of the resume." }, - "website": { - "type": "object", - "properties": { - "url": { - "type": "string", - "description": "The URL to show as a link. Must be a valid URL with a protocol (http:// or https://). Leave blank to hide." - }, - "label": { - "type": "string", - "description": "The label to display for the URL. Leave blank to display the URL as-is." - } - }, - "required": ["url", "label"], - "additionalProperties": false, - "description": "The website of the author of the resume." - }, - "customFields": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "The unique identifier for the custom field. Usually generated as a UUID." - }, - "icon": { - "type": "string", - "description": "The icon to display for the custom field. Must be a valid icon name from @phosphor-icons/web icon set, or an empty string to hide. Default to '' (empty string) when unsure which icons are available." - }, - "text": { "type": "string", "description": "The text to display for the custom field." } - }, - "required": ["id", "icon", "text"], - "additionalProperties": false - }, - "description": "The custom fields to display on the resume." - } - }, - "required": ["name", "headline", "email", "phone", "location", "website", "customFields"], - "additionalProperties": false, - "description": "Basic information about the author, such as name, email, phone, location, and website" - }, - "summary": { - "type": "object", - "properties": { - "title": { "type": "string", "description": "The title of the summary of the resume." }, - "columns": { "type": "number", "description": "The number of columns the summary should span across." }, - "hidden": { "type": "boolean", "description": "Whether to hide the summary from the resume." }, - "content": { - "type": "string", - "description": "The content of the summary of the resume. This should be a HTML-formatted string. Leave blank to hide." - } - }, - "required": ["title", "columns", "hidden", "content"], - "additionalProperties": false, - "description": "Summary section of the resume, useful for a short bio or introduction" - }, - "sections": { - "type": "object", - "properties": { - "profiles": { - "type": "object", - "properties": { - "title": { "type": "string", "description": "The title of the section." }, - "columns": { "type": "number", "description": "The number of columns the section should span across." }, - "hidden": { "type": "boolean", "description": "Whether to hide the section from the resume." }, - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "The unique identifier for the item. Usually generated as a UUID." - }, - "hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." }, - "icon": { - "type": "string", - "description": "The icon to display for the custom field. Must be a valid icon name from @phosphor-icons/web icon set, or an empty string to hide. Default to '' (empty string) when unsure which icons are available." - }, - "network": { - "type": "string", - "minLength": 1, - "description": "The name of the network or platform." - }, - "username": { - "type": "string", - "description": "The username of the author on the network or platform." - }, - "website": { - "type": "object", - "properties": { - "url": { - "type": "string", - "description": "The URL to show as a link. Must be a valid URL with a protocol (http:// or https://). Leave blank to hide." - }, - "label": { - "type": "string", - "description": "The label to display for the URL. Leave blank to display the URL as-is." - } - }, - "required": ["url", "label"], - "additionalProperties": false, - "description": "The link to the profile of the author on the network or platform, if any." - } - }, - "required": ["id", "hidden", "icon", "network", "username", "website"], - "additionalProperties": false - }, - "description": "The items to display in the profiles section." - } - }, - "required": ["title", "columns", "hidden", "items"], - "additionalProperties": false, - "description": "The section to display the profiles of the author." - }, - "experience": { - "type": "object", - "properties": { - "title": { "type": "string", "description": "The title of the section." }, - "columns": { "type": "number", "description": "The number of columns the section should span across." }, - "hidden": { "type": "boolean", "description": "Whether to hide the section from the resume." }, - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "The unique identifier for the item. Usually generated as a UUID." - }, - "hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." }, - "company": { - "type": "string", - "minLength": 1, - "description": "The name of the company or organization." - }, - "position": { "type": "string", "description": "The position held at the company or organization." }, - "location": { "type": "string", "description": "The location of the company or organization." }, - "period": { - "type": "string", - "description": "The period of time the author was employed at the company or organization." - }, - "website": { - "type": "object", - "properties": { - "url": { - "type": "string", - "description": "The URL to show as a link. Must be a valid URL with a protocol (http:// or https://). Leave blank to hide." - }, - "label": { - "type": "string", - "description": "The label to display for the URL. Leave blank to display the URL as-is." - } - }, - "required": ["url", "label"], - "additionalProperties": false, - "description": "The website of the company or organization, if any." - }, - "description": { - "type": "string", - "description": "The description of the experience. This should be a HTML-formatted string. Leave blank to hide." - } - }, - "required": ["id", "hidden", "company", "position", "location", "period", "website", "description"], - "additionalProperties": false - }, - "description": "The items to display in the experience section." - } - }, - "required": ["title", "columns", "hidden", "items"], - "additionalProperties": false, - "description": "The section to display the experience of the author." - }, - "education": { - "type": "object", - "properties": { - "title": { "type": "string", "description": "The title of the section." }, - "columns": { "type": "number", "description": "The number of columns the section should span across." }, - "hidden": { "type": "boolean", "description": "Whether to hide the section from the resume." }, - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "The unique identifier for the item. Usually generated as a UUID." - }, - "hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." }, - "school": { - "type": "string", - "minLength": 1, - "description": "The name of the school or institution." - }, - "degree": { "type": "string", "description": "The degree or qualification obtained." }, - "area": { "type": "string", "description": "The area of study or specialization." }, - "grade": { "type": "string", "description": "The grade or score achieved." }, - "location": { "type": "string", "description": "The location of the school or institution." }, - "period": { "type": "string", "description": "The period of time the education was obtained over." }, - "website": { - "type": "object", - "properties": { - "url": { - "type": "string", - "description": "The URL to show as a link. Must be a valid URL with a protocol (http:// or https://). Leave blank to hide." - }, - "label": { - "type": "string", - "description": "The label to display for the URL. Leave blank to display the URL as-is." - } - }, - "required": ["url", "label"], - "additionalProperties": false, - "description": "The website of the school or institution, if any." - }, - "description": { - "type": "string", - "description": "The description of the education. This should be a HTML-formatted string. Leave blank to hide." - } - }, - "required": [ - "id", - "hidden", - "school", - "degree", - "area", - "grade", - "location", - "period", - "website", - "description" - ], - "additionalProperties": false - }, - "description": "The items to display in the education section." - } - }, - "required": ["title", "columns", "hidden", "items"], - "additionalProperties": false, - "description": "The section to display the education of the author." - }, - "projects": { - "type": "object", - "properties": { - "title": { "type": "string", "description": "The title of the section." }, - "columns": { "type": "number", "description": "The number of columns the section should span across." }, - "hidden": { "type": "boolean", "description": "Whether to hide the section from the resume." }, - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "The unique identifier for the item. Usually generated as a UUID." - }, - "hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." }, - "name": { "type": "string", "minLength": 1, "description": "The name of the project." }, - "period": { "type": "string", "description": "The period of time the project was worked on." }, - "website": { - "type": "object", - "properties": { - "url": { - "type": "string", - "description": "The URL to show as a link. Must be a valid URL with a protocol (http:// or https://). Leave blank to hide." - }, - "label": { - "type": "string", - "description": "The label to display for the URL. Leave blank to display the URL as-is." - } - }, - "required": ["url", "label"], - "additionalProperties": false, - "description": "The link to the project, if any." - }, - "description": { - "type": "string", - "description": "The description of the project. This should be a HTML-formatted string. Leave blank to hide." - } - }, - "required": ["id", "hidden", "name", "period", "website", "description"], - "additionalProperties": false - }, - "description": "The items to display in the projects section." - } - }, - "required": ["title", "columns", "hidden", "items"], - "additionalProperties": false, - "description": "The section to display the projects of the author." - }, - "skills": { - "type": "object", - "properties": { - "title": { "type": "string", "description": "The title of the section." }, - "columns": { "type": "number", "description": "The number of columns the section should span across." }, - "hidden": { "type": "boolean", "description": "Whether to hide the section from the resume." }, - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "The unique identifier for the item. Usually generated as a UUID." - }, - "hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." }, - "icon": { - "type": "string", - "description": "The icon to display for the custom field. Must be a valid icon name from @phosphor-icons/web icon set, or an empty string to hide. Default to '' (empty string) when unsure which icons are available." - }, - "name": { "type": "string", "minLength": 1, "description": "The name of the skill." }, - "proficiency": { - "type": "string", - "description": "The proficiency level of the skill. Can be any text, such as 'Beginner', 'Intermediate', 'Advanced', etc." - }, - "level": { - "default": 0, - "description": "The proficiency level of the skill, defined as a number between 0 and 5. If set to 0, the icons displaying the level will be hidden.", - "type": "number", - "minimum": 0, - "maximum": 5 - }, - "keywords": { - "default": [], - "description": "The keywords associated with the skill, if any. These are displayed as tags below the name.", - "type": "array", - "items": { "type": "string" } - } - }, - "required": ["id", "hidden", "icon", "name", "proficiency", "level", "keywords"], - "additionalProperties": false - }, - "description": "The items to display in the skills section." - } - }, - "required": ["title", "columns", "hidden", "items"], - "additionalProperties": false, - "description": "The section to display the skills of the author." - }, - "languages": { - "type": "object", - "properties": { - "title": { "type": "string", "description": "The title of the section." }, - "columns": { "type": "number", "description": "The number of columns the section should span across." }, - "hidden": { "type": "boolean", "description": "Whether to hide the section from the resume." }, - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "The unique identifier for the item. Usually generated as a UUID." - }, - "hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." }, - "language": { - "type": "string", - "minLength": 1, - "description": "The name of the language the author knows." - }, - "fluency": { - "type": "string", - "description": "The fluency level of the language. Can be any text, such as 'Native', 'Fluent', 'Conversational', etc. or can also be a CEFR level (A1, A2, B1, B2, C1, C2)." - }, - "level": { - "default": 0, - "description": "The proficiency level of the language, defined as a number between 0 and 5. If set to 0, the icons displaying the level will be hidden.", - "type": "number", - "minimum": 0, - "maximum": 5 - } - }, - "required": ["id", "hidden", "language", "fluency", "level"], - "additionalProperties": false - }, - "description": "The items to display in the languages section." - } - }, - "required": ["title", "columns", "hidden", "items"], - "additionalProperties": false, - "description": "The section to display the languages of the author." - }, - "interests": { - "type": "object", - "properties": { - "title": { "type": "string", "description": "The title of the section." }, - "columns": { "type": "number", "description": "The number of columns the section should span across." }, - "hidden": { "type": "boolean", "description": "Whether to hide the section from the resume." }, - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "The unique identifier for the item. Usually generated as a UUID." - }, - "hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." }, - "icon": { - "type": "string", - "description": "The icon to display for the custom field. Must be a valid icon name from @phosphor-icons/web icon set, or an empty string to hide. Default to '' (empty string) when unsure which icons are available." - }, - "name": { "type": "string", "minLength": 1, "description": "The name of the interest/hobby." }, - "keywords": { - "default": [], - "description": "The keywords associated with the interest/hobby, if any. These are displayed as tags below the name.", - "type": "array", - "items": { "type": "string" } - } - }, - "required": ["id", "hidden", "icon", "name", "keywords"], - "additionalProperties": false - }, - "description": "The items to display in the interests section." - } - }, - "required": ["title", "columns", "hidden", "items"], - "additionalProperties": false, - "description": "The section to display the interests of the author." - }, - "awards": { - "type": "object", - "properties": { - "title": { "type": "string", "description": "The title of the section." }, - "columns": { "type": "number", "description": "The number of columns the section should span across." }, - "hidden": { "type": "boolean", "description": "Whether to hide the section from the resume." }, - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "The unique identifier for the item. Usually generated as a UUID." - }, - "hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." }, - "title": { "type": "string", "minLength": 1, "description": "The title of the award." }, - "awarder": { "type": "string", "description": "The awarder of the award." }, - "date": { "type": "string", "description": "The date when the award was received." }, - "website": { - "type": "object", - "properties": { - "url": { - "type": "string", - "description": "The URL to show as a link. Must be a valid URL with a protocol (http:// or https://). Leave blank to hide." - }, - "label": { - "type": "string", - "description": "The label to display for the URL. Leave blank to display the URL as-is." - } - }, - "required": ["url", "label"], - "additionalProperties": false, - "description": "The website of the award, if any." - }, - "description": { - "type": "string", - "description": "The description of the award. This should be a HTML-formatted string. Leave blank to hide." - } - }, - "required": ["id", "hidden", "title", "awarder", "date", "website", "description"], - "additionalProperties": false - }, - "description": "The items to display in the awards section." - } - }, - "required": ["title", "columns", "hidden", "items"], - "additionalProperties": false, - "description": "The section to display the awards of the author." - }, - "certifications": { - "type": "object", - "properties": { - "title": { "type": "string", "description": "The title of the section." }, - "columns": { "type": "number", "description": "The number of columns the section should span across." }, - "hidden": { "type": "boolean", "description": "Whether to hide the section from the resume." }, - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "The unique identifier for the item. Usually generated as a UUID." - }, - "hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." }, - "title": { "type": "string", "minLength": 1, "description": "The title of the certification." }, - "issuer": { "type": "string", "description": "The issuer of the certification." }, - "date": { "type": "string", "description": "The date when the certification was received." }, - "website": { - "type": "object", - "properties": { - "url": { - "type": "string", - "description": "The URL to show as a link. Must be a valid URL with a protocol (http:// or https://). Leave blank to hide." - }, - "label": { - "type": "string", - "description": "The label to display for the URL. Leave blank to display the URL as-is." - } - }, - "required": ["url", "label"], - "additionalProperties": false, - "description": "The website of the certification, if any." - }, - "description": { - "type": "string", - "description": "The description of the certification. This should be a HTML-formatted string. Leave blank to hide." - } - }, - "required": ["id", "hidden", "title", "issuer", "date", "website", "description"], - "additionalProperties": false - }, - "description": "The items to display in the certifications section." - } - }, - "required": ["title", "columns", "hidden", "items"], - "additionalProperties": false, - "description": "The section to display the certifications of the author." - }, - "publications": { - "type": "object", - "properties": { - "title": { "type": "string", "description": "The title of the section." }, - "columns": { "type": "number", "description": "The number of columns the section should span across." }, - "hidden": { "type": "boolean", "description": "Whether to hide the section from the resume." }, - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "The unique identifier for the item. Usually generated as a UUID." - }, - "hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." }, - "title": { "type": "string", "minLength": 1, "description": "The title of the publication." }, - "publisher": { "type": "string", "description": "The publisher of the publication." }, - "date": { "type": "string", "description": "The date when the publication was published." }, - "website": { - "type": "object", - "properties": { - "url": { - "type": "string", - "description": "The URL to show as a link. Must be a valid URL with a protocol (http:// or https://). Leave blank to hide." - }, - "label": { - "type": "string", - "description": "The label to display for the URL. Leave blank to display the URL as-is." - } - }, - "required": ["url", "label"], - "additionalProperties": false, - "description": "The link to the publication, if any." - }, - "description": { - "type": "string", - "description": "The description of the publication. This should be a HTML-formatted string. Leave blank to hide." - } - }, - "required": ["id", "hidden", "title", "publisher", "date", "website", "description"], - "additionalProperties": false - }, - "description": "The items to display in the publications section." - } - }, - "required": ["title", "columns", "hidden", "items"], - "additionalProperties": false, - "description": "The section to display the publications of the author." - }, - "volunteer": { - "type": "object", - "properties": { - "title": { "type": "string", "description": "The title of the section." }, - "columns": { "type": "number", "description": "The number of columns the section should span across." }, - "hidden": { "type": "boolean", "description": "Whether to hide the section from the resume." }, - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "The unique identifier for the item. Usually generated as a UUID." - }, - "hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." }, - "organization": { - "type": "string", - "minLength": 1, - "description": "The name of the organization or company." - }, - "location": { "type": "string", "description": "The location of the organization or company." }, - "period": { - "type": "string", - "description": "The period of time the author was volunteered at the organization or company." - }, - "website": { - "type": "object", - "properties": { - "url": { - "type": "string", - "description": "The URL to show as a link. Must be a valid URL with a protocol (http:// or https://). Leave blank to hide." - }, - "label": { - "type": "string", - "description": "The label to display for the URL. Leave blank to display the URL as-is." - } - }, - "required": ["url", "label"], - "additionalProperties": false, - "description": "The link to the organization or company, if any." - }, - "description": { - "type": "string", - "description": "The description of the volunteer experience. This should be a HTML-formatted string. Leave blank to hide." - } - }, - "required": ["id", "hidden", "organization", "location", "period", "website", "description"], - "additionalProperties": false - }, - "description": "The items to display in the volunteer section." - } - }, - "required": ["title", "columns", "hidden", "items"], - "additionalProperties": false, - "description": "The section to display the volunteer experience of the author." - }, - "references": { - "type": "object", - "properties": { - "title": { "type": "string", "description": "The title of the section." }, - "columns": { "type": "number", "description": "The number of columns the section should span across." }, - "hidden": { "type": "boolean", "description": "Whether to hide the section from the resume." }, - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "The unique identifier for the item. Usually generated as a UUID." - }, - "hidden": { "type": "boolean", "description": "Whether to hide the item from the resume." }, - "name": { - "type": "string", - "minLength": 1, - "description": "The name of the reference, or a note such as 'Available upon request'." - }, - "description": { - "type": "string", - "description": "The description of the reference. Can be used to display a quote, a testimonial, etc. This should be a HTML-formatted string. Leave blank to hide." - } - }, - "required": ["id", "hidden", "name", "description"], - "additionalProperties": false - }, - "description": "The items to display in the references section." - } - }, - "required": ["title", "columns", "hidden", "items"], - "additionalProperties": false, - "description": "The section to display the references of the author." - } - }, - "required": [ - "profiles", - "experience", - "education", - "projects", - "skills", - "languages", - "interests", - "awards", - "certifications", - "publications", - "volunteer", - "references" - ], - "additionalProperties": false, - "description": "Various sections of the resume, such as experience, education, projects, etc." - }, - "customSections": { - "type": "array", - "items": { - "type": "object", - "properties": { - "title": { "type": "string", "description": "The title of the section." }, - "columns": { "type": "number", "description": "The number of columns the section should span across." }, - "hidden": { "type": "boolean", "description": "Whether to hide the section from the resume." }, - "id": { - "type": "string", - "description": "The unique identifier for the custom section. Usually generated as a UUID." - }, - "content": { - "type": "string", - "description": "The content of the custom section. This should be a HTML-formatted string. Leave blank to hide." - } - }, - "required": ["title", "columns", "hidden", "id", "content"], - "additionalProperties": false - }, - "description": "Custom sections of the resume, such as a custom section for notes, etc." - }, - "metadata": { - "type": "object", - "properties": { - "template": { - "default": "onyx", - "description": "The template to use for the resume. Determines the overall design and appearance of the resume.", - "type": "string", - "enum": [ - "azurill", - "bronzor", - "chikorita", - "ditgar", - "ditto", - "gengar", - "glalie", - "kakuna", - "lapras", - "leafish", - "meowth", - "onyx", - "pikachu", - "rhyhorn", - "scizor" - ] - }, - "layout": { - "type": "object", - "properties": { - "sidebarWidth": { - "default": 35, - "description": "The width of the sidebar column, defined as a percentage of the page width.", - "type": "number", - "minimum": 10, - "maximum": 50 - }, - "pages": { - "type": "array", - "items": { - "type": "object", - "properties": { - "fullWidth": { - "type": "boolean", - "description": "Whether the layout of the page should be full width. If true, the main column will span the entire width of the page. This means that there should be no items in the sidebar column." - }, - "main": { - "type": "array", - "items": { "type": "string" }, - "description": "The items to display in the main column of the page. A string array of section IDs (experience, education, projects, skills, languages, interests, awards, certifications, publications, volunteer, references, profiles, summary or UUIDs for custom sections)." - }, - "sidebar": { - "type": "array", - "items": { "type": "string" }, - "description": "The items to display in the sidebar column of the page. A string array of section IDs (experience, education, projects, skills, languages, interests, awards, certifications, publications, volunteer, references, profiles, summary or UUIDs for custom sections)." - } - }, - "required": ["fullWidth", "main", "sidebar"], - "additionalProperties": false - }, - "description": "The pages to display in the layout." - } - }, - "required": ["sidebarWidth", "pages"], - "additionalProperties": false, - "description": "The layout of the resume. Determines the structure and arrangement of the sections on the resume." - }, - "css": { - "type": "object", - "properties": { - "enabled": { "type": "boolean", "description": "Whether to enable custom CSS for the resume." }, - "value": { - "type": "string", - "description": "The custom CSS to apply to the resume. This should be a valid CSS string." - } - }, - "required": ["enabled", "value"], - "additionalProperties": false, - "description": "Custom CSS to apply to the resume. Can be used to override the default styles of the template." - }, - "page": { - "type": "object", - "properties": { - "gapX": { - "type": "number", - "minimum": 0, - "description": "The horizontal gap between the sections of the page, defined in points (pt)." - }, - "gapY": { - "type": "number", - "minimum": 0, - "description": "The vertical gap between the sections of the page, defined in points (pt)." - }, - "marginX": { - "type": "number", - "minimum": 0, - "description": "The horizontal margin of the page, defined in points (pt)." - }, - "marginY": { - "type": "number", - "minimum": 0, - "description": "The vertical margin of the page, defined in points (pt)." - }, - "format": { - "type": "string", - "enum": ["a4", "letter"], - "description": "The format of the page. Can be 'a4' or 'letter'." - }, - "locale": { - "default": "en-US", - "anyOf": [ - { "type": "string", "const": "en-US" }, - { "type": "string", "const": "de-DE" }, - { "type": "string", "const": "zu-ZA" } - ], - "description": "The language used in the resume, used for displaying pre-translated section headings, if not overridden." - } - }, - "required": ["gapX", "gapY", "marginX", "marginY", "format", "locale"], - "additionalProperties": false, - "description": "The page settings of the resume. Determines the margins, format, and locale of the resume." - }, - "design": { - "type": "object", - "properties": { - "level": { - "type": "object", - "properties": { - "icon": { - "type": "string", - "description": "The icon to display for the custom field. Must be a valid icon name from @phosphor-icons/web icon set, or an empty string to hide. Default to '' (empty string) when unsure which icons are available." - }, - "type": { - "type": "string", - "enum": ["hidden", "circle", "square", "rectangle", "rectangle-full", "progress-bar", "icon"], - "description": "The type of the level design. 'hidden' will hide the level design, 'circle' will display a circle, 'square' will display a square, 'rectangle' will display a rectangle, 'rectangle-full' will display a full rectangle, 'progress-bar' will display a progress bar, and 'icon' will display an icon. If 'icon' is selected, the icon to display should be specified in the 'icon' field." - } - }, - "required": ["icon", "type"], - "additionalProperties": false - }, - "colors": { - "type": "object", - "properties": { - "primary": { - "type": "string", - "description": "The primary color of the design, defined as rgba(r, g, b, a)." - }, - "text": { - "type": "string", - "description": "The text color of the design, defined as rgba(r, g, b, a). Usually set to black: rgba(0, 0, 0, 1)." - }, - "background": { - "type": "string", - "description": "The background color of the design, defined as rgba(r, g, b, a). Usually set to white: rgba(255, 255, 255, 1)." - } - }, - "required": ["primary", "text", "background"], - "additionalProperties": false - } - }, - "required": ["level", "colors"], - "additionalProperties": false, - "description": "The design settings of the resume. Determines the colors, level designs, and typography of the resume." - }, - "typography": { - "type": "object", - "properties": { - "body": { - "type": "object", - "properties": { - "fontFamily": { - "type": "string", - "description": "The family of the font to use. Must be a font that is available on Google Fonts." - }, - "fontWeights": { - "default": ["400"], - "description": "The weight of the font, defined as a number between 100 and 900. Default to 400 when unsure if the weight is available in the font.", - "type": "array", - "items": { "type": "string", "enum": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] } - }, - "fontSize": { - "default": 11, - "description": "The size of the font to use, defined in points (pt).", - "type": "number", - "minimum": 6, - "maximum": 24 - }, - "lineHeight": { - "default": 1.5, - "description": "The line height of the font to use, defined as a multiplier of the font size (e.g. 1.5 for 1.5x).", - "type": "number", - "minimum": 0.5, - "maximum": 4 - } - }, - "required": ["fontFamily", "fontWeights", "fontSize", "lineHeight"], - "additionalProperties": false, - "description": "The typography for the body of the resume." - }, - "heading": { - "type": "object", - "properties": { - "fontFamily": { - "type": "string", - "description": "The family of the font to use. Must be a font that is available on Google Fonts." - }, - "fontWeights": { - "default": ["400"], - "description": "The weight of the font, defined as a number between 100 and 900. Default to 400 when unsure if the weight is available in the font.", - "type": "array", - "items": { "type": "string", "enum": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] } - }, - "fontSize": { - "default": 11, - "description": "The size of the font to use, defined in points (pt).", - "type": "number", - "minimum": 6, - "maximum": 24 - }, - "lineHeight": { - "default": 1.5, - "description": "The line height of the font to use, defined as a multiplier of the font size (e.g. 1.5 for 1.5x).", - "type": "number", - "minimum": 0.5, - "maximum": 4 - } - }, - "required": ["fontFamily", "fontWeights", "fontSize", "lineHeight"], - "additionalProperties": false, - "description": "The typography for the headings of the resume." - } - }, - "required": ["body", "heading"], - "additionalProperties": false, - "description": "The typography settings of the resume. Determines the fonts and sizes of the body and headings of the resume." - }, - "notes": { - "type": "string", - "description": "Personal notes for the resume. Can be used to add any additional information or instructions for the resume. These notes are not displayed on the resume, they are only visible to the author of the resume when editing the resume. This should be a HTML-formatted string." - } - }, - "required": ["template", "layout", "css", "page", "design", "typography", "notes"], - "additionalProperties": false, - "description": "Metadata for the resume, such as template, layout, typography, etc. This section describes the overall design and appearance of the resume." - }, - "version": { "type": "string", "const": "5.0.0", "description": "The version of the Reactive Resume JSON Schema" }, - "$schema": { - "type": "string", - "const": "http://localhost:3000/schema.json", - "description": "The URL of the Reactive Resume JSON Schema, used for validation and documentation purposes." - } - }, - "required": ["picture", "basics", "summary", "sections", "customSections", "metadata", "version", "$schema"], - "additionalProperties": false -} -``` +## Public resume downloads - - You can access the complete JSON schema at [`https://rxresu.me/schema.json`](https://rxresu.me/schema.json). - Referencing this is helpful for validating your resume JSON or providing a detailed schema reference when - collaborating with AI assistants. - +If your resume is public, visitors can download a PDF from the public resume page. You can enable public access in the builder's **Sharing** section. -## Re-importing your JSON - -To import a JSON file back into Reactive Resume: - - - - Navigate to your resumes dashboard. - - -Find the import card and click it to open the import dialog. - - - In the format options, select **Reactive Resume (JSON)** if your file was exported from the current version. - - -Click the upload area and select your JSON file. - - - Click **Import** to create a new resume from the file. - - - -Importing a JSON file creates a **new resume**. Your existing resumes are not affected. +For the full public sharing workflow, see [Sharing your resume publicly](/guides/sharing-your-resume-publicly). diff --git a/docs/guides/importing-resumes.mdx b/docs/guides/importing-resumes.mdx new file mode 100644 index 000000000..14036c2c5 --- /dev/null +++ b/docs/guides/importing-resumes.mdx @@ -0,0 +1,80 @@ +--- +title: "Importing resumes" +description: "Learn which file formats Reactive Resume can import and how to import an existing resume from the dashboard." +--- + +Reactive Resume can create a new resume from several existing file formats. Use import when you are moving from another tool, restoring a backup, or converting an older Reactive Resume file. + +## Supported import formats + +| Format | Requires AI integration? | Notes | +| --- | --- | --- | +| **Reactive Resume (JSON)** | No | Best option for backups exported from the current version of Reactive Resume. | +| **Reactive Resume v4 (JSON)** | No | Use this for files exported from Reactive Resume v4. | +| **JSON Resume** | No | Use this for files that follow the JSON Resume schema. | +| **PDF** | Yes | Reactive Resume asks your configured AI provider to parse the file into structured resume data. | +| **Microsoft Word** | Yes | Supports Word documents. Reactive Resume asks your configured AI provider to parse the document. | + + + PDF and Word imports depend on your AI settings because those formats are not structured resume data. Configure AI in + **Dashboard -> Settings -> Integrations** before using those import types. + + +## Import a resume + + + + Sign in and go to **Dashboard -> Resumes**. + + + + Select the **Import an existing resume** card. + + + Import dialog showing supported resume import types + + + + + Pick the format that matches your file. + + + + Click the file selector and choose the resume file from your computer. + + + + Click **Import**. Reactive Resume creates a new resume and opens it in the builder when the import succeeds. + + + +## Choose the right import type + +If you have a file exported from Reactive Resume, choose **Reactive Resume (JSON)**. This preserves the most information because the file already matches Reactive Resume's data model. + +If you are coming from Reactive Resume v4, choose **Reactive Resume v4 (JSON)**. + +If your file is a standard JSON Resume document, choose **JSON Resume**. + +If you only have a PDF or Word document, choose **PDF** or **Microsoft Word**. After import, review every section carefully. AI parsing can save time, but it can also miss details, change wording, or place content in the wrong section. + + + Always review an imported resume before sharing or exporting it. This is especially important for PDF and Word imports. + + +## Troubleshooting + +### The PDF or Word import says AI must be enabled + +Open **Dashboard -> Settings -> Integrations**, fill in your AI provider settings, test the connection, and enable AI features. + +### The imported resume is incomplete + +Try importing a cleaner source file. Simple resumes with selectable text import more reliably than scanned documents, image-heavy PDFs, or files with complex tables. + +### The JSON file is rejected + +Make sure you selected the correct JSON import type. A Reactive Resume JSON export, a Reactive Resume v4 JSON export, and a JSON Resume file are different formats. diff --git a/docs/guides/managing-resumes-from-the-dashboard.mdx b/docs/guides/managing-resumes-from-the-dashboard.mdx new file mode 100644 index 000000000..0b3777388 --- /dev/null +++ b/docs/guides/managing-resumes-from-the-dashboard.mdx @@ -0,0 +1,113 @@ +--- +title: "Managing resumes from the dashboard" +description: "Learn how to sort, filter, open, duplicate, lock, update, and delete resumes from the Resumes dashboard." +--- + +The **Resumes** dashboard is where you manage every resume in your account. Use it to keep separate versions for different roles, clients, locations, or application stages. + + + Resumes dashboard showing sort controls, grid view, create and import cards, and a sample resume + + +## Choose a view + +The dashboard supports two views: + +- **Grid** shows each resume as a card. This is useful when you want a visual overview. +- **List** shows resumes in rows. This is useful when you have many resumes and want a denser view. + +Use the **Grid** and **List** tabs in the top-right of the dashboard to switch between them. + + + Resumes dashboard showing the same resume in list view + + +## Sort resumes + +Use the **Sort by** menu to change the order of your resumes. + +| Sort option | When to use it | +| --- | --- | +| **Last Updated** | Find the resume you worked on most recently. | +| **Created** | Review resumes by when they were first created. | +| **Name** | Keep resumes in alphabetical order. | + +## Filter by tags + +If you add tags to your resumes, the dashboard shows a **Filter by** menu. Select one or more tags to show only matching resumes. + +Tags are useful for grouping resumes by: + +- target role, such as `frontend` or `product`; +- application status, such as `draft` or `sent`; +- market, region, client, or company name. + + + You can add or change tags when creating, updating, or duplicating a resume. + + +## Open a resume + +Click a resume card or row to open it in the builder. + +You can also open the resume menu and choose **Open**. + +## Update name, slug, and tags + +Use **Update** when you want to change a resume's metadata. + + + + On the dashboard, open the menu for the resume you want to edit. + + + + Select **Update** to open the resume details dialog. + + + + Change the **Name**, **Slug**, or **Tags**. + + + + Click **Save Changes**. + + + + + The slug is part of the public URL. If a resume is public, changing the slug changes the link people use to view it. + + +## Duplicate a resume + +Use **Duplicate** when you want to create a new version without changing the original. + +The duplicate dialog starts with the same tags, a copied name, and a copied slug. Edit these before saving if you want the new version to be easier to identify. + +Good reasons to duplicate a resume: + +- tailoring one resume for a specific job posting; +- keeping a short and long version; +- testing a new template or layout; +- creating a localized version. + +## Lock or unlock a resume + +Use **Lock** to prevent accidental edits or deletion. A locked resume cannot be updated or deleted until you unlock it. + +To edit a locked resume later, open the resume menu and choose **Unlock**. + +## Delete a resume + +Use **Delete** only when you no longer need the resume. + + + Deleting a resume cannot be undone. If you might need the content later, export a JSON backup first. See + [Exporting your resume](/guides/exporting-your-resume). + diff --git a/docs/guides/moving-items-between-sections.mdx b/docs/guides/moving-items-between-sections.mdx index 84cd4c37c..7fd19639b 100644 --- a/docs/guides/moving-items-between-sections.mdx +++ b/docs/guides/moving-items-between-sections.mdx @@ -107,8 +107,6 @@ A common use case is when your work history is too long to fit on a single page. - Page 2 continues with your earlier experience - The section headings and styling remain consistent - {/* TODO: Add screenshot showing a resume with Experience split across page 1 and page 2 */} - diff --git a/docs/guides/sharing-your-resume-publicly.mdx b/docs/guides/sharing-your-resume-publicly.mdx index ad790a205..bfc0736c1 100644 --- a/docs/guides/sharing-your-resume-publicly.mdx +++ b/docs/guides/sharing-your-resume-publicly.mdx @@ -1,6 +1,6 @@ --- title: "Sharing your resume publicly" -description: "Learn how to share your resume via a public URL, track views and downloads, and optionally protect your resume with a password." +description: "Learn how to share your resume via a public URL, track public engagement, and optionally protect your resume with a password." --- Reactive Resume lets you share your resume via a **public URL** that anyone can access. When you make your resume public, it becomes available at a unique link that you can share with recruiters, include in your portfolio, or add to your LinkedIn profile. @@ -12,7 +12,7 @@ Reactive Resume lets you share your resume via a **public URL** that anyone can Viewers always see the latest version of your resume. No need to send new files when you make updates. - See how many times your resume has been viewed and downloaded. + See public engagement counters in the builder. Optionally require a password so only people you trust can access your resume. @@ -33,6 +33,13 @@ Reactive Resume lets you share your resume via a **public URL** that anyone can Turn on the **Allow Public Access** switch. Once enabled, your resume will be accessible via its public URL. + + + Sharing section showing the public access control + @@ -58,7 +65,7 @@ When someone visits your public resume URL: 1. **They see the live version** - The page renders your current resume data with all your latest changes 2. **No account required** - Visitors don't need a Reactive Resume account to view or download your resume -3. **They can print or save as PDF** - Visitors can use their browser's print function to save a PDF copy +3. **They can download a PDF** - Visitors can use the download button on the public page 4. **Views are tracked** - Each visit is counted in your resume statistics (see below) @@ -66,9 +73,9 @@ When someone visits your public resume URL: public resume is always in sync. -## Tracking views and downloads +## Tracking public engagement -When your resume is public, Reactive Resume tracks how many times it has been viewed and downloaded. This helps you understand engagement and see if people are actually looking at your resume. +When your resume is public, Reactive Resume tracks public views. This helps you understand whether people are opening the link you shared. ### Where to find statistics @@ -80,12 +87,12 @@ You'll see: | ------------------- | ---------------------------------------------------------------- | | **Views** | Number of times your public resume page was visited | | **Last viewed** | The date when your resume was last viewed | -| **Downloads** | Number of times your resume was downloaded (via the public page) | -| **Last downloaded** | The date when your resume was last downloaded | +| **Downloads** | Number of recorded resume downloads | +| **Last downloaded** | The date when the last recorded download happened | - 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 shown after public sharing is enabled. If you turn off public access, existing stats are + preserved. ### What counts as a view? @@ -118,7 +125,7 @@ When password protection is enabled: First, make sure **Allow Public Access** is turned on in the **Sharing** section. -Below the public URL, click the **Set Password** button. +Below the public URL, click **Set Password**. Type a password (6-64 characters) and confirm. This password will be required to view your resume. @@ -190,6 +197,15 @@ When public access is disabled: access entirely. This way, your URL remains active for people who have the password. +## Copying the URL from the builder dock + +The builder dock includes a **Copy URL** shortcut. It copies the same public URL shown in the **Sharing** section. + + + Copying the URL does not enable public access. Turn on **Allow Public Access** in the **Sharing** section before sending + the link to someone else. + + ## Frequently asked questions diff --git a/docs/guides/using-ai-in-the-builder.mdx b/docs/guides/using-ai-in-the-builder.mdx new file mode 100644 index 000000000..afb018d0a --- /dev/null +++ b/docs/guides/using-ai-in-the-builder.mdx @@ -0,0 +1,93 @@ +--- +title: "Using AI in the builder" +description: "Learn how to run resume analysis and use the AI Resume Assistant to review proposed resume changes before applying them." +--- + +Reactive Resume includes two AI-assisted builder workflows: + +- **Resume Analysis** gives you a score, strengths, and prioritized suggestions. +- **AI Resume Assistant** proposes specific edits that you can accept or reject. + + + These features require a tested and enabled AI provider in **Dashboard -> Settings -> Integrations**. For setup, see + [Using Artificial Intelligence](/guides/using-ai). + + +## Run a resume analysis + +Use resume analysis when you want a broad review before making changes. + + + + Go to the dashboard and open the resume you want to review. + + + + In the right sidebar, select **Resume Analysis**. + + + Resume Analysis section showing the AI setup prompt in the builder sidebar + + + + + Reactive Resume sends the current resume data to your configured AI provider. + + + + Review the overall score, scorecard, strengths, and suggestions. + + + +Use the analysis as guidance, not as a final verdict. The best resume still depends on the job, industry, and audience. + +## Open the AI Resume Assistant + +Click the assistant button in the builder dock to open the assistant. + +On desktop, the assistant opens as a movable, resizable panel. On smaller screens, it opens as a full-height sheet. + +If AI is unavailable, the builder shows a link to **Integrations** so you can configure it. + +## Ask for targeted changes + +The assistant works best when you ask for specific, incremental changes. + +Good prompts: + +- "Rewrite my summary for a senior frontend engineer role." +- "Tighten the bullets in my most recent job." +- "Add measurable impact to my project descriptions." +- "Adapt this resume for the job description below." + +Avoid asking it to rewrite everything at once unless you are prepared to review many changes. + +## Review proposals before applying them + +When the assistant proposes edits, Reactive Resume shows a review card with: + +- a proposal title and summary; +- badges for the proposed operations; +- before and after previews; +- the raw JSON Patch for users who want to inspect the exact operations. + +You can: + +- **Accept** one proposal; +- **Reject** one proposal; +- move between proposals with **Prev** and **Next**; +- **Accept all** or **Reject all** from the split-button menu. + + + Review AI proposals before accepting them. AI can introduce wording that is inaccurate, too generic, or not aligned + with your actual experience. + + +## When a proposal cannot be applied + +A proposal can fail if the resume changed after the assistant generated it, if the resume is locked, or if the proposed patch no longer matches the current resume data. + +If that happens, ask the assistant to regenerate the change from the latest version of the resume. diff --git a/docs/guides/using-ai.mdx b/docs/guides/using-ai.mdx index fbe8aba86..0074d7a07 100644 --- a/docs/guides/using-ai.mdx +++ b/docs/guides/using-ai.mdx @@ -1,79 +1,87 @@ --- title: "Using Artificial Intelligence" -description: "Learn how to configure an AI provider and API key for AI-assisted features in Reactive Resume" +description: "Learn how to configure an AI provider for AI-assisted features in Reactive Resume." --- +Reactive Resume uses AI providers for features such as resume analysis, AI-assisted resume changes, AI agent drafts, and PDF or Word imports. + +## Open AI provider settings + Head over to [https://rxresu.me](https://rxresu.me) and sign in with your account credentials. - - Once you're in the dashboard, look for the sidebar navigation on the left. Under the Settings section, - click on Artificial Intelligence. - - - - When you configure your AI provider settings on this page, all information (such as the API key and model) is stored locally in your browser and **not** in our database. - - - Your credentials and AI configuration are never saved on Reactive Resume servers. They only live in your device's browser storage. - - - However, whenever you use an AI-assisted feature (such as text generation), these credentials need to be sent to the server **temporarily and only for the duration of your request**. This is required to connect with the AI provider on your behalf. See below for a deeper explanation. - - - - - In the Provider field, choose one of the supported providers: - - - **OpenAI** - - **Google Gemini** - - **Anthropic Claude** - - **Ollama** (coming soon) - - - - - In the Model field, enter the model you want to use (for example, gpt-5.2,{" "} - claude-4.5-opus, or gemini-3-flash). - - - - In the API Key field, paste your provider API key. - - - Treat this key like a password. Anyone with it can use your provider account and may incur costs. - - - - - - After setting the provider, model, and API key, the status indicator at the bottom of the page should show Enabled. - - - If the status shows Disabled, double-check that all three fields are filled in. - + + In the dashboard sidebar, under **Settings**, click **Integrations**. + + Integrations settings showing AI provider configuration + -## Why AI requests are sent through our server +## Add a provider -Most AI providers (like OpenAI, Gemini, or Anthropic) block requests that come directly from the browser due to something called **CORS** ("Cross-Origin Resource Sharing"), a security mechanism built into web browsers. +In the **AI Providers** section, fill out the **Add Provider** form. -**What is CORS?** -CORS is a browser feature that prevents web pages from making requests to a different domain than the one that served the web page, unless that domain explicitly allows it. Most AI providers do not allow browser-based requests from random websites, primarily for security and abuse prevention. +| Field | Description | +| --- | --- | +| **Label** | A name that helps you recognize the provider, such as `Work OpenAI` or `Personal OpenRouter`. | +| **Provider** | The provider type, such as OpenAI, Anthropic Claude, Google Gemini, Vercel AI Gateway, OpenRouter, Ollama, or OpenAI-compatible. | +| **Model** | The exact model name expected by that provider. | +| **Base URL** | The provider endpoint. Leave the default unless you use a gateway, proxy, local provider, or OpenAI-compatible endpoint. | +| **API Key** | The key Reactive Resume should use when sending AI requests to that provider. | -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.** +Click **Save Provider** when the form is complete. + + + Treat API keys like passwords. Anyone with a key can use the connected provider account and may incur costs. + + +## Test and enable a provider + +After saving a provider, test it before using it. + + + + Reactive Resume sends a small request to verify the provider, model, base URL, and key. + + + + A successful provider is marked **Tested**. A failed provider is marked **Failed** and may show an error message. + + + + Turn on **Use** for the tested provider you want Reactive Resume to use. + + - 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 src/integrations/orpc/router/ai.ts within the codebase. + Only tested providers can be used for AI-assisted features. ---- +## How credentials are stored -### Do you know a workaround? +AI provider credentials are encrypted on the server and are never shown again after saving. The settings page only shows a preview of the saved key. -If you have a solution or workaround for this CORS-related limitation, please consider raising an [issue or pull request on GitHub](https://github.com/reactive-resume/reactive-resume). +If provider management is unavailable, your self-hosted deployment may be missing required server configuration. + + + AI provider management requires the server-side services used to encrypt credentials and run AI work. If the page says + provider management is unavailable, check your deployment configuration before using AI features. + + +## Where AI is used + +After a provider is tested and enabled, you can use AI in: + +- **Resume Analysis** in the builder's right sidebar; +- **AI-assisted resume changes** from the builder; +- **Agent** workflows that create isolated AI drafts; +- **PDF and Microsoft Word imports** from the dashboard import dialog. + +For the builder workflow, see [Using AI in the builder](/guides/using-ai-in-the-builder). For AI-assisted imports, see [Importing resumes](/guides/importing-resumes). diff --git a/docs/guides/using-private-notes.mdx b/docs/guides/using-private-notes.mdx index 024848677..8f98831d4 100644 --- a/docs/guides/using-private-notes.mdx +++ b/docs/guides/using-private-notes.mdx @@ -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. - Private Notes are stored securely with your resume data and are only visible to you when editing your resume. + Private Notes are stored with that resume's data and are only visible to you when editing the resume. ## Where to find it @@ -83,15 +83,15 @@ Track your follow-up schedule: - Your notes are saved automatically as you type—there's no need to click a save button. + Your notes are saved automatically as you type. There's no need to click a save button. ## Privacy guarantee - 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 in your exported files, on your public resume link, or + in a printed version of your resume. 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. diff --git a/docs/guides/using-the-builder-dock.mdx b/docs/guides/using-the-builder-dock.mdx new file mode 100644 index 000000000..333417b0c --- /dev/null +++ b/docs/guides/using-the-builder-dock.mdx @@ -0,0 +1,68 @@ +--- +title: "Using the builder dock" +description: "Learn how to use the floating dock in the resume builder for zooming, page layout, sharing, exports, and AI assistance." +--- + +The builder dock is the floating toolbar at the bottom of the resume builder. It gives you quick access to preview controls, sharing, exports, and the AI assistant without leaving the resume canvas. + + + Resume builder showing the floating dock with preview controls and download shortcuts + + +## Preview controls + +Use the left side of the dock to control the preview. + +| Control | What it does | +| --- | --- | +| **Zoom in** | Increases the preview zoom. | +| **Zoom out** | Decreases the preview zoom. | +| **Center view** | Re-centers the resume preview in the canvas. | +| **Toggle page stacking** | Switches between stacked pages and side-by-side pages. | + +These controls only affect the editor preview. They do not change the exported PDF, DOCX, or JSON file. + +## Open the AI assistant + +Click the assistant button to open or close the **AI Resume Assistant**. + +The assistant can propose targeted resume changes, such as rewriting a summary, tightening bullet points, adding metrics, or tailoring the resume to a job description. You review proposed changes before they are applied. + + + The assistant requires a tested and enabled AI provider. See + [Using Artificial Intelligence](/guides/using-ai) for setup and [Using AI in the builder](/guides/using-ai-in-the-builder) + for the builder workflow. + + +## Copy the public URL + +Click **Copy URL** to copy the resume's public link. + +The URL is based on your username and the resume slug: + +```txt +https://rxresu.me/{username}/{slug} +``` + + + Copying the URL does not make the resume public by itself. To allow visitors to open the link, enable public access in + the **Sharing** section of the right sidebar. + + +## Download files from the dock + +The dock includes quick download buttons for: + +- **JSON** for backups, imports, and structured data workflows; +- **DOCX** for editing in Microsoft Word or Google Docs; +- **PDF** for sharing, uploading, and printing. + +These are the same export formats available in the right sidebar's **Export** section. + + + Use the dock when you already know which file you need. Use the right sidebar's **Export** section when you want the + format descriptions next to each button. + diff --git a/docs/images/guides/creating-your-first-resume/screenshot-1.png b/docs/images/guides/creating-your-first-resume/screenshot-1.png new file mode 100644 index 000000000..9513e5c2a Binary files /dev/null and b/docs/images/guides/creating-your-first-resume/screenshot-1.png differ diff --git a/docs/images/guides/exporting-your-resume/screenshot-1.png b/docs/images/guides/exporting-your-resume/screenshot-1.png new file mode 100644 index 000000000..48afb15ce Binary files /dev/null and b/docs/images/guides/exporting-your-resume/screenshot-1.png differ diff --git a/docs/images/guides/importing-resumes/screenshot-1.png b/docs/images/guides/importing-resumes/screenshot-1.png new file mode 100644 index 000000000..e4a3d6e46 Binary files /dev/null and b/docs/images/guides/importing-resumes/screenshot-1.png differ diff --git a/docs/images/guides/managing-resumes-from-the-dashboard/screenshot-1.png b/docs/images/guides/managing-resumes-from-the-dashboard/screenshot-1.png new file mode 100644 index 000000000..323cab97d Binary files /dev/null and b/docs/images/guides/managing-resumes-from-the-dashboard/screenshot-1.png differ diff --git a/docs/images/guides/managing-resumes-from-the-dashboard/screenshot-2.png b/docs/images/guides/managing-resumes-from-the-dashboard/screenshot-2.png new file mode 100644 index 000000000..d5405fec8 Binary files /dev/null and b/docs/images/guides/managing-resumes-from-the-dashboard/screenshot-2.png differ diff --git a/docs/images/guides/sharing-your-resume-publicly/screenshot-1.png b/docs/images/guides/sharing-your-resume-publicly/screenshot-1.png new file mode 100644 index 000000000..9577fc720 Binary files /dev/null and b/docs/images/guides/sharing-your-resume-publicly/screenshot-1.png differ diff --git a/docs/images/guides/using-ai-in-the-builder/screenshot-1.png b/docs/images/guides/using-ai-in-the-builder/screenshot-1.png new file mode 100644 index 000000000..30de90726 Binary files /dev/null and b/docs/images/guides/using-ai-in-the-builder/screenshot-1.png differ diff --git a/docs/images/guides/using-ai/screenshot-1.png b/docs/images/guides/using-ai/screenshot-1.png new file mode 100644 index 000000000..0bd843de3 Binary files /dev/null and b/docs/images/guides/using-ai/screenshot-1.png differ diff --git a/docs/images/guides/using-the-builder-dock/screenshot-1.png b/docs/images/guides/using-the-builder-dock/screenshot-1.png new file mode 100644 index 000000000..eb6a909f2 Binary files /dev/null and b/docs/images/guides/using-the-builder-dock/screenshot-1.png differ