A clean architecture FastAPI starter template with authentication (WorkOS), PostgreSQL, and Alembic migrations
Project description
FastAPI Auth Starter
A clean architecture FastAPI project starter with authentication (WorkOS), PostgreSQL and Alembic migrations.
Quick Start
Create a new project from this template:
Install the package (globally or in a separate environment):
uv pip install fastapi-auth-starter
Initialize a new project in a new directory:
fastapi-auth-starter init my-project
Or initialize in the current directory:
fastapi-auth-starter init .
Note: The fastapi-auth-starter CLI tool is a scaffolding utility, not a runtime dependency. If you install it in your project's virtual environment and then run uv sync, it will be removed (this is expected behavior). Install it globally to avoid this.
Project Structure
fastapi_auth_starter/
├── app/
│ ├── __init__.py
│ ├── main.py # FastAPI application entry point
│ ├── api/
│ │ └── v1/
│ │ ├── api.py # API router aggregation
│ │ └── routes/
│ │ └── health.py # Health check endpoint
│ ├── core/
│ │ ├── config.py # Application configuration
│ │ └── database.py # Database connection and session management
│ ├── models/ # SQLAlchemy database models
│ ├── services/ # Business logic services
│ └── db/ # Database utilities
├── alembic/ # Database migration scripts
├── alembic.ini # Alembic configuration
├── pyproject.toml # Project dependencies (uv)
└── README.md
Features
- ✅ Clean architecture with separation of concerns
- ✅ FastAPI with async SQLAlchemy
- ✅ WorkOS authentication integration
- ✅ PostgreSQL database support
- ✅ Alembic for database migrations
- ✅ Health check endpoint
- ✅ Dependency injection with FastAPI
- ✅ Environment-based configuration
Prerequisites
- Python 3.12+ (3.13 for local dev, 3.12 for Vercel deployment)
- uv package manager
- PostgreSQL database (local or remote)
Setup
1. Install Dependencies
Dependencies are managed with uv. They are automatically installed when you run commands with uv run.
2. Configure Environment Variables
Important: Copy the example environment file and configure your settings:
cp .env.example .env
Then edit .env with your configuration:
# Database Configuration
DATABASE_URL=postgresql+asyncpg://user:password@localhost:5432/fastapi_auth
# API Configuration (optional - defaults are fine)
API_V1_PREFIX=/api/v1
PROJECT_NAME=FastAPI Auth Starter
VERSION=0.1.0
Note:
- The
.envfile is gitignored and should not be committed - The application uses
asyncpgfor async operations, but Alembic usespsycopg2for migrations (sync driver) - All sensitive configuration should be in
.envfile, not hardcoded
3. Set Up Database
You can use PostgreSQL from any source - local, cloud providers (AWS RDS, Neon, Supabase, etc.), or managed services.
Option A: Local PostgreSQL
If using a local PostgreSQL instance, create the database:
createdb fastapi_auth
Or using PostgreSQL client:
CREATE DATABASE fastapi_auth;
Option B: Cloud/Managed Database
If using a cloud provider (AWS RDS, Neon, Supabase, Railway, etc.):
- Create a PostgreSQL database through your provider's dashboard
- Copy the connection string provided by your provider
- Update the
DATABASE_URLin your.envfile with the connection string
Important:
- The
DATABASE_URLin your.envfile should point to your database (local or cloud) - Ensure the database is accessible from where you're running the application
- The connection string format should be:
postgresql+asyncpg://user:password@host:port/database
4. Run Migrations
Create your initial migration:
# Create initial migration
uv run alembic revision --autogenerate -m "Initial migration"
# Apply migrations
uv run alembic upgrade head
Running the Application
Development Server
uv run uvicorn app.main:app --reload
The API will be available at:
- API: http://localhost:8000
- Docs: http://localhost:8000/docs
- ReDoc: http://localhost:8000/redoc
Health Check
Test the health endpoint:
curl http://localhost:8000/api/v1/health
Expected response:
{
"status": "healthy",
"message": "Service is running"
}
Development
Adding New Routes
- Create a new route file in
app/api/v1/routes/ - Import and include the router in
app/api/v1/api.py
Example:
# app/api/v1/routes/users.py
from fastapi import APIRouter
router = APIRouter(prefix="/users", tags=["users"])
@router.get("/")
async def get_users():
return {"users": []}
Then add to app/api/v1/api.py:
from app.api.v1.routes import users
api_router.include_router(users.router)
Adding Database Models
- Create model in
app/models/ - Import in
app/models/__init__.py - Import in
alembic/env.py(for autogenerate)
Example:
# app/models/user.py
from sqlalchemy import Column, Integer, String
from app.core.database import Base
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True)
email = Column(String, unique=True, index=True)
Creating Migrations
# Auto-generate migration from model changes
uv run alembic revision --autogenerate -m "Description of changes"
# Create empty migration
uv run alembic revision -m "Description of changes"
Applying Migrations
# Apply all pending migrations
uv run alembic upgrade head
# Rollback one migration
uv run alembic downgrade -1
# Rollback to specific revision
uv run alembic downgrade <revision>
Architecture
Layers
- API Layer (
app/api/): Route handlers, request/response models - Service Layer (
app/services/): Business logic, domain operations - Model Layer (
app/models/): SQLAlchemy database models - Core Layer (
app/core/): Configuration, database setup, utilities
Dependency Injection
FastAPI's dependency injection is used throughout:
- Database sessions via
get_db()dependency - Configuration via
settingsobject - Custom dependencies in
app/core/dependencies.py(create as needed)
Deployment
Vercel Deployment
-
Install Dev Dependencies Locally:
uv sync # Installs all dependencies including dev
-
Set Environment Variables in Vercel:
- Go to your project settings in Vercel
- Add
DATABASE_URLenvironment variable with your PostgreSQL connection string - Format:
postgresql+asyncpg://user:password@host:port/database
-
Deploy:
vercel --prod
Note:
- Runtime dependencies don't include
psycopg2-binaryoralembic(only needed for local migrations) - Python 3.12 is used (Vercel doesn't support 3.13 yet)
- Make sure to run migrations on your database before deploying
References
- FastAPI Documentation
- SQLAlchemy Async Documentation
- Alembic Documentation
- uv Documentation
- Vercel Python Documentation
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fastapi_auth_starter-1.0.5.tar.gz.
File metadata
- Download URL: fastapi_auth_starter-1.0.5.tar.gz
- Upload date:
- Size: 119.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4bb7b1a871adaf715297c20f3fdd2293cc36e4b3916105f7724d2959fe307e93
|
|
| MD5 |
94eadd96554e9a6953cec0061e1835b4
|
|
| BLAKE2b-256 |
fe1e6894c68bf5efbf20b07e373e61494e6d0a1d410f6f0338f1408af8223d18
|
Provenance
The following attestation bundles were made for fastapi_auth_starter-1.0.5.tar.gz:
Publisher:
publish.yml on splenwilz/fastapi_auth_starter
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fastapi_auth_starter-1.0.5.tar.gz -
Subject digest:
4bb7b1a871adaf715297c20f3fdd2293cc36e4b3916105f7724d2959fe307e93 - Sigstore transparency entry: 702352371
- Sigstore integration time:
-
Permalink:
splenwilz/fastapi_auth_starter@c726fe57ef44c874722cccfb24258dda736ce27e -
Branch / Tag:
refs/tags/v1.0.5 - Owner: https://github.com/splenwilz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@c726fe57ef44c874722cccfb24258dda736ce27e -
Trigger Event:
push
-
Statement type:
File details
Details for the file fastapi_auth_starter-1.0.5-py3-none-any.whl.
File metadata
- Download URL: fastapi_auth_starter-1.0.5-py3-none-any.whl
- Upload date:
- Size: 52.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
775fe44916bc3429b08daf23bde0244c612e008241b9fa8852dcb693bb265f69
|
|
| MD5 |
496a6ca5f92cc338abae6f8163e205c5
|
|
| BLAKE2b-256 |
d244794eb8dce296333f1469e856ab1777ee056273b294af2e965cd5ffe30426
|
Provenance
The following attestation bundles were made for fastapi_auth_starter-1.0.5-py3-none-any.whl:
Publisher:
publish.yml on splenwilz/fastapi_auth_starter
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fastapi_auth_starter-1.0.5-py3-none-any.whl -
Subject digest:
775fe44916bc3429b08daf23bde0244c612e008241b9fa8852dcb693bb265f69 - Sigstore transparency entry: 702352374
- Sigstore integration time:
-
Permalink:
splenwilz/fastapi_auth_starter@c726fe57ef44c874722cccfb24258dda736ce27e -
Branch / Tag:
refs/tags/v1.0.5 - Owner: https://github.com/splenwilz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@c726fe57ef44c874722cccfb24258dda736ce27e -
Trigger Event:
push
-
Statement type: