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

# Dependencies
node_modules/

# Build outputs
dist/
bin/
.tsbuildinfo
*.tsbuildinfo

# Paraglide-compiled i18n output (generated from messages/*.json by the Vite
# plugin / `bun run i18n:compile`; the inlang cache + project meta self-ignore
# via project.inlang/.gitignore, leaving only settings.json tracked).
src/lib/paraglide/

# TypeScript
worker-configuration.d.ts

# Wrangler
.dev.vars
.wrangler/
# Real (filled-in) configs. Templates (.example) are committed.
wrangler.toml
wrangler.beta.toml
# Backups (may contain secrets). Never commit
*.bak

# Drizzle
drizzle/

# Convex: generated client/server code. COMMITTED on purpose: Convex's own CLI
# says "should be committed to the repo (your code won't typecheck without it!)".
# CI has no Convex deployment, so committing it is what makes typecheck + the
# convex-test suite work without a backend. `convex dev`/`deploy` keep it fresh.

# Environment
.env
.env.local
.env.*.local
.env.docker
.env.beta
.env.convex
# (the *.example files ARE tracked)
# The Remnawave integration-test env IS tracked on purpose: all-fake secrets for an
# ephemeral throwaway panel (docker-compose.remnawave-test.yml), needed to run the test.
!docker/remnawave-test/.env

# Verifier extension: pinned.js is release-specific build output (origin + the
# normalized index.html hash + baked manifest keys), generated by
# `bun run verifier:pin`. The .example template IS tracked.
verifier-extension/pinned.js

# OS
.DS_Store

# IDE
.vscode/
.idea/

# Test coverage
coverage/
*.lcov
.nyc_output

# Cache
.cache/
.eslintcache

# Misc
CLAUDE.md
# Local-only Claude Code working dir (plans contain unpatched-vuln details; never commit)
.claude/
