Fullstack Developer

Irfana D. F

I build the parts of a product most people never see — payment flows that can't double-charge, real-time bridges that can't drop a message, APIs that hold up under concurrent writes. Currently freelancing across three production systems, backend-first.

Bandar Lampung, Indonesia · building since Aug 2023

profile.ts
1interface Profile {
2 name: string;
3 location: string;
4 role: string;
5 focus: string[];
6 education: string;
7}
8
9const me: Profile = {
10 name: "Irfana Dwi Fangga",
11 location: "Bandar Lampung, ID",
12 role: "Fullstack Developer",
13 focus: ["Payments", "Real-time", "Concurrency"],
14 education: "D3 IT @ Politeknik Negeri Lampung",
15};
16
17const introduce = () =>
18 me.role + " from " + me.location;

01

Currently building

Three production systems, running concurrently, all backend-first.

Seria — Freelance Fullstack Developer

Seria

Jan 2026 — Present

Freelance Fullstack Developer

The web ecosystem for a Minecraft server community — storefront, admin CMS, and a Java/Spigot plugin that bridges the web backend to the live game server over RCON. Payment gateway (Duitku) integration with signature verification and webhook idempotency.

Next.jsTypeScriptPrismaSupabasePostgreSQLAWSJavaRCONDuitku
GM Workspace — Freelance Fullstack Developer

GM Workspace

Jul 2026 — Present

Freelance Fullstack Developer

An internal management platform for a YouTube production team — automated payroll, a tiered bonus engine driven by asynchronous view-count syncing, and Google Drive integration with OAuth + encrypted token storage.

Next.jsTypeScriptTailwind CSSHeroUIPrismaSupabasePostgreSQLNextAuthYouTube APIGoogle Drive API
RSTPOS — Backend Developer Intern

RSTPOS

Feb 2026 — Jun 2026

Backend Developer Intern

A multi-branch Point of Sale system for retail/F&B. Built the REST API and internal dashboard — atomic stock adjustments, branch-scoped inventory, and role-based access.

Django REST FrameworkPostgreSQLDockerPython

02

System deep-dives

Not screenshots — the actual problems, and how they got solved.

Seria

Payments that can't double-charge

Duitku's payment webhook can retry, arrive out of order, or fire more than once for the same order — and every one of those has to end with exactly one entitlement granted, never zero, never two.

  • Verify every callback against Duitku's MD5 signature before touching the database
  • Treat the order row as the source of truth — a webhook for an already-PAID order short-circuits instead of re-granting
  • Only call the RCON bridge to grant the in-game item after the order state transition commits
Next.jsTypeScriptTailwind CSSShadcnUiPrismaSupabasePostgreSQLAWSDuitku

Seria

A real-time bridge to a game server

The webstore and the Minecraft server are two separate processes. A purchase on the web has to reach the game server reliably, and the plugin side has to speak RCON correctly under load.

  • Built a small RCON client in Java implementing the packet protocol directly (auth, exec, response) rather than pulling in a heavier framework
  • Wrapped entitlement grants behind a single sendCommand path so retries and failures are handled in one place
  • Kept the plugin's responsibilities narrow — permission grants and in-game notifications, nothing else
JavaSpigotRCON

RSTPOS

Inventory that survives concurrent branches

Multiple branches can adjust stock for the same product at the same time. Without locking, two concurrent requests can both read the same quantity and one adjustment silently overwrites the other.

  • Used select_for_update() inside an atomic transaction to lock the stock row for the duration of the adjustment
  • Rejected adjustments that would push quantity negative, before the write ever happens
  • Logged every adjustment (branch, product, quantity, reason) for audit and reconciliation
Django REST FrameworkPythonPostgreSQLDocker

GM Workspace

A payroll engine that can't pay twice

Bonus tiers are driven by asynchronous view-count syncing jobs. If a sync job overlaps with a payroll run, or retries after a partial failure, the same bonus can get queued more than once.

  • Ordered guard logic around the payout step so a bonus can only move from 'pending' to 'paid' once
  • Decoupled the view-count sync from the payout calculation so a slow or retried sync never blocks payroll from running on schedule
  • Modeled tiers as data, not conditionals, so a new bonus tier is a config change, not a deploy
Next.jsTypeScriptTailwind CSSHeroUIPrismaSupabasePostgreSQLNextAuthYouTube APIGoogle Drive API

03

Side project

Built on my own time, held to the same standard as client work.

YouTube to MP3 & MP4 desktop app, showing the conversion screen and its job queue

YouTube to MP3 & MP4

Sep 2026

Local desktop app · Go + React · audio & video

