Inspiration
Official letters and bills are stressful to open. The deadline and the amount are buried in dense paragraphs, and missing either one can mean late fees or a disconnected service. I wanted a tool that answers one question calmly: what do I need to do?
What it does
Paste the text of an English official letter and Notice Paper returns five plain-language cards: the deadline and amount due, a short summary, what happens if you ignore it, up to three next steps, and an "Also worth knowing" section for anything unclear. The interface works in English and Bahasa Indonesia. The server checks that the deadline and amount actually appear in the letter and shows a "Found in the letter" badge. This proves the figure is present, not that it is the right one, so people should still confirm with the sender.
How I built it
Node.js and Express on the back end, vanilla JavaScript on the front end, and the Gemini API (structured output) for reading the letter. The letter is passed as passive data with delimiter sanitizing to resist prompt injection. I built it with the Devpost Learn Skill Pack in Google Antigravity, following the scope, PRD and spec steps. The design was inspired by a prototype from another tool and a mockup made with Claude, with no code copied.
Challenges I ran into
- The first Gemini model name I used did not exist, so every request failed until I changed it in
.env. - The "found in the letter" badge showed "Not confirmed" even for correct values, and a letter with two deadlines paired the wrong date with the wrong amount. Both were fixed and re-tested with real sample letters.
- A stale "Not an Official Letter" card stayed on screen after a new input. I found it by testing edge cases by hand.
Accomplishments that I'm proud of
Four sample letters (a normal bill, one with two payment tiers, a vague notice, and a prompt-injection attempt) all give sensible results. The project has an offline test suite and live tests, and the first page scored 100 on Lighthouse accessibility on mobile and desktop.
What I learned
Verifying that a number appears in the source is not the same as verifying it is correct, so the app and the README say so openly. Testing with awkward real-world inputs found more bugs than reading the code did.
What's next for Notice Paper
Hosting it so people can try it without their own API key, translating the explanation when the language is switched, and supporting letters in more languages.
Built With
- css
- express.js
- gemini-api
- google-ai-studio
- html
- javascript
- node.js
Log in or sign up for Devpost to join the conversation.