← Back to Blog
Guide

Migrating from Replit in 2025: Complete Guide

Jul 10, 2026·10 min read

Why people are moving from Replit

Replit raised prices significantly in 2024 and again in 2025. Many developers — hobbyists, students, indie hackers, and small teams — found that what was once a free or cheap platform now costs $20-25/month for features they relied on. On top of that, Replit's AI model choices became more restricted, and container reliability has been a recurring complaint in the community.

Spinini offers a comparable environment at lower cost, with DeepSeek R1 as the default AI (which outperforms Replit's AI on complex coding tasks in our testing), and a set of collaboration and version management features that make migration less risky. This guide walks through the full process.

Before you start: inventory your Replit projects

Log in to replit.com and list every Repl you want to migrate. For each one, note:

  • The language/framework (Node.js? Python? Next.js?)
  • Any secrets (API keys, database URLs)
  • Whether it uses a database (Replit DB, Postgres, SQLite)
  • Whether it's deployed (public URL)
  • Any scheduled tasks (Replit doesn't have first-class cron, but some people work around this)

This inventory takes 15 minutes and saves hours of confusion later.

Step 1 — Export your Repls

For each Repl you want to migrate:

1. Open the Repl

2. Click the three-dot menu in the top right

3. Select "Download as ZIP"

The ZIP includes all source files with a top-level folder named after the Repl. Download each one to a local folder like /migrations/replit-exports/.

What's in the ZIP:

  • All your source files
  • package.json / requirements.txt / pyproject.toml
  • .replit and replit.nix (Replit-specific config — you won't need these)
  • Any uploaded files you put in the Repl

What's NOT in the ZIP:

  • node_modules/ (stripped automatically)
  • Replit's Nix store (.local/, .config/, .nix-profile/)
  • Your secrets (you'll need to re-enter these)
  • The database contents (needs separate export — see below)

Step 2 — Export your database (if applicable)

If you used Replit Database (key-value): there's no built-in export. In your Repl's terminal, run:

import replit
import json

data = {key: replit.db[key] for key in replit.db.keys()}
with open('replit_db_export.json', 'w') as f:
    json.dump(data, f)

This creates a JSON file you can download and import later.

If you used Replit's Postgres: in the terminal, run:

pg_dump $DATABASE_URL > my_db.sql

Download my_db.sql (drag it from the file tree). You'll import it into your Spinini project's Postgres later.

Step 3 — Create projects on Spinini

For each Repl, create a matching project:

1. Click New Project on your Spinini dashboard

2. Choose the matching template (Node.js, Python, Flask, Next.js, etc.)

3. Switch to the Import ZIP tab

4. Drag and drop the ZIP file you downloaded from Replit

Spinini automatically strips the top-level folder, skips Replit-specific config files (.replit, .nix-profile), and imports all your source files.

Save a Version History checkpoint immediately after the import: click the History icon and save "Initial import from Replit". This gives you a clean restore point before you start making changes.

Step 4 — Set up your environment

Open the project in the editor. You'll need to:

Install dependencies:

# Node.js
npm install
# or if you used pnpm on Replit:
npm install -g pnpm && pnpm install

# Python
pip install -r requirements.txt

Re-enter your secrets: Create a .env file in your project root and paste your key-value pairs:

DATABASE_URL=postgresql://...
OPENAI_API_KEY=sk-...
STRIPE_SECRET_KEY=sk_live_...

Alternatively, use the Secrets panel in the sidebar — secrets stored there are injected as environment variables and never appear in your files.

Update the DATABASE_URL: If you're using Spinini's built-in Postgres, set:

DATABASE_URL=postgresql://ourgame:ourgame@localhost:5432/ourgame

Or connect to your own database provider (Supabase, Neon, PlanetScale) by pasting their connection string.

Step 5 — Import your database data

If you exported Replit DB to JSON:

import json
import sqlite3  # or your database driver

with open('replit_db_export.json') as f:
    data = json.load(f)

# Insert into your new database
conn = sqlite3.connect('app.db')
for key, value in data.items():
    conn.execute('INSERT INTO kv_store (key, value) VALUES (?, ?)', [key, json.dumps(value)])
conn.commit()

If you exported Postgres with pg_dump, upload the .sql file to your project and run:

psql $DATABASE_URL < my_db.sql

Ask the AI Chat panel if you get stuck: "I'm importing a Postgres dump file from Replit. The import is failing with this error: [paste error]. What do I do?" The chat panel is particularly useful during migration for questions like this — it's cheaper than agent runs and you can ask follow-ups naturally.

Step 6 — Start your app and fix issues

Click Run to start the container, then click the Preview tab to see your app. Most Replit projects start without issues. Common things that need fixing:

Port mismatch: Replit apps often use dynamic ports or port 8080. Spinini's preview connects to port 3000. Update your start command to use PORT 3000:

PORT=3000 node index.js
# or
PORT=3000 flask run --host=0.0.0.0 --port=3000

Replit-specific imports: Some packages only work on Replit (replit, replit.db). Search your files for these and replace them with standard alternatives.

Nix packages: If your Repl used replit.nix to install system packages, you'll need to install equivalents. Open the terminal and install them with apt or the platform's package manager.

Paste any errors into the AI Agent: "I'm migrating from Replit and getting this error. Fix it." The agent understands migration context and can address Replit-specific patterns.

Step 7 — Set up scheduled tasks

If your Replit app had scheduled jobs (Replit doesn't have built-in cron, so you may have used an external service like cron-job.org or Upstash), move them to Spinini's Scheduled Tasks panel. Click the Clock icon and set up each task with the appropriate cron expression.

Step 8 — Invite collaborators

If you were sharing a Replit with teammates, invite them through the Collaborators panel. They get an email invitation and land directly in your project. You can give them View or Edit access.

Step 9 — Publish and verify

Click Publish. Your app gets a URL at {your-project-name}.spinini.com. Test it thoroughly:

  • All routes working?
  • Database reads and writes working?
  • Any features that depended on Replit-specific infrastructure?

Run the SEO Audit panel if your app is public-facing — it's a good moment to catch any missing meta tags or og:image issues.

Cleaning up

Once you're confident the migration worked:

1. Save a named Version History checkpoint: "Live on Spinini — migration complete"

2. Update any links or documentation pointing to your old replit.dev URL

3. Consider keeping the Replit version around (unpublished) for a few weeks as a backup

Migration is easier than it looks. Most Node.js and Python projects migrate in under an hour. If you hit a wall, the AI Chat panel is there to help — and so is our support team at support@spinini.com.

Ready to start building?

Free account includes 100 AI credits/month. No credit card required.

Start for free →