TreeMap
A free, open-source disk-space visualizer. Squarified treemap, duplicate hunting, disk-full forecasting, and cleanup that only ever moves files to the Trash.
One place to sort, research and track the jobs that fit you. Local-first, works with any AI agent.
ProductivityJavaScript · PythonGitHub @FanqiWangOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
One place to sort, research and track the jobs that fit you.
An AI agent can find you twenty promising roles in an afternoon. The hard part comes after: deciding which ones deserve your time, remembering what you already ruled out, and not letting a deadline or a follow-up slip while you prepare for the next interview.Read the full README ↗One place to sort, research and track the jobs that fit you.
An AI agent can find you twenty promising roles in an afternoon. The hard part comes after: deciding which ones deserve your time, remembering what you already ruled out, and not letting a deadline or a follow-up slip while you prepare for the next interview.
This dashboard brings all of that into one place. Your agent searches against your own profile (the roles, locations and deal-breakers you wrote down) and brings back a shortlist: a score for each role, why it might fit, and what to watch out for. You sort it in one click, ask the agent to research the roles worth a closer look, and track applications, deadlines, contacts and follow-ups right next to its notes. When you sync, your decisions go back to the agent, so the next search skips what you have already seen.
I built it for my own job search, so it also has weekly planning for the days when the search feels endless. If you only want to track applications, there is a simple mode. It works with any AI agent, or with none at all: you can add jobs by hand.
It runs on your computer. No account, no server to host, nothing to install for the dashboard itself.
Designed by Fanqi Wang, built with Claude Code. See About.
All screenshots use fictional demo data.
Just look around. Download this repository (the green Code button → Download ZIP, then unzip it) or clone it, and double-click app/index.html. It opens with fictional demo data, so you can click around right away. When you are ready to start for real, click Clear demo data and start fresh in the banner at the top.
git clone https://github.com/FanqiWang/job-search-dashboard.git
Connect it to your AI agent (folder sync). For the agent to see your decisions, the dashboard needs to read and write files in this folder. Start the small local server included in the project and use Chrome or Edge:
cd job-search-dashboard
python serve.py # or: python3 serve.py
Your browser opens http://localhost:8765/app/ (open it yourself if it does not). Then:
job-search-dashboard folder (the one that contains app/ and data/), and allow access.data/state/dashboard-state.json appears in the folder, sync is working.From then on the dashboard saves a copy of everything to that file a moment after each change. It imports new jobs from data/scout/ when you connect, when you reopen the page and allow access again, or when you click Import inbox now on the Data page. The browser asks for permission on each visit; click Allow folder access in the banner. Stop the server with Ctrl+C in the terminal.
No Python yet? Install it from python.org. On Windows, tick "Add Python to PATH" during setup. serve.py uses only the standard library and listens on 127.0.0.1, so nothing is reachable from other computers. Any static server works too, as long as it serves this folder on localhost:
python -m http.server 8765 --bind 127.0.0.1 # then open http://localhost:8765/app/
Why a server? Browsers only let web pages read and write local folders on secure addresses such as
http://localhost, not on files opened by double-clicking. Everything else works without it.
Scout → review → track → sync, then the next scout run starts from what you decided.
Scout. Ask an agent to read your profile, search job sources, check the official postings, and produce a scored shortlist. The included scout instructions score four things from 0 to 25 each: how interested you would be, how well you can do the job, how attainable it is, and how good the role is. The scores help you decide what to look at first. They are not a prediction of whether you will get hired.
Review. The shortlist lands in the To review queue. Process moves a role to Evaluating, Prepare to apply moves it to Preparing, Later parks it with low priority, and Ignore marks it Passed. If you want the agent to research a role, write your questions in the note box and ask it separately.
Track. Update stages as things move (Applied → In contact → Interviewing → Offer), add deadlines, follow-up dates, notes and contacts, and star the roles you care about most. Full mode also gives you weekly task lists and reviews.
Sync. sync_decisions.py records changed decisions in data/scout/ledger.jsonl and removes the jobs you have already imported from the inbox. Before the next run, the agent reads the ledger, and publish.py also filters its results against your saved dashboard and the ledger.
Under the hood, the agent and the dashboard only exchange local files. The publishing script checks required fields, score arithmetic, declared eligibility and posting age, and drops roles you already have. Files are replaced atomically, so a crash never leaves half an inbox behind, and running a sync twice changes nothing the second time. Checking that a posting is real and assessing fit remain the agent's job. See Architecture for the details.
Not interested in planning your week inside the dashboard? Switch to simple mode with the button at the bottom of the sidebar, or on the Data page.
Simple mode keeps the review queue, your pipeline, deadlines, follow-ups and contacts, and hides the weekly task lists, workstreams and weekly reviews. Both modes use the same data, so you can switch back at any time without losing anything. You can also open the page as app/index.html?mode=simple.
The dashboard does not care which AI you use. It only reads and writes documented files: the agent writes recommendations as JSON and reads your decisions back from the saved state and the ledger.
For the workflow below, the agent needs to be able to search job sources, read and write files in this folder, and run Python scripts. Coding agents such as Claude Code can do all three. With a chat app or a local model that cannot, you can still copy the files back and forth by hand, or write a small script to do it.
| The agent… | File | Format |
|---|---|---|
| reads your profile | workflow/profile.md | free text (example) |
| writes new jobs | data/scout/inbox.json or data/scout/inbox-<engine>.json | inbox |
| optionally writes research | data/scout/research.json | research notes |
| reads your decisions | data/state/dashboard-state.json, data/scout/ledger.jsonl | state, ledger |
From the repository folder:
Copy workflow/profile.example.md to workflow/profile.md and describe yourself: experience, the roles you want, locations, deal-breakers.
Give your agent the two skills, workflow/job-scout/SKILL.md and workflow/dashboard-sync/SKILL.md. Agents that support skill folders, such as Claude Code, can use them as they are; for others, paste the steps into your prompt. They are short on purpose, so edit them to fit your search.
Ask the agent to "run a scout". It writes its results to a file such as results.json, then checks them and publishes them to the inbox:
python workflow/dashboard-sync/scripts/publish.py --results results.json --engine my-agent --write
Click Import inbox now on the Data page and review the new roles. Check that the Data page shows no save error, then ask the agent to sync your decisions:
python workflow/dashboard-sync/scripts/sync_decisions.py --engine my-agent --write
Both scripts only print what they would do unless you pass --write, so you can always look first.
Using more than one agent? Give each its own --engine name; each gets its own inbox-<engine>.json, and the dashboard shows which agent suggested which role. When two agents suggest the same role (the same opportunity_id), the dashboard keeps both sources and both scores. Since publish.py skips roles that are already on the dashboard, publish both shortlists before you import if you want to compare their scores.
localStorage for this page; clearing browser data deletes it. Export backup downloads everything as one file, and folder sync keeps a copy in data/state/.workflow/profile.md and everything under data/ (except the included example) are git-ignored, so you can fork this repository without publishing your search. Still check before committing: ignore rules do not remove files you already committed, or your Git history.Can I use it just to track applications? Yes. Switch to simple mode (see Full or simple). Your choice is remembered in this browser.
Do I need an AI agent? No. Add jobs, contacts and tasks by hand with the + New button. The agent just fills the review queue for you.
Which browsers work?
Any current desktop browser runs the dashboard. Folder sync needs Chrome or Edge and the page served from localhost; Firefox and Safari do not support writing to local folders.
Where is my data, and how do I move it?
In your browser, tied to the page's address: file://…/app/index.html and http://localhost:8765/app/ count as two different places. Export a backup from one and import it in the other. With folder sync connected, data/state/dashboard-state.json is updated shortly after each change.
How do I get rid of the demo data? Click Clear demo data and start fresh in the banner, or use the Data page. You can load the demo again from the same page; your current data is downloaded as a backup first.
Can I change the stages, lists or scoring?
The vocabulary lives at the top of app/js/model.js. If you rename stages, update STATUS_MAP in sync_decisions.py to match. Scoring is up to your scout: publish.py only checks that each of the four parts is between 0 and 25 and that they add up to the total. Use --min-score and --max-age-days to adjust its filters.
What is a "Bridge" job? A contract, fellowship, residency or other short-term role that gets you closer to where you want to be. Bridge roles, internships and anything else that is not full-time get their own column in the review queue.
Is there a build step? No. Edit a file and reload the page. The app is plain HTML, CSS and JavaScript; the scripts are plain Python 3.9+.
node --test "tests/js/*.test.js" # dashboard logic, no packages needed
python -m unittest discover -s workflow/dashboard-sync/tests # sync scripts, standard library only
npm install && npx playwright install chromium && npm run screenshots # regenerate docs/images/
See docs/architecture.md for how the code is organized, and docs/data-formats.md for every file format.
I'm Fanqi Wang. This project grew out of the dashboard I used for my own job search. I designed the workflow and how it behaves: reviewing recommendations, keeping the next step in view, and remembering decisions for the next search.
Claude Code wrote the code, tests, documentation and screenshots from my specifications and reviews. Codex reviewed and refined this README, checked its technical claims against the implementation, and ran the existing dashboard-logic and Python workflow tests.