01/ 05Oct – Nov 2026
Yoyū
yoyū · “leeway, room to breathe”
Work-hour tracking for international students in Japan.
Full-stack · Backend
Free tier: the first load takes about 40 seconds.
(opens in a new tab)

The problem
International students in Japan may work at most 28 hours in any 7 consecutive days, summed across every part-time job. Each employer only sees its own hours, so the student is the only one who can keep the total.
What I built
A bilingual (English/Japanese) installable PWA. A framework-free Java compliance engine evaluates every rolling 7-day window, overnight shifts and vacation-period limits behind a Spring Boot REST API, and PostgreSQL itself rejects overlapping shifts.
Engineering highlights
- Integrity lives in the database: a GiST exclusion constraint makes overlapping shifts impossible, while per-user row locks, optimistic locking and idempotency keys keep concurrent and retried writes consistent.
- Google and LINE sign-in through Spring Security (OAuth 2.0 / OpenID Connect with PKCE), plus HMAC-hashed email codes, CSRF protection and rate limiting.
- Schedule import that stays on the device: PDF.js and Tesseract.js OCR run in the browser, and an imported batch is saved atomically (all rows or none).
- Hosted on free tiers (Azure App Service and Neon PostgreSQL), so the first load after an idle period takes about 40 seconds.
- REST endpoints
- 42
- Flyway migrations
- 10
- backend tests (JUnit 5, Testcontainers)
- 511
- frontend tests (Vitest)
- 537
Stack
How a request moves through it
- React PWA
- Spring Security: session, CSRF, OIDC
- REST controllers and validation
- Services: user lock, idempotency
- Pure Java compliance engine
- PostgreSQL: GiST exclusion constraint
Limits, stated plainly
- A personal project with no real users.
- Deploys are manual, and there is no automated end-to-end browser suite.
- The current source is in a private repository, so only the live app is linked.







