diff --git a/404.html b/404.html index c8526bdcd..949c6467d 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/images/christmas_dark-9eab3e9deeb68b6a553e24f5997db830.png b/assets/images/christmas_dark-9eab3e9deeb68b6a553e24f5997db830.png new file mode 100644 index 000000000..2c0108e6e Binary files /dev/null and b/assets/images/christmas_dark-9eab3e9deeb68b6a553e24f5997db830.png differ diff --git a/assets/js/007d2baa.f917c71f.js b/assets/js/007d2baa.ca64368a.js similarity index 99% rename from assets/js/007d2baa.f917c71f.js rename to assets/js/007d2baa.ca64368a.js index ecbf66290..98b3742c2 100644 --- a/assets/js/007d2baa.f917c71f.js +++ b/assets/js/007d2baa.ca64368a.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":1734306618000,"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":1734876603000,"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.86fff81a.js b/assets/js/04c04fa2.a4a0ac4a.js similarity index 97% rename from assets/js/04c04fa2.86fff81a.js rename to assets/js/04c04fa2.a4a0ac4a.js index 028ff80e3..1c58741c7 100644 --- a/assets/js/04c04fa2.86fff81a.js +++ b/assets/js/04c04fa2.a4a0ac4a.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":1734306618000,"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":1734876603000,"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.ed4be8ad.js b/assets/js/0748c3bc.0495b2f4.js similarity index 99% rename from assets/js/0748c3bc.ed4be8ad.js rename to assets/js/0748c3bc.0495b2f4.js index 09bc58e2a..629b7e1ae 100644 --- a/assets/js/0748c3bc.ed4be8ad.js +++ b/assets/js/0748c3bc.0495b2f4.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":1734306618000,"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":1734876603000,"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/0766ce7b.d16dcd6d.js b/assets/js/0766ce7b.0005b1e4.js similarity index 67% rename from assets/js/0766ce7b.d16dcd6d.js rename to assets/js/0766ce7b.0005b1e4.js index b325fbfdc..117920c45 100644 --- a/assets/js/0766ce7b.d16dcd6d.js +++ b/assets/js/0766ce7b.0005b1e4.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[5455],{6563:a=>{a.exports=JSON.parse('{"tag":{"label":"update","permalink":"/blog/tags/update","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/update","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[5455],{6563:a=>{a.exports=JSON.parse('{"tag":{"label":"update","permalink":"/blog/tags/update","allTagsPath":"/blog/tags","count":2,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/update","page":1,"postsPerPage":10,"totalPages":1,"totalCount":2,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/0e384e19.de322959.js b/assets/js/0e384e19.d58e8bc5.js similarity index 99% rename from assets/js/0e384e19.de322959.js rename to assets/js/0e384e19.d58e8bc5.js index 1af2e3d40..35cd22c13 100644 --- a/assets/js/0e384e19.de322959.js +++ b/assets/js/0e384e19.d58e8bc5.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":1734306618000,"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":1734876603000,"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.c4d3942b.js b/assets/js/14b6aafb.60f5588a.js similarity index 99% rename from assets/js/14b6aafb.c4d3942b.js rename to assets/js/14b6aafb.60f5588a.js index 6f6f7f9ab..30146486d 100644 --- a/assets/js/14b6aafb.c4d3942b.js +++ b/assets/js/14b6aafb.60f5588a.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":1734306618000,"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":1734876603000,"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.fa15c2ce.js b/assets/js/1630eae8.5558f347.js similarity index 99% rename from assets/js/1630eae8.fa15c2ce.js rename to assets/js/1630eae8.5558f347.js index 6f8a9fe9a..24f6e79a5 100644 --- a/assets/js/1630eae8.fa15c2ce.js +++ b/assets/js/1630eae8.5558f347.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":1734306618000,"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 +"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":1734876603000,"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,iVBORw0KGgoAAAANSUhEUgAAAJ4AAABkCAYAAAB3jIkEAAAO5ElEQVR4Xu2df0gc6RnHv3reVYwNS26bBrssIqGIDV7IBZEgIeSOIwQJqQQJQcRKCIeVIDaISAgSRGSxiwQrh4StSJBDQhqOQ8KRC/4hQY5cSIMNclgRsWLTbdhaE7bHnunzvjOzzs7O7A93Z2fdPAMh68z78/t+5vu878zuTJHX630L3liBHCtQxODlWHGuTirA4DEIjijA4DkiO1fK4DEDjijA4DkiO1fK4DEDjijA4DkiO1fK4DEDjijA4DkiO1fK4DEDjijA4DkiO1fK4DEDjijA4DkiO1fK4DEDjijA4DkiO1eaEXirPTOsoMMKeH1nHW7B7qrPHLyiot3VzLkyV+DtWzB4mcvIJaSrAIOXrmKcPisKMHhZkZELSVcBBi9dxTh9VhRg8LIiIxeSrgIMXrqKcfqsKMDgZUVGLiRdBRi8dBXj9FlRgMHLioxcSLoK2ARebZsf/S1H4UIIz+70o3viebotS5qe71wklSiPE9gCXitufdOGIyVqvyMLmPjsKiazLENuwCOBTLdCuN1m1rdc9YvBszgd1EEZbv4N/vCL2DTf//VvOD5H+zIdJOPAZ1peOme2rPsQnvz+Q3ws8/0Pf/zTEq6Jj7lohy3gAXs71MpBceFe26/w21L6+OrfKJreAKq92Pjk53QEWMgUvujA78cBbONeLgddwCXqbziMt9UUl0rew38iwNJilk6oVE4Am8BLpepM09gXarVB+UhMFiI7TiBa3EAu4SIaQ2FyPYJRvwmn0LuY8e+4HgvHMQEvUXi3OmalppV7UTnCzS+XUQ8jP+FD0dU3IeUES9pu1RUTtSWZazJ4JiNGorSdqcafDxkGQ3OKaJZ4cOLyqS75S101//z7P3BoZb90T/1+/Et11pgQqGSUeR6Eok584gPy5PeBn2nlvn6Nb7EPn+zbqchyShB1Wxc8lPzx929w4uMylNJJdltzXtkG5Xg53qOStU0XkjXHLKZj77+3U7HWj0Tw2QTeng+1mhuEN9QBN4poESpjwQvLcH2C3GRNhjERvg/JVdfC3CKaFk0cT4XuMA3jkhrOY9uCnSlA+L/43cQmzokpgSTjJ/zlWyrXTSHU6Nb69uvDbORNtIyddoqydPO/16KeVUCcjF469KPIs4oJAd5HCvrKiaG07TM6KbZWLXTT8LQFvL2+qtWFoWyAFzMQMQZrAp7mIhIIGlyRXrqm5khBVMXAjHh31rnVYwHiIpVhAM94YsU5tVkZxn0CcDFH1LfVrP1mzsfgxZCg/JHNUCsGq+MAjumrefkKxXfF/FAcK6fFCi0uxpbRQ3vazvwagUMUu7ZCahoBngfrp1Xwxl4ReBXSRddfvMDxx3T8RBW2qyhPeEtXrgsVVO7jRz/gggDPCLyxTdHjYQzLtoi2GctQ+lJFaZefUd30abtGAa99Yk05SURbjpLl4Ue1HBN91V12fANZhtpL6gXkqb12ATkuFKnOIwRr8OKeWOmurUZDpettJDE4Ue1duBsDTTx4cuCMg5lt8MzqIPzj22YGnm7fAQvwjO23YM8O8Kwxz94Re1e1CS6nHBRgStcKy8H6jE76rbV1VNAcR/zdJMAM0vGFEnKq/fLyywvhEI9TAE91yKirkKP5LtTgcjkZ2sZOHZk4Xmx5YsGibLFuC+luNbQ/tCzqDSnHPeSskS3F4aLuRo4tnVXp344eO2WbDTuDZ6aK/lqeuqR7K/eRu+nDl3Sj/YSLtm2LKEOjpYZK3fHtbTpG28bKBjzqCvUuLTbOC1Bj9h/Ed5/Hhmdjnnoa//UXi6ibp4z1lYgcJvrDmyi5+5J2iPyKM83PLqmhVrSdLvdQe9ZOldNKNYKHCY9twnvKRcG0WJ44O1sY/i9W5LRA1ltDYfUDsazVbXTSKe1I9FD+Ilt+7FPb6scNuld7AK/oXu1NdE/uxXu16V4ziwNYHWwzsOWgmP3KLd08xvRm+fUAGOu0OmYGr6EjEjwCfjssHTD2nmiyN0HYAV4LRmbaUaueyAg/R+BsF+6Y6r/7nfaFWn2bEsKXRNyMwd29OBnllGxq4AHzwuF/MBiYSFNfhYhY1QrwJlcV8JLxpjWM8nt9jRk1Mz5zC/wzbagVaxux/fgcE2e79yB4puBYKLtXITMb+j0LHt2rlaG2Vn4t6vmeC7WWEBmgKyTYjAAmisg614rJlqrbiUy2OF6WDdSiOHtCbSoulwy4TMJzbrTLi1o8FGqLkt3TtbGlu607R+DpTmMroKL71bTK4pW3JAp4hp0FT9+8dCDMPnhxYCWAToQi9fIIXbXQbUbqmEIr/jzD5x11PKt2JYMwu+ClCp0GnClstPOtbnJUROAmujqi9fwdZdPjz0/w5BQ0wRQge+Almtfpj4nP25oLiv+1zyo5GmRxIL2jZCULtf6mvHS8ZCHYRvBUoIzQib/lPgNwoqVRttQPWhjmmZ6lAp6RC3mnjpnTGffZBF4K0An4KIyWBlfgfnIf5WsLdCctnHcicoNSVyASidA3sZV/caAZwm52wLOa22n7NZeLOp3iaKUvV1D51QADl/rY7omU4XA4KXyZg2cphS5cxkzP6Bcxalj1fDOC8pUne0JMbmTqCgjHE/AlCrkZgZdqU7RvlBjTl5fT95R4K0gFtra2LBc9AkjbwVO+BhW/if0MXkEyJzuVl+BpMDJ4hQ2e6J1VuM254+kdkMErfPAs4fN6vel8HyItpYxh1vg3g5eWnHsqsQi1Yrw1x8vqdbxkSuhBM34WDamoqEhWBB/fowqsr6/HgGd0PltDLYO3R6nJQrPzEjzRL3Gth8J8FrrIReSjAqurqygpKbEMtzlxPLMwy+DlIy7Za5MZePpwaxt4ycIsg5e9Qc7HkvISPAGluJvBoTYfkclOmwR4xcXFclWrX9FGV7l2XU5J5HgMXnYGN59LYfDyeXQKuG2Og2d2EZkdr4CJU7tmBZ62wLB9ccHgFT5kZj10DDyrr0KJRopjvLgobCCTgldXV5fVe7VWwGmwaXKLyyllZfTUat4KUgENPNE5sbrVb7Z+Hy8RgJrr8eWUgmROdsox8LS5nXGOpwH5boXaClQf24/Np4tYL1zWYnqmB8/sWl7OFxfZBa8VvukGBMeuwDe7yxFt9WG6IYixKz4kLkLUdQQLzT30KDH95xTqbbiKsc4qPLvZhfEXKaTHKfSMd6ByYRgdt75TM7jRdHMEF0ofYqBnArKYppuYungAj4c6Mfp0p9xTPePoOB7B3HAHotnlYTdafWNorFzB17IfoL+n0RAcw5VdC2jeHwYv2TjnArxkbTA57m4ewK1z27jbdQP3gpSgjuC6VovV6EnmRvPALZyn5+2G5kd0gAIKeC5sPQugfZCe7attVe3wD56Bp5jB28WQ6LPoHU+4xCWULqzDc6IGruIIgvO3ccP/CEE600939qG1wYOy4m28WZvD5OAottuVAVI2dTDcp9HZ14oGTxmKt99gbW4Sg6OijGSOp4BwcmMYndJ+FHepXxOuVa1zS6CmuR9d56mN4mHvoRe4P9KP6TgnrKNyulG96Kf/l3H2ug8tpQ9w9fo0tUUU34yBW/VYfbCFU/VBjHTcguaNArxLh7ZQ4gpiun0QGnrHOkfR632DlUp6Rwg7XibsGcHrQG1oBj7fBILH+tB/2Y353m4EKrox3nEI80M+BII16O7tRNUPQwogBsc70xdAq2sOQ75AtIwnVMb4cjLwiAUqa+zoEnq7x7GMJtycOo2XwyIM6vIK1xmqR/B2PwafutHe04tTm3fQOjATJ4SbQulIE71wxbeGhr5aLPupLJUuWVfdKoY613F+6gy2xnemGxI8PMRC5XkcnL2K69PSMnF1rAsHv5tD2dlKPGPwsgneJWBKGwAdlJs0YL212JgOYGp2HsvSMtTNAF5F9THs33yKRbkKOI2e2xeBO6LM5OARefCNHcWSALX6OibPhjBCLvNU75buKtTSF6/Xny9L53K3EUA1C2juMXsjbA2u+G+gwR1B8co9dN24p7gdPc673T+EY8vKydN0cwqN4cloWBXgtX9wH6Objeg6OKu45Jk+BJqB6ckImjrcmGPwcgDerBu1TZfQ8mkdvO4ShNVQ+0iMogE894k2dLV8isPuD+hZ7WIL4YmcV6UAngyvoziy0IlZrx+Nm6Pq3Euftwbnei7j/FEPyrWXEa98bQEegXnuBvwt5Nz9tEDRwnHVFXJNckB1USHng41h3GkdgPBNOcdzz6H5ixKa09GCqK8b6xcDaMY02h/XkvszeJlQJ6jRrWqVOZ6p483qqqk4jitd3Ti+QSs5P70wNwY84SSDqN+YxFBghpxRX34q4CnhdvRIEE9dlQjf1laVurzCeVpcmBsZQeDJ+g4kpo4nKYoBRfREztVOHjRoF8Hil5dApqgrc0bOM4+uzOBNQx1ejlB7ymLL41XtrhBMDby7VX4M0QR8YmgcM5sVcl5Vr4F3aRDTp0P44rIPj+ilVZ2jvah6MYDBMXohSlMHOi96sJSy44nYSW0aoZXj5rxuwq8DT1wCaYzgy+s38RVOouPa5zgVeWDpePHgibnaNVp0xF5qkStc3Jdh9YjmeASzdENa+m5vPMSN7gCWDSAzeDaC55utQXN/J85Vu+k9JjurWhlq3U3o919ETekS7jf34ZvTnbjedhIVpZRuZQHrB2qBR83om0rN8WJXs9o6MzbUNvd3oanGheJIEM8WIzjqWcGtK36IF5bHbUbHq6OQe60SYsETWNalFk7a7sJsRw9WxWpdhFrpomfQF2iHe64X3SKDCXiNlbG1hp5kfl2vwK/j7YpWzpQDBRi8HIjMVcQrwOAxFY4owOA5IjtXyuAxA44owOA5IjtXyuAxA44owF8EdUR2rpTBYwYcUYDBc0R2rpTBYwYcUYDBc0R2rpTBYwYcUSCvwXO5tN87OKINV2qjAqFQKPpD7pz+oFv0SfymNtHvahk8G0fe4aLzDjwNRvH7WgbPYTpsrJ7Bs1FcLtpaAQ0841MERA5bn51iFWrZ8d4NXPMOPCG79uQo8WYf8Uh63gpLAfEkMPFmH7GoMC4sHHM8zQkFfAK6ffv2FZbq3Bu8fv1avsdEe/i2URIRav8P6GrPOLR3FJEAAAAASUVORK5CYII="},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,iVBORw0KGgoAAAANSUhEUgAAAVcAAAB0CAYAAAAxfnE0AAAY6ElEQVR4Xu2df0Td3x/Hn59kMpnkmkxmJrmSayaTTDKZTCaTJJl8JfnIZK7JZK4k11yT5CMzH5kkycd8ZDJJkmSSJHNNZpLJ5EqSZNr3vH/cuj/e977P+977vvd2P8/r88dn3fM+73Me59zH+/V+nXPv+w+n0/kbfJEACZAACaSEwO/fmlL/oFxTwpOVkAAJkIBKgHLlRCABEiABGwhQrjZAjVXl1atXceXKlYTPeHp6iuPj44SP54EkQALpI0C5pol1smINNpOCTdOA8TQkkCQByjVJgLKHFxUVyRY1LXdwcGBahgVIgAQyS4ByTRN/yjVNoHkaEsgSAjkg13r0T7pRdRU4XvOhbXA+S9CGN4NyzcphYaNIwDYCEnLtxOhcM8rCmhDAsq8NKfdY5yjm7hcCR8to6Hkn2WlNrveFXLE7Y+E4yepTVCy2XOvgftuNqmuhJzrE2lgXfIvGJ2daIEWDwmpIwEYC8eVa349J931o3mqA6jtFgM2aareDf0tVAxOSa6pObm89xnLVxaoCnkVr3wTQ7sVUY6n4w3FMwVKu9o4VayeBVBCIK9fO0Tk0l4jT7IVHhPX9o+i8VYiz78viNlwxrh49Foc0KbAMX9sgtJt07f0KsQvpighMxX/66yICVs8VHh4jsKzd5ke/Fx45K+83iHOfftHTAoqklT/kC2sVFFw0ajsisg25UAQLhV4wgvWGVqO8/6FkEu77oZ01v9AYyrWuHd72ahSeHWG1qw9CreIl/jbVCFWva2PoMghfKddUTH3WQQL2EogjVy0doLlVj1oN2xKd86zvF/LRkqC6YEPlu42Zhh58jyojFKz8TTFwQMhSTwtE/U0VotoqtR4tmDaQq25qTdC3ovsSVU90fy+kHiJzNZqvwBUEhMCV8yvHNaAYp/gSJ1Uin3PV5Hpd9OvnbCuUYDbyRbna+6Fg7SSQCgKx5apKpEqkBMTtabz8apRswiPVgBBPz7uLyFX7txLMRtdvJNfoTkbLLGbkevrlPHoOj8K/n0fS5+1RmxR+UbgVKW2lMcGoOKRumYGQlquaFlDVitnWYDQbfgbKVYY4y5BAZgkkLdfoKFXrULjwYCCzaEkay9Ug5aCeITylYJgWCBFgeN0wWKQLGQg9pWEo16gUiNzinpRc69x4261c0JQUrHHUqrSScs3sh4ZnJwEZAkmnBeyWa3TeN7HI1UiuZimPqIg4gqha53nuVUt3xNrjYCpXiYWs4OkpV5mpzTIkkFkCpgtaYRGh3lZFKkra89dGG3q+R+YglUKRaQCDtIBBrjI6cpU7TiYtEF63lhYw2xtrJlcNh1Ebowc1nlzr3G/RrTQGuzFTAaE1Uq6Z/dDw7CQgQyCprVhiOV/kNFdRHSGqWAta2lpVcHFMLi0QGblq0aKyKfTwfK+tdbmK+FJd0NK2PGl7dkP28+q7CozkerHIpUeqkrnpWHJt905B23m1hrEuHxYlRo1ylYDEIiSQYQIp+hKB/FaseHLVFrnui5V37aVti4r+EsNRQGznUgtpghMJVOOtWDFzrvrNu+RWrPMtXiGRe0q2Yunbrm7FmgSHxsKlXDP8qeHpSUCCgIRcJWphEVMCpjlX0xouClCuFmCxKAlkiADlmibwlGuaQPM0JJAlBCjXNA0Ef881TaB5GhLIEgKUaxoHIlnB8oey0zhYPBUJJEmAck0SIA8nARIgASMClCvnBQmQAAnYQIBytQEqqyQBEiABypVzgARIgARsIEC52gCVVZIACZAA5co5QAIkQAI2EKBcbYDKKkmABEggplx//fpFOiRAAiRAAnEI5Ofnx3yXcuXUIQESIIEECVCuCYLjYSRAAiQQjwDlyvlBAiRAAjYQoFxtgMoqSYAESIBy5RwgARIgARsIUK42QGWVJEACJEC5cg6QAAmQgA0EKFcboLJKEiABEqBcOQdIgARIwAYClKsNUFklCZAACVCunAMkQAIkYAMBytUGqKySBEiABChXzgESIAESsIEA5WoDVFZJAiRAApQr5wAJkAAJ2ECAcrUBKqskARIgAcqVc4AESIAEbCBAudoAlVWSQKYJuJ768LLNheK8JFtyFsDm5BDc7zeTrMj+w5Puc4r7GkuuwacQKET+cDqdv0PR8DEv9k8UnoEEEifQBt9sB1xXEq8h7MjTTYw3ujEpUV18wZ0hsDKMHs8c9iXqslYkRX220Fez9lGuZoT4PglcOgKdGP3UgvKUtfsrph/24J1pfTKCs0uwqeqzbF9NYSBjcu0c/YSWcr0jDz2YctcAKz60ej6ZtzoXSzhq0dpyAz+mp7CU+st6LhJjn2ISSJVogieQFU4Kz2v5Fj1V55btq/n0o1zPGT2EZ8qNmuILaGenh9jzz+Nv75j9wqvrw0TffeyNN8I9ZT5wLEECsQkERZOsKKzWkyrB6T2zdIseeW7Zvid6nPn8o1wj5Or069GzowxV1Y/R3d2AEv84OtyTNuSJzAeIJUjAOgGrUox1Bqv1WC2fqvMq9SQqyUSPMx+VtMnVUdsLT28DyguB08AWtk9cqLgRnhbI+7aJw+uVuKmW8WP2r0GMpe0eWYtcz+Wqs6t6MY6hmj2MNfXhyDMFt2MeD3uC2SdtYERCCsqflFRH/cEHbJTUo07rBLamgyutStl6HHzYQEl9nd7HLUwPuaEuxKqpESf8vlYomZH4dQGOhhfwdj04Z7W2V4KaEj98rR78RxMr5rP9P1MiXHIfqjrQ19cK17U8nAXW8fdQH6alFv+tytJqeTvlmuhgy0a85vWnSa6PMTjTg3uFYlvH3BK+FTjxoM6Ja3nhci0+O4R/cQF+6O8frKRRFsZydfa+w0j9gbpaui8h15ayANYnhjG6eITq7n503dnVV1q1iVcmJvfE8CgWj6rR3d+FO7vjaBRRsZFcY9blEAsH4x24tT2N4dFFHDgfo1dE2DeP0snLfHKxRKYIGEjO9RS+V20WBWtVllbLU67Jb8Vq82G2w4WDBQ/avSsqUaMFrbzVN2h5Nae+/3hwBj33zrD6pgX6n2yeqdFyLX3wHJ7nF2mBuxJybTwaQ1PfP1pb9Wh0a6gVg4vKxGvE0VgTLt4WkbBzC0Otg1g0iFxj1TVWNoqJZmCmXazg6otfD5W2ORm52jxJLkn1MSQXKtjDTUwO6HdNMXtlVZZWy9spV9kI9JKnBdTo75ED6yFiMd0t0DmKTy3l+Krfcsef1XES6QHZaC56QQs4w6H/A0YGtAUtVWBmaYH9kB0PYcLU0gL7+m2/5t4QIRqlBWLUtVITLVLK9ZJ4Ly3NjCO5sAh2CW/EhT12GsmqLK2Wp1yTjlwd3WOYfFIcFoWmVq6pmLERkat66/0UjqUBdLzWom3KNRWcWYf9BCjXxBnLRrzmZ0hPzjUqLeBA99gkntyOWNDKsrSAS0Tcr+tPMOMWt99+Xa4li2gTFwvtbtxgQSsNkaundARzT84w2dGL90wLmM/y/1wJibTAsR8zr57hXdyFLauRqNXydkauiQ76ZZMrggtaP7Ext4LvhS48vH8bV7N+QUuLZiu/j6FbSZSKVMVEcyGW3wxi/FsJ6jp70H63GNuhuwXSIdd1Laou3ZrA6LtVLmgl+jnK2eNMFrTCxGqUUgsKxqosrZa3U67xJBknjYhLJ1exdai2G/1/NqFCbNJXtlmt791AdcVP7Wt1+je0Dj4vIL8iuE0pO7ZiOUTUPd5RijU1V+rCU99LtLmKkXd2ip9b2/jlqsBRuuUqkmSRW7FUniVf0ri7ImfNlAMdi5CcqwXel//DXfErLmdRESvlGj7gl1CuOTBjs6oLDocD+/sX35N94v2A7sLZkD24WdVcNiatBCL2uUbMFfmmWI1ErZa3M3KV7yXlmiirXDzuVgeGhxtwMiP2005so6DpGQa772J/xi2+zCCSw3z9xwlkSnIyP9xiYWiS+vqrhfOEFWXkmii5nDnO1eLBs5YqlF4TvysnfgNhd3kcHu8sdnOmh+xI4gQyJ7mkf1M12GnLP9ySoj5bEnr8EUrPboHEZwmPJAESSIBA5iSXQGNTdEjSfbYsdMo1RUPHakiABEhAngAjV3lWLEkCJEAC0gQoV2lULEgCJEAC8gQoV3lWLEkCJEAC0gQoV2lULEgCJEAC8gQoV3lWLEkCJEAC0gQoV2lULEgCJEAC8gQoV3lWLEkCJEAC0gQoV2lULEgCJEAC8gQoV3lWLEkCJEAC0gQoV2lULEgCJEAC8gQoV3lWLEkCJEAC0gQoV2lULEgCl4dA0j9iEuxqin/MxE6CSfc5xX2lXO0cbdZNAhkhkKKf3wu23cLP8MUX3BkCK8Po8czpz6BLJZwU9dlCX81aT7maEeL7JHDpCMR7RlQinZH9AWkZwdkl2FT1Wbav5hwpV3NG0iXCHhcuc5T+7DCs+NDqif30eJmqosrYWXfkycSDGz+1lOOr/iyxhNp7yQ5yNXbiHj7j3Wzcx6dmqFepEk2w+bLCSeF5Ld+ip+rcsn01H1rK1ZyRdIlwuWpPjq3BSuyHBtopQDvrzga56kK/aMoZTn9uY/nft/BO2y+8juE5tBbNo7/DhzXpGZKugpl6zEuqBKdzsnSLHnluWUkmepz5WFKu5oykS1CuD8UzvKRxJVdQlSu0pweLmkorH6CuvQvtd06wMNCB1yvJVX+5j860XGXFFotyIu1PVJKJHmc+Q9ImV0dtLzy9DSgvFI/3PfqKjZ3ruBt8tLZop6ulD11P7qOs+Ir+2OoZDHvHsSYecKpKq2wH66tAefVNFOIUga1pvP18G22t1bhZqDyuewvTQ26814MW9VHeXY1wXlfqO8LO6hRGPAu4NzqBlvJdfHzWiWHlWX5VLzA+VA/Hlwl09L7HDbN2lIdMnIjo8Fyuvn3Uu2sgniKuvwLizl95NHfEgOjH533bxOH1Sr0f4Y8Uj8dFKAWN7j6015Wh+IrCdQerUyPwKJFbRNtcQkZD4tZd3LvjpTDgpnjcsudZC6pKr+GKwtM/i78Gx7B0zvsbVhfzUVl3wXvI/R4qXkctej29aChXwWNr+wSuihvpTQtEyFUjq+X8iuafoXP4PkY/1WM/hPtDzxTcTr92J6HyKcHa5BGqmisFP+BoZwFv+15jTjBQy5asYfKoCs2VxYKRmEMLb9H3WluMUcca0+rTds3KitmtPpK9JVjP6leg+q54wKRdF6OIp79WdaCvrxWua2KOBNbx91Af5IJ7q5KzWt5OuZrLz7hEsheGi1rTI1eHmPTjHXDlH8K/uAA/nHhQ58S1PL0jThF9DD9G6cEmZiY+4uTeU7RWl2B/fgAdIgTRpHWGQ/8iFvwnuF3bAJcw19nxHtYWP2PfcQ/1924Am+NCNpPiw6+dr/LEj8UFP05uKO9r9bkDbZhouYWt8UYoRZ297zDyqEQcKv69LtMOCbm2DWOjTHwon4tnxUNM5jczWNtew/bFk7C1EdAFWHwWweVATyWYcHGJtr9+VIojlYvoy4M6OAt38W+vmOQ3FXnUQMnn9qzWYLS3BkWi3uEej5BHDV6Mv0K9Yw+f5z/jR4E2HgVb4+gQUJpU3sKbPz5j/vM+HPfqoeHVmD0enEHPvUIENuew9K1AO6/44KY152oo1yfwfuhGycpLMW/uSMi1BoU7cxjxTuNbyRO4+xpRsKQcu6YJs6YQO3MjIs3wDSVP3OhrLMDSSxEVizxAlFzjlK15MY5XtcDyuA9TG0Wo7uxB+91ibNuWozaQnOspfK/aLArWqiytlqdc/3A6nb9DMfz69cvaZaHNh9kOFw4WPGj3avdrDQPTeF79U7utc1bhflE+Tva3hYTUuEB8MFpQLqIsJTLQ5PoN/7R1Y0wLG9QFlJ/n9TVgYPo5qs80Ke2ownRgfawJff+oFtPzn0sY8hygXYjcsTGGpr4lUZWIZG9tYbzRjUmpdkjIVb1Vlc+55q2+QcurOZWLJq4zrL5pwavv8bhsCEEOob5oHWNNfVC7+cSLD+IR27vKh3ZHl+v6CvYrayCWmzD9UrRLCT31cvsflQhPCd8dGoeyr5hqeIa8SN56+ZOlIbQO3lCjQ9fBAjztXpFRvhiPjMrVUYVWtxsd52kBZQ6ZRa6lWA3ewejRaPPZFBqe/a3JtXQVzzqHRTCgdlLU14yzqQaIt6PlGrOsNg+c/tBFS21+i8lvUxolhuRCBXu4icmBizs94w+0VVlaLW+nXGUj0EueFqjrn8LL2oIQ2em3XTX7es7MgaqOXvQ03kGJeFR0XpB5mFxDYEWtToeLzOGbRYdL3OdFvgKKfKdQ/m4YjwtXxf9/xUMhCue2lhIQMZq1dsRKCxjKNXwQA8oOgZWa8+jyfLdAWN/itQdhF6CovgajYv2NfSHGtsFF9V9VIpIaqhehaNRLYywqFhezGBeRqQq8G3kEx7pycVKVfn6xk5WrFhVeJE1CmyFbR/ACG9aF0x9Yef9GS4uoMjSTqwPzes5W60bErb5jXr24650ME6J8WSORZkiuSkfCItglvGkdROx9KlZlabU85Zp05GoqV10EhV8/wDs8jeXtJoPIVV6upSNiJdcp8px/jWBuL2QAf+1je20bDvGBGX6cj4XpPdS0VOL7RAd636uJNlV20u2wJNcaNP95B9f15hx/W8D4WWt8uerRp3F7ZOV6iuPjfFwt2MO8vtCjjcc1fP0wgIn10Al+hN3VLTTEk+vobYxNPkFxSLQdFJ20GGN9pqz8PSItoN167+N9h7gDUdMvlKt6txJy8VDx/mfkamUyhV3eo5klWFV6cq5maYHISNQhbv/FB/h2gpFrQI3MSrDzb6/43Gs3dXBVoerHmrpAJhKtavRVGAiguEhEz+3idjkk3XAuCcN2hKQnGgYw/bwaZ/o+1UR3C8RMC5RG7B8Na49BWqCmUyxaVSKw2AvfsXahKFgXaZWFcow+r0XR7ke8ELe5m/p4nHweRXP/vxofcVtddUPwEUFf1H7dsIuIIyot4Ogew+ST25nNuTpEvnWsG7e2grffilwfIqCkV7SMi3arH7aglY7ItQ79Uy/h3LhIiQXTXhlNCxz7MfPqmZYmivmyGolaLW9n5JqgEY0uSAlWlR656hP/bmGMBa1WkZP9nwsIW0ARt/Umcg2oOcBF5WMTvqfU+T+MiFViZ34AXxaX8PXkBu7WVcHxbQK9zyfwXSyo9b4bwaObYlFMnKNdRLJqsGPSDu12uiRqIUe9xRdbAcKlpH2oagt3sPJxGasL45jTPX8+VmYLWibtCV/Q0hf6isROiBdiJ0TJxYJWq2dd5LhHRY67CDsfX4g8a4lo23PUFp1gZ20R6z8KUF4rFqVOFzH41AtnvMhV9DO4oPVzYw4r3wvhengft69mfkHLKS7SvuYCzCv939TmROXeNHy+ORzdaUFvdwNuHumLhSr7dMgV0KLqX/g0Nox//VmwoBUmVqO9qcGI16osrZa3U67xcq5GfQ62RTZXa27c9MhVCYwitmLtHpfj5vVgRxxoeOFF14Pgtp9V7N6shUtfoLoZ+WHXI92g1KLkqp4vdCuW2Gq0vYx/3nrPt6BouwRKhb/bxaJCcBk/fjs+ORrwwtuFB2Lvl7K96+vGDq7frYgRuYpgWUSJnuYKsXXsJxa87fAq14HQly7Xg88LyK+oM9iKZdKesK1YYnX/cFesSHvgnd2N2ooF0faBUbHoV7SjyVdsJDrfipV3hqMfW/j0txdjYi9W/MhVZOjEVqzu/j/RVCHypmIrln99DzeqK/DTtgUag4lsuFtA2wVRezQDt3LBbHgBb/cD3LyqsfHvX4Or6EvIVqz0yNVoK1Z+zV0c2cYrQnJi2533pdi5Uiy2YkVFrJRr+Oy6jHKtqsKNtTVtn2Qwciz1q6vTYvGVLxLIYQIOOBz72A9ew9W0VDV2jfY+p4RCxD5Xh0OcO3IfoMyJrEaiVsvbGbnK9M+ozKWT6yMMzDxDxQ9lP+Yhrqj7TrV9qcq+ykSGPVF0PI4E0k2grk+ko8rW8Zf3PT6dlOHPvn40OdZify066QZmSnIyP9xioXNJff3VwnnCil46uRp8A0t8I+it/o2gRDHwOBK4FATUNEoXGp3XcUWkYE5/bmFm2ItxdXXVjlfmJJf0b6oGcVj+4ZYU9dmS0OOPXdpyrnZMIdZJAiRgTCBzksvciCTdZ8tCty7X37/Dvo+FpPe5Zg43z0wCJEACmSFgFLlSrpkZC56VBEgghwhQrjk0mOwKCZBA9hCgXLNnLNgSEiCBHCJAuebQYLIrJEAC2UOAcs2esWBLSIAEcogA5ZpDg8mukAAJZA8ByjV7xoItIQESyCEClGsODSa7QgIkkD0EKNfsGQu2hARIIIcIUK45NJjsCgmQQPYQoFyzZyzYEhIggRwiQLnm0GCyKyRAAtlDgHLNnrFgS0iABHKIAOWaQ4PJrpAACWQPAco1e8aCLSEBEsghApRrDg0mu0ICJJA9BCjX7BkLtoQESCCHCCQk1xzqP7tCAiRAAmkjYPokgrS1hCciARIggRwiQLnm0GCyKyRAAtlDIFKu/wdc+3gxygQ2XAAAAABJRU5ErkJggg=="},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/185e55c0.2dba64a5.js b/assets/js/185e55c0.2dba64a5.js new file mode 100644 index 000000000..06e532e94 --- /dev/null +++ b/assets/js/185e55c0.2dba64a5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[6665],{1737:a=>{a.exports=JSON.parse('{"tag":{"label":"bug fixes","permalink":"/blog/tags/bug-fixes","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/bug-fixes","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/18d9fd7d.d2daa6fa.js b/assets/js/18d9fd7d.5c12d359.js similarity index 99% rename from assets/js/18d9fd7d.d2daa6fa.js rename to assets/js/18d9fd7d.5c12d359.js index a351a9590..c82feb57c 100644 --- a/assets/js/18d9fd7d.d2daa6fa.js +++ b/assets/js/18d9fd7d.5c12d359.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":1734306618000,"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":1734876603000,"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.6a412ec7.js b/assets/js/193fe191.cbc7e99f.js similarity index 99% rename from assets/js/193fe191.6a412ec7.js rename to assets/js/193fe191.cbc7e99f.js index a6a5f18a6..d03e355f1 100644 --- a/assets/js/193fe191.6a412ec7.js +++ b/assets/js/193fe191.cbc7e99f.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":1734306618000,"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":1734876603000,"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.b05d5cbc.js b/assets/js/1e0a1681.d73f9cfc.js similarity index 99% rename from assets/js/1e0a1681.b05d5cbc.js rename to assets/js/1e0a1681.d73f9cfc.js index 28ab73e69..90583920e 100644 --- a/assets/js/1e0a1681.b05d5cbc.js +++ b/assets/js/1e0a1681.d73f9cfc.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":1734306618000,"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":1734876603000,"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.471f8b92.js b/assets/js/264f4708.c6f5c55c.js similarity index 99% rename from assets/js/264f4708.471f8b92.js rename to assets/js/264f4708.c6f5c55c.js index 112cc19af..1e6b7169b 100644 --- a/assets/js/264f4708.471f8b92.js +++ b/assets/js/264f4708.c6f5c55c.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":1734306618000,"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":1734876603000,"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.fd1eea32.js b/assets/js/31861b5f.95b422cb.js similarity index 98% rename from assets/js/31861b5f.fd1eea32.js rename to assets/js/31861b5f.95b422cb.js index 001b56158..c15eba667 100644 --- a/assets/js/31861b5f.fd1eea32.js +++ b/assets/js/31861b5f.95b422cb.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[905],{6356:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>n,toc:()=>u});const n=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":1734306618000,"frontMatter":{"title":"Steam"},"sidebar":"docs","previous":{"title":"Playnite","permalink":"/docs/gamevault-plus/integrations/playnite"},"next":{"title":"Licensing and Contributions","permalink":"/docs/license-contribute"}}');var a=s(6070),r=s(8591);const i={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,r.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"GameVault+"})," offers seamless integration with ",(0,a.jsx)(t.strong,{children:(0,a.jsx)(t.a,{href:"https://steampowered.com",children:"Steam"})})," through the ",(0,a.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,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Steam Integration Showcase",src:s(2616).A+"",width:"2552",height:"1392"})}),"\n",(0,a.jsx)(t.h2,{id:"setup-guide",children:"Setup Guide"}),"\n",(0,a.jsx)(t.h3,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,a.jsxs)(t.p,{children:["Before starting, ensure that you have ",(0,a.jsx)(t.a,{href:"https://store.steampowered.com/about/",children:"installed Steam"}),", are logged into your Steam account, and are ",(0,a.jsxs)(t.a,{href:"/docs/gamevault-plus/client-setup",children:["logged in to ",(0,a.jsx)(t.strong,{children:"GameVault+"})]})," within your GameVault application."]}),"\n",(0,a.jsx)(t.h3,{id:"step-1-enable-steam-sync",children:(0,a.jsx)(t.strong,{children:"Step 1: Enable Steam Sync"})}),"\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsxs)(t.li,{children:["Fully shut down your Steam client using the ",(0,a.jsx)(t.strong,{children:"Exit Steam"})," button."]}),"\n",(0,a.jsxs)(t.li,{children:["Open the GameVault Application and click on the ",(0,a.jsx)(t.strong,{children:"Settings"})," tab."]}),"\n",(0,a.jsxs)(t.li,{children:["Navigate to ",(0,a.jsx)(t.strong,{children:"GameVault+"})," -> ",(0,a.jsx)(t.strong,{children:"Features"})," -> ",(0,a.jsx)(t.strong,{children:"Steam"}),"."]}),"\n",(0,a.jsxs)(t.li,{children:["Toggle ",(0,a.jsx)(t.strong,{children:"Sync"})," to enable the integration."]}),"\n",(0,a.jsx)(t.li,{children:"Restart Steam. Your installed games will now sync with your Steam Library."}),"\n"]}),"\n",(0,a.jsx)(t.h2,{id:"important-notes",children:"Important Notes"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.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,a.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,a.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",(0,a.jsx)(t.li,{children:"Steam usually requires a restart to sync the library, so make sure to restart Steam after you install or uninstall games to see the changes."}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},2616:(e,t,s)=>{s.d(t,{A:()=>n});const n=s.p+"assets/images/showcase-86b299fddfea2c32efb1d7cb05404920.png"},8591:(e,t,s)=>{s.d(t,{R:()=>i,x:()=>o});var n=s(758);const a={},r=n.createContext(a);function i(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(a):e.components||a:i(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([[905],{6356:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>n,toc:()=>u});const n=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":1734876603000,"frontMatter":{"title":"Steam"},"sidebar":"docs","previous":{"title":"Playnite","permalink":"/docs/gamevault-plus/integrations/playnite"},"next":{"title":"Licensing and Contributions","permalink":"/docs/license-contribute"}}');var a=s(6070),r=s(8591);const i={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,r.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"GameVault+"})," offers seamless integration with ",(0,a.jsx)(t.strong,{children:(0,a.jsx)(t.a,{href:"https://steampowered.com",children:"Steam"})})," through the ",(0,a.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,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Steam Integration Showcase",src:s(2616).A+"",width:"2552",height:"1392"})}),"\n",(0,a.jsx)(t.h2,{id:"setup-guide",children:"Setup Guide"}),"\n",(0,a.jsx)(t.h3,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,a.jsxs)(t.p,{children:["Before starting, ensure that you have ",(0,a.jsx)(t.a,{href:"https://store.steampowered.com/about/",children:"installed Steam"}),", are logged into your Steam account, and are ",(0,a.jsxs)(t.a,{href:"/docs/gamevault-plus/client-setup",children:["logged in to ",(0,a.jsx)(t.strong,{children:"GameVault+"})]})," within your GameVault application."]}),"\n",(0,a.jsx)(t.h3,{id:"step-1-enable-steam-sync",children:(0,a.jsx)(t.strong,{children:"Step 1: Enable Steam Sync"})}),"\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsxs)(t.li,{children:["Fully shut down your Steam client using the ",(0,a.jsx)(t.strong,{children:"Exit Steam"})," button."]}),"\n",(0,a.jsxs)(t.li,{children:["Open the GameVault Application and click on the ",(0,a.jsx)(t.strong,{children:"Settings"})," tab."]}),"\n",(0,a.jsxs)(t.li,{children:["Navigate to ",(0,a.jsx)(t.strong,{children:"GameVault+"})," -> ",(0,a.jsx)(t.strong,{children:"Features"})," -> ",(0,a.jsx)(t.strong,{children:"Steam"}),"."]}),"\n",(0,a.jsxs)(t.li,{children:["Toggle ",(0,a.jsx)(t.strong,{children:"Sync"})," to enable the integration."]}),"\n",(0,a.jsx)(t.li,{children:"Restart Steam. Your installed games will now sync with your Steam Library."}),"\n"]}),"\n",(0,a.jsx)(t.h2,{id:"important-notes",children:"Important Notes"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.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,a.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,a.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",(0,a.jsx)(t.li,{children:"Steam usually requires a restart to sync the library, so make sure to restart Steam after you install or uninstall games to see the changes."}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},2616:(e,t,s)=>{s.d(t,{A:()=>n});const n=s.p+"assets/images/showcase-86b299fddfea2c32efb1d7cb05404920.png"},8591:(e,t,s)=>{s.d(t,{R:()=>i,x:()=>o});var n=s(758);const a={},r=n.createContext(a);function i(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(a):e.components||a:i(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3a2db09e.584411b2.js b/assets/js/3a2db09e.584411b2.js deleted file mode 100644 index ac0cc6876..000000000 --- a/assets/js/3a2db09e.584411b2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[8121],{8070:a=>{a.exports=JSON.parse('{"tags":[{"label":"GameVault","permalink":"/blog/tags/game-vault","count":9},{"label":"Client Update","permalink":"/blog/tags/client-update","count":1},{"label":"Server Update","permalink":"/blog/tags/server-update","count":1},{"label":"metadata framework","permalink":"/blog/tags/metadata-framework","count":1},{"label":"plugin system","permalink":"/blog/tags/plugin-system","count":1},{"label":"parental control","permalink":"/blog/tags/parental-control","count":1},{"label":"age restrictions","permalink":"/blog/tags/age-restrictions","count":1},{"label":"theme","permalink":"/blog/tags/theme","count":1},{"label":"app optimization","permalink":"/blog/tags/app-optimization","count":1},{"label":"analytics","permalink":"/blog/tags/analytics","count":1},{"label":"notes","permalink":"/blog/tags/notes","count":1},{"label":"community management","permalink":"/blog/tags/community-management","count":1},{"label":"game","permalink":"/blog/tags/game","count":1},{"label":"metadata","permalink":"/blog/tags/metadata","count":2},{"label":"database","permalink":"/blog/tags/database","count":1},{"label":"videogame","permalink":"/blog/tags/videogame","count":1},{"label":"RAWG","permalink":"/blog/tags/rawg","count":1},{"label":"IGDB","permalink":"/blog/tags/igdb","count":1},{"label":"twitch.tv","permalink":"/blog/tags/twitch-tv","count":1},{"label":"API","permalink":"/blog/tags/api","count":2},{"label":"partnership","permalink":"/blog/tags/partnership","count":1},{"label":"community","permalink":"/blog/tags/community","count":4},{"label":"solution","permalink":"/blog/tags/solution","count":1},{"label":"Steam","permalink":"/blog/tags/steam","count":1},{"label":"backend","permalink":"/blog/tags/backend","count":1},{"label":"update","permalink":"/blog/tags/update","count":1},{"label":"features","permalink":"/blog/tags/features","count":3},{"label":"easter egg","permalink":"/blog/tags/easter-egg","count":1},{"label":"gaming","permalink":"/blog/tags/gaming","count":4},{"label":"self-hosted","permalink":"/blog/tags/self-hosted","count":2},{"label":"platform","permalink":"/blog/tags/platform","count":2},{"label":"DRM-free","permalink":"/blog/tags/drm-free","count":1},{"label":"video games","permalink":"/blog/tags/video-games","count":1},{"label":"subscription","permalink":"/blog/tags/subscription","count":1},{"label":"community-driven","permalink":"/blog/tags/community-driven","count":1},{"label":"updates","permalink":"/blog/tags/updates","count":1},{"label":"announcement","permalink":"/blog/tags/announcement","count":3},{"label":"early access","permalink":"/blog/tags/early-access","count":2},{"label":"release","permalink":"/blog/tags/release","count":1},{"label":"sustainability","permalink":"/blog/tags/sustainability","count":1},{"label":"partnerships","permalink":"/blog/tags/partnerships","count":1},{"label":"Discord","permalink":"/blog/tags/discord","count":3},{"label":"feedback","permalink":"/blog/tags/feedback","count":4},{"label":"improvement","permalink":"/blog/tags/improvement","count":2},{"label":"development","permalink":"/blog/tags/development","count":3},{"label":"April Fools","permalink":"/blog/tags/april-fools","count":1},{"label":"startup","permalink":"/blog/tags/startup","count":1},{"label":"software","permalink":"/blog/tags/software","count":1},{"label":"subscription model","permalink":"/blog/tags/subscription-model","count":1},{"label":"UI Update","permalink":"/blog/tags/ui-update","count":1},{"label":"Beta Testing","permalink":"/blog/tags/beta-testing","count":1},{"label":"Community Feedback","permalink":"/blog/tags/community-feedback","count":2},{"label":"Exclusive Preview","permalink":"/blog/tags/exclusive-preview","count":1},{"label":"Microsoft Store","permalink":"/blog/tags/microsoft-store","count":1},{"label":"Gaming Servers","permalink":"/blog/tags/gaming-servers","count":1},{"label":"Game Development","permalink":"/blog/tags/game-development","count":1},{"label":"Software Updates","permalink":"/blog/tags/software-updates","count":1},{"label":"Gaming Community","permalink":"/blog/tags/gaming-community","count":1},{"label":"UI Redesign","permalink":"/blog/tags/ui-redesign","count":1},{"label":"Development Milestones","permalink":"/blog/tags/development-milestones","count":1},{"label":"Tech Progress","permalink":"/blog/tags/tech-progress","count":1},{"label":"Future Features","permalink":"/blog/tags/future-features","count":1},{"label":"GameVault Journey","permalink":"/blog/tags/game-vault-journey","count":1},{"label":"Coding Chronicle","permalink":"/blog/tags/coding-chronicle","count":1},{"label":"November Update","permalink":"/blog/tags/november-update","count":1},{"label":"roadmap","permalink":"/blog/tags/roadmap","count":1},{"label":"collaboration","permalink":"/blog/tags/collaboration","count":1},{"label":"GitHub","permalink":"/blog/tags/git-hub","count":1},{"label":"voting","permalink":"/blog/tags/voting","count":2},{"label":"Kanban Board","permalink":"/blog/tags/kanban-board","count":1},{"label":"Council Member","permalink":"/blog/tags/council-member","count":1},{"label":"polls","permalink":"/blog/tags/polls","count":1},{"label":"gaming experience","permalink":"/blog/tags/gaming-experience","count":1},{"label":"GameVault milestone","permalink":"/blog/tags/game-vault-milestone","count":1},{"label":"official installations","permalink":"/blog/tags/official-installations","count":1},{"label":"Discord community growth","permalink":"/blog/tags/discord-community-growth","count":1},{"label":"gratitude","permalink":"/blog/tags/gratitude","count":1},{"label":"love for GameVault","permalink":"/blog/tags/love-for-game-vault","count":1},{"label":"upcoming update","permalink":"/blog/tags/upcoming-update","count":1},{"label":"Installation Pipeline","permalink":"/blog/tags/installation-pipeline","count":1},{"label":"simplifying game installation","permalink":"/blog/tags/simplifying-game-installation","count":1},{"label":"GitHub issue","permalink":"/blog/tags/git-hub-issue","count":1},{"label":"subscription to Updates role","permalink":"/blog/tags/subscription-to-updates-role","count":1},{"label":"Lemmy community launch","permalink":"/blog/tags/lemmy-community-launch","count":1},{"label":"sharing blog posts","permalink":"/blog/tags/sharing-blog-posts","count":1},{"label":"spreading the word","permalink":"/blog/tags/spreading-the-word","count":2},{"label":"support request","permalink":"/blog/tags/support-request","count":1},{"label":"continued support","permalink":"/blog/tags/continued-support","count":1},{"label":"celebration of achievements","permalink":"/blog/tags/celebration-of-achievements","count":1},{"label":"app name migration","permalink":"/blog/tags/app-name-migration","count":1},{"label":"Microsoft Store publication","permalink":"/blog/tags/microsoft-store-publication","count":1},{"label":"surge of new users","permalink":"/blog/tags/surge-of-new-users","count":1},{"label":"Discord server promotion","permalink":"/blog/tags/discord-server-promotion","count":1},{"label":"logo deciphering","permalink":"/blog/tags/logo-deciphering","count":1},{"label":"box representation","permalink":"/blog/tags/box-representation","count":1},{"label":"keyhole representation","permalink":"/blog/tags/keyhole-representation","count":1},{"label":"logo concept discussion","permalink":"/blog/tags/logo-concept-discussion","count":1},{"label":"Discord channel","permalink":"/blog/tags/discord-channel","count":2},{"label":"name migration progress","permalink":"/blog/tags/name-migration-progress","count":1},{"label":"backend application migration","permalink":"/blog/tags/backend-application-migration","count":1},{"label":"documentation migration","permalink":"/blog/tags/documentation-migration","count":1},{"label":"domain acquisition","permalink":"/blog/tags/domain-acquisition","count":1},{"label":"Subreddit migration","permalink":"/blog/tags/subreddit-migration","count":1},{"label":"Lemmy community","permalink":"/blog/tags/lemmy-community","count":1},{"label":"Client Application update","permalink":"/blog/tags/client-application-update","count":1},{"label":"testing","permalink":"/blog/tags/testing","count":1},{"label":"new logo","permalink":"/blog/tags/new-logo","count":1},{"label":"speculation","permalink":"/blog/tags/speculation","count":1},{"label":"migration finalization","permalink":"/blog/tags/migration-finalization","count":1},{"label":"poll results","permalink":"/blog/tags/poll-results","count":1},{"label":"renaming app","permalink":"/blog/tags/renaming-app","count":1},{"label":"GameStash","permalink":"/blog/tags/game-stash","count":1},{"label":"GameShelf","permalink":"/blog/tags/game-shelf","count":1},{"label":"Harbor","permalink":"/blog/tags/harbor","count":1},{"label":"GameHub","permalink":"/blog/tags/game-hub","count":1},{"label":"market analysis","permalink":"/blog/tags/market-analysis","count":1},{"label":"new name announcement","permalink":"/blog/tags/new-name-announcement","count":1},{"label":"GameVault domain","permalink":"/blog/tags/game-vault-domain","count":1},{"label":"special thanks","permalink":"/blog/tags/special-thanks","count":1},{"label":"Selfhosted Podcast","permalink":"/blog/tags/selfhosted-podcast","count":1},{"label":"Self-Hosted Newsletter","permalink":"/blog/tags/self-hosted-newsletter","count":1},{"label":"transition process","permalink":"/blog/tags/transition-process","count":1},{"label":"source-available software","permalink":"/blog/tags/source-available-software","count":1},{"label":"open-source","permalink":"/blog/tags/open-source","count":1},{"label":"transparency","permalink":"/blog/tags/transparency","count":1},{"label":"control","permalink":"/blog/tags/control","count":1},{"label":"software development","permalink":"/blog/tags/software-development","count":1},{"label":"code access","permalink":"/blog/tags/code-access","count":1},{"label":"hybrid model","permalink":"/blog/tags/hybrid-model","count":1},{"label":"software licensing","permalink":"/blog/tags/software-licensing","count":1},{"label":"revenue generation","permalink":"/blog/tags/revenue-generation","count":1},{"label":"user engagement","permalink":"/blog/tags/user-engagement","count":1},{"label":"harassment","permalink":"/blog/tags/harassment","count":1},{"label":"blackmail","permalink":"/blog/tags/blackmail","count":1},{"label":"threats","permalink":"/blog/tags/threats","count":1},{"label":"spam","permalink":"/blog/tags/spam","count":1},{"label":"trolls","permalink":"/blog/tags/trolls","count":1},{"label":"negative narratives","permalink":"/blog/tags/negative-narratives","count":1},{"label":"safe environment","permalink":"/blog/tags/safe-environment","count":1},{"label":"racist","permalink":"/blog/tags/racist","count":1},{"label":"developers","permalink":"/blog/tags/developers","count":1},{"label":"public","permalink":"/blog/tags/public","count":1},{"label":"creepy behavior","permalink":"/blog/tags/creepy-behavior","count":1},{"label":"app","permalink":"/blog/tags/app","count":1},{"label":"support","permalink":"/blog/tags/support","count":1},{"label":"financial assistance","permalink":"/blog/tags/financial-assistance","count":1},{"label":"motivation","permalink":"/blog/tags/motivation","count":1},{"label":"GameVault app","permalink":"/blog/tags/game-vault-app","count":1},{"label":"bugs","permalink":"/blog/tags/bugs","count":1},{"label":"feature requests","permalink":"/blog/tags/feature-requests","count":1},{"label":"success","permalink":"/blog/tags/success","count":1},{"label":"engagement","permalink":"/blog/tags/engagement","count":1},{"label":"source-available","permalink":"/blog/tags/source-available","count":2},{"label":"gaming platform","permalink":"/blog/tags/gaming-platform","count":1},{"label":"new name","permalink":"/blog/tags/new-name","count":1},{"label":"family-friendly","permalink":"/blog/tags/family-friendly","count":1},{"label":"poll","permalink":"/blog/tags/poll","count":1},{"label":"AI-generated names","permalink":"/blog/tags/ai-generated-names","count":1},{"label":"inclusivity","permalink":"/blog/tags/inclusivity","count":1},{"label":"user participation","permalink":"/blog/tags/user-participation","count":1},{"label":"decision-making","permalink":"/blog/tags/decision-making","count":1},{"label":"platform values","permalink":"/blog/tags/platform-values","count":1},{"label":"future development","permalink":"/blog/tags/future-development","count":1},{"label":"alternative","permalink":"/blog/tags/alternative","count":1},{"label":"cloud-based game platforms","permalink":"/blog/tags/cloud-based-game-platforms","count":1},{"label":"DRM-free games","permalink":"/blog/tags/drm-free-games","count":1},{"label":"file server","permalink":"/blog/tags/file-server","count":1},{"label":"multi-user authentication","permalink":"/blog/tags/multi-user-authentication","count":1},{"label":"RAWG API","permalink":"/blog/tags/rawg-api","count":1},{"label":"health monitoring","permalink":"/blog/tags/health-monitoring","count":1},{"label":"Discord server","permalink":"/blog/tags/discord-server","count":1},{"label":"Reddit forum","permalink":"/blog/tags/reddit-forum","count":1},{"label":"Lemmy forum","permalink":"/blog/tags/lemmy-forum","count":1}]}')}}]); \ No newline at end of file diff --git a/assets/js/3a2db09e.e67441da.js b/assets/js/3a2db09e.e67441da.js new file mode 100644 index 000000000..1cb56a497 --- /dev/null +++ b/assets/js/3a2db09e.e67441da.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[8121],{8070:a=>{a.exports=JSON.parse('{"tags":[{"label":"GameVault","permalink":"/blog/tags/game-vault","count":10},{"label":"update","permalink":"/blog/tags/update","count":2},{"label":"Steam integration","permalink":"/blog/tags/steam-integration","count":1},{"label":"Discord integration","permalink":"/blog/tags/discord-integration","count":1},{"label":"Family & Friends Plan","permalink":"/blog/tags/family-friends-plan","count":1},{"label":"holidays","permalink":"/blog/tags/holidays","count":1},{"label":"Christmas theme","permalink":"/blog/tags/christmas-theme","count":1},{"label":"new features","permalink":"/blog/tags/new-features","count":1},{"label":"bug fixes","permalink":"/blog/tags/bug-fixes","count":1},{"label":"gaming","permalink":"/blog/tags/gaming","count":5},{"label":"community feedback","permalink":"/blog/tags/community-feedback","count":3},{"label":"Phalcode","permalink":"/blog/tags/phalcode","count":1},{"label":"Client Update","permalink":"/blog/tags/client-update","count":1},{"label":"Server Update","permalink":"/blog/tags/server-update","count":1},{"label":"metadata framework","permalink":"/blog/tags/metadata-framework","count":1},{"label":"plugin system","permalink":"/blog/tags/plugin-system","count":1},{"label":"parental control","permalink":"/blog/tags/parental-control","count":1},{"label":"age restrictions","permalink":"/blog/tags/age-restrictions","count":1},{"label":"theme","permalink":"/blog/tags/theme","count":1},{"label":"app optimization","permalink":"/blog/tags/app-optimization","count":1},{"label":"analytics","permalink":"/blog/tags/analytics","count":1},{"label":"notes","permalink":"/blog/tags/notes","count":1},{"label":"community management","permalink":"/blog/tags/community-management","count":1},{"label":"game","permalink":"/blog/tags/game","count":1},{"label":"metadata","permalink":"/blog/tags/metadata","count":2},{"label":"database","permalink":"/blog/tags/database","count":1},{"label":"videogame","permalink":"/blog/tags/videogame","count":1},{"label":"RAWG","permalink":"/blog/tags/rawg","count":1},{"label":"IGDB","permalink":"/blog/tags/igdb","count":1},{"label":"twitch.tv","permalink":"/blog/tags/twitch-tv","count":1},{"label":"API","permalink":"/blog/tags/api","count":2},{"label":"partnership","permalink":"/blog/tags/partnership","count":1},{"label":"community","permalink":"/blog/tags/community","count":4},{"label":"solution","permalink":"/blog/tags/solution","count":1},{"label":"Steam","permalink":"/blog/tags/steam","count":1},{"label":"backend","permalink":"/blog/tags/backend","count":1},{"label":"features","permalink":"/blog/tags/features","count":3},{"label":"easter egg","permalink":"/blog/tags/easter-egg","count":1},{"label":"self-hosted","permalink":"/blog/tags/self-hosted","count":2},{"label":"platform","permalink":"/blog/tags/platform","count":2},{"label":"DRM-free","permalink":"/blog/tags/drm-free","count":1},{"label":"video games","permalink":"/blog/tags/video-games","count":1},{"label":"subscription","permalink":"/blog/tags/subscription","count":1},{"label":"community-driven","permalink":"/blog/tags/community-driven","count":1},{"label":"updates","permalink":"/blog/tags/updates","count":1},{"label":"announcement","permalink":"/blog/tags/announcement","count":3},{"label":"early access","permalink":"/blog/tags/early-access","count":2},{"label":"release","permalink":"/blog/tags/release","count":1},{"label":"sustainability","permalink":"/blog/tags/sustainability","count":1},{"label":"partnerships","permalink":"/blog/tags/partnerships","count":1},{"label":"Discord","permalink":"/blog/tags/discord","count":3},{"label":"feedback","permalink":"/blog/tags/feedback","count":4},{"label":"improvement","permalink":"/blog/tags/improvement","count":2},{"label":"development","permalink":"/blog/tags/development","count":3},{"label":"April Fools","permalink":"/blog/tags/april-fools","count":1},{"label":"startup","permalink":"/blog/tags/startup","count":1},{"label":"software","permalink":"/blog/tags/software","count":1},{"label":"subscription model","permalink":"/blog/tags/subscription-model","count":1},{"label":"UI Update","permalink":"/blog/tags/ui-update","count":1},{"label":"Beta Testing","permalink":"/blog/tags/beta-testing","count":1},{"label":"Exclusive Preview","permalink":"/blog/tags/exclusive-preview","count":1},{"label":"Microsoft Store","permalink":"/blog/tags/microsoft-store","count":1},{"label":"Gaming Servers","permalink":"/blog/tags/gaming-servers","count":1},{"label":"Game Development","permalink":"/blog/tags/game-development","count":1},{"label":"Software Updates","permalink":"/blog/tags/software-updates","count":1},{"label":"Gaming Community","permalink":"/blog/tags/gaming-community","count":1},{"label":"UI Redesign","permalink":"/blog/tags/ui-redesign","count":1},{"label":"Development Milestones","permalink":"/blog/tags/development-milestones","count":1},{"label":"Tech Progress","permalink":"/blog/tags/tech-progress","count":1},{"label":"Future Features","permalink":"/blog/tags/future-features","count":1},{"label":"GameVault Journey","permalink":"/blog/tags/game-vault-journey","count":1},{"label":"Coding Chronicle","permalink":"/blog/tags/coding-chronicle","count":1},{"label":"November Update","permalink":"/blog/tags/november-update","count":1},{"label":"roadmap","permalink":"/blog/tags/roadmap","count":1},{"label":"collaboration","permalink":"/blog/tags/collaboration","count":1},{"label":"GitHub","permalink":"/blog/tags/git-hub","count":1},{"label":"voting","permalink":"/blog/tags/voting","count":2},{"label":"Kanban Board","permalink":"/blog/tags/kanban-board","count":1},{"label":"Council Member","permalink":"/blog/tags/council-member","count":1},{"label":"polls","permalink":"/blog/tags/polls","count":1},{"label":"gaming experience","permalink":"/blog/tags/gaming-experience","count":1},{"label":"GameVault milestone","permalink":"/blog/tags/game-vault-milestone","count":1},{"label":"official installations","permalink":"/blog/tags/official-installations","count":1},{"label":"Discord community growth","permalink":"/blog/tags/discord-community-growth","count":1},{"label":"gratitude","permalink":"/blog/tags/gratitude","count":1},{"label":"love for GameVault","permalink":"/blog/tags/love-for-game-vault","count":1},{"label":"upcoming update","permalink":"/blog/tags/upcoming-update","count":1},{"label":"Installation Pipeline","permalink":"/blog/tags/installation-pipeline","count":1},{"label":"simplifying game installation","permalink":"/blog/tags/simplifying-game-installation","count":1},{"label":"GitHub issue","permalink":"/blog/tags/git-hub-issue","count":1},{"label":"subscription to Updates role","permalink":"/blog/tags/subscription-to-updates-role","count":1},{"label":"Lemmy community launch","permalink":"/blog/tags/lemmy-community-launch","count":1},{"label":"sharing blog posts","permalink":"/blog/tags/sharing-blog-posts","count":1},{"label":"spreading the word","permalink":"/blog/tags/spreading-the-word","count":2},{"label":"support request","permalink":"/blog/tags/support-request","count":1},{"label":"continued support","permalink":"/blog/tags/continued-support","count":1},{"label":"celebration of achievements","permalink":"/blog/tags/celebration-of-achievements","count":1},{"label":"app name migration","permalink":"/blog/tags/app-name-migration","count":1},{"label":"Microsoft Store publication","permalink":"/blog/tags/microsoft-store-publication","count":1},{"label":"surge of new users","permalink":"/blog/tags/surge-of-new-users","count":1},{"label":"Discord server promotion","permalink":"/blog/tags/discord-server-promotion","count":1},{"label":"logo deciphering","permalink":"/blog/tags/logo-deciphering","count":1},{"label":"box representation","permalink":"/blog/tags/box-representation","count":1},{"label":"keyhole representation","permalink":"/blog/tags/keyhole-representation","count":1},{"label":"logo concept discussion","permalink":"/blog/tags/logo-concept-discussion","count":1},{"label":"Discord channel","permalink":"/blog/tags/discord-channel","count":2},{"label":"name migration progress","permalink":"/blog/tags/name-migration-progress","count":1},{"label":"backend application migration","permalink":"/blog/tags/backend-application-migration","count":1},{"label":"documentation migration","permalink":"/blog/tags/documentation-migration","count":1},{"label":"domain acquisition","permalink":"/blog/tags/domain-acquisition","count":1},{"label":"Subreddit migration","permalink":"/blog/tags/subreddit-migration","count":1},{"label":"Lemmy community","permalink":"/blog/tags/lemmy-community","count":1},{"label":"Client Application update","permalink":"/blog/tags/client-application-update","count":1},{"label":"testing","permalink":"/blog/tags/testing","count":1},{"label":"new logo","permalink":"/blog/tags/new-logo","count":1},{"label":"speculation","permalink":"/blog/tags/speculation","count":1},{"label":"migration finalization","permalink":"/blog/tags/migration-finalization","count":1},{"label":"poll results","permalink":"/blog/tags/poll-results","count":1},{"label":"renaming app","permalink":"/blog/tags/renaming-app","count":1},{"label":"GameStash","permalink":"/blog/tags/game-stash","count":1},{"label":"GameShelf","permalink":"/blog/tags/game-shelf","count":1},{"label":"Harbor","permalink":"/blog/tags/harbor","count":1},{"label":"GameHub","permalink":"/blog/tags/game-hub","count":1},{"label":"market analysis","permalink":"/blog/tags/market-analysis","count":1},{"label":"new name announcement","permalink":"/blog/tags/new-name-announcement","count":1},{"label":"GameVault domain","permalink":"/blog/tags/game-vault-domain","count":1},{"label":"special thanks","permalink":"/blog/tags/special-thanks","count":1},{"label":"Selfhosted Podcast","permalink":"/blog/tags/selfhosted-podcast","count":1},{"label":"Self-Hosted Newsletter","permalink":"/blog/tags/self-hosted-newsletter","count":1},{"label":"transition process","permalink":"/blog/tags/transition-process","count":1},{"label":"source-available software","permalink":"/blog/tags/source-available-software","count":1},{"label":"open-source","permalink":"/blog/tags/open-source","count":1},{"label":"transparency","permalink":"/blog/tags/transparency","count":1},{"label":"control","permalink":"/blog/tags/control","count":1},{"label":"software development","permalink":"/blog/tags/software-development","count":1},{"label":"code access","permalink":"/blog/tags/code-access","count":1},{"label":"hybrid model","permalink":"/blog/tags/hybrid-model","count":1},{"label":"software licensing","permalink":"/blog/tags/software-licensing","count":1},{"label":"revenue generation","permalink":"/blog/tags/revenue-generation","count":1},{"label":"user engagement","permalink":"/blog/tags/user-engagement","count":1},{"label":"harassment","permalink":"/blog/tags/harassment","count":1},{"label":"blackmail","permalink":"/blog/tags/blackmail","count":1},{"label":"threats","permalink":"/blog/tags/threats","count":1},{"label":"spam","permalink":"/blog/tags/spam","count":1},{"label":"trolls","permalink":"/blog/tags/trolls","count":1},{"label":"negative narratives","permalink":"/blog/tags/negative-narratives","count":1},{"label":"safe environment","permalink":"/blog/tags/safe-environment","count":1},{"label":"racist","permalink":"/blog/tags/racist","count":1},{"label":"developers","permalink":"/blog/tags/developers","count":1},{"label":"public","permalink":"/blog/tags/public","count":1},{"label":"creepy behavior","permalink":"/blog/tags/creepy-behavior","count":1},{"label":"app","permalink":"/blog/tags/app","count":1},{"label":"support","permalink":"/blog/tags/support","count":1},{"label":"financial assistance","permalink":"/blog/tags/financial-assistance","count":1},{"label":"motivation","permalink":"/blog/tags/motivation","count":1},{"label":"GameVault app","permalink":"/blog/tags/game-vault-app","count":1},{"label":"bugs","permalink":"/blog/tags/bugs","count":1},{"label":"feature requests","permalink":"/blog/tags/feature-requests","count":1},{"label":"success","permalink":"/blog/tags/success","count":1},{"label":"engagement","permalink":"/blog/tags/engagement","count":1},{"label":"source-available","permalink":"/blog/tags/source-available","count":2},{"label":"gaming platform","permalink":"/blog/tags/gaming-platform","count":1},{"label":"new name","permalink":"/blog/tags/new-name","count":1},{"label":"family-friendly","permalink":"/blog/tags/family-friendly","count":1},{"label":"poll","permalink":"/blog/tags/poll","count":1},{"label":"AI-generated names","permalink":"/blog/tags/ai-generated-names","count":1},{"label":"inclusivity","permalink":"/blog/tags/inclusivity","count":1},{"label":"user participation","permalink":"/blog/tags/user-participation","count":1},{"label":"decision-making","permalink":"/blog/tags/decision-making","count":1},{"label":"platform values","permalink":"/blog/tags/platform-values","count":1},{"label":"future development","permalink":"/blog/tags/future-development","count":1},{"label":"alternative","permalink":"/blog/tags/alternative","count":1},{"label":"cloud-based game platforms","permalink":"/blog/tags/cloud-based-game-platforms","count":1},{"label":"DRM-free games","permalink":"/blog/tags/drm-free-games","count":1},{"label":"file server","permalink":"/blog/tags/file-server","count":1},{"label":"multi-user authentication","permalink":"/blog/tags/multi-user-authentication","count":1},{"label":"RAWG API","permalink":"/blog/tags/rawg-api","count":1},{"label":"health monitoring","permalink":"/blog/tags/health-monitoring","count":1},{"label":"Discord server","permalink":"/blog/tags/discord-server","count":1},{"label":"Reddit forum","permalink":"/blog/tags/reddit-forum","count":1},{"label":"Lemmy forum","permalink":"/blog/tags/lemmy-forum","count":1}]}')}}]); \ No newline at end of file diff --git a/assets/js/3fc2248c.91447b6e.js b/assets/js/3fc2248c.ed661fae.js similarity index 55% rename from assets/js/3fc2248c.91447b6e.js rename to assets/js/3fc2248c.ed661fae.js index b6acfd674..270f64e16 100644 --- a/assets/js/3fc2248c.91447b6e.js +++ b/assets/js/3fc2248c.ed661fae.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[2762],{2674:a=>{a.exports=JSON.parse('{"tag":{"label":"Community Feedback","permalink":"/blog/tags/community-feedback","allTagsPath":"/blog/tags","count":2,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/community-feedback","page":1,"postsPerPage":10,"totalPages":1,"totalCount":2,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[2762],{2674:a=>{a.exports=JSON.parse('{"tag":{"label":"community feedback","permalink":"/blog/tags/community-feedback","allTagsPath":"/blog/tags","count":3,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/community-feedback","page":1,"postsPerPage":10,"totalPages":1,"totalCount":3,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/435302bb.850f7323.js b/assets/js/435302bb.6191006a.js similarity index 99% rename from assets/js/435302bb.850f7323.js rename to assets/js/435302bb.6191006a.js index 4d6a70698..68d1d8191 100644 --- a/assets/js/435302bb.850f7323.js +++ b/assets/js/435302bb.6191006a.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":1734306618000,"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":1734876603000,"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.8dce9614.js b/assets/js/438c7fa2.98523517.js similarity index 97% rename from assets/js/438c7fa2.8dce9614.js rename to assets/js/438c7fa2.98523517.js index 224c6fb90..229ee0b2f 100644 --- a/assets/js/438c7fa2.8dce9614.js +++ b/assets/js/438c7fa2.98523517.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":1734306618000,"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":1734876603000,"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.d5578bd2.js b/assets/js/4a631206.855ca39a.js similarity index 98% rename from assets/js/4a631206.d5578bd2.js rename to assets/js/4a631206.855ca39a.js index 9e89e516d..d69bd5172 100644 --- a/assets/js/4a631206.d5578bd2.js +++ b/assets/js/4a631206.855ca39a.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":1734306618000,"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":1734876603000,"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.98e247d0.js b/assets/js/4d393b3e.bd181910.js similarity index 98% rename from assets/js/4d393b3e.98e247d0.js rename to assets/js/4d393b3e.bd181910.js index 72e90ba32..024a23b84 100644 --- a/assets/js/4d393b3e.98e247d0.js +++ b/assets/js/4d393b3e.bd181910.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":1734306618000,"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":1734876603000,"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.533b671c.js b/assets/js/5046667d.72042cc4.js similarity index 98% rename from assets/js/5046667d.533b671c.js rename to assets/js/5046667d.72042cc4.js index 0434cefe2..e4aa9e3ab 100644 --- a/assets/js/5046667d.533b671c.js +++ b/assets/js/5046667d.72042cc4.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":1734306618000,"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":1734876603000,"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.dec6c671.js b/assets/js/51e7bf36.98cc075b.js similarity index 99% rename from assets/js/51e7bf36.dec6c671.js rename to assets/js/51e7bf36.98cc075b.js index 2fd87afce..a08bab947 100644 --- a/assets/js/51e7bf36.dec6c671.js +++ b/assets/js/51e7bf36.98cc075b.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":1734306618000,"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":1734876603000,"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/54fdb83d.35c0ea3f.js b/assets/js/54fdb83d.35c0ea3f.js new file mode 100644 index 000000000..fa8a2b705 --- /dev/null +++ b/assets/js/54fdb83d.35c0ea3f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[3449],{9357:a=>{a.exports=JSON.parse('{"tag":{"label":"Discord integration","permalink":"/blog/tags/discord-integration","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/discord-integration","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/5b1700d1.bcd0910f.js b/assets/js/5b1700d1.697e304f.js similarity index 99% rename from assets/js/5b1700d1.bcd0910f.js rename to assets/js/5b1700d1.697e304f.js index 12d461692..d775e8fe9 100644 --- a/assets/js/5b1700d1.bcd0910f.js +++ b/assets/js/5b1700d1.697e304f.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":1734306618000,"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":1734876603000,"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,iVBORw0KGgoAAAANSUhEUgAAAlYAAAFgCAIAAAD2DKBlAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAkj0lEQVR42u3df3xT9aHw8b72vO7r2e697tl2HC0gaYsIsW5lSOp1ckXGAN3lutU7uqowFn0CVYfuoeMGEZRgAW2rhRGNivgDmfxKFAoWehUC+upaAzRFSEtLE1rSAuWHQKGUkrY5zx9f/HpISlfW8iPp5/3qH+3JycnJSc2H7/ec1Jh+0SVpRMKIyYOv6C6J+ltuG6brP6Bfv379BsT3Hzxcl5h0S7/+/RKTBujvjh98p27wcF38oP7xg/oPvlM3IL5/v/79bk0ecOsdAwYk9B98py5+UP9+/fol3j5g0M90A+L7Dxo6IDFpwC3x/UJuSron4Zd/Sho2/lb93fE//UXiL56+fdj4W/v1v4L9HDF5cNKIhAh6LZ599tnf/e53/XCtjBkzJjs7e9HlZWdnjxkzplv/fXVEuRK8TNdO/0T5bewv5sU8+Ejk7PoD/+eRF3446Fo8UkwUvhFkJg28Y8CNtldD7oofk5l07+NDUn47aIRx8C//lHT7z+O7fveBdwwYk5kUWS8ECbzGBg8ePHr06DGXN3r06MGDB3fnIUhgBOkzbt73xv4mrn+/frc+ctPEl//l3nti/vByZH8Zsy/zlRNjzIl5LLeDr8c7/Hrl269r+ZL0vSaG3j/w7odv63uD6de/75AU3fDfDBr+61uT/j1BN6j/Fd397odvG3r/wL7AddX9BHIMr52E8T/8teV//eGlmN/P/+f7f3sj7+l1/IdCTOSmrhMjpw75yaiEqPlN/smohJFTh/BfNEggepWISeCNduAG3nHL2BlJQ/5NFwW/BEP+TTd2RtLAO27hvwdcd7d3hAQicosYEzXZCzF4uG7sjKQ77ovsseAd9yWMnZE0eLiO336QQKDHcxiawIEDBw4ZMkQPAEAkGzJkyMCBA68ggQMHDuSoAQCiRucVvCSBjP8AAFE2FuxqAjlYAIAoQwIBACTw8gns27cvRwoAEGU6vIL05l/nfHf0L2K0n3DgSAEAoi+B4RX8NoHykxYcKQBAVCYwpIIXE6j9sCFHCgAQZW7+z4XfHTXqYgVT/hzzuydi+/W7+cFsEggAiHLK+AUygX1TMr9J4MskEADQGxJ4XwcJ/AUJBAD02gQmanCkAADRnEDD9Ji0jNi+fRkFAgCiX5/75sRMmNKnX9++A375o19ndZzAuLg4jhQAIMrEDXjgB6lZ35k0/zsTZ3//gWdj0qbG9u17838u/DaBcXFxJBAAEIUJjIuLi4vr8P87SAIBANEs5tF5MRNfjJmUFTNpfsyk+TG/XxAzeeHFL9k/EggAiNZRYIcDQRIIAOitCYzT4EgBAKI1geEVJIEAABJIAgEAUZ3AkAqSQAAACSSBAIBoT6C2giQQANDrExgbG8uRAgBEmdjYWBIIACCBl1SQBAIAekcCbzf979Q/9AlPYGxsLAkEAERlAmNjY+PidMqYOf9y1+1x1zGBDodDVVVVVR0OR9Qfd7PZ3NTUpKqq1+vltxAArmcC+6be9PAzP7olLi7u3h/817x/HvfUdyfO7/kEjho1Kj8///Tp08FgUFXVc+fOFRcXm0wmEggAuF4JjDU8/U9jHoyLu5jA7zw09ebBhhjZvx5J4Pjx4/ft2yfip3X69GmLxUICAQDXI4GGHzz43PcvToLe+4P/mvevhviLE6E9mMBNmzYFg8FgMOjz+V566aXZs2d//vnnbW1tqqpWVVU98MADJBAAcK0TmDjxew89/uO4bxN4051xPZxAo9HY0NCgquqJEyemTZsmFg4fPryiokJV1bNnz86aNUsmcOvWrbW1tcFgsK2tbe/evZMnT5brr1+/vrGxUaT0+PHj77zzjvZR3nnnnePHj4tbGxsb169fP3z4cHHT5MmTd+/e3dLSoqpqW1tbXV3dyy+/LO9oMpn27t174cIFVVVbWlqKi4vT09PDn4XX61VV9eDBg3v37m1rawsGg0ePHtVuJ+RRqqqqzGazvPXll18WuxcIBHbv3n3u3DkSCADXN4E33zvjez9PibuqCczNzT1//ryqqm63W7t8zZo1lZWVHo9n3rx5MoEhSkpKRP+Ki4tD5lHb2trWr18vNrV+/XoxppSCwWBxcfHw4cPT09Pr6urEkubmZrFaU1NTVlaWXq+fOnXqkSNHQh60srJy/PjxHSYwRGNj4+zZsy+3nTNnzohpXovFcubMmfC7k0AAuH4JHHfTb5/5QXzs1U2gzWYLBAKyZx2SCdy/f//UqVMXLFhw8uRJVVWPHDkyceLEV199VUTU5/NNmzZt3rx5R48eFQWaMWNGZmbm6dOnVVU9evTovHnzpk2b5vP5xJAuLy9vyZIlFy5caG9vt9vter0+Ly9PDNSKior0ev2uXbtUVQ0EAna7PS0tbcuWLW1tbe3t7R9++GGHCWxpaVmzZo1cUz4pp9MpRq5btmxJS0tbs2aNeJSKiorhw4eLR2lraysoKEhLSysoKBD3JYEAcN0S+JPH/+n+hzQfkL+YwLi4uJ5M4Jo1a8QArisJlOcCRXLOnDkzY8aMrVu3ilDZbDa5fjAYFK368MMP29vbg8GgvK+M7tatW0UCVVUtKyubPHnyqFGjMjMzzWaz0WiUM7Q+n0/Mmj755JMnTpzocFfF/jQ0NBiNRr1mdre+vv7ZZ5+tr6/X3jp8+PDq6mpxvc+SJUvEADH8viQQAK6XH47975t+OqDDvxETE6txLUeBIQlsamoym81ut1t+H7LNTZs2bdq0KSSQ8noTt9s9fvz4yspKOfd47tw5t9sttiNX68oUZUgCtUsWL14swqm9V0lJiaqqzc3N69atE7Og8lYSCADXXcyEZ2PSnov53ZyY9DkxD78Q88jcmEfnxTw6L2biiz2ZwMudC8zNzc3Pz//oo4/++Mc/Xr0E6vX6UaNG2e12cTWKeJTm5ubc3Fy52oULF5outWfPnp5KoMPhEPO0JBAAbhzazF3FUeDUqVNFIU6cODF16lSxUF4R2tzcnJWV1XkCxUSoOLcnR40hE6Ht7e2rVq0KCeTWrVuNRqPZbM7MzBw1atT48ePtdrs4S/fll1/Kac+DBw/K61/EauHPIiSBjz/++LFjx8R9n3nmGTEReujQIXE1aYcTofJWEggAvSWB+m+uFgkGg5WVleJzgSUlJeKSkAMHDnT4uUBtAuU1LB1eDjNjxozGxsbLXQ4jx4hvvfWWXq+XK4sBorhQJRgMlpaWTp48eerUqaWlpUeOHJGpDkmguBxm/Pjxn332mdj/7du36/X67du3iwteuBwGAEjgJUJOyHXlr8NoE9idD0XIjytoPxTR0tLy2muv6S/zYQZ5a3gC+VAEAPSiBPbp06dHHkz8jVDx2XZxWcquXbs6+Ruh2gTqu/fReJPJpP3Qen19/SuvvCLvKD7SLs5Wilu1H3gPSeCJEyd27doVCAS689H44uLigwcPkkAAuI769Olz7RIY6cIvhwEAkEASCAAggSQQAEACSSAAICISGFJBEggAIIEkEABAAgEAIIEAAJBAAABIIAAAJBAAABIIAAAJBADgRk9gfHx8fHy8TqfT6XQcKQAAo0AAAEggAAAkEAAAEggAAAkEAIAEAgBAAgEAIIEAAJBAAABIIAAAJBAAABIIAAAJBACABAIAQAIBACCBAACQQAAASCAAACQQAEACSSAAgASSQAAACSSBAIBekMDbRj/69Kx5gnnKr4bExcXFTfrvl0ggACCaDerT54Gpsy3PTvmPn8bG/vQ/pj0///knfkUCAQDRb0yfPkl3jfj5nbeJ2P3qiefn//lREggA6BUJjL3rN1P+fHEidP78+SQQANBLEvizR/70wpxp6aN+yigQANC7EniPccYLszIevHNw7E9GpU2bwygQANBbEthn0Dhj5mzLvHnz5s2ZPu3/PT/f/JjhOibQbDZ7vV6j0djhrU6n02az8bIBALrv2n0u0GazBQIBVVVVVfV6vVeaQKPR2NDQIO5eUlLCKwcAiKQEOp1OETOv12s2m0tKSlRVDQQCYmAnfmxoaBAJ9Hq94keZQ4fD4ff7/X4/A0EAQAQncPXq1aWlpXLYl5+f7/f7jUajw+FoaGhYunSpuNXhcDgcDl4nAEBkJ1A7ERpSxC1btogf5USoGAU2NTWZzWZeJwBANIwC5Y/l5eXho0Dx49KlSwsKChgFAgCiMIH6b07+hZwLFOf/li5d6na7GQUCAKIhgQAAkEAAAEggAAAkEAAAEggAAAkEAIAEAgBAAgEAuJoJjI+P132DIwUAYBT4j0hOTjYYDCkAAHSbwWBITk6OmAQaDIbExEQdAADdlpiYaDAYIiaBKSkpvGYAgJ6SkpJCAgEAJJAEAgBIIAkEAJBAEggAIIEkEABAAkkgAIAEkkAAAAnsrQk0mUxOpzM1NVWn0xUWFloslpAVLBZLYWHhlW62w011ndPptFqt4Qt9GlarNTU11eVyVVVVWSwWq9Uqb3K5XOIZXY7FYikqKkpNTQ3fpvaAdPJ07HZ7+B52/oiXO4xWq9Vut4cstNvt4QsBIDoTaLfb/+4bdy9PYH5+vslk0ul0qampRUVFFovFZDK5XC6x0Gq1dr1JMoEdbpMEAiCB1yKBcuwi+ieGNXJEIt46nU6nWCjeFn0+n8fjEW/cFoulqqpKLFm4cKHL5RL3km/oYn2fz+d0OrVv/fJNXL7jy/FQyDu7dgfERsJ3UjtEE0tEM8Sa4l5yBfHOHr5ZuY7H45FPpMMEWq1Wsc/i7mIU2GGTQvZKHq6ioqKQBIptyn8TFBUVaUeThYWFGzZskI8ljt6GDRvE1i53ELTHUKzpcrmWLVsmvhfPtKCgQPsCiderqqqqqKhIHCjx0PJxAUSTtLS0zZeRlpYW5QmUoZLjnpycHPGjLJPFYvF4PGJ04vF4xNuiaKHolmxhYWGhfB8XP5pMprfffls7jukkgdqdCXn7FjsgdtJut4fvpLYfYlgmHk4O5rQDHbkn8nm53W4xkyk34vF4Ohljyc1qR4F2uz2kQCF7tXDhQvkEw8fc2m3KRxfbFLfKA+t2u00mk9xCh/sv90r7bx1Z+pBxnvxGvjqi7mKhfGgA0VpBr9erPSPj9Xo771/UJlC8/2rHhXICTbuyKIocW8j1Fy5cKJokh0SyCmIY0ZUEhoyutDN44n08fCfD5y0LCwuLiopChnfaU27azYb0Uh4NOUTWNkD7FMITqK1UyF5p76j9PnybciJULpcTodrhdcjehjycPEpiyB6SQO2P4S3Uft/NKWUAkVXBrvQveiZCZcbkPJh449OOAjtJoPZ9XOYkJydHhEq7QndGgSEJDN/J8ASK1eTy8BW6ksAOj5i2Ex2Ot+QT6XoCQ7bZIwkMn/GWzQs53UgCAYgKdrF/0ZNAeS4q5I1Pvvl2ksCQJeId1mq1FhYW5ufnh0yshV8/IsedfzeBshayfyE7KR9dzs2KN275cNoVxKOEJ1C7TofnAsObJ3/U3kWOAkP2SjsRarVa5UTo5bYZMhEasnHtvwNCJkK1E9ThCQw/zuHHUx5qEgj0qgp2sX/RMxFaWFgopwe1c4wul0tcENFJAnWXXg4j3nNDTqSJGciqqqoNGzaIN315gUxZWZmcetVesRI+XCsrK9MOVcN3UneZy2HE+7vYt/DLYUISqN3by50LlE0Kz5XcK+2VI5e7HMbj8WhHw+HblFevyDF0yMbtdntZWVnn1wSFD/fFGT75iss50pDLYcSrQwIBRHMCtRnocOgAAEDUjgLlpwvk8AgAgOhPIAAAJBAAABIIAAAJBACABAIAQAIBACSQBAIASOANnUCDwZCYmMhrBgDovsTERIPBEDEJTE5ONhgMKQAAdJvBYEhOTo6YBAIAcKMhgQAAEkgCAQAkkAQCAEggCQQAkEAAAEggAACRTn7QMF4jISEhISGBBAIAGAWSQAAACQQAgAQCAEACAQAggQAAkEAAAEggAAARlMD4+Hj5sUGOFACAUSAAACQQAAASCAAACQQAgAQCAEACAQAggQAAkEAAAEggAAAkEAAAEggAAAkEAIAEAgBAAgEAIIEAAJBAAACiLoElJSUOh6M7WzAajW6322g08vIDAAm8RgksKSlRVVVV1a40zGw2l5aW9vgTttlsgUBAVdVAIGCz2fgNAAASeNUTaLPZ/H6/GHuVl5fbbDaHw6EtYmlpaUNDg6qqJSUlRqNRfO/1es1mc1NTk/her9c7HA6Hw2Gz2bxebyAQaGpqMpvNcv2Ghgaj0ShubWpqys/Pl9uRe+L1et1ut9wZAAAJvLoJ1E5gGo3Gt956S8xGGo1G0Tmv1+twOMQ3ImPl5eV6vb6goMBsNotGms1mmUDRMLFZufGQW202m9Pp1Ov1TqeTMR8A4PonUH/pPKcYFIrCyRN1MoFysCgGfDJyom3iRznFKgaR8taQ0SGvNwDgOiRQJk2v13u93h07dojRnhwFXi6BIpDho8CQBIq+ii3IW2022/LlyxkFAgCuZwL1YZfDhJ8LDElgIBAQbROrnTp1SvwYnkA52hNbk7eazWa/388oEABwnRMIAAAJBACABAIAQAIBACCBAACQQAAASCAAACQQAAASCADADZvA5ORkg8GQAgBAtxkMhuTk5IhJoMFgSExM1AEA0G2JiYkGgyFiEpiSksJrBgDoKSkpKSQQAEACSSAAgASSQAAACSSBAAAS2LEfXupHGiQQAEACSSAAgARGXwJNJpPT6UxNTdXpdIWFhRaLJWQFi8VSWFh4pZvtcFNd53Q6rVYrv+UA0CsSaLfbXS6XSBEJJIEAcD0TGB8fLx/s6iXQarX6fD6fzyf6l5qa6nK5xBLRAIvF4nQ6xUK73W63230+n8fjMZlM4taqqiqxZOHChS6XS9wrNTW1qKjIYrGI9X0+n9PpFOsXFRWJ4NntdqvVKhPodDq1j6tNoNwBsZHwnRTR0i4RCRRrinvJFex2e4eblet4PB75RAAA0TkKlKGS456cnBzxoyyTxWLxeDwWi8VkMnk8HtEP0ULRLdnCwsJCq9UqU1dYWGgymd5++23tsKyTBGp3JiSBYgfETtrt9vCdlI9rMplcLpfJZBIPJwdzVqtV7Ll2T+TzcrvdFotFuxGPx0MCAUS9tLS0zZeRlpbW6xIo3v2140I5D6ldWRRFDgHl+gsXLhRNEnnTjr2qqqq6mEA5yJN3kROholLhOxk+b1lYWFhUVBQyvJOsVqt2syG9ZCIUQK+qoNfr1b5Der3ezvuni5rPBcqMiVqI4V3IKLCTBMqeaduTk5MjQqVdoTujwJAEhu9keLHEanJ5+AokEADCK9iV/kVPAvPz88VMpiDrIlvVSQJDloiIWq3WwsLC/Px87UbkmnKiUjvu/LsJlNWU/QvZSfnocm5WVE0+nHYF8SjhCdSuw7lAAL2wgl3sX5QkMDU1tbCwUA5+tXOMLperqKhIDPUul0DdpZfDiLCFnEgTM5BVVVUbNmwQk5byApmysjI59aq9YiV8uFZWVqYdqobvpO4yl8OIqIt9C78cJiSB2r3lXCCAXljBLvYvShKozYD22hYAAKJ/FCg/XSCHRwAARH8CAQAggQAAkEAAAEggAAAkEAAAEggAIIEkEABAAkkgAIAE3ngJNBgMiYmJvGYAgO5LTEw0GAwRk8Dk5GSDwZACAEC3GQyG5OTkiEkgAAA3GhIIACCBJBAAQAJJIACABJJAAAAJBACABAIAQAIBACCBAACQQAAASCAAACQQAAASCAAACQQAgAQCAEACAQAggQAAkEAAAEggAAAkEAAAEggAAAkEAIAEAgBAAgEAIIEAABJIAgEAJFCTwPj4eN03OFIAAEaBAACQQAAASCAAACQQAAAS2DVms9nr9RqNxtLSUrPZ3OE6JSUlDofjH9t4aWkprzQA4Pok0Gg0NjQ0qN9oamrqMHXaBBqNRq/Xe7kidpHD4ej8EQEAJPBajAK1VSspKVFVNRAI2Gw2o9HodrtDRoEhCXQ4HA6Hw2azeb3eQCAgkibL2tDQYDQabTZbIBBQVVWOF41Go9/vd7vdXq+XFxsAcP0TaDabCwoK9Hq9zWZzOp1XlEC/3280GsW8qJwdFbc6nU5tUHl1AQA3XAK186IlJSVXlECn0yl/FENJuR05CiwpKeGlBQB0Tv75l3iNhISEhISEq5hAm81WXl7+j40CQxIoRoEiqwUFBeIbRoEAgBt9FNjU1HTy5Mm33npLRMvr9cqTdtqRotfr7TCB2nUcDsfy5cubmpoYBQIAbrgEAgBAAgEAIIEAAJBAAABIIAAAJBAAABIIAAAJBACABAIAcMMmMDk52WAwpAAA0G0GgyE5OTliEmgwGBITE3UAAHRbYmKiwWCImASmpKTwmgEAekpKSgoJBACQQBIIACCBJBAAQAJJIACABJJAAMANKSkpaezYsffff//YsWOTkpJIIAAg+g0aNCgjIyM3N3fRN3JzczMyMgYNGkQCAQDR3L/p06fn5eUtulReXt706dM7r2CUJNBqtfq+YbfbdTqdyWTyeDw+n8/lcqWmpna4BAAQ6SZNmvTqq6/m5eW9+OKLIoTy+1dffXXSpEnRn0C73e50OrVLnE6n3W5PTU11uVxWq7XDJQCASB8CzpkzZ9GiRTk5OQ8//HBGRsYrr7ySkZHx8MMP5+TkLFq0aM6cOZ0MBKMkgSJv8kcx4BOdE3UMX8KvDgBEuhEjRmRlZYmZz+zs7PT09HHjxqWnp2dnZ4uFWVlZI0aMiOYEyhlOn8/n8XhMJpPJZHK73RaLRQTP5XItXLgwZAlzoQAQTQnMy8ubMmXK0KFDp0yZIk8NRn8CtS4XPBIIANFn6NChc+fOFf3LyMhIT0/PyspKT0/PyMgQFZw7d+7QoUN7SwKtVqvH43nttdeYCAWA3uCJJ57Iy8vLzc19+umnxfxndnb2008/nZubm5eX98QTT3Ry3yiZCHW5XCaTSafTOZ1OkTcuhwGA3mDYsGGzZ89e1JHZs2cPGzYsyhOo03woQpwL1GlOEMoBX/gSAEAUuOeee2bNmqX9aGBeXt6sWbPuueeezu/IR+MBANFg3LhxTz755KxZs5588slx48Z15S4kEADQS5FAAAAJJIEAABJIAgEAJLC7CYyPj5cPRgIBAIwCSSAAgASSQAAACSSBAAAS2AGDwZCYmMhrBgDovsTERIPBEDEJTE5ONhgMKQAAdJvBYEhOTo6YBAIAcKMhgQAAEkgCAQAkkAQCAEggCQQAkEAAAEggAAAkEAAAEggAvUnM6+UR+tXh05kQaUggAJBAEkgCAYAEkkASCAAkkASSQAAggSSQBAIACSSBJBAASCAJJIEAQAJJIAkEABJIAkkgAJBAEkgCAYAEkkAAwBUm8G7HgelFDU9sP3zL8v0xr5cnrfQuqzi1an/jvR/XRGgCX3jhhTfeeGPBggUTJ068GmGbO3fu5s2bV69enZGRQQIBICITeMvy/e9UnDrX2q6qqqqqZwPt7+47lVZYV3Gypb6p9eFP6yIugWazedu2bfX19YcPHz58+HBlZeXbb7/d4wlcvHjx/v37S0pKMjMzSSAARGQCX9x57GygvfFC+6aDZ+3exiPnWs8G2v9adTpCE/jYY49t3Lixrq5u3759BQUFW7ZsqampqaioyMnJIYEAQAK//Upa6d1+6Nz5tuBre7++aem+mNfL//y3Bru38XnXsYqTLWcC7b7GC82twcpTF6YXNcS8Xn7vxzWFB8+eCbS3BdXaM4H5u47ftHRfhwsf/bT+y4bm5tbgoabWFVWn73YcGLii+r19p441t7UF1WPNbcsqTg1cUd3jCbRYLHv27Kmurl6yZIko4sqVK9etWzd37tzVq1eXl5f7/f49e/YsW7Zs4sSJy5Yt2717986dO6urq30+3+bNm6dPnz5x4sT333/f4/HU1dVVVVUVFBRkZmbm5ubu2LHD7/f7/X6Xy5WdnU0CASCyEzh6fe2+ky1Hm1v/r/OQdvmo9bUVJ1uCquprvOA/G1BVtfxkS/r/1H3sO9MWVE+1tPkaL7S2B481t80qORq+MLfsxO7j5wPtwcpTF46caz3fFlyy5+vFX33d3Bo8fr5tz4mW823Bs4H2eTuP9XgCFy9eXF1dvWvXrpkzZ2qXL1u27MCBA/v37y8tLa2pqamsrMzNzV21apXf76+pqdm1a1dtba3f71+5cuWiRYuqqqpqampcLldlZWVdXd22bdt27dpVV1fndrsrKioOHz5cXFy8YsUKEggAEZzA8Z8cPNAYOHKu9Q9bOkjgoabWSZ/Vj15fW3Gy5fC51tyyE9WnLxxqav39lvo+71b9ter0+bbg1vomX2MHC2vOBOrOBiZ9Vj/i45o//61h3IaDzvqmxgvtlh3Hblq6b/FXX59rbf+k9qy4+qYHE2iz2Q4cOLBjx44ZM2Zolz/11FNvvvnmc889ZzKZxOzoe++9t2rVqtra2oKCApPJtHr16tra2k8//XTjxo21tbUbN2587LHHsrOzCwoKNm/e7PV6i4uLMzMzn3vuudLS0v3792/atIkEAkAEJ3Dshtrq0xeONbd1OAoU5wLvdhxwHz9/tLn1/cpTDedaK062jFpfG/N6ebb7xLnW9r1ftxw/3xay8PND5zYdPNvaHlRV9UJ78PND5zKLGr46cV691JcNzcmrfT2bQKvV6vV6w0eBs2fPdjqd+/fvP3To0OHDh2tra5cvXy4S+Mknnzz22GPvv/9+TU3N9u3bt2/fXltbu2rVKnnfFStWHDx48LBGTU3Ntm3bSCAARHAC71zr+7Kh+Wygfe6Oi3OST35+2OFtfHHnsfAELi0/Wd/Uuv/0hbEbamNeL1+0++tzre27jp0/ci50YX7NmZ+t8c0sPrr54NnaM4HW9uD/+M+WHT9/NtC+cv/pV3efWPzV1294Tk774kifd6t6NoELFiyoqKioqKhYsGDBhAkTJk6cuHz58o0bN27fvt3v9+/cudPhcHz55Zc1NTUdJnDbtm1btmypra1du3atOJU4c+bMDz74oKamZufOnStXrvzrX/+6du3aFStWrF69mgQCQAQn8Kal+17fe7KlLXigMfCC61jWzuO1ZwItbcF1B85UnroQksCsncf/duRcc2twTXXjrJKj5SdbmluDyytPhy/cWHNm17Hz+TVnxn9y8A3PSRHFDTVnLrQHt9Q1Pfpp/Xv7Th0/37Zkz8VrcHowgU899ZTT6ayvry8uLl6yZInD4fB6vQcOHNi7d6/f71+3bt0LL7xQUlLi9/s3btxYUFAQksBPP/107dq1tbW1ZWVlNptt3bp1Xq93x44d+/fvr6ysfP/991955RW3271z50673V5dXf3VV1+99tprnX/0kAQCwI2YQPGheGd9U3vw4uTkhfbgJ7Vnn9h+OHwUOGXb4ZnFR0+2tMmZzJKG5hEf14QvnLrt8Gd1TW3fbLO+qXXqtsOPflp/oDEgVzvQGPj9lvqr8bnAl156qaysTE5a+ny+tWvXfvjhh16vVyw5cOCA3++vrKz84osvwhOYlZVVXFws715dXf3BBx/k5+fX1dWJJSKfixcvLi8vP3z4cFFR0TPPPEMCASDyEhjzevngD6tzy058Vte0prrRuPWQ+Lz89KKGWSVHk1Z6+7xb9fQXR+a4jt651hfzevnvt9R/5GvcWt/0l6++lmfywhf2ebdq2hdH1nob3y4/JeZIxanH5ZWnNx08u7D0eOdnAbv512Fmzpz58ccfb9u27aOPPnr++efFwqysrPz8/LVr186cOfPFF1984403/vKXv7z33ntiynT27Nnvvvtudnb2hAkTpk+fvmrVqq1bt65Zs+a5554TM6JvvvnmZ599tmHDBrHOhAkTsrOzP/jgg0WLFjEKBIBITSB/I5S/EQoAJJAEkkAAIIEkkAQCAAkkgSQQAEggCSSBAEACSSAJBAASSAJJIACQQBJ4bRMYHx+v+wa/6wBAAhkFAgBIIAkEACBikUAAAAkkgQCA3prAuEuRQAAACSSBAAASCAAACQQAINoTGBsby5ECAESZy10OSgIBACSQBAIASCAAACQQAAASCABAlCUwLi6OBAIAoj6BcWFIIACgNyawb9++JBAAQAJJIACABAIA0CsSKCvIkQIARGUCw6+FCU3gkCFDOFgAgKgxZMiQriYwISGB4wUAiBoJCQldTaCoIGNBAEAUjP9k/zo8EdhBAsX/OFD6scbNl1JuSI8oSr9/9L6xijJaUcYoSryiPKgoyYrSR1FGKcpoRemjKDcryt2K8itFSVaU3yhKvKIoivITRXlIUW5VlLGKcrei3KwofRXlV4ry74rya0V5QFHuUpS7FCVFUW5TlPsU5ZeKEqsoP1aUkYpyn6L8+Ar3sJ+iPHLjHfORI0dOmjRJr9dffAkeeWTcuHGKoqSnp48cOVJRFL1eP2nSJPG98NBDDz300EPabxRFGTdu3COPfPv85Hbk99oHEhvXblm7fm82cuTIKVOmZGhMmjRp2LBhPbLx+I58/0rwAqFHhPRImyptwjr5uzAigf8fP6hVgMUTDXgAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjQtMDEtMDZUMTU6NDk6MzkrMDA6MDADtVRTAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDI0LTAxLTA2VDE1OjQ5OjM5KzAwOjAwcujs7wAAAABJRU5ErkJggg=="},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.783e546c.js b/assets/js/5e5c84c3.70dfb067.js similarity index 99% rename from assets/js/5e5c84c3.783e546c.js rename to assets/js/5e5c84c3.70dfb067.js index 32d86f6ca..c77b5a827 100644 --- a/assets/js/5e5c84c3.783e546c.js +++ b/assets/js/5e5c84c3.70dfb067.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":1734306618000,"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":1734876603000,"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.e6d73d4a.js b/assets/js/61be0f73.a71d338a.js similarity index 99% rename from assets/js/61be0f73.e6d73d4a.js rename to assets/js/61be0f73.a71d338a.js index 073a77844..bea07bd2d 100644 --- a/assets/js/61be0f73.e6d73d4a.js +++ b/assets/js/61be0f73.a71d338a.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":1734306618000,"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":1734876603000,"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/6437c7c1.f69d59e4.js b/assets/js/6437c7c1.f69d59e4.js new file mode 100644 index 000000000..79a319e43 --- /dev/null +++ b/assets/js/6437c7c1.f69d59e4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[2185],{8793:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>s,metadata:()=>n,toc:()=>d});var n=a(7137),i=a(6070),r=a(8591);const s={title:"GameVault+ Family & Friends Plan Launches with Exciting New Integrations!",authors:["alfagun74"],tags:["GameVault","update","Steam integration","Discord integration","Family & Friends Plan","holidays","Christmas theme","new features","bug fixes","gaming","community feedback","Phalcode","GameVault+"]},o=void 0,l={authorsImageUrls:[void 0]},d=[{value:"What\u2019s New?",id:"whats-new",level:3},{value:"1. A Fresh Look for our website",id:"1-a-fresh-look-for-our-website",level:4},{value:"2. The Family & Friends Plan",id:"2-the-family--friends-plan",level:4},{value:"Special Offer",id:"special-offer",level:5},{value:"New Features for GameVault+",id:"new-features-for-gamevault",level:3},{value:"Steam Integration (+)",id:"steam-integration-",level:4},{value:"Discord Integration (+)",id:"discord-integration-",level:4},{value:"Festive Update (+)",id:"festive-update-",level:4},{value:"General Improvements",id:"general-improvements",level:3},{value:"About the Microsoft Store",id:"about-the-microsoft-store",level:3}];function u(e){const t={a:"a",h3:"h3",h4:"h4",h5:"h5",hr:"hr",p:"p",strong:"strong",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:"Hey everyone,"}),"\n",(0,i.jsxs)(t.p,{children:["We\u2019ve got some incredible news to share! Your feedback on Reddit, Lemmy and ",(0,i.jsx)(t.a,{href:"https://discord.gg/NEdNen2dSu",children:"our Discord server"})," regarding our latest release has guided us as we work to make GameVault better for everyone. Today, we\u2019re excited to introduce some major updates along with a special offer \u2014 just in time for the holidays!"]}),"\n",(0,i.jsx)(t.h3,{id:"whats-new",children:"What\u2019s New?"}),"\n",(0,i.jsxs)(t.h4,{id:"1-a-fresh-look-for-our-website",children:["1. ",(0,i.jsx)(t.strong,{children:"A Fresh Look for our website"})]}),"\n",(0,i.jsx)(t.p,{children:"Navigating our website is now easier than ever. You told us it felt confusing and didn\u2019t explain GameVault or its use well. We\u2019ve streamlined the design to make it simpler, more intuitive, and focused on showcasing everything GameVault has to offer."}),"\n",(0,i.jsxs)(t.h4,{id:"2-the-family--friends-plan",children:["2. ",(0,i.jsx)(t.strong,{children:"The Family & Friends Plan"})]}),"\n",(0,i.jsxs)(t.p,{children:["We heard you: GameVault+ needed an affordable plan for families and groups. That\u2019s why we\u2019re introducing the ",(0,i.jsx)(t.strong,{children:"Family & Friends Plan"})," - perfect for sharing the GameVault+ experience with up to six members, including yourself for just \u20ac8.99/month."]}),"\n",(0,i.jsx)(t.h5,{id:"special-offer",children:"Special Offer"}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"And because we\u2019re in such a festive Christmas mood, we\u2019ve decided to gift away the Family & Friends Plan for one month!"})," If you have a group and want to try GameVault+ out and see if it\u2019s something you\u2019ll enjoy, just use the code: ",(0,i.jsx)(t.strong,{children:"WEAREFAMILY"})," at checkout. ",(0,i.jsx)(t.a,{href:"https://phalco.de/products/gamevault-plus/checkout",children:"Subscribe now here!"}),". The special offer is valid until the end of January."]}),"\n",(0,i.jsx)(t.h3,{id:"new-features-for-gamevault",children:"New Features for GameVault+"}),"\n",(0,i.jsx)(t.h4,{id:"steam-integration-",children:(0,i.jsx)(t.strong,{children:"Steam Integration (+)"})}),"\n",(0,i.jsx)(t.p,{children:"Keep your gaming library organized like never before! With our new Steam integration, you can easily sync all of your GameVault games to Steam as Non-Steam Game Shortcuts. This feature allows you to access and launch your GameVault games directly from Steam, keeping everything in one place without the hassle of managing multiple platforms. It\u2019s perfect for users who prefer Steam\u2019s interface and want a seamless experience with all their games, whether purchased on Steam or GameVault."}),"\n",(0,i.jsx)(t.h4,{id:"discord-integration-",children:(0,i.jsx)(t.strong,{children:"Discord Integration (+)"})}),"\n",(0,i.jsx)(t.p,{children:"Show off what you're playing in real-time with Discord's Presence API! This integration lets you share your current game status with friends on Discord, so they can see exactly what you're up to."}),"\n",(0,i.jsx)(t.h4,{id:"festive-update-",children:(0,i.jsx)(t.strong,{children:"Festive Update (+)"})}),"\n",(0,i.jsx)(t.p,{children:"We have added a Christmas theme to bring some holiday cheer into the application."}),"\n",(0,i.jsx)(t.h3,{id:"general-improvements",children:"General Improvements"}),"\n",(0,i.jsx)(t.p,{children:"We\u2019ve fixed several bugs and made key improvements for a better overall experience, including better offline handling, smoother downloads, and improved media features."}),"\n",(0,i.jsx)(t.h3,{id:"about-the-microsoft-store",children:"About the Microsoft Store"}),"\n",(0,i.jsx)(t.p,{children:"A quick note: Due to new Microsoft verification requirements, updates are temporarily delayed on the Microsoft Store. However, the Family & Friends Plan and all new updates are live everywhere else. Also older GameVault versions are fully compatible with the new family plan."}),"\n",(0,i.jsx)(t.hr,{}),"\n",(0,i.jsx)(t.p,{children:"This update was shaped by your feedback, and we\u2019d love to hear your thoughts on it! Keep sharing your ideas with us\u2014we're building something truly special together. While it's a niche product, it's one that we all needed."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.strong,{children:"Happy holidays from the Phalcode team!"})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},8591:(e,t,a)=>{a.d(t,{R:()=>s,x:()=>o});var n=a(758);const i={},r=n.createContext(i);function s(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:s(e.components),n.createElement(r.Provider,{value:t},e.children)}},7137:e=>{e.exports=JSON.parse('{"permalink":"/blog/2024/12/22/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2024-12-22.md","source":"@site/blog/2024-12-22.md","title":"GameVault+ Family & Friends Plan Launches with Exciting New Integrations!","description":"Hey everyone,","date":"2024-12-22T00:00:00.000Z","tags":[{"inline":true,"label":"GameVault","permalink":"/blog/tags/game-vault"},{"inline":true,"label":"update","permalink":"/blog/tags/update"},{"inline":true,"label":"Steam integration","permalink":"/blog/tags/steam-integration"},{"inline":true,"label":"Discord integration","permalink":"/blog/tags/discord-integration"},{"inline":true,"label":"Family & Friends Plan","permalink":"/blog/tags/family-friends-plan"},{"inline":true,"label":"holidays","permalink":"/blog/tags/holidays"},{"inline":true,"label":"Christmas theme","permalink":"/blog/tags/christmas-theme"},{"inline":true,"label":"new features","permalink":"/blog/tags/new-features"},{"inline":true,"label":"bug fixes","permalink":"/blog/tags/bug-fixes"},{"inline":true,"label":"gaming","permalink":"/blog/tags/gaming"},{"inline":true,"label":"community feedback","permalink":"/blog/tags/community-feedback"},{"inline":true,"label":"Phalcode","permalink":"/blog/tags/phalcode"},{"inline":true,"label":"GameVault+","permalink":"/blog/tags/game-vault"}],"readingTime":2.37,"hasTruncateMarker":false,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"GameVault+ Family & Friends Plan Launches with Exciting New Integrations!","authors":["alfagun74"],"tags":["GameVault","update","Steam integration","Discord integration","Family & Friends Plan","holidays","Christmas theme","new features","bug fixes","gaming","community feedback","Phalcode","GameVault+"]},"unlisted":false,"nextItem":{"title":"An update so major, we could have built the product from scratch.","permalink":"/blog/2024/10/20/"}}')}}]); \ No newline at end of file diff --git a/assets/js/6680494f.b4388bf0.js b/assets/js/6680494f.b4388bf0.js new file mode 100644 index 000000000..c6432e99b --- /dev/null +++ b/assets/js/6680494f.b4388bf0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[7744],{912:e=>{e.exports=JSON.parse('{"tag":{"label":"new features","permalink":"/blog/tags/new-features","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/new-features","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/6fa4e9ed.b94af445.js b/assets/js/6fa4e9ed.b94af445.js new file mode 100644 index 000000000..f24711990 --- /dev/null +++ b/assets/js/6fa4e9ed.b94af445.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[793],{3003:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>s,metadata:()=>n,toc:()=>d});var n=a(7137),i=a(6070),r=a(8591);const s={title:"GameVault+ Family & Friends Plan Launches with Exciting New Integrations!",authors:["alfagun74"],tags:["GameVault","update","Steam integration","Discord integration","Family & Friends Plan","holidays","Christmas theme","new features","bug fixes","gaming","community feedback","Phalcode","GameVault+"]},o=void 0,l={authorsImageUrls:[void 0]},d=[{value:"What\u2019s New?",id:"whats-new",level:3},{value:"1. A Fresh Look for our website",id:"1-a-fresh-look-for-our-website",level:4},{value:"2. The Family & Friends Plan",id:"2-the-family--friends-plan",level:4},{value:"Special Offer",id:"special-offer",level:5},{value:"New Features for GameVault+",id:"new-features-for-gamevault",level:3},{value:"Steam Integration (+)",id:"steam-integration-",level:4},{value:"Discord Integration (+)",id:"discord-integration-",level:4},{value:"Festive Update (+)",id:"festive-update-",level:4},{value:"General Improvements",id:"general-improvements",level:3},{value:"About the Microsoft Store",id:"about-the-microsoft-store",level:3}];function u(e){const t={a:"a",h3:"h3",h4:"h4",h5:"h5",hr:"hr",p:"p",strong:"strong",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:"Hey everyone,"}),"\n",(0,i.jsxs)(t.p,{children:["We\u2019ve got some incredible news to share! Your feedback on Reddit, Lemmy and ",(0,i.jsx)(t.a,{href:"https://discord.gg/NEdNen2dSu",children:"our Discord server"})," regarding our latest release has guided us as we work to make GameVault better for everyone. Today, we\u2019re excited to introduce some major updates along with a special offer \u2014 just in time for the holidays!"]}),"\n",(0,i.jsx)(t.h3,{id:"whats-new",children:"What\u2019s New?"}),"\n",(0,i.jsxs)(t.h4,{id:"1-a-fresh-look-for-our-website",children:["1. ",(0,i.jsx)(t.strong,{children:"A Fresh Look for our website"})]}),"\n",(0,i.jsx)(t.p,{children:"Navigating our website is now easier than ever. You told us it felt confusing and didn\u2019t explain GameVault or its use well. We\u2019ve streamlined the design to make it simpler, more intuitive, and focused on showcasing everything GameVault has to offer."}),"\n",(0,i.jsxs)(t.h4,{id:"2-the-family--friends-plan",children:["2. ",(0,i.jsx)(t.strong,{children:"The Family & Friends Plan"})]}),"\n",(0,i.jsxs)(t.p,{children:["We heard you: GameVault+ needed an affordable plan for families and groups. That\u2019s why we\u2019re introducing the ",(0,i.jsx)(t.strong,{children:"Family & Friends Plan"})," - perfect for sharing the GameVault+ experience with up to six members, including yourself for just \u20ac8.99/month."]}),"\n",(0,i.jsx)(t.h5,{id:"special-offer",children:"Special Offer"}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"And because we\u2019re in such a festive Christmas mood, we\u2019ve decided to gift away the Family & Friends Plan for one month!"})," If you have a group and want to try GameVault+ out and see if it\u2019s something you\u2019ll enjoy, just use the code: ",(0,i.jsx)(t.strong,{children:"WEAREFAMILY"})," at checkout. ",(0,i.jsx)(t.a,{href:"https://phalco.de/products/gamevault-plus/checkout",children:"Subscribe now here!"}),". The special offer is valid until the end of January."]}),"\n",(0,i.jsx)(t.h3,{id:"new-features-for-gamevault",children:"New Features for GameVault+"}),"\n",(0,i.jsx)(t.h4,{id:"steam-integration-",children:(0,i.jsx)(t.strong,{children:"Steam Integration (+)"})}),"\n",(0,i.jsx)(t.p,{children:"Keep your gaming library organized like never before! With our new Steam integration, you can easily sync all of your GameVault games to Steam as Non-Steam Game Shortcuts. This feature allows you to access and launch your GameVault games directly from Steam, keeping everything in one place without the hassle of managing multiple platforms. It\u2019s perfect for users who prefer Steam\u2019s interface and want a seamless experience with all their games, whether purchased on Steam or GameVault."}),"\n",(0,i.jsx)(t.h4,{id:"discord-integration-",children:(0,i.jsx)(t.strong,{children:"Discord Integration (+)"})}),"\n",(0,i.jsx)(t.p,{children:"Show off what you're playing in real-time with Discord's Presence API! This integration lets you share your current game status with friends on Discord, so they can see exactly what you're up to."}),"\n",(0,i.jsx)(t.h4,{id:"festive-update-",children:(0,i.jsx)(t.strong,{children:"Festive Update (+)"})}),"\n",(0,i.jsx)(t.p,{children:"We have added a Christmas theme to bring some holiday cheer into the application."}),"\n",(0,i.jsx)(t.h3,{id:"general-improvements",children:"General Improvements"}),"\n",(0,i.jsx)(t.p,{children:"We\u2019ve fixed several bugs and made key improvements for a better overall experience, including better offline handling, smoother downloads, and improved media features."}),"\n",(0,i.jsx)(t.h3,{id:"about-the-microsoft-store",children:"About the Microsoft Store"}),"\n",(0,i.jsx)(t.p,{children:"A quick note: Due to new Microsoft verification requirements, updates are temporarily delayed on the Microsoft Store. However, the Family & Friends Plan and all new updates are live everywhere else. Also older GameVault versions are fully compatible with the new family plan."}),"\n",(0,i.jsx)(t.hr,{}),"\n",(0,i.jsx)(t.p,{children:"This update was shaped by your feedback, and we\u2019d love to hear your thoughts on it! Keep sharing your ideas with us\u2014we're building something truly special together. While it's a niche product, it's one that we all needed."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.strong,{children:"Happy holidays from the Phalcode team!"})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},8591:(e,t,a)=>{a.d(t,{R:()=>s,x:()=>o});var n=a(758);const i={},r=n.createContext(i);function s(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:s(e.components),n.createElement(r.Provider,{value:t},e.children)}},7137:e=>{e.exports=JSON.parse('{"permalink":"/blog/2024/12/22/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2024-12-22.md","source":"@site/blog/2024-12-22.md","title":"GameVault+ Family & Friends Plan Launches with Exciting New Integrations!","description":"Hey everyone,","date":"2024-12-22T00:00:00.000Z","tags":[{"inline":true,"label":"GameVault","permalink":"/blog/tags/game-vault"},{"inline":true,"label":"update","permalink":"/blog/tags/update"},{"inline":true,"label":"Steam integration","permalink":"/blog/tags/steam-integration"},{"inline":true,"label":"Discord integration","permalink":"/blog/tags/discord-integration"},{"inline":true,"label":"Family & Friends Plan","permalink":"/blog/tags/family-friends-plan"},{"inline":true,"label":"holidays","permalink":"/blog/tags/holidays"},{"inline":true,"label":"Christmas theme","permalink":"/blog/tags/christmas-theme"},{"inline":true,"label":"new features","permalink":"/blog/tags/new-features"},{"inline":true,"label":"bug fixes","permalink":"/blog/tags/bug-fixes"},{"inline":true,"label":"gaming","permalink":"/blog/tags/gaming"},{"inline":true,"label":"community feedback","permalink":"/blog/tags/community-feedback"},{"inline":true,"label":"Phalcode","permalink":"/blog/tags/phalcode"},{"inline":true,"label":"GameVault+","permalink":"/blog/tags/game-vault"}],"readingTime":2.37,"hasTruncateMarker":false,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"GameVault+ Family & Friends Plan Launches with Exciting New Integrations!","authors":["alfagun74"],"tags":["GameVault","update","Steam integration","Discord integration","Family & Friends Plan","holidays","Christmas theme","new features","bug fixes","gaming","community feedback","Phalcode","GameVault+"]},"unlisted":false,"nextItem":{"title":"An update so major, we could have built the product from scratch.","permalink":"/blog/2024/10/20/"}}')}}]); \ No newline at end of file diff --git a/assets/js/708a84bc.1c531ee3.js b/assets/js/708a84bc.1c531ee3.js new file mode 100644 index 000000000..c91afd9a2 --- /dev/null +++ b/assets/js/708a84bc.1c531ee3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[8394],{6222:a=>{a.exports=JSON.parse('{"tag":{"label":"Christmas theme","permalink":"/blog/tags/christmas-theme","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/christmas-theme","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/7c12d4ca.9092ed41.js b/assets/js/7c12d4ca.9092ed41.js new file mode 100644 index 000000000..977544a3c --- /dev/null +++ b/assets/js/7c12d4ca.9092ed41.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[8520],{2046:a=>{a.exports=JSON.parse('{"tag":{"label":"Steam integration","permalink":"/blog/tags/steam-integration","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/steam-integration","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/7ef69c2b.c8fd3f45.js b/assets/js/7ef69c2b.e0094c86.js similarity index 92% rename from assets/js/7ef69c2b.c8fd3f45.js rename to assets/js/7ef69c2b.e0094c86.js index 432df9216..538dc5b79 100644 --- a/assets/js/7ef69c2b.c8fd3f45.js +++ b/assets/js/7ef69c2b.e0094c86.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[6755],{7067:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>n,toc:()=>m});var n=a(7666),l=a(6070),r=a(8591);const o={title:"An update so major, we could have built the product from scratch.",authors:["alfagun74"],tags:["GameVault","Client Update","Server Update","metadata framework","plugin system","parental control","age restrictions","theme","app optimization","analytics","notes","community management"]},i=void 0,s={authorsImageUrls:[void 0]},m=[];function u(e){const t={p:"p",strong:"strong",...(0,r.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(t.p,{children:(0,l.jsx)(t.strong,{children:"Hello, GameVault Community!"})}),"\n",(0,l.jsxs)(t.p,{children:["After six months of hard work, we\u2019re beyond excited to unveil our biggest update yet: ",(0,l.jsx)(t.strong,{children:"GameVault Client v1.12"})," and ",(0,l.jsx)(t.strong,{children:"GameVault Server v13"}),"! This release is so massive, it feels like we could\u2019ve built the product from scratch\u2014there\u2019s that much new ground covered."]})]})}function c(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,l.jsx)(t,{...e,children:(0,l.jsx)(u,{...e})}):u(e)}},8591:(e,t,a)=>{a.d(t,{R:()=>o,x:()=>i});var n=a(758);const l={},r=n.createContext(l);function o(e){const t=n.useContext(r);return n.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),n.createElement(r.Provider,{value:t},e.children)}},7666:e=>{e.exports=JSON.parse('{"permalink":"/blog/2024/10/20/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2024-10-20.md","source":"@site/blog/2024-10-20.md","title":"An update so major, we could have built the product from scratch.","description":"Hello, GameVault Community!","date":"2024-10-20T00:00:00.000Z","tags":[{"inline":true,"label":"GameVault","permalink":"/blog/tags/game-vault"},{"inline":true,"label":"Client Update","permalink":"/blog/tags/client-update"},{"inline":true,"label":"Server Update","permalink":"/blog/tags/server-update"},{"inline":true,"label":"metadata framework","permalink":"/blog/tags/metadata-framework"},{"inline":true,"label":"plugin system","permalink":"/blog/tags/plugin-system"},{"inline":true,"label":"parental control","permalink":"/blog/tags/parental-control"},{"inline":true,"label":"age restrictions","permalink":"/blog/tags/age-restrictions"},{"inline":true,"label":"theme","permalink":"/blog/tags/theme"},{"inline":true,"label":"app optimization","permalink":"/blog/tags/app-optimization"},{"inline":true,"label":"analytics","permalink":"/blog/tags/analytics"},{"inline":true,"label":"notes","permalink":"/blog/tags/notes"},{"inline":true,"label":"community management","permalink":"/blog/tags/community-management"}],"readingTime":2.515,"hasTruncateMarker":true,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"An update so major, we could have built the product from scratch.","authors":["alfagun74"],"tags":["GameVault","Client Update","Server Update","metadata framework","plugin system","parental control","age restrictions","theme","app optimization","analytics","notes","community management"]},"unlisted":false,"nextItem":{"title":"Temporary Solution to RAWG Woes, IGDB Partnership, and Exciting New Features!","permalink":"/blog/2024/05/07/"}}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[6755],{7067:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>n,toc:()=>m});var n=a(7666),l=a(6070),r=a(8591);const o={title:"An update so major, we could have built the product from scratch.",authors:["alfagun74"],tags:["GameVault","Client Update","Server Update","metadata framework","plugin system","parental control","age restrictions","theme","app optimization","analytics","notes","community management"]},i=void 0,s={authorsImageUrls:[void 0]},m=[];function u(e){const t={p:"p",strong:"strong",...(0,r.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(t.p,{children:(0,l.jsx)(t.strong,{children:"Hello, GameVault Community!"})}),"\n",(0,l.jsxs)(t.p,{children:["After six months of hard work, we\u2019re beyond excited to unveil our biggest update yet: ",(0,l.jsx)(t.strong,{children:"GameVault Client v1.12"})," and ",(0,l.jsx)(t.strong,{children:"GameVault Server v13"}),"! This release is so massive, it feels like we could\u2019ve built the product from scratch\u2014there\u2019s that much new ground covered."]})]})}function c(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,l.jsx)(t,{...e,children:(0,l.jsx)(u,{...e})}):u(e)}},8591:(e,t,a)=>{a.d(t,{R:()=>o,x:()=>i});var n=a(758);const l={},r=n.createContext(l);function o(e){const t=n.useContext(r);return n.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),n.createElement(r.Provider,{value:t},e.children)}},7666:e=>{e.exports=JSON.parse('{"permalink":"/blog/2024/10/20/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2024-10-20.md","source":"@site/blog/2024-10-20.md","title":"An update so major, we could have built the product from scratch.","description":"Hello, GameVault Community!","date":"2024-10-20T00:00:00.000Z","tags":[{"inline":true,"label":"GameVault","permalink":"/blog/tags/game-vault"},{"inline":true,"label":"Client Update","permalink":"/blog/tags/client-update"},{"inline":true,"label":"Server Update","permalink":"/blog/tags/server-update"},{"inline":true,"label":"metadata framework","permalink":"/blog/tags/metadata-framework"},{"inline":true,"label":"plugin system","permalink":"/blog/tags/plugin-system"},{"inline":true,"label":"parental control","permalink":"/blog/tags/parental-control"},{"inline":true,"label":"age restrictions","permalink":"/blog/tags/age-restrictions"},{"inline":true,"label":"theme","permalink":"/blog/tags/theme"},{"inline":true,"label":"app optimization","permalink":"/blog/tags/app-optimization"},{"inline":true,"label":"analytics","permalink":"/blog/tags/analytics"},{"inline":true,"label":"notes","permalink":"/blog/tags/notes"},{"inline":true,"label":"community management","permalink":"/blog/tags/community-management"}],"readingTime":2.515,"hasTruncateMarker":true,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"An update so major, we could have built the product from scratch.","authors":["alfagun74"],"tags":["GameVault","Client Update","Server Update","metadata framework","plugin system","parental control","age restrictions","theme","app optimization","analytics","notes","community management"]},"unlisted":false,"prevItem":{"title":"GameVault+ Family & Friends Plan Launches with Exciting New Integrations!","permalink":"/blog/2024/12/22/"},"nextItem":{"title":"Temporary Solution to RAWG Woes, IGDB Partnership, and Exciting New Features!","permalink":"/blog/2024/05/07/"}}')}}]); \ No newline at end of file diff --git a/assets/js/80292675.ab1f16ac.js b/assets/js/80292675.b383a81b.js similarity index 99% rename from assets/js/80292675.ab1f16ac.js rename to assets/js/80292675.b383a81b.js index 1cd0ac3fe..89469831a 100644 --- a/assets/js/80292675.ab1f16ac.js +++ b/assets/js/80292675.b383a81b.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":1734306618000,"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":1734876603000,"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/814f3328.822c0389.js b/assets/js/814f3328.822c0389.js new file mode 100644 index 000000000..b4f0efd99 --- /dev/null +++ b/assets/js/814f3328.822c0389.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[7472],{5513:e=>{e.exports=JSON.parse('{"title":"Recent posts","items":[{"title":"GameVault+ Family & Friends Plan Launches with Exciting New Integrations!","permalink":"/blog/2024/12/22/","unlisted":false,"date":"2024-12-22T00:00:00.000Z"},{"title":"An update so major, we could have built the product from scratch.","permalink":"/blog/2024/10/20/","unlisted":false,"date":"2024-10-20T00:00:00.000Z"},{"title":"Temporary Solution to RAWG Woes, IGDB Partnership, and Exciting New Features!","permalink":"/blog/2024/05/07/","unlisted":false,"date":"2024-05-07T00:00:00.000Z"},{"title":"GameVault+ out now","permalink":"/blog/2024/04/14/","unlisted":false,"date":"2024-04-14T00:00:00.000Z"},{"title":"GameVault Client is now available on Windows Phone 7 based on Microsoft Silverlight!","permalink":"/blog/2024/04/01/2024-04-01/","unlisted":false,"date":"2024-04-01T00:00:00.000Z"},{"title":"Announcing GameVault+ (coming soon)","permalink":"/blog/2024/03/28/","unlisted":false,"date":"2024-03-28T00:00:00.000Z"},{"title":"Join the GameVault Early-Access Program Now!","permalink":"/blog/2023/12/09/","unlisted":false,"date":"2023-12-09T00:00:00.000Z"},{"title":"A Look Back and a Glimpse Forward","permalink":"/blog/2023/11/20/","unlisted":false,"date":"2023-11-20T00:00:00.000Z"},{"title":"Please help us prioritize!","permalink":"/blog/2023/07/29/","unlisted":false,"date":"2023-07-29T00:00:00.000Z"},{"title":"Celebrating 600+ Installations and announcing the upcoming big feature","permalink":"/blog/2023/07/24/","unlisted":false,"date":"2023-07-24T00:00:00.000Z"},{"title":"The Migrations are finally completed","permalink":"/blog/2023/07/20/","unlisted":false,"date":"2023-07-20T00:00:00.000Z"},{"title":"Quick Migration Update and new Logo","permalink":"/blog/2023/07/19/","unlisted":false,"date":"2023-07-19T00:00:00.000Z"},{"title":"A New Name","permalink":"/blog/2023/07/15/","unlisted":false,"date":"2023-07-15T00:00:00.000Z"},{"title":"A Closer Look at GameVaults \'Source-Available\' Nature","permalink":"/blog/2023/07/13/","unlisted":false,"date":"2023-07-13T00:00:00.000Z"},{"title":"Battling Harassment and Trolls in Our App Community","permalink":"/blog/2023/07/09/","unlisted":false,"date":"2023-07-09T00:00:00.000Z"},{"title":"Choosing a New, Family-Friendly Name for this project!","permalink":"/blog/2023/07/08/","unlisted":false,"date":"2023-07-08T00:00:00.000Z"},{"title":"Introducing GameVault \ud83d\ude80 - The self-hosted gaming platform for DRM-free games","permalink":"/blog/2023/07/01/","unlisted":false,"date":"2023-07-01T00:00:00.000Z"}]}')}}]); \ No newline at end of file diff --git a/assets/js/814f3328.858950a4.js b/assets/js/814f3328.858950a4.js deleted file mode 100644 index 91eefe2c3..000000000 --- a/assets/js/814f3328.858950a4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[7472],{5513:e=>{e.exports=JSON.parse('{"title":"Recent posts","items":[{"title":"An update so major, we could have built the product from scratch.","permalink":"/blog/2024/10/20/","unlisted":false,"date":"2024-10-20T00:00:00.000Z"},{"title":"Temporary Solution to RAWG Woes, IGDB Partnership, and Exciting New Features!","permalink":"/blog/2024/05/07/","unlisted":false,"date":"2024-05-07T00:00:00.000Z"},{"title":"GameVault+ out now","permalink":"/blog/2024/04/14/","unlisted":false,"date":"2024-04-14T00:00:00.000Z"},{"title":"GameVault Client is now available on Windows Phone 7 based on Microsoft Silverlight!","permalink":"/blog/2024/04/01/2024-04-01/","unlisted":false,"date":"2024-04-01T00:00:00.000Z"},{"title":"Announcing GameVault+ (coming soon)","permalink":"/blog/2024/03/28/","unlisted":false,"date":"2024-03-28T00:00:00.000Z"},{"title":"Join the GameVault Early-Access Program Now!","permalink":"/blog/2023/12/09/","unlisted":false,"date":"2023-12-09T00:00:00.000Z"},{"title":"A Look Back and a Glimpse Forward","permalink":"/blog/2023/11/20/","unlisted":false,"date":"2023-11-20T00:00:00.000Z"},{"title":"Please help us prioritize!","permalink":"/blog/2023/07/29/","unlisted":false,"date":"2023-07-29T00:00:00.000Z"},{"title":"Celebrating 600+ Installations and announcing the upcoming big feature","permalink":"/blog/2023/07/24/","unlisted":false,"date":"2023-07-24T00:00:00.000Z"},{"title":"The Migrations are finally completed","permalink":"/blog/2023/07/20/","unlisted":false,"date":"2023-07-20T00:00:00.000Z"},{"title":"Quick Migration Update and new Logo","permalink":"/blog/2023/07/19/","unlisted":false,"date":"2023-07-19T00:00:00.000Z"},{"title":"A New Name","permalink":"/blog/2023/07/15/","unlisted":false,"date":"2023-07-15T00:00:00.000Z"},{"title":"A Closer Look at GameVaults \'Source-Available\' Nature","permalink":"/blog/2023/07/13/","unlisted":false,"date":"2023-07-13T00:00:00.000Z"},{"title":"Battling Harassment and Trolls in Our App Community","permalink":"/blog/2023/07/09/","unlisted":false,"date":"2023-07-09T00:00:00.000Z"},{"title":"Choosing a New, Family-Friendly Name for this project!","permalink":"/blog/2023/07/08/","unlisted":false,"date":"2023-07-08T00:00:00.000Z"},{"title":"Introducing GameVault \ud83d\ude80 - The self-hosted gaming platform for DRM-free games","permalink":"/blog/2023/07/01/","unlisted":false,"date":"2023-07-01T00:00:00.000Z"}]}')}}]); \ No newline at end of file diff --git a/assets/js/8ba18f4f.4dd37bee.js b/assets/js/8ba18f4f.432e261a.js similarity index 98% rename from assets/js/8ba18f4f.4dd37bee.js rename to assets/js/8ba18f4f.432e261a.js index 86af565bb..a351e77a6 100644 --- a/assets/js/8ba18f4f.4dd37bee.js +++ b/assets/js/8ba18f4f.432e261a.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":1734306618000,"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":1734876603000,"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.dd34347e.js b/assets/js/8c4108df.2295bdc6.js similarity index 99% rename from assets/js/8c4108df.dd34347e.js rename to assets/js/8c4108df.2295bdc6.js index 701f6ebd0..f2ddc8731 100644 --- a/assets/js/8c4108df.dd34347e.js +++ b/assets/js/8c4108df.2295bdc6.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":1734306618000,"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":1734876603000,"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/8ea09047.3c33b70a.js b/assets/js/8ea09047.e30def7f.js similarity index 78% rename from assets/js/8ea09047.3c33b70a.js rename to assets/js/8ea09047.e30def7f.js index 2411fd1b5..d255a698f 100644 --- a/assets/js/8ea09047.3c33b70a.js +++ b/assets/js/8ea09047.e30def7f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[9385],{600:e=>{e.exports=JSON.parse('{"metadata":{"permalink":"/blog/page/2","page":2,"postsPerPage":10,"totalPages":2,"totalCount":16,"previousPage":"/blog","blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[9385],{600:e=>{e.exports=JSON.parse('{"metadata":{"permalink":"/blog/page/2","page":2,"postsPerPage":10,"totalPages":2,"totalCount":17,"previousPage":"/blog","blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/9019cc36.bf1e96af.js b/assets/js/9019cc36.954b7e12.js similarity index 96% rename from assets/js/9019cc36.bf1e96af.js rename to assets/js/9019cc36.954b7e12.js index 62fcf802f..319c6ce38 100644 --- a/assets/js/9019cc36.bf1e96af.js +++ b/assets/js/9019cc36.954b7e12.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[8095],{5305:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>c,frontMatter:()=>o,metadata:()=>a,toc:()=>u});var a=n(7666),r=n(6070),i=n(8591);const o={title:"An update so major, we could have built the product from scratch.",authors:["alfagun74"],tags:["GameVault","Client Update","Server Update","metadata framework","plugin system","parental control","age restrictions","theme","app optimization","analytics","notes","community management"]},s=void 0,l={authorsImageUrls:[void 0]},u=[{value:"What\u2019s New?",id:"whats-new",level:3},{value:"Major New Features",id:"major-new-features",level:3},{value:"Critical Update Info",id:"critical-update-info",level:3},{value:"Support Us",id:"support-us",level:3}];function d(e){const t={a:"a",h3:"h3",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Hello, GameVault Community!"})}),"\n",(0,r.jsxs)(t.p,{children:["After six months of hard work, we\u2019re beyond excited to unveil our biggest update yet: ",(0,r.jsx)(t.strong,{children:"GameVault Client v1.12"})," and ",(0,r.jsx)(t.strong,{children:"GameVault Server v13"}),"! This release is so massive, it feels like we could\u2019ve built the product from scratch\u2014there\u2019s that much new ground covered. "]}),"\n",(0,r.jsx)(t.h3,{id:"whats-new",children:"What\u2019s New?"}),"\n",(0,r.jsxs)(t.p,{children:["We\u2019ve introduced some game-changing improvements. First and foremost, we\u2019ve moved away from unreliable third-party tools like RAWG and Google Image Scrapers for fetching video game metadata. Instead of just swapping one provider for another and making us dependant again, we\u2019ve built something much better: a brand-new ",(0,r.jsx)(t.strong,{children:"plugin system"})," on the backend, complete with an official partnership with ",(0,r.jsx)(t.strong,{children:"IGDB/Twitch"}),"."]}),"\n",(0,r.jsx)(t.p,{children:"The new plugin framework is incredibly flexible, allowing users to write their own metadata provider plugins. It supports an unlimited number of providers, prioritizes data effectively, and even fills in any gaps intelligently. And the cherry on top? Users now have full control over metadata\u2014if you want to tweak or edit a piece of info, you can do so without changing the source data. Your custom edits are saved separately, giving you full freedom."}),"\n",(0,r.jsx)(t.p,{children:"We\u2019ve been rigorously testing this system for 2\u20133 months, running an early access phase for about a month. While we\u2019ve optimized it as much as possible, we ask for your patience if any bugs pop up\u2014mastillke sure to back up before migrating!"}),"\n",(0,r.jsx)(t.h3,{id:"major-new-features",children:"Major New Features"}),"\n",(0,r.jsx)(t.p,{children:"Here\u2019s a quick rundown of some other incredible additions in this update:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Parental Controls & Age Restrictions:"})," Now, families can manage access based on age-appropriate content, giving more control over what\u2019s playable and viewable for children."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Built-in Media Player:"})," You can now watch trailers and gameplay videos directly in GameVault."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"UI Overhaul:"})," We\u2019ve refreshed the Game, Community, and Admin Tabs, along with a redesigned App Bar for a sleeker look."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Halloween Theme:"})," Just in time for spooky season! GameVault+ users can enjoy a themed Halloween skin."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Convenience Features:"})," We\u2019ve added default arguments and launch/install executables to streamline app functionality."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Markdown Support:"})," Both Notes and Server News now support markdown, making formatting a breeze and improving readability."]}),"\n"]}),"\n",(0,r.jsx)(t.h3,{id:"critical-update-info",children:"Critical Update Info"}),"\n",(0,r.jsx)(t.p,{children:"Before updating, please ensure compatibility between clients and servers:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Client v1.12"})," is required for servers running ",(0,r.jsx)(t.strong,{children:"v13 or above"}),"."]}),"\n",(0,r.jsxs)(t.li,{children:["Older clients (",(0,r.jsx)(t.strong,{children:"before v1.12"}),") won\u2019t work with server running on ",(0,r.jsx)(t.strong,{children:"Version 13 or above"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(t.p,{children:["For a smooth update and a guide on how to use all these new features, check out the detailed ",(0,r.jsx)(t.a,{href:"https://github.com/Phalcode/gamevault-backend/blob/master/CHANGELOG.md#1300",children:"migration instructions"})," in the server changelogs. As always, if you hit any snags, feel free to reach out to us on ",(0,r.jsx)(t.a,{href:"https://discord.gg/NEdNen2dSu",children:"Discord"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"support-us",children:"Support Us"}),"\n",(0,r.jsxs)(t.p,{children:["If you\u2019d like to support our development and help us keep most of GameVault\u2019s features free, consider ",(0,r.jsxs)(t.a,{href:"https://gamevau.lt/gamevault-plus",children:["subscribing to ",(0,r.jsx)(t.strong,{children:"GameVault+"})]})," or making ",(0,r.jsx)(t.a,{href:"https://phalco.de/support-us",children:"a one-time donation"}),". Although GameVault+ at the time only offers a limited set premium features, your support helps us continue making the app accessible to all."]}),"\n",(0,r.jsx)(t.p,{children:"Thank you all for supporting and using our passion project! We hope you enjoy the latest features and enhancements we've added."})]})}function c(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8591:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>s});var a=n(758);const r={},i=a.createContext(r);function o(e){const t=a.useContext(i);return a.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:o(e.components),a.createElement(i.Provider,{value:t},e.children)}},7666:e=>{e.exports=JSON.parse('{"permalink":"/blog/2024/10/20/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2024-10-20.md","source":"@site/blog/2024-10-20.md","title":"An update so major, we could have built the product from scratch.","description":"Hello, GameVault Community!","date":"2024-10-20T00:00:00.000Z","tags":[{"inline":true,"label":"GameVault","permalink":"/blog/tags/game-vault"},{"inline":true,"label":"Client Update","permalink":"/blog/tags/client-update"},{"inline":true,"label":"Server Update","permalink":"/blog/tags/server-update"},{"inline":true,"label":"metadata framework","permalink":"/blog/tags/metadata-framework"},{"inline":true,"label":"plugin system","permalink":"/blog/tags/plugin-system"},{"inline":true,"label":"parental control","permalink":"/blog/tags/parental-control"},{"inline":true,"label":"age restrictions","permalink":"/blog/tags/age-restrictions"},{"inline":true,"label":"theme","permalink":"/blog/tags/theme"},{"inline":true,"label":"app optimization","permalink":"/blog/tags/app-optimization"},{"inline":true,"label":"analytics","permalink":"/blog/tags/analytics"},{"inline":true,"label":"notes","permalink":"/blog/tags/notes"},{"inline":true,"label":"community management","permalink":"/blog/tags/community-management"}],"readingTime":2.515,"hasTruncateMarker":true,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"An update so major, we could have built the product from scratch.","authors":["alfagun74"],"tags":["GameVault","Client Update","Server Update","metadata framework","plugin system","parental control","age restrictions","theme","app optimization","analytics","notes","community management"]},"unlisted":false,"nextItem":{"title":"Temporary Solution to RAWG Woes, IGDB Partnership, and Exciting New Features!","permalink":"/blog/2024/05/07/"}}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[8095],{5305:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>c,frontMatter:()=>o,metadata:()=>a,toc:()=>u});var a=n(7666),r=n(6070),i=n(8591);const o={title:"An update so major, we could have built the product from scratch.",authors:["alfagun74"],tags:["GameVault","Client Update","Server Update","metadata framework","plugin system","parental control","age restrictions","theme","app optimization","analytics","notes","community management"]},s=void 0,l={authorsImageUrls:[void 0]},u=[{value:"What\u2019s New?",id:"whats-new",level:3},{value:"Major New Features",id:"major-new-features",level:3},{value:"Critical Update Info",id:"critical-update-info",level:3},{value:"Support Us",id:"support-us",level:3}];function d(e){const t={a:"a",h3:"h3",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Hello, GameVault Community!"})}),"\n",(0,r.jsxs)(t.p,{children:["After six months of hard work, we\u2019re beyond excited to unveil our biggest update yet: ",(0,r.jsx)(t.strong,{children:"GameVault Client v1.12"})," and ",(0,r.jsx)(t.strong,{children:"GameVault Server v13"}),"! This release is so massive, it feels like we could\u2019ve built the product from scratch\u2014there\u2019s that much new ground covered. "]}),"\n",(0,r.jsx)(t.h3,{id:"whats-new",children:"What\u2019s New?"}),"\n",(0,r.jsxs)(t.p,{children:["We\u2019ve introduced some game-changing improvements. First and foremost, we\u2019ve moved away from unreliable third-party tools like RAWG and Google Image Scrapers for fetching video game metadata. Instead of just swapping one provider for another and making us dependant again, we\u2019ve built something much better: a brand-new ",(0,r.jsx)(t.strong,{children:"plugin system"})," on the backend, complete with an official partnership with ",(0,r.jsx)(t.strong,{children:"IGDB/Twitch"}),"."]}),"\n",(0,r.jsx)(t.p,{children:"The new plugin framework is incredibly flexible, allowing users to write their own metadata provider plugins. It supports an unlimited number of providers, prioritizes data effectively, and even fills in any gaps intelligently. And the cherry on top? Users now have full control over metadata\u2014if you want to tweak or edit a piece of info, you can do so without changing the source data. Your custom edits are saved separately, giving you full freedom."}),"\n",(0,r.jsx)(t.p,{children:"We\u2019ve been rigorously testing this system for 2\u20133 months, running an early access phase for about a month. While we\u2019ve optimized it as much as possible, we ask for your patience if any bugs pop up\u2014mastillke sure to back up before migrating!"}),"\n",(0,r.jsx)(t.h3,{id:"major-new-features",children:"Major New Features"}),"\n",(0,r.jsx)(t.p,{children:"Here\u2019s a quick rundown of some other incredible additions in this update:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Parental Controls & Age Restrictions:"})," Now, families can manage access based on age-appropriate content, giving more control over what\u2019s playable and viewable for children."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Built-in Media Player:"})," You can now watch trailers and gameplay videos directly in GameVault."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"UI Overhaul:"})," We\u2019ve refreshed the Game, Community, and Admin Tabs, along with a redesigned App Bar for a sleeker look."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Halloween Theme:"})," Just in time for spooky season! GameVault+ users can enjoy a themed Halloween skin."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Convenience Features:"})," We\u2019ve added default arguments and launch/install executables to streamline app functionality."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Markdown Support:"})," Both Notes and Server News now support markdown, making formatting a breeze and improving readability."]}),"\n"]}),"\n",(0,r.jsx)(t.h3,{id:"critical-update-info",children:"Critical Update Info"}),"\n",(0,r.jsx)(t.p,{children:"Before updating, please ensure compatibility between clients and servers:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Client v1.12"})," is required for servers running ",(0,r.jsx)(t.strong,{children:"v13 or above"}),"."]}),"\n",(0,r.jsxs)(t.li,{children:["Older clients (",(0,r.jsx)(t.strong,{children:"before v1.12"}),") won\u2019t work with server running on ",(0,r.jsx)(t.strong,{children:"Version 13 or above"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(t.p,{children:["For a smooth update and a guide on how to use all these new features, check out the detailed ",(0,r.jsx)(t.a,{href:"https://github.com/Phalcode/gamevault-backend/blob/master/CHANGELOG.md#1300",children:"migration instructions"})," in the server changelogs. As always, if you hit any snags, feel free to reach out to us on ",(0,r.jsx)(t.a,{href:"https://discord.gg/NEdNen2dSu",children:"Discord"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"support-us",children:"Support Us"}),"\n",(0,r.jsxs)(t.p,{children:["If you\u2019d like to support our development and help us keep most of GameVault\u2019s features free, consider ",(0,r.jsxs)(t.a,{href:"https://gamevau.lt/gamevault-plus",children:["subscribing to ",(0,r.jsx)(t.strong,{children:"GameVault+"})]})," or making ",(0,r.jsx)(t.a,{href:"https://phalco.de/support-us",children:"a one-time donation"}),". Although GameVault+ at the time only offers a limited set premium features, your support helps us continue making the app accessible to all."]}),"\n",(0,r.jsx)(t.p,{children:"Thank you all for supporting and using our passion project! We hope you enjoy the latest features and enhancements we've added."})]})}function c(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8591:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>s});var a=n(758);const r={},i=a.createContext(r);function o(e){const t=a.useContext(i);return a.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:o(e.components),a.createElement(i.Provider,{value:t},e.children)}},7666:e=>{e.exports=JSON.parse('{"permalink":"/blog/2024/10/20/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2024-10-20.md","source":"@site/blog/2024-10-20.md","title":"An update so major, we could have built the product from scratch.","description":"Hello, GameVault Community!","date":"2024-10-20T00:00:00.000Z","tags":[{"inline":true,"label":"GameVault","permalink":"/blog/tags/game-vault"},{"inline":true,"label":"Client Update","permalink":"/blog/tags/client-update"},{"inline":true,"label":"Server Update","permalink":"/blog/tags/server-update"},{"inline":true,"label":"metadata framework","permalink":"/blog/tags/metadata-framework"},{"inline":true,"label":"plugin system","permalink":"/blog/tags/plugin-system"},{"inline":true,"label":"parental control","permalink":"/blog/tags/parental-control"},{"inline":true,"label":"age restrictions","permalink":"/blog/tags/age-restrictions"},{"inline":true,"label":"theme","permalink":"/blog/tags/theme"},{"inline":true,"label":"app optimization","permalink":"/blog/tags/app-optimization"},{"inline":true,"label":"analytics","permalink":"/blog/tags/analytics"},{"inline":true,"label":"notes","permalink":"/blog/tags/notes"},{"inline":true,"label":"community management","permalink":"/blog/tags/community-management"}],"readingTime":2.515,"hasTruncateMarker":true,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"An update so major, we could have built the product from scratch.","authors":["alfagun74"],"tags":["GameVault","Client Update","Server Update","metadata framework","plugin system","parental control","age restrictions","theme","app optimization","analytics","notes","community management"]},"unlisted":false,"prevItem":{"title":"GameVault+ Family & Friends Plan Launches with Exciting New Integrations!","permalink":"/blog/2024/12/22/"},"nextItem":{"title":"Temporary Solution to RAWG Woes, IGDB Partnership, and Exciting New Features!","permalink":"/blog/2024/05/07/"}}')}}]); \ No newline at end of file diff --git a/assets/js/9404f843.2033e5f0.js b/assets/js/9404f843.7440e153.js similarity index 99% rename from assets/js/9404f843.2033e5f0.js rename to assets/js/9404f843.7440e153.js index 60d6ba9e4..a510678d0 100644 --- a/assets/js/9404f843.2033e5f0.js +++ b/assets/js/9404f843.7440e153.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":1734306618000,"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":1734876603000,"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/9b1663d8.7486e176.js b/assets/js/9b1663d8.3dccf55b.js similarity index 67% rename from assets/js/9b1663d8.7486e176.js rename to assets/js/9b1663d8.3dccf55b.js index 208cae999..9f0be064d 100644 --- a/assets/js/9b1663d8.7486e176.js +++ b/assets/js/9b1663d8.3dccf55b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[8446],{8819:a=>{a.exports=JSON.parse('{"tag":{"label":"gaming","permalink":"/blog/tags/gaming","allTagsPath":"/blog/tags","count":4,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/gaming","page":1,"postsPerPage":10,"totalPages":1,"totalCount":4,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[8446],{8819:a=>{a.exports=JSON.parse('{"tag":{"label":"gaming","permalink":"/blog/tags/gaming","allTagsPath":"/blog/tags","count":5,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/gaming","page":1,"postsPerPage":10,"totalPages":1,"totalCount":5,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/9d9f8394.920a1515.js b/assets/js/9d9f8394.26378407.js similarity index 99% rename from assets/js/9d9f8394.920a1515.js rename to assets/js/9d9f8394.26378407.js index 8d3953f28..391166c79 100644 --- a/assets/js/9d9f8394.920a1515.js +++ b/assets/js/9d9f8394.26378407.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":1734306618000,"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":1734876603000,"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/9fafd272.52f35ff2.js b/assets/js/9fafd272.52f35ff2.js deleted file mode 100644 index b5db89c41..000000000 --- a/assets/js/9fafd272.52f35ff2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[9482],{3917:a=>{a.exports=JSON.parse('{"tag":{"label":"GameVault","permalink":"/blog/tags/game-vault","allTagsPath":"/blog/tags","count":9,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/game-vault","page":1,"postsPerPage":10,"totalPages":1,"totalCount":9,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/9fafd272.cc41ad0f.js b/assets/js/9fafd272.cc41ad0f.js new file mode 100644 index 000000000..9bd9283ad --- /dev/null +++ b/assets/js/9fafd272.cc41ad0f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[9482],{3917:a=>{a.exports=JSON.parse('{"tag":{"label":"GameVault","permalink":"/blog/tags/game-vault","allTagsPath":"/blog/tags","count":10,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/game-vault","page":1,"postsPerPage":10,"totalPages":1,"totalCount":10,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/a1072f2a.b5cf28f2.js b/assets/js/a1072f2a.95a1f77b.js similarity index 99% rename from assets/js/a1072f2a.b5cf28f2.js rename to assets/js/a1072f2a.95a1f77b.js index 298feff66..0ade54751 100644 --- a/assets/js/a1072f2a.b5cf28f2.js +++ b/assets/js/a1072f2a.95a1f77b.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":1734306618000,"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":1734876603000,"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.f318baaf.js b/assets/js/b1d7f5b9.72e43134.js similarity index 98% rename from assets/js/b1d7f5b9.f318baaf.js rename to assets/js/b1d7f5b9.72e43134.js index 032cdae90..8189e44a2 100644 --- a/assets/js/b1d7f5b9.f318baaf.js +++ b/assets/js/b1d7f5b9.72e43134.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":1734306618000,"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":1734876603000,"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.c5eadc84.js b/assets/js/b28c3188.18d0f107.js similarity index 99% rename from assets/js/b28c3188.c5eadc84.js rename to assets/js/b28c3188.18d0f107.js index cee63b339..05650eafb 100644 --- a/assets/js/b28c3188.c5eadc84.js +++ b/assets/js/b28c3188.18d0f107.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":1734306618000,"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":1734876603000,"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.eb6bfcb0.js b/assets/js/b4068411.507e1aa4.js similarity index 99% rename from assets/js/b4068411.eb6bfcb0.js rename to assets/js/b4068411.507e1aa4.js index 697459c24..59b484754 100644 --- a/assets/js/b4068411.eb6bfcb0.js +++ b/assets/js/b4068411.507e1aa4.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":1734306618000,"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":1734876603000,"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/b4ec5f66.0c2d2d9f.js b/assets/js/b4ec5f66.0c2d2d9f.js new file mode 100644 index 000000000..49e9620de --- /dev/null +++ b/assets/js/b4ec5f66.0c2d2d9f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[3944],{4355:a=>{a.exports=JSON.parse('{"tag":{"label":"Phalcode","permalink":"/blog/tags/phalcode","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/phalcode","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/b8ecf3c5.ea08e490.js b/assets/js/b8ecf3c5.5b865369.js similarity index 99% rename from assets/js/b8ecf3c5.ea08e490.js rename to assets/js/b8ecf3c5.5b865369.js index 31b7c3004..f8e834873 100644 --- a/assets/js/b8ecf3c5.ea08e490.js +++ b/assets/js/b8ecf3c5.5b865369.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":1734306618000,"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":1734876603000,"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.011575c1.js b/assets/js/ba57e113.ffc97152.js similarity index 99% rename from assets/js/ba57e113.011575c1.js rename to assets/js/ba57e113.ffc97152.js index 19e67e229..100d00562 100644 --- a/assets/js/ba57e113.011575c1.js +++ b/assets/js/ba57e113.ffc97152.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":1734306618000,"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:"@DissBee"}),"\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":1734876603000,"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:"@DissBee"}),"\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/c15d9823.cf1dab78.js b/assets/js/c15d9823.650b74c4.js similarity index 78% rename from assets/js/c15d9823.cf1dab78.js rename to assets/js/c15d9823.650b74c4.js index de9fd6304..6eb6716fc 100644 --- a/assets/js/c15d9823.cf1dab78.js +++ b/assets/js/c15d9823.650b74c4.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[8146],{9328:e=>{e.exports=JSON.parse('{"metadata":{"permalink":"/blog","page":1,"postsPerPage":10,"totalPages":2,"totalCount":16,"nextPage":"/blog/page/2","blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[8146],{9328:e=>{e.exports=JSON.parse('{"metadata":{"permalink":"/blog","page":1,"postsPerPage":10,"totalPages":2,"totalCount":17,"nextPage":"/blog/page/2","blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/c89c7974.a84f852f.js b/assets/js/c89c7974.aebcb017.js similarity index 98% rename from assets/js/c89c7974.a84f852f.js rename to assets/js/c89c7974.aebcb017.js index 6e3b70068..927170133 100644 --- a/assets/js/c89c7974.a84f852f.js +++ b/assets/js/c89c7974.aebcb017.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":1734306618000,"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":1734876603000,"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.d975237f.js b/assets/js/c9d2adb2.a1619f10.js similarity index 98% rename from assets/js/c9d2adb2.d975237f.js rename to assets/js/c9d2adb2.a1619f10.js index 18bc38c21..423c65f4e 100644 --- a/assets/js/c9d2adb2.d975237f.js +++ b/assets/js/c9d2adb2.a1619f10.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":1734306618000,"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":1734876603000,"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.39c645fa.js b/assets/js/cddec16f.7e02bdc7.js similarity index 99% rename from assets/js/cddec16f.39c645fa.js rename to assets/js/cddec16f.7e02bdc7.js index 30ce7c3c6..37c7adf59 100644 --- a/assets/js/cddec16f.39c645fa.js +++ b/assets/js/cddec16f.7e02bdc7.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":1734306618000,"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":1734876603000,"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/d65ed073.dc0c87e5.js b/assets/js/d65ed073.dc0c87e5.js new file mode 100644 index 000000000..720d7671a --- /dev/null +++ b/assets/js/d65ed073.dc0c87e5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[6757],{7410:a=>{a.exports=JSON.parse('{"tag":{"label":"holidays","permalink":"/blog/tags/holidays","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/holidays","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/d72f98b9.c8deba5d.js b/assets/js/d72f98b9.eeef4ddc.js similarity index 98% rename from assets/js/d72f98b9.c8deba5d.js rename to assets/js/d72f98b9.eeef4ddc.js index 9f3f47204..ba4eca2aa 100644 --- a/assets/js/d72f98b9.c8deba5d.js +++ b/assets/js/d72f98b9.eeef4ddc.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":1734306618000,"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":1734876603000,"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.49c0c645.js b/assets/js/dcb9a9e8.6896c60e.js similarity index 99% rename from assets/js/dcb9a9e8.49c0c645.js rename to assets/js/dcb9a9e8.6896c60e.js index b77e27587..e48497559 100644 --- a/assets/js/dcb9a9e8.49c0c645.js +++ b/assets/js/dcb9a9e8.6896c60e.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":1734306618000,"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":1734876603000,"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.c4277d6e.js b/assets/js/e0da75fc.c72a4755.js similarity index 98% rename from assets/js/e0da75fc.c4277d6e.js rename to assets/js/e0da75fc.c72a4755.js index d33a25cd2..bacf89f5f 100644 --- a/assets/js/e0da75fc.c4277d6e.js +++ b/assets/js/e0da75fc.c72a4755.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":1734306618000,"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":1734876603000,"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.25839717.js b/assets/js/e6a59d41.1612880a.js similarity index 99% rename from assets/js/e6a59d41.25839717.js rename to assets/js/e6a59d41.1612880a.js index b88833b19..fb4cbd366 100644 --- a/assets/js/e6a59d41.25839717.js +++ b/assets/js/e6a59d41.1612880a.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":1734306618000,"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":1734876603000,"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.bd1ecd58.js b/assets/js/e9e0f988.225fea92.js similarity index 98% rename from assets/js/e9e0f988.bd1ecd58.js rename to assets/js/e9e0f988.225fea92.js index 477c84da2..6f8ff92d1 100644 --- a/assets/js/e9e0f988.bd1ecd58.js +++ b/assets/js/e9e0f988.225fea92.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":1734306618000,"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":1734876603000,"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.22b17b24.js b/assets/js/ec46a009.22b17b24.js deleted file mode 100644 index a6db8ad07..000000000 --- a/assets/js/ec46a009.22b17b24.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":1734306618000,"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.2dbcb3e8.js b/assets/js/ec46a009.2dbcb3e8.js new file mode 100644 index 000000000..dc54eb712 --- /dev/null +++ b/assets/js/ec46a009.2dbcb3e8.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":1734876603000,"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 I share GameVault+ with others?",id:"can-i-share-gamevault-with-others",level:3},{value:"How can I manage members of my Family & Friends subscription?",id:"how-can-i-manage-members-of-my-family--friends-subscription",level:3},{value:"Does GameVault+ support multiple GameVault Servers?",id:"does-gamevault-support-multiple-gamevault-servers",level:3},{value:"How many devices can I use with my GameVault+ subscription?",id:"how-many-devices-can-i-use-with-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 can't afford GameVault+ or don't want to purchase it?",id:"what-if-i-cant-afford-gamevault-or-dont-want-to-purchase-it",level:3},{value:"Why is there not lifetime license?",id:"why-is-there-not-lifetime-license",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.jsx)(t.p,{children:"GameVault+ offers three affordable subscription options:"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Flex Plan"}),": A personal subscription for just \u20ac4.99/month."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Smart Saver Plan"}),": A personal subscription at \u20ac49.90/year, offering great savings."]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Family & Friends Plan"}),": For you and up to 5 others in your family or friend circle for only \u20ac8.99/month."]}),"\n"]}),"\n"]}),"\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-i-share-gamevault-with-others",children:"Can I share GameVault+ with others?"}),"\n",(0,i.jsx)(t.p,{children:"Sharing depends on your subscription plan:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Family & Friends Plan"}),": You can share GameVault+ with up to 5 other people in your family or friend circle using the ",(0,i.jsx)(t.strong,{children:"Manage Members"})," button on the ",(0,i.jsx)(t.a,{href:"https://phalco.de/account",children:"Phalcode Account Page"}),"."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Flex Plan and Smart Saver Plan"}),": These are personal plans and cannot be shared. Sharing your Phalcode account is also not allowed."]}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"how-can-i-manage-members-of-my-family--friends-subscription",children:"How can I manage members of my Family & Friends subscription?"}),"\n",(0,i.jsxs)(t.p,{children:["To manage your Family & Friends subscription members, visit the ",(0,i.jsx)(t.a,{href:"https://phalco.de/account",children:"Phalcode Account Page"}),". If your subscription is shareable, you'll find a ",(0,i.jsx)(t.strong,{children:"Manage Members"})," button. Click it to open a dialog where you can add up to five people to share your subscription. Changes to your subscription members should take effect in about 5 minutes."]}),"\n",(0,i.jsx)(t.h3,{id:"does-gamevault-support-multiple-gamevault-servers",children:"Does GameVault+ support multiple GameVault Servers?"}),"\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-use-with-my-gamevault-subscription",children:"How many devices can I use with my GameVault+ subscription?"}),"\n",(0,i.jsx)(t.p,{children:"There is currently no limit on the number of devices you can use with your subscription. However, sharing your personal Phalcode account with others is not permitted."}),"\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 and Family & Friends subscriptions are tailored for individual users and private groups, 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-or-dont-want-to-purchase-it",children:"What if I can't afford GameVault+ or don't want to purchase it?"}),"\n",(0,i.jsx)(t.p,{children:"That's okay! We understand that not everyone can afford GameVault+. Developing and maintaining the service comes with costs, and while we aim to keep the core features free and accessible to all, some convenience features are behind a paywall to help cover these expenses."}),"\n",(0,i.jsxs)(t.p,{children:["If you're unable to purchase it, you're welcome to explore ways to ",(0,i.jsx)(t.em,{children:"work around"})," the paywall for personal use. The source code is available on ",(0,i.jsx)(t.a,{href:"https://github.com/Phalcode/gamevault-app",children:"GitHub"}),". However, ",(0,i.jsx)(t.strong,{children:"please avoid pirated versions"}),", as they may contain malware, and ",(0,i.jsx)(t.strong,{children:"do not share any bypass modifications"}),"."]}),"\n",(0,i.jsx)(t.h3,{id:"why-is-there-not-lifetime-license",children:"Why is there not lifetime license?"}),"\n",(0,i.jsx)(t.p,{children:'Lifetime licenses might seem appealing, but they\u2019re not practical for covering the ongoing costs of developing and maintaining GameVault. Maintaining servers, providing updates, and developing new features require continuous investment, which a one-time payment simply doesn\u2019t support. GameVault+ exists to provide "thank you" features for continuous support, and a lifetime license would undermine that purpose entirely.'})]})}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.0aab854c.js b/assets/js/ee98c124.4448d70c.js similarity index 99% rename from assets/js/ee98c124.0aab854c.js rename to assets/js/ee98c124.4448d70c.js index 07e6defb0..2bf03876a 100644 --- a/assets/js/ee98c124.0aab854c.js +++ b/assets/js/ee98c124.4448d70c.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":1734306618000,"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":1734876603000,"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/ef8b811a.129793ec.js b/assets/js/ef8b811a.78c0b53e.js similarity index 87% rename from assets/js/ef8b811a.129793ec.js rename to assets/js/ef8b811a.78c0b53e.js index e3ecc746e..2e80c174b 100644 --- a/assets/js/ef8b811a.129793ec.js +++ b/assets/js/ef8b811a.78c0b53e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[8947],{6600:e=>{e.exports=JSON.parse('{"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null,"count":16},{"name":"Philip Sch\xe4fer","title":"Co-Founder of Phalcode","url":"https://github.com/Yelo420","imageURL":"https://github.com/Yelo420.png","key":"yelo420","page":null,"count":0}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[8947],{6600:e=>{e.exports=JSON.parse('{"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null,"count":17},{"name":"Philip Sch\xe4fer","title":"Co-Founder of Phalcode","url":"https://github.com/Yelo420","imageURL":"https://github.com/Yelo420.png","key":"yelo420","page":null,"count":0}]}')}}]); \ No newline at end of file diff --git a/assets/js/f2861637.64e410c4.js b/assets/js/f2861637.64e410c4.js new file mode 100644 index 000000000..39dd3ba1c --- /dev/null +++ b/assets/js/f2861637.64e410c4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[3338],{2149:a=>{a.exports=JSON.parse('{"tag":{"label":"Family & Friends Plan","permalink":"/blog/tags/family-friends-plan","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/family-friends-plan","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/f4d4319b.35a6b80f.js b/assets/js/f4d4319b.3ae3b5db.js similarity index 99% rename from assets/js/f4d4319b.35a6b80f.js rename to assets/js/f4d4319b.3ae3b5db.js index f592c13dd..048e1ce31 100644 --- a/assets/js/f4d4319b.35a6b80f.js +++ b/assets/js/f4d4319b.3ae3b5db.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":1734306618000,"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":1734876603000,"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.b74f38f7.js b/assets/js/f5b06269.b74f38f7.js new file mode 100644 index 000000000..bb0299edd --- /dev/null +++ b/assets/js/f5b06269.b74f38f7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[2641],{818:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>h,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>a,toc:()=>r});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":1734876603000,"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 n=s(6070),l=s(8591);const i={title:"Themes",sidebar_position:3},o=void 0,h={},r=[{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 c(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,l.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(t.p,{children:["With ",(0,n.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,n.jsx)(t.h2,{id:"premium-themes",children:"Premium Themes"}),"\n",(0,n.jsx)(t.p,{children:"GameVault+ ships with the following premium themes by default:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Phalcode (Dark)"}),": A dark theme aligned with our Phalcode brand.\n",(0,n.jsx)(t.img,{alt:"Phalcode (Dark)",src:s(5293).A+"",width:"2552",height:"1392"})]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Phalcode (Light)"}),": A light theme aligned with our Phalcode brand.\n",(0,n.jsx)(t.img,{alt:"Phalcode (Light)",src:s(2917).A+"",width:"2552",height:"1392"})]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Halloween (Dark)"}),": A Halloween-themed ambiance to set the mood for horror games in autumn.\n",(0,n.jsx)(t.img,{alt:"Halloween (Dark)",src:s(4252).A+"",width:"2552",height:"1392"})]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Christmas (Dark)"}),": Celebrate a cozy and festive Christmas with us. We ho-ho-hope you love it!\n",(0,n.jsx)(t.img,{alt:"Christmas (Dark)",src:s(3579).A+"",width:"2576",height:"1408"})]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"custom-themes",children:"Custom Themes"}),"\n",(0,n.jsx)(t.p,{children:"GameVault+ also offers the flexibility to apply custom themes, allowing users to incorporate designs of their preference."}),"\n",(0,n.jsxs)(t.p,{children:["A public repository of custom themes shared by our community can be found ",(0,n.jsx)(t.a,{href:"https://github.com/Phalcode/gamevault-community-themes/",children:"here"}),"."]}),"\n",(0,n.jsx)(t.h3,{id:"how-to-install-and-apply-a-custom-theme",children:"How to Install and Apply a Custom Theme"}),"\n",(0,n.jsx)(t.p,{children:"To install a custom theme, follow these steps:"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:["Place the theme .xaml file into your ",(0,n.jsx)(t.code,{children:"themes"})," folder. Depending on your GameVault installation, the ",(0,n.jsx)(t.code,{children:"themes"})," folder can be located at either ",(0,n.jsx)(t.code,{children:"%USERPROFILE%\\AppData\\Local\\Packages\\Phalcode.174950BD81C41_dymsgn3qpfjxc\\LocalCache\\Roaming\\GameVault\\themes"})," or ",(0,n.jsx)(t.code,{children:"%APPDATA%/GameVault/themes"}),"."]}),"\n",(0,n.jsxs)(t.li,{children:["Open ",(0,n.jsx)(t.code,{children:"GameVault Settings"})," and select your newly added theme under ",(0,n.jsx)(t.code,{children:"Application"})," -> ",(0,n.jsx)(t.code,{children:"Themes"}),"."]}),"\n"]}),"\n",(0,n.jsx)(t.h3,{id:"creating-a-custom-theme",children:"Creating a Custom Theme"}),"\n",(0,n.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,n.jsx)(t.code,{children:"themes"})," folder."]}),"\n",(0,n.jsx)(t.h4,{id:"template-file",children:"Template File"}),"\n",(0,n.jsxs)(t.p,{children:["Just copy the latest template from the ",(0,n.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,n.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,n.jsx)(t.h3,{id:"sharing-custom-themes",children:"Sharing Custom Themes"}),"\n",(0,n.jsxs)(t.p,{children:["You can share your custom themes with the community by creating a pull request to the ",(0,n.jsx)(t.a,{href:"https://github.com/Phalcode/gamevault-community-themes/",children:"community themes repository"}),"."]})]})}function m(e={}){const{wrapper:t}={...(0,l.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},3579:(e,t,s)=>{s.d(t,{A:()=>a});const a=s.p+"assets/images/christmas_dark-9eab3e9deeb68b6a553e24f5997db830.png"},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:()=>i,x:()=>o});var a=s(758);const n={},l=a.createContext(n);function i(e){const t=a.useContext(l);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(n):e.components||n:i(e.components),a.createElement(l.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f5b06269.f93ee1b6.js b/assets/js/f5b06269.f93ee1b6.js deleted file mode 100644 index 510bb9955..000000000 --- a/assets/js/f5b06269.f93ee1b6.js +++ /dev/null @@ -1 +0,0 @@ -"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":1734306618000,"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/f81c1134.d780115a.js b/assets/js/f81c1134.d780115a.js deleted file mode 100644 index a7645084d..000000000 --- a/assets/js/f81c1134.d780115a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[5749],{7735:e=>{e.exports=JSON.parse('{"archive":{"blogPosts":[{"id":"/2024/10/20/","metadata":{"permalink":"/blog/2024/10/20/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2024-10-20.md","source":"@site/blog/2024-10-20.md","title":"An update so major, we could have built the product from scratch.","description":"Hello, GameVault Community!","date":"2024-10-20T00:00:00.000Z","tags":[{"inline":true,"label":"GameVault","permalink":"/blog/tags/game-vault"},{"inline":true,"label":"Client Update","permalink":"/blog/tags/client-update"},{"inline":true,"label":"Server Update","permalink":"/blog/tags/server-update"},{"inline":true,"label":"metadata framework","permalink":"/blog/tags/metadata-framework"},{"inline":true,"label":"plugin system","permalink":"/blog/tags/plugin-system"},{"inline":true,"label":"parental control","permalink":"/blog/tags/parental-control"},{"inline":true,"label":"age restrictions","permalink":"/blog/tags/age-restrictions"},{"inline":true,"label":"theme","permalink":"/blog/tags/theme"},{"inline":true,"label":"app optimization","permalink":"/blog/tags/app-optimization"},{"inline":true,"label":"analytics","permalink":"/blog/tags/analytics"},{"inline":true,"label":"notes","permalink":"/blog/tags/notes"},{"inline":true,"label":"community management","permalink":"/blog/tags/community-management"}],"readingTime":2.515,"hasTruncateMarker":true,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"An update so major, we could have built the product from scratch.","authors":["alfagun74"],"tags":["GameVault","Client Update","Server Update","metadata framework","plugin system","parental control","age restrictions","theme","app optimization","analytics","notes","community management"]},"unlisted":false,"nextItem":{"title":"Temporary Solution to RAWG Woes, IGDB Partnership, and Exciting New Features!","permalink":"/blog/2024/05/07/"}},"content":"**Hello, GameVault Community!**\\n\\nAfter six months of hard work, we\u2019re beyond excited to unveil our biggest update yet: **GameVault Client v1.12** and **GameVault Server v13**! This release is so massive, it feels like we could\u2019ve built the product from scratch\u2014there\u2019s that much new ground covered. \x3c!-- truncate --\x3e\\n\\n### What\u2019s New?\\n\\nWe\u2019ve introduced some game-changing improvements. First and foremost, we\u2019ve moved away from unreliable third-party tools like RAWG and Google Image Scrapers for fetching video game metadata. Instead of just swapping one provider for another and making us dependant again, we\u2019ve built something much better: a brand-new **plugin system** on the backend, complete with an official partnership with **IGDB/Twitch**.\\n\\nThe new plugin framework is incredibly flexible, allowing users to write their own metadata provider plugins. It supports an unlimited number of providers, prioritizes data effectively, and even fills in any gaps intelligently. And the cherry on top? Users now have full control over metadata\u2014if you want to tweak or edit a piece of info, you can do so without changing the source data. Your custom edits are saved separately, giving you full freedom.\\n\\nWe\u2019ve been rigorously testing this system for 2\u20133 months, running an early access phase for about a month. While we\u2019ve optimized it as much as possible, we ask for your patience if any bugs pop up\u2014mastillke sure to back up before migrating!\\n\\n### Major New Features\\n\\nHere\u2019s a quick rundown of some other incredible additions in this update:\\n\\n- **Parental Controls & Age Restrictions:** Now, families can manage access based on age-appropriate content, giving more control over what\u2019s playable and viewable for children.\\n- **Built-in Media Player:** You can now watch trailers and gameplay videos directly in GameVault.\\n- **UI Overhaul:** We\u2019ve refreshed the Game, Community, and Admin Tabs, along with a redesigned App Bar for a sleeker look.\\n- **Halloween Theme:** Just in time for spooky season! GameVault+ users can enjoy a themed Halloween skin.\\n- **Convenience Features:** We\u2019ve added default arguments and launch/install executables to streamline app functionality.\\n- **Markdown Support:** Both Notes and Server News now support markdown, making formatting a breeze and improving readability.\\n\\n### Critical Update Info\\n\\nBefore updating, please ensure compatibility between clients and servers:\\n\\n- **Client v1.12** is required for servers running **v13 or above**.\\n- Older clients (**before v1.12**) won\u2019t work with server running on **Version 13 or above**.\\n\\nFor a smooth update and a guide on how to use all these new features, check out the detailed [migration instructions](https://github.com/Phalcode/gamevault-backend/blob/master/CHANGELOG.md#1300) in the server changelogs. As always, if you hit any snags, feel free to reach out to us on [Discord](https://discord.gg/NEdNen2dSu).\\n\\n### Support Us\\n\\nIf you\u2019d like to support our development and help us keep most of GameVault\u2019s features free, consider [subscribing to **GameVault+**](https://gamevau.lt/gamevault-plus) or making [a one-time donation](https://phalco.de/support-us). Although GameVault+ at the time only offers a limited set premium features, your support helps us continue making the app accessible to all.\\n\\nThank you all for supporting and using our passion project! We hope you enjoy the latest features and enhancements we\'ve added."},{"id":"/2024/05/07/","metadata":{"permalink":"/blog/2024/05/07/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2024-05-07.md","source":"@site/blog/2024-05-07.md","title":"Temporary Solution to RAWG Woes, IGDB Partnership, and Exciting New Features!","description":"Hey everyone!","date":"2024-05-07T00:00:00.000Z","tags":[{"inline":true,"label":"game","permalink":"/blog/tags/game"},{"inline":true,"label":"metadata","permalink":"/blog/tags/metadata"},{"inline":true,"label":"database","permalink":"/blog/tags/database"},{"inline":true,"label":"videogame","permalink":"/blog/tags/videogame"},{"inline":true,"label":"RAWG","permalink":"/blog/tags/rawg"},{"inline":true,"label":"IGDB","permalink":"/blog/tags/igdb"},{"inline":true,"label":"twitch.tv","permalink":"/blog/tags/twitch-tv"},{"inline":true,"label":"API","permalink":"/blog/tags/api"},{"inline":true,"label":"partnership","permalink":"/blog/tags/partnership"},{"inline":true,"label":"community","permalink":"/blog/tags/community"},{"inline":true,"label":"solution","permalink":"/blog/tags/solution"},{"inline":true,"label":"Steam","permalink":"/blog/tags/steam"},{"inline":true,"label":"backend","permalink":"/blog/tags/backend"},{"inline":true,"label":"update","permalink":"/blog/tags/update"},{"inline":true,"label":"features","permalink":"/blog/tags/features"},{"inline":true,"label":"GameVault","permalink":"/blog/tags/game-vault"},{"inline":true,"label":"GameVault+","permalink":"/blog/tags/game-vault"},{"inline":true,"label":"easter egg","permalink":"/blog/tags/easter-egg"}],"readingTime":2.525,"hasTruncateMarker":true,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"Temporary Solution to RAWG Woes, IGDB Partnership, and Exciting New Features!","authors":["alfagun74"],"tags":["game","metadata","database","videogame","RAWG","IGDB","twitch.tv","API","partnership","community","solution","Steam","backend","update","features","GameVault","GameVault+","easter egg"]},"unlisted":false,"prevItem":{"title":"An update so major, we could have built the product from scratch.","permalink":"/blog/2024/10/20/"},"nextItem":{"title":"GameVault+ out now","permalink":"/blog/2024/04/14/"}},"content":"Hey everyone!\\n\\nIn our last post we mentioned the challenges we\'ve been facing with the videogame metadata database we\'ve been using, [rawg.io](https://rawg.io/). Unfortunately, it\'s become an unmaintained abandonware, causing frequent downtime and issues like incorrect search results and registration problems. \x3c!-- truncate --\x3e The situation peaked on May 5th when the service went down completely for a day.\\n\\n## GameVault\'s new metadata provider strategy\\n\\nTo address these issues, we\'re making significant changes to GameVault\'s metadata system. Our goal is to make GameVault metadata provider agnostic, allowing users to seamlessly plug in their preferred metadata provider.\\n\\nWe\'re also excited to announce our official partnership with IGDB (twitch.tv), a trusted video game database. Going forward, GameVault will primarily use IGDB\'s APIs out of the box.\\n\\nMore details on our plans can be found in this [GitHub ticket](https://github.com/Phalcode/gamevault-backend/issues/258). We also plan to continue supporting the use of your own API keys and other vendors.\\n\\nHowever, as decided in our recent poll, we will be removing all support for RAWG.\\n\\n## Temporary solution: Implementing a RAWG replacement\\n\\nHowever, implementing these changes will take time, and we are both currently busy with work commitments and travel plans. So what happens if RAWG suddenly stops working while we\'re away? To address this concern, [Toylerrr](https://github.com/Toylerrr), one of our most valuable community members, had a great idea. He began developing a solution that would be a drop-in replacement for RAWG. An application that mimicked the behavior of RAWG, but fetched data from Steam instead. All you have to do is replace the url in the `RAWG_API_URL` environmental variable.\\n\\nWe loved the idea and built on it. Introducing [rawg-to-steam-redirect](https://github.com/Phalcode/rawg-to-steam-redirect).\\n\\nThe link above explains how it works and how you can use it today.\\n\\nWhat we liked most about it is that it required minimal backend changes to integrate. We have already tested this solution on our 667 games server and it works great. The quality of box art for example is much better. One drawback is that Steam does not have a lot of tags in its API.\\n\\nWhile `https://api.rawg.io/api` will remain the default `RAWG_API_URL` for now, you can switch between RAWG and the new solution at any time. Just make sure your GameVault backend is updated to at least v12.1.0.\\n\\n## Exciting new features\\n\\nIn addition to these changes, we\'re excited to introduce you to some new features that were recently released:\\n\\n- **\ud83d\udd16 Bookmarking Video Games:** You can now bookmark your favorite games within GameVault.\\n- **\u23ef\ufe0f Download Management:** GameVault now supports pausing, auto-resuming, and resuming downloads.\\n- **\ud83d\udd12 Encrypted Archives:** GameVault now supports password protected archives.\\n\\nWe hope these updates will make your experience with GameVault even better as we move through this transition period.\\n\\n## Supporting GameVault\\n\\nFinally, we want to thank all of you for making all of this possible. If you have not already done so, please consider upgrading to GameVault+ to flex with animated profile pictures on your server. We would really appreciate it. Bet you can\'t find the GameVault+ easter egg though... \ud83d\ude09\\n\\nWith love,\\n\\nPhalcode"},{"id":"/2024/04/14/","metadata":{"permalink":"/blog/2024/04/14/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2024-04-14.md","source":"@site/blog/2024-04-14.md","title":"GameVault+ out now","description":"Hey everyone!","date":"2024-04-14T00:00:00.000Z","tags":[{"inline":true,"label":"gaming","permalink":"/blog/tags/gaming"},{"inline":true,"label":"self-hosted","permalink":"/blog/tags/self-hosted"},{"inline":true,"label":"platform","permalink":"/blog/tags/platform"},{"inline":true,"label":"DRM-free","permalink":"/blog/tags/drm-free"},{"inline":true,"label":"video games","permalink":"/blog/tags/video-games"},{"inline":true,"label":"GameVault","permalink":"/blog/tags/game-vault"},{"inline":true,"label":"GameVault+","permalink":"/blog/tags/game-vault"},{"inline":true,"label":"subscription","permalink":"/blog/tags/subscription"},{"inline":true,"label":"community-driven","permalink":"/blog/tags/community-driven"},{"inline":true,"label":"updates","permalink":"/blog/tags/updates"},{"inline":true,"label":"announcement","permalink":"/blog/tags/announcement"},{"inline":true,"label":"early access","permalink":"/blog/tags/early-access"},{"inline":true,"label":"release","permalink":"/blog/tags/release"},{"inline":true,"label":"features","permalink":"/blog/tags/features"},{"inline":true,"label":"sustainability","permalink":"/blog/tags/sustainability"},{"inline":true,"label":"partnerships","permalink":"/blog/tags/partnerships"},{"inline":true,"label":"Discord","permalink":"/blog/tags/discord"},{"inline":true,"label":"feedback","permalink":"/blog/tags/feedback"},{"inline":true,"label":"improvement","permalink":"/blog/tags/improvement"},{"inline":true,"label":"development","permalink":"/blog/tags/development"}],"readingTime":1.18,"hasTruncateMarker":true,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"GameVault+ out now","authors":["alfagun74"],"tags":["gaming","self-hosted","platform","DRM-free","video games","GameVault","GameVault+","subscription","community-driven","updates","announcement","early access","release","features","sustainability","partnerships","Discord","feedback","improvement","development"]},"unlisted":false,"prevItem":{"title":"Temporary Solution to RAWG Woes, IGDB Partnership, and Exciting New Features!","permalink":"/blog/2024/05/07/"},"nextItem":{"title":"GameVault Client is now available on Windows Phone 7 based on Microsoft Silverlight!","permalink":"/blog/2024/04/01/2024-04-01/"}},"content":"Hey everyone!\\n\\nWe\'re thrilled to announce that the early access phase of GameVault+ has concluded, and we\'re officially launching it today! It\'s been an incredible journey from the inception of GameVault to where we are now, and we couldn\'t have done it without your amazing support.\x3c!-- truncate --\x3e\\n\\nGameVault+ is our way of saying thank you to our dedicated supporters while also ensuring the sustainability of our platform. For a small monthly fee, you\'ll gain access to premium features designed to enhance your gaming experience within GameVault. We\'re starting with features like animated profile pictures, custom themes, and activation of the GameVault Client API, with more exciting additions planned for the future.\\n\\nBut our work doesn\'t stop here. We\'re committed to refining GameVault+ based on your feedback, as well as addressing key areas of improvement in the platform. This includes exploring partnerships with reputable video game databases to enhance our data offerings and refactoring our client application for optimal performance.\\n\\nAnd most importantly, we want you, our community, to have a say in the future direction of GameVault. That\'s why we\'re opening up the floor for feature suggestions through our Discord channel. Your input will help shape the next big updates to GameVault.\\n\\nThank you all for your support and enthusiasm. We\'re excited to continue this journey with you and to make gaming even more enjoyable for everyone. Stay tuned for more updates, and happy gaming!"},{"id":"/2024/04/01/2024-04-01/","metadata":{"permalink":"/blog/2024/04/01/2024-04-01/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2024-04-01/2024-04-01.md","source":"@site/blog/2024-04-01/2024-04-01.md","title":"GameVault Client is now available on Windows Phone 7 based on Microsoft Silverlight!","description":"Hey Everyone!","date":"2024-04-01T00:00:00.000Z","tags":[{"inline":true,"label":"April Fools","permalink":"/blog/tags/april-fools"}],"readingTime":1.605,"hasTruncateMarker":true,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"GameVault Client is now available on Windows Phone 7 based on Microsoft Silverlight!","authors":["alfagun74"],"tags":["April Fools"]},"unlisted":false,"prevItem":{"title":"GameVault+ out now","permalink":"/blog/2024/04/14/"},"nextItem":{"title":"Announcing GameVault+ (coming soon)","permalink":"/blog/2024/03/28/"}},"content":"Hey Everyone!\\n\\nThe moment you\'ve been waiting for is finally here. We\'ve been working hard on it for months and are thrilled to announce that GameVault Client Application is **now available on Windows Phone 7**, powered by **Microsoft Silverlight**!\x3c!-- truncate --\x3e\\n\\n![Windows Phone](winphone.png)\\n\\nThe Current PC-Version of GameVault will be discontinued soon and will no longer be available to download from the Microsoft Store, as the technology is too new and not well supported yet. We needed a battle-tested framework to ensure compatibility, so we decided to switch to Windows Phone 7 and Silverlight. Also, the mobile platform just has massive market share, compared to PC.\\n\\nWe understand the excitement and anticipation surrounding this release, and we\'re just as eager as you are to see how this integration will enhance your experience.\\n\\nWith GameVault on your Windows Phone 7 device, you can carry your favorite games with you wherever you go. Whether you\'re battling fierce foes, exploring vast virtual worlds, or simply passing the time with a quick puzzle game, GameVault ensures that the thrill of gaming is always at your fingertips.\\n\\nThanks to the seamless integration with Microsoft Silverlight, navigating through your game library has never been smoother or more intuitive. The Metro Live Tiles add a touch of elegance to the user interface, making it a joy to browse through your collection and discover new games.\\n\\nAnd the best part? This is just the beginning. Our team is already hard at work on further enhancements and features, including the highly anticipated Holodeck edition of GameVault aswell as the new integrated \\"Bird Feeding Timer\\" feature, that automatically warns you when your pets are about to starve.\\n\\nWe\'re incredibly excited to embark on this journey with you and to continue pushing the boundaries of innovation. So what are you waiting for? Head over to the Windows Phone Store and migrate today to start your gaming adventure!\\n\\nHappy gaming... and April Fools!"},{"id":"/2024/03/28/","metadata":{"permalink":"/blog/2024/03/28/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2024-03-28.md","source":"@site/blog/2024-03-28.md","title":"Announcing GameVault+ (coming soon)","description":"Hey Everyone!","date":"2024-03-28T00:00:00.000Z","tags":[{"inline":true,"label":"startup","permalink":"/blog/tags/startup"},{"inline":true,"label":"software","permalink":"/blog/tags/software"},{"inline":true,"label":"gaming","permalink":"/blog/tags/gaming"},{"inline":true,"label":"GameVault","permalink":"/blog/tags/game-vault"},{"inline":true,"label":"subscription model","permalink":"/blog/tags/subscription-model"},{"inline":true,"label":"development","permalink":"/blog/tags/development"},{"inline":true,"label":"community","permalink":"/blog/tags/community"},{"inline":true,"label":"announcement","permalink":"/blog/tags/announcement"}],"readingTime":3.725,"hasTruncateMarker":true,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"Announcing GameVault+ (coming soon)","authors":["alfagun74"],"tags":["startup","software","gaming","GameVault","subscription model","development","community","announcement"]},"unlisted":false,"prevItem":{"title":"GameVault Client is now available on Windows Phone 7 based on Microsoft Silverlight!","permalink":"/blog/2024/04/01/2024-04-01/"},"nextItem":{"title":"Join the GameVault Early-Access Program Now!","permalink":"/blog/2023/12/09/"}},"content":"Hey Everyone!\\n\\nIt feels like it\'s been ages since we last caught up regarding the development of [GameVault (the self-hostable platform for drm-free videogames)](https://gamevau.lt), but trust me, the silence from our end doesn\'t mean we\'ve been slacking off. In fact,quite the opposite has been happening behind the scenes. \x3c!-- truncate --\x3e \\n\\nWhen my friend and I first launched this application, it was born out of a simple need for a solution to a problem we thought was very particular and only for ourselves. Having a steam-like platform for game files lying on my home server.\\n\\nWe never imagined it would resonate with others or find its own place in the market. Frankly, we thought it might end up just another forgotten repository on GitHub, gathering virtual dust with no one paying it any mind.\\n\\nBut boy, were we wrong. The response to our app was unexpectedly large and overwhelming. Thousands of people are using GameVault today, and it seems there\'s quite a demand out there for the exact product we\'ve been building.\\n\\nWe\u2019re a small indie team of two and despite juggling multiple jobs, we\'ve poured our hearts and souls into this project during our spare times, striving to offer a self-hosted alternative to the gaming platforms out there. And while we\'ve received some generous donations (_shoutout to our two loyal monthly donors btw \u2013 you know who you are, and we\'re endlessly grateful!_), it\'s clear that relying solely on sporadic tips isn\'t sustainable for the long term and we need financial support to maintain our services and justify our time investment towards our families.\\n\\nSo, it\'s time for a slight change. We\'re thrilled to announce the upcoming release of a new version of our client application, complete with an **optional** subscription model we\'re calling...\\n\\n## [GameVault+](https://gamevau.lt/docs/gamevault-plus/introduction)\\n\\n## What is GameVault+?\\n\\nFirst, to clear some of the confusion:\\n\\n**No, this is not some shady scammy \\"We\'re going enterprise\\" rugpull**.\\nThe core of GameVaults upcoming features and the features you enjoyed until now will always remain free. Additionally the system is [designed to be easily bypassed if you can\'t or dont want to afford it.](https://gamevau.lt/docs/gamevault-plus/introduction/#what-if-i-cant-afford-gamevault)\\n\\n[It was long planned on our board and well discussed within our community](https://github.com/Phalcode/gamevault-app/issues/151). Think of [GameVault+](https://gamevau.lt/docs/gamevault-plus/introduction) as our way of saying \\"thank you\\" to our supporters and to motivate them to support us regularly. To be more specific, it\'s us giving back some goodie-features that are not necessarily needed to use GameVault back to our supporters, while they help us keep the lights on here at Phalcode.\\n\\nWith GameVault+, you\'ll gain access to premium nice-to-have features designed to enhance your GameVault experience, all for a small monthly fee of \u20ac4,99 monthly or \u20ac49.90 anually.\\n\\nCurrently, these features include:\\n\\n- Uploading animated profile pictures\\n- Applying Custom Themes\\n- Activation of the GameVault Client API (CLI, URI, and NamedPipe Interfaces Used for client integrations with 3rd party tools like Playnite)\\n\\nBut there are more to come! We will be enhancing this offering with more features, whenever we see room for it, as GameVault+ subscribers are the ones, who keep this project alive.\\n\\nAll details and a Q&A are on the [GameVault+ page](https://gamevau.lt/docs/gamevault-plus/introduction).\\n\\n**We\'ll be rolling out this new product today to our early access users first** to get the product and the infrastructure around it tested, tweaking and refining it based on your feedback before making it available to everyone. It\'s an exciting new chapter for us, and we can\'t wait to have you along for the ride.\\n\\n## So what\'s next?\\n\\nWe will polish the rough edges of GameVault+ and bring it to life in the next few weeks, hopefully. You will probably already see some documentation on this website for it. Keep in mind, this is all a work in progress, and we will announce the final release soon.\\n\\nAfter that, we will need to urgently find a solution to our heavy reliance on the [degrading and unmaintained RAWG Database](https://discord.com/channels/1100920639667306496/1134496308846137404/1217726870959820861). We are already in contact for potential partnerships with Video-Game Databases.\\n\\nFinally, we will need to do some refactoring of our client application\'s architecture.\\n\\nBut stay tuned because once all of this is done, the Next Big Feature we\'ll be focusing on will be open for **the community to decide** in [our #polls channel on Discord](https://discord.gg/NEdNen2dSu). So make sure to join \\"The Council\\" to get notified and vote on your most desired feature.\\n\\nThank you all for supporting us and looking forward to seeing you all on our next updates!"},{"id":"/2023/12/09/","metadata":{"permalink":"/blog/2023/12/09/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2023-12-09.md","source":"@site/blog/2023-12-09.md","title":"Join the GameVault Early-Access Program Now!","description":"Hey, Guys!","date":"2023-12-09T00:00:00.000Z","tags":[{"inline":true,"label":"Gaming","permalink":"/blog/tags/gaming"},{"inline":true,"label":"GameVault","permalink":"/blog/tags/game-vault"},{"inline":true,"label":"Early Access","permalink":"/blog/tags/early-access"},{"inline":true,"label":"UI Update","permalink":"/blog/tags/ui-update"},{"inline":true,"label":"Beta Testing","permalink":"/blog/tags/beta-testing"},{"inline":true,"label":"Community Feedback","permalink":"/blog/tags/community-feedback"},{"inline":true,"label":"Exclusive Preview","permalink":"/blog/tags/exclusive-preview"},{"inline":true,"label":"Microsoft Store","permalink":"/blog/tags/microsoft-store"},{"inline":true,"label":"Discord","permalink":"/blog/tags/discord"},{"inline":true,"label":"Gaming Servers","permalink":"/blog/tags/gaming-servers"}],"readingTime":1.135,"hasTruncateMarker":true,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"Join the GameVault Early-Access Program Now!","authors":["alfagun74"],"tags":["Gaming","GameVault","Early Access","UI Update","Beta Testing","Community Feedback","Exclusive Preview","Microsoft Store","Discord","Gaming Servers"]},"unlisted":false,"prevItem":{"title":"Announcing GameVault+ (coming soon)","permalink":"/blog/2024/03/28/"},"nextItem":{"title":"A Look Back and a Glimpse Forward","permalink":"/blog/2023/11/20/"}},"content":"Hey, Guys!\\n\\nFor the upcoming large UI update of GameVault, we\'re launching a brand new GameVault Early-Access Program, and we want **YOU** to be a part of it!\x3c!-- truncate --\x3e\\n\\n## What\'s the Early-Access Program?\\n\\nEarly-Access is your golden ticket to test-drive upcoming GameVault updates before anyone else. You\'ll be part of an exclusive group and get a sneak peek into the latest features, but here\'s the deal \u2013 it might not be as stable as our regular releases and you need to interact with us. Your feedback will help us fine-tune everything before the big release for everyone else.\\n\\n## How to Join\\n\\n:clipboard: Complete the [Application Form](https://forms.gle/RQvEGfWeUFPBCUaG6) \\n:date: The first early-access phase kicks off on December 17 and lasts for one week.\\n\\n## Prerequisites\\n\\n:speech_balloon: Active participation in the designated Discord channel. \\n:video_game: GameVault installed from the Microsoft Store with a Microsoft Account logged in. If not, grab it [here](https://www.microsoft.com/store/apps/9PCKDV76GL75). \\n:rocket: A GameVault Server running the **phalcode/gamevault-backend:early-access** image. (Only run this if you are accepted as a Tester as it could break things!)\\n\\n### Important Note\\n\\n- There are only a limited number of slots in the Early-Access Program. Supporters and Trusted Members are prioritized.\\n- If you\'re accepted and later found not meeting the requirements, you might be removed from future testing and the next applicant on our list gets the opportunity.\\n\\n[Apply here!](https://forms.gle/RQvEGfWeUFPBCUaG6)"},{"id":"/2023/11/20/","metadata":{"permalink":"/blog/2023/11/20/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2023-11-20.md","source":"@site/blog/2023-11-20.md","title":"A Look Back and a Glimpse Forward","description":"Hello,","date":"2023-11-20T00:00:00.000Z","tags":[{"inline":true,"label":"Game Development","permalink":"/blog/tags/game-development"},{"inline":true,"label":"Software Updates","permalink":"/blog/tags/software-updates"},{"inline":true,"label":"Gaming Community","permalink":"/blog/tags/gaming-community"},{"inline":true,"label":"UI Redesign","permalink":"/blog/tags/ui-redesign"},{"inline":true,"label":"Development Milestones","permalink":"/blog/tags/development-milestones"},{"inline":true,"label":"Tech Progress","permalink":"/blog/tags/tech-progress"},{"inline":true,"label":"Future Features","permalink":"/blog/tags/future-features"},{"inline":true,"label":"GameVault Journey","permalink":"/blog/tags/game-vault-journey"},{"inline":true,"label":"Coding Chronicle","permalink":"/blog/tags/coding-chronicle"},{"inline":true,"label":"November Update","permalink":"/blog/tags/november-update"}],"readingTime":2.26,"hasTruncateMarker":true,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"A Look Back and a Glimpse Forward","authors":["alfagun74"],"tags":["Game Development","Software Updates","Gaming Community","UI Redesign","Development Milestones","Tech Progress","Future Features","GameVault Journey","Coding Chronicle","November Update"]},"unlisted":false,"prevItem":{"title":"Join the GameVault Early-Access Program Now!","permalink":"/blog/2023/12/09/"},"nextItem":{"title":"Please help us prioritize!","permalink":"/blog/2023/07/29/"}},"content":"Hello,\\n\\nIt\'s been a while since we caught up here, but if you\'ve been following the action on [Discord](https://discord.gg/NEdNen2dSu), you\'re up to speed. Nevertheless, this blog remains your spot for the key updates and announements.\x3c!-- truncate --\x3e\\n\\nLet\'s dive into what\'s been happening with GameVault since release and what\'s on the horizon. We\'ve hit version 9 on the backend and 1.7 on the frontend, showcasing our commitment to continuous improvement.\\n\\nAlongside the usual optimizations and bug fixes, we\'ve been paying a lot of attention to your feature requests and implemented a bunch of them.\\n\\nHere\'s the highlight reel:\\n\\n- Auto Extraction and Installation of Videogames\\n- Uninstalling Games through GameVault\\n- Uploading Images\\n- Support for more Archive Formats\\n- Bandwidth Control Features\\n- Database Backups & Restorations\\n- Crash Reporting\\n- Random Game Finder\\n\\nSo, what\'s cooking now? We asked for your top three desired features recently, and here are the results:\\n\\n1. UI Redesign for the Library and Installations Tab\\n2. Support for ROMS and Emulators\\n3. Support for extra files like Soundtracks, Mods, etc.\\n\\nBy the way, if you want to take part in polls like this in the future aswell, make sure to become a council member on [Discord](https://discord.gg/NEdNen2dSu)!\\n\\nRight now we\'re knee-deep in redesigning the Library, the heart of our application. Big changes are on the way, waving goodbye to the installations tab and ushering in a sleeker UI for Library, Game View, and Game Settings.\\n\\nHere are some sneak peeks and mockups: (still work in progress):\\n\\n1. Library (Mockup)\\n ![Filters](/img/blog/2023-11-19/filters.png)\\n ![Empty States](/img/blog/2023-11-19/emptystates.png)\\n2. Library (current implementation)\\n ![Library](/img/blog/2023-11-19/library.png)\\n3. Game (Mockup)\\n ![Game View](/img/blog/2023-11-19/game.png)\\n4. Game Settings (Mockup)\\n ![Game Settings](/img/blog/2023-11-19/settings.png)\\n\\nRemember, these are teasers. Anything can look different once it ships. There\'s a lot of work left, and we\'re on it. To be technical here: Most of these modern controls require us to rewrite WPF Controls from the core. On the backend, we\'re not slacking either \u2013 tons of end-to-end tests are being written to ensure our app\'s reliability.\\n\\nExcited about the new UI or got something to say? Head over to [Discord](https://discord.gg/NEdNen2dSu) and spill the beans!\\n\\nWe\'re eager to wrap up these tasks and ship the update out to you guys.\\n\\nWe also wanted to mention we\'ve already crossed 2000 GameVault users with a growing engaged [Discord](https://discord.gg/NEdNen2dSu) community of 350 members!\\n\\nAnd your donations help keeping the lights on, though we\'re not rolling in dough just yet. Every penny counts, and we\'re truly grateful. Thanks a lot. \u2764\ufe0f\\n\\nHelp us promote GameVault among fellow self-hosters. Your efforts could inspire a bored developer to join and contribute to our project!\\n\\nStay tuned for the UI update \u2013 we\'ll be back in touch soon.\\n\\nUntil then, happy gaming! \ud83c\udfae"},{"id":"/2023/07/29/","metadata":{"permalink":"/blog/2023/07/29/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2023-07-29.md","source":"@site/blog/2023-07-29.md","title":"Please help us prioritize!","description":"Hello everyone!","date":"2023-07-29T00:00:00.000Z","tags":[{"inline":true,"label":"community","permalink":"/blog/tags/community"},{"inline":true,"label":"GameVault","permalink":"/blog/tags/game-vault"},{"inline":true,"label":"development","permalink":"/blog/tags/development"},{"inline":true,"label":"roadmap","permalink":"/blog/tags/roadmap"},{"inline":true,"label":"collaboration","permalink":"/blog/tags/collaboration"},{"inline":true,"label":"feedback","permalink":"/blog/tags/feedback"},{"inline":true,"label":"GitHub","permalink":"/blog/tags/git-hub"},{"inline":true,"label":"voting","permalink":"/blog/tags/voting"},{"inline":true,"label":"features","permalink":"/blog/tags/features"},{"inline":true,"label":"platform","permalink":"/blog/tags/platform"},{"inline":true,"label":"Kanban Board","permalink":"/blog/tags/kanban-board"},{"inline":true,"label":"Discord","permalink":"/blog/tags/discord"},{"inline":true,"label":"Council Member","permalink":"/blog/tags/council-member"},{"inline":true,"label":"polls","permalink":"/blog/tags/polls"},{"inline":true,"label":"gaming experience","permalink":"/blog/tags/gaming-experience"}],"readingTime":1.995,"hasTruncateMarker":true,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"Please help us prioritize!","authors":["alfagun74"],"tags":["community","GameVault","development","roadmap","collaboration","feedback","GitHub","voting","features","platform","Kanban Board","Discord","Council Member","polls","gaming experience"]},"unlisted":false,"prevItem":{"title":"A Look Back and a Glimpse Forward","permalink":"/blog/2023/11/20/"},"nextItem":{"title":"Celebrating 600+ Installations and announcing the upcoming big feature","permalink":"/blog/2023/07/24/"}},"content":"Hello everyone!\\n\\nWe hope you\'re all doing well. We wanted to take a moment to express our heartfelt gratitude for the flood of feature requests and bug reports that have been pouring into our issue trackers. \x3c!-- truncate --\x3e Your enthusiasm and dedication to making GameVault even better are truly inspiring to us.\\n\\nAs many of you may already know, GameVault is a passion project for us, and while we are mostly convinced by your fantastic ideas, it may take some time for us to implement them. Our team meetings happen in our free time, and although we genuinely want to incorporate your suggestions into our roadmap, we are limited by the time and capacity we can dedicate to the project. Moreover, we want to ensure that the features we develop are refined, polished, and also the most desired in the users\' opinions, which adds to the timeline.\\n\\nWe believe that collaboration with our incredible community is the key to success, and that\'s why we want to introduce you to our Roadmap. It displays all new issues, planned tasks we want to work on, and all the ongoing work in a well-organized Kanban Board. [You can find it right here.](https://github.com/orgs/Phalcode/projects/4)\\n\\nTo ensure that GameVault\'s development aligns better with your needs, we kindly request your active participation. By voting on GitHub with a Thumbs Up or a Thumbs Down on new and planned issues, you can help us prioritize them effectively. We value your opinion: What features do you feel are most crucial? What aspects of the platform do you find most bothersome? What issues do you see as unnecessary or bloated? Your input will mainly shape the direction we take.\\n\\nIf you\'re eager to go the extra mile and actively contribute to shaping GameVault further, we invite you to [join our Discord community](https://discord.gg/NEdNen2dSu) and becoming a \\"Council Member\\". By becoming a \\"Council Member\\" and enabling Poll Notifications under \\"#Channels & Roles\\", you will have a direct say in the future of GameVault because you will get notifications about opinion polls we run from time to time.\\n\\nWe cannot stress enough how much we appreciate your involvement in our endeavor to create the ultimate gaming experience for all of you. Your passion and feedback are invaluable, and we are committed to making GameVault the best it can be, together.\\n\\nThank you for being part of this amazing journey with us!"},{"id":"/2023/07/24/","metadata":{"permalink":"/blog/2023/07/24/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2023-07-24.md","source":"@site/blog/2023-07-24.md","title":"Celebrating 600+ Installations and announcing the upcoming big feature","description":"Hey everyone,","date":"2023-07-24T00:00:00.000Z","tags":[{"inline":true,"label":"GameVault milestone","permalink":"/blog/tags/game-vault-milestone"},{"inline":true,"label":"official installations","permalink":"/blog/tags/official-installations"},{"inline":true,"label":"Discord community growth","permalink":"/blog/tags/discord-community-growth"},{"inline":true,"label":"gratitude","permalink":"/blog/tags/gratitude"},{"inline":true,"label":"feedback","permalink":"/blog/tags/feedback"},{"inline":true,"label":"love for GameVault","permalink":"/blog/tags/love-for-game-vault"},{"inline":true,"label":"upcoming update","permalink":"/blog/tags/upcoming-update"},{"inline":true,"label":"Installation Pipeline","permalink":"/blog/tags/installation-pipeline"},{"inline":true,"label":"simplifying game installation","permalink":"/blog/tags/simplifying-game-installation"},{"inline":true,"label":"GitHub issue","permalink":"/blog/tags/git-hub-issue"},{"inline":true,"label":"subscription to Updates role","permalink":"/blog/tags/subscription-to-updates-role"},{"inline":true,"label":"Lemmy community launch","permalink":"/blog/tags/lemmy-community-launch"},{"inline":true,"label":"sharing blog posts","permalink":"/blog/tags/sharing-blog-posts"},{"inline":true,"label":"spreading the word","permalink":"/blog/tags/spreading-the-word"},{"inline":true,"label":"support request","permalink":"/blog/tags/support-request"},{"inline":true,"label":"continued support","permalink":"/blog/tags/continued-support"},{"inline":true,"label":"celebration of achievements","permalink":"/blog/tags/celebration-of-achievements"}],"readingTime":2.39,"hasTruncateMarker":true,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"Celebrating 600+ Installations and announcing the upcoming big feature","authors":["alfagun74"],"tags":["GameVault milestone","official installations","Discord community growth","gratitude","feedback","love for GameVault","upcoming update","Installation Pipeline","simplifying game installation","GitHub issue","subscription to Updates role","Lemmy community launch","sharing blog posts","spreading the word","support request","continued support","celebration of achievements"]},"unlisted":false,"prevItem":{"title":"Please help us prioritize!","permalink":"/blog/2023/07/29/"},"nextItem":{"title":"The Migrations are finally completed","permalink":"/blog/2023/07/20/"}},"content":"Hey everyone,\\n\\nWe\'re excited to share some great news with you all! GameVault has reached a small milestone with over 600 official installations of our GameVault Client Application. \x3c!-- truncate --\x3e What\'s even more amazing is that around 200 dedicated users, a third of these installations, have joined our [Discord](https://discord.gg/NEdNen2dSu) community to connect, chat, and share their experiences.\\n\\nWe want to express our immense gratitude for your incredible support, feedback, and love for GameVault. Your ongoing encouragement inspires us to push boundaries and enhance your gaming experience. We\'re thrilled to announce that an awesome update is being worked on right now - the highly anticipated release of GameVault\'s Installation Pipeline!\\n\\n#### GameVault\'s Installation Pipeline\\n\\nThe Installation Pipeline is designed to revolutionize how you install and manage your games. It was suggested by members on our [Discord server](https://discord.gg/NEdNen2dSu). We understand the challenges of navigating through different installation processes, especially for family members who may not be tech-savvy. With the Installation Pipeline, our goal is to simplify the entire process and make it user-friendly. Whether you\'re an experienced gamer or not, this update will make installing games easier for you.\\n\\nYou can read the details [here on the GitHub issue](https://github.com/Phalcode/gamevault-app/issues/18).\\n\\nStay tuned for its upcoming release, and to be among the first to try out this awesome feature, make sure to subscribe to the `@Updates` Role on our [Discord server](https://discord.gg/NEdNen2dSu) , if you haven\'t already. We\'ll ping you as soon as it\'s live!\\n\\n#### Join us on Lemmy\\n\\nTo further connect with our amazing community, we\'re excited to announce the launch of our [official Lemmy community](https://lemmy.world/c/phalcode). From now on, we\'ll also regularly share new blog posts there, providing you with more ways to stay informed and engaged. Join the Lemmy forum and become part of the growing GameVault community!\\n\\n#### Share GameVault with Others\\n\\nAs we celebrate this milestone and eagerly anticipate more exciting updates, we invite you to spread the word about GameVault among your friends, family, and gaming or self-hosting communities. Your personal recommendations and referrals have played a significant role in our journey so far, and we believe they\'ll continue to do so in the future.\\n\\nWe want to express our heartfelt appreciation for the feature requests, discussions, and invaluable help on our GitHub. Your support and collaborative efforts help a lot.\\n\\n#### Support Us\\n\\nAs we move forward, we kindly ask for your continued support. GameVault\'s success is currently solely built upon our incredible community, and your encouragement is what fuels us. If you love our app and believe in our vision, please consider supporting us in any way you can. It could even be something simple like a rating on the Microsoft Store. Your backing empowers us to keep our hard work going.\\n\\nWe\'re eagerly looking forward to celebrating more achievements with all of you.\\n\\nStay tuned, stay connected, and let\'s continue this journey together!"},{"id":"/2023/07/20/","metadata":{"permalink":"/blog/2023/07/20/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2023-07-20.md","source":"@site/blog/2023-07-20.md","title":"The Migrations are finally completed","description":"Hey folks,","date":"2023-07-20T00:00:00.000Z","tags":[{"inline":true,"label":"app name migration","permalink":"/blog/tags/app-name-migration"},{"inline":true,"label":"Microsoft Store publication","permalink":"/blog/tags/microsoft-store-publication"},{"inline":true,"label":"surge of new users","permalink":"/blog/tags/surge-of-new-users"},{"inline":true,"label":"Discord server promotion","permalink":"/blog/tags/discord-server-promotion"},{"inline":true,"label":"spreading the word","permalink":"/blog/tags/spreading-the-word"},{"inline":true,"label":"logo deciphering","permalink":"/blog/tags/logo-deciphering"},{"inline":true,"label":"box representation","permalink":"/blog/tags/box-representation"},{"inline":true,"label":"keyhole representation","permalink":"/blog/tags/keyhole-representation"},{"inline":true,"label":"logo concept discussion","permalink":"/blog/tags/logo-concept-discussion"},{"inline":true,"label":"Discord channel","permalink":"/blog/tags/discord-channel"}],"readingTime":0.615,"hasTruncateMarker":true,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"The Migrations are finally completed","authors":["alfagun74"],"tags":["app name migration","Microsoft Store publication","surge of new users","Discord server promotion","spreading the word","logo deciphering","box representation","keyhole representation","logo concept discussion","Discord channel"]},"unlisted":false,"prevItem":{"title":"Celebrating 600+ Installations and announcing the upcoming big feature","permalink":"/blog/2023/07/24/"},"nextItem":{"title":"Quick Migration Update and new Logo","permalink":"/blog/2023/07/19/"}},"content":"Hey folks,\\n\\nGreat news. We\'ve successfully migrated our App name in its entirety and will resume advertising as soon as it\'s published on the Microsoft Store. \x3c!-- truncate --\x3e\\n\\nJust a heads up, there might be a surge of new users joining the [Discord](https://discord.gg/NEdNen2dSu) server due to us promoting GameVault across all available platforms now.\\n\\nYou\'re welcome to join in and spread the word about GameVault with your friends, family, social network, or colleagues!\\n\\n**Let\'s decipher the mystery behind the new logo:**\\n![logo](/img/blog/2023-07-19/logo-text-and-image-sbs.png)\\n\\n- The Box represents a Vault with a Keyhole, but it also symbolizes a game dice.\\n- The Keyhole represents a Keyhole, and simultaneously signifies a game piece.\\n\\nDid you find the logo concept creative? Share your thoughts on [discord](https://discord.gg/NEdNen2dSu)!"},{"id":"/2023/07/19/","metadata":{"permalink":"/blog/2023/07/19/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2023-07-19.md","source":"@site/blog/2023-07-19.md","title":"Quick Migration Update and new Logo","description":"Hey guys,","date":"2023-07-19T00:00:00.000Z","tags":[{"inline":true,"label":"name migration progress","permalink":"/blog/tags/name-migration-progress"},{"inline":true,"label":"backend application migration","permalink":"/blog/tags/backend-application-migration"},{"inline":true,"label":"documentation migration","permalink":"/blog/tags/documentation-migration"},{"inline":true,"label":"domain acquisition","permalink":"/blog/tags/domain-acquisition"},{"inline":true,"label":"Subreddit migration","permalink":"/blog/tags/subreddit-migration"},{"inline":true,"label":"Lemmy community","permalink":"/blog/tags/lemmy-community"},{"inline":true,"label":"Client Application update","permalink":"/blog/tags/client-application-update"},{"inline":true,"label":"testing","permalink":"/blog/tags/testing"},{"inline":true,"label":"new logo","permalink":"/blog/tags/new-logo"},{"inline":true,"label":"speculation","permalink":"/blog/tags/speculation"},{"inline":true,"label":"Discord channel","permalink":"/blog/tags/discord-channel"},{"inline":true,"label":"migration finalization","permalink":"/blog/tags/migration-finalization"}],"readingTime":0.965,"hasTruncateMarker":true,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"Quick Migration Update and new Logo","authors":["alfagun74"],"tags":["name migration progress","backend application migration","documentation migration","domain acquisition","Subreddit migration","Lemmy community","Client Application update","testing","new logo","speculation","Discord channel","migration finalization"]},"unlisted":false,"prevItem":{"title":"The Migrations are finally completed","permalink":"/blog/2023/07/20/"},"nextItem":{"title":"A New Name","permalink":"/blog/2023/07/15/"}},"content":"Hey guys,\\n\\nWe have a brief update on the progress of the name migration.\\n\\nWe\'ve successfully completed the migration of the backend application, which is now accessible as `gamevault-backend`. \x3c!-- truncate --\x3e\\n\\nFurthermore, we\'ve migrated the documentation and acquired this domain gamevau.lt. We\'ve set up redirects for our previous domain and the demo server as well.\\n\\nLastly we migrated our Subreddit to [r/Phalcode](https://reddit.com/r/Phalcode) and opened up a new community on [Lemmy](https://lemmy.world/c/phalcode). All further Updates and discussions regarding GameVault can be found there.\\n\\nWe\'re nearly finished, you might say.\\n\\nThe only remaining task is the Client Application. We\'re actively working on it and currently testing the application on our developer edition. Soon, you\'ll be able to seamlessly update your client with the new name and appearance.\\n\\nIn the meantime, our graphic designer has crafted a fresh logo for our new name, GameVault.\\n\\n![logo](/img/blog/2023-07-19/logo-text-and-image-sbs.png)\\n\\nTo make good use of your time while the migrations are in progress, what do you speculate the new logo represents?\\n\\nShare your theories in gamevaults #chat channel on [discord](https://discord.gg/NEdNen2dSu)! We\'ll reveal the answer and shoutout the winner(s) in the next blog post, once the migration is finalized!\\n\\nUntil then \u270c\ufe0f"},{"id":"/2023/07/15/","metadata":{"permalink":"/blog/2023/07/15/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2023-07-15.md","source":"@site/blog/2023-07-15.md","title":"A New Name","description":"Hey everyone,","date":"2023-07-15T00:00:00.000Z","tags":[{"inline":true,"label":"poll results","permalink":"/blog/tags/poll-results"},{"inline":true,"label":"renaming app","permalink":"/blog/tags/renaming-app"},{"inline":true,"label":"community feedback","permalink":"/blog/tags/community-feedback"},{"inline":true,"label":"GameStash","permalink":"/blog/tags/game-stash"},{"inline":true,"label":"GameVault","permalink":"/blog/tags/game-vault"},{"inline":true,"label":"GameShelf","permalink":"/blog/tags/game-shelf"},{"inline":true,"label":"Harbor","permalink":"/blog/tags/harbor"},{"inline":true,"label":"GameHub","permalink":"/blog/tags/game-hub"},{"inline":true,"label":"market analysis","permalink":"/blog/tags/market-analysis"},{"inline":true,"label":"new name announcement","permalink":"/blog/tags/new-name-announcement"},{"inline":true,"label":"GameVault domain","permalink":"/blog/tags/game-vault-domain"},{"inline":true,"label":"special thanks","permalink":"/blog/tags/special-thanks"},{"inline":true,"label":"Selfhosted Podcast","permalink":"/blog/tags/selfhosted-podcast"},{"inline":true,"label":"Self-Hosted Newsletter","permalink":"/blog/tags/self-hosted-newsletter"},{"inline":true,"label":"transition process","permalink":"/blog/tags/transition-process"}],"readingTime":3.85,"hasTruncateMarker":true,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"A New Name","authors":["alfagun74"],"tags":["poll results","renaming app","community feedback","GameStash","GameVault","GameShelf","Harbor","GameHub","market analysis","new name announcement","GameVault domain","special thanks","Selfhosted Podcast","Self-Hosted Newsletter","transition process"]},"unlisted":false,"prevItem":{"title":"Quick Migration Update and new Logo","permalink":"/blog/2023/07/19/"},"nextItem":{"title":"A Closer Look at GameVaults \'Source-Available\' Nature","permalink":"/blog/2023/07/13/"}},"content":"Hey everyone,\\n\\nWe are thrilled to announce that the poll for choosing a new name for our app is finally over. The process of transitioning to the new name will commence very soon, and we can\'t wait to share the exciting updates with you.\x3c!-- truncate --\x3e\\n\\nBut first, let\'s dive into the poll results and shed some light on the important facts without further delay:\\n\\n## Summary\\n\\nIn total, 71 people participated in the poll, providing us with valuable data to draw conclusions from. Here\'s a summary of the key findings:\\n\\n- 52.1% of the community voted against using any terms related to piracy in the app. We understand and respect this choice because it would harm our business and attract the wrong users, as we have no affiliation with piracy.\\n\\n- 42.3% of the community voted to recommend the app under a different name but not with its current name. This feedback motivated us to rename the app, confirming that it wasn\'t just a few critics on Reddit. We want to expand our community to include the families, friends, and colleagues of these people. So please, help us spread the word about the name change!\\n\\n- 36.6% of you said you wouldn\'t contribute to our app at all solely because of its name, even if you had the opportunity. We depend on these contributions to grow and improve, so we now encourage you to participate!\\n\\nWithout further ado, here are the top 5 names that emerged as winners in the poll:\\n\\n1. GameStash (38%)\\n2. GameVault (35.2%)\\n3. GameShelf (31%)\\n4. Harbor (29.6%)\\n5. GameHub (28.2%)\\n\\nAs mentioned earlier, we conducted the poll without conducting market analysis beforehand. However, we recognized the significance of making an informed decision for the benefit of the community. Consequently, we proceeded to analyze each name after the poll to ensure the chosen name resonates with our vision.\\n\\nAllow us to share the summarized results of our market analysis:\\n\\n## Market Analysis\\n\\n### 1. GameStash\\n\\nGoogle Search Results: ~33,600 \\nPossible Domains: gamestash.de\\n\\n- There\'s already an app called [GameStash](https://gamestash.app/) that offers similar features to ours.\\n\\n### 2. GameVault\\n\\nGoogle Search Results: ~800,000 \\nPossible Domains: gamevau.lt, game-vault.de\\n\\n- The term \\"GameVault\\" is associated with a popular online casino/gambling application called [GameVault999](https://gamevault999.com/).\\n\\n### 3. GameShelf\\n\\nGoogle Search Results: ~560,000 \\nPossible Domains: gameshelf.de\\n\\n- The name \\"Gameshelf\\" is already used by two existing applications. One is a [Board-Game-Collection Viewer](https://gameshelf.io/), and the other is a [Gaming Backlog](https://gameshelf.dev) app.\\n\\n### 4. Harbor\\n\\nGoogle Search Results: ~393,000,000 \\nPossible Domains: harborapp.de\\n\\n- \\"Harbor\\" is a very common word, making it challenging to find a suitable domain that aligns with our brand identity.\\n\\n- Additionally, there\'s a well-known app called [Harbor on the Market](https://goharbor.io) related to Docker/Kubernetes.\\n\\n### 5. GameHub\\n\\nGoogle Search Results: ~5,690,000\\nPossible Domains: gamehubapp.de\\n\\n- [GameHub](https://github.com/tkashkin/GameHub) is a popular game library manager\\n- it also sounds like a popular adult site \ud83d\ude01\\n\\n## What\'s Next?\\n\\nWe understand your eagerness for a new name, and we are equally committed to distancing ourselves from the old one. Taking into account all the suggested names and feedback, we engaged in extensive internal brainstorming, free from outside influences.\\n\\nWe sought a name that is descriptive, intuitive, and effectively conveys the purpose of our app. Additionally, we aimed for a name that is easily memorable and emphasizes the ownership and control of a self-hosted server, security, and exclusivity.\\n\\nIntroducing our new name: **GameVault** \\nAvailable soon under this domain: [gamevau.lt](https://gamevau.lt)\\n\\nWe have already secured the domain and registered the name wherever possible. The transition process will commence shortly. We are eager to hear your thoughts on the new name. Do you like it?\\n\\n## Special Thanks \u2764\ufe0f\\n\\nWell, as you all know, this was quite a journey to get here, and we wanted to give our special thanks to:\\n\\n- Everybody who gave this project\'s idea a chance, even if the name was kind of weird.\\n\\n- Everybody who made suggestions on our [Discord](https://discord.gg/NEdNen2dSu) server and participated in the discussions.\\n\\n- Everybody who voted.\\n\\n- A special shoutout to @KairuByte on [Discord](https://discord.gg/NEdNen2dSu) for coming up with the name GameVault.\\n\\n- We would also like to extend our gratitude to [The Selfhosted Podcast](https://selfhosted.show/101?t=2731) for discussing our app. (Brent, we are excited to hear your thoughts on the new name from a marketing standpoint \ud83d\ude1c)\\n\\n- Last but not least, thank you to [The Self-Hosted Newsletter](https://selfh.st/newsletter/2023-07-07/) for mentioning our release.\\n\\nThank you all for your continued support!\\n\\nWe will keep you updated as the transition unfolds. In the meantime, head over to our [Discord](https://discord.gg/NEdNen2dSu) channel to celebrate and share your thoughts on the new name.\\n\\nStay tuned!"},{"id":"/2023/07/13/","metadata":{"permalink":"/blog/2023/07/13/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2023-07-13.md","source":"@site/blog/2023-07-13.md","title":"A Closer Look at GameVaults \'Source-Available\' Nature","description":"Hey everyone,","date":"2023-07-13T00:00:00.000Z","tags":[{"inline":true,"label":"source-available software","permalink":"/blog/tags/source-available-software"},{"inline":true,"label":"open-source","permalink":"/blog/tags/open-source"},{"inline":true,"label":"transparency","permalink":"/blog/tags/transparency"},{"inline":true,"label":"control","permalink":"/blog/tags/control"},{"inline":true,"label":"software development","permalink":"/blog/tags/software-development"},{"inline":true,"label":"code access","permalink":"/blog/tags/code-access"},{"inline":true,"label":"hybrid model","permalink":"/blog/tags/hybrid-model"},{"inline":true,"label":"software licensing","permalink":"/blog/tags/software-licensing"},{"inline":true,"label":"revenue generation","permalink":"/blog/tags/revenue-generation"},{"inline":true,"label":"user engagement","permalink":"/blog/tags/user-engagement"}],"readingTime":2.51,"hasTruncateMarker":true,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"A Closer Look at GameVaults \'Source-Available\' Nature","authors":["alfagun74"],"tags":["source-available software","open-source","transparency","control","software development","code access","hybrid model","software licensing","revenue generation","user engagement"]},"unlisted":false,"prevItem":{"title":"A New Name","permalink":"/blog/2023/07/15/"},"nextItem":{"title":"Battling Harassment and Trolls in Our App Community","permalink":"/blog/2023/07/09/"}},"content":"Hey everyone,\\n\\ntoday i want to clarify why GameVault isn\'t considered \\"open-source\\" by definition. \x3c!-- truncate --\x3e\\n\\nYou see, GameVault is what we like to call [\\"source-available\\"](https://wikipedia.org/wiki/Source-available_software) software. This means that our code is open for you to explore and modify, but it doesn\'t fully meet all the criteria of being considered open-source. I want to take a moment to explain what open-source truly means and why we\'ve taken a slightly different approach.\\n\\nAccording to the widely recognized definitions, [\\"open-source\\"](https://wikipedia.org/wiki/Open-source_software) software, as one would think, not only provides access to the source code but also offers certain freedoms to its users. It allows them to use, modify, and distribute the software freely, even for commercial purposes.\\n\\nFor a self-hosted app like GameVault, we believe it\'s crucual to disclose the source code. We want you, our users, to have full transparency and control over the software you use on your servers. We don\'t want you to be unaware of what\'s happening behind the scenes, as is sometimes the case with closed-source applications like Plex, for example.\\n\\nNow, you may be wondering why we didn\'t make GameVault fully open-source. The answer lies in our desire to protect our code from unauthorized use and commercial exploitation. While we absolutely encourage you to copy, modify, and share our code for personal use, we want to prevent others from profiting off our hard work by selling our software without our consent.\\n\\nIt\'s important to acknowledge that maintaining and developing a software project requires resources. While we admire the open-source community and its valuable contributions, sustaining GameVault solely through donations or offering it for free indefinitely is not feasible. For instance, Jellyfin, a popular open-source app developed over a decade, generates only around $13,500 per year (according to their opencollective page). In contrast, Plex, a closed-source alternative, earns a significant $8.5 million annually. Our company\'s main goal is to keep the core functionality of GameVault free, but we also need to explore ways to generate revenue in order to support its future growth and improvement. We are currently considering monetizing additional convenience features for the Client Application in the future, although nothing has been finalized yet.\\n\\nWe genuinely appreciate your understanding. As a small business with just two members, we strive to provide you with a valuable product but cannot continue to do so as volunteers indefinitely. Sustaining losses in the long term would not be sustainable, especially considering our local tax obligations. We have families and commitments that cannot be neglected, and this project is not our primary job. Therefore, please understand that GameVault may not strictly align with the traditional definition of \\"open-source\\". Our intention is to be transparent and present our perspective. Your understanding, support, and empathy mean a great deal to us.\\n\\nIf you have any thoughts or comments on this topic, we\'d be more than happy to hear from you. Feel free to share your feedback on our [Discord](https://discord.gg/NEdNen2dSu) server. We truly value your input and look forward to engaging with you there."},{"id":"/2023/07/09/","metadata":{"permalink":"/blog/2023/07/09/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2023-07-09.md","source":"@site/blog/2023-07-09.md","title":"Battling Harassment and Trolls in Our App Community","description":"Hey folks,","date":"2023-07-09T00:00:00.000Z","tags":[{"inline":true,"label":"harassment","permalink":"/blog/tags/harassment"},{"inline":true,"label":"blackmail","permalink":"/blog/tags/blackmail"},{"inline":true,"label":"threats","permalink":"/blog/tags/threats"},{"inline":true,"label":"spam","permalink":"/blog/tags/spam"},{"inline":true,"label":"trolls","permalink":"/blog/tags/trolls"},{"inline":true,"label":"negative narratives","permalink":"/blog/tags/negative-narratives"},{"inline":true,"label":"safe environment","permalink":"/blog/tags/safe-environment"},{"inline":true,"label":"racist","permalink":"/blog/tags/racist"},{"inline":true,"label":"developers","permalink":"/blog/tags/developers"},{"inline":true,"label":"public","permalink":"/blog/tags/public"},{"inline":true,"label":"creepy behavior","permalink":"/blog/tags/creepy-behavior"},{"inline":true,"label":"app","permalink":"/blog/tags/app"},{"inline":true,"label":"support","permalink":"/blog/tags/support"},{"inline":true,"label":"financial assistance","permalink":"/blog/tags/financial-assistance"},{"inline":true,"label":"motivation","permalink":"/blog/tags/motivation"},{"inline":true,"label":"GameVault app","permalink":"/blog/tags/game-vault-app"},{"inline":true,"label":"bugs","permalink":"/blog/tags/bugs"},{"inline":true,"label":"feature requests","permalink":"/blog/tags/feature-requests"},{"inline":true,"label":"improvement","permalink":"/blog/tags/improvement"},{"inline":true,"label":"success","permalink":"/blog/tags/success"},{"inline":true,"label":"engagement","permalink":"/blog/tags/engagement"}],"readingTime":1.955,"hasTruncateMarker":true,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"Battling Harassment and Trolls in Our App Community","authors":["alfagun74"],"tags":["harassment","blackmail","threats","spam","trolls","negative narratives","safe environment","racist","developers","public","creepy behavior","app","support","financial assistance","motivation","GameVault app","bugs","feature requests","improvement","success","engagement"]},"unlisted":false,"prevItem":{"title":"A Closer Look at GameVaults \'Source-Available\' Nature","permalink":"/blog/2023/07/13/"},"nextItem":{"title":"Choosing a New, Family-Friendly Name for this project!","permalink":"/blog/2023/07/08/"}},"content":"Hey folks,\\n\\nWe have an important update to share with you all while our poll is in progress. It has come to our attention that a group of individuals has been engaging in harassing, blackmailing, and threatening behavior towards us. \x3c!-- truncate --\x3e\\n\\nIt began with spam on our Issue Trackers and [Discord](https://discord.gg/NEdNen2dSu) Server but this situation has escalated to the point where these individuals went so far as to search me up on LinkedIn and threaten to inform my employer with baseless accusations of racism because of trivial reasons like the branch name in our github project being \\"master\\". Moreover, we have received reports that these trolls have extended their actions directly to other members of this server, attempting to spread negative narratives and disrupting the community atmosphere.\\n\\nTo address this issue, we kindly request that you promptly report any encounters with these trolls to both [Discord](https://discord.gg/NEdNen2dSu) and our dedicated team of moderators. By doing so, we can take appropriate measures to handle the situation and maintain a safe environment for all.\\n\\nWe would like to emphasize that we are not racist individuals, but rather developers who decided to share our hard work with the community, hoping to bring joy and utility to everyone. Unfortunately, we did not anticipate encountering such creepy behavior when we made the project public. It has made us question whether it was the right decision to open up our work in the first place.\\n\\nIf you appreciate our efforts and would like to support us and the app, we humbly ask for your financial assistance. Even a small contribution of five bucks on [Kofi](https://ko-fi.com/phalcode) would go a long way in helping us maintain our motivation and dedication. Alternatively, if monetary support isn\'t possible, we would be incredibly grateful if you could share kind words about how the GameVault app has positively impacted your life in the #chat channel. Your encouragement means the world to us. \ud83e\udd70\\n\\nIn addition, we encourage you to continue reporting any bugs you encounter and submitting feature requests in the respective GitHub trackers. With your valuable input, we can continue improving the app and making it even better.\\n\\nRemember, the success of this project relies on your support and engagement. Let\'s stand together against these trolls and ensure a positive and inclusive community experience. Thank you for your attention and understanding."},{"id":"/2023/07/08/","metadata":{"permalink":"/blog/2023/07/08/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2023-07-08.md","source":"@site/blog/2023-07-08.md","title":"Choosing a New, Family-Friendly Name for this project!","description":"Hello, everyone!","date":"2023-07-08T00:00:00.000Z","tags":[{"inline":true,"label":"source-available","permalink":"/blog/tags/source-available"},{"inline":true,"label":"gaming platform","permalink":"/blog/tags/gaming-platform"},{"inline":true,"label":"GameVault","permalink":"/blog/tags/game-vault"},{"inline":true,"label":"new name","permalink":"/blog/tags/new-name"},{"inline":true,"label":"family-friendly","permalink":"/blog/tags/family-friendly"},{"inline":true,"label":"poll","permalink":"/blog/tags/poll"},{"inline":true,"label":"AI-generated names","permalink":"/blog/tags/ai-generated-names"},{"inline":true,"label":"feedback","permalink":"/blog/tags/feedback"},{"inline":true,"label":"inclusivity","permalink":"/blog/tags/inclusivity"},{"inline":true,"label":"user participation","permalink":"/blog/tags/user-participation"},{"inline":true,"label":"announcement","permalink":"/blog/tags/announcement"},{"inline":true,"label":"decision-making","permalink":"/blog/tags/decision-making"},{"inline":true,"label":"community","permalink":"/blog/tags/community"},{"inline":true,"label":"platform values","permalink":"/blog/tags/platform-values"},{"inline":true,"label":"voting","permalink":"/blog/tags/voting"},{"inline":true,"label":"future development","permalink":"/blog/tags/future-development"}],"readingTime":1.26,"hasTruncateMarker":true,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"Choosing a New, Family-Friendly Name for this project!","authors":["alfagun74"],"tags":["source-available","gaming platform","GameVault","new name","family-friendly","poll","AI-generated names","feedback","inclusivity","user participation","announcement","decision-making","community","platform values","voting","future development"]},"unlisted":false,"prevItem":{"title":"Battling Harassment and Trolls in Our App Community","permalink":"/blog/2023/07/09/"},"nextItem":{"title":"Introducing GameVault \ud83d\ude80 - The self-hosted gaming platform for DRM-free games","permalink":"/blog/2023/07/01/"}},"content":"Hello, everyone!\\n\\nWe have an important announcement to share about our [source-available](https://en.wikipedia.org/wiki/Source-available_software) gaming platform, project. We have listened to your feedback and concerns, and now we need your help in choosing a new, family-friendly name that better reflects our platform\'s values. \x3c!-- truncate --\x3e To make this decision-making process more convenient, we have created a poll with 100 potential names, suggested by you on our [Discord](https://discord.gg/NEdNen2dSu), some of which were generated by AI. Your participation in shaping the future of our platform is greatly appreciated.\\n\\nWe kindly request your support in selecting a new name for our gaming platform. The poll offers a variety of names, and we ask that you choose at least 10 names (10%) that appeal to you. By gathering diverse input and minimizing bias, we aim to create an inclusive and enjoyable experience for all users. We apologize if the current name has caused any discomfort, and we are committed to creating a welcoming environment for gamers.\\n\\nTo cast your votes and contribute to the selection of a new, family-friendly name for our [source-available](https://en.wikipedia.org/wiki/Source-available_software) gaming platform, please click on the link provided at the end of this post. Your voice matters, and together, we can find a name that truly represents our app\'s essence. The results will be announced on this blog around July 15, 2023.\\n\\nWe sincerely appreciate your support and encourage you to stay tuned for updates as we continue to improve our platform based on your valuable feedback.\\n\\nLink to the poll: [https://forms.gle/cYsURG6BqMXcxE3B8](https://forms.gle/cYsURG6BqMXcxE3B8)\\n\\nHappy voting!"},{"id":"/2023/07/01/","metadata":{"permalink":"/blog/2023/07/01/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2023-07-01.md","source":"@site/blog/2023-07-01.md","title":"Introducing GameVault \ud83d\ude80 - The self-hosted gaming platform for DRM-free games","description":"Hey Guys,","date":"2023-07-01T00:00:00.000Z","tags":[{"inline":true,"label":"gaming","permalink":"/blog/tags/gaming"},{"inline":true,"label":"GameVault","permalink":"/blog/tags/game-vault"},{"inline":true,"label":"source-available","permalink":"/blog/tags/source-available"},{"inline":true,"label":"self-hosted","permalink":"/blog/tags/self-hosted"},{"inline":true,"label":"alternative","permalink":"/blog/tags/alternative"},{"inline":true,"label":"cloud-based game platforms","permalink":"/blog/tags/cloud-based-game-platforms"},{"inline":true,"label":"DRM-free games","permalink":"/blog/tags/drm-free-games"},{"inline":true,"label":"file server","permalink":"/blog/tags/file-server"},{"inline":true,"label":"multi-user authentication","permalink":"/blog/tags/multi-user-authentication"},{"inline":true,"label":"metadata","permalink":"/blog/tags/metadata"},{"inline":true,"label":"RAWG API","permalink":"/blog/tags/rawg-api"},{"inline":true,"label":"health monitoring","permalink":"/blog/tags/health-monitoring"},{"inline":true,"label":"API","permalink":"/blog/tags/api"},{"inline":true,"label":"Discord server","permalink":"/blog/tags/discord-server"},{"inline":true,"label":"Reddit forum","permalink":"/blog/tags/reddit-forum"},{"inline":true,"label":"Lemmy forum","permalink":"/blog/tags/lemmy-forum"}],"readingTime":1.78,"hasTruncateMarker":true,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"Introducing GameVault \ud83d\ude80 - The self-hosted gaming platform for DRM-free games","authors":["alfagun74"],"tags":["gaming","GameVault","source-available","self-hosted","alternative","cloud-based game platforms","DRM-free games","file server","multi-user authentication","metadata","RAWG API","health monitoring","API","Discord server","Reddit forum","Lemmy forum"]},"unlisted":false,"prevItem":{"title":"Choosing a New, Family-Friendly Name for this project!","permalink":"/blog/2023/07/08/"}},"content":"Hey Guys,\\n\\nOur team has been working tirelessly for the past year on creating GameVault, the source-available, self-hosted, and free alternative to traditional cloud-based game platforms like Steam, Origin, Epic Games, and GoG. We are excited to share that GameVault is now available for everyone to use, and we are delighted to disclose it to the community. \x3c!-- truncate --\x3e\\n\\nWith GameVault, you can play and track games together with your friends on a shared file server, free from any restrictions that traditional game platforms may impose. We have designed it to work with DRM-free games, providing a unique solution for those who want a more flexible and open approach to gaming. Think of it like Jellyfin, but for Videogames.\\n\\nGameVault offers a self-hosted approach that gives you complete control over your gaming experience. The platform enables you to browse your server\'s game collection, securely download games, launch and play them, and even track your playtimes and progress - regardless of whether the server is offline. Additionally, you can compare stats and play states with other users on the server.\\n\\nOur server features offer automatic indexing of games on the file system into a database, enrichment of games with metadata like tags and genres using RAWG API, multi-user authentication, and configurable logging. We have also implemented health monitoring, full-text search, filters, sorting, pagination, and a fully documented API. The GameVault platform is highly configurable to suit your needs.\\n\\nWe are thrilled that you have found us, and we invite you to try GameVault today. We would be grateful for any contributions, feedback, bug reports, and feature requests you might have. You can also support us by donating using the links provided on our website. If you have any questions or would like to connect with other GameVault users, please join our [Discord](https://discord.gg/NEdNen2dSu), Reddit and Lemmy communities - links to which are available in the footer.\\n\\nWe are passionate about creating a gaming experience that is more open, flexible, and enjoyable for everyone. We hope you will join us on this journey and experience the benefits of a truly source-available alternative to traditional game platforms with GameVault."}]}}')}}]); \ No newline at end of file diff --git a/assets/js/f81c1134.db435f8e.js b/assets/js/f81c1134.db435f8e.js new file mode 100644 index 000000000..eade619f3 --- /dev/null +++ b/assets/js/f81c1134.db435f8e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgamevault_docs=self.webpackChunkgamevault_docs||[]).push([[5749],{7735:e=>{e.exports=JSON.parse('{"archive":{"blogPosts":[{"id":"/2024/12/22/","metadata":{"permalink":"/blog/2024/12/22/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2024-12-22.md","source":"@site/blog/2024-12-22.md","title":"GameVault+ Family & Friends Plan Launches with Exciting New Integrations!","description":"Hey everyone,","date":"2024-12-22T00:00:00.000Z","tags":[{"inline":true,"label":"GameVault","permalink":"/blog/tags/game-vault"},{"inline":true,"label":"update","permalink":"/blog/tags/update"},{"inline":true,"label":"Steam integration","permalink":"/blog/tags/steam-integration"},{"inline":true,"label":"Discord integration","permalink":"/blog/tags/discord-integration"},{"inline":true,"label":"Family & Friends Plan","permalink":"/blog/tags/family-friends-plan"},{"inline":true,"label":"holidays","permalink":"/blog/tags/holidays"},{"inline":true,"label":"Christmas theme","permalink":"/blog/tags/christmas-theme"},{"inline":true,"label":"new features","permalink":"/blog/tags/new-features"},{"inline":true,"label":"bug fixes","permalink":"/blog/tags/bug-fixes"},{"inline":true,"label":"gaming","permalink":"/blog/tags/gaming"},{"inline":true,"label":"community feedback","permalink":"/blog/tags/community-feedback"},{"inline":true,"label":"Phalcode","permalink":"/blog/tags/phalcode"},{"inline":true,"label":"GameVault+","permalink":"/blog/tags/game-vault"}],"readingTime":2.37,"hasTruncateMarker":false,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"GameVault+ Family & Friends Plan Launches with Exciting New Integrations!","authors":["alfagun74"],"tags":["GameVault","update","Steam integration","Discord integration","Family & Friends Plan","holidays","Christmas theme","new features","bug fixes","gaming","community feedback","Phalcode","GameVault+"]},"unlisted":false,"nextItem":{"title":"An update so major, we could have built the product from scratch.","permalink":"/blog/2024/10/20/"}},"content":"Hey everyone,\\n\\nWe\u2019ve got some incredible news to share! Your feedback on Reddit, Lemmy and [our Discord server](https://discord.gg/NEdNen2dSu) regarding our latest release has guided us as we work to make GameVault better for everyone. Today, we\u2019re excited to introduce some major updates along with a special offer \u2014 just in time for the holidays!\\n\\n### What\u2019s New?\\n\\n#### 1. **A Fresh Look for our website**\\n\\nNavigating our website is now easier than ever. You told us it felt confusing and didn\u2019t explain GameVault or its use well. We\u2019ve streamlined the design to make it simpler, more intuitive, and focused on showcasing everything GameVault has to offer.\\n\\n#### 2. **The Family & Friends Plan**\\n\\nWe heard you: GameVault+ needed an affordable plan for families and groups. That\u2019s why we\u2019re introducing the **Family & Friends Plan** - perfect for sharing the GameVault+ experience with up to six members, including yourself for just \u20ac8.99/month.\\n\\n##### Special Offer\\n\\n**And because we\u2019re in such a festive Christmas mood, we\u2019ve decided to gift away the Family & Friends Plan for one month!** If you have a group and want to try GameVault+ out and see if it\u2019s something you\u2019ll enjoy, just use the code: **WEAREFAMILY** at checkout. [Subscribe now here!](https://phalco.de/products/gamevault-plus/checkout). The special offer is valid until the end of January.\\n\\n### New Features for GameVault+\\n\\n#### **Steam Integration (+)**\\n\\nKeep your gaming library organized like never before! With our new Steam integration, you can easily sync all of your GameVault games to Steam as Non-Steam Game Shortcuts. This feature allows you to access and launch your GameVault games directly from Steam, keeping everything in one place without the hassle of managing multiple platforms. It\u2019s perfect for users who prefer Steam\u2019s interface and want a seamless experience with all their games, whether purchased on Steam or GameVault.\\n\\n#### **Discord Integration (+)**\\n\\nShow off what you\'re playing in real-time with Discord\'s Presence API! This integration lets you share your current game status with friends on Discord, so they can see exactly what you\'re up to.\\n\\n#### **Festive Update (+)**\\n\\nWe have added a Christmas theme to bring some holiday cheer into the application.\\n\\n### General Improvements\\n\\nWe\u2019ve fixed several bugs and made key improvements for a better overall experience, including better offline handling, smoother downloads, and improved media features.\\n\\n### About the Microsoft Store\\n\\nA quick note: Due to new Microsoft verification requirements, updates are temporarily delayed on the Microsoft Store. However, the Family & Friends Plan and all new updates are live everywhere else. Also older GameVault versions are fully compatible with the new family plan.\\n\\n---\\n\\nThis update was shaped by your feedback, and we\u2019d love to hear your thoughts on it! Keep sharing your ideas with us\u2014we\'re building something truly special together. While it\'s a niche product, it\'s one that we all needed.\\n\\n**Happy holidays from the Phalcode team!**"},{"id":"/2024/10/20/","metadata":{"permalink":"/blog/2024/10/20/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2024-10-20.md","source":"@site/blog/2024-10-20.md","title":"An update so major, we could have built the product from scratch.","description":"Hello, GameVault Community!","date":"2024-10-20T00:00:00.000Z","tags":[{"inline":true,"label":"GameVault","permalink":"/blog/tags/game-vault"},{"inline":true,"label":"Client Update","permalink":"/blog/tags/client-update"},{"inline":true,"label":"Server Update","permalink":"/blog/tags/server-update"},{"inline":true,"label":"metadata framework","permalink":"/blog/tags/metadata-framework"},{"inline":true,"label":"plugin system","permalink":"/blog/tags/plugin-system"},{"inline":true,"label":"parental control","permalink":"/blog/tags/parental-control"},{"inline":true,"label":"age restrictions","permalink":"/blog/tags/age-restrictions"},{"inline":true,"label":"theme","permalink":"/blog/tags/theme"},{"inline":true,"label":"app optimization","permalink":"/blog/tags/app-optimization"},{"inline":true,"label":"analytics","permalink":"/blog/tags/analytics"},{"inline":true,"label":"notes","permalink":"/blog/tags/notes"},{"inline":true,"label":"community management","permalink":"/blog/tags/community-management"}],"readingTime":2.515,"hasTruncateMarker":true,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"An update so major, we could have built the product from scratch.","authors":["alfagun74"],"tags":["GameVault","Client Update","Server Update","metadata framework","plugin system","parental control","age restrictions","theme","app optimization","analytics","notes","community management"]},"unlisted":false,"prevItem":{"title":"GameVault+ Family & Friends Plan Launches with Exciting New Integrations!","permalink":"/blog/2024/12/22/"},"nextItem":{"title":"Temporary Solution to RAWG Woes, IGDB Partnership, and Exciting New Features!","permalink":"/blog/2024/05/07/"}},"content":"**Hello, GameVault Community!**\\n\\nAfter six months of hard work, we\u2019re beyond excited to unveil our biggest update yet: **GameVault Client v1.12** and **GameVault Server v13**! This release is so massive, it feels like we could\u2019ve built the product from scratch\u2014there\u2019s that much new ground covered. \x3c!-- truncate --\x3e\\n\\n### What\u2019s New?\\n\\nWe\u2019ve introduced some game-changing improvements. First and foremost, we\u2019ve moved away from unreliable third-party tools like RAWG and Google Image Scrapers for fetching video game metadata. Instead of just swapping one provider for another and making us dependant again, we\u2019ve built something much better: a brand-new **plugin system** on the backend, complete with an official partnership with **IGDB/Twitch**.\\n\\nThe new plugin framework is incredibly flexible, allowing users to write their own metadata provider plugins. It supports an unlimited number of providers, prioritizes data effectively, and even fills in any gaps intelligently. And the cherry on top? Users now have full control over metadata\u2014if you want to tweak or edit a piece of info, you can do so without changing the source data. Your custom edits are saved separately, giving you full freedom.\\n\\nWe\u2019ve been rigorously testing this system for 2\u20133 months, running an early access phase for about a month. While we\u2019ve optimized it as much as possible, we ask for your patience if any bugs pop up\u2014mastillke sure to back up before migrating!\\n\\n### Major New Features\\n\\nHere\u2019s a quick rundown of some other incredible additions in this update:\\n\\n- **Parental Controls & Age Restrictions:** Now, families can manage access based on age-appropriate content, giving more control over what\u2019s playable and viewable for children.\\n- **Built-in Media Player:** You can now watch trailers and gameplay videos directly in GameVault.\\n- **UI Overhaul:** We\u2019ve refreshed the Game, Community, and Admin Tabs, along with a redesigned App Bar for a sleeker look.\\n- **Halloween Theme:** Just in time for spooky season! GameVault+ users can enjoy a themed Halloween skin.\\n- **Convenience Features:** We\u2019ve added default arguments and launch/install executables to streamline app functionality.\\n- **Markdown Support:** Both Notes and Server News now support markdown, making formatting a breeze and improving readability.\\n\\n### Critical Update Info\\n\\nBefore updating, please ensure compatibility between clients and servers:\\n\\n- **Client v1.12** is required for servers running **v13 or above**.\\n- Older clients (**before v1.12**) won\u2019t work with server running on **Version 13 or above**.\\n\\nFor a smooth update and a guide on how to use all these new features, check out the detailed [migration instructions](https://github.com/Phalcode/gamevault-backend/blob/master/CHANGELOG.md#1300) in the server changelogs. As always, if you hit any snags, feel free to reach out to us on [Discord](https://discord.gg/NEdNen2dSu).\\n\\n### Support Us\\n\\nIf you\u2019d like to support our development and help us keep most of GameVault\u2019s features free, consider [subscribing to **GameVault+**](https://gamevau.lt/gamevault-plus) or making [a one-time donation](https://phalco.de/support-us). Although GameVault+ at the time only offers a limited set premium features, your support helps us continue making the app accessible to all.\\n\\nThank you all for supporting and using our passion project! We hope you enjoy the latest features and enhancements we\'ve added."},{"id":"/2024/05/07/","metadata":{"permalink":"/blog/2024/05/07/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2024-05-07.md","source":"@site/blog/2024-05-07.md","title":"Temporary Solution to RAWG Woes, IGDB Partnership, and Exciting New Features!","description":"Hey everyone!","date":"2024-05-07T00:00:00.000Z","tags":[{"inline":true,"label":"game","permalink":"/blog/tags/game"},{"inline":true,"label":"metadata","permalink":"/blog/tags/metadata"},{"inline":true,"label":"database","permalink":"/blog/tags/database"},{"inline":true,"label":"videogame","permalink":"/blog/tags/videogame"},{"inline":true,"label":"RAWG","permalink":"/blog/tags/rawg"},{"inline":true,"label":"IGDB","permalink":"/blog/tags/igdb"},{"inline":true,"label":"twitch.tv","permalink":"/blog/tags/twitch-tv"},{"inline":true,"label":"API","permalink":"/blog/tags/api"},{"inline":true,"label":"partnership","permalink":"/blog/tags/partnership"},{"inline":true,"label":"community","permalink":"/blog/tags/community"},{"inline":true,"label":"solution","permalink":"/blog/tags/solution"},{"inline":true,"label":"Steam","permalink":"/blog/tags/steam"},{"inline":true,"label":"backend","permalink":"/blog/tags/backend"},{"inline":true,"label":"update","permalink":"/blog/tags/update"},{"inline":true,"label":"features","permalink":"/blog/tags/features"},{"inline":true,"label":"GameVault","permalink":"/blog/tags/game-vault"},{"inline":true,"label":"GameVault+","permalink":"/blog/tags/game-vault"},{"inline":true,"label":"easter egg","permalink":"/blog/tags/easter-egg"}],"readingTime":2.525,"hasTruncateMarker":true,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"Temporary Solution to RAWG Woes, IGDB Partnership, and Exciting New Features!","authors":["alfagun74"],"tags":["game","metadata","database","videogame","RAWG","IGDB","twitch.tv","API","partnership","community","solution","Steam","backend","update","features","GameVault","GameVault+","easter egg"]},"unlisted":false,"prevItem":{"title":"An update so major, we could have built the product from scratch.","permalink":"/blog/2024/10/20/"},"nextItem":{"title":"GameVault+ out now","permalink":"/blog/2024/04/14/"}},"content":"Hey everyone!\\n\\nIn our last post we mentioned the challenges we\'ve been facing with the videogame metadata database we\'ve been using, [rawg.io](https://rawg.io/). Unfortunately, it\'s become an unmaintained abandonware, causing frequent downtime and issues like incorrect search results and registration problems. \x3c!-- truncate --\x3e The situation peaked on May 5th when the service went down completely for a day.\\n\\n## GameVault\'s new metadata provider strategy\\n\\nTo address these issues, we\'re making significant changes to GameVault\'s metadata system. Our goal is to make GameVault metadata provider agnostic, allowing users to seamlessly plug in their preferred metadata provider.\\n\\nWe\'re also excited to announce our official partnership with IGDB (twitch.tv), a trusted video game database. Going forward, GameVault will primarily use IGDB\'s APIs out of the box.\\n\\nMore details on our plans can be found in this [GitHub ticket](https://github.com/Phalcode/gamevault-backend/issues/258). We also plan to continue supporting the use of your own API keys and other vendors.\\n\\nHowever, as decided in our recent poll, we will be removing all support for RAWG.\\n\\n## Temporary solution: Implementing a RAWG replacement\\n\\nHowever, implementing these changes will take time, and we are both currently busy with work commitments and travel plans. So what happens if RAWG suddenly stops working while we\'re away? To address this concern, [Toylerrr](https://github.com/Toylerrr), one of our most valuable community members, had a great idea. He began developing a solution that would be a drop-in replacement for RAWG. An application that mimicked the behavior of RAWG, but fetched data from Steam instead. All you have to do is replace the url in the `RAWG_API_URL` environmental variable.\\n\\nWe loved the idea and built on it. Introducing [rawg-to-steam-redirect](https://github.com/Phalcode/rawg-to-steam-redirect).\\n\\nThe link above explains how it works and how you can use it today.\\n\\nWhat we liked most about it is that it required minimal backend changes to integrate. We have already tested this solution on our 667 games server and it works great. The quality of box art for example is much better. One drawback is that Steam does not have a lot of tags in its API.\\n\\nWhile `https://api.rawg.io/api` will remain the default `RAWG_API_URL` for now, you can switch between RAWG and the new solution at any time. Just make sure your GameVault backend is updated to at least v12.1.0.\\n\\n## Exciting new features\\n\\nIn addition to these changes, we\'re excited to introduce you to some new features that were recently released:\\n\\n- **\ud83d\udd16 Bookmarking Video Games:** You can now bookmark your favorite games within GameVault.\\n- **\u23ef\ufe0f Download Management:** GameVault now supports pausing, auto-resuming, and resuming downloads.\\n- **\ud83d\udd12 Encrypted Archives:** GameVault now supports password protected archives.\\n\\nWe hope these updates will make your experience with GameVault even better as we move through this transition period.\\n\\n## Supporting GameVault\\n\\nFinally, we want to thank all of you for making all of this possible. If you have not already done so, please consider upgrading to GameVault+ to flex with animated profile pictures on your server. We would really appreciate it. Bet you can\'t find the GameVault+ easter egg though... \ud83d\ude09\\n\\nWith love,\\n\\nPhalcode"},{"id":"/2024/04/14/","metadata":{"permalink":"/blog/2024/04/14/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2024-04-14.md","source":"@site/blog/2024-04-14.md","title":"GameVault+ out now","description":"Hey everyone!","date":"2024-04-14T00:00:00.000Z","tags":[{"inline":true,"label":"gaming","permalink":"/blog/tags/gaming"},{"inline":true,"label":"self-hosted","permalink":"/blog/tags/self-hosted"},{"inline":true,"label":"platform","permalink":"/blog/tags/platform"},{"inline":true,"label":"DRM-free","permalink":"/blog/tags/drm-free"},{"inline":true,"label":"video games","permalink":"/blog/tags/video-games"},{"inline":true,"label":"GameVault","permalink":"/blog/tags/game-vault"},{"inline":true,"label":"GameVault+","permalink":"/blog/tags/game-vault"},{"inline":true,"label":"subscription","permalink":"/blog/tags/subscription"},{"inline":true,"label":"community-driven","permalink":"/blog/tags/community-driven"},{"inline":true,"label":"updates","permalink":"/blog/tags/updates"},{"inline":true,"label":"announcement","permalink":"/blog/tags/announcement"},{"inline":true,"label":"early access","permalink":"/blog/tags/early-access"},{"inline":true,"label":"release","permalink":"/blog/tags/release"},{"inline":true,"label":"features","permalink":"/blog/tags/features"},{"inline":true,"label":"sustainability","permalink":"/blog/tags/sustainability"},{"inline":true,"label":"partnerships","permalink":"/blog/tags/partnerships"},{"inline":true,"label":"Discord","permalink":"/blog/tags/discord"},{"inline":true,"label":"feedback","permalink":"/blog/tags/feedback"},{"inline":true,"label":"improvement","permalink":"/blog/tags/improvement"},{"inline":true,"label":"development","permalink":"/blog/tags/development"}],"readingTime":1.18,"hasTruncateMarker":true,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"GameVault+ out now","authors":["alfagun74"],"tags":["gaming","self-hosted","platform","DRM-free","video games","GameVault","GameVault+","subscription","community-driven","updates","announcement","early access","release","features","sustainability","partnerships","Discord","feedback","improvement","development"]},"unlisted":false,"prevItem":{"title":"Temporary Solution to RAWG Woes, IGDB Partnership, and Exciting New Features!","permalink":"/blog/2024/05/07/"},"nextItem":{"title":"GameVault Client is now available on Windows Phone 7 based on Microsoft Silverlight!","permalink":"/blog/2024/04/01/2024-04-01/"}},"content":"Hey everyone!\\n\\nWe\'re thrilled to announce that the early access phase of GameVault+ has concluded, and we\'re officially launching it today! It\'s been an incredible journey from the inception of GameVault to where we are now, and we couldn\'t have done it without your amazing support.\x3c!-- truncate --\x3e\\n\\nGameVault+ is our way of saying thank you to our dedicated supporters while also ensuring the sustainability of our platform. For a small monthly fee, you\'ll gain access to premium features designed to enhance your gaming experience within GameVault. We\'re starting with features like animated profile pictures, custom themes, and activation of the GameVault Client API, with more exciting additions planned for the future.\\n\\nBut our work doesn\'t stop here. We\'re committed to refining GameVault+ based on your feedback, as well as addressing key areas of improvement in the platform. This includes exploring partnerships with reputable video game databases to enhance our data offerings and refactoring our client application for optimal performance.\\n\\nAnd most importantly, we want you, our community, to have a say in the future direction of GameVault. That\'s why we\'re opening up the floor for feature suggestions through our Discord channel. Your input will help shape the next big updates to GameVault.\\n\\nThank you all for your support and enthusiasm. We\'re excited to continue this journey with you and to make gaming even more enjoyable for everyone. Stay tuned for more updates, and happy gaming!"},{"id":"/2024/04/01/2024-04-01/","metadata":{"permalink":"/blog/2024/04/01/2024-04-01/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2024-04-01/2024-04-01.md","source":"@site/blog/2024-04-01/2024-04-01.md","title":"GameVault Client is now available on Windows Phone 7 based on Microsoft Silverlight!","description":"Hey Everyone!","date":"2024-04-01T00:00:00.000Z","tags":[{"inline":true,"label":"April Fools","permalink":"/blog/tags/april-fools"}],"readingTime":1.605,"hasTruncateMarker":true,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"GameVault Client is now available on Windows Phone 7 based on Microsoft Silverlight!","authors":["alfagun74"],"tags":["April Fools"]},"unlisted":false,"prevItem":{"title":"GameVault+ out now","permalink":"/blog/2024/04/14/"},"nextItem":{"title":"Announcing GameVault+ (coming soon)","permalink":"/blog/2024/03/28/"}},"content":"Hey Everyone!\\n\\nThe moment you\'ve been waiting for is finally here. We\'ve been working hard on it for months and are thrilled to announce that GameVault Client Application is **now available on Windows Phone 7**, powered by **Microsoft Silverlight**!\x3c!-- truncate --\x3e\\n\\n![Windows Phone](winphone.png)\\n\\nThe Current PC-Version of GameVault will be discontinued soon and will no longer be available to download from the Microsoft Store, as the technology is too new and not well supported yet. We needed a battle-tested framework to ensure compatibility, so we decided to switch to Windows Phone 7 and Silverlight. Also, the mobile platform just has massive market share, compared to PC.\\n\\nWe understand the excitement and anticipation surrounding this release, and we\'re just as eager as you are to see how this integration will enhance your experience.\\n\\nWith GameVault on your Windows Phone 7 device, you can carry your favorite games with you wherever you go. Whether you\'re battling fierce foes, exploring vast virtual worlds, or simply passing the time with a quick puzzle game, GameVault ensures that the thrill of gaming is always at your fingertips.\\n\\nThanks to the seamless integration with Microsoft Silverlight, navigating through your game library has never been smoother or more intuitive. The Metro Live Tiles add a touch of elegance to the user interface, making it a joy to browse through your collection and discover new games.\\n\\nAnd the best part? This is just the beginning. Our team is already hard at work on further enhancements and features, including the highly anticipated Holodeck edition of GameVault aswell as the new integrated \\"Bird Feeding Timer\\" feature, that automatically warns you when your pets are about to starve.\\n\\nWe\'re incredibly excited to embark on this journey with you and to continue pushing the boundaries of innovation. So what are you waiting for? Head over to the Windows Phone Store and migrate today to start your gaming adventure!\\n\\nHappy gaming... and April Fools!"},{"id":"/2024/03/28/","metadata":{"permalink":"/blog/2024/03/28/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2024-03-28.md","source":"@site/blog/2024-03-28.md","title":"Announcing GameVault+ (coming soon)","description":"Hey Everyone!","date":"2024-03-28T00:00:00.000Z","tags":[{"inline":true,"label":"startup","permalink":"/blog/tags/startup"},{"inline":true,"label":"software","permalink":"/blog/tags/software"},{"inline":true,"label":"gaming","permalink":"/blog/tags/gaming"},{"inline":true,"label":"GameVault","permalink":"/blog/tags/game-vault"},{"inline":true,"label":"subscription model","permalink":"/blog/tags/subscription-model"},{"inline":true,"label":"development","permalink":"/blog/tags/development"},{"inline":true,"label":"community","permalink":"/blog/tags/community"},{"inline":true,"label":"announcement","permalink":"/blog/tags/announcement"}],"readingTime":3.725,"hasTruncateMarker":true,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"Announcing GameVault+ (coming soon)","authors":["alfagun74"],"tags":["startup","software","gaming","GameVault","subscription model","development","community","announcement"]},"unlisted":false,"prevItem":{"title":"GameVault Client is now available on Windows Phone 7 based on Microsoft Silverlight!","permalink":"/blog/2024/04/01/2024-04-01/"},"nextItem":{"title":"Join the GameVault Early-Access Program Now!","permalink":"/blog/2023/12/09/"}},"content":"Hey Everyone!\\n\\nIt feels like it\'s been ages since we last caught up regarding the development of [GameVault (the self-hostable platform for drm-free videogames)](https://gamevau.lt), but trust me, the silence from our end doesn\'t mean we\'ve been slacking off. In fact,quite the opposite has been happening behind the scenes. \x3c!-- truncate --\x3e \\n\\nWhen my friend and I first launched this application, it was born out of a simple need for a solution to a problem we thought was very particular and only for ourselves. Having a steam-like platform for game files lying on my home server.\\n\\nWe never imagined it would resonate with others or find its own place in the market. Frankly, we thought it might end up just another forgotten repository on GitHub, gathering virtual dust with no one paying it any mind.\\n\\nBut boy, were we wrong. The response to our app was unexpectedly large and overwhelming. Thousands of people are using GameVault today, and it seems there\'s quite a demand out there for the exact product we\'ve been building.\\n\\nWe\u2019re a small indie team of two and despite juggling multiple jobs, we\'ve poured our hearts and souls into this project during our spare times, striving to offer a self-hosted alternative to the gaming platforms out there. And while we\'ve received some generous donations (_shoutout to our two loyal monthly donors btw \u2013 you know who you are, and we\'re endlessly grateful!_), it\'s clear that relying solely on sporadic tips isn\'t sustainable for the long term and we need financial support to maintain our services and justify our time investment towards our families.\\n\\nSo, it\'s time for a slight change. We\'re thrilled to announce the upcoming release of a new version of our client application, complete with an **optional** subscription model we\'re calling...\\n\\n## [GameVault+](https://gamevau.lt/docs/gamevault-plus/introduction)\\n\\n## What is GameVault+?\\n\\nFirst, to clear some of the confusion:\\n\\n**No, this is not some shady scammy \\"We\'re going enterprise\\" rugpull**.\\nThe core of GameVaults upcoming features and the features you enjoyed until now will always remain free. Additionally the system is [designed to be easily bypassed if you can\'t or dont want to afford it.](https://gamevau.lt/docs/gamevault-plus/introduction/#what-if-i-cant-afford-gamevault)\\n\\n[It was long planned on our board and well discussed within our community](https://github.com/Phalcode/gamevault-app/issues/151). Think of [GameVault+](https://gamevau.lt/docs/gamevault-plus/introduction) as our way of saying \\"thank you\\" to our supporters and to motivate them to support us regularly. To be more specific, it\'s us giving back some goodie-features that are not necessarily needed to use GameVault back to our supporters, while they help us keep the lights on here at Phalcode.\\n\\nWith GameVault+, you\'ll gain access to premium nice-to-have features designed to enhance your GameVault experience, all for a small monthly fee of \u20ac4,99 monthly or \u20ac49.90 anually.\\n\\nCurrently, these features include:\\n\\n- Uploading animated profile pictures\\n- Applying Custom Themes\\n- Activation of the GameVault Client API (CLI, URI, and NamedPipe Interfaces Used for client integrations with 3rd party tools like Playnite)\\n\\nBut there are more to come! We will be enhancing this offering with more features, whenever we see room for it, as GameVault+ subscribers are the ones, who keep this project alive.\\n\\nAll details and a Q&A are on the [GameVault+ page](https://gamevau.lt/docs/gamevault-plus/introduction).\\n\\n**We\'ll be rolling out this new product today to our early access users first** to get the product and the infrastructure around it tested, tweaking and refining it based on your feedback before making it available to everyone. It\'s an exciting new chapter for us, and we can\'t wait to have you along for the ride.\\n\\n## So what\'s next?\\n\\nWe will polish the rough edges of GameVault+ and bring it to life in the next few weeks, hopefully. You will probably already see some documentation on this website for it. Keep in mind, this is all a work in progress, and we will announce the final release soon.\\n\\nAfter that, we will need to urgently find a solution to our heavy reliance on the [degrading and unmaintained RAWG Database](https://discord.com/channels/1100920639667306496/1134496308846137404/1217726870959820861). We are already in contact for potential partnerships with Video-Game Databases.\\n\\nFinally, we will need to do some refactoring of our client application\'s architecture.\\n\\nBut stay tuned because once all of this is done, the Next Big Feature we\'ll be focusing on will be open for **the community to decide** in [our #polls channel on Discord](https://discord.gg/NEdNen2dSu). So make sure to join \\"The Council\\" to get notified and vote on your most desired feature.\\n\\nThank you all for supporting us and looking forward to seeing you all on our next updates!"},{"id":"/2023/12/09/","metadata":{"permalink":"/blog/2023/12/09/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2023-12-09.md","source":"@site/blog/2023-12-09.md","title":"Join the GameVault Early-Access Program Now!","description":"Hey, Guys!","date":"2023-12-09T00:00:00.000Z","tags":[{"inline":true,"label":"Gaming","permalink":"/blog/tags/gaming"},{"inline":true,"label":"GameVault","permalink":"/blog/tags/game-vault"},{"inline":true,"label":"Early Access","permalink":"/blog/tags/early-access"},{"inline":true,"label":"UI Update","permalink":"/blog/tags/ui-update"},{"inline":true,"label":"Beta Testing","permalink":"/blog/tags/beta-testing"},{"inline":true,"label":"Community Feedback","permalink":"/blog/tags/community-feedback"},{"inline":true,"label":"Exclusive Preview","permalink":"/blog/tags/exclusive-preview"},{"inline":true,"label":"Microsoft Store","permalink":"/blog/tags/microsoft-store"},{"inline":true,"label":"Discord","permalink":"/blog/tags/discord"},{"inline":true,"label":"Gaming Servers","permalink":"/blog/tags/gaming-servers"}],"readingTime":1.135,"hasTruncateMarker":true,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"Join the GameVault Early-Access Program Now!","authors":["alfagun74"],"tags":["Gaming","GameVault","Early Access","UI Update","Beta Testing","Community Feedback","Exclusive Preview","Microsoft Store","Discord","Gaming Servers"]},"unlisted":false,"prevItem":{"title":"Announcing GameVault+ (coming soon)","permalink":"/blog/2024/03/28/"},"nextItem":{"title":"A Look Back and a Glimpse Forward","permalink":"/blog/2023/11/20/"}},"content":"Hey, Guys!\\n\\nFor the upcoming large UI update of GameVault, we\'re launching a brand new GameVault Early-Access Program, and we want **YOU** to be a part of it!\x3c!-- truncate --\x3e\\n\\n## What\'s the Early-Access Program?\\n\\nEarly-Access is your golden ticket to test-drive upcoming GameVault updates before anyone else. You\'ll be part of an exclusive group and get a sneak peek into the latest features, but here\'s the deal \u2013 it might not be as stable as our regular releases and you need to interact with us. Your feedback will help us fine-tune everything before the big release for everyone else.\\n\\n## How to Join\\n\\n:clipboard: Complete the [Application Form](https://forms.gle/RQvEGfWeUFPBCUaG6) \\n:date: The first early-access phase kicks off on December 17 and lasts for one week.\\n\\n## Prerequisites\\n\\n:speech_balloon: Active participation in the designated Discord channel. \\n:video_game: GameVault installed from the Microsoft Store with a Microsoft Account logged in. If not, grab it [here](https://www.microsoft.com/store/apps/9PCKDV76GL75). \\n:rocket: A GameVault Server running the **phalcode/gamevault-backend:early-access** image. (Only run this if you are accepted as a Tester as it could break things!)\\n\\n### Important Note\\n\\n- There are only a limited number of slots in the Early-Access Program. Supporters and Trusted Members are prioritized.\\n- If you\'re accepted and later found not meeting the requirements, you might be removed from future testing and the next applicant on our list gets the opportunity.\\n\\n[Apply here!](https://forms.gle/RQvEGfWeUFPBCUaG6)"},{"id":"/2023/11/20/","metadata":{"permalink":"/blog/2023/11/20/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2023-11-20.md","source":"@site/blog/2023-11-20.md","title":"A Look Back and a Glimpse Forward","description":"Hello,","date":"2023-11-20T00:00:00.000Z","tags":[{"inline":true,"label":"Game Development","permalink":"/blog/tags/game-development"},{"inline":true,"label":"Software Updates","permalink":"/blog/tags/software-updates"},{"inline":true,"label":"Gaming Community","permalink":"/blog/tags/gaming-community"},{"inline":true,"label":"UI Redesign","permalink":"/blog/tags/ui-redesign"},{"inline":true,"label":"Development Milestones","permalink":"/blog/tags/development-milestones"},{"inline":true,"label":"Tech Progress","permalink":"/blog/tags/tech-progress"},{"inline":true,"label":"Future Features","permalink":"/blog/tags/future-features"},{"inline":true,"label":"GameVault Journey","permalink":"/blog/tags/game-vault-journey"},{"inline":true,"label":"Coding Chronicle","permalink":"/blog/tags/coding-chronicle"},{"inline":true,"label":"November Update","permalink":"/blog/tags/november-update"}],"readingTime":2.26,"hasTruncateMarker":true,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"A Look Back and a Glimpse Forward","authors":["alfagun74"],"tags":["Game Development","Software Updates","Gaming Community","UI Redesign","Development Milestones","Tech Progress","Future Features","GameVault Journey","Coding Chronicle","November Update"]},"unlisted":false,"prevItem":{"title":"Join the GameVault Early-Access Program Now!","permalink":"/blog/2023/12/09/"},"nextItem":{"title":"Please help us prioritize!","permalink":"/blog/2023/07/29/"}},"content":"Hello,\\n\\nIt\'s been a while since we caught up here, but if you\'ve been following the action on [Discord](https://discord.gg/NEdNen2dSu), you\'re up to speed. Nevertheless, this blog remains your spot for the key updates and announements.\x3c!-- truncate --\x3e\\n\\nLet\'s dive into what\'s been happening with GameVault since release and what\'s on the horizon. We\'ve hit version 9 on the backend and 1.7 on the frontend, showcasing our commitment to continuous improvement.\\n\\nAlongside the usual optimizations and bug fixes, we\'ve been paying a lot of attention to your feature requests and implemented a bunch of them.\\n\\nHere\'s the highlight reel:\\n\\n- Auto Extraction and Installation of Videogames\\n- Uninstalling Games through GameVault\\n- Uploading Images\\n- Support for more Archive Formats\\n- Bandwidth Control Features\\n- Database Backups & Restorations\\n- Crash Reporting\\n- Random Game Finder\\n\\nSo, what\'s cooking now? We asked for your top three desired features recently, and here are the results:\\n\\n1. UI Redesign for the Library and Installations Tab\\n2. Support for ROMS and Emulators\\n3. Support for extra files like Soundtracks, Mods, etc.\\n\\nBy the way, if you want to take part in polls like this in the future aswell, make sure to become a council member on [Discord](https://discord.gg/NEdNen2dSu)!\\n\\nRight now we\'re knee-deep in redesigning the Library, the heart of our application. Big changes are on the way, waving goodbye to the installations tab and ushering in a sleeker UI for Library, Game View, and Game Settings.\\n\\nHere are some sneak peeks and mockups: (still work in progress):\\n\\n1. Library (Mockup)\\n ![Filters](/img/blog/2023-11-19/filters.png)\\n ![Empty States](/img/blog/2023-11-19/emptystates.png)\\n2. Library (current implementation)\\n ![Library](/img/blog/2023-11-19/library.png)\\n3. Game (Mockup)\\n ![Game View](/img/blog/2023-11-19/game.png)\\n4. Game Settings (Mockup)\\n ![Game Settings](/img/blog/2023-11-19/settings.png)\\n\\nRemember, these are teasers. Anything can look different once it ships. There\'s a lot of work left, and we\'re on it. To be technical here: Most of these modern controls require us to rewrite WPF Controls from the core. On the backend, we\'re not slacking either \u2013 tons of end-to-end tests are being written to ensure our app\'s reliability.\\n\\nExcited about the new UI or got something to say? Head over to [Discord](https://discord.gg/NEdNen2dSu) and spill the beans!\\n\\nWe\'re eager to wrap up these tasks and ship the update out to you guys.\\n\\nWe also wanted to mention we\'ve already crossed 2000 GameVault users with a growing engaged [Discord](https://discord.gg/NEdNen2dSu) community of 350 members!\\n\\nAnd your donations help keeping the lights on, though we\'re not rolling in dough just yet. Every penny counts, and we\'re truly grateful. Thanks a lot. \u2764\ufe0f\\n\\nHelp us promote GameVault among fellow self-hosters. Your efforts could inspire a bored developer to join and contribute to our project!\\n\\nStay tuned for the UI update \u2013 we\'ll be back in touch soon.\\n\\nUntil then, happy gaming! \ud83c\udfae"},{"id":"/2023/07/29/","metadata":{"permalink":"/blog/2023/07/29/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2023-07-29.md","source":"@site/blog/2023-07-29.md","title":"Please help us prioritize!","description":"Hello everyone!","date":"2023-07-29T00:00:00.000Z","tags":[{"inline":true,"label":"community","permalink":"/blog/tags/community"},{"inline":true,"label":"GameVault","permalink":"/blog/tags/game-vault"},{"inline":true,"label":"development","permalink":"/blog/tags/development"},{"inline":true,"label":"roadmap","permalink":"/blog/tags/roadmap"},{"inline":true,"label":"collaboration","permalink":"/blog/tags/collaboration"},{"inline":true,"label":"feedback","permalink":"/blog/tags/feedback"},{"inline":true,"label":"GitHub","permalink":"/blog/tags/git-hub"},{"inline":true,"label":"voting","permalink":"/blog/tags/voting"},{"inline":true,"label":"features","permalink":"/blog/tags/features"},{"inline":true,"label":"platform","permalink":"/blog/tags/platform"},{"inline":true,"label":"Kanban Board","permalink":"/blog/tags/kanban-board"},{"inline":true,"label":"Discord","permalink":"/blog/tags/discord"},{"inline":true,"label":"Council Member","permalink":"/blog/tags/council-member"},{"inline":true,"label":"polls","permalink":"/blog/tags/polls"},{"inline":true,"label":"gaming experience","permalink":"/blog/tags/gaming-experience"}],"readingTime":1.995,"hasTruncateMarker":true,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"Please help us prioritize!","authors":["alfagun74"],"tags":["community","GameVault","development","roadmap","collaboration","feedback","GitHub","voting","features","platform","Kanban Board","Discord","Council Member","polls","gaming experience"]},"unlisted":false,"prevItem":{"title":"A Look Back and a Glimpse Forward","permalink":"/blog/2023/11/20/"},"nextItem":{"title":"Celebrating 600+ Installations and announcing the upcoming big feature","permalink":"/blog/2023/07/24/"}},"content":"Hello everyone!\\n\\nWe hope you\'re all doing well. We wanted to take a moment to express our heartfelt gratitude for the flood of feature requests and bug reports that have been pouring into our issue trackers. \x3c!-- truncate --\x3e Your enthusiasm and dedication to making GameVault even better are truly inspiring to us.\\n\\nAs many of you may already know, GameVault is a passion project for us, and while we are mostly convinced by your fantastic ideas, it may take some time for us to implement them. Our team meetings happen in our free time, and although we genuinely want to incorporate your suggestions into our roadmap, we are limited by the time and capacity we can dedicate to the project. Moreover, we want to ensure that the features we develop are refined, polished, and also the most desired in the users\' opinions, which adds to the timeline.\\n\\nWe believe that collaboration with our incredible community is the key to success, and that\'s why we want to introduce you to our Roadmap. It displays all new issues, planned tasks we want to work on, and all the ongoing work in a well-organized Kanban Board. [You can find it right here.](https://github.com/orgs/Phalcode/projects/4)\\n\\nTo ensure that GameVault\'s development aligns better with your needs, we kindly request your active participation. By voting on GitHub with a Thumbs Up or a Thumbs Down on new and planned issues, you can help us prioritize them effectively. We value your opinion: What features do you feel are most crucial? What aspects of the platform do you find most bothersome? What issues do you see as unnecessary or bloated? Your input will mainly shape the direction we take.\\n\\nIf you\'re eager to go the extra mile and actively contribute to shaping GameVault further, we invite you to [join our Discord community](https://discord.gg/NEdNen2dSu) and becoming a \\"Council Member\\". By becoming a \\"Council Member\\" and enabling Poll Notifications under \\"#Channels & Roles\\", you will have a direct say in the future of GameVault because you will get notifications about opinion polls we run from time to time.\\n\\nWe cannot stress enough how much we appreciate your involvement in our endeavor to create the ultimate gaming experience for all of you. Your passion and feedback are invaluable, and we are committed to making GameVault the best it can be, together.\\n\\nThank you for being part of this amazing journey with us!"},{"id":"/2023/07/24/","metadata":{"permalink":"/blog/2023/07/24/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2023-07-24.md","source":"@site/blog/2023-07-24.md","title":"Celebrating 600+ Installations and announcing the upcoming big feature","description":"Hey everyone,","date":"2023-07-24T00:00:00.000Z","tags":[{"inline":true,"label":"GameVault milestone","permalink":"/blog/tags/game-vault-milestone"},{"inline":true,"label":"official installations","permalink":"/blog/tags/official-installations"},{"inline":true,"label":"Discord community growth","permalink":"/blog/tags/discord-community-growth"},{"inline":true,"label":"gratitude","permalink":"/blog/tags/gratitude"},{"inline":true,"label":"feedback","permalink":"/blog/tags/feedback"},{"inline":true,"label":"love for GameVault","permalink":"/blog/tags/love-for-game-vault"},{"inline":true,"label":"upcoming update","permalink":"/blog/tags/upcoming-update"},{"inline":true,"label":"Installation Pipeline","permalink":"/blog/tags/installation-pipeline"},{"inline":true,"label":"simplifying game installation","permalink":"/blog/tags/simplifying-game-installation"},{"inline":true,"label":"GitHub issue","permalink":"/blog/tags/git-hub-issue"},{"inline":true,"label":"subscription to Updates role","permalink":"/blog/tags/subscription-to-updates-role"},{"inline":true,"label":"Lemmy community launch","permalink":"/blog/tags/lemmy-community-launch"},{"inline":true,"label":"sharing blog posts","permalink":"/blog/tags/sharing-blog-posts"},{"inline":true,"label":"spreading the word","permalink":"/blog/tags/spreading-the-word"},{"inline":true,"label":"support request","permalink":"/blog/tags/support-request"},{"inline":true,"label":"continued support","permalink":"/blog/tags/continued-support"},{"inline":true,"label":"celebration of achievements","permalink":"/blog/tags/celebration-of-achievements"}],"readingTime":2.39,"hasTruncateMarker":true,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"Celebrating 600+ Installations and announcing the upcoming big feature","authors":["alfagun74"],"tags":["GameVault milestone","official installations","Discord community growth","gratitude","feedback","love for GameVault","upcoming update","Installation Pipeline","simplifying game installation","GitHub issue","subscription to Updates role","Lemmy community launch","sharing blog posts","spreading the word","support request","continued support","celebration of achievements"]},"unlisted":false,"prevItem":{"title":"Please help us prioritize!","permalink":"/blog/2023/07/29/"},"nextItem":{"title":"The Migrations are finally completed","permalink":"/blog/2023/07/20/"}},"content":"Hey everyone,\\n\\nWe\'re excited to share some great news with you all! GameVault has reached a small milestone with over 600 official installations of our GameVault Client Application. \x3c!-- truncate --\x3e What\'s even more amazing is that around 200 dedicated users, a third of these installations, have joined our [Discord](https://discord.gg/NEdNen2dSu) community to connect, chat, and share their experiences.\\n\\nWe want to express our immense gratitude for your incredible support, feedback, and love for GameVault. Your ongoing encouragement inspires us to push boundaries and enhance your gaming experience. We\'re thrilled to announce that an awesome update is being worked on right now - the highly anticipated release of GameVault\'s Installation Pipeline!\\n\\n#### GameVault\'s Installation Pipeline\\n\\nThe Installation Pipeline is designed to revolutionize how you install and manage your games. It was suggested by members on our [Discord server](https://discord.gg/NEdNen2dSu). We understand the challenges of navigating through different installation processes, especially for family members who may not be tech-savvy. With the Installation Pipeline, our goal is to simplify the entire process and make it user-friendly. Whether you\'re an experienced gamer or not, this update will make installing games easier for you.\\n\\nYou can read the details [here on the GitHub issue](https://github.com/Phalcode/gamevault-app/issues/18).\\n\\nStay tuned for its upcoming release, and to be among the first to try out this awesome feature, make sure to subscribe to the `@Updates` Role on our [Discord server](https://discord.gg/NEdNen2dSu) , if you haven\'t already. We\'ll ping you as soon as it\'s live!\\n\\n#### Join us on Lemmy\\n\\nTo further connect with our amazing community, we\'re excited to announce the launch of our [official Lemmy community](https://lemmy.world/c/phalcode). From now on, we\'ll also regularly share new blog posts there, providing you with more ways to stay informed and engaged. Join the Lemmy forum and become part of the growing GameVault community!\\n\\n#### Share GameVault with Others\\n\\nAs we celebrate this milestone and eagerly anticipate more exciting updates, we invite you to spread the word about GameVault among your friends, family, and gaming or self-hosting communities. Your personal recommendations and referrals have played a significant role in our journey so far, and we believe they\'ll continue to do so in the future.\\n\\nWe want to express our heartfelt appreciation for the feature requests, discussions, and invaluable help on our GitHub. Your support and collaborative efforts help a lot.\\n\\n#### Support Us\\n\\nAs we move forward, we kindly ask for your continued support. GameVault\'s success is currently solely built upon our incredible community, and your encouragement is what fuels us. If you love our app and believe in our vision, please consider supporting us in any way you can. It could even be something simple like a rating on the Microsoft Store. Your backing empowers us to keep our hard work going.\\n\\nWe\'re eagerly looking forward to celebrating more achievements with all of you.\\n\\nStay tuned, stay connected, and let\'s continue this journey together!"},{"id":"/2023/07/20/","metadata":{"permalink":"/blog/2023/07/20/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2023-07-20.md","source":"@site/blog/2023-07-20.md","title":"The Migrations are finally completed","description":"Hey folks,","date":"2023-07-20T00:00:00.000Z","tags":[{"inline":true,"label":"app name migration","permalink":"/blog/tags/app-name-migration"},{"inline":true,"label":"Microsoft Store publication","permalink":"/blog/tags/microsoft-store-publication"},{"inline":true,"label":"surge of new users","permalink":"/blog/tags/surge-of-new-users"},{"inline":true,"label":"Discord server promotion","permalink":"/blog/tags/discord-server-promotion"},{"inline":true,"label":"spreading the word","permalink":"/blog/tags/spreading-the-word"},{"inline":true,"label":"logo deciphering","permalink":"/blog/tags/logo-deciphering"},{"inline":true,"label":"box representation","permalink":"/blog/tags/box-representation"},{"inline":true,"label":"keyhole representation","permalink":"/blog/tags/keyhole-representation"},{"inline":true,"label":"logo concept discussion","permalink":"/blog/tags/logo-concept-discussion"},{"inline":true,"label":"Discord channel","permalink":"/blog/tags/discord-channel"}],"readingTime":0.615,"hasTruncateMarker":true,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"The Migrations are finally completed","authors":["alfagun74"],"tags":["app name migration","Microsoft Store publication","surge of new users","Discord server promotion","spreading the word","logo deciphering","box representation","keyhole representation","logo concept discussion","Discord channel"]},"unlisted":false,"prevItem":{"title":"Celebrating 600+ Installations and announcing the upcoming big feature","permalink":"/blog/2023/07/24/"},"nextItem":{"title":"Quick Migration Update and new Logo","permalink":"/blog/2023/07/19/"}},"content":"Hey folks,\\n\\nGreat news. We\'ve successfully migrated our App name in its entirety and will resume advertising as soon as it\'s published on the Microsoft Store. \x3c!-- truncate --\x3e\\n\\nJust a heads up, there might be a surge of new users joining the [Discord](https://discord.gg/NEdNen2dSu) server due to us promoting GameVault across all available platforms now.\\n\\nYou\'re welcome to join in and spread the word about GameVault with your friends, family, social network, or colleagues!\\n\\n**Let\'s decipher the mystery behind the new logo:**\\n![logo](/img/blog/2023-07-19/logo-text-and-image-sbs.png)\\n\\n- The Box represents a Vault with a Keyhole, but it also symbolizes a game dice.\\n- The Keyhole represents a Keyhole, and simultaneously signifies a game piece.\\n\\nDid you find the logo concept creative? Share your thoughts on [discord](https://discord.gg/NEdNen2dSu)!"},{"id":"/2023/07/19/","metadata":{"permalink":"/blog/2023/07/19/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2023-07-19.md","source":"@site/blog/2023-07-19.md","title":"Quick Migration Update and new Logo","description":"Hey guys,","date":"2023-07-19T00:00:00.000Z","tags":[{"inline":true,"label":"name migration progress","permalink":"/blog/tags/name-migration-progress"},{"inline":true,"label":"backend application migration","permalink":"/blog/tags/backend-application-migration"},{"inline":true,"label":"documentation migration","permalink":"/blog/tags/documentation-migration"},{"inline":true,"label":"domain acquisition","permalink":"/blog/tags/domain-acquisition"},{"inline":true,"label":"Subreddit migration","permalink":"/blog/tags/subreddit-migration"},{"inline":true,"label":"Lemmy community","permalink":"/blog/tags/lemmy-community"},{"inline":true,"label":"Client Application update","permalink":"/blog/tags/client-application-update"},{"inline":true,"label":"testing","permalink":"/blog/tags/testing"},{"inline":true,"label":"new logo","permalink":"/blog/tags/new-logo"},{"inline":true,"label":"speculation","permalink":"/blog/tags/speculation"},{"inline":true,"label":"Discord channel","permalink":"/blog/tags/discord-channel"},{"inline":true,"label":"migration finalization","permalink":"/blog/tags/migration-finalization"}],"readingTime":0.965,"hasTruncateMarker":true,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"Quick Migration Update and new Logo","authors":["alfagun74"],"tags":["name migration progress","backend application migration","documentation migration","domain acquisition","Subreddit migration","Lemmy community","Client Application update","testing","new logo","speculation","Discord channel","migration finalization"]},"unlisted":false,"prevItem":{"title":"The Migrations are finally completed","permalink":"/blog/2023/07/20/"},"nextItem":{"title":"A New Name","permalink":"/blog/2023/07/15/"}},"content":"Hey guys,\\n\\nWe have a brief update on the progress of the name migration.\\n\\nWe\'ve successfully completed the migration of the backend application, which is now accessible as `gamevault-backend`. \x3c!-- truncate --\x3e\\n\\nFurthermore, we\'ve migrated the documentation and acquired this domain gamevau.lt. We\'ve set up redirects for our previous domain and the demo server as well.\\n\\nLastly we migrated our Subreddit to [r/Phalcode](https://reddit.com/r/Phalcode) and opened up a new community on [Lemmy](https://lemmy.world/c/phalcode). All further Updates and discussions regarding GameVault can be found there.\\n\\nWe\'re nearly finished, you might say.\\n\\nThe only remaining task is the Client Application. We\'re actively working on it and currently testing the application on our developer edition. Soon, you\'ll be able to seamlessly update your client with the new name and appearance.\\n\\nIn the meantime, our graphic designer has crafted a fresh logo for our new name, GameVault.\\n\\n![logo](/img/blog/2023-07-19/logo-text-and-image-sbs.png)\\n\\nTo make good use of your time while the migrations are in progress, what do you speculate the new logo represents?\\n\\nShare your theories in gamevaults #chat channel on [discord](https://discord.gg/NEdNen2dSu)! We\'ll reveal the answer and shoutout the winner(s) in the next blog post, once the migration is finalized!\\n\\nUntil then \u270c\ufe0f"},{"id":"/2023/07/15/","metadata":{"permalink":"/blog/2023/07/15/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2023-07-15.md","source":"@site/blog/2023-07-15.md","title":"A New Name","description":"Hey everyone,","date":"2023-07-15T00:00:00.000Z","tags":[{"inline":true,"label":"poll results","permalink":"/blog/tags/poll-results"},{"inline":true,"label":"renaming app","permalink":"/blog/tags/renaming-app"},{"inline":true,"label":"community feedback","permalink":"/blog/tags/community-feedback"},{"inline":true,"label":"GameStash","permalink":"/blog/tags/game-stash"},{"inline":true,"label":"GameVault","permalink":"/blog/tags/game-vault"},{"inline":true,"label":"GameShelf","permalink":"/blog/tags/game-shelf"},{"inline":true,"label":"Harbor","permalink":"/blog/tags/harbor"},{"inline":true,"label":"GameHub","permalink":"/blog/tags/game-hub"},{"inline":true,"label":"market analysis","permalink":"/blog/tags/market-analysis"},{"inline":true,"label":"new name announcement","permalink":"/blog/tags/new-name-announcement"},{"inline":true,"label":"GameVault domain","permalink":"/blog/tags/game-vault-domain"},{"inline":true,"label":"special thanks","permalink":"/blog/tags/special-thanks"},{"inline":true,"label":"Selfhosted Podcast","permalink":"/blog/tags/selfhosted-podcast"},{"inline":true,"label":"Self-Hosted Newsletter","permalink":"/blog/tags/self-hosted-newsletter"},{"inline":true,"label":"transition process","permalink":"/blog/tags/transition-process"}],"readingTime":3.85,"hasTruncateMarker":true,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"A New Name","authors":["alfagun74"],"tags":["poll results","renaming app","community feedback","GameStash","GameVault","GameShelf","Harbor","GameHub","market analysis","new name announcement","GameVault domain","special thanks","Selfhosted Podcast","Self-Hosted Newsletter","transition process"]},"unlisted":false,"prevItem":{"title":"Quick Migration Update and new Logo","permalink":"/blog/2023/07/19/"},"nextItem":{"title":"A Closer Look at GameVaults \'Source-Available\' Nature","permalink":"/blog/2023/07/13/"}},"content":"Hey everyone,\\n\\nWe are thrilled to announce that the poll for choosing a new name for our app is finally over. The process of transitioning to the new name will commence very soon, and we can\'t wait to share the exciting updates with you.\x3c!-- truncate --\x3e\\n\\nBut first, let\'s dive into the poll results and shed some light on the important facts without further delay:\\n\\n## Summary\\n\\nIn total, 71 people participated in the poll, providing us with valuable data to draw conclusions from. Here\'s a summary of the key findings:\\n\\n- 52.1% of the community voted against using any terms related to piracy in the app. We understand and respect this choice because it would harm our business and attract the wrong users, as we have no affiliation with piracy.\\n\\n- 42.3% of the community voted to recommend the app under a different name but not with its current name. This feedback motivated us to rename the app, confirming that it wasn\'t just a few critics on Reddit. We want to expand our community to include the families, friends, and colleagues of these people. So please, help us spread the word about the name change!\\n\\n- 36.6% of you said you wouldn\'t contribute to our app at all solely because of its name, even if you had the opportunity. We depend on these contributions to grow and improve, so we now encourage you to participate!\\n\\nWithout further ado, here are the top 5 names that emerged as winners in the poll:\\n\\n1. GameStash (38%)\\n2. GameVault (35.2%)\\n3. GameShelf (31%)\\n4. Harbor (29.6%)\\n5. GameHub (28.2%)\\n\\nAs mentioned earlier, we conducted the poll without conducting market analysis beforehand. However, we recognized the significance of making an informed decision for the benefit of the community. Consequently, we proceeded to analyze each name after the poll to ensure the chosen name resonates with our vision.\\n\\nAllow us to share the summarized results of our market analysis:\\n\\n## Market Analysis\\n\\n### 1. GameStash\\n\\nGoogle Search Results: ~33,600 \\nPossible Domains: gamestash.de\\n\\n- There\'s already an app called [GameStash](https://gamestash.app/) that offers similar features to ours.\\n\\n### 2. GameVault\\n\\nGoogle Search Results: ~800,000 \\nPossible Domains: gamevau.lt, game-vault.de\\n\\n- The term \\"GameVault\\" is associated with a popular online casino/gambling application called [GameVault999](https://gamevault999.com/).\\n\\n### 3. GameShelf\\n\\nGoogle Search Results: ~560,000 \\nPossible Domains: gameshelf.de\\n\\n- The name \\"Gameshelf\\" is already used by two existing applications. One is a [Board-Game-Collection Viewer](https://gameshelf.io/), and the other is a [Gaming Backlog](https://gameshelf.dev) app.\\n\\n### 4. Harbor\\n\\nGoogle Search Results: ~393,000,000 \\nPossible Domains: harborapp.de\\n\\n- \\"Harbor\\" is a very common word, making it challenging to find a suitable domain that aligns with our brand identity.\\n\\n- Additionally, there\'s a well-known app called [Harbor on the Market](https://goharbor.io) related to Docker/Kubernetes.\\n\\n### 5. GameHub\\n\\nGoogle Search Results: ~5,690,000\\nPossible Domains: gamehubapp.de\\n\\n- [GameHub](https://github.com/tkashkin/GameHub) is a popular game library manager\\n- it also sounds like a popular adult site \ud83d\ude01\\n\\n## What\'s Next?\\n\\nWe understand your eagerness for a new name, and we are equally committed to distancing ourselves from the old one. Taking into account all the suggested names and feedback, we engaged in extensive internal brainstorming, free from outside influences.\\n\\nWe sought a name that is descriptive, intuitive, and effectively conveys the purpose of our app. Additionally, we aimed for a name that is easily memorable and emphasizes the ownership and control of a self-hosted server, security, and exclusivity.\\n\\nIntroducing our new name: **GameVault** \\nAvailable soon under this domain: [gamevau.lt](https://gamevau.lt)\\n\\nWe have already secured the domain and registered the name wherever possible. The transition process will commence shortly. We are eager to hear your thoughts on the new name. Do you like it?\\n\\n## Special Thanks \u2764\ufe0f\\n\\nWell, as you all know, this was quite a journey to get here, and we wanted to give our special thanks to:\\n\\n- Everybody who gave this project\'s idea a chance, even if the name was kind of weird.\\n\\n- Everybody who made suggestions on our [Discord](https://discord.gg/NEdNen2dSu) server and participated in the discussions.\\n\\n- Everybody who voted.\\n\\n- A special shoutout to @KairuByte on [Discord](https://discord.gg/NEdNen2dSu) for coming up with the name GameVault.\\n\\n- We would also like to extend our gratitude to [The Selfhosted Podcast](https://selfhosted.show/101?t=2731) for discussing our app. (Brent, we are excited to hear your thoughts on the new name from a marketing standpoint \ud83d\ude1c)\\n\\n- Last but not least, thank you to [The Self-Hosted Newsletter](https://selfh.st/newsletter/2023-07-07/) for mentioning our release.\\n\\nThank you all for your continued support!\\n\\nWe will keep you updated as the transition unfolds. In the meantime, head over to our [Discord](https://discord.gg/NEdNen2dSu) channel to celebrate and share your thoughts on the new name.\\n\\nStay tuned!"},{"id":"/2023/07/13/","metadata":{"permalink":"/blog/2023/07/13/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2023-07-13.md","source":"@site/blog/2023-07-13.md","title":"A Closer Look at GameVaults \'Source-Available\' Nature","description":"Hey everyone,","date":"2023-07-13T00:00:00.000Z","tags":[{"inline":true,"label":"source-available software","permalink":"/blog/tags/source-available-software"},{"inline":true,"label":"open-source","permalink":"/blog/tags/open-source"},{"inline":true,"label":"transparency","permalink":"/blog/tags/transparency"},{"inline":true,"label":"control","permalink":"/blog/tags/control"},{"inline":true,"label":"software development","permalink":"/blog/tags/software-development"},{"inline":true,"label":"code access","permalink":"/blog/tags/code-access"},{"inline":true,"label":"hybrid model","permalink":"/blog/tags/hybrid-model"},{"inline":true,"label":"software licensing","permalink":"/blog/tags/software-licensing"},{"inline":true,"label":"revenue generation","permalink":"/blog/tags/revenue-generation"},{"inline":true,"label":"user engagement","permalink":"/blog/tags/user-engagement"}],"readingTime":2.51,"hasTruncateMarker":true,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"A Closer Look at GameVaults \'Source-Available\' Nature","authors":["alfagun74"],"tags":["source-available software","open-source","transparency","control","software development","code access","hybrid model","software licensing","revenue generation","user engagement"]},"unlisted":false,"prevItem":{"title":"A New Name","permalink":"/blog/2023/07/15/"},"nextItem":{"title":"Battling Harassment and Trolls in Our App Community","permalink":"/blog/2023/07/09/"}},"content":"Hey everyone,\\n\\ntoday i want to clarify why GameVault isn\'t considered \\"open-source\\" by definition. \x3c!-- truncate --\x3e\\n\\nYou see, GameVault is what we like to call [\\"source-available\\"](https://wikipedia.org/wiki/Source-available_software) software. This means that our code is open for you to explore and modify, but it doesn\'t fully meet all the criteria of being considered open-source. I want to take a moment to explain what open-source truly means and why we\'ve taken a slightly different approach.\\n\\nAccording to the widely recognized definitions, [\\"open-source\\"](https://wikipedia.org/wiki/Open-source_software) software, as one would think, not only provides access to the source code but also offers certain freedoms to its users. It allows them to use, modify, and distribute the software freely, even for commercial purposes.\\n\\nFor a self-hosted app like GameVault, we believe it\'s crucual to disclose the source code. We want you, our users, to have full transparency and control over the software you use on your servers. We don\'t want you to be unaware of what\'s happening behind the scenes, as is sometimes the case with closed-source applications like Plex, for example.\\n\\nNow, you may be wondering why we didn\'t make GameVault fully open-source. The answer lies in our desire to protect our code from unauthorized use and commercial exploitation. While we absolutely encourage you to copy, modify, and share our code for personal use, we want to prevent others from profiting off our hard work by selling our software without our consent.\\n\\nIt\'s important to acknowledge that maintaining and developing a software project requires resources. While we admire the open-source community and its valuable contributions, sustaining GameVault solely through donations or offering it for free indefinitely is not feasible. For instance, Jellyfin, a popular open-source app developed over a decade, generates only around $13,500 per year (according to their opencollective page). In contrast, Plex, a closed-source alternative, earns a significant $8.5 million annually. Our company\'s main goal is to keep the core functionality of GameVault free, but we also need to explore ways to generate revenue in order to support its future growth and improvement. We are currently considering monetizing additional convenience features for the Client Application in the future, although nothing has been finalized yet.\\n\\nWe genuinely appreciate your understanding. As a small business with just two members, we strive to provide you with a valuable product but cannot continue to do so as volunteers indefinitely. Sustaining losses in the long term would not be sustainable, especially considering our local tax obligations. We have families and commitments that cannot be neglected, and this project is not our primary job. Therefore, please understand that GameVault may not strictly align with the traditional definition of \\"open-source\\". Our intention is to be transparent and present our perspective. Your understanding, support, and empathy mean a great deal to us.\\n\\nIf you have any thoughts or comments on this topic, we\'d be more than happy to hear from you. Feel free to share your feedback on our [Discord](https://discord.gg/NEdNen2dSu) server. We truly value your input and look forward to engaging with you there."},{"id":"/2023/07/09/","metadata":{"permalink":"/blog/2023/07/09/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2023-07-09.md","source":"@site/blog/2023-07-09.md","title":"Battling Harassment and Trolls in Our App Community","description":"Hey folks,","date":"2023-07-09T00:00:00.000Z","tags":[{"inline":true,"label":"harassment","permalink":"/blog/tags/harassment"},{"inline":true,"label":"blackmail","permalink":"/blog/tags/blackmail"},{"inline":true,"label":"threats","permalink":"/blog/tags/threats"},{"inline":true,"label":"spam","permalink":"/blog/tags/spam"},{"inline":true,"label":"trolls","permalink":"/blog/tags/trolls"},{"inline":true,"label":"negative narratives","permalink":"/blog/tags/negative-narratives"},{"inline":true,"label":"safe environment","permalink":"/blog/tags/safe-environment"},{"inline":true,"label":"racist","permalink":"/blog/tags/racist"},{"inline":true,"label":"developers","permalink":"/blog/tags/developers"},{"inline":true,"label":"public","permalink":"/blog/tags/public"},{"inline":true,"label":"creepy behavior","permalink":"/blog/tags/creepy-behavior"},{"inline":true,"label":"app","permalink":"/blog/tags/app"},{"inline":true,"label":"support","permalink":"/blog/tags/support"},{"inline":true,"label":"financial assistance","permalink":"/blog/tags/financial-assistance"},{"inline":true,"label":"motivation","permalink":"/blog/tags/motivation"},{"inline":true,"label":"GameVault app","permalink":"/blog/tags/game-vault-app"},{"inline":true,"label":"bugs","permalink":"/blog/tags/bugs"},{"inline":true,"label":"feature requests","permalink":"/blog/tags/feature-requests"},{"inline":true,"label":"improvement","permalink":"/blog/tags/improvement"},{"inline":true,"label":"success","permalink":"/blog/tags/success"},{"inline":true,"label":"engagement","permalink":"/blog/tags/engagement"}],"readingTime":1.955,"hasTruncateMarker":true,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"Battling Harassment and Trolls in Our App Community","authors":["alfagun74"],"tags":["harassment","blackmail","threats","spam","trolls","negative narratives","safe environment","racist","developers","public","creepy behavior","app","support","financial assistance","motivation","GameVault app","bugs","feature requests","improvement","success","engagement"]},"unlisted":false,"prevItem":{"title":"A Closer Look at GameVaults \'Source-Available\' Nature","permalink":"/blog/2023/07/13/"},"nextItem":{"title":"Choosing a New, Family-Friendly Name for this project!","permalink":"/blog/2023/07/08/"}},"content":"Hey folks,\\n\\nWe have an important update to share with you all while our poll is in progress. It has come to our attention that a group of individuals has been engaging in harassing, blackmailing, and threatening behavior towards us. \x3c!-- truncate --\x3e\\n\\nIt began with spam on our Issue Trackers and [Discord](https://discord.gg/NEdNen2dSu) Server but this situation has escalated to the point where these individuals went so far as to search me up on LinkedIn and threaten to inform my employer with baseless accusations of racism because of trivial reasons like the branch name in our github project being \\"master\\". Moreover, we have received reports that these trolls have extended their actions directly to other members of this server, attempting to spread negative narratives and disrupting the community atmosphere.\\n\\nTo address this issue, we kindly request that you promptly report any encounters with these trolls to both [Discord](https://discord.gg/NEdNen2dSu) and our dedicated team of moderators. By doing so, we can take appropriate measures to handle the situation and maintain a safe environment for all.\\n\\nWe would like to emphasize that we are not racist individuals, but rather developers who decided to share our hard work with the community, hoping to bring joy and utility to everyone. Unfortunately, we did not anticipate encountering such creepy behavior when we made the project public. It has made us question whether it was the right decision to open up our work in the first place.\\n\\nIf you appreciate our efforts and would like to support us and the app, we humbly ask for your financial assistance. Even a small contribution of five bucks on [Kofi](https://ko-fi.com/phalcode) would go a long way in helping us maintain our motivation and dedication. Alternatively, if monetary support isn\'t possible, we would be incredibly grateful if you could share kind words about how the GameVault app has positively impacted your life in the #chat channel. Your encouragement means the world to us. \ud83e\udd70\\n\\nIn addition, we encourage you to continue reporting any bugs you encounter and submitting feature requests in the respective GitHub trackers. With your valuable input, we can continue improving the app and making it even better.\\n\\nRemember, the success of this project relies on your support and engagement. Let\'s stand together against these trolls and ensure a positive and inclusive community experience. Thank you for your attention and understanding."},{"id":"/2023/07/08/","metadata":{"permalink":"/blog/2023/07/08/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2023-07-08.md","source":"@site/blog/2023-07-08.md","title":"Choosing a New, Family-Friendly Name for this project!","description":"Hello, everyone!","date":"2023-07-08T00:00:00.000Z","tags":[{"inline":true,"label":"source-available","permalink":"/blog/tags/source-available"},{"inline":true,"label":"gaming platform","permalink":"/blog/tags/gaming-platform"},{"inline":true,"label":"GameVault","permalink":"/blog/tags/game-vault"},{"inline":true,"label":"new name","permalink":"/blog/tags/new-name"},{"inline":true,"label":"family-friendly","permalink":"/blog/tags/family-friendly"},{"inline":true,"label":"poll","permalink":"/blog/tags/poll"},{"inline":true,"label":"AI-generated names","permalink":"/blog/tags/ai-generated-names"},{"inline":true,"label":"feedback","permalink":"/blog/tags/feedback"},{"inline":true,"label":"inclusivity","permalink":"/blog/tags/inclusivity"},{"inline":true,"label":"user participation","permalink":"/blog/tags/user-participation"},{"inline":true,"label":"announcement","permalink":"/blog/tags/announcement"},{"inline":true,"label":"decision-making","permalink":"/blog/tags/decision-making"},{"inline":true,"label":"community","permalink":"/blog/tags/community"},{"inline":true,"label":"platform values","permalink":"/blog/tags/platform-values"},{"inline":true,"label":"voting","permalink":"/blog/tags/voting"},{"inline":true,"label":"future development","permalink":"/blog/tags/future-development"}],"readingTime":1.26,"hasTruncateMarker":true,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"Choosing a New, Family-Friendly Name for this project!","authors":["alfagun74"],"tags":["source-available","gaming platform","GameVault","new name","family-friendly","poll","AI-generated names","feedback","inclusivity","user participation","announcement","decision-making","community","platform values","voting","future development"]},"unlisted":false,"prevItem":{"title":"Battling Harassment and Trolls in Our App Community","permalink":"/blog/2023/07/09/"},"nextItem":{"title":"Introducing GameVault \ud83d\ude80 - The self-hosted gaming platform for DRM-free games","permalink":"/blog/2023/07/01/"}},"content":"Hello, everyone!\\n\\nWe have an important announcement to share about our [source-available](https://en.wikipedia.org/wiki/Source-available_software) gaming platform, project. We have listened to your feedback and concerns, and now we need your help in choosing a new, family-friendly name that better reflects our platform\'s values. \x3c!-- truncate --\x3e To make this decision-making process more convenient, we have created a poll with 100 potential names, suggested by you on our [Discord](https://discord.gg/NEdNen2dSu), some of which were generated by AI. Your participation in shaping the future of our platform is greatly appreciated.\\n\\nWe kindly request your support in selecting a new name for our gaming platform. The poll offers a variety of names, and we ask that you choose at least 10 names (10%) that appeal to you. By gathering diverse input and minimizing bias, we aim to create an inclusive and enjoyable experience for all users. We apologize if the current name has caused any discomfort, and we are committed to creating a welcoming environment for gamers.\\n\\nTo cast your votes and contribute to the selection of a new, family-friendly name for our [source-available](https://en.wikipedia.org/wiki/Source-available_software) gaming platform, please click on the link provided at the end of this post. Your voice matters, and together, we can find a name that truly represents our app\'s essence. The results will be announced on this blog around July 15, 2023.\\n\\nWe sincerely appreciate your support and encourage you to stay tuned for updates as we continue to improve our platform based on your valuable feedback.\\n\\nLink to the poll: [https://forms.gle/cYsURG6BqMXcxE3B8](https://forms.gle/cYsURG6BqMXcxE3B8)\\n\\nHappy voting!"},{"id":"/2023/07/01/","metadata":{"permalink":"/blog/2023/07/01/","editUrl":"https://github.com/phalcode/gamevault-docs/tree/master/blog/2023-07-01.md","source":"@site/blog/2023-07-01.md","title":"Introducing GameVault \ud83d\ude80 - The self-hosted gaming platform for DRM-free games","description":"Hey Guys,","date":"2023-07-01T00:00:00.000Z","tags":[{"inline":true,"label":"gaming","permalink":"/blog/tags/gaming"},{"inline":true,"label":"GameVault","permalink":"/blog/tags/game-vault"},{"inline":true,"label":"source-available","permalink":"/blog/tags/source-available"},{"inline":true,"label":"self-hosted","permalink":"/blog/tags/self-hosted"},{"inline":true,"label":"alternative","permalink":"/blog/tags/alternative"},{"inline":true,"label":"cloud-based game platforms","permalink":"/blog/tags/cloud-based-game-platforms"},{"inline":true,"label":"DRM-free games","permalink":"/blog/tags/drm-free-games"},{"inline":true,"label":"file server","permalink":"/blog/tags/file-server"},{"inline":true,"label":"multi-user authentication","permalink":"/blog/tags/multi-user-authentication"},{"inline":true,"label":"metadata","permalink":"/blog/tags/metadata"},{"inline":true,"label":"RAWG API","permalink":"/blog/tags/rawg-api"},{"inline":true,"label":"health monitoring","permalink":"/blog/tags/health-monitoring"},{"inline":true,"label":"API","permalink":"/blog/tags/api"},{"inline":true,"label":"Discord server","permalink":"/blog/tags/discord-server"},{"inline":true,"label":"Reddit forum","permalink":"/blog/tags/reddit-forum"},{"inline":true,"label":"Lemmy forum","permalink":"/blog/tags/lemmy-forum"}],"readingTime":1.78,"hasTruncateMarker":true,"authors":[{"name":"Alper Alkan","title":"Co-Founder of Phalcode","url":"https://github.com/Alfagun74","imageURL":"https://github.com/Alfagun74.png","key":"alfagun74","page":null}],"frontMatter":{"title":"Introducing GameVault \ud83d\ude80 - The self-hosted gaming platform for DRM-free games","authors":["alfagun74"],"tags":["gaming","GameVault","source-available","self-hosted","alternative","cloud-based game platforms","DRM-free games","file server","multi-user authentication","metadata","RAWG API","health monitoring","API","Discord server","Reddit forum","Lemmy forum"]},"unlisted":false,"prevItem":{"title":"Choosing a New, Family-Friendly Name for this project!","permalink":"/blog/2023/07/08/"}},"content":"Hey Guys,\\n\\nOur team has been working tirelessly for the past year on creating GameVault, the source-available, self-hosted, and free alternative to traditional cloud-based game platforms like Steam, Origin, Epic Games, and GoG. We are excited to share that GameVault is now available for everyone to use, and we are delighted to disclose it to the community. \x3c!-- truncate --\x3e\\n\\nWith GameVault, you can play and track games together with your friends on a shared file server, free from any restrictions that traditional game platforms may impose. We have designed it to work with DRM-free games, providing a unique solution for those who want a more flexible and open approach to gaming. Think of it like Jellyfin, but for Videogames.\\n\\nGameVault offers a self-hosted approach that gives you complete control over your gaming experience. The platform enables you to browse your server\'s game collection, securely download games, launch and play them, and even track your playtimes and progress - regardless of whether the server is offline. Additionally, you can compare stats and play states with other users on the server.\\n\\nOur server features offer automatic indexing of games on the file system into a database, enrichment of games with metadata like tags and genres using RAWG API, multi-user authentication, and configurable logging. We have also implemented health monitoring, full-text search, filters, sorting, pagination, and a fully documented API. The GameVault platform is highly configurable to suit your needs.\\n\\nWe are thrilled that you have found us, and we invite you to try GameVault today. We would be grateful for any contributions, feedback, bug reports, and feature requests you might have. You can also support us by donating using the links provided on our website. If you have any questions or would like to connect with other GameVault users, please join our [Discord](https://discord.gg/NEdNen2dSu), Reddit and Lemmy communities - links to which are available in the footer.\\n\\nWe are passionate about creating a gaming experience that is more open, flexible, and enjoyable for everyone. We hope you will join us on this journey and experience the benefits of a truly source-available alternative to traditional game platforms with GameVault."}]}}')}}]); \ No newline at end of file diff --git a/assets/js/f8aea940.be3db7ba.js b/assets/js/f8aea940.03310267.js similarity index 98% rename from assets/js/f8aea940.be3db7ba.js rename to assets/js/f8aea940.03310267.js index bb0ba829e..382acbc53 100644 --- a/assets/js/f8aea940.be3db7ba.js +++ b/assets/js/f8aea940.03310267.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":1734306618000,"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":1734876603000,"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.0533acf6.js b/assets/js/main.0533acf6.js deleted file mode 100644 index 61f3a2bf0..000000000 --- a/assets/js/main.0533acf6.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see main.0533acf6.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","fb0"),routes:[{path:"/docs",component:d("/docs","aed"),routes:[{path:"/docs",component:d("/docs","d2e"),routes:[{path:"/docs/advanced-usage/early-access-program",component:d("/docs/advanced-usage/early-access-program","b06"),exact:!0,sidebar:"docs"},{path:"/docs/advanced-usage/fail2ban-gamevault-guide",component:d("/docs/advanced-usage/fail2ban-gamevault-guide","4bc"),exact:!0,sidebar:"docs"},{path:"/docs/advanced-usage/linux-client",component:d("/docs/advanced-usage/linux-client","713"),exact:!0,sidebar:"docs"},{path:"/docs/advanced-usage/rest-api",component:d("/docs/advanced-usage/rest-api","1b8"),exact:!0,sidebar:"docs"},{path:"/docs/advanced-usage/steamdeck",component:d("/docs/advanced-usage/steamdeck","225"),exact:!0,sidebar:"docs"},{path:"/docs/client-docs/data",component:d("/docs/client-docs/data","a5c"),exact:!0,sidebar:"docs"},{path:"/docs/client-docs/gui",component:d("/docs/client-docs/gui","864"),exact:!0,sidebar:"docs"},{path:"/docs/client-docs/how-to-use",component:d("/docs/client-docs/how-to-use","8d6"),exact:!0,sidebar:"docs"},{path:"/docs/client-docs/setup",component:d("/docs/client-docs/setup","1fb"),exact:!0,sidebar:"docs"},{path:"/docs/client-docs/themes",component:d("/docs/client-docs/themes","369"),exact:!0,sidebar:"docs"},{path:"/docs/client-docs/updating-client",component:d("/docs/client-docs/updating-client","4ff"),exact:!0,sidebar:"docs"},{path:"/docs/gamevault-plus/client-apis",component:d("/docs/gamevault-plus/client-apis","abd"),exact:!0,sidebar:"docs"},{path:"/docs/gamevault-plus/client-setup",component:d("/docs/gamevault-plus/client-setup","9ea"),exact:!0,sidebar:"docs"},{path:"/docs/gamevault-plus/integrations/discord",component:d("/docs/gamevault-plus/integrations/discord","67e"),exact:!0,sidebar:"docs"},{path:"/docs/gamevault-plus/integrations/playnite",component:d("/docs/gamevault-plus/integrations/playnite","99b"),exact:!0,sidebar:"docs"},{path:"/docs/gamevault-plus/integrations/steam",component:d("/docs/gamevault-plus/integrations/steam","b59"),exact:!0,sidebar:"docs"},{path:"/docs/gamevault-plus/introduction",component:d("/docs/gamevault-plus/introduction","137"),exact:!0,sidebar:"docs"},{path:"/docs/gamevault-plus/themes",component:d("/docs/gamevault-plus/themes","e9e"),exact:!0,sidebar:"docs"},{path:"/docs/intro",component:d("/docs/intro","79d"),exact:!0,sidebar:"docs"},{path:"/docs/license-contribute",component:d("/docs/license-contribute","881"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/adding-games",component:d("/docs/server-docs/adding-games","ad5"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/backup-and-restore",component:d("/docs/server-docs/backup-and-restore","338"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/configuration",component:d("/docs/server-docs/configuration","615"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/game-types",component:d("/docs/server-docs/game-types","bcd"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/indexing",component:d("/docs/server-docs/indexing","e22"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/media",component:d("/docs/server-docs/media","3f4"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/metadata-enrichment/metadata",component:d("/docs/server-docs/metadata-enrichment/metadata","c89"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/metadata-enrichment/provider-igdb",component:d("/docs/server-docs/metadata-enrichment/provider-igdb","622"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/parental-control",component:d("/docs/server-docs/parental-control","3e8"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/plugins",component:d("/docs/server-docs/plugins","fd5"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/server-news",component:d("/docs/server-docs/server-news","27b"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/setup/",component:d("/docs/server-docs/setup/","34b"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/setup/caprover",component:d("/docs/server-docs/setup/caprover","392"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/setup/docker-compose",component:d("/docs/server-docs/setup/docker-compose","d61"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/setup/native",component:d("/docs/server-docs/setup/native","6a2"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/setup/synology-container-manager",component:d("/docs/server-docs/setup/synology-container-manager","63b"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/setup/truenas-scale",component:d("/docs/server-docs/setup/truenas-scale","1df"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/setup/truenas-scale-legacy",component:d("/docs/server-docs/setup/truenas-scale-legacy","0c7"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/setup/unraid",component:d("/docs/server-docs/setup/unraid","3fe"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/structure",component:d("/docs/server-docs/structure","0e1"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/updating-games",component:d("/docs/server-docs/updating-games","fc7"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/user-management",component:d("/docs/server-docs/user-management","426"),exact:!0,sidebar:"docs"},{path:"/docs/server-docs/websockets",component:d("/docs/server-docs/websockets","1a5"),exact:!0,sidebar:"docs"},{path:"/docs/troubleshooting",component:d("/docs/troubleshooting","a8e"),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