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
01
Sedang dibangun
Tiga sistem produksi, berjalan bersamaan, semuanya berfokus pada backend.

Seria
Jan 2026 — SekarangFullstack 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.

GM Workspace
Jul 2026 — SekarangFullstack 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.

RSTPOS
Feb 2026 — Jun 2026Backend 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.
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
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
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
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
03
Proyek pribadi
Dibangun di waktu luang, dengan standar yang sama seperti pekerjaan klien.

YT To MP3 Converter
Sep 2026Aplikasi 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
- 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
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
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
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 — SekarangFullstack 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 2026Backend 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 — SekarangFullstack 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 — SekarangD3 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.
Terbuka untuk pekerjaan baru