№ 01 What we host

Django, FastAPI, or Flask: run as written.

A WSGI or ASGI process runs on a dedicated instance, with a managed Postgres database for your existing migrations. A push deploys it. The shape underneath is the same for all three frameworks.

When this isn't the right fit A script or one-off job with no HTTP endpoint does not need a web-facing instance. That is a scheduled job, and we quote it as a smaller line item.

№ 02 The requirements

What it needs to run

The shape of the workload, before any hosting decision gets made.

Runtime
Python, via WSGI (Django, Flask) or ASGI (FastAPI, async Django)
Build step
Dependency install + migrations, run on deploy
Standing process?
Yes: gunicorn, uvicorn or similar, kept running
Data store
Postgres, almost always, via your existing migrations
Verdict
Dedicated, sized to whether a database is attached
№ 03 How it runs

How it runs here

The same management as every other tier we run, written in Python's own terms.

  • Provisioning

    A dedicated instance with the WSGI or ASGI server you choose. A process manager restarts it on a crash or a deploy.

  • Deploys

    Push to main. Our pipeline installs dependencies, runs your migrations and restarts the process.

  • Data + backups

    A managed Postgres tier next to the app, backed up every night with point-in-time recovery. Your migrations run against it unchanged.

  • TLS / DNS / monitoring

    Certificates renew on their own and we manage DNS end to end. Monitoring restarts a hung worker and alerts a person.

    What a visitor sees during a restart →
№ 04 Moving it in

Moving it in

Already running somewhere else? The full migration playbook covers the general steps. Below is what is specific to Python.

  1. 1

    Point us at the repo

    We need read access to the repo and its requirements or pyproject file.

  2. 2

    We stand up a copy

    We install dependencies and run migrations against a copy of your data. We check it on a staging copy before anything goes live.

  3. 3

    Cutover on your schedule

    DNS and TLS switch over with little-to-no downtime. A rollback stays ready if anything looks wrong.

The real gotchas
  • WSGI and ASGI apps need different process managers. Mixing them up is the most common first-deploy failure, so we confirm which one you run first.
  • Migrations that never ran in production show up for the first time during a move. We run them against a copy first, never against live data.
  • A background task runner (Celery, RQ, arq) is a second process next to the web one. It needs its own line item.
№ 05 The loop

The loop, on Python

A Python app grows one endpoint, one management command and one Celery task at a time. The loop briefs and ships each one.

  1. 01Build

    CustomLabs

    Bring an app you already built. Or CustomLabs designs and builds the first version in Django, FastAPI or Flask.

  2. 02Iterate

    CodeHerder

    Brief a new endpoint, a Celery task or a data migration in plain language. An agent opens a pull request against the real Python codebase.

  3. 03Run

    CustomHosted

    A dedicated instance sized to the framework, with a managed Postgres tier next to it. We patch it and back it up on a schedule.

An example brief
The brief
A Celery task that emails a weekly usage summary, plus a new read-only endpoint for the dashboard.
What the pull request holds
The task and the endpoint, in one pull request the agent opens against the real repo.
A real one
The site is blinding at night (+751 −258 · 19 files · merged 2026-07-31).
№ 06 WSGI or ASGI

WSGI or ASGI, and why it changes the provisioning

Django, FastAPI and Flask all run "Python on a server". The process models underneath them are different.

Flask and classic Django are WSGI applications. Each worker handles one request at a time, so blocking calls are fine. We put gunicorn in front of them, with a worker count sized to the instance's CPU. There is no event loop to reason about. No async code creeps into an app that was never written for it.

FastAPI and Django's newer async views are ASGI applications, built around an event loop. One worker can hold many more open connections, which is why FastAPI is cheap to run for a small API. The trade-off is that one blocking call inside an async view stalls every other request on that worker. So we run these behind uvicorn, with a process count set to contain that risk.

A common first-deploy complaint is a process model set up backwards. That means WSGI worker counts under an ASGI app, or the reverse. We ask which one you run before we provision, not after something falls over under load.

№ 07 A starting configuration

A starting configuration

A production Django, FastAPI or Flask app: a dedicated instance, a managed database, and the iteration add-on.

Base plan
Dedicated M
Iteration — CodeHerder loop
+$25/mo
Managed database
DB Standard — +$25/mo
Estimated total
$109/mo
№ 08 FAQ

Python questions

The questions this stack raises on its own. General hosting questions live on the homepage.

  1. 01Which Python frameworks do you actually support?

    This page covers Django, FastAPI and Flask. Anything that runs behind WSGI or ASGI works the same way. Describe it on the quote form.

  2. 02Do you run our existing migrations, or start fresh?

    Your existing migrations run as they are against the managed database. You keep your ORM and your migration tool.

  3. 03What about Celery or another task queue?

    A worker process runs next to the web process, on the same instance or a separate one, depending on load. Tell us about it and we size for it.

  4. 04Can CodeHerder write and run a migration for us?

    Yes. A briefed schema change comes back as a pull request with the migration file in it. Someone reviews it before it runs against real data.

  5. 05Is FastAPI cheaper to host than Django?

    Usually, if there is no database yet. Dedicated S often covers a small FastAPI service. Attach Postgres and the two cost about the same.

Ready to start?

Tell us what you're running — one fixed monthly rate, within a business day.

Get a quote →