# ⚠ ALLOWLIST, NOT A DENYLIST — deny everything, then re-include what is ours.
#
# This directory is SillyTavern's live user data, not a curated export. It holds
# chat logs, an empty-but-arming `secrets.json`, caches, thumbnails and whatever
# a future version decides to write here. A denylist protects only the files
# someone remembered; an allowlist means a new file is invisible until a human
# names it.
#
# ⚠ THE ONE THAT MATTERS: `secrets.json` is currently EMPTY, because API keys go
# through LiteLLM with a placeholder. It arms itself the moment any key is typed
# into the UI, and this repo is public. It must never become trackable by
# accident, which under a denylist it eventually would.

# 1. deny everything
/*

# 2. re-include the artifacts worth versioning
!.gitignore
!README.md
!st-export.py
!/worlds/
!/characters/
!/QuickReplies/
!/OpenAI Settings/
!/User Avatars/
!/_text/

# 3. drop SillyTavern's STOCK content — it is regenerated on startup
# ⚠ Seraphina's expression pack alone is 3.6 MiB of PNG, and none of it is
# world-building. The stock lorebook `worlds/Eldoria.json` is KEPT on purpose:
# 8 KB of readable JSON is a useful worked example of lorebook structure.
/characters/default_*
/characters/Seraphina/

# 4. inside those, still keep the junk out
# ⚠ Backup files, including ones left by operational fixes — `Default.json.bak-squashfix`
# was created while debugging the heretic 400 and was staged on the first pass.
**/*.bak-*
**/*.bak
**/.DS_Store
**/Thumbs.db

# ⚠ NOT TRACKED, DELIBERATELY:
#   secrets.json          API keys — see above
#   settings.json         every UI preference, rewritten on any change; personas
#                         are extracted from it into _text/personas.json instead
#   chats/, group chats/  the sessions themselves — personal, and churn hard
#   backups/, thumbnails/, vectors/, stats.json, content.log, image-metadata.json
#   themes/, movingUI/, reasoning/, extensions/, assets/, backgrounds/
#   instruct/, context/, sysprompt/   85 stock templates that ship with the app,
#                         and are INERT in Chat Completion mode anyway
