v1.3.0

srbhr/Resume-Matcherv1.3.0Sep 6, 2026by srbhr

AI Summary

Crescendolls integrates resume creation, application tracking, and interview preparation into a unified workflow. This release introduces a guided resume wizard, new templates, and expanded AI provider support, alongside significant reliability updates and a migration to SQLite with encrypted API keys.

Key Highlights

  • Guided resume wizard for building resumes from scratch
  • Application tracker and interview preparation tools
  • Three new templates: LaTeX, Clean, and Vivid
  • Reliability improvements including upload recovery and consistent failure handling
  • Security update addressing CVE-2026-67213 in NanoID

Breaking Changes

  • Migration to SQLite storage with encrypted API keys; existing encrypted keys require their original secret to decrypt
  • Requires Node.js 22+ and Python 3.13+ for source installs
  • Back up persistent data directory before upgrading to prevent data loss

New Features

  • Guided resume wizard with draft saving capabilities
  • Application tracker for organizing jobs and recording notes
  • Interview preparation tools using resume and job description
  • Three new templates: LaTeX, Clean, and Vivid
  • Expanded language support including French and Korean interfaces
  • New AI options: Groq, Azure AI Foundry, and OpenAI-compatible servers
  • Custom prompts for cover letters and outreach messages
  • Improved PDF reliability and concurrent export handling

Full Release Notes

# Resume Matcher 1.3 — Crescendolls

Crescendolls brings resume creation, tailoring, application tracking, and interview preparation into one workflow. It also strengthens the steps you depend on most: uploading a resume, saving your work, applying AI suggestions, and exporting a PDF.

Named after **Crescendolls** from Daft Punk’s *Discovery*, this release continues the v1 series after **1.2 Nightvision**.

## What’s new

### Build a resume from the beginning

The guided resume wizard helps you turn your experience into a resume through an adaptive conversation. Save a draft, return to it later, and continue refining the result in the builder.

### Follow the application through

The application tracker gives you a board for organizing jobs, recording notes, and keeping applications connected to tailored resumes. Interview preparation helps you prepare for the next step using your resume and the job description.

### More control over your resume and AI

- **Three new templates:** LaTeX, Clean, and Vivid.
- **More language support:** French and Korean interfaces and improved Chinese, Japanese, and Korean PDF rendering.
- **More AI options:** Groq, Azure AI Foundry, and OpenAI-compatible servers, reasoning controls, and custom prompts for cover letters and outreach messages.
- **Clearer tailoring feedback:** expanded score breakdowns and improved job-description skill alignment across more resume sections.

## More dependable, from upload to export

This release includes a reviewed reliability update spanning 17 pull requests and 44 tracked issues.

- **Recover interrupted uploads.** Retain the identity of a saved resume when its response is interrupted, and handle empty or invalid documents more clearly.
- **Keep useful work.** Improve draft recovery, save behavior, preview confirmation, and handling of partial AI results.
- **Handle failures consistently.** Bound AI operation times and retries, improve malformed-response handling, and provide clearer error messages.
- **Preserve resume content.** Strengthen checks around original information and recognize Latin skill names beside Chinese, Japanese, and Korean text.
- **Improve PDF reliability.** Handle concurrent exports, cancellation, and browser shutdown while retaining ownership of resources still in use.

