id = "obs" name = "OBS Studio" homepage = "https://obsproject.com" description = "OBS (Open Broadcaster Software) is free and open source software for video recording and live streaming." # The project's own sentence, the meta description on https://obsproject.com. icon = "SimpleIcons:obsstudio" executables = ["obs"] [dotfiles] # OBS builds every one of its user paths by handing a name to # GetAppConfigPath, which is libobs' os_get_config_path. That function is the # platform-native config root: # # libobs/util/platform-cocoa.m NSSearchPathForDirectoriesInDomains( # NSApplicationSupportDirectory, NSUserDomainMask) # → ~/Library/Application Support/ # libobs/util/platform-nix.c $XDG_CONFIG_HOME, else $HOME/.config, + # # and %APPDATA% on Windows — one location under three names, which is # [appData]. The Homebrew cask's zap stanza names the macOS half from the # outside as well (https://formulae.brew.sh/api/cask/obs.json: # ~/Library/Application Support/obs-studio). # # frontend/OBSApp.cpp names what lands under it: "obs-studio/global.ini" and # "obs-studio/user.ini" for the application settings, # "obs-studio/basic/profiles" for the encoder and output profiles, and # "obs-studio/basic/scenes" for the scene collections. paths = ["[appData]/obs-studio/"] # The same file's first-run directory creation, minus the two above: # "obs-studio/logs" and "obs-studio/crashes" are where OBS writes its session # logs and crash reports (UploadLog reads back out of "obs-studio/logs"), and # "obs-studio/plugin_config" is per-plugin state on this machine — obs-websocket # keeps its server password there, among other things. None of it is # configuration the user wrote. exclude = [ "[appData]/obs-studio/logs/", "[appData]/obs-studio/crashes/", "[appData]/obs-studio/plugin_config/", ] # frontend/widgets/OBSBasic_Service.cpp: `constexpr std::string_view # OBSServiceFileName = "service.json"`, written into the current profile's # directory as `{ "type": …, "settings": { … }, "hotkeys": … }` — and the # settings object of an RTMP service is where the stream key lives. The file is # saved with obs_data_save_json_safe(…, "tmp", "bak"), so a .bak copy of it # sits beside it and is the same secret. # # The whole file is classified rather than the key inside it: the profile # directory name is the user's own, so no concrete-path rule could name it, and # what is lost by over-classifying is a service name and an ingest URL. secret = [ "[appData]/obs-studio/basic/profiles/*/service.json", "[appData]/obs-studio/basic/profiles/*/service.json.bak", ] # No machine_lines: scene collections, profiles and hotkeys are the setup a # user wants on their next machine. A scene's source does hold an absolute path # to a local media file, but that lives inside a JSON scene collection whose # file name is the user's own, so no rule here could name it.