Enhance README and RPC for package management
- Added instructions to README.md for building an ISO from source and flashing it to USB. - Introduced a new RPC method for package installation, including security checks and container management. - Updated Docker and Podman integration in build scripts to support both container runtimes. - Enhanced Nginx configuration for improved timeout settings and WebSocket support. - Added new app metadata for additional applications in the Docker package scanner.
@@ -4,14 +4,25 @@
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/favico.png" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/favico.png" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<link rel="apple-touch-icon" sizes="72x72" href="/assets/img/favico.png" />
|
||||
<link rel="apple-touch-icon" sizes="96x96" href="/assets/img/favico.png" />
|
||||
<link rel="apple-touch-icon" sizes="128x128" href="/assets/img/favico.png" />
|
||||
<link rel="apple-touch-icon" sizes="144x144" href="/assets/img/favico.png" />
|
||||
<link rel="apple-touch-icon" sizes="152x152" href="/assets/img/favico.png" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/assets/img/favico.png" />
|
||||
<link rel="apple-touch-icon" sizes="192x192" href="/assets/img/favico.png" />
|
||||
<link rel="apple-touch-icon" sizes="512x512" href="/assets/img/favico.png" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
|
||||
<meta name="description" content="Archipelago - Your sovereign personal server" />
|
||||
<meta name="theme-color" content="#000000" />
|
||||
<meta name="mobile-web-app-capable" content="yes" />
|
||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
||||
<meta name="apple-mobile-web-app-title" content="Archipelago" />
|
||||
<link rel="manifest" href="/manifest.json" />
|
||||
<meta name="application-name" content="Archipelago" />
|
||||
<meta name="msapplication-TileColor" content="#000000" />
|
||||
<meta name="msapplication-TileImage" content="/assets/img/favico.png" />
|
||||
<link rel="manifest" href="/manifest.webmanifest" />
|
||||
<title>Archipelago OS</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
@@ -207,7 +207,7 @@ async function getDockerContainers() {
|
||||
},
|
||||
'ollama': {
|
||||
title: 'Ollama',
|
||||
icon: '/assets/img/ollama.webp',
|
||||
icon: '/assets/img/app-icons/ollama.png',
|
||||
description: 'Run large language models locally'
|
||||
},
|
||||
'searxng': {
|
||||
|
||||
|
Before Width: | Height: | Size: 580 KiB After Width: | Height: | Size: 580 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 253 KiB After Width: | Height: | Size: 253 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 4.3 KiB |
@@ -0,0 +1,94 @@
|
||||
<svg width="256" height="256" viewBox="0 0 256 256" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="256" height="256" fill="white"/>
|
||||
<g clip-path="url(#clip0_1414_247)">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M55.6017 170.3V169.701L55 169.4V170.001L55.6017 170.3Z" fill="#FAA42F"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M55 149.1L55.6017 148.699V138.299L55 138.002V149.1Z" fill="#DDB02A"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M55 169.4L55.6017 169.701L62.8258 165.5V152.9L55.6017 148.699L55 149.1V169.4Z" fill="#C47728"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M73.1622 180.498L73.764 180.102L82.7949 185.4V186.003L73.1622 180.498Z" fill="#F15933"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M73.1623 180.498L73.764 180.102V171.801L62.8258 165.5L55.6017 169.701V170.3L73.1623 180.498Z" fill="#F37132"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M55 117.703L55.6017 117.402V106.902L55 106.6V117.703Z" fill="#D6E042"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M55 138.003L55.5999 138.3L61.9214 134.701C61.6365 132.479 61.503 130.241 61.5221 128.001C61.5221 125.698 61.7226 123.298 61.9214 121L55.5999 117.396L55 117.697V138.003Z" fill="#FCEA3B"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M55.5999 148.8L62.8258 152.901L73.764 146.699V138.297L68.4435 135.201C68.5456 136.703 68.8464 138.201 69.1473 139.701L63.3272 143.097C62.6158 140.343 62.1454 137.531 61.9214 134.695L55.5999 138.294V148.8Z" fill="#FAA42F"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M73.764 180.102V171.802L76.6722 170.102L76.5737 170.003C77.9777 171.702 79.482 173.3 80.988 174.801C83.5103 177.311 86.2277 179.618 89.1147 181.7L82.7932 185.4L73.764 180.102ZM84.6001 165.502L91.9244 169.701V175.801C89.6606 174.155 87.5453 172.314 85.6029 170.3C84.4224 169.209 83.3162 168.04 82.2917 166.802L84.6001 165.502Z" fill="#F15933"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M110.088 201.702V201.001L100.957 195.803L100.456 196.103L110.088 201.702Z" fill="#E22574"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M100.456 196.103L100.957 195.803V188.5C96.7762 186.668 92.8057 184.39 89.1147 181.707L82.7932 185.407V186.01L100.456 196.103Z" fill="#EF3839"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M55 86.3L55.6017 85.9997V85.7012L55 85.9997V86.3Z" fill="#BBD64B"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M55 106.599L55.6017 106.901L64.6327 101.701V91.2021L55.6017 86L55 86.3003V106.599Z" fill="#D6E042"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M55.5999 117.397L61.9214 120.995C62.6159 114.747 64.17 108.625 66.5399 102.801L64.6327 101.703L55.5999 106.902V117.397ZM68.4435 120.397L73.764 117.397V106.902L72.1522 105.999C70.3068 110.623 69.0587 115.463 68.4381 120.402L68.4435 120.397Z" fill="#FFCF29"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M68.4435 135.201L73.764 138.3L82.7931 133.101V122.6L73.764 117.396L68.4435 120.396C68.1248 122.917 67.958 125.455 67.9439 127.995C67.9579 130.404 68.1248 132.809 68.4435 135.196V135.201Z" fill="#FAA42F"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M84.6001 152.901L90.9216 149.299L100.957 155.1V164.399L91.9262 169.701L84.6001 165.5V152.901Z" fill="#F15933"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M100.957 195.803L110.09 201.001L119.223 195.803V193.702C112.8 192.808 106.679 191.103 100.957 188.5V195.803ZM119.223 187.2V185.4L110.09 180.102L104.77 183.201C109.39 185.163 114.249 186.508 119.222 187.2H119.223Z" fill="#EE438D"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M84.6001 152.902L90.9216 149.299V137.701L82.7949 133.102L73.764 138.3V146.7L84.6001 152.902Z" fill="#F37132"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M127.649 211.802L128.252 211.502V201.001L119.22 195.803L110.088 201.001V201.702L127.649 211.802Z" fill="#CC3192"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M104.768 183.201L110.088 180.101V169.701L100.955 164.398L91.9226 169.701V175.8C95.8595 178.82 100.178 181.308 104.766 183.201H104.768Z" fill="#BD2025"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M128.55 211.702L128.252 211.502L127.649 211.802L128.05 212.001L128.55 211.702Z" fill="#9B3995"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M55.6017 85.9992L64.6327 91.2013L73.764 85.9992V75.4985L73.4631 75.3984L55.6017 85.7007V85.9992Z" fill="#F1EB59"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M64.6327 101.703L66.5399 102.8C68.8464 97.0977 71.957 91.8957 75.6729 87.1012L73.7657 86L64.6327 91.2021V101.703ZM72.154 105.993L73.7657 106.896L82.7949 101.697V91.2021L81.2907 90.4012C77.4984 95.1263 74.4212 100.381 72.1576 105.998L72.154 105.993Z" fill="#FCEA3B"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M73.764 117.402L82.7949 122.601L90.9216 117.901V106.703L91.2242 106.501L82.7949 101.701L73.764 106.901V117.402Z" fill="#FAA42F"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M110.088 180.102L119.22 185.401L128.252 180.102V170.503L128.05 170.601L118.217 165.002L110.088 169.702V180.102Z" fill="#E22574"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M82.7949 133.101L90.9216 137.7V117.9L82.7949 122.6V133.101Z" fill="#F7975F"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M119.22 195.803L128.251 201.001L137.384 195.803V193.602C134.289 194.001 131.171 194.201 128.05 194.201C125.101 194.19 122.154 194.023 119.222 193.702L119.22 195.803ZM137.382 187.1V185.4L128.249 180.102L119.218 185.4V187.2C122.143 187.605 125.093 187.806 128.047 187.801C131.171 187.816 134.293 187.581 137.38 187.1H137.382Z" fill="#CC3192"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M100.957 164.399L110.088 169.701L118.217 165.001L100.957 155.1V164.399Z" fill="#D31F26"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M128.253 211.502L128.55 211.702L146.411 201.402V201.001L137.384 195.803L128.253 201.001V211.502Z" fill="#73206A"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M73.4631 75.3985L73.764 75.4987L82.7949 70.3002V69.998L73.4631 75.3985Z" fill="#D6E042"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M73.764 86.0001L75.6712 87.1013C77.3742 85.0008 79.1829 83.1023 80.988 81.2021C83.5859 78.5954 86.4063 76.2195 89.4173 74.1015L82.7914 70.3027L73.7622 75.5012L73.764 86.0001ZM81.2853 90.4013L82.7896 91.2022L91.9226 86.0001V80.2028C89.6571 81.846 87.5417 83.6861 85.6011 85.7016C84.0969 87.1996 82.6929 88.6977 81.2871 90.4013H81.2853Z" fill="#FFCF29"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M82.7949 101.701L91.2242 106.501L100.957 100.902V91.2021L91.9262 86L82.7949 91.2021V101.701Z" fill="#FAA42F"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M155.845 195.999L155.542 195.803L146.411 201.001V201.402L155.845 195.999Z" fill="#853A96"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M128.253 180.101L137.384 185.4L146.411 180.101V169.701L138.086 164.799L128.253 170.501V180.101Z" fill="#CC3192"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M137.382 195.803L146.411 201.001L155.544 195.803V188.294C149.774 190.917 143.658 192.704 137.382 193.602V195.803ZM151.529 183.101L146.411 180.102L137.382 185.4V187.1C142.299 186.299 147.113 185 151.529 183.101Z" fill="#9B3995"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M82.7932 70.3L89.4191 74.0988C93.0328 71.5158 96.8992 69.3045 100.959 67.4987V59.7993L100.757 59.6992L82.7949 69.9979L82.7932 70.3Z" fill="#FFCF29"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M91.9244 85.9998L100.957 91.2019L110.09 85.9998V75.4992L105.166 72.7051C100.348 74.6071 95.934 77.2064 91.9137 80.2132L91.9244 85.9998Z" fill="#D98A26"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M155.542 195.803L155.843 196.001L173.705 185.702V185.4L167.079 181.602C163.456 184.199 159.592 186.443 155.539 188.302L155.542 195.803Z" fill="#8F4F9F"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M118.518 90.7981L110.088 86L100.957 91.2021V100.902L118.518 90.7981Z" fill="#F37132"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M138.086 164.799L146.411 169.701L155.542 164.399V154.799L138.086 164.799Z" fill="#D24B9B"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M146.411 180.101L151.529 183.101C156.203 181.129 160.591 178.539 164.573 175.4V169.701L155.542 164.398L146.409 169.701L146.411 180.101Z" fill="#B263A7"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M100.755 59.6993L100.957 59.7994L110.088 54.5956V54.2988L100.755 59.6993Z" fill="#FFCF29"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M105.166 72.7048L110.083 75.506L117.406 71.4052V69.0991L117.809 69.0008C113.47 69.7628 109.229 71.0052 105.166 72.7048ZM117.406 58.804L110.088 54.5977L100.955 59.7997V67.4991C106.216 65.1929 111.743 63.5475 117.409 62.601L117.406 58.804Z" fill="#FAA42F"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M167.082 181.602L173.708 185.4L182.841 180.102V171.802L171.9 165.502L164.573 169.701V175.4C165.78 174.599 166.781 173.7 167.888 172.799L173.705 176.101C171.614 178.071 169.401 179.908 167.079 181.602H167.082Z" fill="#6B297A"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M183.139 180.3L182.838 180.102L173.706 185.4V185.7L183.139 180.3Z" fill="#782A8F"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M110.088 86L118.518 90.798L128.05 85.4011L128.252 85.4994V77.598L117.413 71.3984L110.088 75.4993V86Z" fill="#F37132"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M155.542 164.399L164.575 169.701L171.9 165.5V152.901L165.078 149.002V149.299L155.542 154.799V164.399Z" fill="#9B3995"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M110.088 54.5954L117.413 58.7964L128.252 52.4967V44.1984L128.05 44L110.088 54.2987V54.5954Z" fill="#FAA42F"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M128.253 85.4994V77.598L139.189 71.3984L146.411 75.4993V86L137.783 91L128.253 85.4994Z" fill="#F15933"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M182.838 180.102L183.139 180.3L201 170.001V169.701L193.674 165.5L182.838 171.801V180.102Z" fill="#782A8F"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M165.078 138.002L173.706 133.1V122.6L165.078 117.6V138.002Z" fill="#A01664"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M155.542 101.199V91.2021L146.411 86L137.783 91.0001L155.542 101.199Z" fill="#C02026"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M165.078 149.003L171.9 152.902L182.838 146.7V138.3L173.706 133.102L165.078 138.003V149.003Z" fill="#9B3995"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M139.191 58.7969L146.413 54.5977L155.546 59.7997V67.6994C152.817 66.4584 150 65.4217 147.117 64.5978V71.3015C148.521 71.7105 149.897 72.2109 151.236 72.7995L146.418 75.4989L139.191 71.398V58.7969Z" fill="#F15933"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M184.643 147.992C186.081 143.949 187.058 139.756 187.555 135.494L182.836 138.292V146.694L184.745 147.795L184.643 147.992ZM193.674 152.894L201 148.693V138.299L194.168 134.4C193.593 140.146 192.278 145.794 190.255 151.204L190.359 151.002L193.674 152.894Z" fill="#9051A0"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M164.976 106.703L173.706 101.701V91.2021L164.575 86L155.542 91.2021V101.199L164.976 106.703Z" fill="#B01B4A"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M139.189 58.7972L146.411 54.5962L128.253 44.1992V52.4975L139.189 58.7972Z" fill="#C54627"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M165.078 117.601L173.706 122.601L182.838 117.402V106.901L173.706 101.701L164.976 106.703H165.078V117.601Z" fill="#A41768"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M146.411 85.9989L155.544 91.2009L164.575 85.9989V80.5984C160.514 77.3892 156.022 74.7639 151.23 72.7988L146.413 75.4982L146.411 85.9989Z" fill="#EF3839"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M173.705 133.101L182.838 138.3L187.556 135.502C187.878 133.012 188.045 130.504 188.056 127.994C188.041 125.353 187.874 122.714 187.556 120.092L182.836 117.396L173.703 122.595L173.705 133.101Z" fill="#9B3995"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M194.168 134.401L200.995 138.3V117.396L194.07 121.295C194.356 123.517 194.49 125.756 194.471 127.995C194.471 130.194 194.37 132.295 194.168 134.395V134.401Z" fill="#6B297A"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M164.573 85.9999L173.706 91.202L174.81 90.5996C173.48 88.8745 172.039 87.2383 170.496 85.7014C168.617 83.8938 166.641 82.1905 164.575 80.5994L164.573 85.9999ZM180.427 87.3031L182.836 85.9999V75.4993L173.703 70.3008L166.882 74.298C169.772 76.3758 172.49 78.684 175.007 81.2001C176.916 83.1402 178.724 85.1773 180.424 87.3031H180.427Z" fill="#E22574"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M173.705 101.703L182.838 106.901L183.941 106.299C181.757 100.612 178.674 95.3115 174.808 90.5996L173.705 91.2021V101.703ZM189.559 103.002L191.869 101.703V91.2021L182.836 86L180.427 87.3032C184.16 92.1058 187.232 97.3857 189.56 103.002H189.559Z" fill="#CC3192"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M166.884 74.2986L173.705 70.3015L155.542 59.8008V67.7004C159.538 69.5091 163.338 71.72 166.884 74.2986Z" fill="#EF3839"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M182.836 117.397L187.555 120.094C186.884 115.371 185.671 110.74 183.939 106.294L182.836 106.896V117.397ZM194.075 121.296L201 117.397V106.902L191.867 101.703L189.557 103.003C191.867 108.804 193.47 114.901 194.073 121.301L194.075 121.296Z" fill="#B263A7"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M182.838 86.0007L191.869 91.2027L201 86.0007L182.838 75.5V86.0007Z" fill="#D1499A"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M191.869 101.701L201 106.901V86L191.869 91.2021V101.701Z" fill="#9B3995"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M193.674 165.5L201 169.701V148.799V148.699L193.674 152.9V165.5Z" fill="#85459A"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M109.186 137.801L110.088 138.3V139.302L109.186 138.798V137.801Z" fill="#F15933"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M109.186 117.901L110.088 117.402L119.22 122.601V133.102L110.088 138.3L109.186 137.801V117.901Z" fill="#F15933"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M128.954 149.1L128.252 148.699L127.348 149.298L128.05 149.699L128.954 149.1Z" fill="#E22574"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M127.348 149.299L128.252 148.701V138.3L119.22 133.102L110.088 138.3V139.303L127.348 149.299Z" fill="#EF3839"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M128.253 148.701L128.954 149.101L146.411 139.001V138.3L137.384 133.102L128.253 138.3V148.701Z" fill="#EE3F8A"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M119.22 133.102L128.253 138.3L137.384 133.102V122.601L128.253 117.402L119.22 122.601V133.102Z" fill="#EF3839"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M137.384 133.102L146.411 138.3L146.816 138.102V117.601L146.411 117.402L137.384 122.601V133.102Z" fill="#E22574"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M146.816 138.102L146.411 138.3V139.001L146.816 138.799V138.102Z" fill="#CC3192"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M109.186 117.901L110.088 117.402V116.699L109.186 117.2V117.901Z" fill="#F37132"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M110.088 117.402V116.7L127.649 106.6L128.252 106.902V117.402L119.22 122.601L110.088 117.402Z" fill="#F15933"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M128.654 106.703L128.252 106.901L127.649 106.599L128.05 106.4L128.654 106.703Z" fill="#F4805F"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M128.253 117.402L137.384 122.601L146.411 117.402V117.002L128.654 106.703L128.253 106.902V117.402Z" fill="#EF3839"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M146.411 117.402L146.816 117.601V117.2L146.411 117.002V117.402Z" fill="#E22574"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M122.029 68.6998L128.252 72.3019L134.47 68.6998V61.5009L128.252 57.9023L122.029 61.5009V68.6998Z" fill="#F37132"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M176.514 162.799L182.838 166.401L189.059 162.799V155.599L182.838 152.002L176.514 155.599V162.799Z" fill="#552263"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M67.5427 162.799L73.764 166.401L79.9852 162.799V155.599L73.764 152.002L67.5427 155.599V162.799Z" fill="#F37132"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_1414_247">
|
||||
<rect width="146" height="168" fill="white" transform="translate(55 44)"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 63 KiB |
@@ -1,64 +0,0 @@
|
||||
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width, initial-scale=1" data-next-head=""/><title data-next-head="">ONLYOFFICE is on maintenance</title><meta http-equiv="Content-Type" content="text/html; charset=utf-8" data-next-head=""/><link rel="icon" sizes="96x96" href="https://static-site.onlyoffice.com/public/images/favicons/favicon.ico" type="image/x-icon" data-next-head=""/><link rel="preload" href="/_next/static/css/6ff2c90990d5b697.css" as="style"/><script id="gtaginit" data-nscript="beforeInteractive">
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag(){dataLayer.push(arguments);}
|
||||
gtag('consent', 'default', {
|
||||
'necessary': 'granted',
|
||||
'analytics_storage': 'denied',
|
||||
'ad_storage': 'denied',
|
||||
'ad_user_data': 'denied',
|
||||
'ad_personalization': 'denied',
|
||||
'security_storage': 'granted',
|
||||
'functionality_storage': 'denied',
|
||||
'personalization_storage': 'denied',
|
||||
});
|
||||
</script><script id="googletagmanager" data-nscript="beforeInteractive">
|
||||
(function(w, d, s, l, i) {
|
||||
w[l] = w[l] || [];
|
||||
w[l].push({
|
||||
'gtm.start': new Date().getTime(),
|
||||
event: 'gtm.js'
|
||||
});
|
||||
var f = d.getElementsByTagName(s)[0],
|
||||
j = d.createElement(s),
|
||||
dl = l != 'dataLayer' ? '&l=' + l : '';
|
||||
j.async = true;
|
||||
j.src =
|
||||
'https://www.googletagmanager.com/gtm.js?id=' + i + dl;
|
||||
f.parentNode.insertBefore(j, f);
|
||||
})(window, document, 'script', 'dataLayer', 'GTM-5NW47TX');
|
||||
</script><link rel="stylesheet" href="/_next/static/css/6ff2c90990d5b697.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-c17ab2b0b6c668ef.js" defer=""></script><script src="/_next/static/chunks/framework-052df06e2bd8891b.js" defer=""></script><script src="/_next/static/chunks/main-fbe906fa9b26592d.js" defer=""></script><script src="/_next/static/chunks/pages/_app-836286d9c90163c8.js" defer=""></script><script src="/_next/static/chunks/9757-317278a3102c703e.js" defer=""></script><script src="/_next/static/chunks/8230-266f1beeaf561b84.js" defer=""></script><script src="/_next/static/chunks/8408-6a8ba158f885341e.js" defer=""></script><script src="/_next/static/chunks/955-ca8532f8eadee167.js" defer=""></script><script src="/_next/static/chunks/pages/404-83f7968fe4ec936f.js" defer=""></script><script src="/_next/static/gM912HAqYzwkHpIhm_8kz/_buildManifest.js" defer=""></script><script src="/_next/static/gM912HAqYzwkHpIhm_8kz/_ssgManifest.js" defer=""></script><style data-styled="" data-styled-version="6.1.15">.gitfLR{font-weight:700;color:#333333;font-size:40px;line-height:52px;letter-spacing:-0.02em;}/*!sc*/
|
||||
@media screen and (max-width: 768px){.gitfLR{font-size:36px;line-height:48px;}}/*!sc*/
|
||||
@media screen and (max-width: 592px){.gitfLR{font-size:24px;line-height:32px;}}/*!sc*/
|
||||
data-styled.g2[id="sc-4a0dc9a6-0"]{content:"gitfLR,"}/*!sc*/
|
||||
.bENGFw{display:inline-flex;align-items:center;justify-content:center;border-radius:9px;font-size:16px;font-weight:600;line-height:22px;width:auto;min-height:56px;text-align:center;cursor:pointer;padding:17px 24px;border:none;color:#ffffff;background-color:#ff6f3d;transition:background-color 0.2s;}/*!sc*/
|
||||
.bENGFw:hover,.bENGFw:active{background-color:#ff865c;}/*!sc*/
|
||||
.bENGFw:disabled{background-color:#ffd4c5;}/*!sc*/
|
||||
.bENGFw:disabled{pointer-events:none;cursor:initial;}/*!sc*/
|
||||
@media screen and (max-width: 592px){.bENGFw{width:100%;min-height:48px;padding:13px 24px;}}/*!sc*/
|
||||
data-styled.g3[id="sc-42779ccb-0"]{content:"bENGFw,"}/*!sc*/
|
||||
.kCwzon{color:#555555;}/*!sc*/
|
||||
data-styled.g15[id="sc-9abe7efc-0"]{content:"kCwzon,"}/*!sc*/
|
||||
.bcNFlh{padding:0 40px;margin:0 auto;width:100%;max-width:1200px;}/*!sc*/
|
||||
@media screen and (max-width: 1200px){.bcNFlh{padding:0 48px;}}/*!sc*/
|
||||
@media screen and (max-width: 1024px){.bcNFlh{padding:0 40px;}}/*!sc*/
|
||||
@media screen and (max-width: 592px){.bcNFlh{padding:0 16px;}}/*!sc*/
|
||||
data-styled.g36[id="sc-441ed035-0"]{content:"bcNFlh,"}/*!sc*/
|
||||
.bYZvfd{padding:64px 0;}/*!sc*/
|
||||
@media screen and (max-width: 1024px){.bYZvfd{padding:64px 0;}}/*!sc*/
|
||||
@media screen and (max-width: 768px){.bYZvfd{padding:64px 0;}}/*!sc*/
|
||||
@media screen and (max-width: 592px){.bYZvfd{padding:64px 0;}}/*!sc*/
|
||||
data-styled.g52[id="sc-564d4cb-0"]{content:"bYZvfd,"}/*!sc*/
|
||||
.Jczup{display:flex;align-items:center;min-height:100vh;}/*!sc*/
|
||||
data-styled.g53[id="sc-b39c7ab-0"]{content:"Jczup,"}/*!sc*/
|
||||
.btnMQN{margin:0 auto;max-width:530px;text-align:center;}/*!sc*/
|
||||
data-styled.g54[id="sc-b39c7ab-1"]{content:"btnMQN,"}/*!sc*/
|
||||
.bwugrd{margin-bottom:40px;padding-bottom:66.8%;width:100%;max-width:518px;background-image:url(https://static-site.onlyoffice.com/public/images/templates/error/not-found.svg);background-position:center;background-repeat:no-repeat;background-size:contain;}/*!sc*/
|
||||
@media screen and (max-width: 592px){.bwugrd{margin-bottom:8px;}}/*!sc*/
|
||||
data-styled.g55[id="sc-b39c7ab-2"]{content:"bwugrd,"}/*!sc*/
|
||||
.eSGpxq{margin-bottom:24px;}/*!sc*/
|
||||
@media screen and (max-width: 592px){.eSGpxq{margin-bottom:16px;}}/*!sc*/
|
||||
data-styled.g56[id="sc-b39c7ab-3"]{content:"eSGpxq,"}/*!sc*/
|
||||
.ekeMIh{margin-bottom:24px;font-size:16px;line-height:24px;}/*!sc*/
|
||||
@media screen and (max-width: 592px){.ekeMIh{font-size:13px;}}/*!sc*/
|
||||
data-styled.g57[id="sc-b39c7ab-4"]{content:"ekeMIh,"}/*!sc*/
|
||||
</style></head><body><noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-5NW47TX" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript><div id="__next"><div class="sc-564d4cb-0 bYZvfd sc-b39c7ab-0 Jczup"><div class="sc-441ed035-0 bcNFlh"><div class="sc-b39c7ab-1 btnMQN"><div class="sc-b39c7ab-2 bwugrd"></div><h1 class="sc-4a0dc9a6-0 gitfLR sc-b39c7ab-3 eSGpxq">404 Error!</h1><p class="sc-9abe7efc-0 kCwzon sc-b39c7ab-4 ekeMIh">It seems you clicked on an invalid link, or entered an address that is not on this website</p><a class="sc-42779ccb-0 bENGFw" href="/">Go to home page</a></div></div></div><div id="_rht_toaster" style="position:fixed;z-index:9999;top:16px;left:16px;right:16px;bottom:16px;pointer-events:none"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"_nextI18Next":{"initialI18nStore":{"en":{"common":{"HarmonyInYourCookies":"Harmony in your cookies","CookieText":"Our website uses cookies to provide you with a tailored experience. Cookies help us run the site, improve your browsing, and enable targeted marketing and ads. You can fully consent to our use of cookies or manage your preferences. \u003c0\u003eLearn more\u003c/0\u003e","Deny":"Deny","Customize":"Customize","AcceptAll":"Accept All","CookieSettings":"Cookie settings","ConfirmMyChoices":"Confirm my choices","Technical":"Technical (required)","TechnicalDescription":"These cookies are necessary for displaying our website correctly. They ensure its proper functioning.","Analytical":"Analytical","AnalyticalDescription":"The purpose of analytical cookies is to discover how users use our website as well as to track their visits. These functions allow us to improve the quality and content of our website.","Marketing":"Marketing","MarketingDescription":"These cookies are used for marketing purposes and the collection of information to better tailor advertising to the interests of the users of our website.","GetFreeMobileApp":"Get free mobile app","GetItNow":"Get it now","UnlockNewYearGifts":"Unlock \u003cbr\u003e New Year Gifts","CompleteTheNewYearPuzzle":"Complete the New Year Puzzle, unlock gifts and discounts!","ClaimYourGifts":"Claim your gifts"},"error":{"GoToHomePage":"Go to home page","ONLYOFFICE is on maintenance":"ONLYOFFICE is on maintenance","Sorry, Forbidden":"Sorry, Forbidden"}}},"initialLocale":"en","ns":["common","error"],"userConfig":{"i18n":{"locales":["en","fr","de","es","pt","it","cs","nl","ja","zh","ru","sr"],"defaultLocale":"en","localeDetection":false},"returnObjects":true,"default":{"i18n":{"locales":["en","fr","de","es","pt","it","cs","nl","ja","zh","ru","sr"],"defaultLocale":"en","localeDetection":false},"returnObjects":true}}}},"__N_SSG":true},"page":"/404","query":{},"buildId":"gM912HAqYzwkHpIhm_8kz","isFallback":false,"gsp":true,"locale":"en","locales":["en","fr","de","es","pt","it","cs","nl","ja","zh","ru","sr"],"defaultLocale":"en","scriptLoader":[]}</script></body></html>
|
||||
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 6.7 KiB After Width: | Height: | Size: 6.7 KiB |
@@ -0,0 +1,10 @@
|
||||
<svg width="256" height="256" viewBox="0 0 256 256" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M0 0H256V256H0V0Z" fill="url(#paint0_linear)"/>
|
||||
<path d="M127.873 59L144.779 70.3746M205.981 175.231L202.56 195.889L205.981 175.231ZM50.1067 176.077L62.7712 188.032L50.1067 176.077ZM144.659 70.4857L62.6857 187.87C62.6756 187.881 62.6691 187.895 62.6669 187.91C62.6647 187.925 62.6669 187.94 62.6733 187.954C62.6797 187.967 62.6899 187.979 62.7028 187.987C62.7156 187.995 62.7305 187.999 62.7456 187.998L202.483 196C202.497 196.001 202.511 195.999 202.523 195.993C202.536 195.987 202.547 195.978 202.555 195.967C202.563 195.956 202.567 195.942 202.568 195.928C202.569 195.915 202.566 195.901 202.56 195.889L144.779 70.5027C144.765 70.4846 144.745 70.4726 144.722 70.4694C144.7 70.4662 144.677 70.4721 144.659 70.4857V70.4857ZM127.779 59.1366L50.0126 175.915C50.0039 175.931 49.9996 175.95 50 175.968C50.0004 175.987 50.0056 176.005 50.015 176.022C50.0243 176.038 50.0377 176.051 50.0537 176.061C50.0697 176.071 50.0879 176.076 50.1067 176.077L205.895 175.394C205.914 175.394 205.933 175.389 205.949 175.38C205.966 175.37 205.979 175.356 205.988 175.339C205.997 175.322 206.001 175.303 206 175.284C205.998 175.265 205.992 175.247 205.981 175.231L127.958 59.1366C127.949 59.1206 127.936 59.1073 127.921 59.098C127.905 59.0887 127.887 59.0838 127.868 59.0838C127.85 59.0838 127.832 59.0887 127.816 59.098C127.8 59.1073 127.787 59.1206 127.779 59.1366Z" stroke="#1D1D1B" stroke-width="5" stroke-miterlimit="10"/>
|
||||
<defs>
|
||||
<linearGradient id="paint0_linear" x1="37.4885" y1="218.512" x2="218.512" y2="37.4885" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#C2FDE4"/>
|
||||
<stop offset="1" stop-color="#CDC6E9"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 3.9 KiB |
|
After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 8.2 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 123 KiB |
|
Before Width: | Height: | Size: 93 KiB |
|
Before Width: | Height: | Size: 71 KiB |
|
Before Width: | Height: | Size: 5.8 KiB |
@@ -18,6 +18,9 @@ export class WebSocketClient {
|
||||
private reconnectTimer: ReturnType<typeof setTimeout> | null = null
|
||||
private visibilityChangeHandler: (() => void) | null = null
|
||||
private onlineHandler: (() => void) | null = null
|
||||
private heartbeatTimer: ReturnType<typeof setTimeout> | null = null
|
||||
private lastMessageTime: number = Date.now()
|
||||
private heartbeatInterval = 10000 // Check connection every 10 seconds
|
||||
|
||||
constructor(url: string = '/ws/db') {
|
||||
this.url = url
|
||||
@@ -132,8 +135,10 @@ export class WebSocketClient {
|
||||
this.ws.onopen = () => {
|
||||
clearTimeout(connectionTimeout)
|
||||
this.reconnectAttempts = 0
|
||||
this.lastMessageTime = Date.now()
|
||||
console.log('[WebSocket] Connected successfully')
|
||||
this.notifyConnectionState(true)
|
||||
this.startHeartbeat()
|
||||
resolve()
|
||||
}
|
||||
|
||||
@@ -145,6 +150,7 @@ export class WebSocketClient {
|
||||
}
|
||||
|
||||
this.ws.onmessage = (event) => {
|
||||
this.lastMessageTime = Date.now()
|
||||
try {
|
||||
const update: Update = JSON.parse(event.data)
|
||||
this.callbacks.forEach((callback) => callback(update))
|
||||
@@ -155,6 +161,7 @@ export class WebSocketClient {
|
||||
|
||||
this.ws.onclose = (event) => {
|
||||
clearTimeout(connectionTimeout)
|
||||
this.stopHeartbeat()
|
||||
console.log('[WebSocket] Closed', { code: event.code, reason: event.reason, wasClean: event.wasClean })
|
||||
|
||||
// Notify connection state changed
|
||||
@@ -243,9 +250,39 @@ export class WebSocketClient {
|
||||
this.connectionStateCallbacks.forEach((callback) => callback(connected))
|
||||
}
|
||||
|
||||
private startHeartbeat(): void {
|
||||
this.stopHeartbeat()
|
||||
|
||||
this.heartbeatTimer = setInterval(() => {
|
||||
if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
|
||||
console.warn('[WebSocket] Heartbeat detected closed connection')
|
||||
this.stopHeartbeat()
|
||||
return
|
||||
}
|
||||
|
||||
// Check if we've received a message recently
|
||||
const timeSinceLastMessage = Date.now() - this.lastMessageTime
|
||||
|
||||
// If no message for more than 60 seconds, assume connection is stale
|
||||
if (timeSinceLastMessage > 60000) {
|
||||
console.warn('[WebSocket] No messages for 60s, reconnecting...')
|
||||
this.ws.close()
|
||||
return
|
||||
}
|
||||
}, this.heartbeatInterval)
|
||||
}
|
||||
|
||||
private stopHeartbeat(): void {
|
||||
if (this.heartbeatTimer) {
|
||||
clearInterval(this.heartbeatTimer)
|
||||
this.heartbeatTimer = null
|
||||
}
|
||||
}
|
||||
|
||||
disconnect(): void {
|
||||
this.shouldReconnect = false
|
||||
this.reconnectAttempts = 0
|
||||
this.stopHeartbeat()
|
||||
|
||||
// Clear reconnect timer
|
||||
if (this.reconnectTimer) {
|
||||
|
||||
@@ -335,7 +335,7 @@ export const dummyApps: Record<string, PackageDataEntry> = {
|
||||
'static-files': {
|
||||
license: 'MIT',
|
||||
instructions: 'Local AI model runner',
|
||||
icon: '/assets/img/ollama.webp'
|
||||
icon: '/assets/img/app-icons/ollama.png'
|
||||
},
|
||||
manifest: {
|
||||
id: 'ollama',
|
||||
|
||||
@@ -111,7 +111,7 @@
|
||||
Already Installed
|
||||
</button>
|
||||
<button
|
||||
v-else-if="app.source === 'local' || app.manifestUrl"
|
||||
v-else-if="app.source === 'local' || app.dockerImage"
|
||||
@click.stop="app.source === 'local' ? installApp(app) : installCommunityApp(app)"
|
||||
:disabled="installing === app.id || installing !== null"
|
||||
class="flex-1 px-4 py-2 gradient-button rounded-lg text-sm font-medium disabled:opacity-50 disabled:cursor-not-allowed"
|
||||
@@ -268,7 +268,10 @@
|
||||
<div class="flex items-center gap-3">
|
||||
<!-- Category Icon -->
|
||||
<div class="flex-shrink-0 w-10 h-10 rounded-lg bg-white/10 flex items-center justify-center">
|
||||
<svg v-if="category.id === 'community'" class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<svg v-if="category.id === 'all'" class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2V6zM14 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2V6zM4 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2v-2zM14 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2v-2z" />
|
||||
</svg>
|
||||
<svg v-else-if="category.id === 'community'" class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z" />
|
||||
</svg>
|
||||
<svg v-else-if="category.id === 'commerce'" class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
@@ -323,9 +326,10 @@ const { setCurrentApp } = useMarketplaceApp()
|
||||
const { bottomPosition } = useMobileBackButton()
|
||||
|
||||
// Category state
|
||||
const selectedCategory = ref('community')
|
||||
const selectedCategory = ref('all')
|
||||
|
||||
const categories = [
|
||||
{ id: 'all', name: 'All' },
|
||||
{ id: 'community', name: 'Community' },
|
||||
{ id: 'commerce', name: 'Commerce' },
|
||||
{ id: 'money', name: 'Money' },
|
||||
@@ -358,68 +362,33 @@ const communityApps = ref<any[]>([])
|
||||
const searchQuery = ref('')
|
||||
|
||||
// Available apps in marketplace
|
||||
const availableApps = ref([
|
||||
{
|
||||
id: 'atob',
|
||||
title: 'A to B Bitcoin',
|
||||
version: '0.1.0',
|
||||
icon: '/assets/img/atob.png',
|
||||
category: 'community',
|
||||
description: {
|
||||
short: 'Bitcoin tools and services for seamless transactions',
|
||||
long: 'A to B Bitcoin provides tools and services for Bitcoin transactions. Access the A to B platform through your Archipelago server with full privacy and control.'
|
||||
},
|
||||
s9pkUrl: '/packages/atob.s9pk'
|
||||
},
|
||||
{
|
||||
id: 'k484',
|
||||
title: 'K484',
|
||||
version: '0.1.0',
|
||||
icon: '/assets/img/k484.png',
|
||||
category: 'commerce',
|
||||
description: {
|
||||
short: 'Point of Sale and Admin system for Archipelago',
|
||||
long: 'K484 provides a complete POS and administration system for your Archipelago server. Choose between POS mode for transactions or Admin mode for management.'
|
||||
},
|
||||
s9pkUrl: '/packages/k484.s9pk'
|
||||
},
|
||||
{
|
||||
id: 'btcpay',
|
||||
title: 'BTCPay Server',
|
||||
version: '0.1.0',
|
||||
icon: '/assets/img/btcpay.png',
|
||||
category: 'commerce',
|
||||
description: {
|
||||
short: 'Self-hosted Bitcoin payment processor',
|
||||
long: 'BTCPay Server is a free, open-source cryptocurrency payment processor. Accept Bitcoin payments without intermediaries or fees. Complete merchant solution with invoicing, point of sale, and more.'
|
||||
},
|
||||
s9pkUrl: '/packages/btcpay.s9pk'
|
||||
},
|
||||
{
|
||||
id: 'nextcloud',
|
||||
title: 'Nextcloud',
|
||||
version: '0.1.0',
|
||||
icon: '/assets/img/nextcloud.png',
|
||||
category: 'data',
|
||||
description: {
|
||||
short: 'Self-hosted file sync and collaboration platform',
|
||||
long: 'Nextcloud provides file storage, sync, and sharing with calendar, contacts, mail, and office suite integration. Your own private cloud with complete control over your data.'
|
||||
},
|
||||
s9pkUrl: '/packages/nextcloud.s9pk'
|
||||
},
|
||||
{
|
||||
id: 'home-assistant',
|
||||
title: 'Home Assistant',
|
||||
version: '0.1.0',
|
||||
icon: '/assets/img/home-assistant.png',
|
||||
category: 'home',
|
||||
description: {
|
||||
short: 'Open-source home automation platform',
|
||||
long: 'Home Assistant is a powerful home automation hub that allows you to control and automate your smart home devices privately. No cloud required - everything runs locally on your Archipelago server.'
|
||||
},
|
||||
s9pkUrl: '/packages/home-assistant.s9pk'
|
||||
}
|
||||
])
|
||||
// Note: s9pk packages disabled until sideload functionality is implemented
|
||||
// const availableApps = ref([
|
||||
// {
|
||||
// id: 'atob',
|
||||
// title: 'A to B Bitcoin',
|
||||
// version: '0.1.0',
|
||||
// icon: '/assets/img/atob.png',
|
||||
// category: 'community',
|
||||
// description: {
|
||||
// short: 'Bitcoin tools and services for seamless transactions',
|
||||
// long: 'A to B Bitcoin provides tools and services for Bitcoin transactions. Access the A to B platform through your Archipelago server with full privacy and control.'
|
||||
// },
|
||||
// s9pkUrl: '/packages/atob.s9pk'
|
||||
// },
|
||||
// {
|
||||
// id: 'k484',
|
||||
// title: 'K484',
|
||||
// version: '0.1.0',
|
||||
// icon: '/assets/img/k484.png',
|
||||
// category: 'commerce',
|
||||
// description: {
|
||||
// short: 'Point of Sale and Admin system for Archipelago',
|
||||
// long: 'K484 provides a complete POS and administration system for your Archipelago server. Choose between POS mode for transactions or Admin mode for management.'
|
||||
// },
|
||||
// s9pkUrl: '/packages/k484.s9pk'
|
||||
// },
|
||||
// ])
|
||||
|
||||
const installedPackages = computed(() => {
|
||||
return store.data?.['package-data'] || {}
|
||||
@@ -486,14 +455,8 @@ function categorizeCommunityApp(app: any): string {
|
||||
|
||||
// Combine local and community apps with categories
|
||||
const allApps = computed(() => {
|
||||
// Local apps already have categories - normalize field names
|
||||
const local = availableApps.value.map(app => ({
|
||||
...app,
|
||||
source: 'local',
|
||||
// Add manifestUrl and url for consistency with community apps
|
||||
manifestUrl: app.s9pkUrl,
|
||||
url: app.s9pkUrl
|
||||
}))
|
||||
// Local apps disabled until s9pk support is implemented
|
||||
const local: any[] = []
|
||||
|
||||
// Categorize community apps intelligently
|
||||
const community = communityApps.value.map(app => {
|
||||
@@ -567,14 +530,14 @@ function getCuratedAppList() {
|
||||
return [
|
||||
{
|
||||
id: 'bitcoin',
|
||||
title: 'Bitcoin Core',
|
||||
title: 'Bitcoin Knots',
|
||||
version: '27.0.0',
|
||||
description: 'Run a full Bitcoin node. Validate and relay blocks and transactions on the Bitcoin network.',
|
||||
icon: '/assets/img/app-icons/bitcoin.svg',
|
||||
author: 'Bitcoin Core',
|
||||
dockerImage: 'lncm/bitcoind:v27.0',
|
||||
icon: '/assets/img/app-icons/bitcoin-knots.webp',
|
||||
author: 'Bitcoin Knots',
|
||||
dockerImage: 'docker.io/lncm/bitcoind:v27.0',
|
||||
manifestUrl: null,
|
||||
repoUrl: 'https://github.com/bitcoin/bitcoin'
|
||||
repoUrl: 'https://github.com/bitcoinknots/bitcoin'
|
||||
},
|
||||
{
|
||||
id: 'btcpay-server',
|
||||
@@ -583,7 +546,7 @@ function getCuratedAppList() {
|
||||
description: 'Self-hosted Bitcoin payment processor. Accept Bitcoin payments without intermediaries or fees.',
|
||||
icon: '/assets/img/app-icons/btcpay-server.png',
|
||||
author: 'BTCPay Server Foundation',
|
||||
dockerImage: 'btcpayserver/btcpayserver:1.13.5',
|
||||
dockerImage: 'docker.io/btcpayserver/btcpayserver:1.13.5',
|
||||
manifestUrl: null,
|
||||
repoUrl: 'https://github.com/btcpayserver/btcpayserver'
|
||||
},
|
||||
@@ -592,9 +555,9 @@ function getCuratedAppList() {
|
||||
title: 'LND',
|
||||
version: '0.17.4',
|
||||
description: 'Lightning Network Daemon. Fast and cheap Bitcoin payments through the Lightning Network.',
|
||||
icon: '/assets/img/app-icons/lightning-stack.png',
|
||||
icon: '/assets/img/app-icons/lnd.svg',
|
||||
author: 'Lightning Labs',
|
||||
dockerImage: 'lightninglabs/lnd:v0.17.4-beta',
|
||||
dockerImage: 'docker.io/lightninglabs/lnd:v0.17.4-beta',
|
||||
manifestUrl: null,
|
||||
repoUrl: 'https://github.com/lightningnetwork/lnd'
|
||||
},
|
||||
@@ -603,9 +566,9 @@ function getCuratedAppList() {
|
||||
title: 'Mempool Explorer',
|
||||
version: '2.5.0',
|
||||
description: 'Self-hosted Bitcoin blockchain and mempool visualizer with beautiful explorer interface.',
|
||||
icon: '/assets/img/app-icons/mempool.png',
|
||||
icon: '/assets/img/app-icons/mempool.webp',
|
||||
author: 'Mempool',
|
||||
dockerImage: 'mempool/frontend:v2.5.0',
|
||||
dockerImage: 'docker.io/mempool/frontend:v2.5.0',
|
||||
manifestUrl: null,
|
||||
repoUrl: 'https://github.com/mempool/mempool'
|
||||
},
|
||||
@@ -616,7 +579,7 @@ function getCuratedAppList() {
|
||||
description: 'Open-source home automation platform. Control and automate your smart home devices privately.',
|
||||
icon: '/assets/img/app-icons/homeassistant.png',
|
||||
author: 'Home Assistant',
|
||||
dockerImage: 'homeassistant/home-assistant:2024.1',
|
||||
dockerImage: 'docker.io/homeassistant/home-assistant:2024.1',
|
||||
manifestUrl: null,
|
||||
repoUrl: 'https://github.com/home-assistant/core'
|
||||
},
|
||||
@@ -625,9 +588,9 @@ function getCuratedAppList() {
|
||||
title: 'Grafana',
|
||||
version: '10.2.0',
|
||||
description: 'Analytics and monitoring platform. Create dashboards and visualize data from multiple sources.',
|
||||
icon: '/assets/img/grafana.png',
|
||||
icon: '/assets/img/app-icons/grafana.png',
|
||||
author: 'Grafana Labs',
|
||||
dockerImage: 'grafana/grafana:10.2.0',
|
||||
dockerImage: 'docker.io/grafana/grafana:10.2.0',
|
||||
manifestUrl: null,
|
||||
repoUrl: 'https://github.com/grafana/grafana'
|
||||
},
|
||||
@@ -638,7 +601,7 @@ function getCuratedAppList() {
|
||||
description: 'Privacy-respecting metasearch engine. Search without tracking or ads.',
|
||||
icon: '/assets/img/app-icons/searxng.png',
|
||||
author: 'SearXNG',
|
||||
dockerImage: 'searxng/searxng:latest',
|
||||
dockerImage: 'docker.io/searxng/searxng:latest',
|
||||
manifestUrl: null,
|
||||
repoUrl: 'https://github.com/searxng/searxng'
|
||||
},
|
||||
@@ -647,9 +610,9 @@ function getCuratedAppList() {
|
||||
title: 'Ollama',
|
||||
version: '0.1.0',
|
||||
description: 'Run large language models locally. Download and run AI models like Llama, Mistral on your own hardware.',
|
||||
icon: '/assets/img/ollama.webp',
|
||||
icon: '/assets/img/app-icons/ollama.png',
|
||||
author: 'Ollama',
|
||||
dockerImage: 'ollama/ollama:latest',
|
||||
dockerImage: 'docker.io/ollama/ollama:latest',
|
||||
manifestUrl: null,
|
||||
repoUrl: 'https://github.com/ollama/ollama'
|
||||
},
|
||||
@@ -658,9 +621,9 @@ function getCuratedAppList() {
|
||||
title: 'OnlyOffice',
|
||||
version: '7.5.1',
|
||||
description: 'Office suite for document collaboration. Edit docs, spreadsheets, and presentations.',
|
||||
icon: '/assets/img/onlyoffice.webp',
|
||||
icon: '/assets/img/app-icons/onlyoffice.webp',
|
||||
author: 'Ascensio System SIA',
|
||||
dockerImage: 'onlyoffice/documentserver:7.5.1',
|
||||
dockerImage: 'docker.io/onlyoffice/documentserver:7.5.1',
|
||||
manifestUrl: null,
|
||||
repoUrl: 'https://github.com/ONLYOFFICE/DocumentServer'
|
||||
},
|
||||
@@ -671,7 +634,7 @@ function getCuratedAppList() {
|
||||
description: 'Open-source design and prototyping platform. Self-hosted alternative to Figma.',
|
||||
icon: '/assets/img/penpot.webp',
|
||||
author: 'Penpot',
|
||||
dockerImage: 'penpotapp/frontend:latest',
|
||||
dockerImage: 'docker.io/penpotapp/frontend:latest',
|
||||
manifestUrl: null,
|
||||
repoUrl: 'https://github.com/penpot/penpot'
|
||||
},
|
||||
@@ -680,9 +643,9 @@ function getCuratedAppList() {
|
||||
title: 'Nextcloud',
|
||||
version: '28.0',
|
||||
description: 'Self-hosted cloud storage and collaboration platform. Your own private cloud.',
|
||||
icon: null,
|
||||
icon: '/assets/img/app-icons/nextcloud.webp',
|
||||
author: 'Nextcloud',
|
||||
dockerImage: 'nextcloud:28',
|
||||
dockerImage: 'docker.io/library/nextcloud:28',
|
||||
manifestUrl: null,
|
||||
repoUrl: 'https://github.com/nextcloud/server'
|
||||
},
|
||||
@@ -691,9 +654,9 @@ function getCuratedAppList() {
|
||||
title: 'Vaultwarden',
|
||||
version: '1.30.0',
|
||||
description: 'Self-hosted password manager (Bitwarden-compatible). Secure vault for passwords and secrets.',
|
||||
icon: null,
|
||||
icon: '/assets/img/app-icons/vaultwarden.webp',
|
||||
author: 'Vaultwarden',
|
||||
dockerImage: 'vaultwarden/server:1.30.0-alpine',
|
||||
dockerImage: 'docker.io/vaultwarden/server:1.30.0-alpine',
|
||||
manifestUrl: null,
|
||||
repoUrl: 'https://github.com/dani-garcia/vaultwarden'
|
||||
},
|
||||
@@ -702,9 +665,9 @@ function getCuratedAppList() {
|
||||
title: 'Jellyfin',
|
||||
version: '10.8.0',
|
||||
description: 'Free media server system. Stream your movies, music, and photos to any device.',
|
||||
icon: null,
|
||||
icon: '/assets/img/app-icons/jellyfin.webp',
|
||||
author: 'Jellyfin',
|
||||
dockerImage: 'jellyfin/jellyfin:10.8.13',
|
||||
dockerImage: 'docker.io/jellyfin/jellyfin:10.8.13',
|
||||
manifestUrl: null,
|
||||
repoUrl: 'https://github.com/jellyfin/jellyfin'
|
||||
},
|
||||
@@ -713,9 +676,9 @@ function getCuratedAppList() {
|
||||
title: 'PhotoPrism',
|
||||
version: '231128',
|
||||
description: 'AI-powered photo management. Organize and browse photos with facial recognition.',
|
||||
icon: null,
|
||||
icon: '/assets/img/app-icons/photoprims.svg',
|
||||
author: 'PhotoPrism',
|
||||
dockerImage: 'photoprism/photoprism:latest',
|
||||
dockerImage: 'docker.io/photoprism/photoprism:latest',
|
||||
manifestUrl: null,
|
||||
repoUrl: 'https://github.com/photoprism/photoprism'
|
||||
},
|
||||
@@ -724,7 +687,7 @@ function getCuratedAppList() {
|
||||
title: 'Immich',
|
||||
version: '1.90.0',
|
||||
description: 'High-performance self-hosted photo and video backup. Mobile-first with ML features.',
|
||||
icon: null,
|
||||
icon: '/assets/img/app-icons/immich.png',
|
||||
author: 'Immich',
|
||||
dockerImage: 'ghcr.io/immich-app/immich-server:release',
|
||||
manifestUrl: null,
|
||||
@@ -735,9 +698,9 @@ function getCuratedAppList() {
|
||||
title: 'File Browser',
|
||||
version: '2.27.0',
|
||||
description: 'Web-based file manager. Browse, upload, and manage files through a web interface.',
|
||||
icon: null,
|
||||
icon: '/assets/img/app-icons/file-browser.webp',
|
||||
author: 'File Browser',
|
||||
dockerImage: 'filebrowser/filebrowser:v2.27.0',
|
||||
dockerImage: 'docker.io/filebrowser/filebrowser:v2.27.0',
|
||||
manifestUrl: null,
|
||||
repoUrl: 'https://github.com/filebrowser/filebrowser'
|
||||
},
|
||||
@@ -746,9 +709,9 @@ function getCuratedAppList() {
|
||||
title: 'Nginx Proxy Manager',
|
||||
version: '2.11.0',
|
||||
description: 'Easy proxy management with SSL. Beautiful web interface for managing reverse proxies.',
|
||||
icon: null,
|
||||
icon: '/assets/img/app-icons/nginx.svg',
|
||||
author: 'Nginx Proxy Manager',
|
||||
dockerImage: 'jc21/nginx-proxy-manager:latest',
|
||||
dockerImage: 'docker.io/jc21/nginx-proxy-manager:latest',
|
||||
manifestUrl: null,
|
||||
repoUrl: 'https://github.com/NginxProxyManager/nginx-proxy-manager'
|
||||
},
|
||||
@@ -757,9 +720,9 @@ function getCuratedAppList() {
|
||||
title: 'Portainer',
|
||||
version: '2.19.0',
|
||||
description: 'Container management UI. Manage Docker containers through a beautiful web interface.',
|
||||
icon: null,
|
||||
icon: '/assets/img/app-icons/portainer.webp',
|
||||
author: 'Portainer',
|
||||
dockerImage: 'portainer/portainer-ce:2.19.4',
|
||||
dockerImage: 'docker.io/portainer/portainer-ce:2.19.4',
|
||||
manifestUrl: null,
|
||||
repoUrl: 'https://github.com/portainer/portainer'
|
||||
},
|
||||
@@ -768,12 +731,23 @@ function getCuratedAppList() {
|
||||
title: 'Uptime Kuma',
|
||||
version: '1.23.0',
|
||||
description: 'Self-hosted monitoring tool. Monitor uptime for HTTP(s), TCP, DNS, and more.',
|
||||
icon: null,
|
||||
icon: '/assets/img/app-icons/uptime-kuma.webp',
|
||||
author: 'Uptime Kuma',
|
||||
dockerImage: 'louislam/uptime-kuma:1.23.11',
|
||||
dockerImage: 'docker.io/louislam/uptime-kuma:1.23.11',
|
||||
manifestUrl: null,
|
||||
repoUrl: 'https://github.com/louislam/uptime-kuma'
|
||||
},
|
||||
{
|
||||
id: 'tailscale',
|
||||
title: 'Tailscale',
|
||||
version: '1.78.0',
|
||||
description: 'Zero-config VPN for secure remote access. Connect all your devices with WireGuard mesh network.',
|
||||
icon: '/assets/img/app-icons/tailscale.webp',
|
||||
author: 'Tailscale',
|
||||
dockerImage: 'docker.io/tailscale/tailscale:stable',
|
||||
manifestUrl: null,
|
||||
repoUrl: 'https://github.com/tailscale/tailscale'
|
||||
},
|
||||
{
|
||||
id: 'fedimint',
|
||||
title: 'Fedimint',
|
||||
@@ -781,7 +755,7 @@ function getCuratedAppList() {
|
||||
description: 'Federated Bitcoin mint. Private, scalable Bitcoin through federated guardians.',
|
||||
icon: '/assets/img/icon-fedimint.jpeg',
|
||||
author: 'Fedimint',
|
||||
dockerImage: 'fedimint/fedimintd:v0.3.0',
|
||||
dockerImage: 'docker.io/fedimint/fedimintd:v0.3.0',
|
||||
manifestUrl: null,
|
||||
repoUrl: 'https://github.com/fedimint/fedimint'
|
||||
}
|
||||
@@ -863,7 +837,7 @@ async function installApp(app: any) {
|
||||
}
|
||||
|
||||
async function installCommunityApp(app: any) {
|
||||
if (installing.value || isInstalled(app.id) || !app.manifestUrl) return
|
||||
if (installing.value || isInstalled(app.id) || !app.dockerImage) return
|
||||
|
||||
installing.value = app.id
|
||||
|
||||
@@ -876,7 +850,8 @@ async function installCommunityApp(app: any) {
|
||||
id: app.id,
|
||||
dockerImage: app.dockerImage,
|
||||
version: app.version
|
||||
}
|
||||
},
|
||||
timeout: 180000 // 3 minutes for large images like Nextcloud
|
||||
})
|
||||
|
||||
// Wait for installation to complete (poll for package to appear)
|
||||
@@ -948,11 +923,6 @@ function handleImageError(event: Event) {
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.marketplace-container {
|
||||
max-width: 1400px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.line-clamp-3 {
|
||||
display: -webkit-box;
|
||||
-webkit-line-clamp: 3;
|
||||
|
||||
@@ -20,18 +20,68 @@ export default defineConfig({
|
||||
orientation: 'any',
|
||||
scope: '/',
|
||||
start_url: '/',
|
||||
categories: ['productivity', 'utilities'],
|
||||
prefer_related_applications: false,
|
||||
icons: [
|
||||
{
|
||||
src: '/assets/img/favico.png',
|
||||
sizes: '72x72',
|
||||
type: 'image/png',
|
||||
purpose: 'any'
|
||||
},
|
||||
{
|
||||
src: '/assets/img/favico.png',
|
||||
sizes: '96x96',
|
||||
type: 'image/png',
|
||||
purpose: 'any'
|
||||
},
|
||||
{
|
||||
src: '/assets/img/favico.png',
|
||||
sizes: '128x128',
|
||||
type: 'image/png',
|
||||
purpose: 'any'
|
||||
},
|
||||
{
|
||||
src: '/assets/img/favico.png',
|
||||
sizes: '144x144',
|
||||
type: 'image/png',
|
||||
purpose: 'any'
|
||||
},
|
||||
{
|
||||
src: '/assets/img/favico.png',
|
||||
sizes: '152x152',
|
||||
type: 'image/png',
|
||||
purpose: 'any'
|
||||
},
|
||||
{
|
||||
src: '/assets/img/favico.png',
|
||||
sizes: '192x192',
|
||||
type: 'image/png',
|
||||
purpose: 'any maskable'
|
||||
purpose: 'any'
|
||||
},
|
||||
{
|
||||
src: '/assets/img/favico.png',
|
||||
sizes: '384x384',
|
||||
type: 'image/png',
|
||||
purpose: 'any'
|
||||
},
|
||||
{
|
||||
src: '/assets/img/favico.png',
|
||||
sizes: '512x512',
|
||||
type: 'image/png',
|
||||
purpose: 'any maskable'
|
||||
purpose: 'any'
|
||||
},
|
||||
{
|
||||
src: '/assets/img/favico.png',
|
||||
sizes: '192x192',
|
||||
type: 'image/png',
|
||||
purpose: 'maskable'
|
||||
},
|
||||
{
|
||||
src: '/assets/img/favico.png',
|
||||
sizes: '512x512',
|
||||
type: 'image/png',
|
||||
purpose: 'maskable'
|
||||
}
|
||||
],
|
||||
shortcuts: [
|
||||
@@ -41,6 +91,20 @@ export default defineConfig({
|
||||
description: 'Open the dashboard',
|
||||
url: '/dashboard',
|
||||
icons: [{ src: '/assets/img/favico.png', sizes: '192x192' }]
|
||||
},
|
||||
{
|
||||
name: 'My Apps',
|
||||
short_name: 'Apps',
|
||||
description: 'Manage your apps',
|
||||
url: '/apps',
|
||||
icons: [{ src: '/assets/img/favico.png', sizes: '192x192' }]
|
||||
},
|
||||
{
|
||||
name: 'App Store',
|
||||
short_name: 'Store',
|
||||
description: 'Browse and install apps',
|
||||
url: '/marketplace',
|
||||
icons: [{ src: '/assets/img/favico.png', sizes: '192x192' }]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||