LEETLABS
§ 00 / CASE FILE

Case study · ROSHI

One of Singapore's top three loan comparison marketplaces.

ROSHI is a live product where borrowers compare real loan offers and lenders compete for them. It runs in production in two markets — Singapore (roshi.sg) and Vietnam (roshi.vn) — with Singpass identity retrieval and a full application pipeline behind it.

§ 01 / RECORD

What ROSHI is

ROSHI is a loan comparison marketplace for Singapore, and one of the top three in the market. A borrower describes what they need, and instead of filling in the same form on ten different lender sites, they get matched to real offers in one place. It is an independent marketplace built around licensed lenders, and it runs in production today, taking real applications from borrowers.

The ROSHI marketplace homepage: compare loan options and get approved faster

The problem it solves

Shopping for a loan in Singapore is opaque and repetitive. Rates and eligibility are scattered across banks and licensed moneylenders, every application is a fresh form, and borrowers rarely know if they are getting a fair offer. ROSHI turns that into a single application that reaches multiple lenders, so the borrower compares real terms and the lenders compete for the business.

That only works if the product is genuinely production-grade. A loan application carries sensitive financial data, runs in a regulated market, and has to be right every time. This is not a prototype that impresses once. It is a system people trust with their money.

The build

ROSHI runs on React and Next.js with TypeScript on the front end, a Node and Express back end, and PostgreSQL with Prisma for data. That stack was chosen for the reasons it usually is: a typed codebase that a team can keep extending safely, server rendering for the marketing and application pages, and a relational database for data that has to stay consistent when money is involved.

The part that makes it feel effortless to the borrower is the Singpass integration. Applicants can apply with Singpass Myinfo, which retrieves verified identity and income data with their consent instead of asking them to key it in and upload documents by hand. The alternative manual path stays open for people without Singpass, so nobody is locked out.

The ROSHI application entry: apply manually or with Singpass Myinfo

Because ROSHI operates in Singapore with real financial data, data protection is not an afterthought. Consent, retrieval, and storage are built to fit how a regulated marketplace has to handle personal information here.

Two markets, two builds

ROSHI is not one website. It runs in Singapore as roshi.sg and in Vietnam as roshi.vn — the same marketplace serving two different countries, in two different languages. The landing experiences are built separately, on different stacks, because what converts a Singapore borrower is not what converts a Vietnamese one: different lenders, different regulations, different search behaviour, different design language. The Vietnam build is the more modern of the two, and lessons from each build feed the other.

Operating the same product across two markets is its own kind of proof: localisation that goes deeper than translation, two regulatory environments handled in one platform, and the discipline to rebuild a front end when the market demands it rather than force-fitting the old one.

Why this is proof

ROSHI is live, in a hard market, handling applications that carry real financial data and real money. It began as an MVP and became a marketplace people use every day, which is the exact arc most founders want: ship a real MVP fast, then grow it into production.

If you are building for the Singapore market, ROSHI is also proof we know the ground here, from Singpass to local data rules. That carries straight into our software development and app development work for Singapore businesses.

§ 02 / SIGN-OFF · CASE FILE ENDS HERE. YOUR BUILD STARTS.

Have a product that needs to run in production?

ROSHI started as an MVP and grew into a live marketplace. We can take your idea down the same path.