Supported Frameworks
Python frameworks and package managers that Phemeral detects and deploys automatically.
Phemeral automatically detects your Python framework and package manager from your source code. No configuration files are required — Phemeral analyzes your project structure and code to determine how to build and run your application.
Frameworks
| Framework | Server | Protocol |
|---|---|---|
| FastAPI | uvicorn | ASGI |
| Flask | gunicorn | WSGI |
| Django | uvicorn | ASGI |
Package Managers
| Package Manager |
|---|
| uv |
| poetry |
| pip (pyproject.toml) |
| pip (requirements.txt) |
Detection Priority
Phemeral searches for dependency files in this order and uses the first match:
uv.lock→ uvpoetry.lock→ poetrypyproject.toml→ piprequirements.txt→ pip
The search finds the dependency file closest to the root of your repository (shallowest directory depth). This file's location also determines the project root — the directory that Phemeral treats as the working directory for your application.
Python Version
Phemeral reads the Python version from a .python-version file in your project. If no .python-version file is found, Python 3.12 is used as the default.
The .python-version file should contain a version number. For example:
3.11Runtime Servers
Based on the detected framework protocol:
- ASGI (FastAPI, Django): Your application is started with uvicorn on port 8000.
- WSGI (Flask): Your application is started with gunicorn on port 8000.
Runtime Command Selection
Phemeral chooses the runtime command for each new deployment in this order:
- If the project has a saved custom start command, Phemeral uses that command.
- Otherwise, Phemeral uses the autodetected default command for the framework.
You can set or clear the custom command from the project's Settings tab. Saving an empty value returns the project to autodetection. See Set a Custom Start Command.
The autodetected fallback command follows this pattern:
# ASGI (FastAPI, Django)
uvicorn {module}:{object} --host 0.0.0.0 --port 8000
# WSGI (Flask)
gunicorn {module}:{object} --bind 0.0.0.0:8000Custom start commands should also bind your application to port 8000.