# The main config file # Note. # Be aware that when this configuration is being overwritten # by another configuration, any empty nested part # in the further configurations will reset (empty out) all the values. # For example: # the main config second config result # ... ... ... # list: list: list: # gba: gba: gba: # lib: mgba_libretro lib: "" # roms: [ "gba", "gbc" ] roms: [] # ... ... # # So do not leave empty nested keys. # for the compatibility purposes version: 3 # new decentralized library of games library: # optional alias file for overriding game names from the basePath path aliasFile: alias.txt # root folder for the library (where games are stored) basePath: assets/games # a list of ignored words in the ROM filenames ignored: - neogeo - pgm # DOSBox filesystem state - .pure # an explicit list of supported file extensions # which overrides Libretro emulator ROMs configs supported: # print some additional info verbose: true # enable library directory live reload # (experimental) watchMode: false coordinator: # debugging switch # - shows debug logs # - allows selecting worker instances debug: false # selects free workers: # - empty value (default, any free) # - ping (with the lowest ping) selector: monitoring: port: 6601 # enable Go profiler HTTP server profilingEnabled: false metricEnabled: false urlPrefix: /coordinator # a custom Origins for incoming Websocket connections: # "" -- checks same origin policy # "*" -- allows all # "your address" -- checks for that address origin: userWs: workerWs: # max websocket message size in bytes maxWsSize: 32000000 # HTTP(S) server config server: address: :8000 cacheControl: "max-age=259200, must-revalidate" frameOptions: "" https: false # Letsencrypt or self cert config tls: address: :443 # allowed host name domain: # if both are set then will use certs # and Letsencryt instead httpsCert: httpsKey: analytics: inject: false gtag: worker: # show more logs debug: false library: # root folder for the library (where games are stored) basePath: assets/games network: # a coordinator address to connect to coordinatorAddress: localhost:8000 # where to connect endpoint: /wso # ping endpoint pingEndpoint: /echo # set public ping address (IP or hostname) publicAddress: # make coordinator connection secure (wss) secure: false # ISO Alpha-2 country code to group workers by zones zone: monitoring: # monitoring server port port: 6602 profilingEnabled: false # monitoring server URL prefix metricEnabled: false urlPrefix: /worker server: address: :9000 https: false tls: address: :444 # LetsEncrypt config # allowed host name domain: # Own certs config httpsCert: httpsKey: # optional server tag tag: emulator: # set the total number of threads for the image processing # (removed) threads: 0 # enable autosave for emulator states if set to a non-zero value of seconds autosaveSec: 0 # save directory for emulator states # special tag {user} will be replaced with current user's home dir storage: "{user}/.cr/save" # path for storing emulator generated files localPath: "./libretro" # checks if the system supports running an emulator at startup failFast: true # do not send late video frames skipLateFrames: false # log dropped frames (temp) logDroppedFrames: false libretro: # use zip compression for emulator save states saveCompression: true # Sets a limiter function for some spammy core callbacks. # 0 - disabled, otherwise -- time in milliseconds for ignoring repeated calls except the last. debounceMs: 0 # Allow duplicate frames dup: true # Libretro cores logging level: DEBUG = 0, INFO, WARN, ERROR, DUMMY = INT_MAX logLevel: 1 cores: paths: libs: assets/cores # Config params for Libretro cores repository, # available types are: # - buildbot (the default Libretro nightly repository) # - github (GitHub raw repository with a similar structure to buildbot) # - raw (just a link to a zip file extracted as is) repo: # enable auto-download for the list of cores (list->lib) sync: true # external cross-process mutex lock extLock: "{user}/.cr/cloud-game.lock" map: darwin: amd64: arch: x86_64 ext: .dylib os: osx vendor: apple arm64: arch: arm64 ext: .dylib os: osx vendor: apple linux: amd64: arch: x86_64 ext: .so os: linux arm: arch: armv7-neon-hf ext: .so os: linux windows: amd64: arch: x86_64 ext: .dll os: windows main: type: buildbot url: https://buildbot.libretro.com/nightly # if repo has file compression compression: zip # a secondary repo to use i.e. for not found in the main cores secondary: type: github url: https://github.com/sergystepanov/libretro-spiegel/raw/main compression: zip # Libretro core configuration # # The emulator selection will happen in this order: # - based on the folder name in the folder param # - based on the folder name (core name) in the list (i.e. nes, snes) # - based on the rom names in the roms param # # Available config params: # - altRepo (bool) prioritize secondary repo as the download source # - lib (string) # - roms ([]string) # - scale (int) [0 - none] # scales the output video frames by this factor. # - scaleMethod (string) [bilinear2] -- Gstreamer method of scaling # nearest-neighbour (0) – Nearest Neighbour # bilinear (1) – Bilinear (2-tap) # 4-tap (2) – 4-tap Sinc # lanczos (3) – Lanczos # bilinear2 (4) – Bilinear (multi-tap) # sinc (5) – Sinc (multi-tap) # hermite (6) – Hermite (multi-tap) # spline (7) – Spline (multi-tap) # catrom (8) – Catmull-Rom (multi-tap) # mitchell (9) – Mitchell (multi-tap) # - maxThreads (int) [0] -- cap the number of threads used by the encoder # - folder (string) # By default emulator selection is based on the folder named as cores # in the list (i.e. nes, snes) but if you specify folder param, # then it will try to load the ROM file from that folder first. # - width (int) -- broken # - height (int) -- broken # - ratio (float) # - isGlAllowed (bool) # - usesLibCo (bool) # - hasMultitap (bool) -- (removed) # - coreAspectRatio (bool) -- (deprecated) correct the aspect ratio on the client with the info from the core. # - hid (map[int][]int) # A list of device IDs to bind to the input ports. # Can be seen in human readable form in the console when worker.debug is enabled. # Some cores allow binding multiple devices to a single port (DosBox), but typically, # you should bind just one device to one port. # - kbMouseSupport (bool) -- (temp) a flag if the core needs the keyboard and mouse on the client # - nonBlockingSave (bool) -- write save file in a non-blocking way, needed for huge save files # - vfr (bool) # (experimental) # Enable variable frame rate only for cores that can't produce a constant frame rate. # By default, we assume that cores output frames at a constant rate which equals # their tick rate (1/system FPS), but OpenGL cores like N64 may have significant # frame rendering time inconsistencies. In general, VFR for CFR cores leads to # noticeable video stutter (with the current frame rendering time calculations). # - options ([]string) a list of Libretro core options for tweaking. # All keys of the options should be in the double quotes in order to preserve upper-case symbols. # - options4rom (rom[[]string]) # A list of core options to override for a specific core depending on the current ROM name. # - hacks ([]string) a list of hacks. # Available: # - skip_hw_context_destroy -- don't destroy OpenGL context during Libretro core deinit. # May help with crashes, for example, with PPSSPP. # - skip_same_thread_save -- skip thread lock save (used with PPSSPP). # - uniqueSaveDir (bool) -- needed only for cores (like DosBox) that persist their state into one shared file. # This will allow for concurrent reading and saving of current states. # - saveStateFs (string) -- the name of the file that will be initially copied into the save folder. # All * symbols will be replaced to the name of the ROM. list: gba: lib: mgba_libretro roms: ["gba", "gbc"] maxThreads: 4 options: mgba_audio_low_pass_filter: enabled mgba_audio_low_pass_range: 60 # mgba_frameskip: auto pcsx: lib: pcsx_rearmed_libretro roms: ["cue", "chd"] # example of folder override folder: psx # see: https://github.com/libretro/pcsx_rearmed/blob/master/frontend/libretro_core_options.h options: pcsx_rearmed_show_bios_bootlogo: enabled pcsx_rearmed_drc: enabled pcsx_rearmed_frameskip_type: auto pcsx_rearmed_spu_interpolation: gaussian pcsx_rearmed_rgb32_output: enabled # MAME core requires additional manual setup, please read: # https://docs.libretro.com/library/fbneo/ mame: lib: fbneo_libretro folder: mame roms: ["zip"] scaleMethod: bilinear2 nes: lib: nestopia_libretro roms: ["nes"] options: nestopia_aspect: "4:3" nestopia_overscan_v_top: 0 nestopia_overscan_v_bottom: 0 snes: lib: snes9x_libretro roms: ["smc", "sfc", "swc", "fig", "bs"] hid: # set the 2nd port to RETRO_DEVICE_JOYPAD_MULTITAP ((1<<8) | 1) as SNES9x requires it # in order to support up to 5-player games # see: https://nintendo.fandom.com/wiki/Super_Multitap 1: 257 n64: lib: mupen64plus_next_libretro roms: ["n64", "v64", "z64"] isGlAllowed: true usesLibCo: true vfr: true # see: https://github.com/libretro/mupen64plus-libretro-nx/blob/master/libretro/libretro_core_options.h options: "mupen64plus-169screensize": 640x360 "mupen64plus-43screensize": 320x240 "mupen64plus-EnableCopyColorToRDRAM": Off "mupen64plus-EnableCopyDepthToRDRAM": Off "mupen64plus-EnableEnhancedTextureStorage": True "mupen64plus-EnableFBEmulation": True "mupen64plus-EnableLegacyBlending": True "mupen64plus-FrameDuping": True "mupen64plus-MaxTxCacheSize": 8000 "mupen64plus-ThreadedRenderer": False "mupen64plus-cpucore": dynamic_recompiler "mupen64plus-pak1": memory "mupen64plus-rdp-plugin": gliden64 "mupen64plus-rsp-plugin": hle "mupen64plus-astick-sensitivity": 100 dos: lib: dosbox_pure_libretro roms: ["zip", "cue"] folder: dos kbMouseSupport: true nonBlockingSave: true saveStateFs: "*.pure.zip" hid: 0: [257, 513] 1: [257, 513] 2: [257, 513] 3: [257, 513] options: "dosbox_pure_conf": "outside" # "dosbox_pure_force60fps": "true" encoder: audio: codec: opus # resampler qualiy: 0 - low, 1 - medium, 2 - best resampler: 2 video: # vp8 | vp9 codec: vp8 # Threaded encoder if supported, 0 - auto, 1 - nope, >1 - multi-threaded threads: 0 # max interval between keyframes (0 = encoder default) keyframeInterval: 300 # colorimetry caps: bt601 | bt709 | smpte240m colorimetry: bt709,chroma-site=jpeg list: opus: encoder: opusenc params: audio-type=restricted-lowdelay complexity=8 bitrate=96000 frame-size=5 # h264 (requires gstreamer1.0-plugins-ugly + x264 [GPL]): # encoder: x264enc # params: speed-preset=superfast tune=zerolatency pass=quant quantizer=20 # caps: video/x-h264,stream-format=byte-stream,alignment=au vp8: encoder: vp8enc params: >- keyframe-mode=disabled tuning=ssim cpu-used=6 target-bitrate=3200000 deadline=1 sharpness=1 end-usage=cbr static-threshold=100 error-resilient=default+partitions overshoot=20 undershoot=100 caps: video/x-vp8 vp9: encoder: vp9enc params: >- keyframe-mode=disabled tuning=ssim cpu-used=6 target-bitrate=3200000 deadline=1 sharpness=1 end-usage=cbr static-threshold=100 error-resilient=default+partitions overshoot=20 undershoot=100 tile-columns=6 lag-in-frames=0 row-mt=true caps: video/x-vp9 # game recording # (experimental) # recording allows export RAW a/v streams of games # by default, it will export audio as WAV files, # video as a list of PNG-encoded images, and # one additional FFMPEG concat demux file recording: enabled: false # name contains the name of the recording dir (or zip) # format: # %date:go_time_format% -- refer: https://go.dev/src/time/format.go # %user% -- user name who started the recording # %game% -- game name (game ROM name) # %rand:len% -- a random string of given length # as example: 20210101101010_yeE_user1_badApple name: "%date:20060102150405%_%rand:3%_%user%_%game%" # zip and remove recording dir on completion zip: true # save directory folder: ./recording # cloud storage options # it is mandatory to use a cloud storage when running # a distributed multi-server configuration in order to # share save states between nodes (resume games on a different worker) storage: # cloud storage provider: # - empty (No op storage stub) # - s3 (S3 API compatible object storage) provider: s3Endpoint: s3BucketName: s3AccessKeyId: s3SecretAccessKey: webrtc: # turn off default Pion interceptors (see: https://github.com/pion/interceptor) # (performance) disableDefaultInterceptors: false # indicates the role of the DTLS transport (see: https://github.com/pion/webrtc/blob/master/dtlsrole.go) # (debug) # - (default) # - 1 (auto) # - 2 (client) # - 3 (server) dtlsRole: # a list of STUN/TURN servers to use iceServers: - urls: stun:stun.l.google.com:19302 # configures whether the ice agent should be a lite agent (true/false) # (performance) # don't use iceServers when enabled iceLite: false # ICE configuration # by default, ICE ports are random and unlimited # alternatives: # 1. instead of random unlimited port range for # WebRTC connections, these params limit port range of ICE connections icePorts: min: max: includeLoopbackCandidate: false # 2. select a single port to forward all ICE connections there singlePort: # override ICE candidate IP, see: https://github.com/pion/webrtc/issues/835, # can be used for Docker bridged network internal IP override iceIpMap: # set additional log level for WebRTC separately # -1 - trace, 6 - nothing, ..., debug - 0 logLevel: 6