Titip Nada: Membangun Tempat Menitipkan Cerita Lewat Musik, Tanpa Nama dan Tanpa Akun
Cerita di balik Titip Nada, platform tempat orang menitipkan surat pendek berisi lagu untuk dibaca orang asing secara acak, dan tantangan nyata membangunnya tanpa satu pun sistem akun.

Ada banyak cara membuat aplikasi berbagi musik. Kebanyakan mengejar hal yang sama, katalog yang luas, rekomendasi yang pintar, daftar putar yang bisa dipamerkan ke pengikut. Titip Nada mencoba jalan yang berlawanan. Tidak ada profil, tidak ada pengikut, tidak ada riwayat yang bisa dilihat orang lain. Yang ada hanya satu surat pendek berisi beberapa lagu, dititipkan untuk dibaca satu orang asing yang kebetulan sedang membuka aplikasi di waktu yang sama.

Ide yang lahir dari batasan
Konsepnya sederhana. Kamu menulis catatan singkat, memilih mood, menempelkan beberapa link lagu dari Spotify atau YouTube, lalu mengirimkannya ke ruang bersama. Orang lain yang membuka Titip Nada akan menerima satu surat secara acak, mendengarkan lagunya, membaca catatannya, lalu bisa membalas dengan surat sendiri atau melewatkannya untuk mencari surat lain.
Tidak ada kata sandi. Tidak ada pendaftaran. Identitas pengirim hanya berupa kode acak seperti surat-7x2f, sekadar penanda supaya balasan bisa membentuk satu utas percakapan, bukan identitas yang bisa dilacak balik ke siapa pun.
Keputusan "tanpa akun" ini kedengarannya sepele di atas kertas, tapi ternyata jadi sumber sebagian besar tantangan teknis yang paling menarik selama membangun aplikasi ini.
Ketika kebijakan Spotify berubah di tengah jalan
Rencana awalnya sederhana, pakai satu kredensial aplikasi untuk membaca semua lagu, termasuk dari playlist yang ditempel pengguna. Ternyata sejak kebijakan Spotify berubah, kredensial tingkat aplikasi seperti ini sudah tidak bisa lagi membaca isi playlist siapa pun, bahkan playlist milik akun developer aplikasi itu sendiri.
Ini artinya untuk fitur impor banyak lagu sekaligus dari satu playlist, dibutuhkan izin dari pengguna secara langsung. Masalahnya, aplikasi ini punya prinsip tegas, tanpa akun. Bagaimana caranya minta izin tanpa membuat akun?
Solusinya adalah membangun alur OAuth PKCE yang benar-benar sekali pakai. Pengguna diarahkan login ke Spotify, memberi izin baca satu playlist, lalu token aksesnya dipakai sekali untuk mengimpor lagu dan langsung dibuang. Token pembaruan yang biasanya dipakai untuk memperpanjang sesi secara otomatis sengaja tidak pernah disimpan. Ini bukan login ke Titip Nada, hanya izin sementara yang kedaluwarsa sendiri dalam satu jam.

Musik yang terputar penuh, atau hanya cuplikan
Tantangan berikutnya lebih halus dan sebagian besar berada di luar kendali kode sendiri. Pemutar Spotify yang ditempel di halaman itu sebenarnya iframe resmi dari Spotify, dan apakah lagu terputar penuh atau hanya cuplikan tiga puluh detik ditentukan oleh satu hal, apakah peramban pengguna sedang login ke Spotify di dalam iframe itu.
Di desktop, ini sering berhasil karena banyak orang membiarkan tab Spotify Web Player tetap terbuka. Di ponsel, situasinya jauh lebih sulit. Kebanyakan pengguna ponsel memakai aplikasi Spotify asli, bukan peramban, sehingga sesi login yang dibutuhkan iframe itu kemungkinan besar memang tidak pernah ada sejak awal, terlepas dari apa pun yang dilakukan di sisi kode.
Daripada berpura-pura bisa memperbaiki sesuatu yang secara arsitektur memang tidak bisa dipaksa, solusi yang dipilih adalah kejujuran plus jalan keluar. Ada keterangan singkat yang menjelaskan situasinya, dan ada tombol untuk membuka lagu itu langsung di aplikasi Spotify jika terpasang di perangkat.
Satu bug kecil yang ternyata soal kepemilikan DOM
Salah satu bug yang paling membingungkan muncul saat mencoba memutar lagu kedua dalam satu surat. Lagu pertama selalu berhasil, lagu berikutnya sering gagal diam-diam.
Setelah ditelusuri, akar masalahnya ternyata soal siapa yang "memiliki" elemen di halaman. React punya cara sendiri melacak elemen yang dia render. Pemutar Spotify dan YouTube, lewat SDK kontrol resminya, juga punya cara sendiri mengelola elemen yang mereka terima, termasuk kadang menggantinya sepenuhnya, bukan sekadar mengisi kontennya. Ketika dua sistem itu diberi elemen yang sama, keduanya sama-sama merasa berhak mengurusnya, dan salah satu akan bingung ketika elemen itu tiba-tiba berubah tanpa sepengetahuannya.
Perbaikannya adalah aturan sederhana, jangan pernah memberi SDK pihak ketiga elemen yang dilacak React. Setiap kali lagu berganti, dibuat elemen baru yang benar-benar polos, di luar pengawasan React, khusus untuk diserahkan ke SDK. React hanya perlu tahu ada satu wadah kosong, tidak peduli apa yang terjadi di dalamnya.
Menjaga ruang tetap aman tanpa akun untuk diawasi
Anonimitas penuh punya konsekuensi yang jelas, tidak ada cara memblokir satu akun bermasalah, karena memang tidak ada akun. Solusinya harus bekerja di lapisan konten dan lapisan perilaku, bukan di lapisan identitas.
Setiap surat yang dikirim melewati filter moderasi lokal sebelum dipublikasikan, mencari kata kasar, informasi kontak pribadi, dan indikasi menyakiti diri sendiri. Ada pembatasan laju pengiriman berbasis kombinasi hash IP dan sesi anonim, bukan akun. Ada antrean moderasi terpisah tempat surat yang ditandai bisa ditinjau dan diputuskan, disetujui atau dihapus.
Belakangan ditambahkan juga jalur masukan anonim, tempat pengguna bisa mengirim ide, laporan bug, atau pujian tanpa perlu login, lengkap dengan pertahanan sederhana terhadap spam otomatis dan antrean tinjau internal untuk membacanya.

Apa yang tersisa untuk dikerjakan
Beberapa hal masih sengaja belum dibangun. Fitur pemungutan suara publik untuk ide fitur, misalnya, ditunda sampai ada cukup masukan nyata untuk dikurasi. Autentikasi admin masih berupa satu token yang dipakai bersama, cukup untuk satu moderator, tapi perlu diperkuat kalau nanti timnya bertambah.
Titip Nada bukan aplikasi dengan fitur terbanyak. Justru sebaliknya, sebagian besar keputusan pentingnya adalah soal apa yang sengaja tidak dibangun, tanpa akun, tanpa daftar pengikut, tanpa angka publik yang menunjukkan surat mana yang paling populer. Setiap batasan itu, yang kelihatannya membatasi di permukaan, justru yang membuat pengalaman menerima surat dari orang asing terasa seperti amplop yang tergeletak di meja, bukan satu lagi linimasa untuk digulir tanpa henti.