This repository builds a single static HTML file that visualizes job-application progress from an Excel macro-enabled workbook (JobHunt.xlsm).
There is no server: the HTML loads Plotly from a CDN and reads data that was embedded at build time.
Sample report can be seen here which provides multiple views & filtering options.
You just need to maintain the DB in the excel & let this took take care of the reporting.
| Path | Purpose |
|---|---|
JobHunt.xlsm (repo root) |
Your tracker workbook. Sheet name must be JobHunt. |
JobHunt/ (Node project folder) |
Build script and HTML template. |
JobHunt/build.mjs |
Reads the workbook, normalizes rows to JSON, writes dist/jobhunt-progress.html. |
JobHunt/report-template.html |
UI, filters, and Plotly charts. Placeholder __APP_B64__ is replaced during the build. |
dist/jobhunt-progress.html |
Generated output — run the build to create or refresh it. |
- Node.js 18+ (includes
npm).
build.mjsresolves the input file: path passed on the command line, else../JobHunt.xlsm(repo root, next to theJobHunt/folder).- The workbook is read as a buffer and parsed with SheetJS (
xlsx) (more reliable on Windows than reading the path directly). - The worksheet named
JobHuntis used if it exists; otherwise the first sheet in the file is used. - Row 1 is treated as headers; each following row becomes an object keyed by the normalized header string.
- Each row is mapped to an application object (company, position, role type, status, dates, ordered
steps, etc.). Rows withoutDate- Appliedare dropped. - A JSON payload
{ generatedAt, source, sheet, applications }is Base64-encoded and injected into the template (avoids broken HTML if text contained</script>-like sequences). - The result is written to
dist/jobhunt-progress.html.
cd JobHunt
npm install
npm run buildnpm run build:open— builds then tries to open the HTML on Windows (start ..\dist\jobhunt-progress.html).
Custom workbook path:
node build.mjs "C:\path\JobHunt.xlsm"Headers are matched by name (not by column letter), so you can reorder columns as long as names stay consistent. Important names include:
- Company Name, Position Name, Role Type, Status, Log, Portal, URL of Job Posting (and variants with trailing spaces are tolerated).
- Date- milestone columns: Job Posted, Applied, Short Listed, Interview/Test, Offer, Rejected, Declined by Me.
- Flag to see if the job posting is still accepting candidates — read into data; charts do not depend on it.
Status should be stored as a cached value in Excel (save after formulas calculate) so the export shows the intended text.
Open dist/jobhunt-progress.html in a modern browser. Internet access is required for the Plotly CDN unless you vendor the library locally later.
Peers can receive only the HTML file after you run a build; no Node is needed on their side.
The Workbook JobHunt.xlsm has easy to use buttons to search jobs (based on Company Name) and to add new row.
Copy the URL to Clipboard, before you press the "add Record" button, as it would copy the URL from clipboard directly into the new record.
Buttons: Add Record (to add new record in DB), Search Company and Clear Filter.
Hotkey: Ctrl+Shift+S opens dialog for "Search Company", it defaults to value in 1st column of current row. Ctrl+Shift+I would add the new row.
- The HTML report uses a fixed light theme
- Chart logic and filter behaviour live in
report-template.html(inline script). Build logic and column mapping live inbuild.mjs— update both if you add columns that should appear in charts or filters.
The initial nodejs code was co-written with CursorAI, which also added detailed documentation in the code.
The excel template was created by Arun-KS who also had created the VBA Macros, as Cursor struggled & complicated it.
The MJS code was maintained & enhanced by Arun-KS, to handle some bugs in Cursor's code.