Lovable Migrator

Migrasi project Lovable ke GitHub + Cloudflare — adaptif, lengkap, dari pengalaman nyata

⚡ v4 — dengan standar Arsepat Game Hub
① Bersihkan ZIP
② Supabase
③ Checklist Deploy
④ Template
📦 Upload ZIP project Lovable apa pun

Klik atau drag & drop — game, web app, landing page, semua jenis project Lovable

Kapan butuh tab ini? Kalau project Lovable pakai fitur database, realtime multiplayer, atau autentikasi — biasanya sudah pakai Supabase di balik layar (milik Lovable, bukan akun Anda). Setelah migrasi, Supabase lama akan tidak aktif, jadi perlu buat yang baru di akun sendiri.
🔍 Cara tahu project pakai Supabase
Ada folder src/integrations/supabase/ Atau ada import dari @supabase/supabase-js di kode
Ada file .env dengan VITE_SUPABASE_URL Cek di ZIP yang didownload dari Lovable
Game punya fitur multiplayer realtime / login / simpan data Kalau pemain bisa main bersama real-time, hampir pasti pakai Supabase
📋 Langkah setup Supabase baru
Buka supabase.com → New project → isi nama → Region: Southeast Asia (Singapore) → Create. Biarkan semua security setting default (jangan centang Enable automatic RLS).
SQL Editor → New query → paste SQL dari tab Template → klik Run → pastikan muncul "Success. No rows returned"
Klik tombol Connect (hijau, navbar atas) → tab Framework → pilih React → lihat .env.local → catat VITE_SUPABASE_URL dan VITE_SUPABASE_PUBLISHABLE_KEY
Di Cloudflare Workers project → Settings → Build → Variables and secrets → Add (tipe Text, bukan Secret/Encrypt) → isi VITE_SUPABASE_URL dan VITE_SUPABASE_PUBLISHABLE_KEY
Buka game yang sudah di-deploy → coba buat room/login → kalau berhasil, Supabase sudah tersambung
⚠️ Masalah umum Supabase
→ Normal! Supabase yang dibuat Lovable ada di akun Lovable, bukan akun Anda. Solusi: buat project Supabase baru di akun sendiri dan buat ulang tabelnya dari kode.
→ Format key baru Supabase dimulai sb_publishable_... (bukan eyJ...). Keduanya valid — pastikan diisi di Build Variables Cloudflare, bukan di kode langsung.
→ Pastikan saat buat tabel sudah jalankan alter publication supabase_realtime add table public.nama_tabel untuk semua tabel yang perlu realtime.
0 / 0 selesai
📦 Persiapan kode (sebelum upload ke GitHub)
Lihat template di tab ④
Cari file yang ada kata "hubOpen", "Dialog", "iframe", atau "arsepat-game.lovable.app"
Lihat panduan lengkap di tab ② Supabase
🐙 GitHub
☁️ Cloudflare — Setup & Deploy
versions upload hanya upload versi tapi tidak langsung live — gunakan wrangler deploy agar langsung aktif
Untuk Supabase: VITE_SUPABASE_URL dan VITE_SUPABASE_PUBLISHABLE_KEY
🔧 Error umum & solusi
→ Hapus bun.lockb dari GitHub, commit, retry build
→ Hapus "sideEffects": false dari package.json
→ vite.config.ts salah — pastikan cloudflare() pakai {"{"} viteEnvironment: {"{"} name: "ssr" {"}"} {"}"} dan diletakkan SEBELUM tanstackStart()
→ Deploy command salah atau wrangler.jsonc belum ada/salah format assets directory
→ Hapus file public/_redirects dari repo
→ Copy isi yang disarankan → paste ke wrangler.jsonc di GitHub → commit
🌐 Domain custom
Kalau error "already has DNS records" → hapus dulu record CNAME yang ada di DNS Cloudflare
✅ Finalisasi
Kalau preview masih lama → cache WhatsApp belum habis, tunggu 1–24 jam
Watermark otomatis hilang karena disuntikkan server preview Lovable, bukan bagian kode
wrangler.jsonc — Static Assets (Vite React) semua project Vite
Untuk project Vite React biasa (client-side, tanpa SSR). Ganti nama-project dan tanggal hari ini.
{ "$schema": "node_modules/wrangler/config-schema.json", "name": "nama-project", "compatibility_date": "2026-07-02", "assets": { "directory": "./dist" } }
wrangler.jsonc — TanStack Start + SSR khusus TanStack Start
Untuk project yang pakai TanStack Start dengan server-side rendering.
{ "$schema": "node_modules/wrangler/config-schema.json", "name": "nama-project", "compatibility_date": "2026-07-02", "compatibility_flags": ["nodejs_compat"], "main": "src/server.ts", "observability": { "enabled": true } }
vite.config.ts — TanStack Start + Cloudflare khusus TanStack Start
Urutan plugin penting! cloudflare() harus SEBELUM tanstackStart(). Tanpa viteEnvironment: {"{"} name: "ssr" {"}"} akan error 404 dev-client-entry.
import { defineConfig } from "vite"; import { tanstackStart } from "@tanstack/react-start/plugin/vite"; import { cloudflare } from "@cloudflare/vite-plugin"; import react from "@vitejs/plugin-react"; import tailwindcss from "@tailwindcss/vite"; import tsconfigPaths from "vite-tsconfig-paths"; export default defineConfig({ plugins: [ cloudflare({ viteEnvironment: { name: "ssr" } }), tanstackStart({ server: { entry: "server" }, // hapus kalau tidak ada src/server.ts }), react(), tailwindcss(), tsconfigPaths(), ], });
vite.config.ts — Vite React biasa (tanpa SSR) Vite React standar
Untuk kebanyakan project Lovable yang tidak pakai TanStack Start.
import { defineConfig } from "vite"; import react from "@vitejs/plugin-react-swc"; import path from "path"; export default defineConfig({ plugins: [react()], resolve: { alias: { "@": path.resolve(__dirname, "./src") }, }, });
SQL Supabase — Sketsa Berantai (skeber) multiplayer realtime
Jalankan di SQL Editor Supabase. Buat tabel rooms, players, steps + aktifkan Realtime + RLS.
-- Tabel rooms create table public.rooms ( id uuid primary key default gen_random_uuid(), code text not null, created_at timestamptz default now(), current_step integer default 0, host_id uuid, num_players integer default 1, status text default 'waiting' ); -- Tabel players create table public.players ( id uuid primary key default gen_random_uuid(), created_at timestamptz default now(), nickname text not null, room_id uuid not null references public.rooms(id) on delete cascade, seat integer default 0 ); -- Foreign key host alter table public.rooms add constraint rooms_host_id_fkey foreign key (host_id) references public.players(id) on delete set null; -- Tabel steps create table public.steps ( id uuid primary key default gen_random_uuid(), created_at timestamptz default now(), author_id uuid not null references public.players(id) on delete cascade, chain_owner_id uuid not null references public.players(id) on delete cascade, drawing_data text, kind text not null, room_id uuid not null references public.rooms(id) on delete cascade, step_index integer not null, text_content text ); -- Aktifkan Realtime alter publication supabase_realtime add table public.rooms; alter publication supabase_realtime add table public.players; alter publication supabase_realtime add table public.steps; -- RLS — izinkan akses publik (game tanpa login) alter table public.rooms enable row level security; alter table public.players enable row level security; alter table public.steps enable row level security; create policy "allow all rooms" on public.rooms for all using (true) with check (true); create policy "allow all players" on public.players for all using (true) with check (true); create policy "allow all steps" on public.steps for all using (true) with check (true);
Tombol kembali ke Game Hub — standar Arsepat semua game
Paste di halaman lobby/home game. Ganti URL sesuai domain Game Hub. Wajib pakai <a href>, bukan button+Dialog+iframe.
register-sw.ts — tanpa jejak Lovable project PWA
export function registerServiceWorker() { if (typeof window === "undefined") return; if (!("serviceWorker" in navigator)) return; const inIframe = (() => { try { return window.self !== window.top; } catch { return true; } })(); const isDevHost = ["localhost","127.0.0.1"].includes(window.location.hostname); if (inIframe || isDevHost) { navigator.serviceWorker.getRegistrations().then(r => r.forEach(s => s.unregister())); return; } window.addEventListener("load", () => { navigator.serviceWorker.register("/sw.js").catch(() => {}); }); }
.gitignore tambahan untuk Cloudflare semua project
dist/ build/ .wrangler/ .env .env.local .env.production node_modules/