`.python-version`, `pyproject.toml` and `Pipfile.lock` all ignored — builder forces CPython 3.14.3

Hi — hoping someone has seen this.

I’m on a monorepo (Vite frontend + FastAPI under api/index.py) on the

Hobby plan. The Python builder always picks CPython 3.14.3 regardless

of which of the three documented pin mechanisms I use, at any location.

The docs say 3.12 is the default; on my project it effectively isn’t.

What I’ve tried (all on a fresh push, build cache skipped)

| Config | Result |

|—|—|

| No Python pin anywhere | Using CPython 3.14.3 |

| .python-version = 3.12 at repo root | Using CPython 3.14.3 |

| .python-version = 3.13 at repo root | Using CPython 3.14.3 |

| .python-version inside api/ | Using CPython 3.14.3 |

| pyproject.toml at root with requires-python = ">=3.12" | Using CPython 3.14.3 |

| pyproject.toml inside api/ with requires-python = "==3.12.*" + .python-version + uv.lock (exact mirror of vercel/examples/python/next-fastapi-monorepo/backend) | Using CPython 3.14.3 |

| Pipfile + Pipfile.lock at root with python_version = "3.12" | Using CPython 3.14.3 |

| PYTHON_VERSION=3.12 env var on the project (all three scopes) | Using CPython 3.14.3 |

| Project Settings → Node.js: 24.x → 22.x (confirmed by Skipping build cache since Node.js version changed from "24.x" to "22.x") | Using CPython 3.14.3 |

| package.json engines.node = "22.x" | Using CPython 3.14.3 |

Representative build log (no pin at all)


Cloning github.com/…/… (Branch: dev, Commit: …)

Using CPython 3.14.3

Building psycopg2-binary==2.9.10

× Failed to build `psycopg2-binary==2.9.10`

Error: pg_config executable not found.

Error: Command "uv pip install" exited with 1

Note: older community posts (e.g. Deploy start to fail with uvicorn: command not found, Nov 2025)

show builders that emitted

No Python version specified in pyproject.toml or Pipfile.lock. Using latest installed version: 3.12.

My builds no longer emit any “Python version specified” line — uv just

declares Using CPython 3.14.3 directly.

vercel.json


{

"$schema": "https://openapi.vercel.sh/vercel.json",

"version": 2,

"buildCommand": "cd frontend && npm install && npm run build",

"outputDirectory": "frontend/dist",

"rewrites": [

{ "source": "/api/(.*)", "destination": "/api/index.py" },

{ "source": "/auth/(.*)", "destination": "/api/index.py" },

{ "source": "/health", "destination": "/api/index.py" },

{ "source": "/(.*)", "destination": "/index.html" }

]

}

api/index.py


import sys, os

sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "backend"))

from app.main import app # noqa: F401

Project context

  • Created 2026-04-14 (recent)

  • Framework Preset: Other

  • Node.js: 22.x (recently switched from 24.x, no effect on Python)

  • Region: iad1

  • Plan: Hobby

  • package.json lives in frontend/

  • Python source lives in api/index.py + a shared package in backend/

Questions

  1. Is the project silently enrolled in an early 3.14 default rollout?

  2. If yes, what’s the opt-out path on Hobby — any project setting, env var,

or file I can commit?

  1. If no, why are the three documented pin files being ignored? Is there

an additional prerequisite (a specific file name, a specific location,

a specific vercel.json shape)?

Happy to share more of the build log on request. Thanks!

Based on the current docs, this looks like more than a loose requires-python constraint.

The expected behavior seems to be:

  • Vercel should respect Python version requirements from pyproject.toml, .python-version, or Pipfile.lock at the project root
  • projects without a specified version should still default to Python 3.12
  • requires-python = ">=3.12" is not a strict pin, since 3.14 satisfies it
  • but a root-level .python-version set to 3.12 should still not end up as Using CPython 3.14.3

So if the build consistently shows Using CPython 3.14.3 even with a root .python-version or a strict 3.12 pin, this feels more like:

  • a regression in version detection
  • a monorepo/root-directory detection issue
  • or a rollout/docs mismatch

The strongest signal to me is the root-level .python-version = 3.12 still being ignored, since that’s hard to reconcile with the current docs.

The psycopg2-binary failure may just be a downstream effect of landing on Python 3.14, rather than the root cause itself.

If you’re able to share the repo, that would be really helpful for getting the full picture. In the meantime, I can pass this along to our Python team. :slight_smile:

Hi @setounkpe7 , I work on the python/backend team at Vercel.

It sounds like you’re trying to deploy both a frontend and backend inside the same Project which is exactly what we built Services for.

Something like this should help get you started:

{

  "experimentalServices": {
    "web": {
      "entrypoint": "frontend",
      "framework": "vite",
      "routePrefix": "/"
    },
    "api": {
      "entrypoint": "api/index.py",
      "routePrefix": "/server"
    }
  }
}