Wenyi
← Back to projects
01

Rate My PW

Founder · Product Designer · Builder · 2025–Present

Public

A personal habit for remembering paid gaming sessions grew into a live reputation, records, and discovery product — designed, built, and shipped solo.

RoleFounder, Product Designer, Builder — solo
ScopeProduct definition, IA, UX/UI, design system, implementation
Design premiseMobile-first PWA — before, during & after play
Timeline2025 — Present, ongoing
Rate My PW homepage — mixed feed of reviews, sessions, and community posts

A small personal tool, repeatedly redefined. Each chapter starts where the previous answer stopped being enough.

Live Product is Chinese production. English Demo is a static, privacy-safe portfolio version with frozen fictional data. English screenshots below show the demo, not customer activity.

01 — The starting point

A habit I couldn’t keep in my head anymore

“PW” is short for peiwan (陪玩): a paid companion player you book to play games with you. I was a player in this market, keeping my own spreadsheet of sessions.

$30–45 / hr
Typical companion-gaming sessions
$90+ / hr
Premium / celebrity players
$15M+ / month
Reported volume at a major platform

Market context supplied for this case study, not RMP revenue or measured outcomes. The volume figure refers to reported transactions at Dongdong Esports. Companion-gaming livestreams can draw 10K+ concurrent viewers.

Information about who was worth booking lived across livestreams, group chats, Xiaohongshu, Douyin, and private spreadsheets. My own records stopped helping me remember who I played with, which store they came from, what I paid, and how it went.

The first job was to make an experience worth remembering findable again.

I started with Reviews and Search, anchored to two entities: Player and Store. Different stores meant different prices, rules, and order types; a player’s reputation needed that context.

  • PlayerHow the person played and communicated.
  • StoreThe service, pricing, and after-sales context.
Player reputation with rating dimensions and session-backed reviews
Player detail brings scattered opinions into a shared context.

The next gap: remembering an opinion still didn’t explain the session itself.

02 — From opinion to record

How it felt vs. what actually happened

Reviews captured how the experience felt. Orders captured what actually happened.

A Review could describe a good or bad experience. It couldn’t hold the round-by-round detail: extracted value, eliminations, progress toward a target, or how a session ended. Orders became a separate, structured personal record.

Mobile Order detail with session progress and round records
01 / Record — session context and gameplay details stay together.
Mobile Order history with target progress and three rounds showing results, maps, extracted values and eliminations
02 / Round by round — results, progress, and gameplay details.
OCR capture dialog with screenshot guidance and a review-before-save reminder
03 / Reduce entry — capture guidance and a reminder to review amounts before saving.

More evidence, without forced publication

Orders are primarily private. A completed Order can also back a public Review through a small provenance badge, giving the opinion a traceable session context.

More detail created more work

Logging every round by hand became expensive. I introduced PaddleOCR screenshot capture to turn round results into editable fields. Optional values and manual correction remained part of the flow.

Automation should reduce work, not create more correction work.

The OCR dialog keeps the boundary visible: images stay on the device, and amounts can be reviewed before saving. Machine output is a proposal.

Richer records made retrieval a bigger product problem.

04 — Participation & trust

Lowering the barrier without lowering trust

Requiring an account adds commitment before someone can share useful information. Guest contribution lowered that barrier, while making the boundaries around public content more important.

Low commitment needed guardrails

  • Existing targetsGuest Reviews can only reference existing Players or Stores.
  • Public intentGuest Reviews enter Pending; they are not private account records.
  • Bounded accessRate limits and bot checks constrain anonymous submissions.

Opening contribution also carries a cost: Guest Reviews lack account-based owner management, and public contributions require moderation.

The account view beside this text shows the separate member experience: Published, In Review, and Private states. It is not a Guest dashboard.

Member review management showing Published, In Review and Private states
Visibility and review status remain legible to the owner.

As contribution expanded, moderation developed into layered safe, defer, and reject checks, with human fallback for ambiguity. Private recording stays separate from the public-content queue.

The information should matter more than the identity of the person posting it.

