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.

- Role
- Frontend Engineer
- Timeline
- Jul 2024 — Present
- Stack
- Links
- live ↗
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.

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.

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.

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.

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→