Highlights
- Format text the way you want. The editor toolbar brings back alignment and underline, plus a More formatting menu with strikethrough, code, highlight, text colour, headings, indent and outdent, horizontal lines and clear formatting. a07989895
- Work on many documents at once. Select documents in the library from a checkbox, the document menu or Select all, then change their tags, make them public or private, lock or unlock them, or move them to Trash with Undo. Public resumes now show a globe badge, a Copy public link action and a Public filter. a07989895
- Exports no longer fail on unusual characters. A character that no loaded font can draw now prints as ”?”, and the preview names it, instead of stopping the preview and the download. Chinese, Japanese and Korean resumes load much faster, both on first open and while you edit. Thanks to @larafabiaaan-svg for reporting #3593. 38fddfd10, a07989895
- Download as OpenDocument. Resumes and cover letters can now be downloaded as
.odtfrom the Share sheet and the API, so you can open and edit them in LibreOffice and other open-source editors. Thanks to @vergiLgood1, and to @Abubakar-Siddiqui for the request in #3502. #3623 - Let an AI agent in your browser edit the open document. Browsers that support WebMCP can now list and open your documents, read and change the resume in the editor as one undoable step, check its score, and update cover letters, all with your existing session. Using WebMCP. d9019ce85
Resume Builder & PDF Export
- Moved hidden sections into a Hidden sections group at the end of the Write outline, so they no longer take up space between the sections on your page. Thanks to @vergiLgood1, and to @GoldenSection0618 for the request. #3614
- Fixed custom page background colours, which stopped appearing on the page. Thanks to @DvP17 for reporting #3610. 0c6e75eec
- Fixed exports failing for resumes with arrows such as → and ⇦. Thanks to @vergiLgood1 and @anirudhqwerty. #3613, #3617
- Fixed previews and exports failing when a paragraph ends in a line break. When the first preview fails, it now shows the reason and a Try again button instead of loading forever. 38fddfd10
- Fonts now download from Google’s China domain when the usual font server fails or is slow, and italic fonts load only when the resume uses italics. Templates no longer use italics, so Smeargle’s section headings are now upright. a07989895
Sign-in & Accounts
- Added optional guest sessions. With
FLAG_ENABLE_GUEST_LOGIN=true, the sign-in page offers Continue as guest, so people can build and download a resume without an account. Guests who later sign up or sign in keep their resumes, cover letters and applications. Thanks to @ambi88dex. #3609 - Made social sign-in faster on installations with many users. 38fddfd10
AI Agents & MCP
- Gave every MCP tool a readable title and clearer descriptions, so AI apps and connector directories show and use them correctly. c9794c864, a03c0e254, 5f841d894, a42e9a6c0
Translations
- Translated the new strings in every language and fixed mistranslations, such as a cover letter translated as an alphabet letter or a paper size, and Clear formatting and Lock editing. a07989895, bdd0a009f
Self-Hosting & Maintenance
- Two database migrations apply on startup. One adds the guest flag to users; the other adds a unique index on
account (provider_id, account_id). On large installations, build the index first without blocking sign-ins:CREATE UNIQUE INDEX CONCURRENTLY IF NOT EXISTS "account_provider_id_account_id_unique" ON "account" ("provider_id","account_id");38fddfd10, #3609 - Added a Hostinger guide with a one-click VPS deploy. 66b638da9
- Docker images now publish to GitHub Container Registry first and mirror to Docker Hub, so Docker Hub outages no longer block releases. 96aad51b0
- Patched security advisories and updated dependencies. 59b5edc61, 5d3bc56d3, 489144381
Highlights
- Bring Reactive Resume into Claude, Codex and ChatGPT. Eight agent skills now cover the whole job search, from resume content, bullets and tailoring to application tracking, interview prep, mock interviews and offer negotiation. Install them as one plugin that also connects the hosted MCP server, or one by one with the skills CLI. Every skill works from conversation alone, asks before changing your documents, and never invents facts or numbers. Agent skills guide. 86fc23237, 1df97dde5, 369c9bcfe
- Write cover letters in your language. Automatic greetings and sign-offs follow the letter’s language instead of always appearing in English. You can now edit the greeting, the sign-off and the full signature, including your name and contact details, or return to the default with one click. Thanks to @EdShedisson for reporting #3601. b69c6fd5e
- Connect AI agents faster. The MCP tool list is about 80% smaller, so agents load Reactive Resume’s tools quicker and leave more of their context for your work. Setting up the MCP server in a coding agent is now one
npx add-mcpcommand. e58934a5d, 74578aef4, 2cd21b25c, 86dd97129
Sign-in & Accounts
- Fixed sign-in on installations opened through
localhostor127.0.0.1, including on custom ports, while production installations keep their cross-site cookie protections. Sign-in now returns you to the exact page you were trying to open, and two-factor verification offers an optional Trust this device for 30 days. Thanks to @iwmywn. #3602 - Improved registration: names are trimmed, one-character names are accepted, and name fields show their length limits. #3602
Resume Builder & PDF Export
- Fixed list items overlapping each other where a list continues onto the next page. 2d44aff10
- Fixed Test connection for OpenAI reasoning models that reject a temperature setting. 75d9d1955
AI Agents & MCP
- Changed how agents handle resume share passwords:
api_resume_set_passwordandapi_resume_verify_passwordno longer accept a password and instead return a link where you set or enter it in the browser, so passwords never pass through an AI conversation. 0d5e7aca0 - Added the data you share with connected AI apps to the privacy policy: what they can read and change, how long it is kept, and how to revoke access. 94567e982
Homepage & Translations
- Added two homepage scenes, Prepare and Remember, showing interview preparation and reusable stories, and smoothed the scroll story on phones and in dark mode. 0c9c1e0dd
- Completed every translation and corrected mistranslations, such as “apply” for a job versus applying a change, and picture Cover and Contain options. 0c9c1e0dd
Self-Hosting & Maintenance
- Stopped authentication email content and raw SMTP errors, which can contain reset links or credentials, from appearing in production logs. Development installations without SMTP still log verification links. Thanks to @iwmywn. #3602
- Added the optional
OPENAI_APPS_CHALLENGE_TOKEN, served at/.well-known/openai-apps-challenge, for publishing your own instance’s MCP server as a ChatGPT or Codex plugin. 40f4595c6 - Changed the project contact address to [email protected] across the website, API reference, legal pages and security policy. #3604
Breaking changes & upgrade actions
- Apply the Career database migration.
20261007205051_career_platformadds user-owned knowledge, stories, workspaces, saved results, schedules, notifications, discovered roles and transcripts, plus conversation scopes, the default AI connection and account timezone. Back up the database and uploads, review the SQL, and apply the normal migration workflow before running the updated application. See Career migrations and data. - Configure a web service for assistant search. Provider-native OpenAI, Anthropic and Gemini search tools are removed. Searching now uses your selected Firecrawl, Tavily or Exa connection; reading a supplied public URL can still use the built-in reader. Set up Web access if you previously relied on native search.
- Configure scheduled work for your deployment. Node.js and Docker start an internal runner; Cloudflare uses the checked-in Cron Trigger. Vercel requires a random
CRON_SECRETof at least 16 characters in production. Its once-per-minute cron requires Pro or Enterprise; Hobby installations must change the cron to a supported daily schedule, which delays due work. See Career scheduling operations. - Review the provider used when a connection becomes unavailable. Conversations and scheduled interview briefings can continue on the default usable AI connection after their original connection is disabled or deleted. Choose the default in Settings → AI & developer and check the connection named beside the next AI action. See Which provider is used.
- Delete accounts from an authenticated browser session. API keys and OAuth tokens can no longer delete an account; integrations and MCP clients direct the owner to account settings. Other authenticated API operations keep their existing authentication methods. #3595
- Choose your account timezone. Settings → Preferences → Timezone controls Career schedules, reminders and interview-time entry, with an option to use the device timezone. Existing accounts default to UTC; check this setting before enabling time-sensitive work.
Career, knowledge & coaching
- Manage your search from Career. A new sidebar area provides Today, Coach, Knowledge and Offers, alongside the existing Documents and Applications areas. Today brings together notifications, discovered roles, upcoming interviews and schedules, with unread indicators in navigation. Your career, in one place.
- Keep reusable facts with their sources. Knowledge stores accomplishments, experience, skills and preferences. Search facts, inspect their source and use, correct them with revision history, exclude them from coaching, or forget them. Facts private to one application stay scoped there until you choose to share them across applications.
- Tell a story once and reuse it. Stories organize Situation, Task, Action, Result and Reflection, tags and supporting facts. Corrections to linked facts flag stories for review; unsupported results can stay blank. Reuse the same experience in answers, preparation and practice. Tell your story once.
- Control what the coach remembers. Ask first is the default and presents facts for approval; Automatically saves user-stated facts with a notice and Undo; Never disables saving facts from coach messages. Practice answers are not remembered as career facts.
- Keep job-search preferences in one place. Save target roles, locations, compensation and work preferences for discovery, fit checks and offer comparisons. Preference checks distinguish missing information from a confirmed mismatch.
- Choose the context for each conversation. Career coaching supports conversations across the search and conversations about one application, with history, renaming and deletion with Undo. Context controls cover Applications, Knowledge and opt-in Web research; application coaching also receives the selected workspace tab. Privacy lines identify the inputs and AI connection for each action.
- Use coaching results where they belong. Coach actions can track a discovered role in Applications or save an answer for the current job, with Undo. Multiple application conversations remain accessible without losing the workspace tab.
- Compare saved offer versions. Career → Offers places salary, bonus, equity, office arrangements, leave, benefits and deadlines side by side, alongside your preferences and unanswered questions. Currency and pay-period differences stay visible; unknown or conditional terms are not treated as zero or added into a fabricated total. The comparison itself makes no AI request. Choose between two offers.
Application workspaces
- Open a workspace dedicated to one job. Application details now offer Open workspace, with Fit, Apply, Prepare, Practise, Debrief, Messages and Saved tabs. The initial tab follows the application’s stage and interview timing. A context column keeps the next step, people, documents and notes nearby, while Ask the coach opens a conversation beside your work. Prepare your first application.
- Check fit against evidence. Fit shows explicit and inferred requirements, supporting facts and stories, missing evidence and preference checks. Save questions for preparation instead of treating a missing fact as proof that you cannot do the job. Check a role when your experience is different.
- Draft application answers you can review. Apply stores employer questions and editable answers, with word or character counts, backing facts, and Draft and Tighten proposals that need Accept or Skip. Copy answers or download Markdown or plain text, then use the submission checklist. Mark as applied records answers and linked document snapshots without submitting anything to an employer. Answer another application form.
- Prepare from the experience and documents you actually supplied. Prepare builds a timed plan, relevant stories, questions to ask and a short briefing. It uses recorded sent document versions when available, otherwise linked current documents, and works without a linked resume. Completed plan steps persist; near the interview, the view becomes a short checklist. Get ready for interview day.
- Practise one answer and improve it. Choose a question, type or speak an answer, and request feedback on what works, what to strengthen and an opening to try. Earlier attempts remain available for comparison. Practice stays separate from records of a real interview.
- Learn from a real interview. Debrief accepts a recalled answer, reviews it against supporting experience and records observations and practice priorities. Follow-up work can be carried into preparation and calendar exports.
- Read employer messages before acting. Messages interprets pasted recruiter or offer text, proposes a reply and suggests application changes. Review and apply selected changes explicitly; drafts are not sent to an employer, and saving offer terms does not accept the offer. Reply to a recruiter.
- Return to earlier work without overwriting it. Generated fit checks, briefings, practice feedback, debriefs and message reviews appear in Saved, with type filters and read-only Open in… views. Submitted answers keep their own snapshot; Back to current returns to editable work. Old results can be marked out of date after knowledge, posting or document changes. Deleting saved items offers Undo.
Interviews, discovery & schedules
- Record who you will meet and when. Interview forms add participants, roles, public HTTPS profile links, audience and timezone alongside interview type, duration, location and notes. Editing an interview’s time moves its preparation schedules; removing it pauses those schedules and adds a notice. Calendar exports support multiple events as well as individual interviews.
- Keep application actions visible. The detail sheet keeps its footer fixed while the body scrolls, wrapping actions on phones and offering a compact posting link plus Open workspace. Closing an application can now record Accepted as its reason.
- Find roles while the browser is closed. Opt-in discovery runs daily, every three days or weekly. New results are checked as individual open postings, common tracking parameters are removed and repeated URLs stay quiet. Job-board lists, careers pages and articles are excluded; dismissed roles stay hidden. Track in Applications saves the posting, company and location only when you choose it. Find roles while you are busy.
- Parse postings more faithfully. JobPosting extraction recognizes remote work and closing dates, omits placeholder locations, and decodes escaped description markup. JSON-LD scanning bounds script attributes and avoids repeated full-page scans on malformed or hostile input.
- Schedule briefings and reminders explicitly. Choose 24 hours before, two hours before, or Morning of for an interview briefing. Morning of means 08:00 in the account timezone, moving to two hours before interviews starting before 10:00; a run time already passed becomes due now. One-time application reminders appear in Today. Schedules preserve their language and can be paused or deleted.
- Keep scheduled work durable across restarts. PostgreSQL stores due jobs, leases, attempts and result deduplication, coordinating multiple runners and serializing active work per user. Recurring discovery keeps local time across daylight-saving changes and coalesces missed runs. Each tick processes at most two jobs; failures wait five minutes between attempts, with at most three attempts and an actionable failure notice.
- Receive optional email copies. Schedule email delivery requires explicit opt-in, a verified account address and configured SMTP. In-app results remain the durable record. Email delivery has one application-level attempt; uncertain delivery is not automatically resent.
AI connections & voice
- Choose a default AI connection. A tested, enabled connection can be marked Default. AI features without an explicit selection use it, falling back to the most recently used usable connection, then the oldest, when no usable default exists. Connection lists follow the same order and the settings UI shows the default.
- Continue conversations after provider removal. The assistant reconnects conversations whose provider was switched off or deleted to the currently selected fallback, keeping the privacy line aligned with the connection used. Direct OpenAI assistant requests use Responses for reasoning with function tools, independently of native web-search support.
- Choose speech and transcription separately. Voice settings select supported models for reading questions and transcribing answers, independently of the text-feedback connection. OpenAI, Gemini, Mistral, xAI and Vercel AI Gateway support configured speech tasks; Groq is available for transcription. The default speech-capable connection is preferred, then another usable connection, then supported browser speech.
- Review your transcript before requesting feedback. Record for up to two minutes or upload a nonempty WebM, MP4/M4A, MP3, WAV or Ogg file up to 2 MiB. Original and edited provider transcripts remain distinguishable and deletable. Raw recordings are not stored by the Reactive Resume server; successful transcription clears local audio unless you keep it for download, while failures allow retry. Browser dictation and typing provide alternatives where supported. Voice controls.
Resume editing & PDF export
- Open resumes on HTTP installations without crashing. Builder session IDs no longer depend on
crypto.randomUUID()being available in a secure browser context. #3573 - Keep numeric drafts finite and within bounds. The shared number input keeps partial text local, supports multi-digit typing and persists only finite bounded values. It preserves sibling autosaves and accessible input-group focus styling instead of saving
NaNor repeatedly clamping a half-entered value. #3594 - Render text symbols instead of rejecting the whole PDF. Characters such as ★ now resolve through Noto Sans Symbols 2 rather than becoming question marks and failing the text-loss check. Preview and download errors retain the text-loss cause and show an actionable explanation. #3583
- Size Free-form pages to their content. Each page keeps A4 width and grows to the measured content height, with an A4 minimum, instead of spilling onto extra pages. Free-form is directly available in the Paper selector; the old fixed length control is removed. #3597
- Keep item headers from wrapping mid-word. Forme is updated to 0.28.0 to correct wrapping in item headers, with regression coverage for location text. #3588
- Keep resume-copy selection overlays positioned correctly. Source-resume cards now provide the positioning context for their overlays. 8aee5b7a9
Authentication, data & integrations
- Keep sessions through temporary failures. Rate limits and network errors no longer masquerade as a logged-out session, preventing transient logout during session refresh and route loading. #3575
- Prevent duplicate authentication submissions. Auth forms disable pending submissions, username sign-in is rate-limited, and password changes can revoke other sessions. Existing short passwords remain usable while password inputs apply native length constraints. #3589
- Export your Career data with account backups.
career.jsonincludes preferences, facts and revisions, stories, saved results, workspace state, schedules, notifications, opportunities, jobs, transcripts and coaching conversations with attachment metadata. Credentials are excluded; attachment references are not copies of the attachment files. Account deletion removes dependent Career records and private uploads, and application deletion cleans up its coaching data. Exporting your data. - Use Career through authenticated APIs and MCP. New
/careerprocedures expose knowledge, workspaces, saved results, generation, schedules, discovery, notifications and voice. MCP gains the corresponding knowledge, workspace, saved-result, scheduling, opportunity and notification operations, plus default-provider selection, with clearer descriptions and destructive/open-world annotations. - Start conversations beyond documents.
POST /agent/threadsaddsscope: "application"withapplicationId, orscope: "career"without a document. Existing document conversations retain the defaultdocumentscope. Thread updates can rename a conversation, and messages carry per-send Career context controls. - Discover MCP tools consistently and with less work. The live tool list and server card share precomputed input/output schemas and annotations, avoiding schema conversion on every discovery request while retaining normal tool-call validation. 70399d779
- Copy working API examples. The API reference now publishes portable cURL samples for documented operations. #3580
Interface, documentation & maintenance
- Use consistent SVG icons throughout the app. Phosphor icons replace the Material Symbols font and generated icon-name assets across the editor, documents, applications, assistant, settings and shared controls. The obsolete icon build script and font-specific styles are removed.
- See varied loading feedback. Shared spinners select from nine loaders per mount while retaining their sizing and accessibility semantics. Spinner animation remains visible under the global reduced-motion styling.
- See a quieter donation card after the launch. The donation prompt becomes a theme-matched Open Collective card with Donate and Maybe later, appearing after five minutes and dismissing for a week. It clears the mobile dashboard navigation. The Product Hunt launch date was corrected to October 5; the finished launch banner and its suppression code are now removed. 8aee5b7a9
- Load the homepage and dialogs with fewer initial requests. Dialog forms and importers load on first open, initial vendor code is grouped, and prerendered homepage scripts receive lower fetch priority than visual content. IBM Plex Mono uses WOFF2 assets, and fingerprinted
/assets/files receive immutable caching. 70399d779 - Follow task-based Career guides. New guides cover overview, first application, knowledge, fit, answers, interview day, discovery, recruiter replies, offers and workspace controls, with fictional screenshots and links from related application, AI, account and hosting guides. The contributor guide maps features to their guides and documents scheduler operation, voice, data handling and rollout checks.
- Find hosting instructions by task. Documentation separates deployment guides, Server Configuration and Upgrade Guides, renames the v5 upgrade guide to Migrating from v5 without changing its URL, and adds community Synology and UGREEN NAS guides to self-hosting and Community Spotlight. #3598
- Wait for Docker Compose readiness. The Docker guide explains health-aware startup, the application URL, service status and recent logs for troubleshooting. #3591
- Build Docker images once and promote them by commit. Release workflows reuse existing commit-SHA images for version and latest aliases instead of rebuilding. Manual promotion and maintainer guidance cover selecting the already-built commit. 8c91421a5
- Reject incomplete Redis authentication early. A
REDIS_URLcontaining a username without a password now fails environment validation with a configuration error. #3571 - Align regression coverage with the new behavior. Career unit, database, scheduler, Worker and browser fixtures cover the new workspace and data flows. PDF tests exercise cover-letter sender headers end to end and normalize font paths on Windows; server cold-import and donation-close timing checks are made less fragile, and the wall-clock MCP benchmark is removed. #3572, #3587, 660603c3c, e8b6eeccd
- Refresh tooling and translation catalogs. The workspace moves to pnpm 12.10.1 and updates AI SDK, Wrangler and development tools, adds speech/loading dependencies, refreshes package exports and generated API documentation, extracts new interface strings into locale catalogs, and removes obsolete native-search tests and smoke tooling.
Known issues
- Known issues — notification language and delivery. Career notifications are currently written in English. Schedule timing depends on runner availability and provider connections; retries can repeat paid provider calls, and SMTP acceptance does not guarantee inbox delivery. See delivery and retry limits.
- Known issues — browser voice support. Browser dictation depends on platform support and microphone permission and is unavailable in Firefox. Provider-backed transcription or typing remain available alternatives.
Breaking changes & upgrade actions
-
Configure trusted reverse proxies. Self-hosted instances behind nginx, Caddy or Traefik must set
TRUSTED_PROXIESto the immediate proxy and trusted intermediate proxy IPs or CIDRs so authentication limits distinguish visitors. Direct connections need no setting; never include public client networks. See Environment variables. bc92b8cf7 -
Stop v5 before upgrading the database. One consolidated v6 migration introduces document Trash, richer version history, application outcomes, structured letters, document-bound conversations and web-access credentials, then removes
application.archived,resume_version.labeland superseded development tables. The release migration replaces the intermediate v6 migrations; installations running an earlier v6 development build need separate migration review. Back up the database and uploads, stop every v5 instance, and deploy v6 together. A mixed v5/v6 rolling upgrade is unsupported. Follow Migrating from v5, including its rollback procedure. bc92b8cf7 - Cover letters become independent documents. The migration saves every embedded letter, including hidden letters, as a separate letter linked to its resume’s sender details and design, then removes the letter sections from the resume. Open migrated letters in Documents. Older imports, stale tabs, API writes and restored versions also move embedded letters into documents without creating duplicates for unchanged content. 250650953
-
Convert old visual style rules manually. PDFs now use Semantic CSS exclusively. Stored rules from the old visual style editor need the bundled
apps/server/dist/migrate-legacy-styles.mjsscript; startup does not convert them. Run its dry run first, then--apply --backup <file>on persistent storage. Unconverted documents use their template defaults. See the conversion steps. Old JSON files imported through the browser are converted during import. a325232a0, 92459122c -
Write structured dates in API clients. Dated entries use
dates, withstart,end,presentand preservedrawtext. Saves regenerateperiodordatefrom that structure, so editing the display text alone is overwritten. Update clients to writedatesand setmetadata.page.dateFormatwhere needed. Inputs without structured dates still derive them from their text. bda01febd, cbc76b03b -
Close applications with a reason. Replace
rejectedandarchivedwithstatus: "closed"andclosedReason:not-selected,withdrew,accepted-otherorno-response. Application lists include closed records; replaceincludeArchivedwith client-side status filtering. Older CSV exports still import rejected and archived records as closed. ce0b4c606, cbc76b03b -
Update deletion, history and letter integrations. Resume and letter deletion now moves records to Trash; permanent deletion uses the documents purge operation. Version clients use
kindandnameinstead oflabel. Resume PDF downloads no longer accept acover-lettertarget, old signed letter targets return404, andPOST /cover-letters/from-resume/copy_embedded_cover_letterare removed. Download letters through the cover-letter API. See API changes and MCP changes. a568f64b4, 060750a86, 250650953 -
Start assistant conversations for a document. Replace
/agent/threads/for-resumewithPOST /agent/threads, passingresumeIdorcoverLetterId. Conversation archiving and/agent/actions/{id}/revertare removed. The web assistant now proposes edits for review. 6463a9e9c -
Switch Vercel projects to Services. Set the project’s Framework Preset to Services before deploying v6. Static assets use the frontend service; application shells, APIs, authentication, uploads and MCP use the backend service. Include
apps/web/dist-prerenderbesidedistin custom server deployments to serve the localized marketing HTML. 725be158c, b399e289d
v5.3.2, audited through
59167aae5
on 2026-10-02. For a shorter orientation, read
What’s new in v6.Documents, imports & recovery
- Start a resume with your own name. Blank and sample resumes now print the account holder’s name in Basics instead of the document title. The library name remains independent. 419c7309a
- Retry document-library failures without mistaking them for an empty account. Documents and Trash now show a connection error with Try again when loading fails. Type filters participate in the filtered empty state, long names and company labels stay within list columns, and search and first-run actions gain clearer focus and touch targets. da65fbef1
- Keep linked letter details in account backups. Account exports now resolve each letter’s linked sender and design values, preserving what the letter currently uses instead of stale stored copies. bc92b8cf7
- Recover from an empty resume-copy dialog. Opening Copy a resume for a job without an existing resume previously showed an empty source list and a disabled Create and open button. The dialog now explains the prerequisite and offers Import or create a resume, including when opened directly from an application. Returning to the copy flow keeps that application selected. Importing or creating a blank resume during preparation links it to the saved job. bec152b7e, 3e7849e51

