SillyTavern world artifacts, versioned in place
Tracked inside SillyTavern's live data directory rather than symlinked out of it. data/ is a bind mount into the container, so a symlink to a host path outside that mount resolves inside the container where the target does not exist -- broken to SillyTavern while looking correct on the host. The .gitignore is an allowlist, denying everything and re-including named paths, because this is live application data rather than a curated export. secrets.json is the reason: empty today because API keys go through LiteLLM with a placeholder, and it arms itself the moment a key is typed into the UI. This repo is public. A denylist protects only the paths someone remembered. Two of the four artifact types are not diffable as stored. Character cards are PNGs with the card JSON in a tEXt chunk, and personas live inside a 48 KB settings.json that SillyTavern rewrites on any change. st-export.py extracts both into _text/ so the reviewable artifact is text, one-way on purpose -- re-embedding JSON into a PNG is where a mistake corrupts authored content. Stock content is excluded: Seraphina's expression pack is 3.6 MiB of PNG the app regenerates on startup. The stock lorebook Eldoria.json stays -- 8 KB of readable JSON is a useful worked example of the format.
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
{
|
||||
"version": 2,
|
||||
"name": "Default",
|
||||
"disableSend": false,
|
||||
"placeBeforeInput": false,
|
||||
"injectInput": false,
|
||||
"color": "rgba(0, 0, 0, 0)",
|
||||
"onlyBorderColor": false,
|
||||
"qrList": [
|
||||
{
|
||||
"id": 1,
|
||||
"showLabel": false,
|
||||
"label": "HELP",
|
||||
"title": "",
|
||||
"message": "/?",
|
||||
"contextList": [],
|
||||
"preventAutoExecute": true,
|
||||
"isHidden": false,
|
||||
"executeOnStartup": false,
|
||||
"executeOnUser": false,
|
||||
"executeOnAi": false,
|
||||
"executeOnChatChange": false,
|
||||
"executeOnGroupMemberDraft": false,
|
||||
"executeOnNewChat": false,
|
||||
"executeBeforeGeneration": false,
|
||||
"automationId": ""
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"showLabel": false,
|
||||
"label": "New Chat",
|
||||
"title": "",
|
||||
"message": "/newchat",
|
||||
"contextList": [],
|
||||
"preventAutoExecute": true,
|
||||
"isHidden": false,
|
||||
"executeOnStartup": false,
|
||||
"executeOnUser": false,
|
||||
"executeOnAi": false,
|
||||
"executeOnChatChange": false,
|
||||
"executeOnGroupMemberDraft": false,
|
||||
"executeOnNewChat": false,
|
||||
"executeBeforeGeneration": false,
|
||||
"automationId": ""
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"showLabel": false,
|
||||
"label": "Match UI to Background",
|
||||
"title": "",
|
||||
"message": "/bgcol",
|
||||
"contextList": [],
|
||||
"preventAutoExecute": true,
|
||||
"isHidden": false,
|
||||
"executeOnStartup": false,
|
||||
"executeOnUser": false,
|
||||
"executeOnAi": false,
|
||||
"executeOnChatChange": false,
|
||||
"executeOnGroupMemberDraft": false,
|
||||
"executeOnNewChat": false,
|
||||
"executeBeforeGeneration": false,
|
||||
"automationId": ""
|
||||
}
|
||||
],
|
||||
"idIndex": 0
|
||||
}
|
||||
Reference in New Issue
Block a user