Public Reviews, Orders, and Community Posts are anonymous by default. Comments deliberately show member usernames so discussion reads as a conversation. Owners can also choose a nickname in share cards.

Making contribution possible didn’t, by itself, create a reason to come back.

05 — A reason to return

Discovery without becoming a forum

The record-and-search loop made a useful personal utility. During cold start, it could still feel quiet between sessions. The next question was how to add fresh reasons to return while keeping reputation information at the center.

A useful tool still needed a reason to return.

Mobile mixed feed bringing community posts into the reputation product
Discover — fresh posts share the feed with reputation and session context.
Community Post with linked Player and Store and member comments
Follow the context — posts connect back to Players, Stores, and discussion.

Freshness with a purpose

Community Posts—“Tea” in the demo, 吃瓜 in production—combine short-form stories, topics, optional Player or Store associations, comments, and likes. They lead back into Games, entities, and Search.

A deliberate scope tradeoff

Fresh content also introduces media, discussion, and a larger moderation workload. Return visits were the design intent; there is no measured retention result to claim.

Companion surface

Built for the phone next to the keyboard

Most target games are played on PC. My design premise was to make the phone a practical companion before, during, and after play. Mobile-first rules and an installable PWA made that premise tangible.

  • BeforeCheck a Player’s reputation.
  • DuringReference information beside the game.
  • AfterRecord the session while it is fresh.
Personal Center with the player profile, active session progress and monthly gameplay report
Personal Center — active sessions and a monthly overview.
Player share-card preview showing Nova's store, games, rating and review count with sharing controls
Share card — a portable summary of Player reputation.
Desktop Order detail preserving the same session model
A wider layout gives the same records more room on desktop.
Open full-size image ↗
Supporting the system

One UI contract as the surface area grew

As the product expanded, I formalized the UI rules so new features did not fragment the experience. Search and content patterns, mobile-first behavior, and shared primitives became reusable decisions.

Neutral actionsColor carries entity meaning
Session details…

6px controls · 8px cards · 12px elevated surfaces
Geist-inspired inputs · Lucide icons · shared Light/Dark rules

One system, two themes

Light and Dark preserve the same content hierarchy and interaction patterns. Theme support is one check that the shared rules hold together.

Homepage in Light theme
Light
The same homepage in Dark theme
Dark
Implementation evidence

Designed—and built—end to end

The product decisions also live in the implementation. These two excerpts are copied directly from the product source.

One Search, multiple kinds of contextapp/HomeClient.tsx:8289

A single result model connects Players, Stores, Orders, and Community Posts (GUA), alongside topics and recent items.

type HomeSearchSuggestion =
  | { key: string; type: "TAG"; tag: string }
  | { key: string; type: "TOPIC"; topic: GuaTopicSuggestion }
  | { key: string; type: "RECENT"; item: RecentItem }
  | { key: string; type: "PLAYER"; item: Player }
  | { key: string; type: "STORE"; item: Store }
  | { key: string; type: "ORDER"; item: DiscoverableOrder }
  | { key: string; type: "GUA"; item: GuaPost };
Extraction still needs a save gateapp/components/OrderRecordOcrDialog.tsx:151157

Saving requires a valid amount for every selected round and no outstanding amount-confirmation flag. Automation assists; unresolved values cannot silently become records.

  const canSave =
    selectedCandidates.length > 0 &&
    selectedCandidates.every(
      (candidate) =>
        actualInputToWan(candidate.actualInput) !== null &&
        !candidate.needsActualConfirmation,
    );
Where it stands

A personal tool became a connected, shipped system

I defined, designed, built, and launched the product: a mobile-first reputation and records system with Search, OCR-assisted entry, contribution controls, and Community discovery.

The Chinese production product is live. The separate English demo presents its core experience with fictional, frozen data for portfolio review.

No adoption, Guest-conversion, OCR-completion, or Search-success metrics are claimed. The evidence here is the shipped product and the decisions behind it.

Chinese-language Rate My PW production homepage
Live Product — Chinese production. The only production screenshot in this case study.

Each step came from the previous answer running out of room.

Have a similar problem to work through?

wenyigu0831@gmail.com