Skip to content
← projects

PT Pintu Kemana Saja · Jul 2024 — Present

Pintu

A crypto platform to buy, sell, trade, and store assets — with real-time market data, wallets, Rupiah deposits, and Pintu Earn.

Pintu — cover
Role
Frontend Engineer
Timeline
Jul 2024 — Present

Overview

Pintu is one of the largest cryptocurrency applications in Indonesia, serving millions of retail investors. I work as a Frontend Engineer across several surfaces: the Web3 side — a self-custody, multi-chain wallet with cross-chain swap — the Retail side — the everyday buy, sell, and market screens — Pintu web, the public-facing market site, and the internal tools the team relies on day to day. The mobile app is a long-lived React Native codebase where the real test isn't shipping a feature, it's shipping it right.

The Web3 feature set

On the Web3 side I contribute to a self-custody, multi-chain experience across Ethereum, Solana, Arbitrum, BSC, Optimism, Base, Avalanche, and Polygon:

  • Wallet home — a unified balance view across multiple chains, with consistent token rows, per-chain context, and quick actions.
  • Cross-chain swap — spend a token on one chain and receive another, with live quotes, estimated swap time, routing partner, and reverse rates.
Web3 — one entry point across eight-plus chains: Avalanche, Solana, Arbitrum, BSC, Ethereum, Optimism, Base, Polygon
Web3 — one entry point across eight-plus chains: Avalanche, Solana, Arbitrum, BSC, Ethereum, Optimism, Base, Polygon

The retail feature set

On the Retail side I contribute to the surfaces users touch every day:

  • Markets — a multi-asset browser across crypto, stocks, commodity, and ETF, with gainers/losers, sparklines, and search over a long, live list.
  • Buy / sell order ticket — instant and limit orders, percentage presets, an estimated price, and an optional Auto-Invest (DCA) toggle, all on a numeric-keypad input that has to feel instant.
  • Asset detail — price, an interactive chart across timeframes, and the General / Orders / News tabs, with buy and sell pinned within reach.
Retail — markets, order ticket, and asset detail across crypto, stocks, commodity, and ETF
Retail — markets, order ticket, and asset detail across crypto, stocks, commodity, and ETF

Pintu web

Beyond the mobile app, I also develop the Pintu web (pintu.co.id) — the public-facing market surface built with Next.js and TypeScript. It renders live prices in Rupiah across crypto, US stocks, commodities, and ETFs, with Top Volume / Top Gainers / Top Losers boards and a sortable market table (24H, 1W, 1M, 1Y, market cap) that stays fast and readable while quotes update in real time.

On this surface my work centred on two things:

  • Integrations — wiring the web up to the market-data and pricing services that feed the live tables and asset pages, plus the third-party services the site depends on (analytics, tracking, and content sources), keeping the data layer fully typed end to end.
  • SEO — this is a public, discoverable site, so I focused on the fundamentals that make it rank: server-rendered metadata and Open Graph tags, structured data, clean semantic markup, and fast, crawlable pages.
Pintu web — live Rupiah prices, top movers, and a sortable multi-asset market table
Pintu web — live Rupiah prices, top movers, and a sortable multi-asset market table

Performance optimisation

A crypto app is real-time and data-dense, so I treat performance as a feature, not an afterthought. Every change is measured, not guessed — I profile a real session, make one change, and profile again to prove it moved the number.

How I measure:

  • Flashlight for end-to-end runs — the trade flow lands a 98/100 score at 57.6 avg FPS, ~39% avg CPU, and no high-CPU spikes.
  • React DevTools Profiler to find expensive re-renders and confirm the React Compiler is auto-memoizing the heavy list and header components.
  • Chrome performance timelines across the scheduler, component, and native tracks to trace jank down to the specific commit that caused it.
  • Regressions caught in CI via Bitrise before they reach users.
Profiling the trade flow — Flashlight (98 score, FPS / CPU / RAM), React DevTools Profiler (auto-memoized by the React Compiler), and the Chrome performance timeline
Profiling the trade flow — Flashlight (98 score, FPS / CPU / RAM), React DevTools Profiler (auto-memoized by the React Compiler), and the Chrome performance timeline

What I optimise:

  • Keep the JS thread free. In React Native, dropped frames almost always trace back to a blocked JS thread, so I move work off it — animations run on the UI thread via the native driver (Reanimated), and formatting and derived values are memoized instead of recomputed on every render.
  • Fast, windowed lists. The markets and asset lists are long and live, so rows are virtualised and memoized with stable keys, a fixed item layout to skip measurement, and quotes updated in place rather than re-rendering the whole list on every tick.
  • Lazy-load what isn't on screen. Heavy, non-critical surfaces — charts, secondary tabs, the swap selector — are code-split and mounted on demand, so the first frame ships less JavaScript and the initial screen paints sooner.
  • Optimise images. Assets are served at the size they render, cached, and loaded progressively so token icons and covers never block the main thread or cause layout shift.

Under the hood

  • Mobile: React Native + Expo, TypeScript, React Hook Form + Zod, React Compiler.
  • Web: Next.js + TypeScript — the public pintu.co.id market site plus internal tools.
  • Measure & ship: Flashlight, React DevTools Profiler, Chrome DevTools, Bitrise.

Tools

Figma · VS Code · Git · JIRA · Bitrise · Docker · Jenkins · Tailscale · Flashlight · Sentry · Crashlytics

Next project

Otalase