Fullstack Developer

Irfana D. F

Saya membangun bagian produk yang jarang terlihat — alur pembayaran yang tidak bisa menagih dua kali, jembatan real-time yang tidak kehilangan pesan, dan API yang tetap kokoh saat menerima banyak tulisan bersamaan. Saat ini freelance di tiga sistem produksi, dengan fokus backend.

Bandar Lampung, Indonesia · membangun sejak Agu 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

Sedang dibangun

Tiga sistem produksi, berjalan bersamaan, semuanya berfokus pada backend.

Seria — Fullstack Developer Freelance

Seria

Jan 2026 — Sekarang

Fullstack Developer Freelance

Ekosistem web untuk komunitas server Minecraft — storefront, CMS admin, dan plugin Java/Spigot yang menghubungkan backend web ke server game yang sedang berjalan lewat RCON. Integrasi payment gateway (Duitku) dengan verifikasi signature dan webhook yang idempoten.

Next.jsTypeScriptPrismaSupabasePostgreSQLAWSJavaRCONDuitku
GM Workspace — Fullstack Developer Freelance

GM Workspace

Jul 2026 — Sekarang

Fullstack Developer Freelance

Platform manajemen internal untuk tim produksi YouTube — penggajian otomatis, mesin bonus bertingkat yang digerakkan sinkronisasi jumlah view secara asinkron, dan integrasi Google Drive dengan OAuth + penyimpanan token terenkripsi.

Next.jsTypeScriptTailwind CSSHeroUIPrismaSupabasePostgreSQLNextAuthYouTube APIGoogle Drive API
RSTPOS — Backend Developer (Magang)

RSTPOS

Feb 2026 — Jun 2026

Backend Developer (Magang)

Sistem Point of Sale multi-cabang untuk retail/F&B. Membangun REST API dan dashboard internal — penyesuaian stok yang atomik, inventaris per cabang, dan akses berbasis peran.

Django REST FrameworkPostgreSQLDockerPython

02

Bedah sistem

Bukan sekadar tangkapan layar — masalah yang sebenarnya, dan cara menyelesaikannya.

Seria

Pembayaran yang tidak bisa menagih dua kali

Webhook pembayaran Duitku bisa dikirim ulang, datang tidak berurutan, atau terpicu lebih dari sekali untuk pesanan yang sama — dan semuanya harus berakhir dengan tepat satu item diberikan, tidak nol, tidak dua.

  • Memverifikasi setiap callback dengan signature MD5 dari Duitku sebelum menyentuh database
  • Menjadikan baris pesanan sebagai sumber kebenaran — webhook untuk pesanan yang sudah PAID langsung dihentikan, bukan memberikan item lagi
  • Baru memanggil jembatan RCON untuk memberikan item di dalam game setelah perubahan status pesanan tersimpan
Next.jsTypeScriptTailwind CSSShadcnUiPrismaSupabasePostgreSQLAWSDuitku

Seria

Jembatan real-time ke server game

Webstore dan server Minecraft adalah dua proses terpisah. Pembelian di web harus sampai ke server game dengan andal, dan sisi plugin harus menjalankan RCON dengan benar saat beban sedang tinggi.

  • Membangun klien RCON kecil di Java yang langsung mengimplementasikan protokol paketnya (auth, exec, response), alih-alih memakai framework yang lebih berat
  • Membungkus pemberian item di balik satu jalur sendCommand, sehingga retry dan kegagalan ditangani di satu tempat
  • Menjaga tanggung jawab plugin tetap sempit — hanya pemberian izin dan notifikasi di dalam game
JavaSpigotRCON

RSTPOS

Inventaris yang aman saat banyak cabang bekerja bersamaan

Beberapa cabang bisa menyesuaikan stok produk yang sama di waktu yang bersamaan. Tanpa penguncian, dua request bersamaan bisa membaca jumlah yang sama, dan satu penyesuaian diam-diam menimpa yang lain.

  • Memakai select_for_update() di dalam transaksi atomik untuk mengunci baris stok selama penyesuaian berlangsung
  • Menolak penyesuaian yang akan membuat jumlah stok negatif, sebelum data sempat ditulis
  • Mencatat setiap penyesuaian (cabang, produk, jumlah, alasan) untuk audit dan rekonsiliasi
Django REST FrameworkPythonPostgreSQLDocker

GM Workspace

Mesin penggajian yang tidak bisa membayar dua kali

Tingkatan bonus digerakkan oleh job sinkronisasi jumlah view yang berjalan asinkron. Jika job sinkronisasi bertumpuk dengan proses penggajian, atau diulang setelah gagal sebagian, bonus yang sama bisa masuk antrean lebih dari sekali.

  • Menyusun logika penjaga yang berurutan di langkah pembayaran, sehingga bonus hanya bisa berpindah dari 'pending' ke 'paid' satu kali
  • Memisahkan sinkronisasi jumlah view dari perhitungan pembayaran, sehingga sinkronisasi yang lambat atau diulang tidak pernah menghambat penggajian sesuai jadwal
  • Memodelkan tingkatan bonus sebagai data, bukan percabangan kondisi, sehingga tingkatan baru cukup diubah lewat konfigurasi, bukan deploy
Next.jsTypeScriptTailwind CSSHeroUIPrismaSupabasePostgreSQLNextAuthYouTube APIGoogle Drive API

03

Proyek pribadi

Dibangun di waktu luang, dengan standar yang sama seperti pekerjaan klien.

Aplikasi desktop YT To MP3 Converter, menampilkan layar konversi dan antrean job-nya

YT To MP3 Converter

Sep 2026

Aplikasi desktop lokal · Go + React

