File & media migration

Base44 File Storage

Short answer: your files live in two places, both on Base44’s servers — and neither one is the database. Files you add while building sit in your app’s file library, public by default, served from Base44’s media host. Files your users upload through the live app are stored separately, private by default, and linked from your data records. Both sit outside Base44’s backups, outside any region control, and outside the code export. If you only migrate the database, you leave half your app behind.

Not one store — two

Two file systems, not one

The first thing to understand about Base44 file storage is that there is not one of it. There are two file systems with different rules, different defaults, and different ways to get your files back — plus a third, quieter one that catches people by surprise.

The file library is the store you see while building. Your app has its own file library where Base44 keeps the files you add to it and the media the AI generates while you build — images, videos, brand guides, PRDs, data exports. Anything you upload to the library, or add from Google Drive, is stored there automatically, and you can reuse it across your app or hand it to the AI chat as context. Files in the library are served from Base44’s media host — the URLs look like media.base44.com/files/public/... — which is the address your app’s images actually load from.

Live-app uploads are the store your users fill. When someone uploads a profile photo or attaches a document inside your running app, that file does not go into your file library — Base44’s own docs say so plainly. Instead, your app keeps a link to each uploaded file in a record in your app’s data, and the file itself lives in Base44’s storage behind that link. You cannot browse these files in the library, and you cannot delete them there either: to remove one, you delete the data record that links to it, through the Data tab.

Then there is the third case: chat attachments. Files you upload from your computer into the AI chat — a screenshot, a contract, a sketch — are private. They are not added to your file library, they get no public link, and people using your app cannot open them. That privacy lasts exactly until the AI copies the file into your app: ask it to use an attached photo as your homepage background, and it saves a public copy in your file library, where anyone with that copy’s link can open it. Base44’s docs flag this themselves: if the copy holds something sensitive, make it private. It is the single easiest way to publish a file you meant to keep private, and it happens silently, as a side effect of a normal build request.

The default that matters most

Public by default — check yours before you ship

Here is the sentence that should change how you look at your Base44 app: files in your file library are public by default, so anyone with a file’s link can open it. That is Base44’s own documentation, not an inference. Every file in the library shows a Public or Private badge, and the default badge is Public. A public file is reachable by its direct URL with no login, no app session, and no check of any kind — the URL is the only key, and URLs leak: they sit in page source, in browser history, in shared links, in search indexes.

Making a file private is a deliberate act, and it works differently from what most builders expect. A private file has no public link at all; your app loads it through a temporary link instead. You make a file private from the library’s More actions menu — it takes two clicks and a confirmation — and private files still work everywhere they need to: as AI chat attachments, as images on the canvas, and as context files for in-app agents. The privacy is real, but it is opt-in, file by file, and nothing in the build flow prompts you to do it. If you have never opened your file library and looked at the badges, assume some of your files are public — then go and check.

Live-app uploads run the opposite default, and it is the better one: the AI saves uploads as private files by default, openable only by your app, and you have to ask the AI chat explicitly to save uploads as public files instead. That asymmetry is worth holding in your head, because it is easy to get backwards. The files you added are public until you say otherwise; the files your users added are private until you say otherwise. The first group is the one that has been sitting on public URLs since the day you built the page — customer lists, contracts, internal documents, anything you dropped into the library as a reference file and forgot about. Our database guide covers the same pattern one layer down: the things Base44 never asks you to decide are the things decided for you.

The ceilings and the meter

Per-file limits, and about one credit per upload

Base44 does not set an overall storage limit per app or per plan — independent checks of Base44’s billing documentation report no total cap, and the limits that exist are per file. For files people upload through your live app, Base44’s media documentation puts the ceiling at up to 50 MB per file, or 100 MB for video. The accepted types cover the usual set — images, video, audio, documents, and data files, from png and jpg through pdf, mp4, csv, and zip — and HTML files are not accepted. Check the current docs before you commit to a number; limits change, and the docs page is the source of truth.

The meter is the part founders underestimate. Every file upload through your live app runs through Base44’s built-in UploadFile service, and Base44’s credits documentation lists it at about 1 integration credit per upload — extracting structured data from an uploaded file costs about 1 credit per call on top. Those are estimates, not a price list: Base44 works out the exact number after each action runs, and the rates are subject to change at its discretion. The honest way to read them is as a ratio, not a quote — an app whose users upload photos, documents, or scans all day spends integration credits in proportion to its success, and a photo-heavy app on the free plan’s 100 monthly integration credits runs dry fast. Check Credits Used on a message for what an action actually cost; that is the only number Base44 treats as truth.

That meter is also the reason file storage belongs in the migration conversation early, not late. On your own stack, storing a file costs fractions of a cent and no per-upload toll — Supabase Storage or an S3 bucket charges for the bytes, not for the act of uploading. The migration does not just move the files; it removes a meter that taxes your users’ ordinary activity. Our limits guide walks through the full credit picture, and the pattern is the same everywhere: the platform’s conveniences are priced per use, and the price only becomes visible at scale.

The two exclusions

Outside the backups, outside any region control

Files are excluded from both of the safety nets builders assume cover them. The first exclusion is backups. Base44’s automatic backups — the ones that run on eligible plans with nothing to switch on — cover table records only. Not uploaded files, not your app’s users, and not the rest of the app. Our backups guide verified this against Base44’s own backup documentation: files in your library or live app sit entirely outside the backup, and the only way to keep a copy of a file outside Base44 is to take it yourself. There is no backup file you can download, no scheduled export to your own storage, and no restore that brings a deleted file back. A table can be rolled back to yesterday; a file cannot.

