<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Aakash</title>
    <description>The latest articles on DEV Community by Aakash (@batmanofweb).</description>
    <link>https://dev.to/batmanofweb</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4157864%2Ff2bb08a7-fe95-4e7b-ae8c-8ca94ff74fc7.jpg</url>
      <title>DEV Community: Aakash</title>
      <link>https://dev.to/batmanofweb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/batmanofweb"/>
    <language>en</language>
    <item>
      <title>Lovable Cloud to Supabase Migration Checklist</title>
      <dc:creator>Aakash</dc:creator>
      <pubDate>Sun, 04 Oct 2026 01:13:21 +0000</pubDate>
      <link>https://dev.to/batmanofweb/lovable-cloud-to-supabase-migration-checklist-4f9d</link>
      <guid>https://dev.to/batmanofweb/lovable-cloud-to-supabase-migration-checklist-4f9d</guid>
      <description>&lt;p&gt;Most Lovable Cloud to Supabase migration guides stop at "dump the database, restore it, change two env vars." That part takes an afternoon. The bugs show up a week later, when a user taps "Continue with Google" and nothing happens.&lt;/p&gt;

&lt;p&gt;So we built the checklist we wished existed, and then turned it into a &lt;a href="https://lovable2live.com/tools/lovable-cloud-migration-check/" rel="noopener noreferrer"&gt;free migration checker&lt;/a&gt; that reads your project's GitHub repo and tells you what your specific app needs. This post is the reasoning behind it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually lives in a Lovable Cloud project
&lt;/h2&gt;

&lt;p&gt;Lovable syncs your project to GitHub, and the backend is all there if you know where to look. &lt;code&gt;supabase/migrations/&lt;/code&gt; has every schema change as a timestamped SQL file. &lt;code&gt;supabase/functions/&lt;/code&gt; has your edge functions, one folder each, plus a &lt;code&gt;_shared&lt;/code&gt; folder if Lovable got organized. &lt;code&gt;supabase/config.toml&lt;/code&gt; has the project ref and, more importantly, any function that runs with &lt;code&gt;verify_jwt = false&lt;/code&gt;. And &lt;code&gt;src/integrations/supabase/types.ts&lt;/code&gt; is the generated type file, which doubles as a list of every public table even when the migrations are incomplete.&lt;/p&gt;

&lt;p&gt;That last part matters more than it sounds. Migrations drift. If someone ever changed a column from the Cloud UI and Lovable didn't write a migration for it, your repo is lying to you about the schema. Before trusting the SQL files, compare them against a real &lt;code&gt;pg_dump --schema-only&lt;/code&gt; of the Cloud database. It is the first thing we run on every migration.&lt;/p&gt;

&lt;h2&gt;
  
  
  The boring part (that still needs doing in order)
&lt;/h2&gt;

&lt;p&gt;Extensions first. If a migration does &lt;code&gt;create extension if not exists pg_trgm&lt;/code&gt; you're fine, but plenty of projects lean on &lt;code&gt;pg_cron&lt;/code&gt; and &lt;code&gt;pg_net&lt;/code&gt; that were switched on from a dashboard and never written down. Then the schema, then functions and triggers, then data, in that order. Triggers on &lt;code&gt;auth.users&lt;/code&gt; deserve special attention: the classic &lt;code&gt;handle_new_user&lt;/code&gt; that creates a &lt;code&gt;profiles&lt;/code&gt; row has to exist before the first signup on the new project, or you get users with no profile and a frontend that crashes on null.&lt;/p&gt;

&lt;p&gt;Copy the auth schema too. People forget that users don't live in &lt;code&gt;public&lt;/code&gt;. Dump &lt;code&gt;auth.users&lt;/code&gt; and &lt;code&gt;auth.identities&lt;/code&gt; with their password hashes and your users log in with the same password on the new project. Skip it and every single user has to sign up again, which is a great way to lose half of them.&lt;/p&gt;

&lt;p&gt;Storage is the annoying one. The Supabase dashboard can't move files between projects in bulk, so you either script it against the storage API or point rclone at both projects' S3 endpoints. Buckets have to be recreated with the same names and the same public or private setting, and the policies on &lt;code&gt;storage.objects&lt;/code&gt; come along only if they were in a migration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three things that break after the switch
&lt;/h2&gt;

