BestSites (formerly ONWI)
BestSites · Founder / product engineer
Built and launched a multilingual discovery board where free community launches compete on votes, paid placement sits on a separate board ordered by the amount paid, and every visibility claim stays explicit.
- Shipped free daily community launches with sign-in, voting, and review, alongside a paid ranking board, category boards, search, listing pages, and insights.
- Kept paid seats account-free: a completed payment claims a seat and issues a short-lived capability for publishing its listing.
- Enforced price, receipt, publishing, voting, and click-integrity rules in least-privilege Postgres functions rather than trusting the browser.
Next.js 16 · React 19 · TypeScript · Tailwind CSS 4 · Supabase Postgres · Polar · next-intl · Recharts · SaaS Pro Max
Context
BestSites is a website and product discovery board at bestsites.si. It launched in August 2026 as ONWI, a paid-placement board on onwi.lol, and was renamed on October 9, 2026. Every page on the old domain now redirects permanently to the new one. The site is available in Korean, English, and Uzbek.
The board has two separate rankings. Community launches are free and ranked by votes. Paid placement sits on its own board, and its order is the amount paid, never a quality or popularity score.
Problem
Sponsored discovery products often blur advertising and editorial rank. They also add accounts, dashboards, and opaque auction rules to a transaction that can be much simpler. BestSites needed to keep the commercial mechanic obvious, keep ranking changes deterministic, and protect every money-sensitive transition without exposing database credentials to the browser. It also needed a free way in for makers who are not ready to pay.
Approach
I treated payment as the authority for paid seats. The server reads the current seat price, calculates the valid next amount, creates checkout, and publishes only after a verified receipt is redeemed. A buyer does not need an account. The payment creates a short-lived capability that can name one listing without granting access to its price, publication state, or click count.
Free launches work differently. A maker signs in with Google or an email code, submits a website, and after review joins the next day's launch cohort in Korea Standard Time. Each account can vote once per launch, and payment never changes the community order.

What Shipped
- Free daily community launches with review, one open launch per account per day, voting, and a My launches page that shows review status.
- A paid ranking board with live, 24-hour, 7-day, and 30-day windows, category boards, a directory, search, listing pages, and insights.
- A free first seat in categories where nobody has paid yet, reviewed like a paid seat and clearly marked as free.
- Polar checkout and webhook handling for boosts, relaunches, and spotlights, with permanent receipt pages.
- Korean, English, and Uzbek routes with localized metadata and disclosure copy.
- Automated and human moderation that fails closed before any listing or edit can become public.
- A public launch and ranking guide, AI-readable listing pages, and consent-aware analytics through SaaS Pro Max.

Results
- BestSites is live at bestsites.si, and onwi.lol redirects every page there.
- Makers can launch for free and compete on votes, or buy visibility on a separate board whose order is stated plainly as advertising.
- The browser receives no Supabase credentials, and the application role cannot directly insert, update, or delete marketplace rows.
The ONWI to BestSites announcement explains the rename, the .si domain, and the free launch rules in detail.
Technical Notes
BestSites is a Next.js 16 application with TypeScript, Tailwind CSS 4, next-intl, Recharts, and Supabase Postgres. Browser reads go through the application API. Writes are limited to vetted SECURITY DEFINER database functions that enforce whole-dollar steps, monotonic amounts, single-use receipts, one vote per account, and webhook idempotency. Clicks use salted visitor hashes and minute-level deduplication without storing raw IP addresses.