Reyhan Rizqi

Reyhan Rizqi

Web and mobile developer. Ledgers, payments, inventory systems.

Work

Liberty Game screenshot

01

Liberty Game

Storefront and admin panel for a gaming store in Mangga Dua Square, Jakarta. Catalogue, blog, Midtrans checkout, and Biteship shipping rates.

  • React 19
  • TypeScript
  • Vite
  • Tailwind
  • Vercel Functions
  • Turso (libSQL)
  • Midtrans
  • Biteship
Case study
Problem
A physical gaming store needed an online catalogue, checkout, and an admin panel its staff could run without a developer.
My role
Developer. Built the storefront, admin panel, serverless API, and Midtrans checkout.
Key decisions
  • Midtrans Snap is embedded in the page instead of using a redirect, because a redirect flow had broken checkout in an earlier project when in-app browsers intercepted it.
  • Payment webhooks are signature-verified, and stock is decremented only on the pending to paid transition, so duplicate notifications cannot decrement it twice.
  • libSQL locally and Turso in production, switched by environment variables, so the same code runs in both.
  • A sitemap endpoint and one canonical www address, so search engines see a single site.
Outcome
Live at libertygame.id. Handed over on 13 August 2026 with 76 products (58 games, 10 consoles, 8 accessories), 15 public pages, 5 blog posts, and the admin panel.
Visit site
Detakku screenshot

02

Detakku

AI health assistant for iOS, Android, and web. Track steps and vitals, estimate calories from a meal photo, and ask Babu, the in-app AI buddy.

  • Expo
  • React Native
  • TypeScript
  • tRPC
  • Drizzle
  • MySQL
  • Stripe
Case study
Problem
Most health apps assume a confident smartphone user. Detakku is built so parents and grandparents can use it too: large text, one clear action per screen, and an AI buddy that answers in plain language.
My role
Developer. Built the Expo app and its tRPC and Drizzle backend.
Key decisions
  • Caregiver mode: a family member can be linked to a relative through an invite and receive alerts.
  • Bilingual in English and Indonesian.
  • Credit-based AI usage, billed with Stripe on the web. The first native release is consumption-only, with free credits and no purchase buttons.
  • The repo has 182 test files, including account deletion and payment replay cases.
Outcome
Live at detakku.com with an Android build to download. iOS and Android store submissions are prepared, with a release runbook.
Visit site
Core banking service diagram

03

Core banking service

Internal transfers with a double-entry ledger. Retries are safe, accounts are locked in order, and every posting is audited.

  • Java 17
  • Spring Boot 3
  • PostgreSQL
  • Flyway
  • Docker
Details
  • Every transfer posts one debit and one credit, and is rejected in code if they do not balance.
  • Accounts are locked in account-number order to reduce deadlock risk.
  • An Idempotency-Key header makes client retries safe: a repeat returns 200 with replayed: true and posts nothing.
  • Rule-based fraud screening and a daily limit run before money moves.
  • Events go to an outbox table in the same transaction, with an optional Kafka relay.
View on GitHub
PintuMedia diagram

04

PintuMedia

Streaming platform foundation: five free episodes, then a paywall, plans, and an affiliate dashboard.

  • Next.js
  • TypeScript
  • Supabase (PostgreSQL, RLS)
  • Midtrans / Xendit
Details
create or replace function public.fulfill_paid_order() returns trigger language plpgsql security definer set search_path = '' as $$
declare entitlement_expiry timestamptz;
begin
  if new.status = 'paid' and old.status is distinct from 'paid' then
    entitlement_expiry := case new.plan_id when 'weekly' then now() + interval '7 days' when 'monthly' then now() + interval '1 month' else null end;
    insert into public.entitlements (user_id, email, order_id, series_id, expires_at)
    values (new.user_id, new.email, new.id, new.series_id, entitlement_expiry) on conflict (order_id) do nothing;
    if new.referrer_profile_id is not null and new.referrer_profile_id is distinct from new.user_id then
      insert into public.affiliate_commissions (partner_id, order_id, amount, status)
      values (new.referrer_profile_id, new.id, floor(new.amount * 0.20), 'available') on conflict (order_id) do nothing;
    end if;
  end if;
  return new;
end;
$$;
create trigger on_order_paid after update of status on public.orders for each row execute procedure public.fulfill_paid_order();
View on GitHub
Warehouse management with demand forecasting diagram

05

Warehouse management with demand forecasting

Multi-warehouse stock system. Demand forecasting and anomaly detection run in a separate Python service.

  • Next.js
  • NestJS
  • Prisma
  • PostgreSQL
  • Redis
  • FastAPI + Prophet
  • Docker
View on GitHub

More on GitHub

All repositories

Got a project?

Tell me what you are building, your stack, and when you need someone.

Based in Surabaya (WIB, UTC+7). Open to remote work with teams abroad.