The reliability stack preserves 124 individual commits. Its [review evidence and file map](https://github.com/srbhr/Resume-Matcher/blob/v1.3.0/docs/agent/architecture/hosted-review-corrections.md) are included in the repository.

## Security update

This release includes the security bump merged in [PR #993](https://github.com/srbhr/Resume-Matcher/pull/993): **NanoID 3.3.16 → 3.3.18**.

The update addresses [CVE-2026-67213](https://github.com/advisories/GHSA-2v37-7h3g-55p8), where a custom ID generator could loop indefinitely when asked for a zero-length ID.

## Upgrading from 1.2

**Stop the application and back up the complete persistent data directory before upgrading.** This release moves storage to SQLite and stores provider API keys encrypted at rest. On startup, it imports a legacy TinyDB database when SQLite is empty and migrates legacy saved keys.

Keep the database, `config.json`, uploaded files, and the hidden **`.secret_key`** together. Existing encrypted keys need their original secret to be decrypted. Retain your pre-upgrade backup if you need to return to 1.2; the migrated SQLite database cannot replace the old version’s database.

For source installs, use **Node.js 22+** and **Python 3.13+**, then reinstall dependencies following the README. For Docker upgrades, preserve your existing data volume when recreating the container.

## Docker images

Release tag: **`v1.3.0`**. Versioned images are available for Linux **amd64** and **arm64** on GHCR and Docker Hub:

```bash
docker pull ghcr.io/srbhr/resume-matcher:1.3.0
# or
docker pull srbhr/resume-matcher:1.3.0
```

The image tags are `1.3.0` and `1.3`. [Release-tag publication](https://github.com/srbhr/Resume-Matcher/actions/runs/34024360782) succeeded, and both tags were verified publicly on both registries.

## Verification

The release preparation passed **1,067 backend tests** and **500 frontend tests**, plus lint, type checking, and a production build. The suite includes real Chromium controls. Two optional paid-provider evaluations were excluded.

## Thank you

Thank you to everyone who contributed code, reported bugs, tested fixes, and reviewed this release. The complete contribution history and first-time contributors are listed below.

**Contributors to this release:** @AbdullahFageeh, @chadidi, @Dessalines39394, @Frankli9986, @gingeekrishna, @godson-plt, @GwIhViEte, @icemc, @lbagnascom, @LongD1stanceRunner, @luochen211, @moduvoice, @mohdazmi03, @MRDGH2821, @NightingaleCen, @RedMoonnn, @sahayagodson, @spsilu, @srbhr, @thmsmtylr, @wwlwgo.

Automation contributions are credited to @dependabot and @oz-agent.


<details>
<summary>All changes and first-time contributors</summary>

## What's Changed
* chore(deps): bump litellm from 1.81.8 to 1.83.0 in /apps/backend by @dependabot[bot] in https://github.com/srbhr/Resume-Matcher/pull/735
* chore(deps): bump vite from 7.3.1 to 7.3.2 in /apps/frontend by @dependabot[bot] in https://github.com/srbhr/Resume-Matcher/pull/738
* chore: extract portable docs and remove unused AI tooling by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/741
* chore(deps-dev): bump brace-expansion transitive deps by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/744
* frontend ui audit follow-up: perf, a11y, tokens, copy, polish by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/742
* fix(docker): make frontend accessible for PDF generation by @chadidi in https://github.com/srbhr/Resume-Matcher/pull/724
* chore(deps): bump next from 16.1.7 to 16.2.3 in /apps/frontend by @dependabot[bot] in https://github.com/srbhr/Resume-Matcher/pull/748
* chore(deps): bump python-multipart from 0.0.22 to 0.0.26 in /apps/backend by @dependabot[bot] in https://github.com/srbhr/Resume-Matcher/pull/752
* chore(deps): bump dompurify from 3.3.3 to 3.4.0 in /apps/frontend by @dependabot[bot] in https://github.com/srbhr/Resume-Matcher/pull/753
* Bun compatibility + PyProject script by @MRDGH2821 in https://github.com/srbhr/Resume-Matcher/pull/755
* Bun compat + `uv run app` script + LiteLLM reasoning hardening (#747, #751 partial) by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/756
* Dev fixes: Settings error overflow, openai_compatible provider, custom feature prompts (#754, #751, #749) by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/757
* fix(frontend): remove invalid turbopackUseSystemTlsCerts flag to unblock Docker Publish by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/758
* fix(llm): conditionally pass temperature based on model capability by @Frankli9986 in https://github.com/srbhr/Resume-Matcher/pull/773
* test(backend): cover config settings flows by @AbdullahFageeh in https://github.com/srbhr/Resume-Matcher/pull/771
* fix(parser): prevent JSON truncation by clamping tokens to model limit by @mohdazmi03 in https://github.com/srbhr/Resume-Matcher/pull/770
* chore(deps): bump litellm from 1.83.0 to 1.83.7 in /apps/backend by @dependabot[bot] in https://github.com/srbhr/Resume-Matcher/pull/764
* chore(deps): bump python-dotenv from 1.2.1 to 1.2.2 in /apps/backend by @dependabot[bot] in https://github.com/srbhr/Resume-Matcher/pull/761
* fix(llm): resolve DeepSeek 500 / Failed to analyze resume by @Frankli9986 in https://github.com/srbhr/Resume-Matcher/pull/775
* fix(deps): pin python-dotenv to 1.0.1 to satisfy litellm (#779) by @NightingaleCen in https://github.com/srbhr/Resume-Matcher/pull/780
* Remove repeated def for _appears_truncated by @lbagnascom in https://github.com/srbhr/Resume-Matcher/pull/787
* [codex] Add verifier-led resume tailoring loop by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/789
* fix(frontend): show timeout-specific error instead of misleading API key message by @Frankli9986 in https://github.com/srbhr/Resume-Matcher/pull/795
* feat: Add Groq LLM provider support by @Frankli9986 in https://github.com/srbhr/Resume-Matcher/pull/774
* fix(upload): reject resumes with empty extracted text by @Frankli9986 in https://github.com/srbhr/Resume-Matcher/pull/794
* chore(deps): bump next from 16.2.3 to 16.2.6 in /apps/frontend by @dependabot[bot] in https://github.com/srbhr/Resume-Matcher/pull/802
* chore(deps): bump litellm from 1.83.7 to 1.83.10 in /apps/backend by @dependabot[bot] in https://github.com/srbhr/Resume-Matcher/pull/801
* fix(deps): patch 5 security advisories (python-multipart, python-dotenv, postcss, brace-expansion) by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/816
* fix(i18n): add missing tailor.errors.timeout translation (es, ja, pt-BR) — fixes Docker build by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/817
* docs(claude): add app-level CLAUDE.md context files (backend + frontend) by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/818
* docs(i18n): document Portuguese (pt) locale in i18n.md by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/819
* test: testing initiative — backend (pytest+evals) & frontend (vitest) coverage, local pre-push gate, context docs by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/820
* fix(resumes): improve/confirm rejects valid tailorings for non-schema-complete resumes (preview/confirm hash mismatch) by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/824
* feat(e2e-monitor): agentic end-to-end monitor — drive the real app, judge output/render/provider vs a golden baseline (report, never a gate) by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/823
* fix(improver): reorder skill changes silently dropped — accept list 'original' by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/825
* feat(e2e-monitor): narrate the full loop + AI-agent handoff in the CLI by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/826
* fix(tailor): expand diff scope + preserve casing (#805); e2e-monitor JD-keyword tolerance by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/827
* fix(config): clearing Base URL persists null, not a stale value (#760) by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/829
* fix(pdf): deterministic render wait + generic error; contain error modal (#799 #808 #811) by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/828
* fix(improver): salvage skill reorder instead of dropping it wholesale (#736) by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/830
* feat(prompts): JD-keyword incorporation as the default across all sections (truthful reframing) by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/831
* fix(builder): preserve Enter newlines in Additional Info textareas (#763) by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/834
* feat(timeout): configurable improve/request timeout across all 3 layers (#776) by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/833
* fix(deps): bump vitest 4.0.18 → 4.1.8 (CVE-2026-47429, Dependabot #224) by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/835
* fix(editor): stop duplicate tiptap link/underline extension warnings by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/837
* test(backend): green the suite + cover the untested I/O surface by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/839
* feat(templates): add LaTeX, Clean, and Vivid résumé templates by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/840
* feat: SQLite data layer, encrypted multi-provider API keys & Kanban application tracker by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/841
* chore(deps): bump cryptography from 46.0.3 to 46.0.7 in /apps/backend by @dependabot[bot] in https://github.com/srbhr/Resume-Matcher/pull/842
* fix(status): graceful degradation for the /status endpoint by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/843
* docs: sync agent context for SQLite, encrypted keys & application tracker by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/844
* feat: AI-led guided resume wizard (redesign) by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/846
* chore(deps): batch security bumps (7 Dependabot PRs + cryptography HIGH) → main by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/867
* fix(llm): graceful fallback when provider rejects response_format json_object (#857) by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/868
* fix(resumes): make "Delete & Start Over" work when a resume fails processing by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/871
* docs(readme): optimize sponsor conversion (top CTA, merged section, link fix) by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/872
* feat(i18n): add French (fr) language support for UI and AI content ge… by @icemc in https://github.com/srbhr/Resume-Matcher/pull/869
* feat: add ATS score breakdown to resume improvement response by @gingeekrishna in https://github.com/srbhr/Resume-Matcher/pull/813
* feat: add interview prep workflow by @GwIhViEte in https://github.com/srbhr/Resume-Matcher/pull/873
* fix(i18n): add missing interviewPrep keys to fr.json (unblocks Docker publish) by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/895
* chore(deps): consolidate frontend dependency updates (supersedes #888, #889, #893, #894) by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/896
* chore(deps): land consolidated dependency updates on main (re-target of #896) by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/897
* fix: contain long dialog descriptions by @luochen211 in https://github.com/srbhr/Resume-Matcher/pull/885
* Stabilize DnD context ids to avoid hydration mismatch by @RedMoonnn in https://github.com/srbhr/Resume-Matcher/pull/881
* fix(docker): add CJK fonts for Chinese/Japanese/Korean PDF rendering (#777) by @Frankli9986 in https://github.com/srbhr/Resume-Matcher/pull/785
* fix(builder): persist Compact Mode and Contact Icons toggles across sessions by @gingeekrishna in https://github.com/srbhr/Resume-Matcher/pull/874
* feat(i18n): add Korean (ko) language support by @moduvoice in https://github.com/srbhr/Resume-Matcher/pull/876
* Batch 2: Azure AI Foundry provider (#892) + plain description points (#882) by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/898
* Release: Korean support, Azure AI Foundry, plain description points, CJK PDF fonts by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/899
* Batch 3: resume autosave & draft recovery (#883) + CJK font fallback (#884) by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/900
* Batch 4: reject empty resume uploads (#793) + tailor timeout feedback (#792) by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/901
* Code review remediation: 4 blockers, 9 high, 8 medium, 6 test gaps by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/902
* Harden normalization and draft comparison (#903 review findings) by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/906
* Fix cubic findings on #907 (1 P0, 6 P1) by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/908
* Release: autosave, CJK fonts, tailor feedback + full code-review remediation by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/907
* fix: restore broken star history chart in READMEs by @Dessalines39394 in https://github.com/srbhr/Resume-Matcher/pull/919
* fix: preserve structured resume output for compatible LLMs by @wwlwgo in https://github.com/srbhr/Resume-Matcher/pull/924
* fix: preserve structured resume output for compatible LLMs (#924) + review follow-ups by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/927
* feat: add tracker status visibility management by @LongD1stanceRunner in https://github.com/srbhr/Resume-Matcher/pull/920
* feat: tracker column visibility management (#920) + review follow-ups by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/928
* fix(llm): skip temperature for OpenAI GPT-5 family by @thmsmtylr in https://github.com/srbhr/Resume-Matcher/pull/929
* [17/17] Complete cross-flow recovery and verified reliability fixes by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/992
* [5/17] Protect attachment edits and surface operation failures by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/980
* [07/17] Reject stale dashboard requests and serialize processing polls by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/982
* [10/17] Make preview confirmation atomic and idempotent by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/985
* [11/17] Validate LLM outputs and bound retry attempts by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/986
* [12/17] Preserve source content through AI refinement by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/987
* [13/17] Keep wizard entry identity stable during corrections by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/988
* [14/17] Bound complete AI operations and input sizes by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/989
* [16/17] Bound PDF rendering and recover Chromium safely by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/991
* [Stack 01/17] Isolate configuration storage and atomically save settings by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/976
* [Stack 02/17] Preserve supported GPT-5 sampling parameters by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/977
* [Stack 03/17] Make uploads cancellable and bound HTTP response bodies by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/978
* [Stack 04/17] Isolate resume editor state and guard draft recovery by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/979
* [06/17] Validate wizard drafts and report storage failures accurately by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/981
* [08/17] Bound document ingestion and enforce processing ownership by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/983
* [09/17] Make master, job and tracker writes atomic by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/984
* [15/17] Repair isolated monitoring and generated-result evaluations by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/990
* build(deps): bump nanoid from 3.3.16 to 3.3.18 in /apps/frontend by @dependabot[bot] in https://github.com/srbhr/Resume-Matcher/pull/993
* Release 1.3 Crescendolls by @srbhr in https://github.com/srbhr/Resume-Matcher/pull/994

## New Contributors
* @chadidi made their first contribution in https://github.com/srbhr/Resume-Matcher/pull/724
* @MRDGH2821 made their first contribution in https://github.com/srbhr/Resume-Matcher/pull/755
* @Frankli9986 made their first contribution in https://github.com/srbhr/Resume-Matcher/pull/773
* @AbdullahFageeh made their first contribution in https://github.com/srbhr/Resume-Matcher/pull/771
* @mohdazmi03 made their first contribution in https://github.com/srbhr/Resume-Matcher/pull/770
* @NightingaleCen made their first contribution in https://github.com/srbhr/Resume-Matcher/pull/780
* @lbagnascom made their first contribution in https://github.com/srbhr/Resume-Matcher/pull/787
* @icemc made their first contribution in https://github.com/srbhr/Resume-Matcher/pull/869
* @luochen211 made their first contribution in https://github.com/srbhr/Resume-Matcher/pull/885
* @RedMoonnn made their first contribution in https://github.com/srbhr/Resume-Matcher/pull/881
* @moduvoice made their first contribution in https://github.com/srbhr/Resume-Matcher/pull/876
* @Dessalines39394 made their first contribution in https://github.com/srbhr/Resume-Matcher/pull/919
* @wwlwgo made their first contribution in https://github.com/srbhr/Resume-Matcher/pull/924
* @LongD1stanceRunner made their first contribution in https://github.com/srbhr/Resume-Matcher/pull/920
* @thmsmtylr made their first contribution in https://github.com/srbhr/Resume-Matcher/pull/929

</details>

**Full Changelog**: https://github.com/srbhr/Resume-Matcher/compare/1.2.0...v1.3.0