Lovable Migrator

Migrasi project Lovable apa pun ke GitHub + Cloudflare — adaptif sesuai stack project

v3 — universal, mendeteksi stack otomatis
1. Bersihkan ZIP
2. Checklist Deploy
3. Template Siap Pakai
Upload ZIP proyek Lovable apa pun

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

Checklist umum untuk migrasi project Lovable apa pun ke GitHub + Cloudflare. Centang saat selesai — progress tersimpan otomatis di browser ini. Beberapa item hanya relevan untuk stack tertentu (ditandai).

GitHub
Cloudflare — Setup awal
Cloudflare — Error umum & solusi
→ Hapus file lockfile dari repo, commit, biarkan Cloudflare generate ulang otomatis
→ Hapus "sideEffects": false dari package.json
→ vite.config.ts salah konfigurasi plugin Cloudflare — pastikan pakai cloudflare({"{"}viteEnvironment:{"{"}name:"ssr"{"}"}{"}"}) dan diletakkan SEBELUM tanstackStart() di array plugins. Lihat tab Template.
→ Pastikan diisi di Settings → Build → Variables and secrets (bukan Workers runtime settings), dan tipe Text bukan Secret
→ Copy isi yang disarankan, paste ke wrangler.jsonc di repo, commit
→ Cek base path di vite.config (properti base), dan cek apakah routing pakai client-side router yang butuh redirect rules (untuk Pages, tambahkan file _redirects berisi /* /index.html 200)
Sumber data eksternal (jika project memakainya)
→ Untuk Google Sheets: buat Google Apps Script Web App proxy (Extensions → Apps Script di spreadsheet) yang pakai SpreadsheetApp.getActiveSpreadsheet(), deploy sebagai Web App dengan akses "Anyone". Lihat tab Template.
Verifikasi akhir

Template ini dikelompokkan berdasarkan stack. Gunakan sesuai jenis project yang sedang dimigrasikan — tidak semua project butuh semua template ini.

vite.config.ts — TanStack Start + Cloudflare khusus TanStack Start
Versi resmi dari dokumentasi Cloudflare. Kalau project punya custom server.ts, tambahkan baris server: {"{"} entry: "server" {"}"} di dalam tanstackStart(); kalau tidak ada, hapus baris itu.
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" }, }), react(), tailwindcss(), tsconfigPaths(), ], });
vite.config.ts — React/Vite biasa, tanpa SSR Vite React standar
Untuk project Lovable yang TIDAK punya server.ts atau SSR — kebanyakan project Lovable sebenarnya tipe ini (client-side rendering biasa).
import { defineConfig } from "vite"; import react from "@vitejs/plugin-react"; import tsconfigPaths from "vite-tsconfig-paths"; export default defineConfig({ plugins: [react(), tsconfigPaths()], });
wrangler.jsonc — template dasar khusus Workers/SSR
Hanya diperlukan kalau project di-deploy sebagai Cloudflare Workers (ada server-side rendering). Project static biasa (Cloudflare Pages) tidak butuh file ini. Ganti nama-project-anda dan tanggal compatibility_date ke hari ini.
{ "$schema": "node_modules/wrangler/config-schema.json", "name": "nama-project-anda", "compatibility_date": "2026-06-29", "compatibility_flags": ["nodejs_compat"], "main": "src/server.ts", "observability": { "enabled": true } }
_redirects — untuk SPA routing di Cloudflare Pages React Router/client-side routing
Taruh file ini di folder public/ kalau project pakai client-side routing (React Router, dll) dan halaman selain "/" jadi blank/404 setelah deploy ke Pages.
/* /index.html 200
Google Apps Script — proxy CSV dari spreadsheet aktif jika pakai Google Sheets
Buka spreadsheet → Extensions → Apps Script → paste kode ini → ganti nama-nama sheet di sheetNames sesuai tab Anda → Deploy → New deployment → Web app → Execute as: Me → Who has access: Anyone.
function doGet(e) { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = e.parameter.sheet || "data"; const sheetNames = { data: "Sheet1" // tambahkan tab lain di sini, misal: // localization: "Localization", // metadata: "Metadata" }; const sheetObj = ss.getSheetByName(sheetNames[sheet]); if (!sheetObj) { return ContentService.createTextOutput("Sheet not found: " + sheet) .setMimeType(ContentService.MimeType.TEXT); } const data = sheetObj.getDataRange().getValues(); const csv = data.map(row => row.map(cell => { const str = String(cell); return str.includes(",") || str.includes('"') || str.includes('\n') ? '"' + str.replace(/"/g, '""') + '"' : str; }).join(",") ).join("\n"); return ContentService.createTextOutput(csv) .setMimeType(ContentService.MimeType.TEXT); }
register-sw.ts — service worker tanpa jejak Lovable jika project punya PWA/service worker
Pengganti aman untuk file service worker yang sebelumnya mengecek host lovable.app/lovableproject.com.
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(regs => regs.forEach(r => r.unregister()) ); return; } window.addEventListener("load", () => { navigator.serviceWorker.register("/sw.js").catch(() => {}); }); }
.gitignore tambahan untuk Cloudflare semua stack
Baris yang sebaiknya ada di .gitignore agar tidak ikut ter-upload.
dist/ build/ .wrangler/ .env .env.local .env.production node_modules/