wosmo
← all projects

project 09 of 09 · web · product

BondCheck

Pakistan prize bond results and market rates

● live · bondcheck.vercel.app/ensince 2026pushed 1d ago

Checks bond numbers against every published draw back to 2000, with each result traced to its official source. A private wallet needs no sign-up, and gold, silver and currency rates come with history. English and Urdu, as a website and an Android app.

BondCheck screenshot
screenshot · bondcheck.vercel.app/en ↗

About

from the readme on github

BondCheck is a Pakistan prize bond and markets service: every draw result with its sources, a private bond wallet that needs no sign-up, and gold, silver and currency rates with history. It ships as a fast, installable website in English and Urdu and as an Android app built from the same repository.

Features

  • Prize bonds. Results for every denomination (Rs 100 to Rs 40,000 and the premium bonds) from 2000 to today, each draw with its prize table, first and second prize numbers, the full searchable list, a text download, its source documents and a status (verified, published or under review). A checker takes up to 1,000 numbers or ranges at once and can read numbers from a photo or PDF on the device. A public coverage report shows which years and denominations are complete.
  • My bonds. An anonymous wallet per person: add bonds by typing, pasting, ranges, spreadsheet import or scanning; every bond is checked against every past draw and against each new draw; wins, near misses, unclaimed prize reminders and draw day notifications. A sync code moves the wallet to another device. Nothing identifies the person and the wallet can be deleted in one step.
  • Markets. Gold per tola and 10 grams at 24K, 22K, 21K and 18K for Pakistan and ten countries, silver, platinum and palladium, the rupee's interbank and open market rates, a converter and charts with an accessible table alternative. Every number says whether it is reported by an association or estimated from spot prices, and names its source.
  • For everyone. WCAG 2.2 AA in both languages, right to left Urdu with Nastaliq type, light and dark themes, works offline after the first visit, installable as an app, structured data and sitemaps for search.
  • Android app. The same checker, results, wallet and rates, with camera scanning, local draw reminders and in-app updates, distributed from the website's download page.

Architecture

  • One contract, two clients. Every request and response has a zod schema in packages/shared; the website, the API handlers and the Android app all use it.
  • Static first. Public pages are statically generated and revalidated by cache tag after each ingestion run; only the checker, the wallet and the release downloads are dynamic.
  • Ingestion. Jobs follow discover, fetch, parse, validate, reconcile, commit. They are idempotent, resumable from a cursor and rate limited per host. Every fetched document is stored by SHA-256 and linked to the draws it produced. Schedulers (GitHub Actions for frequency, Vercel Cron as a daily safety net, Cloudflare Cron later) all call the same authenticated endpoint, /api/v1/cron/.
  • Privacy. Wallets are a random id and a 256-bit token stored as an HMAC; sync codes are hashed the same way. No accounts, no fingerprinting, no IP or location storage; rate limits use keyed hashes.
  • Portable hosting. Hosting-specific code lives only in apps/web/src/platform, and the app builds for Cloudflare Workers with OpenNext as well as for Vercel.

The full design is in docs/PLAN.md, with decisions recorded in docs/adr/.

Development

Requirements: Node 22 and Bun 1.3.

Every environment variable is optional during development (apps/web/.env.example lists them); without a database the pages show a friendly "data unavailable" state, and the end to end suites run on recorded data. Tests never touch a real database: they use an in-memory PGlite with the real migrations. See docs/DEVELOPMENT.md for the conventions and the end to end suites, and docs/MOBILE_RELEASE.md for the Android app.

Data sources and attribution

Built with

github language bytes · live
composition
HTML59.0%TypeScript39.3%JavaScript1.0%Other0.4%CSS0.3%
stack
Next.jsTypeScriptPostgreSQLExpo