Resumes and letters share one Documents library
- Manage resumes and letters together. Documents replaces the separate dashboards with All, Resumes and Letters tabs, grid and list views, search, tags, sorting and application links. Old dashboard links redirect to the matching document type. a568f64b4, daa7d331f
- Start every document from one dialog. New offers import, a resume copied for a job, a blank resume, a sample resume or a cover letter. Drop files directly onto Documents to import them. Blank resumes can name themselves from the headline until you rename them; imports use the person’s name or headline. daa7d331f, d4406c729
- Recover deleted documents from Trash. Moving a document to Trash offers Undo and disables public access. Restore it or delete it permanently before its 30-day retention ends. Expired documents and their files are purged when their owner next opens the library. Trashed resumes keep their addresses reserved; locked documents must be unlocked before trashing or changing their details. a568f64b4, d4406c729
- Import LinkedIn’s data export without AI. Import a LinkedIn ZIP to bring in profile details, experience, education, skills, languages and certifications entirely in the browser. The parser reads only the six relevant CSV files, caps each at 5 MB, escapes text and preserves unfamiliar end dates instead of calling them Present. Thanks to @Syed-Ali-Abbas-Zaidi. #3538
- See what an import brought in. An import note in the editor reports sections, entries and dates needing review. Dismiss it when finished. 11fe2b7a2
- Keep consecutive imports independent. JSON Resume and LinkedIn imports previously shared nested defaults, allowing one import’s sections to leak into the next. Each now starts from a deep copy. JSON Resume plain-text fields are escaped before entering rich text. fb756026f, acdb9d88d
- Reimport individual documents from account backups. Account-export JSON wrappers are recognized, and letter files include their format marker. Dropping a complete account ZIP explains how to extract and import individual resume or letter files. Legacy
.docfiles now receive an explicit instruction to save as.docx. 9a803305c - Export every document without filename collisions. Documents with the same name previously overwrote each other inside the account ZIP. Export filenames now include their IDs, and the archive also includes application records. a9c4b84d3, 55db11aea
Resume editor & dates
- Use Escape in both the editor and command palette. Competing shortcut registrations previously prevented one handler from running. Escape now closes an open palette and clears the editor selection; a closed palette no longer intercepts the key. b63170c5f
- Keep parser results tied to the open resume. Switching documents could display another resume’s cached extracted text. Parser results now include the resume ID and reset with the rendered page. bc92b8cf7

Write, Design and Check replace the builder's sidebars and dock
- Work in three focused modes. Write edits content, Design controls its appearance, and Check reviews it. The page remains visible beside the panel, with mode shortcuts
1,2and3, save status and a zoom bar. Selecting a rendered block opens the corresponding section or entry. f2a76b2f6, a82741f42 - Edit entries in place. Basics, contact fields, summary, sections, entries and experience roles live in the Write panel. Sections follow print order; their menus handle hiding, duplication, headings, columns and movement between pages or columns. New entries start as editable drafts. Field stacks now use one column, with dates sharing a full row. a82741f42, 0a5323520, 16008a95d
- Keep unsaved resume changes on the device. Failed saves and interrupted sessions retain a local draft for recovery on the next visit. Save status distinguishes saved, saving, offline and failed states. Undo grows from 50 to 200 steps and groups rapid typing in one field. Recovery also checks that the draft belongs to the current account. 639abf12b, 9a803305c
- Reconnect live edits after a stream failure. A missing retry dependency left the editor disconnected from other-tab, AI and MCP changes until reload. The subscription now reconnects. 18597a6de
- Enter dates consistently. Use year-only or month-and-year dates and an explicit Present state. Existing date text upgrades when read; ambiguous phrases such as “Summer 2016” keep printing unchanged until edited. Choose short, long, numeric or ISO formatting in Design, and use structured values for sorting and checks. bda01febd
- Keep Present labels consistent within a language. The label’s casing previously depended on surrounding date text. It now follows the language alone. 03c3a8884
- Find document actions in the name menu. Rename, Duplicate, Lock editing, Notes, Details, Print and Move to Trash share the document menu. Details shows creation and edit dates, template, language, page count and sharing state; private notes use the standard rich-text editor. A donation link appears after a successful download. 22dbbdc54, 01e87a6f1
- Download from the editor bar with fewer controls. The trimmed bar keeps the main modes, assistant, history, sharing and PDF download. Share marks a publicly shared resume, and
⌘/Ctrl Pdownloads its PDF; printing moves to the document menu. 5b84bf800, f2a76b2f6 - Keep editing state stable. Returning to Design preserves its scroll position; the custom-section menu lists available types directly when all built-in sections are in use. Phone page marks hide the small Editing label, and photo controls explain the engine’s rotation limit. a6676b326, 3c71b4e7c, 9a803305c
Design, templates & custom styles
- Choose two new templates: Porygon and Smeargle. Porygon uses a Japanese résumé-inspired form with bordered header fields, a dedicated photo cell and ruled entries beneath solid section bars. Smeargle uses a magazine-style layout with an uppercase headline, large name, italic introduction and italic section headings. Both are one-column and ATS-safe, bringing the gallery to 17 templates, with PDF and documentation previews and Semantic CSS support. Choosing a template. 99ff19e4e
- Preview templates with your own content. The redesigned gallery renders all 17 templates using your resume, with one-column, two-column and ATS-safe filters. Hover, focus or hold a card to preview its appearance; selecting applies it with Undo. 1ef7c9fa1, 85352ee11
- Choose familiar resume typography. Five presets use EB Garamond, Tinos, Source Serif 4 with Source Sans 3, Carlito and Lato. Body presets use available Regular/Bold weights. Custom opens the exact font controls and shows an existing custom pairing; unavailable weights are replaced with supported ones. d3ed651d6, 9a803305c
- Adjust design through grouped controls. Template, Type, Color, Page and Advanced collect font size, density, accents, margins, paper, language, icons, link underlines and exact values. Accent choices show contrast on white and offer a darker shade when contrast is low. Reset restores template defaults. 1ef7c9fa1
- Fit overflow without deleting content. Page warnings report how many lines spill beyond the planned pages and offer Fit. Fit tightens density, then margins, then text size, rerendering after each step and stopping at 9 pt. The complete adjustment is one undo step; content that still cannot fit needs editing. 1ef7c9fa1
- Choose the sidebar’s side. Two-column templates support a left or right sidebar, alongside width controls; PDF and Word exports follow the choice, including mirrored right-to-left layouts. 098df6023
-
Style a selected element directly from the page. Pick a section, entry or field to insert or open its Semantic CSS rule, with the matching element outlined. Custom Styles uses ordinary CSS text without requiring a visible
@versionline, readable dark-mode syntax colors and functioning toolbar icons. cfb272229, 31fb57609, 5dc67c3bd, b775cbc15 - Undo stylesheet typing within the code editor. The editor previously routed typing undo to resume-wide history. It now keeps its own typing history, reports fatal stylesheet limits and explains unsupported PDF styles. Unsupported declarations or selectors may still be skipped. 9a803305c
- Apply heading text styles even when an icon is present. Icon-bearing headings previously passed only color into their text. Font size, weight, style, spacing, line height, alignment, decoration and text transform now reach the title as well. 677ff17c1

Pick an entry on the rendered page to edit its custom CSS
Check mode & the public ATS checker

Check connects findings to the lines they affect
- Review issues where they appear. Check replaces the builder’s ATS panel with a live score, verdict, category groups and numbered issue cards pinned to the page. Fixes either apply with Undo or open the relevant field; ignore decisions persist with the resume. Two-column layouts receive a reading-order explanation and a Keep option. e26ce08fc, 565424631
- Compare the resume against its job posting. Job match uses a linked application or pasted posting, highlights covered terms on the page and lets you add missing terms to Skills or dismiss them. A pasted posting can become an application. 565424631, 1608d5690
- Review writing changes before applying them. Opt-in AI writing reviews return passage-level rewrites with old and new text, reasons, Accept, Reject and Accept all. Changed passages invalidate stale proposals; accepting resume proposals supports Undo. 1608d5690, 565424631
- Inspect what a parser reads. Switch between the rendered page and text extracted from its PDF in reading order. Deep checks of the exported PDF pin findings to their source lines while the resume remains unchanged, and a pin opens the full report. 565424631, 6c2bc74f9
- Continue from a public check into editing. The rebuilt public ATS checker accepts a resume and optional posting, groups readability and layout findings, and offers Fix these in the editor. The file waits in the browser through sign-up and imports after sign-in. The score describes text extraction reliability; it does not predict hiring outcomes. Resume drop targets now distinguish checker files from document imports. d9ed63f72, 9a803305c

The public checker offers a direct path from findings to an editable resume
Assistant & AI providers
- Choose models from provider-specific suggestions. AI setup and settings load an optional public models.dev catalog, filter out deprecated or non-text models, and preserve exact gateway model IDs. You can still enter a model manually when suggestions are unavailable. Provider and web-access rows expose connection status and separate test actions. 5d540f75d, 8105889b0
- Search and read public pages from the assistant. One optional Firecrawl, Tavily or Exa connection serves both Applications and assistant tools. Without an external connection, supported direct AI providers can use native assistant search; the built-in posting reader remains available without credentials. Connection tests check search and reading separately. 3e7849e51
- Respect context opt-outs throughout a conversation. Disabling document or posting context now starts fresh provider context for the next message, excluding earlier document-derived prose and tool results. Old tool approvals cannot continue after that change. bc92b8cf7
- Target role descriptions and repeated passages safely. Proposals can address individual roles within an experience entry. A rewrite applies only when its original passage appears exactly once; suggestions for empty fields cannot overwrite newly entered content. bc92b8cf7
-
Enable shared AI and web access for all users. Self-hosters can set
AI_PROVIDER,AI_MODEL,AI_API_KEYand an optionalAI_BASE_URL, plusWEB_ACCESS_PROVIDER,WEB_ACCESS_API_KEYand an optional FirecrawlWEB_ACCESS_API_URL. Each globally configured integration takes precedence over personal credentials and hides their settings controls; saved personal keys remain available after shared configuration is removed. Shared credentials stay on the server and need noENCRYPTION_SECRET; encrypted personal AI and web-access keys remain supported when it is set. See Job search and AI. bec152b7e, bc92b8cf7

The assistant works beside the document it is helping with
- Ask for help inside a resume or letter. A document-bound Assistant replaces the Agents workspace, builder AI sheet and application copilot panel. Open it with the sparkle button or
⌘/Ctrl J; past conversations and old Agents links lead back to the document. Context controls decide whether to share the document and job posting. 6463a9e9c, e1d5b9ba9 - Accept or reject each proposed edit. The assistant shows changed passages on the page with a reason and can ask a clarifying question. It does not apply edits automatically. Stale proposals cannot overwrite text changed since the suggestion; accepted resume edits enter undo history, and accepted letter edits offer an Undo toast. 6463a9e9c, e1d5b9ba9
- Improve a line without leaving its field. Rich-text toolbars offer stronger verbs, a result, shorter wording or a custom request for selected text. The proposal stays beside the passage for review. e1d5b9ba9
- Prepare for the application’s next step. Application actions open the relevant document and assistant with the selected job as context. Choosing a different application now carries its ID through to the owner-checked posting lookup instead of silently using another linked job. e1d5b9ba9, 9a803305c
- Attach files to the first message reliably. Starting a conversation now retains attachment uploads and context choices, prevents sending during upload and carries attachments into the first message. The per-message limit counts only unsent attachments; older sent files no longer block a new message. Superseded letter-read snapshots are pruned. 9a803305c, 2622eeff1, bc1aaedf1
- Use the assistant on a single server without Redis. Conversations and providers persist in PostgreSQL, and responses stream directly when Redis is absent. Redis still enables stream resumption and shared cancellation between instances; Vercel still requires it. Personal saved providers require
ENCRYPTION_SECRET; a server-configured shared provider can run the assistant without credential encryption. 6463a9e9c - Use the intended AI provider. Provider selection favors the most recently used enabled provider. Ollama can be saved without an API key; other providers still require one. The new-conversation composer keeps provider changes made while attachments create its draft conversation. 9a803305c
Cover letters
- Protect pending letter edits when changing documents. Late save responses no longer replace the newly opened letter. Downloads, history and other document changes wait for pending saves and stop with a retryable error when saving fails. bc92b8cf7