&lt;p&gt;We ran the checker against three public Lovable Cloud repos while building it. All three call Lovable's AI gateway. Two of the three sign users in with Google through Lovable's own OAuth. That's the pattern.&lt;/p&gt;

&lt;h3&gt;
  
  
  Google sign-in goes through Lovable
&lt;/h3&gt;

&lt;p&gt;Newer Lovable projects ship a file at &lt;code&gt;src/integrations/lovable/index.ts&lt;/code&gt; that imports &lt;code&gt;createLovableAuth&lt;/code&gt; from &lt;code&gt;@lovable.dev/cloud-auth-js&lt;/code&gt;. The login button calls &lt;code&gt;lovable.auth.signInWithOAuth("google")&lt;/code&gt;, Lovable's broker does the OAuth dance with Lovable's Google client, and then hands your app a Supabase session.&lt;/p&gt;

&lt;p&gt;Move the database to your own project and that broker has nothing to hand tokens to. You need your own OAuth client in Google Cloud Console, the provider enabled under Authentication in Supabase, the callback URL set to your new project, and the frontend switched to plain &lt;code&gt;supabase.auth.signInWithOAuth&lt;/code&gt;. It's maybe an hour of work. Finding out from a user that login is broken is worse.&lt;/p&gt;

&lt;h3&gt;
  
  
  The AI features go quiet
&lt;/h3&gt;

&lt;p&gt;Edge functions that read &lt;code&gt;LOVABLE_API_KEY&lt;/code&gt; and post to &lt;code&gt;ai.gateway.lovable.dev&lt;/code&gt; only work inside Lovable Cloud. Off it, they fail on the first call. The fix is boring: pick a provider, get a key, set it with &lt;code&gt;supabase secrets set&lt;/code&gt;, and change the URL and model name in the function. The trap is that nobody tests the "summarize this" button during a migration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Signup emails never arrive
&lt;/h3&gt;

&lt;p&gt;On a fresh Supabase project the built-in email service only sends to members of your own team. Everyone else gets &lt;code&gt;Email address not authorized&lt;/code&gt;, and even for your team it's limited to a couple of emails an hour. Lovable Cloud hides this because it handles email for you. Set up custom SMTP before you switch traffic. We use Resend because the DNS setup takes ten minutes, but Postmark is just as good.&lt;/p&gt;

&lt;h2&gt;
  
  
  The cron job nobody remembers
&lt;/h2&gt;

&lt;p&gt;One of the repos we tested was a personal finance app that syncs bank data every night. The sync runs from &lt;code&gt;pg_cron&lt;/code&gt;, which calls an edge function over HTTP with &lt;code&gt;net.http_post&lt;/code&gt;, and that function has &lt;code&gt;verify_jwt = false&lt;/code&gt; and checks a shared secret header instead. Perfectly reasonable design. But the cron job has the old project's URL baked into the SQL. Restore it as-is on a new project and it keeps calling the old one every night, quietly, until the Cloud project is deleted and the sync just stops.&lt;/p&gt;

&lt;p&gt;That's the kind of thing a checklist exists for. Grep your migrations for &lt;code&gt;cron.schedule&lt;/code&gt; and &lt;code&gt;supabase.co&lt;/code&gt; before you call it done.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the checker works (and where it's dumb)
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://lovable2live.com/tools/lovable-cloud-migration-check/" rel="noopener noreferrer"&gt;migration checker&lt;/a&gt; runs in your browser. It pulls the file list from GitHub, downloads the migrations, functions and app code, and pattern-matches them. No database connection, no &lt;code&gt;.env&lt;/code&gt;, nothing sent to us. It only works on public repos because it uses GitHub without logging in.&lt;/p&gt;

&lt;p&gt;It parses SQL with regular expressions, not a real parser. That's a trade-off we'd make again: it's fast and has no dependencies, and Lovable's generated SQL is very regular. It can't see anything changed from the Cloud dashboard that never made it into a migration, and odd SQL formatting can slip past it. Treat its output as the checklist, not the audit.&lt;/p&gt;

