🇬🇧 English · 🇨🇳 简体中文 · 🇭🇰 繁體中文
Most salary calculators spit out one number and call it a day. PayPulse does something different: it shows you the money you've already earned — right now, this second, ticking up in real time. Open it on a Friday afternoon and watch that number climb to the day's end. It's weirdly satisfying.
No backend, no build step, no account. Just a single index.html that you open in a browser.
git clone https://github.com/GGNode/paypulse.git
cd paypulse
open index.html # macOS
xdg-open index.html # Linux
start index.html # WindowsFirst time you open it, a short setup wizard appears and asks for your salary, region, and start date. That's the only configuration needed.
![]() Pick your language |
![]() Pick your region — tax, pension and holidays fill in automatically |
![]() Enter monthly salary and your start date |
If you want the number floating on your desktop instead of in a browser tab:
cd desktop
bash setup.sh # one-time setup — creates .venv, installs deps
./install-autostart.command # installs a LaunchAgent so it starts on loginSee desktop/README.md for the full guide.
| Code | Language | Status |
|---|---|---|
en |
English | ✅ complete |
zh-CN |
简体中文 | ✅ complete |
zh-HK |
繁體中文(香港) | ✅ complete |
| anything else | — | PR welcome — it's just one JS object to translate |
![]() English |
![]() 简体中文(HK region) |
![]() 简体中文(Mainland China, CNY) |
HKD · CNY · USD · EUR · JPY · GBP · SGD · AUD — or type any symbol you want.
| Provider | What it covers |
|---|---|
hk-salaries-tax |
Hong Kong Salaries Tax 2025/26 — progressive and standard rate, personal/married/child/dependent allowances, MPF/TVC/home-loan deductions, year-end bonus, TVC savings table |
cn-iit |
Mainland China 综合所得个人所得税 — 7-bracket progressive annual table, ¥60,000 basic allowance, all 7 categories of 专项附加扣除, separate or combined year-end bonus method, pre-tax 五险一金 integration |
simple-brackets |
Generic progressive brackets — you define the table, works anywhere |
flat-rate |
One flat percentage, good for freelancers and foreign-contract workers |
none |
Gross only, no tax math |
![]() Hong Kong Salaries Tax with TVC savings table |
![]() Mainland China — 综合所得 with year-end bonus taxed separately |
Adding your own country's tax logic takes about 100 lines. See docs/tax-providers.md.
| Provider | What it covers |
|---|---|
hk-mpf |
Hong Kong MPF — 5 % employee + 5 % employer, capped at HK$1,500/month |
cn-social-insurance |
China 五险一金 — 养老/医疗/失业/工伤/生育/住房公积金, fully configurable bases and rates |
flat-percent |
Fixed percentage, for US 401(k) or voluntary contributions |
none |
No pension deduction |
China 五险一金 — bases and rates are editable to match your city (Beijing 2025-2026 defaults shown)
Built-in data for 2026: 🇭🇰 Hong Kong · 🇨🇳 Mainland China · 🇺🇸 US · 🇬🇧 UK · 🇸🇬 Singapore · 🇯🇵 Japan.
For China, the 调休 make-up workdays (weekends reassigned as working days by the State Council) are fully handled — if Saturday Feb 14 is a make-up day, it counts as a workday. The exported config splits holidays and makeupWorkdays into separate arrays so the desktop tools stay in sync.
A browser tab works fine, but the widget lets you keep the number at the corner of your eye without switching windows.
Both tools read paypulse-config.json, which you export from the web app under Settings → Export. Whenever you change something in the web app, just export again and right-click → Reload config.
cd desktop
bash setup.sh
./install-autostart.command # adds a LaunchAgent for login autostartPayPulse makes no network requests, ever. Your salary and all your data stay in localStorage in your browser — nothing is sent anywhere.
No analytics, no telemetry, no "anonymous usage data", no ads, no account required. Works fully offline. The entire app is one HTML file you can audit in an afternoon.
Full details in docs/privacy.md.
| Frontend | Vanilla HTML/CSS/JS — no framework, no build tool |
| Storage | localStorage only |
| Charts | Hand-rolled SVG |
| i18n | Flat I18N dictionary + t() helper — add a language by translating one object |
| Tax & pension | Pluggable TAX_PROVIDERS / PENSION_PROVIDERS objects with compute, renderConfig, readConfig hooks |
| Desktop widget | Python + PyObjC (macOS) |
| Menu bar | Python + rumps (macOS) |
docs/regions.md |
How to add a new region with your own tax/pension/holiday bundle |
docs/tax-providers.md |
Tax provider API reference and a template to start from |
docs/privacy.md |
Privacy details |
docs/FAQ.md |
FAQ |
CHANGELOG.md |
Version history |
CONTRIBUTING.md |
Contribution guide |
The easiest contributions:
- New language — translate the
I18Nobject inindex.html. Two hours tops. - Your country's tax or pension logic — see
docs/tax-providers.mdfor the API and a template. - Public holiday data — add entries to the
HOLIDAYSobject. For make-up workdays, addtype: 'workday'to the entry. - Bug reports / feature requests — open an issue.
See CONTRIBUTING.md for everything else.
- Mainland China IIT (
cn-iit) + 五险一金 (cn-social-insurance) - First-run onboarding wizard
- macOS desktop widget + menu bar
- 调休 make-up workday support
- US Federal + State income tax
- Singapore CPF + IRAS
- UK PAYE + National Insurance
- Weekly / bi-weekly pay cycles
- Hourly employee mode
- PWA / installable app
- Windows / Linux desktop widget
Suggest or vote on features in issues.
![]() Dark |
![]() Light |
MIT. Do what you want with it. Just don't blame us when your coworkers catch you staring at the number instead of working.
If this was useful, a star helps more than you'd think. ⭐














