App Store Bilang Ya
Dua minggu lalu saya nulis "Masih membangun. Masih belum selesai." Hari ini DIALØGUE sudah live di App Store. Inilah tampilan 40% terakhir itu sebenarnya.
Dua minggu lalu saya menutup sebuah blog post dengan: "Masih membangun. Masih belum selesai. Masih mencari tahu apa yang harus dibilang ke putri saya."
Saya janji akan nulis lanjutannya kalau app-nya masuk App Store. Atau kalau ditolak. Saya bilang cerita penolakannya mungkin lebih menarik.
DIALØGUE - AI Podcast Studio sekarang sudah live di App Store — app iOS native SwiftUI yang mengubah topik apa pun atau PDF menjadi episode podcast lengkap, dibangun pakai Claude Code oleh seseorang yang sebelumnya belum pernah nulis Swift. Kamu bisa download sekarang.
Tapi bukan di percobaan pertama. Jujur saja — saya memang sudah menduga cerita penolakan bakal lebih menarik daripada cerita penerimaan. Dan ternyata benar.
Apple Menolak Submission Pertama — Lalu Apa?
Submission pertama saya ditolak. Guideline 2.1 — Performance: App Completeness. In-app purchase-nya rusak.
Pesan review Apple sebenarnya cukup ramah — mereka catat ini submission pertama saya, ucapkan selamat bergabung di developer program, dan jelaskan masalahnya dengan jelas. Produk IAP melempar error waktu reviewer mereka coba melakukan pembelian.
Lucunya: alur pembelian berfungsi sempurna di testing saya. Masalahnya ada di sandbox environment Apple, yang perilakunya beda dari development maupun production. Konfigurasi StoreKit harus sinkron persis dengan App Store Connect — dan punya saya tidak. Saya testing pakai file konfigurasi StoreKit lokal, sementara reviewer menghantam sandbox yang sesungguhnya.
Saya perbaiki di hari yang sama, resubmit, dan lolos. Tidak lama kemudian saya kirim update bug fix v1.0.1, yang juga langsung lolos.
Total tiga submission. Satu penolakan. Penolakan itu mengajarkan saya lebih banyak tentang proses App Store daripada kedua approval digabung. Memang selalu begitu, kan? Kegagalan selalu lebih mendidik daripada keberhasilan.
"40% Terakhir" Itu Seperti Apa Sih?
Di post sebelumnya, saya bilang AI membawa kamu 60% perjalanan dan 40% sisanya sepenuhnya kerja manusia. Sekarang saya mau lebih spesifik, karena saya punya git log sebagai buktinya.
16 commit. 57 file berubah. 4.886 baris ditambahkan. App tumbuh dari 69 file Swift menjadi 88, dari 7.568 baris menjadi 11.459. Hampir 4.000 baris "polish."
Inilah yang sebenarnya ada dalam 16 commit itu — kurang lebih sesuai urutan kejadiannya:
Test Suite yang Harusnya Ada dari Awal
Scaffold awal punya nol test. Nol. Claude membangun 69 file production code tanpa satu pun test. Commit pertama saya yang sungguhan setelah post itu menambahkan 176 unit test dan 19 integration test yang jalan di instance Supabase lokal.
Nulis test-test itu langsung ketemu bug nyata: model Show gagal decode dari kolom database yang tidak ada, AudioPlayer tidak reset di akhir track, race condition saat library reload, nil UUID guard yang hilang di creation wizard. Semua ini pasti crash di production.
Saya rasa ini pola yang layak dikasih nama: AI menghasilkan kode tanpa infrastruktur test sama sekali. Bukan karena tidak bisa nulis test — Claude justru jago nulis test kalau diminta — tapi karena prompt scaffold awal selalu "bangun app-nya," bukan "bangun app-nya dengan test yang komprehensif." Test-test itu muncul karena saya yang merasa tidak nyaman shipping tanpa mereka.
Studio: Dari Placeholder Jadi Fitur Sungguhan
Fitur "Studio" awal untuk acara berulang cuma placeholder doang. Dua commit kemudian, jadi produk beneran: pembuatan acara dengan template grid, manajemen episode dengan status badge dan action button, alur edit/hapus, konfigurasi jadwal dengan timezone picker, dan voice customization sheet.
Lalu datang Studio Phase 2: redesain detail acara, retry/hapus per episode, pembuatan episode manual dengan pengecekan kredit. Plus 8 XCUITest baru untuk memastikan semuanya jalan end-to-end.
Ini yang saya maksud waktu bilang "AI membangun codebase, bukan produk." Fitur Studio bisa dikompilasi. Layarnya muncul. Tapi kamu tidak bisa sungguhan mengelola acara podcast berulang dengannya.
Audio Player: Dihapus, Lalu Dibangun Ulang Lebih Baik
Di post sebelumnya saya bilang sudah menghapus mini-player. Ternyata saya salah — ujung-ujungnya saya malah membangun mini-player yang lebih baik. Desain akhirnya: persistent mini-player bar di atas tab bar dengan progress, skip control, dan play/pause. Ketuk, dan keluar expanded "Now Playing" sheet dengan seekable slider, speed selector (0,5x sampai 2x), transport control, dan animasi sound-rings artwork.
Bagian rumitnya adalah state isSeeking — tanpa itu, posisi slider dan audio observer saling berkelahi, hasilnya gerakan jittery yang bikin pusing. Cuma satu baris state, tapi butuh satu jam untuk mendiagnosisnya.
Saya juga menambahkan offline download dengan UX yang halus: ikon hijau di episode yang sudah didownload di library, completion toast, label "Downloaded" di Now Playing, dan swipe-to-remove-download. DownloadManager punya race condition file sementara di URLSession delegate yang bikin gagal diam-diam — fix-nya: synchronous file move di dalam callback. Bukan jenis bug yang ketahuan dari code review.
Security Hardening di Semua Layer
Yang ini agak bikin kaget. Audit keamanan pada seluruh stack — bukan cuma app iOS — mengungkap kerentanan di berbagai layer: fungsi database yang over-permissioned, edge case autentikasi, celah verifikasi token, dan masalah validasi input di beberapa backend service.
Tidak satu pun dari bug ini ada di kode Swift iOS. Semuanya di backend yang diajak bicara oleh app iOS. Tapi begitu kamu shipping app iOS, seluruh stack-mu sekarang ada di saku pengguna. Taruhannya naik untuk semua hal. Kode yang "jalan kok" untuk web app tiba-tiba terasa tidak bisa diterima ketika harus melewati review Apple dan masuk ke app native yang dibawa orang ke mana-mana.
StoreKit: Pembunuh Submission
Sandbox testing StoreKit itu dunianya sendiri, dan itulah yang bikin submission pertama saya ditolak. Sandbox environment perilakunya beda dari production. Transaksi kadang stuck "pending" selamanya. File konfigurasi StoreKit di Xcode butuh sinkronisasi manual. Saya habiskan satu malam penuh mendebug alur pembelian yang berfungsi sempurna di kode tapi gagal diam-diam di sandbox — ternyata product ID di App Store Connect punya trailing space. Satu spasi doang.
Reviewer Apple kena sandbox error karena konfigurasi StoreKit saya tidak sinkron dengan App Store Connect. Di testing lokal saya sih jalan — tapi reviewer menghantam sandbox yang sesungguhnya, bukan file konfigurasi StoreKit lokal saya. Saya perbaiki di hari yang sama, tapi ini contoh sempurna betapa jauhnya jarak antara "jalan di mesin saya" dan "jalan di environment Apple."
Rantai verifikasi pembelian jadi proyek tersendiri: app iOS mengirim representasi JWS (JSON Web Signature) dari transaksi ke server-side function, yang melakukan verifikasi chain kriptografis penuh dari signed receipt Apple. Bukan sekadar decoding — validasi signature beneran. Butuh dua commit khusus buat ini doang.
Privasi dan Kepatuhan App Store
Privasi dan kepatuhan itu formulir, keputusan, dan checkbox yang punya implikasi hukum — dan tidak ada AI yang bisa mengisinya buat kamu. Deklarasi App Tracking Transparency, privacy nutrition label, kepatuhan ekspor untuk enkripsi (ya, HTTPS termasuk), hak konten, integrasi Turnstile captcha. Claude Code bisa nulis Swift, tapi tidak bisa kasih tahu kamu apakah praktik pengumpulan datamu butuh label "Data Used to Track You."
MFA dan Lokalisasi 7 Bahasa
Implementasi MFA awal itu stub yang rusak — empty factor ID, alur verify-only. Saya tulis ulang jadi TOTP lifecycle yang lengkap: enroll, scan QR code (native CoreImage generation), verify, lihat status, disable. Hasilnya MFAView.swift 394 baris yang sebelumnya tidak ada.
Lokalisasi 7 bahasa berarti 253 string UI diterjemahkan ke bahasa Inggris, Spanyol, Prancis, Jepang, Korea, Vietnam, dan Mandarin. Claude yang terjemahkan, dan hasilnya sebagian besar oke. Tapi "sebagian besar oke" di bahasa Jepang artinya mungkin ada label tombol yang secara gramatikal benar tapi kedengarannya kayak ditulis robot. Saya menemukan beberapa dengan mengganti bahasa ponsel dan benar-benar memakai app-nya. Ini jenis testing yang belum bisa dilakukan AI buat kamu — setidaknya untuk sekarang.
Apa Saja yang Bisa Dilakukan App iOS DIALØGUE?
Buat yang belum baca cerita build aslinya, singkatnya begini:
Kamu kasih topik — atau upload PDF — dan DIALØGUE menghasilkan episode podcast yang sudah diriset, ditulis naskahnya, dan disuarakan. Dua host AI ngobrol secara natural tentang topikmu, didukung riset nyata. Tidak perlu mikrofon.
App iOS ini mencakup:
- Wizard pembuatan 5 langkah — topik, format, kustomisasi, review outline, review naskah
- 30 suara AI dalam 7 bahasa — Inggris, Spanyol, Prancis, Jepang, Korea, Vietnam, Mandarin
- 9 format podcast — dari Tech News Analysis sampai Investigative Comedy
- Pemutaran audio dengan kontrol lock screen — background playback langsung berfungsi
- Apple Sign-In, Google OAuth, dan email auth
- In-app purchase — berbasis kredit, tanpa subscription: 4 kredit $4,99, 9 kredit $9,99, 18 kredit $19,99
- Studio — buat acara berulang yang otomatis menghasilkan episode baru
- Upload PDF — makalah riset, laporan, buku sebagai sumber materi
Ini app SwiftUI native beneran. Bukan web wrapper. Bukan React Native. Yang awalnya 69 file Swift sekarang jadi 88 file dan 11.459 baris kode, didukung 195 test. Jujur, saya bangga bisa shipping ini.
Seberapa Meleset Perkiraan "Fase Polish" Saya?
Saya nulis bahwa app "masih dalam pengembangan, di fase polish akhir." Secara teknis benar, tapi saya meremehkan berapa banyak dari "fase polish" itu yang sebenarnya pekerjaan baru.
Kalau lihat git log sekarang, 16 commit bukan kedengarannya "polish." Itu kedengarannya fase kedua pengembangan. Test suite saja — 176 unit test dan 19 integration test — sudah jadi satu proyek tersendiri. Studio berubah dari stub jadi fitur utuh. Audio player dirancang ulang dua kali. Security hardening menyentuh 40+ fungsi backend. MFA ditulis ulang dari nol.
Saya juga bilang sudah menghapus mini-player. Salah lagi — ujung-ujungnya saya malah membangun yang lebih baik, dengan Now Playing sheet, speed control, dan download indicator. Naluri awal "hapus saja" itu benar — mini-player pertama memang jelek. Tapi konsepnya benar. Tinggal perlu dibangun dengan bener.
Kalau saya pikir jujur-jujuran, sekarang setelah bisa lihat gambaran utuhnya: AI membangun fondasi (60%), manusia membangun produk (30%), dan proses submission App Store mengajarkan 10% sisanya.
Apakah DIALØGUE Tersedia di EU?
DIALØGUE tersedia di seluruh dunia, tapi ketersediaan di EU masih sedang diproses Apple. Digital Markets Act EU memerlukan langkah kepatuhan tambahan — pengungkapan pembayaran alternatif, dokumentasi privasi spesifik, detail registrasi bisnis. Saya sudah menyerahkan semuanya, dan Apple sedang meninjaunya. Seharusnya segera tersedia di negara-negara EU.
Kalau kamu di EU dan nggak mau nunggu, web app-nya jalan di mana saja dan punya fitur yang sama.
Secepat Apa Sih Develop iOS Pakai AI?
App iOS DIALØGUE butuh sekitar dua minggu dari commit pertama ke App Store — satu malam AI scaffolding dan dua minggu kerja produk oleh manusia. Saya terus update tabel ini karena selalu ada pelajaran baru:
| Proyek | Kompleksitas | Waktu Membangun |
|---|---|---|
| DIALØGUE v1 | MVP podcast generator | ~6 bulan |
| STRAŦUM | 10 agen AI, 11 framework, multi-tenant | 75 hari |
| Redesain situs | Overhaul frontend WordPress | 3 hari |
| DIALØGUE v2 | Rebuild app web lengkap | 14 hari |
| Migrasi blog | WordPress → Next.js, 490 postingan, Sydney RAG | 4 hari |
| DIALØGUE iOS | App iOS native, pertama kali menggunakan Swift | ~2 minggu (scaffold: satu malam) |
Jarak scaffold-ke-rilis untuk DIALØGUE iOS sekitar dua minggu. Scaffold-nya sendiri satu malam. Rasio itu — satu malam kerja AI, dua minggu kerja manusia — bicara banyak tentang posisi kita sekarang di era AI-assisted development.
Bagian AI terus makin cepat. Bagian manusia kurang lebih tetap segitu-segitu. Saya nulis itu dua minggu lalu dan masih berlaku.
Skill Apa yang Masih Relevan Kalau AI yang Nulis Kode?
Di post sebelumnya, saya masih cari-cari saran yang tepat. "Belajarlah jadi orang yang membuka Simulator" — itu yang terbaik yang saya punya waktu itu.
Sekarang setelah beneran shipping, saya rasa bisa sedikit lebih spesifik.
App ini ada karena tiga hal yang tidak bisa dilakukan AI:
-
Saya pakai produknya. Bukan sekadar testing. Pakai beneran. Bikin podcast. Dengerin di perjalanan. Sadar bahwa layar review outline perlu nampilin sumber riset karena saya sendiri pengin tahu dari mana fakta-faktanya.
-
Saya bikin judgment call yang nggak punya jawaban benar. Hapus mini-player atau pertahankan? Seberapa banyak kustomisasi itu kebanyakan di creation wizard? Fitur Studio lebih cocok jadi tab atau section? Ini bukan keputusan engineering. Ini keputusan taste. Dan taste datang dari menggunakan banyak produk — yang bagus dan yang parah — lalu mengembangkan insting soal apa yang terasa pas.
-
Saya menavigasi sistem yang dirancang untuk manusia. App Store Connect, deklarasi privasi, kepatuhan ekspor, persyaratan screenshot — tidak ada yang bisa diotomasi. Semuanya butuh baca, pahami konteks, dan bikin judgment call soal implikasi hukum dan bisnis. Skill ini — menavigasi sistem manusia yang kompleks — nggak bakal hilang.
Jadi mungkin saran yang lebih update: belajarlah menggunakan sesuatu secara mendalam, kembangkan taste dengan peduli pada kualitas, dan biasakan menavigasi sistem yang memang nggak dirancang untuk simpel.
Itu lebih konkret dari "belajar berpikir kritis." Saya rasa itu lebih mendekati kebenaran. Tapi jujur, saya masih belum yakin itu cukup.
Gimana Cara Download DIALØGUE?
App-nya gratis, bayar pakai kredit dalam aplikasi. Tanpa subscription.
Tersedia di seluruh dunia — ketersediaan EU sedang diproses Apple dan harusnya segera live. Web app-nya tersedia di mana saja.
Pertanyaan yang Sering Diajukan
Apakah DIALØGUE tersedia di App Store?
Ya! DIALØGUE - AI Podcast Studio sudah live di App Store sejak Maret 2026. Gratis didownload, beli kredit dalam app (4 kredit $4,99, 9 kredit $9,99, 18 kredit $19,99). Tersedia di seluruh dunia — ketersediaan EU sudah disubmit dan sedang diproses Apple.
Apakah tersedia di EU?
Sudah disubmit dan sedang diproses Apple. Digital Markets Act EU butuh langkah kepatuhan tambahan, dan semua dokumennya sudah saya selesaikan — tinggal nunggu review Apple. Harusnya segera tersedia. Sementara itu, web app-nya jalan di mana saja termasuk EU.
Apakah Apple menolaknya?
Ya — submission pertama ditolak karena in-app purchase yang rusak (Guideline 2.1: App Completeness). Konfigurasi sandbox StoreKit nggak sinkron dengan App Store Connect, jadi pembelian melempar error waktu review. Saya perbaiki di hari yang sama, resubmit, dan lolos. Lalu v1.0.1 juga lolos. Total tiga submission, satu penolakan. Penolakan itu justru mengajarkan lebih banyak dari kedua approval digabung.
Berapa lama keseluruhan prosesnya?
Sekitar dua minggu dari blog post pertama sampai approval App Store. Claude Code scaffold 69 file Swift dalam satu malam. 16 commit berikutnya menambah 4.886 baris di 57 file — test, fitur Studio, redesain audio player, tulis ulang MFA, security hardening, verifikasi StoreKit, lokalisasi, dan proses submission App Store. App di-ship dengan 88 file dan 11.459 baris kode plus 195 test.
Apa bagian paling sulit dari 40% terakhir?
StoreKit sandbox testing. Jarak antara "ini jalan di kode" dan "ini jalan di sistem transaksi Apple" itu jauh banget. Transaksi sandbox perilakunya beda dari production, product ID harus cocok persis (sampai trailing space), dan feedback loop-nya lambat — nggak bisa langsung jalanin unit test begitu saja.
Bisakah saya tetap menggunakan web app-nya?
Tentu. podcast.chandlernguyen.com punya fitur yang sama dan jalan di perangkat apa pun. App iOS menambah kenyamanan native — Apple Sign-In, kontrol lock screen, offline download — tapi pengalaman inti bikin podcast-nya sama persis.
Masih belum tahu harus bilang apa ke putri saya. Tapi setidaknya sekarang saya punya app yang sudah shipped untuk ditunjuk waktu bilang "kerja manusia itu bagian yang susah."
Salam hangat, Chandler