&lt;p&gt;If you'd rather hand the whole thing off, we do &lt;a href="https://lovable2live.com/cloud-to-supabase/" rel="noopener noreferrer"&gt;Lovable Cloud to Supabase migrations&lt;/a&gt; at a fixed price, and you keep building in Lovable afterwards.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://lovable2live.com/blog/lovable-cloud-to-supabase-migration-checklist/" rel="noopener noreferrer"&gt;lovable2live.com&lt;/a&gt;. Aakash Verma, software developer and founder of Lovable 2 Live.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>lovablecloud</category>
      <category>supabase</category>
      <category>migration</category>
    </item>
    <item>
      <title>Apple Rejected Your Lovable App Under 4.2. Now What?</title>
      <dc:creator>Aakash</dc:creator>
      <pubDate>Sat, 03 Oct 2026 02:57:28 +0000</pubDate>
      <link>https://dev.to/batmanofweb/apple-rejected-your-lovable-app-under-42-now-what-1d0e</link>
      <guid>https://dev.to/batmanofweb/apple-rejected-your-lovable-app-under-42-now-what-1d0e</guid>
      <description>&lt;p&gt;"Your app provides a limited user experience as it is not sufficiently different from a mobile browsing experience."&lt;/p&gt;

&lt;p&gt;If you're reading this, you've probably got that sentence sitting in App Store Connect right now, under &lt;strong&gt;Guideline 4.2 - Design - Minimum Functionality&lt;/strong&gt;. You wrapped your Lovable app in Capacitor or some "website to app" service, paid the $99 developer fee, waited two days, and Apple said no.&lt;/p&gt;

&lt;p&gt;You're in good company. This is the single most common rejection we see on Lovable apps, and it's not random. The reviewer opened your app, saw your website with the browser chrome removed, and did exactly what the guideline tells them to do.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the reviewer is actually checking
&lt;/h2&gt;

&lt;p&gt;Apple doesn't ban WebViews. Plenty of approved apps render big chunks of their UI in one. What they reject is an app where the WebView &lt;em&gt;is&lt;/em&gt; the product, and nothing about it uses the phone.&lt;/p&gt;

&lt;p&gt;In practice the reviewer spends maybe two or three minutes in your app. A few things make it look like a website instantly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a hamburger menu instead of a tab bar&lt;/li&gt;
&lt;li&gt;a "Sign up" page that opens Safari for the magic link and never comes back&lt;/li&gt;
&lt;li&gt;pull to refresh doing nothing, or worse, reloading the whole page with a white flash&lt;/li&gt;
&lt;li&gt;the same cookie banner and footer links you have on the web&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One founder we worked with had been rejected three times. Each time they changed something cosmetic, a new icon, a splash screen, a different app name. The fourth submission had the same WebView with the same footer that said "© 2026, view our website". Rejected in 40 minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What gets an app through
&lt;/h2&gt;

&lt;p&gt;You don't need to rebuild everything. You need enough native surface that the reviewer can tell it's an app. Usually that's three or four of these, done properly:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Push notifications that do something.&lt;/strong&gt; Not "allow notifications?" on launch with nothing behind it. An actual notification when the thing the user cares about happens, which opens the right screen when tapped.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Native navigation.&lt;/strong&gt; A real tab bar for the three to five main sections. This alone changes how the app feels more than anything else on this list.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Device features.&lt;/strong&gt; Camera for uploads, Face ID sign-in, haptics on key actions, share sheet, offline handling. Pick the ones that fit your product. A habit tracker with a home screen widget reads as an app. A habit tracker in a WebView reads as a bookmark.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Auth that stays in the app.&lt;/strong&gt; Magic links need Universal Links set up so they open your app, not Safari. And if you offer Google login, Apple will also want Sign in with Apple. That's a separate rejection (Guideline 4.8) but it tends to show up on the same submission.&lt;/p&gt;

&lt;p&gt;When you resubmit, say what changed in the Review Notes. Short and specific: "Added native tab navigation, push notifications for new messages, camera upload, and Sign in with Apple." Reviewers read those notes. A vague "fixed issues" gets you the same reviewer making the same call.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest trade-off
&lt;/h2&gt;

