# Python
__pycache__/
*.py[cod]
.venv/
.pytest_cache/
*.db

# Personal LED ticker settings (led_config.example.json is the tracked template)
led_config.json
# The panel's own runtime cache, written beside the config on every poll so a
# unit that reboots during an outage comes back with the schedule and the
# living room block it last knew. Per-DEVICE state, exactly like the config
# next to it - nothing in BUNDLE_FILES or the SD image reads it, and
# wipe_for_new_owner deletes it. It was tracked, so it produced a spurious
# diff the moment anybody ran the panel locally, and the committed copy was
# one particular panel's state: living room ON, showing a scene that is
# private to one account.
led_cache.json
# Artwork a panel fetched from its server (led_ticker.ARTWORK) - a cache,
# written beside the config on a laptop run as on a wall.
artwork_cache.json
artwork_cache.json.tmp

# Node
node_modules/
dist/
*.tsbuildinfo

# Secrets — infra/.env.example is the tracked template
infra/.env
*.pem
*.key

# OS cruft
.DS_Store
Thumbs.db
desktop.ini

# Editors
.vscode/
.idea/
*.swp

# Signing keys, of every kind. CI restores the debug key from its cache, and
# the Play upload key (tools/android/new-upload-key.*) is created on a laptop
# and lives in a password manager - neither may ever reach the repo, where a
# key in the history cannot be un-leaked by deleting the file afterwards.
*.jks
*.keystore

# Android Studio and Gradle, on whichever machine opens android/. build/ below
# already covers android/**/build/ - checked with `git check-ignore` rather
# than restated.
android/.gradle/
android/.kotlin/
android/local.properties

# The APK drop-zone the android workflow scp's into and nginx bind-mounts.
# infra/deploy.sh CREATES it (mkdir -p, line 11), so on the box it is always
# there and always untracked - which is what made the build stamp report every
# production deploy as "-dirty" until the check learned to ignore untracked
# files. Runtime artifact, exactly like build/ below.
downloads/

# SD images built by pi/build-image-docker.sh
build/
# Base images cached between builds
.imgcache/

# Local dev database (tools/dev_server.py)
server/dev.db

# Raw payloads the probes dump so a shape can be read before it is parsed -
# tools/probe_espn_standings.py and probe_espn_conferences.py, both of which
# name their directory this way. Matched on the PREFIX rather than listed, so
# the next probe is covered the day it is written: 26MB of one probe's output
# reached main on a `git add -A` beside the crests, and 641,000 lines of JSON
# in the history is not undone by deleting the files afterwards.
#
# What a probe FOUND belongs in CLAUDE.md, which is where every one of these
# measurements already lives. The payload itself is a working file - and a
# fixture worth keeping goes to server/tests/fixtures/, deliberately chosen
# and trimmed, exactly as standings_nfl.json and standings_ncaaf.json were.
probe-espn-*/

# Claude Code worktree stubs. .claude/launch.json and .claude/settings.json are
# tracked on purpose - a worktree is a checkout, so a TRACKED settings file is
# the only one that reaches every worktree without being copied into each. These
# are per-session state and are not.
.claude/worktrees/

# Overpass index cached by tools/build_nascar_tracks.py - a build input,
# re-fetchable with --refresh, and 494KB of somebody else's server time.
.osm_us_circuits.json
.osm_*.json
