mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2026-07-16 16:19:47 +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
111 lines
3.3 KiB
Plaintext
111 lines
3.3 KiB
Plaintext
---
|
|
title: "Importing applications from CSV"
|
|
description: "Import existing job applications into the Application Tracker from a CSV file or pasted spreadsheet rows."
|
|
---
|
|
|
|
Use CSV import when you already track applications in a spreadsheet and want to move them into Reactive Resume.
|
|
|
|
## Open CSV import
|
|
|
|
<Steps>
|
|
<Step title="Go to Applications">
|
|
In the dashboard sidebar, click **Applications**.
|
|
</Step>
|
|
|
|
<Step title="Click Import CSV">
|
|
If you have no applications yet, click **Import from CSV** in the empty state. Otherwise, click **Import CSV** in the
|
|
page header.
|
|
</Step>
|
|
</Steps>
|
|
|
|
<Frame caption="CSV import sheet with a recognized preview">
|
|
<img
|
|
src="/images/guides/importing-applications-from-csv/screenshot-1.webp"
|
|
alt="CSV import sheet showing upload, pasted CSV rows, recognized fields, and one application ready to import"
|
|
/>
|
|
</Frame>
|
|
|
|
## Prepare your CSV
|
|
|
|
The importer uses the first row as headers. Each imported row must include a company and role.
|
|
|
|
Supported headers include:
|
|
|
|
| Field | Recognized headers |
|
|
| --- | --- |
|
|
| **Company** | `Company`, `Employer`, `Organization` |
|
|
| **Role** | `Role`, `Title`, `Position`, `Job Title` |
|
|
| **Stage** | `Stage`, `Status` |
|
|
| **Location** | `Location` |
|
|
| **Salary** | `Salary`, `Salary Range`, `Compensation` |
|
|
| **Source** | `Source` |
|
|
| **Notes** | `Notes`, `Note` |
|
|
| **Job posting URL** | `URL`, `Link`, `Job URL`, `Job Posting` |
|
|
| **Tags** | `Tags` |
|
|
|
|
Tags can be separated with commas, semicolons, or vertical bars.
|
|
|
|
```csv
|
|
Company,Role,Stage,Location,Salary,Source,Tags
|
|
Stripe,Frontend Engineer,applied,Remote,$180k,LinkedIn,remote;react
|
|
```
|
|
|
|
## Import applications
|
|
|
|
<Steps>
|
|
<Step title="Upload or paste rows">
|
|
Upload a `.csv` file, or paste CSV rows directly into the **CSV data** field.
|
|
</Step>
|
|
|
|
<Step title="Review the preview">
|
|
Reactive Resume shows how many rows are ready to import, which columns it recognized, and how many rows were skipped.
|
|
</Step>
|
|
|
|
<Step title="Fix skipped rows">
|
|
Rows without a company or role are skipped. Add the missing values before importing if you want those rows included.
|
|
</Step>
|
|
|
|
<Step title="Import">
|
|
Click **Import**. Imported applications are added to your Application Tracker.
|
|
</Step>
|
|
</Steps>
|
|
|
|
## Use valid stages
|
|
|
|
The **Stage** column is optional. If you include it, use one of these values:
|
|
|
|
- `saved`
|
|
- `applied`
|
|
- `screening`
|
|
- `interview`
|
|
- `offer`
|
|
- `rejected`
|
|
|
|
If a row has an unrecognized stage, the importer ignores that stage value and uses the default application stage.
|
|
|
|
## Import large files
|
|
|
|
Reactive Resume imports up to 500 applications at a time. If your CSV has more than 500 valid rows, split it into smaller files and import each file separately.
|
|
|
|
<Tip>
|
|
Import first, then use the table view to select multiple applications and apply tags, move stages, archive rows, or delete rows in bulk.
|
|
</Tip>
|
|
|
|
## Troubleshooting
|
|
|
|
### Some rows were skipped
|
|
|
|
Make sure every row has both a company and a role. These fields are required.
|
|
|
|
### A column was not recognized
|
|
|
|
Rename the header to one of the recognized names in the table above, then import again.
|
|
|
|
### Tags did not split correctly
|
|
|
|
Separate tags with commas, semicolons, or vertical bars, such as `remote;react` or `frontend|senior`.
|
|
|
|
### A stage did not import
|
|
|
|
Use lowercase stage values such as `applied` or `interview`. Custom stages are not supported.
|