MiniWho: Open-Source Resume Tool That Cuts the Paywall and Keeps Your Data
Not charging, no watermark, data belongs to you: I made an open-source online resume tool
36 A4 templates, pagination WYSIWYG, server-side PDF export — Minimal Resume MiniWho
Online use: https://who.minims.cn | Source: https://github.com/cosolar/miniwho
Every time I switch jobs, I pay the resume tool's "subscription fee" again: the free version exports with a watermark, premium templates require a membership, and the exported PDF doesn't match what I see on the web page; not to mention that my phone number, address, and ID photo all sit on someone else's server.
I've made several versions of my resume before, and finally decided to write one myself. Now it's open source: Minimal Resume MiniWho.
It solves only three problems: layout doesn't break, export doesn't disappoint, data doesn't get lost.
1. Use structure instead of layout: 18 modules + customization, just focus on "what to write"
Most resume tools make you pick a template first, then stuff content into text boxes. MiniWho flips that: content is structured, and layout is the last step.
18 fixed modules are built in — basic info, job intent, education, work experience, project experience, campus experience, skills, skill proficiency, papers, portfolio, self-evaluation, grad school info, competition experience, awards, certificates, journals, hobbies — plus up to 5 custom modules.
Each module can be dragged to reorder, shown or hidden, renamed. The right side of the workspace is a live preview; change one character and the page updates immediately. Switching templates doesn't lose content; changing the layout only changes the skin.
A few details:
- Each module saves independently; the server uses a
contentVersionoptimistic lock, so editing in two tabs won't overwrite each other. - After refreshing or accidentally closing the page, unsaved local drafts can be recovered.
- Resume photos go through a separate channel; the workspace crops them (ID photo / round) and uploads with automatic downsampling and re-encoding, not counting against attachment quota.
- Education and work experience can attach school / company logos, and every layout places them in the item's sidebar badge column.
2. Pagination WYSIWYG: how it breaks on screen is how it breaks in the PDF
This is the part I care most about.
When writing a resume with Word or a web template, the most common crash scenario: everything looks fine on screen, but on export the heading gets sliced in half, the table splits into two pieces, and the second page starts flush against the top without margin.
MiniWho's approach is to paginate on the paper itself: when content exceeds one page, it calculates the breakpoint based on A4 height, then draws a dashed line and a "Page N · Total M" label. The dashed line on screen, browser print, and server-exported PDF all use the same set of breakpoint markers; the continuation page automatically fills in margins. In two-column templates, the main column and sidebar column share the same page boundary, and the sidebar background fills every page.
So the last page you see is the page you submit.
3. Templates aren't a skin — they're an exchangeable file
The site currently has 36 templates: 30 are bundled with the app (12 original official layouts + 18 design layouts), plus community-shared versions from the template center. Single-column, double-column, color band, centered, timeline, full-width photo sidebar, header ID photo... Most layouts leave a photo slot in the header; if no photo is uploaded, it falls back to a name-initial badge, no empty space.
More interesting than quantity is the template package: each template — including official ones — is a JSON file describing theme tokens and a constrained subset of CSS. It can be exported with one click, sent to someone else, and imported into any deployment.
Imported templates have the same privileges as official ones: preview, pagination, PDF export, consistent pagination rules. On the security side, there's no backdoor — CSS is regenerated rule by rule on the server before being injected into the page, selectors are forced into that template's scope class, and @import, expression(), !important, and external url() are all rejected; this format has no place for HTML or JS, so someone else's template can't gain execution power or corrupt your resume.
If you've tuned a layout yourself, you can share it to the template center; you can also turn off export permission so others can use it but not download it.
4. Export: server-side PDF rendering, with fallback to browser print
Click "Download PDF" and the server renders the same A4 layout with headless Chrome. Results are cached by content and style version for 24 hours, so repeated exports are nearly instant.
If no usable browser is available on the machine, the front end automatically falls back to "browser print → save as PDF", so functionality never breaks.
Print and export restore physical dimensions of 210 × 297mm; you can also adjust paper filters (original / warm paper / black and white), font size and line spacing, and footer brand mark. These settings are saved with the resume, no need to reconfigure every time.
5. Share links and privacy: fields are stripped at the server
During a job search, you send your resume to HR, friends, and referrers, but you don't want to expose all your personal information to everyone. MiniWho's sharing features:
- High-entropy random links, with optional 4–20 digit access passwords;
- Optional validity of 1–365 days, or permanent;
- Option to allow or disallow printing and downloading;
- Fields like phone number, email, city, personal homepage can be individually hidden; hidden fields are removed at the server, so they never reach the visitor's browser;
- Resume photos use HMAC-signed short-lived URLs, unguessable and not forwardable long-term;
- View count is visible, and revocation is instant; regenerating the link invalidates the old one immediately.
6. Diagnostics without uploading your resume: rule-based scoring, no external AI
The resume diagnostics on the site use five-dimensional rule scoring: completeness 25 points, job match 25 points, expression quality 20 points, quantified results 15 points, format 15 points. It outputs a grade, dimension details, and up to 12 actionable suggestions, sorted by priority, with direct jumps to the relevant module.
It doesn't rely on any external AI service, and results are reproducible — the same content scores the same today and next week. When deployed on your own server, the entire diagnostic process doesn't even need to go out to the internet.
7. Accounts and data: exportable and deletable
- Username/password registration and login, with BCrypt password hashing;
- Email registration is optional; 6-digit verification codes use standard SMTP, encrypted storage, 10-minute validity, single use;
- GitHub login is available (requires your own Client ID / Secret);
- Password recovery via email verification code;
- Account data can be packaged as a zip and exported in one shot;
- Self-service deletion has a grace period; after that, attachments, avatars, and resumes are hard-deleted.
The admin backend isn't just "view statistics": registration channel switch, email and GitHub credentials, content width (1100–1600px, the whole site follows), homepage sample resumes, feedback, per-account storage quota, plus a runtime environment self-check card (database, upload directory, PDF rendering, mail channel, disk space).
Free, open source, self-hostable
- All features are free: no membership system, no paid templates, no hidden export limits.
- Apache 2.0: free for personal use, modification, commercial use, and redistribution, as long as you retain the
LICENSEandNOTICEfiles. - Single image: the front end is packaged into the same jar; one container plus one database runs it. Default is SQLite, but MySQL 8 is also supported.
- Front end Vue 3 + Element Plus, back end Java 17 + Spring Boot 3; APIs and data structures are documented for further development.
The easiest self-hosting method is one command:
docker run -d --name miniwho \
-p 8088:8080 \
-v miniwho-uploads:/app/uploads \
-e MINIWHO_DB=/app/uploads/miniwho.db \
-e MINIWHO_ADMIN_PASSWORD='replace with your strong password' \
-e MINIWHO_MEDIA_SECRET="$(openssl rand -hex 32)" \
--shm-size=512m \
cosolar/miniwho:latest
Open http://localhost:8088, log in with admin and the password you set. To allow self-registration, enable the corresponding channel in the backend "Site Settings" (email registration requires SMTP configured first).
Three deployment reminders:
- Server-side PDF depends on headless Chromium; it's already in the image, so give the container at least 1GB of memory;
MINIWHO_MEDIA_SECRETmust be set to a fixed value, otherwise historical avatar links will break after restarts;- When exposing to the public internet, put an HTTPS reverse proxy in front and set a strong admin password.
Who it fits, who it doesn't
Fits:
- People currently job hunting who don't want to pay for "export PDF";
- People who care about privacy and don't want to upload their full resume and ID photo to unfamiliar servers;
- Developers with a NAS or VPS who prefer self-hosting;
- People who want to unify layouts and share polished templates with friends or teams.
Not a great fit:
- Users who need job-application channels, employer integration, or ATS scoring reports;
- People expecting "one-click generation of hundreds of fancy templates";
- Users who won't touch the command line and don't plan to use the official site (self-hosting requires a bit of Docker).
Getting started in three steps
- Open https://who.minims.cn, pick a layout from the template center (preview without login);
- Fill in content by module, watch pagination live on the right;
- Export PDF, or generate a share link with a password and validity.
A resume shouldn't have a membership wall.
Site: https://who.minims.cn Source: https://github.com/cosolar/miniwho
If you hit a problem in self-hosting, want a specific layout, or just want to talk about how to write a resume, you're welcome to open an issue on GitHub.