Adogen: AI-Powered Metadata Automation
Portfolio Header
Adogen: AI-Powered Metadata Automation
Portfolio Image Content
Portfolio Metrics
Portfolio Content
Tantangan
Kontributor stok foto menghabiskan 60% waktu untuk urusan administratif metadata. Masalahnya adalah analisa visual masal (batch) dengan biaya rendah namun tetap akurat.
Solusi
Integrasi Vision AI (Llama 3.2 & Pixtral) melalui Cloudflare Workers dengan implementasi client-side image resizing untuk efisiensi bandwidth.
Hasil
Memangkas waktu input metadata dari 5 menit menjadi kurang dari 10 detik per gambar, serta mendukung batch upload hingga 50 gambar sekaligus.
Gallery

Project Journey
Membangun Adogen bukan sekadar membuat wrapper AI, melainkan menyelesaikan masalah nyata yang dihadapi kontributor stock photo di Indonesia. Fokus utama saya adalah pada kecepatan dan privasi data.
Key Features & Technical Decisions
Performa “Burag” dengan Astro & Tailwind
Memilih Astro adalah keputusan krusial karena hampir semua interaksi bersifat statis kecuali pada bagian antrean gambar. Dengan meminimalkan pengiriman JavaScript ke browser, aplikasi ini mencapai skor Lighthouse 100/100 dengan mudah.
Keamanan Data dengan Model “Bring Your Own Key”
Alih-alih membebankan biaya langganan kepada user, saya menerapkan sistem BYOK (Bring Your Own Key). User memasukkan API Key Groq/Mistral mereka sendiri yang disimpan secara aman di localStorage browser. Ini memastikan:
- Biaya operasional server hampir nol ($0).
- Privasi gambar user terjaga karena tidak disimpan di server saya.
Arsitektur Antrean (Queue Management)
Untuk menangani Rate Limit dari provider AI gratisan, saya membangun sistem antrean dengan Safe Delay Logic. Sistem ini memastikan request dikirim satu per satu dengan jeda waktu tertentu untuk menghindari error 429 Too Requests.
Robust CSV Sanitization
Data dari AI seringkali mengandung karakter ilegal atau format yang berantakan. Saya membangun utilitas khusus menggunakan TypeScript untuk membersihkan baris baru (\n), menghapus simbol terlarang (©, ™), dan memastikan limitasi 50 keyword terpenuhi.
// Contoh logika sanitasi yang saya gunakan
const clean = (str: string) => {
return str
.replace(/\r?\n|\r/g, " ")
.replace(/[™®©]/g, "")
.replace(/"/g, '""')
.trim();
};