Paste a YouTube link and get an MP3, M4A, Opus, FLAC, WAV — or an MP4, MKV, WebM video up to 4K — with title, artist, cover art and album tags already filled in, entirely on your own machine. A Go backend keeps a persistent job queue in SQLite, drives yt-dlp and FFmpeg as child processes, and streams live progress to a bilingual React UI over Server-Sent Events. One-click tool installation with SHA-256 verification, a settings dialog with a native OS folder picker, idle auto-shutdown, crash recovery, and a Windows installer — all from a single pure-Go binary.

  • Layered design with one-way imports: the domain knows nothing about HTTP, SQL or child processes, and every adapter is wired in main alone
  • A finished file only appears by atomic rename from temp, after its name is claimed through an O_EXCL reservation, so two workers can never write the same path
  • On startup, crash recovery marks interrupted jobs failed, collects orphaned temp files and reconciles the history with what is actually on disk
GoReactTypeScriptSQLiteFFmpegyt-dlpViteINInno SetupGitHub Actions
View source on GitHub(opens in a new tab)
Go test functions
280+
OSes tested in CI
3
cross-compiled targets
5
cgo dependencies
0

Cancel that kills the whole process tree

yt-dlp spawns FFmpeg, and on Windows killing a process does not kill its children. A naive cancel leaves an orphaned FFmpeg still writing, and a temp file the OS refuses to delete because something still holds it open.

  • Every child is adopted into a Windows Job Object with KILL_ON_JOB_CLOSE, so closing one handle ends the entire tree, grandchildren included
  • Cancel sends a soft CTRL_BREAK first and closes the job after a grace period; Unix process groups get the same two-step treatment
  • Temp files are removed only after the process has actually exited, and CI proves tree termination on Windows, macOS and Linux
GoFFmpegyt-dlp

Live progress that survives a reconnect

The UI follows each job over Server-Sent Events. Reading stored history and then subscribing leaves a gap: any event fired between the two steps is lost for good, and a reconnecting tab can miss the one state change that mattered.

  • Subscribe to the live stream first, then read persisted history, and drop live events whose sequence number the history already delivered
  • Only state, error and done are persisted and replayable; progress is lossy, throttled to four updates a second, and a reconnect gets one fresh snapshot instead of stale frames
  • A slow subscriber may lose progress frames but never a state change: if one would block, that connection is closed rather than stalling the publisher
GoReactTypeScriptSQLite

Retries that know when to give up

A download can fail because the network blinked, because the source rate-limited the machine, or because the video is private. Retrying all three the same way either gives up too early or hammers a source that has already said no.

  • Every failure is classified as transient, throttled, tool outdated, permanent or local, and only transient and throttled failures retry automatically, at most three times
  • Throttled retries back off from 30 seconds to 5 minutes with ±20% jitter, so jobs limited together do not all return at once and trigger the next limit
  • After an HTTP 429 the scheduler runs one job at a time for a five-minute cooldown, because parallel downloads only extend the throttling
GoSQLite

04

Tech stack

  • Languages: JavaScript, TypeScript, Go, Java, Python, PHP
  • Frontend: Next.js, React, Tailwind CSS, HeroUI
  • Backend: Node.js, Django REST, Spring, Prisma, NextAuth, Celery, HTMX
  • Database: PostgreSQL, Supabase, Redis, Upstash
  • Tools: Docker, Git, GitHub, Vercel, AWS, Postman, Google Cloud Console
Languages
JavaScript · TypeScript · Go · Java · Python · PHP
Frontend
Next.js · React · Tailwind CSS · HeroUI
Backend
Node.js · Django REST · Spring · Prisma · NextAuth · Celery · HTMX
Database
PostgreSQL · Supabase · Redis · Upstash
Tools
Docker · Git · GitHub · Vercel · AWS · Postman · Google Cloud Console

05

Experience

GM Workspace

Jul 2026 — Present

Freelance Fullstack Developer

Remote · Individual client

  • Designed the payroll and tiered bonus engine end to end, including concurrency-safe payout logic
  • Integrated Google Drive (OAuth + AES-256-GCM encrypted token storage) for team asset management

RSTPOS — PT. Rizq Sanjaya Teknologi

Feb 2026 — Jun 2026

Backend Developer Intern

Internship

  • Built REST APIs and the internal dashboard for a multi-branch retail/F&B POS system
  • Implemented atomic, race-safe stock adjustment logic across branches

Seria

Jan 2026 — Present

Freelance Fullstack Developer

Remote · Minecraft server community

  • Built the storefront, admin CMS, and payment gateway integration (Duitku)
  • Wrote a Java/Spigot plugin bridging the web backend and game server in real time via RCON

Politeknik Negeri Lampung

Aug 2023 — Present

D3 Information Technology

Bandar Lampung, Indonesia

  • Best Presentation winner at Expo 2025 for a digital building-reservation system for the campus — Next.js, Redis (Upstash), Supabase Postgres
  • Where the hands-on development track started — three years in, still going

06

Let's talk

Bandar Lampung, Indonesia. Open to remote fullstack roles — backend-first — and open to discussing relocation for the right one.

New Message
0/2000

Available for new work