&lt;p&gt;Could you keep patching a wrapper until it passes? Sometimes, yes. We've gotten Capacitor apps approved by adding push, a native tab bar and a couple of plugins.&lt;/p&gt;

&lt;p&gt;But we've also watched people spend a month fighting review on a wrapper and then hit the next wall: the app feels slow, scroll is janky on older Android phones, and the 1-star reviews say "it's just the website". At that point a proper Flutter or React Native build that talks to the same Supabase backend is often less work than the next round of patches. The backend, the database and the business logic you built in Lovable all stay. Only the screens get rebuilt.&lt;/p&gt;

&lt;p&gt;Which way makes sense depends on what your app does and how much of it is really mobile. A booking tool people use twice a month? A good wrapper might be fine. Something people open daily on their phone? Build it native.&lt;/p&gt;

&lt;p&gt;If your app is stuck in review right now, &lt;a href="https://lovable2app.com/contact/" rel="noopener noreferrer"&gt;send us the rejection message and your Lovable link&lt;/a&gt;. We'll tell you whether it's a two-day fix or a rebuild, and if your backend still lives on Lovable Cloud, whether to &lt;a href="https://lovable2live.com/cloud-to-supabase/" rel="noopener noreferrer"&gt;move it to your own Supabase&lt;/a&gt; first.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://lovable2app.com/blog/apple-guideline-4-2-lovable-webview-rejection/" rel="noopener noreferrer"&gt;lovable2app.com&lt;/a&gt;. Aakash Verma, software developer and founder of Lovable 2 Live.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>appstore</category>
      <category>lovable</category>
      <category>nativeapp</category>
      <category>appreview</category>
    </item>
    <item>
      <title>Lovable Cloud vs Supabase: Which Should Your App Run On?</title>
      <dc:creator>Aakash</dc:creator>
      <pubDate>Fri, 02 Oct 2026 15:45:28 +0000</pubDate>
      <link>https://dev.to/batmanofweb/lovable-cloud-vs-supabase-which-should-your-app-run-on-amj</link>
      <guid>https://dev.to/batmanofweb/lovable-cloud-vs-supabase-which-should-your-app-run-on-amj</guid>
      <description>&lt;p&gt;Half the Reddit threads on Lovable Cloud vs Supabase are arguing about the wrong thing. People compare them like two databases. They're the same database. Lovable Cloud is a Supabase project that Lovable creates and runs for you, inside their account, billed through your Lovable balance. Your own Supabase is a Supabase project in your account, billed by Supabase.&lt;/p&gt;

&lt;p&gt;Same Postgres. Same auth. Same storage buckets and edge functions. What changes is who holds the keys and who sends the invoice, and that turns out to matter a lot more than people expect in week one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you actually give up on Cloud
&lt;/h2&gt;

&lt;p&gt;When a founder sends us a Cloud project to look at, the first thing we ask for is the database connection string. They go looking for it, and there isn't one. That's the whole comparison in a nutshell.&lt;/p&gt;

&lt;p&gt;On Lovable Cloud you don't get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the Supabase dashboard (no table editor outside Lovable, no logs explorer, no auth settings page you control)&lt;/li&gt;
&lt;li&gt;the &lt;code&gt;service_role&lt;/code&gt; key, which a lot of "how do I run a cron job" or "how do I connect Zapier" tutorials assume you have&lt;/li&gt;
&lt;li&gt;a Postgres connection string, so no pgAdmin, no TablePlus, no &lt;code&gt;pg_dump&lt;/code&gt; on a schedule&lt;/li&gt;
&lt;li&gt;your own plan choice for compute, disk or point-in-time recovery&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You do get a SQL editor inside Lovable, and the agent can create tables and write migrations for you. For building, that's honestly enough. For running a business on it, it gets thin fast.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing, as far as anyone can tell
&lt;/h2&gt;

&lt;p&gt;Supabase publishes a rate card. Free tier: 500 MB database, 1 GB file storage, 50,000 monthly active users, and the project pauses after a week of inactivity, which is fine for experiments and terrible for anything with customers. Pro is $25 a month per organization and includes an 8 GB database, 100 GB of storage and 100,000 MAU, with usage billed beyond that. You can open the usage page and see exactly which line is growing.&lt;/p&gt;

