# Python __pycache__/ *.py[cod] *$py.class # Secrets and per-device state. Everything the software writes into config/ # is local to one device -- config.json, config_secrets.json, wifi_config.json, # ytm_auth.json (a login session), saved_repositories.json, font_overrides.json, # and the temp files atomic writes leave behind when interrupted -- so only # the templates are tracked. Listing files one by one missed several. config/* !config/*.template.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: symlinks into a ledmatrix-plugins checkout # See docs/PLUGIN_DEVELOPMENT_GUIDE.md and docs/MULTI_ROOT_WORKSPACE_SETUP.md plugins/* !plugins/.gitkeep # Local settings for scripts/dev/dev_plugin_setup.sh (template: dev_plugins.json.example) /dev_plugins.json # Binary files and backups bin/pixlet/ config/backups/ # Starlark apps runtime storage (installed .star files and cached renders) /starlark-apps/ # 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_state.json and data/operation_history.json # (older releases also data/plugin_operations.json) as the web interface runs, into # a directory that ships tracked (data/.gitkeep). Unignored, every rig that ever # opened the web UI -- and every test run that constructs the app -- would leave # 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