# Python __pycache__/ *.py[cod] *$py.class # Secrets config/config_secrets.json # Atomic writes leave these behind when a save or a test is interrupted; # the suite drops several per run. config/.config_secrets.json.tmp.* config/config.json config/config.json.backup config/wifi_config.json config/uninstalled_plugins.json credentials.json token.pickle # Environment .env .venv env/ venv/ venv*/ ENV/ # IDE .vscode/ .idea/ *.swp *.swo emulator_config.json # Testing .pytest_cache/ .coverage htmlcov/ .mypy_cache/ # Cache directory (root level only, not src/cache which is source code) /cache/ # Development plugins directory # Plugins are managed as separate repositories via multi-root workspace # See docs/MULTI_ROOT_WORKSPACE_SETUP.md for details plugins/* !plugins/.gitkeep # Binary files and backups bin/pixlet/ config/backups/ # Starlark apps runtime storage (installed .star files and cached renders) /starlark-apps/ skin_renders/ # JS test deps (test/js) node_modules/ package-lock.json # Team logos fetched at runtime. # # src/logo_downloader.py and LogoHelper write into assets/sports/_logos/ # whenever a plugin meets a team whose logo is not on disk. Those directories are # also tracked -- 209 NCAA logos and 153 soccer ones ship with the repo -- so # every rig accumulated untracked files it was never meant to commit and # `git status` was permanently dirty. That noise is not harmless: it trains # everyone to ignore the one signal that says a checkout is not what you think # it is, which is how a stale tree sat unnoticed on a rig until a restart # surfaced four dead sports plugins. # # Ignoring a directory does not untrack what is already in it, so the logos that # ship keep shipping. Only new downloads are hidden. # # Adding a logo on purpose is rare and deliberate -- the last time was #415, four # named NCAA logos a plugin needed, and there has been no other in a year. Do it # with an explicit override: # git add -f assets/sports/ncaa_logos/DUKE.png assets/sports/*_logos/ assets/stocks/ticker_icons/ assets/stocks/crypto_icons/ # Plugin operation state written at runtime. # # web_interface/app.py writes data/plugin_operations.json, data/plugin_state.json # and data/operation_history.json as the web interface runs, into a directory that # ships tracked (data/.gitkeep) and was otherwise unignored. So every rig that ever # opened the web UI -- and every test run that constructs the app -- left three # untracked files behind and a permanently dirty `git status`. Same reasoning as # the logo rule above: a checkout that is always dirty is a checkout nobody reads. data/* !data/.gitkeep