# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*

.claude/

node_modules
dist
dist-ssr
*.local

# (Stale Go-era frontend embed paths removed; build artifacts now in /dist
# from vite.config.js, gitignored via the top-level `dist` line above.)

# Editor
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

# Env (commit only .env.example) — frontend Vite vars only.
.env
.env.dev
.env.main
.env.*.local

# fly.io deploy secrets — gitignored. The only committed template is
# .env.z.example; copy it to `.env.dev` / `.env.main` (both ignored above).
# Project-local flyctl config dir (FLY_CONFIG_DIR) — holds the fly auth
# token; never commit.
.fly/

# Backend config (commit only kerf.example.toml).
kerf.toml

# Stray binaries
*.test
*.out

# Local storage backend (STEP files, uploads)
.kerf-storage/

# kerf-parts: third-party CAD parts are fetched locally on demand and
# NEVER committed (MIT hygiene). The clone cache + all generated/converted
# output (incl. the attribution NOTICE) live here and are gitignored.
# Only kerf-parts code + parts-sources.toml + LICENSES.md are committed.
/.parts-cache/

# kerf-partsgen generated parts — reproducible from committed generators
# with zero tokens; never committed (see packages/kerf-partsgen/LICENSES.md)
/.parts-out/

# Python
__pycache__/
*.py[cod]
*$py.class
*.egg-info/
.pytest_cache/
.mypy_cache/
.ruff_cache/
.venv/
venv/
env/

# Playwright e2e generated artifacts
tests/e2e/test-results/
tests/e2e/playwright-report/
/test-results/
/playwright-report/

# Misc
.cache/

# Internal sizing / pricing scratchpad (commercial — never commit)
billingmodel/