Tempel link video dan dapatkan MP3 dengan judul, artis, cover art, dan tag album yang sudah terisi — sepenuhnya di komputer sendiri, tanpa akun dan tanpa ada yang diunggah. Backend Go menyimpan antrean job yang persisten di SQLite, menjalankan yt-dlp dan FFmpeg sebagai child process, dan mengalirkan progres secara langsung ke UI React lewat Server-Sent Events. Hasil build-nya berupa satu binary Go murni dan installer Windows.

  • Desain berlapis dengan import satu arah: domain tidak tahu apa pun tentang HTTP, SQL, atau child process, dan setiap adapter hanya dirangkai di main
  • File hasil hanya muncul lewat rename atomik dari file sementara, setelah namanya diklaim lewat reservasi O_EXCL, sehingga dua worker tidak pernah menulis ke path yang sama
  • Saat aplikasi dijalankan, pemulihan crash menandai job yang terputus sebagai gagal, membersihkan file sementara yang tertinggal, dan mencocokkan riwayat dengan isi disk yang sebenarnya
GoReactTypeScriptSQLiteFFmpegyt-dlpViteGitHub Actions
Lihat kode sumber di GitHub(terbuka di tab baru)
fungsi tes Go
215
OS yang dites di CI
3
target cross-compile
5
dependensi cgo
0

Cancel yang mematikan seluruh pohon proses

yt-dlp menjalankan FFmpeg, dan di Windows mematikan sebuah proses tidak ikut mematikan proses anaknya. Cancel yang naif meninggalkan FFmpeg yatim yang masih menulis, dan file sementara yang tidak bisa dihapus OS karena masih dipakai.

  • Setiap child process dimasukkan ke Windows Job Object dengan KILL_ON_JOB_CLOSE, sehingga menutup satu handle mengakhiri seluruh pohon proses, termasuk cucunya
  • Cancel mengirim CTRL_BREAK yang lembut lebih dulu, lalu menutup job setelah masa tenggang; process group di Unix mendapat perlakuan dua langkah yang sama
  • File sementara baru dihapus setelah prosesnya benar-benar berhenti, dan CI membuktikan penghentian pohon proses di Windows, macOS, dan Linux
GoFFmpegyt-dlp

Progres langsung yang tetap utuh saat tersambung ulang

UI mengikuti setiap job lewat Server-Sent Events. Membaca riwayat tersimpan lalu berlangganan meninggalkan celah: event yang terjadi di antara dua langkah itu hilang selamanya, dan tab yang tersambung ulang bisa melewatkan satu perubahan status yang paling penting.

  • Berlangganan stream langsung lebih dulu, baru membaca riwayat tersimpan, lalu membuang event langsung yang nomor urutnya sudah dikirim oleh riwayat
  • Hanya state, error, dan done yang disimpan dan bisa diputar ulang; progres boleh hilang, dibatasi empat pembaruan per detik, dan koneksi ulang mendapat satu snapshot baru, bukan frame lama
  • Pelanggan yang lambat boleh kehilangan frame progres, tapi tidak pernah perubahan status: jika pengirimannya akan tertahan, koneksi itu ditutup alih-alih menghambat publisher
GoReactTypeScriptSQLite

Retry yang tahu kapan harus berhenti

Unduhan bisa gagal karena jaringan sempat putus, karena sumbernya membatasi laju permintaan, atau karena videonya privat. Mengulang ketiganya dengan cara yang sama berarti menyerah terlalu cepat, atau terus membombardir sumber yang sudah menolak.

  • Setiap kegagalan diklasifikasikan sebagai sementara, dibatasi, tool usang, permanen, atau lokal, dan hanya kegagalan sementara dan dibatasi yang diulang otomatis, maksimal tiga kali
  • Retry yang dibatasi mundur bertahap dari 30 detik hingga 5 menit dengan jitter ±20%, sehingga job yang dibatasi bersamaan tidak kembali serentak dan memicu batas berikutnya
  • Setelah HTTP 429, scheduler hanya menjalankan satu job selama cooldown lima menit, karena unduhan paralel justru memperpanjang pembatasan
GoSQLite

04

Teknologi

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

05

Pengalaman

GM Workspace

Jul 2026 — Sekarang

Fullstack Developer Freelance

Remote · Klien perorangan

  • Merancang mesin penggajian dan bonus bertingkat dari awal sampai akhir, termasuk logika pembayaran yang aman dari konkurensi
  • Mengintegrasikan Google Drive (OAuth + penyimpanan token terenkripsi AES-256-GCM) untuk pengelolaan aset tim

RSTPOS — PT. Rizq Sanjaya Teknologi

Feb 2026 — Jun 2026

Backend Developer (Magang)

Magang

  • Membangun REST API dan dashboard internal untuk sistem POS retail/F&B multi-cabang
  • Mengimplementasikan logika penyesuaian stok yang atomik dan aman dari race condition antarcabang

Seria

Jan 2026 — Sekarang

Fullstack Developer Freelance

Remote · Komunitas server Minecraft

  • Membangun storefront, CMS admin, dan integrasi payment gateway (Duitku)
  • Menulis plugin Java/Spigot yang menghubungkan backend web dan server game secara real-time lewat RCON

Politeknik Negeri Lampung

Agu 2023 — Sekarang

D3 Teknologi Informasi

Bandar Lampung, Indonesia

  • Juara Best Presentation di Expo 2025 untuk sistem reservasi gedung digital kampus — Next.js, Redis (Upstash), Supabase Postgres
  • Titik awal perjalanan saya di pengembangan secara langsung — tiga tahun berjalan, dan masih berlanjut

06

Mari ngobrol

Bandar Lampung, Indonesia. Terbuka untuk posisi fullstack remote — dengan fokus backend — dan terbuka membahas relokasi untuk kesempatan yang tepat.

Pesan Baru
0/2000

Terbuka untuk pekerjaan baru