The second exclusion is data residency. Base44 offers no region picker and publishes no per-customer hosting locations — our data-residency guide covers that for the database, and files are no different. There is no setting that places your files in the EU or the UK, no way to see which region they are in, and no contractual promise about where they sit. They are served from Base44’s media host, and the platform decides the rest. If a customer or regulator asks you to prove your users’ uploaded files never leave a specific region, the honest answer on Base44 is that you cannot prove it — because there is no control to point at and no location to show. On your own storage, the region is a setting in your account, visible in your dashboard, provable to your customers.

Put the two exclusions together and the shape of the risk is clear. Your files are the only part of your app with no safety net at all: no backup, no region control, public by default in the library, and reachable only through URLs the platform owns. None of that is a reason to panic — for most apps, most of the time, the files simply sit there and work. It is a reason to know, before the day you need a file back or a customer asks where one lives, that the answer is not in any dashboard Base44 gives you.

The move itself

How file migration actually works

File migration is the most skipped step in leaving Base44, and the most visible when it is skipped — because files are what users see first. The code export does not carry them: independent migration guides are blunt about this, listing uploaded files as copied out of Base44 storage separately, precisely because the export leaves them behind. The database CSVs do not carry them either: a CSV holds a URL pointing at Base44’s media host, not the file itself. If you rebuild the app and re-import the tables without touching the files, every image, PDF, and attachment still loads from Base44 — and keeps working right up until the day you cancel, when the URLs stop resolving.

The honest sequence has three steps, and the order matters. First, inventory. List every place files live: the file library (open it and read the badges — that is also your public-file audit), the live-app uploads (walk the data tables and collect every record holding a file link), and the chat-attachment copies the AI saved into the library along the way. The inventory is the step everyone wants to skip, and it is the step that decides whether anything goes missing. Second, copy. Download each file and re-upload it to storage you own — Supabase Storage, S3, or R2 — and update every record that points at the old URL, so the new app serves the new address. Independent migration guides describe the same mechanics: a backend function downloads each file and re-uploads it to the new bucket, because there is no bulk transfer and no import button. Third, verify before you cancel. Open every file from its new home, on the new app, as a signed-out user — and only then retire the old one. Our cancellation guide says the same thing about the whole app: migrate first, cancel last, because after cancellation nothing is recoverable.

That is the whole job, and it is deliberately unglamorous: no clever shortcut, no one-click tool, just a complete inventory, a copy to storage with your name on it, and a link rewrite verified file by file. It is also the job OffRamp does as part of every migration — files moved over, links rewritten — because a migration that leaves the files behind is not a migration, it is a demo with broken images. The files are the forgotten half of the app. Count them before you move, and they stop being forgotten.

FAQ

Questions, answered honestly

Where does Base44 store uploaded files?

In two places, both on Base44's servers. Files you add while building live in your app's file library, served from Base44's media host (media.base44.com). Files your app users upload through the live app are stored separately and are not in the file library — your app keeps a link to each one in a record in your data. Neither place is the database, and neither is a folder you can browse or download in bulk.

Are Base44 files public by default?

Files in your file library are public by default: anyone with the link can open them, and each file carries a Public or Private badge. You can make a library file private, and then your app loads it through a temporary link instead. Files your app users upload through the live app are the opposite — private by default, openable only by your app, unless you ask the AI to save them as public. Watch the chat-attachment trap: a file you attach privately in the AI chat becomes a public copy in your file library the moment the AI uses it in your app.

Do Base44 backups include uploaded files?

No. Base44's automatic backups cover table records only — not uploaded files, not your app's users, and not the rest of the app. Files in your file library or live app sit entirely outside the backup. If you want a copy of a file outside Base44, you have to take it yourself; there is no backup file you can download and no scheduled export to your own storage.

What is the file size limit on Base44?

Base44's media documentation puts live-app uploads at up to 50 MB per file, or 100 MB for video. Independent checks of Base44's billing documentation report no overall storage limit per app or plan — the limits are per file. Accepted file types cover the usual images, video, audio, documents, and data files (png, jpg, pdf, mp4, csv, and more); HTML files are not accepted. Check the current docs before you commit — limits change.

How many credits does a file upload cost on Base44?

About one integration credit per upload, per Base44's credits documentation: the UploadFile built-in service costs roughly 1 credit per upload, and extracting structured data from an uploaded file costs roughly 1 credit per call. These are estimates — Base44 works out the exact number after each action runs, and the rates are subject to change. An app built around photos or documents spends integration credits in proportion to its usage, so check Credits Used on a message for what an action actually cost.

How do I migrate uploaded files off Base44?

By copying each file to storage you own and rewriting the links — there is no export that carries them. First inventory all three places files live: the file library, live-app uploads linked from your data records, and any chat-attachment copies the AI saved into the library. Then download each file and re-upload it to your own bucket (Supabase Storage, S3, or R2), and update every record that points at the old Base44 URL. The code export leaves files behind entirely, and cancelling Base44 stops the old URLs resolving — so migrate first, cancel last, and verify every file opens from its new home before the old app retires.

Your files are half your app. Take them with you.

Files are the piece most exports skip — and the piece your users notice first when it's gone. If you're leaving Base44, don't discover the missing files after you've cancelled. Migrate your app off Base44 onto Supabase, Vercel, and GitHub accounts in your name: your data, users, files, and functions rebuilt on infrastructure you own, and the app verified live before the old one retires. Connect the Base44 account from the OffRamp home page. The free analysis takes about a minute, and your fixed quote comes with it.

Start your free analysis