Agentic Trading Lab
에이전트와 대화하고, 거래 아이디어를 테스트하며, 코드 없이 실제 시장 데이터에 AI 트레이딩 에이전트를 적용
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Aplikasi web (PWA) untuk mencatat pengeluaran rumah tangga berdua. Prioritas: input secepat mungkin, plus checklist belanja bulanan berbasis stok, forecast budget, dan gamifikasi ringan.
Stack: Next.js 16 (App Router) · Tailwind 4 · Supabase (Postgres, Auth, Realtime, RLS) · Vercel
Setelah login (dan splash bawaan PWA) muncul layar Menu dengan dua pilihan: Money Tracker dan Service Record.
| Layar | Isi |
|---|---|
| Catat | Keypad besar, kategori satu tap, tombol cepat (mis. Bensin 50rb), tanggal otomatis, pencatat otomatis, Urungkan, antrean offline |
| Beranda | Level & XP keluarga, streak, ringkasan periode (pemasukan, dialokasikan, belum dibagi), sisa anggaran + forecast akhir periode, tagihan tetap (lunas/belum), quest minggu ini |
| Rencana gajian | Catat pemasukan, bagi ke tiap pos dengan penghitung "belum dialokasikan" langsung, tambah/arsipkan pos (mis. Makan) |
| Cek stok | Sebelum belanja, hitung barang di rumah (− / + / ketik angka / "Habis"), lalu checklist otomatis diperbarui. Penurunan stok tercatat sebagai pemakaian nyata |
| Checklist | Dibuat otomatis dari rekomendasi max(0, kebutuhan − stok). Pilih toko, urutan mengikuti rak toko itu. Centang barang, isi harga per satuan (sesuai rak), total dihitung otomatis |
| Stok rumah | Stok diubah dengan tombol + / −. Perkiraan pemakaian dihitung ulang dari pemakaian nyata beberapa bulan terakhir |
| Evaluasi | Rekomendasi vs dibeli, barang di luar daftar, uang yang dihemat |
| Pencapaian | Badge, quest, papan kontribusi dua jalur (rajin mencatat vs hemat) |
Tema terang/gelap (otomatis + tombol), mobile-first, dan dirancang terasa seperti aplikasi native: transisi halaman (View Transitions), bottom sheet yang bisa diseret, pull-to-refresh, daftar yang berpindah dengan animasi, getaran halus (Android), dan perubahan di toko tetap aman saat sinyal hilang (antrean kirim ulang otomatis).
Pencatatan servis berkala kendaraan (mobil dan motor), dipakai berdua dalam satu rumah tangga.
| Layar | Isi |
|---|---|
| Kendaraan | Kartu tiap kendaraan: km terkini + tombol Update km, status, dan part yang paling mendesak. Bagian "Perlu perhatian" merangkum part yang terlewat/sebentar lagi lintas kendaraan |
| Detail kendaraan | Semua part dengan bar progres, interval, servis terakhir, dan batas km/tanggal berikutnya |
| Catat servis | Tanggal, km, part yang diganti (yang mendekati jadwal tercentang otomatis), biaya, bengkel, catatan |
| Riwayat | Timeline servis per kendaraan dengan total biaya; bisa dihapus |
| Atur | Ubah interval tiap part, tambah/arsipkan part, frekuensi pengingat update km |
Notifikasi hanya di dalam aplikasi (lencana, banner, dan kartu yang menyala saat aplikasi dibuka). Belum ada push ke HP saat aplikasi tertutup; itu butuh kunci VAPID, Vercel Cron, dan service role key Supabase, dan di iPhone hanya jalan bila aplikasi dipasang di Layar Utama. Bisa ditambahkan nanti bila diperlukan.
Anggaran berjalan per periode: dari satu gajian ke gajian berikutnya (mis. 25 Okt–24 Nov), bukan bulan kalender.
Saat belanja, pilih toko (Hari-Hari, Naga, dst.). Urutan rak dipelajari dari urutan kamu mencentang barang: tiap belanja menggeser posisi rata-rata barang di toko itu, jadi makin sering belanja makin rapi. Barang yang belum tertib di toko itu ditaruh di bagian "posisi belum diketahui", dan yang sudah dicentang turun ke "sudah di keranjang". Agar urutan yang dipelajari benar, centang saat barang masuk keranjang, bukan di kasir.
| Sumber | XP | Untuk |
|---|---|---|
| Catatan pertama hari itu | 10 | pencatat |
| Streak kelipatan 7 hari | 30 | pencatat |
| Tagihan tetap lunas tepat waktu | 25 | pembayar |
| Hemat belanja: 1 poin tiap Rp 2.000 dihemat (maks 100) | s/d 100 | yang menyelesaikan belanja |
| Bonus belanja tidak melebihi rekomendasi | 40 | yang menyelesaikan belanja |
| Kategori harian aman di akhir periode | 20 / kategori | keluarga |
| Quest mingguan selesai | 50 | keluarga |
Papan kontribusi membandingkan Rajin (catat + streak + tagihan) dan Hemat (hemat belanja + bonus). Poin hemat
sengaja berbobot lebih besar. "Hemat" hanya dihitung per barang yang dibeli sesuai/di atas rekomendasi, jadi tidak
bisa "menghemat" dengan tidak membeli apa-apa; barang di luar daftar tidak pernah menambah hemat.
Semua poin idempoten lewat kolom ref (tidak bisa terhitung dua kali).
npm install
cp .env.example .env.local # isi dengan kunci Supabase (lihat bawah)
npm run dev # http://localhost:3000
Perintah lain: npm test (logika + skema SQL/RLS di Postgres nyata via pglite), npm run lint, npm run build.
Buat project di https://supabase.com (region Singapore / ap-southeast-1 supaya dekat).
SQL Editor → New query → jalankan berurutan:
0001_init.sql, lalu
0002_period_income_store.sql (periode gajian, pemasukan, toko & urutan rak), lalu
0003_stock_check.sql (waktu cek stok), lalu
0004_service_record.sql (Service Record: kendaraan, part, km, riwayat servis), lalu
0005_flexible_parts.sql (komponen servis boleh tanpa interval/pengingat), lalu
0006_quick_note.sql (keterangan pada tombol cepat).
(Atau dengan CLI: supabase link lalu supabase db push, yang menjalankan semuanya.)
Tanpa 0005 aplikasi tetap jalan; hanya menyimpan komponen tanpa pengingat yang akan ditolak dengan pesan yang jelas.
Tanpa 0006 tombol cepat tetap berfungsi, hanya tanpa kolom keterangan.
Project Settings → API: salin Project URL dan anon public key. Keduanya aman berada di browser, karena keamanan data dijaga Row Level Security per rumah tangga.
Authentication → URL Configuration
https://catatan-kita.vercel.app; di lokal http://localhost:3000).https://<domain-kamu>/auth/confirm dan http://localhost:3000/auth/confirm
(untuk preview Vercel: ).| Nama | Nilai | Dipakai di |
|---|---|---|
NEXT_PUBLIC_SUPABASE_URL | Project URL, mis. https://abcd1234.supabase.co | browser + server |
NEXT_PUBLIC_SUPABASE_ANON_KEY | anon public key | browser + server |
Tidak ada service role key di aplikasi ini dan jangan pernah menambahkannya sebagai NEXT_PUBLIC_*.
Kalau variabel belum diisi, aplikasi menampilkan halaman /setup.
kcraksa/money-tracker).NEXT_PUBLIC_* ditanam saat build).supabase/migrations/ skema, RLS, seed kategori, fungsi (0001); periode, pemasukan, toko & urutan rak (0002)
src/lib/ logika murni + tes: forecast, period, route (urutan rak), shopping, gamification, date
src/lib/server/xp.ts pemberian XP/badge/quest (idempoten)
src/lib/supabase/ klien browser/server + penjaga sesi
src/proxy.ts refresh sesi & redirect ke /login (pengganti middleware di Next 16)
src/app/menu/ layar Menu (pilih Money Tracker / Service Record)
src/app/(servis)/servis/ Service Record: kendaraan, detail, catat servis, riwayat, atur
src/lib/service/ logika murni + tes: status part (km+waktu), laju km/hari, validasi, template part
src/app/(app)/ Beranda, Catat, Rencana gajian, Checklist (+Stok), Evaluasi, Pencapaian, Pengaturan
src/app/actions/ Server Actions (mencatat, tagihan, rencana gajian, stok, belanja, pengaturan)
public/sw.js service worker: layar Catat tetap terbuka saat offline
tests/schema.test.ts menguji skema + RLS pada Postgres nyata (pglite)
Simpan terasa instan karena: (1) tampilan optimistik — "tersimpan" muncul seketika dan pengiriman berjalan di latar belakang
(gagal jaringan masuk antrean, bisa diurungkan kapan saja); (2) jalur simpan di server hanya memuat yang perlu — bonus streak,
quest, dan penutupan periode dikerjakan setelah balasan terkirim (after()); (3) login diverifikasi lokal (getClaims),
bukan lewat jaringan di tiap permintaan.
Agar server juga cepat, perhatikan dua hal ini:
iad1); bila Supabase di Singapura,
tiap query menempuh ±230 ms pulang-pergi. Atur Settings → Functions → Region di Vercel ke wilayah terdekat dengan project
Supabase (Singapura = sin1), atau tambahkan "regions": ["sin1"] di vercel.json.getClaims otomatis kembali ke cek jaringan: tetap benar, hanya tidak secepat itu.middleware bernama proxy.ts, cookies() bersifat async. Lihat AGENTS.md.https://*-<tim-kamu>.vercel.app/auth/confirmLogin dengan Google (disarankan): tidak mengirim email, jadi bebas dari batas pengiriman email Supabase.
https://catatan-kita.vercel.app) dan http://localhost:3000.https://<project-ref>.supabase.co/auth/v1/callback
(alamat persisnya tertera di Supabase pada halaman provider Google).https://<domain-kamu>/auth/confirm.Email tetap tersedia sebagai cadangan di halaman login. Kalau mau tanpa email sama sekali, tidak perlu mengatur template di bawah.
Authentication → Emails → Templates (hanya bila memakai login email): edit Magic Link dan Confirm signup (pengguna baru memakai yang kedua) agar link bekerja lintas browser dan ada kode 6 digit:
<h2>Masuk ke Catatan Kita</h2>
<p><a href="{{ .SiteURL }}/auth/confirm?token_hash={{ .TokenHash }}&type=email">Klik untuk masuk</a></p>
<p>Atau masukkan kode: <b>{{ .Token }}</b></p>
Isi yang sama dipakai di kedua template (aplikasi otomatis mencoba tipe token yang sesuai). Kode 6 digit penting kalau aplikasi sudah dipasang di layar utama iPhone: link dari email sering terbuka di Safari biasa, bukan di aplikasi, jadi memasukkan kode di aplikasi adalah cara paling mulus.
(Opsional, hanya untuk login email) Project Settings → Auth → SMTP: pasang SMTP sendiri (Resend, Brevo, dll.). Email bawaan Supabase dibatasi hanya beberapa email per jam, cukup untuk uji coba tapi bisa menghambat login.