A letter has its own editor, recipient fields and live resume links
- Write letters on the shared editor shell. Letters open at
/builder/letter/<id>with Write and Design, autosave, document actions, an assistant, downloads and history. Recipient name, company and date are structured; existing free-form letters retain their layout. fdad39c63, 82fa32790 - Keep sender details linked, or use your own. A linked letter follows its resume’s contact details and can match its design. Switch those links off to edit independent values; when the resume is permanently deleted, the letter retains its copied values. Linked sender changes produce a device-local notice. fdad39c63, 82fa32790
- Give a letter its own typography, colors and page settings. Independent letter design expands beyond choosing a template to include Type, Color and Page controls. Sender headers render in all 17 templates, including Azurill’s full-width letter page and the new Porygon and Smeargle layouts. 49422e98f, aa9a5113c, 17d25c5ff, 99ff19e4e
- Draft from a resume and posting. An empty letter offers a streaming AI draft based on its linked resume and application, with a Stop action and length controls. Existing letter content is preserved until you choose to change it. fdad39c63, 82fa32790
- Download matching application documents. Download a letter as PDF, Word, Markdown or JSON, or download the resume and letter as two matching PDFs. A resume’s download panel can include its application’s linked letter in the same selected format. Letters also gain named versions and safe restore history. 82fa32790, fdad39c63
Applications & interviews
- Keep application notes when closing the sheet. Notes autosave after typing and flush when the detail sheet closes. Failed saves retain the draft within the session and offer Retry save. bc92b8cf7
- Prepare resumes without setting up AI. Choose an existing resume, make a copy, or import or create one for the saved job. Manual preparation opens the editor directly; the assistant opens only when a usable AI connection exists. 3e7849e51
- Find jobs with one optional web connection. Applications supports keyword search through Firecrawl, Tavily or Exa. Review results, choose a posting and check its imported details before saving. Shared services or one encrypted personal connection supply search and enhanced reading; self-hosted Firecrawl is supported. The built-in public-URL reader remains available without credentials. bec152b7e, 3e7849e51

The board shows each application's next step
- Track interviews on a calendar. Add and update interviews with type, date, time, duration, location, notes and status, then view them in the Calendar and upcoming-interview list. Export an interview as an
.icsfile for a calendar app. API and MCP clients gain interview operations. Thanks to @devzspy. #3539 - Browse applications in a grouped list. List becomes the default, grouped by stage with collapsible groups, filters, search, bulk actions and closed-record visibility. Board, Insights and Calendar remain available on larger screens; phones use List in place of Board and Calendar. 462db6011
- Save a job before preparing an application. Save job defaults to Saved and accepts a link, pasted posting or manually entered role and company without AI. Read posting runs only when requested; review the saved description and optional AI-extracted fields, or replace incomplete text with a pasted description while retaining the original link. Reading failures preserve the draft. Save and prepare resume opens resume preparation without marking the job applied. 3e7849e51
- Use one detail sheet for the job and next step. The sheet brings together stage progression, time in stage, interview and follow-up actions, posting requirements, linked documents, attachments, contacts, tags, salary, source, notes and activity. It becomes full-screen on phones. 462db6011, ce0b4c606
- Confirm what you actually submitted. Preparing documents or opening the original job link leaves the job Saved. Mark as applied, Already applied and Already interviewing ask for the submission date and the resume, letter or attached files actually sent. The selected document versions and check score become the submission record; later letter relinking cannot replace a recorded sent version. History labels the resume version Sent to the company. 3e7849e51, bc92b8cf7
- Record how an application ends. Close with a reason and reopen when needed. Board drops into Closed also ask for a reason; drop animations settle cards in their destination. Follow-up editing now reloads the saved date and note every time it opens. ce0b4c606, 30819e2fc, 9a803305c
- Read outcomes from actual stage history. Insights adds progression, response rate, median time to first reply and tailored-versus-base resume comparisons. Active totals exclude closed applications, and weekly submissions use the sent date and exclude jobs only saved for later. 462db6011, 9a803305c
- Review CSV column matching before import. See and adjust recognized columns, inspect the import summary and download skipped rows. Exports include closed reasons, and legacy rejected/archived values remain readable. 462db6011, cbc76b03b

Schedule interviews and take them into your own calendar
Sharing, downloads & version history

Sharing and all four export formats live in one panel
- Share and export from one panel. Link, Download and History replace the separate sharing, statistics, export and version-history surfaces. On phones the panel becomes a full-height bottom sheet. Download explains each format, accepts a custom filename, shows progress and retry states, and reports open Check issues without blocking export. c8df74925
- Change a public address safely. Slugs are generated at creation and edited in Link, with availability checks, validation and suggestions. The typed value remains visible while saving, Copy waits for a successful save, and old public addresses redirect for 30 days after a rename. Password protection, visitor download controls, QR codes, native sharing and a 30-day activity chart share the same tab. 060750a86, c8df74925, 39f30ac9a, 9a803305c
- Read shared resumes comfortably on phones. Public resumes gain a reflowed reading view with readable sections, while larger screens keep the PDF presentation. Shared experience no longer repeats a parent position already listed as a role. cc28f7853, 9a803305c
- Preview and name saved versions. History shows Now, editing sessions, named versions, imports, AI/API edits, sent versions and restores. Preview a version read-only on the page, then restore it or return to Now. Named versions can be renamed and deleted. 060750a86, c8df74925
- Recover the state before a restore. Restoring saves pending edits and preserves Before restore before replacing the document. Resume undo history resets; restore Before restore to go back. Session autosaves and transient kinds retain 90 days of history, while named and protected milestones remain until their document is deleted. The timeline includes all permanent checkpoints alongside the 100 most recent expiring versions. Named-version creation and restore stop if pending edits cannot be saved. bc92b8cf7, 060750a86, 6e412c2f6
- Open your own password-protected resume without its visitor password. Owner access now bypasses the public password gate for viewing and statistics while visitors still need access. Download statistics explicitly explain that repeat successful clicks can count more than once. 9a803305c

Name a milestone or preview an editing session before restoring it
PDF, Word & Markdown rendering
- Keep heading bars, rules and contact boxes when icons are hidden. Block text previously lost its background, border and padding because the engine’s text primitive did not paint them. The adapter now wraps styled block text in a box, preserving template heading decorations and text-only contact styles, including the gap between section icons and titles. 581dafdfd
- Wrap Glalie contact details and align section icons with their titles. Long email addresses and links previously overflowed Glalie’s contact border, while heading icons sat above the text. Contact text now keeps its box styles and wraps within the available row width; heading icons stay centered within the title’s line height. 87b5d695a
- Restore PDF exports on the development server. The TypeScript loader could resolve the server image reader as a native addon, and shared PDF components could fall back to an incompatible JSX runtime. An explicit import extension and the workspace’s automatic JSX configuration restore server PDF rendering during development. 48d024cf3
- Preserve Unicode text and native ligatures in PDFs. The patched Forme 0.26 engine preserves Arabic and Hindi text, vocalized Hebrew, Japanese, Latin ligatures and emoji across fallback fonts. Native ligatures remain enabled, and right-to-left list markers no longer need reversed punctuation. Browser and server rendering use the same patched engine; unsupported glyphs still require a suitable font. bc92b8cf7
- Stop exports that would lose text. Missing fonts or engine warnings about substituted or unrendered characters now fail PDF downloads and server exports with a retryable error instead of producing a silently incomplete file. bc92b8cf7
- Render every PDF through Forme. Editor previews, browser downloads, thumbnails, template previews, public PDFs, server exports and deep checks share the new engine. The browser uses a PDF worker with a main-thread fallback, keeping rendering off the typing path when workers are available. Downloads use the same rendering path as previews. bc28441b6, c0bf1aeba, ce2f1857f
- Map rendered content back to the editor. Header, section, entry and field locations travel from the renderer to the preview, enabling click selection, issue pins and custom-style selection across page breaks. def4f7216, f73238ba3, 722f5fa14
- Keep authored content through pagination. Forme could misplace splitting rows or lose entire sections when a column overflowed. Rendering retries problematic layouts and explicitly starts missing sections on a new page, preserving manually authored continuation pages. Free-form pages measure their content before choosing their final height. 722f5fa14, 9a803305c
- Keep list markers with their first line. A list item could begin on the next page while leaving its bullet or number behind. The renderer detects orphaned markers and rerenders with a break before the affected item. 3405200cf
- Restore Azurill’s timeline across page breaks. Forme did not stretch the absolutely positioned line as the old renderer did, and a splitting column stretched the dot into a pill. A border-backed timeline and a wrapper around the dot preserve the line and circular marker. ab2e263a2, 1e8b638a6
- Preserve template details under the new engine. Adapter fixes handle reversed rows, row width constraints, column gaps, transparent colors, absolute elements, image fit and shadows, borders, corner radii, imported tables and empty text. Glalie’s sidebar uses one combined tint, and award titles and dates mirror on right-to-left pages. bc28441b6, 722f5fa14, 29ab0326b
- Hyphenate according to the page language. Forme’s language patterns replace the old hyphenation dependency. Soft-hyphen decoding now applies to every supported hyphenated language, removing the former German-only gate. The current patched engine preserves extracted words with native ligatures enabled. c0bf1aeba, 6d4ceefbd, bc28441b6
- Match authored Word page layouts more closely. Single-column templates and explicitly full-width pages now follow the PDF’s page arrangement, and sidebar placement follows the new left/right setting. Word remains a simplified layout and does not apply Custom Styles. 25306630e, 098df6023
-
Preserve useful Word links and exclude executable markup text. Phone links previously lost their
tel:destination, while script and style contents could enter exported text. Word export now keeps phone links and removes those elements. 461d3c4e6 - Keep Markdown’s structure and experience text. Exports now preserve nested and numbered lists, underline and strikethrough, and parent experience descriptions when roles are present. Empty roles no longer create headings; repeated parent positions are also removed from PDF, Word and the public reading view. JSON and Markdown generation failures now show retryable error messages. 9a803305c
- Choose profile icons by complete network names. Substring matches could assign the wrong social-network icon. Matching now uses complete names. 54a9bfc30
Mobile, accessibility & motion
- Keep popups usable inside sheets. Every sheet popup now renders inside a drawer viewport. Shared UI fonts are consistent across the homepage and app, and footer text no longer clips. bec152b7e, ec0932c5d

