# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# PyInstaller
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
.pybuilder/
target/

# Jupyter Notebook
.ipynb_checkpoints

# IPython
profile_default/
ipython_config.py

# pyenv
.python-version

# pipenv
Pipfile.lock

# poetry
poetry.lock

# pdm
.pdm.toml
.pdm-python
.pdm-build/

# PEP 582
__pypackages__/

# Celery stuff
celerybeat-schedule
celerybeat.pid

# SageMath parsed files
*.sage.py

# Environments
.env
.env.staging
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
src/.venv/
.venv/

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/
.dmypy.json
dmypy.json

# Pyre type checker
.pyre/

# pytype static type analyzer
.pytype/

# Cython debug symbols
cython_debug/

# IDEs

.idea/
*.swp
*.swo
*~
.DS_Store
*.sublime-project
*.sublime-workspace

# PyCharm
.idea/

# VS Code

*.code-workspace

# Vim
*.swp
*.swo
*.swn

# Emacs
*~
\#*\#
.\#*

# macOS
.DS_Store
.AppleDouble
.LSOverride
Icon
._*
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk

# Windows
Thumbs.db
Thumbs.db:encryptable
ehthumbs.db
ehthumbs_vista.db
*.stackdump
[Dd]esktop.ini
$RECYCLE.BIN/
*.cab
*.msi
*.msix
*.msm
*.msp
*.lnk

# Linux
*~
.fuse_hidden*
.directory
.Trash-*
.nfs*

# Project-specific
# Database files
*.db
*.sqlite
*.sqlite3

# Logs
*.log
logs/
*.log.*

# Kubernetes / Helm
*.kubeconfig
*.kubeconfig.yaml

# Terraform
.terraform/
*.tfstate
*.tfstate.*
.terraform.lock.hcl
terraform.tfplan
terraform.tfplan.json
*.tfvars
!terraform.tfvars.example

# Secrets and credentials
.env.local
.env.*.local
*.pem
*.key
*.crt
secrets/
*.secret

# MinIO / S3 local data
minio_data/
s3_data/

# Redis dumps
dump.rdb

# PostgreSQL
*.pid
*.lock

# npm lockfiles — project is bun-only (see Dockerfile.ui + CI workflows
# using `bun install --frozen-lockfile`). Tracking package-lock.json
# creates a footgun where contributors / AI tools reach for npm and
# silently install different versions than bun does.
package-lock.json
yarn.lock

# Temporary files
tmp/
temp/
*.tmp
*.bak
*.backup

# Lock files (uncomment if you don't want to commit lock files)
# Note: For uv projects, uv.lock is typically committed for reproducibility
!src/uv.lock

# Local development
.local/
local/

# Test artifacts
.pytest_cache/
test-results/
test-reports/

# Build artifacts
*.pyc
*.pyo
*.pyd
.Python

# Coverage reports
htmlcov/
.coverage
.coverage.*
coverage.xml
*.cover

# Profiling data
.prof

# mypy
.mypy_cache/
.dmypy.json
dmypy.json

# Ruff
.ruff_cache/

# Type checking
.pytype/
.pyre/

# OS generated files
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db

# Dagster
.dagster/storage/
.dagster/schedules/
.dagster/sensors/
.dagster/history/
.dagster/runs/
.dagster/daemon/
.dagster/workspace.yaml.lock
# Keep dagster.yaml config file
!.dagster/dagster.yaml

# UI exclude from git
ui/.output/
ui/.tanstack/
ui/.vercel/
ui/.cache/
ui/.next/
ui/.turbo/
ui/.env.local
ui/.env.development.local
ui/.env.test.local
ui/.env.production.local
!ui/src/lib/

# Docs site (Starlight)
docs-site/node_modules/
docs-site/dist/
docs-site/.astro/
!docs-site/bun.lock
!ui/bun.lock

# Claude Code session-local memory (per-machine, never tracked)
.claude/projects/

# Founder-private epics (investor / fundraising / immigration / employment
# strategy). Files are kept in the working tree for collaboration with
# Claude Code but must never enter the repo — they're explicitly marked
# `Status: PRIVATE` in their frontmatter. Two patterns to belt-and-braces:
#   1. Anything under .claude/private/ — preferred path for new docs
#   2. Any epic file with "speedrun" / "fundraise" / "investor_pitch" /
#      "immigration" in the name, regardless of folder
.claude/private/
.claude/epics/**/*speedrun*
.claude/epics/**/*fundraise*
.claude/epics/**/*investor_pitch*
.claude/epics/**/*immigration*

# Migration script backups (runtime artifacts from scripts/migrate_*.py).
# Must never enter the repo or the deploy script's clean-state check
# refuses to deploy. Prefer running migrations with --backup-dir pointing
# OUTSIDE the repo (e.g. /opt/qubithub-migration-backup), but ignore
# accidental in-repo placements as a safety net.
migration-backup/
/migration-backup/
