diff --git a/404.html b/404.html index 7485b2211..34200e43e 100644 --- a/404.html +++ b/404.html @@ -5,8 +5,8 @@ Page Not Found | GameVault - - + +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

diff --git a/assets/js/007d2baa.b4fac766.js b/assets/js/007d2baa.a5b94a6b.js similarity index 99% rename from assets/js/007d2baa.b4fac766.js rename to assets/js/007d2baa.a5b94a6b.js index a03ab89da..5a0827b7d 100644 --- a/assets/js/007d2baa.b4fac766.js +++ b/assets/js/007d2baa.a5b94a6b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[5112],{250:(e,d,i)=>{i.r(d),i.d(d,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>n,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"server-docs/media","title":"Media","description":"This page outlines how media like images and videos are handled within the backend application.","source":"@site/docs/server-docs/media.md","sourceDirName":"server-docs","slug":"/server-docs/media","permalink":"/docs/server-docs/media","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/media.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"sidebarPosition":8,"frontMatter":{"sidebar_position":8},"sidebar":"docs","previous":{"title":"Database Backup & Restoration","permalink":"/docs/server-docs/backup-and-restore"},"next":{"title":"WebSockets","permalink":"/docs/server-docs/websockets"}}');var t=i(6070),r=i(8591);const n={sidebar_position:8},a="Media",c={},l=[{value:"Supported Formats",id:"supported-formats",level:2},{value:"Supported Image Formats",id:"supported-image-formats",level:3},{value:"Supported Audio Formats",id:"supported-audio-formats",level:3},{value:"Supported Video Formats",id:"supported-video-formats",level:3},{value:"Media Persistence",id:"media-persistence",level:2},{value:"Media that is stored on the filesystem",id:"media-that-is-stored-on-the-filesystem",level:3},{value:"Media that is stored as an external resource",id:"media-that-is-stored-as-an-external-resource",level:3},{value:"Duplicate Media",id:"duplicate-media",level:3},{value:"Media Garbage Collection",id:"media-garbage-collection",level:2},{value:"Turning off Garbage Collection",id:"turning-off-garbage-collection",level:3}];function o(e){const d={admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(d.header,{children:(0,t.jsx)(d.h1,{id:"media",children:"Media"})}),"\n",(0,t.jsx)(d.p,{children:"This page outlines how media like images and videos are handled within the backend application."}),"\n",(0,t.jsx)(d.p,{children:"Here is the updated markdown table including the format names as a second column:"}),"\n",(0,t.jsx)(d.h2,{id:"supported-formats",children:"Supported Formats"}),"\n",(0,t.jsx)(d.h3,{id:"supported-image-formats",children:"Supported Image Formats"}),"\n",(0,t.jsxs)(d.table,{children:[(0,t.jsx)(d.thead,{children:(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.th,{children:"Format"}),(0,t.jsx)(d.th,{children:"Name"}),(0,t.jsx)(d.th,{children:"MIME Type"})]})}),(0,t.jsxs)(d.tbody,{children:[(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".bmp"})}),(0,t.jsx)(d.td,{children:"Bitmap Image"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"image/bmp"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".jpeg"})}),(0,t.jsx)(d.td,{children:"JPEG Image"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"image/jpeg"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".png"})}),(0,t.jsx)(d.td,{children:"Portable Network Graphics"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"image/png"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".tiff"})}),(0,t.jsx)(d.td,{children:"Tagged Image File Format"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"image/tiff"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".gif"})}),(0,t.jsx)(d.td,{children:"Graphics Interchange Format"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"image/gif"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".ico"})}),(0,t.jsx)(d.td,{children:"Icon Format"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"image/vnd.microsoft.icon"})})]})]})]}),"\n",(0,t.jsx)(d.h3,{id:"supported-audio-formats",children:"Supported Audio Formats"}),"\n",(0,t.jsxs)(d.table,{children:[(0,t.jsx)(d.thead,{children:(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.th,{children:"Format"}),(0,t.jsx)(d.th,{children:"Name"}),(0,t.jsx)(d.th,{children:"MIME Type"})]})}),(0,t.jsxs)(d.tbody,{children:[(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".mp3"})}),(0,t.jsx)(d.td,{children:"MPEG Audio"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"audio/mpeg"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".wav"})}),(0,t.jsx)(d.td,{children:"Waveform Audio"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"audio/wav"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".ogg"})}),(0,t.jsx)(d.td,{children:"Ogg Vorbis"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"audio/ogg"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".aac"})}),(0,t.jsx)(d.td,{children:"Advanced Audio Codec"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"audio/aac"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".flac"})}),(0,t.jsx)(d.td,{children:"Free Lossless Audio Codec"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"audio/flac"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".wma"})}),(0,t.jsx)(d.td,{children:"Windows Media Audio"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"audio/x-ms-wma"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".amr"})}),(0,t.jsx)(d.td,{children:"Adaptive Multi-Rate"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"audio/amr"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".mp4"})}),(0,t.jsx)(d.td,{children:"MPEG-4 Audio"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"audio/mp4"})})]})]})]}),"\n",(0,t.jsx)(d.h3,{id:"supported-video-formats",children:"Supported Video Formats"}),"\n",(0,t.jsxs)(d.table,{children:[(0,t.jsx)(d.thead,{children:(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.th,{children:"Format"}),(0,t.jsx)(d.th,{children:"Name"}),(0,t.jsx)(d.th,{children:"MIME Type"})]})}),(0,t.jsxs)(d.tbody,{children:[(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".mp4"})}),(0,t.jsx)(d.td,{children:"MPEG-4 Video"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"video/mp4"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".avi"})}),(0,t.jsx)(d.td,{children:"Audio Video Interleave"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"video/x-msvideo"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".mov"})}),(0,t.jsx)(d.td,{children:"QuickTime"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"video/quicktime"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".wmv"})}),(0,t.jsx)(d.td,{children:"Windows Media Video"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"video/x-ms-wmv"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".flv"})}),(0,t.jsx)(d.td,{children:"Flash Video"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"video/x-flv"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".mkv"})}),(0,t.jsx)(d.td,{children:"Matroska Video"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"video/x-matroska"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".webm"})}),(0,t.jsx)(d.td,{children:"WebM Video"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"video/webm"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".mpeg"})}),(0,t.jsx)(d.td,{children:"MPEG Video"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"video/mpeg"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".3gp"})}),(0,t.jsx)(d.td,{children:"3GPP Multimedia File"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"video/3gpp"})})]})]})]}),"\n",(0,t.jsx)(d.h2,{id:"media-persistence",children:"Media Persistence"}),"\n",(0,t.jsxs)(d.p,{children:["GameVault stores media either by persisting them to the filesystem using the media directory (by default ",(0,t.jsx)(d.code,{children:"/media"}),") or by saving a link to an external URL."]}),"\n",(0,t.jsx)(d.h3,{id:"media-that-is-stored-on-the-filesystem",children:"Media that is stored on the filesystem"}),"\n",(0,t.jsxs)(d.ul,{children:["\n",(0,t.jsxs)(d.li,{children:[(0,t.jsx)(d.code,{children:"game_metadata.cover"}),": Game Box Arts"]}),"\n",(0,t.jsxs)(d.li,{children:[(0,t.jsx)(d.code,{children:"game_metadata.background"}),": Game Background Images"]}),"\n",(0,t.jsxs)(d.li,{children:[(0,t.jsx)(d.code,{children:"gamevault_user.avatar"}),": User Avatars"]}),"\n",(0,t.jsxs)(d.li,{children:[(0,t.jsx)(d.code,{children:"gamevault_user.background"}),": User Background Images"]}),"\n"]}),"\n",(0,t.jsx)(d.h3,{id:"media-that-is-stored-as-an-external-resource",children:"Media that is stored as an external resource"}),"\n",(0,t.jsxs)(d.ul,{children:["\n",(0,t.jsxs)(d.li,{children:[(0,t.jsx)(d.code,{children:"game_metadata.url_screenshots"}),": Game Screenshots"]}),"\n",(0,t.jsxs)(d.li,{children:[(0,t.jsx)(d.code,{children:"game_metadata.url_trailers"}),": Game Trailers"]}),"\n",(0,t.jsxs)(d.li,{children:[(0,t.jsx)(d.code,{children:"game_metadata.url_gameplays"}),": Gameplay Videos"]}),"\n"]}),"\n",(0,t.jsx)(d.admonition,{type:"note",children:(0,t.jsxs)(d.p,{children:["Note the ",(0,t.jsx)(d.code,{children:"url_"})," prefix."]})}),"\n",(0,t.jsx)(d.h3,{id:"duplicate-media",children:"Duplicate Media"}),"\n",(0,t.jsx)(d.p,{children:"GameVault stores each media resource referenced in the database as one-to-one, with no media reuse. So it's normal to see duplicates."}),"\n",(0,t.jsx)(d.h2,{id:"media-garbage-collection",children:"Media Garbage Collection"}),"\n",(0,t.jsx)(d.admonition,{title:"Potential data loss",type:"danger",children:(0,t.jsxs)(d.p,{children:["Garbage collection ",(0,t.jsx)(d.strong,{children:"can result in data loss"}),", as it will ",(0,t.jsx)(d.strong,{children:"delete any files inside the media folder"})," without an association in the database. For example if you set up a new, empty database. It is advisable to regularly back up your media just to be safe. If you don't want to lose any data, you can disable garbage collection by setting the ",(0,t.jsx)(d.code,{children:"MEDIA_GC_DISABLED"})," environment variable to ",(0,t.jsx)(d.code,{children:"true"}),"."]})}),"\n",(0,t.jsx)(d.p,{children:"GameVault regularly cleans up its media in the database and filesystem to keep things tidy. We call this process garbage collection."}),"\n",(0,t.jsxs)(d.p,{children:["You can control how often the garbage colletion happens by changing the value of ",(0,t.jsx)(d.code,{children:"MEDIA_GC_INTERVAL_IN_MINUTES"}),"."]}),"\n",(0,t.jsx)(d.p,{children:"During cleanup, GameVault first gets rid of all media in the database that aren't used. Afterwards, it deletes all media files in the media folder that don't match any database entries. So please don't put any files in the media folder that you don't want to be deleted."}),"\n",(0,t.jsx)(d.h3,{id:"turning-off-garbage-collection",children:"Turning off Garbage Collection"}),"\n",(0,t.jsxs)(d.p,{children:["If you want to turn off this feature, you can disableit by setting the ",(0,t.jsx)(d.code,{children:"MEDIA_GC_DISABLED"})," environment variable to ",(0,t.jsx)(d.code,{children:"true"}),"."]})]})}function h(e={}){const{wrapper:d}={...(0,r.R)(),...e.components};return d?(0,t.jsx)(d,{...e,children:(0,t.jsx)(o,{...e})}):o(e)}},8591:(e,d,i)=>{i.d(d,{R:()=>n,x:()=>a});var s=i(758);const t={},r=s.createContext(t);function n(e){const d=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(d):{...d,...e}}),[d,e])}function a(e){let d;return d=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:n(e.components),s.createElement(r.Provider,{value:d},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[5112],{250:(e,d,i)=>{i.r(d),i.d(d,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>n,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"server-docs/media","title":"Media","description":"This page outlines how media like images and videos are handled within the backend application.","source":"@site/docs/server-docs/media.md","sourceDirName":"server-docs","slug":"/server-docs/media","permalink":"/docs/server-docs/media","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/media.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"sidebarPosition":8,"frontMatter":{"sidebar_position":8},"sidebar":"docs","previous":{"title":"Database Backup & Restoration","permalink":"/docs/server-docs/backup-and-restore"},"next":{"title":"WebSockets","permalink":"/docs/server-docs/websockets"}}');var t=i(6070),r=i(8591);const n={sidebar_position:8},a="Media",c={},l=[{value:"Supported Formats",id:"supported-formats",level:2},{value:"Supported Image Formats",id:"supported-image-formats",level:3},{value:"Supported Audio Formats",id:"supported-audio-formats",level:3},{value:"Supported Video Formats",id:"supported-video-formats",level:3},{value:"Media Persistence",id:"media-persistence",level:2},{value:"Media that is stored on the filesystem",id:"media-that-is-stored-on-the-filesystem",level:3},{value:"Media that is stored as an external resource",id:"media-that-is-stored-as-an-external-resource",level:3},{value:"Duplicate Media",id:"duplicate-media",level:3},{value:"Media Garbage Collection",id:"media-garbage-collection",level:2},{value:"Turning off Garbage Collection",id:"turning-off-garbage-collection",level:3}];function o(e){const d={admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(d.header,{children:(0,t.jsx)(d.h1,{id:"media",children:"Media"})}),"\n",(0,t.jsx)(d.p,{children:"This page outlines how media like images and videos are handled within the backend application."}),"\n",(0,t.jsx)(d.p,{children:"Here is the updated markdown table including the format names as a second column:"}),"\n",(0,t.jsx)(d.h2,{id:"supported-formats",children:"Supported Formats"}),"\n",(0,t.jsx)(d.h3,{id:"supported-image-formats",children:"Supported Image Formats"}),"\n",(0,t.jsxs)(d.table,{children:[(0,t.jsx)(d.thead,{children:(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.th,{children:"Format"}),(0,t.jsx)(d.th,{children:"Name"}),(0,t.jsx)(d.th,{children:"MIME Type"})]})}),(0,t.jsxs)(d.tbody,{children:[(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".bmp"})}),(0,t.jsx)(d.td,{children:"Bitmap Image"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"image/bmp"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".jpeg"})}),(0,t.jsx)(d.td,{children:"JPEG Image"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"image/jpeg"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".png"})}),(0,t.jsx)(d.td,{children:"Portable Network Graphics"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"image/png"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".tiff"})}),(0,t.jsx)(d.td,{children:"Tagged Image File Format"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"image/tiff"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".gif"})}),(0,t.jsx)(d.td,{children:"Graphics Interchange Format"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"image/gif"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".ico"})}),(0,t.jsx)(d.td,{children:"Icon Format"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"image/vnd.microsoft.icon"})})]})]})]}),"\n",(0,t.jsx)(d.h3,{id:"supported-audio-formats",children:"Supported Audio Formats"}),"\n",(0,t.jsxs)(d.table,{children:[(0,t.jsx)(d.thead,{children:(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.th,{children:"Format"}),(0,t.jsx)(d.th,{children:"Name"}),(0,t.jsx)(d.th,{children:"MIME Type"})]})}),(0,t.jsxs)(d.tbody,{children:[(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".mp3"})}),(0,t.jsx)(d.td,{children:"MPEG Audio"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"audio/mpeg"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".wav"})}),(0,t.jsx)(d.td,{children:"Waveform Audio"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"audio/wav"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".ogg"})}),(0,t.jsx)(d.td,{children:"Ogg Vorbis"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"audio/ogg"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".aac"})}),(0,t.jsx)(d.td,{children:"Advanced Audio Codec"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"audio/aac"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".flac"})}),(0,t.jsx)(d.td,{children:"Free Lossless Audio Codec"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"audio/flac"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".wma"})}),(0,t.jsx)(d.td,{children:"Windows Media Audio"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"audio/x-ms-wma"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".amr"})}),(0,t.jsx)(d.td,{children:"Adaptive Multi-Rate"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"audio/amr"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".mp4"})}),(0,t.jsx)(d.td,{children:"MPEG-4 Audio"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"audio/mp4"})})]})]})]}),"\n",(0,t.jsx)(d.h3,{id:"supported-video-formats",children:"Supported Video Formats"}),"\n",(0,t.jsxs)(d.table,{children:[(0,t.jsx)(d.thead,{children:(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.th,{children:"Format"}),(0,t.jsx)(d.th,{children:"Name"}),(0,t.jsx)(d.th,{children:"MIME Type"})]})}),(0,t.jsxs)(d.tbody,{children:[(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".mp4"})}),(0,t.jsx)(d.td,{children:"MPEG-4 Video"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"video/mp4"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".avi"})}),(0,t.jsx)(d.td,{children:"Audio Video Interleave"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"video/x-msvideo"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".mov"})}),(0,t.jsx)(d.td,{children:"QuickTime"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"video/quicktime"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".wmv"})}),(0,t.jsx)(d.td,{children:"Windows Media Video"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"video/x-ms-wmv"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".flv"})}),(0,t.jsx)(d.td,{children:"Flash Video"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"video/x-flv"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".mkv"})}),(0,t.jsx)(d.td,{children:"Matroska Video"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"video/x-matroska"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".webm"})}),(0,t.jsx)(d.td,{children:"WebM Video"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"video/webm"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".mpeg"})}),(0,t.jsx)(d.td,{children:"MPEG Video"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"video/mpeg"})})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:".3gp"})}),(0,t.jsx)(d.td,{children:"3GPP Multimedia File"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"video/3gpp"})})]})]})]}),"\n",(0,t.jsx)(d.h2,{id:"media-persistence",children:"Media Persistence"}),"\n",(0,t.jsxs)(d.p,{children:["GameVault stores media either by persisting them to the filesystem using the media directory (by default ",(0,t.jsx)(d.code,{children:"/media"}),") or by saving a link to an external URL."]}),"\n",(0,t.jsx)(d.h3,{id:"media-that-is-stored-on-the-filesystem",children:"Media that is stored on the filesystem"}),"\n",(0,t.jsxs)(d.ul,{children:["\n",(0,t.jsxs)(d.li,{children:[(0,t.jsx)(d.code,{children:"game_metadata.cover"}),": Game Box Arts"]}),"\n",(0,t.jsxs)(d.li,{children:[(0,t.jsx)(d.code,{children:"game_metadata.background"}),": Game Background Images"]}),"\n",(0,t.jsxs)(d.li,{children:[(0,t.jsx)(d.code,{children:"gamevault_user.avatar"}),": User Avatars"]}),"\n",(0,t.jsxs)(d.li,{children:[(0,t.jsx)(d.code,{children:"gamevault_user.background"}),": User Background Images"]}),"\n"]}),"\n",(0,t.jsx)(d.h3,{id:"media-that-is-stored-as-an-external-resource",children:"Media that is stored as an external resource"}),"\n",(0,t.jsxs)(d.ul,{children:["\n",(0,t.jsxs)(d.li,{children:[(0,t.jsx)(d.code,{children:"game_metadata.url_screenshots"}),": Game Screenshots"]}),"\n",(0,t.jsxs)(d.li,{children:[(0,t.jsx)(d.code,{children:"game_metadata.url_trailers"}),": Game Trailers"]}),"\n",(0,t.jsxs)(d.li,{children:[(0,t.jsx)(d.code,{children:"game_metadata.url_gameplays"}),": Gameplay Videos"]}),"\n"]}),"\n",(0,t.jsx)(d.admonition,{type:"note",children:(0,t.jsxs)(d.p,{children:["Note the ",(0,t.jsx)(d.code,{children:"url_"})," prefix."]})}),"\n",(0,t.jsx)(d.h3,{id:"duplicate-media",children:"Duplicate Media"}),"\n",(0,t.jsx)(d.p,{children:"GameVault stores each media resource referenced in the database as one-to-one, with no media reuse. So it's normal to see duplicates."}),"\n",(0,t.jsx)(d.h2,{id:"media-garbage-collection",children:"Media Garbage Collection"}),"\n",(0,t.jsx)(d.admonition,{title:"Potential data loss",type:"danger",children:(0,t.jsxs)(d.p,{children:["Garbage collection ",(0,t.jsx)(d.strong,{children:"can result in data loss"}),", as it will ",(0,t.jsx)(d.strong,{children:"delete any files inside the media folder"})," without an association in the database. For example if you set up a new, empty database. It is advisable to regularly back up your media just to be safe. If you don't want to lose any data, you can disable garbage collection by setting the ",(0,t.jsx)(d.code,{children:"MEDIA_GC_DISABLED"})," environment variable to ",(0,t.jsx)(d.code,{children:"true"}),"."]})}),"\n",(0,t.jsx)(d.p,{children:"GameVault regularly cleans up its media in the database and filesystem to keep things tidy. We call this process garbage collection."}),"\n",(0,t.jsxs)(d.p,{children:["You can control how often the garbage colletion happens by changing the value of ",(0,t.jsx)(d.code,{children:"MEDIA_GC_INTERVAL_IN_MINUTES"}),"."]}),"\n",(0,t.jsx)(d.p,{children:"During cleanup, GameVault first gets rid of all media in the database that aren't used. Afterwards, it deletes all media files in the media folder that don't match any database entries. So please don't put any files in the media folder that you don't want to be deleted."}),"\n",(0,t.jsx)(d.h3,{id:"turning-off-garbage-collection",children:"Turning off Garbage Collection"}),"\n",(0,t.jsxs)(d.p,{children:["If you want to turn off this feature, you can disableit by setting the ",(0,t.jsx)(d.code,{children:"MEDIA_GC_DISABLED"})," environment variable to ",(0,t.jsx)(d.code,{children:"true"}),"."]})]})}function h(e={}){const{wrapper:d}={...(0,r.R)(),...e.components};return d?(0,t.jsx)(d,{...e,children:(0,t.jsx)(o,{...e})}):o(e)}},8591:(e,d,i)=>{i.d(d,{R:()=>n,x:()=>a});var s=i(758);const t={},r=s.createContext(t);function n(e){const d=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(d):{...d,...e}}),[d,e])}function a(e){let d;return d=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:n(e.components),s.createElement(r.Provider,{value:d},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/04c04fa2.6223bd34.js b/assets/js/04c04fa2.02eb0237.js similarity index 98% rename from assets/js/04c04fa2.6223bd34.js rename to assets/js/04c04fa2.02eb0237.js index 287536250..5bf68d971 100644 --- a/assets/js/04c04fa2.6223bd34.js +++ b/assets/js/04c04fa2.02eb0237.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[3325],{4082:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>a,default:()=>h,frontMatter:()=>l,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"gamevault-plus/integrations/playnite","title":"Playnite","description":"GameVault+ integrates seamlessly with Playnite using our Playnite Library Extension. Enjoy the convenience of browsing, launching, and installing your games directly from Playnite, just as you\'re used to!","source":"@site/docs/gamevault-plus/integrations/playnite.md","sourceDirName":"gamevault-plus/integrations","slug":"/gamevault-plus/integrations/playnite","permalink":"/docs/gamevault-plus/integrations/playnite","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/gamevault-plus/integrations/playnite.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"frontMatter":{"title":"Playnite"},"sidebar":"docs","previous":{"title":"Discord","permalink":"/docs/gamevault-plus/integrations/discord"},"next":{"title":"Steam","permalink":"/docs/gamevault-plus/integrations/steam"}}');var i=t(6070),r=t(8591);const l={title:"Playnite"},a=void 0,o={},d=[{value:"Setup Guide",id:"setup-guide",level:2},{value:"Prerequisites",id:"prerequisites",level:3},{value:"Step 1: Download the Extension",id:"step-1-download-the-extension",level:3},{value:"Step 2: Configure the Extension",id:"step-2-configure-the-extension",level:3}];function c(e){const n={a:"a",admonition:"admonition",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"GameVault+"})," integrates seamlessly with ",(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.a,{href:"https://playnite.link",children:"Playnite"})})," using our ",(0,i.jsx)(n.a,{href:"https://playnite.link/addons.html#GameVault_fab8be77-18ab-4e6c-ad3d-89097b492d74",children:(0,i.jsx)(n.strong,{children:"Playnite Library Extension"})}),". Enjoy the convenience of browsing, launching, and installing your games directly from Playnite, just as you're used to!"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"GameVault+ Playnite Integration Showcase",src:t(3902).A+"",width:"2576",height:"1408"})}),"\n",(0,i.jsx)(n.h2,{id:"setup-guide",children:"Setup Guide"}),"\n",(0,i.jsx)(n.h3,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,i.jsxs)(n.p,{children:["Before starting, make sure you're ",(0,i.jsxs)(n.a,{href:"/docs/gamevault-plus/client-setup",children:["logged in to ",(0,i.jsx)(n.strong,{children:"GameVault+"})]})," within your GameVault application."]}),"\n",(0,i.jsx)(n.h3,{id:"step-1-download-the-extension",children:(0,i.jsx)(n.strong,{children:"Step 1: Download the Extension"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Open the ",(0,i.jsx)(n.strong,{children:"Add-ons..."})," menu in Playnite using the F9 key or the context menu on the top left corner."]}),"\n",(0,i.jsxs)(n.li,{children:["Select ",(0,i.jsx)(n.strong,{children:"Browse"})," -> ",(0,i.jsx)(n.strong,{children:"Libraries"})]}),"\n",(0,i.jsxs)(n.li,{children:["Search for GameVault and download the ",(0,i.jsx)(n.strong,{children:"GameVault Library Extension"}),"."]}),"\n",(0,i.jsx)(n.li,{children:"Restart Playnite if necessary."}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Extension Browser Screenshot",src:t(6009).A+"",width:"2560",height:"1408"})}),"\n",(0,i.jsx)(n.admonition,{title:"Alternative Download Methods",type:"note",children:(0,i.jsxs)(n.p,{children:["You can also download the extension from our ",(0,i.jsx)(n.a,{href:"https://github.com/Phalcode/gamevault-playnite-integration/releases",children:"GitHub Releases"})," or the ",(0,i.jsx)(n.a,{href:"https://playnite.link/addons.html#GameVault_fab8be77-18ab-4e6c-ad3d-89097b492d74",children:"Playnite website"})," directly."]})}),"\n",(0,i.jsx)(n.h3,{id:"step-2-configure-the-extension",children:(0,i.jsx)(n.strong,{children:"Step 2: Configure the Extension"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Open the ",(0,i.jsx)(n.strong,{children:"Add-ons..."})," menu in Playnite using the F9 key or the context menu on the top left corner."]}),"\n",(0,i.jsxs)(n.li,{children:["Select ",(0,i.jsx)(n.strong,{children:"Extension Settings"})," -> ",(0,i.jsx)(n.strong,{children:"Libraries"})," -> ",(0,i.jsx)(n.strong,{children:"GameVault"})]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Enter the following information:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.strong,{children:"GameVault Server URL"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.strong,{children:"GameVault Server Username"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.strong,{children:"GameVault Server Password"})}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Extension Configuration Screenshot",src:t(6978).A+"",width:"2560",height:"1408"})})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},6009:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/download-aedf553c73ad2710bcc7f136f10f3655.png"},6978:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/setup-8954776b59fad0b756b5bcdddad93bf1.png"},3902:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/showcase-604ef944310ec92c039f058dd7ff1ea9.png"},8591:(e,n,t)=>{t.d(n,{R:()=>l,x:()=>a});var s=t(758);const i={},r=s.createContext(i);function l(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[3325],{4082:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>a,default:()=>h,frontMatter:()=>l,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"gamevault-plus/integrations/playnite","title":"Playnite","description":"GameVault+ integrates seamlessly with Playnite using our Playnite Library Extension. Enjoy the convenience of browsing, launching, and installing your games directly from Playnite, just as you\'re used to!","source":"@site/docs/gamevault-plus/integrations/playnite.md","sourceDirName":"gamevault-plus/integrations","slug":"/gamevault-plus/integrations/playnite","permalink":"/docs/gamevault-plus/integrations/playnite","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/gamevault-plus/integrations/playnite.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"frontMatter":{"title":"Playnite"},"sidebar":"docs","previous":{"title":"Discord","permalink":"/docs/gamevault-plus/integrations/discord"},"next":{"title":"Steam","permalink":"/docs/gamevault-plus/integrations/steam"}}');var i=t(6070),r=t(8591);const l={title:"Playnite"},a=void 0,o={},d=[{value:"Setup Guide",id:"setup-guide",level:2},{value:"Prerequisites",id:"prerequisites",level:3},{value:"Step 1: Download the Extension",id:"step-1-download-the-extension",level:3},{value:"Step 2: Configure the Extension",id:"step-2-configure-the-extension",level:3}];function c(e){const n={a:"a",admonition:"admonition",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"GameVault+"})," integrates seamlessly with ",(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.a,{href:"https://playnite.link",children:"Playnite"})})," using our ",(0,i.jsx)(n.a,{href:"https://playnite.link/addons.html#GameVault_fab8be77-18ab-4e6c-ad3d-89097b492d74",children:(0,i.jsx)(n.strong,{children:"Playnite Library Extension"})}),". Enjoy the convenience of browsing, launching, and installing your games directly from Playnite, just as you're used to!"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"GameVault+ Playnite Integration Showcase",src:t(3902).A+"",width:"2576",height:"1408"})}),"\n",(0,i.jsx)(n.h2,{id:"setup-guide",children:"Setup Guide"}),"\n",(0,i.jsx)(n.h3,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,i.jsxs)(n.p,{children:["Before starting, make sure you're ",(0,i.jsxs)(n.a,{href:"/docs/gamevault-plus/client-setup",children:["logged in to ",(0,i.jsx)(n.strong,{children:"GameVault+"})]})," within your GameVault application."]}),"\n",(0,i.jsx)(n.h3,{id:"step-1-download-the-extension",children:(0,i.jsx)(n.strong,{children:"Step 1: Download the Extension"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Open the ",(0,i.jsx)(n.strong,{children:"Add-ons..."})," menu in Playnite using the F9 key or the context menu on the top left corner."]}),"\n",(0,i.jsxs)(n.li,{children:["Select ",(0,i.jsx)(n.strong,{children:"Browse"})," -> ",(0,i.jsx)(n.strong,{children:"Libraries"})]}),"\n",(0,i.jsxs)(n.li,{children:["Search for GameVault and download the ",(0,i.jsx)(n.strong,{children:"GameVault Library Extension"}),"."]}),"\n",(0,i.jsx)(n.li,{children:"Restart Playnite if necessary."}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Extension Browser Screenshot",src:t(6009).A+"",width:"2560",height:"1408"})}),"\n",(0,i.jsx)(n.admonition,{title:"Alternative Download Methods",type:"note",children:(0,i.jsxs)(n.p,{children:["You can also download the extension from our ",(0,i.jsx)(n.a,{href:"https://github.com/Phalcode/gamevault-playnite-integration/releases",children:"GitHub Releases"})," or the ",(0,i.jsx)(n.a,{href:"https://playnite.link/addons.html#GameVault_fab8be77-18ab-4e6c-ad3d-89097b492d74",children:"Playnite website"})," directly."]})}),"\n",(0,i.jsx)(n.h3,{id:"step-2-configure-the-extension",children:(0,i.jsx)(n.strong,{children:"Step 2: Configure the Extension"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Open the ",(0,i.jsx)(n.strong,{children:"Add-ons..."})," menu in Playnite using the F9 key or the context menu on the top left corner."]}),"\n",(0,i.jsxs)(n.li,{children:["Select ",(0,i.jsx)(n.strong,{children:"Extension Settings"})," -> ",(0,i.jsx)(n.strong,{children:"Libraries"})," -> ",(0,i.jsx)(n.strong,{children:"GameVault"})]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Enter the following information:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.strong,{children:"GameVault Server URL"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.strong,{children:"GameVault Server Username"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.strong,{children:"GameVault Server Password"})}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Extension Configuration Screenshot",src:t(6978).A+"",width:"2560",height:"1408"})})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},6009:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/download-aedf553c73ad2710bcc7f136f10f3655.png"},6978:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/setup-8954776b59fad0b756b5bcdddad93bf1.png"},3902:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/showcase-604ef944310ec92c039f058dd7ff1ea9.png"},8591:(e,n,t)=>{t.d(n,{R:()=>l,x:()=>a});var s=t(758);const i={},r=s.createContext(i);function l(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0748c3bc.9f6ede00.js b/assets/js/0748c3bc.e2c11215.js similarity index 99% rename from assets/js/0748c3bc.9f6ede00.js rename to assets/js/0748c3bc.e2c11215.js index b33f00fb7..f5ae21a20 100644 --- a/assets/js/0748c3bc.9f6ede00.js +++ b/assets/js/0748c3bc.e2c11215.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[5723],{4892:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>c,frontMatter:()=>d,metadata:()=>i,toc:()=>o});const i=JSON.parse('{"id":"server-docs/metadata-enrichment/metadata","title":"Enriching your Games with Metadata","description":"Research shows that nobody wants to see blank placeholder images and missing descriptions in their library. We want those games enriched with some juicy metadata.","source":"@site/docs/server-docs/metadata-enrichment/metadata.md","sourceDirName":"server-docs/metadata-enrichment","slug":"/server-docs/metadata-enrichment/metadata","permalink":"/docs/server-docs/metadata-enrichment/metadata","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/metadata-enrichment/metadata.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"sidebarPosition":0.01,"frontMatter":{"title":"Enriching your Games with Metadata","sidebar_position":0.01},"sidebar":"docs","previous":{"title":"Game Indexing","permalink":"/docs/server-docs/indexing"},"next":{"title":"Provider: IGDB","permalink":"/docs/server-docs/metadata-enrichment/provider-igdb"}}');var r=a(6070),n=a(8591);const d={title:"Enriching your Games with Metadata",sidebar_position:.01},s=void 0,l={},o=[{value:"Setting Up a Metadata Provider",id:"setting-up-a-metadata-provider",level:2},{value:"Built-In Metadata Providers",id:"built-in-metadata-providers",level:3},{value:"Community-Maintained Metadata Providers",id:"community-maintained-metadata-providers",level:3},{value:"How Metadata Enrichment in GameVault Works",id:"how-metadata-enrichment-in-gamevault-works",level:2},{value:"Editing Metadata",id:"editing-metadata",level:2},{value:"Remapping a Game",id:"remapping-a-game",level:2},{value:"Unmapping a Game",id:"unmapping-a-game",level:2},{value:"How GameVault Merges Metadata",id:"how-gamevault-merges-metadata",level:2},{value:"Developing a New Metadata Provider Plugin",id:"developing-a-new-metadata-provider-plugin",level:2}];function h(e){const t={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(t.p,{children:["Research shows that nobody wants to see blank placeholder images and missing descriptions in their library. We want those games enriched with some ",(0,r.jsx)(t.strong,{children:"juicy metadata"}),"."]}),"\n",(0,r.jsxs)(t.p,{children:["GameVault supports a ",(0,r.jsx)(t.strong,{children:"vast plugin framework"})," that supports connecting to various metadata providers simultaneously. In the following sections, you'll learn how to set up a metadata provider and get started."]}),"\n",(0,r.jsx)(t.h2,{id:"setting-up-a-metadata-provider",children:"Setting Up a Metadata Provider"}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Click on any of the entries below to get to their dedicated page."})}),"\n",(0,r.jsx)(t.h3,{id:"built-in-metadata-providers",children:"Built-In Metadata Providers"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.a,{href:"/docs/server-docs/metadata-enrichment/provider-igdb",children:(0,r.jsx)(t.strong,{children:"IGDB (via Client-ID and Client-Secret)"})})}),"\n"]}),"\n",(0,r.jsx)(t.h3,{id:"community-maintained-metadata-providers",children:"Community-Maintained Metadata Providers"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Not yet available"}),", but you can ",(0,r.jsx)(t.a,{href:"#developing-a-new-metadata-provider-plugin",children:"build the first one!"})]}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"how-metadata-enrichment-in-gamevault-works",children:"How Metadata Enrichment in GameVault Works"}),"\n",(0,r.jsx)(t.p,{children:"The GameVault Server includes a metadata service that allows various Metadata Provider Plugins to register. Each provider registers with a numerical priority value - the higher the priority, the more important the metadata is treated."}),"\n",(0,r.jsxs)(t.p,{children:["After ",(0,r.jsx)(t.a,{href:"../indexing",children:"indexing the games"}),", GameVault automatically searches for relevant metadata. It uses a standard interface search method to find games on the metadata provider (often based on Game Title and Release Year) and determines the best match using a probability index calculated with an NLP Levenshtein algorithm and the release-year-offset. The further away the title and release date, the less probable the match. For each game file, only one game can be mapped per metadata provider."]}),"\n",(0,r.jsx)(t.h2,{id:"editing-metadata",children:"Editing Metadata"}),"\n",(0,r.jsxs)(t.p,{children:["To edit metadata, Users need to have the role ",(0,r.jsx)(t.code,{children:"EDITOR"})," or higher. Data provided by users are always treated with ",(0,r.jsx)(t.strong,{children:"the highest priority"}),". Only one user-provided metadata object per game is allowed and it is the same for all users. This can be used to fill in missing data manually or change it."]}),"\n",(0,r.jsx)(t.h2,{id:"remapping-a-game",children:"Remapping a Game"}),"\n",(0,r.jsx)(t.p,{children:"It is possible to search the registered Metadata Providers to find a better matching game and remap the current match to it."}),"\n",(0,r.jsx)(t.h2,{id:"unmapping-a-game",children:"Unmapping a Game"}),"\n",(0,r.jsx)(t.p,{children:"It is possible to unmap a game from a Metadata Provider, which will disconnect the mapped metadata from the game."}),"\n",(0,r.jsx)(t.h2,{id:"how-gamevault-merges-metadata",children:"How GameVault Merges Metadata"}),"\n",(0,r.jsxs)(t.p,{children:["GameVault always applies the metadata detached and by priority, by creating an ",(0,r.jsx)(t.strong,{children:"effective"})," metadata object ",(0,r.jsx)(t.code,{children:"game.metadata"}),'. We call this process "merging". It works as follows:']}),"\n",(0,r.jsx)(t.p,{children:'Let\'s say we have a game: "Grand Theft Auto: San Andreas" with two Metadata Providers and a user-provided edit.'}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Provider"}),(0,r.jsx)(t.th,{children:"Priority"}),(0,r.jsx)(t.th,{children:"Title"}),(0,r.jsx)(t.th,{children:"Description"}),(0,r.jsx)(t.th,{children:"Age Rating"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"STEAM"}),(0,r.jsx)(t.td,{children:"1"}),(0,r.jsx)(t.td,{children:"Grand Theft Auto: San Andreas"}),(0,r.jsx)(t.td,{children:"All you had to do is to follow the damn train, CJ."}),(0,r.jsx)(t.td,{children:"18"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"IGDB"}),(0,r.jsx)(t.td,{children:"2"}),(0,r.jsx)(t.td,{children:"Grand Theft Auto: San Andreas"}),(0,r.jsx)(t.td,{children:"I'll have two number 9s, a number 9 large..."}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"USER"}),(0,r.jsx)(t.td,{children:"\u221e"}),(0,r.jsx)(t.td,{children:"N/A"}),(0,r.jsx)(t.td,{children:"N/A"}),(0,r.jsx)(t.td,{children:"12"})]})]})]}),"\n",(0,r.jsx)(t.p,{children:'GameVault begins creating the "effective" metadata object by starting with the lowest priority provider and working its way up. In our case, the lowest priority provider is Steam with a priority of 1.'}),"\n",(0,r.jsx)(t.p,{children:"So the generated metadata object initially looks like this:"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Provider"}),(0,r.jsx)(t.th,{children:"Title"}),(0,r.jsx)(t.th,{children:"Description"}),(0,r.jsx)(t.th,{children:"Age Rating"})]})}),(0,r.jsx)(t.tbody,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"GameVault"}),(0,r.jsx)(t.td,{children:"Grand Theft Auto: San Andreas"}),(0,r.jsx)(t.td,{children:"All you had to do is to follow the damn train, CJ."}),(0,r.jsx)(t.td,{children:"18"})]})})]}),"\n",(0,r.jsx)(t.p,{children:"Next, the IGDB provider is used. As you can see, it has a different description, but the age rating is missing. GameVault will overwrite the description with the more important one. However, the missing age rating will be ignored, as some data from a lower priority provider is always preferred over having no data in a field. So the merged metadata object now looks like:"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Provider"}),(0,r.jsx)(t.th,{children:"Title"}),(0,r.jsx)(t.th,{children:"Description"}),(0,r.jsx)(t.th,{children:"Age Rating"})]})}),(0,r.jsx)(t.tbody,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"GameVault"}),(0,r.jsx)(t.td,{children:"Grand Theft Auto: San Andreas"}),(0,r.jsx)(t.td,{children:"I'll have two number 9s, a number 9 large..."}),(0,r.jsx)(t.td,{children:"18"})]})})]}),"\n",(0,r.jsx)(t.p,{children:"Finally, we get to the user-provided metadata. This one is special because the user always has the highest priority. So it will always be used. In our case, we want to let our underage kid play some San Andreas, so we overwrote the age rating to 12. Again, missing fields will be ignored."}),"\n",(0,r.jsx)(t.p,{children:"So the merged metadata object now looks like:"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Provider"}),(0,r.jsx)(t.th,{children:"Title"}),(0,r.jsx)(t.th,{children:"Description"}),(0,r.jsx)(t.th,{children:"Age Rating"})]})}),(0,r.jsx)(t.tbody,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"GameVault"}),(0,r.jsx)(t.td,{children:"Grand Theft Auto: San Andreas"}),(0,r.jsx)(t.td,{children:"I'll have two number 9s, a number 9 large..."}),(0,r.jsx)(t.td,{children:"12"})]})})]}),"\n",(0,r.jsx)(t.p,{children:"This is the final result. The merge is done by the GameVault Server."}),"\n",(0,r.jsx)(t.p,{children:"The server will trigger a new merge whenever a relevant metadata object is changed (e.g., Edit of Game Metadata, Recache, Remap, etc.)."}),"\n",(0,r.jsx)(t.h2,{id:"developing-a-new-metadata-provider-plugin",children:"Developing a New Metadata Provider Plugin"}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.a,{href:"/docs/server-docs/plugins",children:"Click here"})," to learn how to develop your own metadata provider plugin."]})]})}function c(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},8591:(e,t,a)=>{a.d(t,{R:()=>d,x:()=>s});var i=a(758);const r={},n=i.createContext(r);function d(e){const t=i.useContext(n);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),i.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[5723],{4892:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>c,frontMatter:()=>d,metadata:()=>i,toc:()=>o});const i=JSON.parse('{"id":"server-docs/metadata-enrichment/metadata","title":"Enriching your Games with Metadata","description":"Research shows that nobody wants to see blank placeholder images and missing descriptions in their library. We want those games enriched with some juicy metadata.","source":"@site/docs/server-docs/metadata-enrichment/metadata.md","sourceDirName":"server-docs/metadata-enrichment","slug":"/server-docs/metadata-enrichment/metadata","permalink":"/docs/server-docs/metadata-enrichment/metadata","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/metadata-enrichment/metadata.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"sidebarPosition":0.01,"frontMatter":{"title":"Enriching your Games with Metadata","sidebar_position":0.01},"sidebar":"docs","previous":{"title":"Game Indexing","permalink":"/docs/server-docs/indexing"},"next":{"title":"Provider: IGDB","permalink":"/docs/server-docs/metadata-enrichment/provider-igdb"}}');var r=a(6070),n=a(8591);const d={title:"Enriching your Games with Metadata",sidebar_position:.01},s=void 0,l={},o=[{value:"Setting Up a Metadata Provider",id:"setting-up-a-metadata-provider",level:2},{value:"Built-In Metadata Providers",id:"built-in-metadata-providers",level:3},{value:"Community-Maintained Metadata Providers",id:"community-maintained-metadata-providers",level:3},{value:"How Metadata Enrichment in GameVault Works",id:"how-metadata-enrichment-in-gamevault-works",level:2},{value:"Editing Metadata",id:"editing-metadata",level:2},{value:"Remapping a Game",id:"remapping-a-game",level:2},{value:"Unmapping a Game",id:"unmapping-a-game",level:2},{value:"How GameVault Merges Metadata",id:"how-gamevault-merges-metadata",level:2},{value:"Developing a New Metadata Provider Plugin",id:"developing-a-new-metadata-provider-plugin",level:2}];function h(e){const t={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(t.p,{children:["Research shows that nobody wants to see blank placeholder images and missing descriptions in their library. We want those games enriched with some ",(0,r.jsx)(t.strong,{children:"juicy metadata"}),"."]}),"\n",(0,r.jsxs)(t.p,{children:["GameVault supports a ",(0,r.jsx)(t.strong,{children:"vast plugin framework"})," that supports connecting to various metadata providers simultaneously. In the following sections, you'll learn how to set up a metadata provider and get started."]}),"\n",(0,r.jsx)(t.h2,{id:"setting-up-a-metadata-provider",children:"Setting Up a Metadata Provider"}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Click on any of the entries below to get to their dedicated page."})}),"\n",(0,r.jsx)(t.h3,{id:"built-in-metadata-providers",children:"Built-In Metadata Providers"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.a,{href:"/docs/server-docs/metadata-enrichment/provider-igdb",children:(0,r.jsx)(t.strong,{children:"IGDB (via Client-ID and Client-Secret)"})})}),"\n"]}),"\n",(0,r.jsx)(t.h3,{id:"community-maintained-metadata-providers",children:"Community-Maintained Metadata Providers"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Not yet available"}),", but you can ",(0,r.jsx)(t.a,{href:"#developing-a-new-metadata-provider-plugin",children:"build the first one!"})]}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"how-metadata-enrichment-in-gamevault-works",children:"How Metadata Enrichment in GameVault Works"}),"\n",(0,r.jsx)(t.p,{children:"The GameVault Server includes a metadata service that allows various Metadata Provider Plugins to register. Each provider registers with a numerical priority value - the higher the priority, the more important the metadata is treated."}),"\n",(0,r.jsxs)(t.p,{children:["After ",(0,r.jsx)(t.a,{href:"../indexing",children:"indexing the games"}),", GameVault automatically searches for relevant metadata. It uses a standard interface search method to find games on the metadata provider (often based on Game Title and Release Year) and determines the best match using a probability index calculated with an NLP Levenshtein algorithm and the release-year-offset. The further away the title and release date, the less probable the match. For each game file, only one game can be mapped per metadata provider."]}),"\n",(0,r.jsx)(t.h2,{id:"editing-metadata",children:"Editing Metadata"}),"\n",(0,r.jsxs)(t.p,{children:["To edit metadata, Users need to have the role ",(0,r.jsx)(t.code,{children:"EDITOR"})," or higher. Data provided by users are always treated with ",(0,r.jsx)(t.strong,{children:"the highest priority"}),". Only one user-provided metadata object per game is allowed and it is the same for all users. This can be used to fill in missing data manually or change it."]}),"\n",(0,r.jsx)(t.h2,{id:"remapping-a-game",children:"Remapping a Game"}),"\n",(0,r.jsx)(t.p,{children:"It is possible to search the registered Metadata Providers to find a better matching game and remap the current match to it."}),"\n",(0,r.jsx)(t.h2,{id:"unmapping-a-game",children:"Unmapping a Game"}),"\n",(0,r.jsx)(t.p,{children:"It is possible to unmap a game from a Metadata Provider, which will disconnect the mapped metadata from the game."}),"\n",(0,r.jsx)(t.h2,{id:"how-gamevault-merges-metadata",children:"How GameVault Merges Metadata"}),"\n",(0,r.jsxs)(t.p,{children:["GameVault always applies the metadata detached and by priority, by creating an ",(0,r.jsx)(t.strong,{children:"effective"})," metadata object ",(0,r.jsx)(t.code,{children:"game.metadata"}),'. We call this process "merging". It works as follows:']}),"\n",(0,r.jsx)(t.p,{children:'Let\'s say we have a game: "Grand Theft Auto: San Andreas" with two Metadata Providers and a user-provided edit.'}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Provider"}),(0,r.jsx)(t.th,{children:"Priority"}),(0,r.jsx)(t.th,{children:"Title"}),(0,r.jsx)(t.th,{children:"Description"}),(0,r.jsx)(t.th,{children:"Age Rating"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"STEAM"}),(0,r.jsx)(t.td,{children:"1"}),(0,r.jsx)(t.td,{children:"Grand Theft Auto: San Andreas"}),(0,r.jsx)(t.td,{children:"All you had to do is to follow the damn train, CJ."}),(0,r.jsx)(t.td,{children:"18"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"IGDB"}),(0,r.jsx)(t.td,{children:"2"}),(0,r.jsx)(t.td,{children:"Grand Theft Auto: San Andreas"}),(0,r.jsx)(t.td,{children:"I'll have two number 9s, a number 9 large..."}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"USER"}),(0,r.jsx)(t.td,{children:"\u221e"}),(0,r.jsx)(t.td,{children:"N/A"}),(0,r.jsx)(t.td,{children:"N/A"}),(0,r.jsx)(t.td,{children:"12"})]})]})]}),"\n",(0,r.jsx)(t.p,{children:'GameVault begins creating the "effective" metadata object by starting with the lowest priority provider and working its way up. In our case, the lowest priority provider is Steam with a priority of 1.'}),"\n",(0,r.jsx)(t.p,{children:"So the generated metadata object initially looks like this:"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Provider"}),(0,r.jsx)(t.th,{children:"Title"}),(0,r.jsx)(t.th,{children:"Description"}),(0,r.jsx)(t.th,{children:"Age Rating"})]})}),(0,r.jsx)(t.tbody,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"GameVault"}),(0,r.jsx)(t.td,{children:"Grand Theft Auto: San Andreas"}),(0,r.jsx)(t.td,{children:"All you had to do is to follow the damn train, CJ."}),(0,r.jsx)(t.td,{children:"18"})]})})]}),"\n",(0,r.jsx)(t.p,{children:"Next, the IGDB provider is used. As you can see, it has a different description, but the age rating is missing. GameVault will overwrite the description with the more important one. However, the missing age rating will be ignored, as some data from a lower priority provider is always preferred over having no data in a field. So the merged metadata object now looks like:"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Provider"}),(0,r.jsx)(t.th,{children:"Title"}),(0,r.jsx)(t.th,{children:"Description"}),(0,r.jsx)(t.th,{children:"Age Rating"})]})}),(0,r.jsx)(t.tbody,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"GameVault"}),(0,r.jsx)(t.td,{children:"Grand Theft Auto: San Andreas"}),(0,r.jsx)(t.td,{children:"I'll have two number 9s, a number 9 large..."}),(0,r.jsx)(t.td,{children:"18"})]})})]}),"\n",(0,r.jsx)(t.p,{children:"Finally, we get to the user-provided metadata. This one is special because the user always has the highest priority. So it will always be used. In our case, we want to let our underage kid play some San Andreas, so we overwrote the age rating to 12. Again, missing fields will be ignored."}),"\n",(0,r.jsx)(t.p,{children:"So the merged metadata object now looks like:"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Provider"}),(0,r.jsx)(t.th,{children:"Title"}),(0,r.jsx)(t.th,{children:"Description"}),(0,r.jsx)(t.th,{children:"Age Rating"})]})}),(0,r.jsx)(t.tbody,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"GameVault"}),(0,r.jsx)(t.td,{children:"Grand Theft Auto: San Andreas"}),(0,r.jsx)(t.td,{children:"I'll have two number 9s, a number 9 large..."}),(0,r.jsx)(t.td,{children:"12"})]})})]}),"\n",(0,r.jsx)(t.p,{children:"This is the final result. The merge is done by the GameVault Server."}),"\n",(0,r.jsx)(t.p,{children:"The server will trigger a new merge whenever a relevant metadata object is changed (e.g., Edit of Game Metadata, Recache, Remap, etc.)."}),"\n",(0,r.jsx)(t.h2,{id:"developing-a-new-metadata-provider-plugin",children:"Developing a New Metadata Provider Plugin"}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.a,{href:"/docs/server-docs/plugins",children:"Click here"})," to learn how to develop your own metadata provider plugin."]})]})}function c(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},8591:(e,t,a)=>{a.d(t,{R:()=>d,x:()=>s});var i=a(758);const r={},n=i.createContext(r);function d(e){const t=i.useContext(n);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),i.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0e384e19.1f70d09b.js b/assets/js/0e384e19.420787ac.js similarity index 99% rename from assets/js/0e384e19.1f70d09b.js rename to assets/js/0e384e19.420787ac.js index 614f79f9c..5727e53be 100644 --- a/assets/js/0e384e19.1f70d09b.js +++ b/assets/js/0e384e19.420787ac.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[3976],{2434:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"intro","title":"Introduction","description":"What is GameVault?","source":"@site/docs/intro.md","sourceDirName":".","slug":"/intro","permalink":"/docs/intro","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/intro.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"sidebarPosition":1,"frontMatter":{"sidebar_position":1},"sidebar":"docs","next":{"title":"Setting up a GameVault Server","permalink":"/docs/server-docs/setup/"}}');var i=r(6070),t=r(8591);const a={sidebar_position:1},o="Introduction",l={},c=[{value:"What is GameVault?",id:"what-is-gamevault",level:2},{value:"Features",id:"features",level:2},{value:"Client Features",id:"client-features",level:3},{value:"Server Features",id:"server-features",level:3},{value:"Support",id:"support",level:2},{value:"License",id:"license",level:2},{value:"Legal Disclaimer",id:"legal-disclaimer",level:2}];function d(e){const s={a:"a",admonition:"admonition",br:"br",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"introduction",children:"Introduction"})}),"\n",(0,i.jsx)(s.h2,{id:"what-is-gamevault",children:"What is GameVault?"}),"\n",(0,i.jsxs)(s.p,{children:["GameVault is a selfhostable ",(0,i.jsx)(s.a,{href:"https://wikipedia.org/wiki/Source-available_software",children:"source-available"})," gaming platform for DRM-free videogames. It offers a Steam-like browsing and playing experience for you and your community to enjoy the game files stored ",(0,i.jsx)(s.strong,{children:"on your file server"})," in an organized way."]}),"\n",(0,i.jsx)(s.p,{children:"You simply put your game files (installers, binaries, etc.) - from wherever you have them, into a folder and the server detects them, enriches them with metadata and offers a user-friendly interface to easily organize, download, install, and play your games. It even tracks your playtimes and progress."}),"\n",(0,i.jsx)(s.p,{children:"GameVault consists of two components:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"A self-hosted backend server served with Docker"}),"\n",(0,i.jsx)(s.li,{children:"A client application to use this server"}),"\n"]}),"\n",(0,i.jsx)(s.admonition,{title:"Try it out!",type:"tip",children:(0,i.jsxs)(s.p,{children:["If you don't have a server yet, but want to try it out, you can connect your GameVault Client to our demo server get a feel for how it works.",(0,i.jsx)(s.br,{}),"\n",(0,i.jsx)(s.a,{href:"client-docs/setup#option-2-using-the-demo-server",children:"Click here to learn more."})]})}),"\n",(0,i.jsx)(s.h2,{id:"features",children:"Features"}),"\n",(0,i.jsx)(s.p,{children:"Let's take a look at all the main functions of GameVault:"}),"\n",(0,i.jsx)(s.h3,{id:"client-features",children:"Client Features"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\ud83d\udd0e ",(0,i.jsx)(s.a,{href:"./client-docs/gui#library",children:"Browse your server's game collection"})]}),"\n",(0,i.jsxs)(s.li,{children:["\ud83d\udce5 ",(0,i.jsx)(s.a,{href:"./client-docs/how-to-use#downloading-games",children:"Securely download your games from your server"})]}),"\n",(0,i.jsxs)(s.li,{children:["\u2699\ufe0f ",(0,i.jsx)(s.a,{href:"./client-docs/how-to-use#1-extracting-the-game",children:"Automatically extract and install games"})]}),"\n",(0,i.jsxs)(s.li,{children:["\ud83c\udfae ",(0,i.jsx)(s.a,{href:"./client-docs/how-to-use#playing-a-game",children:"Launch and play the games on your PC"})]}),"\n",(0,i.jsxs)(s.li,{children:["\u23f1\ufe0f ",(0,i.jsx)(s.a,{href:"./client-docs/how-to-use#tracking-your-game-progress",children:"Track playtimes and progress (even when the server is offline)"})]}),"\n",(0,i.jsxs)(s.li,{children:["\ud83d\udc65 ",(0,i.jsx)(s.a,{href:"./client-docs/gui#community",children:"Compare game progress with other users on the server"})]}),"\n",(0,i.jsxs)(s.li,{children:["\u270f\ufe0f ",(0,i.jsx)(s.a,{href:"./client-docs/gui#metadata",children:"Edit any game metadata"})]}),"\n",(0,i.jsxs)(s.li,{children:["\ud83d\udd12 ",(0,i.jsx)(s.a,{href:"./client-docs/gui#administration",children:"Manage your users and games with a powerful Admin UI"})]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"server-features",children:"Server Features"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\u267b\ufe0f ",(0,i.jsx)(s.a,{href:"/docs/server-docs/indexing",children:"Automatic indexer to sync games from the file system into the database"})]}),"\n",(0,i.jsxs)(s.li,{children:["\ud83d\udcda ",(0,i.jsx)(s.a,{href:"/docs/server-docs/metadata-enrichment/metadata",children:"Automatic enrichment of games with metadata, box arts, tags, genres, description and more using various APIs"})]}),"\n",(0,i.jsxs)(s.li,{children:["\ud83d\udc65 ",(0,i.jsx)(s.a,{href:"/docs/server-docs/user-management",children:"Multi-User Authentication"})]}),"\n",(0,i.jsxs)(s.li,{children:["\ud83d\udd12 ",(0,i.jsx)(s.a,{href:"./server-docs/user-management#user-roles",children:"Role-Based Access Control"})]}),"\n",(0,i.jsxs)(s.li,{children:["\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66 ",(0,i.jsx)(s.a,{href:"./server-docs/parental-control",children:"Parental Control Features"})]}),"\n",(0,i.jsxs)(s.li,{children:["\u23f1\ufe0f ",(0,i.jsx)(s.a,{href:"./client-docs/how-to-use#tracking-your-game-progress",children:"Game Progress and Statistics Tracking"})]}),"\n",(0,i.jsxs)(s.li,{children:["\ud83d\udea8 ",(0,i.jsx)(s.a,{href:"./advanced-usage/rest-api",children:"Health Monitoring and Logging"})]}),"\n",(0,i.jsxs)(s.li,{children:["\ud83d\udd0e ",(0,i.jsx)(s.a,{href:"./advanced-usage/rest-api",children:"Full-Text Search, Filters, Sorting, Pagination"})]}),"\n",(0,i.jsxs)(s.li,{children:["\ud83d\udd0c ",(0,i.jsx)(s.a,{href:"./advanced-usage/rest-api",children:"Fully Documented API"})]}),"\n",(0,i.jsxs)(s.li,{children:["\u2699\ufe0f ",(0,i.jsx)(s.a,{href:"./server-docs/configuration",children:"Highly Configurable"})]}),"\n",(0,i.jsxs)(s.li,{children:["\u2699\ufe0f ",(0,i.jsx)(s.a,{href:"/docs/server-docs/plugins",children:"Modular Plugin Framework"})]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"support",children:"Support"}),"\n",(0,i.jsxs)(s.p,{children:["We're working hard in our free time to provide you, your friends, and families with the best self-hosted gaming experience. It would mean a lot to us if you could support us developers by ",(0,i.jsx)(s.a,{href:"/docs/gamevault-plus/introduction",children:"getting GameVault+"}),"."]}),"\n",(0,i.jsx)(s.p,{children:"Alternatively you can support us by donating us some spare dollars on any of these platforms:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.a,{href:"https://ko-fi.com/phalcode",children:"Ko-Fi"})}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.a,{href:"https://liberapay.com/Phalcode",children:"Liberapay"})}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.a,{href:"https://github.com/sponsors/Phalcode",children:"GitHub Sponsors"})}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.a,{href:"https://paypal.me/phalcode",children:"PayPal"})}),"\n"]}),"\n",(0,i.jsx)(s.admonition,{title:"Tip for donators",type:"tip",children:(0,i.jsxs)(s.p,{children:["If you connect your ",(0,i.jsx)(s.a,{href:"https://discord.gg/NEdNen2dSu",children:"Discord"}),' account to Ko-Fi, you\'ll automatically receive the "@Supporters"-Role and permanently stand out in our ',(0,i.jsx)(s.a,{href:"https://discord.gg/NEdNen2dSu",children:"Discord"})," members list. If you donate through a different platform and want to obtain the role, simply send us a message with your receipt as proof."]})}),"\n",(0,i.jsx)(s.h2,{id:"license",children:"License"}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"http://creativecommons.org/licenses/by-nc-sa/4.0/",children:(0,i.jsx)(s.img,{src:"https://img.shields.io/badge/License-CC%20BY--NC--SA%204.0-lightgrey.svg",alt:"CC BY-NC-SA 4.0"})}),(0,i.jsx)(s.br,{}),"\n",(0,i.jsx)(s.a,{href:"http://creativecommons.org/licenses/by-nc-sa/4.0/",children:(0,i.jsx)(s.img,{src:"https://licensebuttons.net/l/by-nc-sa/4.0/88x31.png",alt:"CC BY-NC-SA 4.0"})})]}),"\n",(0,i.jsxs)(s.p,{children:["This work is licensed under a\n",(0,i.jsx)(s.a,{href:"http://creativecommons.org/licenses/by-nc-sa/4.0/",children:"Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License"}),"."]}),"\n",(0,i.jsxs)(s.p,{children:["GameVault is not open-source software. ",(0,i.jsx)(s.a,{href:"/blog/2023/07/13",children:"Click here to learn why."})]}),"\n",(0,i.jsx)(s.h2,{id:"legal-disclaimer",children:"Legal Disclaimer"}),"\n",(0,i.jsxs)(s.admonition,{title:"Legal Disclaimer",type:"warning",children:[(0,i.jsx)(s.p,{children:"GameVault manages DRM-free games and is solely a tool to address this need. We are not responsible for the content or files users store or share."}),(0,i.jsxs)(s.p,{children:["When we say DRM-free games, we only mean games obtained legally. While GameVault ",(0,i.jsx)(s.em,{children:"can"})," theoretically be used with illegally obtained games, we do not endorse or support piracy."]}),(0,i.jsx)(s.p,{children:"Users must be aware of and comply with copyright laws in their respective jurisdictions. We encourage responsible and legal use of GameVault. Unlawful use is strictly improper and unauthorized."})]})]})}function h(e={}){const{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8591:(e,s,r)=>{r.d(s,{R:()=>a,x:()=>o});var n=r(758);const i={},t=n.createContext(i);function a(e){const s=n.useContext(t);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function o(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),n.createElement(t.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[3976],{2434:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"intro","title":"Introduction","description":"What is GameVault?","source":"@site/docs/intro.md","sourceDirName":".","slug":"/intro","permalink":"/docs/intro","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/intro.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"sidebarPosition":1,"frontMatter":{"sidebar_position":1},"sidebar":"docs","next":{"title":"Setting up a GameVault Server","permalink":"/docs/server-docs/setup/"}}');var i=r(6070),t=r(8591);const a={sidebar_position:1},o="Introduction",l={},c=[{value:"What is GameVault?",id:"what-is-gamevault",level:2},{value:"Features",id:"features",level:2},{value:"Client Features",id:"client-features",level:3},{value:"Server Features",id:"server-features",level:3},{value:"Support",id:"support",level:2},{value:"License",id:"license",level:2},{value:"Legal Disclaimer",id:"legal-disclaimer",level:2}];function d(e){const s={a:"a",admonition:"admonition",br:"br",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"introduction",children:"Introduction"})}),"\n",(0,i.jsx)(s.h2,{id:"what-is-gamevault",children:"What is GameVault?"}),"\n",(0,i.jsxs)(s.p,{children:["GameVault is a selfhostable ",(0,i.jsx)(s.a,{href:"https://wikipedia.org/wiki/Source-available_software",children:"source-available"})," gaming platform for DRM-free videogames. It offers a Steam-like browsing and playing experience for you and your community to enjoy the game files stored ",(0,i.jsx)(s.strong,{children:"on your file server"})," in an organized way."]}),"\n",(0,i.jsx)(s.p,{children:"You simply put your game files (installers, binaries, etc.) - from wherever you have them, into a folder and the server detects them, enriches them with metadata and offers a user-friendly interface to easily organize, download, install, and play your games. It even tracks your playtimes and progress."}),"\n",(0,i.jsx)(s.p,{children:"GameVault consists of two components:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"A self-hosted backend server served with Docker"}),"\n",(0,i.jsx)(s.li,{children:"A client application to use this server"}),"\n"]}),"\n",(0,i.jsx)(s.admonition,{title:"Try it out!",type:"tip",children:(0,i.jsxs)(s.p,{children:["If you don't have a server yet, but want to try it out, you can connect your GameVault Client to our demo server get a feel for how it works.",(0,i.jsx)(s.br,{}),"\n",(0,i.jsx)(s.a,{href:"client-docs/setup#option-2-using-the-demo-server",children:"Click here to learn more."})]})}),"\n",(0,i.jsx)(s.h2,{id:"features",children:"Features"}),"\n",(0,i.jsx)(s.p,{children:"Let's take a look at all the main functions of GameVault:"}),"\n",(0,i.jsx)(s.h3,{id:"client-features",children:"Client Features"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\ud83d\udd0e ",(0,i.jsx)(s.a,{href:"./client-docs/gui#library",children:"Browse your server's game collection"})]}),"\n",(0,i.jsxs)(s.li,{children:["\ud83d\udce5 ",(0,i.jsx)(s.a,{href:"./client-docs/how-to-use#downloading-games",children:"Securely download your games from your server"})]}),"\n",(0,i.jsxs)(s.li,{children:["\u2699\ufe0f ",(0,i.jsx)(s.a,{href:"./client-docs/how-to-use#1-extracting-the-game",children:"Automatically extract and install games"})]}),"\n",(0,i.jsxs)(s.li,{children:["\ud83c\udfae ",(0,i.jsx)(s.a,{href:"./client-docs/how-to-use#playing-a-game",children:"Launch and play the games on your PC"})]}),"\n",(0,i.jsxs)(s.li,{children:["\u23f1\ufe0f ",(0,i.jsx)(s.a,{href:"./client-docs/how-to-use#tracking-your-game-progress",children:"Track playtimes and progress (even when the server is offline)"})]}),"\n",(0,i.jsxs)(s.li,{children:["\ud83d\udc65 ",(0,i.jsx)(s.a,{href:"./client-docs/gui#community",children:"Compare game progress with other users on the server"})]}),"\n",(0,i.jsxs)(s.li,{children:["\u270f\ufe0f ",(0,i.jsx)(s.a,{href:"./client-docs/gui#metadata",children:"Edit any game metadata"})]}),"\n",(0,i.jsxs)(s.li,{children:["\ud83d\udd12 ",(0,i.jsx)(s.a,{href:"./client-docs/gui#administration",children:"Manage your users and games with a powerful Admin UI"})]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"server-features",children:"Server Features"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\u267b\ufe0f ",(0,i.jsx)(s.a,{href:"/docs/server-docs/indexing",children:"Automatic indexer to sync games from the file system into the database"})]}),"\n",(0,i.jsxs)(s.li,{children:["\ud83d\udcda ",(0,i.jsx)(s.a,{href:"/docs/server-docs/metadata-enrichment/metadata",children:"Automatic enrichment of games with metadata, box arts, tags, genres, description and more using various APIs"})]}),"\n",(0,i.jsxs)(s.li,{children:["\ud83d\udc65 ",(0,i.jsx)(s.a,{href:"/docs/server-docs/user-management",children:"Multi-User Authentication"})]}),"\n",(0,i.jsxs)(s.li,{children:["\ud83d\udd12 ",(0,i.jsx)(s.a,{href:"./server-docs/user-management#user-roles",children:"Role-Based Access Control"})]}),"\n",(0,i.jsxs)(s.li,{children:["\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66 ",(0,i.jsx)(s.a,{href:"./server-docs/parental-control",children:"Parental Control Features"})]}),"\n",(0,i.jsxs)(s.li,{children:["\u23f1\ufe0f ",(0,i.jsx)(s.a,{href:"./client-docs/how-to-use#tracking-your-game-progress",children:"Game Progress and Statistics Tracking"})]}),"\n",(0,i.jsxs)(s.li,{children:["\ud83d\udea8 ",(0,i.jsx)(s.a,{href:"./advanced-usage/rest-api",children:"Health Monitoring and Logging"})]}),"\n",(0,i.jsxs)(s.li,{children:["\ud83d\udd0e ",(0,i.jsx)(s.a,{href:"./advanced-usage/rest-api",children:"Full-Text Search, Filters, Sorting, Pagination"})]}),"\n",(0,i.jsxs)(s.li,{children:["\ud83d\udd0c ",(0,i.jsx)(s.a,{href:"./advanced-usage/rest-api",children:"Fully Documented API"})]}),"\n",(0,i.jsxs)(s.li,{children:["\u2699\ufe0f ",(0,i.jsx)(s.a,{href:"./server-docs/configuration",children:"Highly Configurable"})]}),"\n",(0,i.jsxs)(s.li,{children:["\u2699\ufe0f ",(0,i.jsx)(s.a,{href:"/docs/server-docs/plugins",children:"Modular Plugin Framework"})]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"support",children:"Support"}),"\n",(0,i.jsxs)(s.p,{children:["We're working hard in our free time to provide you, your friends, and families with the best self-hosted gaming experience. It would mean a lot to us if you could support us developers by ",(0,i.jsx)(s.a,{href:"/docs/gamevault-plus/introduction",children:"getting GameVault+"}),"."]}),"\n",(0,i.jsx)(s.p,{children:"Alternatively you can support us by donating us some spare dollars on any of these platforms:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.a,{href:"https://ko-fi.com/phalcode",children:"Ko-Fi"})}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.a,{href:"https://liberapay.com/Phalcode",children:"Liberapay"})}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.a,{href:"https://github.com/sponsors/Phalcode",children:"GitHub Sponsors"})}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.a,{href:"https://paypal.me/phalcode",children:"PayPal"})}),"\n"]}),"\n",(0,i.jsx)(s.admonition,{title:"Tip for donators",type:"tip",children:(0,i.jsxs)(s.p,{children:["If you connect your ",(0,i.jsx)(s.a,{href:"https://discord.gg/NEdNen2dSu",children:"Discord"}),' account to Ko-Fi, you\'ll automatically receive the "@Supporters"-Role and permanently stand out in our ',(0,i.jsx)(s.a,{href:"https://discord.gg/NEdNen2dSu",children:"Discord"})," members list. If you donate through a different platform and want to obtain the role, simply send us a message with your receipt as proof."]})}),"\n",(0,i.jsx)(s.h2,{id:"license",children:"License"}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"http://creativecommons.org/licenses/by-nc-sa/4.0/",children:(0,i.jsx)(s.img,{src:"https://img.shields.io/badge/License-CC%20BY--NC--SA%204.0-lightgrey.svg",alt:"CC BY-NC-SA 4.0"})}),(0,i.jsx)(s.br,{}),"\n",(0,i.jsx)(s.a,{href:"http://creativecommons.org/licenses/by-nc-sa/4.0/",children:(0,i.jsx)(s.img,{src:"https://licensebuttons.net/l/by-nc-sa/4.0/88x31.png",alt:"CC BY-NC-SA 4.0"})})]}),"\n",(0,i.jsxs)(s.p,{children:["This work is licensed under a\n",(0,i.jsx)(s.a,{href:"http://creativecommons.org/licenses/by-nc-sa/4.0/",children:"Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License"}),"."]}),"\n",(0,i.jsxs)(s.p,{children:["GameVault is not open-source software. ",(0,i.jsx)(s.a,{href:"/blog/2023/07/13",children:"Click here to learn why."})]}),"\n",(0,i.jsx)(s.h2,{id:"legal-disclaimer",children:"Legal Disclaimer"}),"\n",(0,i.jsxs)(s.admonition,{title:"Legal Disclaimer",type:"warning",children:[(0,i.jsx)(s.p,{children:"GameVault manages DRM-free games and is solely a tool to address this need. We are not responsible for the content or files users store or share."}),(0,i.jsxs)(s.p,{children:["When we say DRM-free games, we only mean games obtained legally. While GameVault ",(0,i.jsx)(s.em,{children:"can"})," theoretically be used with illegally obtained games, we do not endorse or support piracy."]}),(0,i.jsx)(s.p,{children:"Users must be aware of and comply with copyright laws in their respective jurisdictions. We encourage responsible and legal use of GameVault. Unlawful use is strictly improper and unauthorized."})]})]})}function h(e={}){const{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8591:(e,s,r)=>{r.d(s,{R:()=>a,x:()=>o});var n=r(758);const i={},t=n.createContext(i);function a(e){const s=n.useContext(t);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function o(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),n.createElement(t.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/14b6aafb.37eb7130.js b/assets/js/14b6aafb.34d57085.js similarity index 99% rename from assets/js/14b6aafb.37eb7130.js rename to assets/js/14b6aafb.34d57085.js index 62b3458cd..c9cde75c2 100644 --- a/assets/js/14b6aafb.37eb7130.js +++ b/assets/js/14b6aafb.34d57085.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[3290],{4556:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>l,contentTitle:()=>o,default:()=>c,frontMatter:()=>r,metadata:()=>a,toc:()=>d});const a=JSON.parse('{"id":"server-docs/adding-games","title":"Adding Games to GameVault","description":"If you wish to add games to your server but are struggling with unorganized files, varying file formats, and compressed files, you have come to the right place. In this chapter, you will learn the correct process to add games to your GameVault server.","source":"@site/docs/server-docs/adding-games.md","sourceDirName":"server-docs","slug":"/server-docs/adding-games","permalink":"/docs/server-docs/adding-games","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/adding-games.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"sidebarPosition":3,"frontMatter":{"sidebar_position":3,"sidebar_title":"Adding Games"},"sidebar":"docs","previous":{"title":"Game Types","permalink":"/docs/server-docs/game-types"},"next":{"title":"Updating Games","permalink":"/docs/server-docs/updating-games"}}');var i=t(6070),n=t(8591);const r={sidebar_position:3,sidebar_title:"Adding Games"},o="Adding Games to GameVault",l={},d=[{value:"Before You Begin",id:"before-you-begin",level:2},{value:"Step 1: Preparing",id:"step-1-preparing",level:2},{value:"Step 2: Compression",id:"step-2-compression",level:2},{value:"Method 1: The Fast Way",id:"method-1-the-fast-way",level:3},{value:"Method 2: The Hardcore Way",id:"method-2-the-hardcore-way",level:3},{value:"Method 3: The Balanced Way",id:"method-3-the-balanced-way",level:3},{value:"Step 3: Naming the Archive",id:"step-3-naming-the-archive",level:2},{value:"Adding the same game multiple times",id:"adding-the-same-game-multiple-times",level:3},{value:"Step 4: Deploy \ud83e\udd73",id:"step-4-deploy-",level:2}];function h(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,n.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"adding-games-to-gamevault",children:"Adding Games to GameVault"})}),"\n",(0,i.jsx)(s.p,{children:"If you wish to add games to your server but are struggling with unorganized files, varying file formats, and compressed files, you have come to the right place. In this chapter, you will learn the correct process to add games to your GameVault server."}),"\n",(0,i.jsx)(s.h2,{id:"before-you-begin",children:"Before You Begin"}),"\n",(0,i.jsxs)(s.p,{children:["Please read the ",(0,i.jsx)(s.a,{href:"/docs/server-docs/structure",children:"File and Folder Structure"})," chapter first."]}),"\n",(0,i.jsx)(s.p,{children:"Adding games to your server is a manual process that demands effort and expertise. However, it is worth the effort. To execute the task accurately, follow the steps outlined below for each game. With practice, you will become more proficient and adept at performing these steps with ease."}),"\n",(0,i.jsx)(s.h2,{id:"step-1-preparing",children:"Step 1: Preparing"}),"\n",(0,i.jsx)(s.p,{children:'Suppose you have obtained a DRM-free copy of "Crawl," and it is located in your file system as follows:'}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Crawl/","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"setup.bin"}),"\n",(0,i.jsx)(s.li,{children:"setup.exe"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.admonition,{type:"note",children:(0,i.jsx)(s.p,{children:"This is not a real-world example."})}),"\n",(0,i.jsx)(s.p,{children:'If the game files are already compressed in a format that GameVault can understand, such as "Crawl.zip", you can skip the next step. However, if you want to maximize disk space and repack the files, you can do that. Datahoarders, for example, rely on every bit and byte on their disks and tend to repack everything to the maximum compression available.'}),"\n",(0,i.jsx)(s.h2,{id:"step-2-compression",children:"Step 2: Compression"}),"\n",(0,i.jsxs)(s.p,{children:["To make your game files compatible with GameVault, you need to archive them. We recommend using ",(0,i.jsx)(s.a,{href:"https://www.7-zip.org/",children:"7Zip"})," for this. There are different approaches to this."]}),"\n",(0,i.jsx)(s.admonition,{title:"single-file executables",type:"tip",children:(0,i.jsxs)(s.p,{children:["If the game you're about to add only consists of a single executable file such as ",(0,i.jsx)(s.code,{children:"setup_game.exe"})," or ",(0,i.jsx)(s.code,{children:"setup_game.sh"}),", you can choose to skip this stage and proceed with ",(0,i.jsx)(s.a,{href:"#step-3-naming-the-archive",children:"naming it"}),". See ",(0,i.jsx)(s.a,{href:"structure#single-file-executable",children:"here"})," for more details."]})}),"\n",(0,i.jsx)(s.h3,{id:"method-1-the-fast-way",children:"Method 1: The Fast Way"}),"\n",(0,i.jsx)(s.p,{children:"The fastest way to compress your game files into a .7z archive is by copying them without compression, which takes little to no time or effort. However, the resulting archive will be as large as the original folder."}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"7z a -mx=0 -ms=off game.7z /path/to/game/folder/Crawl/*\n"})}),"\n",(0,i.jsx)(s.p,{children:"This command uses the following options:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"a"}),": Add files to the archive"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"-mx=0"}),": Sets the compression level to 0"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"-ms=off"}),": Turns off solid block compression"]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"method-2-the-hardcore-way",children:"Method 2: The Hardcore Way"}),"\n",(0,i.jsx)(s.p,{children:"To achieve the smallest possible archive size, use the maximum settings of 7zip. The resulting archive may or may not be much smaller than before, but it will definitely be as small as possible. However, this process could take a long time, depending on your hardware, and is very resource-intensive."}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"7z a -mx=9 -mfb=64 -md=32m -ms=on game.7z /path/to/game/folder/Crawl/*\n"})}),"\n",(0,i.jsx)(s.p,{children:"This command uses the following options:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"a"}),": Add files to the archive"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"-mx=9"}),": Use the maximum compression level"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"-mfb=64"}),": Set the number of fast bytes to 64"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"-md=32m"}),": Set the dictionary size to 32MB"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"-ms=on"}),": Enable solid block compression"]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"method-3-the-balanced-way",children:"Method 3: The Balanced Way"}),"\n",(0,i.jsx)(s.p,{children:"If you are not happy with either method, you can use the preselected options of 7zip to compress the files as effectively and balanced as possible:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"7z a game.7z /path/to/game/folder/Crawl/*\n"})}),"\n",(0,i.jsx)(s.h2,{id:"step-3-naming-the-archive",children:"Step 3: Naming the Archive"}),"\n",(0,i.jsx)(s.p,{children:"Before naming the archive, take a moment to research the game you're about to add. Ask yourself questions or use a search engine to answer the following questions:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:'"What version is the game?"'}),"\n",(0,i.jsx)(s.li,{children:'"What year was the game released?"'}),"\n",(0,i.jsx)(s.li,{children:'"Is the game still in early access?"'}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:["Once you have gathered all the necessary information, you can name the archive using the ",(0,i.jsx)(s.a,{href:"/docs/server-docs/structure",children:"GameVault Naming Structure"}),"."]}),"\n",(0,i.jsx)(s.p,{children:"In our fictitious example we have a copy of Crawl Version 1.0.1 released in 2014, so we named the archive:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"Crawl (v1.0.1) (2014).7z\n"})}),"\n",(0,i.jsx)(s.h3,{id:"adding-the-same-game-multiple-times",children:"Adding the same game multiple times"}),"\n",(0,i.jsxs)(s.p,{children:["If you wish to add the same game multiple times to your GameVault server for any specific reason, it is important to ensure that you rename it slightly differently. This is to prevent the indexer from detecting it as a duplicate entry. We recommend using square brackets ",(0,i.jsx)(s.code,{children:"[]"})," as your personal discriminator for these games. Avoid using regular parentheses ",(0,i.jsx)(s.code,{children:"()"})," as they will be removed by the title extraction regex. It also does not matter if the files are in the same sub-folder or in different ones."]}),"\n",(0,i.jsx)(s.p,{children:"By using this approach, the indexer will treat these two games as separate entities."}),"\n",(0,i.jsx)(s.p,{children:"In case the Auto-Matching feature does not work accurately for these games, you have the option to manually remap them in the client if you have the Role Editor or higher privileges."}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Here's a good example:"})}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Game 1: ",(0,i.jsx)(s.code,{children:"Minecraft [Tekkit Modpack] (v1.7.10) (2011).zip"})]}),"\n",(0,i.jsxs)(s.li,{children:["Game 2: ",(0,i.jsx)(s.code,{children:"Minecraft [Hexxit Modpack] (v1.13.2) (2011).zip"})]}),"\n"]}),"\n",(0,i.jsx)(s.admonition,{type:"info",children:(0,i.jsx)(s.p,{children:"Will result in two seperate games"})}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"And here's a bad example:"})}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Game 1: ",(0,i.jsx)(s.code,{children:"Minecraft (v1.7.10) (2011).zip"})]}),"\n",(0,i.jsxs)(s.li,{children:["Game 2: ",(0,i.jsx)(s.code,{children:"Minecraft (v1.13.2) (2011).zip"})]}),"\n"]}),"\n",(0,i.jsx)(s.admonition,{type:"danger",children:(0,i.jsx)(s.p,{children:"Will result in a single game that gets overwritten!"})}),"\n",(0,i.jsx)(s.h2,{id:"step-4-deploy-",children:"Step 4: Deploy \ud83e\udd73"}),"\n",(0,i.jsxs)(s.p,{children:["Once you have named the archive, place it into the folder on your host system that is mounted to GameVault's files folder (by default ",(0,i.jsx)(s.code,{children:"/files"}),"). Once the archive is in place, GameVault will automatically index the game, enrich it with metadata, and save it in your database."]}),"\n",(0,i.jsx)(s.p,{children:"Congratulations! You have successfully added a game to your GameVault server. Repeat the process for any additional games you want to add."})]})}function c(e={}){const{wrapper:s}={...(0,n.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8591:(e,s,t)=>{t.d(s,{R:()=>r,x:()=>o});var a=t(758);const i={},n=a.createContext(i);function r(e){const s=a.useContext(n);return a.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function o(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),a.createElement(n.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[3290],{4556:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>l,contentTitle:()=>o,default:()=>c,frontMatter:()=>r,metadata:()=>a,toc:()=>d});const a=JSON.parse('{"id":"server-docs/adding-games","title":"Adding Games to GameVault","description":"If you wish to add games to your server but are struggling with unorganized files, varying file formats, and compressed files, you have come to the right place. In this chapter, you will learn the correct process to add games to your GameVault server.","source":"@site/docs/server-docs/adding-games.md","sourceDirName":"server-docs","slug":"/server-docs/adding-games","permalink":"/docs/server-docs/adding-games","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/adding-games.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"sidebarPosition":3,"frontMatter":{"sidebar_position":3,"sidebar_title":"Adding Games"},"sidebar":"docs","previous":{"title":"Game Types","permalink":"/docs/server-docs/game-types"},"next":{"title":"Updating Games","permalink":"/docs/server-docs/updating-games"}}');var i=t(6070),n=t(8591);const r={sidebar_position:3,sidebar_title:"Adding Games"},o="Adding Games to GameVault",l={},d=[{value:"Before You Begin",id:"before-you-begin",level:2},{value:"Step 1: Preparing",id:"step-1-preparing",level:2},{value:"Step 2: Compression",id:"step-2-compression",level:2},{value:"Method 1: The Fast Way",id:"method-1-the-fast-way",level:3},{value:"Method 2: The Hardcore Way",id:"method-2-the-hardcore-way",level:3},{value:"Method 3: The Balanced Way",id:"method-3-the-balanced-way",level:3},{value:"Step 3: Naming the Archive",id:"step-3-naming-the-archive",level:2},{value:"Adding the same game multiple times",id:"adding-the-same-game-multiple-times",level:3},{value:"Step 4: Deploy \ud83e\udd73",id:"step-4-deploy-",level:2}];function h(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,n.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"adding-games-to-gamevault",children:"Adding Games to GameVault"})}),"\n",(0,i.jsx)(s.p,{children:"If you wish to add games to your server but are struggling with unorganized files, varying file formats, and compressed files, you have come to the right place. In this chapter, you will learn the correct process to add games to your GameVault server."}),"\n",(0,i.jsx)(s.h2,{id:"before-you-begin",children:"Before You Begin"}),"\n",(0,i.jsxs)(s.p,{children:["Please read the ",(0,i.jsx)(s.a,{href:"/docs/server-docs/structure",children:"File and Folder Structure"})," chapter first."]}),"\n",(0,i.jsx)(s.p,{children:"Adding games to your server is a manual process that demands effort and expertise. However, it is worth the effort. To execute the task accurately, follow the steps outlined below for each game. With practice, you will become more proficient and adept at performing these steps with ease."}),"\n",(0,i.jsx)(s.h2,{id:"step-1-preparing",children:"Step 1: Preparing"}),"\n",(0,i.jsx)(s.p,{children:'Suppose you have obtained a DRM-free copy of "Crawl," and it is located in your file system as follows:'}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Crawl/","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"setup.bin"}),"\n",(0,i.jsx)(s.li,{children:"setup.exe"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.admonition,{type:"note",children:(0,i.jsx)(s.p,{children:"This is not a real-world example."})}),"\n",(0,i.jsx)(s.p,{children:'If the game files are already compressed in a format that GameVault can understand, such as "Crawl.zip", you can skip the next step. However, if you want to maximize disk space and repack the files, you can do that. Datahoarders, for example, rely on every bit and byte on their disks and tend to repack everything to the maximum compression available.'}),"\n",(0,i.jsx)(s.h2,{id:"step-2-compression",children:"Step 2: Compression"}),"\n",(0,i.jsxs)(s.p,{children:["To make your game files compatible with GameVault, you need to archive them. We recommend using ",(0,i.jsx)(s.a,{href:"https://www.7-zip.org/",children:"7Zip"})," for this. There are different approaches to this."]}),"\n",(0,i.jsx)(s.admonition,{title:"single-file executables",type:"tip",children:(0,i.jsxs)(s.p,{children:["If the game you're about to add only consists of a single executable file such as ",(0,i.jsx)(s.code,{children:"setup_game.exe"})," or ",(0,i.jsx)(s.code,{children:"setup_game.sh"}),", you can choose to skip this stage and proceed with ",(0,i.jsx)(s.a,{href:"#step-3-naming-the-archive",children:"naming it"}),". See ",(0,i.jsx)(s.a,{href:"structure#single-file-executable",children:"here"})," for more details."]})}),"\n",(0,i.jsx)(s.h3,{id:"method-1-the-fast-way",children:"Method 1: The Fast Way"}),"\n",(0,i.jsx)(s.p,{children:"The fastest way to compress your game files into a .7z archive is by copying them without compression, which takes little to no time or effort. However, the resulting archive will be as large as the original folder."}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"7z a -mx=0 -ms=off game.7z /path/to/game/folder/Crawl/*\n"})}),"\n",(0,i.jsx)(s.p,{children:"This command uses the following options:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"a"}),": Add files to the archive"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"-mx=0"}),": Sets the compression level to 0"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"-ms=off"}),": Turns off solid block compression"]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"method-2-the-hardcore-way",children:"Method 2: The Hardcore Way"}),"\n",(0,i.jsx)(s.p,{children:"To achieve the smallest possible archive size, use the maximum settings of 7zip. The resulting archive may or may not be much smaller than before, but it will definitely be as small as possible. However, this process could take a long time, depending on your hardware, and is very resource-intensive."}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"7z a -mx=9 -mfb=64 -md=32m -ms=on game.7z /path/to/game/folder/Crawl/*\n"})}),"\n",(0,i.jsx)(s.p,{children:"This command uses the following options:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"a"}),": Add files to the archive"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"-mx=9"}),": Use the maximum compression level"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"-mfb=64"}),": Set the number of fast bytes to 64"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"-md=32m"}),": Set the dictionary size to 32MB"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"-ms=on"}),": Enable solid block compression"]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"method-3-the-balanced-way",children:"Method 3: The Balanced Way"}),"\n",(0,i.jsx)(s.p,{children:"If you are not happy with either method, you can use the preselected options of 7zip to compress the files as effectively and balanced as possible:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"7z a game.7z /path/to/game/folder/Crawl/*\n"})}),"\n",(0,i.jsx)(s.h2,{id:"step-3-naming-the-archive",children:"Step 3: Naming the Archive"}),"\n",(0,i.jsx)(s.p,{children:"Before naming the archive, take a moment to research the game you're about to add. Ask yourself questions or use a search engine to answer the following questions:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:'"What version is the game?"'}),"\n",(0,i.jsx)(s.li,{children:'"What year was the game released?"'}),"\n",(0,i.jsx)(s.li,{children:'"Is the game still in early access?"'}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:["Once you have gathered all the necessary information, you can name the archive using the ",(0,i.jsx)(s.a,{href:"/docs/server-docs/structure",children:"GameVault Naming Structure"}),"."]}),"\n",(0,i.jsx)(s.p,{children:"In our fictitious example we have a copy of Crawl Version 1.0.1 released in 2014, so we named the archive:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"Crawl (v1.0.1) (2014).7z\n"})}),"\n",(0,i.jsx)(s.h3,{id:"adding-the-same-game-multiple-times",children:"Adding the same game multiple times"}),"\n",(0,i.jsxs)(s.p,{children:["If you wish to add the same game multiple times to your GameVault server for any specific reason, it is important to ensure that you rename it slightly differently. This is to prevent the indexer from detecting it as a duplicate entry. We recommend using square brackets ",(0,i.jsx)(s.code,{children:"[]"})," as your personal discriminator for these games. Avoid using regular parentheses ",(0,i.jsx)(s.code,{children:"()"})," as they will be removed by the title extraction regex. It also does not matter if the files are in the same sub-folder or in different ones."]}),"\n",(0,i.jsx)(s.p,{children:"By using this approach, the indexer will treat these two games as separate entities."}),"\n",(0,i.jsx)(s.p,{children:"In case the Auto-Matching feature does not work accurately for these games, you have the option to manually remap them in the client if you have the Role Editor or higher privileges."}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Here's a good example:"})}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Game 1: ",(0,i.jsx)(s.code,{children:"Minecraft [Tekkit Modpack] (v1.7.10) (2011).zip"})]}),"\n",(0,i.jsxs)(s.li,{children:["Game 2: ",(0,i.jsx)(s.code,{children:"Minecraft [Hexxit Modpack] (v1.13.2) (2011).zip"})]}),"\n"]}),"\n",(0,i.jsx)(s.admonition,{type:"info",children:(0,i.jsx)(s.p,{children:"Will result in two seperate games"})}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"And here's a bad example:"})}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Game 1: ",(0,i.jsx)(s.code,{children:"Minecraft (v1.7.10) (2011).zip"})]}),"\n",(0,i.jsxs)(s.li,{children:["Game 2: ",(0,i.jsx)(s.code,{children:"Minecraft (v1.13.2) (2011).zip"})]}),"\n"]}),"\n",(0,i.jsx)(s.admonition,{type:"danger",children:(0,i.jsx)(s.p,{children:"Will result in a single game that gets overwritten!"})}),"\n",(0,i.jsx)(s.h2,{id:"step-4-deploy-",children:"Step 4: Deploy \ud83e\udd73"}),"\n",(0,i.jsxs)(s.p,{children:["Once you have named the archive, place it into the folder on your host system that is mounted to GameVault's files folder (by default ",(0,i.jsx)(s.code,{children:"/files"}),"). Once the archive is in place, GameVault will automatically index the game, enrich it with metadata, and save it in your database."]}),"\n",(0,i.jsx)(s.p,{children:"Congratulations! You have successfully added a game to your GameVault server. Repeat the process for any additional games you want to add."})]})}function c(e={}){const{wrapper:s}={...(0,n.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8591:(e,s,t)=>{t.d(s,{R:()=>r,x:()=>o});var a=t(758);const i={},n=a.createContext(i);function r(e){const s=a.useContext(n);return a.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function o(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),a.createElement(n.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1630eae8.3f96a97e.js b/assets/js/1630eae8.6da541e8.js similarity index 99% rename from assets/js/1630eae8.3f96a97e.js rename to assets/js/1630eae8.6da541e8.js index 3c165cc27..8d1446f7a 100644 --- a/assets/js/1630eae8.3f96a97e.js +++ b/assets/js/1630eae8.6da541e8.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[2858],{6112:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>A,frontMatter:()=>a,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"server-docs/setup/truenas-scale","title":"Using TrueNAS Scale (since v24.10)","description":"TrueNAS Scale is an open-source, hyper-converged storage platform that combines the reliability of TrueNAS with the versatility of Linux, providing a unified solution for storage, virtualization, and containerization in a single, easy-to-manage system.","source":"@site/docs/server-docs/setup/truenas-scale.md","sourceDirName":"server-docs/setup","slug":"/server-docs/setup/truenas-scale","permalink":"/docs/server-docs/setup/truenas-scale","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/setup/truenas-scale.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"sidebarPosition":4.2,"frontMatter":{"title":"Using TrueNAS Scale (since v24.10)","sidebar_position":4.2},"sidebar":"docs","previous":{"title":"Using TrueNAS Scale (prior v24.10)","permalink":"/docs/server-docs/setup/truenas-scale-legacy"},"next":{"title":"Using UNRAID","permalink":"/docs/server-docs/setup/unraid"}}');var n=s(6070),o=s(8591);const a={title:"Using TrueNAS Scale (since v24.10)",sidebar_position:4.2},i=void 0,l={},d=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Step 1: Log in to your TrueNAS Scale Dashboard",id:"step-1-log-in-to-your-truenas-scale-dashboard",level:2},{value:"Step 2: Configure User/Storage for GameVault",id:"step-2-configure-userstorage-for-gamevault",level:2},{value:"Step 2a: Setting your GameVault Admin user",id:"step-2a-setting-your-gamevault-admin-user",level:2},{value:"Step 3: Navigate to Apps and Disover Page",id:"step-3-navigate-to-apps-and-disover-page",level:2},{value:"Step 4: Select "Install via YAML"",id:"step-4-select-install-via-yaml",level:2},{value:"Conclusion",id:"conclusion",level:2},{value:"Additional Info",id:"additional-info",level:2},{value:"Stopping the Server",id:"stopping-the-server",level:3},{value:"Reading the Logs",id:"reading-the-logs",level:3},{value:"Troubleshooting",id:"troubleshooting",level:3}];function g(e){const t={a:"a",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://www.truenas.com/truenas-scale/",children:"TrueNAS Scale"})," is an open-source, hyper-converged storage platform that combines the reliability of TrueNAS with the versatility of Linux, providing a unified solution for storage, virtualization, and containerization in a single, easy-to-manage system."]}),"\n",(0,n.jsx)(t.p,{children:"Since the release of TrueNAS Scale version 24.10 (Electric Eel), Docker is now used to run apps on TrueNAS Scale. With the use of Docker Compose, setting up a GameVault Server on TrueNAS Scale is quick and easy!"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsxs)(t.strong,{children:["If you are using an older version of TrueNAS Scale, please use the legacy documentation: ",(0,n.jsx)(t.a,{href:"/docs/server-docs/setup/truenas-scale-legacy",children:"TrueNAS Scale - Legacy"})]})}),"\n",(0,n.jsx)(t.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"a running TrueNAS Scale Server (version 24.10 or newer)"}),"\n",(0,n.jsx)(t.li,{children:"an understanding of storage/users in TrueNAS Scale"}),"\n",(0,n.jsxs)(t.li,{children:["a docker-compose.yml file that you have already configured by following the ",(0,n.jsx)(t.a,{href:"/docs/server-docs/setup/docker-compose",children:"Using Docker Compose"})," and ",(0,n.jsx)(t.a,{href:"/docs/server-docs/configuration",children:"Configuration"})," pages."]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"step-1-log-in-to-your-truenas-scale-dashboard",children:"Step 1: Log in to your TrueNAS Scale Dashboard"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Step 1",src:s(9558).A+"",width:"1919",height:"943"})}),"\n",(0,n.jsx)(t.h2,{id:"step-2-configure-userstorage-for-gamevault",children:"Step 2: Configure User/Storage for GameVault"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Configuring User"})}),"\n",(0,n.jsx)(t.p,{children:"By default, GameVault will try to run as user ID 1000 and group ID 1000. However, this will not normally work in TrueNAS Scale. Instead, you will need to specify which user/group ID GameVault should use. You can create a new user, or use an existing one!"}),"\n",(0,n.jsx)(t.p,{children:'In your docker-compose.yml, file add the PUID and PGID variables to the gamevault-backend environment variables.\nFor simplicity, we will use the "apps" user/group which is built-in to TrueNAS Scale and uses ID number 568 for both PUID and PGID.'}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-plaintext",children:"PUID: 568\nPGID: 568\n"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Configuring Storage"})}),"\n",(0,n.jsx)(t.p,{children:"GameVault expects three directories:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"a directory where your games are located - mounted to the /files directory internally"}),"\n",(0,n.jsx)(t.li,{children:"a directory for GameVault to store the database files - mounted to the /var/lib/postgresql/data directory internally"}),"\n",(0,n.jsx)(t.li,{children:"a database for GameVault to store its media - mounted to the /media directory internally"}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"These directories will need to be created before you can deploy GameVault on your TrueNAS Scale server.\nIf you have not yet done so, create the needed directories before continuing, and ensure your chosen user has read/write access to all three of the directories."}),"\n",(0,n.jsx)(t.h2,{id:"step-2a-setting-your-gamevault-admin-user",children:"Step 2a: Setting your GameVault Admin user"}),"\n",(0,n.jsx)(t.p,{children:"You can specify a username that will be given the Admin role upon registration in GameVault. Add the following variable to your docker-compose.yml file under the gamevault-backend environment variables. Set it to your desired GameVault username, and your account will be given the Admin role once you register!"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-plaintext",children:"SERVER_ADMIN_USERNAME: YourUsernameHere\n"})}),"\n",(0,n.jsx)(t.p,{children:"Make sure to register your admin account using the same username!"}),"\n",(0,n.jsx)(t.p,{children:"When finished, your docker-compose.yml file should look something like this:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-yaml",children:"services:\n gamevault-backend:\n image: phalcode/gamevault-backend:latest\n restart: unless-stopped\n environment:\n PUID: 568\n PGID: 568\n SERVER_ADMIN_USERNAME: YourUsernameHere\n DB_HOST: db\n DB_USERNAME: gamevault\n DB_PASSWORD: YOURPASSWORDHERE\n volumes:\n # Mount the folder where your games are\n - /mnt/yourgames:/files\n # Mount the folder where GameVault should store its media\n - /mnt/GameVault/media:/media\n ports:\n - 8080:8080/tcp\n db:\n image: postgres:16\n restart: unless-stopped\n environment:\n POSTGRES_USER: gamevault\n POSTGRES_PASSWORD: YOURPASSWORDHERE\n POSTGRES_DB: gamevault\n volumes:\n # Mount the folder where your PostgreSQL database files should land\n - /mnt/GameVault/database:/var/lib/postgresql/data\n"})}),"\n",(0,n.jsx)(t.p,{children:"You are now ready to deploy GameVault!"}),"\n",(0,n.jsx)(t.h2,{id:"step-3-navigate-to-apps-and-disover-page",children:"Step 3: Navigate to Apps and Disover Page"}),"\n",(0,n.jsxs)(t.p,{children:["Go to ",(0,n.jsx)(t.strong,{children:"apps"})," -> ",(0,n.jsx)(t.strong,{children:"discover"})]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Scale-EE-Step-3",src:s(5832).A+"",width:"1457",height:"695"})}),"\n",(0,n.jsx)(t.h2,{id:"step-4-select-install-via-yaml",children:'Step 4: Select "Install via YAML"'}),"\n",(0,n.jsx)(t.p,{children:'Click the three dot icon next the the "Custom App" button:'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Scale-EE-Step-4",src:s(9095).A+"",width:"149",height:"54"})}),"\n",(0,n.jsx)(t.p,{children:'Then, select the option to "Install via YAML":'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Scale-EE-Step-4a",src:s(4126).A+"",width:"158",height:"100"})}),"\n",(0,n.jsx)(t.p,{children:'In the pop-out window, enter the name of the custom app: for this example we used "gamevault-backend"'}),"\n",(0,n.jsx)(t.p,{children:'Then, paste the entire contents of your docker-compose.yml file into the "Custom Config" section:'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Scale-EE-Step-4b",src:s(2901).A+"",width:"768",height:"724"})}),"\n",(0,n.jsx)(t.p,{children:'Make sure you have all your needed changes per the rest of the documentation, then click "Save".'}),"\n",(0,n.jsxs)(t.p,{children:["The system will automatically do all the setup and return you to the main ",(0,n.jsx)(t.strong,{children:"Apps"})," pages when complete!"]}),"\n",(0,n.jsx)(t.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,n.jsx)(t.p,{children:"You have now successfully set up your GameVault Server using TrueNAS Scale!"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.a,{href:"/docs/server-docs/setup/#what-next",children:"Click here to continue."})}),"\n",(0,n.jsx)(t.h2,{id:"additional-info",children:"Additional Info"}),"\n",(0,n.jsx)(t.h3,{id:"stopping-the-server",children:"Stopping the Server"}),"\n",(0,n.jsxs)(t.p,{children:["To stop the GameVault server, navigate to the main ",(0,n.jsx)(t.strong,{children:"Apps"})," page, and check the box next to your running instance of gamevault:"]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Scale-EE-Stop1",src:s(7437).A+"",width:"703",height:"342"})}),"\n",(0,n.jsx)(t.p,{children:'Then, click the drop-down menu for "Select action", and choose "Stop All Selected"'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Scale-EE-Stop2",src:s(7110).A+"",width:"175",height:"250"})}),"\n",(0,n.jsx)(t.p,{children:"This will shutdown GameVault and the database."}),"\n",(0,n.jsx)(t.h3,{id:"reading-the-logs",children:"Reading the Logs"}),"\n",(0,n.jsx)(t.p,{children:'Navigate to "Apps" and choose the GameVault-backend App you have created.'}),"\n",(0,n.jsx)(t.p,{children:'Under the "Workloads" section, you will see two "Containers" running:'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Scale-EE-logs1",src:s(638).A+"",width:"343",height:"116"})}),"\n",(0,n.jsx)(t.p,{children:'Click the "veiw logs" icon next to either the database container (db) or the gamevault container (gamevault-backend) to open the logs:'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Scale-EE-logs2",src:s(2117).A+"",width:"346",height:"95"})}),"\n",(0,n.jsx)(t.p,{children:'In the new window that opens, choose the number of previous log lines you would like to view (500 is normal), then click "Connect":'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Scale-EE-logs3",src:s(6204).A+"",width:"574",height:"392"})}),"\n",(0,n.jsx)(t.p,{children:"You will see the previous number of log lines up to the number you entered, and all new log entries will appear as they are written!"}),"\n",(0,n.jsx)(t.h3,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,n.jsx)(t.p,{children:"If you recieve any errors while trying to save your GameVault configuration, be sure that all indents/spacing is correct YAML syntax.\nYou can try a few things to ensure proper formatting:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Use a text editor that maintains indents properly, such as Notepad++"}),"\n",(0,n.jsx)(t.li,{children:"Copy the example docker-compose.yml file from above, paste it directly into the configuration window, and add your changes directly. This can help ensure consistent formatting."}),"\n"]})]})}function A(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(g,{...e})}):g(e)}},5832:(e,t,s)=>{s.d(t,{A:()=>r});const r=s.p+"assets/images/Scale-EE-Step-3-cd6b7b7f6b38297a5ed5b932453bdae9.png"},9095:(e,t,s)=>{s.d(t,{A:()=>r});const r="data:image/png;base64,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"},4126:(e,t,s)=>{s.d(t,{A:()=>r});const r="data:image/png;base64,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"},2901:(e,t,s)=>{s.d(t,{A:()=>r});const r=s.p+"assets/images/Scale-EE-Step-4b-baaa680295deacd56edaa6c243a71e10.png"},7437:(e,t,s)=>{s.d(t,{A:()=>r});const r=s.p+"assets/images/Scale-EE-Stop1-2eef156d34b62e4d675eac577c2b0c67.png"},7110:(e,t,s)=>{s.d(t,{A:()=>r});const r="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAK8AAAD6CAYAAADX0RcxAAAgAElEQVR4Xu2dD0gb3dfnvxURCSLZEkQkBHGDiIiIBJESRIqIlCIiUopIkSJdKaWUUkSKFCl9i4gUKUX6llLkQYorIvJQuiLFVyQUEXFD1xXpI75BRMR1SxBXguRn99xJJpkZ8/+PzSRnHsqjycydc8/5zLnfe03OvWaxWH6DD/aADj1wjeHVYdTYZMkDDC+DoFsPMLy6DR0bzvAyA7r1AMOr29Cx4QwvM6BbDzC8ug0dG87wMgO69QDDq9vQseEMLzOgWw8wvLoNHRvO8DIDuvUAw6vb0LHhDC8zoFsPMLy6DR0bzvAyA7r1AMOr29Cx4QwvM6BbDzC8ug0dG87wMgO69QDDq9vQseEMLzOgWw8kDG//hyXcsQb77XaMoPPFYlhH9H+YQ9lsJ17gJea6DtD54H1Ep0ntYwY3o5ynaqT/A+bKZiPaodtIseGXPJAEvH4YJV778WGpHhs3HyAckvHBS+19ADbQ6gM+/DOB1pdz6DroRDyMMwfZ4YHUwTtXhtnOF1hUZr/WYJYNBa8Ab7BmEyPiOqU/qY0PeED/aTIpvb7kT/c7Mzel97W/BzKv4lzs+DO4sK2ebmS1wkj/k9qgp02ywy5eccMxEvlhyY6wZ0cvkoBXLRtkEBAjvO8PWylfvw85xPeLtPtAZHHKwPJDofq5FS/nunDQ+QC7yswbuHeF4joaF0iC1G/4YW899D0sgQcL6ntIt44sabIj9PrvRRLwKmWDAMT/e4UiW4bLvIN2VeZTu1FIkDsIyml/NgyjlVWyQYbXYVfravn1g66gJlbYFsy8lHujaHf9hzx7epBCeIPZLTB0R5QNu4Hsqcpz2klX2Gzqe1gcdoXmjSHzXraNMm8g2yozffYEOVt7kgS8atkQ0JU0yXo5NwhJQorDrzd9qxM7mBk5RKu82iDgHizFYmCiJ7JuKw5VulMxGdRqXoVelTVwVM0rr0bID9bsLlorujCo1NKsGnTBe8Lw6qJ3bGRWe4DhzerwZnfnGN7sjm9W947hzerwZnfnGN7sjm9W947hzerwZnfnGN7sjm9W9y4heEtLS7PaKdw5tQcODw8z0iUJw5upHcpIL+vYKJGoMjXWDK+OwboK0xneq/Ay3yMtHmB40+JWbvQqPMDwXoWX+R5p8QDDmxa3cqNX4QGG9yq8zPdIiwcyBl7p47O+LzGI49q1a4lt35oxHUpLuLhRpQcyJtYKeAW4EsCJbJydMR1iztLugYyJNcOb9lhn3Q0yEV7hZPHNGc68WYdbajuU0fD+u8Xy+9/i7G/GdChOu/n0+D2QMbHWTNikzMvwxh/QXLqC4U0m2uKJe1iOvAsXJrSVdZJpNx3XStnBhkJ4sJ4llXcYXgkUzVfixUtux+VST1qoUgSvKCzSTZ/kPN9IYV0zYZuv0aiFA9PxrFxFmwwveVnUbbhlArybvmqSUpUaWyHgWY8MMMMbhlEL2l+P4UkjOTXCcbw6jmfP/8ZegqQzvH54m4qA0xVfcbvLCVYudud/R87Kl+C9nMGDJZouvyeE/UZ9uAIpQSu0JVuVo4KyHJR0hSikslEfKPLna4UKqtzcQP1SE4pwihWpkIq2dJW6uN/D8kIYzIXIl82QCwLGDFoJbr18h2d2H8Dy4v3v37+l348dY3j04iuOYm7v8okMr/CJZraokgyiEo6PbF89XuXvs2UqzVtBGVz5EAjo5N8FpMHsTsX2lm7BBC82SX8edKmvU4WJbHtpo1d+vcAL6faKc0UlSl+j0ggh7h+4B9U+U9ktwSrDO4syqhxUQ2QefxUPrHiwHqI87wKuCV+ZqkE79Rkugl57bjy0qQGWr0wFuKIthlcTC21hO5GhfCVGNYfIvgKmwITNAbuylJTidLdjEZs1jQE4tDV9VUBeyvwh9LiUYG9itmwOD8vzcOGauFzRUvvQqeDVZmFfKVW5LdFnZbuR7YsGsxrgVIHL8Ibzu0IO7B7bYVXoYW1WDK42HKBLkU3VgIqsF8y0ccGrgTB8NtdUuY4Er6jJNlhDkuAYX/212NIHr/CYD+BeTCYtFZT+58zr137l5JVTfwlRX2FpaUz16UfF0CwKVAeG4xCyQTnxCw8aVMN0JNmgsuWBqF6pGO41soHeDGbMJGVD6jJvtMyc+PuZCG/ggzlX90eKyEtllyZFgWU0qn++dNdXr3dnmjSxS12Fkl6OOGGbJr1JJUxV7Uvt0IuBQ2vbOb0j/h1imrKmK1A53X+BfL1Kx+/QueuwLTVLE7Zluk5Udw/YHrg0aE+/eJpdvgLbD0hLNwvZv+x7P1MOhjdTIsF2xO2BTIRXdII/zxt3KHPvgoyBN4Tr+VNlucdjXD1meONyF5+cSR5geDMpGmxLXB4oKSnB0VEyf6OL63ZxncyyIS535d7JWQdvJnco9/BKb48zOdYJZd5wHZI/EJJed3LrV+UBEU9Z88p/GIj33oleF8t9koaXgY3Fzfo8JxXwKnueapAThleUvUy1MfoMcfZanWp4Uw1y3PBeXFwkPZRkb7izq2fphFf+K1kyHosZXlkeKDuUzI35Wn14IFnNG0svEx3BY4JXqWtleGMxis/JDg+kujJ6KFgTATgqvKEmZOK1/Pz8wL/sCBH3It0e8Hq9kP+lAuC44ZXBLSykL0/ywR5IwAMej0eCWAtwvNk3Irzhsq4AV2RePtgDiXhAgCsATjb7hoU33PqteL2oSHxxkA/2QOIeOD09DbvUGmsGZngT9z9fmYQHrhxeORtz5k0ianyp5AEBrziSkQ4hM284rSv7neFlApP1gAxvMgDHBK/yDxTiSWF4kw0dXy/gFVwFvgnsL9UveyYW3RsVXu0fKBheBi8VHtDCq83ACcGrlQzKrCvfgDNvKsKX223I8CqhjXfd91LmjQSvaFys0RmNIUoz5XYsuPdxesDtdkt/K0hGOlyCV3xqLNLB8MYZJT49pAdCwRuvdLhWVVXlq4epOWSItTCL3wsKCjgk7IGkPBAPvAaDIeS9VPBqJ2fiCqXmFT+LfwxvUnHji8kDAt68vDxf5RvFSkOon1MCr/C6kA38oRzmL1kPMLzJepCv/2MeUMIbbsVBzsJJZV6lnODM+8finVU3DgdvKJAZ3qwKvf47w/DqP4Y52wOGN2dDr/+Oy/DKMiHUKgNrXv3HOSt7kHZ4tZ9r4KWyrOToj3RK1/CWVDWhoaYMxsJ8XHg9ODnYxNrKtrThXUVTF24YdjG1sBG/Y+vb0FNxhu+zK9gNd3VNC+7WFcG1NI/Vg+BJ4r712MDsyi7q23pQcjSFSyaUVKGpoQZlRvoe3wV9F+vkAJtrK9iOWAW0Hm09VCp0aoFaT+SoQFPXDRh2Q9gTpbmw/UjEjBReo194yxrR3mzG2Q8Hvm8eIt9cg4bGWhS6FvFl/TjN8BpQ29qO6uu0c+y+A/OO/UBIosNbhsb2ZpjPfsDxfROH+WbUNDSittCFxS/rtGlVuIPh1XpGv/BWU+ar9mJ9dpk2PfUdZXXNBMEhjow2VMvb6Xr2fBm0pBYt9mqUGOgby94zHG058O0HpbqKJnTVF8HtKUIJXbt/VAKLRf5K/jG2QmU6Qy1a2y1w//SgwuKBY94BGd/o8Faj5W41vOuzWA4ajubaQhwurGKb+lFS2wJ7dQkM+RfwHG5h5dsPGk3U8BqsjbhZV06jTh7O3bvYWFrFzhldbLCgoakBFSbK6jQauV1OLK0Wo6mnmnby9B2eve/SyBC+DSsab9ajwliAC88hfp2XIm8//oydwiQbsin9wmuoQUt7LYzun3Cub2HnWEROPXwHZYMJttutKD9dw+LyAQy2ZjRXeOCcWcK2gPdGCdxOXwaXWokiGwz0fofFjeX5U1TfrcL52iyIBemIDq8BNS3tqDW68dO5jq2dY9895aPCjs6G6zhaXYbjVwmaW2woPljB36ulQdlgqkNbixUX2w44fgLVTc2wen9g+tsWKptJthj24HCs4ZfBhqbmcng26EH5qZENEdqobrmL2oIdLC+v4+y6DTfsVcBPhlcKUcr+wlZCGaK+BuVG+sSQ9wQH2+tY9wOo1rwGmEqLgZNDSIxTUG91mnAosqqUeYENpb6NCK/vQTAfL2OexG4NBbrKSxp3mSiKCV5xVgmsjfWoKTfCQPsanxxsY32dJATZVm7vRGPhTwJxU2rPYLuFTtMhaXcE4a1rQ3e5eHhWIcltazO66i6oDwewUGfyNmewJFI4HcUmMwrO93F8ooE3jjZyRvMqk4j46GOoz/amDF75ZgYTLBXVqKPJ2/n2Nyw4L2teeXJXTJO7POk6vySIF15TA263leHYP1Ez1Laivcrry+IxwxswHCZLBarraPJ2vo1vC05YaJIXkDzyaZL0OUWlf8LmFpPRgLSRTxL9OUJJTwXOvgdHAkVKV03YpIc7xjayGt6GhobfkT6AroVYrjWlBD3en2V9u7DqTzF+cGSpoM68lWimjFToImmwvo8TSSoYsJtA5i1r7MBNq7ZgiheHzmmIZBlVNpTVqfStP10H7DkRw37eJmbk1BlwTFDzbotsXHqMhS9rmgmeyK425MeQeaWMHrINq+QrZfbOanitVmvcH0YP90GJWCE20FJVe00R9kmrbmzTHN1URROVeph+rUtDuBh+7cV7mPtKug2kj0mbwrmIb8R6eWMTGq1eknFhZIMYUq0erCkmgz67zLB3NMMkJENghcG/8oAt/L34A6XRlsokrV6Don0nHBvbBJ8JVQ1NqDf9kiafPytJAtQbcbi+BAdN6My2BtTk72Bh9bpC89pwu7Uc5zTpdDhPYKiywUYgri5voUSleetgJ716sUUP1lY57J12FO/N4es66RNTtDZcuaF5lfBG+zC6QEBk4mThJTWI0roGNFhLUSSkAH1G+NS9g42VdewJXWumpTS7FcXnLjjmHDijGXxTdSkK8+i8g2NcmIvxyzEHR14IzSsAu12L0vxf2Py8AKf8RJnt6GgyYn/xC2g1LngI4GyF2J1fgNsWfZ3XUFqHhgYrSotoRYDs8Z66sbOxgnXJcAMstibYrNdptUEsjBxhy/ENP47Uqw3KNW6vxw2XcwmrYrkh5GrDjjQpNDe2w24txjmNQHMOF8K3kUOrDX8G3lhzNJ+XrR5IyVIZw5uteGR2vxjezI4PWxfBAwwv46FbDzC8ug0dG87wMgO69QDDq9vQseEMLzOgWw8wvLoNHRvO8DIDuvUAw6vb0LHhDC8zoFsPMLy6DR0b/sfgFTuB88EeSMYDe3t7UolTcYQrcxq16EgiH8xheJMJG18rPMDwMge69QDDq9vQseEMLzOgWw8wvLoNHRvO8DIDuvUAw6vb0LHhDC8zoFsPMLy6DR0bzvAyA7r1AMOr29Cx4QwvM6BbDzC8ug0dG65reKvbB9DXWQ+zgT5Z5D2lonvz+Dj6N5W8A5oHPuChyYE7A3+lOMr1ePRuEDd+TaP7xZyi7XsYnanB5p0B/AXlz+rbR7I5rKHNA/jQDXx+MIrlRHpzbxQz9mNMxHt9svdNxNY4rtEvvPUP8XawDsfT7zAx9wMFVOCu78EdGFcH8fTTbvrgbXiMiSeNMNJWK/OPhzATKLgXA7xRbGZ44yCXTtUvvB3DmLp9hk99o1jy97m++zm6jE5sl/fidrn/Rfe6L+OUteLxs27cMBuooiSV1F+cxPjkdyox2oyBDz0wHZ6gpNIMQ54HByuTePVuKeTmJg2PJ/CoeBVrpW0oXXmMoQC9McAbwebnE1+p7OhNPHp+D3Zho+cAK5Ov8G6Jng5NBqy+M4wnHdUw0p4V7q05jA/PSKMNqtvx/NFd1JlEeUk3tubHsVz+BA9tRr8zXPgijQzVuDP8BB3VRtqNiM6bG8fwjNQCpLY7qW3hh+1DFFHp1Kl4M3Z8DCZ8tn7hNXXi5fhdmPcWMPXxbyztqvfRUcuGCtwbfYVWLGJ0dBLH1Q/xrN+G47/u4/WCgPchrPvTeDcxh+P6AQz3VcH1Sbyn9as49wGKFroxX/YOg5Y1PCRZ4rtzDPBGtLkC3a9fosX7BeNvvwG3BzDQcobZnmHMK+FtfooP/eXYnhjBm50aDAzfh9k5iscTbtx/M4LG40mMfPgKj+jH/VKsPn+KT3a1bGh++gH95duYGHmDnRpxnhnOURpR4BvNDj8O4/VGIW7dH0SvdSd+uZEwjvFdmHJ4lbeXq6Vrq6aL31PyYfTqVjzs7sANqwl5Z/twfpnEJ5IQAiYVvKZejE7YsDfyCO/8m5jdGvoLdzGNe6/OJHhNjjvwyWMTekcncOPwLR68cai92fYcn+4V4kv3C8zVU1uDFdgYJDikzVRigFdKbeFs7sbrmRs4CNh4EwMf74LSHkYR1LxeAu+hcSGgt029o5io3sSd0TzqYy12yJ4Pkj0mVNSWAQc/sHtLCa8dT6m/RnoAfZLd19/qzTsYzaO2ancwSPeQmsgFzZtIWf/ki0sruDJVoJEqgnd31OL06ws8/6zRvCIID01wSEOm7wjCvaeB1/deNz7jweiyCl4BfE/BvB+cBsp2z1DuJI0t0RIjvHKLWpsPushGG2lp9eH6Qg/VXhBey+hMUBLJpwpp9Bno1vQx0JJqwibsvI1yzX3c6xPU4271JDcX4K2qqgpb1j/chiolJSXxjRGas2V9K2nFS0D+FSLzKrMSEH/mJZnymXb+ITmpOo5WMPLoHe1KGR3eiDZfypyKuyggyhv4iN6CORoxgv32nSnuXxdD5hUZvRcFc/egbULK4rmWeZXwasv6h9t7OFl4TZ0vMd51HRtTb/DXV8p8Fbdwf7AXVa5PuE9i1U5D3+PS76RJSeMiXs1rxc4EDdeKxGu68wpvO6BeYRArD8+qsD1GWnEtOryRbf4paVb72TzGxz/joJj601+Hn+9eY75CsVQmSZcybE6+xptFwHb/Abryv2Hww4Fa81Y/xeBD0sZCy1a9xsxNN977J7dtzz/hXtkmJl+/oVmADfcfdCH/2yA+HNzHm5FGHOeS5v0T8AqtVtv9AH0tNbS3A6XDi3Mc73zD1PgkvgvR20BAPW1G6ckq3j54A0fE1QaasHn2UVASbrXBhDuv3qLt7C/pwQgeFT5gDidIYlhiWOeNYjOtFgz0daJerDZcnGHf8Rdei1UP1fBtwo3eJ+htraTVBrGosIX58WFIiwUhVhukVQSaKA6/uYvqwh3M33mOz6Yb6H3Si9ZKWm2gfeDcW/TA+Fcscm614c/Am5TqUI7JlzRvqlrmdtLrgZSsNjC86Q0Stx7aA/HAK2SqXONB2do1fcPLaOjVA/HAG251i+HVa/R1bjfDq/MA5rL5DG8uR1/nfWd4dR7AXDaf4c3l6Ou87wyvzgOYy+YzvLkcfZ33neHVeQBz2XyGN5ejr/O+pxxepT/ExyHT9ZFInfudzU+BB1ICr8ViUX2eNxSwwlblNyuMRu3HrlPQG24ipzyQkg1VtPCG+gyveE1+XUDM8OYUZ2npLMObFrdyo1fhAYb3KrzM90iLBxjetLiVG70KDzC8V+FlvkdaPMDwpsWt3OhVeIDhvQov8z3S4gGGNy1u5UavwgMM71V4me+RFg8wvGlxKzd6FR5geK/Cy3yPtHiA4U2LW7nRq/AAw3sVXuZ7pMUD+oW3ogldNwzYnVqgCo3+I9RraXFbqEYr0NRVD2zMYkUqbhvPUYOWu3Uoci1hfvUgeKHoj9TkCnaVP6uaNsBia4LNeh2G/Dx4aW8O984GVtb3cBbBhIqmLtST52bjN1ZqVVx/w7CLqYWA92PrcH0bekqO4r8uROsMb2wuj+GsxOE11Laivfo6QMX+HPMO7CsfxmjwVrfgbm0hXKsrWHV5YbLWotFmxik9RMs/w5vN8Pp8c+2PfCQyWuaVMlUR3B4DTMZC5J27sbuxhNUdkY8MsDbeRH2FEQUXHhz+OkdpsRvfRYYTmcF8gcOC6yg9/YmplRM03qxDObWR7/XA7XJiaXXHl9VKatHSVI3Swjycu49wWmiUoJGSmcEauE59by1QBtS2tsPi/glPhQUexzwcMr0xZN7Sxna0XD/A3Nf1QKataqT9Mjw/sOw8IDMacbOuHEbJxl1sLK1CuEAFb1hbKas3NKGhwoTCfC88bhecdH1xUw+qTf5+ePZ8fovQxiVf5+1z5o0oGyS4S+B2OvB98wxlzS1oMP3C+uwyflY2S2Dvi2x1ZICtqRlVRQdBeCvzsSNlshNUUsX1eoMLy8sER1kzWhuLsLfwBWvHZWhsb4b5ZA2LywcoqGpAU70Jx6sCXhPq2lpgvdiGw0Hpr7oJzVYvfkx/8218ojwM9WjrsMC9PI/Taipefb4WHMpjgBfmRnQ0leNifxMbzk3snygaN9WhrcWKi20HfGY0w+r9gelvWwp4T8LbKvnJgD2HA2u/fH4q95DUoJSulg0R+iuNDAXYWV7G+tl12G7YUQVKCvHKjZySDdrMbLDhVqcFJ445HFi60FCwTUHc9LlEZNuKsyC8Ck1WbDKj4HwfxxIUVjR31eFCZNdD0V4pjiWQJRWo0LwETXe5BKRPwiqu0+hhk+02Ws3HWJ5fxUENBbrKSxqXHjCpyVg0LyV5Sx0aaq00elDB3jM3dpzfsU4PHlGJ7nK3r23JDIKx7kLS0GSsX/MWh7VV+Kk+bxMzS9s+PxWbYC44xz45Qw1v+P5eaoM1rz+wkSZsl2RFEK7Tyh5UnH0PZrgI8BosNsqoVhipgLWvor8He98JXmgnjAp4pfcsKNRki+OtKagTjgkNt9tQduyfqBlq0dpeBa9zBhIvMcIbuA3BZa20oc5qwOEaPaRmmlRZLlmBLZrkumV4981hbT0q0fhJ0R8VvJKvQ/f3UhuZDm+o77Cl/GtA5XZ02ouxN/eVhiO/V0VmaSjEzucFOFOSeU2w3W6B5dSJlbVtHJ/REN9TgTMBb6TMe+m9EGOeeKmMhvybVhRp3vYeOn2jQgzwKvWt3Ex9mw+6r2dV6KR91Ba+rF3aUy6gedeva0aQoDHiHFt+DJlXGtWUo1CwDauQXcrsnWnw/vO///n9r//872h9+EGyum9iEXaDFycrbXj00deRlMMrDdONMB3TspAAK98s6SkrtvFtwYnjkJr3GKtichFN8wZkA+najmbaYHCJJmknKK65AXudEUcCXtK1ttutKD8NrXml9863SPM6cWKogs1GwV1dxpY7GFizvQPNJiEZgisMvpUHYOvvRfwojS4bzI0daDKfYWt1FU4SvMVmG27YK5G/s4gvrnLcbi3H+RZpXucJDFU22Ajm1eUtXA/IhhNfP0LZWqLWvHV20qsXW5JmLrd3wl68558o+n0RoQ1Xpmref/4heP/1f/F97A6GaZOPUPCKkKX628OG0jrcaKyCSQzpF16c/XLhx4pvNi1lLZqw0SIDDFFWG47d5zAVHmFJaENNZpBm6/UVMBZcwHNMKwpFpaDUDno+Iq82lFShqaEGZaFWKSR+zbB3NMG4T5CtKzdArCRdbUPh7jwW3LYY1nmLaeXkBmrKjSjKz8cFrYicHGxibWUbR8LEKlotqCmj1QbafcLjhsvpW3FRrTaEtTX0aoPkX5oottutKD53wTHngCtCGxm92vAf//N//f4vv/8PvNSRCdr+s1ybeXvfYPa2hRbQvdK/8/OfePz4TZixNEUvR/qDhaEU1rICuA/2AhlbnkWn6O7czBV4ICV/pPiP9bXf/89djDISb+ebo1gsHQjKht0hTPaW0WY9u/h0fxQrTU/xtqsEQ0Ov09u9SPAW0xrsjVqUXzdIu+F4Tnzrl1JG4UM3HkgZvP/5fhElz27RBlO0pZTLCEOBX/N6xzHfUR7Iur7Me06Z97FunMSGZqYHUghvF4bLJ7Bop/RLuvDgxAfvXOkUHltpv7CjRXQ+m5S8wEVHMhMGvVmVWnhpsvaA9G6XgJUy7M4srTYI2eCjF4udzzB1VbJBb5Fge+P2QMrhRcsLTA/YYSB4XQJesVT2JyZscbuCL9CbB1ICLxfa01vYs8PetMDLhfayA45M7wXDm+kRYvvCeoDhZTh06wGGV7ehY8MZXmZAtx5geHUbOjac4WUGdOsBhle3oWPDGV5mQLceYHh1Gzo2nOFlBnTrAYZXt6FjwxleZkC3HmB4dRs6NpzhZQZ06wGGV7ehY8MZXmZAtx5IC7yhyj0JD6W66Ihuvc6Gp8QDKYG3oaHhdzhgZWiV78vFR1LSA24kZz2QEnj5O2w5y88f7Xha4L2a77D14d1CFxXW8x1ezxF+LnzA6/eOSxURtR5uGfqM+/iE7lffIji/BUOfn6F0KVgsMK5I3R3FfG8JHEO9GFsPXqm8d1g7THb0P+9HW6W/IvnRTyx8eI33DmVNs8vW9L1bQJ0zQXuReH+Tu29cXlWdrHN4b+JwrBuvvlFd2pYePHvUAnwbRP87f9HoMH5JP7wm9Ix9lOpXuL+PoHd0NWBJLPB2jcyjx+jA+KsxLHusaOl9hkcNR/h45wW+RIh1chAxvJJrry7zyvD6ImrqGcPH9rNAkE1tz/Cqj0rRUxGf071lfHw+hgVKXmp4a9AzMoiuGspy+AXn9GsMTjWqsvovx5iUpcO1d4knUw/GPtrh+nKCFvsxRnpHIeMbHd5aPPk4Cut6Dx69lzNtO56+qcevz8OYpCxe0zOCwa4aqmwJ/HJO4/XgFMTjqoLX1IZnr/rQ7Os8lj8+x5joPBXksj8axpM2qgtM+0ycusgvQ27cngqOYlH7K9p+TW1bqO1fTmyf1aFwNdGMn/OZV3aAkBLNOBjpweuDXoyP3oJ3bhQjX4Gu4SG0nU6hY3BWBW/L8yk8sW5i7MUIduqGMdJvxvpwH8bXNZmoMnx7Wveb+t5h0u7CcO8+7sy34+SdGB18Z0WHF2ikslhDdi9WZz5i8vNqcHcgqYHnmHpixebYC4zs1GF4pB/m9WH0ja8r4K1E7/gobnnnMOrrPIbaTjHVMUjVOl9ipu86VkZG8G6nFN/2qPUAAAaaSURBVP3kl5u/PuLOC49aJkXorzQyFC3g1fB7HFr7MTjYAXxheON4DAWo6sxLuSf4mnkcX5r3CaAxSJKzbRjT97z42P0KFCW/5vXi+dQTGL90YGBayt0kOaZQI+lGDby94dtTK+dKPHz/Bg07w+glsXt3dB6dHgGHb8CPBV4pO957jJ5btTCL5PZzAZ/evMcy7RLULB424xd0+AyGqf8dpmqcaKPSRMHMSw/al2bsD8t6uw3D0/fg/diNdfs0+vKn0TU07/O1uQYNRjfWNqvU8Ibt7zrs033In+6C3ERyciWOkGtOzRLNeznzrtk/45md9jZTHTuYbXsEVwDecpU8kE/1DZuC8eCETUAXrj1/8Xff5ZWP8P6tDTv+iZokZTo8mOwagsAlNniDRptrbuF23z3cNv3AeM9rlNOkTGhp1fHLgTEyWLwnTdhcQ/j8zI5LvafyW866Bdw89Mkg9aF+WMP314k6TdJgeON+AC9nXqXmXRUZqW4bj+n/2r30ggDlU0ZSZ5GgGepgShkuTHtK02005L9qoerpqsODH5O+7B4dXrW+9TUT7OulzKm4TwCi+X68m6rD9mP6v6bz4v79hTNRM2/4/ooszpk3blzVFyjhDbHaUPkQ798043SWNO+kC8aOfjyxbWNsaBZWxVLZ7Zcz6LNs0KRlhGbyjeh/dBcFC0/wdrmZJMUgyhz+iVOE9lwBwxoxMDmM6i2SDIEVBv/KA2bR92wKdYp7h171aMSzySE0HM/jzfhHrNJuPY39gxi8nY/Fp/2YqBSa1YKNj0MYISXS2P8IdwsW8OTtskrzCunSfDpLmncSLmMH+p/YsD02hNkatea9NziATu8MzQWOY+5vjfDZ9SXWvIkTrFnnPT3A5rdPGFOs89bQUP3obiOtNlD981PaCJACLmbcKmiUa6q0TdXx5ixG/LP3xicfaaJjhntlBD2vlxGuvSC7A5gcqsCagEyZ8cQkqf86FntJsvQH15jDLtmZb+PJ4B1aKSjx7zy5T5sfvsOrWbGmQHq4/zn62yql1QbP8SZmabVkit5SDd81pEnpQWyk1YZ82o/YtUx9GVugNfBQqw2+VZiY+8urDcbEueUr2QPkAR1P2Dh+ue4BhjfXCdBx/xleHQcv101neHOdAB33n+HVcfBy3XSGN9cJ0HH/GV4dBy/XTWd4c50AHff/yuAVPuIvYOqYlAw0/crgvTc6i+ofnRj4i7dvzUAOdGlSSuBd++ef38X/+pfkgJ3ZVvS/v8C1a9cC36gQrzO8uuQjo41OCbz/498sv//bv1M/W4cx86wEiy39+KDpNsOb0Rzo0jglvHl5eao+iOQpDvn/BoMhZB+v9Vksv2nPbOkQG2fXbbSgX0OvBO/RKorq6lBE+xI/evRIlw5jozPHAymHt+UFfdaT8u6dYRlnX2cFvLeKV/HuwSiWLy5gNPKnyjIHA31acqXw8oRNn5BkqtUphzesbBgj2eDk1YZMBUGPdqUE3pgmbASv/fAt+kaXab3XDlPJT3jPPXr0GducIR5IDby0VPZff/+W/gghlsoe0mRNFB6Ri49ImpfgbaKvWBcVFcHjoW/TToxgfYu+y80HeyABD4hijaenpxCrDNqVBnmVQV5pEL+HXW3QFtoTJ2vhle0TgIt/+fn5Esh8sAcS8YAAVwB8pfAKQ8VNxSEANtfacba3iXP/a4l0hK/JHQ8IdsTIrWQoVO9F1k0484bLvnJGDpWZ5aycO6HgnsbigVDZVYZTC2koyRC3bIgEr7ih/OTI58mdUL6nfHJi6SSfkz0ekOdLYnRWzp2UTMjvaTkJBXRcmjcSvPLToQRYCbFsTKRq69kTJu5JKA/IkzAZXC2gSqjTAq8wKhSAyhKo0QBVPnUc5tzwQLQRV4Ct/eyC0jOhVh/izrzRsm+4DJwbIeJeJuKBSDIinN5NSPPKxmmzqzabiqdInBOqKHUiHeRrsscDygwrMmoodqJl3aTgDbWyEEoORJIILB+yB8hwPYkkF0K9F4vWle+VkGxQTsS0AEYDMtr72R/O3O1hNN0bClxZNoTyWsLwKgGO9HPuhop7Ho8HlOCG+1nbXlLwxgItZ9p4Qphb50aTDdEyddLwagGW3R8N2mjv51YYs7u30SCMBnE476QE3nAAxwpydoeOexfKA/FO5FKuebUNcjZlUJP1QLQsrWw/ZZmXQU42bLl7fTzAXgm8oULBmTl3AZV7niioaZcNHBr2wFV6IG2y4So7wffKTQ+Eg/f/AytxQsmG2tqyAAAAAElFTkSuQmCC"},638:(e,t,s)=>{s.d(t,{A:()=>r});const r="data:image/png;base64,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"},2117:(e,t,s)=>{s.d(t,{A:()=>r});const r="data:image/png;base64,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"},6204:(e,t,s)=>{s.d(t,{A:()=>r});const r=s.p+"assets/images/Scale-EE-logs3-d090c6b9335baf3abadb45a30f7408a3.png"},9558:(e,t,s)=>{s.d(t,{A:()=>r});const r=s.p+"assets/images/scale-login-248c8e0a2719f7dc7db7893a7d97dc3b.png"},8591:(e,t,s)=>{s.d(t,{R:()=>a,x:()=>i});var r=s(758);const n={},o=r.createContext(n);function a(e){const t=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),r.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[2858],{6112:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>A,frontMatter:()=>a,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"server-docs/setup/truenas-scale","title":"Using TrueNAS Scale (since v24.10)","description":"TrueNAS Scale is an open-source, hyper-converged storage platform that combines the reliability of TrueNAS with the versatility of Linux, providing a unified solution for storage, virtualization, and containerization in a single, easy-to-manage system.","source":"@site/docs/server-docs/setup/truenas-scale.md","sourceDirName":"server-docs/setup","slug":"/server-docs/setup/truenas-scale","permalink":"/docs/server-docs/setup/truenas-scale","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/setup/truenas-scale.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"sidebarPosition":4.2,"frontMatter":{"title":"Using TrueNAS Scale (since v24.10)","sidebar_position":4.2},"sidebar":"docs","previous":{"title":"Using TrueNAS Scale (prior v24.10)","permalink":"/docs/server-docs/setup/truenas-scale-legacy"},"next":{"title":"Using UNRAID","permalink":"/docs/server-docs/setup/unraid"}}');var n=s(6070),o=s(8591);const a={title:"Using TrueNAS Scale (since v24.10)",sidebar_position:4.2},i=void 0,l={},d=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Step 1: Log in to your TrueNAS Scale Dashboard",id:"step-1-log-in-to-your-truenas-scale-dashboard",level:2},{value:"Step 2: Configure User/Storage for GameVault",id:"step-2-configure-userstorage-for-gamevault",level:2},{value:"Step 2a: Setting your GameVault Admin user",id:"step-2a-setting-your-gamevault-admin-user",level:2},{value:"Step 3: Navigate to Apps and Disover Page",id:"step-3-navigate-to-apps-and-disover-page",level:2},{value:"Step 4: Select "Install via YAML"",id:"step-4-select-install-via-yaml",level:2},{value:"Conclusion",id:"conclusion",level:2},{value:"Additional Info",id:"additional-info",level:2},{value:"Stopping the Server",id:"stopping-the-server",level:3},{value:"Reading the Logs",id:"reading-the-logs",level:3},{value:"Troubleshooting",id:"troubleshooting",level:3}];function g(e){const t={a:"a",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://www.truenas.com/truenas-scale/",children:"TrueNAS Scale"})," is an open-source, hyper-converged storage platform that combines the reliability of TrueNAS with the versatility of Linux, providing a unified solution for storage, virtualization, and containerization in a single, easy-to-manage system."]}),"\n",(0,n.jsx)(t.p,{children:"Since the release of TrueNAS Scale version 24.10 (Electric Eel), Docker is now used to run apps on TrueNAS Scale. With the use of Docker Compose, setting up a GameVault Server on TrueNAS Scale is quick and easy!"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsxs)(t.strong,{children:["If you are using an older version of TrueNAS Scale, please use the legacy documentation: ",(0,n.jsx)(t.a,{href:"/docs/server-docs/setup/truenas-scale-legacy",children:"TrueNAS Scale - Legacy"})]})}),"\n",(0,n.jsx)(t.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"a running TrueNAS Scale Server (version 24.10 or newer)"}),"\n",(0,n.jsx)(t.li,{children:"an understanding of storage/users in TrueNAS Scale"}),"\n",(0,n.jsxs)(t.li,{children:["a docker-compose.yml file that you have already configured by following the ",(0,n.jsx)(t.a,{href:"/docs/server-docs/setup/docker-compose",children:"Using Docker Compose"})," and ",(0,n.jsx)(t.a,{href:"/docs/server-docs/configuration",children:"Configuration"})," pages."]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"step-1-log-in-to-your-truenas-scale-dashboard",children:"Step 1: Log in to your TrueNAS Scale Dashboard"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Step 1",src:s(9558).A+"",width:"1919",height:"943"})}),"\n",(0,n.jsx)(t.h2,{id:"step-2-configure-userstorage-for-gamevault",children:"Step 2: Configure User/Storage for GameVault"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Configuring User"})}),"\n",(0,n.jsx)(t.p,{children:"By default, GameVault will try to run as user ID 1000 and group ID 1000. However, this will not normally work in TrueNAS Scale. Instead, you will need to specify which user/group ID GameVault should use. You can create a new user, or use an existing one!"}),"\n",(0,n.jsx)(t.p,{children:'In your docker-compose.yml, file add the PUID and PGID variables to the gamevault-backend environment variables.\nFor simplicity, we will use the "apps" user/group which is built-in to TrueNAS Scale and uses ID number 568 for both PUID and PGID.'}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-plaintext",children:"PUID: 568\nPGID: 568\n"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Configuring Storage"})}),"\n",(0,n.jsx)(t.p,{children:"GameVault expects three directories:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"a directory where your games are located - mounted to the /files directory internally"}),"\n",(0,n.jsx)(t.li,{children:"a directory for GameVault to store the database files - mounted to the /var/lib/postgresql/data directory internally"}),"\n",(0,n.jsx)(t.li,{children:"a database for GameVault to store its media - mounted to the /media directory internally"}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"These directories will need to be created before you can deploy GameVault on your TrueNAS Scale server.\nIf you have not yet done so, create the needed directories before continuing, and ensure your chosen user has read/write access to all three of the directories."}),"\n",(0,n.jsx)(t.h2,{id:"step-2a-setting-your-gamevault-admin-user",children:"Step 2a: Setting your GameVault Admin user"}),"\n",(0,n.jsx)(t.p,{children:"You can specify a username that will be given the Admin role upon registration in GameVault. Add the following variable to your docker-compose.yml file under the gamevault-backend environment variables. Set it to your desired GameVault username, and your account will be given the Admin role once you register!"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-plaintext",children:"SERVER_ADMIN_USERNAME: YourUsernameHere\n"})}),"\n",(0,n.jsx)(t.p,{children:"Make sure to register your admin account using the same username!"}),"\n",(0,n.jsx)(t.p,{children:"When finished, your docker-compose.yml file should look something like this:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-yaml",children:"services:\n gamevault-backend:\n image: phalcode/gamevault-backend:latest\n restart: unless-stopped\n environment:\n PUID: 568\n PGID: 568\n SERVER_ADMIN_USERNAME: YourUsernameHere\n DB_HOST: db\n DB_USERNAME: gamevault\n DB_PASSWORD: YOURPASSWORDHERE\n volumes:\n # Mount the folder where your games are\n - /mnt/yourgames:/files\n # Mount the folder where GameVault should store its media\n - /mnt/GameVault/media:/media\n ports:\n - 8080:8080/tcp\n db:\n image: postgres:16\n restart: unless-stopped\n environment:\n POSTGRES_USER: gamevault\n POSTGRES_PASSWORD: YOURPASSWORDHERE\n POSTGRES_DB: gamevault\n volumes:\n # Mount the folder where your PostgreSQL database files should land\n - /mnt/GameVault/database:/var/lib/postgresql/data\n"})}),"\n",(0,n.jsx)(t.p,{children:"You are now ready to deploy GameVault!"}),"\n",(0,n.jsx)(t.h2,{id:"step-3-navigate-to-apps-and-disover-page",children:"Step 3: Navigate to Apps and Disover Page"}),"\n",(0,n.jsxs)(t.p,{children:["Go to ",(0,n.jsx)(t.strong,{children:"apps"})," -> ",(0,n.jsx)(t.strong,{children:"discover"})]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Scale-EE-Step-3",src:s(5832).A+"",width:"1457",height:"695"})}),"\n",(0,n.jsx)(t.h2,{id:"step-4-select-install-via-yaml",children:'Step 4: Select "Install via YAML"'}),"\n",(0,n.jsx)(t.p,{children:'Click the three dot icon next the the "Custom App" button:'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Scale-EE-Step-4",src:s(9095).A+"",width:"149",height:"54"})}),"\n",(0,n.jsx)(t.p,{children:'Then, select the option to "Install via YAML":'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Scale-EE-Step-4a",src:s(4126).A+"",width:"158",height:"100"})}),"\n",(0,n.jsx)(t.p,{children:'In the pop-out window, enter the name of the custom app: for this example we used "gamevault-backend"'}),"\n",(0,n.jsx)(t.p,{children:'Then, paste the entire contents of your docker-compose.yml file into the "Custom Config" section:'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Scale-EE-Step-4b",src:s(2901).A+"",width:"768",height:"724"})}),"\n",(0,n.jsx)(t.p,{children:'Make sure you have all your needed changes per the rest of the documentation, then click "Save".'}),"\n",(0,n.jsxs)(t.p,{children:["The system will automatically do all the setup and return you to the main ",(0,n.jsx)(t.strong,{children:"Apps"})," pages when complete!"]}),"\n",(0,n.jsx)(t.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,n.jsx)(t.p,{children:"You have now successfully set up your GameVault Server using TrueNAS Scale!"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.a,{href:"/docs/server-docs/setup/#what-next",children:"Click here to continue."})}),"\n",(0,n.jsx)(t.h2,{id:"additional-info",children:"Additional Info"}),"\n",(0,n.jsx)(t.h3,{id:"stopping-the-server",children:"Stopping the Server"}),"\n",(0,n.jsxs)(t.p,{children:["To stop the GameVault server, navigate to the main ",(0,n.jsx)(t.strong,{children:"Apps"})," page, and check the box next to your running instance of gamevault:"]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Scale-EE-Stop1",src:s(7437).A+"",width:"703",height:"342"})}),"\n",(0,n.jsx)(t.p,{children:'Then, click the drop-down menu for "Select action", and choose "Stop All Selected"'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Scale-EE-Stop2",src:s(7110).A+"",width:"175",height:"250"})}),"\n",(0,n.jsx)(t.p,{children:"This will shutdown GameVault and the database."}),"\n",(0,n.jsx)(t.h3,{id:"reading-the-logs",children:"Reading the Logs"}),"\n",(0,n.jsx)(t.p,{children:'Navigate to "Apps" and choose the GameVault-backend App you have created.'}),"\n",(0,n.jsx)(t.p,{children:'Under the "Workloads" section, you will see two "Containers" running:'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Scale-EE-logs1",src:s(638).A+"",width:"343",height:"116"})}),"\n",(0,n.jsx)(t.p,{children:'Click the "veiw logs" icon next to either the database container (db) or the gamevault container (gamevault-backend) to open the logs:'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Scale-EE-logs2",src:s(2117).A+"",width:"346",height:"95"})}),"\n",(0,n.jsx)(t.p,{children:'In the new window that opens, choose the number of previous log lines you would like to view (500 is normal), then click "Connect":'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Scale-EE-logs3",src:s(6204).A+"",width:"574",height:"392"})}),"\n",(0,n.jsx)(t.p,{children:"You will see the previous number of log lines up to the number you entered, and all new log entries will appear as they are written!"}),"\n",(0,n.jsx)(t.h3,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,n.jsx)(t.p,{children:"If you recieve any errors while trying to save your GameVault configuration, be sure that all indents/spacing is correct YAML syntax.\nYou can try a few things to ensure proper formatting:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Use a text editor that maintains indents properly, such as Notepad++"}),"\n",(0,n.jsx)(t.li,{children:"Copy the example docker-compose.yml file from above, paste it directly into the configuration window, and add your changes directly. This can help ensure consistent formatting."}),"\n"]})]})}function A(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(g,{...e})}):g(e)}},5832:(e,t,s)=>{s.d(t,{A:()=>r});const r=s.p+"assets/images/Scale-EE-Step-3-cd6b7b7f6b38297a5ed5b932453bdae9.png"},9095:(e,t,s)=>{s.d(t,{A:()=>r});const r="data:image/png;base64,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"},4126:(e,t,s)=>{s.d(t,{A:()=>r});const r="data:image/png;base64,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"},2901:(e,t,s)=>{s.d(t,{A:()=>r});const r=s.p+"assets/images/Scale-EE-Step-4b-baaa680295deacd56edaa6c243a71e10.png"},7437:(e,t,s)=>{s.d(t,{A:()=>r});const r=s.p+"assets/images/Scale-EE-Stop1-2eef156d34b62e4d675eac577c2b0c67.png"},7110:(e,t,s)=>{s.d(t,{A:()=>r});const r="data:image/png;base64,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"},638:(e,t,s)=>{s.d(t,{A:()=>r});const r="data:image/png;base64,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"},2117:(e,t,s)=>{s.d(t,{A:()=>r});const r="data:image/png;base64,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"},6204:(e,t,s)=>{s.d(t,{A:()=>r});const r=s.p+"assets/images/Scale-EE-logs3-d090c6b9335baf3abadb45a30f7408a3.png"},9558:(e,t,s)=>{s.d(t,{A:()=>r});const r=s.p+"assets/images/scale-login-248c8e0a2719f7dc7db7893a7d97dc3b.png"},8591:(e,t,s)=>{s.d(t,{R:()=>a,x:()=>i});var r=s(758);const n={},o=r.createContext(n);function a(e){const t=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),r.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/18d9fd7d.f9e33138.js b/assets/js/18d9fd7d.18725d0c.js similarity index 99% rename from assets/js/18d9fd7d.f9e33138.js rename to assets/js/18d9fd7d.18725d0c.js index 201d857c0..c152a09d5 100644 --- a/assets/js/18d9fd7d.f9e33138.js +++ b/assets/js/18d9fd7d.18725d0c.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[3158],{9426:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>c,frontMatter:()=>o,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"server-docs/plugins","title":"Plugins","description":"Plugins are currently in the early stages of development. Things may break, so always make backups before using them.","source":"@site/docs/server-docs/plugins.md","sourceDirName":"server-docs","slug":"/server-docs/plugins","permalink":"/docs/server-docs/plugins","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/plugins.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"sidebarPosition":9,"frontMatter":{"sidebar_position":9},"sidebar":"docs","previous":{"title":"WebSockets","permalink":"/docs/server-docs/websockets"},"next":{"title":"Parental Control","permalink":"/docs/server-docs/parental-control"}}');var l=t(6070),s=t(8591);const o={sidebar_position:9},r="Plugins",a={},d=[{value:"Introduction",id:"introduction",level:2},{value:"Where to Find Plugins",id:"where-to-find-plugins",level:2},{value:"How to Install Plugins",id:"how-to-install-plugins",level:2},{value:"How to Develop GameVault Plugins",id:"how-to-develop-gamevault-plugins",level:2},{value:"Step 1: Clone the Backend Repository",id:"step-1-clone-the-backend-repository",level:3},{value:"Step 2: Understand the Architecture",id:"step-2-understand-the-architecture",level:3},{value:"Step 3: Set Up a Plugin",id:"step-3-set-up-a-plugin",level:3},{value:"Step 4: Document Your Plugin",id:"step-4-document-your-plugin",level:3},{value:"Step 5: Implement Your Plugin's Logic",id:"step-5-implement-your-plugins-logic",level:3},{value:"Adding Configuration Options",id:"adding-configuration-options",level:4},{value:"Step 6: Test Your Plugin",id:"step-6-test-your-plugin",level:3},{value:"Step 7: Compile Your Plugin",id:"step-7-compile-your-plugin",level:3},{value:"Step 8: Release Your Plugin",id:"step-8-release-your-plugin",level:3},{value:"Step 9: Get Featured",id:"step-9-get-featured",level:3},{value:"Metadata Provider Plugin Specifics",id:"metadata-provider-plugin-specifics",level:2},{value:"Example Plugins",id:"example-plugins",level:2}];function u(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(n.header,{children:(0,l.jsx)(n.h1,{id:"plugins",children:"Plugins"})}),"\n",(0,l.jsx)(n.admonition,{title:"Plugins are experimental",type:"danger",children:(0,l.jsx)(n.p,{children:"Plugins are currently in the early stages of development. Things may break, so always make backups before using them."})}),"\n",(0,l.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,l.jsx)(n.p,{children:"GameVault is built with modularity in mind, featuring a plugin system that allows users to integrate custom functionality directly into the server. Whether you're looking to extend GameVault or customize its behavior, plugins provide the flexibility you need."}),"\n",(0,l.jsx)(n.h2,{id:"where-to-find-plugins",children:"Where to Find Plugins"}),"\n",(0,l.jsxs)(n.p,{children:["You can browse a list of available GameVault plugins ",(0,l.jsx)(n.a,{href:"https://github.com/topics/gamevault-backend-plugin",children:"here"}),". Be sure to check that the plugin is compatible with your specific version of the GameVault backend."]}),"\n",(0,l.jsx)(n.h2,{id:"how-to-install-plugins",children:"How to Install Plugins"}),"\n",(0,l.jsx)(n.p,{children:"To install a plugin, follow these steps:"}),"\n",(0,l.jsxs)(n.ol,{children:["\n",(0,l.jsxs)(n.li,{children:["Place the folder containing your compiled plugin (",(0,l.jsx)(n.code,{children:".js"})," files) into the ",(0,l.jsx)(n.code,{children:"/plugins"})," directory of your GameVault server. Archives are currently not supported, so extract them first."]}),"\n",(0,l.jsx)(n.li,{children:"When you start the server, GameVault will automatically detect and load the plugin."}),"\n"]}),"\n",(0,l.jsx)(n.h2,{id:"how-to-develop-gamevault-plugins",children:"How to Develop GameVault Plugins"}),"\n",(0,l.jsx)(n.p,{children:"If you're a developer interested in creating plugins, you're in luck\u2014it's simple to get started. Here\u2019s a step-by-step guide:"}),"\n",(0,l.jsx)(n.h3,{id:"step-1-clone-the-backend-repository",children:"Step 1: Clone the Backend Repository"}),"\n",(0,l.jsxs)(n.p,{children:["First, set up a local instance of the GameVault backend. Follow the setup instructions available ",(0,l.jsx)(n.a,{href:"https://github.com/Phalcode/gamevault-backend/blob/master/INSTALL.md",children:"here"}),"."]}),"\n",(0,l.jsx)(n.h3,{id:"step-2-understand-the-architecture",children:"Step 2: Understand the Architecture"}),"\n",(0,l.jsxs)(n.p,{children:["GameVault plugins are built as NestJS modules, just like the rest of the system. You\u2019ll be working with ",(0,l.jsx)(n.a,{href:"https://docs.nestjs.com",children:"NestJS"})," components such as ",(0,l.jsx)(n.a,{href:"https://docs.nestjs.com/modules",children:"Modules"}),", ",(0,l.jsx)(n.a,{href:"https://docs.nestjs.com/providers",children:"Services"}),", and ",(0,l.jsx)(n.a,{href:"https://docs.nestjs.com/controllers",children:"Controllers"}),"."]}),"\n",(0,l.jsxs)(n.p,{children:["To start, it's a good idea to read the official NestJS documentation, but if you prefer to jump in and learn by doing, you can reference the ",(0,l.jsx)(n.a,{href:"#example-plugins",children:"example code below"}),"."]}),"\n",(0,l.jsx)(n.h3,{id:"step-3-set-up-a-plugin",children:"Step 3: Set Up a Plugin"}),"\n",(0,l.jsxs)(n.p,{children:["Suppose we\u2019re creating a plugin called ",(0,l.jsx)(n.code,{children:"useless-plugin"}),"."]}),"\n",(0,l.jsxs)(n.ol,{children:["\n",(0,l.jsxs)(n.li,{children:["Navigate to the ",(0,l.jsx)(n.code,{children:"gamevault-backend"})," directory in your cloned repository."]}),"\n",(0,l.jsxs)(n.li,{children:["Create a folder for your plugin: ",(0,l.jsx)(n.code,{children:"gamevault-backend/.local/plugins/useless-plugin/"}),"."]}),"\n",(0,l.jsxs)(n.li,{children:["Inside the plugin folder, initialize a git repository with ",(0,l.jsx)(n.code,{children:"git init"}),"."]}),"\n",(0,l.jsxs)(n.li,{children:["Create a new file for your module: ",(0,l.jsx)(n.code,{children:"useless.plugin.module.ts"}),". This file will serve as the entry point for your plugin and should implement the ",(0,l.jsx)(n.code,{children:"GameVaultPluginModule"})," interface (which can be imported from ",(0,l.jsx)(n.code,{children:"src/globals.ts"}),")."]}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:"Here\u2019s a basic example of how your module might look:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-ts",children:'import { Module } from "@nestjs/common";\nimport {\n GameVaultPluginModule,\n GameVaultPluginModuleMetadataV1,\n} from "../../../src/globals";\n\n@Module({\n imports: [],\n controllers: [],\n providers: [],\n})\nexport default class UselessPluginModule implements GameVaultPluginModule {\n metadata: GameVaultPluginModuleMetadataV1 = {\n name: "Useless Plugin",\n author: "Phalcode",\n version: "1.0.0",\n description:\n "An example plugin that does nothing useful. It logs the user count every three seconds and provides two REST APIs with sample data.",\n keywords: ["example", "api"],\n license: "UNLICENSE",\n website: "https://gamevau.lt",\n };\n}\n'})}),"\n",(0,l.jsx)(n.admonition,{title:"Avoid Redundancy",type:"tip",children:(0,l.jsxs)(n.p,{children:["When naming files, avoid repeating words. For example, if your plugin is called ",(0,l.jsx)(n.code,{children:"useless-plugin"}),", name the module file ",(0,l.jsx)(n.code,{children:"useless.plugin.module.ts"}),", not ",(0,l.jsx)(n.code,{children:"useless-plugin.plugin.module.ts"}),"."]})}),"\n",(0,l.jsx)(n.h3,{id:"step-4-document-your-plugin",children:"Step 4: Document Your Plugin"}),"\n",(0,l.jsxs)(n.p,{children:["Once you've implemented the ",(0,l.jsx)(n.code,{children:"GameVaultPluginModule"})," interface, make sure to provide details about your plugin in the metadata section. Be sure to add a ",(0,l.jsx)(n.code,{children:"README.md"})," and ",(0,l.jsx)(n.code,{children:"LICENSE"})," file to the plugin folder to make it clear and accessible when shared on GitHub."]}),"\n",(0,l.jsx)(n.h3,{id:"step-5-implement-your-plugins-logic",children:"Step 5: Implement Your Plugin's Logic"}),"\n",(0,l.jsxs)(n.p,{children:["Now, develop your plugin by adding services, controllers, or any other NestJS components. You can use existing GameVault modules to extend functionality. For instance in our example you can see we used the ",(0,l.jsx)(n.code,{children:"UsersService"})," to count the users on our GameVault server. The possibilities are limitless."]}),"\n",(0,l.jsx)(n.h4,{id:"adding-configuration-options",children:"Adding Configuration Options"}),"\n",(0,l.jsxs)(n.p,{children:["If your plugin should support specific configuration for the end user, you can introduce custom environment variables. Make sure they are unique and do not conflict with existing variables. A good pattern is: ",(0,l.jsx)(n.code,{children:"PLUGIN_AUTHORNAME_PLUGINNAME_SETTING"})," (e.g., ",(0,l.jsx)(n.code,{children:"PLUGIN_PHALCODE_USELESS_ENABLED"}),")."]}),"\n",(0,l.jsxs)(n.p,{children:["You can access these variables in your code via ",(0,l.jsx)(n.code,{children:"process.env.PLUGIN_AUTHORNAME_PLUGINNAME_SETTING"}),"."]}),"\n",(0,l.jsx)(n.h3,{id:"step-6-test-your-plugin",children:"Step 6: Test Your Plugin"}),"\n",(0,l.jsxs)(n.p,{children:["When you\u2019re ready to test, run ",(0,l.jsx)(n.code,{children:"pnpm start"}),'. GameVault will automatically inject your plugin, and you should see relevant logs. You can debug using logs or Visual Studio Code\u2019s "Toggle Auto Attach" feature. For extra quality assurance, you can write unit tests with Jest by adding a ',(0,l.jsx)(n.code,{children:".spec.ts"})," file and running ",(0,l.jsx)(n.code,{children:"pnpm test"}),"."]}),"\n",(0,l.jsx)(n.h3,{id:"step-7-compile-your-plugin",children:"Step 7: Compile Your Plugin"}),"\n",(0,l.jsxs)(n.p,{children:["Once your plugin is working and tested, compile it by running ",(0,l.jsx)(n.code,{children:"pnpm build"}),". This will generate a ",(0,l.jsx)(n.code,{children:"dist"})," folder with your compiled plugin in the ",(0,l.jsx)(n.code,{children:"dist/.local/plugins/useless-plugin"})," directory. Look for folder containing a ",(0,l.jsx)(n.code,{children:".plugin.module.js"})," file\u2014this is your compiled plugin. Zip that folder\u2014this is the final, compiled version of your plugin, ready for users to install and run on their servers."]}),"\n",(0,l.jsx)(n.h3,{id:"step-8-release-your-plugin",children:"Step 8: Release Your Plugin"}),"\n",(0,l.jsxs)(n.ol,{children:["\n",(0,l.jsx)(n.li,{children:"Bring your local Git repository to GitHub."}),"\n",(0,l.jsx)(n.li,{children:"Create a release on GitHub and upload the zipped plugin folder containing your plugin\u2019s JavaScript files."}),"\n",(0,l.jsxs)(n.li,{children:["Tag your repository with ",(0,l.jsx)(n.code,{children:"gamevault-backend-plugin"})," to make it available for users to find."]}),"\n"]}),"\n",(0,l.jsx)(n.h3,{id:"step-9-get-featured",children:"Step 9: Get Featured"}),"\n",(0,l.jsx)(n.p,{children:"If your plugin is particularly useful and you want it to be in the standard feature set, contact us! We might integrate it directly into the official GameVault-Backend product."}),"\n",(0,l.jsx)(n.h2,{id:"metadata-provider-plugin-specifics",children:"Metadata Provider Plugin Specifics"}),"\n",(0,l.jsx)(n.p,{children:"If your plugin should integrate with GameVault\u2019s metadata framework, follow these additional steps:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"Create the plugin as outlined above."}),"\n",(0,l.jsxs)(n.li,{children:["Develop a NestJS service that implements the ",(0,l.jsx)(n.a,{href:"https://github.com/Phalcode/gamevault-backend/blob/master/src/modules/metadata/providers/abstract.metadata-provider.service.ts",children:(0,l.jsx)(n.code,{children:"abstract.metadata-provider.interface.ts"})}),"."]}),"\n"]}),"\n",(0,l.jsxs)(n.p,{children:["Once complete, you can feature your plugin ",(0,l.jsx)(n.a,{href:"/docs/server-docs/metadata-enrichment/metadata#community-maintained-metadata-providers",children:"right here in the documentation"}),"."]}),"\n",(0,l.jsx)(n.h2,{id:"example-plugins",children:"Example Plugins"}),"\n",(0,l.jsxs)(n.p,{children:["You can check out some example plugins provided by Phalcode ",(0,l.jsx)(n.a,{href:"https://github.com/Phalcode/gamevault-backend-example-plugins",children:"here"})," to see how plugins are structured and developed."]})]})}function c(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,l.jsx)(n,{...e,children:(0,l.jsx)(u,{...e})}):u(e)}},8591:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>r});var i=t(758);const l={},s=i.createContext(l);function o(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:o(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[3158],{9426:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>c,frontMatter:()=>o,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"server-docs/plugins","title":"Plugins","description":"Plugins are currently in the early stages of development. Things may break, so always make backups before using them.","source":"@site/docs/server-docs/plugins.md","sourceDirName":"server-docs","slug":"/server-docs/plugins","permalink":"/docs/server-docs/plugins","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/plugins.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"sidebarPosition":9,"frontMatter":{"sidebar_position":9},"sidebar":"docs","previous":{"title":"WebSockets","permalink":"/docs/server-docs/websockets"},"next":{"title":"Parental Control","permalink":"/docs/server-docs/parental-control"}}');var l=t(6070),s=t(8591);const o={sidebar_position:9},r="Plugins",a={},d=[{value:"Introduction",id:"introduction",level:2},{value:"Where to Find Plugins",id:"where-to-find-plugins",level:2},{value:"How to Install Plugins",id:"how-to-install-plugins",level:2},{value:"How to Develop GameVault Plugins",id:"how-to-develop-gamevault-plugins",level:2},{value:"Step 1: Clone the Backend Repository",id:"step-1-clone-the-backend-repository",level:3},{value:"Step 2: Understand the Architecture",id:"step-2-understand-the-architecture",level:3},{value:"Step 3: Set Up a Plugin",id:"step-3-set-up-a-plugin",level:3},{value:"Step 4: Document Your Plugin",id:"step-4-document-your-plugin",level:3},{value:"Step 5: Implement Your Plugin's Logic",id:"step-5-implement-your-plugins-logic",level:3},{value:"Adding Configuration Options",id:"adding-configuration-options",level:4},{value:"Step 6: Test Your Plugin",id:"step-6-test-your-plugin",level:3},{value:"Step 7: Compile Your Plugin",id:"step-7-compile-your-plugin",level:3},{value:"Step 8: Release Your Plugin",id:"step-8-release-your-plugin",level:3},{value:"Step 9: Get Featured",id:"step-9-get-featured",level:3},{value:"Metadata Provider Plugin Specifics",id:"metadata-provider-plugin-specifics",level:2},{value:"Example Plugins",id:"example-plugins",level:2}];function u(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(n.header,{children:(0,l.jsx)(n.h1,{id:"plugins",children:"Plugins"})}),"\n",(0,l.jsx)(n.admonition,{title:"Plugins are experimental",type:"danger",children:(0,l.jsx)(n.p,{children:"Plugins are currently in the early stages of development. Things may break, so always make backups before using them."})}),"\n",(0,l.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,l.jsx)(n.p,{children:"GameVault is built with modularity in mind, featuring a plugin system that allows users to integrate custom functionality directly into the server. Whether you're looking to extend GameVault or customize its behavior, plugins provide the flexibility you need."}),"\n",(0,l.jsx)(n.h2,{id:"where-to-find-plugins",children:"Where to Find Plugins"}),"\n",(0,l.jsxs)(n.p,{children:["You can browse a list of available GameVault plugins ",(0,l.jsx)(n.a,{href:"https://github.com/topics/gamevault-backend-plugin",children:"here"}),". Be sure to check that the plugin is compatible with your specific version of the GameVault backend."]}),"\n",(0,l.jsx)(n.h2,{id:"how-to-install-plugins",children:"How to Install Plugins"}),"\n",(0,l.jsx)(n.p,{children:"To install a plugin, follow these steps:"}),"\n",(0,l.jsxs)(n.ol,{children:["\n",(0,l.jsxs)(n.li,{children:["Place the folder containing your compiled plugin (",(0,l.jsx)(n.code,{children:".js"})," files) into the ",(0,l.jsx)(n.code,{children:"/plugins"})," directory of your GameVault server. Archives are currently not supported, so extract them first."]}),"\n",(0,l.jsx)(n.li,{children:"When you start the server, GameVault will automatically detect and load the plugin."}),"\n"]}),"\n",(0,l.jsx)(n.h2,{id:"how-to-develop-gamevault-plugins",children:"How to Develop GameVault Plugins"}),"\n",(0,l.jsx)(n.p,{children:"If you're a developer interested in creating plugins, you're in luck\u2014it's simple to get started. Here\u2019s a step-by-step guide:"}),"\n",(0,l.jsx)(n.h3,{id:"step-1-clone-the-backend-repository",children:"Step 1: Clone the Backend Repository"}),"\n",(0,l.jsxs)(n.p,{children:["First, set up a local instance of the GameVault backend. Follow the setup instructions available ",(0,l.jsx)(n.a,{href:"https://github.com/Phalcode/gamevault-backend/blob/master/INSTALL.md",children:"here"}),"."]}),"\n",(0,l.jsx)(n.h3,{id:"step-2-understand-the-architecture",children:"Step 2: Understand the Architecture"}),"\n",(0,l.jsxs)(n.p,{children:["GameVault plugins are built as NestJS modules, just like the rest of the system. You\u2019ll be working with ",(0,l.jsx)(n.a,{href:"https://docs.nestjs.com",children:"NestJS"})," components such as ",(0,l.jsx)(n.a,{href:"https://docs.nestjs.com/modules",children:"Modules"}),", ",(0,l.jsx)(n.a,{href:"https://docs.nestjs.com/providers",children:"Services"}),", and ",(0,l.jsx)(n.a,{href:"https://docs.nestjs.com/controllers",children:"Controllers"}),"."]}),"\n",(0,l.jsxs)(n.p,{children:["To start, it's a good idea to read the official NestJS documentation, but if you prefer to jump in and learn by doing, you can reference the ",(0,l.jsx)(n.a,{href:"#example-plugins",children:"example code below"}),"."]}),"\n",(0,l.jsx)(n.h3,{id:"step-3-set-up-a-plugin",children:"Step 3: Set Up a Plugin"}),"\n",(0,l.jsxs)(n.p,{children:["Suppose we\u2019re creating a plugin called ",(0,l.jsx)(n.code,{children:"useless-plugin"}),"."]}),"\n",(0,l.jsxs)(n.ol,{children:["\n",(0,l.jsxs)(n.li,{children:["Navigate to the ",(0,l.jsx)(n.code,{children:"gamevault-backend"})," directory in your cloned repository."]}),"\n",(0,l.jsxs)(n.li,{children:["Create a folder for your plugin: ",(0,l.jsx)(n.code,{children:"gamevault-backend/.local/plugins/useless-plugin/"}),"."]}),"\n",(0,l.jsxs)(n.li,{children:["Inside the plugin folder, initialize a git repository with ",(0,l.jsx)(n.code,{children:"git init"}),"."]}),"\n",(0,l.jsxs)(n.li,{children:["Create a new file for your module: ",(0,l.jsx)(n.code,{children:"useless.plugin.module.ts"}),". This file will serve as the entry point for your plugin and should implement the ",(0,l.jsx)(n.code,{children:"GameVaultPluginModule"})," interface (which can be imported from ",(0,l.jsx)(n.code,{children:"src/globals.ts"}),")."]}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:"Here\u2019s a basic example of how your module might look:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-ts",children:'import { Module } from "@nestjs/common";\nimport {\n GameVaultPluginModule,\n GameVaultPluginModuleMetadataV1,\n} from "../../../src/globals";\n\n@Module({\n imports: [],\n controllers: [],\n providers: [],\n})\nexport default class UselessPluginModule implements GameVaultPluginModule {\n metadata: GameVaultPluginModuleMetadataV1 = {\n name: "Useless Plugin",\n author: "Phalcode",\n version: "1.0.0",\n description:\n "An example plugin that does nothing useful. It logs the user count every three seconds and provides two REST APIs with sample data.",\n keywords: ["example", "api"],\n license: "UNLICENSE",\n website: "https://gamevau.lt",\n };\n}\n'})}),"\n",(0,l.jsx)(n.admonition,{title:"Avoid Redundancy",type:"tip",children:(0,l.jsxs)(n.p,{children:["When naming files, avoid repeating words. For example, if your plugin is called ",(0,l.jsx)(n.code,{children:"useless-plugin"}),", name the module file ",(0,l.jsx)(n.code,{children:"useless.plugin.module.ts"}),", not ",(0,l.jsx)(n.code,{children:"useless-plugin.plugin.module.ts"}),"."]})}),"\n",(0,l.jsx)(n.h3,{id:"step-4-document-your-plugin",children:"Step 4: Document Your Plugin"}),"\n",(0,l.jsxs)(n.p,{children:["Once you've implemented the ",(0,l.jsx)(n.code,{children:"GameVaultPluginModule"})," interface, make sure to provide details about your plugin in the metadata section. Be sure to add a ",(0,l.jsx)(n.code,{children:"README.md"})," and ",(0,l.jsx)(n.code,{children:"LICENSE"})," file to the plugin folder to make it clear and accessible when shared on GitHub."]}),"\n",(0,l.jsx)(n.h3,{id:"step-5-implement-your-plugins-logic",children:"Step 5: Implement Your Plugin's Logic"}),"\n",(0,l.jsxs)(n.p,{children:["Now, develop your plugin by adding services, controllers, or any other NestJS components. You can use existing GameVault modules to extend functionality. For instance in our example you can see we used the ",(0,l.jsx)(n.code,{children:"UsersService"})," to count the users on our GameVault server. The possibilities are limitless."]}),"\n",(0,l.jsx)(n.h4,{id:"adding-configuration-options",children:"Adding Configuration Options"}),"\n",(0,l.jsxs)(n.p,{children:["If your plugin should support specific configuration for the end user, you can introduce custom environment variables. Make sure they are unique and do not conflict with existing variables. A good pattern is: ",(0,l.jsx)(n.code,{children:"PLUGIN_AUTHORNAME_PLUGINNAME_SETTING"})," (e.g., ",(0,l.jsx)(n.code,{children:"PLUGIN_PHALCODE_USELESS_ENABLED"}),")."]}),"\n",(0,l.jsxs)(n.p,{children:["You can access these variables in your code via ",(0,l.jsx)(n.code,{children:"process.env.PLUGIN_AUTHORNAME_PLUGINNAME_SETTING"}),"."]}),"\n",(0,l.jsx)(n.h3,{id:"step-6-test-your-plugin",children:"Step 6: Test Your Plugin"}),"\n",(0,l.jsxs)(n.p,{children:["When you\u2019re ready to test, run ",(0,l.jsx)(n.code,{children:"pnpm start"}),'. GameVault will automatically inject your plugin, and you should see relevant logs. You can debug using logs or Visual Studio Code\u2019s "Toggle Auto Attach" feature. For extra quality assurance, you can write unit tests with Jest by adding a ',(0,l.jsx)(n.code,{children:".spec.ts"})," file and running ",(0,l.jsx)(n.code,{children:"pnpm test"}),"."]}),"\n",(0,l.jsx)(n.h3,{id:"step-7-compile-your-plugin",children:"Step 7: Compile Your Plugin"}),"\n",(0,l.jsxs)(n.p,{children:["Once your plugin is working and tested, compile it by running ",(0,l.jsx)(n.code,{children:"pnpm build"}),". This will generate a ",(0,l.jsx)(n.code,{children:"dist"})," folder with your compiled plugin in the ",(0,l.jsx)(n.code,{children:"dist/.local/plugins/useless-plugin"})," directory. Look for folder containing a ",(0,l.jsx)(n.code,{children:".plugin.module.js"})," file\u2014this is your compiled plugin. Zip that folder\u2014this is the final, compiled version of your plugin, ready for users to install and run on their servers."]}),"\n",(0,l.jsx)(n.h3,{id:"step-8-release-your-plugin",children:"Step 8: Release Your Plugin"}),"\n",(0,l.jsxs)(n.ol,{children:["\n",(0,l.jsx)(n.li,{children:"Bring your local Git repository to GitHub."}),"\n",(0,l.jsx)(n.li,{children:"Create a release on GitHub and upload the zipped plugin folder containing your plugin\u2019s JavaScript files."}),"\n",(0,l.jsxs)(n.li,{children:["Tag your repository with ",(0,l.jsx)(n.code,{children:"gamevault-backend-plugin"})," to make it available for users to find."]}),"\n"]}),"\n",(0,l.jsx)(n.h3,{id:"step-9-get-featured",children:"Step 9: Get Featured"}),"\n",(0,l.jsx)(n.p,{children:"If your plugin is particularly useful and you want it to be in the standard feature set, contact us! We might integrate it directly into the official GameVault-Backend product."}),"\n",(0,l.jsx)(n.h2,{id:"metadata-provider-plugin-specifics",children:"Metadata Provider Plugin Specifics"}),"\n",(0,l.jsx)(n.p,{children:"If your plugin should integrate with GameVault\u2019s metadata framework, follow these additional steps:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"Create the plugin as outlined above."}),"\n",(0,l.jsxs)(n.li,{children:["Develop a NestJS service that implements the ",(0,l.jsx)(n.a,{href:"https://github.com/Phalcode/gamevault-backend/blob/master/src/modules/metadata/providers/abstract.metadata-provider.service.ts",children:(0,l.jsx)(n.code,{children:"abstract.metadata-provider.interface.ts"})}),"."]}),"\n"]}),"\n",(0,l.jsxs)(n.p,{children:["Once complete, you can feature your plugin ",(0,l.jsx)(n.a,{href:"/docs/server-docs/metadata-enrichment/metadata#community-maintained-metadata-providers",children:"right here in the documentation"}),"."]}),"\n",(0,l.jsx)(n.h2,{id:"example-plugins",children:"Example Plugins"}),"\n",(0,l.jsxs)(n.p,{children:["You can check out some example plugins provided by Phalcode ",(0,l.jsx)(n.a,{href:"https://github.com/Phalcode/gamevault-backend-example-plugins",children:"here"})," to see how plugins are structured and developed."]})]})}function c(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,l.jsx)(n,{...e,children:(0,l.jsx)(u,{...e})}):u(e)}},8591:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>r});var i=t(758);const l={},s=i.createContext(l);function o(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:o(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/193fe191.de1d3427.js b/assets/js/193fe191.cee52de5.js similarity index 99% rename from assets/js/193fe191.de1d3427.js rename to assets/js/193fe191.cee52de5.js index c022e24a9..5421b4630 100644 --- a/assets/js/193fe191.de1d3427.js +++ b/assets/js/193fe191.cee52de5.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[2386],{5542:(e,d,s)=>{s.r(d),s.d(d,{assets:()=>l,contentTitle:()=>c,default:()=>j,frontMatter:()=>n,metadata:()=>r,toc:()=>h});const r=JSON.parse('{"id":"server-docs/metadata-enrichment/provider-igdb","title":"Provider: IGDB","description":"Overview","source":"@site/docs/server-docs/metadata-enrichment/provider-igdb.md","sourceDirName":"server-docs/metadata-enrichment","slug":"/server-docs/metadata-enrichment/provider-igdb","permalink":"/docs/server-docs/metadata-enrichment/provider-igdb","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/metadata-enrichment/provider-igdb.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"frontMatter":{},"sidebar":"docs","previous":{"title":"Enriching your Games with Metadata","permalink":"/docs/server-docs/metadata-enrichment/metadata"},"next":{"title":"Database Backup & Restoration","permalink":"/docs/server-docs/backup-and-restore"}}');var t=s(6070),i=s(8591);const n={},c="Provider: IGDB",l={},h=[{value:"Overview",id:"overview",level:2},{value:"Setup",id:"setup",level:2},{value:"Configurations",id:"configurations",level:2},{value:"Mappings",id:"mappings",level:2},{value:"Fields",id:"fields",level:3},{value:"Age Rating",id:"age-rating",level:3}];function x(e){const d={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(d.header,{children:(0,t.jsx)(d.h1,{id:"provider-igdb",children:"Provider: IGDB"})}),"\n",(0,t.jsx)(d.h2,{id:"overview",children:"Overview"}),"\n",(0,t.jsxs)(d.p,{children:[(0,t.jsx)(d.a,{href:"https://igdb.com",children:"The Internet Games Database (IGDB)"})," is one of the most popular databases for detailed video game information run by ",(0,t.jsx)(d.a,{href:"https://twitch.tv",children:"twitch.tv"}),". By integrating IGDB with GameVault, users get accurate and up-to-date game data. We're pleased to partner with IGDB to provide the best game information to our users."]}),"\n",(0,t.jsx)(d.h2,{id:"setup",children:"Setup"}),"\n",(0,t.jsxs)(d.ol,{children:["\n",(0,t.jsxs)(d.li,{children:["Log in to your Twitch Account on ",(0,t.jsx)(d.a,{href:"https://dev.twitch.tv/login",children:(0,t.jsx)(d.strong,{children:"dev.twitch.tv"})}),"\n",(0,t.jsxs)(d.ul,{children:["\n",(0,t.jsx)(d.li,{children:"Create a new account if you don't have one already."}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(d.li,{children:["Open the ",(0,t.jsx)(d.a,{href:"https://dev.twitch.tv/console/apps",children:(0,t.jsx)(d.strong,{children:"Twitch Developer dashboard"})}),"."]}),"\n",(0,t.jsxs)(d.li,{children:["Click on ",(0,t.jsx)(d.a,{href:"https://dev.twitch.tv/console/apps/create",children:(0,t.jsx)(d.strong,{children:"Register your application"})}),"\n",(0,t.jsx)(d.img,{alt:"Register your application",src:s(6981).A+"",width:"1254",height:"393"})]}),"\n",(0,t.jsxs)(d.li,{children:["Fill out the form as shown in the image. Make sure to solve the CAPTCHA.\n",(0,t.jsx)(d.img,{alt:"Fill in the details",src:s(4878).A+"",width:"1258",height:"832"})]}),"\n",(0,t.jsxs)(d.li,{children:["Once your application is created, click on ",(0,t.jsx)(d.strong,{children:"Manage"}),".\n",(0,t.jsx)(d.img,{alt:"Manage",src:s(2567).A+"",width:"1259",height:"317"})]}),"\n",(0,t.jsxs)(d.li,{children:["Click on ",(0,t.jsx)(d.strong,{children:"New Secret"}),". Make sure to solve the CAPTCHA.\n",(0,t.jsx)(d.img,{alt:"New Secret",src:s(7400).A+"",width:"1250",height:"1053"})]}),"\n",(0,t.jsxs)(d.li,{children:["Copy your ",(0,t.jsx)(d.strong,{children:"Client ID"})," and ",(0,t.jsx)(d.strong,{children:"Client Secret"})," and configure them in GameVaults ",(0,t.jsx)(d.code,{children:"METADATA_IGDB_CLIENT_ID"})," and ",(0,t.jsx)(d.code,{children:"METADATA_IGDB_CLIENT_SECRET"})," environment variables."]}),"\n",(0,t.jsxs)(d.li,{children:[(0,t.jsx)(d.strong,{children:"Done!"})," \ud83e\udd73 Now just restart your server and it should do it's magic. If you have lots of games, it may take a while to fetch all metadata. You can check the progress in the server logs."]}),"\n"]}),"\n",(0,t.jsx)(d.h2,{id:"configurations",children:"Configurations"}),"\n",(0,t.jsxs)(d.table,{children:[(0,t.jsx)(d.thead,{children:(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.th,{children:"Property"}),(0,t.jsx)(d.th,{children:"Description"}),(0,t.jsx)(d.th,{children:"Default"}),(0,t.jsx)(d.th,{children:"Possible Values"})]})}),(0,t.jsxs)(d.tbody,{children:[(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"METADATA_IGDB_ENABLED"})}),(0,t.jsx)(d.td,{children:"Enables / Disables the Provider"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"true"})}),(0,t.jsxs)(d.td,{children:[(0,t.jsx)(d.code,{children:"true"}),", ",(0,t.jsx)(d.code,{children:"false"})]})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"METADATA_IGDB_PRIORITY"})}),(0,t.jsx)(d.td,{children:"Priority of the Provider"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"50"})}),(0,t.jsx)(d.td,{children:"Any Integer"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"METADATA_IGDB_CLIENT_ID"})}),(0,t.jsx)(d.td,{children:"Your developer.twitch.tv Client ID"}),(0,t.jsx)(d.td,{children:"-"}),(0,t.jsx)(d.td,{children:"Your Client-ID"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"METADATA_IGDB_CLIENT_SECRET"})}),(0,t.jsx)(d.td,{children:"Your developer.twitch.tv Client Secret"}),(0,t.jsx)(d.td,{children:"-"}),(0,t.jsx)(d.td,{children:"Your Client-Secret"})]})]})]}),"\n",(0,t.jsx)(d.h2,{id:"mappings",children:"Mappings"}),"\n",(0,t.jsx)(d.h3,{id:"fields",children:"Fields"}),"\n",(0,t.jsxs)(d.table,{children:[(0,t.jsx)(d.thead,{children:(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.th,{children:"GameVault Field"}),(0,t.jsx)(d.th,{children:"IGDB API Field(s)"}),(0,t.jsx)(d.th,{children:"Notes"})]})}),(0,t.jsxs)(d.tbody,{children:[(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"provider_slug"})}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"igdb"})}),(0,t.jsx)(d.td,{children:"hardcoded."})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"age_rating"})}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"age_ratings"})}),(0,t.jsxs)(d.td,{children:["See ",(0,t.jsx)(d.a,{href:"#age-rating",children:"here"})," for details."]})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"provider_data_id"})}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"id"})}),(0,t.jsx)(d.td,{})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"provider_data_url"})}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"url"})}),(0,t.jsx)(d.td,{})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"title"})}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"name"})}),(0,t.jsx)(d.td,{})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"release_date"})}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"first_release_date"})}),(0,t.jsx)(d.td,{})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"description"})}),(0,t.jsxs)(d.td,{children:[(0,t.jsx)(d.code,{children:"game.summary"})," and/or ",(0,t.jsx)(d.code,{children:"game.storyline"})]}),(0,t.jsx)(d.td,{children:"If both are available, both get used, else any available will be mapped"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"rating"})}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"total_rating"})}),(0,t.jsx)(d.td,{})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"early_access"})}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"status"})}),(0,t.jsxs)(d.td,{children:["True if the Game is either in status ",(0,t.jsx)(d.code,{children:"alpha"}),", ",(0,t.jsx)(d.code,{children:"beta"})," or ",(0,t.jsx)(d.code,{children:"early_access"})]})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"developers"})}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"involved_companies"})}),(0,t.jsxs)(d.td,{children:["Filtered by ",(0,t.jsx)(d.code,{children:"involved_company.developer === true"})]})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"publishers"})}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"involved_companies"})}),(0,t.jsxs)(d.td,{children:["Filtered by ",(0,t.jsx)(d.code,{children:"involved_company.publisher === true"})]})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"genres"})}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"genres"})}),(0,t.jsx)(d.td,{})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"tags"})}),(0,t.jsxs)(d.td,{children:[(0,t.jsx)(d.code,{children:"keywords"})," and ",(0,t.jsx)(d.code,{children:"themes"})]}),(0,t.jsx)(d.td,{})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"cover"})}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"cover"})}),(0,t.jsxs)(d.td,{children:["Using the highest possible cover resolution via ",(0,t.jsx)(d.code,{children:"t_cover_big_2x"})]})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"background"})}),(0,t.jsxs)(d.td,{children:[(0,t.jsx)(d.code,{children:"artworks[0]"})," or ",(0,t.jsx)(d.code,{children:"screenshots[0]"})]}),(0,t.jsxs)(d.td,{children:["Only first artwork/screenshot is mapped. Using the highest possible 16:9 resolution via ",(0,t.jsx)(d.code,{children:"t_1080p_2x"})]})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"url_websites"})}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"websites.url"})}),(0,t.jsx)(d.td,{})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"url_screenshots"})}),(0,t.jsxs)(d.td,{children:[(0,t.jsx)(d.code,{children:"screenshots"})," and ",(0,t.jsx)(d.code,{children:"artworks"})]}),(0,t.jsxs)(d.td,{children:["Using the highest possible 16:9 resolution via ",(0,t.jsx)(d.code,{children:"t_1080p_2x"})]})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"url_trailers"})}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"videos"})}),(0,t.jsx)(d.td,{children:'Only when video title includes the words "trailer", "teaser" or "intro"'})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"url_gameplays"})}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"videos"})}),(0,t.jsx)(d.td,{children:'Only when video title includes the words "gameplay"'})]})]})]}),"\n",(0,t.jsx)(d.h3,{id:"age-rating",children:"Age Rating"}),"\n",(0,t.jsxs)(d.p,{children:['The table below shows how age ratings from GameVault and IGDB are matched. Ratings like "Not Yet Rated" are ignored. A game can have ratings from multiple systems. The IGDB integration calculates ',(0,t.jsx)(d.strong,{children:"the average of all ratings"}),", rounds it, and then saves it to GameVault."]}),"\n",(0,t.jsxs)(d.table,{children:[(0,t.jsx)(d.thead,{children:(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.th,{children:"Age Rating System"}),(0,t.jsx)(d.th,{children:"Rating Name"}),(0,t.jsx)(d.th,{children:"GameVault Minimum Age (Years)"}),(0,t.jsx)(d.th,{children:"IGDB Rating Enum Value"})]})}),(0,t.jsxs)(d.tbody,{children:[(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.strong,{children:"PEGI"})}),(0,t.jsx)(d.td,{children:"Three"}),(0,t.jsx)(d.td,{children:"3"}),(0,t.jsx)(d.td,{children:"1"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"Seven"}),(0,t.jsx)(d.td,{children:"7"}),(0,t.jsx)(d.td,{children:"2"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"Twelve"}),(0,t.jsx)(d.td,{children:"12"}),(0,t.jsx)(d.td,{children:"3"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"Sixteen"}),(0,t.jsx)(d.td,{children:"16"}),(0,t.jsx)(d.td,{children:"4"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"Eighteen"}),(0,t.jsx)(d.td,{children:"18"}),(0,t.jsx)(d.td,{children:"5"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.strong,{children:"ESRB"})}),(0,t.jsx)(d.td,{children:"EC"}),(0,t.jsx)(d.td,{children:"3"}),(0,t.jsx)(d.td,{children:"7"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"E"}),(0,t.jsx)(d.td,{children:"6"}),(0,t.jsx)(d.td,{children:"8"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"E10"}),(0,t.jsx)(d.td,{children:"10"}),(0,t.jsx)(d.td,{children:"9"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"T"}),(0,t.jsx)(d.td,{children:"13"}),(0,t.jsx)(d.td,{children:"10"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"M"}),(0,t.jsx)(d.td,{children:"17"}),(0,t.jsx)(d.td,{children:"11"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"AO"}),(0,t.jsx)(d.td,{children:"18"}),(0,t.jsx)(d.td,{children:"12"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.strong,{children:"CERO"})}),(0,t.jsx)(d.td,{children:"CERO_A"}),(0,t.jsx)(d.td,{children:"0"}),(0,t.jsx)(d.td,{children:"13"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"CERO_B"}),(0,t.jsx)(d.td,{children:"12"}),(0,t.jsx)(d.td,{children:"14"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"CERO_C"}),(0,t.jsx)(d.td,{children:"15"}),(0,t.jsx)(d.td,{children:"15"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"CERO_D"}),(0,t.jsx)(d.td,{children:"17"}),(0,t.jsx)(d.td,{children:"16"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"CERO_Z"}),(0,t.jsx)(d.td,{children:"18"}),(0,t.jsx)(d.td,{children:"17"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.strong,{children:"USK"})}),(0,t.jsx)(d.td,{children:"USK_0"}),(0,t.jsx)(d.td,{children:"0"}),(0,t.jsx)(d.td,{children:"18"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"USK_6"}),(0,t.jsx)(d.td,{children:"6"}),(0,t.jsx)(d.td,{children:"19"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"USK_12"}),(0,t.jsx)(d.td,{children:"12"}),(0,t.jsx)(d.td,{children:"20"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"USK_16"}),(0,t.jsx)(d.td,{children:"16"}),(0,t.jsx)(d.td,{children:"21"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"USK_18"}),(0,t.jsx)(d.td,{children:"18"}),(0,t.jsx)(d.td,{children:"22"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.strong,{children:"GRAC"})}),(0,t.jsx)(d.td,{children:"GRAC_ALL"}),(0,t.jsx)(d.td,{children:"0"}),(0,t.jsx)(d.td,{children:"23"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"GRAC_Twelve"}),(0,t.jsx)(d.td,{children:"12"}),(0,t.jsx)(d.td,{children:"24"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"GRAC_Fifteen"}),(0,t.jsx)(d.td,{children:"15"}),(0,t.jsx)(d.td,{children:"25"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"GRAC_Eighteen"}),(0,t.jsx)(d.td,{children:"18"}),(0,t.jsx)(d.td,{children:"26"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.strong,{children:"CLASS_IND"})}),(0,t.jsx)(d.td,{children:"CLASS_IND_L"}),(0,t.jsx)(d.td,{children:"0"}),(0,t.jsx)(d.td,{children:"28"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"CLASS_IND_Ten"}),(0,t.jsx)(d.td,{children:"10"}),(0,t.jsx)(d.td,{children:"29"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"CLASS_IND_Twelve"}),(0,t.jsx)(d.td,{children:"12"}),(0,t.jsx)(d.td,{children:"30"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"CLASS_IND_Fourteen"}),(0,t.jsx)(d.td,{children:"14"}),(0,t.jsx)(d.td,{children:"31"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"CLASS_IND_Sixteen"}),(0,t.jsx)(d.td,{children:"16"}),(0,t.jsx)(d.td,{children:"32"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"CLASS_IND_Eighteen"}),(0,t.jsx)(d.td,{children:"18"}),(0,t.jsx)(d.td,{children:"33"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.strong,{children:"ACB"})}),(0,t.jsx)(d.td,{children:"ACB_G"}),(0,t.jsx)(d.td,{children:"0"}),(0,t.jsx)(d.td,{children:"34"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"ACB_PG"}),(0,t.jsx)(d.td,{children:"8"}),(0,t.jsx)(d.td,{children:"35"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"ACB_M"}),(0,t.jsx)(d.td,{children:"15"}),(0,t.jsx)(d.td,{children:"36"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"ACB_MA15"}),(0,t.jsx)(d.td,{children:"15"}),(0,t.jsx)(d.td,{children:"37"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"ACB_R18"}),(0,t.jsx)(d.td,{children:"18"}),(0,t.jsx)(d.td,{children:"38"})]})]})]})]})}function j(e={}){const{wrapper:d}={...(0,i.R)(),...e.components};return d?(0,t.jsx)(d,{...e,children:(0,t.jsx)(x,{...e})}):x(e)}},6981:(e,d,s)=>{s.d(d,{A:()=>r});const r=s.p+"assets/images/setup-step-1-531ca876d7d5343984b56d73b5fe2527.png"},4878:(e,d,s)=>{s.d(d,{A:()=>r});const r=s.p+"assets/images/setup-step-2-9b26b8c4e36c9ae8b00e578737b6412d.png"},2567:(e,d,s)=>{s.d(d,{A:()=>r});const r=s.p+"assets/images/setup-step-3-1f45dd581f8cc3ffc8071bdcc115f0b9.png"},7400:(e,d,s)=>{s.d(d,{A:()=>r});const r=s.p+"assets/images/setup-step-4-2906d1431be260bcadd96e0ce27e8749.png"},8591:(e,d,s)=>{s.d(d,{R:()=>n,x:()=>c});var r=s(758);const t={},i=r.createContext(t);function n(e){const d=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(d):{...d,...e}}),[d,e])}function c(e){let d;return d=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:n(e.components),r.createElement(i.Provider,{value:d},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[2386],{5542:(e,d,s)=>{s.r(d),s.d(d,{assets:()=>l,contentTitle:()=>c,default:()=>j,frontMatter:()=>n,metadata:()=>r,toc:()=>h});const r=JSON.parse('{"id":"server-docs/metadata-enrichment/provider-igdb","title":"Provider: IGDB","description":"Overview","source":"@site/docs/server-docs/metadata-enrichment/provider-igdb.md","sourceDirName":"server-docs/metadata-enrichment","slug":"/server-docs/metadata-enrichment/provider-igdb","permalink":"/docs/server-docs/metadata-enrichment/provider-igdb","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/metadata-enrichment/provider-igdb.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"frontMatter":{},"sidebar":"docs","previous":{"title":"Enriching your Games with Metadata","permalink":"/docs/server-docs/metadata-enrichment/metadata"},"next":{"title":"Database Backup & Restoration","permalink":"/docs/server-docs/backup-and-restore"}}');var t=s(6070),i=s(8591);const n={},c="Provider: IGDB",l={},h=[{value:"Overview",id:"overview",level:2},{value:"Setup",id:"setup",level:2},{value:"Configurations",id:"configurations",level:2},{value:"Mappings",id:"mappings",level:2},{value:"Fields",id:"fields",level:3},{value:"Age Rating",id:"age-rating",level:3}];function x(e){const d={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(d.header,{children:(0,t.jsx)(d.h1,{id:"provider-igdb",children:"Provider: IGDB"})}),"\n",(0,t.jsx)(d.h2,{id:"overview",children:"Overview"}),"\n",(0,t.jsxs)(d.p,{children:[(0,t.jsx)(d.a,{href:"https://igdb.com",children:"The Internet Games Database (IGDB)"})," is one of the most popular databases for detailed video game information run by ",(0,t.jsx)(d.a,{href:"https://twitch.tv",children:"twitch.tv"}),". By integrating IGDB with GameVault, users get accurate and up-to-date game data. We're pleased to partner with IGDB to provide the best game information to our users."]}),"\n",(0,t.jsx)(d.h2,{id:"setup",children:"Setup"}),"\n",(0,t.jsxs)(d.ol,{children:["\n",(0,t.jsxs)(d.li,{children:["Log in to your Twitch Account on ",(0,t.jsx)(d.a,{href:"https://dev.twitch.tv/login",children:(0,t.jsx)(d.strong,{children:"dev.twitch.tv"})}),"\n",(0,t.jsxs)(d.ul,{children:["\n",(0,t.jsx)(d.li,{children:"Create a new account if you don't have one already."}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(d.li,{children:["Open the ",(0,t.jsx)(d.a,{href:"https://dev.twitch.tv/console/apps",children:(0,t.jsx)(d.strong,{children:"Twitch Developer dashboard"})}),"."]}),"\n",(0,t.jsxs)(d.li,{children:["Click on ",(0,t.jsx)(d.a,{href:"https://dev.twitch.tv/console/apps/create",children:(0,t.jsx)(d.strong,{children:"Register your application"})}),"\n",(0,t.jsx)(d.img,{alt:"Register your application",src:s(6981).A+"",width:"1254",height:"393"})]}),"\n",(0,t.jsxs)(d.li,{children:["Fill out the form as shown in the image. Make sure to solve the CAPTCHA.\n",(0,t.jsx)(d.img,{alt:"Fill in the details",src:s(4878).A+"",width:"1258",height:"832"})]}),"\n",(0,t.jsxs)(d.li,{children:["Once your application is created, click on ",(0,t.jsx)(d.strong,{children:"Manage"}),".\n",(0,t.jsx)(d.img,{alt:"Manage",src:s(2567).A+"",width:"1259",height:"317"})]}),"\n",(0,t.jsxs)(d.li,{children:["Click on ",(0,t.jsx)(d.strong,{children:"New Secret"}),". Make sure to solve the CAPTCHA.\n",(0,t.jsx)(d.img,{alt:"New Secret",src:s(7400).A+"",width:"1250",height:"1053"})]}),"\n",(0,t.jsxs)(d.li,{children:["Copy your ",(0,t.jsx)(d.strong,{children:"Client ID"})," and ",(0,t.jsx)(d.strong,{children:"Client Secret"})," and configure them in GameVaults ",(0,t.jsx)(d.code,{children:"METADATA_IGDB_CLIENT_ID"})," and ",(0,t.jsx)(d.code,{children:"METADATA_IGDB_CLIENT_SECRET"})," environment variables."]}),"\n",(0,t.jsxs)(d.li,{children:[(0,t.jsx)(d.strong,{children:"Done!"})," \ud83e\udd73 Now just restart your server and it should do it's magic. If you have lots of games, it may take a while to fetch all metadata. You can check the progress in the server logs."]}),"\n"]}),"\n",(0,t.jsx)(d.h2,{id:"configurations",children:"Configurations"}),"\n",(0,t.jsxs)(d.table,{children:[(0,t.jsx)(d.thead,{children:(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.th,{children:"Property"}),(0,t.jsx)(d.th,{children:"Description"}),(0,t.jsx)(d.th,{children:"Default"}),(0,t.jsx)(d.th,{children:"Possible Values"})]})}),(0,t.jsxs)(d.tbody,{children:[(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"METADATA_IGDB_ENABLED"})}),(0,t.jsx)(d.td,{children:"Enables / Disables the Provider"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"true"})}),(0,t.jsxs)(d.td,{children:[(0,t.jsx)(d.code,{children:"true"}),", ",(0,t.jsx)(d.code,{children:"false"})]})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"METADATA_IGDB_PRIORITY"})}),(0,t.jsx)(d.td,{children:"Priority of the Provider"}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"50"})}),(0,t.jsx)(d.td,{children:"Any Integer"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"METADATA_IGDB_CLIENT_ID"})}),(0,t.jsx)(d.td,{children:"Your developer.twitch.tv Client ID"}),(0,t.jsx)(d.td,{children:"-"}),(0,t.jsx)(d.td,{children:"Your Client-ID"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"METADATA_IGDB_CLIENT_SECRET"})}),(0,t.jsx)(d.td,{children:"Your developer.twitch.tv Client Secret"}),(0,t.jsx)(d.td,{children:"-"}),(0,t.jsx)(d.td,{children:"Your Client-Secret"})]})]})]}),"\n",(0,t.jsx)(d.h2,{id:"mappings",children:"Mappings"}),"\n",(0,t.jsx)(d.h3,{id:"fields",children:"Fields"}),"\n",(0,t.jsxs)(d.table,{children:[(0,t.jsx)(d.thead,{children:(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.th,{children:"GameVault Field"}),(0,t.jsx)(d.th,{children:"IGDB API Field(s)"}),(0,t.jsx)(d.th,{children:"Notes"})]})}),(0,t.jsxs)(d.tbody,{children:[(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"provider_slug"})}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"igdb"})}),(0,t.jsx)(d.td,{children:"hardcoded."})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"age_rating"})}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"age_ratings"})}),(0,t.jsxs)(d.td,{children:["See ",(0,t.jsx)(d.a,{href:"#age-rating",children:"here"})," for details."]})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"provider_data_id"})}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"id"})}),(0,t.jsx)(d.td,{})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"provider_data_url"})}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"url"})}),(0,t.jsx)(d.td,{})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"title"})}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"name"})}),(0,t.jsx)(d.td,{})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"release_date"})}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"first_release_date"})}),(0,t.jsx)(d.td,{})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"description"})}),(0,t.jsxs)(d.td,{children:[(0,t.jsx)(d.code,{children:"game.summary"})," and/or ",(0,t.jsx)(d.code,{children:"game.storyline"})]}),(0,t.jsx)(d.td,{children:"If both are available, both get used, else any available will be mapped"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"rating"})}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"total_rating"})}),(0,t.jsx)(d.td,{})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"early_access"})}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"status"})}),(0,t.jsxs)(d.td,{children:["True if the Game is either in status ",(0,t.jsx)(d.code,{children:"alpha"}),", ",(0,t.jsx)(d.code,{children:"beta"})," or ",(0,t.jsx)(d.code,{children:"early_access"})]})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"developers"})}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"involved_companies"})}),(0,t.jsxs)(d.td,{children:["Filtered by ",(0,t.jsx)(d.code,{children:"involved_company.developer === true"})]})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"publishers"})}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"involved_companies"})}),(0,t.jsxs)(d.td,{children:["Filtered by ",(0,t.jsx)(d.code,{children:"involved_company.publisher === true"})]})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"genres"})}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"genres"})}),(0,t.jsx)(d.td,{})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"tags"})}),(0,t.jsxs)(d.td,{children:[(0,t.jsx)(d.code,{children:"keywords"})," and ",(0,t.jsx)(d.code,{children:"themes"})]}),(0,t.jsx)(d.td,{})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"cover"})}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"cover"})}),(0,t.jsxs)(d.td,{children:["Using the highest possible cover resolution via ",(0,t.jsx)(d.code,{children:"t_cover_big_2x"})]})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"background"})}),(0,t.jsxs)(d.td,{children:[(0,t.jsx)(d.code,{children:"artworks[0]"})," or ",(0,t.jsx)(d.code,{children:"screenshots[0]"})]}),(0,t.jsxs)(d.td,{children:["Only first artwork/screenshot is mapped. Using the highest possible 16:9 resolution via ",(0,t.jsx)(d.code,{children:"t_1080p_2x"})]})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"url_websites"})}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"websites.url"})}),(0,t.jsx)(d.td,{})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"url_screenshots"})}),(0,t.jsxs)(d.td,{children:[(0,t.jsx)(d.code,{children:"screenshots"})," and ",(0,t.jsx)(d.code,{children:"artworks"})]}),(0,t.jsxs)(d.td,{children:["Using the highest possible 16:9 resolution via ",(0,t.jsx)(d.code,{children:"t_1080p_2x"})]})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"url_trailers"})}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"videos"})}),(0,t.jsx)(d.td,{children:'Only when video title includes the words "trailer", "teaser" or "intro"'})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"url_gameplays"})}),(0,t.jsx)(d.td,{children:(0,t.jsx)(d.code,{children:"videos"})}),(0,t.jsx)(d.td,{children:'Only when video title includes the words "gameplay"'})]})]})]}),"\n",(0,t.jsx)(d.h3,{id:"age-rating",children:"Age Rating"}),"\n",(0,t.jsxs)(d.p,{children:['The table below shows how age ratings from GameVault and IGDB are matched. Ratings like "Not Yet Rated" are ignored. A game can have ratings from multiple systems. The IGDB integration calculates ',(0,t.jsx)(d.strong,{children:"the average of all ratings"}),", rounds it, and then saves it to GameVault."]}),"\n",(0,t.jsxs)(d.table,{children:[(0,t.jsx)(d.thead,{children:(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.th,{children:"Age Rating System"}),(0,t.jsx)(d.th,{children:"Rating Name"}),(0,t.jsx)(d.th,{children:"GameVault Minimum Age (Years)"}),(0,t.jsx)(d.th,{children:"IGDB Rating Enum Value"})]})}),(0,t.jsxs)(d.tbody,{children:[(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.strong,{children:"PEGI"})}),(0,t.jsx)(d.td,{children:"Three"}),(0,t.jsx)(d.td,{children:"3"}),(0,t.jsx)(d.td,{children:"1"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"Seven"}),(0,t.jsx)(d.td,{children:"7"}),(0,t.jsx)(d.td,{children:"2"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"Twelve"}),(0,t.jsx)(d.td,{children:"12"}),(0,t.jsx)(d.td,{children:"3"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"Sixteen"}),(0,t.jsx)(d.td,{children:"16"}),(0,t.jsx)(d.td,{children:"4"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"Eighteen"}),(0,t.jsx)(d.td,{children:"18"}),(0,t.jsx)(d.td,{children:"5"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.strong,{children:"ESRB"})}),(0,t.jsx)(d.td,{children:"EC"}),(0,t.jsx)(d.td,{children:"3"}),(0,t.jsx)(d.td,{children:"7"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"E"}),(0,t.jsx)(d.td,{children:"6"}),(0,t.jsx)(d.td,{children:"8"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"E10"}),(0,t.jsx)(d.td,{children:"10"}),(0,t.jsx)(d.td,{children:"9"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"T"}),(0,t.jsx)(d.td,{children:"13"}),(0,t.jsx)(d.td,{children:"10"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"M"}),(0,t.jsx)(d.td,{children:"17"}),(0,t.jsx)(d.td,{children:"11"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"AO"}),(0,t.jsx)(d.td,{children:"18"}),(0,t.jsx)(d.td,{children:"12"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.strong,{children:"CERO"})}),(0,t.jsx)(d.td,{children:"CERO_A"}),(0,t.jsx)(d.td,{children:"0"}),(0,t.jsx)(d.td,{children:"13"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"CERO_B"}),(0,t.jsx)(d.td,{children:"12"}),(0,t.jsx)(d.td,{children:"14"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"CERO_C"}),(0,t.jsx)(d.td,{children:"15"}),(0,t.jsx)(d.td,{children:"15"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"CERO_D"}),(0,t.jsx)(d.td,{children:"17"}),(0,t.jsx)(d.td,{children:"16"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"CERO_Z"}),(0,t.jsx)(d.td,{children:"18"}),(0,t.jsx)(d.td,{children:"17"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.strong,{children:"USK"})}),(0,t.jsx)(d.td,{children:"USK_0"}),(0,t.jsx)(d.td,{children:"0"}),(0,t.jsx)(d.td,{children:"18"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"USK_6"}),(0,t.jsx)(d.td,{children:"6"}),(0,t.jsx)(d.td,{children:"19"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"USK_12"}),(0,t.jsx)(d.td,{children:"12"}),(0,t.jsx)(d.td,{children:"20"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"USK_16"}),(0,t.jsx)(d.td,{children:"16"}),(0,t.jsx)(d.td,{children:"21"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"USK_18"}),(0,t.jsx)(d.td,{children:"18"}),(0,t.jsx)(d.td,{children:"22"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.strong,{children:"GRAC"})}),(0,t.jsx)(d.td,{children:"GRAC_ALL"}),(0,t.jsx)(d.td,{children:"0"}),(0,t.jsx)(d.td,{children:"23"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"GRAC_Twelve"}),(0,t.jsx)(d.td,{children:"12"}),(0,t.jsx)(d.td,{children:"24"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"GRAC_Fifteen"}),(0,t.jsx)(d.td,{children:"15"}),(0,t.jsx)(d.td,{children:"25"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"GRAC_Eighteen"}),(0,t.jsx)(d.td,{children:"18"}),(0,t.jsx)(d.td,{children:"26"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.strong,{children:"CLASS_IND"})}),(0,t.jsx)(d.td,{children:"CLASS_IND_L"}),(0,t.jsx)(d.td,{children:"0"}),(0,t.jsx)(d.td,{children:"28"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"CLASS_IND_Ten"}),(0,t.jsx)(d.td,{children:"10"}),(0,t.jsx)(d.td,{children:"29"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"CLASS_IND_Twelve"}),(0,t.jsx)(d.td,{children:"12"}),(0,t.jsx)(d.td,{children:"30"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"CLASS_IND_Fourteen"}),(0,t.jsx)(d.td,{children:"14"}),(0,t.jsx)(d.td,{children:"31"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"CLASS_IND_Sixteen"}),(0,t.jsx)(d.td,{children:"16"}),(0,t.jsx)(d.td,{children:"32"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"CLASS_IND_Eighteen"}),(0,t.jsx)(d.td,{children:"18"}),(0,t.jsx)(d.td,{children:"33"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{children:(0,t.jsx)(d.strong,{children:"ACB"})}),(0,t.jsx)(d.td,{children:"ACB_G"}),(0,t.jsx)(d.td,{children:"0"}),(0,t.jsx)(d.td,{children:"34"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"ACB_PG"}),(0,t.jsx)(d.td,{children:"8"}),(0,t.jsx)(d.td,{children:"35"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"ACB_M"}),(0,t.jsx)(d.td,{children:"15"}),(0,t.jsx)(d.td,{children:"36"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"ACB_MA15"}),(0,t.jsx)(d.td,{children:"15"}),(0,t.jsx)(d.td,{children:"37"})]}),(0,t.jsxs)(d.tr,{children:[(0,t.jsx)(d.td,{}),(0,t.jsx)(d.td,{children:"ACB_R18"}),(0,t.jsx)(d.td,{children:"18"}),(0,t.jsx)(d.td,{children:"38"})]})]})]})]})}function j(e={}){const{wrapper:d}={...(0,i.R)(),...e.components};return d?(0,t.jsx)(d,{...e,children:(0,t.jsx)(x,{...e})}):x(e)}},6981:(e,d,s)=>{s.d(d,{A:()=>r});const r=s.p+"assets/images/setup-step-1-531ca876d7d5343984b56d73b5fe2527.png"},4878:(e,d,s)=>{s.d(d,{A:()=>r});const r=s.p+"assets/images/setup-step-2-9b26b8c4e36c9ae8b00e578737b6412d.png"},2567:(e,d,s)=>{s.d(d,{A:()=>r});const r=s.p+"assets/images/setup-step-3-1f45dd581f8cc3ffc8071bdcc115f0b9.png"},7400:(e,d,s)=>{s.d(d,{A:()=>r});const r=s.p+"assets/images/setup-step-4-2906d1431be260bcadd96e0ce27e8749.png"},8591:(e,d,s)=>{s.d(d,{R:()=>n,x:()=>c});var r=s(758);const t={},i=r.createContext(t);function n(e){const d=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(d):{...d,...e}}),[d,e])}function c(e){let d;return d=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:n(e.components),r.createElement(i.Provider,{value:d},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1e0a1681.70244d0c.js b/assets/js/1e0a1681.5505b4df.js similarity index 99% rename from assets/js/1e0a1681.70244d0c.js rename to assets/js/1e0a1681.5505b4df.js index 62c800677..3c3d3a151 100644 --- a/assets/js/1e0a1681.70244d0c.js +++ b/assets/js/1e0a1681.5505b4df.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[8532],{7899:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"server-docs/setup/synology-container-manager","title":"Using Synology Container Manager","description":"Synology Container Manager is a software application developed by Synology Inc. for their network-attached storage (NAS) devices. It provides users with a graphical user interface for managing Docker containers, allowing them to deploy, manage, and monitor containerized applications on their Synology NAS.","source":"@site/docs/server-docs/setup/synology-container-manager.md","sourceDirName":"server-docs/setup","slug":"/server-docs/setup/synology-container-manager","permalink":"/docs/server-docs/setup/synology-container-manager","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/setup/synology-container-manager.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"sidebarPosition":6,"frontMatter":{"title":"Using Synology Container Manager","sidebar_position":6},"sidebar":"docs","previous":{"title":"Using UNRAID","permalink":"/docs/server-docs/setup/unraid"},"next":{"title":"Using Native Approach","permalink":"/docs/server-docs/setup/native"}}');var a=t(6070),r=t(8591);const s={title:"Using Synology Container Manager",sidebar_position:6},i=void 0,l={},c=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Step 1: Create Necessary Folders",id:"step-1-create-necessary-folders",level:2},{value:"Step 2: Set Up a Project in Container Manager",id:"step-2-set-up-a-project-in-container-manager",level:2},{value:"Step 3: Create Docker Compose File",id:"step-3-create-docker-compose-file",level:2},{value:"Alternative Step 3: Running without a PostgreSQL Database",id:"alternative-step-3-running-without-a-postgresql-database",level:3},{value:"Conclusion",id:"conclusion",level:2},{value:"Additional Info",id:"additional-info",level:2},{value:"Stopping the Server",id:"stopping-the-server",level:3},{value:"Reading the Logs",id:"reading-the-logs",level:3}];function d(e){const n={a:"a",admonition:"admonition",br:"br",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.p,{children:"Synology Container Manager is a software application developed by Synology Inc. for their network-attached storage (NAS) devices. It provides users with a graphical user interface for managing Docker containers, allowing them to deploy, manage, and monitor containerized applications on their Synology NAS."}),"\n",(0,a.jsx)(n.p,{children:"In this guide, you will learn how to set up GameVault on such a system using Docker Compose."}),"\n",(0,a.jsx)(n.admonition,{title:"Contribute to this page!",type:"note",children:(0,a.jsx)(n.p,{children:"Unfortunately, none of our team members uses Synology Hardware and this guide was written blindly. The GameVault Docs live from contributions. If you use a Synology system kindly contribute some screenshots to this page. Thanks!"})}),"\n",(0,a.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["Access to a Synology NAS with ",(0,a.jsx)(n.a,{href:"https://www.synology.com/dsm/packages/ContainerManager",children:"Container Manager"})," installed. See supported devices ",(0,a.jsx)(n.a,{href:"https://www.synology.com/dsm/packages/ContainerManager",children:"here"}),"."]}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"step-1-create-necessary-folders",children:"Step 1: Create Necessary Folders"}),"\n",(0,a.jsxs)(n.p,{children:["Begin by creating directories for the containers to utilize.",(0,a.jsx)(n.br,{}),"\n","Open ",(0,a.jsx)(n.code,{children:"File Station"})," and create the following folders:"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.code,{children:"/docker/projects/gamevault-compose"})}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.code,{children:"/docker/gamevault"})}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.code,{children:"/docker/gamevault/files"})}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.code,{children:"/docker/gamevault/media"})}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.code,{children:"/docker/gamevault/database"})}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"step-2-set-up-a-project-in-container-manager",children:"Step 2: Set Up a Project in Container Manager"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:["Open ",(0,a.jsx)(n.code,{children:"Container Manager"})," from your Synology NAS."]}),"\n",(0,a.jsx)(n.li,{children:"Click on 'Project' and then 'Create'"}),"\n",(0,a.jsxs)(n.li,{children:["Fill in the following details:","\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["Project Name: ",(0,a.jsx)(n.code,{children:"gamevault"})]}),"\n",(0,a.jsxs)(n.li,{children:["Path: ",(0,a.jsx)(n.code,{children:"/docker/projects/gamevault-compose"})]}),"\n",(0,a.jsx)(n.li,{children:"Source: Select 'Create docker-compose.yml'"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"step-3-create-docker-compose-file",children:"Step 3: Create Docker Compose File"}),"\n",(0,a.jsx)(n.p,{children:"Copy and paste the following code into the editor:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yml",children:"services:\r\n gamevault-backend:\r\n image: phalcode/gamevault-backend:latest\r\n restart: unless-stopped\r\n environment:\r\n DB_HOST: db\r\n DB_USERNAME: gamevault\r\n DB_PASSWORD: YOURPASSWORDHERE\r\n volumes:\r\n - /volume1/docker/gamevault/files:/files\r\n - /volume1/docker/gamevault/media:/media\r\n ports:\r\n - 8080:8080/tcp\r\n db:\r\n image: postgres:16\r\n restart: unless-stopped\r\n environment:\r\n POSTGRES_USER: gamevault\r\n POSTGRES_PASSWORD: YOURPASSWORDHERE\r\n POSTGRES_DB: gamevault\r\n volumes:\r\n - /volume1/docker/gamevault/database:/var/lib/postgresql/data\n"})}),"\n",(0,a.jsx)(n.admonition,{type:"note",children:(0,a.jsxs)(n.p,{children:["Replace the variables (",(0,a.jsx)(n.code,{children:"YOURPASSWORDHERE"}),", ",(0,a.jsx)(n.code,{children:"etc."}),"), as well as the folder paths with what suits you, of course. You can change the port on the left side of the colon aswell."]})}),"\n",(0,a.jsx)(n.admonition,{type:"warning",children:(0,a.jsx)(n.p,{children:"Password (YOURPASSWORDHERE) can't be empty! else the database will not work. If you don't want a password, consider running without a PostgreSQL Database (Not recommended)"})}),"\n",(0,a.jsx)(n.h3,{id:"alternative-step-3-running-without-a-postgresql-database",children:"Alternative Step 3: Running without a PostgreSQL Database"}),"\n",(0,a.jsx)(n.p,{children:"We don't recommend it, but you can run GameVault without a PostgreSQL Database too using the following configuration:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:'services:\r\n gamevault-backend:\r\n image: phalcode/gamevault-backend:latest\r\n restart: unless-stopped\r\n environment:\r\n DB_SYSTEM: "SQLITE"\r\n ports:\r\n - 8080:8080/tcp #Change the left one if you want\r\n volumes:\r\n - /volume1/docker/gamevault/files:/files\r\n - /volume1/docker/gamevault/media:/media\r\n - /volume1/docker/gamevault/database:/db\n'})}),"\n",(0,a.jsx)(n.admonition,{type:"note",children:(0,a.jsxs)(n.p,{children:["Replace the variables (",(0,a.jsx)(n.code,{children:"YOURPASSWORDHERE"}),", ",(0,a.jsx)(n.code,{children:"etc."}),"), as well as the folder paths with what suits you, of course. You can change the port on the left side of the colon aswell."]})}),"\n",(0,a.jsx)(n.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,a.jsx)(n.p,{children:"You've successfully set up GameVault Server using Synology Container Manager. You should now be able to access the web interface via your NAS's IP address followed by port 8080. If you encounter any issues or have feedback, please let us know."}),"\n",(0,a.jsx)(n.h2,{id:"additional-info",children:"Additional Info"}),"\n",(0,a.jsx)(n.h3,{id:"stopping-the-server",children:"Stopping the Server"}),"\n",(0,a.jsx)(n.p,{children:"To stop the GameVault Server, follow these steps:"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:["Navigate to ",(0,a.jsx)(n.code,{children:"Container Manager"})," on your Synology NAS."]}),"\n",(0,a.jsx)(n.li,{children:"Select the GameVault container from the list of running containers."}),"\n",(0,a.jsx)(n.li,{children:'Click on "Stop" to halt the container\'s operation.'}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"reading-the-logs",children:"Reading the Logs"}),"\n",(0,a.jsx)(n.p,{children:"To view the logs for the GameVault Server, do the following:"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:["Navigate to ",(0,a.jsx)(n.code,{children:"Container Manager"})," on your Synology NAS."]}),"\n",(0,a.jsx)(n.li,{children:"Select the GameVault container from the list of containers."}),"\n",(0,a.jsx)(n.li,{children:'Click on "Details" to expand the container\'s information.'}),"\n",(0,a.jsx)(n.li,{children:'Select the "Log" tab to view the container\'s logs in real-time.'}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},8591:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>i});var o=t(758);const a={},r=o.createContext(a);function s(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[8532],{7899:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"server-docs/setup/synology-container-manager","title":"Using Synology Container Manager","description":"Synology Container Manager is a software application developed by Synology Inc. for their network-attached storage (NAS) devices. It provides users with a graphical user interface for managing Docker containers, allowing them to deploy, manage, and monitor containerized applications on their Synology NAS.","source":"@site/docs/server-docs/setup/synology-container-manager.md","sourceDirName":"server-docs/setup","slug":"/server-docs/setup/synology-container-manager","permalink":"/docs/server-docs/setup/synology-container-manager","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/setup/synology-container-manager.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"sidebarPosition":6,"frontMatter":{"title":"Using Synology Container Manager","sidebar_position":6},"sidebar":"docs","previous":{"title":"Using UNRAID","permalink":"/docs/server-docs/setup/unraid"},"next":{"title":"Using Native Approach","permalink":"/docs/server-docs/setup/native"}}');var a=t(6070),r=t(8591);const s={title:"Using Synology Container Manager",sidebar_position:6},i=void 0,l={},c=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Step 1: Create Necessary Folders",id:"step-1-create-necessary-folders",level:2},{value:"Step 2: Set Up a Project in Container Manager",id:"step-2-set-up-a-project-in-container-manager",level:2},{value:"Step 3: Create Docker Compose File",id:"step-3-create-docker-compose-file",level:2},{value:"Alternative Step 3: Running without a PostgreSQL Database",id:"alternative-step-3-running-without-a-postgresql-database",level:3},{value:"Conclusion",id:"conclusion",level:2},{value:"Additional Info",id:"additional-info",level:2},{value:"Stopping the Server",id:"stopping-the-server",level:3},{value:"Reading the Logs",id:"reading-the-logs",level:3}];function d(e){const n={a:"a",admonition:"admonition",br:"br",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.p,{children:"Synology Container Manager is a software application developed by Synology Inc. for their network-attached storage (NAS) devices. It provides users with a graphical user interface for managing Docker containers, allowing them to deploy, manage, and monitor containerized applications on their Synology NAS."}),"\n",(0,a.jsx)(n.p,{children:"In this guide, you will learn how to set up GameVault on such a system using Docker Compose."}),"\n",(0,a.jsx)(n.admonition,{title:"Contribute to this page!",type:"note",children:(0,a.jsx)(n.p,{children:"Unfortunately, none of our team members uses Synology Hardware and this guide was written blindly. The GameVault Docs live from contributions. If you use a Synology system kindly contribute some screenshots to this page. Thanks!"})}),"\n",(0,a.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["Access to a Synology NAS with ",(0,a.jsx)(n.a,{href:"https://www.synology.com/dsm/packages/ContainerManager",children:"Container Manager"})," installed. See supported devices ",(0,a.jsx)(n.a,{href:"https://www.synology.com/dsm/packages/ContainerManager",children:"here"}),"."]}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"step-1-create-necessary-folders",children:"Step 1: Create Necessary Folders"}),"\n",(0,a.jsxs)(n.p,{children:["Begin by creating directories for the containers to utilize.",(0,a.jsx)(n.br,{}),"\n","Open ",(0,a.jsx)(n.code,{children:"File Station"})," and create the following folders:"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.code,{children:"/docker/projects/gamevault-compose"})}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.code,{children:"/docker/gamevault"})}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.code,{children:"/docker/gamevault/files"})}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.code,{children:"/docker/gamevault/media"})}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.code,{children:"/docker/gamevault/database"})}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"step-2-set-up-a-project-in-container-manager",children:"Step 2: Set Up a Project in Container Manager"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:["Open ",(0,a.jsx)(n.code,{children:"Container Manager"})," from your Synology NAS."]}),"\n",(0,a.jsx)(n.li,{children:"Click on 'Project' and then 'Create'"}),"\n",(0,a.jsxs)(n.li,{children:["Fill in the following details:","\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["Project Name: ",(0,a.jsx)(n.code,{children:"gamevault"})]}),"\n",(0,a.jsxs)(n.li,{children:["Path: ",(0,a.jsx)(n.code,{children:"/docker/projects/gamevault-compose"})]}),"\n",(0,a.jsx)(n.li,{children:"Source: Select 'Create docker-compose.yml'"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"step-3-create-docker-compose-file",children:"Step 3: Create Docker Compose File"}),"\n",(0,a.jsx)(n.p,{children:"Copy and paste the following code into the editor:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yml",children:"services:\r\n gamevault-backend:\r\n image: phalcode/gamevault-backend:latest\r\n restart: unless-stopped\r\n environment:\r\n DB_HOST: db\r\n DB_USERNAME: gamevault\r\n DB_PASSWORD: YOURPASSWORDHERE\r\n volumes:\r\n - /volume1/docker/gamevault/files:/files\r\n - /volume1/docker/gamevault/media:/media\r\n ports:\r\n - 8080:8080/tcp\r\n db:\r\n image: postgres:16\r\n restart: unless-stopped\r\n environment:\r\n POSTGRES_USER: gamevault\r\n POSTGRES_PASSWORD: YOURPASSWORDHERE\r\n POSTGRES_DB: gamevault\r\n volumes:\r\n - /volume1/docker/gamevault/database:/var/lib/postgresql/data\n"})}),"\n",(0,a.jsx)(n.admonition,{type:"note",children:(0,a.jsxs)(n.p,{children:["Replace the variables (",(0,a.jsx)(n.code,{children:"YOURPASSWORDHERE"}),", ",(0,a.jsx)(n.code,{children:"etc."}),"), as well as the folder paths with what suits you, of course. You can change the port on the left side of the colon aswell."]})}),"\n",(0,a.jsx)(n.admonition,{type:"warning",children:(0,a.jsx)(n.p,{children:"Password (YOURPASSWORDHERE) can't be empty! else the database will not work. If you don't want a password, consider running without a PostgreSQL Database (Not recommended)"})}),"\n",(0,a.jsx)(n.h3,{id:"alternative-step-3-running-without-a-postgresql-database",children:"Alternative Step 3: Running without a PostgreSQL Database"}),"\n",(0,a.jsx)(n.p,{children:"We don't recommend it, but you can run GameVault without a PostgreSQL Database too using the following configuration:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:'services:\r\n gamevault-backend:\r\n image: phalcode/gamevault-backend:latest\r\n restart: unless-stopped\r\n environment:\r\n DB_SYSTEM: "SQLITE"\r\n ports:\r\n - 8080:8080/tcp #Change the left one if you want\r\n volumes:\r\n - /volume1/docker/gamevault/files:/files\r\n - /volume1/docker/gamevault/media:/media\r\n - /volume1/docker/gamevault/database:/db\n'})}),"\n",(0,a.jsx)(n.admonition,{type:"note",children:(0,a.jsxs)(n.p,{children:["Replace the variables (",(0,a.jsx)(n.code,{children:"YOURPASSWORDHERE"}),", ",(0,a.jsx)(n.code,{children:"etc."}),"), as well as the folder paths with what suits you, of course. You can change the port on the left side of the colon aswell."]})}),"\n",(0,a.jsx)(n.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,a.jsx)(n.p,{children:"You've successfully set up GameVault Server using Synology Container Manager. You should now be able to access the web interface via your NAS's IP address followed by port 8080. If you encounter any issues or have feedback, please let us know."}),"\n",(0,a.jsx)(n.h2,{id:"additional-info",children:"Additional Info"}),"\n",(0,a.jsx)(n.h3,{id:"stopping-the-server",children:"Stopping the Server"}),"\n",(0,a.jsx)(n.p,{children:"To stop the GameVault Server, follow these steps:"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:["Navigate to ",(0,a.jsx)(n.code,{children:"Container Manager"})," on your Synology NAS."]}),"\n",(0,a.jsx)(n.li,{children:"Select the GameVault container from the list of running containers."}),"\n",(0,a.jsx)(n.li,{children:'Click on "Stop" to halt the container\'s operation.'}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"reading-the-logs",children:"Reading the Logs"}),"\n",(0,a.jsx)(n.p,{children:"To view the logs for the GameVault Server, do the following:"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:["Navigate to ",(0,a.jsx)(n.code,{children:"Container Manager"})," on your Synology NAS."]}),"\n",(0,a.jsx)(n.li,{children:"Select the GameVault container from the list of containers."}),"\n",(0,a.jsx)(n.li,{children:'Click on "Details" to expand the container\'s information.'}),"\n",(0,a.jsx)(n.li,{children:'Select the "Log" tab to view the container\'s logs in real-time.'}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},8591:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>i});var o=t(758);const a={},r=o.createContext(a);function s(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/264f4708.38166761.js b/assets/js/264f4708.a10c5719.js similarity index 99% rename from assets/js/264f4708.38166761.js rename to assets/js/264f4708.a10c5719.js index 7c5ef85c9..5fb4e00bc 100644 --- a/assets/js/264f4708.38166761.js +++ b/assets/js/264f4708.a10c5719.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[7706],{9789:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"advanced-usage/early-access-program","title":"Early Access Program","description":"Welcome","source":"@site/docs/advanced-usage/early-access-program.md","sourceDirName":"advanced-usage","slug":"/advanced-usage/early-access-program","permalink":"/docs/advanced-usage/early-access-program","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/advanced-usage/early-access-program.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"frontMatter":{},"sidebar":"docs","previous":{"title":"REST API Usage","permalink":"/docs/advanced-usage/rest-api"},"next":{"title":"Configuring Fail2Ban for GameVault","permalink":"/docs/advanced-usage/fail2ban-gamevault-guide"}}');var a=t(6070),r=t(8591);const i={},o="Early Access Program",l={},c=[{value:"Welcome",id:"welcome",level:2},{value:"Participation Requirements",id:"participation-requirements",level:3},{value:"How to Join",id:"how-to-join",level:3},{value:"Important Information",id:"important-information",level:3},{value:"FAQ for Early Access Testers",id:"faq-for-early-access-testers",level:2},{value:"How to switch to an early access version?",id:"how-to-switch-to-an-early-access-version",level:3},{value:"How to return to a stable version?",id:"how-to-return-to-a-stable-version",level:3},{value:"Where to report bugs and suggest/discuss changes?",id:"where-to-report-bugs-and-suggestdiscuss-changes",level:3}];function d(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(s.header,{children:(0,a.jsx)(s.h1,{id:"early-access-program",children:"Early Access Program"})}),"\n",(0,a.jsx)(s.h2,{id:"welcome",children:"Welcome"}),"\n",(0,a.jsx)(s.p,{children:"Welcome to the GameVault Early Access Program! This exclusive opportunity allows you to be among the first to experience upcoming GameVault updates before they are released to the public. As a member of this special group, you'll have the chance to explore new features ahead of time. However, please keep in mind that these early releases may not be as stable as our regular versions. Your active participation and feedback are crucial in helping us refine and improve everything before the official release for everyone."}),"\n",(0,a.jsx)(s.h3,{id:"participation-requirements",children:"Participation Requirements"}),"\n",(0,a.jsx)(s.p,{children:"To join the Early Access Program, please make sure to meet the following requirements:"}),"\n",(0,a.jsxs)(s.ul,{children:["\n",(0,a.jsx)(s.li,{children:"Actively participate in the designated Discord channel and follow the pinned messages."}),"\n",(0,a.jsxs)(s.li,{children:["Have GameVault installed from the Microsoft Store and be logged in with your Microsoft Account. If you haven't installed it yet, you can get it ",(0,a.jsx)(s.a,{href:"https://www.microsoft.com/store/apps/9PCKDV76GL75",children:"here"}),"."]}),"\n",(0,a.jsxs)(s.li,{children:["If required in the current phase: Run a GameVault Server with the ",(0,a.jsxs)(s.strong,{children:["phalcode/gamevault-backend",":early-access"]})," image. (Only use this image if all users on your server are participating in the Early Access Program and have been accepted as testers, as it may cause issues!)"]}),"\n"]}),"\n",(0,a.jsx)(s.h3,{id:"how-to-join",children:"How to Join"}),"\n",(0,a.jsx)(s.p,{children:"To become part of the program, follow these simple steps:"}),"\n",(0,a.jsxs)(s.ol,{children:["\n",(0,a.jsxs)(s.li,{children:["Fill out the ",(0,a.jsx)(s.a,{href:"https://forms.gle/RQvEGfWeUFPBCUaG6",children:"Application Form"}),"."]}),"\n",(0,a.jsx)(s.li,{children:"Wait for the early access phase to begin. Details will be shared in the exclusive Discord channel."}),"\n"]}),"\n",(0,a.jsx)(s.h3,{id:"important-information",children:"Important Information"}),"\n",(0,a.jsxs)(s.ul,{children:["\n",(0,a.jsx)(s.li,{children:"The Early Access Program has limited slots, with priority given to Supporters and Trusted Members."}),"\n",(0,a.jsx)(s.li,{children:"If you are accepted and later found not meeting the requirements, you may be removed from future testing, allowing the next applicant on our list to take your place."}),"\n"]}),"\n",(0,a.jsx)(s.h2,{id:"faq-for-early-access-testers",children:"FAQ for Early Access Testers"}),"\n",(0,a.jsx)(s.h3,{id:"how-to-switch-to-an-early-access-version",children:"How to switch to an early access version?"}),"\n",(0,a.jsxs)(s.ol,{children:["\n",(0,a.jsx)(s.li,{children:"Wait for the early access phase to start."}),"\n",(0,a.jsx)(s.li,{children:"Start the app and accept early access update."}),"\n",(0,a.jsxs)(s.li,{children:["Restart the App and check the version in the settings. If it contains ",(0,a.jsx)(s.code,{children:"EA"})," or ",(0,a.jsx)(s.code,{children:"Early Access"}),", you're on the early-access channel."]}),"\n"]}),"\n",(0,a.jsx)(s.h3,{id:"how-to-return-to-a-stable-version",children:"How to return to a stable version?"}),"\n",(0,a.jsxs)(s.ol,{children:["\n",(0,a.jsxs)(s.li,{children:["\n",(0,a.jsx)(s.p,{children:"Contact the Phalcode Team via Discord to remove you from our testers list in the Microsoft Store."}),"\n"]}),"\n",(0,a.jsxs)(s.li,{children:["\n",(0,a.jsx)(s.p,{children:"Exit and Uninstall the app."}),"\n",(0,a.jsx)(s.pre,{children:(0,a.jsx)(s.code,{className:"language-ps1",children:"winget uninstall gamevault\n"})}),"\n"]}),"\n",(0,a.jsxs)(s.li,{children:["\n",(0,a.jsx)(s.p,{children:"Reinstall it by running."}),"\n",(0,a.jsx)(s.pre,{children:(0,a.jsx)(s.code,{className:"language-ps1",children:"winget install gamevault\n"})}),"\n"]}),"\n",(0,a.jsxs)(s.li,{children:["\n",(0,a.jsx)(s.p,{children:"Start the App. If it asks if you want to update you have to decline it every time."}),"\n"]}),"\n",(0,a.jsxs)(s.li,{children:["\n",(0,a.jsxs)(s.p,{children:["Check the version in the settings. If it does not contain ",(0,a.jsx)(s.code,{children:"EA"})," or ",(0,a.jsx)(s.code,{children:"Early Access"}),", you're back on the stable channel."]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(s.h3,{id:"where-to-report-bugs-and-suggestdiscuss-changes",children:"Where to report bugs and suggest/discuss changes?"}),"\n",(0,a.jsxs)(s.ul,{children:["\n",(0,a.jsx)(s.li,{children:"Head over to the Discord #early-access channel once you're accepted into the group. This is where you can report bugs, as well as suggest and discuss changes."}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,a.jsx)(s,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},8591:(e,s,t)=>{t.d(s,{R:()=>i,x:()=>o});var n=t(758);const a={},r=n.createContext(a);function i(e){const s=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function o(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),n.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[7706],{9789:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"advanced-usage/early-access-program","title":"Early Access Program","description":"Welcome","source":"@site/docs/advanced-usage/early-access-program.md","sourceDirName":"advanced-usage","slug":"/advanced-usage/early-access-program","permalink":"/docs/advanced-usage/early-access-program","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/advanced-usage/early-access-program.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"frontMatter":{},"sidebar":"docs","previous":{"title":"REST API Usage","permalink":"/docs/advanced-usage/rest-api"},"next":{"title":"Configuring Fail2Ban for GameVault","permalink":"/docs/advanced-usage/fail2ban-gamevault-guide"}}');var a=t(6070),r=t(8591);const i={},o="Early Access Program",l={},c=[{value:"Welcome",id:"welcome",level:2},{value:"Participation Requirements",id:"participation-requirements",level:3},{value:"How to Join",id:"how-to-join",level:3},{value:"Important Information",id:"important-information",level:3},{value:"FAQ for Early Access Testers",id:"faq-for-early-access-testers",level:2},{value:"How to switch to an early access version?",id:"how-to-switch-to-an-early-access-version",level:3},{value:"How to return to a stable version?",id:"how-to-return-to-a-stable-version",level:3},{value:"Where to report bugs and suggest/discuss changes?",id:"where-to-report-bugs-and-suggestdiscuss-changes",level:3}];function d(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(s.header,{children:(0,a.jsx)(s.h1,{id:"early-access-program",children:"Early Access Program"})}),"\n",(0,a.jsx)(s.h2,{id:"welcome",children:"Welcome"}),"\n",(0,a.jsx)(s.p,{children:"Welcome to the GameVault Early Access Program! This exclusive opportunity allows you to be among the first to experience upcoming GameVault updates before they are released to the public. As a member of this special group, you'll have the chance to explore new features ahead of time. However, please keep in mind that these early releases may not be as stable as our regular versions. Your active participation and feedback are crucial in helping us refine and improve everything before the official release for everyone."}),"\n",(0,a.jsx)(s.h3,{id:"participation-requirements",children:"Participation Requirements"}),"\n",(0,a.jsx)(s.p,{children:"To join the Early Access Program, please make sure to meet the following requirements:"}),"\n",(0,a.jsxs)(s.ul,{children:["\n",(0,a.jsx)(s.li,{children:"Actively participate in the designated Discord channel and follow the pinned messages."}),"\n",(0,a.jsxs)(s.li,{children:["Have GameVault installed from the Microsoft Store and be logged in with your Microsoft Account. If you haven't installed it yet, you can get it ",(0,a.jsx)(s.a,{href:"https://www.microsoft.com/store/apps/9PCKDV76GL75",children:"here"}),"."]}),"\n",(0,a.jsxs)(s.li,{children:["If required in the current phase: Run a GameVault Server with the ",(0,a.jsxs)(s.strong,{children:["phalcode/gamevault-backend",":early-access"]})," image. (Only use this image if all users on your server are participating in the Early Access Program and have been accepted as testers, as it may cause issues!)"]}),"\n"]}),"\n",(0,a.jsx)(s.h3,{id:"how-to-join",children:"How to Join"}),"\n",(0,a.jsx)(s.p,{children:"To become part of the program, follow these simple steps:"}),"\n",(0,a.jsxs)(s.ol,{children:["\n",(0,a.jsxs)(s.li,{children:["Fill out the ",(0,a.jsx)(s.a,{href:"https://forms.gle/RQvEGfWeUFPBCUaG6",children:"Application Form"}),"."]}),"\n",(0,a.jsx)(s.li,{children:"Wait for the early access phase to begin. Details will be shared in the exclusive Discord channel."}),"\n"]}),"\n",(0,a.jsx)(s.h3,{id:"important-information",children:"Important Information"}),"\n",(0,a.jsxs)(s.ul,{children:["\n",(0,a.jsx)(s.li,{children:"The Early Access Program has limited slots, with priority given to Supporters and Trusted Members."}),"\n",(0,a.jsx)(s.li,{children:"If you are accepted and later found not meeting the requirements, you may be removed from future testing, allowing the next applicant on our list to take your place."}),"\n"]}),"\n",(0,a.jsx)(s.h2,{id:"faq-for-early-access-testers",children:"FAQ for Early Access Testers"}),"\n",(0,a.jsx)(s.h3,{id:"how-to-switch-to-an-early-access-version",children:"How to switch to an early access version?"}),"\n",(0,a.jsxs)(s.ol,{children:["\n",(0,a.jsx)(s.li,{children:"Wait for the early access phase to start."}),"\n",(0,a.jsx)(s.li,{children:"Start the app and accept early access update."}),"\n",(0,a.jsxs)(s.li,{children:["Restart the App and check the version in the settings. If it contains ",(0,a.jsx)(s.code,{children:"EA"})," or ",(0,a.jsx)(s.code,{children:"Early Access"}),", you're on the early-access channel."]}),"\n"]}),"\n",(0,a.jsx)(s.h3,{id:"how-to-return-to-a-stable-version",children:"How to return to a stable version?"}),"\n",(0,a.jsxs)(s.ol,{children:["\n",(0,a.jsxs)(s.li,{children:["\n",(0,a.jsx)(s.p,{children:"Contact the Phalcode Team via Discord to remove you from our testers list in the Microsoft Store."}),"\n"]}),"\n",(0,a.jsxs)(s.li,{children:["\n",(0,a.jsx)(s.p,{children:"Exit and Uninstall the app."}),"\n",(0,a.jsx)(s.pre,{children:(0,a.jsx)(s.code,{className:"language-ps1",children:"winget uninstall gamevault\n"})}),"\n"]}),"\n",(0,a.jsxs)(s.li,{children:["\n",(0,a.jsx)(s.p,{children:"Reinstall it by running."}),"\n",(0,a.jsx)(s.pre,{children:(0,a.jsx)(s.code,{className:"language-ps1",children:"winget install gamevault\n"})}),"\n"]}),"\n",(0,a.jsxs)(s.li,{children:["\n",(0,a.jsx)(s.p,{children:"Start the App. If it asks if you want to update you have to decline it every time."}),"\n"]}),"\n",(0,a.jsxs)(s.li,{children:["\n",(0,a.jsxs)(s.p,{children:["Check the version in the settings. If it does not contain ",(0,a.jsx)(s.code,{children:"EA"})," or ",(0,a.jsx)(s.code,{children:"Early Access"}),", you're back on the stable channel."]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(s.h3,{id:"where-to-report-bugs-and-suggestdiscuss-changes",children:"Where to report bugs and suggest/discuss changes?"}),"\n",(0,a.jsxs)(s.ul,{children:["\n",(0,a.jsx)(s.li,{children:"Head over to the Discord #early-access channel once you're accepted into the group. This is where you can report bugs, as well as suggest and discuss changes."}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,a.jsx)(s,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},8591:(e,s,t)=>{t.d(s,{R:()=>i,x:()=>o});var n=t(758);const a={},r=n.createContext(a);function i(e){const s=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function o(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),n.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/31861b5f.bb9544e8.js b/assets/js/31861b5f.3f3e4627.js similarity index 98% rename from assets/js/31861b5f.bb9544e8.js rename to assets/js/31861b5f.3f3e4627.js index 4cd66e747..b13915b1d 100644 --- a/assets/js/31861b5f.bb9544e8.js +++ b/assets/js/31861b5f.3f3e4627.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[905],{6356:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>r,metadata:()=>a,toc:()=>u});const a=JSON.parse('{"id":"gamevault-plus/integrations/steam","title":"Steam","description":"GameVault+ offers seamless integration with Steam through the Steam Sync Integration. When enabled, all your installed games are automatically synced to your Steam Library and appear as Non-Steam Games. Launching these games via Steam will route them through GameVault, ensuring all your custom launch options are preserved.","source":"@site/docs/gamevault-plus/integrations/steam.md","sourceDirName":"gamevault-plus/integrations","slug":"/gamevault-plus/integrations/steam","permalink":"/docs/gamevault-plus/integrations/steam","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/gamevault-plus/integrations/steam.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"frontMatter":{"title":"Steam"},"sidebar":"docs","previous":{"title":"Playnite","permalink":"/docs/gamevault-plus/integrations/playnite"},"next":{"title":"Licensing and Contributions","permalink":"/docs/license-contribute"}}');var s=n(6070),i=n(8591);const r={title:"Steam"},o=void 0,l={},u=[{value:"Setup Guide",id:"setup-guide",level:2},{value:"Prerequisites",id:"prerequisites",level:3},{value:"Step 1: Enable Steam Sync",id:"step-1-enable-steam-sync",level:3},{value:"Important Notes",id:"important-notes",level:2}];function c(e){const t={a:"a",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"GameVault+"})," offers seamless integration with ",(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.a,{href:"https://steampowered.com",children:"Steam"})})," through the ",(0,s.jsx)(t.strong,{children:"Steam Sync Integration"}),". When enabled, all your installed games are automatically synced to your Steam Library and appear as Non-Steam Games. Launching these games via Steam will route them through GameVault, ensuring all your custom launch options are preserved."]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Steam Integration Showcase",src:n(2616).A+"",width:"2552",height:"1392"})}),"\n",(0,s.jsx)(t.h2,{id:"setup-guide",children:"Setup Guide"}),"\n",(0,s.jsx)(t.h3,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,s.jsxs)(t.p,{children:["Before starting, ensure that you have ",(0,s.jsx)(t.a,{href:"https://store.steampowered.com/about/",children:"installed Steam"}),", are logged into your Steam account, and are ",(0,s.jsxs)(t.a,{href:"/docs/gamevault-plus/client-setup",children:["logged in to ",(0,s.jsx)(t.strong,{children:"GameVault+"})]})," within your GameVault application."]}),"\n",(0,s.jsx)(t.h3,{id:"step-1-enable-steam-sync",children:(0,s.jsx)(t.strong,{children:"Step 1: Enable Steam Sync"})}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["Fully shut down your Steam client using the ",(0,s.jsx)(t.strong,{children:"Exit Steam"})," button."]}),"\n",(0,s.jsxs)(t.li,{children:["Open the GameVault Application and click on the ",(0,s.jsx)(t.strong,{children:"Settings"})," tab."]}),"\n",(0,s.jsxs)(t.li,{children:["Navigate to ",(0,s.jsx)(t.strong,{children:"GameVault+"})," -> ",(0,s.jsx)(t.strong,{children:"Features"})," -> ",(0,s.jsx)(t.strong,{children:"Steam"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:["Toggle ",(0,s.jsx)(t.strong,{children:"Sync"})," to enable the integration."]}),"\n",(0,s.jsx)(t.li,{children:"Restart Steam. Your installed games will now sync with your Steam Library."}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"important-notes",children:"Important Notes"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["GameVault does not touch any of your existing game shortcuts. If any issues arise, such as lost or corrupted non-Steam game shortcuts, you can restore them using the ",(0,s.jsx)(t.strong,{children:"Restore Backup"})," button. This will revert your shortcuts to their original state before any changes were made by GameVault."]}),"\n",(0,s.jsx)(t.li,{children:"All GameVault games will display the GameVault logo as their mini-icon. This is a limitation of Steam's hardcoded behavior and cannot be customized."}),"\n",(0,s.jsx)(t.li,{children:"The sync will always target the last logged in Steam account. If you have multiple Steam accounts, just log in to the one you want to use. Then repeat the setup process."}),"\n"]})]})}function d(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},2616:(e,t,n)=>{n.d(t,{A:()=>a});const a=n.p+"assets/images/showcase-86b299fddfea2c32efb1d7cb05404920.png"},8591:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>o});var a=n(758);const s={},i=a.createContext(s);function r(e){const t=a.useContext(i);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),a.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[905],{6356:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>r,metadata:()=>a,toc:()=>u});const a=JSON.parse('{"id":"gamevault-plus/integrations/steam","title":"Steam","description":"GameVault+ offers seamless integration with Steam through the Steam Sync Integration. When enabled, all your installed games are automatically synced to your Steam Library and appear as Non-Steam Games. Launching these games via Steam will route them through GameVault, ensuring all your custom launch options are preserved.","source":"@site/docs/gamevault-plus/integrations/steam.md","sourceDirName":"gamevault-plus/integrations","slug":"/gamevault-plus/integrations/steam","permalink":"/docs/gamevault-plus/integrations/steam","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/gamevault-plus/integrations/steam.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"frontMatter":{"title":"Steam"},"sidebar":"docs","previous":{"title":"Playnite","permalink":"/docs/gamevault-plus/integrations/playnite"},"next":{"title":"Licensing and Contributions","permalink":"/docs/license-contribute"}}');var s=n(6070),i=n(8591);const r={title:"Steam"},o=void 0,l={},u=[{value:"Setup Guide",id:"setup-guide",level:2},{value:"Prerequisites",id:"prerequisites",level:3},{value:"Step 1: Enable Steam Sync",id:"step-1-enable-steam-sync",level:3},{value:"Important Notes",id:"important-notes",level:2}];function c(e){const t={a:"a",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"GameVault+"})," offers seamless integration with ",(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.a,{href:"https://steampowered.com",children:"Steam"})})," through the ",(0,s.jsx)(t.strong,{children:"Steam Sync Integration"}),". When enabled, all your installed games are automatically synced to your Steam Library and appear as Non-Steam Games. Launching these games via Steam will route them through GameVault, ensuring all your custom launch options are preserved."]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Steam Integration Showcase",src:n(2616).A+"",width:"2552",height:"1392"})}),"\n",(0,s.jsx)(t.h2,{id:"setup-guide",children:"Setup Guide"}),"\n",(0,s.jsx)(t.h3,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,s.jsxs)(t.p,{children:["Before starting, ensure that you have ",(0,s.jsx)(t.a,{href:"https://store.steampowered.com/about/",children:"installed Steam"}),", are logged into your Steam account, and are ",(0,s.jsxs)(t.a,{href:"/docs/gamevault-plus/client-setup",children:["logged in to ",(0,s.jsx)(t.strong,{children:"GameVault+"})]})," within your GameVault application."]}),"\n",(0,s.jsx)(t.h3,{id:"step-1-enable-steam-sync",children:(0,s.jsx)(t.strong,{children:"Step 1: Enable Steam Sync"})}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["Fully shut down your Steam client using the ",(0,s.jsx)(t.strong,{children:"Exit Steam"})," button."]}),"\n",(0,s.jsxs)(t.li,{children:["Open the GameVault Application and click on the ",(0,s.jsx)(t.strong,{children:"Settings"})," tab."]}),"\n",(0,s.jsxs)(t.li,{children:["Navigate to ",(0,s.jsx)(t.strong,{children:"GameVault+"})," -> ",(0,s.jsx)(t.strong,{children:"Features"})," -> ",(0,s.jsx)(t.strong,{children:"Steam"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:["Toggle ",(0,s.jsx)(t.strong,{children:"Sync"})," to enable the integration."]}),"\n",(0,s.jsx)(t.li,{children:"Restart Steam. Your installed games will now sync with your Steam Library."}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"important-notes",children:"Important Notes"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["GameVault does not touch any of your existing game shortcuts. If any issues arise, such as lost or corrupted non-Steam game shortcuts, you can restore them using the ",(0,s.jsx)(t.strong,{children:"Restore Backup"})," button. This will revert your shortcuts to their original state before any changes were made by GameVault."]}),"\n",(0,s.jsx)(t.li,{children:"All GameVault games will display the GameVault logo as their mini-icon. This is a limitation of Steam's hardcoded behavior and cannot be customized."}),"\n",(0,s.jsx)(t.li,{children:"The sync will always target the last logged in Steam account. If you have multiple Steam accounts, just log in to the one you want to use. Then repeat the setup process."}),"\n"]})]})}function d(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},2616:(e,t,n)=>{n.d(t,{A:()=>a});const a=n.p+"assets/images/showcase-86b299fddfea2c32efb1d7cb05404920.png"},8591:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>o});var a=n(758);const s={},i=a.createContext(s);function r(e){const t=a.useContext(i);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),a.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/435302bb.1ec096b8.js b/assets/js/435302bb.9c8e6c8f.js similarity index 99% rename from assets/js/435302bb.1ec096b8.js rename to assets/js/435302bb.9c8e6c8f.js index 2ece30ee6..218ef6d44 100644 --- a/assets/js/435302bb.1ec096b8.js +++ b/assets/js/435302bb.9c8e6c8f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[2298],{2270:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"client-docs/how-to-use","title":"How to Use","description":"File & Folder Structure","source":"@site/docs/client-docs/how-to-use.md","sourceDirName":"client-docs","slug":"/client-docs/how-to-use","permalink":"/docs/client-docs/how-to-use","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/client-docs/how-to-use.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"sidebarPosition":2,"frontMatter":{"sidebar_position":2},"sidebar":"docs","previous":{"title":"Setting up a GameVault Client","permalink":"/docs/client-docs/setup"},"next":{"title":"Updating the Client","permalink":"/docs/client-docs/updating-client"}}');var i=a(6070),o=a(8591);const s={sidebar_position:2},r="How to Use",l={},d=[{value:"File & Folder Structure",id:"file--folder-structure",level:2},{value:"Downloading Games",id:"downloading-games",level:2},{value:"1. Extracting the Game",id:"1-extracting-the-game",level:3},{value:"2. Installing the Game",id:"2-installing-the-game",level:3},{value:"Installing Portable Games",id:"installing-portable-games",level:4},{value:"Installing Setup Games",id:"installing-setup-games",level:4},{value:"Clearing Remains",id:"clearing-remains",level:4},{value:"Playing a Game",id:"playing-a-game",level:2},{value:"Tracking Your Game Progress",id:"tracking-your-game-progress",level:2},{value:"Modifying Games",id:"modifying-games",level:2},{value:"Modifying Users",id:"modifying-users",level:2},{value:"Exiting or Relaunching the App",id:"exiting-or-relaunching-the-app",level:2}];function c(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"how-to-use",children:"How to Use"})}),"\n",(0,i.jsx)(t.h2,{id:"file--folder-structure",children:"File & Folder Structure"}),"\n",(0,i.jsx)(t.admonition,{title:"Example",type:"note",children:(0,i.jsxs)(t.p,{children:["Let's say you installed GameVault freshly and configured your Root folder path to ",(0,i.jsx)(t.code,{children:"D:/"})," because your D Drive is larger."]})}),"\n",(0,i.jsx)(t.p,{children:"GameVault will now generate its folder structure. When everything is done, your file system will look like this:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"D:/GameVault/"})," - Root Folder","\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"D:/GameVault/Downloads/"})," - This folder is where your downloads will be saved. For each downloaded game, GameVault generates a new folder in this directory."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"D:/GameVault/Installations/"})," - This folder is where your installed games belong. For each downloaded game, GameVault generates a new folder in this directory."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"downloading-games",children:"Downloading Games"}),"\n",(0,i.jsxs)(t.p,{children:["Let's say you found the game ",(0,i.jsx)(t.code,{children:"Assassin's Creed Unity (Game ID: 74)"})," in the Library tab and chose to download it."]}),"\n",(0,i.jsx)(t.admonition,{type:"warning",children:(0,i.jsx)(t.p,{children:"Only download games from servers you fully trust! There's a potential risk of malware. If your antivirus alerts during the following process, abort any download and installation of the game, fully delete the downloaded data, and warn your server admins to address the malware promptly."})}),"\n",(0,i.jsx)(t.p,{children:"As stated above, GameVault generates two folders to store the game files and uses the game ID in the name to identify them:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.code,{children:"/GameVault/Downloads/(74) Assassin's Creed Unity/"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.code,{children:"/GameVault/Installations/(74) Assassin's Creed Unity/"})}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["Your downloaded game archive will be saved in ",(0,i.jsx)(t.code,{children:"/GameVault/Downloads/(74) Assassin's Creed Unity/"}),". The ",(0,i.jsx)(t.code,{children:"/GameVault/Installations/(74) Assassin's Creed Unity/"})," folder should be empty for now."]}),"\n",(0,i.jsx)(t.p,{children:"To start playing a game you've downloaded, follow these steps to install it. This process makes it easier for you."}),"\n",(0,i.jsx)(t.p,{children:"Game installation has two main parts:"}),"\n",(0,i.jsx)(t.h3,{id:"1-extracting-the-game",children:"1. Extracting the Game"}),"\n",(0,i.jsxs)(t.p,{children:["GameVault games are ",(0,i.jsx)(t.a,{href:"/docs/server-docs/structure",children:"always served in some kind of archive format"}),". So you will need to extract them."]}),"\n",(0,i.jsxs)(t.p,{children:["After the download is complete, locate the ",(0,i.jsx)(t.code,{children:"Extract"})," button. Clicking it will extract the game into a subfolder called ",(0,i.jsx)(t.code,{children:"Extracted"})," within the game's Download Directory. A progress bar shows the extraction progress and estimated remaining time. Larger or extremely compressed games may take longer to extract."]}),"\n",(0,i.jsx)(t.p,{children:"If there are extraction errors, you can retry the extraction unless you deleted the game archive. Error details are displayed in the user interface. If you encounter repeated extraction errors for the same game, try to extract the game manually or contact your GameVault server administrators to check the integrity of those games."}),"\n",(0,i.jsx)(t.h3,{id:"2-installing-the-game",children:"2. Installing the Game"}),"\n",(0,i.jsxs)(t.p,{children:["There are different types of GameVault games. ",(0,i.jsx)(t.a,{href:"/docs/server-docs/game-types",children:"You can find more information about them here"}),"."]}),"\n",(0,i.jsx)(t.p,{children:"For now, we will focus on the general concept of Portable and Setup Games."}),"\n",(0,i.jsx)(t.p,{children:"Portable games are ready to play out of the box, while Setup games require additional setup before playing."}),"\n",(0,i.jsx)(t.admonition,{title:"What determines the game type?",type:"note",children:(0,i.jsxs)(t.p,{children:["The server automatically tries to determine the game's type based on the content, but errors can occur. Administrators can manually overwrite the detected game type by including a ",(0,i.jsx)(t.a,{href:"/docs/server-docs/structure",children:"type override in the file name"}),"."]})}),"\n",(0,i.jsx)(t.h4,{id:"installing-portable-games",children:"Installing Portable Games"}),"\n",(0,i.jsxs)(t.p,{children:["For portable games, GameVault provides a very simple installation process. You don't need to select an executable file. Just press the ",(0,i.jsx)(t.code,{children:"Install"})," button. GameVault will automatically move all the extracted game content to your game's installation directory. This should happen instantly."]}),"\n",(0,i.jsxs)(t.p,{children:["Once the installation is complete, your game is ready to be played in the library. If necessary, select the appropriate executable file to launch in the Game Settings tab and click ",(0,i.jsx)(t.code,{children:"Play"}),"."]}),"\n",(0,i.jsx)(t.admonition,{title:"No Game Executable",type:"note",children:(0,i.jsx)(t.p,{children:"If you don't see a game executable here but instead see a setup executable, the game's type has incorrectly been set to a portable type on the server. Contact your server administrators to manually override that game's type to a setup type. Then, manually move the files inside your game's installation folder back into the game's download folder. Run the installer and manually select the now-empty game's installation folder as its destination."})}),"\n",(0,i.jsx)(t.h4,{id:"installing-setup-games",children:"Installing Setup Games"}),"\n",(0,i.jsxs)(t.p,{children:["For games that require installation, GameVault will provide a dropdown menu to launch a setup executable file. Select the appropriate setup.exe file and press the ",(0,i.jsx)(t.code,{children:"Install"})," button."]}),"\n",(0,i.jsx)(t.admonition,{title:"No Setup Executable",type:"note",children:(0,i.jsxs)(t.p,{children:["If you don't see a setup executable here but instead see the game's executable, it may have incorrectly been set to a setup type on the server. Contact your server administrators to manually override that game's type to a portable type. Then, manually move the files inside the game downloads ",(0,i.jsx)(t.code,{children:"Extracted/"})," folder to the game's corresponding installation folder, and you should be ready to play."]})}),"\n",(0,i.jsxs)(t.p,{children:["During the external setup process ",(0,i.jsx)(t.strong,{children:"it is crucial to set the destination folder for your game files to your game's Installation folder"})," (e.g., ",(0,i.jsx)(t.code,{children:"/GameVault/Installations/(74) Assassin's Creed Unity/"}),"). This is where the final game files and executable should be located. If you don't set the destination, GameVault will have no idea where to look for your game files, and the game won't be playable. If you missed setting the destination folder or set it wrongly, uninstall the game from your system and retry this step."]}),"\n",(0,i.jsxs)(t.p,{children:["Once the installation is complete, your game is ready to be played. Just select the appropriate .exe file to launch in the Installations tab and click ",(0,i.jsx)(t.code,{children:"Play"}),"."]}),"\n",(0,i.jsx)(t.admonition,{title:"Why does GameVault not fully automate the setup procedure?",type:"info",children:(0,i.jsx)(t.p,{children:"Different external installers and setups work very differently, making it nearly impossible to fully automate every type. However, all installers have one thing in common: the ability to choose the installation path for the game. GameVault guides you through the process, but you still need to manually select the installation path and click through the installer."})}),"\n",(0,i.jsx)(t.h4,{id:"clearing-remains",children:"Clearing Remains"}),"\n",(0,i.jsx)(t.p,{children:"Once you have fully confirmed that a game works, you are free to delete the game's corresponding Download using the trash icon in the downloads tab."}),"\n",(0,i.jsx)(t.h2,{id:"playing-a-game",children:"Playing a Game"}),"\n",(0,i.jsxs)(t.p,{children:["Launching a game on GameVault is simple. Once your game is installed and ready to go, it will appear in the \"Installed Games\" tab. If GameVault didn't correctly predict the correct executable to launch automatically, you can change it in the game's settings and click the ",(0,i.jsx)(t.code,{children:"Play"})," button to start the game."]}),"\n",(0,i.jsx)(t.h2,{id:"tracking-your-game-progress",children:"Tracking Your Game Progress"}),"\n",(0,i.jsxs)(t.p,{children:["Once GameVault is launched, it automatically activates a time-tracking daemon. This diligent daemon continuously monitors your game progress, specifically your playtime, and promptly sends this information to the server whenever any .exe file (except those on the ignore-list) is running within a folder located in your Installations directory ",(0,i.jsx)(t.code,{children:"/Installations/*"}),". Even if you play without an internet connection, your playtime will still be tracked and updated on the server as soon as you regain connectivity."]}),"\n",(0,i.jsx)(t.p,{children:'In our context, the term "Progress" refers to a user\'s activity of playing a game. Each user can have a single progress entry per game.'}),"\n",(0,i.jsx)(t.p,{children:"The progress entry includes the completion state, which can be modified through the community tab, as well as the tracked playtime and some other additional information."}),"\n",(0,i.jsx)(t.p,{children:"You have the ability to change the progress state or delete it using the community tab. Certain states also change automatically, such as transitioning from UNPLAYED to PLAYING when the game is launched."}),"\n",(0,i.jsx)(t.admonition,{type:"warning",children:(0,i.jsx)(t.p,{children:"Please note that this Progress does not include your savegames. GameVault does not (yet \ud83d\ude09) have the capability to synchronize or store your savegames. Therefore, it is advisable to create backups of your savegames before uninstalling any games."})}),"\n",(0,i.jsx)(t.h2,{id:"modifying-games",children:"Modifying Games"}),"\n",(0,i.jsx)(t.p,{children:"If you are unhappy with the Box Art or Background Image of a game on your server or if there are incorrect Metadata associated with a game, there is a straightforward solution."}),"\n",(0,i.jsxs)(t.p,{children:["If you have the ",(0,i.jsx)(t.code,{children:"EDITOR"})," role or higher on your GameVault server, you can modify games by following these steps:"]}),"\n",(0,i.jsx)(t.p,{children:"Open the game settings by clicking on the settings icon, either in the top-right corner of the box art image or on the game's detail page. A popup will appear."}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["Under ",(0,i.jsx)(t.strong,{children:"Edit Images"}),", you can select/paste/drop an image or paste a URL for different box art or background image."]}),"\n",(0,i.jsxs)(t.li,{children:["Under ",(0,i.jsx)(t.strong,{children:"Metadata"}),", you can remap/unmap incorrectly associated metadata for each provider."]}),"\n",(0,i.jsxs)(t.li,{children:["Under ",(0,i.jsx)(t.strong,{children:"Custom Metadata"}),", you can manually overwrite the Metadata of the game."]}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"Please note that any changes made will affect all users on the server."}),"\n",(0,i.jsx)(t.h2,{id:"modifying-users",children:"Modifying Users"}),"\n",(0,i.jsx)(t.p,{children:"If you want to change the data, profile picture, or background image of your User:"}),"\n",(0,i.jsx)(t.p,{children:"Click your User Icon on the top left corner, then locate and click on the Settings Icon in the top right corner, and a popup will appear."}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["Under ",(0,i.jsx)(t.strong,{children:"Edit Images"}),", you can select/paste/drop an image or paste a URL for different avatar or background image."]}),"\n",(0,i.jsxs)(t.li,{children:["Under ",(0,i.jsx)(t.strong,{children:"Edit Details"}),", you can change the data of your user."]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["If you have the ",(0,i.jsx)(t.code,{children:"ADMIN"})," role or higher on your GameVault server, you can do the same for all other user profiles in the Admin Dashboard."]}),"\n",(0,i.jsx)(t.h2,{id:"exiting-or-relaunching-the-app",children:"Exiting or Relaunching the App"}),"\n",(0,i.jsx)(t.p,{children:'In order to maintain playtime tracking functionality, simply closing the launcher using the X-Button does not terminate the GameVault process. Instead, it minimizes the app to the system Tray. Therefore, if you truly wish to exit the application, be sure to right-click and select "Exit" from the context menu. The same principle applies when restarting the app. Only one GameVault window can be active at a time, so initiating another GameVault merely brings the minimized app to the forefront without actually restarting it.'})]})}function h(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8591:(e,t,a)=>{a.d(t,{R:()=>s,x:()=>r});var n=a(758);const i={},o=n.createContext(i);function s(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[2298],{2270:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"client-docs/how-to-use","title":"How to Use","description":"File & Folder Structure","source":"@site/docs/client-docs/how-to-use.md","sourceDirName":"client-docs","slug":"/client-docs/how-to-use","permalink":"/docs/client-docs/how-to-use","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/client-docs/how-to-use.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"sidebarPosition":2,"frontMatter":{"sidebar_position":2},"sidebar":"docs","previous":{"title":"Setting up a GameVault Client","permalink":"/docs/client-docs/setup"},"next":{"title":"Updating the Client","permalink":"/docs/client-docs/updating-client"}}');var i=a(6070),o=a(8591);const s={sidebar_position:2},r="How to Use",l={},d=[{value:"File & Folder Structure",id:"file--folder-structure",level:2},{value:"Downloading Games",id:"downloading-games",level:2},{value:"1. Extracting the Game",id:"1-extracting-the-game",level:3},{value:"2. Installing the Game",id:"2-installing-the-game",level:3},{value:"Installing Portable Games",id:"installing-portable-games",level:4},{value:"Installing Setup Games",id:"installing-setup-games",level:4},{value:"Clearing Remains",id:"clearing-remains",level:4},{value:"Playing a Game",id:"playing-a-game",level:2},{value:"Tracking Your Game Progress",id:"tracking-your-game-progress",level:2},{value:"Modifying Games",id:"modifying-games",level:2},{value:"Modifying Users",id:"modifying-users",level:2},{value:"Exiting or Relaunching the App",id:"exiting-or-relaunching-the-app",level:2}];function c(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"how-to-use",children:"How to Use"})}),"\n",(0,i.jsx)(t.h2,{id:"file--folder-structure",children:"File & Folder Structure"}),"\n",(0,i.jsx)(t.admonition,{title:"Example",type:"note",children:(0,i.jsxs)(t.p,{children:["Let's say you installed GameVault freshly and configured your Root folder path to ",(0,i.jsx)(t.code,{children:"D:/"})," because your D Drive is larger."]})}),"\n",(0,i.jsx)(t.p,{children:"GameVault will now generate its folder structure. When everything is done, your file system will look like this:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"D:/GameVault/"})," - Root Folder","\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"D:/GameVault/Downloads/"})," - This folder is where your downloads will be saved. For each downloaded game, GameVault generates a new folder in this directory."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"D:/GameVault/Installations/"})," - This folder is where your installed games belong. For each downloaded game, GameVault generates a new folder in this directory."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"downloading-games",children:"Downloading Games"}),"\n",(0,i.jsxs)(t.p,{children:["Let's say you found the game ",(0,i.jsx)(t.code,{children:"Assassin's Creed Unity (Game ID: 74)"})," in the Library tab and chose to download it."]}),"\n",(0,i.jsx)(t.admonition,{type:"warning",children:(0,i.jsx)(t.p,{children:"Only download games from servers you fully trust! There's a potential risk of malware. If your antivirus alerts during the following process, abort any download and installation of the game, fully delete the downloaded data, and warn your server admins to address the malware promptly."})}),"\n",(0,i.jsx)(t.p,{children:"As stated above, GameVault generates two folders to store the game files and uses the game ID in the name to identify them:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.code,{children:"/GameVault/Downloads/(74) Assassin's Creed Unity/"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.code,{children:"/GameVault/Installations/(74) Assassin's Creed Unity/"})}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["Your downloaded game archive will be saved in ",(0,i.jsx)(t.code,{children:"/GameVault/Downloads/(74) Assassin's Creed Unity/"}),". The ",(0,i.jsx)(t.code,{children:"/GameVault/Installations/(74) Assassin's Creed Unity/"})," folder should be empty for now."]}),"\n",(0,i.jsx)(t.p,{children:"To start playing a game you've downloaded, follow these steps to install it. This process makes it easier for you."}),"\n",(0,i.jsx)(t.p,{children:"Game installation has two main parts:"}),"\n",(0,i.jsx)(t.h3,{id:"1-extracting-the-game",children:"1. Extracting the Game"}),"\n",(0,i.jsxs)(t.p,{children:["GameVault games are ",(0,i.jsx)(t.a,{href:"/docs/server-docs/structure",children:"always served in some kind of archive format"}),". So you will need to extract them."]}),"\n",(0,i.jsxs)(t.p,{children:["After the download is complete, locate the ",(0,i.jsx)(t.code,{children:"Extract"})," button. Clicking it will extract the game into a subfolder called ",(0,i.jsx)(t.code,{children:"Extracted"})," within the game's Download Directory. A progress bar shows the extraction progress and estimated remaining time. Larger or extremely compressed games may take longer to extract."]}),"\n",(0,i.jsx)(t.p,{children:"If there are extraction errors, you can retry the extraction unless you deleted the game archive. Error details are displayed in the user interface. If you encounter repeated extraction errors for the same game, try to extract the game manually or contact your GameVault server administrators to check the integrity of those games."}),"\n",(0,i.jsx)(t.h3,{id:"2-installing-the-game",children:"2. Installing the Game"}),"\n",(0,i.jsxs)(t.p,{children:["There are different types of GameVault games. ",(0,i.jsx)(t.a,{href:"/docs/server-docs/game-types",children:"You can find more information about them here"}),"."]}),"\n",(0,i.jsx)(t.p,{children:"For now, we will focus on the general concept of Portable and Setup Games."}),"\n",(0,i.jsx)(t.p,{children:"Portable games are ready to play out of the box, while Setup games require additional setup before playing."}),"\n",(0,i.jsx)(t.admonition,{title:"What determines the game type?",type:"note",children:(0,i.jsxs)(t.p,{children:["The server automatically tries to determine the game's type based on the content, but errors can occur. Administrators can manually overwrite the detected game type by including a ",(0,i.jsx)(t.a,{href:"/docs/server-docs/structure",children:"type override in the file name"}),"."]})}),"\n",(0,i.jsx)(t.h4,{id:"installing-portable-games",children:"Installing Portable Games"}),"\n",(0,i.jsxs)(t.p,{children:["For portable games, GameVault provides a very simple installation process. You don't need to select an executable file. Just press the ",(0,i.jsx)(t.code,{children:"Install"})," button. GameVault will automatically move all the extracted game content to your game's installation directory. This should happen instantly."]}),"\n",(0,i.jsxs)(t.p,{children:["Once the installation is complete, your game is ready to be played in the library. If necessary, select the appropriate executable file to launch in the Game Settings tab and click ",(0,i.jsx)(t.code,{children:"Play"}),"."]}),"\n",(0,i.jsx)(t.admonition,{title:"No Game Executable",type:"note",children:(0,i.jsx)(t.p,{children:"If you don't see a game executable here but instead see a setup executable, the game's type has incorrectly been set to a portable type on the server. Contact your server administrators to manually override that game's type to a setup type. Then, manually move the files inside your game's installation folder back into the game's download folder. Run the installer and manually select the now-empty game's installation folder as its destination."})}),"\n",(0,i.jsx)(t.h4,{id:"installing-setup-games",children:"Installing Setup Games"}),"\n",(0,i.jsxs)(t.p,{children:["For games that require installation, GameVault will provide a dropdown menu to launch a setup executable file. Select the appropriate setup.exe file and press the ",(0,i.jsx)(t.code,{children:"Install"})," button."]}),"\n",(0,i.jsx)(t.admonition,{title:"No Setup Executable",type:"note",children:(0,i.jsxs)(t.p,{children:["If you don't see a setup executable here but instead see the game's executable, it may have incorrectly been set to a setup type on the server. Contact your server administrators to manually override that game's type to a portable type. Then, manually move the files inside the game downloads ",(0,i.jsx)(t.code,{children:"Extracted/"})," folder to the game's corresponding installation folder, and you should be ready to play."]})}),"\n",(0,i.jsxs)(t.p,{children:["During the external setup process ",(0,i.jsx)(t.strong,{children:"it is crucial to set the destination folder for your game files to your game's Installation folder"})," (e.g., ",(0,i.jsx)(t.code,{children:"/GameVault/Installations/(74) Assassin's Creed Unity/"}),"). This is where the final game files and executable should be located. If you don't set the destination, GameVault will have no idea where to look for your game files, and the game won't be playable. If you missed setting the destination folder or set it wrongly, uninstall the game from your system and retry this step."]}),"\n",(0,i.jsxs)(t.p,{children:["Once the installation is complete, your game is ready to be played. Just select the appropriate .exe file to launch in the Installations tab and click ",(0,i.jsx)(t.code,{children:"Play"}),"."]}),"\n",(0,i.jsx)(t.admonition,{title:"Why does GameVault not fully automate the setup procedure?",type:"info",children:(0,i.jsx)(t.p,{children:"Different external installers and setups work very differently, making it nearly impossible to fully automate every type. However, all installers have one thing in common: the ability to choose the installation path for the game. GameVault guides you through the process, but you still need to manually select the installation path and click through the installer."})}),"\n",(0,i.jsx)(t.h4,{id:"clearing-remains",children:"Clearing Remains"}),"\n",(0,i.jsx)(t.p,{children:"Once you have fully confirmed that a game works, you are free to delete the game's corresponding Download using the trash icon in the downloads tab."}),"\n",(0,i.jsx)(t.h2,{id:"playing-a-game",children:"Playing a Game"}),"\n",(0,i.jsxs)(t.p,{children:["Launching a game on GameVault is simple. Once your game is installed and ready to go, it will appear in the \"Installed Games\" tab. If GameVault didn't correctly predict the correct executable to launch automatically, you can change it in the game's settings and click the ",(0,i.jsx)(t.code,{children:"Play"})," button to start the game."]}),"\n",(0,i.jsx)(t.h2,{id:"tracking-your-game-progress",children:"Tracking Your Game Progress"}),"\n",(0,i.jsxs)(t.p,{children:["Once GameVault is launched, it automatically activates a time-tracking daemon. This diligent daemon continuously monitors your game progress, specifically your playtime, and promptly sends this information to the server whenever any .exe file (except those on the ignore-list) is running within a folder located in your Installations directory ",(0,i.jsx)(t.code,{children:"/Installations/*"}),". Even if you play without an internet connection, your playtime will still be tracked and updated on the server as soon as you regain connectivity."]}),"\n",(0,i.jsx)(t.p,{children:'In our context, the term "Progress" refers to a user\'s activity of playing a game. Each user can have a single progress entry per game.'}),"\n",(0,i.jsx)(t.p,{children:"The progress entry includes the completion state, which can be modified through the community tab, as well as the tracked playtime and some other additional information."}),"\n",(0,i.jsx)(t.p,{children:"You have the ability to change the progress state or delete it using the community tab. Certain states also change automatically, such as transitioning from UNPLAYED to PLAYING when the game is launched."}),"\n",(0,i.jsx)(t.admonition,{type:"warning",children:(0,i.jsx)(t.p,{children:"Please note that this Progress does not include your savegames. GameVault does not (yet \ud83d\ude09) have the capability to synchronize or store your savegames. Therefore, it is advisable to create backups of your savegames before uninstalling any games."})}),"\n",(0,i.jsx)(t.h2,{id:"modifying-games",children:"Modifying Games"}),"\n",(0,i.jsx)(t.p,{children:"If you are unhappy with the Box Art or Background Image of a game on your server or if there are incorrect Metadata associated with a game, there is a straightforward solution."}),"\n",(0,i.jsxs)(t.p,{children:["If you have the ",(0,i.jsx)(t.code,{children:"EDITOR"})," role or higher on your GameVault server, you can modify games by following these steps:"]}),"\n",(0,i.jsx)(t.p,{children:"Open the game settings by clicking on the settings icon, either in the top-right corner of the box art image or on the game's detail page. A popup will appear."}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["Under ",(0,i.jsx)(t.strong,{children:"Edit Images"}),", you can select/paste/drop an image or paste a URL for different box art or background image."]}),"\n",(0,i.jsxs)(t.li,{children:["Under ",(0,i.jsx)(t.strong,{children:"Metadata"}),", you can remap/unmap incorrectly associated metadata for each provider."]}),"\n",(0,i.jsxs)(t.li,{children:["Under ",(0,i.jsx)(t.strong,{children:"Custom Metadata"}),", you can manually overwrite the Metadata of the game."]}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"Please note that any changes made will affect all users on the server."}),"\n",(0,i.jsx)(t.h2,{id:"modifying-users",children:"Modifying Users"}),"\n",(0,i.jsx)(t.p,{children:"If you want to change the data, profile picture, or background image of your User:"}),"\n",(0,i.jsx)(t.p,{children:"Click your User Icon on the top left corner, then locate and click on the Settings Icon in the top right corner, and a popup will appear."}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["Under ",(0,i.jsx)(t.strong,{children:"Edit Images"}),", you can select/paste/drop an image or paste a URL for different avatar or background image."]}),"\n",(0,i.jsxs)(t.li,{children:["Under ",(0,i.jsx)(t.strong,{children:"Edit Details"}),", you can change the data of your user."]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["If you have the ",(0,i.jsx)(t.code,{children:"ADMIN"})," role or higher on your GameVault server, you can do the same for all other user profiles in the Admin Dashboard."]}),"\n",(0,i.jsx)(t.h2,{id:"exiting-or-relaunching-the-app",children:"Exiting or Relaunching the App"}),"\n",(0,i.jsx)(t.p,{children:'In order to maintain playtime tracking functionality, simply closing the launcher using the X-Button does not terminate the GameVault process. Instead, it minimizes the app to the system Tray. Therefore, if you truly wish to exit the application, be sure to right-click and select "Exit" from the context menu. The same principle applies when restarting the app. Only one GameVault window can be active at a time, so initiating another GameVault merely brings the minimized app to the forefront without actually restarting it.'})]})}function h(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8591:(e,t,a)=>{a.d(t,{R:()=>s,x:()=>r});var n=a(758);const i={},o=n.createContext(i);function s(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/438c7fa2.ec914ac3.js b/assets/js/438c7fa2.54d94833.js similarity index 97% rename from assets/js/438c7fa2.ec914ac3.js rename to assets/js/438c7fa2.54d94833.js index 96ba7fe14..03c8e1a2a 100644 --- a/assets/js/438c7fa2.ec914ac3.js +++ b/assets/js/438c7fa2.54d94833.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[8733],{1495:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>d,contentTitle:()=>a,default:()=>u,frontMatter:()=>i,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"server-docs/server-news","title":"Server News","description":"You can keep your users informed by adding a news.md file. Use it to link your game wishlist form, share key updates, or simply greet them.","source":"@site/docs/server-docs/server-news.md","sourceDirName":"server-docs","slug":"/server-docs/server-news","permalink":"/docs/server-docs/server-news","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/server-news.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"sidebarPosition":11,"frontMatter":{"sidebar_position":11},"sidebar":"docs","previous":{"title":"Parental Control","permalink":"/docs/server-docs/parental-control"},"next":{"title":"Setting up a GameVault Client","permalink":"/docs/client-docs/setup"}}');var r=n(6070),o=n(8591);const i={sidebar_position:11},a="Server News",d={},c=[];function l(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",header:"header",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"server-news",children:"Server News"})}),"\n",(0,r.jsxs)(s.p,{children:["You can keep your users informed by adding a ",(0,r.jsx)(s.code,{children:"news.md"})," file. Use it to link your game wishlist form, share key updates, or simply greet them."]}),"\n",(0,r.jsxs)(s.p,{children:["This file supports ",(0,r.jsx)(s.a,{href:"https://wikipedia.org/wiki/Markdown",children:"Markdown"})," syntax, making it easy to format and structure your content. You can edit the ",(0,r.jsx)(s.code,{children:"news.md"})," file using any text editor or script. It is located at ",(0,r.jsx)(s.code,{children:"/config/news.md"}),". If you're using Docker, simply mount that folder as a volume:"]}),"\n",(0,r.jsx)(s.admonition,{type:"note",children:(0,r.jsxs)(s.p,{children:["When updating the ",(0,r.jsx)(s.code,{children:"news.md"})," file., users will receive a notification ping-icon in their client, ensuring they see the latest news."]})}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-yaml",children:"[...]\nvolumes:\n - /your/config/folder:/config\n - [...]\n[...]\n"})})]})}function u(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8591:(e,s,n)=>{n.d(s,{R:()=>i,x:()=>a});var t=n(758);const r={},o=t.createContext(r);function i(e){const s=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),t.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[8733],{1495:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>d,contentTitle:()=>a,default:()=>u,frontMatter:()=>i,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"server-docs/server-news","title":"Server News","description":"You can keep your users informed by adding a news.md file. Use it to link your game wishlist form, share key updates, or simply greet them.","source":"@site/docs/server-docs/server-news.md","sourceDirName":"server-docs","slug":"/server-docs/server-news","permalink":"/docs/server-docs/server-news","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/server-news.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"sidebarPosition":11,"frontMatter":{"sidebar_position":11},"sidebar":"docs","previous":{"title":"Parental Control","permalink":"/docs/server-docs/parental-control"},"next":{"title":"Setting up a GameVault Client","permalink":"/docs/client-docs/setup"}}');var r=n(6070),o=n(8591);const i={sidebar_position:11},a="Server News",d={},c=[];function l(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",header:"header",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"server-news",children:"Server News"})}),"\n",(0,r.jsxs)(s.p,{children:["You can keep your users informed by adding a ",(0,r.jsx)(s.code,{children:"news.md"})," file. Use it to link your game wishlist form, share key updates, or simply greet them."]}),"\n",(0,r.jsxs)(s.p,{children:["This file supports ",(0,r.jsx)(s.a,{href:"https://wikipedia.org/wiki/Markdown",children:"Markdown"})," syntax, making it easy to format and structure your content. You can edit the ",(0,r.jsx)(s.code,{children:"news.md"})," file using any text editor or script. It is located at ",(0,r.jsx)(s.code,{children:"/config/news.md"}),". If you're using Docker, simply mount that folder as a volume:"]}),"\n",(0,r.jsx)(s.admonition,{type:"note",children:(0,r.jsxs)(s.p,{children:["When updating the ",(0,r.jsx)(s.code,{children:"news.md"})," file., users will receive a notification ping-icon in their client, ensuring they see the latest news."]})}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-yaml",children:"[...]\nvolumes:\n - /your/config/folder:/config\n - [...]\n[...]\n"})})]})}function u(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8591:(e,s,n)=>{n.d(s,{R:()=>i,x:()=>a});var t=n(758);const r={},o=t.createContext(r);function i(e){const s=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),t.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4a631206.4be31b55.js b/assets/js/4a631206.8473279d.js similarity index 98% rename from assets/js/4a631206.4be31b55.js rename to assets/js/4a631206.8473279d.js index 483dd3431..dbbc5586a 100644 --- a/assets/js/4a631206.4be31b55.js +++ b/assets/js/4a631206.8473279d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[6188],{2934:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"server-docs/updating-games","title":"Updating Games","description":"Applying an Update to a Game","source":"@site/docs/server-docs/updating-games.md","sourceDirName":"server-docs","slug":"/server-docs/updating-games","permalink":"/docs/server-docs/updating-games","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/updating-games.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"sidebarPosition":5,"frontMatter":{"sidebar_position":5},"sidebar":"docs","previous":{"title":"Adding Games to GameVault","permalink":"/docs/server-docs/adding-games"},"next":{"title":"User Management","permalink":"/docs/server-docs/user-management"}}');var s=a(6070),i=a(8591);const r={sidebar_position:5},o="Updating Games",d={},l=[{value:"Applying an Update to a Game",id:"applying-an-update-to-a-game",level:2},{value:"Example",id:"example",level:3},{value:"Changing or Moving a Game",id:"changing-or-moving-a-game",level:2}];function c(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"updating-games",children:"Updating Games"})}),"\n",(0,s.jsx)(n.h2,{id:"applying-an-update-to-a-game",children:"Applying an Update to a Game"}),"\n",(0,s.jsxs)(n.p,{children:["To update a game, simply delete the existing game file and replace it with a new one in the files directory (by default ",(0,s.jsx)(n.code,{children:"/files"}),")."]}),"\n",(0,s.jsxs)(n.p,{children:["You can freely modify the early access and version flags of your game. As long as the ",(0,s.jsx)(n.strong,{children:"path"})," or ",(0,s.jsx)(n.strong,{children:"the combination of title and release year"})," of the new file matches the old file, GameVault's indexer will recognize it as an update. The same game entity will be restored if needed and updated with the new file's information, while preserving any progress associated with the game."]}),"\n",(0,s.jsx)(n.h3,{id:"example",children:"Example"}),"\n",(0,s.jsxs)(n.p,{children:["Let's say you have a very outdated version of the game ",(0,s.jsx)(n.code,{children:"Minecraft (EA) (v1.8b) (2011).zip"})," and you want to update it to the newest version, such as ",(0,s.jsx)(n.code,{children:"Minecraft (v1.20.1) (2011).7z"}),":"]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Delete ",(0,s.jsx)(n.code,{children:"Minecraft (EA) (v1.8b) (2011).zip"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Insert ",(0,s.jsx)(n.code,{children:"Minecraft (v1.20.1) (2011).7z"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Wait for the automatic indexing process to detect and register the changes."}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["If you want to keep multiple versions of the same game, refer to the documentation on ",(0,s.jsx)(n.a,{href:"/docs/server-docs/adding-games#adding-the-same-game-multiple-times",children:"adding the same game multiple times"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"changing-or-moving-a-game",children:"Changing or Moving a Game"}),"\n",(0,s.jsxs)(n.p,{children:["Changing or moving a game is also a breeze. As long as the ",(0,s.jsx)(n.strong,{children:"path"})," or ",(0,s.jsx)(n.strong,{children:"the combination of title and release year"})," of the moved or renamed file matches the old file, GameVault's indexer will recognize it as an update. The same game entity will be updated with the new file's information, while preserving any progress associated with the game."]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8591:(e,n,a)=>{a.d(n,{R:()=>r,x:()=>o});var t=a(758);const s={},i=t.createContext(s);function r(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[6188],{2934:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"server-docs/updating-games","title":"Updating Games","description":"Applying an Update to a Game","source":"@site/docs/server-docs/updating-games.md","sourceDirName":"server-docs","slug":"/server-docs/updating-games","permalink":"/docs/server-docs/updating-games","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/updating-games.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"sidebarPosition":5,"frontMatter":{"sidebar_position":5},"sidebar":"docs","previous":{"title":"Adding Games to GameVault","permalink":"/docs/server-docs/adding-games"},"next":{"title":"User Management","permalink":"/docs/server-docs/user-management"}}');var s=a(6070),i=a(8591);const r={sidebar_position:5},o="Updating Games",d={},l=[{value:"Applying an Update to a Game",id:"applying-an-update-to-a-game",level:2},{value:"Example",id:"example",level:3},{value:"Changing or Moving a Game",id:"changing-or-moving-a-game",level:2}];function c(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"updating-games",children:"Updating Games"})}),"\n",(0,s.jsx)(n.h2,{id:"applying-an-update-to-a-game",children:"Applying an Update to a Game"}),"\n",(0,s.jsxs)(n.p,{children:["To update a game, simply delete the existing game file and replace it with a new one in the files directory (by default ",(0,s.jsx)(n.code,{children:"/files"}),")."]}),"\n",(0,s.jsxs)(n.p,{children:["You can freely modify the early access and version flags of your game. As long as the ",(0,s.jsx)(n.strong,{children:"path"})," or ",(0,s.jsx)(n.strong,{children:"the combination of title and release year"})," of the new file matches the old file, GameVault's indexer will recognize it as an update. The same game entity will be restored if needed and updated with the new file's information, while preserving any progress associated with the game."]}),"\n",(0,s.jsx)(n.h3,{id:"example",children:"Example"}),"\n",(0,s.jsxs)(n.p,{children:["Let's say you have a very outdated version of the game ",(0,s.jsx)(n.code,{children:"Minecraft (EA) (v1.8b) (2011).zip"})," and you want to update it to the newest version, such as ",(0,s.jsx)(n.code,{children:"Minecraft (v1.20.1) (2011).7z"}),":"]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Delete ",(0,s.jsx)(n.code,{children:"Minecraft (EA) (v1.8b) (2011).zip"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Insert ",(0,s.jsx)(n.code,{children:"Minecraft (v1.20.1) (2011).7z"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Wait for the automatic indexing process to detect and register the changes."}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["If you want to keep multiple versions of the same game, refer to the documentation on ",(0,s.jsx)(n.a,{href:"/docs/server-docs/adding-games#adding-the-same-game-multiple-times",children:"adding the same game multiple times"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"changing-or-moving-a-game",children:"Changing or Moving a Game"}),"\n",(0,s.jsxs)(n.p,{children:["Changing or moving a game is also a breeze. As long as the ",(0,s.jsx)(n.strong,{children:"path"})," or ",(0,s.jsx)(n.strong,{children:"the combination of title and release year"})," of the moved or renamed file matches the old file, GameVault's indexer will recognize it as an update. The same game entity will be updated with the new file's information, while preserving any progress associated with the game."]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8591:(e,n,a)=>{a.d(n,{R:()=>r,x:()=>o});var t=a(758);const s={},i=t.createContext(s);function r(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4d393b3e.dd5ce451.js b/assets/js/4d393b3e.7ae35ff4.js similarity index 98% rename from assets/js/4d393b3e.dd5ce451.js rename to assets/js/4d393b3e.7ae35ff4.js index a08516326..df4888a24 100644 --- a/assets/js/4d393b3e.dd5ce451.js +++ b/assets/js/4d393b3e.7ae35ff4.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[7624],{289:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"server-docs/backup-and-restore","title":"Database Backup & Restoration","description":"The Backup and Restoration Mechanisms in GameVault are currently experimental and should not be your primary backup solution. Always maintain your database backups independently and only consider using this as a last resort. In summary, we recommend avoiding this entire process whenever possible, as it can potentially be quite fragile and prone to issues. But i guess something is better than nothing...","source":"@site/docs/server-docs/backup-and-restore.md","sourceDirName":"server-docs","slug":"/server-docs/backup-and-restore","permalink":"/docs/server-docs/backup-and-restore","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/backup-and-restore.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"sidebarPosition":7.5,"frontMatter":{"sidebar_position":7.5},"sidebar":"docs","previous":{"title":"Provider: IGDB","permalink":"/docs/server-docs/metadata-enrichment/provider-igdb"},"next":{"title":"Media","permalink":"/docs/server-docs/media"}}');var r=a(6070),n=a(8591);const o={sidebar_position:7.5},i="Database Backup & Restoration",d={},c=[{value:"Backup",id:"backup",level:2},{value:"Restoration",id:"restoration",level:2}];function l(e){const t={a:"a",admonition:"admonition",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",...(0,n.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"database-backup--restoration",children:"Database Backup & Restoration"})}),"\n",(0,r.jsx)(t.admonition,{title:"Experimental",type:"warning",children:(0,r.jsxs)(t.p,{children:["The Backup and Restoration Mechanisms in GameVault are currently experimental and should ",(0,r.jsx)(t.strong,{children:"not"})," be your primary backup solution. Always maintain your database backups independently and only consider using this as a last resort. In summary, we recommend avoiding this entire process whenever possible, as it can potentially be quite fragile and prone to issues. But i guess something is better than nothing..."]})}),"\n",(0,r.jsx)(t.admonition,{title:"Security Measurements",type:"note",children:(0,r.jsx)(t.p,{children:"For security resons any database operation outlined below must be additionally authenticated using your database password."})}),"\n",(0,r.jsx)(t.h2,{id:"backup",children:"Backup"}),"\n",(0,r.jsxs)(t.p,{children:["GameVault offers a user-friendly backup system for both supported database systems, Postgres and SQLite. You can trigger and download backups either through the GameVault Client or directly via the ",(0,r.jsx)(t.a,{href:"../advanced-usage/rest-api",children:"API"})," for automation purposes. Each backup is a complete database snapshot, and it's essential to handle these files with care, as they are unencrypted. You can create as many backups as needed."]}),"\n",(0,r.jsx)(t.p,{children:"For SQLite, the GameVault Backup simply duplicates the database file."}),"\n",(0,r.jsx)(t.p,{children:"For Postgres, it utilizes pgdump to create a comprehensive database dump."}),"\n",(0,r.jsx)(t.h2,{id:"restoration",children:"Restoration"}),"\n",(0,r.jsx)(t.p,{children:"Restoring a backup is a straightforward process."}),"\n",(0,r.jsxs)(t.p,{children:["You can trigger the restoration and upload backups using the GameVault Client or via the ",(0,r.jsx)(t.a,{href:"../advanced-usage/rest-api",children:"API"})," for automated procedures. However, before you proceed, there are some critical points to consider:"]}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsx)(t.p,{children:"We strongly discourage restoring a backup on a different server version. If you must do it, consider downgrading your GameVault server to a lower version, ideally the version of your backup, as higher versions are more likely to cause compatibility issues. If you have no alternative, make sure to back up your current data again before proceeding."}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Never, under any circumstances"}),", attempt to restore a backup from a different database technology (e.g., SQLite to Postgres or vice versa). This will result in a catastrophic failure."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsx)(t.p,{children:"Always monitor the server logs while restoring a backup. If you notice anything unusual or different than a harmless warning, make a copy and securely store the file located at /tmp/gamevault-pre-restore.db on your container/server. This file serves as a backup created just before restoring the uploaded backup. In case of a major failure, GameVault may also perform this pre-restore backup restoration automatically. If you encounter difficulties, attempt to restore from this file. If this doesn't resolve the issue, you may need to explore manual restoration or consider other backup options."}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsx)(t.p,{children:"The Restoration is not incremental. It hard-deletes everything and hard-restores everything."}),"\n"]}),"\n"]})]})}function u(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8591:(e,t,a)=>{a.d(t,{R:()=>o,x:()=>i});var s=a(758);const r={},n=s.createContext(r);function o(e){const t=s.useContext(n);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[7624],{289:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"server-docs/backup-and-restore","title":"Database Backup & Restoration","description":"The Backup and Restoration Mechanisms in GameVault are currently experimental and should not be your primary backup solution. Always maintain your database backups independently and only consider using this as a last resort. In summary, we recommend avoiding this entire process whenever possible, as it can potentially be quite fragile and prone to issues. But i guess something is better than nothing...","source":"@site/docs/server-docs/backup-and-restore.md","sourceDirName":"server-docs","slug":"/server-docs/backup-and-restore","permalink":"/docs/server-docs/backup-and-restore","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/backup-and-restore.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"sidebarPosition":7.5,"frontMatter":{"sidebar_position":7.5},"sidebar":"docs","previous":{"title":"Provider: IGDB","permalink":"/docs/server-docs/metadata-enrichment/provider-igdb"},"next":{"title":"Media","permalink":"/docs/server-docs/media"}}');var r=a(6070),n=a(8591);const o={sidebar_position:7.5},i="Database Backup & Restoration",d={},c=[{value:"Backup",id:"backup",level:2},{value:"Restoration",id:"restoration",level:2}];function l(e){const t={a:"a",admonition:"admonition",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",...(0,n.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"database-backup--restoration",children:"Database Backup & Restoration"})}),"\n",(0,r.jsx)(t.admonition,{title:"Experimental",type:"warning",children:(0,r.jsxs)(t.p,{children:["The Backup and Restoration Mechanisms in GameVault are currently experimental and should ",(0,r.jsx)(t.strong,{children:"not"})," be your primary backup solution. Always maintain your database backups independently and only consider using this as a last resort. In summary, we recommend avoiding this entire process whenever possible, as it can potentially be quite fragile and prone to issues. But i guess something is better than nothing..."]})}),"\n",(0,r.jsx)(t.admonition,{title:"Security Measurements",type:"note",children:(0,r.jsx)(t.p,{children:"For security resons any database operation outlined below must be additionally authenticated using your database password."})}),"\n",(0,r.jsx)(t.h2,{id:"backup",children:"Backup"}),"\n",(0,r.jsxs)(t.p,{children:["GameVault offers a user-friendly backup system for both supported database systems, Postgres and SQLite. You can trigger and download backups either through the GameVault Client or directly via the ",(0,r.jsx)(t.a,{href:"../advanced-usage/rest-api",children:"API"})," for automation purposes. Each backup is a complete database snapshot, and it's essential to handle these files with care, as they are unencrypted. You can create as many backups as needed."]}),"\n",(0,r.jsx)(t.p,{children:"For SQLite, the GameVault Backup simply duplicates the database file."}),"\n",(0,r.jsx)(t.p,{children:"For Postgres, it utilizes pgdump to create a comprehensive database dump."}),"\n",(0,r.jsx)(t.h2,{id:"restoration",children:"Restoration"}),"\n",(0,r.jsx)(t.p,{children:"Restoring a backup is a straightforward process."}),"\n",(0,r.jsxs)(t.p,{children:["You can trigger the restoration and upload backups using the GameVault Client or via the ",(0,r.jsx)(t.a,{href:"../advanced-usage/rest-api",children:"API"})," for automated procedures. However, before you proceed, there are some critical points to consider:"]}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsx)(t.p,{children:"We strongly discourage restoring a backup on a different server version. If you must do it, consider downgrading your GameVault server to a lower version, ideally the version of your backup, as higher versions are more likely to cause compatibility issues. If you have no alternative, make sure to back up your current data again before proceeding."}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Never, under any circumstances"}),", attempt to restore a backup from a different database technology (e.g., SQLite to Postgres or vice versa). This will result in a catastrophic failure."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsx)(t.p,{children:"Always monitor the server logs while restoring a backup. If you notice anything unusual or different than a harmless warning, make a copy and securely store the file located at /tmp/gamevault-pre-restore.db on your container/server. This file serves as a backup created just before restoring the uploaded backup. In case of a major failure, GameVault may also perform this pre-restore backup restoration automatically. If you encounter difficulties, attempt to restore from this file. If this doesn't resolve the issue, you may need to explore manual restoration or consider other backup options."}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsx)(t.p,{children:"The Restoration is not incremental. It hard-deletes everything and hard-restores everything."}),"\n"]}),"\n"]})]})}function u(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8591:(e,t,a)=>{a.d(t,{R:()=>o,x:()=>i});var s=a(758);const r={},n=s.createContext(r);function o(e){const t=s.useContext(n);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5046667d.135bb6e0.js b/assets/js/5046667d.dd795efa.js similarity index 98% rename from assets/js/5046667d.135bb6e0.js rename to assets/js/5046667d.dd795efa.js index 937887523..38a7dc125 100644 --- a/assets/js/5046667d.135bb6e0.js +++ b/assets/js/5046667d.dd795efa.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[6395],{167:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"server-docs/websockets","title":"WebSockets","description":"GameVault doesn\'t fully use Websockets yet. Both the client and the server are still lacking a full implementation. Right now, it\'s just a basic version to begin with on the server. If you\'re interested in how we\'re doing with implementing Websockets, you can check out this page on GitHub to see our progress.","source":"@site/docs/server-docs/websockets.md","sourceDirName":"server-docs","slug":"/server-docs/websockets","permalink":"/docs/server-docs/websockets","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/websockets.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"sidebarPosition":8,"frontMatter":{"sidebar_position":8},"sidebar":"docs","previous":{"title":"Media","permalink":"/docs/server-docs/media"},"next":{"title":"Plugins","permalink":"/docs/server-docs/plugins"}}');var n=i(6070),o=i(8591);const r={sidebar_position:8},a="WebSockets",c={},l=[{value:"Activities",id:"activities",level:2},{value:"Disabling Activities",id:"disabling-activities",level:3},{value:"Security",id:"security",level:2}];function d(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"websockets",children:"WebSockets"})}),"\n",(0,n.jsx)(t.admonition,{title:"Work in progress",type:"warning",children:(0,n.jsxs)(t.p,{children:["GameVault doesn't fully use Websockets yet. Both the client and the server are still lacking a full implementation. Right now, it's just a basic version to begin with on the server. If you're interested in how we're doing with implementing Websockets, you can check out ",(0,n.jsx)(t.a,{href:"https://github.com/Phalcode/gamevault-app/issues/205",children:"this page on GitHub"})," to see our progress."]})}),"\n",(0,n.jsxs)(t.p,{children:["In GameVault Backend Version 9.0.0, we introduced an exciting feature \u2013 WebSockets. These WebSockets provide an asynchronous and bidirectional gateway for interactive communication with clients. Our implementation is based on ",(0,n.jsx)(t.a,{href:"https://socket.io/",children:"Socket.io"}),", which itself relies on the WebSocket protocol."]}),"\n",(0,n.jsx)(t.p,{children:"WebSockets enable real-time communication between the server and clients. This means that not only can the server send data to clients when they ask for it, but the server can also initiate conversations with the clients."}),"\n",(0,n.jsx)(t.p,{children:"To use this feature effectively, you need to ensure that Web-Socket Support is enabled on your machine, network, or reverse proxy."}),"\n",(0,n.jsxs)(t.p,{children:["The API is documented via AsyncAPI standard in ",(0,n.jsx)(t.code,{children:"/api/docs/async"}),". However, please note that, at the time of writing, this documentation may not run on Docker due to a bug. If you encounter this issue, you can refer to the source code for manual implementation."]}),"\n",(0,n.jsx)(t.h2,{id:"activities",children:"Activities"}),"\n",(0,n.jsx)(t.p,{children:"Starting from GameVault Backend Version 9.0.0, GameVault allows clients to share their current activities on the server. These activities provide valuable information about what users are doing, making the platform more interactive. Activities can include:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"User 1 is online."}),"\n",(0,n.jsx)(t.li,{children:"User 2 is offline."}),"\n",(0,n.jsx)(t.li,{children:"User 3 is playing Mindustry."}),"\n",(0,n.jsx)(t.li,{children:"User 4 is marked as busy."}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"Once a user reports his activity, it will propagate to all other users. Clients have the freedom to report their activities. If they don't, the server will display them as offline by default."}),"\n",(0,n.jsx)(t.h3,{id:"disabling-activities",children:"Disabling Activities"}),"\n",(0,n.jsxs)(t.p,{children:["For server owners who wish to disable activities, it's as simple as setting the ",(0,n.jsx)(t.code,{children:"SERVER_ONLINE_ACTIVITIES_DISABLED"})," environment variable to ",(0,n.jsx)(t.code,{children:"true"}),". Please be aware that, depending on your clients implementation, this might result in everyone appearing as offline all the time."]}),"\n",(0,n.jsx)(t.h2,{id:"security",children:"Security"}),"\n",(0,n.jsxs)(t.p,{children:["Each user is assigned a randomly generated Socket Secret that they can retrieve at ",(0,n.jsx)(t.code,{children:"/api/users/me"}),". This secret must be included in the headers (X-Socket-Secret) of every subsequent Socket.IO Handshake request to the server."]})]})}function h(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},8591:(e,t,i)=>{i.d(t,{R:()=>r,x:()=>a});var s=i(758);const n={},o=s.createContext(n);function r(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[6395],{167:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"server-docs/websockets","title":"WebSockets","description":"GameVault doesn\'t fully use Websockets yet. Both the client and the server are still lacking a full implementation. Right now, it\'s just a basic version to begin with on the server. If you\'re interested in how we\'re doing with implementing Websockets, you can check out this page on GitHub to see our progress.","source":"@site/docs/server-docs/websockets.md","sourceDirName":"server-docs","slug":"/server-docs/websockets","permalink":"/docs/server-docs/websockets","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/websockets.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"sidebarPosition":8,"frontMatter":{"sidebar_position":8},"sidebar":"docs","previous":{"title":"Media","permalink":"/docs/server-docs/media"},"next":{"title":"Plugins","permalink":"/docs/server-docs/plugins"}}');var n=i(6070),o=i(8591);const r={sidebar_position:8},a="WebSockets",c={},l=[{value:"Activities",id:"activities",level:2},{value:"Disabling Activities",id:"disabling-activities",level:3},{value:"Security",id:"security",level:2}];function d(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"websockets",children:"WebSockets"})}),"\n",(0,n.jsx)(t.admonition,{title:"Work in progress",type:"warning",children:(0,n.jsxs)(t.p,{children:["GameVault doesn't fully use Websockets yet. Both the client and the server are still lacking a full implementation. Right now, it's just a basic version to begin with on the server. If you're interested in how we're doing with implementing Websockets, you can check out ",(0,n.jsx)(t.a,{href:"https://github.com/Phalcode/gamevault-app/issues/205",children:"this page on GitHub"})," to see our progress."]})}),"\n",(0,n.jsxs)(t.p,{children:["In GameVault Backend Version 9.0.0, we introduced an exciting feature \u2013 WebSockets. These WebSockets provide an asynchronous and bidirectional gateway for interactive communication with clients. Our implementation is based on ",(0,n.jsx)(t.a,{href:"https://socket.io/",children:"Socket.io"}),", which itself relies on the WebSocket protocol."]}),"\n",(0,n.jsx)(t.p,{children:"WebSockets enable real-time communication between the server and clients. This means that not only can the server send data to clients when they ask for it, but the server can also initiate conversations with the clients."}),"\n",(0,n.jsx)(t.p,{children:"To use this feature effectively, you need to ensure that Web-Socket Support is enabled on your machine, network, or reverse proxy."}),"\n",(0,n.jsxs)(t.p,{children:["The API is documented via AsyncAPI standard in ",(0,n.jsx)(t.code,{children:"/api/docs/async"}),". However, please note that, at the time of writing, this documentation may not run on Docker due to a bug. If you encounter this issue, you can refer to the source code for manual implementation."]}),"\n",(0,n.jsx)(t.h2,{id:"activities",children:"Activities"}),"\n",(0,n.jsx)(t.p,{children:"Starting from GameVault Backend Version 9.0.0, GameVault allows clients to share their current activities on the server. These activities provide valuable information about what users are doing, making the platform more interactive. Activities can include:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"User 1 is online."}),"\n",(0,n.jsx)(t.li,{children:"User 2 is offline."}),"\n",(0,n.jsx)(t.li,{children:"User 3 is playing Mindustry."}),"\n",(0,n.jsx)(t.li,{children:"User 4 is marked as busy."}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"Once a user reports his activity, it will propagate to all other users. Clients have the freedom to report their activities. If they don't, the server will display them as offline by default."}),"\n",(0,n.jsx)(t.h3,{id:"disabling-activities",children:"Disabling Activities"}),"\n",(0,n.jsxs)(t.p,{children:["For server owners who wish to disable activities, it's as simple as setting the ",(0,n.jsx)(t.code,{children:"SERVER_ONLINE_ACTIVITIES_DISABLED"})," environment variable to ",(0,n.jsx)(t.code,{children:"true"}),". Please be aware that, depending on your clients implementation, this might result in everyone appearing as offline all the time."]}),"\n",(0,n.jsx)(t.h2,{id:"security",children:"Security"}),"\n",(0,n.jsxs)(t.p,{children:["Each user is assigned a randomly generated Socket Secret that they can retrieve at ",(0,n.jsx)(t.code,{children:"/api/users/me"}),". This secret must be included in the headers (X-Socket-Secret) of every subsequent Socket.IO Handshake request to the server."]})]})}function h(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},8591:(e,t,i)=>{i.d(t,{R:()=>r,x:()=>a});var s=i(758);const n={},o=s.createContext(n);function r(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/51e7bf36.b74d9375.js b/assets/js/51e7bf36.3b4ef3de.js similarity index 99% rename from assets/js/51e7bf36.b74d9375.js rename to assets/js/51e7bf36.3b4ef3de.js index c04befd18..776843982 100644 --- a/assets/js/51e7bf36.b74d9375.js +++ b/assets/js/51e7bf36.3b4ef3de.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[1334],{6293:(e,a,t)=>{t.r(a),t.d(a,{assets:()=>l,contentTitle:()=>c,default:()=>h,frontMatter:()=>i,metadata:()=>n,toc:()=>r});const n=JSON.parse('{"id":"client-docs/data","title":"Data Management","description":"This page gives you an overview of how GameVault stores and manages its data.","source":"@site/docs/client-docs/data.md","sourceDirName":"client-docs","slug":"/client-docs/data","permalink":"/docs/client-docs/data","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/client-docs/data.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"sidebarPosition":4,"frontMatter":{"sidebar_position":4},"sidebar":"docs","previous":{"title":"Updating the Client","permalink":"/docs/client-docs/updating-client"},"next":{"title":"GUI Overview","permalink":"/docs/client-docs/gui"}}');var s=t(6070),o=t(8591);const i={sidebar_position:4},c="Data Management",l={},r=[{value:"Image Cache",id:"image-cache",level:2},{value:"Image Cache Optimization",id:"image-cache-optimization",level:3},{value:"Offline Cache (Progresses)",id:"offline-cache-progresses",level:2},{value:"Offline Cache (Game Metadata)",id:"offline-cache-game-metadata",level:2},{value:"Settings",id:"settings",level:2},{value:"Embedded Browser Settings",id:"embedded-browser-settings",level:2},{value:"Ignore List",id:"ignore-list",level:2},{value:"Crash Logs",id:"crash-logs",level:2},{value:"Themes",id:"themes",level:2}];function d(e){const a={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",strong:"strong",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(a.header,{children:(0,s.jsx)(a.h1,{id:"data-management",children:"Data Management"})}),"\n",(0,s.jsx)(a.p,{children:"This page gives you an overview of how GameVault stores and manages its data."}),"\n",(0,s.jsxs)(a.p,{children:["When you install the app from the Microsoft Store, all the data it saves (except for the GameVault Root Folder for your Downloads and Installations) can be found under: ",(0,s.jsx)(a.code,{children:"%USERPROFILE%\\AppData\\Local\\Packages\\Phalcode.174950BD81C41_dymsgn3qpfjxc\\LocalCache\\Roaming\\GameVault\\"}),". Alternatively, if you did not install the app from the Microsoft Store, you can find the data under: ",(0,s.jsx)(a.code,{children:"%APPDATA%/GameVault"}),"."]}),"\n",(0,s.jsx)(a.admonition,{title:"Don't modify unless you know what you're doing",type:"warning",children:(0,s.jsx)(a.p,{children:"Please be aware that manually altering this data may lead to unwanted issues in GameVault."})}),"\n",(0,s.jsx)(a.h2,{id:"image-cache",children:"Image Cache"}),"\n",(0,s.jsxs)(a.blockquote,{children:["\n",(0,s.jsxs)(a.p,{children:["Located under: ",(0,s.jsx)(a.code,{children:"%USERPROFILE%\\AppData\\Local\\Packages\\Phalcode.174950BD81C41_dymsgn3qpfjxc\\LocalCache\\Roaming\\GameVault\\cache\\images"})," or ",(0,s.jsx)(a.code,{children:"%APPDATA%\\GameVault\\cache\\images"})]}),"\n"]}),"\n",(0,s.jsx)(a.p,{children:"GameVault caches all loaded images locally for faster retrieval. They're kept in a specific subfolder with a format like \"ParentID.ImageID,\" where the ParentID could represent the Game ID or User ID. This unique ImageID allows GameVault to detect when an image becomes outdated (e.g., when another user modifies a game's box art). When you request that image again, the cache is immediately updated."}),"\n",(0,s.jsx)(a.h3,{id:"image-cache-optimization",children:"Image Cache Optimization"}),"\n",(0,s.jsx)(a.p,{children:"When you launch the GameVault Client, it performs an image optimization process. This process efficiently adjusts all cached images to match your screen size, leading to faster loading times and reduced storage usage."}),"\n",(0,s.jsx)(a.h2,{id:"offline-cache-progresses",children:"Offline Cache (Progresses)"}),"\n",(0,s.jsxs)(a.blockquote,{children:["\n",(0,s.jsxs)(a.p,{children:["Located under: ",(0,s.jsx)(a.code,{children:"%USERPROFILE%\\AppData\\Local\\Packages\\Phalcode.174950BD81C41_dymsgn3qpfjxc\\LocalCache\\Roaming\\GameVault\\cache\\prgs"})," or ",(0,s.jsx)(a.code,{children:"%APPDATA%\\GameVault\\cache\\prgs"})]}),"\n"]}),"\n",(0,s.jsx)(a.p,{children:"Even when your application or your GameVault Server is offline, as long as the GameVault Client is running in the background, it continues to track your playtime. This data is sent to the server the next time you or the server is online."}),"\n",(0,s.jsx)(a.h2,{id:"offline-cache-game-metadata",children:"Offline Cache (Game Metadata)"}),"\n",(0,s.jsxs)(a.blockquote,{children:["\n",(0,s.jsxs)(a.p,{children:["Located under: ",(0,s.jsx)(a.code,{children:"%USERPROFILE%\\AppData\\Local\\Packages\\Phalcode.174950BD81C41_dymsgn3qpfjxc\\LocalCache\\Roaming\\GameVault\\cache\\local"})," or ",(0,s.jsx)(a.code,{children:"%APPDATA%\\GameVault\\cache\\local"})]}),"\n"]}),"\n",(0,s.jsxs)(a.p,{children:["After downloading a game, GameVault stores the game's metadata locally ",(0,s.jsx)(a.strong,{children:"once"}),". This allows you to see all game details even when your application or the server is offline. There is currently no way to refresh the cached metadata of a game."]}),"\n",(0,s.jsx)(a.h2,{id:"settings",children:"Settings"}),"\n",(0,s.jsxs)(a.blockquote,{children:["\n",(0,s.jsxs)(a.p,{children:["Located under: ",(0,s.jsx)(a.code,{children:"%USERPROFILE%\\AppData\\Local\\Packages\\Phalcode.174950BD81C41_dymsgn3qpfjxc\\LocalCache\\Roaming\\GameVault\\config\\user"})," or ",(0,s.jsx)(a.code,{children:"%APPDATA%\\GameVault\\config\\user"})]}),"\n"]}),"\n",(0,s.jsx)(a.p,{children:"All GameVault settings are stored and retrieved in a user file. Sensitive data is encrypted for security."}),"\n",(0,s.jsx)(a.h2,{id:"embedded-browser-settings",children:"Embedded Browser Settings"}),"\n",(0,s.jsxs)(a.blockquote,{children:["\n",(0,s.jsxs)(a.p,{children:["Located under: ",(0,s.jsx)(a.code,{children:"%USERPROFILE%\\AppData\\Local\\Packages\\Phalcode.174950BD81C41_dymsgn3qpfjxc\\LocalCache\\Roaming\\GameVault\\config\\web"})," or ",(0,s.jsx)(a.code,{children:"%APPDATA%\\GameVault\\config\\web"})]}),"\n"]}),"\n",(0,s.jsx)(a.p,{children:"GameVault's embedded browser settings are stored in the web folder. The embedded browser is used for the GameVault+ login functionality. You can delete this folder if you wish to clear all browser data. This will also log you out of your Phalcode account."}),"\n",(0,s.jsx)(a.h2,{id:"ignore-list",children:"Ignore List"}),"\n",(0,s.jsxs)(a.blockquote,{children:["\n",(0,s.jsxs)(a.p,{children:["Located under: ",(0,s.jsx)(a.code,{children:"%USERPROFILE%\\AppData\\Local\\Packages\\Phalcode.174950BD81C41_dymsgn3qpfjxc\\LocalCache\\Roaming\\GameVault\\cache\\ignorelist"})," or ",(0,s.jsx)(a.code,{children:"%APPDATA%\\GameVault\\cache\\ignorelist"})]}),"\n"]}),"\n",(0,s.jsxs)(a.p,{children:["The Ignore List includes commonly encountered false positives of sidecar-executables, such as ",(0,s.jsx)(a.code,{children:"setup.exe"}),", ",(0,s.jsx)(a.code,{children:"UnityCrashHandler.exe"})," or ",(0,s.jsx)(a.code,{children:"uninstall.exe"}),". This list is retrieved from the server if not already present. It's used by the playtime tracker for instance to avoid counting ",(0,s.jsx)(a.code,{children:"setup.exe"}),' as playtime. Furthermore, these executables are hidden in the selection list within the installation tab, ensuring that only game-related executables are shown. You can also edit the Ignore List locally by opening the "ignorelist" file and adding your own entries to be excluded.']}),"\n",(0,s.jsx)(a.h2,{id:"crash-logs",children:"Crash Logs"}),"\n",(0,s.jsxs)(a.blockquote,{children:["\n",(0,s.jsxs)(a.p,{children:["Located under: ",(0,s.jsx)(a.code,{children:"%USERPROFILE%\\AppData\\Local\\Packages\\Phalcode.174950BD81C41_dymsgn3qpfjxc\\LocalCache\\Roaming\\GameVault\\errorlog"})," or ",(0,s.jsx)(a.code,{children:"%APPDATA%\\GameVault\\errorlog"})]}),"\n"]}),"\n",(0,s.jsx)(a.p,{children:"The Crash Logs are generated when an unhandled error occurs in GameVault. They can be used to debug issues or to provide support."}),"\n",(0,s.jsx)(a.h2,{id:"themes",children:"Themes"}),"\n",(0,s.jsxs)(a.blockquote,{children:["\n",(0,s.jsxs)(a.p,{children:["Located under: ",(0,s.jsx)(a.code,{children:"%USERPROFILE%\\AppData\\Local\\Packages\\Phalcode.174950BD81C41_dymsgn3qpfjxc\\LocalCache\\Roaming\\GameVault\\themes"})," or ",(0,s.jsx)(a.code,{children:"%APPDATA%\\GameVault\\themes"})]}),"\n"]}),"\n",(0,s.jsxs)(a.p,{children:["Here you can import your custom themes. To learn more about custom themes, refer to ",(0,s.jsx)(a.a,{href:"/docs/gamevault-plus/themes#custom-themes",children:"Custom Themes Guide"}),"."]})]})}function h(e={}){const{wrapper:a}={...(0,o.R)(),...e.components};return a?(0,s.jsx)(a,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},8591:(e,a,t)=>{t.d(a,{R:()=>i,x:()=>c});var n=t(758);const s={},o=n.createContext(s);function i(e){const a=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function c(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),n.createElement(o.Provider,{value:a},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[1334],{6293:(e,a,t)=>{t.r(a),t.d(a,{assets:()=>l,contentTitle:()=>c,default:()=>h,frontMatter:()=>i,metadata:()=>n,toc:()=>r});const n=JSON.parse('{"id":"client-docs/data","title":"Data Management","description":"This page gives you an overview of how GameVault stores and manages its data.","source":"@site/docs/client-docs/data.md","sourceDirName":"client-docs","slug":"/client-docs/data","permalink":"/docs/client-docs/data","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/client-docs/data.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"sidebarPosition":4,"frontMatter":{"sidebar_position":4},"sidebar":"docs","previous":{"title":"Updating the Client","permalink":"/docs/client-docs/updating-client"},"next":{"title":"GUI Overview","permalink":"/docs/client-docs/gui"}}');var s=t(6070),o=t(8591);const i={sidebar_position:4},c="Data Management",l={},r=[{value:"Image Cache",id:"image-cache",level:2},{value:"Image Cache Optimization",id:"image-cache-optimization",level:3},{value:"Offline Cache (Progresses)",id:"offline-cache-progresses",level:2},{value:"Offline Cache (Game Metadata)",id:"offline-cache-game-metadata",level:2},{value:"Settings",id:"settings",level:2},{value:"Embedded Browser Settings",id:"embedded-browser-settings",level:2},{value:"Ignore List",id:"ignore-list",level:2},{value:"Crash Logs",id:"crash-logs",level:2},{value:"Themes",id:"themes",level:2}];function d(e){const a={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",strong:"strong",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(a.header,{children:(0,s.jsx)(a.h1,{id:"data-management",children:"Data Management"})}),"\n",(0,s.jsx)(a.p,{children:"This page gives you an overview of how GameVault stores and manages its data."}),"\n",(0,s.jsxs)(a.p,{children:["When you install the app from the Microsoft Store, all the data it saves (except for the GameVault Root Folder for your Downloads and Installations) can be found under: ",(0,s.jsx)(a.code,{children:"%USERPROFILE%\\AppData\\Local\\Packages\\Phalcode.174950BD81C41_dymsgn3qpfjxc\\LocalCache\\Roaming\\GameVault\\"}),". Alternatively, if you did not install the app from the Microsoft Store, you can find the data under: ",(0,s.jsx)(a.code,{children:"%APPDATA%/GameVault"}),"."]}),"\n",(0,s.jsx)(a.admonition,{title:"Don't modify unless you know what you're doing",type:"warning",children:(0,s.jsx)(a.p,{children:"Please be aware that manually altering this data may lead to unwanted issues in GameVault."})}),"\n",(0,s.jsx)(a.h2,{id:"image-cache",children:"Image Cache"}),"\n",(0,s.jsxs)(a.blockquote,{children:["\n",(0,s.jsxs)(a.p,{children:["Located under: ",(0,s.jsx)(a.code,{children:"%USERPROFILE%\\AppData\\Local\\Packages\\Phalcode.174950BD81C41_dymsgn3qpfjxc\\LocalCache\\Roaming\\GameVault\\cache\\images"})," or ",(0,s.jsx)(a.code,{children:"%APPDATA%\\GameVault\\cache\\images"})]}),"\n"]}),"\n",(0,s.jsx)(a.p,{children:"GameVault caches all loaded images locally for faster retrieval. They're kept in a specific subfolder with a format like \"ParentID.ImageID,\" where the ParentID could represent the Game ID or User ID. This unique ImageID allows GameVault to detect when an image becomes outdated (e.g., when another user modifies a game's box art). When you request that image again, the cache is immediately updated."}),"\n",(0,s.jsx)(a.h3,{id:"image-cache-optimization",children:"Image Cache Optimization"}),"\n",(0,s.jsx)(a.p,{children:"When you launch the GameVault Client, it performs an image optimization process. This process efficiently adjusts all cached images to match your screen size, leading to faster loading times and reduced storage usage."}),"\n",(0,s.jsx)(a.h2,{id:"offline-cache-progresses",children:"Offline Cache (Progresses)"}),"\n",(0,s.jsxs)(a.blockquote,{children:["\n",(0,s.jsxs)(a.p,{children:["Located under: ",(0,s.jsx)(a.code,{children:"%USERPROFILE%\\AppData\\Local\\Packages\\Phalcode.174950BD81C41_dymsgn3qpfjxc\\LocalCache\\Roaming\\GameVault\\cache\\prgs"})," or ",(0,s.jsx)(a.code,{children:"%APPDATA%\\GameVault\\cache\\prgs"})]}),"\n"]}),"\n",(0,s.jsx)(a.p,{children:"Even when your application or your GameVault Server is offline, as long as the GameVault Client is running in the background, it continues to track your playtime. This data is sent to the server the next time you or the server is online."}),"\n",(0,s.jsx)(a.h2,{id:"offline-cache-game-metadata",children:"Offline Cache (Game Metadata)"}),"\n",(0,s.jsxs)(a.blockquote,{children:["\n",(0,s.jsxs)(a.p,{children:["Located under: ",(0,s.jsx)(a.code,{children:"%USERPROFILE%\\AppData\\Local\\Packages\\Phalcode.174950BD81C41_dymsgn3qpfjxc\\LocalCache\\Roaming\\GameVault\\cache\\local"})," or ",(0,s.jsx)(a.code,{children:"%APPDATA%\\GameVault\\cache\\local"})]}),"\n"]}),"\n",(0,s.jsxs)(a.p,{children:["After downloading a game, GameVault stores the game's metadata locally ",(0,s.jsx)(a.strong,{children:"once"}),". This allows you to see all game details even when your application or the server is offline. There is currently no way to refresh the cached metadata of a game."]}),"\n",(0,s.jsx)(a.h2,{id:"settings",children:"Settings"}),"\n",(0,s.jsxs)(a.blockquote,{children:["\n",(0,s.jsxs)(a.p,{children:["Located under: ",(0,s.jsx)(a.code,{children:"%USERPROFILE%\\AppData\\Local\\Packages\\Phalcode.174950BD81C41_dymsgn3qpfjxc\\LocalCache\\Roaming\\GameVault\\config\\user"})," or ",(0,s.jsx)(a.code,{children:"%APPDATA%\\GameVault\\config\\user"})]}),"\n"]}),"\n",(0,s.jsx)(a.p,{children:"All GameVault settings are stored and retrieved in a user file. Sensitive data is encrypted for security."}),"\n",(0,s.jsx)(a.h2,{id:"embedded-browser-settings",children:"Embedded Browser Settings"}),"\n",(0,s.jsxs)(a.blockquote,{children:["\n",(0,s.jsxs)(a.p,{children:["Located under: ",(0,s.jsx)(a.code,{children:"%USERPROFILE%\\AppData\\Local\\Packages\\Phalcode.174950BD81C41_dymsgn3qpfjxc\\LocalCache\\Roaming\\GameVault\\config\\web"})," or ",(0,s.jsx)(a.code,{children:"%APPDATA%\\GameVault\\config\\web"})]}),"\n"]}),"\n",(0,s.jsx)(a.p,{children:"GameVault's embedded browser settings are stored in the web folder. The embedded browser is used for the GameVault+ login functionality. You can delete this folder if you wish to clear all browser data. This will also log you out of your Phalcode account."}),"\n",(0,s.jsx)(a.h2,{id:"ignore-list",children:"Ignore List"}),"\n",(0,s.jsxs)(a.blockquote,{children:["\n",(0,s.jsxs)(a.p,{children:["Located under: ",(0,s.jsx)(a.code,{children:"%USERPROFILE%\\AppData\\Local\\Packages\\Phalcode.174950BD81C41_dymsgn3qpfjxc\\LocalCache\\Roaming\\GameVault\\cache\\ignorelist"})," or ",(0,s.jsx)(a.code,{children:"%APPDATA%\\GameVault\\cache\\ignorelist"})]}),"\n"]}),"\n",(0,s.jsxs)(a.p,{children:["The Ignore List includes commonly encountered false positives of sidecar-executables, such as ",(0,s.jsx)(a.code,{children:"setup.exe"}),", ",(0,s.jsx)(a.code,{children:"UnityCrashHandler.exe"})," or ",(0,s.jsx)(a.code,{children:"uninstall.exe"}),". This list is retrieved from the server if not already present. It's used by the playtime tracker for instance to avoid counting ",(0,s.jsx)(a.code,{children:"setup.exe"}),' as playtime. Furthermore, these executables are hidden in the selection list within the installation tab, ensuring that only game-related executables are shown. You can also edit the Ignore List locally by opening the "ignorelist" file and adding your own entries to be excluded.']}),"\n",(0,s.jsx)(a.h2,{id:"crash-logs",children:"Crash Logs"}),"\n",(0,s.jsxs)(a.blockquote,{children:["\n",(0,s.jsxs)(a.p,{children:["Located under: ",(0,s.jsx)(a.code,{children:"%USERPROFILE%\\AppData\\Local\\Packages\\Phalcode.174950BD81C41_dymsgn3qpfjxc\\LocalCache\\Roaming\\GameVault\\errorlog"})," or ",(0,s.jsx)(a.code,{children:"%APPDATA%\\GameVault\\errorlog"})]}),"\n"]}),"\n",(0,s.jsx)(a.p,{children:"The Crash Logs are generated when an unhandled error occurs in GameVault. They can be used to debug issues or to provide support."}),"\n",(0,s.jsx)(a.h2,{id:"themes",children:"Themes"}),"\n",(0,s.jsxs)(a.blockquote,{children:["\n",(0,s.jsxs)(a.p,{children:["Located under: ",(0,s.jsx)(a.code,{children:"%USERPROFILE%\\AppData\\Local\\Packages\\Phalcode.174950BD81C41_dymsgn3qpfjxc\\LocalCache\\Roaming\\GameVault\\themes"})," or ",(0,s.jsx)(a.code,{children:"%APPDATA%\\GameVault\\themes"})]}),"\n"]}),"\n",(0,s.jsxs)(a.p,{children:["Here you can import your custom themes. To learn more about custom themes, refer to ",(0,s.jsx)(a.a,{href:"/docs/gamevault-plus/themes#custom-themes",children:"Custom Themes Guide"}),"."]})]})}function h(e={}){const{wrapper:a}={...(0,o.R)(),...e.components};return a?(0,s.jsx)(a,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},8591:(e,a,t)=>{t.d(a,{R:()=>i,x:()=>c});var n=t(758);const s={},o=n.createContext(s);function i(e){const a=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function c(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),n.createElement(o.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5b1700d1.adaa5546.js b/assets/js/5b1700d1.ec166522.js similarity index 99% rename from assets/js/5b1700d1.adaa5546.js rename to assets/js/5b1700d1.ec166522.js index 6840784fd..cc535441a 100644 --- a/assets/js/5b1700d1.adaa5546.js +++ b/assets/js/5b1700d1.ec166522.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[7903],{6709:(A,e,t)=>{t.r(e),t.d(e,{assets:()=>i,contentTitle:()=>c,default:()=>g,frontMatter:()=>r,metadata:()=>n,toc:()=>o});const n=JSON.parse('{"id":"server-docs/setup/truenas-scale-legacy","title":"Using TrueNAS Scale (prior v24.10)","description":"TrueNAS Scale is an open-source, hyper-converged storage platform that combines the reliability of TrueNAS with the versatility of Linux, providing a unified solution for storage, virtualization, and containerization in a single, easy-to-manage system.","source":"@site/docs/server-docs/setup/truenas-scale-legacy.md","sourceDirName":"server-docs/setup","slug":"/server-docs/setup/truenas-scale-legacy","permalink":"/docs/server-docs/setup/truenas-scale-legacy","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/setup/truenas-scale-legacy.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"sidebarPosition":4.1,"frontMatter":{"title":"Using TrueNAS Scale (prior v24.10)","sidebar_position":4.1},"sidebar":"docs","previous":{"title":"Using CapRover","permalink":"/docs/server-docs/setup/caprover"},"next":{"title":"Using TrueNAS Scale (since v24.10)","permalink":"/docs/server-docs/setup/truenas-scale"}}');var a=t(6070),s=t(8591);const r={title:"Using TrueNAS Scale (prior v24.10)",sidebar_position:4.1},c=void 0,i={},o=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Step 1: Log in to your TrueNAS Scale Dashboard",id:"step-1-log-in-to-your-truenas-scale-dashboard",level:2},{value:"Step 2: Navigate to the catalog Page in TrueNas Scale",id:"step-2-navigate-to-the-catalog-page-in-truenas-scale",level:2},{value:"Step 3: Navigate to Apps and Disover Page",id:"step-3-navigate-to-apps-and-disover-page",level:2},{value:"Step 4: Configure and Install gamevault-backend",id:"step-4-configure-and-install-gamevault-backend",level:2},{value:"Conclusion",id:"conclusion",level:2},{value:"Additional Info",id:"additional-info",level:2},{value:"Stopping the Server",id:"stopping-the-server",level:3},{value:"Reading the Logs",id:"reading-the-logs",level:3}];function l(A){const e={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...A.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(e.p,{children:[(0,a.jsx)(e.a,{href:"https://www.truenas.com/truenas-scale/",children:"TrueNAS Scale"})," is an open-source, hyper-converged storage platform that combines the reliability of TrueNAS with the versatility of Linux, providing a unified solution for storage, virtualization, and containerization in a single, easy-to-manage system."]}),"\n",(0,a.jsxs)(e.p,{children:["Setting up a GameVault Server on TrueNAS Scale prior, to version 24.10, is just a click away by using our template from the ",(0,a.jsx)(e.a,{href:"https://truecharts.org/manual/SCALE/guides/getting-started",children:"Truecharts Catalog"}),",\na community based catalog for TrueNAS Scale."]}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsxs)(e.strong,{children:["If you are using TrueNAS Scale version 24.10, or newer, please use this documentation: ",(0,a.jsx)(e.a,{href:"/docs/server-docs/setup/truenas-scale",children:"TrueNAS Scale"})]})}),"\n",(0,a.jsx)(e.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,a.jsxs)(e.ul,{children:["\n",(0,a.jsx)(e.li,{children:"a running TrueNAS Scale Server (prior to version 24.10)"}),"\n",(0,a.jsxs)(e.li,{children:["add the TrueCharts ",(0,a.jsx)(e.a,{href:"https://truecharts.org/manual/SCALE/guides/getting-started",children:"Catalog"})]}),"\n",(0,a.jsxs)(e.li,{children:["Install the following ",(0,a.jsx)(e.a,{href:"https://truecharts.org/manual/FAQ#operators",children:"operators"})," from TrueCharts; ",(0,a.jsx)(e.strong,{children:"prometheus-operator"})," and ",(0,a.jsx)(e.strong,{children:"cloudnative-pg"}),"."]}),"\n"]}),"\n",(0,a.jsx)(e.h2,{id:"step-1-log-in-to-your-truenas-scale-dashboard",children:"Step 1: Log in to your TrueNAS Scale Dashboard"}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"Step 1",src:t(9558).A+"",width:"1919",height:"943"})}),"\n",(0,a.jsx)(e.h2,{id:"step-2-navigate-to-the-catalog-page-in-truenas-scale",children:"Step 2: Navigate to the catalog Page in TrueNas Scale"}),"\n",(0,a.jsxs)(e.p,{children:["Go to ",(0,a.jsx)(e.strong,{children:"apps"})," -> ",(0,a.jsx)(e.strong,{children:"discover"})," -> ",(0,a.jsx)(e.strong,{children:"catalogs"}),"."]}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"Step 2",src:t(4446).A+"",width:"1918",height:"592"})}),"\n",(0,a.jsx)(e.p,{children:"Validate that TrueCharts catalog was added to the server, if not refer back to the Prerequisites section."}),"\n",(0,a.jsx)(e.h2,{id:"step-3-navigate-to-apps-and-disover-page",children:"Step 3: Navigate to Apps and Disover Page"}),"\n",(0,a.jsxs)(e.p,{children:["Go to ",(0,a.jsx)(e.strong,{children:"apps"})," -> ",(0,a.jsx)(e.strong,{children:"discover"})," and search for ",(0,a.jsx)(e.strong,{children:"gamevault-backend"})]}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"Step 3",src:t(3598).A+"",width:"1919",height:"587"})}),"\n",(0,a.jsx)(e.h2,{id:"step-4-configure-and-install-gamevault-backend",children:"Step 4: Configure and Install gamevault-backend"}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"Step 4",src:t(6745).A+"",width:"1919",height:"374"})}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"Step 4a",src:t(5970).A+"",width:"1488",height:"752"})}),"\n",(0,a.jsxs)(e.p,{children:["Scroll down to ",(0,a.jsx)(e.strong,{children:"App Configuration"}),"."]}),"\n",(0,a.jsxs)(e.p,{children:["Set your ",(0,a.jsx)(e.code,{children:"Admin User"})," and ",(0,a.jsx)(e.code,{children:"Admin Password"}),"."]}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"Step 4b",src:t(2464).A+"",width:"1485",height:"874"})}),"\n",(0,a.jsx)(e.admonition,{type:"note",children:(0,a.jsx)(e.p,{children:"Leave the Logs and Images storage options as PVC."})}),"\n",(0,a.jsxs)(e.p,{children:["Games storage option can be safely set hostpath if not using using any shares or switch to NFS otherwise; please follow the ",(0,a.jsx)(e.a,{href:"https://truecharts.org/manual/SCALE/guides/dataset",children:"Dataset and Share Setup"})," guide."]}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"Step 4c",src:t(2464).A+"",width:"1485",height:"874"})}),"\n",(0,a.jsxs)(e.p,{children:["Scroll down to ",(0,a.jsx)(e.strong,{children:"Documentation"})," and click install, wait a few minutes and the app should deploy!"]}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"Installed",src:t(7495).A+"",width:"1919",height:"949"})}),"\n",(0,a.jsx)(e.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,a.jsx)(e.p,{children:"You have now successfully set up your GameVault Server using TrueNAS Scale."}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.a,{href:"/docs/server-docs/setup/#what-next",children:"Click here to continue."})}),"\n",(0,a.jsx)(e.h2,{id:"additional-info",children:"Additional Info"}),"\n",(0,a.jsx)(e.h3,{id:"stopping-the-server",children:"Stopping the Server"}),"\n",(0,a.jsxs)(e.p,{children:["To stop the server in TrueNAS Scale, you can click on the gamevault-backend app and then edit the app; set the replicas to 0 or use the ",(0,a.jsx)(e.a,{href:"https://truecharts.org/news/stop-all/",children:'"stop-all"'}),' feature. When editing an application, checking the "stop-all" box and saving the changes accomplishes this. If you\'re working with applications based on CNPG (cloudnative-postgres), the same methods apply, ensuring a safe shutdown.']}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"stop-all",src:t(1231).A+"",width:"394",height:"423"})}),"\n",(0,a.jsxs)(e.p,{children:["If you prefer using ",(0,a.jsx)(e.a,{href:"https://github.com/Heavybullets8/heavy_script",children:"Heavyscript"}),", a specialized script for TrueNAS Scale, it offers a secure way to stop apps, including those utilizing CNPG. By default, Heavyscript employs the ",(0,a.jsx)(e.a,{href:"https://truecharts.org/news/stop-all/",children:'"stop-all"'})," function to ensure a graceful shutdown."]}),"\n",(0,a.jsx)(e.p,{children:"Simple commands for heavyscript:"}),"\n",(0,a.jsxs)(e.p,{children:["stop: ",(0,a.jsx)(e.code,{children:"heavyscript app -x gamevault-backend"})]}),"\n",(0,a.jsxs)(e.p,{children:["start: ",(0,a.jsx)(e.code,{children:"heavyscript app -s gamevault-backend"})]}),"\n",(0,a.jsx)(e.p,{children:'Keep in mind that TrueNAS Scale does not support third-party operators. Consequently, relying on the stop button within the TrueNAS Scale GUI, often considered an IX (iXsystems) hack in the Kubernetes space, is not recommended. For a dependable and supported approach, opt for the replica settings, "stop-all" checkbox, or leverage Heavyscript.'}),"\n",(0,a.jsx)(e.h3,{id:"reading-the-logs",children:"Reading the Logs"}),"\n",(0,a.jsx)(e.p,{children:'Navigate to "Apps" and choose the GameVault-backend App you have created.'}),"\n",(0,a.jsx)(e.p,{children:"In workloads, select any of the white boxes with lines icon; thats the logs button."}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"gamevault-workloads-logs-1",src:t(7317).A+"",width:"422",height:"809"})}),"\n",(0,a.jsx)(e.p,{children:"You have to select the correct main pod and container"}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"gamevault-workloads-logs-2",src:t(1566).A+"",width:"598",height:"352"})}),"\n",(0,a.jsx)(e.p,{children:"Once you selected the main pod and container pod; you should see the logs for the app"}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"gamevault-workloads-logs-3",src:t(4055).A+"",width:"1881",height:"235"})}),"\n",(0,a.jsx)(e.p,{children:"You can then download the logs, but you might have to reselect the correct pods again when downloading the logs."}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"gamevault-workloads-logs-4",src:t(4440).A+"",width:"588",height:"421"})})]})}function g(A={}){const{wrapper:e}={...(0,s.R)(),...A.components};return e?(0,a.jsx)(e,{...A,children:(0,a.jsx)(l,{...A})}):l(A)}},1231:(A,e,t)=>{t.d(e,{A:()=>n});const n=t.p+"assets/images/gamevault-stop-all-1f3a1e720ade3ecba89c0d63e6ee9bc1.png"},7317:(A,e,t)=>{t.d(e,{A:()=>n});const n=t.p+"assets/images/gamevault-workloads-logs-1-0a2a9337c9356c4acd287492e815ee01.png"},1566:(A,e,t)=>{t.d(e,{A:()=>n});const n="data:image/png;base64,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"},4055:(A,e,t)=>{t.d(e,{A:()=>n});const n=t.p+"assets/images/gamevault-workloads-logs-3-1baf7d54cd87481af3685e08c77f9d0d.png"},4440:(A,e,t)=>{t.d(e,{A:()=>n});const n="data:image/png;base64,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"},4446:(A,e,t)=>{t.d(e,{A:()=>n});const n=t.p+"assets/images/scale-add-truecharts-catalog-201abb147a45192270d8978f1d560324.png"},5970:(A,e,t)=>{t.d(e,{A:()=>n});const n=t.p+"assets/images/scale-configure-gamevault-app-install-1-f77e819fe4925ed18904f80e6f0d613e.png"},2464:(A,e,t)=>{t.d(e,{A:()=>n});const n=t.p+"assets/images/scale-configure-gamevault-app-install-3-ac408b5dfd46341a7f7c77f6196fd506.png"},7495:(A,e,t)=>{t.d(e,{A:()=>n});const n=t.p+"assets/images/scale-configured-gamevault-app-installed-db255883caaf34572f6403034d11f56a.png"},6745:(A,e,t)=>{t.d(e,{A:()=>n});const n=t.p+"assets/images/scale-discover-gamevault-app-install-203a397bf7abfccc33be4462ec225bb5.png"},3598:(A,e,t)=>{t.d(e,{A:()=>n});const n=t.p+"assets/images/scale-discover-gamevault-app-search-042a9ac7bc7a5ce195b085144c4a3e60.png"},9558:(A,e,t)=>{t.d(e,{A:()=>n});const n=t.p+"assets/images/scale-login-248c8e0a2719f7dc7db7893a7d97dc3b.png"},8591:(A,e,t)=>{t.d(e,{R:()=>r,x:()=>c});var n=t(758);const a={},s=n.createContext(a);function r(A){const e=n.useContext(s);return n.useMemo((function(){return"function"==typeof A?A(e):{...e,...A}}),[e,A])}function c(A){let e;return e=A.disableParentContext?"function"==typeof A.components?A.components(a):A.components||a:r(A.components),n.createElement(s.Provider,{value:e},A.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[7903],{6709:(A,e,t)=>{t.r(e),t.d(e,{assets:()=>i,contentTitle:()=>c,default:()=>g,frontMatter:()=>r,metadata:()=>n,toc:()=>o});const n=JSON.parse('{"id":"server-docs/setup/truenas-scale-legacy","title":"Using TrueNAS Scale (prior v24.10)","description":"TrueNAS Scale is an open-source, hyper-converged storage platform that combines the reliability of TrueNAS with the versatility of Linux, providing a unified solution for storage, virtualization, and containerization in a single, easy-to-manage system.","source":"@site/docs/server-docs/setup/truenas-scale-legacy.md","sourceDirName":"server-docs/setup","slug":"/server-docs/setup/truenas-scale-legacy","permalink":"/docs/server-docs/setup/truenas-scale-legacy","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/setup/truenas-scale-legacy.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"sidebarPosition":4.1,"frontMatter":{"title":"Using TrueNAS Scale (prior v24.10)","sidebar_position":4.1},"sidebar":"docs","previous":{"title":"Using CapRover","permalink":"/docs/server-docs/setup/caprover"},"next":{"title":"Using TrueNAS Scale (since v24.10)","permalink":"/docs/server-docs/setup/truenas-scale"}}');var a=t(6070),s=t(8591);const r={title:"Using TrueNAS Scale (prior v24.10)",sidebar_position:4.1},c=void 0,i={},o=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Step 1: Log in to your TrueNAS Scale Dashboard",id:"step-1-log-in-to-your-truenas-scale-dashboard",level:2},{value:"Step 2: Navigate to the catalog Page in TrueNas Scale",id:"step-2-navigate-to-the-catalog-page-in-truenas-scale",level:2},{value:"Step 3: Navigate to Apps and Disover Page",id:"step-3-navigate-to-apps-and-disover-page",level:2},{value:"Step 4: Configure and Install gamevault-backend",id:"step-4-configure-and-install-gamevault-backend",level:2},{value:"Conclusion",id:"conclusion",level:2},{value:"Additional Info",id:"additional-info",level:2},{value:"Stopping the Server",id:"stopping-the-server",level:3},{value:"Reading the Logs",id:"reading-the-logs",level:3}];function l(A){const e={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...A.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(e.p,{children:[(0,a.jsx)(e.a,{href:"https://www.truenas.com/truenas-scale/",children:"TrueNAS Scale"})," is an open-source, hyper-converged storage platform that combines the reliability of TrueNAS with the versatility of Linux, providing a unified solution for storage, virtualization, and containerization in a single, easy-to-manage system."]}),"\n",(0,a.jsxs)(e.p,{children:["Setting up a GameVault Server on TrueNAS Scale prior, to version 24.10, is just a click away by using our template from the ",(0,a.jsx)(e.a,{href:"https://truecharts.org/manual/SCALE/guides/getting-started",children:"Truecharts Catalog"}),",\na community based catalog for TrueNAS Scale."]}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsxs)(e.strong,{children:["If you are using TrueNAS Scale version 24.10, or newer, please use this documentation: ",(0,a.jsx)(e.a,{href:"/docs/server-docs/setup/truenas-scale",children:"TrueNAS Scale"})]})}),"\n",(0,a.jsx)(e.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,a.jsxs)(e.ul,{children:["\n",(0,a.jsx)(e.li,{children:"a running TrueNAS Scale Server (prior to version 24.10)"}),"\n",(0,a.jsxs)(e.li,{children:["add the TrueCharts ",(0,a.jsx)(e.a,{href:"https://truecharts.org/manual/SCALE/guides/getting-started",children:"Catalog"})]}),"\n",(0,a.jsxs)(e.li,{children:["Install the following ",(0,a.jsx)(e.a,{href:"https://truecharts.org/manual/FAQ#operators",children:"operators"})," from TrueCharts; ",(0,a.jsx)(e.strong,{children:"prometheus-operator"})," and ",(0,a.jsx)(e.strong,{children:"cloudnative-pg"}),"."]}),"\n"]}),"\n",(0,a.jsx)(e.h2,{id:"step-1-log-in-to-your-truenas-scale-dashboard",children:"Step 1: Log in to your TrueNAS Scale Dashboard"}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"Step 1",src:t(9558).A+"",width:"1919",height:"943"})}),"\n",(0,a.jsx)(e.h2,{id:"step-2-navigate-to-the-catalog-page-in-truenas-scale",children:"Step 2: Navigate to the catalog Page in TrueNas Scale"}),"\n",(0,a.jsxs)(e.p,{children:["Go to ",(0,a.jsx)(e.strong,{children:"apps"})," -> ",(0,a.jsx)(e.strong,{children:"discover"})," -> ",(0,a.jsx)(e.strong,{children:"catalogs"}),"."]}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"Step 2",src:t(4446).A+"",width:"1918",height:"592"})}),"\n",(0,a.jsx)(e.p,{children:"Validate that TrueCharts catalog was added to the server, if not refer back to the Prerequisites section."}),"\n",(0,a.jsx)(e.h2,{id:"step-3-navigate-to-apps-and-disover-page",children:"Step 3: Navigate to Apps and Disover Page"}),"\n",(0,a.jsxs)(e.p,{children:["Go to ",(0,a.jsx)(e.strong,{children:"apps"})," -> ",(0,a.jsx)(e.strong,{children:"discover"})," and search for ",(0,a.jsx)(e.strong,{children:"gamevault-backend"})]}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"Step 3",src:t(3598).A+"",width:"1919",height:"587"})}),"\n",(0,a.jsx)(e.h2,{id:"step-4-configure-and-install-gamevault-backend",children:"Step 4: Configure and Install gamevault-backend"}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"Step 4",src:t(6745).A+"",width:"1919",height:"374"})}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"Step 4a",src:t(5970).A+"",width:"1488",height:"752"})}),"\n",(0,a.jsxs)(e.p,{children:["Scroll down to ",(0,a.jsx)(e.strong,{children:"App Configuration"}),"."]}),"\n",(0,a.jsxs)(e.p,{children:["Set your ",(0,a.jsx)(e.code,{children:"Admin User"})," and ",(0,a.jsx)(e.code,{children:"Admin Password"}),"."]}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"Step 4b",src:t(2464).A+"",width:"1485",height:"874"})}),"\n",(0,a.jsx)(e.admonition,{type:"note",children:(0,a.jsx)(e.p,{children:"Leave the Logs and Images storage options as PVC."})}),"\n",(0,a.jsxs)(e.p,{children:["Games storage option can be safely set hostpath if not using using any shares or switch to NFS otherwise; please follow the ",(0,a.jsx)(e.a,{href:"https://truecharts.org/manual/SCALE/guides/dataset",children:"Dataset and Share Setup"})," guide."]}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"Step 4c",src:t(2464).A+"",width:"1485",height:"874"})}),"\n",(0,a.jsxs)(e.p,{children:["Scroll down to ",(0,a.jsx)(e.strong,{children:"Documentation"})," and click install, wait a few minutes and the app should deploy!"]}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"Installed",src:t(7495).A+"",width:"1919",height:"949"})}),"\n",(0,a.jsx)(e.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,a.jsx)(e.p,{children:"You have now successfully set up your GameVault Server using TrueNAS Scale."}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.a,{href:"/docs/server-docs/setup/#what-next",children:"Click here to continue."})}),"\n",(0,a.jsx)(e.h2,{id:"additional-info",children:"Additional Info"}),"\n",(0,a.jsx)(e.h3,{id:"stopping-the-server",children:"Stopping the Server"}),"\n",(0,a.jsxs)(e.p,{children:["To stop the server in TrueNAS Scale, you can click on the gamevault-backend app and then edit the app; set the replicas to 0 or use the ",(0,a.jsx)(e.a,{href:"https://truecharts.org/news/stop-all/",children:'"stop-all"'}),' feature. When editing an application, checking the "stop-all" box and saving the changes accomplishes this. If you\'re working with applications based on CNPG (cloudnative-postgres), the same methods apply, ensuring a safe shutdown.']}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"stop-all",src:t(1231).A+"",width:"394",height:"423"})}),"\n",(0,a.jsxs)(e.p,{children:["If you prefer using ",(0,a.jsx)(e.a,{href:"https://github.com/Heavybullets8/heavy_script",children:"Heavyscript"}),", a specialized script for TrueNAS Scale, it offers a secure way to stop apps, including those utilizing CNPG. By default, Heavyscript employs the ",(0,a.jsx)(e.a,{href:"https://truecharts.org/news/stop-all/",children:'"stop-all"'})," function to ensure a graceful shutdown."]}),"\n",(0,a.jsx)(e.p,{children:"Simple commands for heavyscript:"}),"\n",(0,a.jsxs)(e.p,{children:["stop: ",(0,a.jsx)(e.code,{children:"heavyscript app -x gamevault-backend"})]}),"\n",(0,a.jsxs)(e.p,{children:["start: ",(0,a.jsx)(e.code,{children:"heavyscript app -s gamevault-backend"})]}),"\n",(0,a.jsx)(e.p,{children:'Keep in mind that TrueNAS Scale does not support third-party operators. Consequently, relying on the stop button within the TrueNAS Scale GUI, often considered an IX (iXsystems) hack in the Kubernetes space, is not recommended. For a dependable and supported approach, opt for the replica settings, "stop-all" checkbox, or leverage Heavyscript.'}),"\n",(0,a.jsx)(e.h3,{id:"reading-the-logs",children:"Reading the Logs"}),"\n",(0,a.jsx)(e.p,{children:'Navigate to "Apps" and choose the GameVault-backend App you have created.'}),"\n",(0,a.jsx)(e.p,{children:"In workloads, select any of the white boxes with lines icon; thats the logs button."}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"gamevault-workloads-logs-1",src:t(7317).A+"",width:"422",height:"809"})}),"\n",(0,a.jsx)(e.p,{children:"You have to select the correct main pod and container"}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"gamevault-workloads-logs-2",src:t(1566).A+"",width:"598",height:"352"})}),"\n",(0,a.jsx)(e.p,{children:"Once you selected the main pod and container pod; you should see the logs for the app"}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"gamevault-workloads-logs-3",src:t(4055).A+"",width:"1881",height:"235"})}),"\n",(0,a.jsx)(e.p,{children:"You can then download the logs, but you might have to reselect the correct pods again when downloading the logs."}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.img,{alt:"gamevault-workloads-logs-4",src:t(4440).A+"",width:"588",height:"421"})})]})}function g(A={}){const{wrapper:e}={...(0,s.R)(),...A.components};return e?(0,a.jsx)(e,{...A,children:(0,a.jsx)(l,{...A})}):l(A)}},1231:(A,e,t)=>{t.d(e,{A:()=>n});const n=t.p+"assets/images/gamevault-stop-all-1f3a1e720ade3ecba89c0d63e6ee9bc1.png"},7317:(A,e,t)=>{t.d(e,{A:()=>n});const n=t.p+"assets/images/gamevault-workloads-logs-1-0a2a9337c9356c4acd287492e815ee01.png"},1566:(A,e,t)=>{t.d(e,{A:()=>n});const n="data:image/png;base64,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"},4055:(A,e,t)=>{t.d(e,{A:()=>n});const n=t.p+"assets/images/gamevault-workloads-logs-3-1baf7d54cd87481af3685e08c77f9d0d.png"},4440:(A,e,t)=>{t.d(e,{A:()=>n});const n="data:image/png;base64,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"},4446:(A,e,t)=>{t.d(e,{A:()=>n});const n=t.p+"assets/images/scale-add-truecharts-catalog-201abb147a45192270d8978f1d560324.png"},5970:(A,e,t)=>{t.d(e,{A:()=>n});const n=t.p+"assets/images/scale-configure-gamevault-app-install-1-f77e819fe4925ed18904f80e6f0d613e.png"},2464:(A,e,t)=>{t.d(e,{A:()=>n});const n=t.p+"assets/images/scale-configure-gamevault-app-install-3-ac408b5dfd46341a7f7c77f6196fd506.png"},7495:(A,e,t)=>{t.d(e,{A:()=>n});const n=t.p+"assets/images/scale-configured-gamevault-app-installed-db255883caaf34572f6403034d11f56a.png"},6745:(A,e,t)=>{t.d(e,{A:()=>n});const n=t.p+"assets/images/scale-discover-gamevault-app-install-203a397bf7abfccc33be4462ec225bb5.png"},3598:(A,e,t)=>{t.d(e,{A:()=>n});const n=t.p+"assets/images/scale-discover-gamevault-app-search-042a9ac7bc7a5ce195b085144c4a3e60.png"},9558:(A,e,t)=>{t.d(e,{A:()=>n});const n=t.p+"assets/images/scale-login-248c8e0a2719f7dc7db7893a7d97dc3b.png"},8591:(A,e,t)=>{t.d(e,{R:()=>r,x:()=>c});var n=t(758);const a={},s=n.createContext(a);function r(A){const e=n.useContext(s);return n.useMemo((function(){return"function"==typeof A?A(e):{...e,...A}}),[e,A])}function c(A){let e;return e=A.disableParentContext?"function"==typeof A.components?A.components(a):A.components||a:r(A.components),n.createElement(s.Provider,{value:e},A.children)}}}]); \ No newline at end of file diff --git a/assets/js/5e5c84c3.f36a4fad.js b/assets/js/5e5c84c3.b4c29083.js similarity index 99% rename from assets/js/5e5c84c3.f36a4fad.js rename to assets/js/5e5c84c3.b4c29083.js index 3d63f7530..9878ff9f8 100644 --- a/assets/js/5e5c84c3.f36a4fad.js +++ b/assets/js/5e5c84c3.b4c29083.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[6051],{2512:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>d,default:()=>h,frontMatter:()=>r,metadata:()=>i,toc:()=>a});const i=JSON.parse('{"id":"server-docs/game-types","title":"Game Types","description":"GameVault recognizes various Game Types, which affect how the application handles games, particularly during installation.","source":"@site/docs/server-docs/game-types.md","sourceDirName":"server-docs","slug":"/server-docs/game-types","permalink":"/docs/server-docs/game-types","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/game-types.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"sidebarPosition":2.5,"frontMatter":{"sidebar_position":2.5},"sidebar":"docs","previous":{"title":"File and Folder Structure","permalink":"/docs/server-docs/structure"},"next":{"title":"Adding Games to GameVault","permalink":"/docs/server-docs/adding-games"}}');var t=s(6070),l=s(8591);const r={sidebar_position:2.5},d="Game Types",c={},a=[{value:"Supported Game Types",id:"supported-game-types",level:2},{value:"Windows",id:"windows",level:3},{value:"Setup (W_S)",id:"setup-w_s",level:4},{value:"Portable (W_P)",id:"portable-w_p",level:4},{value:"Linux",id:"linux",level:3},{value:"Portable (L_P)",id:"portable-l_p",level:4},{value:"Undetected",id:"undetected",level:3}];function o(e){const n={a:"a",admonition:"admonition",br:"br",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,l.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"game-types",children:"Game Types"})}),"\n",(0,t.jsxs)(n.p,{children:["GameVault recognizes various ",(0,t.jsx)(n.strong,{children:"Game Types"}),", which affect how the application handles games, particularly during installation."]}),"\n",(0,t.jsxs)(n.p,{children:["The Game Type is automatically detected, but users can manually override it using the correct type tag, based on ",(0,t.jsx)(n.a,{href:"/docs/server-docs/structure",children:"GameVault\u2019s Naming Structure"}),". Each game can only have one type tag; if multiple tags are present, only one will be applied."]}),"\n",(0,t.jsx)(n.h2,{id:"supported-game-types",children:"Supported Game Types"}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:["Additional game types, such as ROMs and Android applications, may be added in the future.",(0,t.jsx)(n.br,{}),"\n","You can request more game types ",(0,t.jsx)(n.a,{href:"https://github.com/Phalcode/gamevault-backend/issues/new",children:"here"}),"."]})}),"\n",(0,t.jsx)(n.h3,{id:"windows",children:"Windows"}),"\n",(0,t.jsx)(n.h4,{id:"setup-w_s",children:"Setup (W_S)"}),"\n",(0,t.jsxs)(n.p,{children:["Windows Setup games require an installation process before play, initiated by setup-related files such as ",(0,t.jsx)(n.code,{children:"setup.exe"}),"."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Detection"}),": Identified through the type tag override or by specific setup-related executables in the archive."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"File Patterns"}),":"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"setup.exe"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"autorun.exe"})}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"setup_*.exe"})," (e.g., ",(0,t.jsx)(n.code,{children:"setup_game.exe"}),")"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"setup-*.exe"})," (e.g., ",(0,t.jsx)(n.code,{children:"setup-game.exe"}),")"]}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"install.exe"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"unarc.exe"})}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:".msi"})," files (excluding those containing ",(0,t.jsx)(n.code,{children:"redist"}),")"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Example Files in Archive"}),":"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"data.bin"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"data2.bin"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"setup.exe"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h4,{id:"portable-w_p",children:"Portable (W_P)"}),"\n",(0,t.jsx)(n.p,{children:"Portable Windows games can be played immediately without requiring a setup."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Detection"}),": Recognized through the type tag override or by the presence of ",(0,t.jsx)(n.code,{children:".exe"})," and ",(0,t.jsx)(n.code,{children:".msi"})," files, lacking setup-specific filenames."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Example Files in Archive"}),":","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"Butcher_Data/"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"Butcher.exe"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"linux",children:"Linux"}),"\n",(0,t.jsx)(n.h4,{id:"portable-l_p",children:"Portable (L_P)"}),"\n",(0,t.jsx)(n.p,{children:"Linux Portable games can be played immediately without additional setup."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Detection"}),": Determined by the type tag override or by the presence of ",(0,t.jsx)(n.code,{children:".sh"})," files, with no ",(0,t.jsx)(n.code,{children:".exe"})," or ",(0,t.jsx)(n.code,{children:".msi"})," files."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Example Files in Archive"}),":","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"Butcher_Data/"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"Butcher.sh"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"undetected",children:"Undetected"}),"\n",(0,t.jsx)(n.p,{children:"This is the default type if GameVault cannot automatically detect the game type. Users will need to manually install the game into the installation folder."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Example Files in Archive"}),":","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"data/"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"run.c64"})}),"\n"]}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(o,{...e})}):o(e)}},8591:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>d});var i=s(758);const t={},l=i.createContext(t);function r(e){const n=i.useContext(l);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),i.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[6051],{2512:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>d,default:()=>h,frontMatter:()=>r,metadata:()=>i,toc:()=>a});const i=JSON.parse('{"id":"server-docs/game-types","title":"Game Types","description":"GameVault recognizes various Game Types, which affect how the application handles games, particularly during installation.","source":"@site/docs/server-docs/game-types.md","sourceDirName":"server-docs","slug":"/server-docs/game-types","permalink":"/docs/server-docs/game-types","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/game-types.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"sidebarPosition":2.5,"frontMatter":{"sidebar_position":2.5},"sidebar":"docs","previous":{"title":"File and Folder Structure","permalink":"/docs/server-docs/structure"},"next":{"title":"Adding Games to GameVault","permalink":"/docs/server-docs/adding-games"}}');var t=s(6070),l=s(8591);const r={sidebar_position:2.5},d="Game Types",c={},a=[{value:"Supported Game Types",id:"supported-game-types",level:2},{value:"Windows",id:"windows",level:3},{value:"Setup (W_S)",id:"setup-w_s",level:4},{value:"Portable (W_P)",id:"portable-w_p",level:4},{value:"Linux",id:"linux",level:3},{value:"Portable (L_P)",id:"portable-l_p",level:4},{value:"Undetected",id:"undetected",level:3}];function o(e){const n={a:"a",admonition:"admonition",br:"br",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,l.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"game-types",children:"Game Types"})}),"\n",(0,t.jsxs)(n.p,{children:["GameVault recognizes various ",(0,t.jsx)(n.strong,{children:"Game Types"}),", which affect how the application handles games, particularly during installation."]}),"\n",(0,t.jsxs)(n.p,{children:["The Game Type is automatically detected, but users can manually override it using the correct type tag, based on ",(0,t.jsx)(n.a,{href:"/docs/server-docs/structure",children:"GameVault\u2019s Naming Structure"}),". Each game can only have one type tag; if multiple tags are present, only one will be applied."]}),"\n",(0,t.jsx)(n.h2,{id:"supported-game-types",children:"Supported Game Types"}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:["Additional game types, such as ROMs and Android applications, may be added in the future.",(0,t.jsx)(n.br,{}),"\n","You can request more game types ",(0,t.jsx)(n.a,{href:"https://github.com/Phalcode/gamevault-backend/issues/new",children:"here"}),"."]})}),"\n",(0,t.jsx)(n.h3,{id:"windows",children:"Windows"}),"\n",(0,t.jsx)(n.h4,{id:"setup-w_s",children:"Setup (W_S)"}),"\n",(0,t.jsxs)(n.p,{children:["Windows Setup games require an installation process before play, initiated by setup-related files such as ",(0,t.jsx)(n.code,{children:"setup.exe"}),"."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Detection"}),": Identified through the type tag override or by specific setup-related executables in the archive."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"File Patterns"}),":"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"setup.exe"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"autorun.exe"})}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"setup_*.exe"})," (e.g., ",(0,t.jsx)(n.code,{children:"setup_game.exe"}),")"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"setup-*.exe"})," (e.g., ",(0,t.jsx)(n.code,{children:"setup-game.exe"}),")"]}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"install.exe"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"unarc.exe"})}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:".msi"})," files (excluding those containing ",(0,t.jsx)(n.code,{children:"redist"}),")"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Example Files in Archive"}),":"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"data.bin"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"data2.bin"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"setup.exe"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h4,{id:"portable-w_p",children:"Portable (W_P)"}),"\n",(0,t.jsx)(n.p,{children:"Portable Windows games can be played immediately without requiring a setup."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Detection"}),": Recognized through the type tag override or by the presence of ",(0,t.jsx)(n.code,{children:".exe"})," and ",(0,t.jsx)(n.code,{children:".msi"})," files, lacking setup-specific filenames."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Example Files in Archive"}),":","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"Butcher_Data/"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"Butcher.exe"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"linux",children:"Linux"}),"\n",(0,t.jsx)(n.h4,{id:"portable-l_p",children:"Portable (L_P)"}),"\n",(0,t.jsx)(n.p,{children:"Linux Portable games can be played immediately without additional setup."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Detection"}),": Determined by the type tag override or by the presence of ",(0,t.jsx)(n.code,{children:".sh"})," files, with no ",(0,t.jsx)(n.code,{children:".exe"})," or ",(0,t.jsx)(n.code,{children:".msi"})," files."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Example Files in Archive"}),":","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"Butcher_Data/"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"Butcher.sh"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"undetected",children:"Undetected"}),"\n",(0,t.jsx)(n.p,{children:"This is the default type if GameVault cannot automatically detect the game type. Users will need to manually install the game into the installation folder."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Example Files in Archive"}),":","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"data/"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"run.c64"})}),"\n"]}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(o,{...e})}):o(e)}},8591:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>d});var i=s(758);const t={},l=i.createContext(t);function r(e){const n=i.useContext(l);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),i.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/61be0f73.1c0c6f17.js b/assets/js/61be0f73.503ca3ed.js similarity index 99% rename from assets/js/61be0f73.1c0c6f17.js rename to assets/js/61be0f73.503ca3ed.js index d612fba2d..543faee12 100644 --- a/assets/js/61be0f73.1c0c6f17.js +++ b/assets/js/61be0f73.503ca3ed.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[3555],{4142:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>t,default:()=>h,frontMatter:()=>c,metadata:()=>r,toc:()=>o});const r=JSON.parse('{"id":"server-docs/structure","title":"File and Folder Structure","description":"If you want to set up a GameVault Server, you need to pay attention to the file and folder structure.","source":"@site/docs/server-docs/structure.md","sourceDirName":"server-docs","slug":"/server-docs/structure","permalink":"/docs/server-docs/structure","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/structure.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"sidebarPosition":2,"frontMatter":{"sidebar_position":2},"sidebar":"docs","previous":{"title":"Configuration","permalink":"/docs/server-docs/configuration"},"next":{"title":"Game Types","permalink":"/docs/server-docs/game-types"}}');var d=n(6070),i=n(8591);const c={sidebar_position:2},t="File and Folder Structure",l={},o=[{value:"Supported Archive Formats",id:"supported-archive-formats",level:2},{value:"Single File Executable",id:"single-file-executable",level:3},{value:"Naming Convention for Games",id:"naming-convention-for-games",level:2},{value:"Other Examples",id:"other-examples",level:3}];function a(e){const s={a:"a",admonition:"admonition",br:"br",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(s.header,{children:(0,d.jsx)(s.h1,{id:"file-and-folder-structure",children:"File and Folder Structure"})}),"\n",(0,d.jsxs)(s.p,{children:["If you want to set up a GameVault Server, you need to pay attention to the file and folder structure.\nThe volume mapped to the ",(0,d.jsx)(s.code,{children:"/files"})," directory must contain your games. These games must be named correctly and should either be archived in one of the supported archive formats listed below or be a single-file executable as described below to be accurately detected by GameVault."]}),"\n",(0,d.jsx)(s.h2,{id:"supported-archive-formats",children:"Supported Archive Formats"}),"\n",(0,d.jsx)(s.p,{children:"GameVault supports all file formats 7zip 23.01 (2023-06-20) does:"}),"\n",(0,d.jsxs)(s.p,{children:[(0,d.jsx)(s.code,{children:".7z"})," ",(0,d.jsx)(s.code,{children:".xz"})," ",(0,d.jsx)(s.code,{children:".bz2"})," ",(0,d.jsx)(s.code,{children:".gz"})," ",(0,d.jsx)(s.code,{children:".tar"})," ",(0,d.jsx)(s.code,{children:".zip"})," ",(0,d.jsx)(s.code,{children:".wim"})," ",(0,d.jsx)(s.code,{children:".ar"})," ",(0,d.jsx)(s.code,{children:".arj"})," ",(0,d.jsx)(s.code,{children:".cab"})," ",(0,d.jsx)(s.code,{children:".chm"})," ",(0,d.jsx)(s.code,{children:".cpio"})," ",(0,d.jsx)(s.code,{children:".cramfs"})," ",(0,d.jsx)(s.code,{children:".dmg"})," ",(0,d.jsx)(s.code,{children:".ext"})," ",(0,d.jsx)(s.code,{children:".fat"})," ",(0,d.jsx)(s.code,{children:".gpt"})," ",(0,d.jsx)(s.code,{children:".hfs"})," ",(0,d.jsx)(s.code,{children:".ihex"})," ",(0,d.jsx)(s.code,{children:".iso"})," ",(0,d.jsx)(s.code,{children:".lzh"})," ",(0,d.jsx)(s.code,{children:".lzma"})," ",(0,d.jsx)(s.code,{children:".mbr"})," ",(0,d.jsx)(s.code,{children:".msi"})," ",(0,d.jsx)(s.code,{children:".nsis"})," ",(0,d.jsx)(s.code,{children:".ntfs"})," ",(0,d.jsx)(s.code,{children:".qcow2"})," ",(0,d.jsx)(s.code,{children:".rar"})," ",(0,d.jsx)(s.code,{children:".rpm"})," ",(0,d.jsx)(s.code,{children:".squashfs"})," ",(0,d.jsx)(s.code,{children:".udf"})," ",(0,d.jsx)(s.code,{children:".uefi"})," ",(0,d.jsx)(s.code,{children:".vdi"})," ",(0,d.jsx)(s.code,{children:".vhd"})," ",(0,d.jsx)(s.code,{children:".vmdk"})," ",(0,d.jsx)(s.code,{children:".wim"})," ",(0,d.jsx)(s.code,{children:".xar"})," ",(0,d.jsx)(s.code,{children:".z"})]}),"\n",(0,d.jsx)(s.h3,{id:"single-file-executable",children:"Single File Executable"}),"\n",(0,d.jsxs)(s.p,{children:["We recommend ",(0,d.jsx)(s.a,{href:"#supported-archive-formats",children:"archiving games"})," to save storage and bandwidth. However, if the game is just a single file executable, like ",(0,d.jsx)(s.code,{children:"setup_game.exe"})," or ",(0,d.jsx)(s.code,{children:"setup_game.sh"}),", you can import it into GameVault without archiving. Just be sure to rename it as described below for compatibility with GameVault (e.g. ",(0,d.jsx)(s.code,{children:"Minecraft (v1.12) (2011).exe"}),"). By default, GameVault autodetects the ",(0,d.jsx)(s.a,{href:"/docs/server-docs/game-types",children:"game type"}),' of single-file executables as a setup-type game. In rare cases, games can be single portable executables without additional setup. If that\'s the case, make sure to mark the games as "Portable" using the type override.']}),"\n",(0,d.jsxs)(s.p,{children:["Supported Executables:",(0,d.jsx)(s.br,{}),"\n",(0,d.jsx)(s.code,{children:".exe"})," ",(0,d.jsx)(s.code,{children:".sh"})]}),"\n",(0,d.jsx)(s.admonition,{title:"Downloading single-file executables",type:"note",children:(0,d.jsxs)(s.p,{children:["Single-file executables are packed into a ",(0,d.jsx)(s.code,{children:".tar"})," file (no compression) and cached in the server's ",(0,d.jsx)(s.code,{children:"/tmp"})," folder on-the-fly when users download them, to make them compatible with the GameVault Client. The cached files are reused until deleted by a Server Restart."]})}),"\n",(0,d.jsx)(s.h2,{id:"naming-convention-for-games",children:"Naming Convention for Games"}),"\n",(0,d.jsx)(s.p,{children:"The name of each game file must follow this format:"}),"\n",(0,d.jsx)(s.p,{children:(0,d.jsx)(s.code,{children:"Title (Version) (EarlyAccess) (GameType) (NoCache) (ReleaseYear).zip"})}),"\n",(0,d.jsxs)(s.p,{children:["Note that the parentheses must be included, and the naming convention is ",(0,d.jsx)(s.strong,{children:"case sensitive"}),"."]}),"\n",(0,d.jsx)(s.p,{children:"Here's an explanation of each part of the naming convention:"}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Part"}),(0,d.jsx)(s.th,{children:"Description"}),(0,d.jsx)(s.th,{children:"Example Value(s)"}),(0,d.jsx)(s.th,{children:"Required?"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.strong,{children:"Title"})}),(0,d.jsx)(s.td,{children:"The name of the game"}),(0,d.jsxs)(s.td,{children:[(0,d.jsx)(s.code,{children:"Far Cry 6"}),", ",(0,d.jsx)(s.code,{children:"HITMAN 3"})]}),(0,d.jsx)(s.td,{children:"Yes"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.strong,{children:"Version"})}),(0,d.jsxs)(s.td,{children:["An optional version tag that must begin with a lowercase ",(0,d.jsx)(s.code,{children:"v"})]}),(0,d.jsxs)(s.td,{children:[(0,d.jsx)(s.code,{children:"(v1.0)"}),", ",(0,d.jsx)(s.code,{children:"(v1.224)"})," , N/A"]}),(0,d.jsx)(s.td,{children:"No"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.strong,{children:"EarlyAccess"})}),(0,d.jsx)(s.td,{children:"An optional tag that indicates whether the game is in Early Access"}),(0,d.jsxs)(s.td,{children:[(0,d.jsx)(s.code,{children:"(EA)"}),", N/A"]}),(0,d.jsx)(s.td,{children:"No"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.strong,{children:"GameType"})}),(0,d.jsxs)(s.td,{children:["Override for the games type. ",(0,d.jsx)(s.a,{href:"/docs/server-docs/game-types",children:"See here."})]}),(0,d.jsxs)(s.td,{children:[(0,d.jsx)(s.code,{children:"(W_P)"}),", ",(0,d.jsx)(s.code,{children:"(W_S)"}),", ",(0,d.jsx)(s.code,{children:"..."})," , N/A"]}),(0,d.jsx)(s.td,{children:"No"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.strong,{children:"NoCache"})}),(0,d.jsx)(s.td,{children:'An optional "NO CACHE"-flag that prevents the server searching for this game on external videogame databases.'}),(0,d.jsxs)(s.td,{children:[(0,d.jsx)(s.code,{children:"(NC)"}),", N/A"]}),(0,d.jsx)(s.td,{children:"No"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.strong,{children:"ReleaseYear"})}),(0,d.jsx)(s.td,{children:"The year of the game's release, for accurate detection"}),(0,d.jsxs)(s.td,{children:[(0,d.jsx)(s.code,{children:"(2021)"}),", ",(0,d.jsx)(s.code,{children:"(2019)"}),", N/A"]}),(0,d.jsx)(s.td,{children:"No"})]})]})]}),"\n",(0,d.jsx)(s.p,{children:"Here's an example of a file that follows this convention:"}),"\n",(0,d.jsx)(s.p,{children:(0,d.jsx)(s.code,{children:"Far Cry 6 (v1.5.0) (2021).zip"})}),"\n",(0,d.jsx)(s.p,{children:"By following this naming convention and using the common values listed in the table above, you can ensure that your games are detected correctly by GameVault."}),"\n",(0,d.jsx)(s.admonition,{title:"Illegal Filenames and Characters",type:"warning",children:(0,d.jsxs)(s.ul,{children:["\n",(0,d.jsxs)(s.li,{children:["File names must not contain the following characters: ",(0,d.jsx)(s.code,{children:"/"}),", ",(0,d.jsx)(s.code,{children:"<"}),", ",(0,d.jsx)(s.code,{children:">"}),", ",(0,d.jsx)(s.code,{children:":"}),", ",(0,d.jsx)(s.code,{children:'"'}),", ",(0,d.jsx)(s.code,{children:"\\"}),", ",(0,d.jsx)(s.code,{children:"|"}),", ",(0,d.jsx)(s.code,{children:"?"}),", and ",(0,d.jsx)(s.code,{children:"*"}),". Replace these problematic characters with appropriate ones to ensure compatibility across all systems."]}),"\n",(0,d.jsx)(s.li,{children:"Avoid ending file names with spaces or dots."}),"\n",(0,d.jsxs)(s.li,{children:["Avoid using text within Round brackets such as ",(0,d.jsx)(s.code,{children:"(GOTY)"})," in your file names, as GameVault will remove them. Round brackets are reserved for the different flags mentioned above. Use square brackets instead: ",(0,d.jsx)(s.code,{children:"[GOTY]"})]}),"\n",(0,d.jsxs)(s.li,{children:["Do not use reserved file names such as ",(0,d.jsx)(s.code,{children:"CON"}),", ",(0,d.jsx)(s.code,{children:"PRN"}),", ",(0,d.jsx)(s.code,{children:"AUX"}),", ",(0,d.jsx)(s.code,{children:"NUL"}),", ",(0,d.jsx)(s.code,{children:"COM(1-9)"}),", ",(0,d.jsx)(s.code,{children:"LPT(1-9)"}),", etc."]}),"\n",(0,d.jsxs)(s.li,{children:["Avoid using multiple chained extensions like ",(0,d.jsx)(s.code,{children:".tar.gz"})," or ",(0,d.jsx)(s.code,{children:".tar.bz2"}),". Instead, use only the last extension like ",(0,d.jsx)(s.code,{children:".gz"})," or ",(0,d.jsx)(s.code,{children:".bz2"}),"."]}),"\n"]})}),"\n",(0,d.jsx)(s.h3,{id:"other-examples",children:"Other Examples"}),"\n",(0,d.jsx)(s.p,{children:"Here are some other valid examples of game names that follow the naming convention:"}),"\n",(0,d.jsxs)(s.ul,{children:["\n",(0,d.jsx)(s.li,{children:(0,d.jsx)(s.code,{children:"Star Wars Jedi - Fallen Order(v1.0.10.0) (2019).zip"})}),"\n",(0,d.jsx)(s.li,{children:(0,d.jsx)(s.code,{children:"HITMAN 3 (v3.10.1) (2021).7z"})}),"\n",(0,d.jsx)(s.li,{children:(0,d.jsx)(s.code,{children:"The Wandering Village (v0.1.32) (EA) (2022).iso"})}),"\n",(0,d.jsx)(s.li,{children:(0,d.jsx)(s.code,{children:"Saints Row (W_S) (2022).zip"})}),"\n",(0,d.jsx)(s.li,{children:(0,d.jsx)(s.code,{children:"My personal IndieGame (v1.2.9) (NC) (2018).zip"})}),"\n",(0,d.jsx)(s.li,{children:(0,d.jsx)(s.code,{children:"Stray (2022).7z"})}),"\n",(0,d.jsx)(s.li,{children:(0,d.jsx)(s.code,{children:"Captain of Industry (v0.4.12b) (EA) (2022).gz"})}),"\n",(0,d.jsx)(s.li,{children:(0,d.jsx)(s.code,{children:"Minecraft (2011).exe"})}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,d.jsx)(s,{...e,children:(0,d.jsx)(a,{...e})}):a(e)}},8591:(e,s,n)=>{n.d(s,{R:()=>c,x:()=>t});var r=n(758);const d={},i=r.createContext(d);function c(e){const s=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function t(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:c(e.components),r.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[3555],{4142:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>t,default:()=>h,frontMatter:()=>c,metadata:()=>r,toc:()=>o});const r=JSON.parse('{"id":"server-docs/structure","title":"File and Folder Structure","description":"If you want to set up a GameVault Server, you need to pay attention to the file and folder structure.","source":"@site/docs/server-docs/structure.md","sourceDirName":"server-docs","slug":"/server-docs/structure","permalink":"/docs/server-docs/structure","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/structure.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"sidebarPosition":2,"frontMatter":{"sidebar_position":2},"sidebar":"docs","previous":{"title":"Configuration","permalink":"/docs/server-docs/configuration"},"next":{"title":"Game Types","permalink":"/docs/server-docs/game-types"}}');var d=n(6070),i=n(8591);const c={sidebar_position:2},t="File and Folder Structure",l={},o=[{value:"Supported Archive Formats",id:"supported-archive-formats",level:2},{value:"Single File Executable",id:"single-file-executable",level:3},{value:"Naming Convention for Games",id:"naming-convention-for-games",level:2},{value:"Other Examples",id:"other-examples",level:3}];function a(e){const s={a:"a",admonition:"admonition",br:"br",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(s.header,{children:(0,d.jsx)(s.h1,{id:"file-and-folder-structure",children:"File and Folder Structure"})}),"\n",(0,d.jsxs)(s.p,{children:["If you want to set up a GameVault Server, you need to pay attention to the file and folder structure.\nThe volume mapped to the ",(0,d.jsx)(s.code,{children:"/files"})," directory must contain your games. These games must be named correctly and should either be archived in one of the supported archive formats listed below or be a single-file executable as described below to be accurately detected by GameVault."]}),"\n",(0,d.jsx)(s.h2,{id:"supported-archive-formats",children:"Supported Archive Formats"}),"\n",(0,d.jsx)(s.p,{children:"GameVault supports all file formats 7zip 23.01 (2023-06-20) does:"}),"\n",(0,d.jsxs)(s.p,{children:[(0,d.jsx)(s.code,{children:".7z"})," ",(0,d.jsx)(s.code,{children:".xz"})," ",(0,d.jsx)(s.code,{children:".bz2"})," ",(0,d.jsx)(s.code,{children:".gz"})," ",(0,d.jsx)(s.code,{children:".tar"})," ",(0,d.jsx)(s.code,{children:".zip"})," ",(0,d.jsx)(s.code,{children:".wim"})," ",(0,d.jsx)(s.code,{children:".ar"})," ",(0,d.jsx)(s.code,{children:".arj"})," ",(0,d.jsx)(s.code,{children:".cab"})," ",(0,d.jsx)(s.code,{children:".chm"})," ",(0,d.jsx)(s.code,{children:".cpio"})," ",(0,d.jsx)(s.code,{children:".cramfs"})," ",(0,d.jsx)(s.code,{children:".dmg"})," ",(0,d.jsx)(s.code,{children:".ext"})," ",(0,d.jsx)(s.code,{children:".fat"})," ",(0,d.jsx)(s.code,{children:".gpt"})," ",(0,d.jsx)(s.code,{children:".hfs"})," ",(0,d.jsx)(s.code,{children:".ihex"})," ",(0,d.jsx)(s.code,{children:".iso"})," ",(0,d.jsx)(s.code,{children:".lzh"})," ",(0,d.jsx)(s.code,{children:".lzma"})," ",(0,d.jsx)(s.code,{children:".mbr"})," ",(0,d.jsx)(s.code,{children:".msi"})," ",(0,d.jsx)(s.code,{children:".nsis"})," ",(0,d.jsx)(s.code,{children:".ntfs"})," ",(0,d.jsx)(s.code,{children:".qcow2"})," ",(0,d.jsx)(s.code,{children:".rar"})," ",(0,d.jsx)(s.code,{children:".rpm"})," ",(0,d.jsx)(s.code,{children:".squashfs"})," ",(0,d.jsx)(s.code,{children:".udf"})," ",(0,d.jsx)(s.code,{children:".uefi"})," ",(0,d.jsx)(s.code,{children:".vdi"})," ",(0,d.jsx)(s.code,{children:".vhd"})," ",(0,d.jsx)(s.code,{children:".vmdk"})," ",(0,d.jsx)(s.code,{children:".wim"})," ",(0,d.jsx)(s.code,{children:".xar"})," ",(0,d.jsx)(s.code,{children:".z"})]}),"\n",(0,d.jsx)(s.h3,{id:"single-file-executable",children:"Single File Executable"}),"\n",(0,d.jsxs)(s.p,{children:["We recommend ",(0,d.jsx)(s.a,{href:"#supported-archive-formats",children:"archiving games"})," to save storage and bandwidth. However, if the game is just a single file executable, like ",(0,d.jsx)(s.code,{children:"setup_game.exe"})," or ",(0,d.jsx)(s.code,{children:"setup_game.sh"}),", you can import it into GameVault without archiving. Just be sure to rename it as described below for compatibility with GameVault (e.g. ",(0,d.jsx)(s.code,{children:"Minecraft (v1.12) (2011).exe"}),"). By default, GameVault autodetects the ",(0,d.jsx)(s.a,{href:"/docs/server-docs/game-types",children:"game type"}),' of single-file executables as a setup-type game. In rare cases, games can be single portable executables without additional setup. If that\'s the case, make sure to mark the games as "Portable" using the type override.']}),"\n",(0,d.jsxs)(s.p,{children:["Supported Executables:",(0,d.jsx)(s.br,{}),"\n",(0,d.jsx)(s.code,{children:".exe"})," ",(0,d.jsx)(s.code,{children:".sh"})]}),"\n",(0,d.jsx)(s.admonition,{title:"Downloading single-file executables",type:"note",children:(0,d.jsxs)(s.p,{children:["Single-file executables are packed into a ",(0,d.jsx)(s.code,{children:".tar"})," file (no compression) and cached in the server's ",(0,d.jsx)(s.code,{children:"/tmp"})," folder on-the-fly when users download them, to make them compatible with the GameVault Client. The cached files are reused until deleted by a Server Restart."]})}),"\n",(0,d.jsx)(s.h2,{id:"naming-convention-for-games",children:"Naming Convention for Games"}),"\n",(0,d.jsx)(s.p,{children:"The name of each game file must follow this format:"}),"\n",(0,d.jsx)(s.p,{children:(0,d.jsx)(s.code,{children:"Title (Version) (EarlyAccess) (GameType) (NoCache) (ReleaseYear).zip"})}),"\n",(0,d.jsxs)(s.p,{children:["Note that the parentheses must be included, and the naming convention is ",(0,d.jsx)(s.strong,{children:"case sensitive"}),"."]}),"\n",(0,d.jsx)(s.p,{children:"Here's an explanation of each part of the naming convention:"}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Part"}),(0,d.jsx)(s.th,{children:"Description"}),(0,d.jsx)(s.th,{children:"Example Value(s)"}),(0,d.jsx)(s.th,{children:"Required?"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.strong,{children:"Title"})}),(0,d.jsx)(s.td,{children:"The name of the game"}),(0,d.jsxs)(s.td,{children:[(0,d.jsx)(s.code,{children:"Far Cry 6"}),", ",(0,d.jsx)(s.code,{children:"HITMAN 3"})]}),(0,d.jsx)(s.td,{children:"Yes"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.strong,{children:"Version"})}),(0,d.jsxs)(s.td,{children:["An optional version tag that must begin with a lowercase ",(0,d.jsx)(s.code,{children:"v"})]}),(0,d.jsxs)(s.td,{children:[(0,d.jsx)(s.code,{children:"(v1.0)"}),", ",(0,d.jsx)(s.code,{children:"(v1.224)"})," , N/A"]}),(0,d.jsx)(s.td,{children:"No"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.strong,{children:"EarlyAccess"})}),(0,d.jsx)(s.td,{children:"An optional tag that indicates whether the game is in Early Access"}),(0,d.jsxs)(s.td,{children:[(0,d.jsx)(s.code,{children:"(EA)"}),", N/A"]}),(0,d.jsx)(s.td,{children:"No"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.strong,{children:"GameType"})}),(0,d.jsxs)(s.td,{children:["Override for the games type. ",(0,d.jsx)(s.a,{href:"/docs/server-docs/game-types",children:"See here."})]}),(0,d.jsxs)(s.td,{children:[(0,d.jsx)(s.code,{children:"(W_P)"}),", ",(0,d.jsx)(s.code,{children:"(W_S)"}),", ",(0,d.jsx)(s.code,{children:"..."})," , N/A"]}),(0,d.jsx)(s.td,{children:"No"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.strong,{children:"NoCache"})}),(0,d.jsx)(s.td,{children:'An optional "NO CACHE"-flag that prevents the server searching for this game on external videogame databases.'}),(0,d.jsxs)(s.td,{children:[(0,d.jsx)(s.code,{children:"(NC)"}),", N/A"]}),(0,d.jsx)(s.td,{children:"No"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.strong,{children:"ReleaseYear"})}),(0,d.jsx)(s.td,{children:"The year of the game's release, for accurate detection"}),(0,d.jsxs)(s.td,{children:[(0,d.jsx)(s.code,{children:"(2021)"}),", ",(0,d.jsx)(s.code,{children:"(2019)"}),", N/A"]}),(0,d.jsx)(s.td,{children:"No"})]})]})]}),"\n",(0,d.jsx)(s.p,{children:"Here's an example of a file that follows this convention:"}),"\n",(0,d.jsx)(s.p,{children:(0,d.jsx)(s.code,{children:"Far Cry 6 (v1.5.0) (2021).zip"})}),"\n",(0,d.jsx)(s.p,{children:"By following this naming convention and using the common values listed in the table above, you can ensure that your games are detected correctly by GameVault."}),"\n",(0,d.jsx)(s.admonition,{title:"Illegal Filenames and Characters",type:"warning",children:(0,d.jsxs)(s.ul,{children:["\n",(0,d.jsxs)(s.li,{children:["File names must not contain the following characters: ",(0,d.jsx)(s.code,{children:"/"}),", ",(0,d.jsx)(s.code,{children:"<"}),", ",(0,d.jsx)(s.code,{children:">"}),", ",(0,d.jsx)(s.code,{children:":"}),", ",(0,d.jsx)(s.code,{children:'"'}),", ",(0,d.jsx)(s.code,{children:"\\"}),", ",(0,d.jsx)(s.code,{children:"|"}),", ",(0,d.jsx)(s.code,{children:"?"}),", and ",(0,d.jsx)(s.code,{children:"*"}),". Replace these problematic characters with appropriate ones to ensure compatibility across all systems."]}),"\n",(0,d.jsx)(s.li,{children:"Avoid ending file names with spaces or dots."}),"\n",(0,d.jsxs)(s.li,{children:["Avoid using text within Round brackets such as ",(0,d.jsx)(s.code,{children:"(GOTY)"})," in your file names, as GameVault will remove them. Round brackets are reserved for the different flags mentioned above. Use square brackets instead: ",(0,d.jsx)(s.code,{children:"[GOTY]"})]}),"\n",(0,d.jsxs)(s.li,{children:["Do not use reserved file names such as ",(0,d.jsx)(s.code,{children:"CON"}),", ",(0,d.jsx)(s.code,{children:"PRN"}),", ",(0,d.jsx)(s.code,{children:"AUX"}),", ",(0,d.jsx)(s.code,{children:"NUL"}),", ",(0,d.jsx)(s.code,{children:"COM(1-9)"}),", ",(0,d.jsx)(s.code,{children:"LPT(1-9)"}),", etc."]}),"\n",(0,d.jsxs)(s.li,{children:["Avoid using multiple chained extensions like ",(0,d.jsx)(s.code,{children:".tar.gz"})," or ",(0,d.jsx)(s.code,{children:".tar.bz2"}),". Instead, use only the last extension like ",(0,d.jsx)(s.code,{children:".gz"})," or ",(0,d.jsx)(s.code,{children:".bz2"}),"."]}),"\n"]})}),"\n",(0,d.jsx)(s.h3,{id:"other-examples",children:"Other Examples"}),"\n",(0,d.jsx)(s.p,{children:"Here are some other valid examples of game names that follow the naming convention:"}),"\n",(0,d.jsxs)(s.ul,{children:["\n",(0,d.jsx)(s.li,{children:(0,d.jsx)(s.code,{children:"Star Wars Jedi - Fallen Order(v1.0.10.0) (2019).zip"})}),"\n",(0,d.jsx)(s.li,{children:(0,d.jsx)(s.code,{children:"HITMAN 3 (v3.10.1) (2021).7z"})}),"\n",(0,d.jsx)(s.li,{children:(0,d.jsx)(s.code,{children:"The Wandering Village (v0.1.32) (EA) (2022).iso"})}),"\n",(0,d.jsx)(s.li,{children:(0,d.jsx)(s.code,{children:"Saints Row (W_S) (2022).zip"})}),"\n",(0,d.jsx)(s.li,{children:(0,d.jsx)(s.code,{children:"My personal IndieGame (v1.2.9) (NC) (2018).zip"})}),"\n",(0,d.jsx)(s.li,{children:(0,d.jsx)(s.code,{children:"Stray (2022).7z"})}),"\n",(0,d.jsx)(s.li,{children:(0,d.jsx)(s.code,{children:"Captain of Industry (v0.4.12b) (EA) (2022).gz"})}),"\n",(0,d.jsx)(s.li,{children:(0,d.jsx)(s.code,{children:"Minecraft (2011).exe"})}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,d.jsx)(s,{...e,children:(0,d.jsx)(a,{...e})}):a(e)}},8591:(e,s,n)=>{n.d(s,{R:()=>c,x:()=>t});var r=n(758);const d={},i=r.createContext(d);function c(e){const s=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function t(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:c(e.components),r.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/80292675.a6dcd36c.js b/assets/js/80292675.903bef60.js similarity index 99% rename from assets/js/80292675.a6dcd36c.js rename to assets/js/80292675.903bef60.js index c5a3371ec..d4ddcf3e9 100644 --- a/assets/js/80292675.a6dcd36c.js +++ b/assets/js/80292675.903bef60.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[3716],{3054:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>r,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"server-docs/setup/unraid","title":"Using UNRAID","description":"Unraid is a storage operating system that allows users to create a centralized and scalable network-attached storage (NAS) solution, utilizing a unique array of drives with different sizes and types while offering the flexibility to run virtual machines and Docker containers.","source":"@site/docs/server-docs/setup/unraid.md","sourceDirName":"server-docs/setup","slug":"/server-docs/setup/unraid","permalink":"/docs/server-docs/setup/unraid","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/setup/unraid.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"sidebarPosition":5,"frontMatter":{"title":"Using UNRAID","sidebar_position":5},"sidebar":"docs","previous":{"title":"Using TrueNAS Scale (since v24.10)","permalink":"/docs/server-docs/setup/truenas-scale"},"next":{"title":"Using Synology Container Manager","permalink":"/docs/server-docs/setup/synology-container-manager"}}');var i=n(6070),a=n(8591);const r={title:"Using UNRAID",sidebar_position:5},o=void 0,l={},d=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Step 1: Setting up the Database",id:"step-1-setting-up-the-database",level:2},{value:"Step 2: Install POSTGRES",id:"step-2-install-postgres",level:2},{value:"Step 3: Setting up your GameVault Backend server",id:"step-3-setting-up-your-gamevault-backend-server",level:2},{value:"Alternative Step 3: Running without a PostgreSQL Database",id:"alternative-step-3-running-without-a-postgresql-database",level:3},{value:"Step 4: Configure install",id:"step-4-configure-install",level:2},{value:"Conclusion",id:"conclusion",level:2},{value:"Additional Info",id:"additional-info",level:2},{value:"Stopping the Server",id:"stopping-the-server",level:3},{value:"Reading the Logs",id:"reading-the-logs",level:3}];function c(e){const t={a:"a",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:"Unraid is a storage operating system that allows users to create a centralized and scalable network-attached storage (NAS) solution, utilizing a unique array of drives with different sizes and types while offering the flexibility to run virtual machines and Docker containers."}),"\n",(0,i.jsx)(t.p,{children:"You can easily set up a GameVault Server by using one of our templates from the Unraid Community Applications Store."}),"\n",(0,i.jsx)(t.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"UNRAID Server Running"}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://forums.unraid.net/topic/38582-plug-in-community-applications",children:"Community Applications Plugin installed"})}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"step-1-setting-up-the-database",children:"Step 1: Setting up the Database"}),"\n",(0,i.jsxs)(t.p,{children:["Log into your Unraid dashboard and navigate to your apps section of the dashboard and search for the offical ",(0,i.jsx)(t.code,{children:"postgresql15"})," Community Application by ",(0,i.jsx)(t.code,{children:"postgres"})]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"Step 1",src:n(121).A+"",width:"1216",height:"721"})}),"\n",(0,i.jsx)(t.h2,{id:"step-2-install-postgres",children:"Step 2: Install POSTGRES"}),"\n",(0,i.jsx)(t.p,{children:"Using the default configuration making sure you add the following entries:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-yaml",children:"POSTGRES_USER: gamevault\nPOSTGRES_PASSWORD: RANDOMPASSWORD\nPOSTGRES_DB: gamevault\n"})}),"\n",(0,i.jsx)(t.p,{children:"Make sure you remember the password and port you set we will use this in step 3"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"Step 2",src:n(4978).A+"",width:"1531",height:"796"})}),"\n",(0,i.jsx)(t.h2,{id:"step-3-setting-up-your-gamevault-backend-server",children:"Step 3: Setting up your GameVault Backend server"}),"\n",(0,i.jsxs)(t.p,{children:["Search for ",(0,i.jsx)(t.code,{children:"gamevault-backend"})," on the Unraid app store making sure to click the one without the SQLITE in the title."]}),"\n",(0,i.jsx)(t.p,{children:"Click install"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"Step 3",src:n(3979).A+"",width:"1417",height:"758"})}),"\n",(0,i.jsx)(t.h3,{id:"alternative-step-3-running-without-a-postgresql-database",children:"Alternative Step 3: Running without a PostgreSQL Database"}),"\n",(0,i.jsxs)(t.p,{children:["We don't recommend it but you can run GameVault without a PostgreSQL Database too by instead using the ",(0,i.jsx)(t.code,{children:"GameVault-Backend-SQLITE"})," template by ",(0,i.jsx)(t.code,{children:"phalcode"})," in Step 2."]}),"\n",(0,i.jsx)(t.h2,{id:"step-4-configure-install",children:"Step 4: Configure install"}),"\n",(0,i.jsx)(t.p,{children:"Using the password and port fill out the information that is required and click apply at the bottom."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"Step 4",src:n(4036).A+"",width:"1920",height:"2011"})}),"\n",(0,i.jsxs)(t.p,{children:["Your GameVault should now be available at ",(0,i.jsx)(t.code,{children:"http://tower.local:8080/"})," or ",(0,i.jsx)(t.code,{children:"HOSTNAME:PORT"})," if you changed your hostname or port."]}),"\n",(0,i.jsx)(t.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,i.jsx)(t.p,{children:"You have now successfully set up your GameVault Server using UNRAID."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.a,{href:"/docs/server-docs/setup/#what-next",children:"Click here to continue."})}),"\n",(0,i.jsx)(t.h2,{id:"additional-info",children:"Additional Info"}),"\n",(0,i.jsx)(t.h3,{id:"stopping-the-server",children:"Stopping the Server"}),"\n",(0,i.jsx)(t.p,{children:'Navigate to "Docker" tab and left click the GameVault app icon you have created.'}),"\n",(0,i.jsx)(t.p,{children:'Click on "Stop".'}),"\n",(0,i.jsx)(t.h3,{id:"reading-the-logs",children:"Reading the Logs"}),"\n",(0,i.jsx)(t.p,{children:'Navigate to "Docker" tab and left click the GameVault app icon you have created.'}),"\n",(0,i.jsx)(t.p,{children:'Click on "Logs".'}),"\n",(0,i.jsx)(t.p,{children:"This should bring a pop-up window of the currently logs of the server."})]})}function u(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},121:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/unraid1-ecd3a145196f65e0e6cca91aa7d48c7a.png"},4978:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/unraid2-fc2ab34ce802e69e4299c978335688d4.png"},3979:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/unraid3-1d0d4deaa54688b0dccb2bbdf15ea71f.png"},4036:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/unraid4-320f323ddb9e5652a93b19f4d9058c52.png"},8591:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>o});var s=n(758);const i={},a=s.createContext(i);function r(e){const t=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),s.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[3716],{3054:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>r,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"server-docs/setup/unraid","title":"Using UNRAID","description":"Unraid is a storage operating system that allows users to create a centralized and scalable network-attached storage (NAS) solution, utilizing a unique array of drives with different sizes and types while offering the flexibility to run virtual machines and Docker containers.","source":"@site/docs/server-docs/setup/unraid.md","sourceDirName":"server-docs/setup","slug":"/server-docs/setup/unraid","permalink":"/docs/server-docs/setup/unraid","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/setup/unraid.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"sidebarPosition":5,"frontMatter":{"title":"Using UNRAID","sidebar_position":5},"sidebar":"docs","previous":{"title":"Using TrueNAS Scale (since v24.10)","permalink":"/docs/server-docs/setup/truenas-scale"},"next":{"title":"Using Synology Container Manager","permalink":"/docs/server-docs/setup/synology-container-manager"}}');var i=n(6070),a=n(8591);const r={title:"Using UNRAID",sidebar_position:5},o=void 0,l={},d=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Step 1: Setting up the Database",id:"step-1-setting-up-the-database",level:2},{value:"Step 2: Install POSTGRES",id:"step-2-install-postgres",level:2},{value:"Step 3: Setting up your GameVault Backend server",id:"step-3-setting-up-your-gamevault-backend-server",level:2},{value:"Alternative Step 3: Running without a PostgreSQL Database",id:"alternative-step-3-running-without-a-postgresql-database",level:3},{value:"Step 4: Configure install",id:"step-4-configure-install",level:2},{value:"Conclusion",id:"conclusion",level:2},{value:"Additional Info",id:"additional-info",level:2},{value:"Stopping the Server",id:"stopping-the-server",level:3},{value:"Reading the Logs",id:"reading-the-logs",level:3}];function c(e){const t={a:"a",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:"Unraid is a storage operating system that allows users to create a centralized and scalable network-attached storage (NAS) solution, utilizing a unique array of drives with different sizes and types while offering the flexibility to run virtual machines and Docker containers."}),"\n",(0,i.jsx)(t.p,{children:"You can easily set up a GameVault Server by using one of our templates from the Unraid Community Applications Store."}),"\n",(0,i.jsx)(t.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"UNRAID Server Running"}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://forums.unraid.net/topic/38582-plug-in-community-applications",children:"Community Applications Plugin installed"})}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"step-1-setting-up-the-database",children:"Step 1: Setting up the Database"}),"\n",(0,i.jsxs)(t.p,{children:["Log into your Unraid dashboard and navigate to your apps section of the dashboard and search for the offical ",(0,i.jsx)(t.code,{children:"postgresql15"})," Community Application by ",(0,i.jsx)(t.code,{children:"postgres"})]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"Step 1",src:n(121).A+"",width:"1216",height:"721"})}),"\n",(0,i.jsx)(t.h2,{id:"step-2-install-postgres",children:"Step 2: Install POSTGRES"}),"\n",(0,i.jsx)(t.p,{children:"Using the default configuration making sure you add the following entries:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-yaml",children:"POSTGRES_USER: gamevault\nPOSTGRES_PASSWORD: RANDOMPASSWORD\nPOSTGRES_DB: gamevault\n"})}),"\n",(0,i.jsx)(t.p,{children:"Make sure you remember the password and port you set we will use this in step 3"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"Step 2",src:n(4978).A+"",width:"1531",height:"796"})}),"\n",(0,i.jsx)(t.h2,{id:"step-3-setting-up-your-gamevault-backend-server",children:"Step 3: Setting up your GameVault Backend server"}),"\n",(0,i.jsxs)(t.p,{children:["Search for ",(0,i.jsx)(t.code,{children:"gamevault-backend"})," on the Unraid app store making sure to click the one without the SQLITE in the title."]}),"\n",(0,i.jsx)(t.p,{children:"Click install"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"Step 3",src:n(3979).A+"",width:"1417",height:"758"})}),"\n",(0,i.jsx)(t.h3,{id:"alternative-step-3-running-without-a-postgresql-database",children:"Alternative Step 3: Running without a PostgreSQL Database"}),"\n",(0,i.jsxs)(t.p,{children:["We don't recommend it but you can run GameVault without a PostgreSQL Database too by instead using the ",(0,i.jsx)(t.code,{children:"GameVault-Backend-SQLITE"})," template by ",(0,i.jsx)(t.code,{children:"phalcode"})," in Step 2."]}),"\n",(0,i.jsx)(t.h2,{id:"step-4-configure-install",children:"Step 4: Configure install"}),"\n",(0,i.jsx)(t.p,{children:"Using the password and port fill out the information that is required and click apply at the bottom."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"Step 4",src:n(4036).A+"",width:"1920",height:"2011"})}),"\n",(0,i.jsxs)(t.p,{children:["Your GameVault should now be available at ",(0,i.jsx)(t.code,{children:"http://tower.local:8080/"})," or ",(0,i.jsx)(t.code,{children:"HOSTNAME:PORT"})," if you changed your hostname or port."]}),"\n",(0,i.jsx)(t.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,i.jsx)(t.p,{children:"You have now successfully set up your GameVault Server using UNRAID."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.a,{href:"/docs/server-docs/setup/#what-next",children:"Click here to continue."})}),"\n",(0,i.jsx)(t.h2,{id:"additional-info",children:"Additional Info"}),"\n",(0,i.jsx)(t.h3,{id:"stopping-the-server",children:"Stopping the Server"}),"\n",(0,i.jsx)(t.p,{children:'Navigate to "Docker" tab and left click the GameVault app icon you have created.'}),"\n",(0,i.jsx)(t.p,{children:'Click on "Stop".'}),"\n",(0,i.jsx)(t.h3,{id:"reading-the-logs",children:"Reading the Logs"}),"\n",(0,i.jsx)(t.p,{children:'Navigate to "Docker" tab and left click the GameVault app icon you have created.'}),"\n",(0,i.jsx)(t.p,{children:'Click on "Logs".'}),"\n",(0,i.jsx)(t.p,{children:"This should bring a pop-up window of the currently logs of the server."})]})}function u(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},121:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/unraid1-ecd3a145196f65e0e6cca91aa7d48c7a.png"},4978:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/unraid2-fc2ab34ce802e69e4299c978335688d4.png"},3979:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/unraid3-1d0d4deaa54688b0dccb2bbdf15ea71f.png"},4036:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/unraid4-320f323ddb9e5652a93b19f4d9058c52.png"},8591:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>o});var s=n(758);const i={},a=s.createContext(i);function r(e){const t=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),s.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8ba18f4f.f89228c6.js b/assets/js/8ba18f4f.e02aff46.js similarity index 98% rename from assets/js/8ba18f4f.f89228c6.js rename to assets/js/8ba18f4f.e02aff46.js index 1ac5d7954..23adb72a0 100644 --- a/assets/js/8ba18f4f.f89228c6.js +++ b/assets/js/8ba18f4f.e02aff46.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[5735],{6479:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"server-docs/parental-control","title":"Parental Control","description":"GameVault supports a parental control feature that hides games and game progresses based on the games age rating for some users. By default, age restrictions are disabled.","source":"@site/docs/server-docs/parental-control.md","sourceDirName":"server-docs","slug":"/server-docs/parental-control","permalink":"/docs/server-docs/parental-control","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/parental-control.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"sidebarPosition":10,"frontMatter":{"sidebar_position":10},"sidebar":"docs","previous":{"title":"Plugins","permalink":"/docs/server-docs/plugins"},"next":{"title":"Server News","permalink":"/docs/server-docs/server-news"}}');var s=n(6070),a=n(8591);const i={sidebar_position:10},o="Parental Control",l={},d=[{value:"Enabling Parental Control",id:"enabling-parental-control",level:2},{value:"Changing the Age of Majority",id:"changing-the-age-of-majority",level:2},{value:"Overriding the Age Rating of a Game",id:"overriding-the-age-rating-of-a-game",level:2}];function c(e){const t={admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"parental-control",children:"Parental Control"})}),"\n",(0,s.jsxs)(t.p,{children:["GameVault supports a parental control feature that ",(0,s.jsx)(t.strong,{children:"hides"})," games and game progresses based on the games age rating for some users. ",(0,s.jsx)(t.strong,{children:"By default"}),", age restrictions are ",(0,s.jsx)(t.strong,{children:"disabled"}),"."]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"When enabled:"})}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Users will ",(0,s.jsx)(t.strong,{children:"not be able"})," to see ",(0,s.jsx)(t.strong,{children:"games"})," above their age rating."]}),"\n",(0,s.jsxs)(t.li,{children:["Users will ",(0,s.jsx)(t.strong,{children:"not be able"})," to see any ",(0,s.jsx)(t.strong,{children:"progresses"})," for games above their age rating."]}),"\n"]}),"\n",(0,s.jsx)(t.admonition,{title:"Things to keep in mind",type:"warning",children:(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["If you ",(0,s.jsx)(t.strong,{children:"enable"})," parental control, ",(0,s.jsx)(t.strong,{children:"do not forget"})," to set the ",(0,s.jsx)(t.strong,{children:"birth date"})," for ",(0,s.jsx)(t.strong,{children:"existing"})," users."]}),"\n",(0,s.jsxs)(t.li,{children:["Children ",(0,s.jsx)(t.strong,{children:"must not"})," be of ",(0,s.jsx)(t.strong,{children:"role"})," ",(0,s.jsx)(t.code,{children:"ADMIN"}),", because they would be able to alter their birth date."]}),"\n",(0,s.jsxs)(t.li,{children:["The age rating value for games is set by the ",(0,s.jsx)(t.strong,{children:"metadata providers you use"}),". It is in your responsibility to check how the providers determine the age rating."]}),"\n",(0,s.jsxs)(t.li,{children:["If you use multiple metadata providers, the provider with the ",(0,s.jsx)(t.strong,{children:"highest priority"})," will be used to determine the age rating. ",(0,s.jsx)(t.strong,{children:"User-set"})," age ratings will ",(0,s.jsx)(t.strong,{children:"always override"})," the metadata providers setting. You can check the actively applied minimum age on the game page in your client."]}),"\n"]})}),"\n",(0,s.jsx)(t.h2,{id:"enabling-parental-control",children:"Enabling Parental Control"}),"\n",(0,s.jsxs)(t.p,{children:["To enable parental control, set the ",(0,s.jsx)(t.code,{children:"PARENTAL_AGE_RESTRICTION_ENABLED"})," environment variable to ",(0,s.jsx)(t.code,{children:"true"}),". Then set the birth date for all existing users."]}),"\n",(0,s.jsxs)(t.p,{children:["Keep in mind that, when you set this variable to ",(0,s.jsx)(t.code,{children:"true"}),", new users will also be required to set their Birth date upon registration."]}),"\n",(0,s.jsx)(t.h2,{id:"changing-the-age-of-majority",children:"Changing the Age of Majority"}),"\n",(0,s.jsxs)(t.p,{children:["The age of majority determines the age at which an individual is legally recognized as an adult. Reaching the age of majority ",(0,s.jsx)(t.strong,{children:"enables users to alter their birth date"}),". Otherwise, users will not be able to set their own birth date and an admin will be required to set their birth date."]}),"\n",(0,s.jsxs)(t.p,{children:["You can configure the age of majority for parental control by setting the ",(0,s.jsx)(t.code,{children:"PARENTAL_AGE_OF_MAJORITY"})," environment variable. The default value is ",(0,s.jsx)(t.code,{children:"18"}),"."]}),"\n",(0,s.jsx)(t.h2,{id:"overriding-the-age-rating-of-a-game",children:"Overriding the Age Rating of a Game"}),"\n",(0,s.jsx)(t.p,{children:"Admins can override the age rating of a single game by simply editing the age rating field of a game directly."})]})}function h(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8591:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>o});var r=n(758);const s={},a=r.createContext(s);function i(e){const t=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[5735],{6479:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"server-docs/parental-control","title":"Parental Control","description":"GameVault supports a parental control feature that hides games and game progresses based on the games age rating for some users. By default, age restrictions are disabled.","source":"@site/docs/server-docs/parental-control.md","sourceDirName":"server-docs","slug":"/server-docs/parental-control","permalink":"/docs/server-docs/parental-control","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/parental-control.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"sidebarPosition":10,"frontMatter":{"sidebar_position":10},"sidebar":"docs","previous":{"title":"Plugins","permalink":"/docs/server-docs/plugins"},"next":{"title":"Server News","permalink":"/docs/server-docs/server-news"}}');var s=n(6070),a=n(8591);const i={sidebar_position:10},o="Parental Control",l={},d=[{value:"Enabling Parental Control",id:"enabling-parental-control",level:2},{value:"Changing the Age of Majority",id:"changing-the-age-of-majority",level:2},{value:"Overriding the Age Rating of a Game",id:"overriding-the-age-rating-of-a-game",level:2}];function c(e){const t={admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"parental-control",children:"Parental Control"})}),"\n",(0,s.jsxs)(t.p,{children:["GameVault supports a parental control feature that ",(0,s.jsx)(t.strong,{children:"hides"})," games and game progresses based on the games age rating for some users. ",(0,s.jsx)(t.strong,{children:"By default"}),", age restrictions are ",(0,s.jsx)(t.strong,{children:"disabled"}),"."]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"When enabled:"})}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Users will ",(0,s.jsx)(t.strong,{children:"not be able"})," to see ",(0,s.jsx)(t.strong,{children:"games"})," above their age rating."]}),"\n",(0,s.jsxs)(t.li,{children:["Users will ",(0,s.jsx)(t.strong,{children:"not be able"})," to see any ",(0,s.jsx)(t.strong,{children:"progresses"})," for games above their age rating."]}),"\n"]}),"\n",(0,s.jsx)(t.admonition,{title:"Things to keep in mind",type:"warning",children:(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["If you ",(0,s.jsx)(t.strong,{children:"enable"})," parental control, ",(0,s.jsx)(t.strong,{children:"do not forget"})," to set the ",(0,s.jsx)(t.strong,{children:"birth date"})," for ",(0,s.jsx)(t.strong,{children:"existing"})," users."]}),"\n",(0,s.jsxs)(t.li,{children:["Children ",(0,s.jsx)(t.strong,{children:"must not"})," be of ",(0,s.jsx)(t.strong,{children:"role"})," ",(0,s.jsx)(t.code,{children:"ADMIN"}),", because they would be able to alter their birth date."]}),"\n",(0,s.jsxs)(t.li,{children:["The age rating value for games is set by the ",(0,s.jsx)(t.strong,{children:"metadata providers you use"}),". It is in your responsibility to check how the providers determine the age rating."]}),"\n",(0,s.jsxs)(t.li,{children:["If you use multiple metadata providers, the provider with the ",(0,s.jsx)(t.strong,{children:"highest priority"})," will be used to determine the age rating. ",(0,s.jsx)(t.strong,{children:"User-set"})," age ratings will ",(0,s.jsx)(t.strong,{children:"always override"})," the metadata providers setting. You can check the actively applied minimum age on the game page in your client."]}),"\n"]})}),"\n",(0,s.jsx)(t.h2,{id:"enabling-parental-control",children:"Enabling Parental Control"}),"\n",(0,s.jsxs)(t.p,{children:["To enable parental control, set the ",(0,s.jsx)(t.code,{children:"PARENTAL_AGE_RESTRICTION_ENABLED"})," environment variable to ",(0,s.jsx)(t.code,{children:"true"}),". Then set the birth date for all existing users."]}),"\n",(0,s.jsxs)(t.p,{children:["Keep in mind that, when you set this variable to ",(0,s.jsx)(t.code,{children:"true"}),", new users will also be required to set their Birth date upon registration."]}),"\n",(0,s.jsx)(t.h2,{id:"changing-the-age-of-majority",children:"Changing the Age of Majority"}),"\n",(0,s.jsxs)(t.p,{children:["The age of majority determines the age at which an individual is legally recognized as an adult. Reaching the age of majority ",(0,s.jsx)(t.strong,{children:"enables users to alter their birth date"}),". Otherwise, users will not be able to set their own birth date and an admin will be required to set their birth date."]}),"\n",(0,s.jsxs)(t.p,{children:["You can configure the age of majority for parental control by setting the ",(0,s.jsx)(t.code,{children:"PARENTAL_AGE_OF_MAJORITY"})," environment variable. The default value is ",(0,s.jsx)(t.code,{children:"18"}),"."]}),"\n",(0,s.jsx)(t.h2,{id:"overriding-the-age-rating-of-a-game",children:"Overriding the Age Rating of a Game"}),"\n",(0,s.jsx)(t.p,{children:"Admins can override the age rating of a single game by simply editing the age rating field of a game directly."})]})}function h(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8591:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>o});var r=n(758);const s={},a=r.createContext(s);function i(e){const t=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8c4108df.5763eb28.js b/assets/js/8c4108df.0207cf08.js similarity index 99% rename from assets/js/8c4108df.5763eb28.js rename to assets/js/8c4108df.0207cf08.js index dff190602..92451f67d 100644 --- a/assets/js/8c4108df.5763eb28.js +++ b/assets/js/8c4108df.0207cf08.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[179],{7667:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>i,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"server-docs/setup/docker-compose","title":"Using Docker Compose","description":"Docker is a platform for developing, shipping, and running applications in containers, and Docker Compose is a tool for defining and managing multi-container Docker applications.","source":"@site/docs/server-docs/setup/docker-compose.md","sourceDirName":"server-docs/setup","slug":"/server-docs/setup/docker-compose","permalink":"/docs/server-docs/setup/docker-compose","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/setup/docker-compose.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"sidebarPosition":2,"frontMatter":{"title":"Using Docker Compose","sidebar_position":2},"sidebar":"docs","previous":{"title":"Setting up a GameVault Server","permalink":"/docs/server-docs/setup/"},"next":{"title":"Using CapRover","permalink":"/docs/server-docs/setup/caprover"}}');var t=o(6070),r=o(8591);const i={title:"Using Docker Compose",sidebar_position:2},a=void 0,l={},d=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Step 1: Creating a Docker Compose file",id:"step-1-creating-a-docker-compose-file",level:2},{value:"Tips for Running Docker on Windows",id:"tips-for-running-docker-on-windows",level:3},{value:"Alternative Step 1: Running without a PostgreSQL Database",id:"alternative-step-1-running-without-a-postgresql-database",level:3},{value:"Step 2: Start the Service",id:"step-2-start-the-service",level:2},{value:"Conclusion",id:"conclusion",level:2},{value:"Additional Info",id:"additional-info",level:2},{value:"Stopping the server",id:"stopping-the-server",level:3},{value:"Reading the logs",id:"reading-the-logs",level:3}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://www.docker.com",children:"Docker"})," is a platform for developing, shipping, and running applications in containers, and ",(0,t.jsx)(n.a,{href:"https://docs.docker.com/compose",children:"Docker Compose"})," is a tool for defining and managing multi-container Docker applications."]}),"\n",(0,t.jsx)(n.p,{children:"In this guide, you will learn how to set up GameVault using Docker and Docker Compose."}),"\n",(0,t.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"https://docs.docker.com/engine/install/",children:"Docker Engine"})," is installed on your system. (",(0,t.jsx)(n.a,{href:"https://docs.docker.com/get-docker/",children:"Docker Desktop"})," should work too, but this guide is tailored for Docker Engine. Steps might look different on Desktop, but the gist is the same.)"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"step-1-creating-a-docker-compose-file",children:"Step 1: Creating a Docker Compose file"}),"\n",(0,t.jsxs)(n.p,{children:["Create a new file named ",(0,t.jsx)(n.code,{children:"docker-compose.yml"})," in a directory of your choice and copy the following code:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"services:\n gamevault-backend:\n image: phalcode/gamevault-backend:latest\n restart: unless-stopped\n environment:\n DB_HOST: db\n DB_USERNAME: gamevault\n DB_PASSWORD: YOURPASSWORDHERE\n volumes:\n # Mount the folder where your games are\n - /your/games/folder:/files\n # Mount the folder where GameVault should store its media\n - /your/media/folder:/media\n ports:\n - 8080:8080/tcp\n db:\n image: postgres:16\n restart: unless-stopped\n environment:\n POSTGRES_USER: gamevault\n POSTGRES_PASSWORD: YOURPASSWORDHERE\n POSTGRES_DB: gamevault\n volumes:\n # Mount the folder where your PostgreSQL database files should land\n - /your/database/folder:/var/lib/postgresql/data\n"})}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:["Replace the variables (",(0,t.jsx)(n.code,{children:"YOURPASSWORDHERE"}),", ",(0,t.jsx)(n.code,{children:"etc."}),"), as well as the folder paths with what suits you, of course. You can change the port on the left side of the colon aswell."]})}),"\n",(0,t.jsx)(n.admonition,{type:"warning",children:(0,t.jsx)(n.p,{children:"Password (YOURPASSWORDHERE) can't be empty! else the database will not work. If you don't want a password, consider running without a PostgreSQL Database (Not recommended)"})}),"\n",(0,t.jsx)(n.h3,{id:"tips-for-running-docker-on-windows",children:"Tips for Running Docker on Windows"}),"\n",(0,t.jsxs)(n.p,{children:["The above ",(0,t.jsx)(n.code,{children:"docker-compose.yaml"})," file might not work as expected with Docker for Windows. Here are some things to consider to make it compatible:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Use Forward Slashes in Paths"}),": In your volumes, replace Windows-style backslashes (",(0,t.jsx)(n.code,{children:"\\"}),") with forward slashes (",(0,t.jsx)(n.code,{children:"/"}),")."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"volumes:\n # Path to your games folder\n - C:/Your/Games/Folder:/files\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"PostgreSQL Database Volume"}),": For PostgreSQL, it\u2019s often better to use a Docker volume instead of mounting a folder, due to compatibility issues of PostgreSQL with Windows Filesystems. To do this, leave out any volume definition in the database section of your YAML file. ",(0,t.jsx)(n.a,{href:"https://github.com/docker-library/postgres/issues/116",children:"Read more here"}),"."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"alternative-step-1-running-without-a-postgresql-database",children:"Alternative Step 1: Running without a PostgreSQL Database"}),"\n",(0,t.jsx)(n.p,{children:"We don't recommend it, but you can run GameVault without a PostgreSQL Database too using the following configuration:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'services:\n gamevault-backend:\n image: phalcode/gamevault-backend:latest\n restart: unless-stopped\n environment:\n DB_SYSTEM: "SQLITE"\n volumes:\n - /your/games/folder:/files\n - /your/media/folder:/media\n - /your/sqlite/database/folder:/db\n ports:\n - 8080:8080/tcp\n'})}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:["Replace the variables (",(0,t.jsx)(n.code,{children:"YOURPASSWORDHERE"}),", ",(0,t.jsx)(n.code,{children:"etc."}),"), as well as the folder paths with what suits you, of course. You can change the port on the left side of the colon aswell."]})}),"\n",(0,t.jsx)(n.h2,{id:"step-2-start-the-service",children:"Step 2: Start the Service"}),"\n",(0,t.jsxs)(n.p,{children:["Open a terminal, navigate to the directory where the ",(0,t.jsx)(n.code,{children:"docker-compose.yml"})," file is located, and run the following command:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker compose up -d\n"})}),"\n",(0,t.jsxs)(n.p,{children:["This will start the GameVault server and PostgreSQL server in the background. The ",(0,t.jsx)(n.code,{children:"-d"})," parameter detaches the process from the terminal."]}),"\n",(0,t.jsx)(n.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,t.jsxs)(n.p,{children:["Congratulations! Your GameVault Server has been successfully set up using Docker and Docker Compose. You can now access it using your server's IP address followed by the designated port, such as ",(0,t.jsx)(n.code,{children:"http://192.168.0.15:8080"})," for example."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.a,{href:"/docs/server-docs/setup/#what-next",children:"Click here to continue."})}),"\n",(0,t.jsx)(n.h2,{id:"additional-info",children:"Additional Info"}),"\n",(0,t.jsx)(n.h3,{id:"stopping-the-server",children:"Stopping the server"}),"\n",(0,t.jsxs)(n.p,{children:["Open a terminal, navigate to the directory where the ",(0,t.jsx)(n.code,{children:"docker-compose.yml"})," file is located, and run the following command:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker compose down\n"})}),"\n",(0,t.jsx)(n.h3,{id:"reading-the-logs",children:"Reading the logs"}),"\n",(0,t.jsx)(n.p,{children:"Open a terminal and run the following command:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker logs gamevault-backend\n"})})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},8591:(e,n,o)=>{o.d(n,{R:()=>i,x:()=>a});var s=o(758);const t={},r=s.createContext(t);function i(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[179],{7667:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>i,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"server-docs/setup/docker-compose","title":"Using Docker Compose","description":"Docker is a platform for developing, shipping, and running applications in containers, and Docker Compose is a tool for defining and managing multi-container Docker applications.","source":"@site/docs/server-docs/setup/docker-compose.md","sourceDirName":"server-docs/setup","slug":"/server-docs/setup/docker-compose","permalink":"/docs/server-docs/setup/docker-compose","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/setup/docker-compose.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"sidebarPosition":2,"frontMatter":{"title":"Using Docker Compose","sidebar_position":2},"sidebar":"docs","previous":{"title":"Setting up a GameVault Server","permalink":"/docs/server-docs/setup/"},"next":{"title":"Using CapRover","permalink":"/docs/server-docs/setup/caprover"}}');var t=o(6070),r=o(8591);const i={title:"Using Docker Compose",sidebar_position:2},a=void 0,l={},d=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Step 1: Creating a Docker Compose file",id:"step-1-creating-a-docker-compose-file",level:2},{value:"Tips for Running Docker on Windows",id:"tips-for-running-docker-on-windows",level:3},{value:"Alternative Step 1: Running without a PostgreSQL Database",id:"alternative-step-1-running-without-a-postgresql-database",level:3},{value:"Step 2: Start the Service",id:"step-2-start-the-service",level:2},{value:"Conclusion",id:"conclusion",level:2},{value:"Additional Info",id:"additional-info",level:2},{value:"Stopping the server",id:"stopping-the-server",level:3},{value:"Reading the logs",id:"reading-the-logs",level:3}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://www.docker.com",children:"Docker"})," is a platform for developing, shipping, and running applications in containers, and ",(0,t.jsx)(n.a,{href:"https://docs.docker.com/compose",children:"Docker Compose"})," is a tool for defining and managing multi-container Docker applications."]}),"\n",(0,t.jsx)(n.p,{children:"In this guide, you will learn how to set up GameVault using Docker and Docker Compose."}),"\n",(0,t.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"https://docs.docker.com/engine/install/",children:"Docker Engine"})," is installed on your system. (",(0,t.jsx)(n.a,{href:"https://docs.docker.com/get-docker/",children:"Docker Desktop"})," should work too, but this guide is tailored for Docker Engine. Steps might look different on Desktop, but the gist is the same.)"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"step-1-creating-a-docker-compose-file",children:"Step 1: Creating a Docker Compose file"}),"\n",(0,t.jsxs)(n.p,{children:["Create a new file named ",(0,t.jsx)(n.code,{children:"docker-compose.yml"})," in a directory of your choice and copy the following code:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"services:\n gamevault-backend:\n image: phalcode/gamevault-backend:latest\n restart: unless-stopped\n environment:\n DB_HOST: db\n DB_USERNAME: gamevault\n DB_PASSWORD: YOURPASSWORDHERE\n volumes:\n # Mount the folder where your games are\n - /your/games/folder:/files\n # Mount the folder where GameVault should store its media\n - /your/media/folder:/media\n ports:\n - 8080:8080/tcp\n db:\n image: postgres:16\n restart: unless-stopped\n environment:\n POSTGRES_USER: gamevault\n POSTGRES_PASSWORD: YOURPASSWORDHERE\n POSTGRES_DB: gamevault\n volumes:\n # Mount the folder where your PostgreSQL database files should land\n - /your/database/folder:/var/lib/postgresql/data\n"})}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:["Replace the variables (",(0,t.jsx)(n.code,{children:"YOURPASSWORDHERE"}),", ",(0,t.jsx)(n.code,{children:"etc."}),"), as well as the folder paths with what suits you, of course. You can change the port on the left side of the colon aswell."]})}),"\n",(0,t.jsx)(n.admonition,{type:"warning",children:(0,t.jsx)(n.p,{children:"Password (YOURPASSWORDHERE) can't be empty! else the database will not work. If you don't want a password, consider running without a PostgreSQL Database (Not recommended)"})}),"\n",(0,t.jsx)(n.h3,{id:"tips-for-running-docker-on-windows",children:"Tips for Running Docker on Windows"}),"\n",(0,t.jsxs)(n.p,{children:["The above ",(0,t.jsx)(n.code,{children:"docker-compose.yaml"})," file might not work as expected with Docker for Windows. Here are some things to consider to make it compatible:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Use Forward Slashes in Paths"}),": In your volumes, replace Windows-style backslashes (",(0,t.jsx)(n.code,{children:"\\"}),") with forward slashes (",(0,t.jsx)(n.code,{children:"/"}),")."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"volumes:\n # Path to your games folder\n - C:/Your/Games/Folder:/files\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"PostgreSQL Database Volume"}),": For PostgreSQL, it\u2019s often better to use a Docker volume instead of mounting a folder, due to compatibility issues of PostgreSQL with Windows Filesystems. To do this, leave out any volume definition in the database section of your YAML file. ",(0,t.jsx)(n.a,{href:"https://github.com/docker-library/postgres/issues/116",children:"Read more here"}),"."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"alternative-step-1-running-without-a-postgresql-database",children:"Alternative Step 1: Running without a PostgreSQL Database"}),"\n",(0,t.jsx)(n.p,{children:"We don't recommend it, but you can run GameVault without a PostgreSQL Database too using the following configuration:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'services:\n gamevault-backend:\n image: phalcode/gamevault-backend:latest\n restart: unless-stopped\n environment:\n DB_SYSTEM: "SQLITE"\n volumes:\n - /your/games/folder:/files\n - /your/media/folder:/media\n - /your/sqlite/database/folder:/db\n ports:\n - 8080:8080/tcp\n'})}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:["Replace the variables (",(0,t.jsx)(n.code,{children:"YOURPASSWORDHERE"}),", ",(0,t.jsx)(n.code,{children:"etc."}),"), as well as the folder paths with what suits you, of course. You can change the port on the left side of the colon aswell."]})}),"\n",(0,t.jsx)(n.h2,{id:"step-2-start-the-service",children:"Step 2: Start the Service"}),"\n",(0,t.jsxs)(n.p,{children:["Open a terminal, navigate to the directory where the ",(0,t.jsx)(n.code,{children:"docker-compose.yml"})," file is located, and run the following command:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker compose up -d\n"})}),"\n",(0,t.jsxs)(n.p,{children:["This will start the GameVault server and PostgreSQL server in the background. The ",(0,t.jsx)(n.code,{children:"-d"})," parameter detaches the process from the terminal."]}),"\n",(0,t.jsx)(n.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,t.jsxs)(n.p,{children:["Congratulations! Your GameVault Server has been successfully set up using Docker and Docker Compose. You can now access it using your server's IP address followed by the designated port, such as ",(0,t.jsx)(n.code,{children:"http://192.168.0.15:8080"})," for example."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.a,{href:"/docs/server-docs/setup/#what-next",children:"Click here to continue."})}),"\n",(0,t.jsx)(n.h2,{id:"additional-info",children:"Additional Info"}),"\n",(0,t.jsx)(n.h3,{id:"stopping-the-server",children:"Stopping the server"}),"\n",(0,t.jsxs)(n.p,{children:["Open a terminal, navigate to the directory where the ",(0,t.jsx)(n.code,{children:"docker-compose.yml"})," file is located, and run the following command:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker compose down\n"})}),"\n",(0,t.jsx)(n.h3,{id:"reading-the-logs",children:"Reading the logs"}),"\n",(0,t.jsx)(n.p,{children:"Open a terminal and run the following command:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker logs gamevault-backend\n"})})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},8591:(e,n,o)=>{o.d(n,{R:()=>i,x:()=>a});var s=o(758);const t={},r=s.createContext(t);function i(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9404f843.7bc1aa29.js b/assets/js/9404f843.b6a03b78.js similarity index 99% rename from assets/js/9404f843.7bc1aa29.js rename to assets/js/9404f843.b6a03b78.js index 51afb5d77..a38c3a119 100644 --- a/assets/js/9404f843.7bc1aa29.js +++ b/assets/js/9404f843.b6a03b78.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[5849],{5367:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>c});const a=JSON.parse('{"id":"gamevault-plus/client-apis","title":"Client APIs","description":"The GameVault Client APIs offer interfaces for external use of the GameVault client application for subscribers of GameVault+. Whether you\'re interacting via the command line, URI, or NamedPipe, you have access to various functionalities provided by the GameVault Client Application. This can be useful for third-party developers who want to integrate with the GameVault ecosystem. (e.g. Playnite Extension)","source":"@site/docs/gamevault-plus/client-apis.md","sourceDirName":"gamevault-plus","slug":"/gamevault-plus/client-apis","permalink":"/docs/gamevault-plus/client-apis","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/gamevault-plus/client-apis.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"sidebarPosition":4,"frontMatter":{"sidebar_position":4,"title":"Client APIs"},"sidebar":"docs","previous":{"title":"Themes","permalink":"/docs/gamevault-plus/themes"},"next":{"title":"Discord","permalink":"/docs/gamevault-plus/integrations/discord"}}');var t=i(6070),l=i(8591);const s={sidebar_position:4,title:"Client APIs"},r=void 0,d={},c=[{value:"Available APIs",id:"available-apis",level:2},{value:"CLI",id:"cli",level:3},{value:"URI",id:"uri",level:3},{value:"NamedPipe",id:"namedpipe",level:3},{value:"Usage",id:"usage",level:2},{value:"Available Actions & Parameters",id:"available-actions--parameters",level:2},{value:"URI "Query" Action",id:"uri-query-action",level:2},{value:"Command-line Examples",id:"command-line-examples",level:2},{value:"URI Examples",id:"uri-examples",level:2},{value:"Query Examples",id:"query-examples",level:2},{value:"C# Code Example",id:"c-code-example",level:2}];function o(e){const n={code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,l.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"The GameVault Client APIs offer interfaces for external use of the GameVault client application for subscribers of GameVault+. Whether you're interacting via the command line, URI, or NamedPipe, you have access to various functionalities provided by the GameVault Client Application. This can be useful for third-party developers who want to integrate with the GameVault ecosystem. (e.g. Playnite Extension)"}),"\n",(0,t.jsx)(n.p,{children:"This guide provides comprehensive information on utilizing various interfaces offered by the GameVault client application for third-party developers. Whether you're building extensions or integrating with the GameVault ecosystem, this documentation will guide you through the available APIs and their specifications."}),"\n",(0,t.jsx)(n.h2,{id:"available-apis",children:"Available APIs"}),"\n",(0,t.jsx)(n.h3,{id:"cli",children:"CLI"}),"\n",(0,t.jsx)(n.p,{children:"The Command Line Interface (CLI) provides a straightforward way to interact with the GameVault client application directly from the command line. It supports various actions and parameters for seamless integration into your workflows."}),"\n",(0,t.jsx)(n.h3,{id:"uri",children:"URI"}),"\n",(0,t.jsx)(n.p,{children:"The Uniform Resource Identifier (URI) handler allows for communication with the GameVault client application through custom URI schemes. By leveraging URI endpoints, you can trigger actions and pass parameters conveniently."}),"\n",(0,t.jsx)(n.h3,{id:"namedpipe",children:"NamedPipe"}),"\n",(0,t.jsx)(n.p,{children:"The NamedPipe interface facilitates communication between processes on the same machine. Through NamedPipe, you can send messages to and receive responses from the GameVault client application, enabling real-time interaction."}),"\n",(0,t.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,t.jsx)(n.p,{children:"The following sections detail how to use each API provided by the GameVault client application."}),"\n",(0,t.jsx)(n.h2,{id:"available-actions--parameters",children:"Available Actions & Parameters"}),"\n",(0,t.jsx)(n.p,{children:"Explore the list of actions and parameters supported by the GameVault client APIs. (Bold parameters are required, Asterisks indicate default values )"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:""})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Supported for direct command-line usage only."}),"\n",(0,t.jsxs)(n.li,{children:["Alias for ",(0,t.jsx)(n.code,{children:"show"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"show"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Starts and if the main application or a specific game."}),"\n",(0,t.jsxs)(n.li,{children:["Parameters:","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"gameid=[id]"}),": Target a specific game to show."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"minimized=[true/false*]"}),": Run the application minimized to the tray."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"install"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Starts the download of a specific game defined by ",(0,t.jsx)(n.code,{children:"gameid"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["Additional parameters:","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsxs)(n.strong,{children:[(0,t.jsx)(n.code,{children:"gameid=[id]"}),": Target a specific game to install."]})}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"minimized=[true/false*]"}),": Run the application minimized to the tray."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"uninstall"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Uninstalls a specific game defined by ",(0,t.jsx)(n.code,{children:"gameid"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["Additional parameters:","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsxs)(n.strong,{children:[(0,t.jsx)(n.code,{children:"gameid=[id]"}),": Target a specific game to uninstall."]})}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"minimized=[true/false*]"}),": Run the application minimized to the tray."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"start"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Starts a specific game defined by ",(0,t.jsx)(n.code,{children:"gameid"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["Additional parameters:","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsxs)(n.strong,{children:[(0,t.jsx)(n.code,{children:"gameid=[id]"}),": Target a specific game to start."]})}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"minimized=[true/false*]"}),": Run the application minimized to the tray."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"autoinstall=[true/false*]"}),": Whether to automatically install the game if not already installed."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"help "})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Displays help for the command line interface or a specific action."}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"version"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Displays the version of the GameVault client application."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"uri-query-action",children:'URI "Query" Action'}),"\n",(0,t.jsx)(n.p,{children:'The URI "query" action allows you to retrieve information from the client-side app. It is not a replacement for server-side backend interaction but serves as a means to obtain simple information.'}),"\n",(0,t.jsxs)(n.p,{children:["When sending a request via URI, an additional action called ",(0,t.jsx)(n.code,{children:"query"})," is available, which lets you get information from the client-side app. This is ",(0,t.jsx)(n.strong,{children:"not"})," a replacement for the server-side backend and is just a way to get simple information. The specific value to query is provided in the ",(0,t.jsx)(n.code,{children:"query"})," parameter, with the following options available:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"exists"}),": Check if the provided ",(0,t.jsx)(n.code,{children:"gameid"}),"-parameter exists locally or on the configured server (True/False)."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"installed"}),": Check if the provided ",(0,t.jsx)(n.code,{children:"gameid"}),"-parameter is installed (True/False)."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"downloaded"}),": Check if the provided ",(0,t.jsx)(n.code,{children:"gameid"}),"-parameter is downloaded (True/False)."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"getname"}),": Get the name of the game defined by ",(0,t.jsx)(n.code,{children:"gameid"}),"-parameter."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"getinstalldirectory"}),": Get the install directory of the game defined by ",(0,t.jsx)(n.code,{children:"gameid"}),"-parameter."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"getappversion"}),": Get the version of the application."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"getserverurl"}),": Get the URL that we're currently configured to point to."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"isloggedin"}),": Returns if the user is currently logged in (True/False)."]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"command-line-examples",children:"Command-line Examples"}),"\n",(0,t.jsx)(n.p,{children:"Explore examples of using the GameVault client APIs via the command line:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-ps1",children:"# Launch GameVault\ngamevault.exe\n\n# Open GameVault in the background\ngamevault.exe --minimized=true\n\n# Show a specific game (ID 3)\ngamevault.exe show --gameid=3\n\n# Install a game (ID 3)\ngamevault.exe install --gameid=3\n\n# Uninstall a game (ID 3)\ngamevault.exe uninstall --gameid=3\n\n# Start a game (ID 3)\ngamevault.exe start --gameid=3\n\n# Start a game (ID 3) and bring GameVault into view\ngamevault.exe start --gameid=3 --minimized=false\n\n# Same as above without '='\ngamevault.exe start --gameid 3 --minimized false\n\n# Display help screen\ngamevault.exe help\n\n# Display help for 'start'\ngamevault.exe help start\n"})}),"\n",(0,t.jsx)(n.h2,{id:"uri-examples",children:"URI Examples"}),"\n",(0,t.jsx)(n.p,{children:"Discover examples of using the GameVault client APIs via URI:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-uri",children:"gamevault://show\ngamevault://show?minimized=true\ngamevault://install?gameid=3\ngamevault://uninstall?gameid=3\ngamevault://start?gameid=3\ngamevault://start?gameid=3&minimized=false\n"})}),"\n",(0,t.jsx)(n.h2,{id:"query-examples",children:"Query Examples"}),"\n",(0,t.jsx)(n.p,{children:"Explore examples of querying the GameVault client application through URI:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-uri",children:"gamevault://query?query=exists&gameid=3\ngamevault://query?query=installed&gameid=3\ngamevault://query?query=downloaded&gameid=3\ngamevault://query?query=getname&gameid=3\ngamevault://query?query=getinstalldirectory&gameid=3\ngamevault://query?query=getappversion\ngamevault://query?query=getserverurl\ngamevault://query?query=isloggedin\n"})}),"\n",(0,t.jsx)(n.h2,{id:"c-code-example",children:"C# Code Example"}),"\n",(0,t.jsx)(n.p,{children:"For developers working with C#, here's an example of interacting with the GameVault app through the NamedPipe:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-csharp",children:'using System;\nusing System.IO;\nusing System.IO.Pipes;\nusing System.Text;\nusing System.Threading;\nusing System.Threading.Tasks;\n\npublic static class GameVaultInteraction\n{\n public static async Task SendPipeMessage(string message, CancellationToken cancellationToken, bool expectsResult = false, int timeout = 500)\n {\n string result = null;\n using var client = new NamedPipeClientStream("GameVault");\n StreamWriter writer = null;\n StreamReader reader = null;\n\n try\n {\n await client.ConnectAsync(timeout, cancellationToken);\n\n writer = new StreamWriter(client, Encoding.UTF8, 1024, leaveOpen: true) { AutoFlush = true };\n await writer.WriteLineAsync(message);\n\n if (expectsResult)\n {\n reader = new StreamReader(client, Encoding.UTF8, false, 1024, leaveOpen: true);\n result = await reader.ReadLineAsync();\n }\n }\n finally\n {\n SafeDispose(writer);\n SafeDispose(reader);\n SafeDispose(client);\n }\n\n return result;\n }\n\n private static void SafeDispose(IDisposable disposable)\n {\n if (disposable == null)\n return;\n\n try\n {\n disposable.Dispose();\n }\n catch (Exception) { }\n }\n}\n'})})]})}function h(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(o,{...e})}):o(e)}},8591:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>r});var a=i(758);const t={},l=a.createContext(t);function s(e){const n=a.useContext(l);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),a.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[5849],{5367:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>c});const a=JSON.parse('{"id":"gamevault-plus/client-apis","title":"Client APIs","description":"The GameVault Client APIs offer interfaces for external use of the GameVault client application for subscribers of GameVault+. Whether you\'re interacting via the command line, URI, or NamedPipe, you have access to various functionalities provided by the GameVault Client Application. This can be useful for third-party developers who want to integrate with the GameVault ecosystem. (e.g. Playnite Extension)","source":"@site/docs/gamevault-plus/client-apis.md","sourceDirName":"gamevault-plus","slug":"/gamevault-plus/client-apis","permalink":"/docs/gamevault-plus/client-apis","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/gamevault-plus/client-apis.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"sidebarPosition":4,"frontMatter":{"sidebar_position":4,"title":"Client APIs"},"sidebar":"docs","previous":{"title":"Themes","permalink":"/docs/gamevault-plus/themes"},"next":{"title":"Discord","permalink":"/docs/gamevault-plus/integrations/discord"}}');var t=i(6070),l=i(8591);const s={sidebar_position:4,title:"Client APIs"},r=void 0,d={},c=[{value:"Available APIs",id:"available-apis",level:2},{value:"CLI",id:"cli",level:3},{value:"URI",id:"uri",level:3},{value:"NamedPipe",id:"namedpipe",level:3},{value:"Usage",id:"usage",level:2},{value:"Available Actions & Parameters",id:"available-actions--parameters",level:2},{value:"URI "Query" Action",id:"uri-query-action",level:2},{value:"Command-line Examples",id:"command-line-examples",level:2},{value:"URI Examples",id:"uri-examples",level:2},{value:"Query Examples",id:"query-examples",level:2},{value:"C# Code Example",id:"c-code-example",level:2}];function o(e){const n={code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,l.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"The GameVault Client APIs offer interfaces for external use of the GameVault client application for subscribers of GameVault+. Whether you're interacting via the command line, URI, or NamedPipe, you have access to various functionalities provided by the GameVault Client Application. This can be useful for third-party developers who want to integrate with the GameVault ecosystem. (e.g. Playnite Extension)"}),"\n",(0,t.jsx)(n.p,{children:"This guide provides comprehensive information on utilizing various interfaces offered by the GameVault client application for third-party developers. Whether you're building extensions or integrating with the GameVault ecosystem, this documentation will guide you through the available APIs and their specifications."}),"\n",(0,t.jsx)(n.h2,{id:"available-apis",children:"Available APIs"}),"\n",(0,t.jsx)(n.h3,{id:"cli",children:"CLI"}),"\n",(0,t.jsx)(n.p,{children:"The Command Line Interface (CLI) provides a straightforward way to interact with the GameVault client application directly from the command line. It supports various actions and parameters for seamless integration into your workflows."}),"\n",(0,t.jsx)(n.h3,{id:"uri",children:"URI"}),"\n",(0,t.jsx)(n.p,{children:"The Uniform Resource Identifier (URI) handler allows for communication with the GameVault client application through custom URI schemes. By leveraging URI endpoints, you can trigger actions and pass parameters conveniently."}),"\n",(0,t.jsx)(n.h3,{id:"namedpipe",children:"NamedPipe"}),"\n",(0,t.jsx)(n.p,{children:"The NamedPipe interface facilitates communication between processes on the same machine. Through NamedPipe, you can send messages to and receive responses from the GameVault client application, enabling real-time interaction."}),"\n",(0,t.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,t.jsx)(n.p,{children:"The following sections detail how to use each API provided by the GameVault client application."}),"\n",(0,t.jsx)(n.h2,{id:"available-actions--parameters",children:"Available Actions & Parameters"}),"\n",(0,t.jsx)(n.p,{children:"Explore the list of actions and parameters supported by the GameVault client APIs. (Bold parameters are required, Asterisks indicate default values )"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:""})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Supported for direct command-line usage only."}),"\n",(0,t.jsxs)(n.li,{children:["Alias for ",(0,t.jsx)(n.code,{children:"show"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"show"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Starts and if the main application or a specific game."}),"\n",(0,t.jsxs)(n.li,{children:["Parameters:","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"gameid=[id]"}),": Target a specific game to show."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"minimized=[true/false*]"}),": Run the application minimized to the tray."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"install"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Starts the download of a specific game defined by ",(0,t.jsx)(n.code,{children:"gameid"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["Additional parameters:","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsxs)(n.strong,{children:[(0,t.jsx)(n.code,{children:"gameid=[id]"}),": Target a specific game to install."]})}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"minimized=[true/false*]"}),": Run the application minimized to the tray."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"uninstall"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Uninstalls a specific game defined by ",(0,t.jsx)(n.code,{children:"gameid"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["Additional parameters:","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsxs)(n.strong,{children:[(0,t.jsx)(n.code,{children:"gameid=[id]"}),": Target a specific game to uninstall."]})}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"minimized=[true/false*]"}),": Run the application minimized to the tray."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"start"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Starts a specific game defined by ",(0,t.jsx)(n.code,{children:"gameid"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["Additional parameters:","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsxs)(n.strong,{children:[(0,t.jsx)(n.code,{children:"gameid=[id]"}),": Target a specific game to start."]})}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"minimized=[true/false*]"}),": Run the application minimized to the tray."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"autoinstall=[true/false*]"}),": Whether to automatically install the game if not already installed."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"help "})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Displays help for the command line interface or a specific action."}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"version"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Displays the version of the GameVault client application."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"uri-query-action",children:'URI "Query" Action'}),"\n",(0,t.jsx)(n.p,{children:'The URI "query" action allows you to retrieve information from the client-side app. It is not a replacement for server-side backend interaction but serves as a means to obtain simple information.'}),"\n",(0,t.jsxs)(n.p,{children:["When sending a request via URI, an additional action called ",(0,t.jsx)(n.code,{children:"query"})," is available, which lets you get information from the client-side app. This is ",(0,t.jsx)(n.strong,{children:"not"})," a replacement for the server-side backend and is just a way to get simple information. The specific value to query is provided in the ",(0,t.jsx)(n.code,{children:"query"})," parameter, with the following options available:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"exists"}),": Check if the provided ",(0,t.jsx)(n.code,{children:"gameid"}),"-parameter exists locally or on the configured server (True/False)."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"installed"}),": Check if the provided ",(0,t.jsx)(n.code,{children:"gameid"}),"-parameter is installed (True/False)."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"downloaded"}),": Check if the provided ",(0,t.jsx)(n.code,{children:"gameid"}),"-parameter is downloaded (True/False)."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"getname"}),": Get the name of the game defined by ",(0,t.jsx)(n.code,{children:"gameid"}),"-parameter."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"getinstalldirectory"}),": Get the install directory of the game defined by ",(0,t.jsx)(n.code,{children:"gameid"}),"-parameter."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"getappversion"}),": Get the version of the application."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"getserverurl"}),": Get the URL that we're currently configured to point to."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"isloggedin"}),": Returns if the user is currently logged in (True/False)."]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"command-line-examples",children:"Command-line Examples"}),"\n",(0,t.jsx)(n.p,{children:"Explore examples of using the GameVault client APIs via the command line:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-ps1",children:"# Launch GameVault\ngamevault.exe\n\n# Open GameVault in the background\ngamevault.exe --minimized=true\n\n# Show a specific game (ID 3)\ngamevault.exe show --gameid=3\n\n# Install a game (ID 3)\ngamevault.exe install --gameid=3\n\n# Uninstall a game (ID 3)\ngamevault.exe uninstall --gameid=3\n\n# Start a game (ID 3)\ngamevault.exe start --gameid=3\n\n# Start a game (ID 3) and bring GameVault into view\ngamevault.exe start --gameid=3 --minimized=false\n\n# Same as above without '='\ngamevault.exe start --gameid 3 --minimized false\n\n# Display help screen\ngamevault.exe help\n\n# Display help for 'start'\ngamevault.exe help start\n"})}),"\n",(0,t.jsx)(n.h2,{id:"uri-examples",children:"URI Examples"}),"\n",(0,t.jsx)(n.p,{children:"Discover examples of using the GameVault client APIs via URI:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-uri",children:"gamevault://show\ngamevault://show?minimized=true\ngamevault://install?gameid=3\ngamevault://uninstall?gameid=3\ngamevault://start?gameid=3\ngamevault://start?gameid=3&minimized=false\n"})}),"\n",(0,t.jsx)(n.h2,{id:"query-examples",children:"Query Examples"}),"\n",(0,t.jsx)(n.p,{children:"Explore examples of querying the GameVault client application through URI:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-uri",children:"gamevault://query?query=exists&gameid=3\ngamevault://query?query=installed&gameid=3\ngamevault://query?query=downloaded&gameid=3\ngamevault://query?query=getname&gameid=3\ngamevault://query?query=getinstalldirectory&gameid=3\ngamevault://query?query=getappversion\ngamevault://query?query=getserverurl\ngamevault://query?query=isloggedin\n"})}),"\n",(0,t.jsx)(n.h2,{id:"c-code-example",children:"C# Code Example"}),"\n",(0,t.jsx)(n.p,{children:"For developers working with C#, here's an example of interacting with the GameVault app through the NamedPipe:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-csharp",children:'using System;\nusing System.IO;\nusing System.IO.Pipes;\nusing System.Text;\nusing System.Threading;\nusing System.Threading.Tasks;\n\npublic static class GameVaultInteraction\n{\n public static async Task SendPipeMessage(string message, CancellationToken cancellationToken, bool expectsResult = false, int timeout = 500)\n {\n string result = null;\n using var client = new NamedPipeClientStream("GameVault");\n StreamWriter writer = null;\n StreamReader reader = null;\n\n try\n {\n await client.ConnectAsync(timeout, cancellationToken);\n\n writer = new StreamWriter(client, Encoding.UTF8, 1024, leaveOpen: true) { AutoFlush = true };\n await writer.WriteLineAsync(message);\n\n if (expectsResult)\n {\n reader = new StreamReader(client, Encoding.UTF8, false, 1024, leaveOpen: true);\n result = await reader.ReadLineAsync();\n }\n }\n finally\n {\n SafeDispose(writer);\n SafeDispose(reader);\n SafeDispose(client);\n }\n\n return result;\n }\n\n private static void SafeDispose(IDisposable disposable)\n {\n if (disposable == null)\n return;\n\n try\n {\n disposable.Dispose();\n }\n catch (Exception) { }\n }\n}\n'})})]})}function h(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(o,{...e})}):o(e)}},8591:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>r});var a=i(758);const t={},l=a.createContext(t);function s(e){const n=a.useContext(l);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),a.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9d9f8394.15795826.js b/assets/js/9d9f8394.8b08e01a.js similarity index 99% rename from assets/js/9d9f8394.15795826.js rename to assets/js/9d9f8394.8b08e01a.js index 45b628f35..a7cb87a6b 100644 --- a/assets/js/9d9f8394.15795826.js +++ b/assets/js/9d9f8394.8b08e01a.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[9013],{3862:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"troubleshooting","title":"Troubleshooting","description":"Below, we will gradually list some common issues and corresponding solutions to help you maximize the potential of your app. If you can\'t find a solution to your problem here, feel free to open a ticket on our Github board or seek assistance via Discord. Alternatively, you may also directly email our company address if the issue is confidential.","source":"@site/docs/troubleshooting.md","sourceDirName":".","slug":"/troubleshooting","permalink":"/docs/troubleshooting","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/troubleshooting.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"sidebarPosition":99,"frontMatter":{"sidebar_position":99},"sidebar":"docs","previous":{"title":"Licensing and Contributions","permalink":"/docs/license-contribute"}}');var i=r(6070),o=r(8591);const t={sidebar_position:99},a="Troubleshooting",l={},d=[{value:"All-Rounder Solutions that Fix Most Problems",id:"all-rounder-solutions-that-fix-most-problems",level:2},{value:"Common Problems and Solutions",id:"common-problems-and-solutions",level:2},{value:"Incorrect Game Mapping",id:"incorrect-game-mapping",level:3},{value:"Server fails to save media / create SQLITE Database / index games / throws a Permissions Denied / No Permission / EACCES error",id:"server-fails-to-save-media--create-sqlite-database--index-games--throws-a-permissions-denied--no-permission--eacces-error",level:3},{value:"Unable to Connect to Server / 500 Internal Server Error",id:"unable-to-connect-to-server--500-internal-server-error",level:3},{value:"Initial Admin User is not working",id:"initial-admin-user-is-not-working",level:3},{value:"Games Not Appearing in the Installations / Servers List",id:"games-not-appearing-in-the-installations--servers-list",level:3},{value:"Missing Box Arts",id:"missing-box-arts",level:3},{value:"Lack of Metadata in Games",id:"lack-of-metadata-in-games",level:3},{value:"Lost my Admin Role",id:"lost-my-admin-role",level:3},{value:"Forgot my Admin Password",id:"forgot-my-admin-password",level:3},{value:"Game Downloads are slow",id:"game-downloads-are-slow",level:3}];function c(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"troubleshooting",children:"Troubleshooting"})}),"\n",(0,i.jsxs)(s.p,{children:["Below, we will gradually list some common issues and corresponding solutions to help you maximize the potential of your app. If you can't find a solution to your problem here, feel free to open a ticket on our Github board or seek assistance via ",(0,i.jsx)(s.a,{href:"https://discord.gg/NEdNen2dSu",children:"Discord"}),". Alternatively, you may also directly ",(0,i.jsx)(s.a,{href:"mailto:contact@phalco.de",children:"email our company address"})," if the issue is confidential."]}),"\n",(0,i.jsx)(s.admonition,{title:"How to report an issue",type:"tip",children:(0,i.jsxs)(s.p,{children:["Always provide as much information as possible so that we can reproduce the problem, and ",(0,i.jsx)(s.strong,{children:"always"})," attach a full (from the start of the server to when the problem occurs) log file with the ",(0,i.jsx)(s.code,{children:"SERVER_LOG_LEVEL"})," env-var set to ",(0,i.jsx)(s.code,{children:"debug"}),". You ",(0,i.jsx)(s.strong,{children:"must not"})," shorten log files. It just makes it harder for us to understand what went wrong. We know they get big, but we know how to read them."]})}),"\n",(0,i.jsx)(s.h2,{id:"all-rounder-solutions-that-fix-most-problems",children:"All-Rounder Solutions that Fix Most Problems"}),"\n",(0,i.jsx)(s.p,{children:"I can't mention these in every single Section below, so before you try to solve anything, try these:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Check if the server is running healthy and is reachable from your client."}),"\n",(0,i.jsx)(s.li,{children:"Restart GameVault Client and Server."}),"\n",(0,i.jsxs)(s.li,{children:["Examine Client and Server Logs for error details. (Set ",(0,i.jsx)(s.code,{children:"SERVER_LOG_LEVEL"})," to ",(0,i.jsx)(s.code,{children:"debug"}),")"]}),"\n",(0,i.jsxs)(s.li,{children:["Check ",(0,i.jsx)(s.a,{href:"/docs/server-docs/configuration",children:"Server for any issues with Configuration"}),"."]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"common-problems-and-solutions",children:"Common Problems and Solutions"}),"\n",(0,i.jsx)(s.h3,{id:"incorrect-game-mapping",children:"Incorrect Game Mapping"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Refer to ",(0,i.jsx)(s.a,{href:"/docs/client-docs/how-to-use#modifying-games",children:"this"})," for instructions on how to remap your games."]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"server-fails-to-save-media--create-sqlite-database--index-games--throws-a-permissions-denied--no-permission--eacces-error",children:"Server fails to save media / create SQLITE Database / index games / throws a Permissions Denied / No Permission / EACCES error"}),"\n",(0,i.jsx)(s.p,{children:"This is most probably a permissions issue due to the fact that gamevault runs as a non-root user (1000:1000) by default for security purposes."}),"\n",(0,i.jsxs)(s.p,{children:["Either make sure this user has permissions to read/write to the folders you map in as volumes, or run GameVault with a user that has the permissions to do so. You can do this by using the ",(0,i.jsx)(s.code,{children:"PUID"})," & ",(0,i.jsx)(s.code,{children:"PGID"})," environment variables."]}),"\n",(0,i.jsx)(s.h3,{id:"unable-to-connect-to-server--500-internal-server-error",children:"Unable to Connect to Server / 500 Internal Server Error"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Ensure that you use the correct protocol (http or https) in the connection string, particularly if your server doesn't support SSL."}),"\n",(0,i.jsxs)(s.li,{children:["If you have disabled authentication in your server configuration, make sure to include the authentication header for user-specific requests. ",(0,i.jsx)(s.a,{href:"/docs/server-docs/configuration",children:"See here"})," for more information."]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"initial-admin-user-is-not-working",children:"Initial Admin User is not working"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"You need to register the first user. It is automatically activated and granted admin permissions."}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"games-not-appearing-in-the-installations--servers-list",children:"Games Not Appearing in the Installations / Servers List"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.a,{href:"/docs/server-docs/adding-games",children:"Add Games to your server"})}),"\n",(0,i.jsx)(s.li,{children:"Clear the Searchbox"}),"\n",(0,i.jsx)(s.li,{children:"Clear all active Filters"}),"\n",(0,i.jsx)(s.li,{children:"Press F5 to trigger a new search"}),"\n",(0,i.jsxs)(s.li,{children:["For installations, verify your correct root folder is set ",(0,i.jsx)(s.a,{href:"/docs/client-docs/gui#data",children:"in the settings"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["Verify your server's game id does not differ from the one in your installation folder (The game's server id can be found in the lower left corner of ",(0,i.jsx)(s.a,{href:"/docs/client-docs/gui#game-settings",children:"the game's settings"}),")."]}),"\n",(0,i.jsxs)(s.li,{children:["Verify ",(0,i.jsx)(s.a,{href:"/docs/server-docs/structure",children:"your file names are correct"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["Check the Filesystem Permissions. See ",(0,i.jsx)(s.a,{href:"#server-fails-to-save-media--create-sqlite-database--index-games--throws-a-permissions-denied--no-permission--eacces-error",children:"here"})]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"missing-box-arts",children:"Missing Box Arts"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/server-docs/metadata-enrichment/metadata",children:"Set up a Metadata Provider"})," that provides box art for your games."]}),"\n",(0,i.jsxs)(s.li,{children:["Clear media caches ",(0,i.jsx)(s.a,{href:"/docs/client-docs/gui#data",children:"in the settings."})]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"lack-of-metadata-in-games",children:"Lack of Metadata in Games"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/server-docs/metadata-enrichment/metadata",children:"Set up a Metadata Provider"})," that provides metadata for your games."]}),"\n",(0,i.jsxs)(s.li,{children:["Verify if ",(0,i.jsx)(s.a,{href:"/docs/server-docs/configuration",children:"your Metadata Provider is disabled in your server configuration"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["Verify if ",(0,i.jsx)(s.a,{href:"/docs/server-docs/structure",children:"your file names are correct"})]}),"\n",(0,i.jsxs)(s.li,{children:["Verify if you accidently marked your game as ",(0,i.jsx)(s.code,{children:"(NC)"})," (No Cache Flag)"]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"lost-my-admin-role",children:"Lost my Admin Role"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Refer to ",(0,i.jsx)(s.a,{href:"./server-docs/user-management#admin-role-recovery",children:"this"})," for instructions on how to regain admin privileges for your user."]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"forgot-my-admin-password",children:"Forgot my Admin Password"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Refer to ",(0,i.jsx)(s.a,{href:"./server-docs/user-management#admin-password-recovery",children:"this"})," for instructions on how to reset the password of your admin user."]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"game-downloads-are-slow",children:"Game Downloads are slow"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Make sure the Clients Bandwidth Speed Limit is unset under ",(0,i.jsx)(s.code,{children:"Settings -> Application"})]}),"\n",(0,i.jsxs)(s.li,{children:["Make sure the Servers Bandwidth Speed Limit is unset (",(0,i.jsx)(s.code,{children:"SERVER_MAX_DOWNLOAD_BANDWIDTH_IN_KBPS"})," environment variable unset or 0)"]}),"\n",(0,i.jsx)(s.li,{children:"Restart your Client and Server"}),"\n",(0,i.jsx)(s.li,{children:"If your server is in your LAN, make sure you don't mistakenly access it from WAN"}),"\n",(0,i.jsx)(s.li,{children:"Check your middle-mans: Proxies, VPNs and older Network Hardware could all affect the download speeds."}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8591:(e,s,r)=>{r.d(s,{R:()=>t,x:()=>a});var n=r(758);const i={},o=n.createContext(i);function t(e){const s=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),n.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[9013],{3862:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"troubleshooting","title":"Troubleshooting","description":"Below, we will gradually list some common issues and corresponding solutions to help you maximize the potential of your app. If you can\'t find a solution to your problem here, feel free to open a ticket on our Github board or seek assistance via Discord. Alternatively, you may also directly email our company address if the issue is confidential.","source":"@site/docs/troubleshooting.md","sourceDirName":".","slug":"/troubleshooting","permalink":"/docs/troubleshooting","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/troubleshooting.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"sidebarPosition":99,"frontMatter":{"sidebar_position":99},"sidebar":"docs","previous":{"title":"Licensing and Contributions","permalink":"/docs/license-contribute"}}');var i=r(6070),o=r(8591);const t={sidebar_position:99},a="Troubleshooting",l={},d=[{value:"All-Rounder Solutions that Fix Most Problems",id:"all-rounder-solutions-that-fix-most-problems",level:2},{value:"Common Problems and Solutions",id:"common-problems-and-solutions",level:2},{value:"Incorrect Game Mapping",id:"incorrect-game-mapping",level:3},{value:"Server fails to save media / create SQLITE Database / index games / throws a Permissions Denied / No Permission / EACCES error",id:"server-fails-to-save-media--create-sqlite-database--index-games--throws-a-permissions-denied--no-permission--eacces-error",level:3},{value:"Unable to Connect to Server / 500 Internal Server Error",id:"unable-to-connect-to-server--500-internal-server-error",level:3},{value:"Initial Admin User is not working",id:"initial-admin-user-is-not-working",level:3},{value:"Games Not Appearing in the Installations / Servers List",id:"games-not-appearing-in-the-installations--servers-list",level:3},{value:"Missing Box Arts",id:"missing-box-arts",level:3},{value:"Lack of Metadata in Games",id:"lack-of-metadata-in-games",level:3},{value:"Lost my Admin Role",id:"lost-my-admin-role",level:3},{value:"Forgot my Admin Password",id:"forgot-my-admin-password",level:3},{value:"Game Downloads are slow",id:"game-downloads-are-slow",level:3}];function c(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"troubleshooting",children:"Troubleshooting"})}),"\n",(0,i.jsxs)(s.p,{children:["Below, we will gradually list some common issues and corresponding solutions to help you maximize the potential of your app. If you can't find a solution to your problem here, feel free to open a ticket on our Github board or seek assistance via ",(0,i.jsx)(s.a,{href:"https://discord.gg/NEdNen2dSu",children:"Discord"}),". Alternatively, you may also directly ",(0,i.jsx)(s.a,{href:"mailto:contact@phalco.de",children:"email our company address"})," if the issue is confidential."]}),"\n",(0,i.jsx)(s.admonition,{title:"How to report an issue",type:"tip",children:(0,i.jsxs)(s.p,{children:["Always provide as much information as possible so that we can reproduce the problem, and ",(0,i.jsx)(s.strong,{children:"always"})," attach a full (from the start of the server to when the problem occurs) log file with the ",(0,i.jsx)(s.code,{children:"SERVER_LOG_LEVEL"})," env-var set to ",(0,i.jsx)(s.code,{children:"debug"}),". You ",(0,i.jsx)(s.strong,{children:"must not"})," shorten log files. It just makes it harder for us to understand what went wrong. We know they get big, but we know how to read them."]})}),"\n",(0,i.jsx)(s.h2,{id:"all-rounder-solutions-that-fix-most-problems",children:"All-Rounder Solutions that Fix Most Problems"}),"\n",(0,i.jsx)(s.p,{children:"I can't mention these in every single Section below, so before you try to solve anything, try these:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Check if the server is running healthy and is reachable from your client."}),"\n",(0,i.jsx)(s.li,{children:"Restart GameVault Client and Server."}),"\n",(0,i.jsxs)(s.li,{children:["Examine Client and Server Logs for error details. (Set ",(0,i.jsx)(s.code,{children:"SERVER_LOG_LEVEL"})," to ",(0,i.jsx)(s.code,{children:"debug"}),")"]}),"\n",(0,i.jsxs)(s.li,{children:["Check ",(0,i.jsx)(s.a,{href:"/docs/server-docs/configuration",children:"Server for any issues with Configuration"}),"."]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"common-problems-and-solutions",children:"Common Problems and Solutions"}),"\n",(0,i.jsx)(s.h3,{id:"incorrect-game-mapping",children:"Incorrect Game Mapping"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Refer to ",(0,i.jsx)(s.a,{href:"/docs/client-docs/how-to-use#modifying-games",children:"this"})," for instructions on how to remap your games."]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"server-fails-to-save-media--create-sqlite-database--index-games--throws-a-permissions-denied--no-permission--eacces-error",children:"Server fails to save media / create SQLITE Database / index games / throws a Permissions Denied / No Permission / EACCES error"}),"\n",(0,i.jsx)(s.p,{children:"This is most probably a permissions issue due to the fact that gamevault runs as a non-root user (1000:1000) by default for security purposes."}),"\n",(0,i.jsxs)(s.p,{children:["Either make sure this user has permissions to read/write to the folders you map in as volumes, or run GameVault with a user that has the permissions to do so. You can do this by using the ",(0,i.jsx)(s.code,{children:"PUID"})," & ",(0,i.jsx)(s.code,{children:"PGID"})," environment variables."]}),"\n",(0,i.jsx)(s.h3,{id:"unable-to-connect-to-server--500-internal-server-error",children:"Unable to Connect to Server / 500 Internal Server Error"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Ensure that you use the correct protocol (http or https) in the connection string, particularly if your server doesn't support SSL."}),"\n",(0,i.jsxs)(s.li,{children:["If you have disabled authentication in your server configuration, make sure to include the authentication header for user-specific requests. ",(0,i.jsx)(s.a,{href:"/docs/server-docs/configuration",children:"See here"})," for more information."]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"initial-admin-user-is-not-working",children:"Initial Admin User is not working"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"You need to register the first user. It is automatically activated and granted admin permissions."}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"games-not-appearing-in-the-installations--servers-list",children:"Games Not Appearing in the Installations / Servers List"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.a,{href:"/docs/server-docs/adding-games",children:"Add Games to your server"})}),"\n",(0,i.jsx)(s.li,{children:"Clear the Searchbox"}),"\n",(0,i.jsx)(s.li,{children:"Clear all active Filters"}),"\n",(0,i.jsx)(s.li,{children:"Press F5 to trigger a new search"}),"\n",(0,i.jsxs)(s.li,{children:["For installations, verify your correct root folder is set ",(0,i.jsx)(s.a,{href:"/docs/client-docs/gui#data",children:"in the settings"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["Verify your server's game id does not differ from the one in your installation folder (The game's server id can be found in the lower left corner of ",(0,i.jsx)(s.a,{href:"/docs/client-docs/gui#game-settings",children:"the game's settings"}),")."]}),"\n",(0,i.jsxs)(s.li,{children:["Verify ",(0,i.jsx)(s.a,{href:"/docs/server-docs/structure",children:"your file names are correct"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["Check the Filesystem Permissions. See ",(0,i.jsx)(s.a,{href:"#server-fails-to-save-media--create-sqlite-database--index-games--throws-a-permissions-denied--no-permission--eacces-error",children:"here"})]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"missing-box-arts",children:"Missing Box Arts"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/server-docs/metadata-enrichment/metadata",children:"Set up a Metadata Provider"})," that provides box art for your games."]}),"\n",(0,i.jsxs)(s.li,{children:["Clear media caches ",(0,i.jsx)(s.a,{href:"/docs/client-docs/gui#data",children:"in the settings."})]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"lack-of-metadata-in-games",children:"Lack of Metadata in Games"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/docs/server-docs/metadata-enrichment/metadata",children:"Set up a Metadata Provider"})," that provides metadata for your games."]}),"\n",(0,i.jsxs)(s.li,{children:["Verify if ",(0,i.jsx)(s.a,{href:"/docs/server-docs/configuration",children:"your Metadata Provider is disabled in your server configuration"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["Verify if ",(0,i.jsx)(s.a,{href:"/docs/server-docs/structure",children:"your file names are correct"})]}),"\n",(0,i.jsxs)(s.li,{children:["Verify if you accidently marked your game as ",(0,i.jsx)(s.code,{children:"(NC)"})," (No Cache Flag)"]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"lost-my-admin-role",children:"Lost my Admin Role"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Refer to ",(0,i.jsx)(s.a,{href:"./server-docs/user-management#admin-role-recovery",children:"this"})," for instructions on how to regain admin privileges for your user."]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"forgot-my-admin-password",children:"Forgot my Admin Password"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Refer to ",(0,i.jsx)(s.a,{href:"./server-docs/user-management#admin-password-recovery",children:"this"})," for instructions on how to reset the password of your admin user."]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"game-downloads-are-slow",children:"Game Downloads are slow"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Make sure the Clients Bandwidth Speed Limit is unset under ",(0,i.jsx)(s.code,{children:"Settings -> Application"})]}),"\n",(0,i.jsxs)(s.li,{children:["Make sure the Servers Bandwidth Speed Limit is unset (",(0,i.jsx)(s.code,{children:"SERVER_MAX_DOWNLOAD_BANDWIDTH_IN_KBPS"})," environment variable unset or 0)"]}),"\n",(0,i.jsx)(s.li,{children:"Restart your Client and Server"}),"\n",(0,i.jsx)(s.li,{children:"If your server is in your LAN, make sure you don't mistakenly access it from WAN"}),"\n",(0,i.jsx)(s.li,{children:"Check your middle-mans: Proxies, VPNs and older Network Hardware could all affect the download speeds."}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8591:(e,s,r)=>{r.d(s,{R:()=>t,x:()=>a});var n=r(758);const i={},o=n.createContext(i);function t(e){const s=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),n.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a1072f2a.4196496f.js b/assets/js/a1072f2a.88faa134.js similarity index 99% rename from assets/js/a1072f2a.4196496f.js rename to assets/js/a1072f2a.88faa134.js index 20c2e08bb..a6af204fe 100644 --- a/assets/js/a1072f2a.4196496f.js +++ b/assets/js/a1072f2a.88faa134.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[4365],{1055:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>r,contentTitle:()=>d,default:()=>h,frontMatter:()=>l,metadata:()=>s,toc:()=>o});const s=JSON.parse('{"id":"client-docs/gui","title":"GUI Overview","description":"This documentation provides a clear overview of the Graphical User Interface (GUI) for GameVault. The GUI encompasses various tabs, each offering distinct functionalities.","source":"@site/docs/client-docs/gui.md","sourceDirName":"client-docs","slug":"/client-docs/gui","permalink":"/docs/client-docs/gui","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/client-docs/gui.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"sidebarPosition":98,"frontMatter":{"sidebar_position":98},"sidebar":"docs","previous":{"title":"Data Management","permalink":"/docs/client-docs/data"},"next":{"title":"Themes","permalink":"/docs/client-docs/themes"}}');var t=n(6070),a=n(8591);const l={sidebar_position:98},d="GUI Overview",r={},o=[{value:"Setup Wizard",id:"setup-wizard",level:2},{value:"Library",id:"library",level:2},{value:"Game",id:"game",level:2},{value:"Game Settings",id:"game-settings",level:2},{value:"Your Computer",id:"your-computer",level:3},{value:"Installation",id:"installation",level:4},{value:"Launch Options",id:"launch-options",level:4},{value:"Server",id:"server",level:3},{value:"Edit Game Images",id:"edit-game-images",level:4},{value:"Metadata",id:"metadata",level:4},{value:"Custom Metadata",id:"custom-metadata",level:4},{value:"Downloads",id:"downloads",level:2},{value:"Community",id:"community",level:2},{value:"User Settings",id:"user-settings",level:2},{value:"Edit User Images",id:"edit-user-images",level:3},{value:"Edit Details",id:"edit-details",level:3},{value:"Settings",id:"settings",level:2},{value:"Application",id:"application",level:3},{value:"Installation",id:"installation-1",level:3},{value:"User",id:"user",level:3},{value:"Data",id:"data",level:3},{value:"Administration",id:"administration",level:2},{value:"News",id:"news",level:2}];function c(e){const i={admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,a.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"gui-overview",children:"GUI Overview"})}),"\n",(0,t.jsx)(i.p,{children:"This documentation provides a clear overview of the Graphical User Interface (GUI) for GameVault. The GUI encompasses various tabs, each offering distinct functionalities."}),"\n",(0,t.jsx)(i.h2,{id:"setup-wizard",children:"Setup Wizard"}),"\n",(0,t.jsx)(i.p,{children:"The Setup Wizard is a sub-page that appears when the necessary settings for GameVault are not configured. It guides users through these settings with detailed explanations. Exiting the wizard is optional, as all settings can also be configured in the settings tab."}),"\n",(0,t.jsx)(i.h2,{id:"library",children:"Library"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:""Library Tab"",src:n(5224).A+"",width:"2552",height:"1392"})}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Browse available and installed games."}),"\n",(0,t.jsx)(i.li,{children:"Expand or collapse sections with expanders."}),"\n",(0,t.jsx)(i.li,{children:"Launch installed games by clicking the play button on box art."}),"\n",(0,t.jsx)(i.li,{children:"Download available games by clicking the download button on box art."}),"\n",(0,t.jsx)(i.li,{children:"Access game settings directly with the Settings icon."}),"\n",(0,t.jsx)(i.li,{children:"The paged Library loads a maximum of 80 games at once for bandwidth efficiency."}),"\n",(0,t.jsx)(i.li,{children:"Use the dice icon to open a random game on the server."}),"\n",(0,t.jsx)(i.li,{children:"Employ the Filter icon for server game filtering."}),"\n",(0,t.jsx)(i.li,{children:"Utilize the search bar to find specific games."}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"game",children:"Game"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:""Game Page"",src:n(6055).A+"",width:"2552",height:"1392"})}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"View comprehensive game details including a Media Player for Trailers/Gameplays/Screenshots"}),"\n",(0,t.jsx)(i.li,{children:"Descriptions and Notes can also be displayed as Markdown."}),"\n",(0,t.jsx)(i.li,{children:"Set progress states (e.g., completed or aborted)."}),"\n",(0,t.jsx)(i.li,{children:"Review personal progress and that of other users"}),"\n",(0,t.jsx)(i.li,{children:"Add games to the download queue or launch installed games."}),"\n",(0,t.jsx)(i.li,{children:"Bookmark the game or create a share link"}),"\n",(0,t.jsxs)(i.li,{children:["Navigate back to the Library Tab using the back-arrow button or ",(0,t.jsx)(i.code,{children:"ESC"})," key."]}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"game-settings",children:"Game Settings"}),"\n",(0,t.jsx)(i.h3,{id:"your-computer",children:"Your Computer"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Settings affecting local game installations."}),"\n"]}),"\n",(0,t.jsx)(i.h4,{id:"installation",children:"Installation"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"View installation directory."}),"\n",(0,t.jsx)(i.li,{children:"Uninstall games."}),"\n",(0,t.jsx)(i.li,{children:"Check disk usage for the game."}),"\n"]}),"\n",(0,t.jsx)(i.h4,{id:"launch-options",children:"Launch Options"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Set default executable and launch parameters."}),"\n",(0,t.jsx)(i.li,{children:"Create desktop shortcuts."}),"\n"]}),"\n",(0,t.jsx)(i.h3,{id:"server",children:"Server"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Settings affecting all users on the server (visible to editors or higher)."}),"\n"]}),"\n",(0,t.jsx)(i.h4,{id:"edit-game-images",children:"Edit Game Images"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Set a different thumbnail/background image using URLs or uploads. Has also a button to simplify the search for box/background images"}),"\n"]}),"\n",(0,t.jsx)(i.h4,{id:"metadata",children:"Metadata"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:""Metadata"",src:n(6334).A+"",width:"1920",height:"1038"})}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"View available metadata providers."}),"\n",(0,t.jsx)(i.li,{children:"Change metadata providers priority."}),"\n",(0,t.jsx)(i.li,{children:"Unmap metadata providers. If unmaped the header text will be grayed out a bit and the action buttons are disabled."}),"\n",(0,t.jsx)(i.li,{children:"Recache selected metadata provider."}),"\n",(0,t.jsx)(i.li,{children:'Switch metadata from selectd metadata providers in the "Remap Game" section.'}),"\n"]}),"\n",(0,t.jsx)(i.h4,{id:"custom-metadata",children:"Custom Metadata"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:""Custom Metadata"",src:n(5409).A+"",width:"2559",height:"1390"})}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Have full control of all the specific game details such as description, genres, tags etc including a preview of the current set data."}),"\n",(0,t.jsx)(i.li,{children:"Click the relead icon beside a game detail to load the current values into the textbox."}),"\n",(0,t.jsxs)(i.li,{children:["Clear all user overwritten details by clicking the related button on the top right.","\n",(0,t.jsx)(i.admonition,{title:"Format",type:"note",children:(0,t.jsx)(i.p,{children:"Multiple entries such as genres, tags etc. must be separated by a comma."})}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"downloads",children:"Downloads"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:""Downloads Tab"",src:n(8638).A+"",width:"2560",height:"1401"})}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Monitor running and completed downloads."}),"\n",(0,t.jsx)(i.li,{children:"View download statistics and progress."}),"\n",(0,t.jsx)(i.li,{children:"Abort downloads."}),"\n",(0,t.jsx)(i.li,{children:"Extract game archives and view extraction progress."}),"\n",(0,t.jsx)(i.li,{children:"Perform installations based on game types."}),"\n",(0,t.jsx)(i.li,{children:"Open download folders and delete downloaded files."}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"community",children:"Community"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:""Community Tab"",src:n(6162).A+"",width:"2552",height:"1392"})}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"View all users on the GameVault Server."}),"\n",(0,t.jsx)(i.li,{children:"Select users for detailed game progress information."}),"\n",(0,t.jsx)(i.li,{children:"Sort and delete progresses."}),"\n",(0,t.jsx)(i.li,{children:"Edit user details and reload progresses."}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"user-settings",children:"User Settings"}),"\n",(0,t.jsx)(i.h3,{id:"edit-user-images",children:"Edit User Images"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Set avatar/background images using URLs or uploads."}),"\n"]}),"\n",(0,t.jsx)(i.h3,{id:"edit-details",children:"Edit Details"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"View and update user details."}),"\n",(0,t.jsx)(i.li,{children:"Update passwords with confirmation."}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"settings",children:"Settings"}),"\n",(0,t.jsx)(i.h3,{id:"application",children:"Application"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Configure server URL and startup options."}),"\n",(0,t.jsx)(i.li,{children:"Change curren client theme or open the theme folder to insert your own."}),"\n"]}),"\n",(0,t.jsx)(i.h3,{id:"installation-1",children:"Installation"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Configure the donwload bandwidth limit."}),"\n",(0,t.jsx)(i.li,{children:"Set if you want to auto extract downloaded games and set a default password for encrypted archives."}),"\n",(0,t.jsx)(i.li,{children:"Set if portable games should be auto installed and if the install files should be auto deleted."}),"\n"]}),"\n",(0,t.jsx)(i.h3,{id:"user",children:"User"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Log In to GameVault Backend Server."}),"\n",(0,t.jsx)(i.li,{children:"Log Out from GameVault Backend Server."}),"\n",(0,t.jsx)(i.li,{children:"Register a new user on the GameVault Backend Server."}),"\n",(0,t.jsx)(i.li,{children:"Enter current User Settings"}),"\n"]}),"\n",(0,t.jsx)(i.h3,{id:"data",children:"Data"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Select GameVault root path and clear image and offline caches."}),"\n",(0,t.jsx)(i.li,{children:"Clear image/offline cache"}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"administration",children:"Administration"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:""Admin Tab"",src:n(4452).A+"",width:"2560",height:"1408"})}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Visible to admins only."}),"\n",(0,t.jsx)(i.li,{children:"View, activate/deactivate, and edit user roles."}),"\n",(0,t.jsx)(i.li,{children:"Delete or restore users."}),"\n",(0,t.jsx)(i.li,{children:"Open Community Tab profile by clicking on users' avatars."}),"\n",(0,t.jsx)(i.li,{children:"Re-index games on the server."}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"news",children:"News"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:""News"",src:n(4544).A+"",width:"1920",height:"1035"})}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"At the bottom left of the screen is a button with which you can display the latest news from gamevault or the server's own news."}),"\n",(0,t.jsx)(i.li,{children:"When new news are available the button will be marked with a red badged."}),"\n",(0,t.jsx)(i.li,{children:"News can also be displayed as Markdown."}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,a.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},4452:(e,i,n)=>{n.d(i,{A:()=>s});const s=n.p+"assets/images/admin-163007224ecf65c20c912373d8116764.png"},6162:(e,i,n)=>{n.d(i,{A:()=>s});const s=n.p+"assets/images/community-dd5bdb223d82cf27e3efecb138a761e4.png"},8638:(e,i,n)=>{n.d(i,{A:()=>s});const s=n.p+"assets/images/downloads-895661ab44edeb12e017a72eb3442d34.png"},6055:(e,i,n)=>{n.d(i,{A:()=>s});const s=n.p+"assets/images/game-cedb39d093ecfc786031c2b12b91f78c.png"},5409:(e,i,n)=>{n.d(i,{A:()=>s});const s=n.p+"assets/images/gamesettings_custom_metadata-496c0e3f99804008a8efba69dd0e6f2d.png"},6334:(e,i,n)=>{n.d(i,{A:()=>s});const s=n.p+"assets/images/gamesettings_metadata-92dd4562e50f7332b17bf9b7f0915583.png"},5224:(e,i,n)=>{n.d(i,{A:()=>s});const s=n.p+"assets/images/library-f32c0189f93557ea6b1a638154166f64.png"},4544:(e,i,n)=>{n.d(i,{A:()=>s});const s=n.p+"assets/images/news-c0dbf35a1fb7b8c3573951a7649d2327.png"},8591:(e,i,n)=>{n.d(i,{R:()=>l,x:()=>d});var s=n(758);const t={},a=s.createContext(t);function l(e){const i=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function d(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),s.createElement(a.Provider,{value:i},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[4365],{1055:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>r,contentTitle:()=>d,default:()=>h,frontMatter:()=>l,metadata:()=>s,toc:()=>o});const s=JSON.parse('{"id":"client-docs/gui","title":"GUI Overview","description":"This documentation provides a clear overview of the Graphical User Interface (GUI) for GameVault. The GUI encompasses various tabs, each offering distinct functionalities.","source":"@site/docs/client-docs/gui.md","sourceDirName":"client-docs","slug":"/client-docs/gui","permalink":"/docs/client-docs/gui","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/client-docs/gui.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"sidebarPosition":98,"frontMatter":{"sidebar_position":98},"sidebar":"docs","previous":{"title":"Data Management","permalink":"/docs/client-docs/data"},"next":{"title":"Themes","permalink":"/docs/client-docs/themes"}}');var t=n(6070),a=n(8591);const l={sidebar_position:98},d="GUI Overview",r={},o=[{value:"Setup Wizard",id:"setup-wizard",level:2},{value:"Library",id:"library",level:2},{value:"Game",id:"game",level:2},{value:"Game Settings",id:"game-settings",level:2},{value:"Your Computer",id:"your-computer",level:3},{value:"Installation",id:"installation",level:4},{value:"Launch Options",id:"launch-options",level:4},{value:"Server",id:"server",level:3},{value:"Edit Game Images",id:"edit-game-images",level:4},{value:"Metadata",id:"metadata",level:4},{value:"Custom Metadata",id:"custom-metadata",level:4},{value:"Downloads",id:"downloads",level:2},{value:"Community",id:"community",level:2},{value:"User Settings",id:"user-settings",level:2},{value:"Edit User Images",id:"edit-user-images",level:3},{value:"Edit Details",id:"edit-details",level:3},{value:"Settings",id:"settings",level:2},{value:"Application",id:"application",level:3},{value:"Installation",id:"installation-1",level:3},{value:"User",id:"user",level:3},{value:"Data",id:"data",level:3},{value:"Administration",id:"administration",level:2},{value:"News",id:"news",level:2}];function c(e){const i={admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,a.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"gui-overview",children:"GUI Overview"})}),"\n",(0,t.jsx)(i.p,{children:"This documentation provides a clear overview of the Graphical User Interface (GUI) for GameVault. The GUI encompasses various tabs, each offering distinct functionalities."}),"\n",(0,t.jsx)(i.h2,{id:"setup-wizard",children:"Setup Wizard"}),"\n",(0,t.jsx)(i.p,{children:"The Setup Wizard is a sub-page that appears when the necessary settings for GameVault are not configured. It guides users through these settings with detailed explanations. Exiting the wizard is optional, as all settings can also be configured in the settings tab."}),"\n",(0,t.jsx)(i.h2,{id:"library",children:"Library"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:""Library Tab"",src:n(5224).A+"",width:"2552",height:"1392"})}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Browse available and installed games."}),"\n",(0,t.jsx)(i.li,{children:"Expand or collapse sections with expanders."}),"\n",(0,t.jsx)(i.li,{children:"Launch installed games by clicking the play button on box art."}),"\n",(0,t.jsx)(i.li,{children:"Download available games by clicking the download button on box art."}),"\n",(0,t.jsx)(i.li,{children:"Access game settings directly with the Settings icon."}),"\n",(0,t.jsx)(i.li,{children:"The paged Library loads a maximum of 80 games at once for bandwidth efficiency."}),"\n",(0,t.jsx)(i.li,{children:"Use the dice icon to open a random game on the server."}),"\n",(0,t.jsx)(i.li,{children:"Employ the Filter icon for server game filtering."}),"\n",(0,t.jsx)(i.li,{children:"Utilize the search bar to find specific games."}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"game",children:"Game"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:""Game Page"",src:n(6055).A+"",width:"2552",height:"1392"})}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"View comprehensive game details including a Media Player for Trailers/Gameplays/Screenshots"}),"\n",(0,t.jsx)(i.li,{children:"Descriptions and Notes can also be displayed as Markdown."}),"\n",(0,t.jsx)(i.li,{children:"Set progress states (e.g., completed or aborted)."}),"\n",(0,t.jsx)(i.li,{children:"Review personal progress and that of other users"}),"\n",(0,t.jsx)(i.li,{children:"Add games to the download queue or launch installed games."}),"\n",(0,t.jsx)(i.li,{children:"Bookmark the game or create a share link"}),"\n",(0,t.jsxs)(i.li,{children:["Navigate back to the Library Tab using the back-arrow button or ",(0,t.jsx)(i.code,{children:"ESC"})," key."]}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"game-settings",children:"Game Settings"}),"\n",(0,t.jsx)(i.h3,{id:"your-computer",children:"Your Computer"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Settings affecting local game installations."}),"\n"]}),"\n",(0,t.jsx)(i.h4,{id:"installation",children:"Installation"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"View installation directory."}),"\n",(0,t.jsx)(i.li,{children:"Uninstall games."}),"\n",(0,t.jsx)(i.li,{children:"Check disk usage for the game."}),"\n"]}),"\n",(0,t.jsx)(i.h4,{id:"launch-options",children:"Launch Options"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Set default executable and launch parameters."}),"\n",(0,t.jsx)(i.li,{children:"Create desktop shortcuts."}),"\n"]}),"\n",(0,t.jsx)(i.h3,{id:"server",children:"Server"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Settings affecting all users on the server (visible to editors or higher)."}),"\n"]}),"\n",(0,t.jsx)(i.h4,{id:"edit-game-images",children:"Edit Game Images"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Set a different thumbnail/background image using URLs or uploads. Has also a button to simplify the search for box/background images"}),"\n"]}),"\n",(0,t.jsx)(i.h4,{id:"metadata",children:"Metadata"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:""Metadata"",src:n(6334).A+"",width:"1920",height:"1038"})}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"View available metadata providers."}),"\n",(0,t.jsx)(i.li,{children:"Change metadata providers priority."}),"\n",(0,t.jsx)(i.li,{children:"Unmap metadata providers. If unmaped the header text will be grayed out a bit and the action buttons are disabled."}),"\n",(0,t.jsx)(i.li,{children:"Recache selected metadata provider."}),"\n",(0,t.jsx)(i.li,{children:'Switch metadata from selectd metadata providers in the "Remap Game" section.'}),"\n"]}),"\n",(0,t.jsx)(i.h4,{id:"custom-metadata",children:"Custom Metadata"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:""Custom Metadata"",src:n(5409).A+"",width:"2559",height:"1390"})}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Have full control of all the specific game details such as description, genres, tags etc including a preview of the current set data."}),"\n",(0,t.jsx)(i.li,{children:"Click the relead icon beside a game detail to load the current values into the textbox."}),"\n",(0,t.jsxs)(i.li,{children:["Clear all user overwritten details by clicking the related button on the top right.","\n",(0,t.jsx)(i.admonition,{title:"Format",type:"note",children:(0,t.jsx)(i.p,{children:"Multiple entries such as genres, tags etc. must be separated by a comma."})}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"downloads",children:"Downloads"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:""Downloads Tab"",src:n(8638).A+"",width:"2560",height:"1401"})}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Monitor running and completed downloads."}),"\n",(0,t.jsx)(i.li,{children:"View download statistics and progress."}),"\n",(0,t.jsx)(i.li,{children:"Abort downloads."}),"\n",(0,t.jsx)(i.li,{children:"Extract game archives and view extraction progress."}),"\n",(0,t.jsx)(i.li,{children:"Perform installations based on game types."}),"\n",(0,t.jsx)(i.li,{children:"Open download folders and delete downloaded files."}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"community",children:"Community"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:""Community Tab"",src:n(6162).A+"",width:"2552",height:"1392"})}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"View all users on the GameVault Server."}),"\n",(0,t.jsx)(i.li,{children:"Select users for detailed game progress information."}),"\n",(0,t.jsx)(i.li,{children:"Sort and delete progresses."}),"\n",(0,t.jsx)(i.li,{children:"Edit user details and reload progresses."}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"user-settings",children:"User Settings"}),"\n",(0,t.jsx)(i.h3,{id:"edit-user-images",children:"Edit User Images"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Set avatar/background images using URLs or uploads."}),"\n"]}),"\n",(0,t.jsx)(i.h3,{id:"edit-details",children:"Edit Details"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"View and update user details."}),"\n",(0,t.jsx)(i.li,{children:"Update passwords with confirmation."}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"settings",children:"Settings"}),"\n",(0,t.jsx)(i.h3,{id:"application",children:"Application"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Configure server URL and startup options."}),"\n",(0,t.jsx)(i.li,{children:"Change curren client theme or open the theme folder to insert your own."}),"\n"]}),"\n",(0,t.jsx)(i.h3,{id:"installation-1",children:"Installation"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Configure the donwload bandwidth limit."}),"\n",(0,t.jsx)(i.li,{children:"Set if you want to auto extract downloaded games and set a default password for encrypted archives."}),"\n",(0,t.jsx)(i.li,{children:"Set if portable games should be auto installed and if the install files should be auto deleted."}),"\n"]}),"\n",(0,t.jsx)(i.h3,{id:"user",children:"User"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Log In to GameVault Backend Server."}),"\n",(0,t.jsx)(i.li,{children:"Log Out from GameVault Backend Server."}),"\n",(0,t.jsx)(i.li,{children:"Register a new user on the GameVault Backend Server."}),"\n",(0,t.jsx)(i.li,{children:"Enter current User Settings"}),"\n"]}),"\n",(0,t.jsx)(i.h3,{id:"data",children:"Data"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Select GameVault root path and clear image and offline caches."}),"\n",(0,t.jsx)(i.li,{children:"Clear image/offline cache"}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"administration",children:"Administration"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:""Admin Tab"",src:n(4452).A+"",width:"2560",height:"1408"})}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"Visible to admins only."}),"\n",(0,t.jsx)(i.li,{children:"View, activate/deactivate, and edit user roles."}),"\n",(0,t.jsx)(i.li,{children:"Delete or restore users."}),"\n",(0,t.jsx)(i.li,{children:"Open Community Tab profile by clicking on users' avatars."}),"\n",(0,t.jsx)(i.li,{children:"Re-index games on the server."}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"news",children:"News"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:""News"",src:n(4544).A+"",width:"1920",height:"1035"})}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"At the bottom left of the screen is a button with which you can display the latest news from gamevault or the server's own news."}),"\n",(0,t.jsx)(i.li,{children:"When new news are available the button will be marked with a red badged."}),"\n",(0,t.jsx)(i.li,{children:"News can also be displayed as Markdown."}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,a.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},4452:(e,i,n)=>{n.d(i,{A:()=>s});const s=n.p+"assets/images/admin-163007224ecf65c20c912373d8116764.png"},6162:(e,i,n)=>{n.d(i,{A:()=>s});const s=n.p+"assets/images/community-dd5bdb223d82cf27e3efecb138a761e4.png"},8638:(e,i,n)=>{n.d(i,{A:()=>s});const s=n.p+"assets/images/downloads-895661ab44edeb12e017a72eb3442d34.png"},6055:(e,i,n)=>{n.d(i,{A:()=>s});const s=n.p+"assets/images/game-cedb39d093ecfc786031c2b12b91f78c.png"},5409:(e,i,n)=>{n.d(i,{A:()=>s});const s=n.p+"assets/images/gamesettings_custom_metadata-496c0e3f99804008a8efba69dd0e6f2d.png"},6334:(e,i,n)=>{n.d(i,{A:()=>s});const s=n.p+"assets/images/gamesettings_metadata-92dd4562e50f7332b17bf9b7f0915583.png"},5224:(e,i,n)=>{n.d(i,{A:()=>s});const s=n.p+"assets/images/library-f32c0189f93557ea6b1a638154166f64.png"},4544:(e,i,n)=>{n.d(i,{A:()=>s});const s=n.p+"assets/images/news-c0dbf35a1fb7b8c3573951a7649d2327.png"},8591:(e,i,n)=>{n.d(i,{R:()=>l,x:()=>d});var s=n(758);const t={},a=s.createContext(t);function l(e){const i=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function d(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),s.createElement(a.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b1d7f5b9.27fe3e14.js b/assets/js/b1d7f5b9.fa38508a.js similarity index 98% rename from assets/js/b1d7f5b9.27fe3e14.js rename to assets/js/b1d7f5b9.fa38508a.js index 286ca5dda..e60ee0ebb 100644 --- a/assets/js/b1d7f5b9.27fe3e14.js +++ b/assets/js/b1d7f5b9.fa38508a.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[1387],{4038:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>c,contentTitle:()=>d,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>o});const a=JSON.parse('{"id":"server-docs/indexing","title":"Game Indexing","description":"The server watches the files directory (by default /files) and creates an index of all games, when changes occur. The indexing can also be triggered via API.","source":"@site/docs/server-docs/indexing.md","sourceDirName":"server-docs","slug":"/server-docs/indexing","permalink":"/docs/server-docs/indexing","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/indexing.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"sidebarPosition":7,"frontMatter":{"sidebar_position":7},"sidebar":"docs","previous":{"title":"User Management","permalink":"/docs/server-docs/user-management"},"next":{"title":"Enriching your Games with Metadata","permalink":"/docs/server-docs/metadata-enrichment/metadata"}}');var n=s(6070),i=s(8591);const r={sidebar_position:7},d="Game Indexing",c={},o=[];function l(e){const t={code:"code",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"game-indexing",children:"Game Indexing"})}),"\n",(0,n.jsxs)(t.p,{children:["The server watches the files directory (by default ",(0,n.jsx)(t.code,{children:"/files"}),") and creates an index of all games, when changes occur. The indexing can also be triggered via API."]}),"\n",(0,n.jsx)(t.p,{children:"The indexing algorithm follows these steps:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"It recursively scans all game files for changes in the files directory."}),"\n",(0,n.jsxs)(t.li,{children:["For each changed game file:","\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"It checks if the exact same game already exists in the database, either based on the file path or a combination of the title and release year. If it does, the game is skipped, as it is already indexed."}),"\n",(0,n.jsx)(t.li,{children:"It checks if the game exists in the database but was previously deleted, again based on the file path or a combination of the title and release year. If so, it restores the game and updates its information with the current file's details, such as size, title, year, early access flag, path, and version."}),"\n",(0,n.jsx)(t.li,{children:"It checks if the game already exists in the database. If so, it updates the game's information with the current file's details. Such as version, game-type or early-access flag."}),"\n",(0,n.jsx)(t.li,{children:"If the game does not exist in the database at all, it indexes the game."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"Finally, a simple integrity check is performed to ensure that the games in the database also exist in the files directory, and vice versa."})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8591:(e,t,s)=>{s.d(t,{R:()=>r,x:()=>d});var a=s(758);const n={},i=a.createContext(n);function r(e){const t=a.useContext(i);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),a.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[1387],{4038:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>c,contentTitle:()=>d,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>o});const a=JSON.parse('{"id":"server-docs/indexing","title":"Game Indexing","description":"The server watches the files directory (by default /files) and creates an index of all games, when changes occur. The indexing can also be triggered via API.","source":"@site/docs/server-docs/indexing.md","sourceDirName":"server-docs","slug":"/server-docs/indexing","permalink":"/docs/server-docs/indexing","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/indexing.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"sidebarPosition":7,"frontMatter":{"sidebar_position":7},"sidebar":"docs","previous":{"title":"User Management","permalink":"/docs/server-docs/user-management"},"next":{"title":"Enriching your Games with Metadata","permalink":"/docs/server-docs/metadata-enrichment/metadata"}}');var n=s(6070),i=s(8591);const r={sidebar_position:7},d="Game Indexing",c={},o=[];function l(e){const t={code:"code",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"game-indexing",children:"Game Indexing"})}),"\n",(0,n.jsxs)(t.p,{children:["The server watches the files directory (by default ",(0,n.jsx)(t.code,{children:"/files"}),") and creates an index of all games, when changes occur. The indexing can also be triggered via API."]}),"\n",(0,n.jsx)(t.p,{children:"The indexing algorithm follows these steps:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"It recursively scans all game files for changes in the files directory."}),"\n",(0,n.jsxs)(t.li,{children:["For each changed game file:","\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"It checks if the exact same game already exists in the database, either based on the file path or a combination of the title and release year. If it does, the game is skipped, as it is already indexed."}),"\n",(0,n.jsx)(t.li,{children:"It checks if the game exists in the database but was previously deleted, again based on the file path or a combination of the title and release year. If so, it restores the game and updates its information with the current file's details, such as size, title, year, early access flag, path, and version."}),"\n",(0,n.jsx)(t.li,{children:"It checks if the game already exists in the database. If so, it updates the game's information with the current file's details. Such as version, game-type or early-access flag."}),"\n",(0,n.jsx)(t.li,{children:"If the game does not exist in the database at all, it indexes the game."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"Finally, a simple integrity check is performed to ensure that the games in the database also exist in the files directory, and vice versa."})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8591:(e,t,s)=>{s.d(t,{R:()=>r,x:()=>d});var a=s(758);const n={},i=a.createContext(n);function r(e){const t=a.useContext(i);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),a.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b28c3188.21bfe37f.js b/assets/js/b28c3188.a85b85c2.js similarity index 99% rename from assets/js/b28c3188.21bfe37f.js rename to assets/js/b28c3188.a85b85c2.js index 7c1bd5b60..61b3f7397 100644 --- a/assets/js/b28c3188.21bfe37f.js +++ b/assets/js/b28c3188.a85b85c2.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[3468],{3235:(e,d,s)=>{s.r(d),s.d(d,{assets:()=>l,contentTitle:()=>c,default:()=>x,frontMatter:()=>t,metadata:()=>r,toc:()=>h});const r=JSON.parse('{"id":"server-docs/configuration","title":"Configuration","description":"Check out configuration.ts for all possible environment variables in case we forgot to update this page.","source":"@site/docs/server-docs/configuration.md","sourceDirName":"server-docs","slug":"/server-docs/configuration","permalink":"/docs/server-docs/configuration","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/configuration.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"sidebarPosition":2,"frontMatter":{"sidebar_position":2},"sidebar":"docs","previous":{"title":"Using Native Approach","permalink":"/docs/server-docs/setup/native"},"next":{"title":"File and Folder Structure","permalink":"/docs/server-docs/structure"}}');var i=s(6070),n=s(8591);const t={sidebar_position:2},c="Configuration",l={},h=[{value:"Configuration Properties",id:"configuration-properties",level:2},{value:"SERVER",id:"server",level:2},{value:"VOLUMES",id:"volumes",level:2},{value:"DB",id:"db",level:2},{value:"USERS",id:"users",level:2},{value:"PARENTAL",id:"parental",level:2},{value:"GAMES",id:"games",level:2},{value:"MEDIA",id:"media",level:2},{value:"METADATA",id:"metadata",level:2},{value:"TESTING",id:"testing",level:2}];function o(e){const d={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(d.header,{children:(0,i.jsx)(d.h1,{id:"configuration",children:"Configuration"})}),"\n",(0,i.jsx)(d.admonition,{type:"tip",children:(0,i.jsxs)(d.p,{children:["Check out ",(0,i.jsx)(d.a,{href:"https://github.com/Phalcode/gamevault-backend/blob/master/src/configuration.ts",children:"configuration.ts"})," for all possible environment variables in case we forgot to update this page."]})}),"\n",(0,i.jsx)(d.p,{children:"All configuration properties of your GameVault server are passed as environment variables or via a .env file. The following tables describe the available properties, their default values, explanations, and possible values."}),"\n",(0,i.jsx)(d.h2,{id:"configuration-properties",children:"Configuration Properties"}),"\n",(0,i.jsxs)(d.p,{children:["This page describes the various configuration properties used in the application. These properties can be configured in the environment variables or in a ",(0,i.jsx)(d.code,{children:".env"})," file."]}),"\n",(0,i.jsx)(d.h2,{id:"server",children:"SERVER"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Property"}),(0,i.jsx)(d.th,{children:"Description"}),(0,i.jsx)(d.th,{children:"Default"}),(0,i.jsx)(d.th,{children:"Possible Values"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"PUID"})}),(0,i.jsx)(d.td,{children:"The User-Identifer that should be used."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"1000"})}),(0,i.jsx)(d.td,{children:"Any user id (number)"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"PGID"})}),(0,i.jsx)(d.td,{children:"The Group-Identifer that should be used."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"1000"})}),(0,i.jsx)(d.td,{children:"Any group id (number)"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"SERVER_PORT"})}),(0,i.jsx)(d.td,{children:"The port the server should use. (Only relevant if the server is run without docker on bare metal.)"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"8080"})}),(0,i.jsx)(d.td,{children:"Any non-reserved free port (1024 to 49151)"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"SERVER_LOG_LEVEL"})}),(0,i.jsx)(d.td,{children:"The log level of the server."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"info"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"debug"}),", ",(0,i.jsx)(d.code,{children:"info"}),", ",(0,i.jsx)(d.code,{children:"warn"}),", ",(0,i.jsx)(d.code,{children:"error"}),", ",(0,i.jsx)(d.code,{children:"fatal"}),", ",(0,i.jsx)(d.code,{children:"off"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"SERVER_LOG_FILES_ENABLED"})}),(0,i.jsxs)(d.td,{children:["If the server should also write the logs to the ",(0,i.jsx)(d.code,{children:"VOLUMES_LOGS"})," directory via rolling file logger."]}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"true"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"SERVER_REQUEST_LOG_FORMAT"})}),(0,i.jsxs)(d.td,{children:["The ",(0,i.jsx)(d.a,{href:"https://www.npmjs.com/package/morgan#predefined-formats",children:"morgan log format"})," for incoming HTTP Requests"]}),(0,i.jsx)(d.td,{children:"Custom Log Format"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"short"}),", ",(0,i.jsx)(d.code,{children:"combined"})," ",(0,i.jsx)(d.a,{href:"https://www.npmjs.com/package/morgan#predefined-formats",children:"and many more"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"SERVER_CORS_ALLOWED_ORIGINS"})}),(0,i.jsx)(d.td,{children:"Allowed CORS origins for the server."}),(0,i.jsx)(d.td,{children:"All Origins"}),(0,i.jsx)(d.td,{children:"A comma-separated list of origins"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"SERVER_REGISTRATION_DISABLED"})}),(0,i.jsx)(d.td,{children:"If registration is enabled or not."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"false"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"SERVER_ACCOUNT_ACTIVATION_DISABLED"})}),(0,i.jsx)(d.td,{children:"If accounts need to be activated by an admin before using them."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"false"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"SERVER_ADMIN_USERNAME"})}),(0,i.jsxs)(d.td,{children:["Used for role recovery of existing users. The Server grants Admin Role to an existing User with this Username on register or startup. ",(0,i.jsx)(d.strong,{children:"\u26a0\ufe0f This won't register a new account!"})]}),(0,i.jsx)(d.td,{children:"-"}),(0,i.jsx)(d.td,{children:"Any username"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"SERVER_ADMIN_PASSWORD"})}),(0,i.jsxs)(d.td,{children:["Used for password recovery of existing users. Resets the password of the existing user with the username set in ",(0,i.jsx)(d.code,{children:"SERVER_ADMIN_USERNAME"})," to this password on startup. ",(0,i.jsx)(d.strong,{children:"\u26a0\ufe0f This won't register a new account!"})]}),(0,i.jsx)(d.td,{children:"-"}),(0,i.jsx)(d.td,{children:"Any password (No Length Validation)"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"SERVER_API_DOCS_ENABLED"})}),(0,i.jsxs)(d.td,{children:["Enables the API Documentation on ",(0,i.jsx)(d.code,{children:"/api/docs"}),", ",(0,i.jsx)(d.code,{children:"/api/docs-json"})," & ",(0,i.jsx)(d.code,{children:"/api/docs/yaml"}),"."]}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"false"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"SERVER_MAX_DOWNLOAD_BANDWIDTH_IN_KBPS"})}),(0,i.jsx)(d.td,{children:"Maximum bandwidth for downloads on this server in KB/s."}),(0,i.jsx)(d.td,{children:"- (Unlimited)"}),(0,i.jsx)(d.td,{children:"Any Number"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"SERVER_ONLINE_ACTIVITIES_DISABLED"})}),(0,i.jsx)(d.td,{children:'Whether or not the server should listen to online activities like "ONLINE", "BUSY", "PLAYING" etc. If this is set to true, all users will always be shown as offline.'}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"false"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"SERVER_STACK_TRACE_LIMIT"})}),(0,i.jsx)(d.td,{children:"Configures the maximum number of stack frames to display in error stack traces, with a higher value providing more detailed debugging information."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"10"})}),(0,i.jsx)(d.td,{children:"Any Number"})]})]})]}),"\n",(0,i.jsx)(d.h2,{id:"volumes",children:"VOLUMES"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Property"}),(0,i.jsx)(d.th,{children:"Description"}),(0,i.jsx)(d.th,{children:"Default"}),(0,i.jsx)(d.th,{children:"Possible Values"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"VOLUMES_CONFIG"})}),(0,i.jsx)(d.td,{children:"Folder inside container used for configuring GameVault."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/config"})}),(0,i.jsx)(d.td,{children:"Any valid folder path"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"VOLUMES_FILES"})}),(0,i.jsx)(d.td,{children:"Folder inside container used for game files."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/files"})}),(0,i.jsx)(d.td,{children:"Any valid folder path"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"VOLUMES_MEDIA"})}),(0,i.jsx)(d.td,{children:"Folder inside container used for media."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/media"})}),(0,i.jsx)(d.td,{children:"Any valid folder path"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"VOLUMES_LOGS"})}),(0,i.jsx)(d.td,{children:"Folder inside container used for logs."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/logs"})}),(0,i.jsx)(d.td,{children:"Any valid folder path"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"VOLUMES_SQLITEDB"})}),(0,i.jsxs)(d.td,{children:["Folder inside container used for ",(0,i.jsx)(d.code,{children:"SQLITE"})," database. (Not needed if ",(0,i.jsx)(d.code,{children:"DB_SYSTEM"})," is set to ",(0,i.jsx)(d.code,{children:"POSTGRESQL"}),")"]}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/db"})}),(0,i.jsx)(d.td,{children:"Any valid folder path"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"VOLUMES_PLUGINS"})}),(0,i.jsx)(d.td,{children:"Folder inside container used for plugins."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/plugins"})}),(0,i.jsx)(d.td,{children:"Any valid folder path"})]})]})]}),"\n",(0,i.jsx)(d.h2,{id:"db",children:"DB"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Property"}),(0,i.jsx)(d.th,{children:"Description"}),(0,i.jsx)(d.th,{children:"Default"}),(0,i.jsx)(d.th,{children:"Possible Values"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"DB_SYSTEM"})}),(0,i.jsx)(d.td,{children:"The database system used (POSTGRESQL or SQLITE)."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"POSTGRESQL"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"POSTGRESQL"}),", ",(0,i.jsx)(d.code,{children:"SQLITE"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"DB_HOST"})}),(0,i.jsx)(d.td,{children:"The host of the database (not needed for SQLITE)."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"localhost"})}),(0,i.jsx)(d.td,{children:"Any valid host name"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"DB_PORT"})}),(0,i.jsx)(d.td,{children:"The port of the database (not needed for SQLITE)."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"5432"})}),(0,i.jsx)(d.td,{children:"Any valid port number"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"DB_USERNAME"})}),(0,i.jsx)(d.td,{children:"The username for the database (not needed for SQLITE)."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"default"})}),(0,i.jsx)(d.td,{children:"Any valid username"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"DB_PASSWORD"})}),(0,i.jsx)(d.td,{children:"The password for the database (not needed for SQLITE)."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"default"})}),(0,i.jsx)(d.td,{children:"Any valid password"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"DB_DATABASE"})}),(0,i.jsx)(d.td,{children:"The database name (not needed for SQLITE)."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"gamevault"})}),(0,i.jsx)(d.td,{children:"Any valid database name"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"DB_DEBUG"})}),(0,i.jsx)(d.td,{children:"Log all SQL Statements sent to the database."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"false"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"DB_SYNCHRONIZE"})}),(0,i.jsx)(d.td,{children:"Force synchronizes the database with the entities. (This could break your database!)"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"false"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"DB_TLS_ENABLED"})}),(0,i.jsx)(d.td,{children:"Enables TLS for the database. (not needed for SQLITE)."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"false"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"DB_TLS_REJECT_UNAUTHORIZED_ENABLED"})}),(0,i.jsx)(d.td,{children:"Whether the database will reject TLS connections that do not present a valid, trusted certificate."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"false"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"DB_TLS_KEY_PATH"})}),(0,i.jsx)(d.td,{children:"The file path to the private key used for securing TLS connections to the database."}),(0,i.jsx)(d.td,{children:"-"}),(0,i.jsx)(d.td,{children:"Any file path"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"DB_TLS_CERTIFICATE_PATH"})}),(0,i.jsx)(d.td,{children:"The file path to the TLS certificate used for authenticating the database server."}),(0,i.jsx)(d.td,{children:"-"}),(0,i.jsx)(d.td,{children:"Any file path"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"DB_TLS_CA_CERTIFICATE_PATH"})}),(0,i.jsx)(d.td,{children:"The file path to the CA certificate used for verifying client certificates in TLS connections."}),(0,i.jsx)(d.td,{children:"-"}),(0,i.jsx)(d.td,{children:"Any file path"})]})]})]}),"\n",(0,i.jsx)(d.h2,{id:"users",children:"USERS"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Property"}),(0,i.jsx)(d.th,{children:"Description"}),(0,i.jsx)(d.th,{children:"Default"}),(0,i.jsx)(d.th,{children:"Possible Values"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"USERS_REQUIRE_EMAIL"})}),(0,i.jsxs)(d.td,{children:["Require ",(0,i.jsx)(d.strong,{children:"Email"})," for new registrations."]}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"false"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"USERS_REQUIRE_FIRST_NAME"})}),(0,i.jsxs)(d.td,{children:["Require ",(0,i.jsx)(d.strong,{children:"First Name"})," for new registrations."]}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"false"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"USERS_REQUIRE_LAST_NAME"})}),(0,i.jsxs)(d.td,{children:["Require ",(0,i.jsx)(d.strong,{children:"Last Name"})," for new registrations."]}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"false"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"USERS_REQUIRE_BIRTH_DATE"})}),(0,i.jsxs)(d.td,{children:["Require ",(0,i.jsx)(d.strong,{children:"Birth Date"})," for new registrations. (",(0,i.jsxs)(d.strong,{children:["Automatically set to ",(0,i.jsx)(d.code,{children:"true"})," when ",(0,i.jsx)(d.code,{children:"PARENTAL_AGE_RESTRICTION_ENABLED"})," is true"]}),")"]}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"false"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]})]})]}),"\n",(0,i.jsx)(d.h2,{id:"parental",children:"PARENTAL"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Property"}),(0,i.jsx)(d.th,{children:"Description"}),(0,i.jsx)(d.th,{children:"Default"}),(0,i.jsx)(d.th,{children:"Possible Values"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"PARENTAL_AGE_RESTRICTION_ENABLED"})}),(0,i.jsx)(d.td,{children:"Determines whether age-based parental restrictions are enforced."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"false"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"PARENTAL_AGE_OF_MAJORITY"})}),(0,i.jsx)(d.td,{children:"The age at which an individual is legally recognized as an adult for parental restrictions."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"18"})}),(0,i.jsx)(d.td,{children:"Any number"})]})]})]}),"\n",(0,i.jsx)(d.h2,{id:"games",children:"GAMES"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Property"}),(0,i.jsx)(d.th,{children:"Description"}),(0,i.jsx)(d.th,{children:"Default"}),(0,i.jsx)(d.th,{children:"Possible Values"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"GAMES_INDEX_INTERVAL_IN_MINUTES"})}),(0,i.jsx)(d.td,{children:"The index interval, measured in minutes, decides how frequently the server should check for changes in games in the /files directory. This used to be essential before we implemented the filewatcher to the server. Nowadays, it's optional for rare situations where the filewatcher might miss changes. If set to 0, it won't regularly trigger reindexing and solely depend on the filewatcher."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"60"})}),(0,i.jsx)(d.td,{children:"Any number"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"GAMES_SUPPORTED_FILE_FORMATS"})}),(0,i.jsx)(d.td,{children:"Comma-Seperated list of supported file-types GameVault should detect."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.a,{href:"/docs/server-docs/structure#supported-archive-formats",children:"All Supported Formats"})}),(0,i.jsx)(d.td,{children:'".zip,.7z,.rar"'})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"GAMES_SEARCH_RECURSIVE"})}),(0,i.jsx)(d.td,{children:"If indexer should search for games in subfolders."}),(0,i.jsx)(d.td,{children:"true"}),(0,i.jsx)(d.td,{children:'"true", "false'})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"GAMES_DEFAULT_ARCHIVE_PASSWORD"})}),(0,i.jsx)(d.td,{children:"A default password for archives. Useful if you always use the same password for your games and want Game Type Detection to work with the encrypted files. Without this game type detection on encrypted archives depends on the file extension and if the headers are encrypted"}),(0,i.jsx)(d.td,{children:'"Anything"'}),(0,i.jsx)(d.td,{children:"Any string"})]})]})]}),"\n",(0,i.jsx)(d.h2,{id:"media",children:"MEDIA"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Property"}),(0,i.jsx)(d.th,{children:"Description"}),(0,i.jsx)(d.th,{children:"Default"}),(0,i.jsx)(d.th,{children:"Possible Values"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"MEDIA_MAX_SIZE"})}),(0,i.jsx)(d.td,{children:"The maximum size for media uploads. Set it to 0 to disable media uploads."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"10 mb"})}),(0,i.jsx)(d.td,{children:'e.g. "10 mb", "5 gb", "300 kb"'})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"MEDIA_SUPPORTED_FORMATS"})}),(0,i.jsx)(d.td,{children:"List of supported media formats (MIME Types) on this server, separated by commas."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.a,{href:"/docs/server-docs/media#supported-formats",children:"See here"})}),(0,i.jsx)(d.td,{children:"Comma separated list of MIME Types."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"MEDIA_GC_DISABLED"})}),(0,i.jsx)(d.td,{children:"Whether or not media garbage collection is enabled. (Deletes unused media)"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"false"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"MEDIA_GC_INTERVAL_IN_MINUTES"})}),(0,i.jsx)(d.td,{children:"The interval in minutes for media garbage collection."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"60"})}),(0,i.jsx)(d.td,{children:"Any number"})]})]})]}),"\n",(0,i.jsx)(d.p,{children:"Here are the descriptions for the metadata properties:"}),"\n",(0,i.jsx)(d.h2,{id:"metadata",children:"METADATA"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Property"}),(0,i.jsx)(d.th,{children:"Description"}),(0,i.jsx)(d.th,{children:"Default"}),(0,i.jsx)(d.th,{children:"Possible Values"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"METADATA_TTL_IN_DAYS"})}),(0,i.jsx)(d.td,{children:"The number of days metadata is considered fresh before requiring an update."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"30"})}),(0,i.jsx)(d.td,{children:"Any number of days"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"METADATA_IGDB_ENABLED"})}),(0,i.jsx)(d.td,{children:"Enables or disables the built-in integration with IGDB for metadata retrieval."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"true"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"METADATA_IGDB_PRIORITY"})}),(0,i.jsx)(d.td,{children:"The priority level for IGDB metadata sources when multiple metadata sources are available."}),(0,i.jsx)(d.td,{children:"1"}),(0,i.jsx)(d.td,{children:"Any number"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"METADATA_IGDB_REQUEST_INTERVAL_MS"})}),(0,i.jsxs)(d.td,{children:["The interval, in milliseconds, to wait between consecutive requests to prevent exceeding rate limits. This delay will be applied ",(0,i.jsx)(d.strong,{children:"before"})," each call to the provider."]}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"250"})}),(0,i.jsx)(d.td,{children:"Any number"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"METADATA_IGDB_CLIENT_ID"})}),(0,i.jsx)(d.td,{children:"The Client-ID used for authenticating requests to the IGDB API."}),(0,i.jsx)(d.td,{children:"-"}),(0,i.jsx)(d.td,{children:"Your Client ID"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"METADATA_IGDB_CLIENT_SECRET"})}),(0,i.jsx)(d.td,{children:"The Client-Secret used for authenticating requests to the IGDB API."}),(0,i.jsx)(d.td,{children:"-"}),(0,i.jsx)(d.td,{children:"Your Client Secret"})]})]})]}),"\n",(0,i.jsx)(d.h2,{id:"testing",children:"TESTING"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Property"}),(0,i.jsx)(d.th,{children:"Description"}),(0,i.jsx)(d.th,{children:"Default"}),(0,i.jsx)(d.th,{children:"Possible Values"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"TESTING_AUTHENTICATION_DISABLED"})}),(0,i.jsxs)(d.td,{children:["If ",(0,i.jsx)(d.code,{children:"true"}),", the API will accept any auth header. Useful for testing without authentication."]}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"false"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"TESTING_MOCK_FILES"})}),(0,i.jsxs)(d.td,{children:["If ",(0,i.jsx)(d.code,{children:"true"}),", the server will mock all files or ignore filesystem functionalities. Useful for testing without real files."]}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"false"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"TESTING_IN_MEMORY_DB"})}),(0,i.jsxs)(d.td,{children:["If ",(0,i.jsx)(d.code,{children:"true"}),", the server will use an in-memory database. Useful for testing without creating an actual database. Only works with SQLITE."]}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"false"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"TESTING_MOCK_PROVIDERS"})}),(0,i.jsxs)(d.td,{children:["If ",(0,i.jsx)(d.code,{children:"true"}),", the server will create two mock providers. (-9999 and 9999 Priority) Useful for testing metadata-merges."]}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"false"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]})]})]})]})}function x(e={}){const{wrapper:d}={...(0,n.R)(),...e.components};return d?(0,i.jsx)(d,{...e,children:(0,i.jsx)(o,{...e})}):o(e)}},8591:(e,d,s)=>{s.d(d,{R:()=>t,x:()=>c});var r=s(758);const i={},n=r.createContext(i);function t(e){const d=r.useContext(n);return r.useMemo((function(){return"function"==typeof e?e(d):{...d,...e}}),[d,e])}function c(e){let d;return d=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),r.createElement(n.Provider,{value:d},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[3468],{3235:(e,d,s)=>{s.r(d),s.d(d,{assets:()=>l,contentTitle:()=>c,default:()=>x,frontMatter:()=>t,metadata:()=>r,toc:()=>h});const r=JSON.parse('{"id":"server-docs/configuration","title":"Configuration","description":"Check out configuration.ts for all possible environment variables in case we forgot to update this page.","source":"@site/docs/server-docs/configuration.md","sourceDirName":"server-docs","slug":"/server-docs/configuration","permalink":"/docs/server-docs/configuration","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/configuration.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"sidebarPosition":2,"frontMatter":{"sidebar_position":2},"sidebar":"docs","previous":{"title":"Using Native Approach","permalink":"/docs/server-docs/setup/native"},"next":{"title":"File and Folder Structure","permalink":"/docs/server-docs/structure"}}');var i=s(6070),n=s(8591);const t={sidebar_position:2},c="Configuration",l={},h=[{value:"Configuration Properties",id:"configuration-properties",level:2},{value:"SERVER",id:"server",level:2},{value:"VOLUMES",id:"volumes",level:2},{value:"DB",id:"db",level:2},{value:"USERS",id:"users",level:2},{value:"PARENTAL",id:"parental",level:2},{value:"GAMES",id:"games",level:2},{value:"MEDIA",id:"media",level:2},{value:"METADATA",id:"metadata",level:2},{value:"TESTING",id:"testing",level:2}];function o(e){const d={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(d.header,{children:(0,i.jsx)(d.h1,{id:"configuration",children:"Configuration"})}),"\n",(0,i.jsx)(d.admonition,{type:"tip",children:(0,i.jsxs)(d.p,{children:["Check out ",(0,i.jsx)(d.a,{href:"https://github.com/Phalcode/gamevault-backend/blob/master/src/configuration.ts",children:"configuration.ts"})," for all possible environment variables in case we forgot to update this page."]})}),"\n",(0,i.jsx)(d.p,{children:"All configuration properties of your GameVault server are passed as environment variables or via a .env file. The following tables describe the available properties, their default values, explanations, and possible values."}),"\n",(0,i.jsx)(d.h2,{id:"configuration-properties",children:"Configuration Properties"}),"\n",(0,i.jsxs)(d.p,{children:["This page describes the various configuration properties used in the application. These properties can be configured in the environment variables or in a ",(0,i.jsx)(d.code,{children:".env"})," file."]}),"\n",(0,i.jsx)(d.h2,{id:"server",children:"SERVER"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Property"}),(0,i.jsx)(d.th,{children:"Description"}),(0,i.jsx)(d.th,{children:"Default"}),(0,i.jsx)(d.th,{children:"Possible Values"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"PUID"})}),(0,i.jsx)(d.td,{children:"The User-Identifer that should be used."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"1000"})}),(0,i.jsx)(d.td,{children:"Any user id (number)"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"PGID"})}),(0,i.jsx)(d.td,{children:"The Group-Identifer that should be used."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"1000"})}),(0,i.jsx)(d.td,{children:"Any group id (number)"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"SERVER_PORT"})}),(0,i.jsx)(d.td,{children:"The port the server should use. (Only relevant if the server is run without docker on bare metal.)"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"8080"})}),(0,i.jsx)(d.td,{children:"Any non-reserved free port (1024 to 49151)"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"SERVER_LOG_LEVEL"})}),(0,i.jsx)(d.td,{children:"The log level of the server."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"info"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"debug"}),", ",(0,i.jsx)(d.code,{children:"info"}),", ",(0,i.jsx)(d.code,{children:"warn"}),", ",(0,i.jsx)(d.code,{children:"error"}),", ",(0,i.jsx)(d.code,{children:"fatal"}),", ",(0,i.jsx)(d.code,{children:"off"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"SERVER_LOG_FILES_ENABLED"})}),(0,i.jsxs)(d.td,{children:["If the server should also write the logs to the ",(0,i.jsx)(d.code,{children:"VOLUMES_LOGS"})," directory via rolling file logger."]}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"true"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"SERVER_REQUEST_LOG_FORMAT"})}),(0,i.jsxs)(d.td,{children:["The ",(0,i.jsx)(d.a,{href:"https://www.npmjs.com/package/morgan#predefined-formats",children:"morgan log format"})," for incoming HTTP Requests"]}),(0,i.jsx)(d.td,{children:"Custom Log Format"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"short"}),", ",(0,i.jsx)(d.code,{children:"combined"})," ",(0,i.jsx)(d.a,{href:"https://www.npmjs.com/package/morgan#predefined-formats",children:"and many more"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"SERVER_CORS_ALLOWED_ORIGINS"})}),(0,i.jsx)(d.td,{children:"Allowed CORS origins for the server."}),(0,i.jsx)(d.td,{children:"All Origins"}),(0,i.jsx)(d.td,{children:"A comma-separated list of origins"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"SERVER_REGISTRATION_DISABLED"})}),(0,i.jsx)(d.td,{children:"If registration is enabled or not."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"false"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"SERVER_ACCOUNT_ACTIVATION_DISABLED"})}),(0,i.jsx)(d.td,{children:"If accounts need to be activated by an admin before using them."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"false"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"SERVER_ADMIN_USERNAME"})}),(0,i.jsxs)(d.td,{children:["Used for role recovery of existing users. The Server grants Admin Role to an existing User with this Username on register or startup. ",(0,i.jsx)(d.strong,{children:"\u26a0\ufe0f This won't register a new account!"})]}),(0,i.jsx)(d.td,{children:"-"}),(0,i.jsx)(d.td,{children:"Any username"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"SERVER_ADMIN_PASSWORD"})}),(0,i.jsxs)(d.td,{children:["Used for password recovery of existing users. Resets the password of the existing user with the username set in ",(0,i.jsx)(d.code,{children:"SERVER_ADMIN_USERNAME"})," to this password on startup. ",(0,i.jsx)(d.strong,{children:"\u26a0\ufe0f This won't register a new account!"})]}),(0,i.jsx)(d.td,{children:"-"}),(0,i.jsx)(d.td,{children:"Any password (No Length Validation)"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"SERVER_API_DOCS_ENABLED"})}),(0,i.jsxs)(d.td,{children:["Enables the API Documentation on ",(0,i.jsx)(d.code,{children:"/api/docs"}),", ",(0,i.jsx)(d.code,{children:"/api/docs-json"})," & ",(0,i.jsx)(d.code,{children:"/api/docs/yaml"}),"."]}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"false"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"SERVER_MAX_DOWNLOAD_BANDWIDTH_IN_KBPS"})}),(0,i.jsx)(d.td,{children:"Maximum bandwidth for downloads on this server in KB/s."}),(0,i.jsx)(d.td,{children:"- (Unlimited)"}),(0,i.jsx)(d.td,{children:"Any Number"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"SERVER_ONLINE_ACTIVITIES_DISABLED"})}),(0,i.jsx)(d.td,{children:'Whether or not the server should listen to online activities like "ONLINE", "BUSY", "PLAYING" etc. If this is set to true, all users will always be shown as offline.'}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"false"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"SERVER_STACK_TRACE_LIMIT"})}),(0,i.jsx)(d.td,{children:"Configures the maximum number of stack frames to display in error stack traces, with a higher value providing more detailed debugging information."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"10"})}),(0,i.jsx)(d.td,{children:"Any Number"})]})]})]}),"\n",(0,i.jsx)(d.h2,{id:"volumes",children:"VOLUMES"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Property"}),(0,i.jsx)(d.th,{children:"Description"}),(0,i.jsx)(d.th,{children:"Default"}),(0,i.jsx)(d.th,{children:"Possible Values"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"VOLUMES_CONFIG"})}),(0,i.jsx)(d.td,{children:"Folder inside container used for configuring GameVault."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/config"})}),(0,i.jsx)(d.td,{children:"Any valid folder path"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"VOLUMES_FILES"})}),(0,i.jsx)(d.td,{children:"Folder inside container used for game files."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/files"})}),(0,i.jsx)(d.td,{children:"Any valid folder path"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"VOLUMES_MEDIA"})}),(0,i.jsx)(d.td,{children:"Folder inside container used for media."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/media"})}),(0,i.jsx)(d.td,{children:"Any valid folder path"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"VOLUMES_LOGS"})}),(0,i.jsx)(d.td,{children:"Folder inside container used for logs."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/logs"})}),(0,i.jsx)(d.td,{children:"Any valid folder path"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"VOLUMES_SQLITEDB"})}),(0,i.jsxs)(d.td,{children:["Folder inside container used for ",(0,i.jsx)(d.code,{children:"SQLITE"})," database. (Not needed if ",(0,i.jsx)(d.code,{children:"DB_SYSTEM"})," is set to ",(0,i.jsx)(d.code,{children:"POSTGRESQL"}),")"]}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/db"})}),(0,i.jsx)(d.td,{children:"Any valid folder path"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"VOLUMES_PLUGINS"})}),(0,i.jsx)(d.td,{children:"Folder inside container used for plugins."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"/plugins"})}),(0,i.jsx)(d.td,{children:"Any valid folder path"})]})]})]}),"\n",(0,i.jsx)(d.h2,{id:"db",children:"DB"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Property"}),(0,i.jsx)(d.th,{children:"Description"}),(0,i.jsx)(d.th,{children:"Default"}),(0,i.jsx)(d.th,{children:"Possible Values"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"DB_SYSTEM"})}),(0,i.jsx)(d.td,{children:"The database system used (POSTGRESQL or SQLITE)."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"POSTGRESQL"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"POSTGRESQL"}),", ",(0,i.jsx)(d.code,{children:"SQLITE"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"DB_HOST"})}),(0,i.jsx)(d.td,{children:"The host of the database (not needed for SQLITE)."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"localhost"})}),(0,i.jsx)(d.td,{children:"Any valid host name"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"DB_PORT"})}),(0,i.jsx)(d.td,{children:"The port of the database (not needed for SQLITE)."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"5432"})}),(0,i.jsx)(d.td,{children:"Any valid port number"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"DB_USERNAME"})}),(0,i.jsx)(d.td,{children:"The username for the database (not needed for SQLITE)."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"default"})}),(0,i.jsx)(d.td,{children:"Any valid username"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"DB_PASSWORD"})}),(0,i.jsx)(d.td,{children:"The password for the database (not needed for SQLITE)."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"default"})}),(0,i.jsx)(d.td,{children:"Any valid password"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"DB_DATABASE"})}),(0,i.jsx)(d.td,{children:"The database name (not needed for SQLITE)."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"gamevault"})}),(0,i.jsx)(d.td,{children:"Any valid database name"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"DB_DEBUG"})}),(0,i.jsx)(d.td,{children:"Log all SQL Statements sent to the database."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"false"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"DB_SYNCHRONIZE"})}),(0,i.jsx)(d.td,{children:"Force synchronizes the database with the entities. (This could break your database!)"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"false"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"DB_TLS_ENABLED"})}),(0,i.jsx)(d.td,{children:"Enables TLS for the database. (not needed for SQLITE)."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"false"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"DB_TLS_REJECT_UNAUTHORIZED_ENABLED"})}),(0,i.jsx)(d.td,{children:"Whether the database will reject TLS connections that do not present a valid, trusted certificate."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"false"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"DB_TLS_KEY_PATH"})}),(0,i.jsx)(d.td,{children:"The file path to the private key used for securing TLS connections to the database."}),(0,i.jsx)(d.td,{children:"-"}),(0,i.jsx)(d.td,{children:"Any file path"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"DB_TLS_CERTIFICATE_PATH"})}),(0,i.jsx)(d.td,{children:"The file path to the TLS certificate used for authenticating the database server."}),(0,i.jsx)(d.td,{children:"-"}),(0,i.jsx)(d.td,{children:"Any file path"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"DB_TLS_CA_CERTIFICATE_PATH"})}),(0,i.jsx)(d.td,{children:"The file path to the CA certificate used for verifying client certificates in TLS connections."}),(0,i.jsx)(d.td,{children:"-"}),(0,i.jsx)(d.td,{children:"Any file path"})]})]})]}),"\n",(0,i.jsx)(d.h2,{id:"users",children:"USERS"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Property"}),(0,i.jsx)(d.th,{children:"Description"}),(0,i.jsx)(d.th,{children:"Default"}),(0,i.jsx)(d.th,{children:"Possible Values"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"USERS_REQUIRE_EMAIL"})}),(0,i.jsxs)(d.td,{children:["Require ",(0,i.jsx)(d.strong,{children:"Email"})," for new registrations."]}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"false"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"USERS_REQUIRE_FIRST_NAME"})}),(0,i.jsxs)(d.td,{children:["Require ",(0,i.jsx)(d.strong,{children:"First Name"})," for new registrations."]}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"false"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"USERS_REQUIRE_LAST_NAME"})}),(0,i.jsxs)(d.td,{children:["Require ",(0,i.jsx)(d.strong,{children:"Last Name"})," for new registrations."]}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"false"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"USERS_REQUIRE_BIRTH_DATE"})}),(0,i.jsxs)(d.td,{children:["Require ",(0,i.jsx)(d.strong,{children:"Birth Date"})," for new registrations. (",(0,i.jsxs)(d.strong,{children:["Automatically set to ",(0,i.jsx)(d.code,{children:"true"})," when ",(0,i.jsx)(d.code,{children:"PARENTAL_AGE_RESTRICTION_ENABLED"})," is true"]}),")"]}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"false"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]})]})]}),"\n",(0,i.jsx)(d.h2,{id:"parental",children:"PARENTAL"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Property"}),(0,i.jsx)(d.th,{children:"Description"}),(0,i.jsx)(d.th,{children:"Default"}),(0,i.jsx)(d.th,{children:"Possible Values"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"PARENTAL_AGE_RESTRICTION_ENABLED"})}),(0,i.jsx)(d.td,{children:"Determines whether age-based parental restrictions are enforced."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"false"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"PARENTAL_AGE_OF_MAJORITY"})}),(0,i.jsx)(d.td,{children:"The age at which an individual is legally recognized as an adult for parental restrictions."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"18"})}),(0,i.jsx)(d.td,{children:"Any number"})]})]})]}),"\n",(0,i.jsx)(d.h2,{id:"games",children:"GAMES"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Property"}),(0,i.jsx)(d.th,{children:"Description"}),(0,i.jsx)(d.th,{children:"Default"}),(0,i.jsx)(d.th,{children:"Possible Values"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"GAMES_INDEX_INTERVAL_IN_MINUTES"})}),(0,i.jsx)(d.td,{children:"The index interval, measured in minutes, decides how frequently the server should check for changes in games in the /files directory. This used to be essential before we implemented the filewatcher to the server. Nowadays, it's optional for rare situations where the filewatcher might miss changes. If set to 0, it won't regularly trigger reindexing and solely depend on the filewatcher."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"60"})}),(0,i.jsx)(d.td,{children:"Any number"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"GAMES_SUPPORTED_FILE_FORMATS"})}),(0,i.jsx)(d.td,{children:"Comma-Seperated list of supported file-types GameVault should detect."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.a,{href:"/docs/server-docs/structure#supported-archive-formats",children:"All Supported Formats"})}),(0,i.jsx)(d.td,{children:'".zip,.7z,.rar"'})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"GAMES_SEARCH_RECURSIVE"})}),(0,i.jsx)(d.td,{children:"If indexer should search for games in subfolders."}),(0,i.jsx)(d.td,{children:"true"}),(0,i.jsx)(d.td,{children:'"true", "false'})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"GAMES_DEFAULT_ARCHIVE_PASSWORD"})}),(0,i.jsx)(d.td,{children:"A default password for archives. Useful if you always use the same password for your games and want Game Type Detection to work with the encrypted files. Without this game type detection on encrypted archives depends on the file extension and if the headers are encrypted"}),(0,i.jsx)(d.td,{children:'"Anything"'}),(0,i.jsx)(d.td,{children:"Any string"})]})]})]}),"\n",(0,i.jsx)(d.h2,{id:"media",children:"MEDIA"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Property"}),(0,i.jsx)(d.th,{children:"Description"}),(0,i.jsx)(d.th,{children:"Default"}),(0,i.jsx)(d.th,{children:"Possible Values"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"MEDIA_MAX_SIZE"})}),(0,i.jsx)(d.td,{children:"The maximum size for media uploads. Set it to 0 to disable media uploads."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"10 mb"})}),(0,i.jsx)(d.td,{children:'e.g. "10 mb", "5 gb", "300 kb"'})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"MEDIA_SUPPORTED_FORMATS"})}),(0,i.jsx)(d.td,{children:"List of supported media formats (MIME Types) on this server, separated by commas."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.a,{href:"/docs/server-docs/media#supported-formats",children:"See here"})}),(0,i.jsx)(d.td,{children:"Comma separated list of MIME Types."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"MEDIA_GC_DISABLED"})}),(0,i.jsx)(d.td,{children:"Whether or not media garbage collection is enabled. (Deletes unused media)"}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"false"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"MEDIA_GC_INTERVAL_IN_MINUTES"})}),(0,i.jsx)(d.td,{children:"The interval in minutes for media garbage collection."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"60"})}),(0,i.jsx)(d.td,{children:"Any number"})]})]})]}),"\n",(0,i.jsx)(d.p,{children:"Here are the descriptions for the metadata properties:"}),"\n",(0,i.jsx)(d.h2,{id:"metadata",children:"METADATA"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Property"}),(0,i.jsx)(d.th,{children:"Description"}),(0,i.jsx)(d.th,{children:"Default"}),(0,i.jsx)(d.th,{children:"Possible Values"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"METADATA_TTL_IN_DAYS"})}),(0,i.jsx)(d.td,{children:"The number of days metadata is considered fresh before requiring an update."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"30"})}),(0,i.jsx)(d.td,{children:"Any number of days"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"METADATA_IGDB_ENABLED"})}),(0,i.jsx)(d.td,{children:"Enables or disables the built-in integration with IGDB for metadata retrieval."}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"true"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"METADATA_IGDB_PRIORITY"})}),(0,i.jsx)(d.td,{children:"The priority level for IGDB metadata sources when multiple metadata sources are available."}),(0,i.jsx)(d.td,{children:"1"}),(0,i.jsx)(d.td,{children:"Any number"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"METADATA_IGDB_REQUEST_INTERVAL_MS"})}),(0,i.jsxs)(d.td,{children:["The interval, in milliseconds, to wait between consecutive requests to prevent exceeding rate limits. This delay will be applied ",(0,i.jsx)(d.strong,{children:"before"})," each call to the provider."]}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"250"})}),(0,i.jsx)(d.td,{children:"Any number"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"METADATA_IGDB_CLIENT_ID"})}),(0,i.jsx)(d.td,{children:"The Client-ID used for authenticating requests to the IGDB API."}),(0,i.jsx)(d.td,{children:"-"}),(0,i.jsx)(d.td,{children:"Your Client ID"})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"METADATA_IGDB_CLIENT_SECRET"})}),(0,i.jsx)(d.td,{children:"The Client-Secret used for authenticating requests to the IGDB API."}),(0,i.jsx)(d.td,{children:"-"}),(0,i.jsx)(d.td,{children:"Your Client Secret"})]})]})]}),"\n",(0,i.jsx)(d.h2,{id:"testing",children:"TESTING"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Property"}),(0,i.jsx)(d.th,{children:"Description"}),(0,i.jsx)(d.th,{children:"Default"}),(0,i.jsx)(d.th,{children:"Possible Values"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"TESTING_AUTHENTICATION_DISABLED"})}),(0,i.jsxs)(d.td,{children:["If ",(0,i.jsx)(d.code,{children:"true"}),", the API will accept any auth header. Useful for testing without authentication."]}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"false"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"TESTING_MOCK_FILES"})}),(0,i.jsxs)(d.td,{children:["If ",(0,i.jsx)(d.code,{children:"true"}),", the server will mock all files or ignore filesystem functionalities. Useful for testing without real files."]}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"false"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"TESTING_IN_MEMORY_DB"})}),(0,i.jsxs)(d.td,{children:["If ",(0,i.jsx)(d.code,{children:"true"}),", the server will use an in-memory database. Useful for testing without creating an actual database. Only works with SQLITE."]}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"false"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"TESTING_MOCK_PROVIDERS"})}),(0,i.jsxs)(d.td,{children:["If ",(0,i.jsx)(d.code,{children:"true"}),", the server will create two mock providers. (-9999 and 9999 Priority) Useful for testing metadata-merges."]}),(0,i.jsx)(d.td,{children:(0,i.jsx)(d.code,{children:"false"})}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.code,{children:"true"}),", ",(0,i.jsx)(d.code,{children:"false"})]})]})]})]})]})}function x(e={}){const{wrapper:d}={...(0,n.R)(),...e.components};return d?(0,i.jsx)(d,{...e,children:(0,i.jsx)(o,{...e})}):o(e)}},8591:(e,d,s)=>{s.d(d,{R:()=>t,x:()=>c});var r=s(758);const i={},n=r.createContext(i);function t(e){const d=r.useContext(n);return r.useMemo((function(){return"function"==typeof e?e(d):{...d,...e}}),[d,e])}function c(e){let d;return d=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),r.createElement(n.Provider,{value:d},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b4068411.f54f12be.js b/assets/js/b4068411.ed94df47.js similarity index 99% rename from assets/js/b4068411.f54f12be.js rename to assets/js/b4068411.ed94df47.js index 10b013cb2..0cac05254 100644 --- a/assets/js/b4068411.f54f12be.js +++ b/assets/js/b4068411.ed94df47.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[7881],{8079:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"server-docs/setup/caprover","title":"Using CapRover","description":"CapRover is an open-source platform that simplifies the deployment and management of web applications through containerization, providing a user-friendly interface for developers.","source":"@site/docs/server-docs/setup/caprover.md","sourceDirName":"server-docs/setup","slug":"/server-docs/setup/caprover","permalink":"/docs/server-docs/setup/caprover","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/setup/caprover.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"sidebarPosition":3,"frontMatter":{"title":"Using CapRover","sidebar_position":3},"sidebar":"docs","previous":{"title":"Using Docker Compose","permalink":"/docs/server-docs/setup/docker-compose"},"next":{"title":"Using TrueNAS Scale (prior v24.10)","permalink":"/docs/server-docs/setup/truenas-scale-legacy"}}');var n=o(6070),r=o(8591);const a={title:"Using CapRover",sidebar_position:3},i=void 0,p={},c=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Step 1: Log in to your CapRover Dashboard",id:"step-1-log-in-to-your-caprover-dashboard",level:2},{value:"Step 2: Navigate to the One-Click-Apps/Databases",id:"step-2-navigate-to-the-one-click-appsdatabases",level:2},{value:"Step 3: Connect Phalcode's third-party repository",id:"step-3-connect-phalcodes-third-party-repository",level:2},{value:"Step 4: Install our GameVault One-Click-App",id:"step-4-install-our-gamevault-one-click-app",level:2},{value:"Step 5: Enable WebSocket Support",id:"step-5-enable-websocket-support",level:2},{value:"Step 6: Configuring Volumes",id:"step-6-configuring-volumes",level:2},{value:"Conclusion",id:"conclusion",level:2},{value:"Additional Info",id:"additional-info",level:2},{value:"Stopping the Server",id:"stopping-the-server",level:3},{value:"Reading the Logs",id:"reading-the-logs",level:3}];function l(e){const t={a:"a",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://caprover.com",children:"CapRover"})," is an open-source platform that simplifies the deployment and management of web applications through containerization, providing a user-friendly interface for developers."]}),"\n",(0,n.jsxs)(t.p,{children:["Setting up a GameVault Server on CapRover is just a click away because we have created a CapRover ",(0,n.jsx)(t.a,{href:"https://caprover.com/docs/one-click-apps.html",children:"One-Click-App"})," Integration for this purpose. However, our app hasn't gained enough prominence to be included in the official ",(0,n.jsx)(t.a,{href:"https://caprover.com/docs/one-click-apps.html",children:"One-Click-App"})," Repository of CapRover. So, we decided to create our own ",(0,n.jsx)(t.a,{href:"https://github.com/Phalcode/caprover-one-click-apps",children:"third-party repository"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["In this guide, you will learn how to connect to our ",(0,n.jsx)(t.a,{href:"https://github.com/Phalcode/caprover-one-click-apps",children:"third-party repository"})," and install GameVault on your CapRover Instance."]}),"\n",(0,n.jsx)(t.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["A running ",(0,n.jsx)(t.a,{href:"https://caprover.com",children:"CapRover"})," Server"]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"step-1-log-in-to-your-caprover-dashboard",children:"Step 1: Log in to your CapRover Dashboard"}),"\n",(0,n.jsx)(t.p,{children:"Log in to your CapRover dashboard."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Step 1",src:o(9067).A+"",width:"1917",height:"1038"})}),"\n",(0,n.jsx)(t.h2,{id:"step-2-navigate-to-the-one-click-appsdatabases",children:"Step 2: Navigate to the One-Click-Apps/Databases"}),"\n",(0,n.jsx)(t.p,{children:'Go to "Apps" and click on "One-Click Apps/Databases."'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Step 2",src:o(736).A+"",width:"1896",height:"558"})}),"\n",(0,n.jsx)(t.h2,{id:"step-3-connect-phalcodes-third-party-repository",children:"Step 3: Connect Phalcode's third-party repository"}),"\n",(0,n.jsxs)(t.p,{children:['Scroll down to the bottom. Under "3rd party repositories," copy and paste the following link: ',(0,n.jsx)(t.code,{children:"https://phalcode.github.io/caprover-one-click-apps"}),'. Click the "Connect New Repository" button.']}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Step 3",src:o(5209).A+"",width:"1885",height:"1021"})}),"\n",(0,n.jsx)(t.h2,{id:"step-4-install-our-gamevault-one-click-app",children:"Step 4: Install our GameVault One-Click-App"}),"\n",(0,n.jsx)(t.p,{children:"Now, all you need to do is search for 'GameVault' using the search box and follow the installation wizard."}),"\n",(0,n.jsx)(t.p,{children:"If you can't find GameVault in the list, try reloading the page and search again."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Step 4",src:o(5126).A+"",width:"1895",height:"1044"})}),"\n",(0,n.jsx)(t.h2,{id:"step-5-enable-websocket-support",children:"Step 5: Enable WebSocket Support"}),"\n",(0,n.jsx)(t.p,{children:'Go to "Apps" and click on the GameVault App you just created. Make sure WebSocket Support is enabled.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Step 5",src:o(2063).A+"",width:"1896",height:"1039"})}),"\n",(0,n.jsx)(t.h2,{id:"step-6-configuring-volumes",children:"Step 6: Configuring Volumes"}),"\n",(0,n.jsx)(t.p,{children:"Configure your mounted volumes as you like."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Step 6",src:o(5204).A+"",width:"1896",height:"815"})}),"\n",(0,n.jsx)(t.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,n.jsx)(t.p,{children:"You have now successfully set up your GameVault Server using CapRover."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.a,{href:"/docs/server-docs/setup/#what-next",children:"Click here to continue."})}),"\n",(0,n.jsx)(t.h2,{id:"additional-info",children:"Additional Info"}),"\n",(0,n.jsx)(t.h3,{id:"stopping-the-server",children:"Stopping the Server"}),"\n",(0,n.jsx)(t.p,{children:'Navigate to "Apps" and select the GameVault App you have created.'}),"\n",(0,n.jsx)(t.p,{children:'Click on "App Configs".'}),"\n",(0,n.jsx)(t.p,{children:'Set "Instance Count" to 0.'}),"\n",(0,n.jsx)(t.h3,{id:"reading-the-logs",children:"Reading the Logs"}),"\n",(0,n.jsx)(t.p,{children:'Navigate to "Apps" and choose the GameVault App you have created.'}),"\n",(0,n.jsx)(t.p,{children:'Click on "Deployment".'}),"\n",(0,n.jsx)(t.p,{children:'You should now see the logs. If needed, click on "View App Logs" first.'})]})}function d(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},9067:(e,t,o)=>{o.d(t,{A:()=>s});const s=o.p+"assets/images/caprover1-b2e08c5a64d4fc667209502af5bd7d18.png"},736:(e,t,o)=>{o.d(t,{A:()=>s});const s=o.p+"assets/images/caprover2-1ad3c8c65512162cf8b296ad9696ef97.png"},5209:(e,t,o)=>{o.d(t,{A:()=>s});const s=o.p+"assets/images/caprover3-61b95eef2e0c46c890e880b0f4958e52.png"},5126:(e,t,o)=>{o.d(t,{A:()=>s});const s=o.p+"assets/images/caprover4-282b9233c452d0493f0e290320b23fa2.png"},2063:(e,t,o)=>{o.d(t,{A:()=>s});const s=o.p+"assets/images/caprover5-7c38f01362e6e9aaf3bab20273c7c82d.png"},5204:(e,t,o)=>{o.d(t,{A:()=>s});const s=o.p+"assets/images/caprover6-9b25099f9bb4f31ace08f01a557a69c5.png"},8591:(e,t,o)=>{o.d(t,{R:()=>a,x:()=>i});var s=o(758);const n={},r=s.createContext(n);function a(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[7881],{8079:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"server-docs/setup/caprover","title":"Using CapRover","description":"CapRover is an open-source platform that simplifies the deployment and management of web applications through containerization, providing a user-friendly interface for developers.","source":"@site/docs/server-docs/setup/caprover.md","sourceDirName":"server-docs/setup","slug":"/server-docs/setup/caprover","permalink":"/docs/server-docs/setup/caprover","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/setup/caprover.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"sidebarPosition":3,"frontMatter":{"title":"Using CapRover","sidebar_position":3},"sidebar":"docs","previous":{"title":"Using Docker Compose","permalink":"/docs/server-docs/setup/docker-compose"},"next":{"title":"Using TrueNAS Scale (prior v24.10)","permalink":"/docs/server-docs/setup/truenas-scale-legacy"}}');var n=o(6070),r=o(8591);const a={title:"Using CapRover",sidebar_position:3},i=void 0,p={},c=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Step 1: Log in to your CapRover Dashboard",id:"step-1-log-in-to-your-caprover-dashboard",level:2},{value:"Step 2: Navigate to the One-Click-Apps/Databases",id:"step-2-navigate-to-the-one-click-appsdatabases",level:2},{value:"Step 3: Connect Phalcode's third-party repository",id:"step-3-connect-phalcodes-third-party-repository",level:2},{value:"Step 4: Install our GameVault One-Click-App",id:"step-4-install-our-gamevault-one-click-app",level:2},{value:"Step 5: Enable WebSocket Support",id:"step-5-enable-websocket-support",level:2},{value:"Step 6: Configuring Volumes",id:"step-6-configuring-volumes",level:2},{value:"Conclusion",id:"conclusion",level:2},{value:"Additional Info",id:"additional-info",level:2},{value:"Stopping the Server",id:"stopping-the-server",level:3},{value:"Reading the Logs",id:"reading-the-logs",level:3}];function l(e){const t={a:"a",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://caprover.com",children:"CapRover"})," is an open-source platform that simplifies the deployment and management of web applications through containerization, providing a user-friendly interface for developers."]}),"\n",(0,n.jsxs)(t.p,{children:["Setting up a GameVault Server on CapRover is just a click away because we have created a CapRover ",(0,n.jsx)(t.a,{href:"https://caprover.com/docs/one-click-apps.html",children:"One-Click-App"})," Integration for this purpose. However, our app hasn't gained enough prominence to be included in the official ",(0,n.jsx)(t.a,{href:"https://caprover.com/docs/one-click-apps.html",children:"One-Click-App"})," Repository of CapRover. So, we decided to create our own ",(0,n.jsx)(t.a,{href:"https://github.com/Phalcode/caprover-one-click-apps",children:"third-party repository"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["In this guide, you will learn how to connect to our ",(0,n.jsx)(t.a,{href:"https://github.com/Phalcode/caprover-one-click-apps",children:"third-party repository"})," and install GameVault on your CapRover Instance."]}),"\n",(0,n.jsx)(t.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["A running ",(0,n.jsx)(t.a,{href:"https://caprover.com",children:"CapRover"})," Server"]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"step-1-log-in-to-your-caprover-dashboard",children:"Step 1: Log in to your CapRover Dashboard"}),"\n",(0,n.jsx)(t.p,{children:"Log in to your CapRover dashboard."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Step 1",src:o(9067).A+"",width:"1917",height:"1038"})}),"\n",(0,n.jsx)(t.h2,{id:"step-2-navigate-to-the-one-click-appsdatabases",children:"Step 2: Navigate to the One-Click-Apps/Databases"}),"\n",(0,n.jsx)(t.p,{children:'Go to "Apps" and click on "One-Click Apps/Databases."'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Step 2",src:o(736).A+"",width:"1896",height:"558"})}),"\n",(0,n.jsx)(t.h2,{id:"step-3-connect-phalcodes-third-party-repository",children:"Step 3: Connect Phalcode's third-party repository"}),"\n",(0,n.jsxs)(t.p,{children:['Scroll down to the bottom. Under "3rd party repositories," copy and paste the following link: ',(0,n.jsx)(t.code,{children:"https://phalcode.github.io/caprover-one-click-apps"}),'. Click the "Connect New Repository" button.']}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Step 3",src:o(5209).A+"",width:"1885",height:"1021"})}),"\n",(0,n.jsx)(t.h2,{id:"step-4-install-our-gamevault-one-click-app",children:"Step 4: Install our GameVault One-Click-App"}),"\n",(0,n.jsx)(t.p,{children:"Now, all you need to do is search for 'GameVault' using the search box and follow the installation wizard."}),"\n",(0,n.jsx)(t.p,{children:"If you can't find GameVault in the list, try reloading the page and search again."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Step 4",src:o(5126).A+"",width:"1895",height:"1044"})}),"\n",(0,n.jsx)(t.h2,{id:"step-5-enable-websocket-support",children:"Step 5: Enable WebSocket Support"}),"\n",(0,n.jsx)(t.p,{children:'Go to "Apps" and click on the GameVault App you just created. Make sure WebSocket Support is enabled.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Step 5",src:o(2063).A+"",width:"1896",height:"1039"})}),"\n",(0,n.jsx)(t.h2,{id:"step-6-configuring-volumes",children:"Step 6: Configuring Volumes"}),"\n",(0,n.jsx)(t.p,{children:"Configure your mounted volumes as you like."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Step 6",src:o(5204).A+"",width:"1896",height:"815"})}),"\n",(0,n.jsx)(t.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,n.jsx)(t.p,{children:"You have now successfully set up your GameVault Server using CapRover."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.a,{href:"/docs/server-docs/setup/#what-next",children:"Click here to continue."})}),"\n",(0,n.jsx)(t.h2,{id:"additional-info",children:"Additional Info"}),"\n",(0,n.jsx)(t.h3,{id:"stopping-the-server",children:"Stopping the Server"}),"\n",(0,n.jsx)(t.p,{children:'Navigate to "Apps" and select the GameVault App you have created.'}),"\n",(0,n.jsx)(t.p,{children:'Click on "App Configs".'}),"\n",(0,n.jsx)(t.p,{children:'Set "Instance Count" to 0.'}),"\n",(0,n.jsx)(t.h3,{id:"reading-the-logs",children:"Reading the Logs"}),"\n",(0,n.jsx)(t.p,{children:'Navigate to "Apps" and choose the GameVault App you have created.'}),"\n",(0,n.jsx)(t.p,{children:'Click on "Deployment".'}),"\n",(0,n.jsx)(t.p,{children:'You should now see the logs. If needed, click on "View App Logs" first.'})]})}function d(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},9067:(e,t,o)=>{o.d(t,{A:()=>s});const s=o.p+"assets/images/caprover1-b2e08c5a64d4fc667209502af5bd7d18.png"},736:(e,t,o)=>{o.d(t,{A:()=>s});const s=o.p+"assets/images/caprover2-1ad3c8c65512162cf8b296ad9696ef97.png"},5209:(e,t,o)=>{o.d(t,{A:()=>s});const s=o.p+"assets/images/caprover3-61b95eef2e0c46c890e880b0f4958e52.png"},5126:(e,t,o)=>{o.d(t,{A:()=>s});const s=o.p+"assets/images/caprover4-282b9233c452d0493f0e290320b23fa2.png"},2063:(e,t,o)=>{o.d(t,{A:()=>s});const s=o.p+"assets/images/caprover5-7c38f01362e6e9aaf3bab20273c7c82d.png"},5204:(e,t,o)=>{o.d(t,{A:()=>s});const s=o.p+"assets/images/caprover6-9b25099f9bb4f31ace08f01a557a69c5.png"},8591:(e,t,o)=>{o.d(t,{R:()=>a,x:()=>i});var s=o(758);const n={},r=s.createContext(n);function a(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b8ecf3c5.d841fe79.js b/assets/js/b8ecf3c5.0278f32c.js similarity index 99% rename from assets/js/b8ecf3c5.d841fe79.js rename to assets/js/b8ecf3c5.0278f32c.js index 4af8f7673..d02735e21 100644 --- a/assets/js/b8ecf3c5.d841fe79.js +++ b/assets/js/b8ecf3c5.0278f32c.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[7508],{5905:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"client-docs/setup","title":"Setting up a GameVault Client","description":"If you want to use GameVault to download and install games on your computer, you need to follow these steps.","source":"@site/docs/client-docs/setup.md","sourceDirName":"client-docs","slug":"/client-docs/setup","permalink":"/docs/client-docs/setup","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/client-docs/setup.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"sidebarPosition":1,"frontMatter":{"sidebar_position":1},"sidebar":"docs","previous":{"title":"Server News","permalink":"/docs/server-docs/server-news"},"next":{"title":"How to Use","permalink":"/docs/client-docs/how-to-use"}}');var i=t(6070),l=t(8591);const s={sidebar_position:1},r="Setting up a GameVault Client",a={},d=[{value:"Installation",id:"installation",level:2},{value:"Recommended Installation Option",id:"recommended-installation-option",level:3},{value:"Alternative Installation Options",id:"alternative-installation-options",level:3},{value:"Option 1: Obtain Pre-Built Artifacts from Github",id:"option-1-obtain-pre-built-artifacts-from-github",level:4},{value:"Option 2: Linux Installation",id:"option-2-linux-installation",level:4},{value:"Option 3: Self-Compiling on Windows",id:"option-3-self-compiling-on-windows",level:4},{value:"Option 4: Extracting from the .appxbundle",id:"option-4-extracting-from-the-appxbundle",level:4},{value:"Initial Configuration",id:"initial-configuration",level:2},{value:"Step 1: Select the Root Folder",id:"step-1-select-the-root-folder",level:3},{value:"Step 2: Entering the Selfhosted Backend Server URL",id:"step-2-entering-the-selfhosted-backend-server-url",level:3},{value:"Option 1: Self-hosted GameVault Server",id:"option-1-self-hosted-gamevault-server",level:4},{value:"Option 2: Using the Demo Server",id:"option-2-using-the-demo-server",level:4},{value:"Step 3: Log In or Register",id:"step-3-log-in-or-register",level:3},{value:"Option 1: Login",id:"option-1-login",level:4},{value:"Option 2: Register",id:"option-2-register",level:4},{value:"Conclusion",id:"conclusion",level:2}];function c(e){const n={a:"a",admonition:"admonition",br:"br",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,l.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"setting-up-a-gamevault-client",children:"Setting up a GameVault Client"})}),"\n",(0,i.jsx)(n.p,{children:"If you want to use GameVault to download and install games on your computer, you need to follow these steps."}),"\n",(0,i.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,i.jsx)(n.h3,{id:"recommended-installation-option",children:"Recommended Installation Option"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Requirement:"})," Windows 10/11 Operating System with Microsoft Store installed"]}),"\n",(0,i.jsxs)(n.p,{children:["To begin, install the GameVault application from ",(0,i.jsx)(n.a,{href:"https://www.microsoft.com/store/apps/9PCKDV76GL75",children:"the official Microsoft Store"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Experienced users can also simply run this command in the PowerShell:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-ps",children:"winget install gamevault\n"})}),"\n",(0,i.jsxs)(n.p,{children:["This process should be straightforward and will only consume a few minutes of your time. After installing, feel free to continue at ",(0,i.jsx)(n.a,{href:"#initial-configuration",children:"Initial Configuration"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"alternative-installation-options",children:"Alternative Installation Options"}),"\n",(0,i.jsx)(n.p,{children:"If you for some reason prefer not to use the Microsoft Store or if you are operating on a different platform, there are multiple other methods available for installing the GameVault Client Application."}),"\n",(0,i.jsx)(n.admonition,{type:"warning",children:(0,i.jsxs)(n.p,{children:["Please not that any other method than installing it from the Microsoft Store is ",(0,i.jsx)(n.strong,{children:"unsupported"})," and ",(0,i.jsx)(n.strong,{children:"unrecommended"})," and should only be used as a last resort. Also be aware ",(0,i.jsx)(n.a,{href:"/docs/client-docs/updating-client#other-sources",children:"that you will be responsible for managing updates manually!"})]})}),"\n",(0,i.jsx)(n.h4,{id:"option-1-obtain-pre-built-artifacts-from-github",children:"Option 1: Obtain Pre-Built Artifacts from Github"}),"\n",(0,i.jsxs)(n.p,{children:["Access the most recent Pre-Built Artifact ",(0,i.jsx)(n.a,{href:"https://github.com/Phalcode/gamevault-app/releases/latest",children:"here."})]}),"\n",(0,i.jsx)(n.admonition,{title:"Antivirus/Smartscreen Warning",type:"note",children:(0,i.jsxs)(n.p,{children:["Your Antivirus or Windows Smartscreen may attempt to prevent you from running our pre-built application, because it is a suspicious-looking binary compiled by an unfamiliar source. This is because we lack a Code Signing Certificate due to budget constraints. You can safely disregard this warning and proceed to run the App by selecting ",(0,i.jsx)(n.code,{children:"More Details"})," and then choosing ",(0,i.jsx)(n.code,{children:"Run Anyway"}),"."]})}),"\n",(0,i.jsx)(n.h4,{id:"option-2-linux-installation",children:"Option 2: Linux Installation"}),"\n",(0,i.jsxs)(n.p,{children:["To run GameVault on Linux utilizing Wine, follow this community-driven method. Visit ",(0,i.jsx)(n.a,{href:"/docs/advanced-usage/linux-client",children:"this"})," page for more details."]}),"\n",(0,i.jsx)(n.h4,{id:"option-3-self-compiling-on-windows",children:"Option 3: Self-Compiling on Windows"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Install Visual Studio IDE"}),"\n",(0,i.jsx)(n.li,{children:"Include the 2017 build system"}),"\n",(0,i.jsx)(n.li,{children:"Clone the gamevault-app source code"}),"\n",(0,i.jsxs)(n.li,{children:["Open Visual Studio and choose the ",(0,i.jsx)(n.code,{children:".sln"})," file"]}),"\n",(0,i.jsxs)(n.li,{children:["Pick ",(0,i.jsx)(n.code,{children:"Release"})," from the Dropdown menu."]}),"\n",(0,i.jsx)(n.li,{children:"Build > Build gamevault"}),"\n",(0,i.jsx)(n.li,{children:"Utilize the output files."}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"option-4-extracting-from-the-appxbundle",children:"Option 4: Extracting from the .appxbundle"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Go to ",(0,i.jsx)(n.a,{href:"https://store.rg-adguard.net",children:"https://store.rg-adguard.net"})]}),"\n",(0,i.jsxs)(n.li,{children:["Paste ",(0,i.jsx)(n.code,{children:"https://www.microsoft.com/store/apps/9PCKDV76GL75"})," in the search box"]}),"\n",(0,i.jsx)(n.li,{children:"Download the current .appxbundle"}),"\n",(0,i.jsxs)(n.li,{children:["Extract the .appxbundle, followed by the ",(0,i.jsx)(n.code,{children:"ReleasePackage_[VERSION]_x64.appx"})," file."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"initial-configuration",children:"Initial Configuration"}),"\n",(0,i.jsx)(n.p,{children:"Once you have installed and launched GameVault, you need to do some initial configuration to get it up and running properly."}),"\n",(0,i.jsx)(n.h3,{id:"step-1-select-the-root-folder",children:"Step 1: Select the Root Folder"}),"\n",(0,i.jsxs)(n.p,{children:["In this step, you will choose the location where all your downloaded and installed games will be stored. This folder will act as the central location for your game library. We recommend you to have a read on the ",(0,i.jsx)(n.a,{href:"/docs/client-docs/how-to-use",children:'"How to Use" Chapter'})," to understand how the root folder works."]}),"\n",(0,i.jsx)(n.p,{children:"To select the root folder, follow the instructions below:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:'Click the "Select Root Path" button.'}),"\n",(0,i.jsx)(n.li,{children:"Navigate to the desired location on your computer."}),"\n",(0,i.jsx)(n.li,{children:"Choose a folder with sufficient storage space to store your game collection."}),"\n",(0,i.jsx)(n.li,{children:'Once you have selected the folder, click "Next" to proceed.'}),"\n",(0,i.jsxs)(n.li,{children:["GameVault will automatically generate a Subfolder called ",(0,i.jsx)(n.code,{children:"GameVault"})," in your selected Folder with some initial data."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"step-2-entering-the-selfhosted-backend-server-url",children:"Step 2: Entering the Selfhosted Backend Server URL"}),"\n",(0,i.jsx)(n.p,{children:"To connect your GameVault application to the backend server, you need to provide the URL of the server. Depending on your setup, follow one of the two options below:"}),"\n",(0,i.jsx)(n.h4,{id:"option-1-self-hosted-gamevault-server",children:"Option 1: Self-hosted GameVault Server"}),"\n",(0,i.jsx)(n.p,{children:"If you have your own self-hosted GameVault server, please enter its URL in the provided field. Follow the instructions below:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Enter the URL of your self-hosted GameVault server in the provided field."}),"\n",(0,i.jsx)(n.li,{children:"Make sure you have the correct URL and it is accessible."}),"\n",(0,i.jsx)(n.li,{children:'Click "Next" to proceed.'}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"option-2-using-the-demo-server",children:"Option 2: Using the Demo Server"}),"\n",(0,i.jsx)(n.p,{children:"If you only want to try out GameVault, without setting up your own server, you can use our demo server. There open-source videogames available. Keep in mind that you will have mostly read-only non-admin rights on that server. To use the demo server, follow the instructions below:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:'Enter "demo.gamevau.lt" as the URL in the provided field.'}),"\n",(0,i.jsx)(n.li,{children:"This will allow you to explore the features and functionality of GameVault."}),"\n",(0,i.jsx)(n.li,{children:'Click "Next" to proceed'}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{title:"Demo Server Credentials",type:"info",children:(0,i.jsxs)(n.p,{children:["Username: ",(0,i.jsx)(n.strong,{children:"demo"}),(0,i.jsx)(n.br,{}),"\n","Password: ",(0,i.jsx)(n.strong,{children:"demodemo"})]})}),"\n",(0,i.jsx)(n.h3,{id:"step-3-log-in-or-register",children:"Step 3: Log In or Register"}),"\n",(0,i.jsx)(n.p,{children:"In this step, you will need to log in to your GameVault account on the selected backend server. Choose one of the following options based on your situation:"}),"\n",(0,i.jsx)(n.h4,{id:"option-1-login",children:"Option 1: Login"}),"\n",(0,i.jsx)(n.p,{children:"If you already have a GameVault account on the selected server, follow these steps:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:'Select "Login" from the options.'}),"\n",(0,i.jsx)(n.li,{children:"Enter your login credentials (username and password) in the provided fields."}),"\n",(0,i.jsx)(n.li,{children:"Ensure that the credentials are specific to the GameVault backend server you have chosen."}),"\n",(0,i.jsx)(n.li,{children:'Click "Log in" to proceed.'}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"option-2-register",children:"Option 2: Register"}),"\n",(0,i.jsx)(n.p,{children:"If you don't have an account on the selected GameVault backend server, follow these steps:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:'Click the "Register" button.'}),"\n",(0,i.jsx)(n.li,{children:"Follow the instructions provided to create your GameVault account on the backend server."}),"\n",(0,i.jsx)(n.li,{children:"The server administrators may have to activate your account before you can use it to log in. Contact them if necessary."}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,i.jsx)(n.p,{children:"Congratulations! You have successfully installed and completed the initial configuration of GameVault. You are now ready to explore and enjoy the features and functionality of the app. If you have any further questions or need assistance, refer to the remaining chapters of this documentation or reach out to our support team for help."}),"\n",(0,i.jsxs)(n.p,{children:["We specifically recommend to read the ",(0,i.jsx)(n.a,{href:"/docs/client-docs/how-to-use",children:'"How to Use" Chapter'})," to understand how GameVault works."]})]})}function h(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8591:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>r});var o=t(758);const i={},l=o.createContext(i);function s(e){const n=o.useContext(l);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),o.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[7508],{5905:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"client-docs/setup","title":"Setting up a GameVault Client","description":"If you want to use GameVault to download and install games on your computer, you need to follow these steps.","source":"@site/docs/client-docs/setup.md","sourceDirName":"client-docs","slug":"/client-docs/setup","permalink":"/docs/client-docs/setup","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/client-docs/setup.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"sidebarPosition":1,"frontMatter":{"sidebar_position":1},"sidebar":"docs","previous":{"title":"Server News","permalink":"/docs/server-docs/server-news"},"next":{"title":"How to Use","permalink":"/docs/client-docs/how-to-use"}}');var i=t(6070),l=t(8591);const s={sidebar_position:1},r="Setting up a GameVault Client",a={},d=[{value:"Installation",id:"installation",level:2},{value:"Recommended Installation Option",id:"recommended-installation-option",level:3},{value:"Alternative Installation Options",id:"alternative-installation-options",level:3},{value:"Option 1: Obtain Pre-Built Artifacts from Github",id:"option-1-obtain-pre-built-artifacts-from-github",level:4},{value:"Option 2: Linux Installation",id:"option-2-linux-installation",level:4},{value:"Option 3: Self-Compiling on Windows",id:"option-3-self-compiling-on-windows",level:4},{value:"Option 4: Extracting from the .appxbundle",id:"option-4-extracting-from-the-appxbundle",level:4},{value:"Initial Configuration",id:"initial-configuration",level:2},{value:"Step 1: Select the Root Folder",id:"step-1-select-the-root-folder",level:3},{value:"Step 2: Entering the Selfhosted Backend Server URL",id:"step-2-entering-the-selfhosted-backend-server-url",level:3},{value:"Option 1: Self-hosted GameVault Server",id:"option-1-self-hosted-gamevault-server",level:4},{value:"Option 2: Using the Demo Server",id:"option-2-using-the-demo-server",level:4},{value:"Step 3: Log In or Register",id:"step-3-log-in-or-register",level:3},{value:"Option 1: Login",id:"option-1-login",level:4},{value:"Option 2: Register",id:"option-2-register",level:4},{value:"Conclusion",id:"conclusion",level:2}];function c(e){const n={a:"a",admonition:"admonition",br:"br",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,l.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"setting-up-a-gamevault-client",children:"Setting up a GameVault Client"})}),"\n",(0,i.jsx)(n.p,{children:"If you want to use GameVault to download and install games on your computer, you need to follow these steps."}),"\n",(0,i.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,i.jsx)(n.h3,{id:"recommended-installation-option",children:"Recommended Installation Option"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Requirement:"})," Windows 10/11 Operating System with Microsoft Store installed"]}),"\n",(0,i.jsxs)(n.p,{children:["To begin, install the GameVault application from ",(0,i.jsx)(n.a,{href:"https://www.microsoft.com/store/apps/9PCKDV76GL75",children:"the official Microsoft Store"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Experienced users can also simply run this command in the PowerShell:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-ps",children:"winget install gamevault\n"})}),"\n",(0,i.jsxs)(n.p,{children:["This process should be straightforward and will only consume a few minutes of your time. After installing, feel free to continue at ",(0,i.jsx)(n.a,{href:"#initial-configuration",children:"Initial Configuration"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"alternative-installation-options",children:"Alternative Installation Options"}),"\n",(0,i.jsx)(n.p,{children:"If you for some reason prefer not to use the Microsoft Store or if you are operating on a different platform, there are multiple other methods available for installing the GameVault Client Application."}),"\n",(0,i.jsx)(n.admonition,{type:"warning",children:(0,i.jsxs)(n.p,{children:["Please not that any other method than installing it from the Microsoft Store is ",(0,i.jsx)(n.strong,{children:"unsupported"})," and ",(0,i.jsx)(n.strong,{children:"unrecommended"})," and should only be used as a last resort. Also be aware ",(0,i.jsx)(n.a,{href:"/docs/client-docs/updating-client#other-sources",children:"that you will be responsible for managing updates manually!"})]})}),"\n",(0,i.jsx)(n.h4,{id:"option-1-obtain-pre-built-artifacts-from-github",children:"Option 1: Obtain Pre-Built Artifacts from Github"}),"\n",(0,i.jsxs)(n.p,{children:["Access the most recent Pre-Built Artifact ",(0,i.jsx)(n.a,{href:"https://github.com/Phalcode/gamevault-app/releases/latest",children:"here."})]}),"\n",(0,i.jsx)(n.admonition,{title:"Antivirus/Smartscreen Warning",type:"note",children:(0,i.jsxs)(n.p,{children:["Your Antivirus or Windows Smartscreen may attempt to prevent you from running our pre-built application, because it is a suspicious-looking binary compiled by an unfamiliar source. This is because we lack a Code Signing Certificate due to budget constraints. You can safely disregard this warning and proceed to run the App by selecting ",(0,i.jsx)(n.code,{children:"More Details"})," and then choosing ",(0,i.jsx)(n.code,{children:"Run Anyway"}),"."]})}),"\n",(0,i.jsx)(n.h4,{id:"option-2-linux-installation",children:"Option 2: Linux Installation"}),"\n",(0,i.jsxs)(n.p,{children:["To run GameVault on Linux utilizing Wine, follow this community-driven method. Visit ",(0,i.jsx)(n.a,{href:"/docs/advanced-usage/linux-client",children:"this"})," page for more details."]}),"\n",(0,i.jsx)(n.h4,{id:"option-3-self-compiling-on-windows",children:"Option 3: Self-Compiling on Windows"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Install Visual Studio IDE"}),"\n",(0,i.jsx)(n.li,{children:"Include the 2017 build system"}),"\n",(0,i.jsx)(n.li,{children:"Clone the gamevault-app source code"}),"\n",(0,i.jsxs)(n.li,{children:["Open Visual Studio and choose the ",(0,i.jsx)(n.code,{children:".sln"})," file"]}),"\n",(0,i.jsxs)(n.li,{children:["Pick ",(0,i.jsx)(n.code,{children:"Release"})," from the Dropdown menu."]}),"\n",(0,i.jsx)(n.li,{children:"Build > Build gamevault"}),"\n",(0,i.jsx)(n.li,{children:"Utilize the output files."}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"option-4-extracting-from-the-appxbundle",children:"Option 4: Extracting from the .appxbundle"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Go to ",(0,i.jsx)(n.a,{href:"https://store.rg-adguard.net",children:"https://store.rg-adguard.net"})]}),"\n",(0,i.jsxs)(n.li,{children:["Paste ",(0,i.jsx)(n.code,{children:"https://www.microsoft.com/store/apps/9PCKDV76GL75"})," in the search box"]}),"\n",(0,i.jsx)(n.li,{children:"Download the current .appxbundle"}),"\n",(0,i.jsxs)(n.li,{children:["Extract the .appxbundle, followed by the ",(0,i.jsx)(n.code,{children:"ReleasePackage_[VERSION]_x64.appx"})," file."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"initial-configuration",children:"Initial Configuration"}),"\n",(0,i.jsx)(n.p,{children:"Once you have installed and launched GameVault, you need to do some initial configuration to get it up and running properly."}),"\n",(0,i.jsx)(n.h3,{id:"step-1-select-the-root-folder",children:"Step 1: Select the Root Folder"}),"\n",(0,i.jsxs)(n.p,{children:["In this step, you will choose the location where all your downloaded and installed games will be stored. This folder will act as the central location for your game library. We recommend you to have a read on the ",(0,i.jsx)(n.a,{href:"/docs/client-docs/how-to-use",children:'"How to Use" Chapter'})," to understand how the root folder works."]}),"\n",(0,i.jsx)(n.p,{children:"To select the root folder, follow the instructions below:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:'Click the "Select Root Path" button.'}),"\n",(0,i.jsx)(n.li,{children:"Navigate to the desired location on your computer."}),"\n",(0,i.jsx)(n.li,{children:"Choose a folder with sufficient storage space to store your game collection."}),"\n",(0,i.jsx)(n.li,{children:'Once you have selected the folder, click "Next" to proceed.'}),"\n",(0,i.jsxs)(n.li,{children:["GameVault will automatically generate a Subfolder called ",(0,i.jsx)(n.code,{children:"GameVault"})," in your selected Folder with some initial data."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"step-2-entering-the-selfhosted-backend-server-url",children:"Step 2: Entering the Selfhosted Backend Server URL"}),"\n",(0,i.jsx)(n.p,{children:"To connect your GameVault application to the backend server, you need to provide the URL of the server. Depending on your setup, follow one of the two options below:"}),"\n",(0,i.jsx)(n.h4,{id:"option-1-self-hosted-gamevault-server",children:"Option 1: Self-hosted GameVault Server"}),"\n",(0,i.jsx)(n.p,{children:"If you have your own self-hosted GameVault server, please enter its URL in the provided field. Follow the instructions below:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Enter the URL of your self-hosted GameVault server in the provided field."}),"\n",(0,i.jsx)(n.li,{children:"Make sure you have the correct URL and it is accessible."}),"\n",(0,i.jsx)(n.li,{children:'Click "Next" to proceed.'}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"option-2-using-the-demo-server",children:"Option 2: Using the Demo Server"}),"\n",(0,i.jsx)(n.p,{children:"If you only want to try out GameVault, without setting up your own server, you can use our demo server. There open-source videogames available. Keep in mind that you will have mostly read-only non-admin rights on that server. To use the demo server, follow the instructions below:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:'Enter "demo.gamevau.lt" as the URL in the provided field.'}),"\n",(0,i.jsx)(n.li,{children:"This will allow you to explore the features and functionality of GameVault."}),"\n",(0,i.jsx)(n.li,{children:'Click "Next" to proceed'}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{title:"Demo Server Credentials",type:"info",children:(0,i.jsxs)(n.p,{children:["Username: ",(0,i.jsx)(n.strong,{children:"demo"}),(0,i.jsx)(n.br,{}),"\n","Password: ",(0,i.jsx)(n.strong,{children:"demodemo"})]})}),"\n",(0,i.jsx)(n.h3,{id:"step-3-log-in-or-register",children:"Step 3: Log In or Register"}),"\n",(0,i.jsx)(n.p,{children:"In this step, you will need to log in to your GameVault account on the selected backend server. Choose one of the following options based on your situation:"}),"\n",(0,i.jsx)(n.h4,{id:"option-1-login",children:"Option 1: Login"}),"\n",(0,i.jsx)(n.p,{children:"If you already have a GameVault account on the selected server, follow these steps:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:'Select "Login" from the options.'}),"\n",(0,i.jsx)(n.li,{children:"Enter your login credentials (username and password) in the provided fields."}),"\n",(0,i.jsx)(n.li,{children:"Ensure that the credentials are specific to the GameVault backend server you have chosen."}),"\n",(0,i.jsx)(n.li,{children:'Click "Log in" to proceed.'}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"option-2-register",children:"Option 2: Register"}),"\n",(0,i.jsx)(n.p,{children:"If you don't have an account on the selected GameVault backend server, follow these steps:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:'Click the "Register" button.'}),"\n",(0,i.jsx)(n.li,{children:"Follow the instructions provided to create your GameVault account on the backend server."}),"\n",(0,i.jsx)(n.li,{children:"The server administrators may have to activate your account before you can use it to log in. Contact them if necessary."}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,i.jsx)(n.p,{children:"Congratulations! You have successfully installed and completed the initial configuration of GameVault. You are now ready to explore and enjoy the features and functionality of the app. If you have any further questions or need assistance, refer to the remaining chapters of this documentation or reach out to our support team for help."}),"\n",(0,i.jsxs)(n.p,{children:["We specifically recommend to read the ",(0,i.jsx)(n.a,{href:"/docs/client-docs/how-to-use",children:'"How to Use" Chapter'})," to understand how GameVault works."]})]})}function h(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8591:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>r});var o=t(758);const i={},l=o.createContext(i);function s(e){const n=o.useContext(l);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),o.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ba57e113.19cd2b46.js b/assets/js/ba57e113.65c0637d.js similarity index 99% rename from assets/js/ba57e113.19cd2b46.js rename to assets/js/ba57e113.65c0637d.js index 152d94d5f..2d2cfd648 100644 --- a/assets/js/ba57e113.19cd2b46.js +++ b/assets/js/ba57e113.65c0637d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[7766],{2975:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"license-contribute","title":"Licensing and Contributions","description":"License","source":"@site/docs/license-contribute.md","sourceDirName":".","slug":"/license-contribute","permalink":"/docs/license-contribute","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/license-contribute.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"sidebarPosition":97,"frontMatter":{"sidebar_position":97},"sidebar":"docs","previous":{"title":"Steam","permalink":"/docs/gamevault-plus/integrations/steam"},"next":{"title":"Troubleshooting","permalink":"/docs/troubleshooting"}}');var o=n(6070),r=n(8591);const s={sidebar_position:97},a="Licensing and Contributions",l={},c=[{value:"License",id:"license",level:2},{value:"Why is GameVault not open-source?",id:"why-is-gamevault-not-open-source",level:3},{value:"Contributing to GameVault",id:"contributing-to-gamevault",level:2},{value:"Publishing Adaptations of GameVault",id:"publishing-adaptations-of-gamevault",level:2},{value:"Community Forks",id:"community-forks",level:2},{value:"gamevault-app",id:"gamevault-app",level:3},{value:"gamevault-backend",id:"gamevault-backend",level:3},{value:"Contributors to this Documentation",id:"contributors-to-this-documentation",level:2}];function d(e){const t={a:"a",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"licensing-and-contributions",children:"Licensing and Contributions"})}),"\n",(0,o.jsx)(t.h2,{id:"license",children:"License"}),"\n",(0,o.jsxs)(t.p,{children:["GameVault is licensed under the ",(0,o.jsx)(t.a,{href:"https://creativecommons.org/licenses/by-nc-sa/4.0/",children:"Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License"})," with the exception of the some components, like extensions and plugins."]}),"\n",(0,o.jsx)(t.p,{children:"This means you are free to use, adapt, and share the work as long as you give appropriate credit, do not use it for commercial purposes, and distribute any derivative works under the same license."}),"\n",(0,o.jsxs)(t.p,{children:["This also means that ",(0,o.jsx)(t.strong,{children:"GameVault is not considered open-source"}),"."]}),"\n",(0,o.jsx)(t.h3,{id:"why-is-gamevault-not-open-source",children:"Why is GameVault not open-source?"}),"\n",(0,o.jsxs)(t.p,{children:['While GameVault is often confused with open-source software, it falls under the category of "source-available" software, providing access to its code for exploration and modification without fully meeting the criteria of open source. This decision is made to balance transparency and protection against unauthorized commercial exploitation, ensuring sustainability and revenue generation to support its development. See ',(0,o.jsx)(t.a,{href:"/blog/2023/07/13",children:"here"})," for more details."]}),"\n",(0,o.jsx)(t.h2,{id:"contributing-to-gamevault",children:"Contributing to GameVault"}),"\n",(0,o.jsx)(t.p,{children:"Everybody can contribute to GameVault."}),"\n",(0,o.jsx)(t.p,{children:"We welcome all contributions, whether it's a comment, a feature request, a bug report, or any other input. Share your thoughts on your blog, news article, forum, social media (e.g., Twitter, Facebook, Instagram), or online communities and discussion boards. Engage with others through videos or podcasts, create content to show how GameVault has positively affected your life, or write a detailed review highlighting its benefits. Your words and actions will bring us joy."}),"\n",(0,o.jsx)(t.p,{children:"Besides rating GameVault on the Microsoft Store or recommending it to a friend, you can also spread the word through different channels. Take part in relevant technology conferences or events and mention GameVault during discussions or presentations. Collaborate with fellow developers or tech enthusiasts in online coding communities like GitHub, Stack Overflow, or Reddit to promote GameVault and demonstrate its features."}),"\n",(0,o.jsx)(t.p,{children:"As we constantly strive to enhance GameVault's performance and features, your assistance is crucial. If you're a developer, please consider opening a pull request on our GitHub repository to contribute directly to the codebase. Alternatively, if you encounter any issues or have suggestions, feel free to create an issue and provide detailed feedback. Your expertise and insights will greatly support our ongoing development efforts."}),"\n",(0,o.jsx)(t.p,{children:"Before contributing any code, please read and accept the terms outlined in the CONTRIBUTING.md file of each project you want to contribute to. These terms include recognizing Phalcode as the owner of your contribution and transferring all rights and responsibilities to us. This ensures everything is legally clear and simple for everyone involved. This also means we can monetize your contribution, so that we can keep this project alive."}),"\n",(0,o.jsx)(t.h2,{id:"publishing-adaptations-of-gamevault",children:"Publishing Adaptations of GameVault"}),"\n",(0,o.jsx)(t.p,{children:"Commercial adaptations of GameVault are not permitted due to licensing restrictions. However, we encourage the creation of derivatives for non-commercial projects under certain conditions."}),"\n",(0,o.jsx)(t.p,{children:"GameVault is developed commercially, and any third-party software using our trademarks GameVault\u2122 or Phalcode\u2122 without our consent is unauthorized. We take measures to protect our intellectual property rights and brand integrity, preventing any unauthorized products from being associated with us."}),"\n",(0,o.jsx)(t.p,{children:"To maintain our reputation and protect our customers' interests, it's essential for third-party developers to avoid creating misleading products. Users may mistakenly believe these products are endorsed or developed by us, posing potential issues for safety and support. As a German GbR (Partnership), we hold full personal liability for our products, underscoring the need to retain control over our brand and software."}),"\n",(0,o.jsx)(t.p,{children:'We welcome creativity from third-party developers, encouraging them to create derivatives with distinct names like "GameVaulTux" or "GameVault Snake Edition". However, it\'s crucial to clearly indicate these as unofficial versions in the product description.'}),"\n",(0,o.jsx)(t.p,{children:"For those intending to publish an official product under our brand, acknowledgment of Phalcode as the sole rights holder and the transfer of all associated liabilities, rights, and responsibilities to us through a formal agreement is required. This aligns with our approach to handling contributions, ensuring clarity and legal compliance for all parties involved."}),"\n",(0,o.jsx)(t.h2,{id:"community-forks",children:"Community Forks"}),"\n",(0,o.jsx)(t.p,{children:"Here you can find an incomplete list of community-driven forks of our Projects. You can add your fork here by submitting a pull-request."}),"\n",(0,o.jsx)(t.h3,{id:"gamevault-app",children:"gamevault-app"}),"\n",(0,o.jsxs)(t.table,{children:[(0,o.jsx)(t.thead,{children:(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.th,{children:"Github Repository"}),(0,o.jsx)(t.th,{children:"Downloads"}),(0,o.jsx)(t.th,{children:"Description"})]})}),(0,o.jsx)(t.tbody,{children:(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:"-"}),(0,o.jsx)(t.td,{children:"-"}),(0,o.jsx)(t.td,{children:"-"})]})})]}),"\n",(0,o.jsx)(t.h3,{id:"gamevault-backend",children:"gamevault-backend"}),"\n",(0,o.jsxs)(t.table,{children:[(0,o.jsx)(t.thead,{children:(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.th,{children:"Github Repository"}),(0,o.jsx)(t.th,{children:"Container Image"}),(0,o.jsx)(t.th,{children:"Description"})]})}),(0,o.jsx)(t.tbody,{children:(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:"-"}),(0,o.jsx)(t.td,{children:"-"}),(0,o.jsx)(t.td,{children:"-"})]})})]}),"\n",(0,o.jsx)(t.h2,{id:"contributors-to-this-documentation",children:"Contributors to this Documentation"}),"\n",(0,o.jsx)(t.p,{children:"If you contributed to these docs, feel free to append your github username to the list below."}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"@Alfagun74"}),"\n",(0,o.jsx)(t.li,{children:"@Yelo420"}),"\n",(0,o.jsx)(t.li,{children:"@46620"}),"\n",(0,o.jsx)(t.li,{children:"@xstar97"}),"\n",(0,o.jsx)(t.li,{children:"@Ronald-Diemicke"}),"\n",(0,o.jsx)(t.li,{children:"@FletcherAU"}),"\n",(0,o.jsx)(t.li,{children:"@Toylerrr"}),"\n",(0,o.jsx)(t.li,{children:"@DissonanceTrip"}),"\n"]})]})}function u(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8591:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>a});var i=n(758);const o={},r=i.createContext(o);function s(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[7766],{2975:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"license-contribute","title":"Licensing and Contributions","description":"License","source":"@site/docs/license-contribute.md","sourceDirName":".","slug":"/license-contribute","permalink":"/docs/license-contribute","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/license-contribute.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"sidebarPosition":97,"frontMatter":{"sidebar_position":97},"sidebar":"docs","previous":{"title":"Steam","permalink":"/docs/gamevault-plus/integrations/steam"},"next":{"title":"Troubleshooting","permalink":"/docs/troubleshooting"}}');var o=n(6070),r=n(8591);const s={sidebar_position:97},a="Licensing and Contributions",l={},c=[{value:"License",id:"license",level:2},{value:"Why is GameVault not open-source?",id:"why-is-gamevault-not-open-source",level:3},{value:"Contributing to GameVault",id:"contributing-to-gamevault",level:2},{value:"Publishing Adaptations of GameVault",id:"publishing-adaptations-of-gamevault",level:2},{value:"Community Forks",id:"community-forks",level:2},{value:"gamevault-app",id:"gamevault-app",level:3},{value:"gamevault-backend",id:"gamevault-backend",level:3},{value:"Contributors to this Documentation",id:"contributors-to-this-documentation",level:2}];function d(e){const t={a:"a",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"licensing-and-contributions",children:"Licensing and Contributions"})}),"\n",(0,o.jsx)(t.h2,{id:"license",children:"License"}),"\n",(0,o.jsxs)(t.p,{children:["GameVault is licensed under the ",(0,o.jsx)(t.a,{href:"https://creativecommons.org/licenses/by-nc-sa/4.0/",children:"Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License"})," with the exception of the some components, like extensions and plugins."]}),"\n",(0,o.jsx)(t.p,{children:"This means you are free to use, adapt, and share the work as long as you give appropriate credit, do not use it for commercial purposes, and distribute any derivative works under the same license."}),"\n",(0,o.jsxs)(t.p,{children:["This also means that ",(0,o.jsx)(t.strong,{children:"GameVault is not considered open-source"}),"."]}),"\n",(0,o.jsx)(t.h3,{id:"why-is-gamevault-not-open-source",children:"Why is GameVault not open-source?"}),"\n",(0,o.jsxs)(t.p,{children:['While GameVault is often confused with open-source software, it falls under the category of "source-available" software, providing access to its code for exploration and modification without fully meeting the criteria of open source. This decision is made to balance transparency and protection against unauthorized commercial exploitation, ensuring sustainability and revenue generation to support its development. See ',(0,o.jsx)(t.a,{href:"/blog/2023/07/13",children:"here"})," for more details."]}),"\n",(0,o.jsx)(t.h2,{id:"contributing-to-gamevault",children:"Contributing to GameVault"}),"\n",(0,o.jsx)(t.p,{children:"Everybody can contribute to GameVault."}),"\n",(0,o.jsx)(t.p,{children:"We welcome all contributions, whether it's a comment, a feature request, a bug report, or any other input. Share your thoughts on your blog, news article, forum, social media (e.g., Twitter, Facebook, Instagram), or online communities and discussion boards. Engage with others through videos or podcasts, create content to show how GameVault has positively affected your life, or write a detailed review highlighting its benefits. Your words and actions will bring us joy."}),"\n",(0,o.jsx)(t.p,{children:"Besides rating GameVault on the Microsoft Store or recommending it to a friend, you can also spread the word through different channels. Take part in relevant technology conferences or events and mention GameVault during discussions or presentations. Collaborate with fellow developers or tech enthusiasts in online coding communities like GitHub, Stack Overflow, or Reddit to promote GameVault and demonstrate its features."}),"\n",(0,o.jsx)(t.p,{children:"As we constantly strive to enhance GameVault's performance and features, your assistance is crucial. If you're a developer, please consider opening a pull request on our GitHub repository to contribute directly to the codebase. Alternatively, if you encounter any issues or have suggestions, feel free to create an issue and provide detailed feedback. Your expertise and insights will greatly support our ongoing development efforts."}),"\n",(0,o.jsx)(t.p,{children:"Before contributing any code, please read and accept the terms outlined in the CONTRIBUTING.md file of each project you want to contribute to. These terms include recognizing Phalcode as the owner of your contribution and transferring all rights and responsibilities to us. This ensures everything is legally clear and simple for everyone involved. This also means we can monetize your contribution, so that we can keep this project alive."}),"\n",(0,o.jsx)(t.h2,{id:"publishing-adaptations-of-gamevault",children:"Publishing Adaptations of GameVault"}),"\n",(0,o.jsx)(t.p,{children:"Commercial adaptations of GameVault are not permitted due to licensing restrictions. However, we encourage the creation of derivatives for non-commercial projects under certain conditions."}),"\n",(0,o.jsx)(t.p,{children:"GameVault is developed commercially, and any third-party software using our trademarks GameVault\u2122 or Phalcode\u2122 without our consent is unauthorized. We take measures to protect our intellectual property rights and brand integrity, preventing any unauthorized products from being associated with us."}),"\n",(0,o.jsx)(t.p,{children:"To maintain our reputation and protect our customers' interests, it's essential for third-party developers to avoid creating misleading products. Users may mistakenly believe these products are endorsed or developed by us, posing potential issues for safety and support. As a German GbR (Partnership), we hold full personal liability for our products, underscoring the need to retain control over our brand and software."}),"\n",(0,o.jsx)(t.p,{children:'We welcome creativity from third-party developers, encouraging them to create derivatives with distinct names like "GameVaulTux" or "GameVault Snake Edition". However, it\'s crucial to clearly indicate these as unofficial versions in the product description.'}),"\n",(0,o.jsx)(t.p,{children:"For those intending to publish an official product under our brand, acknowledgment of Phalcode as the sole rights holder and the transfer of all associated liabilities, rights, and responsibilities to us through a formal agreement is required. This aligns with our approach to handling contributions, ensuring clarity and legal compliance for all parties involved."}),"\n",(0,o.jsx)(t.h2,{id:"community-forks",children:"Community Forks"}),"\n",(0,o.jsx)(t.p,{children:"Here you can find an incomplete list of community-driven forks of our Projects. You can add your fork here by submitting a pull-request."}),"\n",(0,o.jsx)(t.h3,{id:"gamevault-app",children:"gamevault-app"}),"\n",(0,o.jsxs)(t.table,{children:[(0,o.jsx)(t.thead,{children:(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.th,{children:"Github Repository"}),(0,o.jsx)(t.th,{children:"Downloads"}),(0,o.jsx)(t.th,{children:"Description"})]})}),(0,o.jsx)(t.tbody,{children:(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:"-"}),(0,o.jsx)(t.td,{children:"-"}),(0,o.jsx)(t.td,{children:"-"})]})})]}),"\n",(0,o.jsx)(t.h3,{id:"gamevault-backend",children:"gamevault-backend"}),"\n",(0,o.jsxs)(t.table,{children:[(0,o.jsx)(t.thead,{children:(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.th,{children:"Github Repository"}),(0,o.jsx)(t.th,{children:"Container Image"}),(0,o.jsx)(t.th,{children:"Description"})]})}),(0,o.jsx)(t.tbody,{children:(0,o.jsxs)(t.tr,{children:[(0,o.jsx)(t.td,{children:"-"}),(0,o.jsx)(t.td,{children:"-"}),(0,o.jsx)(t.td,{children:"-"})]})})]}),"\n",(0,o.jsx)(t.h2,{id:"contributors-to-this-documentation",children:"Contributors to this Documentation"}),"\n",(0,o.jsx)(t.p,{children:"If you contributed to these docs, feel free to append your github username to the list below."}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"@Alfagun74"}),"\n",(0,o.jsx)(t.li,{children:"@Yelo420"}),"\n",(0,o.jsx)(t.li,{children:"@46620"}),"\n",(0,o.jsx)(t.li,{children:"@xstar97"}),"\n",(0,o.jsx)(t.li,{children:"@Ronald-Diemicke"}),"\n",(0,o.jsx)(t.li,{children:"@FletcherAU"}),"\n",(0,o.jsx)(t.li,{children:"@Toylerrr"}),"\n",(0,o.jsx)(t.li,{children:"@DissonanceTrip"}),"\n"]})]})}function u(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8591:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>a});var i=n(758);const o={},r=i.createContext(o);function s(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c89c7974.f4eae4e9.js b/assets/js/c89c7974.f7ec0e96.js similarity index 98% rename from assets/js/c89c7974.f4eae4e9.js rename to assets/js/c89c7974.f7ec0e96.js index c402eb01a..686f562d4 100644 --- a/assets/js/c89c7974.f4eae4e9.js +++ b/assets/js/c89c7974.f7ec0e96.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[9267],{2255:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>u,frontMatter:()=>o,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"advanced-usage/rest-api","title":"REST API Usage","description":"The GameVault Backend Server offers a fully documented REST API for use to everyone. With the API, you can build your own GameVault clients or 3rd party integrations and manage your libraries automatically.","source":"@site/docs/advanced-usage/rest-api.md","sourceDirName":"advanced-usage","slug":"/advanced-usage/rest-api","permalink":"/docs/advanced-usage/rest-api","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/advanced-usage/rest-api.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"sidebarPosition":4,"frontMatter":{"sidebar_position":4},"sidebar":"docs","previous":{"title":"Themes","permalink":"/docs/client-docs/themes"},"next":{"title":"Early Access Program","permalink":"/docs/advanced-usage/early-access-program"}}');var i=a(6070),s=a(8591);const o={sidebar_position:4},r="REST API Usage",c={},d=[{value:"Register a Bot User",id:"register-a-bot-user",level:2},{value:"OpenAPI Specification",id:"openapi-specification",level:2},{value:"Authentication",id:"authentication",level:2}];function l(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"rest-api-usage",children:"REST API Usage"})}),"\n",(0,i.jsx)(t.p,{children:"The GameVault Backend Server offers a fully documented REST API for use to everyone. With the API, you can build your own GameVault clients or 3rd party integrations and manage your libraries automatically."}),"\n",(0,i.jsx)(t.h2,{id:"register-a-bot-user",children:"Register a Bot User"}),"\n",(0,i.jsxs)(t.p,{children:["To use the GameVault API, it is recommended to register a separate user with the username prefix ",(0,i.jsx)(t.code,{children:"gvbot_"})," (e.g. ",(0,i.jsx)(t.code,{children:"gvbot_image_downloader"}),"). The bot user will not appear in the public user list. This user will be used to authenticate your API requests. You can do this by using the Register Form in the settings tab of the GameVault App."]}),"\n",(0,i.jsx)(t.h2,{id:"openapi-specification",children:"OpenAPI Specification"}),"\n",(0,i.jsxs)(t.p,{children:["You can check out the API specification at ",(0,i.jsx)(t.code,{children:"/api/docs"})," after making sure the server environment variable ",(0,i.jsx)(t.code,{children:"SERVER_API_DOCS_ENABLED"})," is set to ",(0,i.jsx)(t.code,{children:"true"}),". There is also a hosted version of the latest API Documentation available at ",(0,i.jsx)(t.a,{href:"https://demo.gamevau.lt/api/docs",children:"demo.gamevau.lt/api/docs"}),"."]}),"\n",(0,i.jsx)(t.p,{children:"The API documentation provides a complete guide on how to use the API, including authentication, endpoints, and parameters."}),"\n",(0,i.jsxs)(t.p,{children:["You can also download the OpenAPI Specification in different formats using ",(0,i.jsx)(t.code,{children:"example.com/api/docs-json"})," or ",(0,i.jsx)(t.code,{children:"example.com/api/docs-yaml"}),". This is useful for importing the Calls into a tool like Postman or generate the client code using the openapi-generator."]}),"\n",(0,i.jsx)(t.h2,{id:"authentication",children:"Authentication"}),"\n",(0,i.jsx)(t.p,{children:"Almost all requests to the API require basic-auth authentication. You will need to include it in the Authentication header of each request."})]})}function u(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},8591:(e,t,a)=>{a.d(t,{R:()=>o,x:()=>r});var n=a(758);const i={},s=n.createContext(i);function o(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[9267],{2255:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>u,frontMatter:()=>o,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"advanced-usage/rest-api","title":"REST API Usage","description":"The GameVault Backend Server offers a fully documented REST API for use to everyone. With the API, you can build your own GameVault clients or 3rd party integrations and manage your libraries automatically.","source":"@site/docs/advanced-usage/rest-api.md","sourceDirName":"advanced-usage","slug":"/advanced-usage/rest-api","permalink":"/docs/advanced-usage/rest-api","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/advanced-usage/rest-api.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"sidebarPosition":4,"frontMatter":{"sidebar_position":4},"sidebar":"docs","previous":{"title":"Themes","permalink":"/docs/client-docs/themes"},"next":{"title":"Early Access Program","permalink":"/docs/advanced-usage/early-access-program"}}');var i=a(6070),s=a(8591);const o={sidebar_position:4},r="REST API Usage",c={},d=[{value:"Register a Bot User",id:"register-a-bot-user",level:2},{value:"OpenAPI Specification",id:"openapi-specification",level:2},{value:"Authentication",id:"authentication",level:2}];function l(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"rest-api-usage",children:"REST API Usage"})}),"\n",(0,i.jsx)(t.p,{children:"The GameVault Backend Server offers a fully documented REST API for use to everyone. With the API, you can build your own GameVault clients or 3rd party integrations and manage your libraries automatically."}),"\n",(0,i.jsx)(t.h2,{id:"register-a-bot-user",children:"Register a Bot User"}),"\n",(0,i.jsxs)(t.p,{children:["To use the GameVault API, it is recommended to register a separate user with the username prefix ",(0,i.jsx)(t.code,{children:"gvbot_"})," (e.g. ",(0,i.jsx)(t.code,{children:"gvbot_image_downloader"}),"). The bot user will not appear in the public user list. This user will be used to authenticate your API requests. You can do this by using the Register Form in the settings tab of the GameVault App."]}),"\n",(0,i.jsx)(t.h2,{id:"openapi-specification",children:"OpenAPI Specification"}),"\n",(0,i.jsxs)(t.p,{children:["You can check out the API specification at ",(0,i.jsx)(t.code,{children:"/api/docs"})," after making sure the server environment variable ",(0,i.jsx)(t.code,{children:"SERVER_API_DOCS_ENABLED"})," is set to ",(0,i.jsx)(t.code,{children:"true"}),". There is also a hosted version of the latest API Documentation available at ",(0,i.jsx)(t.a,{href:"https://demo.gamevau.lt/api/docs",children:"demo.gamevau.lt/api/docs"}),"."]}),"\n",(0,i.jsx)(t.p,{children:"The API documentation provides a complete guide on how to use the API, including authentication, endpoints, and parameters."}),"\n",(0,i.jsxs)(t.p,{children:["You can also download the OpenAPI Specification in different formats using ",(0,i.jsx)(t.code,{children:"example.com/api/docs-json"})," or ",(0,i.jsx)(t.code,{children:"example.com/api/docs-yaml"}),". This is useful for importing the Calls into a tool like Postman or generate the client code using the openapi-generator."]}),"\n",(0,i.jsx)(t.h2,{id:"authentication",children:"Authentication"}),"\n",(0,i.jsx)(t.p,{children:"Almost all requests to the API require basic-auth authentication. You will need to include it in the Authentication header of each request."})]})}function u(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},8591:(e,t,a)=>{a.d(t,{R:()=>o,x:()=>r});var n=a(758);const i={},s=n.createContext(i);function o(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c9d2adb2.8572c35b.js b/assets/js/c9d2adb2.04c76044.js similarity index 98% rename from assets/js/c9d2adb2.8572c35b.js rename to assets/js/c9d2adb2.04c76044.js index bdec1c1ad..d7be753a9 100644 --- a/assets/js/c9d2adb2.8572c35b.js +++ b/assets/js/c9d2adb2.04c76044.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[3506],{1833:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>r});const i=JSON.parse('{"id":"gamevault-plus/client-setup","title":"Client Setup","description":"Setting up your GameVault+ License within your GameVault Client Application is simple and easy.","source":"@site/docs/gamevault-plus/client-setup.md","sourceDirName":"gamevault-plus","slug":"/gamevault-plus/client-setup","permalink":"/docs/gamevault-plus/client-setup","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/gamevault-plus/client-setup.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"sidebarPosition":2,"frontMatter":{"sidebar_position":2,"title":"Client Setup"},"sidebar":"docs","previous":{"title":"Introduction","permalink":"/docs/gamevault-plus/introduction"},"next":{"title":"Themes","permalink":"/docs/gamevault-plus/themes"}}');var l=t(6070),s=t(8591);const o={sidebar_position:2,title:"Client Setup"},a=void 0,c={},r=[{value:"Linking Your Phalcode Account",id:"linking-your-phalcode-account",level:2},{value:"Retrieving Your License",id:"retrieving-your-license",level:2},{value:"Offline Usage",id:"offline-usage",level:3}];function u(e){const n={code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",...(0,s.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(n.p,{children:"Setting up your GameVault+ License within your GameVault Client Application is simple and easy."}),"\n",(0,l.jsx)(n.h2,{id:"linking-your-phalcode-account",children:"Linking Your Phalcode Account"}),"\n",(0,l.jsxs)(n.ol,{children:["\n",(0,l.jsxs)(n.li,{children:["Open the GameVault Client Application and go to the ",(0,l.jsx)(n.code,{children:"Settings"})," tab. Then, click on the ",(0,l.jsx)(n.code,{children:"GameVault+"})," button."]}),"\n",(0,l.jsxs)(n.li,{children:["Click the ",(0,l.jsx)(n.code,{children:"Log In"})," button and enter your credentials to sign in."]}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:"Your credentials will be securely stored within the application for future use."}),"\n",(0,l.jsx)(n.p,{children:"From now on, each time you start the application, it will automatically attempt to log in using the stored credentials and retrieve your licenses. If the credentials are no longer valid, you will be prompted to log in again."}),"\n",(0,l.jsx)(n.h2,{id:"retrieving-your-license",children:"Retrieving Your License"}),"\n",(0,l.jsx)(n.p,{children:"Upon successful login, the client will try to fetch your GameVault+ license."}),"\n",(0,l.jsx)(n.p,{children:"If a valid license is found, you will see your license details and a button to manage your subscription in the GameVault+ Settings. If no license is found, an error message will be displayed."}),"\n",(0,l.jsxs)(n.p,{children:["You can also manually request to refresh your licenses using the ",(0,l.jsx)(n.code,{children:"Refresh"})," button."]}),"\n",(0,l.jsx)(n.h3,{id:"offline-usage",children:"Offline Usage"}),"\n",(0,l.jsx)(n.p,{children:"Once the initial setup is complete, GameVault+ can be used offline."}),"\n",(0,l.jsx)(n.p,{children:"When a valid license is detected during the setup process, an encrypted copy of the license is stored within the application, enabling offline usage. You can access GameVault+ offline with its license until the license expires."}),"\n",(0,l.jsx)(n.p,{children:"Your offline licenses are renewed each time you log in, as long as an internet connection is available."})]})}function d(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,l.jsx)(n,{...e,children:(0,l.jsx)(u,{...e})}):u(e)}},8591:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>a});var i=t(758);const l={},s=i.createContext(l);function o(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:o(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[3506],{1833:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>r});const i=JSON.parse('{"id":"gamevault-plus/client-setup","title":"Client Setup","description":"Setting up your GameVault+ License within your GameVault Client Application is simple and easy.","source":"@site/docs/gamevault-plus/client-setup.md","sourceDirName":"gamevault-plus","slug":"/gamevault-plus/client-setup","permalink":"/docs/gamevault-plus/client-setup","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/gamevault-plus/client-setup.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"sidebarPosition":2,"frontMatter":{"sidebar_position":2,"title":"Client Setup"},"sidebar":"docs","previous":{"title":"Introduction","permalink":"/docs/gamevault-plus/introduction"},"next":{"title":"Themes","permalink":"/docs/gamevault-plus/themes"}}');var l=t(6070),s=t(8591);const o={sidebar_position:2,title:"Client Setup"},a=void 0,c={},r=[{value:"Linking Your Phalcode Account",id:"linking-your-phalcode-account",level:2},{value:"Retrieving Your License",id:"retrieving-your-license",level:2},{value:"Offline Usage",id:"offline-usage",level:3}];function u(e){const n={code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",...(0,s.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(n.p,{children:"Setting up your GameVault+ License within your GameVault Client Application is simple and easy."}),"\n",(0,l.jsx)(n.h2,{id:"linking-your-phalcode-account",children:"Linking Your Phalcode Account"}),"\n",(0,l.jsxs)(n.ol,{children:["\n",(0,l.jsxs)(n.li,{children:["Open the GameVault Client Application and go to the ",(0,l.jsx)(n.code,{children:"Settings"})," tab. Then, click on the ",(0,l.jsx)(n.code,{children:"GameVault+"})," button."]}),"\n",(0,l.jsxs)(n.li,{children:["Click the ",(0,l.jsx)(n.code,{children:"Log In"})," button and enter your credentials to sign in."]}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:"Your credentials will be securely stored within the application for future use."}),"\n",(0,l.jsx)(n.p,{children:"From now on, each time you start the application, it will automatically attempt to log in using the stored credentials and retrieve your licenses. If the credentials are no longer valid, you will be prompted to log in again."}),"\n",(0,l.jsx)(n.h2,{id:"retrieving-your-license",children:"Retrieving Your License"}),"\n",(0,l.jsx)(n.p,{children:"Upon successful login, the client will try to fetch your GameVault+ license."}),"\n",(0,l.jsx)(n.p,{children:"If a valid license is found, you will see your license details and a button to manage your subscription in the GameVault+ Settings. If no license is found, an error message will be displayed."}),"\n",(0,l.jsxs)(n.p,{children:["You can also manually request to refresh your licenses using the ",(0,l.jsx)(n.code,{children:"Refresh"})," button."]}),"\n",(0,l.jsx)(n.h3,{id:"offline-usage",children:"Offline Usage"}),"\n",(0,l.jsx)(n.p,{children:"Once the initial setup is complete, GameVault+ can be used offline."}),"\n",(0,l.jsx)(n.p,{children:"When a valid license is detected during the setup process, an encrypted copy of the license is stored within the application, enabling offline usage. You can access GameVault+ offline with its license until the license expires."}),"\n",(0,l.jsx)(n.p,{children:"Your offline licenses are renewed each time you log in, as long as an internet connection is available."})]})}function d(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,l.jsx)(n,{...e,children:(0,l.jsx)(u,{...e})}):u(e)}},8591:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>a});var i=t(758);const l={},s=i.createContext(l);function o(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:o(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/cddec16f.281b51ac.js b/assets/js/cddec16f.1d326a99.js similarity index 99% rename from assets/js/cddec16f.281b51ac.js rename to assets/js/cddec16f.1d326a99.js index a411a5303..3f797420d 100644 --- a/assets/js/cddec16f.281b51ac.js +++ b/assets/js/cddec16f.1d326a99.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[2275],{841:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>p,frontMatter:()=>a,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"server-docs/setup/native","title":"Using Native Approach","description":"Container technology presents an efficient and scalable solution by encapsulating applications and their dependencies. This ensures consistent performance across diverse environments and streamlines deployment, management, and scalability.","source":"@site/docs/server-docs/setup/native.md","sourceDirName":"server-docs/setup","slug":"/server-docs/setup/native","permalink":"/docs/server-docs/setup/native","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/setup/native.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"sidebarPosition":99,"frontMatter":{"title":"Using Native Approach","sidebar_position":99},"sidebar":"docs","previous":{"title":"Using Synology Container Manager","permalink":"/docs/server-docs/setup/synology-container-manager"},"next":{"title":"Configuration","permalink":"/docs/server-docs/configuration"}}');var i=s(6070),r=s(8591);const a={title:"Using Native Approach",sidebar_position:99},l=void 0,o={},d=[{value:"Prerequisites",id:"prerequisites",level:3},{value:"Step 1: Clone the Source Code",id:"step-1-clone-the-source-code",level:3},{value:"Step 2: Install Dependencies",id:"step-2-install-dependencies",level:3},{value:"Step 3: Set up an .env File",id:"step-3-set-up-an-env-file",level:3},{value:"Step 4: Build and Start the Server",id:"step-4-build-and-start-the-server",level:3},{value:"Conclusion",id:"conclusion",level:2},{value:"Additional Info",id:"additional-info",level:2},{value:"Stopping the Server",id:"stopping-the-server",level:3},{value:"Updating the Server",id:"updating-the-server",level:3}];function c(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:"Container technology presents an efficient and scalable solution by encapsulating applications and their dependencies. This ensures consistent performance across diverse environments and streamlines deployment, management, and scalability."}),"\n",(0,i.jsx)(n.p,{children:"Although we strongly discourage it, if none of the alternative installation methods are suitable for you, GameVault can also be installed directly on your system without using containers. The example provided here uses Debian."}),"\n",(0,i.jsx)(n.h3,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://nodejs.org/",children:"Node.js"})," must be installed on your system (check the required version ",(0,i.jsx)(n.a,{href:"https://github.com/Phalcode/gamevault-backend/blob/master/Dockerfile#L1",children:"here"}),")."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://www.postgresql.org/",children:"PostgreSQL"})," database (or configure SQLITE later on)."]}),"\n",(0,i.jsxs)(n.li,{children:["Install necessary packages: ",(0,i.jsx)(n.a,{href:"https://packages.debian.org/en/sid/p7zip-full",children:(0,i.jsx)(n.code,{children:"p7zip-full"})})," and ",(0,i.jsx)(n.a,{href:"https://packages.debian.org/en/sid/p7zip-rar",children:(0,i.jsx)(n.code,{children:"p7zip-rar"})})," (non-free-repository) (or their equivalents in your distribution)."]}),"\n",(0,i.jsxs)(n.li,{children:["Install the ",(0,i.jsx)(n.a,{href:"https://pnpm.io/",children:"parallel node package manager"}),": ",(0,i.jsx)(n.code,{children:"npm i -g pnpm"}),"."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"step-1-clone-the-source-code",children:"Step 1: Clone the Source Code"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cd ~\ngit clone https://github.com/Phalcode/gamevault-backend.git\ncd gamevault-backend\n"})}),"\n",(0,i.jsx)(n.h3,{id:"step-2-install-dependencies",children:"Step 2: Install Dependencies"}),"\n",(0,i.jsx)(n.p,{children:"Now we need to install all necessary node dependencies."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"pnpm install\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Your server files are now in the ",(0,i.jsx)(n.code,{children:"dist/"})," folder."]}),"\n",(0,i.jsx)(n.h3,{id:"step-3-set-up-an-env-file",children:"Step 3: Set up an .env File"}),"\n",(0,i.jsxs)(n.p,{children:["Create a .env file in the ",(0,i.jsx)(n.code,{children:"dist/src/"})," directory and ",(0,i.jsx)(n.a,{href:"/docs/server-docs/configuration",children:"configure your GameVault as desired"})," or set them in your system/VM directly."]}),"\n",(0,i.jsx)(n.p,{children:"Example with SQLITE:"}),"\n",(0,i.jsx)(n.p,{children:"First create the necessary folders or just use existing ones in your config:"}),"\n",(0,i.jsx)(n.p,{children:"For example:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cd ~\nmkdir -p gamevault-db gamevault-media gamevault-games gamevault-logs gamevault-plugins\n"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-ini",children:"#/gamevault-backend/.env\nDB_SYSTEM=SQLITE\nVOLUMES_SQLITEDB=/path/for/database/files\nVOLUMES_FILES=/path/for/gane/files\nVOLUMES_MEDIA=/path/for/media/files\nVOLUMES_LOGS=/path/for/log/files\nVOLUMES_PLUGINS=/path/for/plugin/files\n"})}),"\n",(0,i.jsx)(n.h3,{id:"step-4-build-and-start-the-server",children:"Step 4: Build and Start the Server"}),"\n",(0,i.jsx)(n.p,{children:"To start the server, run:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"pnpm start\n"})}),"\n",(0,i.jsx)(n.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,i.jsx)(n.p,{children:"You have now successfully set up your GameVault Server."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.a,{href:"/docs/server-docs/setup/#what-next",children:"Click here to continue."})}),"\n",(0,i.jsx)(n.h2,{id:"additional-info",children:"Additional Info"}),"\n",(0,i.jsx)(n.p,{children:"Don't put/change anything except the .env file inside the gamevault-backend folder if you don't know what you're doing."}),"\n",(0,i.jsx)(n.h3,{id:"stopping-the-server",children:"Stopping the Server"}),"\n",(0,i.jsx)(n.p,{children:"Press CTRL + C to stop the server."}),"\n",(0,i.jsx)(n.h3,{id:"updating-the-server",children:"Updating the Server"}),"\n",(0,i.jsx)(n.p,{children:"You can update the server by running"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git pull\n"})}),"\n",(0,i.jsx)(n.p,{children:"inside of your gamevault-backend git repository. It will auto update to the latest version."}),"\n",(0,i.jsx)(n.p,{children:"You can update to a specific version by using:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git fetch --all --tags --prune\ngit checkout tags/9.0.0\n"})}),"\n",(0,i.jsx)(n.p,{children:"for example."})]})}function p(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8591:(e,n,s)=>{s.d(n,{R:()=>a,x:()=>l});var t=s(758);const i={},r=t.createContext(i);function a(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[2275],{841:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>p,frontMatter:()=>a,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"server-docs/setup/native","title":"Using Native Approach","description":"Container technology presents an efficient and scalable solution by encapsulating applications and their dependencies. This ensures consistent performance across diverse environments and streamlines deployment, management, and scalability.","source":"@site/docs/server-docs/setup/native.md","sourceDirName":"server-docs/setup","slug":"/server-docs/setup/native","permalink":"/docs/server-docs/setup/native","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/setup/native.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"sidebarPosition":99,"frontMatter":{"title":"Using Native Approach","sidebar_position":99},"sidebar":"docs","previous":{"title":"Using Synology Container Manager","permalink":"/docs/server-docs/setup/synology-container-manager"},"next":{"title":"Configuration","permalink":"/docs/server-docs/configuration"}}');var i=s(6070),r=s(8591);const a={title:"Using Native Approach",sidebar_position:99},l=void 0,o={},d=[{value:"Prerequisites",id:"prerequisites",level:3},{value:"Step 1: Clone the Source Code",id:"step-1-clone-the-source-code",level:3},{value:"Step 2: Install Dependencies",id:"step-2-install-dependencies",level:3},{value:"Step 3: Set up an .env File",id:"step-3-set-up-an-env-file",level:3},{value:"Step 4: Build and Start the Server",id:"step-4-build-and-start-the-server",level:3},{value:"Conclusion",id:"conclusion",level:2},{value:"Additional Info",id:"additional-info",level:2},{value:"Stopping the Server",id:"stopping-the-server",level:3},{value:"Updating the Server",id:"updating-the-server",level:3}];function c(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:"Container technology presents an efficient and scalable solution by encapsulating applications and their dependencies. This ensures consistent performance across diverse environments and streamlines deployment, management, and scalability."}),"\n",(0,i.jsx)(n.p,{children:"Although we strongly discourage it, if none of the alternative installation methods are suitable for you, GameVault can also be installed directly on your system without using containers. The example provided here uses Debian."}),"\n",(0,i.jsx)(n.h3,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://nodejs.org/",children:"Node.js"})," must be installed on your system (check the required version ",(0,i.jsx)(n.a,{href:"https://github.com/Phalcode/gamevault-backend/blob/master/Dockerfile#L1",children:"here"}),")."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://www.postgresql.org/",children:"PostgreSQL"})," database (or configure SQLITE later on)."]}),"\n",(0,i.jsxs)(n.li,{children:["Install necessary packages: ",(0,i.jsx)(n.a,{href:"https://packages.debian.org/en/sid/p7zip-full",children:(0,i.jsx)(n.code,{children:"p7zip-full"})})," and ",(0,i.jsx)(n.a,{href:"https://packages.debian.org/en/sid/p7zip-rar",children:(0,i.jsx)(n.code,{children:"p7zip-rar"})})," (non-free-repository) (or their equivalents in your distribution)."]}),"\n",(0,i.jsxs)(n.li,{children:["Install the ",(0,i.jsx)(n.a,{href:"https://pnpm.io/",children:"parallel node package manager"}),": ",(0,i.jsx)(n.code,{children:"npm i -g pnpm"}),"."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"step-1-clone-the-source-code",children:"Step 1: Clone the Source Code"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cd ~\ngit clone https://github.com/Phalcode/gamevault-backend.git\ncd gamevault-backend\n"})}),"\n",(0,i.jsx)(n.h3,{id:"step-2-install-dependencies",children:"Step 2: Install Dependencies"}),"\n",(0,i.jsx)(n.p,{children:"Now we need to install all necessary node dependencies."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"pnpm install\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Your server files are now in the ",(0,i.jsx)(n.code,{children:"dist/"})," folder."]}),"\n",(0,i.jsx)(n.h3,{id:"step-3-set-up-an-env-file",children:"Step 3: Set up an .env File"}),"\n",(0,i.jsxs)(n.p,{children:["Create a .env file in the ",(0,i.jsx)(n.code,{children:"dist/src/"})," directory and ",(0,i.jsx)(n.a,{href:"/docs/server-docs/configuration",children:"configure your GameVault as desired"})," or set them in your system/VM directly."]}),"\n",(0,i.jsx)(n.p,{children:"Example with SQLITE:"}),"\n",(0,i.jsx)(n.p,{children:"First create the necessary folders or just use existing ones in your config:"}),"\n",(0,i.jsx)(n.p,{children:"For example:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cd ~\nmkdir -p gamevault-db gamevault-media gamevault-games gamevault-logs gamevault-plugins\n"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-ini",children:"#/gamevault-backend/.env\nDB_SYSTEM=SQLITE\nVOLUMES_SQLITEDB=/path/for/database/files\nVOLUMES_FILES=/path/for/gane/files\nVOLUMES_MEDIA=/path/for/media/files\nVOLUMES_LOGS=/path/for/log/files\nVOLUMES_PLUGINS=/path/for/plugin/files\n"})}),"\n",(0,i.jsx)(n.h3,{id:"step-4-build-and-start-the-server",children:"Step 4: Build and Start the Server"}),"\n",(0,i.jsx)(n.p,{children:"To start the server, run:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"pnpm start\n"})}),"\n",(0,i.jsx)(n.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,i.jsx)(n.p,{children:"You have now successfully set up your GameVault Server."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.a,{href:"/docs/server-docs/setup/#what-next",children:"Click here to continue."})}),"\n",(0,i.jsx)(n.h2,{id:"additional-info",children:"Additional Info"}),"\n",(0,i.jsx)(n.p,{children:"Don't put/change anything except the .env file inside the gamevault-backend folder if you don't know what you're doing."}),"\n",(0,i.jsx)(n.h3,{id:"stopping-the-server",children:"Stopping the Server"}),"\n",(0,i.jsx)(n.p,{children:"Press CTRL + C to stop the server."}),"\n",(0,i.jsx)(n.h3,{id:"updating-the-server",children:"Updating the Server"}),"\n",(0,i.jsx)(n.p,{children:"You can update the server by running"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git pull\n"})}),"\n",(0,i.jsx)(n.p,{children:"inside of your gamevault-backend git repository. It will auto update to the latest version."}),"\n",(0,i.jsx)(n.p,{children:"You can update to a specific version by using:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git fetch --all --tags --prune\ngit checkout tags/9.0.0\n"})}),"\n",(0,i.jsx)(n.p,{children:"for example."})]})}function p(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8591:(e,n,s)=>{s.d(n,{R:()=>a,x:()=>l});var t=s(758);const i={},r=t.createContext(i);function a(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d72f98b9.c0da7814.js b/assets/js/d72f98b9.1b4de9cd.js similarity index 98% rename from assets/js/d72f98b9.c0da7814.js rename to assets/js/d72f98b9.1b4de9cd.js index e7879aeb7..6b139beb1 100644 --- a/assets/js/d72f98b9.c0da7814.js +++ b/assets/js/d72f98b9.1b4de9cd.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[8996],{3157:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"gamevault-plus/integrations/discord","title":"Discord","description":"GameVault+ offers seamless integration with Discord through Discord Rich Presence. When enabled, the games you\'re currently playing are automatically displayed to your friends and servers on Discord.","source":"@site/docs/gamevault-plus/integrations/discord.md","sourceDirName":"gamevault-plus/integrations","slug":"/gamevault-plus/integrations/discord","permalink":"/docs/gamevault-plus/integrations/discord","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/gamevault-plus/integrations/discord.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"frontMatter":{"title":"Discord"},"sidebar":"docs","previous":{"title":"Client APIs","permalink":"/docs/gamevault-plus/client-apis"},"next":{"title":"Playnite","permalink":"/docs/gamevault-plus/integrations/playnite"}}');var i=s(6070),r=s(8591);const o={title:"Discord"},a=void 0,l={},c=[{value:"Setup Guide",id:"setup-guide",level:2},{value:"Prerequisites",id:"prerequisites",level:3},{value:"Step 1: Enable Discord Integration",id:"step-1-enable-discord-integration",level:3},{value:"Important Notes",id:"important-notes",level:3}];function d(e){const t={a:"a",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"GameVault+"})," offers seamless integration with ",(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.a,{href:"https://discord.com",children:"Discord"})})," through ",(0,i.jsx)(t.strong,{children:"Discord Rich Presence"}),". When enabled, the games you're currently playing are automatically displayed to your friends and servers on Discord."]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"Discord Integration Showcase",src:s(1100).A+"",width:"666",height:"765"})}),"\n",(0,i.jsx)(t.h2,{id:"setup-guide",children:"Setup Guide"}),"\n",(0,i.jsx)(t.h3,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,i.jsx)(t.p,{children:"Before proceeding, ensure the following:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["You have ",(0,i.jsx)(t.a,{href:"https://discord.com",children:"Discord app installed"})," and are logged into your account."]}),"\n",(0,i.jsxs)(t.li,{children:["You are ",(0,i.jsxs)(t.a,{href:"/docs/gamevault-plus/client-setup",children:["logged in to ",(0,i.jsx)(t.strong,{children:"GameVault+"})]})," within the GameVault application."]}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"step-1-enable-discord-integration",children:(0,i.jsx)(t.strong,{children:"Step 1: Enable Discord Integration"})}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:["Open the GameVault application and go to the ",(0,i.jsx)(t.strong,{children:"Settings"})," tab."]}),"\n",(0,i.jsxs)(t.li,{children:["Navigate to ",(0,i.jsx)(t.strong,{children:"GameVault+"})," > ",(0,i.jsx)(t.strong,{children:"Features"})," > ",(0,i.jsx)(t.strong,{children:"Discord"}),"."]}),"\n",(0,i.jsxs)(t.li,{children:["Toggle ",(0,i.jsx)(t.strong,{children:"Sync"})," to activate the integration."]}),"\n",(0,i.jsx)(t.li,{children:"Your play status will now sync with Discord."}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"important-notes",children:"Important Notes"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Be mindful of your Discord Rich Presence privacy settings to control who can see your gaming activity."}),"\n"]})]})}function u(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},1100:(e,t,s)=>{s.d(t,{A:()=>n});const n=s.p+"assets/images/showcase-6e79154de8c2dadb885e4a7097c9e494.png"},8591:(e,t,s)=>{s.d(t,{R:()=>o,x:()=>a});var n=s(758);const i={},r=n.createContext(i);function o(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[8996],{3157:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"gamevault-plus/integrations/discord","title":"Discord","description":"GameVault+ offers seamless integration with Discord through Discord Rich Presence. When enabled, the games you\'re currently playing are automatically displayed to your friends and servers on Discord.","source":"@site/docs/gamevault-plus/integrations/discord.md","sourceDirName":"gamevault-plus/integrations","slug":"/gamevault-plus/integrations/discord","permalink":"/docs/gamevault-plus/integrations/discord","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/gamevault-plus/integrations/discord.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"frontMatter":{"title":"Discord"},"sidebar":"docs","previous":{"title":"Client APIs","permalink":"/docs/gamevault-plus/client-apis"},"next":{"title":"Playnite","permalink":"/docs/gamevault-plus/integrations/playnite"}}');var i=s(6070),r=s(8591);const o={title:"Discord"},a=void 0,l={},c=[{value:"Setup Guide",id:"setup-guide",level:2},{value:"Prerequisites",id:"prerequisites",level:3},{value:"Step 1: Enable Discord Integration",id:"step-1-enable-discord-integration",level:3},{value:"Important Notes",id:"important-notes",level:3}];function d(e){const t={a:"a",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"GameVault+"})," offers seamless integration with ",(0,i.jsx)(t.strong,{children:(0,i.jsx)(t.a,{href:"https://discord.com",children:"Discord"})})," through ",(0,i.jsx)(t.strong,{children:"Discord Rich Presence"}),". When enabled, the games you're currently playing are automatically displayed to your friends and servers on Discord."]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"Discord Integration Showcase",src:s(1100).A+"",width:"666",height:"765"})}),"\n",(0,i.jsx)(t.h2,{id:"setup-guide",children:"Setup Guide"}),"\n",(0,i.jsx)(t.h3,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,i.jsx)(t.p,{children:"Before proceeding, ensure the following:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["You have ",(0,i.jsx)(t.a,{href:"https://discord.com",children:"Discord app installed"})," and are logged into your account."]}),"\n",(0,i.jsxs)(t.li,{children:["You are ",(0,i.jsxs)(t.a,{href:"/docs/gamevault-plus/client-setup",children:["logged in to ",(0,i.jsx)(t.strong,{children:"GameVault+"})]})," within the GameVault application."]}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"step-1-enable-discord-integration",children:(0,i.jsx)(t.strong,{children:"Step 1: Enable Discord Integration"})}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:["Open the GameVault application and go to the ",(0,i.jsx)(t.strong,{children:"Settings"})," tab."]}),"\n",(0,i.jsxs)(t.li,{children:["Navigate to ",(0,i.jsx)(t.strong,{children:"GameVault+"})," > ",(0,i.jsx)(t.strong,{children:"Features"})," > ",(0,i.jsx)(t.strong,{children:"Discord"}),"."]}),"\n",(0,i.jsxs)(t.li,{children:["Toggle ",(0,i.jsx)(t.strong,{children:"Sync"})," to activate the integration."]}),"\n",(0,i.jsx)(t.li,{children:"Your play status will now sync with Discord."}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"important-notes",children:"Important Notes"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Be mindful of your Discord Rich Presence privacy settings to control who can see your gaming activity."}),"\n"]})]})}function u(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},1100:(e,t,s)=>{s.d(t,{A:()=>n});const n=s.p+"assets/images/showcase-6e79154de8c2dadb885e4a7097c9e494.png"},8591:(e,t,s)=>{s.d(t,{R:()=>o,x:()=>a});var n=s(758);const i={},r=n.createContext(i);function o(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/dcb9a9e8.1497a902.js b/assets/js/dcb9a9e8.2f494792.js similarity index 99% rename from assets/js/dcb9a9e8.1497a902.js rename to assets/js/dcb9a9e8.2f494792.js index 1b3478644..9e86c8cdb 100644 --- a/assets/js/dcb9a9e8.1497a902.js +++ b/assets/js/dcb9a9e8.2f494792.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[8190],{2636:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"advanced-usage/linux-client","title":"Running the Client on Linux","description":"This page serves as a community-driven guide to assist you in setting up the GameVault client on Linux.","source":"@site/docs/advanced-usage/linux-client.md","sourceDirName":"advanced-usage","slug":"/advanced-usage/linux-client","permalink":"/docs/advanced-usage/linux-client","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/advanced-usage/linux-client.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"frontMatter":{},"sidebar":"docs","previous":{"title":"Configuring Fail2Ban for GameVault","permalink":"/docs/advanced-usage/fail2ban-gamevault-guide"},"next":{"title":"Running the Client on Steamdeck","permalink":"/docs/advanced-usage/steamdeck"}}');var s=t(6070),a=t(8591);const l={},o="Running the Client on Linux",d={},c=[{value:"Getting the application",id:"getting-the-application",level:2},{value:"Setting up with Wine",id:"setting-up-with-wine",level:2},{value:"Setting up with Bottles",id:"setting-up-with-bottles",level:2},{value:"Updating the Client",id:"updating-the-client",level:2},{value:"Known issues",id:"known-issues",level:2}];function r(e){const n={a:"a",admonition:"admonition",br:"br",code:"code",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"running-the-client-on-linux",children:"Running the Client on Linux"})}),"\n",(0,s.jsx)(n.p,{children:"This page serves as a community-driven guide to assist you in setting up the GameVault client on Linux."}),"\n",(0,s.jsx)(n.admonition,{type:"warning",children:(0,s.jsxs)(n.p,{children:["Please note that running GameVault on Linux using this method is considered ",(0,s.jsx)(n.strong,{children:"unsupported"})," and ",(0,s.jsx)(n.strong,{children:"unrecommended"}),". It should only be utilized as a last resort when no other options are available."]})}),"\n",(0,s.jsx)(n.h2,{id:"getting-the-application",children:"Getting the application"}),"\n",(0,s.jsxs)(n.p,{children:["To start, you need the Application files. The simplest way to get them is explained ",(0,s.jsx)(n.a,{href:"/docs/client-docs/setup#option-1-obtain-pre-built-artifacts-from-github",children:"here"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"setting-up-with-wine",children:"Setting up with Wine"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Install Wine and winetricks"}),"\n",(0,s.jsxs)(n.li,{children:["Run ",(0,s.jsx)(n.code,{children:"winetricks dotnetdesktop6"})," in a terminal"]}),"\n",(0,s.jsxs)(n.li,{children:["Launch ",(0,s.jsx)(n.code,{children:"gamevault.exe"})]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"setting-up-with-bottles",children:"Setting up with Bottles"}),"\n",(0,s.jsxs)(n.admonition,{type:"tip",children:[(0,s.jsx)(n.p,{children:"When using Bottles under flatpak, your data will be in the following directory:"}),(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"~/.var/app/com.usebottles.bottles/data/bottles/[YOUR BOTTLE NAME]"})}),(0,s.jsx)(n.p,{children:"Keep that in mind when unpacking games to install them."})]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["Install ",(0,s.jsx)(n.a,{href:"https://usebottles.com/",children:"Bottles"})]}),"\n",(0,s.jsxs)(n.li,{children:["Create a new bottle",(0,s.jsx)(n.br,{}),"\n",(0,s.jsx)(n.img,{alt:"Creating a new Bottle",src:t(2029).A+"",width:"672",height:"559"})]}),"\n",(0,s.jsxs)(n.li,{children:["Inside your bottle click ",(0,s.jsx)(n.code,{children:"Dependencies"})," and install ",(0,s.jsx)(n.code,{children:"dotnetcoredesktop6"}),(0,s.jsx)(n.br,{}),"\n",(0,s.jsx)(n.img,{alt:"Configuring the .NET Core Dependency",src:t(656).A+"",width:"1920",height:"1042"})]}),"\n",(0,s.jsxs)(n.li,{children:["Go back to the main page for your bottle and press ",(0,s.jsx)(n.code,{children:"Run Executable..."})," and select ",(0,s.jsx)(n.code,{children:"gamevault.exe"})]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"updating-the-client",children:"Updating the Client"}),"\n",(0,s.jsx)(n.admonition,{type:"warning",children:(0,s.jsxs)(n.p,{children:["Since there is currently no auto-update functionality available (as mentioned in ",(0,s.jsx)(n.a,{href:"/docs/client-docs/updating-client#other-sources",children:"this link"}),"), it is your responsibility to manually update your GameVault client. To update your client, you will need to repeat the procedure in this documentation."]})}),"\n",(0,s.jsx)(n.h2,{id:"known-issues",children:"Known issues"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Text can look very broken if certain fonts are not installed on your system.","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["If you're on Arch Linux, ",(0,s.jsx)(n.a,{href:"https://aur.archlinux.org/packages/ttf-ms-win11-auto",children:"this"})," AUR package fixes the issue."]}),"\n",(0,s.jsxs)(n.li,{children:["If you're on Debian, you could try to use ",(0,s.jsx)(n.a,{href:"https://packages.debian.org/ttf-mscorefonts-installer",children:"this"})," package. (untested)"]}),"\n",(0,s.jsxs)(n.li,{children:["Additionally - you can also try ",(0,s.jsx)(n.a,{href:"https://archive.org/details/windows-11-21h2-complete-font-collection",children:"this"})," and install it to your wine prefix's fonts folder ~/.wine/drive_c/windows/Fonts ; This works on the steamdeck"]}),"\n"]}),"\n"]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(r,{...e})}):r(e)}},656:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/dotnet-394a9ce8159950d1b64fc6831db7a59c.png"},2029:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/make_bottle-0aa58e120e66831b38d8c7cc6584b087.png"},8591:(e,n,t)=>{t.d(n,{R:()=>l,x:()=>o});var i=t(758);const s={},a=i.createContext(s);function l(e){const n=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),i.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[8190],{2636:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"advanced-usage/linux-client","title":"Running the Client on Linux","description":"This page serves as a community-driven guide to assist you in setting up the GameVault client on Linux.","source":"@site/docs/advanced-usage/linux-client.md","sourceDirName":"advanced-usage","slug":"/advanced-usage/linux-client","permalink":"/docs/advanced-usage/linux-client","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/advanced-usage/linux-client.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"frontMatter":{},"sidebar":"docs","previous":{"title":"Configuring Fail2Ban for GameVault","permalink":"/docs/advanced-usage/fail2ban-gamevault-guide"},"next":{"title":"Running the Client on Steamdeck","permalink":"/docs/advanced-usage/steamdeck"}}');var s=t(6070),a=t(8591);const l={},o="Running the Client on Linux",d={},c=[{value:"Getting the application",id:"getting-the-application",level:2},{value:"Setting up with Wine",id:"setting-up-with-wine",level:2},{value:"Setting up with Bottles",id:"setting-up-with-bottles",level:2},{value:"Updating the Client",id:"updating-the-client",level:2},{value:"Known issues",id:"known-issues",level:2}];function r(e){const n={a:"a",admonition:"admonition",br:"br",code:"code",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"running-the-client-on-linux",children:"Running the Client on Linux"})}),"\n",(0,s.jsx)(n.p,{children:"This page serves as a community-driven guide to assist you in setting up the GameVault client on Linux."}),"\n",(0,s.jsx)(n.admonition,{type:"warning",children:(0,s.jsxs)(n.p,{children:["Please note that running GameVault on Linux using this method is considered ",(0,s.jsx)(n.strong,{children:"unsupported"})," and ",(0,s.jsx)(n.strong,{children:"unrecommended"}),". It should only be utilized as a last resort when no other options are available."]})}),"\n",(0,s.jsx)(n.h2,{id:"getting-the-application",children:"Getting the application"}),"\n",(0,s.jsxs)(n.p,{children:["To start, you need the Application files. The simplest way to get them is explained ",(0,s.jsx)(n.a,{href:"/docs/client-docs/setup#option-1-obtain-pre-built-artifacts-from-github",children:"here"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"setting-up-with-wine",children:"Setting up with Wine"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Install Wine and winetricks"}),"\n",(0,s.jsxs)(n.li,{children:["Run ",(0,s.jsx)(n.code,{children:"winetricks dotnetdesktop6"})," in a terminal"]}),"\n",(0,s.jsxs)(n.li,{children:["Launch ",(0,s.jsx)(n.code,{children:"gamevault.exe"})]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"setting-up-with-bottles",children:"Setting up with Bottles"}),"\n",(0,s.jsxs)(n.admonition,{type:"tip",children:[(0,s.jsx)(n.p,{children:"When using Bottles under flatpak, your data will be in the following directory:"}),(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"~/.var/app/com.usebottles.bottles/data/bottles/[YOUR BOTTLE NAME]"})}),(0,s.jsx)(n.p,{children:"Keep that in mind when unpacking games to install them."})]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["Install ",(0,s.jsx)(n.a,{href:"https://usebottles.com/",children:"Bottles"})]}),"\n",(0,s.jsxs)(n.li,{children:["Create a new bottle",(0,s.jsx)(n.br,{}),"\n",(0,s.jsx)(n.img,{alt:"Creating a new Bottle",src:t(2029).A+"",width:"672",height:"559"})]}),"\n",(0,s.jsxs)(n.li,{children:["Inside your bottle click ",(0,s.jsx)(n.code,{children:"Dependencies"})," and install ",(0,s.jsx)(n.code,{children:"dotnetcoredesktop6"}),(0,s.jsx)(n.br,{}),"\n",(0,s.jsx)(n.img,{alt:"Configuring the .NET Core Dependency",src:t(656).A+"",width:"1920",height:"1042"})]}),"\n",(0,s.jsxs)(n.li,{children:["Go back to the main page for your bottle and press ",(0,s.jsx)(n.code,{children:"Run Executable..."})," and select ",(0,s.jsx)(n.code,{children:"gamevault.exe"})]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"updating-the-client",children:"Updating the Client"}),"\n",(0,s.jsx)(n.admonition,{type:"warning",children:(0,s.jsxs)(n.p,{children:["Since there is currently no auto-update functionality available (as mentioned in ",(0,s.jsx)(n.a,{href:"/docs/client-docs/updating-client#other-sources",children:"this link"}),"), it is your responsibility to manually update your GameVault client. To update your client, you will need to repeat the procedure in this documentation."]})}),"\n",(0,s.jsx)(n.h2,{id:"known-issues",children:"Known issues"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Text can look very broken if certain fonts are not installed on your system.","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["If you're on Arch Linux, ",(0,s.jsx)(n.a,{href:"https://aur.archlinux.org/packages/ttf-ms-win11-auto",children:"this"})," AUR package fixes the issue."]}),"\n",(0,s.jsxs)(n.li,{children:["If you're on Debian, you could try to use ",(0,s.jsx)(n.a,{href:"https://packages.debian.org/ttf-mscorefonts-installer",children:"this"})," package. (untested)"]}),"\n",(0,s.jsxs)(n.li,{children:["Additionally - you can also try ",(0,s.jsx)(n.a,{href:"https://archive.org/details/windows-11-21h2-complete-font-collection",children:"this"})," and install it to your wine prefix's fonts folder ~/.wine/drive_c/windows/Fonts ; This works on the steamdeck"]}),"\n"]}),"\n"]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(r,{...e})}):r(e)}},656:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/dotnet-394a9ce8159950d1b64fc6831db7a59c.png"},2029:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/make_bottle-0aa58e120e66831b38d8c7cc6584b087.png"},8591:(e,n,t)=>{t.d(n,{R:()=>l,x:()=>o});var i=t(758);const s={},a=i.createContext(s);function l(e){const n=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),i.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e0da75fc.792c51c6.js b/assets/js/e0da75fc.65774ddc.js similarity index 98% rename from assets/js/e0da75fc.792c51c6.js rename to assets/js/e0da75fc.65774ddc.js index 8fc4ba3f7..ecba2e3e5 100644 --- a/assets/js/e0da75fc.792c51c6.js +++ b/assets/js/e0da75fc.65774ddc.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[6328],{9774:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>d,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>r});const i=JSON.parse('{"id":"advanced-usage/steamdeck","title":"Running the Client on Steamdeck","description":"This page serves as a community-driven guide to assist you in setting up the GameVault client on SteamOS.","source":"@site/docs/advanced-usage/steamdeck.md","sourceDirName":"advanced-usage","slug":"/advanced-usage/steamdeck","permalink":"/docs/advanced-usage/steamdeck","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/advanced-usage/steamdeck.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"frontMatter":{},"sidebar":"docs","previous":{"title":"Running the Client on Linux","permalink":"/docs/advanced-usage/linux-client"},"next":{"title":"Introduction","permalink":"/docs/gamevault-plus/introduction"}}');var s=t(6070),a=t(8591);const o={},d="Running the Client on Steamdeck",l={},r=[{value:"App Setup Guide",id:"app-setup-guide",level:2},{value:"Updating the Client",id:"updating-the-client",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"running-the-client-on-steamdeck",children:"Running the Client on Steamdeck"})}),"\n",(0,s.jsx)(n.p,{children:"This page serves as a community-driven guide to assist you in setting up the GameVault client on SteamOS."}),"\n",(0,s.jsx)(n.admonition,{type:"warning",children:(0,s.jsxs)(n.p,{children:["Please note that running GameVault on Linux using this method is considered ",(0,s.jsx)(n.strong,{children:"unsupported"})," and ",(0,s.jsx)(n.strong,{children:"unrecommended"}),"."]})}),"\n",(0,s.jsx)(n.h2,{id:"app-setup-guide",children:"App Setup Guide"}),"\n",(0,s.jsxs)(n.p,{children:["To start, you need the Application files. The simplest way to get them is explained ",(0,s.jsx)(n.a,{href:"/docs/client-docs/setup#option-1-obtain-pre-built-artifacts-from-github",children:"here"}),"."]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Download the latest version of the GameVault app ",(0,s.jsx)(n.a,{href:"https://github.com/Phalcode/gamevault-app/releases",children:"here"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Download .NET from ",(0,s.jsx)(n.a,{href:"https://download.visualstudio.microsoft.com/download/pr/3136e217-e5b7-4899-9b7e-aa52ecb8b108/d74134edaa75e3300f8692660b9fb7b5/windowsdesktop-runtime-6.0.26-win-x64.exe",children:"here"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Download fonts from ",(0,s.jsx)(n.a,{href:"https://archive.org/details/windows-11-21h2-complete-font-collection",children:"here"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Unzip the GameVault application where you want the application to live."}),"\n",(0,s.jsx)(n.admonition,{type:"warning",children:(0,s.jsx)(n.p,{children:"Where you place the app is where it will install windows portable apps. Make sure you have enough space."})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Add ",(0,s.jsx)(n.code,{children:"gamevault.exe"})," to Steam library as a non-steam game (This is important for the proton compdata appid... or so I've been told)."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Change game compatibility properties to use your preferred version of proton."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Change the target of the Non-steam game to the .NET installer."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Run the game via Steam."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Install .NET."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Change the target of the Non-steam game to the ",(0,s.jsx)(n.code,{children:"gamevault.exe"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Find the Compdata folder ",(0,s.jsx)(n.code,{children:"/home/deck/.local/share/steam/steamapps/compatdata/GAMEAPPIDNUMBER/"}),"."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsx)(n.p,{children:"Easiest way to find this is to install and run protontricks in the discover store. Mine is 3860686742"})}),"\n",(0,s.jsxs)(n.ol,{start:"12",children:["\n",(0,s.jsxs)(n.li,{children:["Unzip fonts downloaded from archive.org and install to ",(0,s.jsx)(n.code,{children:"/home/deck/.local/share/steam/steamapps/compatdata/GAMEAPPIDNUMBER/pfx/drive_c/windows/Fonts"}),". (specifically Segoe UI)"]}),"\n",(0,s.jsx)(n.li,{children:"Run GameVault via Steam"}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"updating-the-client",children:"Updating the Client"}),"\n",(0,s.jsx)(n.admonition,{type:"warning",children:(0,s.jsxs)(n.p,{children:["Since there is currently no auto-update functionality available (as mentioned in ",(0,s.jsx)(n.a,{href:"/docs/client-docs/updating-client#other-sources",children:"this link"}),"), it is your responsibility to manually update your GameVault client. To update your client, you will need to repeat the procedure in this documentation."]})})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8591:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>d});var i=t(758);const s={},a=i.createContext(s);function o(e){const n=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),i.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[6328],{9774:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>d,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>r});const i=JSON.parse('{"id":"advanced-usage/steamdeck","title":"Running the Client on Steamdeck","description":"This page serves as a community-driven guide to assist you in setting up the GameVault client on SteamOS.","source":"@site/docs/advanced-usage/steamdeck.md","sourceDirName":"advanced-usage","slug":"/advanced-usage/steamdeck","permalink":"/docs/advanced-usage/steamdeck","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/advanced-usage/steamdeck.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"frontMatter":{},"sidebar":"docs","previous":{"title":"Running the Client on Linux","permalink":"/docs/advanced-usage/linux-client"},"next":{"title":"Introduction","permalink":"/docs/gamevault-plus/introduction"}}');var s=t(6070),a=t(8591);const o={},d="Running the Client on Steamdeck",l={},r=[{value:"App Setup Guide",id:"app-setup-guide",level:2},{value:"Updating the Client",id:"updating-the-client",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"running-the-client-on-steamdeck",children:"Running the Client on Steamdeck"})}),"\n",(0,s.jsx)(n.p,{children:"This page serves as a community-driven guide to assist you in setting up the GameVault client on SteamOS."}),"\n",(0,s.jsx)(n.admonition,{type:"warning",children:(0,s.jsxs)(n.p,{children:["Please note that running GameVault on Linux using this method is considered ",(0,s.jsx)(n.strong,{children:"unsupported"})," and ",(0,s.jsx)(n.strong,{children:"unrecommended"}),"."]})}),"\n",(0,s.jsx)(n.h2,{id:"app-setup-guide",children:"App Setup Guide"}),"\n",(0,s.jsxs)(n.p,{children:["To start, you need the Application files. The simplest way to get them is explained ",(0,s.jsx)(n.a,{href:"/docs/client-docs/setup#option-1-obtain-pre-built-artifacts-from-github",children:"here"}),"."]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Download the latest version of the GameVault app ",(0,s.jsx)(n.a,{href:"https://github.com/Phalcode/gamevault-app/releases",children:"here"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Download .NET from ",(0,s.jsx)(n.a,{href:"https://download.visualstudio.microsoft.com/download/pr/3136e217-e5b7-4899-9b7e-aa52ecb8b108/d74134edaa75e3300f8692660b9fb7b5/windowsdesktop-runtime-6.0.26-win-x64.exe",children:"here"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Download fonts from ",(0,s.jsx)(n.a,{href:"https://archive.org/details/windows-11-21h2-complete-font-collection",children:"here"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Unzip the GameVault application where you want the application to live."}),"\n",(0,s.jsx)(n.admonition,{type:"warning",children:(0,s.jsx)(n.p,{children:"Where you place the app is where it will install windows portable apps. Make sure you have enough space."})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Add ",(0,s.jsx)(n.code,{children:"gamevault.exe"})," to Steam library as a non-steam game (This is important for the proton compdata appid... or so I've been told)."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Change game compatibility properties to use your preferred version of proton."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Change the target of the Non-steam game to the .NET installer."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Run the game via Steam."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Install .NET."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Change the target of the Non-steam game to the ",(0,s.jsx)(n.code,{children:"gamevault.exe"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Find the Compdata folder ",(0,s.jsx)(n.code,{children:"/home/deck/.local/share/steam/steamapps/compatdata/GAMEAPPIDNUMBER/"}),"."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsx)(n.p,{children:"Easiest way to find this is to install and run protontricks in the discover store. Mine is 3860686742"})}),"\n",(0,s.jsxs)(n.ol,{start:"12",children:["\n",(0,s.jsxs)(n.li,{children:["Unzip fonts downloaded from archive.org and install to ",(0,s.jsx)(n.code,{children:"/home/deck/.local/share/steam/steamapps/compatdata/GAMEAPPIDNUMBER/pfx/drive_c/windows/Fonts"}),". (specifically Segoe UI)"]}),"\n",(0,s.jsx)(n.li,{children:"Run GameVault via Steam"}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"updating-the-client",children:"Updating the Client"}),"\n",(0,s.jsx)(n.admonition,{type:"warning",children:(0,s.jsxs)(n.p,{children:["Since there is currently no auto-update functionality available (as mentioned in ",(0,s.jsx)(n.a,{href:"/docs/client-docs/updating-client#other-sources",children:"this link"}),"), it is your responsibility to manually update your GameVault client. To update your client, you will need to repeat the procedure in this documentation."]})})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8591:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>d});var i=t(758);const s={},a=i.createContext(s);function o(e){const n=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),i.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e6a59d41.c2a00107.js b/assets/js/e6a59d41.fc50bdf6.js similarity index 99% rename from assets/js/e6a59d41.c2a00107.js rename to assets/js/e6a59d41.fc50bdf6.js index eb9f7d7ef..b22f9cd49 100644 --- a/assets/js/e6a59d41.c2a00107.js +++ b/assets/js/e6a59d41.fc50bdf6.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[2246],{7100:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"server-docs/user-management","title":"User Management","description":"This documentation provides instructions on user management for the GameVault server. User management involves configuring the initial admin user, enabling/disabling user registration, managing user activation, and assigning roles. These features are crucial for controlling user access, maintaining security, and administering the server effectively.","source":"@site/docs/server-docs/user-management.md","sourceDirName":"server-docs","slug":"/server-docs/user-management","permalink":"/docs/server-docs/user-management","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/user-management.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"sidebarPosition":6,"frontMatter":{"sidebar_position":6},"sidebar":"docs","previous":{"title":"Updating Games","permalink":"/docs/server-docs/updating-games"},"next":{"title":"Game Indexing","permalink":"/docs/server-docs/indexing"}}');var i=s(6070),r=s(8591);const a={sidebar_position:6},o="User Management",d={},l=[{value:"Admin User",id:"admin-user",level:2},{value:"Initial Setup",id:"initial-setup",level:3},{value:"Admin Role Recovery",id:"admin-role-recovery",level:2},{value:"Admin Password Recovery",id:"admin-password-recovery",level:2},{value:"User Registration",id:"user-registration",level:2},{value:"User Activation",id:"user-activation",level:2},{value:"User Roles",id:"user-roles",level:2}];function c(e){const t={admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"user-management",children:"User Management"})}),"\n",(0,i.jsx)(t.p,{children:"This documentation provides instructions on user management for the GameVault server. User management involves configuring the initial admin user, enabling/disabling user registration, managing user activation, and assigning roles. These features are crucial for controlling user access, maintaining security, and administering the server effectively."}),"\n",(0,i.jsx)(t.h2,{id:"admin-user",children:"Admin User"}),"\n",(0,i.jsx)(t.h3,{id:"initial-setup",children:"Initial Setup"}),"\n",(0,i.jsx)(t.admonition,{type:"warning",children:(0,i.jsx)(t.p,{children:"GameVault does not register the first admin account for you. You will need to do that yourself."})}),"\n",(0,i.jsx)(t.p,{children:"The first registered user on a server is automatically activated and granted admin permissions. You can register it using the GameVault Client Application."}),"\n",(0,i.jsx)(t.h2,{id:"admin-role-recovery",children:"Admin Role Recovery"}),"\n",(0,i.jsxs)(t.p,{children:["If you lost your admin permissions due to misconfiguration, you can fix this by using the ",(0,i.jsx)(t.code,{children:"SERVER_ADMIN_USERNAME"})," environment variable. Simply set this variable to the username of the user you wish to elevate to admin role. Upon server startup, GameVault will automatically grant admin permissions to the specified username provided in this configuration variable."]}),"\n",(0,i.jsx)(t.h2,{id:"admin-password-recovery",children:"Admin Password Recovery"}),"\n",(0,i.jsx)(t.p,{children:"In the event that the server owner gets locked out of the admin user account due to password loss or other reasons, the GameVault Server provides an easy way to recover access."}),"\n",(0,i.jsxs)(t.p,{children:["First, set the ",(0,i.jsx)(t.code,{children:"SERVER_ADMIN_USERNAME"})," environment variable to the username of the admin user you wish to reset the password for.\nThen, set the ",(0,i.jsx)(t.code,{children:"SERVER_ADMIN_PASSWORD"})," environment variable to the desired password for the admin user."]}),"\n",(0,i.jsx)(t.p,{children:"For example:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-ini",children:"SERVER_ADMIN_USERNAME=gamevaultfan1\nSERVER_ADMIN_PASSWORD=hunter2\n"})}),"\n",(0,i.jsx)(t.p,{children:"Upon the next startup of the GameVault server, the admin user's password will be updated to the specified password, allowing the user to regain access."}),"\n",(0,i.jsx)(t.h2,{id:"user-registration",children:"User Registration"}),"\n",(0,i.jsx)(t.p,{children:"You have the option to enable or disable new user registration. When tighter control is needed, you can opt to disable public registration."}),"\n",(0,i.jsxs)(t.p,{children:["Simply set the ",(0,i.jsx)(t.code,{children:"SERVER_REGISTRATION_DISABLED"})," environment variable to ",(0,i.jsx)(t.code,{children:"true"})," to easily deactivate the public user registration API in GameVault. This prevents new users from creating accounts and accessing the application."]}),"\n",(0,i.jsx)(t.p,{children:"However, even when public registration is closed, authenticated administrators retain the ability to register new users."}),"\n",(0,i.jsx)(t.h2,{id:"user-activation",children:"User Activation"}),"\n",(0,i.jsx)(t.p,{children:"The activation process is a crucial step to authorize and activate new user accounts. By default, newly registered users are required to be activated by an administrator before they can fully utilize the application."}),"\n",(0,i.jsx)(t.p,{children:"Unactivated users have limited rights, even less than the rights of a guest role user. They are treated as unauthenticated and can not access most APIs.\nAdmins are exempt from activation checks. They can activate new users through the admin panel within the GameVault application."}),"\n",(0,i.jsxs)(t.p,{children:["However, if you wish to bypass the mandatory activation step and allow new users to immediately gain full access to GameVault, you can disable the activation process. Simply set the ",(0,i.jsx)(t.code,{children:"SERVER_ACCOUNT_ACTIVATION_DISABLED"})," environment variable to ",(0,i.jsx)(t.code,{children:"true"}),". This activates users automatically upon registration, removes the activation requirement and grants immediate access to new users."]}),"\n",(0,i.jsx)(t.h2,{id:"user-roles",children:"User Roles"}),"\n",(0,i.jsx)(t.p,{children:"Roles play a crucial role in ensuring the security and proper functioning of the GameVault server. They determine the permissions and access levels granted to users within the application."}),"\n",(0,i.jsx)(t.p,{children:"GameVault implements the following roles:"}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Role"}),(0,i.jsx)(t.th,{children:"Description"}),(0,i.jsx)(t.th,{children:"Level"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Guest"}),(0,i.jsx)(t.td,{children:"This role allows users to view most content within the application."}),(0,i.jsx)(t.td,{children:"1"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Users (Default)"}),(0,i.jsx)(t.td,{children:"This role includes permissions such as downloading games, creating progresses, and editing the user's own profile."}),(0,i.jsx)(t.td,{children:"2"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Editors"}),(0,i.jsx)(t.td,{children:"Editors have the ability to edit and remap games within the application."}),(0,i.jsx)(t.td,{children:"3"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Admins"}),(0,i.jsx)(t.td,{children:"Admins possess full control over user management and can edit user profiles."}),(0,i.jsx)(t.td,{children:"4"})]})]})]}),"\n",(0,i.jsx)(t.p,{children:"By assigning appropriate roles to users, you can ensure that they have the necessary access and privileges based on their responsibilities."})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8591:(e,t,s)=>{s.d(t,{R:()=>a,x:()=>o});var n=s(758);const i={},r=n.createContext(i);function a(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[2246],{7100:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"server-docs/user-management","title":"User Management","description":"This documentation provides instructions on user management for the GameVault server. User management involves configuring the initial admin user, enabling/disabling user registration, managing user activation, and assigning roles. These features are crucial for controlling user access, maintaining security, and administering the server effectively.","source":"@site/docs/server-docs/user-management.md","sourceDirName":"server-docs","slug":"/server-docs/user-management","permalink":"/docs/server-docs/user-management","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/user-management.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"sidebarPosition":6,"frontMatter":{"sidebar_position":6},"sidebar":"docs","previous":{"title":"Updating Games","permalink":"/docs/server-docs/updating-games"},"next":{"title":"Game Indexing","permalink":"/docs/server-docs/indexing"}}');var i=s(6070),r=s(8591);const a={sidebar_position:6},o="User Management",d={},l=[{value:"Admin User",id:"admin-user",level:2},{value:"Initial Setup",id:"initial-setup",level:3},{value:"Admin Role Recovery",id:"admin-role-recovery",level:2},{value:"Admin Password Recovery",id:"admin-password-recovery",level:2},{value:"User Registration",id:"user-registration",level:2},{value:"User Activation",id:"user-activation",level:2},{value:"User Roles",id:"user-roles",level:2}];function c(e){const t={admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"user-management",children:"User Management"})}),"\n",(0,i.jsx)(t.p,{children:"This documentation provides instructions on user management for the GameVault server. User management involves configuring the initial admin user, enabling/disabling user registration, managing user activation, and assigning roles. These features are crucial for controlling user access, maintaining security, and administering the server effectively."}),"\n",(0,i.jsx)(t.h2,{id:"admin-user",children:"Admin User"}),"\n",(0,i.jsx)(t.h3,{id:"initial-setup",children:"Initial Setup"}),"\n",(0,i.jsx)(t.admonition,{type:"warning",children:(0,i.jsx)(t.p,{children:"GameVault does not register the first admin account for you. You will need to do that yourself."})}),"\n",(0,i.jsx)(t.p,{children:"The first registered user on a server is automatically activated and granted admin permissions. You can register it using the GameVault Client Application."}),"\n",(0,i.jsx)(t.h2,{id:"admin-role-recovery",children:"Admin Role Recovery"}),"\n",(0,i.jsxs)(t.p,{children:["If you lost your admin permissions due to misconfiguration, you can fix this by using the ",(0,i.jsx)(t.code,{children:"SERVER_ADMIN_USERNAME"})," environment variable. Simply set this variable to the username of the user you wish to elevate to admin role. Upon server startup, GameVault will automatically grant admin permissions to the specified username provided in this configuration variable."]}),"\n",(0,i.jsx)(t.h2,{id:"admin-password-recovery",children:"Admin Password Recovery"}),"\n",(0,i.jsx)(t.p,{children:"In the event that the server owner gets locked out of the admin user account due to password loss or other reasons, the GameVault Server provides an easy way to recover access."}),"\n",(0,i.jsxs)(t.p,{children:["First, set the ",(0,i.jsx)(t.code,{children:"SERVER_ADMIN_USERNAME"})," environment variable to the username of the admin user you wish to reset the password for.\nThen, set the ",(0,i.jsx)(t.code,{children:"SERVER_ADMIN_PASSWORD"})," environment variable to the desired password for the admin user."]}),"\n",(0,i.jsx)(t.p,{children:"For example:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-ini",children:"SERVER_ADMIN_USERNAME=gamevaultfan1\nSERVER_ADMIN_PASSWORD=hunter2\n"})}),"\n",(0,i.jsx)(t.p,{children:"Upon the next startup of the GameVault server, the admin user's password will be updated to the specified password, allowing the user to regain access."}),"\n",(0,i.jsx)(t.h2,{id:"user-registration",children:"User Registration"}),"\n",(0,i.jsx)(t.p,{children:"You have the option to enable or disable new user registration. When tighter control is needed, you can opt to disable public registration."}),"\n",(0,i.jsxs)(t.p,{children:["Simply set the ",(0,i.jsx)(t.code,{children:"SERVER_REGISTRATION_DISABLED"})," environment variable to ",(0,i.jsx)(t.code,{children:"true"})," to easily deactivate the public user registration API in GameVault. This prevents new users from creating accounts and accessing the application."]}),"\n",(0,i.jsx)(t.p,{children:"However, even when public registration is closed, authenticated administrators retain the ability to register new users."}),"\n",(0,i.jsx)(t.h2,{id:"user-activation",children:"User Activation"}),"\n",(0,i.jsx)(t.p,{children:"The activation process is a crucial step to authorize and activate new user accounts. By default, newly registered users are required to be activated by an administrator before they can fully utilize the application."}),"\n",(0,i.jsx)(t.p,{children:"Unactivated users have limited rights, even less than the rights of a guest role user. They are treated as unauthenticated and can not access most APIs.\nAdmins are exempt from activation checks. They can activate new users through the admin panel within the GameVault application."}),"\n",(0,i.jsxs)(t.p,{children:["However, if you wish to bypass the mandatory activation step and allow new users to immediately gain full access to GameVault, you can disable the activation process. Simply set the ",(0,i.jsx)(t.code,{children:"SERVER_ACCOUNT_ACTIVATION_DISABLED"})," environment variable to ",(0,i.jsx)(t.code,{children:"true"}),". This activates users automatically upon registration, removes the activation requirement and grants immediate access to new users."]}),"\n",(0,i.jsx)(t.h2,{id:"user-roles",children:"User Roles"}),"\n",(0,i.jsx)(t.p,{children:"Roles play a crucial role in ensuring the security and proper functioning of the GameVault server. They determine the permissions and access levels granted to users within the application."}),"\n",(0,i.jsx)(t.p,{children:"GameVault implements the following roles:"}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Role"}),(0,i.jsx)(t.th,{children:"Description"}),(0,i.jsx)(t.th,{children:"Level"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Guest"}),(0,i.jsx)(t.td,{children:"This role allows users to view most content within the application."}),(0,i.jsx)(t.td,{children:"1"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Users (Default)"}),(0,i.jsx)(t.td,{children:"This role includes permissions such as downloading games, creating progresses, and editing the user's own profile."}),(0,i.jsx)(t.td,{children:"2"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Editors"}),(0,i.jsx)(t.td,{children:"Editors have the ability to edit and remap games within the application."}),(0,i.jsx)(t.td,{children:"3"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Admins"}),(0,i.jsx)(t.td,{children:"Admins possess full control over user management and can edit user profiles."}),(0,i.jsx)(t.td,{children:"4"})]})]})]}),"\n",(0,i.jsx)(t.p,{children:"By assigning appropriate roles to users, you can ensure that they have the necessary access and privileges based on their responsibilities."})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8591:(e,t,s)=>{s.d(t,{R:()=>a,x:()=>o});var n=s(758);const i={},r=n.createContext(i);function a(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e9e0f988.05618442.js b/assets/js/e9e0f988.3f1908cf.js similarity index 98% rename from assets/js/e9e0f988.05618442.js rename to assets/js/e9e0f988.3f1908cf.js index 37bb2ce47..dbbf2f035 100644 --- a/assets/js/e9e0f988.05618442.js +++ b/assets/js/e9e0f988.3f1908cf.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[6929],{4198:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>u,frontMatter:()=>a,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"client-docs/updating-client","title":"Updating the Client","description":"The process for updating the app depends on the installation source.","source":"@site/docs/client-docs/updating-client.md","sourceDirName":"client-docs","slug":"/client-docs/updating-client","permalink":"/docs/client-docs/updating-client","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/client-docs/updating-client.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"sidebarPosition":3,"frontMatter":{"sidebar_position":3},"sidebar":"docs","previous":{"title":"How to Use","permalink":"/docs/client-docs/how-to-use"},"next":{"title":"Data Management","permalink":"/docs/client-docs/data"}}');var s=n(6070),i=n(8591);const a={sidebar_position:3},r="Updating the Client",c={},d=[{value:"Microsoft Store",id:"microsoft-store",level:2},{value:"Other Sources",id:"other-sources",level:2}];function l(e){const t={a:"a",h1:"h1",h2:"h2",header:"header",p:"p",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"updating-the-client",children:"Updating the Client"})}),"\n",(0,s.jsx)(t.p,{children:"The process for updating the app depends on the installation source."}),"\n",(0,s.jsx)(t.h2,{id:"microsoft-store",children:"Microsoft Store"}),"\n",(0,s.jsx)(t.p,{children:"If you obtained the app from the Microsoft Store, we're pleased to inform you that our Client app features an automatic update functionality through the Microsoft Store. When you launch the app and observe the spinning logo, it automatically checks for available updates. If a new version is detected, the app prompts you to install it. After the update is installed, the application will close, and you'll need to manually restart it. Once restarted, you'll be using the most recent version."}),"\n",(0,s.jsx)(t.h2,{id:"other-sources",children:"Other Sources"}),"\n",(0,s.jsx)(t.p,{children:"If you acquired the app from a different source, such as by self-compiling, extracting it from the .appxbundle, or downloading the binaries from GitHub, it becomes your responsibility to stay updated with the latest releases and perform the installations."}),"\n",(0,s.jsxs)(t.p,{children:["Be sure to ",(0,s.jsx)(t.a,{href:"https://discord.gg/NEdNen2dSu",children:"join our Discord community"})," and watch our Github Projects to stay informed about the latest advancements."]})]})}function u(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8591:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>r});var o=n(758);const s={},i=o.createContext(s);function a(e){const t=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),o.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[6929],{4198:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>u,frontMatter:()=>a,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"client-docs/updating-client","title":"Updating the Client","description":"The process for updating the app depends on the installation source.","source":"@site/docs/client-docs/updating-client.md","sourceDirName":"client-docs","slug":"/client-docs/updating-client","permalink":"/docs/client-docs/updating-client","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/client-docs/updating-client.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"sidebarPosition":3,"frontMatter":{"sidebar_position":3},"sidebar":"docs","previous":{"title":"How to Use","permalink":"/docs/client-docs/how-to-use"},"next":{"title":"Data Management","permalink":"/docs/client-docs/data"}}');var s=n(6070),i=n(8591);const a={sidebar_position:3},r="Updating the Client",c={},d=[{value:"Microsoft Store",id:"microsoft-store",level:2},{value:"Other Sources",id:"other-sources",level:2}];function l(e){const t={a:"a",h1:"h1",h2:"h2",header:"header",p:"p",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"updating-the-client",children:"Updating the Client"})}),"\n",(0,s.jsx)(t.p,{children:"The process for updating the app depends on the installation source."}),"\n",(0,s.jsx)(t.h2,{id:"microsoft-store",children:"Microsoft Store"}),"\n",(0,s.jsx)(t.p,{children:"If you obtained the app from the Microsoft Store, we're pleased to inform you that our Client app features an automatic update functionality through the Microsoft Store. When you launch the app and observe the spinning logo, it automatically checks for available updates. If a new version is detected, the app prompts you to install it. After the update is installed, the application will close, and you'll need to manually restart it. Once restarted, you'll be using the most recent version."}),"\n",(0,s.jsx)(t.h2,{id:"other-sources",children:"Other Sources"}),"\n",(0,s.jsx)(t.p,{children:"If you acquired the app from a different source, such as by self-compiling, extracting it from the .appxbundle, or downloading the binaries from GitHub, it becomes your responsibility to stay updated with the latest releases and perform the installations."}),"\n",(0,s.jsxs)(t.p,{children:["Be sure to ",(0,s.jsx)(t.a,{href:"https://discord.gg/NEdNen2dSu",children:"join our Discord community"})," and watch our Github Projects to stay informed about the latest advancements."]})]})}function u(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8591:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>r});var o=n(758);const s={},i=o.createContext(s);function a(e){const t=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),o.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ec46a009.5654a3cb.js b/assets/js/ec46a009.5654a3cb.js new file mode 100644 index 000000000..7d0032781 --- /dev/null +++ b/assets/js/ec46a009.5654a3cb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[8983],{2883:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>n,toc:()=>u});const n=JSON.parse('{"id":"gamevault-plus/introduction","title":"Introduction","description":"Upgrade your gaming experience with GameVault+, an affordable premium add-on that brings exclusive nice-to-have features to enhance your GameVault application. Support our development team while enjoying the premium features.","source":"@site/docs/gamevault-plus/introduction.md","sourceDirName":"gamevault-plus","slug":"/gamevault-plus/introduction","permalink":"/docs/gamevault-plus/introduction","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/gamevault-plus/introduction.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"sidebarPosition":1,"frontMatter":{"title":"Introduction","hide_title":true,"sidebar_position":1,"description":"Upgrade your gaming experience with GameVault+, an affordable premium add-on that brings exclusive nice-to-have features to enhance your GameVault application. Support our development team while enjoying the premium features."},"sidebar":"docs","previous":{"title":"Running the Client on Steamdeck","permalink":"/docs/advanced-usage/steamdeck"},"next":{"title":"Client Setup","permalink":"/docs/gamevault-plus/client-setup"}}');var i=a(6070),r=a(8591);const o={title:"Introduction",hide_title:!0,sidebar_position:1,description:"Upgrade your gaming experience with GameVault+, an affordable premium add-on that brings exclusive nice-to-have features to enhance your GameVault application. Support our development team while enjoying the premium features."},s=void 0,l={},u=[{value:"Introduction",id:"introduction",level:2},{value:"Feature List",id:"feature-list",level:2},{value:"Pricing",id:"pricing",level:2},{value:"Get Started",id:"get-started",level:2},{value:"Questions and Answers",id:"questions-and-answers",level:2},{value:"What is Phalcode?",id:"what-is-phalcode",level:3},{value:"I have trouble with GameVault+ and I need support. How can I contact you?",id:"i-have-trouble-with-gamevault-and-i-need-support-how-can-i-contact-you",level:3},{value:"How do I manage billing and payments?",id:"how-do-i-manage-billing-and-payments",level:3},{value:"What payment methods are accepted for GameVault+ subscriptions?",id:"what-payment-methods-are-accepted-for-gamevault-subscriptions",level:3},{value:"Are there going to be more features added to GameVault+?",id:"are-there-going-to-be-more-features-added-to-gamevault",level:3},{value:"Can GameVault+ be shared with multiple users?",id:"can-gamevault-be-shared-with-multiple-users",level:3},{value:"How many devices can I have in my GameVault+ subscription?",id:"how-many-devices-can-i-have-in-my-gamevault-subscription",level:3},{value:"Can GameVault+ be used offline?",id:"can-gamevault-be-used-offline",level:3},{value:"How does GameVault+ ensure user privacy protection?",id:"how-does-gamevault-ensure-user-privacy-protection",level:3},{value:"Will GameVault+ support more integrations with other software in the future?",id:"will-gamevault-support-more-integrations-with-other-software-in-the-future",level:3},{value:"Can users suggest or vote on new features for GameVault+?",id:"can-users-suggest-or-vote-on-new-features-for-gamevault",level:3},{value:"Which Client Application versions are supported?",id:"which-client-application-versions-are-supported",level:3},{value:"Are commercial licenses available for GameVault+?",id:"are-commercial-licenses-available-for-gamevault",level:3},{value:"What if i cant afford GameVault+?",id:"what-if-i-cant-afford-gamevault",level:3}];function c(e){const t={a:"a",admonition:"admonition",blockquote:"blockquote",br:"br",em:"em",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)("div",{class:"gamevault-plus-banner",children:[(0,i.jsx)("img",{src:"/img/gamevault-plus.png",alt:"GameVault+ Banner"}),(0,i.jsx)("strong",{children:"GameVault+"})]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:"Elevate Your GameVault Experience with Premium Features"}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"introduction",children:"Introduction"}),"\n",(0,i.jsxs)(t.p,{children:["Welcome to ",(0,i.jsx)(t.strong,{children:"GameVault+"}),", the premium upgrade subscription designed for enthusiasts seeking an enhanced GameVault experience. Here we are gradually adding a variety of exquisite nice to have features to enrich your time with GameVault while supporting us as developers and keeping this project alive. The subscription is priced affordably and is entirely optional, ensuring that our core product remains freely accessible to all."]}),"\n",(0,i.jsx)(t.h2,{id:"feature-list",children:"Feature List"}),"\n",(0,i.jsx)(t.p,{children:"As of now, we are offering the following features:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"\ud83d\udcf8 Animated profile pictures"}),"\n",(0,i.jsxs)(t.li,{children:["\ud83c\udfa8 ",(0,i.jsx)(t.a,{href:"/docs/gamevault-plus/themes",children:"Additional built-in and customizable Themes"})]}),"\n",(0,i.jsxs)(t.li,{children:["\ud83c\udfae ",(0,i.jsx)(t.a,{href:"/docs/gamevault-plus/integrations/playnite",children:"Playnite Integration"})]}),"\n",(0,i.jsxs)(t.li,{children:["\ud83d\ude82 ",(0,i.jsx)(t.a,{href:"/docs/gamevault-plus/integrations/steam",children:"Steam Integration"})]}),"\n",(0,i.jsxs)(t.li,{children:["\ud83d\udcac ",(0,i.jsx)(t.a,{href:"/docs/gamevault-plus/integrations/discord",children:"Discord Integration"})]}),"\n",(0,i.jsxs)(t.li,{children:["\ud83d\udcbb ",(0,i.jsx)(t.a,{href:"/docs/gamevault-plus/client-apis",children:"GameVault Client APIs (Advanced Interfaces used for Integrations)"})]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"pricing",children:"Pricing"}),"\n",(0,i.jsxs)(t.p,{children:["The GameVault+ subscription is priced affordably at only ",(0,i.jsx)(t.strong,{children:"\u20ac 4.99/month"})," or ",(0,i.jsx)(t.strong,{children:"\u20ac 49.90/year"}),"."]}),"\n",(0,i.jsx)(t.h2,{id:"get-started",children:"Get Started"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://phalco.de/account/login",children:"Sign up or sign in"})," to your personal Phalcode account"]}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://phalco.de/products/gamevault-plus/checkout",children:"Subscribe to a GameVault+ Plan"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"/docs/gamevault-plus/client-setup",children:"Set up your GameVault Client Application"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.strong,{children:"Enjoy premium features while supporting us \ud83e\udd73\ud83d\udc83"})}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"questions-and-answers",children:"Questions and Answers"}),"\n",(0,i.jsx)(t.h3,{id:"what-is-phalcode",children:"What is Phalcode?"}),"\n",(0,i.jsxs)(t.p,{children:["Phalcode is the small startup company developing GameVault. We are just two friends developing software and based in germany. You can find more information about us on our ",(0,i.jsx)(t.a,{href:"https://phalco.de",children:"website"}),"."]}),"\n",(0,i.jsx)(t.h3,{id:"i-have-trouble-with-gamevault-and-i-need-support-how-can-i-contact-you",children:"I have trouble with GameVault+ and I need support. How can I contact you?"}),"\n",(0,i.jsxs)(t.p,{children:["Contact the developers ",(0,i.jsx)(t.strong,{children:"directly"})," on ",(0,i.jsx)(t.a,{href:"https://discord.gg/NEdNen2dSu",children:"Discord"})," or via our ",(0,i.jsx)(t.a,{href:"mailto:contact@phalco.de",children:"email"}),". Do ",(0,i.jsx)(t.strong,{children:"not"})," use the public discord channels for support regarding your personal GameVault+ subscription."]}),"\n",(0,i.jsx)(t.h3,{id:"how-do-i-manage-billing-and-payments",children:"How do I manage billing and payments?"}),"\n",(0,i.jsxs)(t.p,{children:["GameVault+ uses the Stripe billing system for your convenience. Easily handle your subscription, review billing details, and make changes through ",(0,i.jsx)(t.a,{href:"https://billing.stripe.com/p/login/7sI9B10uP6kj36M000",children:"our Stripe Customer Portal"}),"."]}),"\n",(0,i.jsx)(t.h3,{id:"what-payment-methods-are-accepted-for-gamevault-subscriptions",children:"What payment methods are accepted for GameVault+ subscriptions?"}),"\n",(0,i.jsx)(t.p,{children:"We offer several easy ways to pay for your GameVault+ subscription. You can use credit or debit cards, popular digital wallets, various bank redirects or even SEPA direct debit transfers. We want to make it convenient for you to choose how you pay."}),"\n",(0,i.jsx)(t.admonition,{title:"Important: Potential Delays",type:"note",children:(0,i.jsx)(t.p,{children:"Please be aware that if you use Bancontact, iDEAL, SOFORT or SEPA Direct Debit as your payment method, there might be delays in confirming your payment. To get your GameVault+ subscription quickly, we recommend using a payment method that confirms faster."})}),"\n",(0,i.jsx)(t.h3,{id:"are-there-going-to-be-more-features-added-to-gamevault",children:"Are there going to be more features added to GameVault+?"}),"\n",(0,i.jsx)(t.p,{children:"Of course!, You are the people keeping our project alive after all."}),"\n",(0,i.jsx)(t.p,{children:"Expect updates with awesome new GameVault+ content and improvements down the road. We are committed to enhancing the GameVault+ experience."}),"\n",(0,i.jsx)(t.h3,{id:"can-gamevault-be-shared-with-multiple-users",children:"Can GameVault+ be shared with multiple users?"}),"\n",(0,i.jsx)(t.p,{children:"No, your GameVault+ subscription is designed for personal use only. Please avoid sharing it with anyone else."}),"\n",(0,i.jsx)(t.p,{children:"You can enjoy the benefits of GameVault+ on any GameVault Server you connect to. However, keep in mind that server administrators may choose to disable certain features offered by GameVault+ in their configurations."}),"\n",(0,i.jsx)(t.h3,{id:"how-many-devices-can-i-have-in-my-gamevault-subscription",children:"How many devices can I have in my GameVault+ subscription?"}),"\n",(0,i.jsx)(t.p,{children:"Your subscription isn't restricted to a specific number of active devices at the moment."}),"\n",(0,i.jsx)(t.h3,{id:"can-gamevault-be-used-offline",children:"Can GameVault+ be used offline?"}),"\n",(0,i.jsx)(t.p,{children:"Initially, you'll need an internet connection to download and set up your GameVault+ license."}),"\n",(0,i.jsx)(t.p,{children:"Once that setup is complete, GameVault+ can be accessed offline throughout your current subscription period. For those who prefer offline access, we suggest opting for an annual subscription, as it technically only requires an internet connection once a year."}),"\n",(0,i.jsx)(t.h3,{id:"how-does-gamevault-ensure-user-privacy-protection",children:"How does GameVault+ ensure user privacy protection?"}),"\n",(0,i.jsx)(t.p,{children:"At Phalcode, keeping user privacy safe is our very top priority. We use strong security measures, including encryption, to protect user data. We also follow GDPR rules to make sure we're following privacy laws."}),"\n",(0,i.jsxs)(t.p,{children:["Additionally, all billing and payment info is stored securely on the servers of our billing partner, Stripe, which meets PCI compliance standards. For more details on Stripe's security, you can check it out ",(0,i.jsx)(t.a,{href:"https://docs.stripe.com/security",children:"here"}),"."]}),"\n",(0,i.jsxs)(t.p,{children:["You can find all details in our ",(0,i.jsx)(t.a,{href:"https://phalco.de/privacy",children:"privacy policy"}),"."]}),"\n",(0,i.jsx)(t.h3,{id:"will-gamevault-support-more-integrations-with-other-software-in-the-future",children:"Will GameVault+ support more integrations with other software in the future?"}),"\n",(0,i.jsx)(t.p,{children:"We hope so. We're actively exploring partnerships and integrations with other gaming platforms and tools to provide a more interconnected gaming experience."}),"\n",(0,i.jsx)(t.h3,{id:"can-users-suggest-or-vote-on-new-features-for-gamevault",children:"Can users suggest or vote on new features for GameVault+?"}),"\n",(0,i.jsxs)(t.p,{children:["Certainly! We encourage user feedback and suggestions. While we may not implement every idea, we value community input in shaping the future of GameVault+. Share your ideas through our feedback channels, primarily on ",(0,i.jsx)(t.a,{href:"https://github.com/Phalcode/gamevault-app/issues",children:"Github"})," and ",(0,i.jsx)(t.a,{href:"https://discord.gg/NEdNen2dSu",children:"Discord"}),"."]}),"\n",(0,i.jsx)(t.h3,{id:"which-client-application-versions-are-supported",children:"Which Client Application versions are supported?"}),"\n",(0,i.jsx)(t.p,{children:"GameVault+ features are available from the official GameVault Client application version 1.9.0.0 and above. It does not matter if you got it from the Microsoft Store or used an alternative installation option."}),"\n",(0,i.jsx)(t.h3,{id:"are-commercial-licenses-available-for-gamevault",children:"Are commercial licenses available for GameVault+?"}),"\n",(0,i.jsxs)(t.p,{children:["There are, but for commercial use, please ",(0,i.jsx)(t.a,{href:"mailto:contact@phalco.de",children:"contact us directly"})," to discuss an individual licensing agreement.",(0,i.jsx)(t.br,{}),"\n","Personal subscriptions are tailored for individual users, but we're happy to collaborate with businesses for customized solutions and volume licenses."]}),"\n",(0,i.jsx)(t.h3,{id:"what-if-i-cant-afford-gamevault",children:"What if i cant afford GameVault+?"}),"\n",(0,i.jsxs)(t.p,{children:["We totally understand that not everyone can afford GameVault+, and that's fine. From our perspective, you're free to ",(0,i.jsx)(t.em,{children:"tinker"})," your way around the paywall for your personal use. The source code is on ",(0,i.jsx)(t.a,{href:"https://github.com/Phalcode/gamevault-app",children:"Github"}),". But ",(0,i.jsx)(t.strong,{children:"please"})," avoid pirated versions, as they may contain malware, and also ",(0,i.jsx)(t.strong,{children:"please"})," refrain from sharing your bypass-modifications."]})]})}function d(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8591:(e,t,a)=>{a.d(t,{R:()=>o,x:()=>s});var n=a(758);const i={},r=n.createContext(i);function o(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ec46a009.8a6cf105.js b/assets/js/ec46a009.8a6cf105.js deleted file mode 100644 index 919925e13..000000000 --- a/assets/js/ec46a009.8a6cf105.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[8983],{2883:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>n,toc:()=>u});const n=JSON.parse('{"id":"gamevault-plus/introduction","title":"Introduction","description":"Upgrade your gaming experience with GameVault+, an affordable premium add-on that brings exclusive nice-to-have features to enhance your GameVault application. Support our development team while enjoying the premium features.","source":"@site/docs/gamevault-plus/introduction.md","sourceDirName":"gamevault-plus","slug":"/gamevault-plus/introduction","permalink":"/docs/gamevault-plus/introduction","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/gamevault-plus/introduction.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"sidebarPosition":1,"frontMatter":{"title":"Introduction","hide_title":true,"sidebar_position":1,"description":"Upgrade your gaming experience with GameVault+, an affordable premium add-on that brings exclusive nice-to-have features to enhance your GameVault application. Support our development team while enjoying the premium features."},"sidebar":"docs","previous":{"title":"Running the Client on Steamdeck","permalink":"/docs/advanced-usage/steamdeck"},"next":{"title":"Client Setup","permalink":"/docs/gamevault-plus/client-setup"}}');var i=a(6070),r=a(8591);const o={title:"Introduction",hide_title:!0,sidebar_position:1,description:"Upgrade your gaming experience with GameVault+, an affordable premium add-on that brings exclusive nice-to-have features to enhance your GameVault application. Support our development team while enjoying the premium features."},s=void 0,l={},u=[{value:"Introduction",id:"introduction",level:2},{value:"Feature List",id:"feature-list",level:2},{value:"Pricing",id:"pricing",level:2},{value:"Get Started",id:"get-started",level:2},{value:"Questions and Answers",id:"questions-and-answers",level:2},{value:"What is Phalcode?",id:"what-is-phalcode",level:3},{value:"I have trouble with GameVault+ and I need support. How can I contact you?",id:"i-have-trouble-with-gamevault-and-i-need-support-how-can-i-contact-you",level:3},{value:"How do I manage billing and payments?",id:"how-do-i-manage-billing-and-payments",level:3},{value:"What payment methods are accepted for GameVault+ subscriptions?",id:"what-payment-methods-are-accepted-for-gamevault-subscriptions",level:3},{value:"Are there going to be more features added to GameVault+?",id:"are-there-going-to-be-more-features-added-to-gamevault",level:3},{value:"Can GameVault+ be shared with multiple users?",id:"can-gamevault-be-shared-with-multiple-users",level:3},{value:"How many devices can I have in my GameVault+ subscription?",id:"how-many-devices-can-i-have-in-my-gamevault-subscription",level:3},{value:"Can GameVault+ be used offline?",id:"can-gamevault-be-used-offline",level:3},{value:"How does GameVault+ ensure user privacy protection?",id:"how-does-gamevault-ensure-user-privacy-protection",level:3},{value:"Will GameVault+ support more integrations with other software in the future?",id:"will-gamevault-support-more-integrations-with-other-software-in-the-future",level:3},{value:"Can users suggest or vote on new features for GameVault+?",id:"can-users-suggest-or-vote-on-new-features-for-gamevault",level:3},{value:"Which Client Application versions are supported?",id:"which-client-application-versions-are-supported",level:3},{value:"Are commercial licenses available for GameVault+?",id:"are-commercial-licenses-available-for-gamevault",level:3},{value:"What if i cant afford GameVault+?",id:"what-if-i-cant-afford-gamevault",level:3}];function c(e){const t={a:"a",admonition:"admonition",blockquote:"blockquote",br:"br",em:"em",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)("div",{class:"gamevault-plus-banner",children:[(0,i.jsx)("img",{src:"/img/gamevault-plus.png",alt:"GameVault+ Banner"}),(0,i.jsx)("strong",{children:"GameVault+"})]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:"Elevate Your GameVault Experience with Premium Features"}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"introduction",children:"Introduction"}),"\n",(0,i.jsxs)(t.p,{children:["Welcome to ",(0,i.jsx)(t.strong,{children:"GameVault+"}),", the premium upgrade subscription designed for enthusiasts seeking an enhanced GameVault experience. Here we are gradually adding a variety of exquisite nice to have features to enrich your time with GameVault while supporting us as developers and keeping this project alive. The subscription is priced affordably and is entirely optional, ensuring that our core product remains freely accessible to all."]}),"\n",(0,i.jsx)(t.h2,{id:"feature-list",children:"Feature List"}),"\n",(0,i.jsx)(t.p,{children:"As of now, we are offering the following features:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"\ud83d\udcf8 Uploading animated profile pictures"}),"\n",(0,i.jsxs)(t.li,{children:["\ud83c\udfa8 ",(0,i.jsx)(t.a,{href:"/docs/gamevault-plus/themes",children:"Additional built-in and customizable Themes"})]}),"\n",(0,i.jsxs)(t.li,{children:["\ud83e\udd1d ",(0,i.jsx)(t.a,{href:"/docs/gamevault-plus/integrations/playnite",children:"Playnite Integration"})]}),"\n",(0,i.jsxs)(t.li,{children:["\ud83e\udd1d ",(0,i.jsx)(t.a,{href:"/docs/gamevault-plus/integrations/steam",children:"Steam Integration"})]}),"\n",(0,i.jsxs)(t.li,{children:["\ud83d\udcbb ",(0,i.jsx)(t.a,{href:"/docs/gamevault-plus/client-apis",children:"GameVault Client APIs (Advanced Interfaces used for Integrations)"})]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"pricing",children:"Pricing"}),"\n",(0,i.jsxs)(t.p,{children:["The GameVault+ subscription is priced affordably at only ",(0,i.jsx)(t.strong,{children:"\u20ac 4.99/month"})," or ",(0,i.jsx)(t.strong,{children:"\u20ac 49.90/year"}),"."]}),"\n",(0,i.jsx)(t.h2,{id:"get-started",children:"Get Started"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"https://phalco.de/account/login",children:"Sign up or sign in"})," to your personal Phalcode account"]}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://phalco.de/products/gamevault-plus/checkout",children:"Subscribe to a GameVault+ Plan"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"/docs/gamevault-plus/client-setup",children:"Set up your GameVault Client Application"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.strong,{children:"Enjoy premium features while supporting us \ud83e\udd73\ud83d\udc83"})}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"questions-and-answers",children:"Questions and Answers"}),"\n",(0,i.jsx)(t.h3,{id:"what-is-phalcode",children:"What is Phalcode?"}),"\n",(0,i.jsxs)(t.p,{children:["Phalcode is the small startup company developing GameVault. We are just two friends developing software and based in germany. You can find more information about us on our ",(0,i.jsx)(t.a,{href:"https://phalco.de",children:"website"}),"."]}),"\n",(0,i.jsx)(t.h3,{id:"i-have-trouble-with-gamevault-and-i-need-support-how-can-i-contact-you",children:"I have trouble with GameVault+ and I need support. How can I contact you?"}),"\n",(0,i.jsxs)(t.p,{children:["Contact the developers ",(0,i.jsx)(t.strong,{children:"directly"})," on ",(0,i.jsx)(t.a,{href:"https://discord.gg/NEdNen2dSu",children:"Discord"})," or via our ",(0,i.jsx)(t.a,{href:"mailto:contact@phalco.de",children:"email"}),". Do ",(0,i.jsx)(t.strong,{children:"not"})," use the public discord channels for support regarding your personal GameVault+ subscription."]}),"\n",(0,i.jsx)(t.h3,{id:"how-do-i-manage-billing-and-payments",children:"How do I manage billing and payments?"}),"\n",(0,i.jsxs)(t.p,{children:["GameVault+ uses the Stripe billing system for your convenience. Easily handle your subscription, review billing details, and make changes through ",(0,i.jsx)(t.a,{href:"https://billing.stripe.com/p/login/7sI9B10uP6kj36M000",children:"our Stripe Customer Portal"}),"."]}),"\n",(0,i.jsx)(t.h3,{id:"what-payment-methods-are-accepted-for-gamevault-subscriptions",children:"What payment methods are accepted for GameVault+ subscriptions?"}),"\n",(0,i.jsx)(t.p,{children:"We offer several easy ways to pay for your GameVault+ subscription. You can use credit or debit cards, popular digital wallets, various bank redirects or even SEPA direct debit transfers. We want to make it convenient for you to choose how you pay."}),"\n",(0,i.jsx)(t.admonition,{title:"Important: Potential Delays",type:"note",children:(0,i.jsx)(t.p,{children:"Please be aware that if you use Bancontact, iDEAL, SOFORT or SEPA Direct Debit as your payment method, there might be delays in confirming your payment. To get your GameVault+ subscription quickly, we recommend using a payment method that confirms faster."})}),"\n",(0,i.jsx)(t.h3,{id:"are-there-going-to-be-more-features-added-to-gamevault",children:"Are there going to be more features added to GameVault+?"}),"\n",(0,i.jsx)(t.p,{children:"Of course!, You are the people keeping our project alive after all."}),"\n",(0,i.jsx)(t.p,{children:"Expect updates with awesome new GameVault+ content and improvements down the road. We are committed to enhancing the GameVault+ experience."}),"\n",(0,i.jsx)(t.h3,{id:"can-gamevault-be-shared-with-multiple-users",children:"Can GameVault+ be shared with multiple users?"}),"\n",(0,i.jsx)(t.p,{children:"No, your GameVault+ subscription is designed for personal use only. Please avoid sharing it with anyone else."}),"\n",(0,i.jsx)(t.p,{children:"You can enjoy the benefits of GameVault+ on any GameVault Server you connect to. However, keep in mind that server administrators may choose to disable certain features offered by GameVault+ in their configurations."}),"\n",(0,i.jsx)(t.h3,{id:"how-many-devices-can-i-have-in-my-gamevault-subscription",children:"How many devices can I have in my GameVault+ subscription?"}),"\n",(0,i.jsx)(t.p,{children:"Your subscription isn't restricted to a specific number of active devices at the moment."}),"\n",(0,i.jsx)(t.h3,{id:"can-gamevault-be-used-offline",children:"Can GameVault+ be used offline?"}),"\n",(0,i.jsx)(t.p,{children:"Initially, you'll need an internet connection to download and set up your GameVault+ license."}),"\n",(0,i.jsx)(t.p,{children:"Once that setup is complete, GameVault+ can be accessed offline throughout your current subscription period. For those who prefer offline access, we suggest opting for an annual subscription, as it technically only requires an internet connection once a year."}),"\n",(0,i.jsx)(t.h3,{id:"how-does-gamevault-ensure-user-privacy-protection",children:"How does GameVault+ ensure user privacy protection?"}),"\n",(0,i.jsx)(t.p,{children:"At Phalcode, keeping user privacy safe is our very top priority. We use strong security measures, including encryption, to protect user data. We also follow GDPR rules to make sure we're following privacy laws."}),"\n",(0,i.jsxs)(t.p,{children:["Additionally, all billing and payment info is stored securely on the servers of our billing partner, Stripe, which meets PCI compliance standards. For more details on Stripe's security, you can check it out ",(0,i.jsx)(t.a,{href:"https://docs.stripe.com/security",children:"here"}),"."]}),"\n",(0,i.jsxs)(t.p,{children:["You can find all details in our ",(0,i.jsx)(t.a,{href:"https://phalco.de/privacy",children:"privacy policy"}),"."]}),"\n",(0,i.jsx)(t.h3,{id:"will-gamevault-support-more-integrations-with-other-software-in-the-future",children:"Will GameVault+ support more integrations with other software in the future?"}),"\n",(0,i.jsx)(t.p,{children:"We hope so. We're actively exploring partnerships and integrations with other gaming platforms and tools to provide a more interconnected gaming experience."}),"\n",(0,i.jsx)(t.h3,{id:"can-users-suggest-or-vote-on-new-features-for-gamevault",children:"Can users suggest or vote on new features for GameVault+?"}),"\n",(0,i.jsxs)(t.p,{children:["Certainly! We encourage user feedback and suggestions. While we may not implement every idea, we value community input in shaping the future of GameVault+. Share your ideas through our feedback channels, primarily on ",(0,i.jsx)(t.a,{href:"https://github.com/Phalcode/gamevault-app/issues",children:"Github"})," and ",(0,i.jsx)(t.a,{href:"https://discord.gg/NEdNen2dSu",children:"Discord"}),"."]}),"\n",(0,i.jsx)(t.h3,{id:"which-client-application-versions-are-supported",children:"Which Client Application versions are supported?"}),"\n",(0,i.jsx)(t.p,{children:"GameVault+ features are available from the official GameVault Client application version 1.9.0.0 and above. It does not matter if you got it from the Microsoft Store or used an alternative installation option."}),"\n",(0,i.jsx)(t.h3,{id:"are-commercial-licenses-available-for-gamevault",children:"Are commercial licenses available for GameVault+?"}),"\n",(0,i.jsxs)(t.p,{children:["There are, but for commercial use, please ",(0,i.jsx)(t.a,{href:"mailto:contact@phalco.de",children:"contact us directly"})," to discuss an individual licensing agreement.",(0,i.jsx)(t.br,{}),"\n","Personal subscriptions are tailored for individual users, but we're happy to collaborate with businesses for customized solutions and volume licenses."]}),"\n",(0,i.jsx)(t.h3,{id:"what-if-i-cant-afford-gamevault",children:"What if i cant afford GameVault+?"}),"\n",(0,i.jsxs)(t.p,{children:["We totally understand that not everyone can afford GameVault+, and that's fine. From our perspective, you're free to ",(0,i.jsx)(t.em,{children:"tinker"})," your way around the paywall for your personal use. The source code is on ",(0,i.jsx)(t.a,{href:"https://github.com/Phalcode/gamevault-app",children:"Github"}),". But ",(0,i.jsx)(t.strong,{children:"please"})," avoid pirated versions, as they may contain malware, and also ",(0,i.jsx)(t.strong,{children:"please"})," refrain from sharing your bypass-modifications."]})]})}function d(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8591:(e,t,a)=>{a.d(t,{R:()=>o,x:()=>s});var n=a(758);const i={},r=n.createContext(i);function o(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ee98c124.32b595e9.js b/assets/js/ee98c124.6dec6991.js similarity index 99% rename from assets/js/ee98c124.32b595e9.js rename to assets/js/ee98c124.6dec6991.js index cfac3637e..f644fd935 100644 --- a/assets/js/ee98c124.32b595e9.js +++ b/assets/js/ee98c124.6dec6991.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[1764],{2403:(e,a,n)=>{n.r(a),n.d(a,{assets:()=>o,contentTitle:()=>r,default:()=>u,frontMatter:()=>s,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"advanced-usage/fail2ban-gamevault-guide","title":"Configuring Fail2Ban for GameVault","description":"This guide was created and tested by a community member. It hasn\'t been personally tested by our team. We cannot guarantee its effectiveness as we don\'t use fail2ban. Feel free to give it a try. If you find any errors, you can edit the guide accordingly.","source":"@site/docs/advanced-usage/failt2ban.md","sourceDirName":"advanced-usage","slug":"/advanced-usage/fail2ban-gamevault-guide","permalink":"/docs/advanced-usage/fail2ban-gamevault-guide","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/advanced-usage/failt2ban.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"frontMatter":{"id":"fail2ban-gamevault-guide","title":"Configuring Fail2Ban for GameVault"},"sidebar":"docs","previous":{"title":"Early Access Program","permalink":"/docs/advanced-usage/early-access-program"},"next":{"title":"Running the Client on Linux","permalink":"/docs/advanced-usage/linux-client"}}');var i=n(6070),l=n(8591);const s={id:"fail2ban-gamevault-guide",title:"Configuring Fail2Ban for GameVault"},r=void 0,o={},d=[{value:"Introduction",id:"introduction",level:2},{value:"Prerequisites",id:"prerequisites",level:2},{value:"Steps",id:"steps",level:2},{value:"1. Enable Log Files and Map a Volume",id:"1-enable-log-files-and-map-a-volume",level:3},{value:"2. Identify Failed Authentication Attempts",id:"2-identify-failed-authentication-attempts",level:3},{value:"3. Create a Fail2Ban Filter",id:"3-create-a-fail2ban-filter",level:3},{value:"4. Configure Fail2Ban Jail",id:"4-configure-fail2ban-jail",level:3},{value:"5. Restart Fail2Ban",id:"5-restart-fail2ban",level:3},{value:"6. Verify Jail Status",id:"6-verify-jail-status",level:3},{value:"Conclusion",id:"conclusion",level:2}];function c(e){const a={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,l.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(a.admonition,{title:"Community-Created Guide",type:"note",children:(0,i.jsx)(a.p,{children:"This guide was created and tested by a community member. It hasn't been personally tested by our team. We cannot guarantee its effectiveness as we don't use fail2ban. Feel free to give it a try. If you find any errors, you can edit the guide accordingly."})}),"\n",(0,i.jsx)(a.h2,{id:"introduction",children:"Introduction"}),"\n",(0,i.jsx)(a.p,{children:"This guide explains how to set up Fail2Ban to safeguard your GameVault application against unauthorized access attempts. Fail2Ban is a tool that scans log files and blocks IP addresses exhibiting malicious behavior through the firewall."}),"\n",(0,i.jsx)(a.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,i.jsxs)(a.ul,{children:["\n",(0,i.jsx)(a.li,{children:"Fail2Ban installed on your host system"}),"\n",(0,i.jsxs)(a.li,{children:["Running GameVault instance as outlined in the ",(0,i.jsx)(a.a,{href:"/docs/server-docs/setup/",children:"server setup documentation"})]}),"\n"]}),"\n",(0,i.jsx)(a.h2,{id:"steps",children:"Steps"}),"\n",(0,i.jsx)(a.h3,{id:"1-enable-log-files-and-map-a-volume",children:"1. Enable Log Files and Map a Volume"}),"\n",(0,i.jsxs)(a.p,{children:["Ensure that log files are enabled and a volume is mapped to the ",(0,i.jsx)(a.code,{children:"/logs"})," folder within the GameVault backend container in your ",(0,i.jsx)(a.code,{children:"docker-compose.yml"})," file:"]}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-yaml",children:"[...]\ngamevault-backend:\n image: phalcode/gamevault-backend:latest\n restart: unless-stopped\n environment:\n [...]\n - SERVER_LOG_FILES_ENABLED: true # <--- Make sure this is not set to false. (Default was false before v11.0.1)\n volumes:\n [...]\n - /your/logs/folder:/logs # <--- Replace `/your/logs/folder` with the actual path to your log folder.\n[...]\n"})}),"\n",(0,i.jsx)(a.h3,{id:"2-identify-failed-authentication-attempts",children:"2. Identify Failed Authentication Attempts"}),"\n",(0,i.jsx)(a.p,{children:"Failed authentication attempts will appear in the log files in the following format:"}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-bash",children:"info: \u250f [17/Aug/2023:20:25:47 +0000] Username @ Address - GET /api/v1/users/me -> 401 - 28.231 ms - 112 - 'GameVault/1.3.0'\n"})}),"\n",(0,i.jsx)(a.h3,{id:"3-create-a-fail2ban-filter",children:"3. Create a Fail2Ban Filter"}),"\n",(0,i.jsx)(a.p,{children:"Create a filter file for Fail2Ban by opening a terminal and executing the command:"}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-bash",children:"sudo nano /etc/fail2ban/filter.d/gamevault-filter.conf\n"})}),"\n",(0,i.jsx)(a.p,{children:"Insert the following content into the file:"}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-bash",children:"[Definition]\nfailregex = .* - GET.*401\n"})}),"\n",(0,i.jsx)(a.p,{children:"Note that this regular expression may require adjustments. You can test it using the command:"}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-bash",children:"fail2ban-regex /your/logs/folder/gamevault-backend.log /etc/fail2ban/filter.d/gamevault-filter.conf\n"})}),"\n",(0,i.jsx)(a.h3,{id:"4-configure-fail2ban-jail",children:"4. Configure Fail2Ban Jail"}),"\n",(0,i.jsx)(a.p,{children:"Modify the Fail2Ban jail configuration by executing the command:"}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-bash",children:"sudo nano /etc/fail2ban/jail.local\n"})}),"\n",(0,i.jsx)(a.p,{children:"Add the following block and customize the settings based on your preferences:"}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-conf",children:"[gamevault]\nenabled = true\nfilter = gamevault-filter\nlogpath = /your/logs/folder/*.log*\nmaxretry = 10\nfindtime = 3600\nbantime = 3600\n"})}),"\n",(0,i.jsx)(a.h3,{id:"5-restart-fail2ban",children:"5. Restart Fail2Ban"}),"\n",(0,i.jsx)(a.p,{children:"To apply the changes, restart the Fail2Ban service:"}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-bash",children:"sudo systemctl restart fail2ban\n"})}),"\n",(0,i.jsx)(a.h3,{id:"6-verify-jail-status",children:"6. Verify Jail Status"}),"\n",(0,i.jsx)(a.p,{children:"Check the status of the GameVault jail:"}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-bash",children:"sudo fail2ban-client status gamevault\n"})}),"\n",(0,i.jsx)(a.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,i.jsxs)(a.p,{children:["By following these steps, you can enhance the security of your GameVault application by utilizing Fail2Ban to block IP addresses attempting unauthorized access. Remember to fine-tune the settings to suit your specific requirements. Keep in mind that the 401 response will be triggered for each unauthenticated request, which can occur frequently and become bothersome, so you may want to increase the ",(0,i.jsx)(a.code,{children:"maxretry"})," value slightly."]}),"\n",(0,i.jsxs)(a.p,{children:["Credit goes to ",(0,i.jsx)(a.a,{href:"https://stackoverflow.com/a/69575369/14570696",children:"this StackOverflow answer"})," and ",(0,i.jsx)(a.a,{href:"https://github.com/Phalcode/gamevault-backend/issues/175",children:"this Github issue"})," for inspiring this guide."]})]})}function u(e={}){const{wrapper:a}={...(0,l.R)(),...e.components};return a?(0,i.jsx)(a,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8591:(e,a,n)=>{n.d(a,{R:()=>s,x:()=>r});var t=n(758);const i={},l=t.createContext(i);function s(e){const a=t.useContext(l);return t.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function r(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),t.createElement(l.Provider,{value:a},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[1764],{2403:(e,a,n)=>{n.r(a),n.d(a,{assets:()=>o,contentTitle:()=>r,default:()=>u,frontMatter:()=>s,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"advanced-usage/fail2ban-gamevault-guide","title":"Configuring Fail2Ban for GameVault","description":"This guide was created and tested by a community member. It hasn\'t been personally tested by our team. We cannot guarantee its effectiveness as we don\'t use fail2ban. Feel free to give it a try. If you find any errors, you can edit the guide accordingly.","source":"@site/docs/advanced-usage/failt2ban.md","sourceDirName":"advanced-usage","slug":"/advanced-usage/fail2ban-gamevault-guide","permalink":"/docs/advanced-usage/fail2ban-gamevault-guide","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/advanced-usage/failt2ban.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"frontMatter":{"id":"fail2ban-gamevault-guide","title":"Configuring Fail2Ban for GameVault"},"sidebar":"docs","previous":{"title":"Early Access Program","permalink":"/docs/advanced-usage/early-access-program"},"next":{"title":"Running the Client on Linux","permalink":"/docs/advanced-usage/linux-client"}}');var i=n(6070),l=n(8591);const s={id:"fail2ban-gamevault-guide",title:"Configuring Fail2Ban for GameVault"},r=void 0,o={},d=[{value:"Introduction",id:"introduction",level:2},{value:"Prerequisites",id:"prerequisites",level:2},{value:"Steps",id:"steps",level:2},{value:"1. Enable Log Files and Map a Volume",id:"1-enable-log-files-and-map-a-volume",level:3},{value:"2. Identify Failed Authentication Attempts",id:"2-identify-failed-authentication-attempts",level:3},{value:"3. Create a Fail2Ban Filter",id:"3-create-a-fail2ban-filter",level:3},{value:"4. Configure Fail2Ban Jail",id:"4-configure-fail2ban-jail",level:3},{value:"5. Restart Fail2Ban",id:"5-restart-fail2ban",level:3},{value:"6. Verify Jail Status",id:"6-verify-jail-status",level:3},{value:"Conclusion",id:"conclusion",level:2}];function c(e){const a={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,l.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(a.admonition,{title:"Community-Created Guide",type:"note",children:(0,i.jsx)(a.p,{children:"This guide was created and tested by a community member. It hasn't been personally tested by our team. We cannot guarantee its effectiveness as we don't use fail2ban. Feel free to give it a try. If you find any errors, you can edit the guide accordingly."})}),"\n",(0,i.jsx)(a.h2,{id:"introduction",children:"Introduction"}),"\n",(0,i.jsx)(a.p,{children:"This guide explains how to set up Fail2Ban to safeguard your GameVault application against unauthorized access attempts. Fail2Ban is a tool that scans log files and blocks IP addresses exhibiting malicious behavior through the firewall."}),"\n",(0,i.jsx)(a.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,i.jsxs)(a.ul,{children:["\n",(0,i.jsx)(a.li,{children:"Fail2Ban installed on your host system"}),"\n",(0,i.jsxs)(a.li,{children:["Running GameVault instance as outlined in the ",(0,i.jsx)(a.a,{href:"/docs/server-docs/setup/",children:"server setup documentation"})]}),"\n"]}),"\n",(0,i.jsx)(a.h2,{id:"steps",children:"Steps"}),"\n",(0,i.jsx)(a.h3,{id:"1-enable-log-files-and-map-a-volume",children:"1. Enable Log Files and Map a Volume"}),"\n",(0,i.jsxs)(a.p,{children:["Ensure that log files are enabled and a volume is mapped to the ",(0,i.jsx)(a.code,{children:"/logs"})," folder within the GameVault backend container in your ",(0,i.jsx)(a.code,{children:"docker-compose.yml"})," file:"]}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-yaml",children:"[...]\ngamevault-backend:\n image: phalcode/gamevault-backend:latest\n restart: unless-stopped\n environment:\n [...]\n - SERVER_LOG_FILES_ENABLED: true # <--- Make sure this is not set to false. (Default was false before v11.0.1)\n volumes:\n [...]\n - /your/logs/folder:/logs # <--- Replace `/your/logs/folder` with the actual path to your log folder.\n[...]\n"})}),"\n",(0,i.jsx)(a.h3,{id:"2-identify-failed-authentication-attempts",children:"2. Identify Failed Authentication Attempts"}),"\n",(0,i.jsx)(a.p,{children:"Failed authentication attempts will appear in the log files in the following format:"}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-bash",children:"info: \u250f [17/Aug/2023:20:25:47 +0000] Username @ Address - GET /api/v1/users/me -> 401 - 28.231 ms - 112 - 'GameVault/1.3.0'\n"})}),"\n",(0,i.jsx)(a.h3,{id:"3-create-a-fail2ban-filter",children:"3. Create a Fail2Ban Filter"}),"\n",(0,i.jsx)(a.p,{children:"Create a filter file for Fail2Ban by opening a terminal and executing the command:"}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-bash",children:"sudo nano /etc/fail2ban/filter.d/gamevault-filter.conf\n"})}),"\n",(0,i.jsx)(a.p,{children:"Insert the following content into the file:"}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-bash",children:"[Definition]\nfailregex = .* - GET.*401\n"})}),"\n",(0,i.jsx)(a.p,{children:"Note that this regular expression may require adjustments. You can test it using the command:"}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-bash",children:"fail2ban-regex /your/logs/folder/gamevault-backend.log /etc/fail2ban/filter.d/gamevault-filter.conf\n"})}),"\n",(0,i.jsx)(a.h3,{id:"4-configure-fail2ban-jail",children:"4. Configure Fail2Ban Jail"}),"\n",(0,i.jsx)(a.p,{children:"Modify the Fail2Ban jail configuration by executing the command:"}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-bash",children:"sudo nano /etc/fail2ban/jail.local\n"})}),"\n",(0,i.jsx)(a.p,{children:"Add the following block and customize the settings based on your preferences:"}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-conf",children:"[gamevault]\nenabled = true\nfilter = gamevault-filter\nlogpath = /your/logs/folder/*.log*\nmaxretry = 10\nfindtime = 3600\nbantime = 3600\n"})}),"\n",(0,i.jsx)(a.h3,{id:"5-restart-fail2ban",children:"5. Restart Fail2Ban"}),"\n",(0,i.jsx)(a.p,{children:"To apply the changes, restart the Fail2Ban service:"}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-bash",children:"sudo systemctl restart fail2ban\n"})}),"\n",(0,i.jsx)(a.h3,{id:"6-verify-jail-status",children:"6. Verify Jail Status"}),"\n",(0,i.jsx)(a.p,{children:"Check the status of the GameVault jail:"}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-bash",children:"sudo fail2ban-client status gamevault\n"})}),"\n",(0,i.jsx)(a.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,i.jsxs)(a.p,{children:["By following these steps, you can enhance the security of your GameVault application by utilizing Fail2Ban to block IP addresses attempting unauthorized access. Remember to fine-tune the settings to suit your specific requirements. Keep in mind that the 401 response will be triggered for each unauthenticated request, which can occur frequently and become bothersome, so you may want to increase the ",(0,i.jsx)(a.code,{children:"maxretry"})," value slightly."]}),"\n",(0,i.jsxs)(a.p,{children:["Credit goes to ",(0,i.jsx)(a.a,{href:"https://stackoverflow.com/a/69575369/14570696",children:"this StackOverflow answer"})," and ",(0,i.jsx)(a.a,{href:"https://github.com/Phalcode/gamevault-backend/issues/175",children:"this Github issue"})," for inspiring this guide."]})]})}function u(e={}){const{wrapper:a}={...(0,l.R)(),...e.components};return a?(0,i.jsx)(a,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8591:(e,a,n)=>{n.d(a,{R:()=>s,x:()=>r});var t=n(758);const i={},l=t.createContext(i);function s(e){const a=t.useContext(l);return t.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function r(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),t.createElement(l.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f4d4319b.88cfff4c.js b/assets/js/f4d4319b.91011806.js similarity index 99% rename from assets/js/f4d4319b.88cfff4c.js rename to assets/js/f4d4319b.91011806.js index 39a868a4e..c7612fd01 100644 --- a/assets/js/f4d4319b.88cfff4c.js +++ b/assets/js/f4d4319b.91011806.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[1784],{5136:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>d,contentTitle:()=>i,default:()=>u,frontMatter:()=>a,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"server-docs/setup/toc","title":"Setting up a GameVault Server","description":"There are multiple ways to set up a GameVault Server. You can choose one from below that suits you.","source":"@site/docs/server-docs/setup/setup.md","sourceDirName":"server-docs/setup","slug":"/server-docs/setup/","permalink":"/docs/server-docs/setup/","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/setup/setup.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"sidebarPosition":1,"frontMatter":{"sidebar_position":1,"id":"toc"},"sidebar":"docs","previous":{"title":"Introduction","permalink":"/docs/intro"},"next":{"title":"Using Docker Compose","permalink":"/docs/server-docs/setup/docker-compose"}}');var o=t(6070),n=t(8591);const a={sidebar_position:1,id:"toc"},i="Setting up a GameVault Server",d={},c=[{value:"Supported Methods",id:"supported-methods",level:2},{value:"More Methods",id:"more-methods",level:3},{value:"What Next?",id:"what-next",level:2}];function l(e){const r={a:"a",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,n.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(r.header,{children:(0,o.jsx)(r.h1,{id:"setting-up-a-gamevault-server",children:"Setting up a GameVault Server"})}),"\n",(0,o.jsx)(r.p,{children:"There are multiple ways to set up a GameVault Server. You can choose one from below that suits you."}),"\n",(0,o.jsxs)(r.p,{children:["If you have any trouble setting up a GameVault server don't give up! There are a lot of helpful people on our ",(0,o.jsx)(r.a,{href:"https://discord.gg/NEdNen2dSu",children:"discord"})," that can help you."]}),"\n",(0,o.jsx)(r.h2,{id:"supported-methods",children:"Supported Methods"}),"\n",(0,o.jsxs)(r.ul,{children:["\n",(0,o.jsx)(r.li,{children:(0,o.jsx)(r.a,{href:"/docs/server-docs/setup/docker-compose",children:"Docker Compose"})}),"\n",(0,o.jsx)(r.li,{children:(0,o.jsx)(r.a,{href:"/docs/server-docs/setup/caprover",children:"Caprover"})}),"\n",(0,o.jsx)(r.li,{children:(0,o.jsx)(r.a,{href:"/docs/server-docs/setup/truenas-scale-legacy",children:"TrueNAS Scale (prior v24.10)"})}),"\n",(0,o.jsx)(r.li,{children:(0,o.jsx)(r.a,{href:"/docs/server-docs/setup/truenas-scale",children:"TrueNAS Scale (since v24.10)"})}),"\n",(0,o.jsx)(r.li,{children:(0,o.jsx)(r.a,{href:"/docs/server-docs/setup/unraid",children:"UNRAID"})}),"\n",(0,o.jsx)(r.li,{children:(0,o.jsx)(r.a,{href:"/docs/server-docs/setup/synology-container-manager",children:"Synology Container Manager"})}),"\n",(0,o.jsx)(r.li,{children:(0,o.jsx)(r.a,{href:"/docs/server-docs/setup/native",children:"Native"})}),"\n"]}),"\n",(0,o.jsx)(r.h3,{id:"more-methods",children:"More Methods"}),"\n",(0,o.jsx)(r.p,{children:"We want to add more setup options to our lineup! Each system has its own way of doing things, and it can take some time and experience to set up new options just right."}),"\n",(0,o.jsxs)(r.p,{children:["We're looking for people who are excited to help out. Since we don't run a GameVault Server on every system, we need your help to add new setup options! If you're interested in joining and setting up options for any system, we'd love to have you contribute to this documentation ",(0,o.jsx)(r.a,{href:"https://github.com/Phalcode/gamevault-docs",children:"on Github"}),". Together, we can make our platform easier for everyone to use."]}),"\n",(0,o.jsx)(r.h2,{id:"what-next",children:"What Next?"}),"\n",(0,o.jsx)(r.p,{children:(0,o.jsx)(r.strong,{children:"Congratulations! \ud83e\udd73"})}),"\n",(0,o.jsx)(r.p,{children:"You now should have a server up and running. To further set up and start using server, you can follow these steps:"}),"\n",(0,o.jsxs)(r.ol,{children:["\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:[(0,o.jsx)(r.strong,{children:"Configure your server:"})," Customize the server settings to meet your specific needs. Refer to the ",(0,o.jsx)(r.a,{href:"/docs/server-docs/configuration",children:"configuration guide"})," for detailed instructions."]}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:[(0,o.jsx)(r.strong,{children:"Add some games:"})," Prepare your game files in the required format for GameVault to identify and install them correctly. Read the ",(0,o.jsx)(r.a,{href:"/docs/server-docs/structure",children:"structure chapter"})," for important information. Once ready, proceed to ",(0,o.jsx)(r.a,{href:"/docs/server-docs/adding-games",children:"add your games"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:[(0,o.jsx)(r.strong,{children:"Create your first user:"})," Set up an admin user account to gain full administrative access to the application. Refer to the ",(0,o.jsx)(r.a,{href:"/docs/server-docs/user-management",children:"user management guide"})," for instructions on setting up the first user."]}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:[(0,o.jsx)(r.strong,{children:"Enhance your games with metadata:"})," Connect your server to a metadata source such as IGDB to enrich your games with metadata. Learn how to do this in the ",(0,o.jsx)(r.a,{href:"/docs/server-docs/metadata-enrichment/metadata",children:"metadata chapter"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:[(0,o.jsx)(r.strong,{children:"(OPTIONAL) Make your server accessible outside your Local Area Network"}),": If you want to make the application accessible beyond your local network, for instance, for your friends or yourself to connect to it remotely, you'll need to configure an HTTPS reverse proxy and potentially make adjustments to firewall rules. We recommend utilizing ",(0,o.jsx)(r.a,{href:"https://nginxproxymanager.com",children:"NGINX Proxy Manager"})," for this purpose. Numerous guides are available on how to set up a reverse proxy for a Docker container, so we won't cover it in detail in this guide."]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(r.p,{children:"Enjoy your new gaming experience with GameVault!"})]})}function u(e={}){const{wrapper:r}={...(0,n.R)(),...e.components};return r?(0,o.jsx)(r,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8591:(e,r,t)=>{t.d(r,{R:()=>a,x:()=>i});var s=t(758);const o={},n=s.createContext(o);function a(e){const r=s.useContext(n);return s.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function i(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),s.createElement(n.Provider,{value:r},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[1784],{5136:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>d,contentTitle:()=>i,default:()=>u,frontMatter:()=>a,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"server-docs/setup/toc","title":"Setting up a GameVault Server","description":"There are multiple ways to set up a GameVault Server. You can choose one from below that suits you.","source":"@site/docs/server-docs/setup/setup.md","sourceDirName":"server-docs/setup","slug":"/server-docs/setup/","permalink":"/docs/server-docs/setup/","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/server-docs/setup/setup.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"sidebarPosition":1,"frontMatter":{"sidebar_position":1,"id":"toc"},"sidebar":"docs","previous":{"title":"Introduction","permalink":"/docs/intro"},"next":{"title":"Using Docker Compose","permalink":"/docs/server-docs/setup/docker-compose"}}');var o=t(6070),n=t(8591);const a={sidebar_position:1,id:"toc"},i="Setting up a GameVault Server",d={},c=[{value:"Supported Methods",id:"supported-methods",level:2},{value:"More Methods",id:"more-methods",level:3},{value:"What Next?",id:"what-next",level:2}];function l(e){const r={a:"a",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,n.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(r.header,{children:(0,o.jsx)(r.h1,{id:"setting-up-a-gamevault-server",children:"Setting up a GameVault Server"})}),"\n",(0,o.jsx)(r.p,{children:"There are multiple ways to set up a GameVault Server. You can choose one from below that suits you."}),"\n",(0,o.jsxs)(r.p,{children:["If you have any trouble setting up a GameVault server don't give up! There are a lot of helpful people on our ",(0,o.jsx)(r.a,{href:"https://discord.gg/NEdNen2dSu",children:"discord"})," that can help you."]}),"\n",(0,o.jsx)(r.h2,{id:"supported-methods",children:"Supported Methods"}),"\n",(0,o.jsxs)(r.ul,{children:["\n",(0,o.jsx)(r.li,{children:(0,o.jsx)(r.a,{href:"/docs/server-docs/setup/docker-compose",children:"Docker Compose"})}),"\n",(0,o.jsx)(r.li,{children:(0,o.jsx)(r.a,{href:"/docs/server-docs/setup/caprover",children:"Caprover"})}),"\n",(0,o.jsx)(r.li,{children:(0,o.jsx)(r.a,{href:"/docs/server-docs/setup/truenas-scale-legacy",children:"TrueNAS Scale (prior v24.10)"})}),"\n",(0,o.jsx)(r.li,{children:(0,o.jsx)(r.a,{href:"/docs/server-docs/setup/truenas-scale",children:"TrueNAS Scale (since v24.10)"})}),"\n",(0,o.jsx)(r.li,{children:(0,o.jsx)(r.a,{href:"/docs/server-docs/setup/unraid",children:"UNRAID"})}),"\n",(0,o.jsx)(r.li,{children:(0,o.jsx)(r.a,{href:"/docs/server-docs/setup/synology-container-manager",children:"Synology Container Manager"})}),"\n",(0,o.jsx)(r.li,{children:(0,o.jsx)(r.a,{href:"/docs/server-docs/setup/native",children:"Native"})}),"\n"]}),"\n",(0,o.jsx)(r.h3,{id:"more-methods",children:"More Methods"}),"\n",(0,o.jsx)(r.p,{children:"We want to add more setup options to our lineup! Each system has its own way of doing things, and it can take some time and experience to set up new options just right."}),"\n",(0,o.jsxs)(r.p,{children:["We're looking for people who are excited to help out. Since we don't run a GameVault Server on every system, we need your help to add new setup options! If you're interested in joining and setting up options for any system, we'd love to have you contribute to this documentation ",(0,o.jsx)(r.a,{href:"https://github.com/Phalcode/gamevault-docs",children:"on Github"}),". Together, we can make our platform easier for everyone to use."]}),"\n",(0,o.jsx)(r.h2,{id:"what-next",children:"What Next?"}),"\n",(0,o.jsx)(r.p,{children:(0,o.jsx)(r.strong,{children:"Congratulations! \ud83e\udd73"})}),"\n",(0,o.jsx)(r.p,{children:"You now should have a server up and running. To further set up and start using server, you can follow these steps:"}),"\n",(0,o.jsxs)(r.ol,{children:["\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:[(0,o.jsx)(r.strong,{children:"Configure your server:"})," Customize the server settings to meet your specific needs. Refer to the ",(0,o.jsx)(r.a,{href:"/docs/server-docs/configuration",children:"configuration guide"})," for detailed instructions."]}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:[(0,o.jsx)(r.strong,{children:"Add some games:"})," Prepare your game files in the required format for GameVault to identify and install them correctly. Read the ",(0,o.jsx)(r.a,{href:"/docs/server-docs/structure",children:"structure chapter"})," for important information. Once ready, proceed to ",(0,o.jsx)(r.a,{href:"/docs/server-docs/adding-games",children:"add your games"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:[(0,o.jsx)(r.strong,{children:"Create your first user:"})," Set up an admin user account to gain full administrative access to the application. Refer to the ",(0,o.jsx)(r.a,{href:"/docs/server-docs/user-management",children:"user management guide"})," for instructions on setting up the first user."]}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:[(0,o.jsx)(r.strong,{children:"Enhance your games with metadata:"})," Connect your server to a metadata source such as IGDB to enrich your games with metadata. Learn how to do this in the ",(0,o.jsx)(r.a,{href:"/docs/server-docs/metadata-enrichment/metadata",children:"metadata chapter"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(r.li,{children:["\n",(0,o.jsxs)(r.p,{children:[(0,o.jsx)(r.strong,{children:"(OPTIONAL) Make your server accessible outside your Local Area Network"}),": If you want to make the application accessible beyond your local network, for instance, for your friends or yourself to connect to it remotely, you'll need to configure an HTTPS reverse proxy and potentially make adjustments to firewall rules. We recommend utilizing ",(0,o.jsx)(r.a,{href:"https://nginxproxymanager.com",children:"NGINX Proxy Manager"})," for this purpose. Numerous guides are available on how to set up a reverse proxy for a Docker container, so we won't cover it in detail in this guide."]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(r.p,{children:"Enjoy your new gaming experience with GameVault!"})]})}function u(e={}){const{wrapper:r}={...(0,n.R)(),...e.components};return r?(0,o.jsx)(r,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8591:(e,r,t)=>{t.d(r,{R:()=>a,x:()=>i});var s=t(758);const o={},n=s.createContext(o);function a(e){const r=s.useContext(n);return s.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function i(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),s.createElement(n.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f5b06269.06a6c5b9.js b/assets/js/f5b06269.f0a80811.js similarity index 98% rename from assets/js/f5b06269.06a6c5b9.js rename to assets/js/f5b06269.f0a80811.js index 8fd97ffdf..dce4f5ed1 100644 --- a/assets/js/f5b06269.06a6c5b9.js +++ b/assets/js/f5b06269.f0a80811.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[2641],{818:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>h,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>a,toc:()=>c});const a=JSON.parse('{"id":"gamevault-plus/themes","title":"Themes","description":"With GameVault+, you gain access to a variety of additional themes and also the ability to apply custom themes, to personalize your experience.","source":"@site/docs/gamevault-plus/themes.md","sourceDirName":"gamevault-plus","slug":"/gamevault-plus/themes","permalink":"/docs/gamevault-plus/themes","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/gamevault-plus/themes.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"sidebarPosition":3,"frontMatter":{"title":"Themes","sidebar_position":3},"sidebar":"docs","previous":{"title":"Client Setup","permalink":"/docs/gamevault-plus/client-setup"},"next":{"title":"Client APIs","permalink":"/docs/gamevault-plus/client-apis"}}');var l=s(6070),n=s(8591);const o={title:"Themes",sidebar_position:3},i=void 0,h={},c=[{value:"Premium Themes",id:"premium-themes",level:2},{value:"Custom Themes",id:"custom-themes",level:2},{value:"How to Install and Apply a Custom Theme",id:"how-to-install-and-apply-a-custom-theme",level:3},{value:"Creating a Custom Theme",id:"creating-a-custom-theme",level:3},{value:"Template File",id:"template-file",level:4},{value:"Sharing Custom Themes",id:"sharing-custom-themes",level:3}];function r(e){const t={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,n.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)(t.p,{children:["With ",(0,l.jsx)(t.a,{href:"/docs/gamevault-plus/introduction",children:"GameVault+"}),", you gain access to a variety of additional themes and also the ability to apply custom themes, to personalize your experience."]}),"\n",(0,l.jsx)(t.h2,{id:"premium-themes",children:"Premium Themes"}),"\n",(0,l.jsx)(t.p,{children:"GameVault+ ships with the following premium themes by default:"}),"\n",(0,l.jsxs)(t.ul,{children:["\n",(0,l.jsxs)(t.li,{children:[(0,l.jsx)(t.strong,{children:"Phalcode (Dark)"}),": A dark theme aligned with our Phalcode brand.\n",(0,l.jsx)(t.img,{alt:"Phalcode (Dark)",src:s(5293).A+"",width:"2552",height:"1392"})]}),"\n",(0,l.jsxs)(t.li,{children:[(0,l.jsx)(t.strong,{children:"Phalcode (Light)"}),": A light theme aligned with our Phalcode brand.\n",(0,l.jsx)(t.img,{alt:"Phalcode (Light)",src:s(2917).A+"",width:"2552",height:"1392"})]}),"\n",(0,l.jsxs)(t.li,{children:[(0,l.jsx)(t.strong,{children:"Halloween (Dark)"}),": A Halloween-themed ambiance to set the mood for horror games in autumn.\n",(0,l.jsx)(t.img,{alt:"Halloween (Dark)",src:s(4252).A+"",width:"2552",height:"1392"})]}),"\n"]}),"\n",(0,l.jsx)(t.h2,{id:"custom-themes",children:"Custom Themes"}),"\n",(0,l.jsx)(t.p,{children:"GameVault+ also offers the flexibility to apply custom themes, allowing users to incorporate designs of their preference."}),"\n",(0,l.jsxs)(t.p,{children:["A public repository of custom themes shared by our community can be found ",(0,l.jsx)(t.a,{href:"https://github.com/Phalcode/gamevault-community-themes/",children:"here"}),"."]}),"\n",(0,l.jsx)(t.h3,{id:"how-to-install-and-apply-a-custom-theme",children:"How to Install and Apply a Custom Theme"}),"\n",(0,l.jsx)(t.p,{children:"To install a custom theme, follow these steps:"}),"\n",(0,l.jsxs)(t.ol,{children:["\n",(0,l.jsxs)(t.li,{children:["Place the theme .xaml file into your ",(0,l.jsx)(t.code,{children:"themes"})," folder. Depending on your GameVault installation, the ",(0,l.jsx)(t.code,{children:"themes"})," folder can be located at either ",(0,l.jsx)(t.code,{children:"%USERPROFILE%\\AppData\\Local\\Packages\\Phalcode.174950BD81C41_dymsgn3qpfjxc\\LocalCache\\Roaming\\GameVault\\themes"})," or ",(0,l.jsx)(t.code,{children:"%APPDATA%/GameVault/themes"}),"."]}),"\n",(0,l.jsxs)(t.li,{children:["Open ",(0,l.jsx)(t.code,{children:"GameVault Settings"})," and select your newly added theme under ",(0,l.jsx)(t.code,{children:"Application"})," -> ",(0,l.jsx)(t.code,{children:"Themes"}),"."]}),"\n"]}),"\n",(0,l.jsx)(t.h3,{id:"creating-a-custom-theme",children:"Creating a Custom Theme"}),"\n",(0,l.jsxs)(t.p,{children:["Creating a custom theme is straightforward. You can just create a new .xaml file based on our template and save it in the ",(0,l.jsx)(t.code,{children:"themes"})," folder."]}),"\n",(0,l.jsx)(t.h4,{id:"template-file",children:"Template File"}),"\n",(0,l.jsxs)(t.p,{children:["Just copy the latest template from the ",(0,l.jsx)(t.a,{href:"https://github.com/Phalcode/gamevault-community-themes/",children:"community themes repository"}),", edit it using a text editor, and save it in the ",(0,l.jsx)(t.code,{children:"themes"})," folder to try it out. Be aware that the hex codes are ARGB syntax and not RGB syntax."]}),"\n",(0,l.jsx)(t.h3,{id:"sharing-custom-themes",children:"Sharing Custom Themes"}),"\n",(0,l.jsxs)(t.p,{children:["You can share your custom themes with the community by creating a pull request to the ",(0,l.jsx)(t.a,{href:"https://github.com/Phalcode/gamevault-community-themes/",children:"community themes repository"}),"."]})]})}function m(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,l.jsx)(t,{...e,children:(0,l.jsx)(r,{...e})}):r(e)}},4252:(e,t,s)=>{s.d(t,{A:()=>a});const a=s.p+"assets/images/halloween_dark-063c1fbaad9983d537c5440518ab0637.png"},5293:(e,t,s)=>{s.d(t,{A:()=>a});const a=s.p+"assets/images/phalcode_dark-fc73dddb830e8427cc5f8b4f31c538df.png"},2917:(e,t,s)=>{s.d(t,{A:()=>a});const a=s.p+"assets/images/phalcode_light-433333120c068cde6000d4873c096fee.png"},8591:(e,t,s)=>{s.d(t,{R:()=>o,x:()=>i});var a=s(758);const l={},n=a.createContext(l);function o(e){const t=a.useContext(n);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:o(e.components),a.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[2641],{818:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>h,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>a,toc:()=>c});const a=JSON.parse('{"id":"gamevault-plus/themes","title":"Themes","description":"With GameVault+, you gain access to a variety of additional themes and also the ability to apply custom themes, to personalize your experience.","source":"@site/docs/gamevault-plus/themes.md","sourceDirName":"gamevault-plus","slug":"/gamevault-plus/themes","permalink":"/docs/gamevault-plus/themes","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/gamevault-plus/themes.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"sidebarPosition":3,"frontMatter":{"title":"Themes","sidebar_position":3},"sidebar":"docs","previous":{"title":"Client Setup","permalink":"/docs/gamevault-plus/client-setup"},"next":{"title":"Client APIs","permalink":"/docs/gamevault-plus/client-apis"}}');var l=s(6070),n=s(8591);const o={title:"Themes",sidebar_position:3},i=void 0,h={},c=[{value:"Premium Themes",id:"premium-themes",level:2},{value:"Custom Themes",id:"custom-themes",level:2},{value:"How to Install and Apply a Custom Theme",id:"how-to-install-and-apply-a-custom-theme",level:3},{value:"Creating a Custom Theme",id:"creating-a-custom-theme",level:3},{value:"Template File",id:"template-file",level:4},{value:"Sharing Custom Themes",id:"sharing-custom-themes",level:3}];function r(e){const t={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,n.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)(t.p,{children:["With ",(0,l.jsx)(t.a,{href:"/docs/gamevault-plus/introduction",children:"GameVault+"}),", you gain access to a variety of additional themes and also the ability to apply custom themes, to personalize your experience."]}),"\n",(0,l.jsx)(t.h2,{id:"premium-themes",children:"Premium Themes"}),"\n",(0,l.jsx)(t.p,{children:"GameVault+ ships with the following premium themes by default:"}),"\n",(0,l.jsxs)(t.ul,{children:["\n",(0,l.jsxs)(t.li,{children:[(0,l.jsx)(t.strong,{children:"Phalcode (Dark)"}),": A dark theme aligned with our Phalcode brand.\n",(0,l.jsx)(t.img,{alt:"Phalcode (Dark)",src:s(5293).A+"",width:"2552",height:"1392"})]}),"\n",(0,l.jsxs)(t.li,{children:[(0,l.jsx)(t.strong,{children:"Phalcode (Light)"}),": A light theme aligned with our Phalcode brand.\n",(0,l.jsx)(t.img,{alt:"Phalcode (Light)",src:s(2917).A+"",width:"2552",height:"1392"})]}),"\n",(0,l.jsxs)(t.li,{children:[(0,l.jsx)(t.strong,{children:"Halloween (Dark)"}),": A Halloween-themed ambiance to set the mood for horror games in autumn.\n",(0,l.jsx)(t.img,{alt:"Halloween (Dark)",src:s(4252).A+"",width:"2552",height:"1392"})]}),"\n"]}),"\n",(0,l.jsx)(t.h2,{id:"custom-themes",children:"Custom Themes"}),"\n",(0,l.jsx)(t.p,{children:"GameVault+ also offers the flexibility to apply custom themes, allowing users to incorporate designs of their preference."}),"\n",(0,l.jsxs)(t.p,{children:["A public repository of custom themes shared by our community can be found ",(0,l.jsx)(t.a,{href:"https://github.com/Phalcode/gamevault-community-themes/",children:"here"}),"."]}),"\n",(0,l.jsx)(t.h3,{id:"how-to-install-and-apply-a-custom-theme",children:"How to Install and Apply a Custom Theme"}),"\n",(0,l.jsx)(t.p,{children:"To install a custom theme, follow these steps:"}),"\n",(0,l.jsxs)(t.ol,{children:["\n",(0,l.jsxs)(t.li,{children:["Place the theme .xaml file into your ",(0,l.jsx)(t.code,{children:"themes"})," folder. Depending on your GameVault installation, the ",(0,l.jsx)(t.code,{children:"themes"})," folder can be located at either ",(0,l.jsx)(t.code,{children:"%USERPROFILE%\\AppData\\Local\\Packages\\Phalcode.174950BD81C41_dymsgn3qpfjxc\\LocalCache\\Roaming\\GameVault\\themes"})," or ",(0,l.jsx)(t.code,{children:"%APPDATA%/GameVault/themes"}),"."]}),"\n",(0,l.jsxs)(t.li,{children:["Open ",(0,l.jsx)(t.code,{children:"GameVault Settings"})," and select your newly added theme under ",(0,l.jsx)(t.code,{children:"Application"})," -> ",(0,l.jsx)(t.code,{children:"Themes"}),"."]}),"\n"]}),"\n",(0,l.jsx)(t.h3,{id:"creating-a-custom-theme",children:"Creating a Custom Theme"}),"\n",(0,l.jsxs)(t.p,{children:["Creating a custom theme is straightforward. You can just create a new .xaml file based on our template and save it in the ",(0,l.jsx)(t.code,{children:"themes"})," folder."]}),"\n",(0,l.jsx)(t.h4,{id:"template-file",children:"Template File"}),"\n",(0,l.jsxs)(t.p,{children:["Just copy the latest template from the ",(0,l.jsx)(t.a,{href:"https://github.com/Phalcode/gamevault-community-themes/",children:"community themes repository"}),", edit it using a text editor, and save it in the ",(0,l.jsx)(t.code,{children:"themes"})," folder to try it out. Be aware that the hex codes are ARGB syntax and not RGB syntax."]}),"\n",(0,l.jsx)(t.h3,{id:"sharing-custom-themes",children:"Sharing Custom Themes"}),"\n",(0,l.jsxs)(t.p,{children:["You can share your custom themes with the community by creating a pull request to the ",(0,l.jsx)(t.a,{href:"https://github.com/Phalcode/gamevault-community-themes/",children:"community themes repository"}),"."]})]})}function m(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,l.jsx)(t,{...e,children:(0,l.jsx)(r,{...e})}):r(e)}},4252:(e,t,s)=>{s.d(t,{A:()=>a});const a=s.p+"assets/images/halloween_dark-063c1fbaad9983d537c5440518ab0637.png"},5293:(e,t,s)=>{s.d(t,{A:()=>a});const a=s.p+"assets/images/phalcode_dark-fc73dddb830e8427cc5f8b4f31c538df.png"},2917:(e,t,s)=>{s.d(t,{A:()=>a});const a=s.p+"assets/images/phalcode_light-433333120c068cde6000d4873c096fee.png"},8591:(e,t,s)=>{s.d(t,{R:()=>o,x:()=>i});var a=s(758);const l={},n=a.createContext(l);function o(e){const t=a.useContext(n);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:o(e.components),a.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f8aea940.f9213e65.js b/assets/js/f8aea940.d745d5d8.js similarity index 98% rename from assets/js/f8aea940.f9213e65.js rename to assets/js/f8aea940.d745d5d8.js index e5d798252..99812238b 100644 --- a/assets/js/f8aea940.f9213e65.js +++ b/assets/js/f8aea940.d745d5d8.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[6557],{5395:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>r,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>a,toc:()=>c});const a=JSON.parse('{"id":"client-docs/themes","title":"Themes","description":"GameVault offers the option to apply different themes to your GameVault client application. With GameVault+, you gain access to a variety of additional themes and also the ability to apply custom themes, to personalize your experience.","source":"@site/docs/client-docs/themes.md","sourceDirName":"client-docs","slug":"/client-docs/themes","permalink":"/docs/client-docs/themes","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/client-docs/themes.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183462000,"frontMatter":{"title":"Themes"},"sidebar":"docs","previous":{"title":"GUI Overview","permalink":"/docs/client-docs/gui"},"next":{"title":"REST API Usage","permalink":"/docs/advanced-usage/rest-api"}}');var i=s(6070),n=s(8591);const o={title:"Themes"},l=void 0,r={},c=[{value:"Free Themes",id:"free-themes",level:2},{value:"Premium Themes",id:"premium-themes",level:2},{value:"Custom Themes",id:"custom-themes",level:2}];function d(e){const t={a:"a",h2:"h2",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,n.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(t.p,{children:["GameVault offers the option to apply different themes to your GameVault client application. With ",(0,i.jsx)(t.a,{href:"/docs/gamevault-plus/introduction",children:"GameVault+"}),", you gain access to a variety of additional themes and also the ability to apply custom themes, to personalize your experience."]}),"\n",(0,i.jsx)(t.h2,{id:"free-themes",children:"Free Themes"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Default (Dark)"}),": The default GameVault theme, reflecting the 2024 GameVault rebrand with dark tones.\n",(0,i.jsx)(t.img,{alt:"Default (Dark)",src:s(3762).A+"",width:"2552",height:"1392"})]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Default (Light)"}),": An alternative light version of the default GameVault theme, also based on the 2024 GameVault rebrand.\n",(0,i.jsx)(t.img,{alt:"Default (Light)",src:s(316).A+"",width:"2552",height:"1392"})]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Classic (Dark)"}),": This theme preserves the traditional application colors for users accustomed to the old design.\n",(0,i.jsx)(t.img,{alt:"Classic (Dark)",src:s(3899).A+"",width:"2552",height:"1392"})]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"premium-themes",children:"Premium Themes"}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.a,{href:"/docs/gamevault-plus/introduction",children:"GameVault+"})," comes with more themes you can choose from. A list of premium themes is available in the ",(0,i.jsx)(t.a,{href:"/docs/gamevault-plus/themes",children:"GameVault+ Themes"})," section of the documentation."]}),"\n",(0,i.jsx)(t.h2,{id:"custom-themes",children:"Custom Themes"}),"\n",(0,i.jsxs)(t.p,{children:["Custom themes are only available for ",(0,i.jsx)(t.a,{href:"/docs/gamevault-plus/introduction",children:"GameVault+"})," subscribers. See ",(0,i.jsx)(t.a,{href:"/docs/gamevault-plus/themes",children:"GameVault+ Themes"})," for more information."]})]})}function m(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},3899:(e,t,s)=>{s.d(t,{A:()=>a});const a=s.p+"assets/images/classic_dark-bec363a5279cb92c28e78e6b03bf9682.png"},3762:(e,t,s)=>{s.d(t,{A:()=>a});const a=s.p+"assets/images/default_dark-5736b1f79f7b13358172ed71dc831afd.png"},316:(e,t,s)=>{s.d(t,{A:()=>a});const a=s.p+"assets/images/default_light-5bc18bd3650cc0d98fb39d46d70c9e2f.png"},8591:(e,t,s)=>{s.d(t,{R:()=>o,x:()=>l});var a=s(758);const i={},n=a.createContext(i);function o(e){const t=a.useContext(n);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),a.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[6557],{5395:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>r,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>a,toc:()=>c});const a=JSON.parse('{"id":"client-docs/themes","title":"Themes","description":"GameVault offers the option to apply different themes to your GameVault client application. With GameVault+, you gain access to a variety of additional themes and also the ability to apply custom themes, to personalize your experience.","source":"@site/docs/client-docs/themes.md","sourceDirName":"client-docs","slug":"/client-docs/themes","permalink":"/docs/client-docs/themes","draft":false,"unlisted":false,"editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/docs/client-docs/themes.md","tags":[],"version":"current","lastUpdatedBy":"Alper Alkan","lastUpdatedAt":1733183663000,"frontMatter":{"title":"Themes"},"sidebar":"docs","previous":{"title":"GUI Overview","permalink":"/docs/client-docs/gui"},"next":{"title":"REST API Usage","permalink":"/docs/advanced-usage/rest-api"}}');var i=s(6070),n=s(8591);const o={title:"Themes"},l=void 0,r={},c=[{value:"Free Themes",id:"free-themes",level:2},{value:"Premium Themes",id:"premium-themes",level:2},{value:"Custom Themes",id:"custom-themes",level:2}];function d(e){const t={a:"a",h2:"h2",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,n.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(t.p,{children:["GameVault offers the option to apply different themes to your GameVault client application. With ",(0,i.jsx)(t.a,{href:"/docs/gamevault-plus/introduction",children:"GameVault+"}),", you gain access to a variety of additional themes and also the ability to apply custom themes, to personalize your experience."]}),"\n",(0,i.jsx)(t.h2,{id:"free-themes",children:"Free Themes"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Default (Dark)"}),": The default GameVault theme, reflecting the 2024 GameVault rebrand with dark tones.\n",(0,i.jsx)(t.img,{alt:"Default (Dark)",src:s(3762).A+"",width:"2552",height:"1392"})]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Default (Light)"}),": An alternative light version of the default GameVault theme, also based on the 2024 GameVault rebrand.\n",(0,i.jsx)(t.img,{alt:"Default (Light)",src:s(316).A+"",width:"2552",height:"1392"})]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Classic (Dark)"}),": This theme preserves the traditional application colors for users accustomed to the old design.\n",(0,i.jsx)(t.img,{alt:"Classic (Dark)",src:s(3899).A+"",width:"2552",height:"1392"})]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"premium-themes",children:"Premium Themes"}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.a,{href:"/docs/gamevault-plus/introduction",children:"GameVault+"})," comes with more themes you can choose from. A list of premium themes is available in the ",(0,i.jsx)(t.a,{href:"/docs/gamevault-plus/themes",children:"GameVault+ Themes"})," section of the documentation."]}),"\n",(0,i.jsx)(t.h2,{id:"custom-themes",children:"Custom Themes"}),"\n",(0,i.jsxs)(t.p,{children:["Custom themes are only available for ",(0,i.jsx)(t.a,{href:"/docs/gamevault-plus/introduction",children:"GameVault+"})," subscribers. See ",(0,i.jsx)(t.a,{href:"/docs/gamevault-plus/themes",children:"GameVault+ Themes"})," for more information."]})]})}function m(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},3899:(e,t,s)=>{s.d(t,{A:()=>a});const a=s.p+"assets/images/classic_dark-bec363a5279cb92c28e78e6b03bf9682.png"},3762:(e,t,s)=>{s.d(t,{A:()=>a});const a=s.p+"assets/images/default_dark-5736b1f79f7b13358172ed71dc831afd.png"},316:(e,t,s)=>{s.d(t,{A:()=>a});const a=s.p+"assets/images/default_light-5bc18bd3650cc0d98fb39d46d70c9e2f.png"},8591:(e,t,s)=>{s.d(t,{R:()=>o,x:()=>l});var a=s(758);const i={},n=a.createContext(i);function o(e){const t=a.useContext(n);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),a.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/main.26b6f399.js b/assets/js/main.0ba13922.js similarity index 98% rename from assets/js/main.26b6f399.js rename to assets/js/main.0ba13922.js index 7616e9808..a936e57e9 100644 --- a/assets/js/main.26b6f399.js +++ b/assets/js/main.0ba13922.js @@ -1,2 +1,2 @@ -/*! For license information please see main.26b6f399.js.LICENSE.txt */ -(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[8792],{8755:(e,t,n)=>{var r={"./prism-bash":8520,"./prism-json":8228};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=8755},5765:(e,t,n)=>{"use strict";n.d(t,{A:()=>p});n(758);var r=n(3485),o=n.n(r),a=n(4054);const i={"0058b4c6":[()=>n.e(849).then(n.t.bind(n,6164,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-175.json",6164],"007d2baa":[()=>n.e(5112).then(n.bind(n,250)),"@site/docs/server-docs/media.md",250],"009c376a":[()=>n.e(1122).then(n.t.bind(n,2516,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-support-4e8.json",2516],"00dfabf5":[()=>n.e(2079).then(n.t.bind(n,4632,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-subscription-223.json",4632],"00fcf151":[()=>n.e(315).then(n.t.bind(n,9771,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-transparency-2c4.json",9771],"013bccfd":[()=>n.e(7145).then(n.t.bind(n,8928,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-improvement-e54.json",8928],"01a85c17":[()=>Promise.all([n.e(1869),n.e(8209)]).then(n.bind(n,3209)),"@theme/BlogTagsListPage",3209],"01fcf7cb":[()=>n.e(9809).then(n.t.bind(n,9887,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-engagement-408.json",9887],"03919031":[()=>n.e(9161).then(n.t.bind(n,1854,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-gratitude-944.json",1854],"04a3aba4":[()=>n.e(753).then(n.t.bind(n,8150,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-market-analysis-e77.json",8150],"04c04fa2":[()=>n.e(3325).then(n.bind(n,4082)),"@site/docs/gamevault-plus/integrations/playnite.md",4082],"063ffaec":[()=>n.e(5173).then(n.t.bind(n,1940,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-lemmy-community-launch-0dd.json",1940],"065dfc11":[()=>n.e(4469).then(n.t.bind(n,4820,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-domain-acquisition-75b.json",4820],"0748c3bc":[()=>n.e(5723).then(n.bind(n,4892)),"@site/docs/server-docs/metadata-enrichment/metadata.md",4892],"0766ce7b":[()=>n.e(5455).then(n.t.bind(n,6563,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-update-1f1.json",6563],"077db3c5":[()=>n.e(1028).then(n.t.bind(n,4819,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-client-application-update-423.json",4819],"0a27b0d0":[()=>n.e(3537).then(n.t.bind(n,6529,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-code-access-151.json",6529],"0ad562e6":[()=>n.e(3362).then(n.t.bind(n,2079,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-development-milestones-2fd.json",2079],"0b705c82":[()=>n.e(9030).then(n.bind(n,4855)),"@site/blog/2023-12-09.md",4855],"0bd541ed":[()=>n.e(2230).then(n.bind(n,8872)),"@site/blog/2023-07-19.md?truncated=true",8872],"0bfa7fcc":[()=>n.e(1199).then(n.bind(n,978)),"@site/blog/2023-07-13.md",978],"0c6a4732":[()=>n.e(1415).then(n.t.bind(n,1784,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-rawg-api-f4d.json",1784],"0d3164f5":[()=>n.e(2278).then(n.t.bind(n,9758,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-reddit-forum-6ca.json",9758],"0e384e19":[()=>n.e(3976).then(n.bind(n,2434)),"@site/docs/intro.md",2434],"10d38074":[()=>n.e(5662).then(n.t.bind(n,7465,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-app-0c9.json",7465],"113d89da":[()=>n.e(1340).then(n.t.bind(n,6855,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-spreading-the-word-793.json",6855],"1334883d":[()=>n.e(6039).then(n.t.bind(n,3850,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-safe-environment-fa4.json",3850],"14b6aafb":[()=>n.e(3290).then(n.bind(n,4556)),"@site/docs/server-docs/adding-games.md",4556],"1630eae8":[()=>n.e(2858).then(n.bind(n,6112)),"@site/docs/server-docs/setup/truenas-scale.md",6112],17896441:[()=>Promise.all([n.e(1869),n.e(8185),n.e(8401)]).then(n.bind(n,4906)),"@theme/DocItem",4906],18747338:[()=>n.e(9470).then(n.t.bind(n,4434,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-discord-channel-e8c.json",4434],"18d9fd7d":[()=>n.e(3158).then(n.bind(n,9426)),"@site/docs/server-docs/plugins.md",9426],"193fe191":[()=>n.e(2386).then(n.bind(n,5542)),"@site/docs/server-docs/metadata-enrichment/provider-igdb.md",5542],"19e4f252":[()=>n.e(843).then(n.t.bind(n,608,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-subreddit-migration-749.json",608],"1dd5d307":[()=>n.e(5033).then(n.t.bind(n,8853,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-game-3e5.json",8853],"1e0a1681":[()=>n.e(8532).then(n.bind(n,7899)),"@site/docs/server-docs/setup/synology-container-manager.md",7899],"1ff343c8":[()=>n.e(4581).then(n.t.bind(n,9385,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-simplifying-game-installation-c9f.json",9385],"2024b8b1":[()=>n.e(9738).then(n.bind(n,1249)),"@site/blog/2023-07-29.md?truncated=true",1249],"204759e4":[()=>n.e(9951).then(n.t.bind(n,5545,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-partnership-7e9.json",5545],20661643:[()=>n.e(6467).then(n.t.bind(n,3557,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-tech-progress-c60.json",3557],"2296bbef":[()=>n.e(7619).then(n.t.bind(n,9323,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-hybrid-model-384.json",9323],"23a0eab7":[()=>n.e(7614).then(n.t.bind(n,5697,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-source-available-software-761.json",5697],"24c2f136":[()=>n.e(1718).then(n.t.bind(n,1544,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-box-representation-da0.json",1544],"251cbb95":[()=>n.e(5450).then(n.t.bind(n,1942,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-harassment-11d.json",1942],"2608b85a":[()=>n.e(2691).then(n.t.bind(n,9508,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-negative-narratives-b3f.json",9508],"264f4708":[()=>n.e(7706).then(n.bind(n,9789)),"@site/docs/advanced-usage/early-access-program.md",9789],"26ca8ce1":[()=>n.e(7554).then(n.t.bind(n,1159,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-lemmy-community-5b4.json",1159],"2a693baa":[()=>n.e(5810).then(n.t.bind(n,1382,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-control-29f.json",1382],"2aa0a660":[()=>n.e(7e3).then(n.t.bind(n,6143,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-subscription-model-e21.json",6143],"2e008a3a":[()=>n.e(4769).then(n.bind(n,1558)),"@site/blog/2023-07-13.md?truncated=true",1558],"2f44e9f7":[()=>n.e(7652).then(n.t.bind(n,3840,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-discord-server-promotion-03a.json",3840],"31861b5f":[()=>n.e(905).then(n.bind(n,6356)),"@site/docs/gamevault-plus/integrations/steam.md",6356],"357ebdd0":[()=>n.e(5289).then(n.t.bind(n,9792,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-user-participation-4a2.json",9792],"36994c47":[()=>n.e(9858).then(n.t.bind(n,5516,19)),"@generated/docusaurus-plugin-content-blog/default/__plugin.json",5516],"36bc9c65":[()=>n.e(14).then(n.t.bind(n,1049,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-client-update-ad5.json",1049],"3a2db09e":[()=>n.e(8121).then(n.t.bind(n,8070,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-df9.json",8070],"3ac72a53":[()=>n.e(4674).then(n.t.bind(n,8832,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-lemmy-forum-09e.json",8832],"3af271b3":[()=>n.e(6030).then(n.t.bind(n,6955,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-upcoming-update-894.json",6955],"3b659bf0":[()=>n.e(3388).then(n.t.bind(n,3724,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-logo-deciphering-a29.json",3724],"3bdf5af6":[()=>n.e(9316).then(n.t.bind(n,5941,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-notes-dea.json",5941],"3f6275a8":[()=>n.e(5759).then(n.t.bind(n,1657,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-bugs-30a.json",1657],"3f99d67c":[()=>n.e(2690).then(n.t.bind(n,5374,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-new-logo-031.json",5374],"3fc2248c":[()=>n.e(2762).then(n.t.bind(n,2674,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-community-feedback-110.json",2674],"3fc3119e":[()=>n.e(3470).then(n.bind(n,7193)),"@site/blog/2023-12-09.md?truncated=true",7193],"416eca3f":[()=>n.e(8130).then(n.t.bind(n,9059,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-age-restrictions-5d3.json",9059],"41e301a0":[()=>n.e(8160).then(n.t.bind(n,9976,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-trolls-732.json",9976],"435302bb":[()=>n.e(2298).then(n.bind(n,2270)),"@site/docs/client-docs/how-to-use.md",2270],"438c7fa2":[()=>n.e(8733).then(n.bind(n,1495)),"@site/docs/server-docs/server-news.md",1495],"4534f50b":[()=>n.e(2206).then(n.t.bind(n,2268,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-threats-86b.json",2268],"46e7f252":[()=>n.e(9724).then(n.t.bind(n,5469,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-metadata-b2d.json",5469],"47aca6da":[()=>n.e(6484).then(n.bind(n,145)),"@site/blog/2024-04-01/2024-04-01.md?truncated=true",145],"4a631206":[()=>n.e(6188).then(n.bind(n,2934)),"@site/docs/server-docs/updating-games.md",2934],"4a6974fe":[()=>n.e(6175).then(n.bind(n,3471)),"@site/blog/2024-04-01/2024-04-01.md",3471],"4d393b3e":[()=>n.e(7624).then(n.bind(n,289)),"@site/docs/server-docs/backup-and-restore.md",289],"4e01c0f4":[()=>n.e(4308).then(n.t.bind(n,2406,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-platform-b8a.json",2406],"4efd7f8f":[()=>n.e(5877).then(n.t.bind(n,1086,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-exclusive-preview-10f.json",1086],"4f991444":[()=>n.e(3580).then(n.t.bind(n,2155,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-software-updates-c8d.json",2155],"4fb3dfba":[()=>n.e(8001).then(n.t.bind(n,9420,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-backend-application-migration-545.json",9420],"4ff7c2f7":[()=>n.e(5246).then(n.t.bind(n,4536,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-game-hub-801.json",4536],"500e67e3":[()=>n.e(3360).then(n.t.bind(n,4641,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-poll-results-c1e.json",4641],"5046667d":[()=>n.e(6395).then(n.bind(n,167)),"@site/docs/server-docs/websockets.md",167],"51e7bf36":[()=>n.e(1334).then(n.bind(n,6293)),"@site/docs/client-docs/data.md",6293],"51fa4cf1":[()=>n.e(9734).then(n.t.bind(n,3525,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-game-stash-816.json",3525],"524a34e7":[()=>n.e(5138).then(n.t.bind(n,2265,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-harbor-82c.json",2265],"534e7ef5":[()=>n.e(625).then(n.t.bind(n,6287,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-subscription-to-updates-role-792.json",6287],"55dfe132":[()=>n.e(3314).then(n.bind(n,9053)),"@site/blog/2023-11-20.md",9053],"573c7c88":[()=>n.e(3903).then(n.t.bind(n,8626,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-self-hosted-newsletter-6aa.json",8626],"591d17b8":[()=>n.e(4028).then(n.t.bind(n,4669,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-microsoft-store-publication-729.json",4669],"5a2f6c5d":[()=>n.e(811).then(n.t.bind(n,2566,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-microsoft-store-736.json",2566],"5a8f8fa9":[()=>n.e(4983).then(n.t.bind(n,2067,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-installation-pipeline-ebc.json",2067],"5ac1a9ec":[()=>n.e(1267).then(n.t.bind(n,7790,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-alternative-214.json",7790],"5b1700d1":[()=>n.e(7903).then(n.bind(n,6709)),"@site/docs/server-docs/setup/truenas-scale-legacy.md",6709],"5baa483a":[()=>n.e(2888).then(n.t.bind(n,8961,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-speculation-a41.json",8961],"5bbd8cf3":[()=>n.e(894).then(n.t.bind(n,996,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-kanban-board-262.json",996],"5c99339f":[()=>n.e(3294).then(n.t.bind(n,5248,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-backend-c70.json",5248],"5db30e8c":[()=>n.e(1767).then(n.t.bind(n,9613,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-self-hosted-4fa.json",9613],"5e5c84c3":[()=>n.e(6051).then(n.bind(n,2512)),"@site/docs/server-docs/game-types.md",2512],"5e95c892":[()=>n.e(9647).then(n.bind(n,1056)),"@theme/DocsRoot",1056],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,4784)),"@generated/docusaurus.config",4784],"5fa82f91":[()=>n.e(4939).then(n.t.bind(n,4194,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-game-shelf-102.json",4194],"61be0f73":[()=>n.e(3555).then(n.bind(n,4142)),"@site/docs/server-docs/structure.md",4142],"621db11d":[()=>Promise.all([n.e(1869),n.e(701),n.e(4212)]).then(n.bind(n,7481)),"@theme/Blog/Pages/BlogAuthorsListPage",7481],"63511f3c":[()=>n.e(2671).then(n.t.bind(n,6735,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-decision-making-c62.json",6735],"63b46e50":[()=>n.e(3328).then(n.t.bind(n,4062,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-health-monitoring-c3c.json",4062],"6535206c":[()=>n.e(295).then(n.t.bind(n,7140,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-app-name-migration-54a.json",7140],"66e9ef90":[()=>n.e(791).then(n.t.bind(n,2744,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-analytics-43c.json",2744],"678c8d60":[()=>n.e(9751).then(n.t.bind(n,7364,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-drm-free-games-d6f.json",7364],"6875c492":[()=>Promise.all([n.e(1869),n.e(8185),n.e(701),n.e(4813)]).then(n.bind(n,9346)),"@theme/BlogTagsPostsPage",9346],"6a40fd04":[()=>n.e(6590).then(n.t.bind(n,8993,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-renaming-app-716.json",8993],"6bbbce94":[()=>n.e(9636).then(n.t.bind(n,5508,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-family-friendly-d7c.json",5508],"6e64f266":[()=>n.e(902).then(n.t.bind(n,6508,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-documentation-migration-461.json",6508],"6ff2a8aa":[()=>n.e(1474).then(n.t.bind(n,1624,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-poll-55a.json",1624],"71f025ea":[()=>n.e(2124).then(n.t.bind(n,6381,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-community-driven-c68.json",6381],"71f72e4c":[()=>n.e(8106).then(n.t.bind(n,4681,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-updates-66c.json",4681],"73ad9a8e":[()=>n.e(3629).then(n.t.bind(n,2533,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-theme-b53.json",2533],"7424d9c3":[()=>n.e(7703).then(n.bind(n,3646)),"@site/blog/2023-07-08.md",3646],"7486ddfc":[()=>n.e(6053).then(n.t.bind(n,460,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-november-update-7a2.json",460],"7489ed02":[()=>n.e(8354).then(n.bind(n,6839)),"@site/blog/2023-07-01.md?truncated=true",6839],"751a244a":[()=>n.e(9514).then(n.t.bind(n,584,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-community-management-84a.json",584],"7558b7a2":[()=>n.e(7400).then(n.t.bind(n,2016,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-transition-process-04a.json",2016],"7576ca6a":[()=>n.e(135).then(n.t.bind(n,4970,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-video-games-c79.json",4970],"7754063d":[()=>n.e(8341).then(n.t.bind(n,7565,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-game-vault-journey-706.json",7565],"77a8abe0":[()=>n.e(4404).then(n.t.bind(n,3021,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-continued-support-22f.json",3021],"77f7e459":[()=>n.e(3973).then(n.t.bind(n,9912,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-git-hub-issue-e5d.json",9912],"7864c493":[()=>n.e(7457).then(n.t.bind(n,2565,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-blackmail-b61.json",2565],"7a0110f5":[()=>n.e(7530).then(n.t.bind(n,9714,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-gaming-platform-8e2.json",9714],"7b99d5ba":[()=>n.e(5572).then(n.bind(n,5983)),"@site/blog/2023-07-09.md?truncated=true",5983],"7c4a7780":[()=>n.e(6410).then(n.t.bind(n,4965,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-gaming-experience-d09.json",4965],"7ef69c2b":[()=>n.e(6755).then(n.bind(n,7067)),"@site/blog/2024-10-20.md?truncated=true",7067],80292675:[()=>n.e(3716).then(n.bind(n,3054)),"@site/docs/server-docs/setup/unraid.md",3054],"80404bfe":[()=>n.e(3134).then(n.t.bind(n,9894,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-feature-requests-f1b.json",9894],"805ec11d":[()=>n.e(4974).then(n.t.bind(n,6913,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-server-update-54e.json",6913],"814f3328":[()=>n.e(7472).then(n.t.bind(n,5513,19)),"~blog/default/blog-post-list-prop-default.json",5513],"8167ef7e":[()=>n.e(6142).then(n.t.bind(n,7988,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-developers-001.json",7988],"82c81335":[()=>n.e(1584).then(n.t.bind(n,8417,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-testing-29d.json",8417],"8577c450":[()=>n.e(3354).then(n.t.bind(n,1944,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-spam-cff.json",1944],"8795eea9":[()=>n.e(3154).then(n.bind(n,9324)),"@site/blog/2023-07-20.md?truncated=true",9324],"87cefd36":[()=>n.e(7601).then(n.t.bind(n,7498,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-cloud-based-game-platforms-ee3.json",7498],"8852925a":[()=>n.e(8793).then(n.t.bind(n,5033,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-new-name-announcement-577.json",5033],"886fdd87":[()=>n.e(8896).then(n.t.bind(n,1976,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-git-hub-b4b.json",1976],"89db6d1d":[()=>n.e(925).then(n.bind(n,9060)),"@site/blog/2023-07-15.md?truncated=true",9060],"8a3716b4":[()=>n.e(3503).then(n.t.bind(n,4453,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-metadata-framework-ab4.json",4453],"8a3c85db":[()=>n.e(8611).then(n.t.bind(n,3658,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-game-vault-domain-161.json",3658],"8b8fd5aa":[()=>n.e(1172).then(n.t.bind(n,8707,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-polls-463.json",8707],"8ba18f4f":[()=>n.e(5735).then(n.bind(n,6479)),"@site/docs/server-docs/parental-control.md",6479],"8c4108df":[()=>n.e(179).then(n.bind(n,7667)),"@site/docs/server-docs/setup/docker-compose.md",7667],"8e064018":[()=>n.e(3163).then(n.t.bind(n,8232,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-celebration-of-achievements-856.json",8232],"8ea09047":[()=>n.e(9385).then(n.t.bind(n,600,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-page-2-433.json",600],"8f8e2e78":[()=>n.e(1142).then(n.t.bind(n,2884,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-future-development-ef2.json",2884],"8ff99662":[()=>n.e(6355).then(n.t.bind(n,4466,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-game-vault-app-80a.json",4466],"9019cc36":[()=>n.e(8095).then(n.bind(n,5305)),"@site/blog/2024-10-20.md",5305],"9046e000":[()=>n.e(6013).then(n.t.bind(n,6231,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-solution-4b2.json",6231],"9147d3af":[()=>n.e(1840).then(n.bind(n,8063)),"@site/blog/2024-03-28.md?truncated=true",8063],"915cb6f7":[()=>n.e(384).then(n.t.bind(n,9547,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-april-fools-1f0.json",9547],92440753:[()=>n.e(2873).then(n.t.bind(n,4787,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-financial-assistance-4b1.json",4787],"92fb1dcd":[()=>n.e(9552).then(n.t.bind(n,6129,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-roadmap-e35.json",6129],"9404f843":[()=>n.e(5849).then(n.bind(n,5367)),"@site/docs/gamevault-plus/client-apis.md",5367],"9748c478":[()=>n.e(3911).then(n.bind(n,2008)),"@site/blog/2023-07-15.md",2008],"979ccdb6":[()=>n.e(2082).then(n.t.bind(n,4846,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-racist-e34.json",4846],"99d3d5ac":[()=>n.e(9931).then(n.t.bind(n,5845,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-game-development-d1f.json",5845],"99f2b7e6":[()=>n.e(4309).then(n.t.bind(n,5318,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-twitch-tv-219.json",5318],"9b1663d8":[()=>n.e(8446).then(n.t.bind(n,8819,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-gaming-66f.json",8819],"9b95b357":[()=>n.e(8069).then(n.t.bind(n,8642,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-gaming-servers-279.json",8642],"9d5a95a9":[()=>n.e(7782).then(n.t.bind(n,8324,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-igdb-8f8.json",8324],"9d86e7fa":[()=>n.e(4129).then(n.t.bind(n,1136,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-announcement-97a.json",1136],"9d9f8394":[()=>n.e(9013).then(n.bind(n,3862)),"@site/docs/troubleshooting.md",3862],"9e4087bc":[()=>n.e(2711).then(n.bind(n,524)),"@theme/BlogArchivePage",524],"9e75d8bf":[()=>n.e(6569).then(n.t.bind(n,324,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-platform-values-e98.json",324],"9fafd272":[()=>n.e(9482).then(n.t.bind(n,3917,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-game-vault-50c.json",3917],a1072f2a:[()=>n.e(4365).then(n.bind(n,1055)),"@site/docs/client-docs/gui.md",1055],a1216fa4:[()=>n.e(8457).then(n.bind(n,5660)),"@site/blog/2023-07-24.md",5660],a1f57275:[()=>n.e(2333).then(n.bind(n,8053)),"@site/blog/2023-07-01.md",8053],a3fd4b44:[()=>n.e(11).then(n.t.bind(n,4080,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-file-server-7d3.json",4080],a67f6c3e:[()=>n.e(2652).then(n.t.bind(n,5054,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-videogame-96d.json",5054],a6aa9e1f:[()=>Promise.all([n.e(1869),n.e(8185),n.e(701),n.e(7643)]).then(n.bind(n,7782)),"@theme/BlogListPage",7782],a6fed517:[()=>n.e(7672).then(n.t.bind(n,5219,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-database-781.json",5219],a7456010:[()=>n.e(1235).then(n.t.bind(n,8552,19)),"@generated/docusaurus-plugin-content-pages/default/__plugin.json",8552],a7bd4aaa:[()=>n.e(7098).then(n.bind(n,6941)),"@theme/DocVersionRoot",6941],a7d982d4:[()=>n.e(7268).then(n.t.bind(n,6713,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-software-e0e.json",6713],a94703ab:[()=>Promise.all([n.e(1869),n.e(9048)]).then(n.bind(n,2121)),"@theme/DocRoot",2121],ab6782ba:[()=>n.e(4146).then(n.t.bind(n,9535,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-steam-739.json",9535],aba21aa0:[()=>n.e(5742).then(n.t.bind(n,7093,19)),"@generated/docusaurus-plugin-content-docs/default/__plugin.json",7093],acecf23e:[()=>n.e(1903).then(n.t.bind(n,1912,19)),"~blog/default/blogMetadata-default.json",1912],aeb57253:[()=>n.e(885).then(n.t.bind(n,9253,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-surge-of-new-users-416.json",9253],b1d7f5b9:[()=>n.e(1387).then(n.bind(n,4038)),"@site/docs/server-docs/indexing.md",4038],b28c3188:[()=>n.e(3468).then(n.bind(n,3235)),"@site/docs/server-docs/configuration.md",3235],b2ade0e8:[()=>n.e(6216).then(n.t.bind(n,391,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-open-source-bc6.json",391],b2c9ad8a:[()=>n.e(5541).then(n.t.bind(n,2523,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-app-optimization-286.json",2523],b4068411:[()=>n.e(7881).then(n.bind(n,8079)),"@site/docs/server-docs/setup/caprover.md",8079],b493ea72:[()=>n.e(5124).then(n.bind(n,2432)),"@site/blog/2023-07-20.md",2432],b7026fb3:[()=>n.e(8033).then(n.bind(n,5149)),"@site/blog/2023-07-09.md",5149],b8ecf3c5:[()=>n.e(7508).then(n.bind(n,5905)),"@site/docs/client-docs/setup.md",5905],ba3af7ad:[()=>n.e(9378).then(n.bind(n,6642)),"@site/blog/2023-07-08.md?truncated=true",6642],ba57e113:[()=>n.e(7766).then(n.bind(n,2975)),"@site/docs/license-contribute.md",2975],bb12dd4d:[()=>n.e(5774).then(n.t.bind(n,5990,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-logo-concept-discussion-9f8.json",5990],bc0aa6af:[()=>n.e(9155).then(n.t.bind(n,5251,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-plugin-system-7eb.json",5251],bcc2422e:[()=>n.e(1312).then(n.t.bind(n,6299,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-ui-redesign-87d.json",6299],bdf26d57:[()=>n.e(671).then(n.t.bind(n,2166,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-collaboration-ed6.json",2166],c15d9823:[()=>n.e(8146).then(n.t.bind(n,9328,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-bd9.json",9328],c332f8df:[()=>n.e(482).then(n.bind(n,9932)),"@site/blog/2023-07-19.md",9932],c4f5d8e4:[()=>n.e(2634).then(n.bind(n,3839)),"@site/src/pages/index.js",3839],c71ef62c:[()=>n.e(8790).then(n.t.bind(n,1187,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-keyhole-representation-72c.json",1187],c7bbcbc7:[()=>n.e(6260).then(n.t.bind(n,2227,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-startup-dff.json",2227],c8472403:[()=>n.e(2932).then(n.t.bind(n,1545,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-special-thanks-d94.json",1545],c89c7974:[()=>n.e(9267).then(n.bind(n,2255)),"@site/docs/advanced-usage/rest-api.md",2255],c8fbe42c:[()=>n.e(9748).then(n.t.bind(n,4022,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-selfhosted-podcast-cda.json",4022],c9618c72:[()=>n.e(9484).then(n.t.bind(n,3718,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-official-installations-22e.json",3718],c9cac9d9:[()=>n.e(4918).then(n.t.bind(n,371,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-release-6bd.json",371],c9d2adb2:[()=>n.e(3506).then(n.bind(n,1833)),"@site/docs/gamevault-plus/client-setup.md",1833],ca2d5c98:[()=>n.e(9218).then(n.t.bind(n,7527,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-motivation-041.json",7527],cc0b9cf0:[()=>n.e(4605).then(n.t.bind(n,8043,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-source-available-927.json",8043],cc616304:[()=>n.e(2419).then(n.t.bind(n,5029,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-easter-egg-364.json",5029],ccc49370:[()=>Promise.all([n.e(1869),n.e(8185),n.e(701),n.e(3249)]).then(n.bind(n,6632)),"@theme/BlogPostPage",6632],cd59c184:[()=>n.e(9272).then(n.bind(n,7850)),"@site/blog/2024-04-14.md",7850],cd781ce1:[()=>n.e(1377).then(n.t.bind(n,1138,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-voting-6d1.json",1138],cddec16f:[()=>n.e(2275).then(n.bind(n,841)),"@site/docs/server-docs/setup/native.md",841],cee5390f:[()=>n.e(5339).then(n.t.bind(n,6775,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-ui-update-5b0.json",6775],d527dda4:[()=>n.e(4440).then(n.t.bind(n,7926,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-coding-chronicle-d70.json",7926],d53cd084:[()=>n.e(1504).then(n.t.bind(n,6997,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-parental-control-493.json",6997],d5823966:[()=>n.e(3088).then(n.t.bind(n,628,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-features-ebb.json",628],d5dcebd7:[()=>n.e(6659).then(n.t.bind(n,4810,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-new-name-7a4.json",4810],d6138fd2:[()=>n.e(9329).then(n.t.bind(n,2683,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-user-engagement-9c0.json",2683],d72f98b9:[()=>n.e(8996).then(n.bind(n,3157)),"@site/docs/gamevault-plus/integrations/discord.md",3157],d82a1228:[()=>n.e(3867).then(n.t.bind(n,6850,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-early-access-da1.json",6850],d9341347:[()=>n.e(2680).then(n.t.bind(n,9622,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-multi-user-authentication-6f6.json",9622],d9d4e1f1:[()=>n.e(8987).then(n.bind(n,3567)),"@site/blog/2023-11-20.md?truncated=true",3567],daddf69a:[()=>n.e(2256).then(n.t.bind(n,4674,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-gaming-community-bc6.json",4674],daf02673:[()=>n.e(8022).then(n.t.bind(n,8461,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-public-cb9.json",8461],db0b0363:[()=>n.e(9).then(n.t.bind(n,5674,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-software-licensing-7b3.json",5674],dc8e8e39:[()=>n.e(488).then(n.t.bind(n,5102,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-community-623.json",5102],dcb9a9e8:[()=>n.e(8190).then(n.bind(n,2636)),"@site/docs/advanced-usage/linux-client.md",2636],dd9b1d9d:[()=>n.e(1822).then(n.t.bind(n,1251,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-success-3d9.json",1251],defc3e62:[()=>n.e(2251).then(n.t.bind(n,7761,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-sustainability-369.json",7761],df8deb2d:[()=>n.e(8530).then(n.t.bind(n,8878,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-game-vault-milestone-4c3.json",8878],e07621e3:[()=>n.e(2220).then(n.t.bind(n,2,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-love-for-game-vault-828.json",2],e0a15777:[()=>n.e(4160).then(n.t.bind(n,8794,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-revenue-generation-e31.json",8794],e0c5798e:[()=>n.e(7125).then(n.bind(n,3853)),"@site/blog/2024-03-28.md",3853],e0da75fc:[()=>n.e(6328).then(n.bind(n,9774)),"@site/docs/advanced-usage/steamdeck.md",9774],e3409e91:[()=>n.e(6231).then(n.t.bind(n,210,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-discord-cfa.json",210],e46b1034:[()=>n.e(1182).then(n.t.bind(n,2382,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-partnerships-171.json",2382],e4878929:[()=>n.e(7933).then(n.t.bind(n,3121,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-discord-community-growth-95a.json",3121],e5c4b825:[()=>n.e(933).then(n.t.bind(n,8003,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-migration-finalization-c0b.json",8003],e623129a:[()=>n.e(9508).then(n.t.bind(n,5353,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-future-features-136.json",5353],e6a59d41:[()=>n.e(2246).then(n.bind(n,7100)),"@site/docs/server-docs/user-management.md",7100],e70842e4:[()=>n.e(9830).then(n.bind(n,1999)),"@site/blog/2024-04-14.md?truncated=true",1999],e78c2f6e:[()=>n.e(8104).then(n.t.bind(n,1853,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-creepy-behavior-daa.json",1853],e7aa45d5:[()=>n.e(1837).then(n.bind(n,6495)),"@site/blog/2023-07-29.md",6495],e935068c:[()=>n.e(5872).then(n.t.bind(n,2953,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-discord-server-e37.json",2953],e98ed1e4:[()=>n.e(8966).then(n.t.bind(n,1534,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-name-migration-progress-68d.json",1534],e9e0f988:[()=>n.e(6929).then(n.bind(n,4198)),"@site/docs/client-docs/updating-client.md",4198],e9e1de17:[()=>n.e(7722).then(n.t.bind(n,5062,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-software-development-c0f.json",5062],ec46a009:[()=>n.e(8983).then(n.bind(n,2883)),"@site/docs/gamevault-plus/introduction.md",2883],eda4f68b:[()=>n.e(7505).then(n.t.bind(n,8268,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-ai-generated-names-ac1.json",8268],ee98c124:[()=>n.e(1764).then(n.bind(n,2403)),"@site/docs/advanced-usage/failt2ban.md",2403],ef8b811a:[()=>n.e(8947).then(n.t.bind(n,6600,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-authors-790.json",6600],f2a7e769:[()=>n.e(1200).then(n.t.bind(n,9517,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-sharing-blog-posts-3f1.json",9517],f4d4319b:[()=>n.e(1784).then(n.bind(n,5136)),"@site/docs/server-docs/setup/setup.md",5136],f525eb8a:[()=>n.e(8787).then(n.t.bind(n,9805,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-api-049.json",9805],f58fbef8:[()=>n.e(6071).then(n.t.bind(n,2844,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-feedback-67f.json",2844],f5b06269:[()=>n.e(2641).then(n.bind(n,818)),"@site/docs/gamevault-plus/themes.md",818],f677311a:[()=>n.e(7831).then(n.t.bind(n,7032,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-inclusivity-cdf.json",7032],f6f174b1:[()=>n.e(1922).then(n.t.bind(n,2334,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-beta-testing-146.json",2334],f81c1134:[()=>n.e(5749).then(n.t.bind(n,7735,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-archive-f05.json",7735],f8aea940:[()=>n.e(6557).then(n.bind(n,5395)),"@site/docs/client-docs/themes.md",5395],f94e70f3:[()=>n.e(9589).then(n.t.bind(n,1552,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-drm-free-406.json",1552],fb0a08ce:[()=>n.e(4034).then(n.bind(n,8344)),"@site/blog/2023-07-24.md?truncated=true",8344],fb0e7a2f:[()=>n.e(494).then(n.t.bind(n,7197,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-rawg-6b2.json",7197],fbaf179c:[()=>n.e(6490).then(n.bind(n,6092)),"@site/blog/2024-05-07.md",6092],fcad5cc1:[()=>n.e(9921).then(n.t.bind(n,5176,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-development-c3c.json",5176],fe2b2ad8:[()=>n.e(1219).then(n.bind(n,392)),"@site/blog/2024-05-07.md?truncated=true",392],fee02ac9:[()=>n.e(3936).then(n.t.bind(n,9898,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-council-member-71b.json",9898],ff51e3f1:[()=>n.e(4070).then(n.t.bind(n,257,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-support-request-58e.json",257]};var s=n(6070);function l(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,s.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,s.jsx)("p",{children:String(t)}),(0,s.jsx)("div",{children:(0,s.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,s.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,s.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,s.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,s.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var c=n(2116),u=n(8227);function d(e,t){if("*"===e)return o()({loading:l,loader:()=>n.e(2276).then(n.bind(n,2276)),modules:["@theme/NotFound"],webpack:()=>[2276],render(e,t){const n=e.default;return(0,s.jsx)(u.W,{value:{plugin:{name:"native",id:"default"}},children:(0,s.jsx)(n,{...t})})}});const r=a[`${e}-${t}`],d={},p=[],f=[],g=(0,c.A)(r);return Object.entries(g).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],p.push(r[1]),f.push(r[2]))})),o().Map({loading:l,loader:d,modules:p,webpack:()=>f,render(t,n){const o=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let i=o;const s=n.split(".");s.slice(0,-1).forEach((e=>{i=i[e]})),i[s[s.length-1]]=a}));const a=o.__comp;delete o.__comp;const i=o.__context;delete o.__context;const l=o.__props;return delete o.__props,(0,s.jsx)(u.W,{value:i,children:(0,s.jsx)(a,{...o,...l,...n})})}})}const p=[{path:"/blog",component:d("/blog","deb"),exact:!0},{path:"/blog/2023/07/01/",component:d("/blog/2023/07/01/","30b"),exact:!0},{path:"/blog/2023/07/08/",component:d("/blog/2023/07/08/","d10"),exact:!0},{path:"/blog/2023/07/09/",component:d("/blog/2023/07/09/","2c2"),exact:!0},{path:"/blog/2023/07/13/",component:d("/blog/2023/07/13/","6e5"),exact:!0},{path:"/blog/2023/07/15/",component:d("/blog/2023/07/15/","b20"),exact:!0},{path:"/blog/2023/07/19/",component:d("/blog/2023/07/19/","8a6"),exact:!0},{path:"/blog/2023/07/20/",component:d("/blog/2023/07/20/","9b6"),exact:!0},{path:"/blog/2023/07/24/",component:d("/blog/2023/07/24/","4f4"),exact:!0},{path:"/blog/2023/07/29/",component:d("/blog/2023/07/29/","44c"),exact:!0},{path:"/blog/2023/11/20/",component:d("/blog/2023/11/20/","3f2"),exact:!0},{path:"/blog/2023/12/09/",component:d("/blog/2023/12/09/","d2c"),exact:!0},{path:"/blog/2024/03/28/",component:d("/blog/2024/03/28/","60b"),exact:!0},{path:"/blog/2024/04/01/2024-04-01/",component:d("/blog/2024/04/01/2024-04-01/","59c"),exact:!0},{path:"/blog/2024/04/14/",component:d("/blog/2024/04/14/","e89"),exact:!0},{path:"/blog/2024/05/07/",component:d("/blog/2024/05/07/","2dc"),exact:!0},{path:"/blog/2024/10/20/",component:d("/blog/2024/10/20/","4e9"),exact:!0},{path:"/blog/archive",component:d("/blog/archive","182"),exact:!0},{path:"/blog/authors",component:d("/blog/authors","0b7"),exact:!0},{path:"/blog/page/2",component:d("/blog/page/2","fd3"),exact:!0},{path:"/blog/tags",component:d("/blog/tags","287"),exact:!0},{path:"/blog/tags/age-restrictions",component:d("/blog/tags/age-restrictions","8da"),exact:!0},{path:"/blog/tags/ai-generated-names",component:d("/blog/tags/ai-generated-names","de1"),exact:!0},{path:"/blog/tags/alternative",component:d("/blog/tags/alternative","0cb"),exact:!0},{path:"/blog/tags/analytics",component:d("/blog/tags/analytics","105"),exact:!0},{path:"/blog/tags/announcement",component:d("/blog/tags/announcement","3ab"),exact:!0},{path:"/blog/tags/api",component:d("/blog/tags/api","d97"),exact:!0},{path:"/blog/tags/app",component:d("/blog/tags/app","f50"),exact:!0},{path:"/blog/tags/app-name-migration",component:d("/blog/tags/app-name-migration","b3d"),exact:!0},{path:"/blog/tags/app-optimization",component:d("/blog/tags/app-optimization","4b7"),exact:!0},{path:"/blog/tags/april-fools",component:d("/blog/tags/april-fools","45b"),exact:!0},{path:"/blog/tags/backend",component:d("/blog/tags/backend","bc5"),exact:!0},{path:"/blog/tags/backend-application-migration",component:d("/blog/tags/backend-application-migration","ea3"),exact:!0},{path:"/blog/tags/beta-testing",component:d("/blog/tags/beta-testing","8e3"),exact:!0},{path:"/blog/tags/blackmail",component:d("/blog/tags/blackmail","2a4"),exact:!0},{path:"/blog/tags/box-representation",component:d("/blog/tags/box-representation","400"),exact:!0},{path:"/blog/tags/bugs",component:d("/blog/tags/bugs","ff5"),exact:!0},{path:"/blog/tags/celebration-of-achievements",component:d("/blog/tags/celebration-of-achievements","f97"),exact:!0},{path:"/blog/tags/client-application-update",component:d("/blog/tags/client-application-update","45e"),exact:!0},{path:"/blog/tags/client-update",component:d("/blog/tags/client-update","d5b"),exact:!0},{path:"/blog/tags/cloud-based-game-platforms",component:d("/blog/tags/cloud-based-game-platforms","a94"),exact:!0},{path:"/blog/tags/code-access",component:d("/blog/tags/code-access","1ef"),exact:!0},{path:"/blog/tags/coding-chronicle",component:d("/blog/tags/coding-chronicle","d18"),exact:!0},{path:"/blog/tags/collaboration",component:d("/blog/tags/collaboration","f74"),exact:!0},{path:"/blog/tags/community",component:d("/blog/tags/community","e39"),exact:!0},{path:"/blog/tags/community-driven",component:d("/blog/tags/community-driven","63b"),exact:!0},{path:"/blog/tags/community-feedback",component:d("/blog/tags/community-feedback","3ee"),exact:!0},{path:"/blog/tags/community-management",component:d("/blog/tags/community-management","93f"),exact:!0},{path:"/blog/tags/continued-support",component:d("/blog/tags/continued-support","afc"),exact:!0},{path:"/blog/tags/control",component:d("/blog/tags/control","04d"),exact:!0},{path:"/blog/tags/council-member",component:d("/blog/tags/council-member","a6a"),exact:!0},{path:"/blog/tags/creepy-behavior",component:d("/blog/tags/creepy-behavior","090"),exact:!0},{path:"/blog/tags/database",component:d("/blog/tags/database","ff5"),exact:!0},{path:"/blog/tags/decision-making",component:d("/blog/tags/decision-making","532"),exact:!0},{path:"/blog/tags/developers",component:d("/blog/tags/developers","487"),exact:!0},{path:"/blog/tags/development",component:d("/blog/tags/development","b27"),exact:!0},{path:"/blog/tags/development-milestones",component:d("/blog/tags/development-milestones","1c9"),exact:!0},{path:"/blog/tags/discord",component:d("/blog/tags/discord","6df"),exact:!0},{path:"/blog/tags/discord-channel",component:d("/blog/tags/discord-channel","b2d"),exact:!0},{path:"/blog/tags/discord-community-growth",component:d("/blog/tags/discord-community-growth","136"),exact:!0},{path:"/blog/tags/discord-server",component:d("/blog/tags/discord-server","e4d"),exact:!0},{path:"/blog/tags/discord-server-promotion",component:d("/blog/tags/discord-server-promotion","f55"),exact:!0},{path:"/blog/tags/documentation-migration",component:d("/blog/tags/documentation-migration","405"),exact:!0},{path:"/blog/tags/domain-acquisition",component:d("/blog/tags/domain-acquisition","e1a"),exact:!0},{path:"/blog/tags/drm-free",component:d("/blog/tags/drm-free","c7e"),exact:!0},{path:"/blog/tags/drm-free-games",component:d("/blog/tags/drm-free-games","6cf"),exact:!0},{path:"/blog/tags/early-access",component:d("/blog/tags/early-access","ed5"),exact:!0},{path:"/blog/tags/easter-egg",component:d("/blog/tags/easter-egg","7c7"),exact:!0},{path:"/blog/tags/engagement",component:d("/blog/tags/engagement","b3b"),exact:!0},{path:"/blog/tags/exclusive-preview",component:d("/blog/tags/exclusive-preview","0fe"),exact:!0},{path:"/blog/tags/family-friendly",component:d("/blog/tags/family-friendly","282"),exact:!0},{path:"/blog/tags/feature-requests",component:d("/blog/tags/feature-requests","61d"),exact:!0},{path:"/blog/tags/features",component:d("/blog/tags/features","3d5"),exact:!0},{path:"/blog/tags/feedback",component:d("/blog/tags/feedback","a81"),exact:!0},{path:"/blog/tags/file-server",component:d("/blog/tags/file-server","f0b"),exact:!0},{path:"/blog/tags/financial-assistance",component:d("/blog/tags/financial-assistance","e64"),exact:!0},{path:"/blog/tags/future-development",component:d("/blog/tags/future-development","db0"),exact:!0},{path:"/blog/tags/future-features",component:d("/blog/tags/future-features","bed"),exact:!0},{path:"/blog/tags/game",component:d("/blog/tags/game","a29"),exact:!0},{path:"/blog/tags/game-development",component:d("/blog/tags/game-development","97c"),exact:!0},{path:"/blog/tags/game-hub",component:d("/blog/tags/game-hub","6c3"),exact:!0},{path:"/blog/tags/game-shelf",component:d("/blog/tags/game-shelf","566"),exact:!0},{path:"/blog/tags/game-stash",component:d("/blog/tags/game-stash","728"),exact:!0},{path:"/blog/tags/game-vault",component:d("/blog/tags/game-vault","39f"),exact:!0},{path:"/blog/tags/game-vault-app",component:d("/blog/tags/game-vault-app","bd6"),exact:!0},{path:"/blog/tags/game-vault-domain",component:d("/blog/tags/game-vault-domain","a5b"),exact:!0},{path:"/blog/tags/game-vault-journey",component:d("/blog/tags/game-vault-journey","52d"),exact:!0},{path:"/blog/tags/game-vault-milestone",component:d("/blog/tags/game-vault-milestone","030"),exact:!0},{path:"/blog/tags/gaming",component:d("/blog/tags/gaming","2b9"),exact:!0},{path:"/blog/tags/gaming-community",component:d("/blog/tags/gaming-community","73c"),exact:!0},{path:"/blog/tags/gaming-experience",component:d("/blog/tags/gaming-experience","f8c"),exact:!0},{path:"/blog/tags/gaming-platform",component:d("/blog/tags/gaming-platform","12f"),exact:!0},{path:"/blog/tags/gaming-servers",component:d("/blog/tags/gaming-servers","e66"),exact:!0},{path:"/blog/tags/git-hub",component:d("/blog/tags/git-hub","590"),exact:!0},{path:"/blog/tags/git-hub-issue",component:d("/blog/tags/git-hub-issue","8a0"),exact:!0},{path:"/blog/tags/gratitude",component:d("/blog/tags/gratitude","1d7"),exact:!0},{path:"/blog/tags/harassment",component:d("/blog/tags/harassment","89d"),exact:!0},{path:"/blog/tags/harbor",component:d("/blog/tags/harbor","a9f"),exact:!0},{path:"/blog/tags/health-monitoring",component:d("/blog/tags/health-monitoring","d88"),exact:!0},{path:"/blog/tags/hybrid-model",component:d("/blog/tags/hybrid-model","038"),exact:!0},{path:"/blog/tags/igdb",component:d("/blog/tags/igdb","6ff"),exact:!0},{path:"/blog/tags/improvement",component:d("/blog/tags/improvement","0af"),exact:!0},{path:"/blog/tags/inclusivity",component:d("/blog/tags/inclusivity","7a0"),exact:!0},{path:"/blog/tags/installation-pipeline",component:d("/blog/tags/installation-pipeline","94b"),exact:!0},{path:"/blog/tags/kanban-board",component:d("/blog/tags/kanban-board","372"),exact:!0},{path:"/blog/tags/keyhole-representation",component:d("/blog/tags/keyhole-representation","ae7"),exact:!0},{path:"/blog/tags/lemmy-community",component:d("/blog/tags/lemmy-community","a2d"),exact:!0},{path:"/blog/tags/lemmy-community-launch",component:d("/blog/tags/lemmy-community-launch","9dd"),exact:!0},{path:"/blog/tags/lemmy-forum",component:d("/blog/tags/lemmy-forum","7bd"),exact:!0},{path:"/blog/tags/logo-concept-discussion",component:d("/blog/tags/logo-concept-discussion","7e7"),exact:!0},{path:"/blog/tags/logo-deciphering",component:d("/blog/tags/logo-deciphering","dc4"),exact:!0},{path:"/blog/tags/love-for-game-vault",component:d("/blog/tags/love-for-game-vault","2f9"),exact:!0},{path:"/blog/tags/market-analysis",component:d("/blog/tags/market-analysis","c1c"),exact:!0},{path:"/blog/tags/metadata",component:d("/blog/tags/metadata","2c9"),exact:!0},{path:"/blog/tags/metadata-framework",component:d("/blog/tags/metadata-framework","bc5"),exact:!0},{path:"/blog/tags/microsoft-store",component:d("/blog/tags/microsoft-store","cc8"),exact:!0},{path:"/blog/tags/microsoft-store-publication",component:d("/blog/tags/microsoft-store-publication","a3d"),exact:!0},{path:"/blog/tags/migration-finalization",component:d("/blog/tags/migration-finalization","138"),exact:!0},{path:"/blog/tags/motivation",component:d("/blog/tags/motivation","8c7"),exact:!0},{path:"/blog/tags/multi-user-authentication",component:d("/blog/tags/multi-user-authentication","3a5"),exact:!0},{path:"/blog/tags/name-migration-progress",component:d("/blog/tags/name-migration-progress","396"),exact:!0},{path:"/blog/tags/negative-narratives",component:d("/blog/tags/negative-narratives","ef7"),exact:!0},{path:"/blog/tags/new-logo",component:d("/blog/tags/new-logo","3d9"),exact:!0},{path:"/blog/tags/new-name",component:d("/blog/tags/new-name","28c"),exact:!0},{path:"/blog/tags/new-name-announcement",component:d("/blog/tags/new-name-announcement","7b6"),exact:!0},{path:"/blog/tags/notes",component:d("/blog/tags/notes","f1b"),exact:!0},{path:"/blog/tags/november-update",component:d("/blog/tags/november-update","a61"),exact:!0},{path:"/blog/tags/official-installations",component:d("/blog/tags/official-installations","733"),exact:!0},{path:"/blog/tags/open-source",component:d("/blog/tags/open-source","6be"),exact:!0},{path:"/blog/tags/parental-control",component:d("/blog/tags/parental-control","65b"),exact:!0},{path:"/blog/tags/partnership",component:d("/blog/tags/partnership","0de"),exact:!0},{path:"/blog/tags/partnerships",component:d("/blog/tags/partnerships","588"),exact:!0},{path:"/blog/tags/platform",component:d("/blog/tags/platform","0bc"),exact:!0},{path:"/blog/tags/platform-values",component:d("/blog/tags/platform-values","376"),exact:!0},{path:"/blog/tags/plugin-system",component:d("/blog/tags/plugin-system","4f9"),exact:!0},{path:"/blog/tags/poll",component:d("/blog/tags/poll","eda"),exact:!0},{path:"/blog/tags/poll-results",component:d("/blog/tags/poll-results","2a9"),exact:!0},{path:"/blog/tags/polls",component:d("/blog/tags/polls","829"),exact:!0},{path:"/blog/tags/public",component:d("/blog/tags/public","f5f"),exact:!0},{path:"/blog/tags/racist",component:d("/blog/tags/racist","2bb"),exact:!0},{path:"/blog/tags/rawg",component:d("/blog/tags/rawg","5ed"),exact:!0},{path:"/blog/tags/rawg-api",component:d("/blog/tags/rawg-api","751"),exact:!0},{path:"/blog/tags/reddit-forum",component:d("/blog/tags/reddit-forum","61e"),exact:!0},{path:"/blog/tags/release",component:d("/blog/tags/release","15f"),exact:!0},{path:"/blog/tags/renaming-app",component:d("/blog/tags/renaming-app","d2c"),exact:!0},{path:"/blog/tags/revenue-generation",component:d("/blog/tags/revenue-generation","68c"),exact:!0},{path:"/blog/tags/roadmap",component:d("/blog/tags/roadmap","e17"),exact:!0},{path:"/blog/tags/safe-environment",component:d("/blog/tags/safe-environment","620"),exact:!0},{path:"/blog/tags/self-hosted",component:d("/blog/tags/self-hosted","19e"),exact:!0},{path:"/blog/tags/self-hosted-newsletter",component:d("/blog/tags/self-hosted-newsletter","b53"),exact:!0},{path:"/blog/tags/selfhosted-podcast",component:d("/blog/tags/selfhosted-podcast","8d7"),exact:!0},{path:"/blog/tags/server-update",component:d("/blog/tags/server-update","7ee"),exact:!0},{path:"/blog/tags/sharing-blog-posts",component:d("/blog/tags/sharing-blog-posts","2e3"),exact:!0},{path:"/blog/tags/simplifying-game-installation",component:d("/blog/tags/simplifying-game-installation","0a0"),exact:!0},{path:"/blog/tags/software",component:d("/blog/tags/software","ed0"),exact:!0},{path:"/blog/tags/software-development",component:d("/blog/tags/software-development","f78"),exact:!0},{path:"/blog/tags/software-licensing",component:d("/blog/tags/software-licensing","6a0"),exact:!0},{path:"/blog/tags/software-updates",component:d("/blog/tags/software-updates","742"),exact:!0},{path:"/blog/tags/solution",component:d("/blog/tags/solution","a71"),exact:!0},{path:"/blog/tags/source-available",component:d("/blog/tags/source-available","501"),exact:!0},{path:"/blog/tags/source-available-software",component:d("/blog/tags/source-available-software","42f"),exact:!0},{path:"/blog/tags/spam",component:d("/blog/tags/spam","99a"),exact:!0},{path:"/blog/tags/special-thanks",component:d("/blog/tags/special-thanks","721"),exact:!0},{path:"/blog/tags/speculation",component:d("/blog/tags/speculation","691"),exact:!0},{path:"/blog/tags/spreading-the-word",component:d("/blog/tags/spreading-the-word","9a5"),exact:!0},{path:"/blog/tags/startup",component:d("/blog/tags/startup","387"),exact:!0},{path:"/blog/tags/steam",component:d("/blog/tags/steam","5cb"),exact:!0},{path:"/blog/tags/subreddit-migration",component:d("/blog/tags/subreddit-migration","bf0"),exact:!0},{path:"/blog/tags/subscription",component:d("/blog/tags/subscription","088"),exact:!0},{path:"/blog/tags/subscription-model",component:d("/blog/tags/subscription-model","7e6"),exact:!0},{path:"/blog/tags/subscription-to-updates-role",component:d("/blog/tags/subscription-to-updates-role","97f"),exact:!0},{path:"/blog/tags/success",component:d("/blog/tags/success","cc5"),exact:!0},{path:"/blog/tags/support",component:d("/blog/tags/support","a33"),exact:!0},{path:"/blog/tags/support-request",component:d("/blog/tags/support-request","99a"),exact:!0},{path:"/blog/tags/surge-of-new-users",component:d("/blog/tags/surge-of-new-users","4ba"),exact:!0},{path:"/blog/tags/sustainability",component:d("/blog/tags/sustainability","5a8"),exact:!0},{path:"/blog/tags/tech-progress",component:d("/blog/tags/tech-progress","1f3"),exact:!0},{path:"/blog/tags/testing",component:d("/blog/tags/testing","ad7"),exact:!0},{path:"/blog/tags/theme",component:d("/blog/tags/theme","6c7"),exact:!0},{path:"/blog/tags/threats",component:d("/blog/tags/threats","3f9"),exact:!0},{path:"/blog/tags/transition-process",component:d("/blog/tags/transition-process","a0e"),exact:!0},{path:"/blog/tags/transparency",component:d("/blog/tags/transparency","7b3"),exact:!0},{path:"/blog/tags/trolls",component:d("/blog/tags/trolls","22a"),exact:!0},{path:"/blog/tags/twitch-tv",component:d("/blog/tags/twitch-tv","c17"),exact:!0},{path:"/blog/tags/ui-redesign",component:d("/blog/tags/ui-redesign","1e3"),exact:!0},{path:"/blog/tags/ui-update",component:d("/blog/tags/ui-update","0da"),exact:!0},{path:"/blog/tags/upcoming-update",component:d("/blog/tags/upcoming-update","f39"),exact:!0},{path:"/blog/tags/update",component:d("/blog/tags/update","fa1"),exact:!0},{path:"/blog/tags/updates",component:d("/blog/tags/updates","125"),exact:!0},{path:"/blog/tags/user-engagement",component:d("/blog/tags/user-engagement","51e"),exact:!0},{path:"/blog/tags/user-participation",component:d("/blog/tags/user-participation","15b"),exact:!0},{path:"/blog/tags/video-games",component:d("/blog/tags/video-games","b8c"),exact:!0},{path:"/blog/tags/videogame",component:d("/blog/tags/videogame","f65"),exact:!0},{path:"/blog/tags/voting",component:d("/blog/tags/voting","f23"),exact:!0},{path:"/docs",component:d("/docs","15f"),routes:[{path:"/docs",component:d("/docs","5fc"),routes:[{path:"/docs",component:d("/docs","811"),routes:[{path:"/docs/advanced-usage/early-access-program",component:d("/docs/advanced-usage/early-access-program","39b"),exact:!0,sidebar:"docs"},{path:"/docs/advanced-usage/fail2ban-gamevault-guide",component:d("/docs/advanced-usage/fail2ban-gamevault-guide","61d"),exact:!0,sidebar:"docs"},{path:"/docs/advanced-usage/linux-client",component:d("/docs/advanced-usage/linux-client","ac2"),exact:!0,sidebar:"docs"},{path:"/docs/advanced-usage/rest-api",component:d("/docs/advanced-usage/rest-api","1eb"),exact:!0,sidebar:"docs"},{path:"/docs/advanced-usage/steamdeck",component:d("/docs/advanced-usage/steamdeck","699"),exact:!0,sidebar:"docs"},{path:"/docs/client-docs/data",component:d("/docs/client-docs/data","20a"),exact:!0,sidebar:"docs"},{path:"/docs/client-docs/gui",component:d("/docs/client-docs/gui","1de"),exact:!0,sidebar:"docs"},{path:"/docs/client-docs/how-to-use",component:d("/docs/client-docs/how-to-use","250"),exact:!0,sidebar:"docs"},{path:"/docs/client-docs/setup",component:d("/docs/client-docs/setup","e39"),exact:!0,sidebar:"docs"},{path:"/docs/client-docs/themes",component:d("/docs/client-docs/themes","47f"),exact:!0,sidebar:"docs"},{path:"/docs/client-docs/updating-client",component:d("/docs/client-docs/updating-client","770"),exact:!0,sidebar:"docs"},{path:"/docs/gamevault-plus/client-apis",component:d("/docs/gamevault-plus/client-apis","eb5"),exact:!0,sidebar:"docs"},{path:"/docs/gamevault-plus/client-setup",component:d("/docs/gamevault-plus/client-setup","47b"),exact:!0,sidebar:"docs"},{path:"/docs/gamevault-plus/integrations/discord",component:d("/docs/gamevault-plus/integrations/discord","555"),exact:!0,sidebar:"docs"},{path:"/docs/gamevault-plus/integrations/playnite",component:d("/docs/gamevault-plus/integrations/playnite","0a1"),exact:!0,sidebar:"docs"},{path:"/docs/gamevault-plus/integrations/steam",component:d("/docs/gamevault-plus/integrations/steam","301"),exact:!0,sidebar:"docs"},{path:"/docs/gamevault-plus/introduction",component:d("/docs/gamevault-plus/introduction","135"),exact:!0,sidebar:"docs"},{path:"/docs/gamevault-plus/themes",component:d("/docs/gamevault-plus/themes","d9b"),exact:!0,sidebar:"docs"},{path:"/docs/intro",component:d("/docs/intro","a82"),exact:!0,sidebar:"docs"},{path:"/docs/license-contribute",component:d("/docs/license-contribute","fe0"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/adding-games",component:d("/docs/server-docs/adding-games","92c"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/backup-and-restore",component:d("/docs/server-docs/backup-and-restore","7bf"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/configuration",component:d("/docs/server-docs/configuration","3b7"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/game-types",component:d("/docs/server-docs/game-types","a3d"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/indexing",component:d("/docs/server-docs/indexing","39e"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/media",component:d("/docs/server-docs/media","47a"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/metadata-enrichment/metadata",component:d("/docs/server-docs/metadata-enrichment/metadata","a76"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/metadata-enrichment/provider-igdb",component:d("/docs/server-docs/metadata-enrichment/provider-igdb","83a"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/parental-control",component:d("/docs/server-docs/parental-control","21a"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/plugins",component:d("/docs/server-docs/plugins","dea"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/server-news",component:d("/docs/server-docs/server-news","633"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/setup/",component:d("/docs/server-docs/setup/","54c"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/setup/caprover",component:d("/docs/server-docs/setup/caprover","de0"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/setup/docker-compose",component:d("/docs/server-docs/setup/docker-compose","1eb"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/setup/native",component:d("/docs/server-docs/setup/native","1d1"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/setup/synology-container-manager",component:d("/docs/server-docs/setup/synology-container-manager","129"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/setup/truenas-scale",component:d("/docs/server-docs/setup/truenas-scale","6d0"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/setup/truenas-scale-legacy",component:d("/docs/server-docs/setup/truenas-scale-legacy","10f"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/setup/unraid",component:d("/docs/server-docs/setup/unraid","1b6"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/structure",component:d("/docs/server-docs/structure","065"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/updating-games",component:d("/docs/server-docs/updating-games","d82"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/user-management",component:d("/docs/server-docs/user-management","bc5"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/websockets",component:d("/docs/server-docs/websockets","de3"),exact:!0,sidebar:"docs"},{path:"/docs/troubleshooting",component:d("/docs/troubleshooting","fff"),exact:!0,sidebar:"docs"}]}]}]},{path:"/",component:d("/","2e1"),exact:!0},{path:"*",component:d("*")}]},8519:(e,t,n)=>{var r,o;!function(){var a,i,s,l,c,u,d,p,f,g,m,b,h,y,v,_,w,x,S,k,E,O,j,P,C,A,T,I,N,L,R=function(e){var t=new R.Builder;return t.pipeline.add(R.trimmer,R.stopWordFilter,R.stemmer),t.searchPipeline.add(R.stemmer),e.call(t,t),t.build()};R.version="2.3.9",R.utils={},R.utils.warn=(a=this,function(e){a.console&&console.warn&&console.warn(e)}),R.utils.asString=function(e){return null==e?"":e.toString()},R.utils.clone=function(e){if(null==e)return e;for(var t=Object.create(null),n=Object.keys(e),r=0;r0){var l=R.utils.clone(t)||{};l.position=[i,s],l.index=o.length,o.push(new R.Token(n.slice(i,a),l))}i=a+1}}return o},R.tokenizer.separator=/[\s\-]+/,R.Pipeline=function(){this._stack=[]},R.Pipeline.registeredFunctions=Object.create(null),R.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&R.utils.warn("Overwriting existing registered function: "+t),e.label=t,R.Pipeline.registeredFunctions[e.label]=e},R.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||R.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},R.Pipeline.load=function(e){var t=new R.Pipeline;return e.forEach((function(e){var n=R.Pipeline.registeredFunctions[e];if(!n)throw new Error("Cannot load unregistered function: "+e);t.add(n)})),t},R.Pipeline.prototype.add=function(){Array.prototype.slice.call(arguments).forEach((function(e){R.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)}),this)},R.Pipeline.prototype.after=function(e,t){R.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");n+=1,this._stack.splice(n,0,t)},R.Pipeline.prototype.before=function(e,t){R.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");this._stack.splice(n,0,t)},R.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},R.Pipeline.prototype.run=function(e){for(var t=this._stack.length,n=0;n1&&(ae&&(n=o),a!=e);)r=n-t,o=t+Math.floor(r/2),a=this.elements[2*o];return a==e||a>e?2*o:as?c+=2:i==s&&(t+=n[l+1]*r[c+1],l+=2,c+=2);return t},R.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},R.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,n=0;t0){var a,i=o.str.charAt(0);i in o.node.edges?a=o.node.edges[i]:(a=new R.TokenSet,o.node.edges[i]=a),1==o.str.length&&(a.final=!0),r.push({node:a,editsRemaining:o.editsRemaining,str:o.str.slice(1)})}if(0!=o.editsRemaining){if("*"in o.node.edges)var s=o.node.edges["*"];else{s=new R.TokenSet;o.node.edges["*"]=s}if(0==o.str.length&&(s.final=!0),r.push({node:s,editsRemaining:o.editsRemaining-1,str:o.str}),o.str.length>1&&r.push({node:o.node,editsRemaining:o.editsRemaining-1,str:o.str.slice(1)}),1==o.str.length&&(o.node.final=!0),o.str.length>=1){if("*"in o.node.edges)var l=o.node.edges["*"];else{l=new R.TokenSet;o.node.edges["*"]=l}1==o.str.length&&(l.final=!0),r.push({node:l,editsRemaining:o.editsRemaining-1,str:o.str.slice(1)})}if(o.str.length>1){var c,u=o.str.charAt(0),d=o.str.charAt(1);d in o.node.edges?c=o.node.edges[d]:(c=new R.TokenSet,o.node.edges[d]=c),1==o.str.length&&(c.final=!0),r.push({node:c,editsRemaining:o.editsRemaining-1,str:u+o.str.slice(2)})}}}return n},R.TokenSet.fromString=function(e){for(var t=new R.TokenSet,n=t,r=0,o=e.length;r=e;t--){var n=this.uncheckedNodes[t],r=n.child.toString();r in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[r]:(n.child._str=r,this.minimizedNodes[r]=n.child),this.uncheckedNodes.pop()}},R.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},R.Index.prototype.search=function(e){return this.query((function(t){new R.QueryParser(e,t).parse()}))},R.Index.prototype.query=function(e){for(var t=new R.Query(this.fields),n=Object.create(null),r=Object.create(null),o=Object.create(null),a=Object.create(null),i=Object.create(null),s=0;s1?1:e},R.Builder.prototype.k1=function(e){this._k1=e},R.Builder.prototype.add=function(e,t){var n=e[this._ref],r=Object.keys(this._fields);this._documents[n]=t||{},this.documentCount+=1;for(var o=0;o=this.length)return R.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},R.QueryLexer.prototype.width=function(){return this.pos-this.start},R.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},R.QueryLexer.prototype.backup=function(){this.pos-=1},R.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do{t=(e=this.next()).charCodeAt(0)}while(t>47&&t<58);e!=R.QueryLexer.EOS&&this.backup()},R.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(R.QueryLexer.TERM)),e.ignore(),e.more())return R.QueryLexer.lexText},R.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(R.QueryLexer.EDIT_DISTANCE),R.QueryLexer.lexText},R.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(R.QueryLexer.BOOST),R.QueryLexer.lexText},R.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(R.QueryLexer.TERM)},R.QueryLexer.termSeparator=R.tokenizer.separator,R.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==R.QueryLexer.EOS)return R.QueryLexer.lexEOS;if(92!=t.charCodeAt(0)){if(":"==t)return R.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit(R.QueryLexer.TERM),R.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit(R.QueryLexer.TERM),R.QueryLexer.lexBoost;if("+"==t&&1===e.width())return e.emit(R.QueryLexer.PRESENCE),R.QueryLexer.lexText;if("-"==t&&1===e.width())return e.emit(R.QueryLexer.PRESENCE),R.QueryLexer.lexText;if(t.match(R.QueryLexer.termSeparator))return R.QueryLexer.lexTerm}else e.escapeCharacter()}},R.QueryParser=function(e,t){this.lexer=new R.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},R.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=R.QueryParser.parseClause;e;)e=e(this);return this.query},R.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},R.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},R.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},R.QueryParser.parseClause=function(e){var t=e.peekLexeme();if(null!=t)switch(t.type){case R.QueryLexer.PRESENCE:return R.QueryParser.parsePresence;case R.QueryLexer.FIELD:return R.QueryParser.parseField;case R.QueryLexer.TERM:return R.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(n+=" with value '"+t.str+"'"),new R.QueryParseError(n,t.start,t.end)}},R.QueryParser.parsePresence=function(e){var t=e.consumeLexeme();if(null!=t){switch(t.str){case"-":e.currentClause.presence=R.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=R.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+t.str+"'";throw new R.QueryParseError(n,t.start,t.end)}var r=e.peekLexeme();if(null==r){n="expecting term or field, found nothing";throw new R.QueryParseError(n,t.start,t.end)}switch(r.type){case R.QueryLexer.FIELD:return R.QueryParser.parseField;case R.QueryLexer.TERM:return R.QueryParser.parseTerm;default:n="expecting term or field, found '"+r.type+"'";throw new R.QueryParseError(n,r.start,r.end)}}},R.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(null!=t){if(-1==e.query.allFields.indexOf(t.str)){var n=e.query.allFields.map((function(e){return"'"+e+"'"})).join(", "),r="unrecognised field '"+t.str+"', possible fields: "+n;throw new R.QueryParseError(r,t.start,t.end)}e.currentClause.fields=[t.str];var o=e.peekLexeme();if(null==o){r="expecting term, found nothing";throw new R.QueryParseError(r,t.start,t.end)}if(o.type===R.QueryLexer.TERM)return R.QueryParser.parseTerm;r="expecting term, found '"+o.type+"'";throw new R.QueryParseError(r,o.start,o.end)}},R.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(null!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(null!=n)switch(n.type){case R.QueryLexer.TERM:return e.nextClause(),R.QueryParser.parseTerm;case R.QueryLexer.FIELD:return e.nextClause(),R.QueryParser.parseField;case R.QueryLexer.EDIT_DISTANCE:return R.QueryParser.parseEditDistance;case R.QueryLexer.BOOST:return R.QueryParser.parseBoost;case R.QueryLexer.PRESENCE:return e.nextClause(),R.QueryParser.parsePresence;default:var r="Unexpected lexeme type '"+n.type+"'";throw new R.QueryParseError(r,n.start,n.end)}else e.nextClause()}},R.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="edit distance must be numeric";throw new R.QueryParseError(r,t.start,t.end)}e.currentClause.editDistance=n;var o=e.peekLexeme();if(null!=o)switch(o.type){case R.QueryLexer.TERM:return e.nextClause(),R.QueryParser.parseTerm;case R.QueryLexer.FIELD:return e.nextClause(),R.QueryParser.parseField;case R.QueryLexer.EDIT_DISTANCE:return R.QueryParser.parseEditDistance;case R.QueryLexer.BOOST:return R.QueryParser.parseBoost;case R.QueryLexer.PRESENCE:return e.nextClause(),R.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+o.type+"'";throw new R.QueryParseError(r,o.start,o.end)}else e.nextClause()}},R.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="boost must be numeric";throw new R.QueryParseError(r,t.start,t.end)}e.currentClause.boost=n;var o=e.peekLexeme();if(null!=o)switch(o.type){case R.QueryLexer.TERM:return e.nextClause(),R.QueryParser.parseTerm;case R.QueryLexer.FIELD:return e.nextClause(),R.QueryParser.parseField;case R.QueryLexer.EDIT_DISTANCE:return R.QueryParser.parseEditDistance;case R.QueryLexer.BOOST:return R.QueryParser.parseBoost;case R.QueryLexer.PRESENCE:return e.nextClause(),R.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+o.type+"'";throw new R.QueryParseError(r,o.start,o.end)}else e.nextClause()}},void 0===(o="function"==typeof(r=function(){return R})?r.call(t,n,t,e):r)||(e.exports=o)}()},4016:(e,t,n)=>{"use strict";n.d(t,{o:()=>a,x:()=>i});var r=n(758),o=n(6070);const a=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,o.jsx)(a.Provider,{value:n,children:t})}},3768:(e,t,n)=>{"use strict";var r=n(758),o=n(9576),a=n(248),i=n(1742),s=n(4784),l=n(8800);const c=[n(3905),n(982),n(6741),n(171),n(1877)];var u=n(5765),d=n(5557),p=n(389),f=n(6070);function g(e){let{children:t}=e;return(0,f.jsx)(f.Fragment,{children:t})}var m=n(8485),b=n(9431),h=n(404),y=n(527),v=n(7826),_=n(3884),w=n(785),x=n(384),S=n(3803),k=n(4286);function E(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,b.A)(),r=(0,_.o)(),o=n[e].htmlLang,a=e=>e.replace("-","_");return(0,f.jsxs)(m.A,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,f.jsx)("meta",{property:"og:locale",content:a(o)}),Object.values(n).filter((e=>o!==e.htmlLang)).map((e=>(0,f.jsx)("meta",{property:"og:locale:alternate",content:a(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function O(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,b.A)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,b.A)(),{pathname:r}=(0,d.zy)();return e+(0,S.Ks)((0,h.Ay)(r),{trailingSlash:n,baseUrl:t})}(),o=t?`${n}${t}`:r;return(0,f.jsxs)(m.A,{children:[(0,f.jsx)("meta",{property:"og:url",content:o}),(0,f.jsx)("link",{rel:"canonical",href:o})]})}function j(){const{i18n:{currentLocale:e}}=(0,b.A)(),{metadata:t,image:n}=(0,y.p)();return(0,f.jsxs)(f.Fragment,{children:[(0,f.jsxs)(m.A,{children:[(0,f.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,f.jsx)("body",{className:w.w})]}),n&&(0,f.jsx)(v.be,{image:n}),(0,f.jsx)(O,{}),(0,f.jsx)(E,{}),(0,f.jsx)(k.A,{tag:x.C,locale:e}),(0,f.jsx)(m.A,{children:t.map(((e,t)=>(0,f.jsx)("meta",{...e},t)))})]})}const P=new Map;var C=n(4016),A=n(7165),T=n(7886);function I(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>o.forEach((e=>e?.()))}const N=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,T.A)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,o=t.hash===n.hash,a=t.search===n.search;if(r&&o&&!a)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),I("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function L(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,p.u)(u.A,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class R extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=l.A.canUseDOM?I("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=I("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),L(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return(0,f.jsx)(N,{previousLocation:this.previousLocation,location:t,children:(0,f.jsx)(d.qh,{location:t,render:()=>e})})}}const D=R,F="__docusaurus-base-url-issue-banner-container",M="__docusaurus-base-url-issue-banner",z="__docusaurus-base-url-issue-banner-suggestion-container";function B(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '${F}';\n var bannerHtml = ${JSON.stringify(function(e){return`\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

\n

We suggest trying baseUrl =

\n
\n`}(e)).replace(/{let{route:t}=e;return!0===t.exact})))return P.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return P.set(e.pathname,t),{...e,pathname:t}}((0,d.zy)());return(0,f.jsx)(D,{location:e,children:q})}function K(){return(0,f.jsx)(V.A,{children:(0,f.jsx)(A.l,{children:(0,f.jsxs)(C.x,{children:[(0,f.jsxs)(g,{children:[(0,f.jsx)(H,{}),(0,f.jsx)(j,{}),(0,f.jsx)(U,{}),(0,f.jsx)(G,{})]}),(0,f.jsx)(W,{})]})})})}var Y=n(4054);const Z=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const o=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;o?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var X=n(2116);const J=new Set,ee=new Set,te=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ne={prefetch:e=>{if(!(e=>!te()&&!ee.has(e)&&!J.has(e))(e))return!1;J.add(e);const t=(0,p.u)(u.A,e).flatMap((e=>{return t=e.route.path,Object.entries(Y).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,X.A)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Z(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!te()&&!ee.has(e))(e)&&(ee.add(e),L(e))},re=Object.freeze(ne);function oe(e){let{children:t}=e;return"hash"===s.default.future.experimental_router?(0,f.jsx)(i.I9,{children:t}):(0,f.jsx)(i.Kd,{children:t})}const ae=Boolean(!0);if(l.A.canUseDOM){window.docusaurus=re;const e=document.getElementById("__docusaurus"),t=(0,f.jsx)(a.vd,{children:(0,f.jsx)(oe,{children:(0,f.jsx)(K,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},i=()=>{if(window.docusaurusRoot)window.docusaurusRoot.render(t);else if(ae)window.docusaurusRoot=o.hydrateRoot(e,t,{onRecoverableError:n});else{const r=o.createRoot(e,{onRecoverableError:n});r.render(t),window.docusaurusRoot=r}};L(window.location.pathname).then((()=>{(0,r.startTransition)(i)}))}},7165:(e,t,n)=>{"use strict";n.d(t,{o:()=>d,l:()=>p});var r=n(758),o=n(4784);const a=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/docs","mainDocId":"intro","docs":[{"id":"advanced-usage/early-access-program","path":"/docs/advanced-usage/early-access-program","sidebar":"docs"},{"id":"advanced-usage/fail2ban-gamevault-guide","path":"/docs/advanced-usage/fail2ban-gamevault-guide","sidebar":"docs"},{"id":"advanced-usage/linux-client","path":"/docs/advanced-usage/linux-client","sidebar":"docs"},{"id":"advanced-usage/rest-api","path":"/docs/advanced-usage/rest-api","sidebar":"docs"},{"id":"advanced-usage/steamdeck","path":"/docs/advanced-usage/steamdeck","sidebar":"docs"},{"id":"client-docs/data","path":"/docs/client-docs/data","sidebar":"docs"},{"id":"client-docs/gui","path":"/docs/client-docs/gui","sidebar":"docs"},{"id":"client-docs/how-to-use","path":"/docs/client-docs/how-to-use","sidebar":"docs"},{"id":"client-docs/setup","path":"/docs/client-docs/setup","sidebar":"docs"},{"id":"client-docs/themes","path":"/docs/client-docs/themes","sidebar":"docs"},{"id":"client-docs/updating-client","path":"/docs/client-docs/updating-client","sidebar":"docs"},{"id":"gamevault-plus/client-apis","path":"/docs/gamevault-plus/client-apis","sidebar":"docs"},{"id":"gamevault-plus/client-setup","path":"/docs/gamevault-plus/client-setup","sidebar":"docs"},{"id":"gamevault-plus/integrations/discord","path":"/docs/gamevault-plus/integrations/discord","sidebar":"docs"},{"id":"gamevault-plus/integrations/playnite","path":"/docs/gamevault-plus/integrations/playnite","sidebar":"docs"},{"id":"gamevault-plus/integrations/steam","path":"/docs/gamevault-plus/integrations/steam","sidebar":"docs"},{"id":"gamevault-plus/introduction","path":"/docs/gamevault-plus/introduction","sidebar":"docs"},{"id":"gamevault-plus/themes","path":"/docs/gamevault-plus/themes","sidebar":"docs"},{"id":"intro","path":"/docs/intro","sidebar":"docs"},{"id":"license-contribute","path":"/docs/license-contribute","sidebar":"docs"},{"id":"server-docs/adding-games","path":"/docs/server-docs/adding-games","sidebar":"docs"},{"id":"server-docs/backup-and-restore","path":"/docs/server-docs/backup-and-restore","sidebar":"docs"},{"id":"server-docs/configuration","path":"/docs/server-docs/configuration","sidebar":"docs"},{"id":"server-docs/game-types","path":"/docs/server-docs/game-types","sidebar":"docs"},{"id":"server-docs/indexing","path":"/docs/server-docs/indexing","sidebar":"docs"},{"id":"server-docs/media","path":"/docs/server-docs/media","sidebar":"docs"},{"id":"server-docs/metadata-enrichment/metadata","path":"/docs/server-docs/metadata-enrichment/metadata","sidebar":"docs"},{"id":"server-docs/metadata-enrichment/provider-igdb","path":"/docs/server-docs/metadata-enrichment/provider-igdb","sidebar":"docs"},{"id":"server-docs/parental-control","path":"/docs/server-docs/parental-control","sidebar":"docs"},{"id":"server-docs/plugins","path":"/docs/server-docs/plugins","sidebar":"docs"},{"id":"server-docs/server-news","path":"/docs/server-docs/server-news","sidebar":"docs"},{"id":"server-docs/setup/caprover","path":"/docs/server-docs/setup/caprover","sidebar":"docs"},{"id":"server-docs/setup/docker-compose","path":"/docs/server-docs/setup/docker-compose","sidebar":"docs"},{"id":"server-docs/setup/native","path":"/docs/server-docs/setup/native","sidebar":"docs"},{"id":"server-docs/setup/synology-container-manager","path":"/docs/server-docs/setup/synology-container-manager","sidebar":"docs"},{"id":"server-docs/setup/toc","path":"/docs/server-docs/setup/","sidebar":"docs"},{"id":"server-docs/setup/truenas-scale","path":"/docs/server-docs/setup/truenas-scale","sidebar":"docs"},{"id":"server-docs/setup/truenas-scale-legacy","path":"/docs/server-docs/setup/truenas-scale-legacy","sidebar":"docs"},{"id":"server-docs/setup/unraid","path":"/docs/server-docs/setup/unraid","sidebar":"docs"},{"id":"server-docs/structure","path":"/docs/server-docs/structure","sidebar":"docs"},{"id":"server-docs/updating-games","path":"/docs/server-docs/updating-games","sidebar":"docs"},{"id":"server-docs/user-management","path":"/docs/server-docs/user-management","sidebar":"docs"},{"id":"server-docs/websockets","path":"/docs/server-docs/websockets","sidebar":"docs"},{"id":"troubleshooting","path":"/docs/troubleshooting","sidebar":"docs"}],"draftIds":[],"sidebars":{"docs":{"link":{"path":"/docs/intro","label":"intro"}}}}],"breadcrumbs":true}},"@cmfcmf/docusaurus-search-local":{"default":{"titleBoost":5,"contentBoost":1,"tagsBoost":3,"parentCategoriesBoost":2,"indexDocSidebarParentCategories":0,"maxSearchResults":8}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var s=n(2654);const l=JSON.parse('{"docusaurusVersion":"3.6.3","siteVersion":"1.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.6.3"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.6.3"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.6.3"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.6.3"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.6.3"},"docusaurus-plugin-client-redirects":{"type":"package","name":"@docusaurus/plugin-client-redirects","version":"3.6.3"},"docusaurus-plugin-image-zoom":{"type":"package","name":"docusaurus-plugin-image-zoom","version":"2.0.0"},"@cmfcmf/docusaurus-search-local":{"type":"package","name":"@cmfcmf/docusaurus-search-local","version":"1.2.0"},"tailwind-plugin":{"type":"local"}}}');var c=n(6070);const u={siteConfig:o.default,siteMetadata:l,globalData:a,i18n:i,codeTranslations:s},d=r.createContext(u);function p(e){let{children:t}=e;return(0,c.jsx)(d.Provider,{value:u,children:t})}},5675:(e,t,n)=>{"use strict";n.d(t,{A:()=>m});var r=n(758),o=n(8800),a=n(8485),i=n(3803),s=n(1033),l=n(8227),c=n(6070);function u(e){let{error:t,tryAgain:n}=e;return(0,c.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,c.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,c.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,c.jsx)(d,{error:t})]})}function d(e){let{error:t}=e;const n=(0,i.rA)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,c.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function p(e){let{children:t}=e;return(0,c.jsx)(l.W,{value:{plugin:{name:"docusaurus-core-error-boundary",id:"default"}},children:t})}function f(e){let{error:t,tryAgain:n}=e;return(0,c.jsx)(p,{children:(0,c.jsxs)(m,{fallback:()=>(0,c.jsx)(u,{error:t,tryAgain:n}),children:[(0,c.jsx)(a.A,{children:(0,c.jsx)("title",{children:"Page Error"})}),(0,c.jsx)(s.A,{children:(0,c.jsx)(u,{error:t,tryAgain:n})})]})})}const g=e=>(0,c.jsx)(f,{...e});class m extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){o.A.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??g)(e)}return e??null}}},8800:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,o={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},8485:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(758);var r=n(248),o=n(6070);function a(e){return(0,o.jsx)(r.mg,{...e})}},4895:(e,t,n)=>{"use strict";n.d(t,{A:()=>f});var r=n(758),o=n(1742),a=n(3803),i=n(9431),s=n(7949),l=n(8800),c=n(7872),u=n(404),d=n(6070);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:g,isActive:m,"data-noBrokenLinkCheck":b,autoAddBaseUrl:h=!0,...y}=e;const{siteConfig:v}=(0,i.A)(),{trailingSlash:_,baseUrl:w}=v,x=v.future.experimental_router,{withBaseUrl:S}=(0,u.hH)(),k=(0,c.A)(),E=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>E.current));const O=p||f;const j=(0,s.A)(O),P=O?.replace("pathname://","");let C=void 0!==P?(A=P,h&&(e=>e.startsWith("/"))(A)?S(A):A):void 0;var A;"hash"===x&&C?.startsWith("./")&&(C=C?.slice(1)),C&&j&&(C=(0,a.Ks)(C,{trailingSlash:_,baseUrl:w}));const T=(0,r.useRef)(!1),I=n?o.k2:o.N_,N=l.A.canUseIntersectionObserver,L=(0,r.useRef)(),R=()=>{T.current||null==C||(window.docusaurus.preload(C),T.current=!0)};(0,r.useEffect)((()=>(!N&&j&&l.A.canUseDOM&&null!=C&&window.docusaurus.prefetch(C),()=>{N&&L.current&&L.current.disconnect()})),[L,C,N,j]);const D=C?.startsWith("#")??!1,F=!y.target||"_self"===y.target,M=!C||!j||!F||D&&"hash"!==x;b||!D&&M||k.collectLink(C),y.id&&k.collectAnchor(y.id);const z={};return M?(0,d.jsx)("a",{ref:E,href:C,...O&&!j&&{target:"_blank",rel:"noopener noreferrer"},...y,...z}):(0,d.jsx)(I,{...y,onMouseEnter:R,onTouchStart:R,innerRef:e=>{E.current=e,N&&e&&j&&(L.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(L.current.unobserve(e),L.current.disconnect(),null!=C&&window.docusaurus.prefetch(C))}))})),L.current.observe(e))},to:C,...n&&{isActive:m,activeClassName:g},...z})}const f=r.forwardRef(p)},2615:(e,t,n)=>{"use strict";n.d(t,{A:()=>c,T:()=>l});var r=n(758),o=n(6070);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var i=n(2654);function s(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return i[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return a(s({message:n,id:r}),t)}function c(e){let{children:t,id:n,values:r}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const i=s({message:t,id:n});return(0,o.jsx)(o.Fragment,{children:a(i,r)})}},134:(e,t,n)=>{"use strict";n.d(t,{W:()=>r});const r="default"},7949:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function o(e){return void 0!==e&&!r(e)}n.d(t,{A:()=>o,z:()=>r})},404:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>s,hH:()=>i});var r=n(758),o=n(9431),a=n(7949);function i(){const{siteConfig:e}=(0,o.A)(),{baseUrl:t,url:n}=e,i=e.future.experimental_router,s=(0,r.useCallback)(((e,r)=>function(e){let{siteUrl:t,baseUrl:n,url:r,options:{forcePrependBaseUrl:o=!1,absolute:i=!1}={},router:s}=e;if(!r||r.startsWith("#")||(0,a.z)(r))return r;if("hash"===s)return r.startsWith("/")?`.${r}`:`./${r}`;if(o)return n+r.replace(/^\//,"");if(r===n.replace(/\/$/,""))return n;const l=r.startsWith(n)?r:n+r.replace(/^\//,"");return i?t+l:l}({siteUrl:n,baseUrl:t,url:e,options:r,router:i})),[n,t,i]);return{withBaseUrl:s}}function s(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},7872:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(758);n(6070);const o=r.createContext({collectAnchor:()=>{},collectLink:()=>{}}),a=()=>(0,r.useContext)(o);function i(){return a()}},9431:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(758),o=n(7165);function a(){return(0,r.useContext)(o.o)}},8807:(e,t,n)=>{"use strict";n.d(t,{P_:()=>i,kh:()=>a});var r=n(9431),o=n(134);function a(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,r.A)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}function i(e,t,n){void 0===t&&(t=o.W),void 0===n&&(n={});const r=a(e),i=r?.[t];if(!i&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return i}},8230:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(758),o=n(4016);function a(){return(0,r.useContext)(o.o)}},7886:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(758);const o=n(8800).A.canUseDOM?r.useLayoutEffect:r.useEffect},4184:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(758),o=n(8227);function a(){const e=r.useContext(o.o);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}},2116:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function o(e){const t={};return function e(n,o){Object.entries(n).forEach((n=>{let[a,i]=n;const s=o?`${o}.${a}`:a;r(i)?e(i,s):t[s]=i}))}(e),t}},8227:(e,t,n)=>{"use strict";n.d(t,{W:()=>i,o:()=>a});var r=n(758),o=n(6070);const a=r.createContext(null);function i(e){let{children:t,value:n}=e;const i=r.useContext(a),s=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:i,value:n})),[i,n]);return(0,o.jsx)(a.Provider,{value:s,children:t})}},3926:(e,t,n)=>{"use strict";n.d(t,{VQ:()=>b,XK:()=>v,g1:()=>y});var r=n(758),o=n(2500),a=n(134),i=n(527),s=n(7194),l=n(5629),c=n(6070);const u=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,s.Wf)(u(e),{persistence:t}).set(n)},read:(e,t)=>(0,s.Wf)(u(e),{persistence:t}).get(),clear:(e,t)=>{(0,s.Wf)(u(e),{persistence:t}).del()}},p=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const f=r.createContext(null);function g(){const e=(0,o.Gy)(),t=(0,i.p)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[a,s]=(0,r.useState)((()=>p(n)));(0,r.useEffect)((()=>{s(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function o(e){const t=d.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(d.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,o(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[a,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d.save(e,t,n),s((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function m(e){let{children:t}=e;const n=g();return(0,c.jsx)(f.Provider,{value:n,children:t})}function b(e){let{children:t}=e;return(0,c.jsx)(m,{children:t})}function h(){const e=(0,r.useContext)(f);if(!e)throw new l.dV("DocsPreferredVersionContextProvider");return e}function y(e){void 0===e&&(e=a.W);const t=(0,o.ht)(e),[n,i]=h(),{preferredVersionName:s}=n[e];return{preferredVersion:t.versions.find((e=>e.name===s))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}function v(){const e=(0,o.Gy)(),[t]=h();function n(n){const r=e[n],{preferredVersionName:o}=t[n];return r.versions.find((e=>e.name===o))??null}const r=Object.keys(e);return Object.fromEntries(r.map((e=>[e,n(e)])))}},397:(e,t,n)=>{"use strict";n.d(t,{k:()=>a,v:()=>i});var r=n(2500),o=n(3926);function a(e,t){return`docs-${e}-${t}`}function i(){const e=(0,r.Gy)(),t=(0,r.gk)(),n=(0,o.XK)();return[...Object.keys(e).map((function(r){const o=t?.activePlugin.pluginId===r?t.activeVersion:void 0,i=n[r],s=e[r].versions.find((e=>e.isLast));return a(r,(o??i??s).name)}))]}},6729:(e,t,n)=>{"use strict";n.d(t,{V:()=>l,t:()=>c});var r=n(758),o=n(5629),a=n(6070);const i=Symbol("EmptyContext"),s=r.createContext(i);function l(e){let{children:t,name:n,items:o}=e;const i=(0,r.useMemo)((()=>n&&o?{name:n,items:o}:null),[n,o]);return(0,a.jsx)(s.Provider,{value:i,children:t})}function c(){const e=(0,r.useContext)(s);if(e===i)throw new o.dV("DocsSidebarProvider");return e}},6404:(e,t,n)=>{"use strict";n.d(t,{$S:()=>f,B5:()=>k,Nr:()=>p,OF:()=>_,QB:()=>S,Vd:()=>w,Y:()=>y,d1:()=>E,fW:()=>x,w8:()=>b});var r=n(758),o=n(5557),a=n(389),i=n(2500),s=n(5210),l=n(665),c=n(3926),u=n(105),d=n(6729);function p(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=p(t);if(e)return e}}(e):void 0:e.href}function f(){const{pathname:e}=(0,o.zy)(),t=(0,d.t)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");const n=v({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];if(!n)throw new Error(`${e} is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.`);return n}const g=(e,t)=>void 0!==e&&(0,s.ys)(e,t),m=(e,t)=>e.some((e=>b(e,t)));function b(e,t){return"link"===e.type?g(e.href,t):"category"===e.type&&(g(e.href,t)||m(e.items,t))}function h(e,t){switch(e.type){case"category":return b(e,t)||e.items.some((e=>h(e,t)));case"link":return!e.unlisted||b(e,t);default:return!0}}function y(e,t){return(0,r.useMemo)((()=>e.filter((e=>h(e,t)))),[e,t])}function v(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const o=[];return function e(t){for(const a of t)if("category"===a.type&&((0,s.ys)(a.href,n)||e(a.items))||"link"===a.type&&(0,s.ys)(a.href,n)){return r&&"category"!==a.type||o.unshift(a),!0}return!1}(t),o}function _(){const e=(0,d.t)(),{pathname:t}=(0,o.zy)(),n=(0,i.vT)()?.pluginData.breadcrumbs;return!1!==n&&e?v({sidebarItems:e.items,pathname:t}):null}function w(e){const{activeVersion:t}=(0,i.zK)(e),{preferredVersion:n}=(0,c.g1)(e),o=(0,i.r7)(e);return(0,r.useMemo)((()=>(0,l.sb)([t,n,o].filter(Boolean))),[t,n,o])}function x(e,t){const n=w(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function S(e,t){const n=w(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${(0,l.sb)(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function k(e){let{route:t}=e;const n=(0,o.zy)(),r=(0,u.r)(),i=t.routes,s=i.find((e=>(0,o.B6)(n.pathname,e)));if(!s)return null;const l=s.sidebar,c=l?r.docsSidebars[l]:void 0;return{docElement:(0,a.v)(i),sidebarName:l,sidebarItems:c}}function E(e){return e.filter((e=>!("category"===e.type||"link"===e.type)||!!p(e)))}},105:(e,t,n)=>{"use strict";n.d(t,{n:()=>s,r:()=>l});var r=n(758),o=n(5629),a=n(6070);const i=r.createContext(null);function s(e){let{children:t,version:n}=e;return(0,a.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(null===e)throw new o.dV("DocsVersionProvider");return e}},2500:(e,t,n)=>{"use strict";n.d(t,{d1:()=>l.d1,zK:()=>y,vT:()=>g,gk:()=>m,Gy:()=>p,$S:()=>l.$S,HW:()=>v,vF:()=>u.v,ht:()=>f,g1:()=>c.g1,r7:()=>h,jh:()=>b});var r=n(5557),o=n(8807);const a=e=>e.versions.find((e=>e.isLast));function i(e,t){return[...e.versions].sort(((e,t)=>e.path===t.path?0:e.path.includes(t.path)?-1:t.path.includes(e.path)?1:0)).find((e=>!!(0,r.B6)(t,{path:e.path,exact:!1,strict:!1})))}function s(e,t){const n=i(e,t),o=n?.docs.find((e=>!!(0,r.B6)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:o,alternateDocVersions:o?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(o.id):{}}}var l=n(6404),c=n(3926),u=n(397);const d={},p=()=>(0,o.kh)("docusaurus-plugin-content-docs")??d,f=e=>{try{return(0,o.P_)("docusaurus-plugin-content-docs",e,{failfast:!0})}catch(t){throw new Error("You are using a feature of the Docusaurus docs plugin, but this plugin does not seem to be enabled"+("Default"===e?"":` (pluginId=${e}`),{cause:t})}};function g(e){void 0===e&&(e={});const t=p(),{pathname:n}=(0,r.zy)();return function(e,t,n){void 0===n&&(n={});const o=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.B6)(t,{path:n.path,exact:!1,strict:!1})})),a=o?{pluginId:o[0],pluginData:o[1]}:void 0;if(!a&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return a}(t,n,e)}function m(e){void 0===e&&(e={});const t=g(e),{pathname:n}=(0,r.zy)();if(!t)return;return{activePlugin:t,activeVersion:i(t.pluginData,n)}}function b(e){return f(e).versions}function h(e){const t=f(e);return a(t)}function y(e){const t=f(e),{pathname:n}=(0,r.zy)();return s(t,n)}function v(e){const t=f(e),{pathname:n}=(0,r.zy)();return function(e,t){const n=a(e);return{latestDocSuggestion:s(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},3485:(e,t,n)=>{"use strict";function r(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}function o(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(){return i=Object.assign||function(e){for(var t=1;t{"use strict";n.r(t),n.d(t,{default:()=>a});var r=n(8744),o=n.n(r);o().configure({showSpinner:!1});const a={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{o().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){o().done()}}},982:(e,t,n)=>{"use strict";var r=n(5371),o=n(4784);!function(e){const{themeConfig:{prism:t}}=o.default,{additionalLanguages:r}=t,a=globalThis.Prism;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(1274),n(8755)(`./prism-${e}`)})),delete globalThis.Prism,void 0!==a&&(globalThis.Prism=e)}(r.My)},801:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(758);var r=n(3526),o=n(2615),a=n(527),i=n(4895),s=n(7872);const l={anchorWithStickyNavbar:"anchorWithStickyNavbar_y3g7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_cxP_"};var c=n(6070);function u(e){let{as:t,id:n,...u}=e;const d=(0,s.A)(),{navbar:{hideOnScroll:p}}=(0,a.p)();if("h1"===t||!n)return(0,c.jsx)(t,{...u,id:void 0});d.collectAnchor(n);const f=(0,o.T)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof u.children?u.children:n});return(0,c.jsxs)(t,{...u,className:(0,r.A)("anchor",p?l.anchorWithHideOnScrollNavbar:l.anchorWithStickyNavbar,u.className),id:n,children:[u.children,(0,c.jsx)(i.A,{className:"hash-link",to:`#${n}`,"aria-label":f,title:f,children:"\u200b"})]})}},9316:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(758);const r={iconExternalLink:"iconExternalLink__Rzt"};var o=n(6070);function a(e){let{width:t=13.5,height:n=13.5}=e;return(0,o.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,o.jsx)("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"})})}},1033:(e,t,n)=>{"use strict";n.d(t,{A:()=>si});var r=n(758),o=n(3526),a=n(5675),i=n(7826),s=n(5557),l=n(2615),c=n(9297),u=n(6070);const d="__docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,r.useRef)(null),{action:t}=(0,s.W6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&p(t)}),[]);return(0,c.$)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const g=(0,l.T)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function m(e){const t=e.children??g,{containerRef:n,onClick:r}=f();return(0,u.jsx)("div",{ref:n,role:"region","aria-label":g,children:(0,u.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var b=n(152),h=n(785);const y={skipToContent:"skipToContent_QNQB"};function v(){return(0,u.jsx)(m,{className:y.skipToContent})}var _=n(527),w=n(6328);function x(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:o=1.2,className:a,...i}=e;return(0,u.jsx)("svg",{viewBox:"0 0 15 15",width:t,height:n,...i,children:(0,u.jsx)("g",{stroke:r,strokeWidth:o,children:(0,u.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const S={closeButton:"closeButton_luG5"};function k(e){return(0,u.jsx)("button",{type:"button","aria-label":(0,l.T)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,o.A)("clean-btn close",S.closeButton,e.className),children:(0,u.jsx)(x,{width:14,height:14,strokeWidth:3.1})})}const E={content:"content_Q5VJ"};function O(e){const{announcementBar:t}=(0,_.p)(),{content:n}=t;return(0,u.jsx)("div",{...e,className:(0,o.A)(E.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const j={announcementBar:"announcementBar_kBQ3",announcementBarPlaceholder:"announcementBarPlaceholder_z_fR",announcementBarClose:"announcementBarClose_sV96",announcementBarContent:"announcementBarContent_YKv2"};function P(){const{announcementBar:e}=(0,_.p)(),{isActive:t,close:n}=(0,w.M)();if(!t)return null;const{backgroundColor:r,textColor:o,isCloseable:a}=e;return(0,u.jsxs)("div",{className:j.announcementBar,style:{backgroundColor:r,color:o},role:"banner",children:[a&&(0,u.jsx)("div",{className:j.announcementBarPlaceholder}),(0,u.jsx)(O,{className:j.announcementBarContent}),a&&(0,u.jsx)(k,{onClick:n,className:j.announcementBarClose})]})}var C=n(8955),A=n(2935);var T=n(5629),I=n(293);const N=r.createContext(null);function L(e){let{children:t}=e;const n=function(){const e=(0,C.M)(),t=(0,I.YL)(),[n,o]=(0,r.useState)(!1),a=null!==t.component,i=(0,T.ZC)(a);return(0,r.useEffect)((()=>{a&&!i&&o(!0)}),[a,i]),(0,r.useEffect)((()=>{a?e.shown||o(!0):o(!1)}),[e.shown,a]),(0,r.useMemo)((()=>[n,o]),[n])}();return(0,u.jsx)(N.Provider,{value:n,children:t})}function R(e){if(e.component){const t=e.component;return(0,u.jsx)(t,{...e.props})}}function D(){const e=(0,r.useContext)(N);if(!e)throw new T.dV("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,o=(0,r.useCallback)((()=>n(!1)),[n]),a=(0,I.YL)();return(0,r.useMemo)((()=>({shown:t,hide:o,content:R(a)})),[o,a,t])}function F(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:a}=D();return(0,u.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,u.jsxs)("div",{className:(0,o.A)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":a}),children:[(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:n}),(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:r})]})]})}var M=n(6336),z=n(8230);function B(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"})})}function $(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"})})}const U={toggle:"toggle_AZjI",toggleButton:"toggleButton_J4kA",darkToggleIcon:"darkToggleIcon_vgIo",lightToggleIcon:"lightToggleIcon_RGm_",toggleButtonDisabled:"toggleButtonDisabled_vwae"};function H(e){let{className:t,buttonClassName:n,value:r,onChange:a}=e;const i=(0,z.A)(),s=(0,l.T)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===r?(0,l.T)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,l.T)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,u.jsx)("div",{className:(0,o.A)(U.toggle,t),children:(0,u.jsxs)("button",{className:(0,o.A)("clean-btn",U.toggleButton,!i&&U.toggleButtonDisabled,n),type:"button",onClick:()=>a("dark"===r?"light":"dark"),disabled:!i,title:s,"aria-label":s,"aria-live":"polite","aria-pressed":"dark"===r?"true":"false",children:[(0,u.jsx)(B,{className:(0,o.A)(U.toggleIcon,U.lightToggleIcon)}),(0,u.jsx)($,{className:(0,o.A)(U.toggleIcon,U.darkToggleIcon)})]})})}const V=r.memo(H),Q={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_M0sS"};function W(e){let{className:t}=e;const n=(0,_.p)().navbar.style,r=(0,_.p)().colorMode.disableSwitch,{colorMode:o,setColorMode:a}=(0,M.G)();return r?null:(0,u.jsx)(V,{className:t,buttonClassName:"dark"===n?Q.darkNavbarColorModeToggle:void 0,value:o,onChange:a})}var q=n(5304);function G(){return(0,u.jsx)(q.A,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function K(){const e=(0,C.M)();return(0,u.jsx)("button",{type:"button","aria-label":(0,l.T)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,u.jsx)(x,{color:"var(--ifm-color-emphasis-600)"})})}function Y(){return(0,u.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,u.jsx)(G,{}),(0,u.jsx)(W,{className:"margin-right--md"}),(0,u.jsx)(K,{})]})}var Z=n(4895),X=n(404),J=n(7949);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(9316);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:o,label:a,html:i,isDropdownLink:s,prependBaseUrlToHref:l,...c}=e;const d=(0,X.Ay)(r),p=(0,X.Ay)(t),f=(0,X.Ay)(o,{forcePrependBaseUrl:!0}),g=a&&o&&!(0,J.A)(o),m=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,u.jsxs)(u.Fragment,{children:[a,g&&(0,u.jsx)(te.A,{...s&&{width:12,height:12}})]})};return o?(0,u.jsx)(Z.A,{href:l?f:o,...c,...m}):(0,u.jsx)(Z.A,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(p)},...c,...m})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const a=(0,u.jsx)(ne,{className:(0,o.A)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,u.jsx)("li",{children:a}):a}function oe(e){let{className:t,isDropdownItem:n,...r}=e;return(0,u.jsx)("li",{className:"menu__list-item",children:(0,u.jsx)(ne,{className:(0,o.A)("menu__link",t),...r})})}function ae(e){let{mobile:t=!1,position:n,...r}=e;const o=t?oe:re;return(0,u.jsx)(o,{...r,activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ie=n(6635),se=n(5210),le=n(9431);const ce={dropdownNavbarItemMobile:"dropdownNavbarItemMobile_FCIY"};function ue(e,t){return e.some((e=>function(e,t){return!!(0,se.ys)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function de(e){let{items:t,position:n,className:a,onClick:i,...s}=e;const l=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{l.current&&!l.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[l]),(0,u.jsxs)("div",{ref:l,className:(0,o.A)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c}),children:[(0,u.jsx)(ne,{"aria-haspopup":"true","aria-expanded":c,role:"button",href:s.to?void 0:"#",className:(0,o.A)("navbar__link",a),...s,onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))},children:s.children??s.label}),(0,u.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(va,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function pe(e){let{items:t,className:n,position:a,onClick:i,...l}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,le.A)(),{pathname:t}=(0,s.zy)();return t.replace(e,"/")}(),d=ue(t,c),{collapsed:p,toggleCollapsed:f,setCollapsed:g}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&g(!d)}),[c,d,g]),(0,u.jsxs)("li",{className:(0,o.A)("menu__list-item",{"menu__list-item--collapsed":p}),children:[(0,u.jsx)(ne,{role:"button",className:(0,o.A)(ce.dropdownNavbarItemMobile,"menu__link menu__link--sublist menu__link--sublist-caret",n),...l,onClick:e=>{e.preventDefault(),f()},children:l.children??l.label}),(0,u.jsx)(ie.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:p,children:t.map(((e,t)=>(0,r.createElement)(va,{mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active",...e,key:t})))})]})}function fe(e){let{mobile:t=!1,...n}=e;const r=t?pe:de;return(0,u.jsx)(r,{...n})}var ge=n(3884);function me(e){let{width:t=20,height:n=20,...r}=e;return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0,...r,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"})})}const be="iconLanguage__kBw";var he=n(8143);function ye(e,t){var n=void 0;return function(){for(var r=arguments.length,o=new Array(r),a=0;ae.length)&&(t=e.length);for(var n=0,r=new Array(t);ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function Ie(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Ne(e){for(var t=1;t=3||2===n&&r>=4||1===n&&r>=10}(e);function n(n,r,o){if(t&&void 0!==o){var a=o[0].__autocomplete_algoliaCredentials,i={"X-Algolia-Application-Id":a.appId,"X-Algolia-API-Key":a.apiKey};e.apply(void 0,[n].concat(Ce(r),[{headers:i}]))}else e.apply(void 0,[n].concat(Ce(r)))}return{init:function(t,n){e("init",{appId:t,apiKey:n})},setUserToken:function(t){e("setUserToken",t)},clickedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),r=0;r0&&n("clickedObjectIDsAfterSearch",Re(t),t[0].items)},clickedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r0&&n("clickedObjectIDs",Re(t),t[0].items)},clickedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r0&&e.apply(void 0,["clickedFilters"].concat(n))},convertedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),r=0;r0&&n("convertedObjectIDsAfterSearch",Re(t),t[0].items)},convertedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r0&&n("convertedObjectIDs",Re(t),t[0].items)},convertedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r0&&e.apply(void 0,["convertedFilters"].concat(n))},viewedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r0&&t.reduce((function(e,t){var n=t.items,r=Te(t,je);return[].concat(Ce(e),Ce(function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:20,n=[],r=0;r0&&e.apply(void 0,["viewedFilters"].concat(n))}}}function Fe(e){var t=e.items.reduce((function(e,t){var n;return e[t.__autocomplete_indexName]=(null!==(n=e[t.__autocomplete_indexName])&&void 0!==n?n:[]).concat(t),e}),{});return Object.keys(t).map((function(e){return{index:e,items:t[e],algoliaSource:["autocomplete"]}}))}function Me(e){return e.objectID&&e.__autocomplete_indexName&&e.__autocomplete_queryID}function ze(e){return ze="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},ze(e)}function Be(e){return function(e){if(Array.isArray(e))return $e(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return $e(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return $e(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function $e(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n0&&qe({onItemsChange:r,items:n,insights:l,state:t}))}}),0);return{name:"aa.algoliaInsightsPlugin",subscribe:function(e){var t=e.setContext,n=e.onSelect,r=e.onActive;function c(e){t({algoliaInsightsPlugin:{__algoliaSearchParameters:He(He({},i?{clickAnalytics:!0}:{}),e?{userToken:e}:{}),insights:l}})}s("addAlgoliaAgent","insights-plugin"),c(),s("onUserTokenChange",c),s("getUserToken",null,(function(e,t){c(t)})),n((function(e){var t=e.item,n=e.state,r=e.event,a=e.source;Me(t)&&o({state:n,event:r,insights:l,item:t,insightsEvents:[He({eventName:"Item Selected"},Se({item:t,items:a.getItems().filter(Me)}))]})})),r((function(e){var t=e.item,n=e.source,r=e.state,o=e.event;Me(t)&&a({state:r,event:o,insights:l,item:t,insightsEvents:[He({eventName:"Item Active"},Se({item:t,items:n.getItems().filter(Me)}))]})}))},onStateChange:function(e){var t=e.state;u({state:t})},__autocomplete_pluginOptions:e}}function Ke(){var e,t=arguments.length>1?arguments[1]:void 0;return[].concat(Be(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]),["autocomplete-internal"],Be(null!==(e=t.algoliaInsightsPlugin)&&void 0!==e&&e.__automaticInsights?["autocomplete-automatic"]:[]))}function Ye(e){return Ye="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Ye(e)}function Ze(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Xe(e,t,n){return(t=function(e){var t=function(e,t){if("object"!==Ye(e)||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!==Ye(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===Ye(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function Je(e,t,n){var r,o=t.initialState;return{getState:function(){return o},dispatch:function(r,a){var i=function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n0},reshape:function(e){return e.sources}},e),{},{id:null!==(n=e.id)&&void 0!==n?n:st(),plugins:o,initialState:bt({activeItemId:null,query:"",completion:null,collections:[],isOpen:!1,status:"idle",context:{}},e.initialState),onStateChange:function(t){var n;null===(n=e.onStateChange)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onStateChange)||void 0===n?void 0:n.call(e,t)}))},onSubmit:function(t){var n;null===(n=e.onSubmit)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onSubmit)||void 0===n?void 0:n.call(e,t)}))},onReset:function(t){var n;null===(n=e.onReset)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onReset)||void 0===n?void 0:n.call(e,t)}))},getSources:function(n){return Promise.all([].concat(ft(o.map((function(e){return e.getSources}))),[e.getSources]).filter(Boolean).map((function(e){return function(e,t){var n=[];return Promise.resolve(e(t)).then((function(e){return Array.isArray(e),Promise.all(e.filter((function(e){return Boolean(e)})).map((function(e){if(e.sourceId,n.includes(e.sourceId))throw new Error("[Autocomplete] The `sourceId` ".concat(JSON.stringify(e.sourceId)," is not unique."));n.push(e.sourceId);var t={getItemInputValue:function(e){return e.state.query},getItemUrl:function(){},onSelect:function(e){(0,e.setIsOpen)(!1)},onActive:xe,onResolve:xe};Object.keys(t).forEach((function(e){t[e].__default=!0}));var r=ct(ct({},t),e);return Promise.resolve(r)})))}))}(e,n)}))).then((function(e){return et(e)})).then((function(e){return e.map((function(e){return bt(bt({},e),{},{onSelect:function(n){e.onSelect(n),t.forEach((function(e){var t;return null===(t=e.onSelect)||void 0===t?void 0:t.call(e,n)}))},onActive:function(n){e.onActive(n),t.forEach((function(e){var t;return null===(t=e.onActive)||void 0===t?void 0:t.call(e,n)}))},onResolve:function(n){e.onResolve(n),t.forEach((function(e){var t;return null===(t=e.onResolve)||void 0===t?void 0:t.call(e,n)}))}})}))}))},navigator:bt({navigate:function(e){var t=e.itemUrl;r.location.assign(t)},navigateNewTab:function(e){var t=e.itemUrl,n=r.open(t,"_blank","noopener");null==n||n.focus()},navigateNewWindow:function(e){var t=e.itemUrl;r.open(t,"_blank","noopener")}},e.navigator)})}function vt(e){return vt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},vt(e)}function _t(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function wt(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var Vt,Qt,Wt,qt=null,Gt=(Vt=-1,Qt=-1,Wt=void 0,function(e){var t=++Vt;return Promise.resolve(e).then((function(e){return Wt&&t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var rn=/((gt|sm)-|galaxy nexus)|samsung[- ]|samsungbrowser/i;function on(e){return on="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},on(e)}var an=["props","refresh","store"],sn=["inputElement","formElement","panelElement"],ln=["inputElement"],cn=["inputElement","maxLength"],un=["source"],dn=["item","source"];function pn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function fn(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function bn(e){var t=e.props,n=e.refresh,r=e.store,o=mn(e,an);return{getEnvironmentProps:function(e){var n=e.inputElement,o=e.formElement,a=e.panelElement;function i(e){!r.getState().isOpen&&r.pendingRequests.isEmpty()||e.target===n||!1===[o,a].some((function(t){return n=t,r=e.target,n===r||n.contains(r);var n,r}))&&(r.dispatch("blur",null),t.debug||r.pendingRequests.cancelAll())}return fn({onTouchStart:i,onMouseDown:i,onTouchMove:function(e){!1!==r.getState().isOpen&&n===t.environment.document.activeElement&&e.target!==n&&n.blur()}},mn(e,sn))},getRootProps:function(e){return fn({role:"combobox","aria-expanded":r.getState().isOpen,"aria-haspopup":"listbox","aria-owns":r.getState().isOpen?r.getState().collections.map((function(e){var n=e.source;return Yt(t.id,"list",n)})).join(" "):void 0,"aria-labelledby":Yt(t.id,"label")},e)},getFormProps:function(e){e.inputElement;return fn({action:"",noValidate:!0,role:"search",onSubmit:function(a){var i;a.preventDefault(),t.onSubmit(fn({event:a,refresh:n,state:r.getState()},o)),r.dispatch("submit",null),null===(i=e.inputElement)||void 0===i||i.blur()},onReset:function(a){var i;a.preventDefault(),t.onReset(fn({event:a,refresh:n,state:r.getState()},o)),r.dispatch("reset",null),null===(i=e.inputElement)||void 0===i||i.focus()}},mn(e,ln))},getLabelProps:function(e){return fn({htmlFor:Yt(t.id,"input"),id:Yt(t.id,"label")},e)},getInputProps:function(e){var a;function i(e){(t.openOnFocus||Boolean(r.getState().query))&&Kt(fn({event:e,props:t,query:r.getState().completion||r.getState().query,refresh:n,store:r},o)),r.dispatch("focus",null)}var s=e||{},l=(s.inputElement,s.maxLength),c=void 0===l?512:l,u=mn(s,cn),d=Ft(r.getState()),p=function(e){return Boolean(e&&e.match(rn))}((null===(a=t.environment.navigator)||void 0===a?void 0:a.userAgent)||""),f=t.enterKeyHint||(null!=d&&d.itemUrl&&!p?"go":"search");return fn({"aria-autocomplete":"both","aria-activedescendant":r.getState().isOpen&&null!==r.getState().activeItemId?Yt(t.id,"item-".concat(r.getState().activeItemId),null==d?void 0:d.source):void 0,"aria-controls":r.getState().isOpen?r.getState().collections.map((function(e){var n=e.source;return Yt(t.id,"list",n)})).join(" "):void 0,"aria-labelledby":Yt(t.id,"label"),value:r.getState().completion||r.getState().query,id:Yt(t.id,"input"),autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",enterKeyHint:f,spellCheck:"false",autoFocus:t.autoFocus,placeholder:t.placeholder,maxLength:c,type:"search",onChange:function(e){Kt(fn({event:e,props:t,query:e.currentTarget.value.slice(0,c),refresh:n,store:r},o))},onKeyDown:function(e){!function(e){var t=e.event,n=e.props,r=e.refresh,o=e.store,a=nn(e,Xt);if("ArrowUp"===t.key||"ArrowDown"===t.key){var i=function(){var e=Ft(o.getState()),t=n.environment.document.getElementById(Yt(n.id,"item-".concat(o.getState().activeItemId),null==e?void 0:e.source));t&&(t.scrollIntoViewIfNeeded?t.scrollIntoViewIfNeeded(!1):t.scrollIntoView(!1))},s=function(){var e=Ft(o.getState());if(null!==o.getState().activeItemId&&e){var n=e.item,i=e.itemInputValue,s=e.itemUrl,l=e.source;l.onActive(en({event:t,item:n,itemInputValue:i,itemUrl:s,refresh:r,source:l,state:o.getState()},a))}};t.preventDefault(),!1===o.getState().isOpen&&(n.openOnFocus||Boolean(o.getState().query))?Kt(en({event:t,props:n,query:o.getState().query,refresh:r,store:o},a)).then((function(){o.dispatch(t.key,{nextActiveItemId:n.defaultActiveItemId}),s(),setTimeout(i,0)})):(o.dispatch(t.key,{}),s(),i())}else if("Escape"===t.key)t.preventDefault(),o.dispatch(t.key,null),o.pendingRequests.cancelAll();else if("Tab"===t.key)o.dispatch("blur",null),o.pendingRequests.cancelAll();else if("Enter"===t.key){if(null===o.getState().activeItemId||o.getState().collections.every((function(e){return 0===e.items.length})))return void(n.debug||o.pendingRequests.cancelAll());t.preventDefault();var l=Ft(o.getState()),c=l.item,u=l.itemInputValue,d=l.itemUrl,p=l.source;if(t.metaKey||t.ctrlKey)void 0!==d&&(p.onSelect(en({event:t,item:c,itemInputValue:u,itemUrl:d,refresh:r,source:p,state:o.getState()},a)),n.navigator.navigateNewTab({itemUrl:d,item:c,state:o.getState()}));else if(t.shiftKey)void 0!==d&&(p.onSelect(en({event:t,item:c,itemInputValue:u,itemUrl:d,refresh:r,source:p,state:o.getState()},a)),n.navigator.navigateNewWindow({itemUrl:d,item:c,state:o.getState()}));else if(t.altKey);else{if(void 0!==d)return p.onSelect(en({event:t,item:c,itemInputValue:u,itemUrl:d,refresh:r,source:p,state:o.getState()},a)),void n.navigator.navigate({itemUrl:d,item:c,state:o.getState()});Kt(en({event:t,nextState:{isOpen:!1},props:n,query:u,refresh:r,store:o},a)).then((function(){p.onSelect(en({event:t,item:c,itemInputValue:u,itemUrl:d,refresh:r,source:p,state:o.getState()},a))}))}}}(fn({event:e,props:t,refresh:n,store:r},o))},onFocus:i,onBlur:xe,onClick:function(n){e.inputElement!==t.environment.document.activeElement||r.getState().isOpen||i(n)}},u)},getPanelProps:function(e){return fn({onMouseDown:function(e){e.preventDefault()},onMouseLeave:function(){r.dispatch("mouseleave",null)}},e)},getListProps:function(e){var n=e||{},r=n.source,o=mn(n,un);return fn({role:"listbox","aria-labelledby":Yt(t.id,"label"),id:Yt(t.id,"list",r)},o)},getItemProps:function(e){var a=e.item,i=e.source,s=mn(e,dn);return fn({id:Yt(t.id,"item-".concat(a.__autocomplete_id),i),role:"option","aria-selected":r.getState().activeItemId===a.__autocomplete_id,onMouseMove:function(e){if(a.__autocomplete_id!==r.getState().activeItemId){r.dispatch("mousemove",a.__autocomplete_id);var t=Ft(r.getState());if(null!==r.getState().activeItemId&&t){var i=t.item,s=t.itemInputValue,l=t.itemUrl,c=t.source;c.onActive(fn({event:e,item:i,itemInputValue:s,itemUrl:l,refresh:n,source:c,state:r.getState()},o))}}},onMouseDown:function(e){e.preventDefault()},onClick:function(e){var s=i.getItemInputValue({item:a,state:r.getState()}),l=i.getItemUrl({item:a,state:r.getState()});(l?Promise.resolve():Kt(fn({event:e,nextState:{isOpen:!1},props:t,query:s,refresh:n,store:r},o))).then((function(){i.onSelect(fn({event:e,item:a,itemInputValue:s,itemUrl:l,refresh:n,source:i,state:r.getState()},o))}))}},s)}}}var hn="1.12.2",yn=[{segment:"autocomplete-core",version:hn}];function vn(e){return vn="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},vn(e)}function _n(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function wn(e){for(var t=1;t=n?null===r?null:0:o}function On(e){return On="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},On(e)}function jn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Pn(e){for(var t=1;t=5&&((o||!e&&5===r)&&(i.push(r,0,o,n),r=6),e&&(i.push(r,e,0,n),r=6)),o=""},l=0;l"===t?(r=1,o=""):o=t+o[0]:a?t===a?a="":o+=t:'"'===t||"'"===t?a=t:">"===t?(s(),r=1):r&&("="===t?(r=5,n=o,o=""):"/"===t&&(r<5||">"===e[l][c+1])?(s(),3===r&&(i=i[0]),r=i,(i=i[0]).push(2,0,r),r=0):" "===t||"\t"===t||"\n"===t||"\r"===t?(s(),r=2):o+=t),3===r&&"!--"===o&&(r=4,i=i[0])}return s(),i}(e)),t),arguments,[])).length>1?t:t[0]}var zn=function(e){var t=e.environment,n=t.document.createElementNS("http://www.w3.org/2000/svg","svg");n.setAttribute("class","aa-SubmitIcon"),n.setAttribute("viewBox","0 0 24 24"),n.setAttribute("width","20"),n.setAttribute("height","20"),n.setAttribute("fill","currentColor");var r=t.document.createElementNS("http://www.w3.org/2000/svg","path");return r.setAttribute("d","M16.041 15.856c-0.034 0.026-0.067 0.055-0.099 0.087s-0.060 0.064-0.087 0.099c-1.258 1.213-2.969 1.958-4.855 1.958-1.933 0-3.682-0.782-4.95-2.050s-2.050-3.017-2.050-4.95 0.782-3.682 2.050-4.95 3.017-2.050 4.95-2.050 3.682 0.782 4.95 2.050 2.050 3.017 2.050 4.95c0 1.886-0.745 3.597-1.959 4.856zM21.707 20.293l-3.675-3.675c1.231-1.54 1.968-3.493 1.968-5.618 0-2.485-1.008-4.736-2.636-6.364s-3.879-2.636-6.364-2.636-4.736 1.008-6.364 2.636-2.636 3.879-2.636 6.364 1.008 4.736 2.636 6.364 3.879 2.636 6.364 2.636c2.125 0 4.078-0.737 5.618-1.968l3.675 3.675c0.391 0.391 1.024 0.391 1.414 0s0.391-1.024 0-1.414z"),n.appendChild(r),n},Bn=function(e){var t=e.environment,n=t.document.createElementNS("http://www.w3.org/2000/svg","svg");n.setAttribute("class","aa-ClearIcon"),n.setAttribute("viewBox","0 0 24 24"),n.setAttribute("width","18"),n.setAttribute("height","18"),n.setAttribute("fill","currentColor");var r=t.document.createElementNS("http://www.w3.org/2000/svg","path");return r.setAttribute("d","M5.293 6.707l5.293 5.293-5.293 5.293c-0.391 0.391-0.391 1.024 0 1.414s1.024 0.391 1.414 0l5.293-5.293 5.293 5.293c0.391 0.391 1.024 0.391 1.414 0s0.391-1.024 0-1.414l-5.293-5.293 5.293-5.293c0.391-0.391 0.391-1.024 0-1.414s-1.024-0.391-1.414 0l-5.293 5.293-5.293-5.293c-0.391-0.391-1.024-0.391-1.414 0s-0.391 1.024 0 1.414z"),n.appendChild(r),n},$n=function(e){var t=e.environment.document.createElementNS("http://www.w3.org/2000/svg","svg");return t.setAttribute("class","aa-LoadingIcon"),t.setAttribute("viewBox","0 0 100 100"),t.setAttribute("width","20"),t.setAttribute("height","20"),t.innerHTML='\n \n',t},Un=["ontouchstart","ontouchend","ontouchmove","ontouchcancel"];function Hn(e,t,n){e[t]=null===n?"":"number"!=typeof n?n:n+"px"}function Vn(e){this._listeners[e.type](e)}function Qn(e,t,n){var r,o,a=e[t];if("style"===t)if("string"==typeof n)e.style=n;else if(null===n)e.style="";else for(t in n)a&&n[t]===a[t]||Hn(e.style,t,n[t]);else"o"===t[0]&&"n"===t[1]?(r=t!==(t=t.replace(/Capture$/,"")),((o=t.toLowerCase())in e||Un.includes(o))&&(t=o),t=t.slice(2),e._listeners||(e._listeners={}),e._listeners[t]=n,n?a||e.addEventListener(t,Vn,r):e.removeEventListener(t,Vn,r)):"list"!==t&&"tagName"!==t&&"form"!==t&&"type"!==t&&"size"!==t&&"download"!==t&&"href"!==t&&t in e?e[t]=null==n?"":n:"function"!=typeof n&&"dangerouslySetInnerHTML"!==t&&(null==n||!1===n&&!/^ar/.test(t)?e.removeAttribute(t):e.setAttribute(t,n))}function Wn(e){return"onChange"===e?"onInput":e}function qn(e,t){for(var n in t)Qn(e,Wn(n),t[n])}function Gn(e,t){for(var n in t)"o"===n[0]&&"n"===n[1]||Qn(e,Wn(n),t[n])}var Kn=["children"];function Yn(e){return function(e){if(Array.isArray(e))return Zn(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return Zn(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Zn(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Zn(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function Jn(e){return function(t,n){var r=n.children,o=void 0===r?[]:r,a=Xn(n,Kn),i=e.document.createElement(t);return qn(i,a),i.append.apply(i,Yn(o)),i}}function er(e){return er="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},er(e)}var tr=["autocompleteScopeApi","environment","classNames","getInputProps","getInputPropsCore","isDetached","state"];function nr(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function rr(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var ir=function(e){var t=e.autocompleteScopeApi,n=e.environment,r=(e.classNames,e.getInputProps),o=e.getInputPropsCore,a=e.isDetached,i=e.state,s=ar(e,tr),l=Jn(n)("input",s),c=r(rr({state:i,props:o({inputElement:l}),inputElement:l},t));return qn(l,rr(rr({},c),{},{onKeyDown:function(e){a&&"Tab"===e.key||c.onKeyDown(e)}})),l};function sr(e){return sr="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},sr(e)}function lr(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function cr(e){for(var t=1;t2&&(i.children=arguments.length>3?dr.call(arguments,2):n),"function"==typeof e&&null!=e.defaultProps)for(a in e.defaultProps)void 0===i[a]&&(i[a]=e.defaultProps[a]);return Er(e,i,r,o,null)}function Er(e,t,n,r,o){var a={type:e,props:t,key:n,ref:r,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,constructor:void 0,__v:null==o?++fr:o,__i:-1,__u:0};return null==o&&null!=pr.vnode&&pr.vnode(a),a}function Or(e){return e.children}function jr(e,t){this.props=e,this.context=t}function Pr(e,t){if(null==t)return e.__?Pr(e.__,e.__i+1):null;for(var n;tt&&gr.sort(hr));Tr.__r=0}function Ir(e,t,n,r,o,a,i,s,l,c,u){var d,p,f,g,m,b=r&&r.__k||vr,h=t.length;for(n.__d=l,Nr(n,t,b),l=n.__d,d=0;d0?Er(o.type,o.props,o.key,o.ref?o.ref:null,o.__v):o)?(o.__=e,o.__b=e.__b+1,s=Rr(o,n,i=r+d,u),o.__i=s,a=null,-1!==s&&(u--,(a=n[s])&&(a.__u|=131072)),null==a||null===a.__v?(-1==s&&d--,"function"!=typeof o.type&&(o.__u|=65536)):s!==i&&(s===i+1?d++:s>i?u>l-i?d+=s-i:d--:d=s(null!=l&&0==(131072&l.__u)?1:0))for(;i>=0||s=0){if((l=t[i])&&0==(131072&l.__u)&&o==l.key&&a===l.type)return i;i--}if(s0&&void 0!==arguments[0]?arguments[0]:[];return{get:function(){return e},add:function(t){var n=e[e.length-1];(null==n?void 0:n.isHighlighted)===t.isHighlighted?e[e.length-1]={value:n.value+t.value,isHighlighted:n.isHighlighted}:e.push(t)}}}(n?[{value:n,isHighlighted:!1}]:[]);return t.forEach((function(e){var t=e.split(Kr);r.add({value:t[0],isHighlighted:!0}),""!==t[1]&&r.add({value:t[1],isHighlighted:!1})})),r.get()}function Zr(e){return function(e){if(Array.isArray(e))return Xr(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return Xr(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Xr(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Xr(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n",""":'"',"'":"'"},no=new RegExp(/\w/i),ro=/&(amp|quot|lt|gt|#39);/g,oo=RegExp(ro.source);function ao(e,t){var n,r,o,a=e[t],i=(null===(n=e[t+1])||void 0===n?void 0:n.isHighlighted)||!0,s=(null===(r=e[t-1])||void 0===r?void 0:r.isHighlighted)||!0;return no.test((o=a.value)&&oo.test(o)?o.replace(ro,(function(e){return to[e]})):o)||s!==i?a.isHighlighted:s}function io(e){return io="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},io(e)}function so(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function lo(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var Oo={clearButton:"aa-ClearButton",detachedCancelButton:"aa-DetachedCancelButton",detachedContainer:"aa-DetachedContainer",detachedFormContainer:"aa-DetachedFormContainer",detachedOverlay:"aa-DetachedOverlay",detachedSearchButton:"aa-DetachedSearchButton",detachedSearchButtonIcon:"aa-DetachedSearchButtonIcon",detachedSearchButtonPlaceholder:"aa-DetachedSearchButtonPlaceholder",detachedSearchButtonQuery:"aa-DetachedSearchButtonQuery",form:"aa-Form",input:"aa-Input",inputWrapper:"aa-InputWrapper",inputWrapperPrefix:"aa-InputWrapperPrefix",inputWrapperSuffix:"aa-InputWrapperSuffix",item:"aa-Item",label:"aa-Label",list:"aa-List",loadingIndicator:"aa-LoadingIndicator",panel:"aa-Panel",panelLayout:"aa-PanelLayout aa-Panel--scrollable",root:"aa-Autocomplete",source:"aa-Source",sourceFooter:"aa-SourceFooter",sourceHeader:"aa-SourceHeader",sourceNoResults:"aa-SourceNoResults",submitButton:"aa-SubmitButton"},jo=function(e,t){var n=e.children;(0,e.render)(n,t)},Po={createElement:kr,Fragment:Or,render:Wr};function Co(e){var t=e.panelPlacement,n=e.container,r=e.form,o=e.environment,a=n.getBoundingClientRect(),i=(o.pageYOffset||o.document.documentElement.scrollTop||o.document.body.scrollTop||0)+a.top+a.height;switch(t){case"start":return{top:i,left:a.left};case"end":return{top:i,right:o.document.documentElement.clientWidth-(a.left+a.width)};case"full-width":return{top:i,left:0,right:0,width:"unset",maxWidth:"unset"};case"input-wrapper-width":var s=r.getBoundingClientRect();return{top:i,left:s.left,right:o.document.documentElement.clientWidth-(s.left+s.width),width:"unset",maxWidth:"unset"};default:throw new Error("[Autocomplete] The `panelPlacement` value ".concat(JSON.stringify(t)," is not valid."))}}function Ao(e){return Ao="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Ao(e)}function To(){return To=Object.assign?Object.assign.bind():function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function Yo(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Zo(e){for(var t=1;t0;if(!p.value.core.openOnFocus&&!t.query)return n;var r=Boolean(c.current||p.value.renderer.renderNoResults);return!n&&r||n},__autocomplete_metadata:{userAgents:Ro,options:e}}))})),m=ve(Zo({collections:[],completion:null,context:{},isOpen:!1,query:"",activeItemId:null,status:"idle"},p.value.core.initialState)),b={getEnvironmentProps:p.value.renderer.getEnvironmentProps,getFormProps:p.value.renderer.getFormProps,getInputProps:p.value.renderer.getInputProps,getItemProps:p.value.renderer.getItemProps,getLabelProps:p.value.renderer.getLabelProps,getListProps:p.value.renderer.getListProps,getPanelProps:p.value.renderer.getPanelProps,getRootProps:p.value.renderer.getRootProps},h={setActiveItemId:g.value.setActiveItemId,setQuery:g.value.setQuery,setCollections:g.value.setCollections,setIsOpen:g.value.setIsOpen,setStatus:g.value.setStatus,setContext:g.value.setContext,refresh:g.value.refresh,navigator:g.value.navigator},y=s((function(){return Mn.bind(p.value.renderer.renderer.createElement)})),v=s((function(){return function(e){var t=e.autocomplete,n=e.autocompleteScopeApi,r=e.classNames,o=e.environment,a=e.isDetached,i=e.placeholder,s=void 0===i?"Search":i,l=e.propGetters,c=e.setIsModalOpen,u=e.state,d=e.translations,p=Jn(o),f=l.getRootProps(cr({state:u,props:t.getRootProps({})},n)),g=p("div",cr({class:r.root},f)),m=p("div",{class:r.detachedContainer,onMouseDown:function(e){e.stopPropagation()}}),b=p("div",{class:r.detachedOverlay,children:[m],onMouseDown:function(){c(!1),t.setIsOpen(!1)}}),h=l.getLabelProps(cr({state:u,props:t.getLabelProps({})},n)),y=p("button",{class:r.submitButton,type:"submit",title:d.submitButtonTitle,children:[zn({environment:o})]}),v=p("label",cr({class:r.label,children:[y]},h)),_=p("button",{class:r.clearButton,type:"reset",title:d.clearButtonTitle,children:[Bn({environment:o})]}),w=p("div",{class:r.loadingIndicator,children:[$n({environment:o})]}),x=ir({class:r.input,environment:o,state:u,getInputProps:l.getInputProps,getInputPropsCore:t.getInputProps,autocompleteScopeApi:n,isDetached:a}),S=p("div",{class:r.inputWrapperPrefix,children:[v,w]}),k=p("div",{class:r.inputWrapperSuffix,children:[_]}),E=p("div",{class:r.inputWrapper,children:[x]}),O=l.getFormProps(cr({state:u,props:t.getFormProps({inputElement:x})},n)),j=p("form",cr({class:r.form,children:[S,E,k]},O)),P=l.getPanelProps(cr({state:u,props:t.getPanelProps({})},n)),C=p("div",cr({class:r.panel},P)),A=p("div",{class:r.detachedSearchButtonQuery,textContent:u.query}),T=p("div",{class:r.detachedSearchButtonPlaceholder,hidden:Boolean(u.query),textContent:s});if(a){var I=p("div",{class:r.detachedSearchButtonIcon,children:[zn({environment:o})]}),N=p("button",{type:"button",class:r.detachedSearchButton,onClick:function(){c(!0)},children:[I,T,A]}),L=p("button",{type:"button",class:r.detachedCancelButton,textContent:d.detachedCancelButtonText,onTouchStart:function(e){e.stopPropagation()},onClick:function(){t.setIsOpen(!1),c(!1)}}),R=p("div",{class:r.detachedFormContainer,children:[j,L]});m.appendChild(R),g.appendChild(N)}else g.appendChild(j);return{detachedContainer:m,detachedOverlay:b,detachedSearchButtonQuery:A,detachedSearchButtonPlaceholder:T,inputWrapper:E,input:x,root:g,form:j,label:v,submitButton:y,clearButton:_,loadingIndicator:w,panel:C}}({autocomplete:g.value,autocompleteScopeApi:h,classNames:p.value.renderer.classNames,environment:p.value.core.environment,isDetached:f.value,placeholder:p.value.core.placeholder,propGetters:b,setIsModalOpen:S,state:m.current,translations:p.value.renderer.translations})}));function _(){qn(v.value.panel,{style:f.value?{}:Co({panelPlacement:p.value.renderer.panelPlacement,container:v.value.root,form:v.value.form,environment:p.value.core.environment})})}function w(e){m.current=e;var t={autocomplete:g.value,autocompleteScopeApi:h,classNames:p.value.renderer.classNames,components:p.value.renderer.components,container:p.value.renderer.container,html:y.value,dom:v.value,panelContainer:f.value?v.value.detachedContainer:p.value.renderer.panelContainer,propGetters:b,state:m.current,renderer:p.value.renderer.renderer},n=!at(e)&&!c.current&&p.value.renderer.renderNoResults||p.value.renderer.render;!function(e){var t=e.autocomplete,n=e.autocompleteScopeApi,r=e.dom,o=e.propGetters,a=e.state;Gn(r.root,o.getRootProps(No({state:a,props:t.getRootProps({})},n))),Gn(r.input,o.getInputProps(No({state:a,props:t.getInputProps({inputElement:r.input}),inputElement:r.input},n))),qn(r.label,{hidden:"stalled"===a.status}),qn(r.loadingIndicator,{hidden:"stalled"!==a.status}),qn(r.clearButton,{hidden:!a.query}),qn(r.detachedSearchButtonQuery,{textContent:a.query}),qn(r.detachedSearchButtonPlaceholder,{hidden:Boolean(a.query)})}(t),function(e,t){var n=t.autocomplete,r=t.autocompleteScopeApi,o=t.classNames,a=t.html,i=t.dom,s=t.panelContainer,l=t.propGetters,c=t.state,u=t.components,d=t.renderer;if(c.isOpen){s.contains(i.panel)||"loading"===c.status||s.appendChild(i.panel),i.panel.classList.toggle("aa-Panel--stalled","stalled"===c.status);var p=c.collections.filter((function(e){var t=e.source,n=e.items;return t.templates.noResults||n.length>0})).map((function(e,t){var i=e.source,s=e.items;return d.createElement("section",{key:t,className:o.source,"data-autocomplete-source-id":i.sourceId},i.templates.header&&d.createElement("div",{className:o.sourceHeader},i.templates.header({components:u,createElement:d.createElement,Fragment:d.Fragment,items:s,source:i,state:c,html:a})),i.templates.noResults&&0===s.length?d.createElement("div",{className:o.sourceNoResults},i.templates.noResults({components:u,createElement:d.createElement,Fragment:d.Fragment,source:i,state:c,html:a})):d.createElement("ul",To({className:o.list},l.getListProps(No({state:c,props:n.getListProps({source:i})},r))),s.map((function(e){var t=n.getItemProps({item:e,source:i});return d.createElement("li",To({key:t.id,className:o.item},l.getItemProps(No({state:c,props:t},r))),i.templates.item({components:u,createElement:d.createElement,Fragment:d.Fragment,item:e,state:c,html:a}))}))),i.templates.footer&&d.createElement("div",{className:o.sourceFooter},i.templates.footer({components:u,createElement:d.createElement,Fragment:d.Fragment,items:s,source:i,state:c,html:a})))})),f=d.createElement(d.Fragment,null,d.createElement("div",{className:o.panelLayout},p),d.createElement("div",{className:"aa-GradientBottom"})),g=p.reduce((function(e,t){return e[t.props["data-autocomplete-source-id"]]=t,e}),{});e(No(No({children:f,state:c,sections:p,elements:g},d),{},{components:u,html:a},r),i.panel)}else s.contains(i.panel)&&s.removeChild(i.panel)}(n,t)}function x(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};o();var t,n,r=p.value.renderer,i=r.components,s=Ko(r,qo);u.current=Bo(s,p.value.core,{components:(t=i,n=function(e){return!e.value.hasOwnProperty("__autocomplete_componentName")},Object.entries(t).reduce((function(e,t){var r=Qo(t,2),o=r[0],a=r[1];return n({key:o,value:a})?Ho(Ho({},e),{},Vo({},o,a)):e}),{})),initialState:m.current},e),l(),a(),g.value.refresh().then((function(){w(m.current)}))}function S(e){requestAnimationFrame((function(){var t=p.value.core.environment.document.body.contains(v.value.detachedOverlay);e!==t&&(e?(p.value.core.environment.document.body.appendChild(v.value.detachedOverlay),p.value.core.environment.document.body.classList.add("aa-Detached"),v.value.input.focus()):(p.value.core.environment.document.body.removeChild(v.value.detachedOverlay),p.value.core.environment.document.body.classList.remove("aa-Detached")))}))}return r((function(){var e=g.value.getEnvironmentProps({formElement:v.value.form,panelElement:v.value.panel,inputElement:v.value.input});return qn(p.value.core.environment,e),function(){qn(p.value.core.environment,Object.keys(e).reduce((function(e,t){return Zo(Zo({},e),{},Xo({},t,void 0))}),{}))}})),r((function(){var e=f.value?p.value.core.environment.document.body:p.value.renderer.panelContainer,t=f.value?v.value.detachedOverlay:v.value.panel;return f.value&&m.current.isOpen&&S(!0),w(m.current),function(){e.contains(t)&&e.removeChild(t)}})),r((function(){var e=p.value.renderer.container;return e.appendChild(v.value.root),function(){e.removeChild(v.value.root)}})),r((function(){var e=ye((function(e){w(e.state)}),0);return d.current=function(t){var n=t.state,r=t.prevState;(f.value&&r.isOpen!==n.isOpen&&S(n.isOpen),f.value||!n.isOpen||r.isOpen||_(),n.query!==r.query)&&p.value.core.environment.document.querySelectorAll(".aa-Panel--scrollable").forEach((function(e){0!==e.scrollTop&&(e.scrollTop=0)}));e({state:n})},function(){d.current=void 0}})),r((function(){var e=ye((function(){var e=f.value;f.value=p.value.core.environment.matchMedia(p.value.renderer.detachedMediaQuery).matches,e!==f.value?x({}):requestAnimationFrame(_)}),20);return p.value.core.environment.addEventListener("resize",e),function(){p.value.core.environment.removeEventListener("resize",e)}})),r((function(){if(!f.value)return function(){};function e(e){v.value.detachedContainer.classList.toggle("aa-DetachedContainer--modal",e)}function t(t){e(t.matches)}var n=p.value.core.environment.matchMedia(getComputedStyle(p.value.core.environment.document.documentElement).getPropertyValue("--aa-detached-modal-media-query"));e(n.matches);var r=Boolean(n.addEventListener);return r?n.addEventListener("change",t):n.addListener(t),function(){r?n.removeEventListener("change",t):n.removeListener(t)}})),r((function(){return requestAnimationFrame(_),function(){}})),Zo(Zo({},h),{},{update:x,destroy:function(){o()}})}var ea=n(8485);const ta=n(8519),na=ta;var ra=n(1176),oa=n.n(ra);function aa(){const e=(0,s.zy)(),t=(0,s.W6)(),{siteConfig:{baseUrl:n}}=(0,le.A)(),[o,a]=(0,r.useState)({terms:[],isDocsOrBlog:!1});return(0,r.useEffect)((()=>{if(!e.state?.cmfcmfhighlight||0===e.state.cmfcmfhighlight.terms.length)return;a(e.state.cmfcmfhighlight);const{cmfcmfhighlight:n,...r}=e.state;t.replace({...e,state:r})}),[e.state?.cmfcmfhighlight,t,e]),(0,r.useEffect)((()=>{if(0===o.terms.length)return;const e=o.isDocsOrBlog?document.getElementsByTagName("article")[0]:document.getElementsByTagName("main")[0];if(!e)return;const t=new(oa())(e),n={ignoreJoiners:!0};return t.mark(o.terms,n),()=>t.unmark(n)}),[o,n]),null}var ia=n(8807),sa=n(384);function la(e){let{document:t}=e;const[n,r]=t.sectionRoute.split("#");let o=n;return r&&(o+="#"+r),o}const ca={documents:[],index:na((function(){this.ref("id"),this.field("title"),this.field("content")}))};const ua=()=>{const e=(0,z.A)(),[t,o]=(0,r.useState)((()=>!!e&&"dark"===document.documentElement.getAttribute("data-theme")));(0,r.useEffect)((()=>{const e=new MutationObserver((()=>{o("dark"===document.documentElement.getAttribute("data-theme"))}));return e.observe(document.documentElement,{attributes:!0,attributeFilter:["data-theme"]}),()=>e.disconnect()}),[]);const{siteConfig:{baseUrl:a}}=(0,le.A)(),{titleBoost:i,contentBoost:c,tagsBoost:u,parentCategoriesBoost:d,indexDocSidebarParentCategories:p,maxSearchResults:f}=(0,ia.P_)("@cmfcmf/docusaurus-search-local"),g=(0,s.W6)(),{tags:m}=function(){const{i18n:e}=(0,le.A)(),t=n(2500).vF(),r=[sa.C,...t];return{locale:e.currentLocale,tags:r}}(),b=(0,r.useRef)(m);(0,r.useEffect)((()=>{b.current=m}),[m]);const h=(0,r.useRef)({}),y=async e=>{const t=h.current[e];switch(t?.state){case"ready":return t;case void 0:{const t=[];h.current[e]={state:"loading",callbacks:t};const n=await async function(e,t){{let r;try{const n=await fetch(`${e}search-index-${t}.json`);if(!n.ok)return ca;r=await n.json()}catch(n){return ca}return{documents:r.documents,index:na.Index.load(r.index)}}}(a,e);return t.forEach((e=>e(n))),h.current[e]={state:"ready",...n}}case"loading":return new Promise((e=>{t.callbacks.push(e)}))}},v=(0,l.T)({message:"cmfcmf/d-s-l.searchBar.placeholder",description:"Placeholder shown in the searchbar"}),_=(0,r.useRef)(null),w=(0,r.useRef)(null);return(0,r.useEffect)((()=>{if(_.current)return w.current=Jo({container:_.current,placeholder:v,renderer:{createElement:r.createElement,Fragment:r.Fragment,render:he.render},navigator:{navigate(e){let{item:t,itemUrl:n}=e;g.push(n,{cmfcmfhighlight:{terms:t.terms,isDocsOrBlog:"docs"===t.document.type||"blog"===t.document.type}})}},detachedMediaQuery:"",defaultActiveItemId:0,translations:{clearButtonTitle:(0,l.T)({message:"cmfcmf/d-s-l.searchBar.clearButtonTitle",description:"Title of the button to clear the current search input"}),detachedCancelButtonText:(0,l.T)({message:"cmfcmf/d-s-l.searchBar.detachedCancelButtonText",description:"Text of the button to close the detached search window"}),submitButtonTitle:(0,l.T)({message:"cmfcmf/d-s-l.searchBar.submitButtonTitle",description:"Title of the button to submit a new search"})},getSources(e){let{query:t}=e;return[{sourceId:"search-results",templates:{item(e){let{item:t}=e;const n=la(t);return r.createElement("a",{href:n,className:"aa-ItemLink",onClick:e=>{e.preventDefault(),g.push(n,{cmfcmfhighlight:{terms:t.terms,isDocsOrBlog:"docs"===t.document.type||"blog"===t.document.type}})}},r.createElement("div",{className:"aa-ItemContent"},r.createElement("div",{className:"aa-ItemContentBody"},r.createElement("div",{className:"aa-ItemContentTitle"},t.document.sectionTitle),t.document.pageTitle!==t.document.sectionTitle&&r.createElement("div",{className:"aa-ItemContentDescription"},t.document.pageTitle))),r.createElement("div",{className:"aa-ItemActions"},r.createElement("button",{className:"aa-ItemActionButton aa-DesktopOnly aa-ActiveOnly",type:"button",title:"Select"},r.createElement("svg",{viewBox:"0 0 24 24",width:"20",height:"20",fill:"currentColor"},r.createElement("path",{d:"M18.984 6.984h2.016v6h-15.188l3.609 3.609-1.406 1.406-6-6 6-6 1.406 1.406-3.609 3.609h13.172v-4.031z"})))))},noResults:()=>r.createElement("div",{className:"aa-ItemContent"},r.createElement("div",{className:"aa-ItemContentBody"},(0,l.T)({message:"cmfcmf/d-s-l.searchBar.noResults",description:"message shown if no results are found"})))},getItemUrl(e){let{item:t}=e;return la(t)},async getItems(){const e=b.current,n=await Promise.all(e.map((e=>y(e)))),r=(e=>ta.tokenizer(e).map((e=>e.str)))(t);return n.flatMap((e=>{let{index:t,documents:n}=e;return t.query((e=>{e.term(r,{fields:["title"],boost:i}),e.term(r,{fields:["title"],boost:i,wildcard:na.Query.wildcard.TRAILING}),e.term(r,{fields:["content"],boost:c}),e.term(r,{fields:["content"],boost:c,wildcard:na.Query.wildcard.TRAILING}),e.term(r,{fields:["tags"],boost:u}),e.term(r,{fields:["tags"],boost:u,wildcard:na.Query.wildcard.TRAILING}),p&&(e.term(r,{fields:["sidebarParentCategories"],boost:d}),e.term(r,{fields:["sidebarParentCategories"],boost:d,wildcard:na.Query.wildcard.TRAILING}))})).slice(0,f).map((e=>({document:n.find((t=>t.id.toString()===e.ref)),score:e.score,terms:r})))})).sort(((e,t)=>t.score-e.score)).slice(0,f)}}]}}),()=>w.current?.destroy()}),[f]),r.createElement(r.Fragment,null,r.createElement(ea.A,null,r.createElement("body",{"data-theme":t?"dark":"light"})),r.createElement(aa,null),r.createElement("div",{className:"dsla-search-wrapper"},r.createElement("div",{className:"dsla-search-field",ref:_,"data-tags":m.join(",")})))},da={navbarSearchContainer:"navbarSearchContainer_DVXZ"};function pa(e){let{children:t,className:n}=e;return(0,u.jsx)("div",{className:(0,o.A)(n,da.navbarSearchContainer),children:t})}var fa=n(2500),ga=n(6404);var ma=n(3926);function ba(e,t){return t.alternateDocVersions[e.name]??function(e){return e.docs.find((t=>t.id===e.mainDocId))}(e)}const ha={default:ae,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,queryString:o="",...a}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,le.A)(),p=(0,ge.o)(),{search:f,hash:g}=(0,s.zy)(),m=[...n,...c.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${g}${o}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...r],b=t?(0,l.T)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return(0,u.jsx)(fe,{...a,mobile:t,label:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(me,{className:be}),b]}),items:m})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,u.jsx)(pa,{className:n,children:(0,u.jsx)(ua,{})})},dropdown:fe,html:function(e){let{value:t,className:n,mobile:r=!1,isDropdownItem:a=!1}=e;const i=a?"li":"div";return(0,u.jsx)(i,{className:(0,o.A)({navbar__item:!r&&!a,"menu__list-item":r},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,fa.zK)(r),i=(0,ga.QB)(t,r),s=a?.path===i?.path;return null===i||i.unlisted&&!s?null:(0,u.jsx)(ae,{exact:!0,...o,isActive:()=>s||!!a?.sidebar&&a.sidebar===i.sidebar,label:n??i.id,to:i.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,fa.zK)(r),i=(0,ga.fW)(t,r).link;if(!i)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return(0,u.jsx)(ae,{exact:!0,...o,isActive:()=>a?.sidebar===t,label:n??i.label,to:i.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...o}=e;const a=(0,ga.Vd)(r)[0],i=t??a.label,s=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(a).path;return(0,u.jsx)(ae,{...o,label:i,to:s})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:o,dropdownItemsAfter:a,...i}=e;const{search:c,hash:d}=(0,s.zy)(),p=(0,fa.zK)(n),f=(0,fa.jh)(n),{savePreferredVersionName:g}=(0,ma.g1)(n),m=[...o,...f.map((function(e){const t=ba(e,p);return{label:e.label,to:`${t.path}${c}${d}`,isActive:()=>e===p.activeVersion,onClick:()=>g(e.name)}})),...a],b=(0,ga.Vd)(n)[0],h=t&&m.length>1?(0,l.T)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):b.label,y=t&&m.length>1?void 0:ba(b,p).path;return m.length<=1?(0,u.jsx)(ae,{...i,mobile:t,label:h,to:y,isActive:r?()=>!1:void 0}):(0,u.jsx)(fe,{...i,mobile:t,label:h,to:y,items:m,isActive:r?()=>!1:void 0})}},ya=ha;function va(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=ya[r];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,u.jsx)(o,{...n})}function _a(){const e=(0,C.M)(),t=(0,_.p)().navbar.items;return(0,u.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(va,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function wa(e){return(0,u.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,u.jsx)(l.A,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)",children:"\u2190 Back to main menu"})})}function xa(){const e=0===(0,_.p)().navbar.items.length,t=D();return(0,u.jsxs)(u.Fragment,{children:[!e&&(0,u.jsx)(wa,{onClick:()=>t.hide()}),t.content]})}function Sa(){const e=(0,C.M)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?(0,u.jsx)(F,{header:(0,u.jsx)(Y,{}),primaryMenu:(0,u.jsx)(_a,{}),secondaryMenu:(0,u.jsx)(xa,{})}):null}const ka={navbarHideable:"navbarHideable_nilm",navbarHidden:"navbarHidden_SFGu"};function Ea(e){return(0,u.jsx)("div",{role:"presentation",...e,className:(0,o.A)("navbar-sidebar__backdrop",e.className)})}function Oa(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:a}}=(0,_.p)(),i=(0,C.M)(),{navbarRef:s,isNavbarVisible:d}=function(e){const[t,n]=(0,r.useState)(e),o=(0,r.useRef)(!1),a=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(a.current=e.getBoundingClientRect().height)}),[]);return(0,A.Mq)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=s?n(!1):i+c{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return o.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return(0,u.jsxs)("nav",{ref:s,"aria-label":(0,l.T)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,o.A)("navbar","navbar--fixed-top",n&&[ka.navbarHideable,!d&&ka.navbarHidden],{"navbar--dark":"dark"===a,"navbar--primary":"primary"===a,"navbar-sidebar--show":i.shown}),children:[t,(0,u.jsx)(Ea,{onClick:i.toggle}),(0,u.jsx)(Sa,{})]})}var ja=n(3803);const Pa={errorBoundaryError:"errorBoundaryError_qjV5",errorBoundaryFallback:"errorBoundaryFallback_haja"};function Ca(e){return(0,u.jsx)("button",{type:"button",...e,children:(0,u.jsx)(l.A,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error",children:"Try again"})})}function Aa(e){let{error:t}=e;const n=(0,ja.rA)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,u.jsx)("p",{className:Pa.errorBoundaryError,children:n})}class Ta extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const Ia="right";function Na(e){let{width:t=30,height:n=30,className:r,...o}=e;return(0,u.jsx)("svg",{className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...o,children:(0,u.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function La(){const{toggle:e,shown:t}=(0,C.M)();return(0,u.jsx)("button",{onClick:e,"aria-label":(0,l.T)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button",children:(0,u.jsx)(Na,{})})}const Ra={colorModeToggle:"colorModeToggle_k_5j"};function Da(e){let{items:t}=e;return(0,u.jsx)(u.Fragment,{children:t.map(((e,t)=>(0,u.jsx)(Ta,{onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t}),children:(0,u.jsx)(va,{...e})},t)))})}function Fa(e){let{left:t,right:n}=e;return(0,u.jsxs)("div",{className:"navbar__inner",children:[(0,u.jsx)("div",{className:"navbar__items",children:t}),(0,u.jsx)("div",{className:"navbar__items navbar__items--right",children:n})]})}function Ma(){const e=(0,C.M)(),t=(0,_.p)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??Ia)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return(0,u.jsx)(Fa,{left:(0,u.jsxs)(u.Fragment,{children:[!e.disabled&&(0,u.jsx)(La,{}),(0,u.jsx)(G,{}),(0,u.jsx)(Da,{items:n})]}),right:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(Da,{items:r}),(0,u.jsx)(W,{className:Ra.colorModeToggle}),!o&&(0,u.jsx)(pa,{children:(0,u.jsx)(ua,{})})]})})}function za(){return(0,u.jsx)(Oa,{children:(0,u.jsx)(Ma,{})})}function Ba(e){let{item:t}=e;const{to:n,href:r,label:o,prependBaseUrlToHref:a,...i}=t,s=(0,X.Ay)(n),l=(0,X.Ay)(r,{forcePrependBaseUrl:!0});return(0,u.jsxs)(Z.A,{className:"footer__link-item",...r?{href:a?l:r}:{to:s},...i,children:[o,r&&!(0,J.A)(r)&&(0,u.jsx)(te.A,{})]})}function $a(e){let{item:t}=e;return t.html?(0,u.jsx)("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)("li",{className:"footer__item",children:(0,u.jsx)(Ba,{item:t})},t.href??t.to)}function Ua(e){let{column:t}=e;return(0,u.jsxs)("div",{className:"col footer__col",children:[(0,u.jsx)("div",{className:"footer__title",children:t.title}),(0,u.jsx)("ul",{className:"footer__items clean-list",children:t.items.map(((e,t)=>(0,u.jsx)($a,{item:e},t)))})]})}function Ha(e){let{columns:t}=e;return(0,u.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,u.jsx)(Ua,{column:e},t)))})}function Va(){return(0,u.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function Qa(e){let{item:t}=e;return t.html?(0,u.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)(Ba,{item:t})}function Wa(e){let{links:t}=e;return(0,u.jsx)("div",{className:"footer__links text--center",children:(0,u.jsx)("div",{className:"footer__links",children:t.map(((e,n)=>(0,u.jsxs)(r.Fragment,{children:[(0,u.jsx)(Qa,{item:e}),t.length!==n+1&&(0,u.jsx)(Va,{})]},n)))})})}function qa(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,u.jsx)(Ha,{columns:t}):(0,u.jsx)(Wa,{links:t})}var Ga=n(4979);const Ka={footerLogoLink:"footerLogoLink_vHdL"};function Ya(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.hH)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,u.jsx)(Ga.A,{className:(0,o.A)("footer__logo",t.className),alt:t.alt,sources:r,width:t.width,height:t.height,style:t.style})}function Za(e){let{logo:t}=e;return t.href?(0,u.jsx)(Z.A,{href:t.href,className:Ka.footerLogoLink,target:t.target,children:(0,u.jsx)(Ya,{logo:t})}):(0,u.jsx)(Ya,{logo:t})}function Xa(e){let{copyright:t}=e;return(0,u.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function Ja(e){let{style:t,links:n,logo:r,copyright:a}=e;return(0,u.jsx)("footer",{className:(0,o.A)("footer",{"footer--dark":"dark"===t}),children:(0,u.jsxs)("div",{className:"container container-fluid",children:[n,(r||a)&&(0,u.jsxs)("div",{className:"footer__bottom text--center",children:[r&&(0,u.jsx)("div",{className:"margin-bottom--sm",children:r}),a]})]})})}function ei(){const{footer:e}=(0,_.p)();if(!e)return null;const{copyright:t,links:n,logo:r,style:o}=e;return(0,u.jsx)(Ja,{style:o,links:n&&n.length>0&&(0,u.jsx)(qa,{links:n}),logo:r&&(0,u.jsx)(Za,{logo:r}),copyright:t&&(0,u.jsx)(Xa,{copyright:t})})}const ti=r.memo(ei),ni=(0,T.fM)([M.a,w.o,A.Tv,ma.VQ,i.Jx,function(e){let{children:t}=e;return(0,u.jsx)(I.y_,{children:(0,u.jsx)(C.e,{children:(0,u.jsx)(L,{children:t})})})}]);function ri(e){let{children:t}=e;return(0,u.jsx)(ni,{children:t})}var oi=n(801);function ai(e){let{error:t,tryAgain:n}=e;return(0,u.jsx)("main",{className:"container margin-vert--xl",children:(0,u.jsx)("div",{className:"row",children:(0,u.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,u.jsx)(oi.A,{as:"h1",className:"hero__title",children:(0,u.jsx)(l.A,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,u.jsx)("div",{className:"margin-vert--lg",children:(0,u.jsx)(Ca,{onClick:n,className:"button button--primary shadow--lw"})}),(0,u.jsx)("hr",{}),(0,u.jsx)("div",{className:"margin-vert--md",children:(0,u.jsx)(Aa,{error:t})})]})})})}const ii={mainWrapper:"mainWrapper_mkn2"};function si(e){const{children:t,noFooter:n,wrapperClassName:r,title:s,description:l}=e;return(0,h.J)(),(0,u.jsxs)(ri,{children:[(0,u.jsx)(i.be,{title:s,description:l}),(0,u.jsx)(v,{}),(0,u.jsx)(P,{}),(0,u.jsx)(za,{}),(0,u.jsx)("div",{id:d,className:(0,o.A)(b.G.wrapper.main,ii.mainWrapper,r),children:(0,u.jsx)(a.A,{fallback:e=>(0,u.jsx)(ai,{...e}),children:t})}),!n&&(0,u.jsx)(ti,{})]})}},5304:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(758);var r=n(4895),o=n(404),a=n(9431),i=n(527),s=n(4979),l=n(6070);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const a={light:(0,o.Ay)(t.src),dark:(0,o.Ay)(t.srcDark||t.src)},i=(0,l.jsx)(s.A,{className:t.className,sources:a,height:t.height,width:t.width,alt:n,style:t.style});return r?(0,l.jsx)("div",{className:r,children:i}):i}function u(e){const{siteConfig:{title:t}}=(0,a.A)(),{navbar:{title:n,logo:s}}=(0,i.p)(),{imageClassName:u,titleClassName:d,...p}=e,f=(0,o.Ay)(s?.href||"/"),g=n?"":t,m=s?.alt??g;return(0,l.jsxs)(r.A,{to:f,...p,...s?.target&&{target:s.target},children:[s&&(0,l.jsx)(c,{logo:s,alt:m,imageClassName:u}),null!=n&&(0,l.jsx)("b",{className:d,children:n})]})}},4286:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(758);var r=n(8485),o=n(6070);function a(e){let{locale:t,version:n,tag:a}=e;const i=t;return(0,o.jsxs)(r.A,{children:[t&&(0,o.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,o.jsx)("meta",{name:"docusaurus_version",content:n}),a&&(0,o.jsx)("meta",{name:"docusaurus_tag",content:a}),i&&(0,o.jsx)("meta",{name:"docsearch:language",content:i}),n&&(0,o.jsx)("meta",{name:"docsearch:version",content:n}),a&&(0,o.jsx)("meta",{name:"docsearch:docusaurus_tag",content:a})]})}},4979:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});var r=n(758),o=n(3526),a=n(8230),i=n(6336);const s={themedComponent:"themedComponent_m9Mb","themedComponent--light":"themedComponent--light_Zs9Q","themedComponent--dark":"themedComponent--dark_tSuS"};var l=n(6070);function c(e){let{className:t,children:n}=e;const c=(0,a.A)(),{colorMode:u}=(0,i.G)();return(0,l.jsx)(l.Fragment,{children:(c?"dark"===u?["dark"]:["light"]:["light","dark"]).map((e=>{const a=n({theme:e,className:(0,o.A)(t,s.themedComponent,s[`themedComponent--${e}`])});return(0,l.jsx)(r.Fragment,{children:a},e)}))})}function u(e){const{sources:t,className:n,alt:r,...o}=e;return(0,l.jsx)(c,{className:n,children:e=>{let{theme:n,className:a}=e;return(0,l.jsx)("img",{src:t[n],alt:r,className:a,...o})}})}},6635:(e,t,n)=>{"use strict";n.d(t,{N:()=>h,u:()=>c});var r=n(758),o=n(8800),a=n(7886),i=n(2128),s=n(6070);const l="ease-in-out";function c(e){let{initialState:t}=e;const[n,o]=(0,r.useState)(t??!1),a=(0,r.useCallback)((()=>{o((e=>!e))}),[]);return{collapsed:n,setCollapsed:o,toggleCollapsed:a}}const u={display:"none",overflow:"hidden",height:"0px"},d={display:"block",overflow:"visible",height:"auto"};function p(e,t){const n=t?u:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function f(e){let{collapsibleRef:t,collapsed:n,animation:o}=e;const a=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=o?.duration??function(e){if((0,i.O)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${o?.easing??l}`,height:`${t}px`}}function s(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!a.current)return p(e,n),void(a.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(s(),requestAnimationFrame((()=>{e.style.height=u.height,e.style.overflow=u.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{s()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,o])}function g(e){if(!o.A.canUseDOM)return e?u:d}function m(e){let{as:t="div",collapsed:n,children:o,animation:a,onCollapseTransitionEnd:i,className:l,disableSSRStyle:c}=e;const u=(0,r.useRef)(null);return f({collapsibleRef:u,collapsed:n,animation:a}),(0,s.jsx)(t,{ref:u,style:c?void 0:g(n),onTransitionEnd:e=>{"height"===e.propertyName&&(p(u.current,n),i?.(n))},className:l,children:o})}function b(e){let{collapsed:t,...n}=e;const[o,i]=(0,r.useState)(!t),[l,c]=(0,r.useState)(t);return(0,a.A)((()=>{t||i(!0)}),[t]),(0,a.A)((()=>{o&&c(t)}),[o,t]),o?(0,s.jsx)(m,{...n,collapsed:l}):null}function h(e){let{lazy:t,...n}=e;const r=t?b:m;return(0,s.jsx)(r,{...n})}},6328:(e,t,n)=>{"use strict";n.d(t,{M:()=>m,o:()=>g});var r=n(758),o=n(8230),a=n(7194),i=n(5629),s=n(527),l=n(6070);const c=(0,a.Wf)("docusaurus.announcement.dismiss"),u=(0,a.Wf)("docusaurus.announcement.id"),d=()=>"true"===c.get(),p=e=>c.set(String(e)),f=r.createContext(null);function g(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,s.p)(),t=(0,o.A)(),[n,a]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{a(d())}),[]);const i=(0,r.useCallback)((()=>{p(!0),a(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&p(!1),!r&&d()||a(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return(0,l.jsx)(f.Provider,{value:n,children:t})}function m(){const e=(0,r.useContext)(f);if(!e)throw new i.dV("AnnouncementBarProvider");return e}},6336:(e,t,n)=>{"use strict";n.d(t,{G:()=>h,a:()=>b});var r=n(758),o=n(8800),a=n(5629),i=n(7194),s=n(527),l=n(6070);const c=r.createContext(void 0),u="theme",d=(0,i.Wf)(u),p={light:"light",dark:"dark"},f=e=>e===p.dark?p.dark:p.light,g=e=>o.A.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),m=e=>{d.set(f(e))};function b(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,s.p)(),[o,a]=(0,r.useState)(g(e));(0,r.useEffect)((()=>{t&&d.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:o=!0}=r;t?(a(t),o&&m(t)):(a(n?window.matchMedia("(prefers-color-scheme: dark)").matches?p.dark:p.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(o))}),[o]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=d.get();null!==t&&i(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const l=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||l.current?l.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:o,setColorMode:i,get isDarkTheme(){return o===p.dark},setLightTheme(){i(p.light)},setDarkTheme(){i(p.dark)}})),[o,i])}();return(0,l.jsx)(c.Provider,{value:n,children:t})}function h(){const e=(0,r.useContext)(c);if(null==e)throw new a.dV("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},8955:(e,t,n)=>{"use strict";n.d(t,{e:()=>f,M:()=>g});var r=n(758),o=n(293),a=n(7822),i=n(5557),s=n(5629);function l(e){!function(e){const t=(0,i.W6)(),n=(0,s._q)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}var c=n(527),u=n(6070);const d=r.createContext(void 0);function p(){const e=function(){const e=(0,o.YL)(),{items:t}=(0,c.p)().navbar;return 0===t.length&&!e.component}(),t=(0,a.l)(),n=!e&&"mobile"===t,[i,s]=(0,r.useState)(!1);l((()=>{if(i)return s(!1),!1}));const u=(0,r.useCallback)((()=>{s((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&s(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:i})),[e,n,u,i])}function f(e){let{children:t}=e;const n=p();return(0,u.jsx)(d.Provider,{value:n,children:t})}function g(){const e=r.useContext(d);if(void 0===e)throw new s.dV("NavbarMobileSidebarProvider");return e}},293:(e,t,n)=>{"use strict";n.d(t,{GX:()=>c,YL:()=>l,y_:()=>s});var r=n(758),o=n(5629),a=n(6070);const i=r.createContext(null);function s(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,a.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(!e)throw new o.dV("NavbarSecondaryMenuContentProvider");return e[0]}function c(e){let{component:t,props:n}=e;const a=(0,r.useContext)(i);if(!a)throw new o.dV("NavbarSecondaryMenuContentProvider");const[,s]=a,l=(0,o.Be)(n);return(0,r.useEffect)((()=>{s({component:t,props:l})}),[s,t,l]),(0,r.useEffect)((()=>()=>s({component:null,props:null})),[s]),null}},785:(e,t,n)=>{"use strict";n.d(t,{w:()=>o,J:()=>a});var r=n(758);const o="navigation-with-keyboard";function a(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(o),"mousedown"===e.type&&document.body.classList.remove(o)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(o),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},7822:(e,t,n)=>{"use strict";n.d(t,{l:()=>s});var r=n(758),o=n(8800);const a={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function s(e){let{desktopBreakpoint:t=i}=void 0===e?{}:e;const[n,s]=(0,r.useState)((()=>"ssr"));return(0,r.useEffect)((()=>{function e(){s(function(e){if(!o.A.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>e?a.desktop:a.mobile}(t))}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[t]),n}},152:(e,t,n)=>{"use strict";n.d(t,{G:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",blogAuthorsListPage:"blog-authors-list-page",blogAuthorsPostsPage:"blog-authors-posts-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",unlistedBanner:"theme-unlisted-banner",draftBanner:"theme-draft-banner",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{blogFooterTagsRow:"theme-blog-footer-tags-row",blogFooterEditMetaRow:"theme-blog-footer-edit-meta-row"},pages:{pageFooterEditMetaRow:"theme-pages-footer-edit-meta-row"}}},2128:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{O:()=>r})},665:(e,t,n)=>{"use strict";function r(e){return Array.from(new Set(e))}function o(e,t){const n={};let r=0;for(const o of e){const e=t(o,r);n[e]??=[],n[e].push(o),r+=1}return n}n.d(t,{$z:()=>o,sb:()=>r})},7826:(e,t,n)=>{"use strict";n.d(t,{e3:()=>p,be:()=>u,Jx:()=>f});var r=n(758),o=n(3526),a=n(8485),i=n(4184),s=n(404),l=n(9431);var c=n(6070);function u(e){let{title:t,description:n,keywords:r,image:o,children:i}=e;const u=function(e){const{siteConfig:t}=(0,l.A)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,s.hH)(),p=o?d(o,{absolute:!0}):void 0;return(0,c.jsxs)(a.A,{children:[t&&(0,c.jsx)("title",{children:u}),t&&(0,c.jsx)("meta",{property:"og:title",content:u}),n&&(0,c.jsx)("meta",{name:"description",content:n}),n&&(0,c.jsx)("meta",{property:"og:description",content:n}),r&&(0,c.jsx)("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),p&&(0,c.jsx)("meta",{property:"og:image",content:p}),p&&(0,c.jsx)("meta",{name:"twitter:image",content:p}),i]})}const d=r.createContext(void 0);function p(e){let{className:t,children:n}=e;const i=r.useContext(d),s=(0,o.A)(i,t);return(0,c.jsxs)(d.Provider,{value:s,children:[(0,c.jsx)(a.A,{children:(0,c.jsx)("html",{className:s})}),n]})}function f(e){let{children:t}=e;const n=(0,i.A)(),r=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const a=`plugin-id-${n.plugin.id}`;return(0,c.jsx)(p,{className:(0,o.A)(r,a),children:t})}},5629:(e,t,n)=>{"use strict";n.d(t,{Be:()=>c,ZC:()=>s,_q:()=>i,dV:()=>l,fM:()=>u});var r=n(758),o=n(7886),a=n(6070);function i(e){const t=(0,r.useRef)(e);return(0,o.A)((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function s(e){const t=(0,r.useRef)();return(0,o.A)((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function c(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return(0,a.jsx)(a.Fragment,{children:e.reduceRight(((e,t)=>(0,a.jsx)(t,{children:e})),n)})}}},5210:(e,t,n)=>{"use strict";n.d(t,{Dt:()=>s,ys:()=>i});var r=n(758),o=n(5765),a=n(9431);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function s(){const{baseUrl:e}=(0,a.A)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function o(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(o).flatMap((e=>e.routes??[])))}(n)}({routes:o.A,baseUrl:e})),[e])}},2935:(e,t,n)=>{"use strict";n.d(t,{Mq:()=>p,Tv:()=>c,gk:()=>f});var r=n(758),o=n(8800),a=n(8230),i=(n(7886),n(5629)),s=n(6070);const l=r.createContext(void 0);function c(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return(0,s.jsx)(l.Provider,{value:n,children:t})}function u(){const e=(0,r.useContext)(l);if(null==e)throw new i.dV("ScrollControllerProvider");return e}const d=()=>o.A.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function p(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=u(),o=(0,r.useRef)(d()),a=(0,i._q)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=d();a(e,o.current),o.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[a,n,...t])}function f(){const e=(0,r.useRef)(null),t=(0,a.A)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const o=document.documentElement.scrollTop;(n&&o>e||!n&&ot&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},384:(e,t,n)=>{"use strict";n.d(t,{C:()=>r});const r="default"},7194:(e,t,n)=>{"use strict";n.d(t,{Wf:()=>c});n(758);const r=JSON.parse('{"N":"localStorage","M":""}'),o=r.N;function a(e){let{key:t,oldValue:n,newValue:r,storage:o}=e;if(n===r)return;const a=document.createEvent("StorageEvent");a.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,o),window.dispatchEvent(a)}function i(e){if(void 0===e&&(e=o),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,s||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),s=!0),null}var t}let s=!1;const l={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function c(e,t){const n=`${e}${r.M}`;if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(n);const o=i(t?.persistence);return null===o?l:{get:()=>{try{return o.getItem(n)}catch(e){return console.error(`Docusaurus storage error, can't get key=${n}`,e),null}},set:e=>{try{const t=o.getItem(n);o.setItem(n,e),a({key:n,oldValue:t,newValue:e,storage:o})}catch(t){console.error(`Docusaurus storage error, can't set ${n}=${e}`,t)}},del:()=>{try{const e=o.getItem(n);o.removeItem(n),a({key:n,oldValue:e,newValue:null,storage:o})}catch(e){console.error(`Docusaurus storage error, can't delete key=${n}`,e)}},listen:e=>{try{const t=t=>{t.storageArea===o&&t.key===n&&e(t)};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)}catch(t){return console.error(`Docusaurus storage error, can't listen for changes of key=${n}`,t),()=>{}}}}}},3884:(e,t,n)=>{"use strict";n.d(t,{o:()=>i});var r=n(9431),o=n(5557),a=n(3803);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:s}}=(0,r.A)(),{pathname:l}=(0,o.zy)(),c=(0,a.Ks)(l,{trailingSlash:n,baseUrl:e}),u=s===i?e:e.replace(`/${s}/`,"/"),d=c.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${u}`:`${u}${e}/`}(n)}${d}`}}}},9297:(e,t,n)=>{"use strict";n.d(t,{$:()=>i});var r=n(758),o=n(5557),a=n(5629);function i(e){const t=(0,o.zy)(),n=(0,a.ZC)(t),i=(0,a._q)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},527:(e,t,n)=>{"use strict";n.d(t,{p:()=>o});var r=n(9431);function o(){return(0,r.A)().siteConfig.themeConfig}},2618:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addTrailingSlash=o,t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[i]=e.split(/[#?]/),s="/"===i||i===r?i:(l=i,c=n,c?o(l):a(l));var l,c;return e.replace(i,s)},t.addLeadingSlash=function(e){return(0,r.addPrefix)(e,"/")},t.removeTrailingSlash=a;const r=n(3989);function o(e){return e.endsWith("/")?e:`${e}/`}function a(e){return(0,r.removeSuffix)(e,"/")}},5864:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=function e(t){if(t.cause)return[t,...e(t.cause)];return[t]}},3803:(e,t,n)=>{"use strict";t.rA=t.Ks=t.LU=void 0;const r=n(5482);t.LU="__blog-post-container";var o=n(2618);Object.defineProperty(t,"Ks",{enumerable:!0,get:function(){return r.__importDefault(o).default}});var a=n(3989);var i=n(5864);Object.defineProperty(t,"rA",{enumerable:!0,get:function(){return i.getErrorCausalChain}})},3989:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addPrefix=function(e,t){return e.startsWith(t)?e:`${t}${e}`},t.removeSuffix=function(e,t){if(""===t)return e;return e.endsWith(t)?e.slice(0,-t.length):e},t.addSuffix=function(e,t){return e.endsWith(t)?e:`${e}${t}`},t.removePrefix=function(e,t){return e.startsWith(t)?e.slice(t.length):e}},1877:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>f});var r=n(4784),o=Object.assign||function(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:{},r=window.Promise||function(e){function t(){}e(t,t)},a=function(){for(var e=arguments.length,t=Array(e),n=0;n0&&void 0!==arguments[0]?arguments[0]:{}).target,t=function(){var e={width:document.documentElement.clientWidth,height:document.documentElement.clientHeight,left:0,top:0,right:0,bottom:0},t=void 0,n=void 0;if(h.container)if(h.container instanceof Object)t=(e=o({},e,h.container)).width-e.left-e.right-2*h.margin,n=e.height-e.top-e.bottom-2*h.margin;else{var r=(i(h.container)?h.container:document.querySelector(h.container)).getBoundingClientRect(),a=r.width,l=r.height,c=r.left,u=r.top;e=o({},e,{width:a,height:l,left:c,top:u})}t=t||e.width-2*h.margin,n=n||e.height-2*h.margin;var d=y.zoomedHd||y.original,p=s(d)?t:d.naturalWidth||t,f=s(d)?n:d.naturalHeight||n,g=d.getBoundingClientRect(),m=g.top,b=g.left,v=g.width,_=g.height,w=Math.min(Math.max(v,p),t)/v,x=Math.min(Math.max(_,f),n)/_,S=Math.min(w,x),k="scale("+S+") translate3d("+((t-v)/2-b+h.margin+e.left)/S+"px, "+((n-_)/2-m+h.margin+e.top)/S+"px, 0)";y.zoomed.style.transform=k,y.zoomedHd&&(y.zoomedHd.style.transform=k)};return new r((function(n){if(e&&-1===f.indexOf(e))n(_);else{if(y.zoomed)n(_);else{if(e)y.original=e;else{if(!(f.length>0))return void n(_);var r=f;y.original=r[0]}if(y.original.dispatchEvent(c("medium-zoom:open",{detail:{zoom:_}})),b=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,m=!0,y.zoomed=function(e){var t=e.getBoundingClientRect(),n=t.top,r=t.left,o=t.width,a=t.height,i=e.cloneNode(),s=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,l=window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0;return i.removeAttribute("id"),i.style.position="absolute",i.style.top=n+s+"px",i.style.left=r+l+"px",i.style.width=o+"px",i.style.height=a+"px",i.style.transform="",i}(y.original),document.body.appendChild(v),h.template){var o=i(h.template)?h.template:document.querySelector(h.template);y.template=document.createElement("div"),y.template.appendChild(o.content.cloneNode(!0)),document.body.appendChild(y.template)}if(y.original.parentElement&&"PICTURE"===y.original.parentElement.tagName&&y.original.currentSrc&&(y.zoomed.src=y.original.currentSrc),document.body.appendChild(y.zoomed),window.requestAnimationFrame((function(){document.body.classList.add("medium-zoom--opened")})),y.original.classList.add("medium-zoom-image--hidden"),y.zoomed.classList.add("medium-zoom-image--opened"),y.zoomed.addEventListener("click",d),y.zoomed.addEventListener("transitionend",(function e(){m=!1,y.zoomed.removeEventListener("transitionend",e),y.original.dispatchEvent(c("medium-zoom:opened",{detail:{zoom:_}})),n(_)})),y.original.getAttribute("data-zoom-src")){y.zoomedHd=y.zoomed.cloneNode(),y.zoomedHd.removeAttribute("srcset"),y.zoomedHd.removeAttribute("sizes"),y.zoomedHd.removeAttribute("loading"),y.zoomedHd.src=y.zoomed.getAttribute("data-zoom-src"),y.zoomedHd.onerror=function(){clearInterval(a),console.warn("Unable to reach the zoom image target "+y.zoomedHd.src),y.zoomedHd=null,t()};var a=setInterval((function(){y.zoomedHd.complete&&(clearInterval(a),y.zoomedHd.classList.add("medium-zoom-image--opened"),y.zoomedHd.addEventListener("click",d),document.body.appendChild(y.zoomedHd),t())}),10)}else if(y.original.hasAttribute("srcset")){y.zoomedHd=y.zoomed.cloneNode(),y.zoomedHd.removeAttribute("sizes"),y.zoomedHd.removeAttribute("loading");var s=y.zoomedHd.addEventListener("load",(function(){y.zoomedHd.removeEventListener("load",s),y.zoomedHd.classList.add("medium-zoom-image--opened"),y.zoomedHd.addEventListener("click",d),document.body.appendChild(y.zoomedHd),t()}))}else t()}}}))},d=function(){return new r((function(e){if(!m&&y.original){m=!0,document.body.classList.remove("medium-zoom--opened"),y.zoomed.style.transform="",y.zoomedHd&&(y.zoomedHd.style.transform=""),y.template&&(y.template.style.transition="opacity 150ms",y.template.style.opacity=0),y.original.dispatchEvent(c("medium-zoom:close",{detail:{zoom:_}})),y.zoomed.addEventListener("transitionend",(function t(){y.original.classList.remove("medium-zoom-image--hidden"),document.body.removeChild(y.zoomed),y.zoomedHd&&document.body.removeChild(y.zoomedHd),document.body.removeChild(v),y.zoomed.classList.remove("medium-zoom-image--opened"),y.template&&document.body.removeChild(y.template),m=!1,y.zoomed.removeEventListener("transitionend",t),y.original.dispatchEvent(c("medium-zoom:closed",{detail:{zoom:_}})),y.original=null,y.zoomed=null,y.zoomedHd=null,y.template=null,e(_)}))}else e(_)}))},p=function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}).target;return y.original?d():u({target:e})},f=[],g=[],m=!1,b=0,h=n,y={original:null,zoomed:null,zoomedHd:null,template:null};"[object Object]"===Object.prototype.toString.call(t)?h=t:(t||"string"==typeof t)&&a(t);var v=function(e){var t=document.createElement("div");return t.classList.add("medium-zoom-overlay"),t.style.background=e,t}((h=o({margin:0,background:"#fff",scrollOffset:40,container:null,template:null},h)).background);document.addEventListener("click",(function(e){var t=e.target;t!==v?-1!==f.indexOf(t)&&p({target:t}):d()})),document.addEventListener("keyup",(function(e){var t=e.key||e.keyCode;"Escape"!==t&&"Esc"!==t&&27!==t||d()})),document.addEventListener("scroll",(function(){if(!m&&y.original){var e=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;Math.abs(b-e)>h.scrollOffset&&setTimeout(d,150)}})),window.addEventListener("resize",d);var _={open:u,close:d,toggle:p,update:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e;if(e.background&&(v.style.background=e.background),e.container&&e.container instanceof Object&&(t.container=o({},h.container,e.container)),e.template){var n=i(e.template)?e.template:document.querySelector(e.template);t.template=n}return h=o({},h,t),f.forEach((function(e){e.dispatchEvent(c("medium-zoom:update",{detail:{zoom:_}}))})),_},clone:function(){return e(o({},h,arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}))},attach:a,detach:function(){for(var e=arguments.length,t=Array(e),n=0;n0?t.reduce((function(e,t){return[].concat(e,l(t))}),[]):f;return r.forEach((function(e){e.classList.remove("medium-zoom-image"),e.dispatchEvent(c("medium-zoom:detach",{detail:{zoom:_}}))})),f=f.filter((function(e){return-1===r.indexOf(e)})),_},on:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return f.forEach((function(r){r.addEventListener("medium-zoom:"+e,t,n)})),g.push({type:"medium-zoom:"+e,listener:t,options:n}),_},off:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return f.forEach((function(r){r.removeEventListener("medium-zoom:"+e,t,n)})),g=g.filter((function(n){return!(n.type==="medium-zoom:"+e&&n.listener.toString()===t.toString())})),_},getOptions:function(){return h},getImages:function(){return f},getZoomedImage:function(){return y.original}};return _},{themeConfig:d}=r.default;function p(e){var t,n;return document.querySelector('html[data-theme="dark"]')?(null===(t=e.background)||void 0===t?void 0:t.dark)||"rgb(50, 50, 50)":(null===(n=e.background)||void 0===n?void 0:n.light)||"rgb(255, 255, 255)"}const f=function(){if("undefined"==typeof window)return null;let e;const{zoom:t}=d,{selector:n=".markdown img",config:r={}}=t||{};if(!t)return null;r.background=p(t);var o=new MutationObserver((function(){e&&e.update({background:p(t)})}));const a=document.querySelector("html");return o.observe(a,{attributes:!0,attributeFilter:["data-theme"]}),setTimeout((()=>{e&&e.detach(),e=u(n,r)}),1e3),{onRouteUpdate(){setTimeout((()=>{e&&e.detach(),e=u(n,r)}),1e3)}}}()},3332:(e,t,n)=>{"use strict";n.d(t,{zR:()=>_,TM:()=>O,yJ:()=>f,sC:()=>P,AO:()=>p});var r=n(5890);function o(e){return"/"===e.charAt(0)}function a(e,t){for(var n=t,r=n+1,o=e.length;r=0;p--){var f=i[p];"."===f?a(i,p):".."===f?(a(i,p),d++):d&&(a(i,p),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&o(i[0])||i.unshift("");var g=i.join("/");return n&&"/"!==g.substr(-1)&&(g+="/"),g};var s=n(9923);function l(e){return"/"===e.charAt(0)?e:"/"+e}function c(e){return"/"===e.charAt(0)?e.substr(1):e}function u(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function p(e){var t=e.pathname,n=e.search,r=e.hash,o=t||"/";return n&&"?"!==n&&(o+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(o+="#"===r.charAt(0)?r:"#"+r),o}function f(e,t,n,o){var a;"string"==typeof e?(a=function(e){var t=e||"/",n="",r="",o=t.indexOf("#");-1!==o&&(r=t.substr(o),t=t.substr(0,o));var a=t.indexOf("?");return-1!==a&&(n=t.substr(a),t=t.substr(0,a)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),a.state=t):(void 0===(a=(0,r.A)({},e)).pathname&&(a.pathname=""),a.search?"?"!==a.search.charAt(0)&&(a.search="?"+a.search):a.search="",a.hash?"#"!==a.hash.charAt(0)&&(a.hash="#"+a.hash):a.hash="",void 0!==t&&void 0===a.state&&(a.state=t));try{a.pathname=decodeURI(a.pathname)}catch(s){throw s instanceof URIError?new URIError('Pathname "'+a.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):s}return n&&(a.key=n),o?a.pathname?"/"!==a.pathname.charAt(0)&&(a.pathname=i(a.pathname,o.pathname)):a.pathname=o.pathname:a.pathname||(a.pathname="/"),a}function g(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,o){if(null!=e){var a="function"==typeof e?e(t,n):e;"string"==typeof a?"function"==typeof r?r(a,o):o(!0):o(!1!==a)}else o(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,o):n.push(o),d({action:r,location:o,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",o=f(e,t,m(),_.location);u.confirmTransitionTo(o,r,n,(function(e){e&&(_.entries[_.index]=o,d({action:r,location:o}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=_.index+e;return t>=0&&t<_.entries.length},block:function(e){return void 0===e&&(e=!1),u.setPrompt(e)},listen:function(e){return u.appendListener(e)}};return _}},1035:(e,t,n)=>{"use strict";var r=n(5959),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},a={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function l(e){return r.isMemo(e)?i:s[e.$$typeof]||o}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[r.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,g=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(g){var o=f(n);o&&o!==g&&e(t,o,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var s=l(t),m=l(n),b=0;b{"use strict";e.exports=function(e,t,n,r,o,a,i,s){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,o,a,i,s],u=0;(l=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},5526:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},1176:function(e){e.exports=function(){"use strict";var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},n=function(){function e(e,t){for(var n=0;n1&&void 0!==arguments[1])||arguments[1],o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:5e3;t(this,e),this.ctx=n,this.iframes=r,this.exclude=o,this.iframesTimeout=a}return n(e,[{key:"getContexts",value:function(){var e=[];return(void 0!==this.ctx&&this.ctx?NodeList.prototype.isPrototypeOf(this.ctx)?Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?this.ctx:"string"==typeof this.ctx?Array.prototype.slice.call(document.querySelectorAll(this.ctx)):[this.ctx]:[]).forEach((function(t){var n=e.filter((function(e){return e.contains(t)})).length>0;-1!==e.indexOf(t)||n||e.push(t)})),e}},{key:"getIframeContents",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){},r=void 0;try{var o=e.contentWindow;if(r=o.document,!o||!r)throw new Error("iframe inaccessible")}catch(a){n()}r&&t(r)}},{key:"isIframeBlank",value:function(e){var t="about:blank",n=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&n!==t&&n}},{key:"observeIframeLoad",value:function(e,t,n){var r=this,o=!1,a=null,i=function i(){if(!o){o=!0,clearTimeout(a);try{r.isIframeBlank(e)||(e.removeEventListener("load",i),r.getIframeContents(e,t,n))}catch(s){n()}}};e.addEventListener("load",i),a=setTimeout(i,this.iframesTimeout)}},{key:"onIframeReady",value:function(e,t,n){try{"complete"===e.contentWindow.document.readyState?this.isIframeBlank(e)?this.observeIframeLoad(e,t,n):this.getIframeContents(e,t,n):this.observeIframeLoad(e,t,n)}catch(r){n()}}},{key:"waitForIframes",value:function(e,t){var n=this,r=0;this.forEachIframe(e,(function(){return!0}),(function(e){r++,n.waitForIframes(e.querySelector("html"),(function(){--r||t()}))}),(function(e){e||t()}))}},{key:"forEachIframe",value:function(t,n,r){var o=this,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},i=t.querySelectorAll("iframe"),s=i.length,l=0;i=Array.prototype.slice.call(i);var c=function(){--s<=0&&a(l)};s||c(),i.forEach((function(t){e.matches(t,o.exclude)?c():o.onIframeReady(t,(function(e){n(t)&&(l++,r(e)),c()}),c)}))}},{key:"createIterator",value:function(e,t,n){return document.createNodeIterator(e,t,n,!1)}},{key:"createInstanceOnIframe",value:function(t){return new e(t.querySelector("html"),this.iframes)}},{key:"compareNodeIframe",value:function(e,t,n){if(e.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_PRECEDING){if(null===t)return!0;if(t.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_FOLLOWING)return!0}return!1}},{key:"getIteratorNode",value:function(e){var t=e.previousNode();return{prevNode:t,node:(null===t||e.nextNode())&&e.nextNode()}}},{key:"checkIframeFilter",value:function(e,t,n,r){var o=!1,a=!1;return r.forEach((function(e,t){e.val===n&&(o=t,a=e.handled)})),this.compareNodeIframe(e,t,n)?(!1!==o||a?!1===o||a||(r[o].handled=!0):r.push({val:n,handled:!0}),!0):(!1===o&&r.push({val:n,handled:!1}),!1)}},{key:"handleOpenIframes",value:function(e,t,n,r){var o=this;e.forEach((function(e){e.handled||o.getIframeContents(e.val,(function(e){o.createInstanceOnIframe(e).forEachNode(t,n,r)}))}))}},{key:"iterateThroughNodes",value:function(e,t,n,r,o){for(var a=this,i=this.createIterator(t,e,r),s=[],l=[],c=void 0,u=void 0,d=function(){var e=a.getIteratorNode(i);return u=e.prevNode,c=e.node};d();)this.iframes&&this.forEachIframe(t,(function(e){return a.checkIframeFilter(c,u,e,s)}),(function(t){a.createInstanceOnIframe(t).forEachNode(e,(function(e){return l.push(e)}),r)})),l.push(c);l.forEach((function(e){n(e)})),this.iframes&&this.handleOpenIframes(s,e,n,r),o()}},{key:"forEachNode",value:function(e,t,n){var r=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},a=this.getContexts(),i=a.length;i||o(),a.forEach((function(a){var s=function(){r.iterateThroughNodes(e,a,t,n,(function(){--i<=0&&o()}))};r.iframes?r.waitForIframes(a,s):s()}))}}],[{key:"matches",value:function(e,t){var n="string"==typeof t?[t]:t,r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(r){var o=!1;return n.every((function(t){return!r.call(e,t)||(o=!0,!1)})),o}return!1}}]),e}(),a=function(){function a(e){t(this,a),this.ctx=e,this.ie=!1;var n=window.navigator.userAgent;(n.indexOf("MSIE")>-1||n.indexOf("Trident")>-1)&&(this.ie=!0)}return n(a,[{key:"log",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"debug",r=this.opt.log;this.opt.debug&&"object"===(void 0===r?"undefined":e(r))&&"function"==typeof r[n]&&r[n]("mark.js: "+t)}},{key:"escapeStr",value:function(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}},{key:"createRegExp",value:function(e){return"disabled"!==this.opt.wildcards&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),"disabled"!==this.opt.wildcards&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e)}},{key:"createSynonymsRegExp",value:function(e){var t=this.opt.synonyms,n=this.opt.caseSensitive?"":"i",r=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(var o in t)if(t.hasOwnProperty(o)){var a=t[o],i="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(o):this.escapeStr(o),s="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(a):this.escapeStr(a);""!==i&&""!==s&&(e=e.replace(new RegExp("("+this.escapeStr(i)+"|"+this.escapeStr(s)+")","gm"+n),r+"("+this.processSynomyms(i)+"|"+this.processSynomyms(s)+")"+r))}return e}},{key:"processSynomyms",value:function(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}},{key:"setupWildcardsRegExp",value:function(e){return(e=e.replace(/(?:\\)*\?/g,(function(e){return"\\"===e.charAt(0)?"?":"\x01"}))).replace(/(?:\\)*\*/g,(function(e){return"\\"===e.charAt(0)?"*":"\x02"}))}},{key:"createWildcardsRegExp",value:function(e){var t="withSpaces"===this.opt.wildcards;return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}},{key:"setupIgnoreJoinersRegExp",value:function(e){return e.replace(/[^(|)\\]/g,(function(e,t,n){var r=n.charAt(t+1);return/[(|)\\]/.test(r)||""===r?e:e+"\0"}))}},{key:"createJoinersRegExp",value:function(e){var t=[],n=this.opt.ignorePunctuation;return Array.isArray(n)&&n.length&&t.push(this.escapeStr(n.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join("["+t.join("")+"]*"):e}},{key:"createDiacriticsRegExp",value:function(e){var t=this.opt.caseSensitive?"":"i",n=this.opt.caseSensitive?["a\xe0\xe1\u1ea3\xe3\u1ea1\u0103\u1eb1\u1eaf\u1eb3\u1eb5\u1eb7\xe2\u1ea7\u1ea5\u1ea9\u1eab\u1ead\xe4\xe5\u0101\u0105","A\xc0\xc1\u1ea2\xc3\u1ea0\u0102\u1eb0\u1eae\u1eb2\u1eb4\u1eb6\xc2\u1ea6\u1ea4\u1ea8\u1eaa\u1eac\xc4\xc5\u0100\u0104","c\xe7\u0107\u010d","C\xc7\u0106\u010c","d\u0111\u010f","D\u0110\u010e","e\xe8\xe9\u1ebb\u1ebd\u1eb9\xea\u1ec1\u1ebf\u1ec3\u1ec5\u1ec7\xeb\u011b\u0113\u0119","E\xc8\xc9\u1eba\u1ebc\u1eb8\xca\u1ec0\u1ebe\u1ec2\u1ec4\u1ec6\xcb\u011a\u0112\u0118","i\xec\xed\u1ec9\u0129\u1ecb\xee\xef\u012b","I\xcc\xcd\u1ec8\u0128\u1eca\xce\xcf\u012a","l\u0142","L\u0141","n\xf1\u0148\u0144","N\xd1\u0147\u0143","o\xf2\xf3\u1ecf\xf5\u1ecd\xf4\u1ed3\u1ed1\u1ed5\u1ed7\u1ed9\u01a1\u1edf\u1ee1\u1edb\u1edd\u1ee3\xf6\xf8\u014d","O\xd2\xd3\u1ece\xd5\u1ecc\xd4\u1ed2\u1ed0\u1ed4\u1ed6\u1ed8\u01a0\u1ede\u1ee0\u1eda\u1edc\u1ee2\xd6\xd8\u014c","r\u0159","R\u0158","s\u0161\u015b\u0219\u015f","S\u0160\u015a\u0218\u015e","t\u0165\u021b\u0163","T\u0164\u021a\u0162","u\xf9\xfa\u1ee7\u0169\u1ee5\u01b0\u1eeb\u1ee9\u1eed\u1eef\u1ef1\xfb\xfc\u016f\u016b","U\xd9\xda\u1ee6\u0168\u1ee4\u01af\u1eea\u1ee8\u1eec\u1eee\u1ef0\xdb\xdc\u016e\u016a","y\xfd\u1ef3\u1ef7\u1ef9\u1ef5\xff","Y\xdd\u1ef2\u1ef6\u1ef8\u1ef4\u0178","z\u017e\u017c\u017a","Z\u017d\u017b\u0179"]:["a\xe0\xe1\u1ea3\xe3\u1ea1\u0103\u1eb1\u1eaf\u1eb3\u1eb5\u1eb7\xe2\u1ea7\u1ea5\u1ea9\u1eab\u1ead\xe4\xe5\u0101\u0105A\xc0\xc1\u1ea2\xc3\u1ea0\u0102\u1eb0\u1eae\u1eb2\u1eb4\u1eb6\xc2\u1ea6\u1ea4\u1ea8\u1eaa\u1eac\xc4\xc5\u0100\u0104","c\xe7\u0107\u010dC\xc7\u0106\u010c","d\u0111\u010fD\u0110\u010e","e\xe8\xe9\u1ebb\u1ebd\u1eb9\xea\u1ec1\u1ebf\u1ec3\u1ec5\u1ec7\xeb\u011b\u0113\u0119E\xc8\xc9\u1eba\u1ebc\u1eb8\xca\u1ec0\u1ebe\u1ec2\u1ec4\u1ec6\xcb\u011a\u0112\u0118","i\xec\xed\u1ec9\u0129\u1ecb\xee\xef\u012bI\xcc\xcd\u1ec8\u0128\u1eca\xce\xcf\u012a","l\u0142L\u0141","n\xf1\u0148\u0144N\xd1\u0147\u0143","o\xf2\xf3\u1ecf\xf5\u1ecd\xf4\u1ed3\u1ed1\u1ed5\u1ed7\u1ed9\u01a1\u1edf\u1ee1\u1edb\u1edd\u1ee3\xf6\xf8\u014dO\xd2\xd3\u1ece\xd5\u1ecc\xd4\u1ed2\u1ed0\u1ed4\u1ed6\u1ed8\u01a0\u1ede\u1ee0\u1eda\u1edc\u1ee2\xd6\xd8\u014c","r\u0159R\u0158","s\u0161\u015b\u0219\u015fS\u0160\u015a\u0218\u015e","t\u0165\u021b\u0163T\u0164\u021a\u0162","u\xf9\xfa\u1ee7\u0169\u1ee5\u01b0\u1eeb\u1ee9\u1eed\u1eef\u1ef1\xfb\xfc\u016f\u016bU\xd9\xda\u1ee6\u0168\u1ee4\u01af\u1eea\u1ee8\u1eec\u1eee\u1ef0\xdb\xdc\u016e\u016a","y\xfd\u1ef3\u1ef7\u1ef9\u1ef5\xffY\xdd\u1ef2\u1ef6\u1ef8\u1ef4\u0178","z\u017e\u017c\u017aZ\u017d\u017b\u0179"],r=[];return e.split("").forEach((function(o){n.every((function(n){if(-1!==n.indexOf(o)){if(r.indexOf(n)>-1)return!1;e=e.replace(new RegExp("["+n+"]","gm"+t),"["+n+"]"),r.push(n)}return!0}))})),e}},{key:"createMergedBlanksRegExp",value:function(e){return e.replace(/[\s]+/gim,"[\\s]+")}},{key:"createAccuracyRegExp",value:function(e){var t=this,n="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\xa1\xbf",r=this.opt.accuracy,o="string"==typeof r?r:r.value,a="string"==typeof r?[]:r.limiters,i="";switch(a.forEach((function(e){i+="|"+t.escapeStr(e)})),o){case"partially":default:return"()("+e+")";case"complementary":return"()([^"+(i="\\s"+(i||this.escapeStr(n)))+"]*"+e+"[^"+i+"]*)";case"exactly":return"(^|\\s"+i+")("+e+")(?=$|\\s"+i+")"}}},{key:"getSeparatedKeywords",value:function(e){var t=this,n=[];return e.forEach((function(e){t.opt.separateWordSearch?e.split(" ").forEach((function(e){e.trim()&&-1===n.indexOf(e)&&n.push(e)})):e.trim()&&-1===n.indexOf(e)&&n.push(e)})),{keywords:n.sort((function(e,t){return t.length-e.length})),length:n.length}}},{key:"isNumeric",value:function(e){return Number(parseFloat(e))==e}},{key:"checkRanges",value:function(e){var t=this;if(!Array.isArray(e)||"[object Object]"!==Object.prototype.toString.call(e[0]))return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];var n=[],r=0;return e.sort((function(e,t){return e.start-t.start})).forEach((function(e){var o=t.callNoMatchOnInvalidRanges(e,r),a=o.start,i=o.end;o.valid&&(e.start=a,e.length=i-a,n.push(e),r=i)})),n}},{key:"callNoMatchOnInvalidRanges",value:function(e,t){var n=void 0,r=void 0,o=!1;return e&&void 0!==e.start?(r=(n=parseInt(e.start,10))+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&r-t>0&&r-n>0?o=!0:(this.log("Ignoring invalid or overlapping range: "+JSON.stringify(e)),this.opt.noMatch(e))):(this.log("Ignoring invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:n,end:r,valid:o}}},{key:"checkWhitespaceRanges",value:function(e,t,n){var r=void 0,o=!0,a=n.length,i=t-a,s=parseInt(e.start,10)-i;return(r=(s=s>a?a:s)+parseInt(e.length,10))>a&&(r=a,this.log("End range automatically set to the max value of "+a)),s<0||r-s<0||s>a||r>a?(o=!1,this.log("Invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)):""===n.substring(s,r).replace(/\s+/g,"")&&(o=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:s,end:r,valid:o}}},{key:"getTextNodes",value:function(e){var t=this,n="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,(function(e){r.push({start:n.length,end:(n+=e.textContent).length,node:e})}),(function(e){return t.matchesExclude(e.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT}),(function(){e({value:n,nodes:r})}))}},{key:"matchesExclude",value:function(e){return o.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}},{key:"wrapRangeInTextNode",value:function(e,t,n){var r=this.opt.element?this.opt.element:"mark",o=e.splitText(t),a=o.splitText(n-t),i=document.createElement(r);return i.setAttribute("data-markjs","true"),this.opt.className&&i.setAttribute("class",this.opt.className),i.textContent=o.textContent,o.parentNode.replaceChild(i,o),a}},{key:"wrapRangeInMappedTextNode",value:function(e,t,n,r,o){var a=this;e.nodes.every((function(i,s){var l=e.nodes[s+1];if(void 0===l||l.start>t){if(!r(i.node))return!1;var c=t-i.start,u=(n>i.end?i.end:n)-i.start,d=e.value.substr(0,i.start),p=e.value.substr(u+i.start);if(i.node=a.wrapRangeInTextNode(i.node,c,u),e.value=d+p,e.nodes.forEach((function(t,n){n>=s&&(e.nodes[n].start>0&&n!==s&&(e.nodes[n].start-=u),e.nodes[n].end-=u)})),n-=u,o(i.node.previousSibling,i.start),!(n>i.end))return!1;t=i.end}return!0}))}},{key:"wrapMatches",value:function(e,t,n,r,o){var a=this,i=0===t?0:t+1;this.getTextNodes((function(t){t.nodes.forEach((function(t){t=t.node;for(var o=void 0;null!==(o=e.exec(t.textContent))&&""!==o[i];)if(n(o[i],t)){var s=o.index;if(0!==i)for(var l=1;l{"use strict";n.r(t)},171:(e,t,n)=>{"use strict";n.r(t)},8744:function(e,t,n){var r,o;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function o(e,t,n){return en?n:e}function a(e){return 100*(-1+e)}function i(e,t,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+a(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+a(e)+"%,0)"}:{"margin-left":a(e)+"%"}).transition="all "+t+"ms "+n,o}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=o(e,r.minimum,1),n.status=1===e?null:e;var a=n.render(!t),c=a.querySelector(r.barSelector),u=r.speed,d=r.easing;return a.offsetWidth,s((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),l(c,i(e,u,d)),1===e?(l(a,{transition:"none",opacity:1}),a.offsetWidth,setTimeout((function(){l(a,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*o(Math.random()*t,.1,.95)),t=o(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var o,i=t.querySelector(r.barSelector),s=e?"-100":a(n.status||0),c=document.querySelector(r.parent);return l(i,{transition:"all 0 linear",transform:"translate3d("+s+"%,0,0)"}),r.showSpinner||(o=t.querySelector(r.spinnerSelector))&&f(o),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var s=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),l=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,o=e.length,a=t.charAt(0).toUpperCase()+t.slice(1);o--;)if((r=e[o]+a)in n)return r;return t}function o(e){return e=n(e),t[e]||(t[e]=r(e))}function a(e,t,n){t=o(t),e.style[t]=n}return function(e,t){var n,r,o=arguments;if(2==o.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&a(e,n,r);else a(e,o[1],o[2])}}();function c(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=p(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(o="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=o)},6150:(e,t,n)=>{var r=n(5526);e.exports=f,e.exports.parse=a,e.exports.compile=function(e,t){return s(a(e,t),t)},e.exports.tokensToFunction=s,e.exports.tokensToRegExp=p;var o=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function a(e,t){for(var n,r=[],a=0,i=0,s="",u=t&&t.delimiter||"/";null!=(n=o.exec(e));){var d=n[0],p=n[1],f=n.index;if(s+=e.slice(i,f),i=f+d.length,p)s+=p[1];else{var g=e[i],m=n[2],b=n[3],h=n[4],y=n[5],v=n[6],_=n[7];s&&(r.push(s),s="");var w=null!=m&&null!=g&&g!==m,x="+"===v||"*"===v,S="?"===v||"*"===v,k=n[2]||u,E=h||y;r.push({name:b||a++,prefix:m||"",delimiter:k,optional:S,repeat:x,partial:w,asterisk:!!_,pattern:E?c(E):_?".*":"[^"+l(k)+"]+?"})}}return i{!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var o=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],a=r.variable[1].inside,i=0;i{Prism.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},Prism.languages.webmanifest=Prism.languages.json},1274:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,o,a){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(o,(function(e){if("function"==typeof a&&!a(e))return e;for(var o,s=i.length;-1!==n.code.indexOf(o=t(r,s));)++s;return i[s]=e,o})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var o=0,a=Object.keys(n.tokenStack);!function i(s){for(var l=0;l=a.length);l++){var c=s[l];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=a[o],d=n.tokenStack[u],p="string"==typeof c?c:c.content,f=t(r,u),g=p.indexOf(f);if(g>-1){++o;var m=p.substring(0,g),b=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),h=p.substring(g+f.length),y=[];m&&y.push.apply(y,i([m])),y.push(b),h&&y.push.apply(y,i([h])),"string"==typeof c?s.splice.apply(s,[l,1].concat(y)):c.content=y}}else c.content&&i(c.content)}return s}(n.tokens)}}}})}(Prism)},6186:(e,t,n)=>{"use strict";var r=n(2985);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,i){if(i!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return n.PropTypes=n,n}},2736:(e,t,n)=>{e.exports=n(6186)()},2985:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},9481:(e,t,n)=>{"use strict";var r=n(758),o=n(1896);function a(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n