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.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证ihatejob cv maker repo
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
A free, offline-first CV builder that tells you what is wrong with your CV.
Most free CV tools give you three templates, no guidance, and no way to judge
whether what you wrote is any good. This one is built around four problems:查看完整 README ↗Live: https://ihatejob.vercel.app · installs as an app · works offline
A free, offline-first CV builder that tells you what is wrong with your CV.
Most free CV tools give you three templates, no guidance, and no way to judge whether what you wrote is any good. This one is built around four problems:
No account, no upload, no tracking, no AI service. Everything runs in the browser and stays on the machine.
npm --prefix C:/SideProjects/ihatejob run dev
Open http://localhost:5190 for the landing page, or
http://localhost:5190/app to go straight to the builder. Set PORT to change
the port.
There is no build step and nothing to install. server.mjs is a static file
server written against node:http. Edit a file, refresh, done.
| Template | Layout | Best for |
|---|---|---|
| Classic | Single column, centred header | General applications |
| Minimal | Single column, wide margins | Design and senior profiles |
| ATS Plain | Black only, real disc bullets, photo suppressed | Job portals and parsers |
| Executive | Headings in a left margin column | Long careers |
| Modern | Colour sidebar, left | One-page CVs led by skills |
| Creative | Accent banner, right rail | Portfolios and studios |
| Academic | Long-form, numbered publications | Research records |
| Detailed | Dense, boxed, bio-data style | Government and PSU forms |
Across nine groups: Technology (software, data/ML, product, cybersecurity, IT support), Engineering (core, architecture, agriculture), Health & Life sciences (nursing, pharmacy, dentistry, physiotherapy, psychology, lab technology, veterinary), Legal & Public (law, government/PSU, social work/NGO, defence veterans), Business (finance, consulting, marketing, sales, HR, operations, banking/BFSI, insurance/actuarial, real estate), Creative & Media (design, journalism, film/VFX, content writing), Service & Hospitality (hotels, culinary, aviation, retail, skilled trades), Education & Academic, and Early career.
Every one has a worked sample CV written to pass the checker — open it in the preview without touching your own, then use it as a starting point if you want.
Choosing one rewrites the layout, the section order and the section names — "Experience" becomes Clinical Experience for nursing and Academic Appointments for research — and turns on the sections that field needs, such as licences and registrations or publications.
India, US, UK, Ireland, Canada, Australia/NZ, Germany/Austria, Netherlands, France, Nordics, UAE/Gulf, Singapore, Malaysia, Philippines, Japan, China, South Korea, South Africa, Nigeria, Brazil/LatAm.
Regions carry consequences, not decoration. A photo is conventional in Germany and disqualifying in the US, so selecting the US switches the photo off and the checker raises a blocker if personal details like date of birth appear anywhere in the document.
Upload or paste a CV and it is graded out of 100 across six characters, each with its own letter grade:
| Character | What it measures |
|---|---|
| Evidence | Do your claims carry numbers, or only adjectives? |
| Authenticity | Does it read as written by a person who did the work? |
| Precision | Tight, consistent, specific lines — not padding |
| Field fit | Does it contain what this profession expects to see? |
| Machine-readability | Will screening software parse it and pass it on? |
| Restraint | Right length, no keyword stuffing, nothing padded |
You also get a planet, from Mercury at the bottom to the Sun at the top, with a star rating for each rung — the memorable half of the same number.
It arrives as a flyby: the screen goes to deep space and the rail travels
outward from Mercury, decelerating onto the planet you earned. The card lands,
the score counts up and the stars pop in one at a time. The whole thing runs
0.9-2 seconds depending on how far you got, so a strong CV takes the longer
trip. Click anywhere to skip it, and it is disabled entirely under
prefers-reduced-motion.
Splitting the score matters: a CV can be immaculately formatted and say nothing (Machine-readability A, Evidence E), and those are different failures. Findings are then listed as fix before you send, worth fixing and polish, each quoting the offending text with a button that jumps to the field.
A sample of what it catches:
Every rule is deterministic and runs offline. Nothing is sent anywhere.
A second document sharing the CV's name block, typeface and accent, on its own
tab. Fill in the role, company and recipient; the greeting, subject line and
address block assemble themselves. Start from a structure lays out the four
paragraphs that do the job, with every claim left as a [bracketed prompt] for
you to replace — the editor counts how many are still unreplaced, because
brackets print exactly as they appear. Exports as PDF, Word, HTML or text under
its own filename.
The rating tells you what is wrong; Clean up automatically fixes what a machine can fix safely — replacing leveraged with used, deleting empty claims, stripping a leading I, normalising date formats to the region's convention, removing personal details a region forbids, and making bullet punctuation consistent. Each fix is listed with a count and can be unticked.
Two things are deliberately not automated: rewriting "Responsible for developing X" needs verb morphology that turns ran into runned, and adding numbers to bullets would mean inventing facts. Those stay flagged for you. A guard also reverts any rewrite that would leave broken English — a clause that lost its subject, or a line cut to almost nothing.
Drop in a PDF, a .docx, or paste the text. The file is read in the browser —
.docx is unzipped with DecompressionStream, PDFs are decoded from their
content streams. Text is parsed into sections, roles, dates, skills and scores,
shown as a report for you to confirm, and then checked.
Getting text out of a PDF takes more care than it sounds:
DecompressionStream rejects trailing bytes that zlib ignores, and
discards the whole result when it does. A PDF stream is delimited by the
endstream keyword, so the slice nearly always carries the writer's newline —
meaning every compressed stream failed and the reader saw nothing. It now
keeps whatever decoded before the complaint.Tj by
chance, which made them look like content streams and drowned the real text.
The object's own dictionary says what it is: /Length1 means a font program./ToUnicode
CMap; the reader resolves every font resource to its map and translates.ET split words in half — "Subham" became "S" + "ubham".
Line breaks come from the text matrix moving down the page instead.Parsing the structure out of that text is still approximate, and the app says so. A scanned PDF has no text to find at all — it tells you to paste instead rather than producing nonsense.
Most people arrive with a LinkedIn profile and no CV. Two routes in, both handed over by the person themselves, because no LinkedIn API returns a member's positions or education — those endpoints are Recruiter and CRM partner only, and scraping the site breaches its terms and risks their account.
Their profile as a PDF (More → Save to PDF) is the front door: instant, and the layout is fixed enough to parse exactly rather than guess at. The parser reads the contact rail, top skills, languages, certifications, the identity block, summary, roles with dates and locations, and education. If it finds no roles it falls through to the generic parser rather than producing a worse result.
Real profiles are messier than the shape suggests, and the parser handles what one actually contains: headlines that wrap over three lines, a profile URL split mid-word, durations printed on their own line, a company named once above several roles beneath it, a description whose last word wraps onto a line that then looks exactly like the next company, degrees spread over three lines with the dates on a fourth, entries the PDF repeats across a page break, and "Page 1 of 2" arriving as four separate lines.
npm test runs the import suite — 36 checks over both LinkedIn routes and the
date parser, including the guardrails that stop an ordinary CV being pushed
through the LinkedIn one.
Their data archive (Settings → Data privacy → Get a copy of your data) is
cleaner — real CSV fields, no guessing — but LinkedIn takes 10 minutes to 72
hours to send it, so it is the second route. Drop the .zip in and it reads
Profile, Positions, Education, Skills, Certifications, Languages,
Projects, Email Addresses and Phone Numbers.
The archive also contains messages, connections, ad targeting and LinkedIn's inferences about the person. Only the profile files are opened, and the import report names exactly which ones, so nothing is read quietly.
The reverse trip, under More. Nothing can write to a LinkedIn profile, so this
sizes the text to LinkedIn's own fields instead — headline 220 characters, About
2,600, each role 2,000 — counts against those limits live, and flags filler with
the same phrase lists the CV checker uses, via checkPhrases in review.js.
One rule set, so the two can never disagree.
It never rewrites anything for you. Inventing a number you did not give would be inventing a fact about your career.
.doc — opens in Word and Google Docs. Sidebar templates flatten to
one column; Classic, Minimal, ATS Plain and Executive convert faithfully.html.txt for portals that reject formatted uploads.json backup you can re-open laterPage padding lives inside the document rather than in @page. That is what lets
Modern and Creative bleed colour to the sheet edge — the cost is that a second
printed page loses the top padding and the sidebar background. The preview draws
a red line at each page break and warns when a sidebar format runs past page
one. For longer CVs use Classic, Minimal, ATS Plain, Executive or Academic.
Both themes ship, following your system preference on first load and remembered after that. The CV page itself stays white in both — it is paper, and it has to print.
The site is a PWA. A banner appears at the top of the page on arrival
offering the install, and there are quieter controls for anyone who dismisses it
— the toolbar, the mobile menu, a card in the share section, and the builder's
More menu — all sharing one data-install contract in public/js/pwa.js, and
all appearing only when the browser genuinely offers an install.
The banner has an ×, and dismissing it is remembered: it will not reappear for 30 days, and turning down the browser's own prompt counts as the same answer. It sits in the page flow rather than over it, so it pushes the nav down instead of covering it, and inside the builder it is a flex child of the app shell so the workspace shrinks around it.
The quieter controls open a dialog with Cancel and Install rather than firing the browser's prompt immediately. The prompt can only be shown once, so someone who taps a bare "Install the app" menu item to find out what it means should be able to read that and back out without spending it. Cancel takes focus, not Install.
The banner skips the dialog, because it already says what installing does — its Install goes straight to the browser's prompt.
On iOS Safari, which has no install API at all, the same dialog shows the three Share-sheet taps instead, with the Install button removed — there is nothing for it to call.
Once installed it runs in its own window, starts at the builder, offers Rate my CV and Build a CV as icon shortcuts, and works with no network at all.
Already deployed to Vercel. The current deployment is unclaimed — run
npx vercel login then npx vercel claim to move it into your account before
attaching a domain. Full details, including how to add your domain and when to
bump the service worker version:
docs/deploying.md.
Moderate reviews and journeys, read feedback, and check the site's own setup. Full guide: docs/admin.md.
Protected by a username and password checked in
middleware.js at the edge, before any file is served — a
password checked in browser JavaScript is not a password, it ships to every
visitor. Set ADMIN_USER and ADMIN_PASSWORD in the Vercel project settings,
and optionally ADMIN_PATH to move it to an address only you know. With no
password set, the admin refuses to load rather than standing open.
Saving commits public/data/*.json back to GitHub, so every change is a commit
you can revert, and there is no database to run.
It cannot show you anyone's CV or who visited — none of that is collected.
/stories is where visitors write up the whole hunt - how many applications,
how long the silence lasted, what finally got a reply - and other people read
and reply. It replaced a blog, on the reasoning that nobody comes to a CV tool
to read us; they come to find out whether any of this worked for anyone.
Someone submits from the form on /stories, which opens a public issue labelled
story. You publish it from the admin. The issue then stays the story's
discussion thread, and that is the whole backend for likes and replies:
+1 and heart reactions on that issue.Nothing here is a number we can inflate, no account system exists to build, and
if GitHub rate-limits the request the counts are simply absent rather than shown
as zero. Comment bodies come from strangers, so they are escaped before any
markup is applied and links are restricted to http(s) and root-relative paths.
Drafts stay off /stories until you tick Published. /blog permanently
redirects here.
Three things live in public/js/config.js:
| Setting | What it does |
|---|---|
SITE.repo | Where the suggestion form and every "open an issue" link point. Change your-username or those links stay disabled. |
SITE.contactEmail | Fallback inbox for reviews and suggestions before the repository is public. Set at least one of these two, or visitors have no way to reach you. |
STATS.endpoint | A JSON summary of your analytics. Visitor numbers appear once it returns real figures. |
STATS.minVisitors | Below this, visitor numbers stay off the page entirely. Default 100. |
REVIEWS | Ships empty on purpose. |
MIN_REVIEWS | The reviews section appears once you have this many. Default 3. |
Where it all arrives: docs/receiving-feedback.md — which page to watch, the labels to create first (GitHub silently drops labels that do not exist), and how to turn on notifications.
How visitors send you a review. Reviews have their own section and their own form, separate from the issue form under Open source. A review and a bug report are different acts by different people; sharing one dropdown between them made both read as paperwork.
The rating is a planet, picked from the same Mercury-to-the-Sun scale the checker uses on a CV, so nobody has to think in numbers. The form writes a fixed header that the admin reads back, which is how the planet, the credit and the consent answer survive the trip through GitHub:
Rating: Jupiter (5 of 10, 2.5 stars)
Credit: Asha R - Staff nurse, Leeds
May be quoted on the site: yes
...the review itself
Stars are always derived from the planet — half a star per rung — rather than stored beside it, so the two cannot drift apart.
Submitting goes to the repository if SITE.repo is set, otherwise to
SITE.contactEmail, and if neither is configured it copies to the clipboard
and says plainly that nothing was sent. Set one of them before launch.
On the repository link. While SITE.repo still contains your-username,
every "open an issue" control detects it and scrolls to the on-page suggestion
form instead of sending someone to a GitHub 404, pre-selecting the right
category. Point it at a real repository and they become direct issue links.
On visitor numbers. The front page can show visitors and CVs rated, read
from whatever you point STATS.endpoint at - Plausible, Umami, GoatCounter and
Fathom all expose a summary API, and a Cloudflare Worker holding a counter in KV
works too.
Until the endpoint is set, or while the figures are below minVisitors, those
cells are not on the page at all - no dash, no placeholder, no explanation.
A visitor sees only the four facts that are true from day one. "17 visitors" is
worse than saying nothing. The reason is logged to the browser console, where
only you will look.
On reviews. No testimonials ship with this. A brand-new site showing five glowing quotes from people who do not exist is the fastest way to lose a visitor, and it is the first thing anyone checks.
The whole section - heading, nav link and all - stays out of the page until
MIN_REVIEWS are visible, then appears on its own. The review form stays on the
page throughout, so people can send you reviews before the section exists. Each
entry needs a name, a role, a planet, and ideally a link to where they said it.
Nothing leaves the machine. The CV lives in localStorage under ihatejob.v1.
Uploaded photos are centre-cropped to a 420px JPEG and stored in the same
record. There is no analytics, no telemetry, no font CDN and no upload endpoint.
More → Clear everything wipes it.
New professions, regions, templates and checker rules are the most useful contributions, and the first two need field knowledge more than code.
server.mjs static file server (node:http only); "/" is the site, "/app" the builder
public/index.html landing page
public/app.html the builder
public/css/site.css landing page styles
public/js/site.js landing page logic
public/js/config.js domain, repo, analytics endpoint, reviews
public/admin.html admin dashboard (public data only)
public/js/admin.js admin logic: health, GitHub inbox, integrity checks
middleware.js edge auth for the admin: password, secret address
api/content.js saves reviews and journeys back to the repository
public/stories.html job-journey listing and single-journey view
public/js/stories.js journeys, GitHub likes and replies, a small Markdown subset
public/data/*.json reviews and journeys, edited from the admin
public/js/pwa.js install prompt and service worker registration
public/sw.js offline cache
public/manifest.webmanifest app identity, icons, shortcuts
vercel.json hosting config: routing, headers, caching
public/css/app.css editor UI
public/css/cv.css the document: structure, .tpl-* skins, print rules
public/js/schema.js data model, form schema, sample CV
public/js/professions.js profession packs and region rules
public/js/templates.js CV rendering and plain-text export
public/js/review.js the checker
public/js/import.js PDF/DOCX extraction and CV text parsing
public/js/form.js builds the editor from the schema
public/js/main.js state, events, preview, storage, exports
Proprietary. All rights reserved — see LICENSE.