&lt;p&gt;Lovable Cloud is usage-based and drawn from your Lovable balance. What Lovable doesn't give you is the same per-unit breakdown. You see the balance move. We've had two clients this year who were sure their AI features were eating their Cloud usage, and in both cases it was something boring (one was an edge function on a 1-minute schedule polling a third-party API that never changed, the other was image uploads at full resolution).&lt;/p&gt;

&lt;p&gt;So "which is cheaper" depends on your app, and the honest answer for a small app is that nobody can tell you up front. For an app with real traffic, owning the Supabase project is almost always cheaper to &lt;em&gt;reason about&lt;/em&gt;, which is what you actually want when you're the one paying.&lt;/p&gt;

&lt;h2&gt;
  
  
  When we'd tell you to stay on Cloud
&lt;/h2&gt;

&lt;p&gt;Plenty of cases. If you're still validating the idea, if nobody else needs database access, if your data is small and you'd shrug at losing a day of it, stay. Cloud is genuinely faster to start with. One click and you have auth and a database, and you're not juggling two dashboards.&lt;/p&gt;

&lt;p&gt;We'd also say stay if the only reason you want to move is a vague feeling that "real apps use Supabase". That's not a reason. Move when you hit a wall.&lt;/p&gt;

&lt;h2&gt;
  
  
  The walls people actually hit
&lt;/h2&gt;

&lt;p&gt;These are the ones we see, roughly in order of how often:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A second developer needs access.&lt;/strong&gt; A freelancer asks for the connection string or wants to run migrations from their own machine. On Cloud there's nothing to hand over.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backups.&lt;/strong&gt; Someone deletes a row they shouldn't have and asks "can we restore yesterday?" On your own Pro project you have daily backups, and point-in-time recovery is an add-on. On Cloud you're asking support.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrations that need the service role key.&lt;/strong&gt; n8n, Make, a cron worker on Railway, a nightly export to Google Sheets. All of them want a key with admin rights.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The bill.&lt;/strong&gt; Usually not the size of it, just not being able to explain it to a co-founder.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance questions.&lt;/strong&gt; A B2B customer sends a security questionnaire asking where data is hosted and who has access. "Inside Lovable's account" is an awkward answer.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If two of those are true for you, it's time.&lt;/p&gt;

&lt;h2&gt;
  
  
  How hard is the move, really
&lt;/h2&gt;

&lt;p&gt;Not hard, but fiddly. Lovable now lets you export your Cloud data and switch the project to a Supabase project you own, from the Cloud settings, and you keep building in Lovable afterwards exactly like before. The schema and rows come across cleanly.&lt;/p&gt;

&lt;p&gt;The fiddly part is everything around the rows. Storage files have to be moved separately. Secrets arrive as names with no values, so every Stripe key and API token gets pasted in again. Google and GitHub OAuth providers get set up from scratch, including the redirect URLs, which is where most DIY migrations stall for an evening. And user passwords. Depending on how the export is done, your users may need to reset them, so write that email before you start.&lt;/p&gt;

&lt;p&gt;We did one last month for a booking app with 23 tables and about 4,000 users. The data moved in under an hour. The OAuth redirect for Google took longer than the data, because the client's custom domain was set up on a &lt;code&gt;www&lt;/code&gt; subdomain in one place and the apex in another. That kind of thing.&lt;/p&gt;

&lt;p&gt;If you want to see what the move involves for your app, the &lt;a href="https://lovable2live.com/cloud-to-supabase/" rel="noopener noreferrer"&gt;Cloud to Supabase migration page&lt;/a&gt; lists exactly what we move and what breaks, and &lt;a href="https://lovable2live.com/process/" rel="noopener noreferrer"&gt;how we work&lt;/a&gt; explains the access we need. Or skip the reading and &lt;a href="https://lovable2live.com/contact/" rel="noopener noreferrer"&gt;book a call&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://lovable2live.com/blog/lovable-cloud-vs-supabase/" rel="noopener noreferrer"&gt;lovable2live.com&lt;/a&gt;. Aakash Verma, software developer and founder of Lovable 2 Live.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>lovablecloud</category>
      <category>supabase</category>
      <category>pricing</category>
    </item>
  </channel>
</rss>
