feat: initial public release

ConsentOS — a privacy-first cookie consent management platform.

Self-hosted, source-available alternative to OneTrust, Cookiebot, and
CookieYes. Full standards coverage (IAB TCF v2.2, GPP v1, Google
Consent Mode v2, GPC, Shopify Customer Privacy API), multi-tenant
architecture with role-based access, configuration cascade
(system → org → group → site → region), dark-pattern detection in
the scanner, and a tamper-evident consent record audit trail.

This is the initial public release. Prior development history is
retained internally.

See README.md for the feature list, architecture overview, and
quick-start instructions. Licensed under the Elastic Licence 2.0 —
self-host freely; do not resell as a managed service.
This commit is contained in:
James Cottrill
2026-04-13 14:20:15 +00:00
commit fbf26453f2
341 changed files with 62807 additions and 0 deletions

64
apps/api/pyproject.toml Normal file
View File

@@ -0,0 +1,64 @@
[project]
name = "consentos-api"
version = "0.1.0"
description = "ConsentOS — API service"
license = "Elastic-2.0"
requires-python = ">=3.12"
dependencies = [
"fastapi>=0.115,<1",
"uvicorn[standard]>=0.34,<1",
"sqlalchemy[asyncio]>=2.0,<3",
"asyncpg>=0.30,<1",
"alembic>=1.14,<2",
"pydantic>=2.0,<3",
"pydantic-settings>=2.0,<3",
"python-jose[cryptography]>=3.3,<4",
"bcrypt>=4.0,<5",
"redis>=5.0,<6",
"celery>=5.4,<6",
"httpx>=0.28,<1",
"structlog>=24.0,<25",
"psycopg2-binary>=2.9,<3",
"email-validator>=2.0,<3",
"jinja2>=3.1,<4",
"markupsafe>=2.1,<3",
"reportlab>=4.0,<5",
"geoip2>=4.8,<5",
]
[project.optional-dependencies]
dev = [
"pytest>=8.0,<9",
"pytest-asyncio>=0.24,<1",
"pytest-cov>=6.0,<7",
"httpx>=0.28,<1",
"ruff>=0.9,<1",
"mypy>=1.13,<2",
]
[build-system]
requires = ["setuptools>=68"]
build-backend = "setuptools.build_meta"
[tool.setuptools.packages.find]
where = ["."]
include = ["src*"]
[tool.pytest.ini_options]
testpaths = ["tests"]
asyncio_mode = "auto"
asyncio_default_fixture_loop_scope = "session"
filterwarnings = ["ignore::DeprecationWarning"]
[tool.ruff]
target-version = "py312"
line-length = 100
[tool.ruff.lint]
select = ["E", "F", "I", "N", "W", "UP", "B", "SIM", "RUF"]
ignore = ["B008"] # Depends() in FastAPI defaults is idiomatic
[tool.mypy]
python_version = "3.12"
strict = true
plugins = ["pydantic.mypy"]