Inspiration

I'm a final-year data analytics student in Malaysia, and in a few months my coursemates and I will get our first job offer letters. They're 3–6 pages written for HR and lawyers, and companies often give you three days to sign. Most of us will sign without knowing that "RM3,800" isn't what lands in the bank, that clause 6 is a RM10,000 training bond, or that we've agreed to give three months' notice while the company only has to give one. Nobody teaches this, and many of our parents can't easily read the legal English either. Baca dulu is Malay for "read first".

What it does

Paste the text of an offer letter (or tap Try a sample letter) and Baca Dulu shows three things on one screen:

  1. What lands in your bank: a green-bar payslip that goes from gross pay to take-home, with EPF (11%), SOCSO, EIS and an estimated PCB income tax. Travel allowances are correctly left out of EPF. If probation is at reduced pay, it shows take-home during probation too.
  2. Clauses that could cost you: stamped cards for training bonds, reduced-pay probation, uneven notice periods, allowance-heavy pay, no overtime pay under RM4,000, non-competes, overseas transfers, short deadlines, annual leave and salary deductions. Each card quotes the exact sentence, highlights it in the letter when you tap it, explains it in plain English and says whether it's normal in Malaysia, citing the Employment Act 1955 or Contracts Act 1950 where relevant.
  3. Ask before you sign: 3–5 polite questions built from that letter's flags, copied as a ready-to-send email to HR.

It works with no API key using built-in rules. With a Gemini key it also reads the letter with Gemini, and every quote the AI returns is checked against the letter, so it can't invent a clause. Letters are never stored.

How I built it

I started from an empty folder with the Devpost Learn Skill Pack in Claude Code. I chose the idea and the key product decisions: one screen, numbers from tested code rather than AI, working without a key, a Malaysian payslip look, and no accounts or storage. Claude ran all six skills (1-start → 6-ship), wrote scope.md, prd.md and spec.md from those decisions, and built the app in five committed slices, with planning committed before any app code.

Stack: Next.js 16, React 19, TypeScript, plain CSS, Vitest, and the Gemini API (optional). 43 unit tests cover the statutory maths (checked against hand calculations and PERKESO band values), every clause rule, the HR questions and the AI fallback paths. A separate review pass fact-checked the legal and payroll claims against EPF, PERKESO, LHDN and law-firm sources, which led to three wording fixes and two threshold bugs.

Challenges I ran into

  • Getting the money right. EPF uses RM20 bands, SOCSO and EIS use RM100 band midpoints capped at RM6,000, and travel allowances aren't EPF wages. The overtime rule (RM4,000) also has to ignore travel allowances, which the fact-check caught.
  • Pointing at the real sentence. Every flag stores exact character positions, so highlights can't drift. A test checks every quote equals the letter text at that spot.
  • Not making it look like every other AI app. The design draws on Malaysian office paper: a white A4 letter on a desk, green-bar continuous-form payslip paper and rubber "chop" stamps.

Accomplishments that I'm proud of

The sample letter's four traps (bond, notice, probation pay, allowance) are all caught, and a fair letter gets "Looks normal" cards instead of false alarms. The tax line is a nice surprise: at RM3,800 it's only about RM10 a month.

What I learned

Planning first made the build fast: defining "done" as one demonstrable sentence kept the project to one screen instead of a chatbot. Turning each line of "what working looks like" into a test meant problems showed up as failing checks, not demo surprises. I also learned a lot about my own future payslip: travel allowances don't count for EPF, and the Employment Act says notice periods should be equal.

What's next for Baca Dulu

PDF and photo upload, Bahasa Malaysia and Chinese letters and interface (so parents can help), comparing two offers side by side, and sharing it with my coursemates at APU before graduation.

Built With

Share this project:

Updates

Submission history