WallpaperMachine
당신이 사랑하는 배경화면, 맥에서 새롭게 만나보세요
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Aplikasi internal untuk titip makanan & minuman bareng teman kantor. Seseorang membuka "titipan" (mis. Mixue depan kantor, tutup 11:30), yang lain ikut titip, bayar cash atau cashless dengan upload bukti transfer. Stack: Next.js 16 (App Router, Server Actions) · Supabase (Postgres + Storage) · Prisma 7 (schema & migrasi) · shadcn/ui (Radix, Tailwind v4).README 전문 보기 ↗
Aplikasi internal untuk titip makanan & minuman bareng teman kantor. Seseorang membuka "titipan" (mis. Mixue depan kantor, tutup 11:30), yang lain ikut titip, bayar cash atau cashless dengan upload bukti transfer.
Stack: Next.js 16 (App Router, Server Actions) · Supabase (Postgres + Storage) · Prisma 7 (schema & migrasi) · shadcn/ui (Radix, Tailwind v4).
Arsitektur data: aplikasi mengakses database dan storage hanya lewat Supabase
(supabase-js + service role key, di server). Prisma dipakai khusus untuk skema & migrasi
dari komputer developer, jadi deployment tidak butuh connection string database.
Pilih akun seperti profil Netflix. Akun terbuka tanpa password; PIN 6 digit opsional (dikunci 5 menit setelah 5x salah). Ganti PIN = sesi di perangkat lain otomatis keluar.
Titipan live: daftar titipan yang sedang buka, auto-refresh tiap 10 detik, tab Riwayat.
Lampiran gambar: pembuka titipan bisa melampirkan sampai 5 gambar (foto menu, daftar harga, syarat) saat membuka titipan, lalu menambah/menghapusnya. Semua gambar bisa diperbesar: cubit & geser di HP, scroll / klik dua kali / tombol di komputer.
Detail titipan: info pembayaran pembuka titipan (teks + gambar QRIS, tombol salin), form titip (pesanan, harga, radio cash/cashless, upload bukti bayar), daftar pesanan dengan total, jumlah cash/cashless, dan status lunas.
Pembuka titipan bisa menutup / membuka lagi / menandai selesai, menandai pesanan lunas, mengubah harga asli, dan menghapus pesanan.
Pengaturan: foto profil, info pembayaran (teks dan/atau gambar), pasang/ganti/hapus PIN.
Admin (/admin, dilindungi password admin di database): tambah / ubah nama / reset PIN / nonaktifkan / hapus
pengguna, statistik storage, hapus gambar per item atau massal berdasarkan umur, ganti
password admin. Password disimpan sebagai hash scrypt di tabel Setting; mengganti password
mengeluarkan sesi admin di perangkat lain.
Admin – kelola titipan (/admin/titipan): akses penuh ke semua titipan lewat data table
(shadcn + TanStack Table: cari, filter, urutkan, pilih banyak, atur kolom, paginasi). Admin bisa
membuka titipan atas nama sendiri (akun khusus Admin) atau siapa pun — pembuka dipilih lewat
combobox yang bisa dicari — mengubah semua datanya (pembuka, judul, catatan, status,
jam tutup), mengelola lampiran, serta menambah / mengubah / menandai lunas / mengganti bukti /
menghapus pesanan siapa pun — termasuk di titipan yang sudah ditutup — satu per satu atau massal.
Akun Admin (dibuat oleh migrasi) hanya dipakai sebagai pembuka titipan dari dashboard admin: tidak tampil di halaman pilih akun maupun daftar pengguna, dan tidak bisa dipakai masuk.
Akun nonaktif tampil abu-abu di halaman pilih akun; diklik muncul info bahwa akun dinonaktifkan. Saat menonaktifkan, admin bisa memilih akun tetap tampil abu-abu atau disembunyikan.
Kompresi gambar: foto dikecilkan dulu di browser (maks 1600px), lalu server
mengompres ulang ke WebP dengan sharp sebelum masuk storage:
| Jenis | Ukuran maks | Kualitas |
|---|---|---|
| Foto profil | 256×256 (crop) | 80 |
| QR pembayaran | 1080px | 90 |
| Bukti bayar | 1280px | 70 |
| Lampiran | 1600px | 80 |
Pembersihan berkala: GET /api/cron/cleanup menghapus bukti bayar yang lebih tua dari
CLEANUP_PROOF_DAYS hari. vercel.json menjadwalkannya tiap hari 03:00 WIB.
npm install
cp .env.example .env # isi SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY, SESSION_SECRET
npm run admin:password # atur password admin (sekali saja; juga dipakai kalau lupa password)
npm run dev
Buka /admin, login, tambahkan pengguna, lalu kembali ke halaman depan. Bucket storage
(SUPABASE_BUCKET, default nitipdonk) dibuat otomatis sebagai bucket public saat upload
pertama.
Isi DIRECT_URL di .env lokal dengan connection string Session pooler (port 5432) dari
Supabase Dashboard → Connect. Variabel ini hanya untuk Prisma dan tidak perlu ada di Vercel.
npm run db:deployprisma/schema.prisma.npm run db:dev, lalu
DIRECT_URL=postgres://postgres:postgres@localhost:51214/template1?sslmode=disable SHADOW_DATABASE_URL=postgres://postgres:postgres@localhost:51215/template1?sslmode=disable npx prisma migrate dev --name <nama>npm run db:deploy.npx supabase gen types typescript --project-id <PROJECT_REF> --schema public > src/lib/database.types.tsKarena data ditulis lewat Supabase (bukan Prisma Client), nilai bawaan harus dibuat oleh
database: id memakai dbgenerated("(gen_random_uuid())::text"), updatedAt diisi trigger,
dan kolom waktu bertipe @db.Timestamptz(3). Ikuti pola yang sama untuk tabel baru.
Semua tabel memakai Row Level Security tanpa policy, jadi tidak bisa diakses dengan anon/publishable key. Server memakai service role key yang melewati RLS.
SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY, SESSION_SECRET
(openssl rand -base64 32)CRON_SECRET, CLEANUP_PROOF_DAYS, SUPABASE_BUCKETnext build; migrasi dijalankan dari komputer developer
dengan npm run db:deploy.Cron di vercel.json otomatis mengirim header Authorization: Bearer $CRON_SECRET. Kalau
deploy di tempat lain, panggil endpoint cron dari penjadwal apa pun dengan header yang sama.
/img/... di domain aplikasi, jadi URL Supabase tidak terlihat di
browser. Foto profil terbuka (tampil di halaman pilih akun); bukti bayar, QR, dan lampiran
hanya untuk yang sudah login atau admin. Bucket storage-nya sendiri masih public, jadi URL
Supabase lama (kalau pernah tersalin) tetap bisa dibuka.prisma/ schema & migrasi
src/actions/ server actions (auth, trips, orders, profile, admin, admin-trips)
src/lib/ klien Supabase + tipe database, sesi & PIN, storage, kompresi gambar
src/app/ halaman: /, /titipan, /titipan/[id], /pengaturan, /admin, /admin/titipan, /admin/gambar
src/components/ komponen aplikasi; src/components/ui berisi komponen shadcn,
src/components/data-table komponen data table (pola Data Table shadcn)