Files
Reactive-Resume/docs/docs.json
T
Amruth Pillai b404dbd42a Add application tracker (#3220)
* feat(applications): job application tracker with AI copilot

Add an Applications module at /dashboard/applications: pipeline board
(dnd-kit), table view with bulk actions, Insights (fit tiles, funnel,
sources, shareable funnel-flow SVG), campaigns, tags, CSV import, and
Add/Edit/Detail slide-overs. Each application links a live Reactive
Resume.

AI "Application Copilot" (applications.ai.*): job-posting autofill,
resume↔job match score (fit ring), resume tailoring, and cover-letter /
follow-up drafting — via the user's configured provider.

Board cards + table rows get context menus (edit / move / archive /
delete). Charts are CSS/SVG (no new chart dep); adds a UI Checkbox.

Also includes local TanStack devtools setup and toolchain bumps.

Claude-Session: https://claude.ai/code/session_01TEeRHnEayw2MFCShFRyL5f

* feat(applications): close follow-up gaps + squash migrations

Finish the deferred/open items on the applications tracker:

- Cover-letter upload re-enabled. Fix the storage blocker by deriving the
  key extension from content type (buildFileKey/EXTENSION_BY_CONTENT_TYPE)
  instead of hardcoding .jpeg, so PDFs serve correctly and non-JPEG image
  avatars keep working under FLAG_DISABLE_IMAGE_PROCESSING. Add
  coverLetterUrl/coverLetterName columns + Documents-section upload/remove.
- Contacts editor in the detail sheet (add/edit/remove, keyed per app).
- Board caps rendered cards per column (COLUMN_PAGE_SIZE=50 + "Show more").
- Extract new Lingui messages across locales.
- Guard coverLetterUrl to http(s)/relative at the API boundary.

Squash the five branch-only application-table migrations (create -> +tags
-> +cover-letter -> drop -> re-add) into a single clean CREATE TABLE via
drizzle-kit generate.

Claude-Session: https://claude.ai/code/session_01TEeRHnEayw2MFCShFRyL5f

* chore: update dependencies

* fix(web): address React Doctor findings — compiler, purity, query, component structure

prefer-module-scope-pure-function: hoist buildSubtitle, getDecimalPlaces,
handleLocaleChange, onLocaleChange, stop, listContent/groupedListContent to
module scope so they aren't rebuilt on every render.

react-compiler-todo (??=): rewrite draft.metadata.styleRules ??= [] to the
non-assignment form to unblock auto-memoization.

set-state-in-effect: derive updatedAtLabel at render time instead of syncing
it through useState + useEffect.

query-destructure-result: destructure useQuery results at call site in
resume-analysis and resume-thumbnail to follow TanStack Query v5 convention.

only-export-components: extract non-component exports to sibling .ts files so
Fast Refresh can preserve component state:
  - getNextWeights → typography/get-next-weights.ts
  - detectJsonImportType + ImportType → dialogs/resume/import.utils.ts
  - getLocaleOptions → features/locale/locale-options.tsx
  - preview helpers + DEFAULT_PDF_PAGE_SIZE → preview.shared.utils.ts
  - resolveHighlightToolbarState + defaultHighlightColor → rich-input.utils.ts
  - computeDelta + getSparklinePoints → statistics.utils.ts

no-multi-comp: split multi-component files into focused companions:
  - ResumePane + ToolbarButton → routes/agent/-components/resume-pane.tsx
  - DesktopBuilderShell → builder/$resumeId/-components/desktop-builder-shell.tsx
  - MobileBuilderShell + helpers → builder/$resumeId/-components/mobile-builder-shell.tsx
  - setBuilderLayout/getBuilderLayout moved to -store/sidebar.ts

fix(tests): add Resume type import to section-builder mocks and cast partial
mock data as unknown as Resume to satisfy stricter type checking; fix
noExplicitAny Biome errors in the same mocks.

* feat(applications): improve performance

* chore: fix knip issues

* perf(builder): halve per-keystroke render cost

Section-form fields called `form.handleSubmit()` on every keystroke, which
re-validated the whole form and toggled submit state — firing the render
cascade twice per character (~6809 renders/keystroke, FPS dropping to 9).

Persist via a form-level `listeners.onChange` instead and drop the per-field
`handleSubmit()` (basics, custom-fields, design). Narrow header/dock resume
subscriptions to metadata slices so they no longer re-render on content edits.

Cuts renders 6809 -> 3403 per keystroke (50%), 0 frame drops. Save, preview,
and design controls verified working; 449/449 web tests pass.

* perf(home): eliminate hero CLS from unreserved video box

The hero <section> is `flex items-center` (shrink-to-fit), so the video
wrapper's width depended on the video's intrinsic size, which only resolves
after the media loads. aspect-ratio couldn't reserve height without a definite
width, so the video grew from ~190px to ~563px after first paint and shoved the
centered hero text down ~373px (CLS ~0.095).

Give the wrapper a definite width (w-full + mx-auto on the CometCard) and set an
explicit aspect ratio + width/height on the video so its box is reserved before
load. CLS 0.095 -> 0; hero stays visually centered at max-w-4xl.

* docs: add application tracker guides

* chore(db): squash application migrations

* fix(email): import React in auth template for server-side rendering compatibility

* chore(release): v5.2.1

* Refactor resume rendering and builder workflows

* fix: address application tracker review findings
2026-07-05 23:44:04 +02:00

173 lines
4.2 KiB
JSON

{
"$schema": "https://mintlify.com/docs.json",
"theme": "mint",
"name": "Reactive Resume",
"favicon": "/favicon.svg",
"description": "A privacy-minded resume builder that is customizable, portable, open-source, and free to use.",
"seo": {
"indexing": "navigable",
"metatags": {
"canonical": "https://docs.rxresu.me",
"og:image": "https://rxresu.me/opengraph/banner.jpg"
}
},
"fonts": {
"heading": {
"family": "IBM Plex Sans"
},
"body": {
"family": "IBM Plex Sans"
}
},
"colors": {
"primary": "#166534",
"light": "#07C983",
"dark": "#15803D"
},
"navigation": {
"tabs": [
{
"icon": "book",
"tab": "Documentation",
"groups": [
{
"group": "Getting Started",
"pages": [
"getting-started/index",
"getting-started/quickstart",
"guides/checking-service-status",
"guides/accessing-the-previous-version"
]
},
{
"group": "Account",
"pages": [
"guides/creating-an-account",
"guides/updating-your-profile",
"guides/linking-social-accounts",
"guides/deleting-your-account"
]
},
{
"group": "Resume Builder",
"pages": [
"guides/creating-your-first-resume",
"guides/managing-resumes-from-the-dashboard",
"guides/tracking-job-applications",
"guides/importing-applications-from-csv",
"guides/importing-resumes",
"guides/choosing-a-template",
"guides/selecting-page-format",
"guides/moving-items-between-sections",
"guides/fitting-content-on-a-page",
"guides/adding-a-cover-letter",
"guides/using-the-builder-dock",
"guides/undoing-changes-and-version-history",
"guides/using-custom-styles",
"guides/using-ai-in-the-builder",
"guides/using-ai-agent",
"guides/using-private-notes",
"guides/exporting-your-resume",
"guides/exporting-resume-to-markdown",
"guides/sharing-your-resume-publicly"
]
},
{
"group": "Security",
"pages": ["guides/setting-up-two-factor-authentication", "guides/setting-up-passkeys"]
},
{
"group": "Integrations",
"pages": [
"guides/using-the-api",
"guides/using-the-patch-api",
"guides/using-the-mcp-server",
"guides/using-ai",
"guides/ai-agent-tools",
"guides/json-resume-schema"
]
},
{
"group": "Use Cases",
"pages": [
"use-cases/free-resume-builder",
"use-cases/open-source-resume-builder",
"use-cases/privacy-focused-resume-builder",
"use-cases/self-hosted-resume-builder",
"use-cases/api-mcp-resume-automation",
"use-cases/export-and-share-resumes",
"use-cases/ai-resume-builder"
]
},
{
"group": "Self-Hosting",
"pages": ["self-hosting/docker", "self-hosting/examples", "self-hosting/sso", "self-hosting/migration"]
},
{
"group": "Contributing",
"pages": ["contributing/architecture", "contributing/development", "contributing/translations"]
},
{
"group": "Community",
"pages": ["community/sponsors", "community/spotlight"]
},
{
"group": "Legal",
"pages": ["legal/license", "legal/privacy-policy", "legal/terms-of-service"]
}
]
},
{
"icon": "clock",
"tab": "Changelog",
"pages": ["changelog/index"]
},
{
"icon": "code",
"tab": "API Reference",
"openapi": "/spec.json"
}
],
"global": {
"anchors": [
{
"icon": "link",
"anchor": "Reactive Resume",
"href": "https://rxresu.me"
},
{
"icon": "github",
"anchor": "Source Code",
"href": "https://github.com/amruthpillai/reactive-resume"
}
]
}
},
"logo": {
"light": "/logo/light.svg",
"dark": "/logo/dark.svg"
},
"navbar": {
"links": [
{
"label": "Support",
"href": "https://github.com/amruthpillai/reactive-resume/issues"
}
],
"primary": {
"type": "button",
"label": "Get Started",
"href": "https://rxresu.me"
}
},
"contextual": {
"options": ["copy", "view"]
},
"footer": {
"socials": {
"website": "https://rxresu.me",
"github": "https://github.com/amruthpillai/reactive-resume"
}
}
}