mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2026-07-07 03:24:53 +10:00
b404dbd42a
* 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
173 lines
4.2 KiB
JSON
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"
|
|
}
|
|
}
|
|
}
|