Files
Reactive-Resume/docs/guides/tracking-job-applications.mdx
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

152 lines
5.6 KiB
Plaintext

---
title: "Tracking job applications"
description: "Use the Application Tracker to record jobs, link the resume you sent, manage follow-ups, and move applications through your hiring pipeline."
---
The **Application Tracker** helps you keep your job search connected to the resumes you create in Reactive Resume. Each application can store the company, role, stage, job posting, resume, cover letter, contacts, notes, and follow-up details.
## Open the Application Tracker
<Steps>
<Step title="Sign in">
Open Reactive Resume and sign in to your account.
</Step>
<Step title="Go to Applications">
In the dashboard sidebar, click **Applications**.
</Step>
</Steps>
<Frame caption="Application Tracker board view">
<img
src="/images/guides/tracking-job-applications/screenshot-1.webp"
alt="Application Tracker showing search, tag filters, board columns, and application cards grouped by stage"
/>
</Frame>
## Add an application
<Steps>
<Step title="Click Add application">
If this is your first application, use the button in the empty state. Otherwise, use **Add application** in the page header.
</Step>
<Step title="Fill in the role details">
Add the **Company** and **Role / title**. These two fields are required. You can also add the location, salary range,
source, tags, notes, and follow-up details.
</Step>
<Step title="Choose a stage">
Pick the current stage of the opportunity.
</Step>
<Step title="Link or upload the resume you sent">
Choose a Reactive Resume from the **Resume** field when you want to keep a live link to the resume. You can also upload
the exact resume PDF you sent.
</Step>
<Step title="Attach a cover letter">
If you sent a cover letter, attach the PDF in the **Cover letter** field.
</Step>
<Step title="Save">
Click **Add to pipeline**.
</Step>
</Steps>
<Frame caption="Add application form">
<img
src="/images/guides/tracking-job-applications/screenshot-2.webp"
alt="Add application form with job posting auto-fill, company, role, stage, resume, cover letter, tags, and follow-up fields"
/>
</Frame>
<Tip>
Linking a Reactive Resume enables AI match scoring and resume tailoring for that application.
</Tip>
## Use AI to fill a job posting
If you have an AI provider configured, paste a job posting URL at the top of the add form and click **Auto-fill**. Reactive Resume reads the posting and fills in what it can, such as company, role, location, salary, and job description.
If auto-fill fails or the posting is private, paste the job description manually.
For AI setup, see [Using Artificial Intelligence](/guides/using-ai).
## Understand application stages
Applications move through fixed stages:
| Stage | Use it when |
| --- | --- |
| **Saved** | You found a role but have not applied yet. |
| **Applied** | You submitted the application. |
| **Screening** | A recruiter, hiring manager, or automated process is reviewing you. |
| **Interview** | You are in an interview process. |
| **Offer** | You received an offer. |
| **Rejected** | The company declined or the opportunity ended. |
You can move applications by dragging cards on the board, using the action menu, using bulk actions in the table, or opening an application and clicking **Move to**.
## Choose a view
The Application Tracker has three views:
| View | Best for |
| --- | --- |
| **Board** | Moving applications through stages visually. |
| **Table** | Reviewing many applications, selecting rows, and making bulk updates. |
| **Insights** | Understanding your pipeline, response rate, interviews, offers, sources, and application velocity. |
Use search, tag filters, sorting, and the archived toggle to narrow the list.
<Frame caption="Application Tracker insights view">
<img
src="/images/guides/tracking-job-applications/screenshot-4.webp"
alt="Application Tracker insights view showing pipeline metrics, a funnel chart, applications over time, and source counts"
/>
</Frame>
## Update an application
Open an application from the board or table to view its detail panel. From there you can:
- edit the application details;
- move it to the next stage;
- open the original job posting;
- attach or replace resume and cover letter PDFs;
- add contacts;
- add follow-up information;
- add notes to the timeline;
- archive, unarchive, mark rejected, or delete the application.
Stage changes and notes appear in the timeline automatically.
<Frame caption="Application detail panel">
<img
src="/images/guides/tracking-job-applications/screenshot-3.webp"
alt="Application detail panel showing stage progress, linked resume, Application Copilot, contacts, and timeline activity"
/>
</Frame>
## Use Application Copilot
Application Copilot appears in the application detail panel. It can:
- score how well the linked resume matches the job description;
- create a tailored copy of the linked resume;
- draft a cover letter;
- draft a follow-up message.
Match scoring and resume tailoring require both a linked Reactive Resume and a job description. Drafting also works from the application and resume context available in the tracker.
<Warning>
Review AI-generated content before sending it. You are responsible for the final resume, cover letter, and follow-up message.
</Warning>
## Archive or delete applications
Archive applications you want to hide from the active board without deleting their history. Use the **Archived** toggle to view archived applications and unarchive them later.
Delete an application only when you no longer need its record. Deleting an application removes its timeline and cannot be undone.