Summary
Add Cython compilation to the PyAirbyte build pipeline so that PyPI-published wheels contain compiled .so/.pyd extensions instead of readable .py source files, providing basic code obfuscation for distribution from the private repo.
Context
This pattern has been prototyped in the airbyte-ops-mcp and connector-builder-mcp repos:
The approach uses:
hatch-cythonize build hook (maintained fork of hatch-cython) to compile .py → .c → .so during wheel builds
- Build-time injection of Cython config (not stored in
pyproject.toml) to avoid breaking uv sync / editable installs
- Post-build source stripping to remove
.py files from wheels where compiled .so counterparts exist
- Exclusion of modules that break under Cython compilation (e.g., MCP/Pydantic presentation layers)
Key Learnings from Ops MCP Implementation
- Cython config must NOT be in
pyproject.toml — it runs during editable installs (uv sync), breaking CI workflows. Solution: inject at build time via a script.
- Pydantic/FastMCP modules must be excluded — Cython-compiled functions (
cyfunction) don't expose type annotations the same way, breaking Pydantic schema generation.
__init__.py files must be excluded — required for Python package structure.
- Platform-specific wheels — must build per OS (Linux, macOS) and Python version (3.10, 3.11, 3.12).
Action Items
Devin session: https://app.devin.ai/sessions/7c8622f9452141d1bbad93f74079278f
Requested by: Aaron ("AJ") Steers (@aaronsteers)
Summary
Add Cython compilation to the PyAirbyte build pipeline so that PyPI-published wheels contain compiled
.so/.pydextensions instead of readable.pysource files, providing basic code obfuscation for distribution from the private repo.Context
This pattern has been prototyped in the airbyte-ops-mcp and connector-builder-mcp repos:
The approach uses:
hatch-cythonizebuild hook (maintained fork of hatch-cython) to compile.py→.c→.soduring wheel buildspyproject.toml) to avoid breakinguv sync/ editable installs.pyfiles from wheels where compiled.socounterparts existKey Learnings from Ops MCP Implementation
pyproject.toml— it runs during editable installs (uv sync), breaking CI workflows. Solution: inject at build time via a script.cyfunction) don't expose type annotations the same way, breaking Pydantic schema generation.__init__.pyfiles must be excluded — required for Python package structure.Action Items
enable_cython_build.pyandstrip_source_from_wheel.pyscripts for PyAirbyte's package structureDevin session: https://app.devin.ai/sessions/7c8622f9452141d1bbad93f74079278f
Requested by: Aaron ("AJ") Steers (@aaronsteers)