Phone editing gives entries their own screen
- Edit comfortably across phone and tablet layouts. Phones use dedicated entry screens, a Write/Page switch and a Design sheet over the live PDF. Tablets use a panel drawer; narrow application detail sheets become full-screen. Rich-text controls dock above the phone keyboard with a Done action. f2a76b2f6, 62572a20c, 5f7ed15a5
- Keep touch targets, labels and keyboard focus visible. Primary touch controls reach 44 px, tinted descriptions remain readable, password fields gain show/hide controls, and two-factor code fields are named. Segmented controls, radios, checkboxes, switches, accordions and toasts regain focus rings; application sheets stop clipping them. Form labels, overlay focus return and tablet interactions receive accessibility fixes. dcddc5639, 62572a20c, a6ef340c0, eaccd1d5c, 708a95617, c6c51e5b2
- Keep overlay interactions working during transitions. Closing content stays mounted through its exit animation, bottom sheets accept mouse presses inside their content, and guarded form closes use the same unsaved-change check. Design-sheet scrolling no longer shifts the whole phone sheet. 08c513ca2, 09134035a, 31c58baed, d3ed651d6
- Make navigation and manipulation feel consistent. Shared motion timing governs page fades, press responses, arriving content, swaps, expand/collapse, overlays and drag lift/drop. Phone surfaces push, rise and swipe; active tabs use a moving indicator. Page navigation no longer waits for avoidable network requests, and opening the assistant avoids rerendering the page every animation frame. b48a9c214, 982e688e6, d9979bbc8, 0bc128ff3, 7827ff11b, d1aabaecb, 8e0a76bcb, 500cabaf4, 2a71d74e7
- Honor reduced motion throughout the workspace. Motion animations become instant when the preference is enabled, and preview updates swap immediately. e3d72ab0e, 538fd316a
Settings, appearance & public pages
- Identify and revoke connected applications. Settings → AI & developer lists OAuth applications by their registered names, shows granted permissions and lets you revoke access. Unnamed or unavailable clients remain listed by ID so they can still be revoked. Settings content and desktop navigation scroll independently. 78f4f8183, 0a0970160
- Browse a lighter, more accessible homepage. Design and sharing controls gain labels, FAQ questions use headings, decorative images load responsive smaller assets, and typed captions use fewer elements. Reduced-motion changes stop language rotation and pointer-driven lens motion; language transitions and copy feedback improve. PDF and Word downloads appear in search descriptions, multiline metadata is read correctly, and the footer and organization metadata include support and social links. The displayed template count follows the schema, and the donation receipt uses monospace type. 59167aae5, d9c121daa, 0ac6f81bf
- Use the Desk & Paper visual system. Warm desk surfaces, paper pages, revised typography and color tokens replace the old app chrome. A self-hosted Material Symbols subset supplies interface icons, and the app sidebar and rail use the brand mark. Light, Dark and System appearance are available. 0f934bd84, 4485825df, 55a328436, f82e9f33f
- Find settings in three pages that save as you go. Account gathers profile and security, Preferences gathers appearance, language and motion, and AI & developer gathers providers, API keys and MCP. Old settings URLs redirect, and project links move to the settings footer. 9f809890e, 01e87a6f1
- Recover sign-in and security changes reliably. Backup codes accept the displayed hyphenated form; signup, reset and password-change forms enforce the server’s eight-character minimum. Passkeys can be renamed and removal asks for confirmation. Unlinking a sign-in provider refreshes the account list, and custom OAuth appears only when its configuration is usable. 9a803305c
- Leave no cached account data after sign-out. Signing out from the avatar menu previously retained the query cache. It now clears cached data. 741b08029
- Explore the rebuilt landing page. One scroll-driven story demonstrates writing, design, checks and exports. A new FAQ, localized prerendered HTML and revised canonical, OpenGraph and structured metadata improve search and answer-engine descriptions. Android Chromium no longer flickers the Design scene. b399e289d, f8981502f, d6f03a3e6
- Install with current app screenshots. PWA images now show the redesigned workspace and are included in the Vercel frontend output. 49fcc630d
-
Follow documentation that matches v6. Guides are rewritten around Documents, the new editor, structured dates, proposals, letters, applications and consolidated settings, with refreshed screenshots and upgrade instructions. OpenAPI, JSON schema and Semantic CSS references are regenerated; translation catalogs follow the new interface. The unregistered
ckb-IRcatalog is removed. d46b4b581, 26044b534, 25131b3a8, 328bf73ce
Security & API correctness
-
Import, export and check documents through REST. Resource-oriented endpoints support file imports, PDF/Word/Markdown/JSON exports for resumes and letters, resume checks, job-term matching and a public PDF readability check. Collection routes accept
limit/offsetand returnX-Total-Count; PATCH routes support partial updates. Existing routes and response shapes remain available. OpenAPI identifies public operations and includes a separate authentication schema; server-side Word export now parses rich text without browser APIs. Using the API. 57171c6fc -
Reach the remaining API workflows through MCP. The original 43 tool names remain, with additional
api_tools for document history and Trash, sharing, imports and exports, checks, assistant conversations, integrations and account actions. Tools publish input/output schemas and structured results. Resume patches can reject stale edits withexpectedUpdatedAt; file operations accept owned storage references for larger uploads. Sensitive credential and account setup directs clients to the authenticated settings page. Using the MCP server. 78f4f8183 - Limit integration access to the permissions you grant. API keys and OAuth grants can carry read, write and delete permissions enforced across API and MCP operations. MCP accepts explicit API keys or bearer tokens, never account cookies. Revoked grants, ended sessions, disabled clients and banned accounts invalidate token access; cross-origin session requests are rejected. Legacy keys and identity-only grants retain account-wide access for compatibility. 78f4f8183, 57171c6fc
- Bound MCP requests, file access and streamed results. MCP uses stateless POST requests with private, uncached responses, validates browser Origin, applies request and user limits, and shares PDF-rendering limits with REST exports. File references are restricted to the authenticated account’s storage paths. Collected assistant streams report truncation, while persistent threads retain replies; live resume tools return snapshots for polling. 78f4f8183
- Validate remote images before server PDF rendering. Server image loading checks public destinations, pins validated addresses, revalidates redirects, and bounds request time and image size. This prevents remote image URLs from reaching private services. bc92b8cf7
- Keep trashed and hidden content out of public sharing. Trashed resumes are unavailable through public lookups, and hidden content is excluded from shared data. Script or style uploads are served as downloads rather than executable inline content. 23ea18241, 61f481055
- Store assistant attachments privately on local storage. Local installations can now write private files under the assistant-only namespace with restrictive permissions. Public upload routes exclude that namespace; names are generated IDs rather than user filenames. 9a803305c
-
Base rate limits on the server’s client address. Authentication, MCP and public resume rate limits no longer trust arbitrary forwarded-IP headers supplied by a client. The server adapter provides the address, and auth receives a sanitized header set.
FLAG_DISABLE_API_RATE_LIMITnow consistently covers API limits as well as authentication. 9a803305c - Resolve API keys and bearer tokens consistently. MCP uses the shared user resolver, and an unusable API-key header no longer prevents checking valid bearer authentication. 9a803305c
- Keep resume text literal in page metadata. Replacement-pattern characters in authored text previously changed metadata substitution results. Escaped replacement handling preserves that text. 861feb22e
-
Return documented resume API results. Locked update, patch, restore and delete operations return
403; a resume can be duplicated using only its ID; list queries accept one tag or repeated tags. The schema resources use the live schema, and development health reports the package version instead of0.0.0. 9a803305c, cbc76b03b
Self-hosting, performance & maintenance
- Transform translation macros natively. Lingui’s native transform handles the web app and PDF worker, replacing its Babel preset. Split-route modules are explicitly parsed as TSX so their query-string filenames do not break JSX parsing. React Compiler retains its compatible Babel integration. 36f2477c2
-
Use one release migration and rollback script. Intermediate v6 migrations are consolidated into
20261001042749_v6_release. It performs v5 data conversions before removing legacy columns; its rollback restores v5-compatible letter sections and application/history fields in one transaction. See Migrating from v5. bc92b8cf7 - Run consistent workspace checks with Oxc. Standalone Oxlint and Oxfmt replace the previous lint/format configuration. CI checks package boundaries and affected-package types, persists Turbo artifacts, and runs unit suites with one concurrent task. Dependency and translation updates are grouped with these maintenance changes; obsolete design and redesign plan documents are removed. 0bdf8066c, fcfb18fe5, 3e14ecaab, 8ab54c8ad
- Set up job search and AI alongside your instance. A new Job search and AI guide covers Firecrawl, Tavily and Exa, links official Firecrawl, SearXNG and OpenAI setup instructions, explains shared services and personal keys, and includes container-network and local verification examples. SearXNG supplies JSON search results to self-hosted Firecrawl; Reactive Resume connects separately to Firecrawl and its AI provider. Docker, environment-variable and AI guides link to the setup. bec152b7e, 3e7849e51
-
Create the SeaweedFS bucket reliably in Compose. The old
minio/mcimage returns401 Unauthorized, breaking bucket setup and the Docker publishing workflow. Development and production Compose switch to the AWS CLI, checking for an existing bucket before creating it and retrying failures. #3544 - Compress static assets and HTML on the Node server. The server serves compressed web files and application shells to reduce transfer size. e74403e12
-
Drain active requests during shutdown.
SIGTERMandSIGINTstop accepting new HTTP connections and wait for active requests before exit. Deployment smoke tooling follows the v6 workflows. 50af92e2f - Compile more of the interface with React Compiler. Builder, assistant, settings, applications, command palette, homepage and checker components lose redundant manual memoization where the compiler can handle them. Babel remains on a compatible major so components actually compile. 218aad51a, 73a3dfc42, 59337fcd5, c0e9d3fc6
-
Run CI on GitHub runners by default. Blacksmith becomes opt-in through
USE_BLACKSMITH=true. Database-backed cover-letter and MCP OAuth suites now receive isolated database configuration in CI instead of silently skipping. Playwright launches Node directly so it can stop its server process. a7f182948, 8a2fa2645, 685fcab60 - Keep checks focused on regressions and data safety. Test cleanup removes duplicated markup assertions, mock-shape checks and expensive render permutations while retaining security, ownership, persistence and public-contract checks. Per-template PDF smoke tests check that visible sections reach a page; core browser journeys and deterministic assistant tests remain. CI stops collecting unused unit coverage. c0c798471, 48b27802f, 8a2fa2645
-
Keep contributor setup aligned with the workspace. pnpm updates to 12.8.1, dependency upgrades and deduplication refresh the stack, and
dotenvxis available through pnpm for development. Generated documentation blocks use MDX comments, and repository guidance describes the React SPA, source-consumed packages and current deployment layout. 8ded9de46, d0d20ce0f, 36ba314e2, #3537, 883045b14, 6cfcdea32
Removed
- Retire the previous workspace surfaces. The compact document view, collapsible app sidebar, old builder sidebars/dock, separate template gallery dialog, application table, Rejected/Archive actions and separate Agents workspace give way to the workflows described above. Old document, settings and Agents routes redirect during the 6.0 releases. f2a76b2f6, daa7d331f, 462db6011, e1d5b9ba9
- Retire automatic AI editing and old conversation controls. The UI removes conversation archiving, token counts, the application fit-score field and AI-draft copy/blank-draft actions. Reviewable proposals replace automatically applied edits; attachments, sources and transcript copying remain. Existing application copilot API operations remain available to integrations. e1d5b9ba9, 6463a9e9c
- Retire the previous PDF and style stack. Remove
@react-pdf/renderer,@react-pdf/hyphenate,react-pdf-html, PDF-specific Phosphor dependencies and their patches. Legacy per-slot styling and stylesheet activation are removed. Semantic CSS dropsrevert,unset,vw/vh,|=/$=attribute matching,:nth-child(... of ...)and the old analyzer; use supported PDF-oriented CSS. c0bf1aeba, a325232a0, 394e59e1a - Remove unused internal UI and duplicate infrastructure. Old chat/sidebar primitives, shadcn color aliases, unused export surfaces, dependencies and Turbo tasks are removed. Shared helpers now handle history, confirmations, HTML escaping, cookies, signatures and AI errors; client-only code loses obsolete SSR guards. 3a69dfc4d, f8767c32f, e368e5955, a42cacc05, eae7de3fb
Known issues & release status
- Known issues — mixed-direction PDF text. The patched engine fixes the previously listed Unicode extraction, emoji and fallback-spacing regressions. Paragraph direction still needs to match the intended text: PDF readers may reorder predominantly right-to-left text in a left-to-right paragraph differently. Inspect mixed-script exports and choose the correct page language and direction. See the patched engine notes. bc92b8cf7
- Known issues — PDF style limits. Rotation, percentage spacing,
z-index,max-lines,text-indent,vertical-align,object-positionand presence hints are unsupported; dashed and dotted borders render solid. Photo rotation is disabled. Custom Styles applies to PDFs, not Word or Markdown. Engine limits lists supported alternatives. 394e59e1a, 9a803305c - Deliberate omissions — letters and phone views. Letters have no public sharing link or document-wide undo stack; use typing undo, proposal Undo or History. Board and Calendar use List on phones. Whole-account ZIPs are exports of records; reimport individual document JSON files after extraction. 82fa32790, 462db6011, 9a803305c
- Deliberate omissions — changelog granularity. Repeated catalog extraction, dependency-only bumps, plan checkpoints, private-type cleanup and behavior-preserving refactors are grouped above. Superseded implementations, including automatic startup style conversion, are described by their final behavior. Every commit remains available in the full comparison.
- Deferred items — release and deployment verification. This entry records source changes through the audited commit. Creating the v6 tag, publishing artifacts, applying production migrations, converting stored styles where required and checking the live deployment remain outside this changelog task. No release-wide runtime verification is claimed here.
Highlights
- Deploy to Vercel in one click. Self-host Reactive Resume on Vercel Hobby with the Deploy with Vercel button, which provisions Neon PostgreSQL, Upstash Redis, and private Vercel Blob storage and only asks for two secrets. Database migrations run during the build, and uploads keep their full 10 MB file and 25 MiB attachment limits. Docker remains fully supported. See the Vercel guide. 8c4031398
- Import resumes by drag and drop. Drop a file anywhere on the import dialog’s file area instead of opening the file picker. Thanks to @s3kfm. 0ac320b0e
Resume Builder & Import
- Fixed JSON Resume imports accepting impossible dates such as month
13, which then showed as “undefined” in the resume. These dates are now rejected with a clear validation message. Thanks to @PerryLink. d3131e097 - Fixed the deep resume health check scoring templates with side-column section headings, such as Bronzor, far lower than the same content on other templates. Thanks to @santhiprakash. 28d0170b0
Self-Hosting & Maintenance
- Added a schema check after startup migrations that detects missing tables and logs a clear error, with
STRICT_SCHEMA_CHECK=trueto refuse startup instead of failing later with database errors. Thanks to @santhiprakash. ac69dd3f1 - Running several instances with a shared Redis now shares rate limits, live resume updates, view counts, and AI agent stop requests across instances. Stopping an agent run whose server has died now frees the conversation immediately. 8c4031398
- Made the Docker image workflow work in forks without Docker Hub credentials or Blacksmith runners, so contributors can build and publish to GHCR on their own. Thanks to @GoldenSection0618. f0bc26cb3
- Updated dependencies and translations. 4fde62df6, b5ff720f9
Highlights
- A smoother dashboard. Searching resumes and applications no longer triggers repeated navigation and session requests as you type. Resume thumbnails are cached so returning to the dashboard avoids rendering unchanged previews again. Thanks to @emanuelet. 2a2d08a8d, b42eb6ec0, 232f48578
- Manage your cover-letter library through MCP. Connected assistants can now create, read, update, duplicate, delete, import, and export independent cover letters, refresh their styling from a resume, or copy an embedded letter into the library. Revision checks protect newer edits from being overwritten. Thanks to @emanuelet. e6a6bf0e6
- Explore the redesigned homepage. Try interactive resume, export, and ATS previews, browse templates, and discover supported languages before opening the builder. 6416da28a
Resume Builder
- Fixed newly opened dialogs disappearing when another dialog had just closed, including duplicating a resume immediately after renaming it. 0c2d5ac9f
PDF Export & Templates
- Fixed list indentation when an item continues onto another page, including nested lists and numbered lists with wider markers. Thanks to @santhiprakash. 51ac77295
- Fixed Lapras section headings overlapping the section above them when using the default styles. Thanks to @diego-vega-centeno. c0c658c00
Integrations & Authentication
- Changed cover-letter REST endpoints. REST clients must migrate from
/api/openapi/coverLetters/*to/api/openapi/cover-lettersresource paths and the documented HTTP methods; the old URLs now return404. Follow the endpoint migration guide and regenerate SDKs from your instance’s OpenAPI spec. Existing/api/rpcclients are unaffected. Thanks to @emanuelet. fbf1f8fba - Fixed OAuth registration for MCP clients that request client-secret authentication, allowing integrations such as Composio to complete their token exchange. 3fc0896a3
- Improved MCP tool descriptions and action hints so connected clients can identify operations that replace content, change public access, or send data to a configured provider. 81341a107
Languages & Sharing
- Kept AI provider brand names recognizable across all interface languages instead of translating them as ordinary words. Thanks to @LystranG. 3e129c9d9
- Updated translations and filled untranslated homepage text across 16 locales. 15d6443b4, 6416da28a
- Fixed missing URL metadata in social previews and added consistent title and description metadata for the ATS checker. de9a6dcfa
Self-Hosting & Maintenance
- Moved the repository and GHCR images. Source code now lives at reactive-resume/reactive-resume. If you pull from GHCR, update your image reference to
ghcr.io/reactive-resume/reactive-resume:latest; Docker Hub remainsamruthpillai/reactive-resume:latest. f89acb436, e3717251c - Added a Kubernetes self-hosting guide covering PostgreSQL, persistent uploads, secrets, ingress, health checks, and upgrade verification. Thanks to @PerryLink. 3c5908819
- Published nightly container images for both AMD64 and ARM64 and added anonymous-pull checks for both registries before production deployment. 9699dbf2d, 30b21fa1e
- Updated dependencies across the application, integrations, and build tooling. 607eafd3e, dc8f9787a, 96c7142fb
Highlights
- Manage cover letters in one shared library. Create, import, search, edit, duplicate, preview, download, and reuse cover letters from the dashboard or resume builder. Letters now keep their own template while still letting you copy sender details and content from a resume. (#3255) 1d4194a20, df2e21ef9, a3784558b
- MCP connections now use a complete OAuth consent flow. Dynamic client registration works again, signed authorization requests survive login and two-factor authentication, and a new screen asks users to explicitly Allow or Deny access. (#3392) fe9b59e11
- Import PDF resumes without configuring an AI provider. PDFs with readable text are now parsed locally in the browser and turned into an editable resume, while the existing AI-assisted path remains available when a provider is connected. Thanks to @Syed-Ali-Abbas-Zaidi. (#3334) cce6d64af
- Do more from the application tracker. Export the current filtered view to CSV, save contact email and phone details, and turn a generated cover letter into a PDF attachment. Thanks to @emanuelet. (#3393) a3585a24e, 1f0844b39, bf27792ca
- Recover and reorganize resume sections more safely. Restore hidden printable sections, sort dated entries on demand, and choose whether each section heading appears in the exported resume. (#2725, #3060) 5850230f8, b85d285b6, 368858a56
- Choose how profile photos fit. Cover fills the frame, Contain keeps the whole image visible, and the crop dialog can now upload the original file without cropping. Upload limits are clearer and crop compression is preserved. (#3305) ab67831e4, fa4115072, 40c997a39
- Resume previews expose a clearer outline to screen readers. Entries and nested roles use consistent heading levels, while paragraphs, lists, emphasis, and safe links retain their meaning in the accessible view. 9f0202eac, acd2a9cfe
- Public sharing is more configurable. Hide the PDF download button per resume, count successful public downloads correctly, or serve one configured public resume directly from your self-hosted root URL. (#3360, #3366) 14c7c0651, cddb01f03, 744eaa902
Cover Letters & Applications
- Added a persistent cover-letter library with ownership-safe saves, revision checks, search, import, duplication, PDF preview and download, resume-content copying, and application attachment snapshots. (#3255) 1d4194a20
- Separated cover-letter templates from resume-based sender details. Refreshing sender information no longer changes the selected letter template, and the resume builder now links directly to its cover letter. df2e21ef9, a3784558b
- Added one-click PDF generation and attachment for Application Copilot cover letters, with retryable progress states. Thanks to @emanuelet. bf27792ca
- Added contact email and phone fields to applications. Thanks to @emanuelet. 1f0844b39
- Added CSV export for the current filtered application list. (#3393) a3585a24e
- Fixed saved application notes not appearing in the detail view. (#3391) 00a1357de
- Fixed cover-letter copy failures so errors are reported without leaving stale content behind. Thanks to @emanuelet. ef47baf24
- Fixed Application Copilot provider failures returning an internal-server error instead of a useful upstream-provider error. Thanks to @santhiprakash. (#3312) c4eb9d860
Resume Builder & Editing
- Added a Compact resume-library view alongside Grid and List, with the selected view remembered for the browser session. (#3247) 1f308af72
- Added local PDF resume import for users without an AI provider. Scanned PDFs without readable text now receive a clear error instead of entering a blocked import path. Thanks to @Syed-Ali-Abbas-Zaidi. (#3334) cce6d64af
- Added hidden-section recovery so printable sections missing from the layout can be restored without disturbing authored placement. 5850230f8
- Added one-shot ascending or descending date sorting for supported sections. Sorting is explicit and does not keep rearranging later edits. (#2725) b85d285b6
- Added per-section heading visibility, allowing repeated or unnecessary headings to be hidden without hiding section content. (#3060) 368858a56
- Added Inline and List presentation options for skill keywords, including controlled line breaks for long skill lists. Thanks to @diego-vega-centeno. (#2785) 8df1b2555, 870388192
- Added whole-paragraph indentation and kept authored spaces intact through editing and export. (#3397) f468651c7, ea97de5ec
- Preserved imported tables as editable rich-text tables instead of flattening or losing their structure. 999cd618c
- Saved pending resume edits before navigation, preventing the last change from being lost when leaving the builder. a4bdc54b2
- Removed empty custom sections and their now-unused pages after moving the final item elsewhere. (#3180) 97ccb4ba0
- Preserved explicitly entered
http://links instead of silently rewriting them to HTTPS. (#2735) 2cbb0f63e - Kept the color picker preview synchronized with the stylesheet source. (#3291) 735e70092
- Rendered resume thumbnails at their displayed pixel density for clearer cards without unnecessary work. 2e711fd14
- Added clearer explanations for content that intentionally overflows an authored page and for unsupported CSS gradients. 0fbeeeb4c, 38832014b
- Hardened rich-text paste handling and removed an unsafe clipboard parsing pattern. 97f34b7cc
PDF Export & Templates
- Preserved vertical margins when an item continues onto another page. (#3337) bf71253ca
- Kept dates aligned when optional fields are empty, constrained Onyx headlines to page margins, and aligned Ditgar item headers with body text. (#3338, #3339, #3068) a2d6bc0c6, a95e63246, 873835a57
- Added optional German hyphenation to improve line wrapping without changing existing resumes by default. (#3340) 7d809da6f
- Restored picture borders and soft shadows in PDF output. (#3017) 57fee67d2
- Fixed skill ratings across templates: grid rows now align, icon opacity reflects the selected level, and Gengar keeps the intended rating order. (#3343, #3352, #2611) 6d39074c5, 93e8d192a, 2a4a1583b
- Localized default section headings in server-rendered PDFs, applied semantic heading colors, and stopped the first character of headings from being clipped. Thanks to @santhiprakash. (#2804, #3348, #3380) b6842fb76, d53b89ba2, e0c2f6d88
- Kept unordered-list markers with their first text fragment across page breaks and moved ordered-list markers clear of body text. (#3344) ea2beb845, 8d4cf8a2f
- Preserved imported rich-text content even when older data lacks semantic descendants. aada38088
- Improved text placement and font handling by honoring requested font metrics, isolating cached glyph metadata, preserving authored Unicode spaces, and retaining glyph positions in RTL previews. 8354c39c4, d10eb4a55, 05e48a7cb, 5c8338c17
- Centered the resume preview correctly in RTL interfaces. (#2745) 9fdcec2ec
- Allowed gaps between level decorations in custom styles. f629ea1ea
Sharing, Authentication & Accessibility
- Added a per-resume setting to hide the public PDF download button. (#3360) 14c7c0651
- Counted successful public PDF downloads in resume statistics. (#3366) cddb01f03
- Added
ROOT_RESUME_IDso self-hosters can publish one resume directly at the site root. 744eaa902 - Replaced resume-specific social preview images with a neutral preview and hid the “build your own resume” signup link when registration is disabled. (#3359, #3401) 0878b256a, 18b5aa474
- Added password confirmation, labels, and immediate validation to resume sharing, including the documented minimum length. (#3370) 321f2fb43
- Fixed label targeting for Slug, Tags, Sidebar Width, and related form controls. Thanks to @santhiprakash. (#3369) ea3980cba
- Added accessible labels to remaining website and picture inputs and restored hover feedback on primary buttons. (#3251) 5a6f5d4d6, ddbbbde80
- Improved the builder’s screen-reader outline with entry and nested-role headings, semantic rich text, safe links, stable section order, and correct handling of hidden content. This advances #2844; public viewer and exported-document accessibility remain separate work. 9f0202eac, acd2a9cfe
Self-Hosting & Integrations
- Restored MCP OAuth dynamic client registration and resource-aware authorization. A new consent screen shows the signed-in account and requesting client, requires an explicit Allow or Deny decision, and preserves signed requests through login, registration, social authentication, passkeys, and two-factor authentication. Existing OAuth rows survive the upgrade, but previously registered clients must reconnect to establish resource grants. (#3392) fe9b59e11
- Added the OAuth provider tables required by Better Auth and aligned the account schema with Better Auth 1.7.3 while preserving existing issuer values. fe9b59e11, cea27a97b
- Supported S3-compatible buckets that have object ACLs disabled. 35cecf9c9
- Loaded local environment overrides correctly in Docker Compose. (#3361) 53288fcd3
- Exposed the running application version through the health endpoint. (#3347) cd1c597ff
- Invalidated cached build tasks when consumed workspace source changes, preventing stale application builds. 7390c81b7
- Added
AI_TEST_TIMEOUT_MSfor slower AI-provider health checks. Thanks to @santhiprakash. (#3374) 861ba8bf6 - Rejected invalid resume writes instead of silently coercing values outside the published schema. (#3368) 779ea5cb4
- Preserved optional Nodemailer settings in strict TypeScript configurations. 165841af4
- Refreshed interface and documentation copy, synchronized translation catalogs from Crowdin, and updated workspace dependencies. f29b92e2f, d277518d2, 7fef84078, e272037be
Highlights
- A free ATS checker that never uploads your resume. Drop a PDF on rxresu.me/ats-checker and it opens the file the way a parser would, pulls the text out, and reports what survived: whether the file carries real text or a picture of one, whether a multi-column layout scrambles the reading order, and whether your name, email, phone, links and dates come through intact. Everything runs in your browser — the file is never uploaded, nothing is stored, and no account is needed. Paste a job description and it will also tell you which of the posting’s terms already appear in your resume. #3382
- A score you can actually audit. The report gives one number from 0 to 100 across readability, layout, sections, contact details and dates — and shows its working. Every finding cites the text that triggered it and the page it sits on, and the report states how many checks ran and how many were honestly skipped rather than quietly counting them as passes. Employment gaps, writing style and length are reported as unscored tips; they never move the score. #3382
- Resume analysis has been replaced by the ATS check. The old AI-scored analysis is gone, along with its stored results, its
get_resume_analysisMCP tool, and thePOST /ai/analyze-resumeendpoint. What replaces it is deterministic and evidence-backed, with an optional AI second opinion on your writing that deliberately returns no score of its own. Self-hosters: read the upgrade note below. #3382 - Bold text finally looks bold. Most resumes pair Regular with SemiBold, which rendered
<strong>almost indistinguishably from body text. Bold now resolves to the font family’s true Bold face, so emphasis reads as emphasis — existing resumes will export with visibly stronger bold text. Thanks to @santhiprakash. e065a1082
Resume Builder
- The right sidebar’s ATS Check section now runs live checks against your resume as you type — missing dates, malformed links, prose stranded in a narrow sidebar — before you export anything. #3382
- Run deep check renders your current resume to a PDF in your browser and runs the full file check against those exact bytes, which is the same file a recruiter receives. #3382
- Once a report exists, you can ask your own AI provider to review the writing — weak phrasing, bullets that describe duties rather than outcomes, and where a rewrite would land better. It sends only the extracted text, never the PDF. #3382
- Section detection understands more of the headings people actually use, so conventional sections are recognized across a wider range of resumes. #3382
- Toasts no longer slide underneath dialogs and sheets. #3382
AI Agent
- Picking a provider when starting a thread now uses the same provider picker as the rest of the app, showing the label, provider and model consistently instead of one long concatenated line. #3382
PDF Export & Fonts
- Bold text now uses the font family’s true Bold face. Most resumes store their typography as Regular plus SemiBold, which rendered
<strong>almost indistinguishably from body text on faces like Open Sans; bold now resolves to the family’s 700 weight where it has one, and to its heaviest bold-class face where it does not. Existing resumes will export with visibly stronger bold text. Thanks to @santhiprakash. e065a1082 - Long bullet-list lines no longer spill past the page margin. Thanks to @santhiprakash. a416d0111
- Emoji render instead of dropping out as blank boxes. They are drawn as monochrome outlines, because the color emoji format cannot be embedded in a PDF, and the fallback font is only loaded when your resume actually contains emoji. Thanks to @santhiprakash. b47f80532
- Vazirmatn is available in the font catalog again, so Persian and Arabic resumes that ask for it no longer fall back to a Latin serif and lose their glyphs on export. Thanks to @santhiprakash. 2761bd671
Self-Hosting & Maintenance
- A migration drops the
resume_analysistable. Any saved analyses are deleted when you upgrade; they have no equivalent in the new report, which is computed on demand rather than stored. No action is needed beyond the usual upgrade. #3382 - Two API surfaces were removed. MCP clients calling
get_resume_analysisand API clients callingPOST /ai/analyze-resumewill start failing; the replacement isPOST /ai/ats-review, which reviews extracted resume text and returns qualitative feedback without a score. #3382 /ats-checkeris listed in the sitemap and carries its own preview card, so the page is indexable and shares cleanly. #3382- Routine dependency updates across the workspace, including the AI SDK providers, Better Auth, TipTap, TanStack Query, Hono and the build toolchain. All patch and minor releases; no breaking upgrades.
- Translations synced from Crowdin, with the new ATS checker strings covered across every supported language. 7fac6f29c
Highlights
- The AI agent now asks before it edits your resume. Changes arrive as a proposal you approve or reject, so you see what the assistant wants to touch before anything is written. Once you trust a conversation, you can turn the review step off for that thread alone. The agent also survives a server restart mid-reply instead of leaving the thread stuck, and long conversations are trimmed as they grow so they keep working past the point they used to stall. c8081ac2f
- Custom Styles can finally reach every item header.
item-headerused to match only some sections, and on stacked headers only the first row — certifications, awards, projects, publications and references quietly ignored it. It now covers the full header row of every section on every template, and a newitem-header-rowpart lets you stop a long title from pushing its trailing date onto a line of its own. 4d53a6d1d, 00be67f70 - Self-hosters using a custom OAuth provider must update one URL. The callback path changed from
/api/auth/oauth2/callback/customto/api/auth/callback/custom. Update the redirect URI registered with your identity provider before upgrading, or custom sign-in will fail. Installs that useOAUTH_DISCOVERY_URLneed one additional SQL statement — both steps are written up in the SSO documentation. bdac806c7
AI Agent
- Resume edits are gated behind an approval step, with a per-conversation setting to skip it once you are comfortable. Tool activity, token usage, and each step the assistant takes are now visible in the thread. c8081ac2f
- Copying a conversation as JSON no longer embeds full resume documents, so the file stays small and your resume content does not travel with a transcript you might paste elsewhere. 8ce899a04
- Resume analysis is told today’s date, so it no longer misjudges how recent your most recent role is. Thanks to @emanuelet. #3353
- Agent edits to a newly created resume no longer fail permanently with a version conflict. 39f36b4ac
Custom Styles
item-headernow applies to the whole header row of every section on every template, instead of being silently dropped on sections whose header did not start with the one element it looked for. Rendered output is unchanged apart from the rows that should have been styled all along. 4d53a6d1d- Added
template-part[name="item-header-row"], the split row holding a title and its trailing date. Setflex-wrap: nowrapon it to keep the date pinned right down a long list of certifications. 00be67f70 - Under
nowrap, long item titles no longer overlap the date beside them. ebcaa4729
Accounts & Sign-in
- Disconnecting a linked provider works again. Sessions last a week, but the unlink endpoint rejected any session older than a day, so the button failed for nearly everyone. 39590eaff
- Sign-in and account errors now show the actual reason instead of collapsing to a generic message. 39590eaff
- Sign-in failures that happen before your provider can redirect you now land on a proper page explaining what went wrong, translated into every supported language, rather than a wall of JSON. bdac806c7, b960e3273
Self-Hosting & Maintenance
- Upgraded to Better Auth 1.7. Beyond the callback URL change above, accounts are now identified by the issuer your provider advertises; the startup migration backfills existing accounts and refuses to proceed if the backfill would merge two accounts together. bdac806c7
- The DeepSeek Harness plugin now lives in this repository and is published from it. It reads MCP tool names directly from the server, so a renamed tool breaks its prompt guide in the same pull request rather than days later through a scheduled job. 65618a82a
- Routine dependency updates across the workspace, including the AI SDK providers, the PDF renderer, and the build toolchain. 8ffe50a58
Highlights
- Custom Styles now compile in your browser. Semantic CSS is compiled and resolved locally for the editor, preview, public resumes, and exports, so diagnostics appear as you type instead of after a save and a server round-trip. Self-hosted servers no longer run a stylesheet preflight worker on every edit, and server-side PDF generation stays available as a fallback when a browser cannot render locally. 9509b5bc2
- Shared resume links now unfurl with a preview card. Posting a public resume link to X, LinkedIn, Slack, or any chat app shows the name, headline, and template preview instead of a bare URL. The homepage’s own card and structured data reach crawlers again — the static file handler had been answering the root request before the code that injects them could run. 9d0dc3670, 36c35c9bd
- The AI agent asks instead of guessing. When a request is ambiguous, the assistant now offers a short set of choices inline in the chat rather than picking an interpretation and running with it. eedf2faf0
Sharing & Search
- Twitter card tags are declared with the attribute X actually reads, so the title, description, and banner image appear in link previews again. 1e23a453a
- Resume preview cards are built only for resumes that are public and not password-protected, and generating one no longer counts as a visit in your statistics. 9d0dc3670
- Shortened the site description so it is no longer cut off in mobile search results. d0fa9ae8d
AI Agent
- Added inline questions with selectable answers, along with a clearer empty state when a thread has no messages yet. eedf2faf0
- The message box keeps focus after you send, so you can keep typing while a reply streams in instead of clicking back into it. 7c7dbaf21
- Fixed a rendering bug that could duplicate or drop parts of a long, multi-step reply as it streamed. 762b999d1
Job Applications
- Application auto-fill now works from a pasted job posting instead of a URL. Fetching arbitrary URLs from the server meant owning redirect, size, and private-address defences plus per-site scraping quirks, so the URL field has been removed — paste the posting text and the fields below it are filled in as before. Auto-fill is offered only when an AI provider is configured and tested, and only for a paste long enough to be a real posting. da2f1f824
Settings & Interface
- Danger Zone is now Account, at
/dashboard/settings/account, since the page covers account-level actions rather than only destructive ones. 7a14b0dfb - API keys created without an expiry date are listed again instead of disappearing from the key list. 8affc567e
- Testing an AI provider is now time-bounded and reports why it failed, so a rejected key, a wrong model name, and an unreachable host are no longer indistinguishable from a connection that appears stuck. Thanks to @MrTig-afk. #3319
- Rebuilt the notification toasts on the same component library as the rest of the interface, for consistent styling, stacking, and screen-reader behaviour. 170550ed5, 23ceee214, e2554c9be
Reliability, Self-Hosting & Maintenance
- The server no longer carries the stylesheet control plane — apply state, preflight, revisions, render-data versions, and mismatch negotiation are gone, along with the unused resume columns that backed them. Expect lower memory and CPU use on instances where Custom Styles are in active use. 9509b5bc2
- The conflict-marker pre-commit check now runs correctly on Windows. Thanks to @MrTig-afk. #3320
- Test suites are isolated from one another and the OpenAPI specification is built once per suite, removing a class of order-dependent failures and timeouts that made local runs unreliable. e8508e6d0, 60d044076, bfdd29f94, ac062bbcb
- Organized GitHub issue triage. #3325
- Synced the latest Crowdin translation catalogs. #3327, #3328, #3330
- Refreshed workspace dependencies and development tooling. 9dc2aade4
Highlights
- Check your resume’s ATS parseability as you edit. The builder now runs a deterministic, private check in your browser for contact details, dates, section structure, reading order, font size, line height, and margins. Findings explain what to change and can jump directly to the affected field. Thanks to @Syed-Ali-Abbas-Zaidi. #3314
- Download cover letters through MCP. AI clients can now request a short-lived PDF download URL for either a resume or its visible cover letter. The selected document is cryptographically bound to the URL, so it cannot be switched after signing. Thanks to @ignaciocarre. #3304
- Clearer JSON imports. Reactive Resume, Reactive Resume v4, and JSON Resume files are detected and routed to the correct parser, while malformed files now produce concise, readable validation messages instead of raw error dumps. Thanks to @MrTig-afk. #3296
- Semantic CSS is now the standard Custom Styles experience. New resumes use it by default, the legacy feature flag and banner have been removed, and explicit activation no longer fails on an obsolete legacy-renderer parity check. 3589b534f, #3316
Resume Builder & PDF Exports
- Fixed missing spaces around bold rich text in PDF exports without changing quoted HTML attributes. Thanks to @shehraan. #3273
- Added Noto punctuation fallbacks so bullets and other punctuation render correctly when the selected Latin font does not contain those glyphs. Thanks to @santhiprakash. #3294
- Stopped empty or whitespace-only skill proficiency values from producing phantom PDF text nodes in the Gengar template. Thanks to @santhiprakash. #3289
- The icon picker once again lets you choose the empty option to remove an icon. Thanks to @garudaccs. #3298
- Panning the builder canvas now releases focus from the active field, preventing accidental edits while navigating the preview. Thanks to @Syed-Ali-Abbas-Zaidi. #3303
- The template gallery now uses fast, stable preview images instead of rendering every template live. #3302
- Moving from the import dialog to AI provider settings now asks for confirmation before discarding the current import. Thanks to @Syed-Ali-Abbas-Zaidi. #3308
AI, Authentication & Integrations
- Stopping or archiving an AI agent run now cancels it cleanly instead of surfacing an unhandled stream error that could terminate the server. 04100aa9e
- Social sign-in can create an account directly when registration is enabled, removing the need to visit the registration screen first. 2d6ea9ce8
- MCP OAuth JWT verification now uses the server’s loopback JWKS endpoint, fixing verification on deployments whose public URL cannot be reached from inside the container. Thanks to @santhiprakash. #3297
Reliability, Accessibility & Self-Hosting
- Semantic CSS PDF preflight now warms and reuses one worker instead of cold-starting a renderer for every edit, making style activation reliable on slower or CPU-constrained servers. e6a31aab9
- Unhandled promise rejections are logged without taking down the entire Node.js process; uncaught exceptions continue to use Node’s fail-fast behavior. efd950bd9
- Restored consistent PDF line metrics after the React PDF dependency update, preserving the established browser-to-PDF layout. b4f245a38
- Added an accessible label to the two-factor secret copy button, restored visible keyboard focus in the template gallery, and prevented duplicate API keys from double submission. ba1f46995
- Production and development containers now use the official pnpm image, and the contributor guide documents the matching Docker and
dotenvxworkflows. 28d698635
Documentation & Localization
- Corrected the development guide’s environment, migration, and app-name instructions. Thanks to @santhiprakash. #3286, #3287
- Clarified the Redis URLs and Compose startup order used by repository automation and development agents. Thanks to @santhiprakash. #3288
- Synced the latest Crowdin translation catalogs. #3280, #3281, #3315
- Refreshed workspace dependencies and development tooling.
Highlights
- Custom Styles are now Semantic CSS. Custom Styles use a new CSS-like language built for resume PDFs. Selectors describe resume content —
section[type="experience"],region[placement="sidebar"],field[name="position"],list-marker— instead of a template’s internal markup, so a stylesheet keeps working across templates and can be copied between resumes. Builder settings are exposed as read-only--resume-*variables, and the editor keeps your draft, status, undo history, and last valid stylesheet separate so a broken rule never replaces a working PDF. d2ffbf961 - Editable application timeline. Application history is now a real timeline you can curate: add a note with its own date, edit or delete an entry, and see which stage each entry belongs to, alongside a stage-entered date. Available in the app and through MCP. 18d0c14aa
- LinkedIn job posting auto-fill. Pasting a LinkedIn job URL into an application now fills in the title, company, location, and description directly from the posting. 47349e7ab
- A faster homepage. Homepage SEO metadata is rendered by the server on the first response, and the hero video no longer sits on the largest-contentful-paint path. 418c7887e, 1e665fbe7
Custom Styles (Semantic CSS)
- Added the Semantic CSS editor under Design → Custom Styles, with live status, error line and column numbers, “selector matches nothing” warnings, stylesheet undo and redo, Reset to applied stylesheet, Copy stylesheet, and a focus mode that opens full-width on mobile. d2ffbf961
- Resumes still using the previous Custom Styles form get a converted stylesheet draft to review; the original legacy rules stay active until you select Activate Semantic CSS, and remain available for rollback. d2ffbf961
- Added semantic selectors, attributes, and template-specific parts for all 15 templates, plus pagination and page-size controls (
break-inside,orphans,widows,-resume-min-presence-ahead,size) and PDF-dimension media queries. d2ffbf961 - New resumes start in Semantic CSS mode automatically, while existing legacy styles remain active until their converted draft is explicitly activated.
- Invalid style intents are now filtered out instead of discarding the whole rule set, so one bad entry no longer drops your valid custom styles. 689e7e24d
- Custom style numeric inputs are clamped to their supported ranges. 2a0782517
- Award titles can now be un-bolded through custom styles. 08d859010
Application Tracker
- Added timeline entry creation with a custom date, plus update and delete for individual entries, across the API, the detail sheet, and MCP tools. 18d0c14aa
- Job posting fetches now work with HTTPS postings that previously failed to load. d4cf260ae
AI & Integrations
- The model for a saved AI provider can now be edited inline from settings, instead of deleting and re-adding the provider. 47349e7ab
- Fixed the OAuth protected-resource metadata so MCP clients receive the correct authorization server list. 1124d3dfd
Resume Builder & PDF Exports
- Fixed rich-text editing in the builder, where
Enterand list editing had stopped working. b303b8975 - Page margin values are clamped to 0–100, so pasting an out-of-range value no longer crashes the builder. 4ac19f81b
- The profile picture delete icon now clears the image correctly. 0eb9ce012
- Fixed list markers and bullet indentation when a list splits across a page break in the exported PDF. ed5d10c49, d536b1921
- Fixed skill name sizing so long skill names lay out correctly in PDF exports. e34e7be6e
Performance & SEO
- The homepage now ships SEO metadata in the initial server response, resolved against the instance’s public URL. 418c7887e, 50f50b267
- The homepage hero now loads a poster image first and takes the video off the LCP path. 1e665fbe7
- The PDF renderer is loaded lazily on the server, cutting cold-start time for instances that are not exporting a PDF yet. bb1fb3a7d
Reliability & Self-Hosting
- Fixed OAuth sign-in mapping the session to the account id instead of the user id. 34c03b1f7
- Limited immutable cache headers to hashed media assets so mutable uploads are no longer cached indefinitely. dd0531091
- Preserved the Cloudflare Rocket Loader exclusion and the bootstrap script attribute order through the production build. 93c06934b, 048eab3b4
- Simplified URL security checks, shared template styles, and test fixtures, removing roughly 1,000 lines of redundant code. 9110e8699
- Refreshed workspace dependencies. 326606682, 164a27930
Documentation & Localization
- Rewrote the Custom Styles guide as Applying Custom Styles, covering conversion, selectors, builder variables, pagination, diagnosis, and portability. The JSON Resume schema guide and the resume-builder skill schema reference are now generated from the schema so they stay in sync. d2ffbf961
- Added 17 comparison pages covering Reactive Resume against mainstream resume builders, AI and ATS tools, design editors, and career and template services. 9d6426b2e
- Canonicalized the getting started routes and fixed the contributing guide’s troubleshooting code blocks. a4897c20d, e6b4733c5
- Pinned the v4 migration script checkout in the self-hosting migration guide, and aligned the documented pnpm version with the
packageManagerfield. ac9813909, 15f8bce98 - Synced Crowdin translation catalogs, including strings for the application timeline. 9085a199c, 79e4a3ddc, d50948dde
Highlights
- More AI provider choices. The AI settings page now supports Mistral AI, Cohere, xAI Grok, Groq, DeepSeek, Together.ai, Fireworks, Cerebras, and Perplexity, with provider defaults filled in for each. Ollama is now labeled as Ollama Cloud to make the hosted integration clearer.
- Cleaner cover-letter exports. Cover-letter PDF, DOCX, and Markdown downloads now export the letter without resume header chrome by default, and PDF downloads include a new toggle for adding the resume header back when needed. 8570c1c70
- More accurate public resume statistics. Rapid repeat views from the same client are now de-duplicated before incrementing public resume view counts. 97ab3c973
AI & Integrations
- Added first-class AI SDK support for Mistral AI, Cohere, xAI, Groq, DeepSeek, Together.ai, Fireworks, Cerebras, and Perplexity across saved provider settings and AI service calls.
- Made AI provider connection tests work with OpenAI-compatible models that do not support structured output, with a clearer error when a model returns too much text during the test.
- Published Reactive Resume MCP registry metadata so MCP clients and directories can discover the hosted remote server. 73daf22b2
Resume Builder & Exports
- Fixed cover-letter-only exports across PDF, DOCX, and Markdown so they no longer include resume contact details or a redundant cover-letter heading. 8570c1c70
- Added an Include resume header option for cover-letter PDF downloads.
- Improved the layout page header so the Full Width and Delete Page controls fit better in narrow builder sidebars.
- Simplified the current-template card by removing its hover live preview; template switching still opens the full template gallery.
Reliability & Self-Hosting
- Added report-only CSP, frame blocking,
nosniff, and stricter referrer headers to web app shell responses, and tightened public upload headers to rely on same-site resource policy instead of an unconditional CORS header. 9bde7d544 - Limited application bulk update and delete requests to 200 selected items per operation to avoid oversized bulk actions. c9b3fa5c1
- Resume lock and password mutations now return
NOT_FOUNDwhen the resume is missing instead of silently succeeding. e47cf6e77 - Reduced repeated work in the font picker by computing the font family options once per app process. 7e0657946
- Refreshed workspace dependencies, including AI SDK provider packages, Lingui, oRPC, Hono, Tiptap, and test tooling.
Documentation & Localization
- Tightened SEO titles and descriptions across the documentation site. 5270a2a9a
- Corrected the README feature list to describe structured Style Rules instead of custom CSS. 66078609a
- Synced Crowdin translation catalogs and added locale strings for the new AI providers and cover-letter export option. b87a9d828, 25021507a
Highlights
- Application Tracker REST and MCP parity. The job application pipeline is now available outside the web app through authenticated REST endpoints and MCP tools, so agents can create records, import rows, move stages, add notes, manage follow-ups, attach sent PDFs, and inspect pipeline health. 2dad27da5, bf2dc5bbd
- Agent-only application tracking. MCP clients can now operate the Application Tracker end to end, including Application Copilot actions for job auto-fill, match scoring, tailored resume copies, cover letters, and recruiter follow-ups. bf2dc5bbd, 93abb1102
- New application MCP guide. The docs now include a dedicated guide with practical prompts for using Reactive Resume MCP to manage applications from an AI client.
Application Tracker API
- Added public REST coverage for listing, reading, creating, updating, importing, bulk-updating, bulk-deleting, tagging, and summarizing job applications. 2dad27da5
- Added authenticated document endpoints for attaching and removing the resume or cover-letter PDF sent with an application. 2dad27da5, fb3f40244
- Added REST endpoints for Application Copilot actions: job posting auto-fill, resume match scoring, tailored resume creation, and message drafting. 2dad27da5
- Updated the OpenAPI reference so application endpoints, multipart document uploads, statistics, and tags are visible in the docs. fb3f40244
MCP & Agent Workflows
- Added MCP tools for every Application Tracker workflow available in the app, including create, update, note, import, bulk action, archive, delete, document attachment, document removal, tag, statistics, and Application Copilot tools. bf2dc5bbd
- Improved MCP tool metadata so clients can distinguish safe reads, mutating actions, destructive actions, and AI-powered workflows more reliably. 93abb1102
- Updated the resume-builder skill instructions so agents are told that Reactive Resume MCP can also manage job applications, not only resumes. ac8734be3
Documentation & Reliability
- Added a parity design note for the Application Tracker REST and MCP surfaces. 3868429ce
- Documented application MCP automation in the MCP guide, including available tools, prompt examples, and troubleshooting for PDF attachments. ed83a3f5e
- Preserved shared application documents when one application removes or replaces a file also referenced by another application. 3c9c5c8c2
Highlights
- Application Tracking is here. Track every opportunity from saved role to offer with board, table, and insights views; search, filter, sort, tag, archive, and bulk-update applications without keeping a separate spreadsheet. 893df25af, e99c1665d, 00a972155
- Application Copilot. Link a resume and job description to score your fit, create a tailored resume copy, draft a cover letter, or draft a recruiter follow-up from the application detail panel. 893df25af
- Markdown export for resumes. Export a resume as clean Markdown for docs, websites, AI workflows, or any place where plain text is easier to reuse than a PDF. 20c803e93
- A cleaner export flow. Resume and cover-letter downloads now live in a dedicated dialog, with separate PDF, DOCX, JSON, and print actions. 20c803e93
Application Tracking
- Added the application data model, API routes, database schema, migrations, and service tests for storing applications, contacts, documents, follow-ups, timeline activity, tags, sources, salaries, and stages. 893df25af, 4ae6d8476
- Added the dashboard Applications page with kanban board, table, insights dashboard, detail sheet, create/edit sheet, actions menu, file attachments, CSV import, and archived view. 893df25af, 00a972155
- Added CSV import from uploads or pasted rows, with header recognition, row validation, stage parsing, tag splitting, and importer tests. 893df25af
- Added application insights for pipeline counts, response rate, interviews, offers, funnel drop-off, weekly application volume, and source breakdowns. 893df25af, 00a972155
- Added an end-to-end Application Tracker test covering the main application workflow. af751e4f
Import & Export
- Added Markdown export support for resumes, powered by new shared resume-section and Markdown helpers so exports preserve the resume’s core structure in a portable text format. 20c803e93
- Split resume and cover-letter download behavior so each export path uses the right file and filename. 20c803e93
- Updated PDF download URL handling and export tests for the new download dialog. 20c803e93
Documentation
- Added guides for tracking job applications and importing applications from CSV, including screenshots and troubleshooting notes. 540796cd6
- Refreshed the resume export and cover-letter guides to match the new download flow. be43b455
Reliability & Performance
- Improved Application Tracker rendering, tile colors, file-attachment handling, and dashboard responsiveness. 00a972155
- Cut builder per-keystroke render cost by tightening the builder header, dock, design panel, and section form updates. 5c75147d
- Improved mobile layouts across the agent pages, builder header, dashboard resume list, and dashboard resume grid. 8416a921
- Eliminated layout shift from the homepage hero video by reserving its rendered space. be1acbc2
- Fixed server-side rendering for auth email templates by importing React where the template runtime needs it. af751e4f
Self-Hosting & Maintenance
- Added the Better Auth two-factor schema migration. 9f9268f3
- Added design-sync inputs and preview files for Reactive Resume UI components. a28e3baa, 6e7fc680
- Synced translation catalogs for the new Application Tracking and export copy. e99c1665, 0d1bfd4e
- Addressed React Doctor findings, cleaned up Knip issues, updated dependencies, and refreshed TypeScript native preview versions. 5a1cc658, 5c1845b1, 91b4c1e6
Highlights
- Undo and redo across the builder. Every change — typing, drag-and-drop, template and layout switches — can now be undone and redone with
Cmd/Ctrl+ZandCmd/Ctrl+Shift+Z, or the new toolbar buttons. Rapid typing collapses into a single step, so undo feels natural. b044b6cc - Version history with one-click restore. Reactive Resume now snapshots your resume at key moments — template switches, imports, AI edits, and periodic saves — and a new clock menu in the builder header lets you restore any earlier version. Restoring is non-destructive: it’s just another change you can roll back. b044b6cc
- An AI assistant built into the builder. A new Sparkle button opens the AI assistant as a side panel next to your resume, so you can chat about the resume you’re editing and apply changes inline without leaving the builder. Its edits show up live and are captured in version history. a1562aaa
- A real mobile and tablet builder. On phones and small tablets the builder now uses a full-screen layout with an Edit / Preview / Design tab bar, instead of a cramped three-panel desktop layout squeezed onto a small screen. d933624a
- Preview any template with your own content. Hovering a template — both the current-template card and every tile in the template gallery — now renders a live preview built from your actual resume data, so you can compare templates with your content before switching. 9d742f78
- Polished motion across the app. Menus, dialogs, tooltips, tabs, buttons, sheets, and form validation now share a consistent motion system with interruptible transitions and cleaner press feedback, so the builder and dashboard feel smoother end to end. 578a9832
Resume Builder
- Control page breaks per section. New Keep together and Start on new page options let you decide whether a section can split across pages or begins on a fresh one in the exported PDF. 155a7b27
- Move sections between pages and columns from a menu. The layout panel now has a Move to menu, so you can relocate a section without dragging. 02e1aff7
- Crop and zoom your profile picture. Choosing a picture now opens a crop step with a zoom slider and drag-to-reposition before it uploads. f4bc3e7c, f855af47
- Better zoom and page controls in the preview: a live zoom-percentage readout with Fit and 100% options, and
Cmd+0to reset. 9c5b182a - A primary Download button in the header, with a menu for PDF, DOCX, JSON, and Print. 446c1843
- Section rail navigation now scrolls to and highlights the section you pick, with proper tooltips and labels. 9bf606ae
- Autosave status and safer collaborative editing. The header shows a Saving / Saved indicator; a locked resume is read-only everywhere in the builder; and changes from another tab or the AI agent are announced and no longer overwrite the field you’re actively typing in. b082bb9f
- A live character counter and a tidier toolbar in the rich-text editor. fa4ca06e
AI Assistant
- Embedded AI assistant panel in the builder, scoped to the open resume and reusing the full agent chat, so edits apply to the resume in front of you. Requires a configured AI provider. a1562aaa
- Simpler AI provider setup. Provider settings now use a staged form — provider and API key first, advanced options collapsed — and test the connection automatically when you save. 454ccc59
- Richer assistant replies. Agent chat now renders GitHub-flavored Markdown, so tables in the assistant’s responses display as real tables instead of raw text. 82d96124
- More reliable agent edits to sections. The agent now targets built-in sections (
/sections/...) and custom sections (/customSections/...) with the correct paths, and section-shortcut paths are normalized before a patch is applied, so edits to experience, education, and custom sections land where you expect. 82d96124
Dashboard & Navigation
- You now land in the builder right after creating a resume, instead of being returned to the dashboard. 49f2c93f
- Search your resumes from the dashboard once you have more than a few. fa4ca06e
- Command palette discoverability: a Search button with a
⌘Khint in the dashboard sidebar. d10a7e5f - The Create and Import cards collapse into compact header buttons once you have resumes. fa4ca06e
- Fixed the command palette resume list so it reliably shows your resumes, sorted by most recently updated. 82d96124
Statistics
- Views and downloads trends. Each statistics card now shows a 30-day sparkline and how it compares to the previous period. 66ee23ee
Public Sharing
- A proper public resume page with an identity header (name, headline, and picture), a clear primary download action, and per-resume social / Open Graph previews, so shared links look right on LinkedIn, Slack, and iMessage. f53d2b86
Accessibility & Internationalization
- Screen-reader access to the live preview. The PDF preview now includes a hidden, structured text version of your resume so assistive technology can read it. b76eb602
- Landmarks, skip links, and accessible names across the builder and dashboard, and labels for the icon-only buttons that were previously unnamed to screen readers. d10a7e5f, 82bd14e3, c67f84fc
- A searchable language picker (by English name, native name, or ISO code) and correct handling of mixed left-to-right and right-to-left text. a41197ed
Settings & Data
- Export all of your data from the Danger Zone. 6d774cbc
- Email-verification prompts are hidden when no mail server is configured, so self-hosted instances without SMTP don’t nag you to verify. c7f77570
Import & Export
- File-first import with auto-detection. Pick a file and Reactive Resume detects the format; AI-based imports check for a configured provider up front. e586a78e
Reliability & Fixes
- Made concurrent resume writes safe by wrapping patch and statistics updates in database transactions, and fixed a version-history double-snapshot. b3f4a194
- Fixed a live-preview memory leak (image blobs weren’t released) and serialized preview renders so they don’t stack up. f005be78
- Public link previews now show your name instead of a generic “Resume” placeholder. 4da7a2e0
- Fixed the first-paint loading shell so the app reliably mounts. 47465fbb
- Used the compact brand icon on the first-paint and loading screens for a cleaner startup. 82d96124
- PDF list rendering fixes: bullet alignment and margins, nested list layout, page breaks that keep the marker with its item, and text that continues after a line break. #3202, #3198, #3178, #3186
- Kept the server running through transient Postgres disconnects (for example, idle drops from serverless Postgres providers like Neon) by handling database pool errors and reconnecting on the next query. Thanks to @helder-mattos. #3172
Localization & Maintenance
- Synced the latest translation catalogs from Crowdin. #3167, #3183
- Added a Playwright end-to-end test setup, removed dead code and unused exports, and refreshed workspace dependencies. dfd2c77b, a4999c04
Highlights
- Better multilingual PDF rendering. PDF generation now uses script-aware Noto fallback stacks for Korean, Japanese, Traditional and Simplified Chinese, Arabic, Hebrew, and Thai, so non-Latin resumes render more reliably in the live preview and exported PDFs. #3158
- Hide Link Underline setting. Resume page settings now include a dedicated Hide Link Underline option that is saved with the resume and respected by PDF templates. 5fb4976ec, #3134
Resume Builder & Rendering
- Added the Hide Link Underline page option to the builder, resume schema, default resume data, import path, and shared PDF link rendering. 5fb4976ec, 90a9bb9cf, #3134
- Fixed mixed CJK and Latin word wrapping so CJK text can still break per character without splitting Latin words letter by letter. #3136
- Added locale and content-aware PDF fallback fonts for Korean, Japanese, Chinese, Arabic, Hebrew, and Thai, while keeping CJK-specific line breaking limited to CJK scripts. #3158
- Fixed redacted resume access checks so placeholder resume data uses a non-empty name. #3138
AI, MCP & Self-Hosting
- Fixed AI resume analysis when model responses wrap JSON in Markdown code fences. #3142
- Added
FLAG_DISABLE_API_RATE_LIMITfor trusted self-hosted deployments that need to disable authentication API rate limiting, and documented it in the Docker self-hosting guide. #3149 - Fixed the MCP PDF download test mock to match the current tool behavior. #3144
Localization & Maintenance
- Synced translation catalogs from Crowdin across the app. #3132, #3135, #3148, #3162
- Updated workspace dependencies and refreshed linting/tooling configuration. 042d076ef, 37faf592b, ef5ff30b
Highlights
- Section heading icons for PDF templates. Resume section titles can now show customizable Phosphor icons in PDF output. Pick icons from the builder, hide individual section icons, or use the new page setting to hide heading icons separately from item-level icons. b932711f0
- Multicolor text highlights. The rich text editor now includes a highlight color picker with presets and custom colors. Dark highlights automatically switch marked text to white for readability, and highlight colors carry through PDF and DOCX exports. e96a51f31
- MCP PDF downloads. MCP clients can now create short-lived authenticated PDF download URLs for resumes, making agent workflows able to retrieve generated PDF exports directly. 0df7f2113
Resume Builder & Editing
- Added per-section icon pickers for summary, built-in sections, and custom section dialogs, with sensible default icons for existing resumes and a
"none"option for hiding a specific section icon. b932711f0 - Added a Hide Section Icons page option and clarified the existing Hide Icons setting so section heading icons and item-level icons can be controlled independently. b932711f0
- Replaced the single-color rich text highlight toggle with a full highlight color picker, including preset colors, custom colors, and a clear action. e96a51f31
- Synced new builder, section icon, and rich text editor labels across locale catalogs. b932711f0, 1507d869c, e96a51f31
Resume Rendering & Exports
- Added section heading icon rendering to shared PDF templates, including heading-size scaling, default icon fallbacks for legacy resume data, and support for custom sections. b932711f0
- Preserved custom highlight colors in PDF and DOCX exports, including automatic white text on dark highlight colors. e96a51f31
- Fixed experience entries with role progression so the main position and period still render in the header without repeating the period below it. 9ce5bacd2
- Fixed Custom Styles font size rules for resume icons and level indicators so those values affect actual icon dimensions in PDFs and builder previews. 1414fecad, e00ff8cec
- Fixed the Glalie template contact-list border so it stays square instead of inheriting the picture border radius. c1d11236a
MCP, API & Maintenance
- Added the
download_resume_pdfMCP tool, returning a signed PDF download URL that expires after 10 minutes. 0df7f2113 - Added the authenticated
/api/resumes/:id/pdfdownload route used by MCP PDF downloads, with no-store caching, token validation, ownership checks, and safer PDF generation errors. 0df7f2113, a8c70d784, 152279473 - Made MCP server cards, OpenAPI output, schema JSON, and server metadata use runtime-safe app version handling in development. d09ad2cdc
- Updated the release Docker workflow to purge Cloudflare cache after publishing a release image, so cached release artifacts refresh after deployment. 6852f586e
Highlights
- Custom Styles replaces Custom CSS. Reactive Resume now has a structured Custom Styles panel in the builder for fine-grained resume styling without raw CSS. Because v5 renders resumes through React PDF instead of browser HTML/CSS, Custom Styles uses safe, semantic rules that work consistently in the live preview, exported PDFs, public resumes, and server-side generation. b04eef147, c6a654191, 16f4d2c07

- Better live resume sync. The builder now handles local edits, Agent updates, MCP changes, and API updates more reliably by saving the latest resume draft and merging server metadata without losing in-progress changes. dd1e37e57
- More accessible links across the app and exports. Link handling was refreshed across web UI, dialogs, PDF preview/rendering, email, and shared UI components for improved accessibility behavior. 8da780c86
Custom Styles
- Added a new Custom Styles section to the builder’s right sidebar with target scope, style slot, style controls, and applied-rule management. b04eef147, c6a654191
- Added style rule metadata to resume data so styling can be saved with the resume and preserved during imports from Reactive Resume v4 JSON. b04eef147
- Added target scopes for All sections, Section type, and Specific section, allowing broad defaults or precise overrides for duplicate and custom sections. b04eef147
- Added semantic style slots for section containers, headings, item containers, primary and secondary text, links, icons, level indicators, rich-text paragraphs, lists, list rows, list content, inline links, bold text, and highlights. b04eef147, c6a654191
- Added structured controls for color, typography, spacing, borders, opacity, text decoration, alignment, and transforms, with empty fields falling back to the selected template. b04eef147
- Added shared PDF style-rule resolution so Custom Styles layer on top of every template and apply consistently to rich text, lists, contact items, level indicators, and template-owned section rendering. b04eef147, c6a654191
- Added focused tests for style rule schema validation, PDF style resolution, rich-text style inheritance, and the Custom Styles builder UI. b04eef147, c6a654191
Builder, Accessibility & Agent Updates
- Reworked resume draft saving so the builder queues full draft saves, retries failed saves, and avoids overwriting newer local edits when server responses arrive out of order. dd1e37e57
- Added a resume update subscription for Agent threads so resume previews can refresh when external Agent changes land. dd1e37e57
- Improved import, picture, information, resume analysis, homepage, Agent, and shared UI link behavior for better accessibility and safer rendering. 8da780c86
- Added safer PDF text style handling for links and rich text so invalid or unsupported link styles do not leak into React PDF output. 8da780c86
- Improved combobox behavior and tests used by Custom Styles and other builder controls. c6a654191, b49158263
Docs, Localization & Maintenance
- Added a full Using Custom Styles guide with screenshots, target-scope guidance, style-slot reference tables, practical examples, and notes on when to use Custom Styles instead of the broader Design, Typography, Layout, and Page settings. 16f4d2c07
- Added an architecture decision record explaining why structured Style Rules are the supported replacement for raw Custom CSS in the React PDF rendering model. b04eef147
- Added a Custom Styles header-target design note for future styling scope decisions. 7bff6644d
- Synced missing translations for Custom Styles and related builder text across locale catalogs. b49158263
- Removed React Doctor from package scripts, refreshed task dependencies in
turbo.json, and cleaned up related workspace dependency entries. 8461aa65
Highlights
- Right-to-left PDF support across all templates. Resumes in RTL locales now mirror layout, alignment, and rich text direction consistently across every PDF template, not just Rhyhorn. 24c882fa9, 266bc291e
- More reliable social login for upgraded accounts. OAuth sign-in now reconciles existing email-based accounts with legacy GitHub-linked profiles, so migrated users can sign back in without creating duplicate accounts. 86fff7237
Resume Rendering & Exports
- Added shared RTL layout helpers and a single
rtlflag on the PDF render provider, then migrated every template page to mirrored layout styles. 24c882fa9 - Fixed plain rich text rendering in PDFs by routing paragraph content through dedicated
PdfTextrenderers. 24c882fa9 - Mapped legacy
Times New Romanfont selections to the PDF-compatibleTimes-Romanfamily so older resumes keep rendering correctly. 24c882fa9 - Reduced the default vertical gap between list items in PDF templates for tighter, more readable bullet and numbered lists. 17cddbad6
- Fixed color parsing for 3-digit hex values such as
#abc, which previously failed to convert correctly in the builder. 273e17c0d
Authentication
- Added OAuth profile reconciliation that matches returning users by normalized email and legacy GitHub username/display name before creating a new account. 86fff7237
AI & Agent Workflows
- Fixed Agent thread deletion to remove attachments and mark the thread deleted before storage cleanup, preventing inconsistent database state when storage cleanup fails partway through. 7557ab13a
Docs & Maintenance
- Updated the Docker quick-start guide to use a shallow clone for faster setup. Thanks to @umairkhurshid. 75e944613
- Centralized RTL locale detection in
@reactive-resume/utils/localeand removed duplicate web-side helpers. c66560ee1 - Ran React Doctor lint passes, refreshed translations, and added dynamic imports where appropriate. 39e88dd36
- Updated workspace dependencies. 3596102c6, 6ec4da791, 7eea6675c
apps/server/dist/index.mjs. Remove OAUTH_DYNAMIC_CLIENT_REDIRECT_HOSTS,
CLOUDFLARE_ACCOUNT_ID, and CLOUDFLARE_API_TOKEN from your environment if they are still set.Local development now uses PORT=3000 for Vite and SERVER_PORT=3001 for the Hono server. This should not affect
production deployments.Highlights
- Dedicated Hono server runtime. Reactive Resume now builds a separate
apps/serverapp that mounts auth, RPC, MCP, OpenAPI, uploads, schema JSON, SEO endpoints, health checks, and the built web app from one Node.js process. ecc1fd9a8, 9033da082 - Clearer self-hosting runtime model. The Docker image now builds both
webandserver, runsnode apps/server/dist/index.mjs, and keeps/api/healthpointed at the production server port. ecc1fd9a8 - Safer Agent restore behavior. Agent edits now store a resume snapshot before applying a patch, so restoring an action can roll the draft back to the exact prior state and mark later agent patches as rolled back. d961e6535
Self-Hosting & Environment
- Added
SERVER_PORTfor local development. Vite serves the web app onPORTand proxies API, MCP, upload, well-known, and schema routes to the Hono server onSERVER_PORT. - Updated the production Dockerfile to copy
apps/web/dist,apps/server/dist, server package dependencies, and migrations into the runtime image. The production start command is nownode apps/server/dist/index.mjs. - Updated
compose.ymlto use the published image by default and load app configuration through.envinstead of embedding the main app environment block inline. - Updated
compose.dev.ymlto expose both3000and3001, add an app profile, and health-check the Hono server port. - Startup checks now run from the server process, including database migrations and local storage writability validation when S3-compatible storage is not configured.
- Removed
OAUTH_DYNAMIC_CLIENT_REDIRECT_HOSTS. Dynamic OAuth client registration now allows the app origin and loopback callbacks by default. - Added
FLAG_ALLOW_UNSAFE_OAUTH_REDIRECT_URIfor trusted self-hosted deployments that intentionally need arbitrary redirect URIs, including custom schemes, private hosts, or non-loopbackhttp://callbacks. Keep this disabled on public or multi-tenant instances. 445359ebe - Removed the documented
BETTER_AUTH_URLandBETTER_AUTH_SECREToverride path. Auth metadata, JWKS, and OAuth callback URLs are now derived fromAPP_URLandAUTH_SECRET. - Removed Cloudflare URL extraction environment variables. Live Agent web research now depends on the selected AI provider and model supporting native web search.
- Renamed the Crowdin token example from
CROWDIN_PERSONAL_TOKENtoCROWDIN_API_TOKEN.
App Runtime & Architecture
- Moved API/auth/MCP/OpenAPI/static route ownership out of the web app and into
apps/server. - Changed the web app build to a Vite/TanStack Router SPA output under
apps/web/dist, with the Hono server serving the built app and static fallback responses. - Added
robots.txt,sitemap.xml,llms.txt, structured data helpers, and server-owned SEO responses. 8fcf0ec64 - Added package-boundary rules to Turborepo and per-workspace
turbo.jsonfiles to enforce browser, server, domain, adapter, and infra ownership. - Split focused domains into new packages:
@reactive-resume/docx,@reactive-resume/mcp, and@reactive-resume/resume. - Moved development-only scripts from
packages/scriptstotoolingso workspace packages contain app/runtime code rather than private repo tooling. - Reorganized API implementation into feature-owned modules under
packages/api/src/features/*.
AI & Agent Workflows
- Replaced stored inverse JSON patches with
snapshot_dataon agent actions. Legacy actions without snapshots remain non-restorable. - Added a migration that adds
agent_actions.snapshot_dataand dropsagent_actions.inverse_operations. - Updated Agent UI and docs from “Revert” language to “Restore” language to clarify that restoring an older action rolls back that action and later applied agent patches.
- Updated Agent tool documentation to describe provider-native
web_searchbehavior instead of app-owned URL fetching. - Kept unsafe/private AI provider base URLs behind
FLAG_ALLOW_UNSAFE_AI_BASE_URL, with public HTTPS provider URLs remaining the default safe path.
Resume Rendering & Exports
- Moved browser PDF preview code into
apps/web/src/features/resume/previewand public resume viewer code intoapps/web/src/features/resume/public. - Added direct PDF.js canvas preview and thumbnail rendering through legacy PDF.js entrypoints, with tests that prevent browser preview code from importing the modern PDF.js runtime. 7cade6980
- Added explicit
@reactive-resume/pdf/browserand@reactive-resume/pdf/servergeneration adapters. - Simplified shared sidebar summary handling for PDF templates and added focused coverage for featured summary behavior. 17f351171
Docs & Maintenance
- Added new use-case docs for free, open-source, self-hosted, privacy-focused, export/share, AI, and API/MCP resume workflows.
- Rewrote contributor architecture docs around the new monorepo runtime, package ownership model, and boundary checks.
- Updated self-hosting Docker and SSO docs for the Hono runtime, removed environment variables, OAuth redirect safety, provider-native Agent web research, and local development ports.
- Added and updated architecture notes, plans, and specs for the Hono migration, monorepo reorganization, Docker tagging, manifest-only PWA behavior, unsafe OAuth redirect policy, and Agent snapshot restore design.
- Updated Knip configuration so server runtime dependencies that are imported by the built server bundle are treated as intentional dependencies.
ENCRYPTION_SECRET, and the new AI Agent
workspace also requires REDIS_URL. Agent attachments require S3-compatible storage for private objects; local
filesystem storage still works for the rest of the app, but rejects private agent attachments.Highlights
- New AI Agent workspace. Added a dedicated full-screen Agent workspace for working on isolated AI draft copies of resumes. Threads include a sidebar, chat, tool activity, file attachments, and a read-only resume preview with PDF download support. #3062

- Reviewable and reversible agent edits. Agent-applied resume patches now appear as expandable tool activity, with raw JSON Patch details, operation summaries, revert support, and clear conflict handling when the resume has changed. #3062

- Public resumes now render with PDF.js. Public resume pages now use the PDF.js-based viewer path, improving parity between the public page, builder preview, and exported PDF. #3061
AI & Agent Workflows
- Added server-side AI provider management with encrypted credentials, provider testing, and provider/model capability checks. This replaces the old local AI store and keeps AI configuration centralized. #3062
- Added Agent tools for reading resume drafts, using provider-native web search when supported, reading supported attachments, asking follow-up questions, and applying JSON Patch updates to the AI draft. #3062
- Added archive and delete actions for Agent threads, including read-only archived states, in-flight run cleanup when archiving, and ownership checks before destructive deletion. #3062
- Added attachment upload rate limits, private S3 ACLs for Agent attachments, runtime validation for streamed messages, transactional patch/action writes, and a unique message sequence index for safer Agent runs. #3062
- Added
FLAG_ALLOW_UNSAFE_AI_BASE_URLfor trusted self-hosted deployments that need private or local AI provider URLs, while still restricting provider URLs tohttporhttps. Thanks to @SirSKillz. #3059
Resume Rendering & Fonts
- Restored legacy local font names from v5.0.x by mapping them to metric-compatible bundled web fonts, preventing upgraded resumes from unexpectedly changing line breaks, page counts, or overall layout. Thanks to @JamesGoslings. #3057
- Added metric-compatible aliases for
Times New Roman,Cambria,Arial,Garamond, andCalibri, including Carlito as the Calibri-compatible target. #3057 - Improved resume preview spacing normalization and added focused coverage for the public PDF viewer and preview helpers. #3061, #3062
Self-Hosting, Docs & Maintenance
- Added a development Dockerfile plus improved Compose development services and health checks for running Reactive Resume with local dependencies. 1294d3354
- Updated self-hosting documentation for Redis, encrypted AI provider credentials, provider-native web research, private Agent attachments, S3 path-style storage, and unsafe AI base URL behavior. #3062, #3059
- Added new and refreshed guides for the AI Agent workspace, Agent tools, AI setup, builder dock, dashboard management, importing, exporting, public sharing, and private notes. #3062, affa1d664
- Removed a stale Custom CSS documentation link now that custom CSS is no longer part of the v5.1 renderer flow. #3056
- Added a Reactive Resume design system reference and updated dependencies across the workspace. #3062
Highlights
- New Scizor resume template. Added the new Scizor layout to the template lineup, including builder support, schema/docs updates, and localization strings. 00dafd0c6, 5f63dc876

- Smarter page settings in the builder. Empty sections are now hidden from page settings to reduce noise and make layout management easier. #3052
- Faster, smoother preview loading. Improved resume preview loading behavior and added focused tests for preview components. 92a0e3ddb
Resume Builder & PDF Export Fixes
- Increased header name line height in PDF templates to prevent descender clipping. #3050
- Improved CJK rendering reliability across PDF output, including better handling of hyphenation callbacks and italic fallback behavior. 62b0a1d53, 83a407bc1, 33103536a, 64ac3ff32
- Fixed split-row right-side content promotion behavior to preserve layout consistency in exports. #3039
- Improved rich text and section data handling by filtering invalid or empty items and tightening schema validation for safer rendering. 334ea48bc, 0713cf20d, 4ebe9e5a6
Quality, Docs & Maintenance
- Expanded automated coverage significantly, including monorepo-wide unit/component tests and an additional ~500 tests across core packages. 6a01207b6, #3038
- Migrated the test environment from jsdom to happy-dom for faster and more stable test runs. 7a60a42a0
- Updated documentation and defaults, including AGENTS guidance and export format notes. #3054, 71aadbd73, a93e7bd19
- Synced translation catalogs from Crowdin and added template-specific translation updates for Scizor. #3053, e574d4005, #3026, #3023, c5787fe15
- Updated dependencies and repository cleanup tasks, including PostCSS refresh and Knip fixes. e35ff8391, 3cd228bd8, 978cbaf1f, 0daf868cd
LOCAL_STORAGE_PATH=/app/data and validates that the directory is writable at startup. If you override the container environment, keep LOCAL_STORAGE_PATH pointed at an absolute writable path.Highlights
- AI Resume Assistant. Added a chat window inside the resume builder for targeted resume edits. The assistant can draft JSON Patch proposals, show before/after previews, and lets you accept or reject each change before anything is applied. #3022
- Better CJK PDF output. Added automatic CJK fallback font registration so Chinese, Japanese, and Korean text renders correctly in both the live PDF preview and exported PDFs. #3016
Resume Builder & Exports
- Added a builder dock shortcut for the AI assistant, with a draggable and resizable desktop window plus a mobile sheet layout. #3022
- Added review controls for AI-generated proposals, including proposal queues, raw JSON Patch inspection, accept/reject actions, and stale-proposal handling when the resume changes. #3022
- Fixed rich text PDF rendering when text blocks contain top-level inline content around lists or paragraphs. 42e83cc6
- Kept Latin-only PDF output unchanged while applying fallback fonts only when CJK glyphs are needed. #3016
Sharing & Imports
- Fixed public resume URLs returning a server error when the owner-only dashboard title was redacted to an empty string for viewers. #3012
- Improved v4 JSON imports so custom section content, hidden items, and skill/language levels migrate correctly into v5 resumes. #3013
Self-Hosting
- Fixed Docker local-storage health checks by resolving the data directory through
LOCAL_STORAGE_PATHinstead of relying on the runtime working directory. #3004 - Added startup validation for the local storage directory so misconfigured volume permissions fail early with a clearer error. #3004
- Updated
.env.example, the Dockerfile, Compose configuration, and Docker self-hosting docs for the new local storage path behavior. #3004
Maintenance & Localization
- Synced translation catalogs from Crowdin. #3005
- Updated dependencies and lockfile entries needed for the AI assistant, PDF rich text normalization, and related test coverage.
Highlights
- Free-form resume pages. Added a new Free-form page format for resumes that should keep A4 width while allowing content to flow beyond a fixed page height. This is useful for long-form web-style resumes while preserving predictable export sizing. #2991
- PDF downloads through the API. Added an authenticated
GET /resumes/{id}/pdfendpoint so API clients can generate and download a resume PDF directly. The OpenAPI spec has been updated with the new route. 5042ad9d
Resume Builder & Exports
- Fixed nested lists in PDF rendering so rich text with sub-lists exports correctly. #2993
- Fixed inline item links in exported PDFs and made resume links consistently underlined. #2978
- Added italic font registration for PDF generation and falls back to IBM Plex Serif when a selected font is unavailable. 6d54ffa8, 4c771307
- Improved header name line height across templates for cleaner PDF output. #2976
- Added prose styles to the rich text editor so formatted content is easier to read while editing. #2984
- Added a preview control to toggle page stacking and adjusted the default preview zoom for a better builder canvas experience.
Fixes
- Fixed a runtime error when enabling two-factor authentication. #2981
- Fixed excessive re-renders in the Experience section when editing role progression. #2983
- Removed route preloading to avoid unwanted route work while navigating the app. #2949
- Relaxed resume data parsing to accept compatible objects with additional fields. #2793
- Updated dialog layout behavior so tall dialogs scroll correctly on smaller screens.
- Updated the sample resume picture URL to point to a valid bundled image.
Self-Hosting
- Automatically loads
.envfrom the workspace root for server-side code, improving local and self-hosted configuration behavior. #2987 - Restored the local storage path to
/app/datain the official container image and clarified the Docker storage documentation. #2990
Maintenance & Localization
- Synced translation catalogs from Crowdin. #2995, #2997
- Removed unused dependencies, stale generated cache artifacts, and obsolete tests from the repository.
- No more Browserless / Chromium dependency. From v5.1.0 onwards, you do not need to run a
printer, Browserless, or headless Chrome service alongside Reactive Resume. PDF generation is now performed entirely in your browser via@react-pdf/renderer. TheBROWSERLESS_TOKEN,PRINTER_ENDPOINT,PRINTER_APP_URL, andFLAG_DEBUG_PRINTERenvironment variables are no longer read and can be removed from your.env. - Database migrations. This release ships several new schema migrations to bring the resume model up to date. They run automatically on container start, but you should back up your PostgreSQL database before upgrading in case rollback is needed.
- Custom CSS has been removed. Because the resume PDF is no longer produced by a headless browser, raw CSS no longer applies to the exported document. A first-class template-customization story is on the roadmap for a future release.
- Job Listings has been removed. The JSearch/RapidAPI-backed job listings feature and its settings were removed in the v5.1.0 transition. The old job-search settings path now redirects to Integrations. To tailor a resume, paste a job description into the AI Agent; see Using the AI Agent workspace.
Highlights
- PDF generation moved fully client-side.
@react-pdf/renderernow produces the exported PDF directly in your browser, and the in-builder live preview is rendered withpdfjs, so what you see in the preview is exactly what you’ll download. - All resume templates re-ported. Azurill, Bronzor, Chikorita, Ditgar, Ditto, Gengar, Glalie, Kakuna, Lapras, Leafish, Meowth, Onyx, Pikachu, Rhyhorn, and Scizor have all been re-implemented on the new renderer with section-by-section parity.
Resume Builder
- Pixel-accurate live preview. The builder preview is now rendered with
pdfjsagainst the same document tree used for export, eliminating the long-standing “looks fine in the preview but breaks in the PDF” class of bugs. - TanStack Form everywhere. All 35 form-bearing surfaces in the app — login, register, forgot-password, resume sections, settings, and dialogs — have been migrated to TanStack Form.
react-hook-formand@hookform/*packages have been removed. - TanStack Query is the single source of truth for resume state. The previous standalone Zustand resume store has been retired; optimistic updates, refetching, and error recovery now flow through one cache, behaving consistently across tabs and reloads.
- Native page format and margins. Page size and margin controls are now expressed directly to
@react-pdf/renderer, replacing the Puppeteer-specificprintMarginTemplatesworkaround.
Self-Hosting
- One-service deployment. Self-hosted Compose files no longer need a
printer:service block. The minimum stack is now just Reactive Resume + PostgreSQL (with optional S3-compatible storage and SMTP). /api/healthsimplified. The health endpoint now reportsdatabaseandstorageonly, returning HTTP503if either dependency is unhealthy. There is no longer aprinterfield to monitor.- Updated documentation. The Self-Hosting, Quickstart, Development, Architecture, and Legal pages have all been refreshed to describe the simplified single-service deployment.
Authentication & AI
- Better Auth retained end-to-end with all nine plugins — passkeys, two-factor authentication, OAuth (Google / GitHub / LinkedIn / custom), API keys, dynamic OAuth client registration, dashboard, sentinel, and admin. Existing sessions and logins carry over after the upgrade.
- AI features carry over (Resume Analysis, AI Chat with JSON Patch tool calls, PDF / DOCX import) with the same provider matrix (OpenAI, Google Gemini, Anthropic, Ollama, OpenRouter). The AI router and service layer have been cleanly decoupled from the jobs / tailor flow for a more modular surface.
Removed
- Custom CSS option in the resume builder. With rendering bound to
@react-pdf/renderer, raw CSS no longer applies to the exported PDF. A structured customization API will return in a future release. PRINTER_*andBROWSERLESS_*environment variables, theprinter/{resumeId}route, thegetByIdForPrinterserver function, and the printer-token signing code are all gone.
Maintenance
- Removed dead printer-token utilities and the legacy public RPC surface for printer-only resume reads.
- Tightened the boundary between server-only and client-only code: server modules (database, storage, auth) are lazy-imported so they no longer leak into the client bundle.
- Reverse-proxy timeout guidance in the nginx example has been simplified now that no long-running PDF generation request flows through the proxy.
Features & Improvements
- Added the new Meowth resume template (compact ATS-friendly layout with an inline three-column entry header), thanks to @JamesGoslings. #2923
- Added support for custom icon colors on section items, thanks to @Ruzenie. #2928
- Improved account-related email UX with better templates for password reset and email verification. b87f2007
- Consolidated separate settings pages into a single Integrations page. 5d8126d4
Fixes
- Added a targeted Chinese localization fix for the
Skillssection title (zh-CN). #2931 - Allowed MCP localhost loopback only for local MCP clients, improving local integration behavior while keeping external access restrictions intact. 623ca5c6
Maintenance & Localization
- Updated dependencies and lockfile, including cleanup of unused exports (Knip). e1bccbcc
- Synced translation catalogs from Crowdin. #2922, #2925, #2926, #2932, #2934, #2935
- Updated docs to list Meowth alongside existing templates. #2929
Highlights
- Added OpenRouter as an AI provider, thanks to @iagodemacedo. #2906
- Added Chinese font options, thanks to @Platinum1154. #2905
- Added text color support to the rich text editor, including DOCX export handling for colored text, thanks to @Platinum1154. #2903
- Fixed MCP tool names for Claude Desktop compatibility. #2885
- Improved Docker-based local development support and refreshed self-hosting setup guidance. 849aad64, c0387298
Fixes & Security
- Thank you to @shaxbozaka for running a security audit on Reactive Resume and helping make the app more secure.
- Hardened auth, OAuth, AI URL validation, printer/export endpoints, resume access controls, Browserless configuration, and public route exposure. a42dbcd4
- Removed the public RPC surface for the printer-only resume fetch endpoint by moving it behind a server function, further shrinking the attack surface for
getByIdForPrinter, thanks to @shaxbozaka. - Corrected Computer Modern Sans italic font file mappings, thanks to @russellbrenner. #2881
- Improved email handling and user lookup in OAuth configuration, thanks to @VedantBhawsar. #2874
- Aligned role period text in experience items, thanks to @JamesGoslings. #2908
- Reduced resume preview wheel zoom sensitivity, thanks to @GoldenSection0618. #2911
- Prevented orphaned section headings at page breaks, thanks to @5queezer. #2851
- Added top margin handling for subsequent PDF pages, based on feedback from @trigger-xyz. bbc38d2f
Maintenance & Localization
- Updated dependencies and lockfile, including security-focused package pins and Vite+ version pins. c6e8df0a, 847d69b6, 9b3916d4
- Added
SECURITY.md. 9e1e593d - Added focused tests for auth, printer/export, URL validation, form edge cases, rich text DOCX output, font handling, and CSS sanitization hardening. d0af9f4b
- Synced translation catalogs from Crowdin and moved syncing to GitHub Actions. #2886, #2918
New Contributors
- @russellbrenner, @VedantBhawsar, @JamesGoslings, @GoldenSection0618, @iagodemacedo, and @Platinum1154
Features & Improvements
- Added Resume Analysis in the resume builder right sidebar: run an on-demand AI review for an overall score (0 to 100), a dimension scorecard, strengths, and prioritized suggestions. Results are saved per resume and reload after refresh.
- When AI features are disabled, the analysis section shows a short notice with a link to AI Settings so you can enable your provider and model first.
- Improved the MCP server experience: updated tools, resources, and prompts; added an MCP server card at
/.well-known/mcp/server-card.jsonfor compatible clients; refreshed the Using the MCP server guide.
Fixes
- Fixed #2865, incorrect spacing between resume section items in shared layouts.
- Fixed #2868 affecting resume item presentation and linked titles in shared item components.
Maintenance & CI
- Downgraded the Cosign installer action to v3 in the Docker build workflow for more reliable image signing.
- Synced translation catalogs from Crowdin. #2864
- Dependency and lockfile updates (including changes bundled with MCP and analysis work).
Features & Improvements
- Updated shared resume item layouts (Experience, Education, Awards, Certifications, Publications, References, Volunteer) for better alignment and spacing consistency.
- Generated printer pages now set a meaningful document title from the resume owner’s name (
<Name> - Resume) for cleaner PDF metadata and tab titles. #2863
Fixes
- Fixed #2733, where date ranges could appear on a separate line unexpectedly in resume items. #2862
- Adjusted Experience section form field ordering/labels so
Location,Position, andPeriodare mapped and displayed correctly.
Maintenance & Localization
- Synced translation catalogs across all supported locales.
- Updated dependencies and lockfile, including AI SDK, TipTap, TanStack Query, and Vite+ package aliases.
Features & Improvements
- Added LinkedIn sign-in support for self-hosted instances, including sign-in on the auth page and account linking in settings.
- Improved the sign-in experience by showing loading placeholders while social login providers are being fetched.
- Resume builder panel sizes are now persisted more reliably, making the layout feel more consistent between sessions.
- Added clearer labels for resume sorting and filtering controls on the dashboard.
Fixes
- Improved autosave reliability in the resume builder:
- Unsaved edits are flushed before page unload.
- You now get a clear persistent warning if changes fail to save (for example, due to network issues).
- Strengthened authentication defaults by increasing the minimum password length requirement to 8 characters.
- Improved reliability around resume deletion and server-side error handling for create/update operations.
- Fixed a rare language mix-up during printing/export when multiple print jobs run at the same time, so each PDF/screenshot now reliably uses the correct locale.
- Improved print stability under heavy usage by reusing in-progress PDF and screenshot generation requests for the same resume instead of starting duplicate jobs.
- Hardened printer token signing and token/session/API-key verification paths for better security.
- Improved resilience in AI tailoring output parsing and JSON Resume import normalization.
- Printer service now provides descriptive error messages (“Failed to generate PDF” / “Failed to capture screenshot”) instead of generic internal server errors.
- Job descriptions in the job detail sheet now render HTML formatting (headings, lists, bold text) instead of showing raw tags.
- Fixed the “Tailor Resume” button being incorrectly disabled when AI is not configured — the dialog already supports plain resume duplication as a fallback.
- Fixed the tailor resume flow to open the resume builder in a new tab while keeping the job listing open for reference, instead of navigating away and auto-opening the application page.
- Apply option links in the job detail sheet are now validated before rendering, preventing malformed or potentially unsafe URLs.
- Improved job card loading skeletons to match the actual card layout (logo, title, badges).
- Centered the “Configure Job Search” empty state on the page.
- Extracted the
JobCardcomponent into its own file for better code organization.
Docs & Localization
- Updated self-hosting and environment variable documentation to include LinkedIn OAuth configuration.
- Synced translations across locales for the latest authentication and save-status messaging.
Features & Improvements
- Added Job Listings with AI-Powered Resume Tailoring, a major new feature that integrates job search (via JSearch API) directly into the dashboard with AI-driven resume tailoring to match job descriptions. #2788
- Search for jobs with filters for location (city, state, country), employment type, remote status, and more.
- View detailed job listings in a slide-out panel with apply links and tags.
- Tailor your resume to a specific job posting using AI — rewrites skills, experience, and references for optimal fit.
- Per-user API quota management with usage tracking in settings.
- Pagination with 30 results per page.
- Added DOCX resume export — generate and download tailored resumes as Word documents. #2788
- Migrated the entire project toolchain to Vite+ (
vpCLI), unifying Vite, Vitest, Oxlint, and Oxfmt under a single developer experience. - Migrated from Biome to Oxlint/Oxfmt for linting and formatting, with a new autofix CI workflow. #2822
- Added Slovenian locale support.
- Added a new
ProgressUI component.
Fixes
- Fixed type issues in auth client and configuration.
- Used RTL-friendly CSS classes across the app for improved bidirectional layout support.
- Removed dead code and unused imports.
- Updated route tree generation and added
routeTree.gen.tsto.gitignore. - Improved animation performance with
willChangestyles on animation components.
Maintenance & Dependencies
- Updated dependencies across the board, including
@typescript/native-preview,vite-plus, and others. - Added database migrations for missing indexes.
- Synced translations from Crowdin. #2820, #2824
- Updated French translation for ‘Volunteer’ to ‘Bénévolat’. #2823
- Multiple translation and language updates across all locales.
New Contributors
- @lukadfagundes
- @Hephaisto-dev
Features & Improvements
- Refactored the component system to
@base-ui/reactacross the app for standardized UI behavior (dialogs, menus, accordions, comboboxes, switches, etc.). - Improved auth infrastructure with Better Auth dashboard/sentinel integration and expanded IP/header handling for proxied deployments.
- Added a dedicated
src/server.tsserver entry usingFastResponsefor better runtime compatibility. - Sidebar button list now scrolls internally on overflow.
Fixes
- Printer endpoint now resolves to IP when using chromedp, improving compatibility with proxied deployments.
- Switched OpenAI integration to
chat/completionsfor resume import and AI features. - AI PDF/DOCX resume parsing is now more reliable via direct file send (multimodal input).
- Resume import normalization hardened: section defaults merged, required fields enforced, missing IDs/flags autogenerated.
- Fixed UI migration regressions (accordion behavior, button interaction, right sidebar scrollbar).
- Fixed multi-page PDF crashes and Gemini API ingestion errors.
- Fixed role title styling, role spacing, and issues with skills item rendering and template headings.
Maintenance & Dependencies
- Updated dependencies and lockfile.
- Synced translation strings across locales, including multiple contributions from Crowdin.
- General dependency and code style improvements, plus removal of redundant indexes and plugins.
New Contributors
- @yang-summer
- @FrancocDev
- @obitton
- @jondycz
Fixes
- Show section titles for summary-type custom sections in the resume builder. #2744
- Prevent browser password managers and Edge autofill/save prompts from appearing on AI settings API key fields. #2719
- Replace deprecated Tailwind CSS classes: use
inset-s-*/inset-e-*instead ofstart-*/end-*. - Fix PDF downloader to work correctly in offline mode. #2743
- Make bold formatting visible for
<strong>in the resume rich text editor (uses plainfont-weight: boldfallback if the CSS variable is unset). Fixes #2730 - Prevent credentials sign-in from dropping
session_tokenSet-Cookie, improves login reliability. #2718 - Remove redundant
resume-prefix from download filename; add spacing between pages in shared view. #2709 - Normalize autocomplete tokens for login and register forms. #2714
- Fix improper chips reordering and update dependency/translations. #2711
- Fix clipping of heading in Lapras resume template.
- Remove error-causing plugins in oRPC integration.
- Remove duplicate database indexes; add index for
created_aton user and resume tables.
Features & Improvements
- Added feature flag:
FLAG_DISABLE_IMAGE_PROCESSING(allows disabling image processing site-wide). - Updated Discord invite link in the app and documentation.
- Added codebase and architecture documentation in
CLAUDE.md. - Synced latest translations from Crowdin (multiple language updates and additions).
Maintenance & Other
- Refactored auth utility from
originWithtowithHostnameto preserve localhost/127.0.0.1 sibling trust. - Updated dependencies and improved code style.
- Updated documentation and README files.
Features & Improvements - Added Computer Modern web fonts to the font selector, allowing users to choose from
LaTeX-style “Computer Modern” fonts for a classic scientific look. - Updated dependencies to the latest versions.Fixes - Removed Passkey support from the authentication system due to provider compatibility issues. - Updated
dependencies to the latest versions.Features & Improvements
- Introduced a new MCP (Model Context Protocol) server for managing and editing resumes from MCP-compatible AI tools (Claude Desktop, Cursor, Codex, and others). Supports listing, reading, creating, deleting, locking/unlocking, and patching resumes via natural language. (guide)
- Added an AI Chat panel to the resume builder, allowing conversational resume modifications through tool-calling (JSON Patch operations applied to the resume in real time with visual feedback).
- Added a system prompt and
patch_resumetool for structured, minimal-diff resume edits via RFC 6902 JSON Patch. - Chat history is now persisted per resume in localStorage.
Fixes
- Fixed rendering issues in the Lapras and Onyx resume templates.
- Improved Combobox and ScrollArea UI components.
- Fixed skills item rendering in shared resume components.
- Updated authentication configuration and route handling.
- Updated JSON Schema to match the latest resume data model.
Maintenance
- Updated dependencies to latest versions.
Features & Improvements
- Implemented Atomic Resume Patching API for fine-grained, partial updates to resumes via a new PATCH endpoint. #2692
- API endpoint
PUT /resume/{id}now returns the updated resume object rather than void, with explicit DTOs for input/output. #2688 - Added error logging for API server errors (server-side only) to improve debugging and reliability.
- Refactored and cleaned up imports/exports for clarity and maintainability.
- Added
.devcontainerconfiguration for improved contributor development environment. - Added build status badge and documentation link to README.
Fixes
- General bug fixes and minor improvements.
- Synced latest translations from Crowdin (notably: French, other languages).
- Updated dependencies to latest versions.
Features & Improvements
- Implemented Cover Letter functionality as a custom section in the resume builder. (link)
- Added full-screen mode to the rich text editor for distraction-free writing.
- Introduced a new custom section type:
summary, enabling users to add extra summary sections. - Added
useFormBlockerhook to prevent dialogs from being closed with unsaved form changes.
Fixes
- Fixed keyword spacing issue in the interests section. #2631
- Fixed AI connection test and improved error reporting for AI provider issues.
Features & Improvements
- Brought back Undo/Redo functionality in the resume builder for an improved editing experience.
- Sidebar builder now arranges dynamically based on the section type in each template. #2564
- Added PWA (Progressive Web App) support and updated PDF example file links in documentation.
Fixes
- Removed extra spacing when proficiency is empty. #2607
- Fixed Pikachu template: header/page picture rendering, and respect for
fullWidthproperty. - General template improvements for layout and rendering consistency.
- Fixed GitHub OAuth login for users migrated from previous versions.
- Improved printer service communication and reduced resource usage for more reliable PDF generation.
- Fixed “empty” Git merge remnants in codebase.
Maintenance
- Synced translations from Crowdin (Afrikaans, Persian, Portuguese/Brazilian, others).
- Updated translation sources and configuration.
- Updated package dependencies and fixed self-hosting guide links in README.
- Removed dead code and updated screenshots.
- Other bug fixes and minor improvements (#2542, #2573, #2598).
Features & Improvements
- Added support for printing Free-Form PDFs (no fixed page height), allowing for custom-fit page content. (link)
- Allow overriding the default endpoint for all AI providers, not just Ollama; default endpoint now visible in AI settings.
- Updated the chip input component: supports adding, editing, removing, and reordering keywords for skills and other sections.
- Improved RTL support across the app, thanks to @obreo. (link)
Fixes
- Updated translation configuration to remove line numbers, reducing unnecessary diffs.
- Homepage video optimized for faster loading without quality loss.
- Increased screenshot TTL for resumes to reduce unnecessary regenerations.
- Updated dependencies and translations to latest versions.
Features & Improvements
- Added an agent skill
skills/resume-builderfor agentic AI assistants, enabling resume construction through conversational AI. - Added a guide for how to fit content on a page when exporting to PDF. (link)
- Alert user when content is too tall for a page for easier export troubleshooting.
Fixes
- Ditgar template now respects
fullWidthsetting. - Updated JSON Schema for proper format.
- Updated Discord server invite link.
- Updated dependencies to latest versions.
Maintenance & Fixes - Updated translations from Crowdin. - Added Community Spotlight section to the documentation.
- Removed
-r require-metadatafrom the Dockerfile (was not needed). - Fixed inconsistencies in Docker compose documentation examples. - Fixed username validation to allow hyphens. - Fixed issues with the printer service’s screenshot and PDF endpoints.
- 2 new resume templates: Ditgar and Lapras
- Passkeys for authentication
- Entirely new user interface and refreshed design
- API access and reference docs
- AI Integration with OpenAI, Google, Anthropic, and Ollama
- Improved font selector with real-time preview
- Expanded and improved documentation, with more how-to guides
- Redesigned template gallery with detailed views
- Resume import from PDF/DOCX (requires AI Integration)
- Stronger infrastructure for better reliability and scalability
- Drag-and-drop for moving items between sections and pages
- New CSS Editor with autocompletion and highlighting
- Custom sections now support typed extension for finer control
- Icon style selector for indicators (stars, circles, custom, etc.)
- Sidebar width adjustment and full-width page support