diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index de20bf9..2b3973d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,38 +1,21 @@ -image: alpine - -variables: - DOCKER_HOST: tcp://docker:2375 - DOCKER_TLS_CERTDIR: "" - DOCKER_AUTH_CONFIG: ${_DOCKER_AUTH_CONFIG} - -default: - tags: - - oci-fixed-amd +image: docker +services: + - docker:dind stages: - - update + - upload -update_list_json: - stage: update - rules: - - if: '$CI_COMMIT_REF_NAME =~ /^release\//' - when: on_success +before_script: + - export SANITIZED_BRANCH="$(echo $CI_COMMIT_REF_NAME | sed -r 's#^release/##' | sed 's/\//_/g')" + +push_to_s3: + stage: upload script: - - apk add curl git - - | - if curl -fsSL https://registry.kasmweb.com/1.1/list.json -o list.json.tmp; then - mv list.json.tmp list.json - git config user.email "ci@gitlab" - git config user.name "GitLab CI" - git remote set-url origin "https://gitlab-ci-token:${CI_JOB_TOKEN}@${CI_SERVER_HOST}/${CI_PROJECT_PATH}.git" - git add list.json - if ! git diff --cached --quiet; then - git commit -m "chore: update list.json from registry [skip ci]" - git push origin HEAD:${CI_COMMIT_REF_NAME} - else - echo "list.json unchanged, nothing to commit" - fi - else - echo "Failed to fetch list.json, skipping update" - rm -f list.json.tmp - fi + - apk add aws-cli curl gzip tar + - export S3_URL="https://${S3_BUCKET}.s3.amazonaws.com/wizard/${CI_COMMIT_SHA}.tar.gz" + - tar -czf ${CI_COMMIT_SHA}.tar.gz * + - aws s3 cp ${CI_COMMIT_SHA}.tar.gz s3://${S3_BUCKET}/wizard/ + - aws s3 cp ${CI_COMMIT_SHA}.tar.gz s3://${S3_BUCKET}/wizard/${SANITIZED_BRANCH}.tar.gz + - curl --request POST --header "PRIVATE-TOKEN:${GITLAB_API_TOKEN}" "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/statuses/${CI_COMMIT_SHA}?state=success&name=build-url&target_url=${S3_URL}" + tags: + - aws-autoscale diff --git a/README.md b/README.md index bcf5376..9d307b2 100644 --- a/README.md +++ b/README.md @@ -36,8 +36,3 @@ As configured files ingested from a current Kasm Workspaces installer are needed /kasm_release/ └── Full Kasm workspaces installer ``` - - -## Reporting Issues - -To report any issues for this repository, please use our central issue tracker: **[Kasm Workspaces Issue Tracker](https://github.com/kasmtech/workspaces-issues/issues)** diff --git a/index.js b/index.js index 19f84c2..aac25ec 100644 --- a/index.js +++ b/index.js @@ -1,176 +1,60 @@ // Imports -const Docker = require('dockerode'); -const socketIO = require('socket.io'); -const pty = require("node-pty"); -const fsw = require('fs').promises; -const fs = require('fs'); -const os = require('os'); -const yaml = require('js-yaml'); -const _ = require('lodash'); -const si = require('systeminformation'); -const express = require('express'); -const app = require('express')(); -const privateKey = fs.readFileSync('/opt/kasm/certs/kasm_wizard.key', 'utf8'); -const certificate = fs.readFileSync('/opt/kasm/certs/kasm_wizard.crt', 'utf8'); -const credentials = {key: privateKey, cert: certificate}; -const https = require('https').Server(credentials, app); -const baserouter = express.Router(); -const docker = new Docker({socketPath: '/var/run/docker.sock'}); -const arch = os.arch().replace('x64', 'amd64'); -const baseUrl = process.env.SUBFOLDER || '/'; -const port = process.env.KASM_PORT || '443'; +var Docker = require('dockerode'); +var socketIO = require('socket.io'); +var pty = require("node-pty"); +var fsw = require('fs').promises; +var fs = require('fs'); +var os = require('os'); +var yaml = require('js-yaml'); +var _ = require('lodash'); +var si = require('systeminformation'); +var express = require('express'); +var app = require('express')(); +var privateKey = fs.readFileSync('/opt/kasm/certs/kasm_wizard.key', 'utf8'); +var certificate = fs.readFileSync('/opt/kasm/certs/kasm_wizard.crt', 'utf8'); +var credentials = {key: privateKey, cert: certificate}; +var https = require('https').Server(credentials, app); +var baserouter = express.Router(); +var docker = new Docker({socketPath: '/var/run/docker.sock'}); +var arch = os.arch().replace('x64', 'amd64'); +var baseUrl = process.env.SUBFOLDER || '/'; +var version = process.env.VERSION || 'stable'; +var port = process.env.KASM_PORT || '443'; const { spawn } = require('node:child_process'); -let EULA; -let images; -let currentVersion; -let sourceLocal = false; -let gpuInfo; -let installSettings = {}; -let upgradeSettings = {}; - -// Find the best matching compatibility entry for the current version. -// Exact version match takes precedence over wildcard (e.g. "1.18.x"). -function matchVersion(currentVer, compatibilityList) { - if (!compatibilityList || compatibilityList.length === 0) return null; - const parts = currentVer.split('.'); - const major = parts[0]; - const minor = parts[1] !== undefined ? parts[1] : '0'; - - // Exact match (most precise) - let match = compatibilityList.find(c => c.version === currentVer); - if (match) return match; - - // Major.minor wildcard, e.g. "1.18.x" - match = compatibilityList.find(c => c.version === `${major}.${minor}.x`); - if (match) return match; - - return null; -} - -// Build the image tag for a given compat entry. -// Returns e.g. "1.18.1-rolling-weekly", falling back to "develop". -function buildImageTag(compat) { - const compatTag = compat.image.split(':')[1] || ''; - const versionPrefix = compatTag.replace(/-[^-]+-[^-]+$/, ''); // strip last two dash-segments - const candidate = versionPrefix + '-rolling-weekly'; - return (compat.available_tags && compat.available_tags.includes(candidate)) ? candidate : 'develop'; -} - -// Fetch the registry workspace list, with local fallback. -async function fetchListData() { - try { - const response = await fetch('https://registry.kasmweb.com/1.1/list.json'); - if (!response.ok) throw new Error(`HTTP ${response.status}`); - return await response.json(); - } catch (err) { - console.error('Failed to fetch workspace list, falling back to local list.json:', err.message); - sourceLocal = true; - return JSON.parse(await fsw.readFile('/wizard/list.json', 'utf8')); - } -} - -// Return the rolling-weekly tag string for the current version by finding -// the first compatible workspace in the registry (e.g. "1.18.1-rolling-weekly"). -async function getRollingWeeklyTag(currentVer, archName) { - const listData = await fetchListData(); - const ws = (listData.workspaces || []).find( - w => w.architecture && w.architecture.includes(archName) && matchVersion(currentVer, w.compatibility || []) - ); - if (!ws) return currentVer + '-rolling-weekly'; - return buildImageTag(matchVersion(currentVer, ws.compatibility)); -} - -// Fetch workspace list from registry and convert to the images YAML structure. -// Falls back to local list.json if the remote is unavailable. -async function fetchWorkspaceList(currentVer, archName) { - const listData = await fetchListData(); - - const filtered = (listData.workspaces || []).filter( - ws => ws.architecture && ws.architecture.includes(archName) - ); - - let imageIdx = 1; - const imagesList = []; - for (const ws of filtered) { - const compat = matchVersion(currentVer, ws.compatibility || []); - if (!compat) continue; - - const imageBase = compat.image.split(':')[0]; - const imageTag = buildImageTag(compat); - const imageName = imageBase + ':' + imageTag; - - imagesList.push({ - categories: ws.categories, - cores: 2.0, - cpu_allocation_method: 'Inherit', - description: ws.description, - docker_registry: ws.docker_registry, - enabled: true, - exec_config: {}, - friendly_name: ws.friendly_name, - gpu_count: 0, - hidden: false, - image_id: '${uuid:image_id:' + imageIdx + '}', - image_src: 'https://registry.kasmweb.com/1.1/icons/' + ws.image_src, - image_type: 'Container', - launch_config: {}, - memory: 2768000000, - name: imageName, - notes: ws.notes || null, - run_config: {}, - uncompressed_size_mb: compat.uncompressed_size_mb, - zone_id: null - }); - imageIdx++; - } - - let alembicVersion = 'e3900d8a4fee'; - try { - const propsText = await fsw.readFile('/kasm_release/conf/database/seed_data/default_properties.yaml', 'utf8'); - const props = yaml.load(propsText); - if (props && props.alembic_version) alembicVersion = props.alembic_version; - } catch (err) { - console.error('Could not read default_properties.yaml, using hardcoded alembic_version:', err.message); - } - - return { alembic_version: alembicVersion, images: imagesList }; -} - +var EULA; +var images; +var currentVersion; +var gpuInfo; +var installSettings = {}; +var upgradeSettings = {}; // Grab installer variables async function installerBlobs() { EULA = await fsw.readFile('/kasm_release/licenses/LICENSE.txt', 'utf8'); - try { - currentVersion = fs.readFileSync('/version.txt', 'utf8').replace(/(\r\n|\n|\r)/gm,''); - } catch (err) { - currentVersion = '1.18.1'; - } - images = await fetchWorkspaceList(currentVersion, arch); - gpuInfo = {}; - await new Promise((resolve) => { - let gpuData = []; - let gpuCmd = spawn('/gpuinfo.sh'); - gpuCmd.stdout.on('data', function(data) { - gpuData.push(data); - }); - gpuCmd.on('close', function(code) { - try { - if (code == 0) { - gpuInfo = JSON.parse(gpuData.join('')); - } else { - gpuInfo = {}; - } - } catch (err) { - // Manually backfill GPU info if available + let imagesText = await fsw.readFile('/wizard/default_images_' + arch + '.yaml', 'utf8'); + images = yaml.load(imagesText); + currentVersion = fs.readFileSync('/version.txt', 'utf8').replace(/(\r\n|\n|\r)/gm,''); + let gpuData = []; + let gpuCmd = spawn('/gpuinfo.sh'); + gpuCmd.stdout.on('data', function(data) { + gpuData.push(data); + }); + gpuCmd.on('close', function(code) { + try { + if (code == 0) { + gpuInfo = JSON.parse(gpuData.join('')); + } else { gpuInfo = {}; - for (let i = 0; i < 10; i++) { - let num = i.toString(); - if (fs.existsSync('/dev/dri/card' + num)) { - gpuInfo['/dev/dri/card' + num] = "Unknown GPU"; - } + } + } catch (err) { + // Manually backfill GPU info if available + gpuInfo = {}; + for (let i = 0; i < 10; i++) { + let num = i.toString(); + if (fs.existsSync('/dev/dri/card' + num)) { + gpuInfo['/dev/dri/card' + num] = "Unknown GPU"; } } - resolve(); - }); + } }); } installerBlobs(); @@ -180,59 +64,28 @@ async function setGpu(imagesI) { if (upgradeSettings['forceGpu'] !== undefined) { installSettings = upgradeSettings; } - const forceGpu = installSettings.forceGpu; - if (!forceGpu || forceGpu === 'disabled' || !forceGpu.includes('|')) { - console.error('setGpu: invalid or missing forceGpu value:', forceGpu); - return imagesI; - } - const [gpu, gpuName] = forceGpu.split('|'); - if (!gpu || !gpuName) { - console.error('setGpu: could not parse GPU path or name from forceGpu:', forceGpu); - return imagesI; - } - const card = gpu.slice(-1); - const render = (Number(card) + 128).toString(); + let gpu = installSettings.forceGpu.split('|')[0]; + let gpuName = installSettings.forceGpu.split('|')[1]; + let card = gpu.slice(-1); + let render = (Number(card) + 128).toString(); // Handle NVIDIA Gpus - let baseRun; - if (gpuName.includes('NVIDIA')) { + var baseRun; + if (gpuName.indexOf('NVIDIA') !== -1) { baseRun = JSON.parse('{"runtime":"nvidia","environment":{"NVIDIA_DRIVER_CAPABILITIES":"all","KASM_EGL_CARD":"/dev/dri/card' + card + '","KASM_RENDERD":"/dev/dri/renderD' + render + '"},"device_requests":[{"driver": "","count": -1,"device_ids": null,"capabilities":[["gpu"]],"options":{}}]}'); } else { baseRun = JSON.parse('{"environment":{"DRINODE":"/dev/dri/renderD' + render + '", "HW3D": true},"devices":["/dev/dri/card' + card + ':/dev/dri/card' + card + ':rwm","/dev/dri/renderD' + render + ':/dev/dri/renderD' + render + ':rwm"]}'); } let baseExec = JSON.parse('{"first_launch":{"user":"root","cmd": "bash -c \'chown -R kasm-user:kasm-user /dev/dri/*\'"}}'); - for (let i=0; i f.endsWith('.yaml'))) { - const filePath = confDir + '/' + file; - const content = await fsw.readFile(filePath, 'utf8'); - const updated = content.split('\n').map(line => { - if (/ image:/.test(line) && /"$/.test(line) && !/-rolling"$/.test(line) && !/develop"$/.test(line)) { - return line.replace(/"$/, '-rolling"'); - } - return line; - }).join('\n'); - await fsw.writeFile(filePath, updated); - } -} - //// Http server //// baserouter.use('/public', express.static(__dirname + '/public')); baserouter.get("/", function (req, res) { @@ -245,20 +98,20 @@ app.use(baseUrl, baserouter); https.listen(3000); //// socketIO comms //// -const io = socketIO(https, {path: baseUrl + 'socket.io'}); +io = socketIO(https, {path: baseUrl + 'socket.io'}); io.on('connection', async function (socket) { // Run bash install with our custom flags async function install(data) { // Determine install settings installSettings = data[0]; - let imagesI = data[1]; - let installFlags = ['/kasm_release/install.sh', '-W', '-B' ,'-H', '-e', '-L', port, '-P', installSettings.adminPass, '-U', installSettings.userPass]; - if (imagesI && typeof imagesI === 'object' && Array.isArray(imagesI.images) && imagesI.images.length < 10) { + var imagesI = data[1]; + installFlags = ['/kasm_release/install.sh', '-W', '-B' ,'-H', '-e', '-L', port, '-P', installSettings.adminPass, '-U', installSettings.userPass]; + if ((imagesI.hasOwnProperty('images')) && (imagesI.images.length < 10)) { installFlags.push('-b'); } // GPU yaml merge - if (installSettings.forceGpu !== 'disabled' && imagesI && imagesI.images) { + if (installSettings.forceGpu !== 'disabled') { imagesI = await setGpu(imagesI); } @@ -268,7 +121,6 @@ io.on('connection', async function (socket) { installFlags = installFlags.filter(function(e) { return e !== '-W' }); } else { await fsw.writeFile('/kasm_release/conf/database/seed_data/default_images_' + arch + '.yaml', yamlStr); - await appendRollingToServiceImages(); } // Copy over version @@ -288,21 +140,41 @@ io.on('connection', async function (socket) { // Run bash upgrade with our custom flags async function upgrade(data) { - let upgradeFlags = ['/kasm_release/upgrade.sh', '-L', port]; + // Determine upgrade settings + upgradeSettings = data[0]; + var imagesI = data[1]; + upgradeFlags = ['/kasm_release/upgrade.sh', '-L', port]; + if (upgradeSettings.keepOldImages == true) { + upgradeFlags.push('-K'); + } else { + upgradeFlags.push('-U'); + } - // Patch service image tags for rolling builds - await appendRollingToServiceImages(); + // GPU yaml merge + if (upgradeSettings.forceGpu !== 'disabled') { + imagesI = await setGpu(imagesI); + } + + // Write finalized image data + let yamlStr = yaml.dump(imagesI); + if (yamlStr.startsWith("false")) { + upgradeFlags = upgradeFlags.filter(function(e) { return e !== '-K' }); + upgradeFlags = upgradeFlags.filter(function(e) { return e !== '-U' }); + } else { + await fsw.writeFile('/kasm_release/conf/database/seed_data/default_images_' + arch + '.yaml', yamlStr); + } + + // Copy over version + await fsw.copyFile('/version.txt', '/opt/version.txt'); // Run upgrade let cmd = pty.spawn('/bin/bash', upgradeFlags); cmd.on('data', function(data) { socket.emit('term', data); }); - cmd.on('exit', async function(code, signal) { + cmd.on('exit', function(code, signal) { if (code == 0) { - await fsw.copyFile('/version.txt', '/opt/version.txt'); - const rollingTag = await getRollingWeeklyTag(currentVersion, arch); - socket.emit('done', {port, rollingTag}); + socket.emit('done', port); } }); } @@ -320,7 +192,6 @@ io.on('connection', async function (socket) { dashinfo['localVersion'] = 'Unknown'; } dashinfo['currentVersion'] = currentVersion; - dashinfo['sourceLocal'] = sourceLocal; dashinfo['gpuInfo'] = gpuInfo; dashinfo['containers'] = containers; dashinfo['cpu'] = await si.cpu(); @@ -330,7 +201,7 @@ io.on('connection', async function (socket) { socket.emit('renderdash', [dashinfo, images]); // Render installer } else { - socket.emit('renderinstall', [EULA, images, gpuInfo, currentVersion, sourceLocal]); + socket.emit('renderinstall', [EULA, images, gpuInfo]); } } // Disable wizard diff --git a/list.json b/list.json deleted file mode 100644 index e7eaa86..0000000 --- a/list.json +++ /dev/null @@ -1 +0,0 @@ -{"name":"Kasm Technologies","workspacecount":79,"icon":"/img/favicon.png","description":"The official store for Kasm supported workspaces.","list_url":"https://registry.kasmweb.com/","contact_url":"https://github.com/kasmtech/workspaces-issues/issues","modified":1773134853022,"workspaces":[{"description":"AlmaLinux is a free and open source Linux distribution, created originally by CloudLinux to provide a community-supported, production-grade enterprise operating system that is binary-compatible with Red Hat Enterprise Linux.","docker_registry":"https://index.docker.io/v1/","image_src":"almalinux.svg","categories":["Desktop","Productivity","Development"],"friendly_name":"AlmaLinux 8","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/almalinux-8-desktop:1.16.1-rolling-daily","uncompressed_size_mb":6528,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/almalinux-8-desktop:1.17.0-rolling-daily","uncompressed_size_mb":9700,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/almalinux-8-desktop:1.18.0-rolling-daily","uncompressed_size_mb":9700,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/almalinux-8-desktop:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"5567e00a04bed727267f8933804fe108780ce7f7"},{"description":"AlmaLinux is a free and open source Linux distribution, created originally by CloudLinux to provide a community-supported, production-grade enterprise operating system that is binary-compatible with Red Hat Enterprise Linux.","docker_registry":"https://index.docker.io/v1/","image_src":"almalinux.svg","categories":["Desktop","Productivity","Development"],"notes":"The Kasm AlmaLinux 9 Workspace requires libseccomp => 2.5.3 to run.\n\nThis can be checked by running runc --version\n\nIf you still want to run AlmaLinux 9 but do not have the minimum required libseccomp version, it can be run in an unsecure manner by adding: {\"security_opt\":[\"seccomp=unconfined\"]} to the Docker Run Config Override (JSON) setting above.\n\nNOTE: This will run the Workspace without the docker seccomp sandbox and will significantly reduce the amount of protection that Kasm Workspaces can provide.\n","friendly_name":"AlmaLinux 9","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/almalinux-9-desktop:1.16.1-rolling-daily","uncompressed_size_mb":5399,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/almalinux-9-desktop:1.17.0-rolling-daily","uncompressed_size_mb":8349,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/almalinux-9-desktop:1.18.0-rolling-daily","uncompressed_size_mb":8349,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/almalinux-9-desktop:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"14f75816aa25f402daef61396b7539cc5f103408"},{"description":"Alpine Linux is a Linux distribution designed to be small, simple and secure.","docker_registry":"https://index.docker.io/v1/","image_src":"alpine.svg","categories":["Desktop","Productivity","Development"],"notes":"The Kasm Alpine 3.19 Workspace requires libseccomp => 2.5.3 to run.\n\nThis can be checked by running runc --version\n\nIf you still want to run Alpine 3.19 but do not have the minimum required libseccomp version, it can be run in an unsecure manner by adding: {\"security_opt\":[\"seccomp=unconfined\"]} to the Docker Run Config Override (JSON) setting above.\n\nNOTE: This will run the Workspace without the docker seccomp sandbox and will significantly reduce the amount of protection that Kasm Workspaces can provide.\n","friendly_name":"Alpine 3.19","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/alpine-319-desktop:1.16.1-rolling-daily","uncompressed_size_mb":4680,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/alpine-319-desktop:1.17.0-rolling-daily","uncompressed_size_mb":5142,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/alpine-319-desktop:1.18.0-rolling-daily","uncompressed_size_mb":5142,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/alpine-319-desktop:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"6952323c974e51b5409a05ba3b4fbc17ba9198ab"},{"description":"Alpine Linux is a Linux distribution designed to be small, simple and secure.","docker_registry":"https://index.docker.io/v1/","image_src":"alpine.svg","categories":["Desktop","Productivity","Development"],"notes":"The Kasm Alpine 3.20 Workspace requires libseccomp => 2.5.3 to run.\n\nThis can be checked by running runc --version\n\nIf you still want to run Alpine 3.20 but do not have the minimum required libseccomp version, it can be run in an unsecure manner by adding: {\"security_opt\":[\"seccomp=unconfined\"]} to the Docker Run Config Override (JSON) setting above.\n\nNOTE: This will run the Workspace without the docker seccomp sandbox and will significantly reduce the amount of protection that Kasm Workspaces can provide.\n","friendly_name":"Alpine 3.20","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/alpine-320-desktop:1.16.1-rolling-daily","uncompressed_size_mb":4590,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/alpine-320-desktop:1.17.0-rolling-daily","uncompressed_size_mb":5024,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/alpine-320-desktop:1.18.0-rolling-daily","uncompressed_size_mb":5024,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/alpine-320-desktop:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"986792840000e00c4e3ee030939ca40becf1f13c"},{"description":"Alpine Linux is a Linux distribution designed to be small, simple and secure.","docker_registry":"https://index.docker.io/v1/","image_src":"alpine.svg","categories":["Desktop","Productivity","Development"],"notes":"The Kasm Alpine 3.21 Workspace requires libseccomp => 2.5.3 to run.\n\nThis can be checked by running runc --version\n\nIf you still want to run Alpine 3.21 but do not have the minimum required libseccomp version, it can be run in an unsecure manner by adding: {\"security_opt\":[\"seccomp=unconfined\"]} to the Docker Run Config Override (JSON) setting above.\n\nNOTE: This will run the Workspace without the docker seccomp sandbox and will significantly reduce the amount of protection that Kasm Workspaces can provide.\n","friendly_name":"Alpine 3.21","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/alpine-321-desktop:1.16.1-rolling-daily","uncompressed_size_mb":5230,"available_tags":["develop","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/alpine-321-desktop:1.17.0-rolling-daily","uncompressed_size_mb":5219,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/alpine-321-desktop:1.18.0-rolling-daily","uncompressed_size_mb":5219,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/alpine-321-desktop:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"c42ae95f1a7e95d74a523f504acba69695eb5b76"},{"description":"An easy-to-use, multi-track audio editor and recorder.","docker_registry":"https://index.docker.io/v1/","image_src":"audacity.png","categories":["Multimedia"],"friendly_name":"Audacity","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/audacity:1.16.1-rolling-daily","uncompressed_size_mb":2425,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/audacity:1.17.0-rolling-daily","uncompressed_size_mb":2655,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/audacity:1.18.0-rolling-daily","uncompressed_size_mb":2655,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/audacity:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"e5ebca83c0ec2ed665c1b83e71a7c35c26d2d7b1"},{"description":"Blender is the Free and Open Source 3D creation suite. It supports the entirety of the 3D pipeline modeling, sculpting, rigging, 3D and 2D animation, simulation, rendering, compositing, motion tracking and video editing.","docker_registry":"https://kcr.kasmweb.com/v1/","image_src":"blender.png","categories":["Multimedia","Development"],"friendly_name":"Blender","architecture":["amd64"],"compatibility":[{"version":"1.16.x","image":"kcr.kasmweb.com/kasmweb/blender:1.16.1-rolling-daily","uncompressed_size_mb":4030,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kcr.kasmweb.com/kasmweb/blender:1.17.0-rolling-daily","uncompressed_size_mb":3935,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/blender:1.18.0-rolling-daily","uncompressed_size_mb":3935,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/blender:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"aa6c5d185129ba863a488d2e809afc9ea79c881f"},{"description":"The Brave browser is a fast, private and secure web browser.","docker_registry":"https://index.docker.io/v1/","image_src":"brave.png","run_config":{"hostname":"kasm"},"exec_config":{"go":{"cmd":"bash -c '/dockerstartup/custom_startup.sh --go --url \"$KASM_URL\"'"},"assign":{"cmd":"bash -c '/dockerstartup/custom_startup.sh --assign --url \"$KASM_URL\"'"}},"categories":["Browser"],"friendly_name":"Brave","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/brave:1.16.1-rolling-daily","uncompressed_size_mb":2736,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/brave:1.17.0-rolling-daily","uncompressed_size_mb":2955,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/brave:1.18.0-rolling-daily","uncompressed_size_mb":2955,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/brave:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"97663b1b078549e5ddc2bff2a5bf6d31fd3b6f01"},{"description":"Google Chrome is a cross-platform web browser developed by Google.","docker_registry":"https://index.docker.io/v1/","image_src":"chrome.png","run_config":{"hostname":"kasm"},"exec_config":{"go":{"cmd":"bash -c '/dockerstartup/custom_startup.sh --go --url \"$KASM_URL\"'"},"assign":{"cmd":"bash -c '/dockerstartup/custom_startup.sh --assign --url \"$KASM_URL\"'"}},"categories":["Browser"],"friendly_name":"Chrome","architecture":["amd64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/chrome:1.16.1-rolling-daily","uncompressed_size_mb":3096,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/chrome:1.17.0-rolling-daily","uncompressed_size_mb":2934,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/chrome:1.18.0-rolling-daily","uncompressed_size_mb":2934,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/chrome:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"4f01343d87cd173bc32a69941730639a33c01e28"},{"description":"Chromium is a free and open-source browser, primarily developed and maintained by Google.","docker_registry":"https://index.docker.io/v1/","image_src":"chromium.png","run_config":{"hostname":"kasm"},"exec_config":{"go":{"cmd":"bash -c '/dockerstartup/custom_startup.sh --go --url \"$KASM_URL\"'"},"assign":{"cmd":"bash -c '/dockerstartup/custom_startup.sh --assign --url \"$KASM_URL\"'"}},"categories":["Browser"],"friendly_name":"Chromium","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/chromium:1.16.1-rolling-daily","uncompressed_size_mb":2643,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/chromium:1.17.0-rolling-daily","uncompressed_size_mb":2856,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/chromium:1.18.0-rolling-daily","uncompressed_size_mb":2856,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/chromium:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"bcb5fa9681ae8e6450050dea7948e38ef870a03e"},{"description":"The CUDA Toolkit includes GPU-accelerated libraries, a compiler, development tools and the CUDA runtime on Ubuntu Jammy.","docker_registry":"https://index.docker.io/v1/","image_src":"nvidia.png","categories":["Desktop","Development"],"friendly_name":"CUDA Development Toolkit (Ubuntu Jammy)","architecture":["amd64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/core-cuda-jammy:develop","uncompressed_size_mb":11700,"available_tags":["develop","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/core-cuda-jammy:1.17.0-rolling-daily","uncompressed_size_mb":11700,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/core-cuda-jammy:1.18.0-rolling-daily","uncompressed_size_mb":11700,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/core-cuda-jammy:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"c1cff697df7f559537c40793a28adc3113637c3c"},{"description":"The CUDA Toolkit includes GPU-accelerated libraries, a compiler, development tools and the CUDA runtime on Ubuntu Focal.","docker_registry":"https://index.docker.io/v1/","image_src":"nvidia.png","categories":["Desktop","Development"],"friendly_name":"CUDA Development Toolkit","architecture":["amd64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/core-cuda-focal:1.16.1-rolling-daily","uncompressed_size_mb":11088,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]}],"sha":"55ca612c13cc093a308e1479ddfd67002eef00d1"},{"description":"Cyberbro is a cybersecurity analysis tool that extracts your IoCs from garbage input and checks their reputation using multiple CTI services.","docker_registry":"https://index.docker.io/v1/","image_src":"cyberbro.png","categories":["Security"],"friendly_name":"Cyberbro","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/cyberbro:develop","uncompressed_size_mb":4280,"available_tags":["develop","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/cyberbro:1.17.0-rolling-daily","uncompressed_size_mb":4280,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/cyberbro:1.18.0-rolling-daily","uncompressed_size_mb":4280,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/cyberbro:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"cc568563fc5f481715fa27f15a125551f3d966ab"},{"description":"Debian is a Linux distribution composed of free and open-source software, developed by the community-supported Debian Project","docker_registry":"https://index.docker.io/v1/","image_src":"debian.svg","categories":["Desktop","Productivity","Development"],"notes":"The Kasm Debian Bookworm Workspace requires libseccomp => 2.5.3 to run.\n\nThis can be checked by running runc --version\n\nIf you still want to run Debian Bookworm but do not have the minimum required libseccomp version, it can be run in an unsecure manner by adding: {\"security_opt\":[\"seccomp=unconfined\"]} to the Docker Run Config Override (JSON) setting above.\n\nNOTE: This will run the Workspace without the docker seccomp sandbox and will significantly reduce the amount of protection that Kasm Workspaces can provide.\n","friendly_name":"Debian Bookworm","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/debian-bookworm-desktop:1.16.1-rolling-daily","uncompressed_size_mb":5187,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/debian-bookworm-desktop:1.17.0-rolling-daily","uncompressed_size_mb":8328,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/debian-bookworm-desktop:1.18.0-rolling-daily","uncompressed_size_mb":8328,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/debian-bookworm-desktop:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"582f6859e5fc5379ba80913b350ab296789140c3"},{"description":"Debian is a Linux distribution composed of free and open-source software, developed by the community-supported Debian Project","docker_registry":"https://index.docker.io/v1/","image_src":"debian.svg","categories":["Desktop","Productivity","Development"],"friendly_name":"Debian Bullseye","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/debian-bullseye-desktop:1.16.1-rolling-daily","uncompressed_size_mb":4212,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/debian-bullseye-desktop:1.17.0-rolling-daily","uncompressed_size_mb":7755,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/debian-bullseye-desktop:1.18.0-rolling-daily","uncompressed_size_mb":7755,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/debian-bullseye-desktop:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"ff56e0e3aaa64b16cddd0db55b160a655e768f19"},{"description":"Debian is a Linux distribution composed of free and open-source software, developed by the community-supported Debian Project","docker_registry":"https://index.docker.io/v1/","image_src":"debian.svg","categories":["Desktop","Productivity","Development"],"notes":"The Kasm Debian Trixie Workspace requires libseccomp => 2.5.3 to run.\n\nThis can be checked by running runc --version\n\nIf you still want to run Debian Trixie but do not have the minimum required libseccomp version, it can be run in an unsecure manner by adding: {\"security_opt\":[\"seccomp=unconfined\"]} to the Docker Run Config Override (JSON) setting above.\n\nNOTE: This will run the Workspace without the docker seccomp sandbox and will significantly reduce the amount of protection that Kasm Workspaces can provide.\n","friendly_name":"Debian Trixie","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/debian-trixie-desktop:develop","uncompressed_size_mb":8878,"available_tags":["develop","1.18.0-rolling-weekly"]},{"version":"1.18.x","image":"kasmweb/debian-trixie-desktop:1.18.0-rolling-daily","uncompressed_size_mb":8878,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/debian-trixie-desktop:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"545a1b8a60a7382e41c8986133ac71e74a39a0ef"},{"description":"A lightweight, Free Software, cross-platform BitTorrent client.","docker_registry":"https://index.docker.io/v1/","image_src":"deluge.png","categories":["Productivity"],"friendly_name":"Deluge","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/deluge:1.16.1-rolling-daily","uncompressed_size_mb":2445,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/deluge:1.17.0-rolling-daily","uncompressed_size_mb":2671,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/deluge:1.18.0-rolling-daily","uncompressed_size_mb":2671,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/deluge:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"53d327989029690e5ff788b1f5ff12f4e5c0a5a6"},{"description":"Discord is the easiest way to talk over voice, video, and text. Talk, chat, hang out, and stay close with your friends and communities.","docker_registry":"https://index.docker.io/v1/","image_src":"discord.png","categories":["Communication","Games"],"friendly_name":"Discord","architecture":["amd64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/discord:1.16.1-rolling-daily-rolling","uncompressed_size_mb":2971,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/discord:1.17.0-rolling-daily","uncompressed_size_mb":2817,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/discord:1.18.0-rolling-daily","uncompressed_size_mb":2817,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/discord:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"24a5e97760a179f9f467a0dd5fa668af2bd7b323"},{"description":"Rootless Docker in Docker Desktop image Ubuntu Focal based.","docker_registry":"https://index.docker.io/v1/","image_src":"docker-ubuntu.png","run_config":{"hostname":"kasm","privileged":true},"categories":["Desktop","Productivity","Development"],"notes":"For Ubuntu Noble hosts, Docker-in-Docker rootless images require the rootlesskit AppArmor profile. Include the following in your Docker Run Config Override (JSON) for your workspace to function properly: {\"security_opt\":[\"apparmor=rootlesskit\"]}\n","friendly_name":"Docker Rootless Ubuntu Focal","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/ubuntu-focal-dind-rootless:1.16.1-rolling-daily","uncompressed_size_mb":3627,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily"]}],"sha":"69b5c471e2d4c155e364650d44f855d63d3aa839"},{"description":"Rootless Docker in Docker Desktop image Ubuntu Jammy based.","docker_registry":"https://index.docker.io/v1/","image_src":"docker-ubuntu.png","run_config":{"hostname":"kasm","privileged":true},"categories":["Desktop","Productivity","Development"],"notes":"The Kasm Docker Rootless Ubuntu Jammy Workspace requires libseccomp => 2.5.3 to run.\n\nThis can be checked by running runc --version\n\nIf you still want to run Docker Rootless Ubuntu Jammy but do not have the minimum required libseccomp version, it can be run in an unsecure manner by adding: {\"security_opt\":[\"seccomp=unconfined\"]} to the Docker Run Config Override (JSON) setting above.\n\nNOTE: This will run the Workspace without the docker seccomp sandbox and will significantly reduce the amount of protection that Kasm Workspaces can provide.\n\nFor Ubuntu Noble hosts, Docker-in-Docker rootless images require the rootlesskit AppArmor profile. Include the following in your Docker Run Config Override (JSON) for your workspace to function properly: {\"security_opt\":[\"apparmor=rootlesskit\"]}\n","friendly_name":"Docker Rootless Ubuntu Jammy","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/ubuntu-jammy-dind-rootless:1.16.1-rolling-daily","uncompressed_size_mb":3589,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/ubuntu-jammy-dind-rootless:1.17.0-rolling-daily","uncompressed_size_mb":4373,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/ubuntu-jammy-dind-rootless:1.18.0-rolling-daily","uncompressed_size_mb":4373,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/ubuntu-jammy-dind-rootless:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"3045279b4eedd1709f83474fe9903c78bd9901b6"},{"description":"Rootless Docker in Docker Desktop image Ubuntu Noble based.","docker_registry":"https://index.docker.io/v1/","image_src":"docker-ubuntu.png","run_config":{"hostname":"kasm","privileged":true},"categories":["Desktop","Productivity","Development"],"notes":"The Kasm Docker Rootless Ubuntu Noble Workspace requires libseccomp => 2.5.3 and Linux Kernel 6.3+ to run.\n\nThis can be checked by running runc --version\n\nIf you still want to run Docker Rootless Ubuntu Noble but do not have the minimum required libseccomp version, it can be run in an unsecure manner by adding: {\"security_opt\":[\"seccomp=unconfined\"]} to the Docker Run Config Override (JSON) setting above.\n\nNOTE: This will run the Workspace without the docker seccomp sandbox and will significantly reduce the amount of protection that Kasm Workspaces can provide.\n\nFor Ubuntu Noble hosts, Docker-in-Docker rootless images require the rootlesskit AppArmor profile. Include the following in your Docker Run Config Override (JSON) for your workspace to function properly: {\"security_opt\":[\"apparmor=rootlesskit\"]}\n","friendly_name":"Docker Rootless Ubuntu Noble","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/ubuntu-noble-dind-rootless:1.16.1-rolling-daily","uncompressed_size_mb":4410,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/ubuntu-noble-dind-rootless:1.17.0-rolling-daily","uncompressed_size_mb":5001,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/ubuntu-noble-dind-rootless:1.18.0-rolling-daily","uncompressed_size_mb":5001,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/ubuntu-noble-dind-rootless:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"aeb8d339ad0f1272bb99c75a2ae927d7b6c60462"},{"description":"Docker in Docker Desktop image Ubuntu Focal based.","docker_registry":"https://index.docker.io/v1/","image_src":"docker-ubuntu.png","run_config":{"hostname":"kasm","privileged":true},"categories":["Desktop","Productivity","Development"],"friendly_name":"Docker Ubuntu Focal","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/ubuntu-focal-dind:1.16.1-rolling-daily","uncompressed_size_mb":3634,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily"]}],"sha":"b580bc76e63581a649bd65b6b9d4dd02ebee54d4"},{"description":"Docker in Docker Desktop image Ubuntu Jammy based.","docker_registry":"https://index.docker.io/v1/","image_src":"docker-ubuntu.png","run_config":{"hostname":"kasm","privileged":true},"categories":["Desktop","Productivity","Development"],"notes":"The Kasm Docker Ubuntu Jammy Workspace requires libseccomp => 2.5.3 to run.\n\nThis can be checked by running runc --version\n\nIf you still want to run Docker Ubuntu Jammy but do not have the minimum required libseccomp version, it can be run in an unsecure manner by adding: {\"security_opt\":[\"seccomp=unconfined\"]} to the Docker Run Config Override (JSON) setting above.\n\nNOTE: This will run the Workspace without the docker seccomp sandbox and will significantly reduce the amount of protection that Kasm Workspaces can provide.\n","friendly_name":"Docker Ubuntu Jammy","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/ubuntu-jammy-dind:1.16.1-rolling-daily","uncompressed_size_mb":3597,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/ubuntu-jammy-dind:1.17.0-rolling-daily","uncompressed_size_mb":4332,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/ubuntu-jammy-dind:1.18.0-rolling-daily","uncompressed_size_mb":4332,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/ubuntu-jammy-dind:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"47bac0f89f3bf88d1ecf8ab5f1481df7e6ff353b"},{"description":"Docker in Docker Desktop image Ubuntu Noble based.","docker_registry":"https://index.docker.io/v1/","image_src":"docker-ubuntu.png","run_config":{"hostname":"kasm","privileged":true},"categories":["Desktop","Productivity","Development"],"notes":"The Kasm Docker Ubuntu Noble Workspace requires libseccomp => 2.5.3 and Linux Kernel 6.3+ to run.\n\nThis can be checked by running runc --version\n\nIf you still want to run Docker Ubuntu Noble but do not have the minimum required libseccomp version, it can be run in an unsecure manner by adding: {\"security_opt\":[\"seccomp=unconfined\"]} to the Docker Run Config Override (JSON) setting above.\n\nNOTE: This will run the Workspace without the docker seccomp sandbox and will significantly reduce the amount of protection that Kasm Workspaces can provide.\n","friendly_name":"Docker Ubuntu Noble","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/ubuntu-noble-dind:1.16.1-rolling-daily","uncompressed_size_mb":4409,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/ubuntu-noble-dind:1.17.0-rolling-daily","uncompressed_size_mb":5010,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/ubuntu-noble-dind:1.18.0-rolling-daily","uncompressed_size_mb":5010,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/ubuntu-noble-dind:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"2e8ea57fdacb9ff074a8a27a5fd656556b7736a7"},{"description":"Doom is a 1993 first-person shooter developed by id Software.","docker_registry":"https://kcr.kasmweb.com/v1/","image_src":"doom.png","categories":["Games"],"friendly_name":"Doom","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kcr.kasmweb.com/kasmweb/doom:1.16.1-rolling-daily","uncompressed_size_mb":2428,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kcr.kasmweb.com/kasmweb/doom:1.17.0-rolling-daily","uncompressed_size_mb":2624,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/doom:1.18.0-rolling-daily","uncompressed_size_mb":2624,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/doom:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"274edc55deb657c544e9131b5468e586ca65e936"},{"description":"Microsoft Edge is a cross-platform web browser developed by Microsoft.","docker_registry":"https://index.docker.io/v1/","image_src":"edge.png","run_config":{"hostname":"kasm"},"exec_config":{"go":{"cmd":"bash -c '/dockerstartup/custom_startup.sh --go --url \"$KASM_URL\"'"},"assign":{"cmd":"bash -c '/dockerstartup/custom_startup.sh --assign --url \"$KASM_URL\"'"}},"categories":["Browser"],"notes":"The Kasm Edge Workspace requires \"seccomp=unconfined\" to function properly.\n\nThis can be run in an unsecure manner by adding: {\"security_opt\":[\"seccomp=unconfined\"]} to the Docker Run Config Override (JSON) setting above.\n\nNOTE: This will run the Workspace without the docker seccomp sandbox and will significantly reduce the amount of protection that Kasm Workspaces can provide.\n","friendly_name":"Edge","architecture":["amd64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/edge:1.16.1-rolling-daily","uncompressed_size_mb":3338,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/edge:1.17.0-rolling-daily","uncompressed_size_mb":3165,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/edge:1.18.0-rolling-daily","uncompressed_size_mb":3165,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/edge:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"5618b9362acc6f2dd26c88b11502c0c12039e004"},{"description":"Fedora Linux aims to be on the leading edge of open-source technologies. It is the upstream source for Red Hat Enterprise Linux.","docker_registry":"https://index.docker.io/v1/","image_src":"fedora.svg","categories":["Desktop","Productivity","Development"],"notes":"The Kasm Fedora 39 Workspace requires libseccomp => 2.5.3 to run.\n\nThis can be checked by running runc --version\n\nIf you still want to run Fedora 39 but do not have the minimum required libseccomp version, it can be run in an unsecure manner by adding: {\"security_opt\":[\"seccomp=unconfined\"]} to the Docker Run Config Override (JSON) setting above.\n\nNOTE: This will run the Workspace without the docker seccomp sandbox and will significantly reduce the amount of protection that Kasm Workspaces can provide.\n","friendly_name":"Fedora 39","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/fedora-39-desktop:1.16.1-rolling-daily","uncompressed_size_mb":6999,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/fedora-39-desktop:1.17.0-rolling-daily","uncompressed_size_mb":8433,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/fedora-39-desktop:1.18.0-rolling-daily","uncompressed_size_mb":8433,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/fedora-39-desktop:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"505bff6669b81a91b2e5f119bc77c06e35c38581"},{"description":"Fedora Linux aims to be on the leading edge of open-source technologies. It is the upstream source for Red Hat Enterprise Linux.","docker_registry":"https://index.docker.io/v1/","image_src":"fedora.svg","categories":["Desktop","Productivity","Development"],"notes":"The Kasm Fedora 40 Workspace requires libseccomp => 2.5.3 to run.\n\nThis can be checked by running runc --version\n\nIf you still want to run Fedora 40 but do not have the minimum required libseccomp version, it can be run in an unsecure manner by adding: {\"security_opt\":[\"seccomp=unconfined\"]} to the Docker Run Config Override (JSON) setting above.\n\nNOTE: This will run the Workspace without the docker seccomp sandbox and will significantly reduce the amount of protection that Kasm Workspaces can provide.\n","friendly_name":"Fedora 40","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/fedora-40-desktop:1.16.1-rolling-daily","uncompressed_size_mb":7318,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/fedora-40-desktop:1.17.0-rolling-daily","uncompressed_size_mb":8655,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/fedora-40-desktop:1.18.0-rolling-daily","uncompressed_size_mb":8655,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/fedora-40-desktop:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"713b8d1f0e6033ad59d6a76b61419f8169340983"},{"description":"Fedora Linux aims to be on the leading edge of open-source technologies. It is the upstream source for Red Hat Enterprise Linux.","docker_registry":"https://index.docker.io/v1/","image_src":"fedora.svg","categories":["Desktop","Productivity","Development"],"notes":"The Kasm Fedora 41 Workspace requires libseccomp => 2.5.3 to run.\n\nThis can be checked by running runc --version\n\nIf you still want to run Fedora 41 but do not have the minimum required libseccomp version, it can be run in an unsecure manner by adding: {\"security_opt\":[\"seccomp=unconfined\"]} to the Docker Run Config Override (JSON) setting above.\n\nNOTE: This will run the Workspace without the docker seccomp sandbox and will significantly reduce the amount of protection that Kasm Workspaces can provide.\n","friendly_name":"Fedora 41","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/fedora-41-desktop:develop","uncompressed_size_mb":9100,"available_tags":["develop","1.18.0-rolling-weekly"]},{"version":"1.18.x","image":"kasmweb/fedora-41-desktop:1.18.0-rolling-daily","uncompressed_size_mb":9100,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/fedora-41-desktop:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"1d7a6ab47396734f46cdf3f5d0bd6560bd0d739c"},{"description":"A free and open-source, cross-platform FTP/FTPS application.","docker_registry":"https://kcr.kasmweb.com/v1/","image_src":"filezilla.png","categories":["Productivity"],"friendly_name":"FileZilla","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kcr.kasmweb.com/kasmweb/filezilla:1.16.1-rolling-daily","uncompressed_size_mb":2375,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kcr.kasmweb.com/kasmweb/filezilla:1.17.0-rolling-daily","uncompressed_size_mb":2591,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/filezilla:1.18.0-rolling-daily","uncompressed_size_mb":2591,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/filezilla:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"6fe7ab42db7be5629813de10337afd4b8b3c8440"},{"description":"Firefox was created by Mozilla as a faster, more private alternative to browsers like Internet Explorer, and now Chrome.","docker_registry":"https://index.docker.io/v1/","image_src":"firefox.png","run_config":{"hostname":"kasm"},"exec_config":{"go":{"cmd":"bash -c '/dockerstartup/custom_startup.sh --go --url \"$KASM_URL\"'"},"assign":{"cmd":"bash -c '/dockerstartup/custom_startup.sh --assign --url \"$KASM_URL\"'"}},"categories":["Browser"],"friendly_name":"Firefox","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/firefox:1.16.1-rolling-daily","uncompressed_size_mb":2680,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/firefox:1.17.0-rolling-daily","uncompressed_size_mb":2967,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/firefox:1.18.0-rolling-daily","uncompressed_size_mb":2967,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/firefox:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"119dcd00ee5796284e185b5ce2b4be3434397d33"},{"description":"Ubuntu desktop with Google Chrome and Forensic OSINT Web Capture Tool","docker_registry":"https://index.docker.io/v1/","image_src":"forensic-osint.png","run_config":{"hostname":"kasm"},"categories":["Productivity"],"friendly_name":"Forensic OSINT","architecture":["amd64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/forensic-osint:1.16.1-rolling-daily","uncompressed_size_mb":5521,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/forensic-osint:1.17.0-rolling-daily","uncompressed_size_mb":5910,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/forensic-osint:1.18.0-rolling-daily","uncompressed_size_mb":5910,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/forensic-osint:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"36350889c75e6d5cda4e4c62a9b10a72ba992de2"},{"description":"GIMP is a cross-platform image editor.","docker_registry":"https://kcr.kasmweb.com/v1/","image_src":"gimp.png","categories":["Multimedia"],"friendly_name":"Gimp","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kcr.kasmweb.com/kasmweb/gimp:1.16.1-rolling-daily","uncompressed_size_mb":2429,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kcr.kasmweb.com/kasmweb/gimp:1.17.0-rolling-daily","uncompressed_size_mb":2663,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/gimp:1.18.0-rolling-daily","uncompressed_size_mb":2663,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/gimp:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"f82968d811c5c69244a03e7af9039d5a6e62b123"},{"description":"Ubuntu desktop with Google Chrome and Hunchly Web Capture Tool ","docker_registry":"https://index.docker.io/v1/","image_src":"hunchly.png","run_config":{},"exec_config":{},"notes":"The Hunchly Workspace requires libseccomp => 2.5.3 to run.\n\nThis can be checked by running runc --version\n\nIf you still want to run Hunchly but do not have the minimum required libseccomp version, it can be run in an unsecure manner by adding: {\"security_opt\":[\"seccomp=unconfined\"]} to the Docker Run Config Override (JSON) setting above.\n\nNOTE: This will run the Workspace without the docker seccomp sandbox and will significantly reduce the amount of protection that Kasm Workspaces can provide.\n","categories":["Productivity"],"friendly_name":"Hunchly","architecture":["amd64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/hunchly:1.16.1-rolling-daily","uncompressed_size_mb":3678,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/hunchly:1.17.0-rolling-daily","uncompressed_size_mb":3517,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/hunchly:1.18.0-rolling-daily","uncompressed_size_mb":3517,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/hunchly:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"019cd17e98e7b15e0bfdf7f8e4a46110a2ff1052"},{"description":"A free and open-source vector graphics editor used to create vector images, primarily in Scalable Vector Graphics (SVG) format.","docker_registry":"https://index.docker.io/v1/","image_src":"inkscape.png","categories":["Multimedia"],"friendly_name":"Inkscape","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/inkscape:1.16.1-rolling-daily","uncompressed_size_mb":2610,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/inkscape:1.17.0-rolling-daily","uncompressed_size_mb":2855,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/inkscape:1.18.0-rolling-daily","uncompressed_size_mb":2855,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/inkscape:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"b3c62899520ca048ea14d87d5b512c33fc396810"},{"description":"Insomnia API Design Platform","docker_registry":"https://index.docker.io/v1/","image_src":"insomnia.png","categories":["Development"],"friendly_name":"Insomnia","architecture":["amd64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/insomnia:1.16.1-rolling-daily","uncompressed_size_mb":2900,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/insomnia:1.17.0-rolling-daily","uncompressed_size_mb":3026,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/insomnia:1.18.0-rolling-daily","uncompressed_size_mb":3025,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/insomnia:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"87df0044058781096ee9e838f8809d42af7592db"},{"description":"Kali Linux is a Debian-derived Linux distribution designed for digital forensics and penetration testing.","docker_registry":"https://index.docker.io/v1/","image_src":"kali.png","categories":["Desktop","Security","Development"],"notes":"The Kasm Kali Linux Workspace requires libseccomp => 2.5.3 to run.\n\nThis can be checked by running runc --version\n\nIf you still want to run Kali Linux but do not have the minimum required libseccomp version, it can be run in an unsecure manner by adding: {\"security_opt\":[\"seccomp=unconfined\"]} to the Docker Run Config Override (JSON) setting above.\n\nNOTE: This will run the Workspace without the docker seccomp sandbox and will significantly reduce the amount of protection that Kasm Workspaces can provide.\n\n\nThis image includes software that may not function properly unless the Kasm session is executed with elevated privileges.\n\nPlease see the following documentation for configuring the image to run as root, utilize sudo, or other custom privileges.\n\nhttps://kasmweb.com/docs/latest/how_to/running_as_root.html","friendly_name":"Kali Linux","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/kali-rolling-desktop:1.16.1-rolling-daily","uncompressed_size_mb":8043,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/kali-rolling-desktop:1.17.0-rolling-daily","uncompressed_size_mb":8788,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/kali-rolling-desktop:1.18.0-rolling-daily","uncompressed_size_mb":8788,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/kali-rolling-desktop:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"e8aab24c20b9729fb0611914a3ff71c7aab779a1"},{"description":"KasmOS is a Debian based operating system focused on business productivity.","docker_registry":"https://index.docker.io/v1/","image_src":"kasmos.png","categories":["Desktop","Development","Productivity"],"notes":"","friendly_name":"KasmOS","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/kasmos-desktop:1.16.1-rolling-daily","uncompressed_size_mb":6730,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/kasmos-desktop:1.17.0-rolling-daily","uncompressed_size_mb":7132,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/kasmos-desktop:1.18.0-rolling-daily","uncompressed_size_mb":7132,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/kasmos-desktop:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"799448fd82f407a4fdf8c824d1ac18e438d57781"},{"description":"LibreOffice is a free and powerful office suite, and a successor to OpenOffice.org","docker_registry":"https://index.docker.io/v1/","image_src":"libre-office.png","categories":["Productivity","Office"],"friendly_name":"Libre Office","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/libre-office:1.16.1-rolling-daily","uncompressed_size_mb":3356,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/libre-office:1.17.0-rolling-daily","uncompressed_size_mb":3637,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/libre-office:1.18.0-rolling-daily","uncompressed_size_mb":3637,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/libre-office:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"811000c95d014745706bb3f25dd71bc8e4b67aff"},{"description":"Maltego for Kasm Workspaces ","docker_registry":"https://index.docker.io/v1/","image_src":"maltego.png","run_config":{},"exec_config":{},"categories":["Productivity"],"friendly_name":"Maltego","architecture":["amd64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/maltego:1.16.1-rolling-daily","uncompressed_size_mb":3107,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/maltego:1.17.0-rolling-daily","uncompressed_size_mb":3474,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/maltego:1.18.0-rolling-daily","uncompressed_size_mb":3474,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/maltego:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"1faecedc1ea55b4c741bf29eecc792baf5a9fa1b"},{"description":"An open source voxel game engine.","docker_registry":"https://index.docker.io/v1/","image_src":"minetest.svg","categories":["Games"],"friendly_name":"Minetest","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/minetest:1.16.1-rolling-daily","uncompressed_size_mb":2364,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/minetest:1.17.0-rolling-daily","uncompressed_size_mb":2585,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/minetest:1.18.0-rolling-daily","uncompressed_size_mb":2585,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/minetest:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"b99dd90ff0573d4b8dc86c5c72d81d3574351725"},{"description":"Nessus is a proprietary vulnerability scanner developed by Tenable, Inc.","docker_registry":"https://index.docker.io/v1/","image_src":"nessus.svg","run_config":{"user":"root"},"exec_config":{},"categories":["Security"],"friendly_name":"Nessus","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/nessus:1.16.1-rolling-daily","uncompressed_size_mb":6034,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/nessus:1.17.0-rolling-daily","uncompressed_size_mb":5953,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/nessus:1.18.0-rolling-daily","uncompressed_size_mb":5953,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/nessus:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"7b324b3d384024b74882e8bc5df99336f124bd0e"},{"description":"Obsidian is a note-taking app that lets you organize and connect your ideas like a personal knowledge base.","docker_registry":"https://index.docker.io/v1/","image_src":"obsidian.png","categories":["Productivity"],"friendly_name":"Obsidian","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/obsidian:develop","uncompressed_size_mb":3421,"available_tags":["develop"]},{"version":"1.18.x","image":"kasmweb/obsidian:1.18.0-rolling-daily","uncompressed_size_mb":3421,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/obsidian:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"c8d8ee4b8069a5a55542ec7ff16c9a7b3d267664"},{"description":"ONLYOFFICE offers a secure online office suite highly compatible with MS Office formats.","docker_registry":"https://index.docker.io/v1/","image_src":"only-office.png","categories":["Productivity","Office"],"friendly_name":"Only Office","architecture":["amd64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/only-office:1.16.1-rolling-daily","uncompressed_size_mb":3611,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/only-office:1.17.0-rolling-daily","uncompressed_size_mb":3633,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/only-office:1.18.0-rolling-daily","uncompressed_size_mb":3633,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/only-office:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"85390a5effac1d818ae7e6341ec80bfa7300f3f3"},{"description":"OpenSUSE Leap is a new type of hybrid Linux distribution based on SUSE Linux Enterprise.","docker_registry":"https://index.docker.io/v1/","image_src":"opensuse.png","categories":["Desktop","Productivity","Development"],"friendly_name":"OpenSUSE Leap 15","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/opensuse-15-desktop:1.16.1-rolling-daily","uncompressed_size_mb":5598,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/opensuse-15-desktop:1.17.0-rolling-daily","uncompressed_size_mb":6237,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/opensuse-15-desktop:1.18.0-rolling-daily","uncompressed_size_mb":6237,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/opensuse-15-desktop:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"abfa35782e3da8b51ee749b2f03130c56d527fc7"},{"description":"Oracle Linux is a highly performant and secure operating system that provides a 100% application binary compatible alternative to RHEL and CentOS.","docker_registry":"https://index.docker.io/v1/","image_src":"oracle-linux.png","categories":["Desktop","Productivity","Development"],"friendly_name":"Oracle Linux 8","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/oracle-8-desktop:1.16.1-rolling-daily","uncompressed_size_mb":6863,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/oracle-8-desktop:1.17.0-rolling-daily","uncompressed_size_mb":9779,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/oracle-8-desktop:1.18.0-rolling-daily","uncompressed_size_mb":9779,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/oracle-8-desktop:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"ce64ae52d666e85bdc60fe4a8906539a85308a60"},{"description":"Oracle Linux is a highly performant and secure operating system that provides a 100% application binary compatible alternative to RHEL and CentOS.","docker_registry":"https://kcr.kasmweb.com/v1/","image_src":"oracle-linux.png","categories":["Desktop","Productivity","Development"],"notes":"The Kasm Oracle Linux 9 Workspace requires libseccomp => 2.5.3 to run.\n\nThis can be checked by running runc --version\n\nIf you still want to run Oracle Linux 9 but do not have the minimum required libseccomp version, it can be run in an unsecure manner by adding: {\"security_opt\":[\"seccomp=unconfined\"]} to the Docker Run Config Override (JSON) setting above.\n\nNOTE: This will run the Workspace without the docker seccomp sandbox and will significantly reduce the amount of protection that Kasm Workspaces can provide.\n","friendly_name":"Oracle Linux 9","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kcr.kasmweb.com/kasmweb/oracle-9-desktop:1.16.1-rolling-daily","uncompressed_size_mb":8190,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kcr.kasmweb.com/kasmweb/oracle-9-desktop:1.17.0-rolling-daily","uncompressed_size_mb":8690,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/oracle-9-desktop:1.18.0-rolling-daily","uncompressed_size_mb":8690,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/oracle-9-desktop:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"36d2ad51873b5a63daee98397ae525a522a03f86"},{"description":"Parrot OS is a Linux distribution based on Debian with a focus on security, privacy, and development.","docker_registry":"https://index.docker.io/v1/","image_src":"parrotos.svg","run_config":{"hostname":"kasm"},"categories":["Desktop","Development","Security"],"notes":"The Kasm Parrot OS Workspace requires libseccomp => 2.5.3 to run.\n\nThis can be checked by running runc --version\n\nIf you still want to run Parrot OS but do not have the minimum required libseccomp version, it can be run in an unsecure manner by adding: {\"security_opt\":[\"seccomp=unconfined\"]} to the Docker Run Config Override (JSON) setting above.\n\nNOTE: This will run the Workspace without the docker seccomp sandbox and will significantly reduce the amount of protection that Kasm Workspaces can provide.\n\n\nThis image includes software that may not function properly unless the Kasm session is executed with elevated privileges.\n\nPlease see the following documentation for configuring the image to run as root, utilize sudo, or other custom privileges.\n\nhttps://kasmweb.com/docs/latest/how_to/running_as_root.html","friendly_name":"Parrot OS","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/parrotos-6-desktop:1.16.1-rolling-daily","uncompressed_size_mb":15461,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/parrotos-6-desktop:1.17.0-rolling-daily","uncompressed_size_mb":18516,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/parrotos-6-desktop:1.18.0-rolling-daily","uncompressed_size_mb":18516,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/parrotos-6-desktop:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"3049a4b4a4cd3d1a5e744c8b4796c60b8a8f3122"},{"description":"An open-source, cross-platform bitmap image drawing and editing program inspired by Paint.NET.","docker_registry":"https://index.docker.io/v1/","image_src":"pinta.png","categories":["Multimedia"],"friendly_name":"Pinta","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/pinta:1.16.1-rolling-daily","uncompressed_size_mb":2409,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/pinta:1.17.0-rolling-daily","uncompressed_size_mb":3352,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/pinta:1.18.0-rolling-daily","uncompressed_size_mb":3352,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/pinta:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"50b4a570719d6dcf4b511dc4c74c7d0fdb7e6648"},{"description":"The Collaboration Platform for API Development.","docker_registry":"https://index.docker.io/v1/","image_src":"postman.png","categories":["Development"],"friendly_name":"Postman","architecture":["amd64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/postman:1.16.1-rolling-daily","uncompressed_size_mb":3490,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/postman:1.17.0-rolling-daily","uncompressed_size_mb":3369,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/postman:1.18.0-rolling-daily","uncompressed_size_mb":3369,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/postman:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"9ff8c784953947c6e0fbc5b0950ff4ac18b20048"},{"description":"qBittorrent aims to provide an open-source software alternative to µTorrent.","docker_registry":"https://index.docker.io/v1/","image_src":"qbittorrent.png","categories":["Productivity"],"friendly_name":"qBittorrent","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/qbittorrent:1.16.1-rolling-daily","uncompressed_size_mb":2398,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/qbittorrent:1.17.0-rolling-daily","uncompressed_size_mb":2617,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/qbittorrent:1.18.0-rolling-daily","uncompressed_size_mb":2617,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/qbittorrent:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"4ae4cc36ed14ba3b5271cc0936ac9e551c84d16a"},{"description":"redroid (Remote-Android) is a multi-arch, GPU enabled, Android in Cloud solution.","docker_registry":"https://index.docker.io/v1/","image_src":"android.svg","run_config":{"environment":{"ANDROID_VERSION":"15.0.0","REDROID_GPU_GUEST_MODE":"guest","REDROID_FPS":"30","REDROID_WIDTH":"720","REDROID_HEIGHT":"1280","REDROID_DPI":"320","REDROID_SHOW_CONSOLE":"1","REDROID_DISABLE_AUTOSTART":"0","REDROID_DISABLE_HOST_CHECKS":"0"},"privileged":true},"exec_config":{},"categories":["Development","Desktop","Productivity","Mobile"],"notes":"The Redroid Workspace is experimental.\nIt leverages Kasm's DinD (Docker in Docker) image, and automates utilizing Redroid and scrcpy projects.\n\nThis image requires the \"binder_linux\" host level kernel modules installed and enabled. See [Redroid Docs](https://github.com/remote-android/redroid-doc?tab=readme-ov-file#getting-started) for more details.\n\n## Example for installing binder_linux on Ubuntu 22.04 LTS host\n```\nsudo apt install linux-modules-extra-`uname -r`\nsudo modprobe binder_linux devices=\"binder,hwbinder,vndbinder\"\n```\n\nThe left ALT key is mapped as the hotkey for scrcpy\n\n- Alt+R - rotate the android device\n- Alt+F - fullscreen the android device\n- Alt+Up/Alt+Down - Increase the volume of the device\n\nSee [scrcpy docs](https://github.com/Genymobile/scrcpy) for more details.\n\nVarious functionality within the image can be adjust by altering the environment variables as described in the [Dockerhub Registry](https://hub.docker.com/r/kasmweb/redroid)","friendly_name":"Redroid","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/redroid:1.16.1-rolling-daily","uncompressed_size_mb":3709,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/redroid:1.17.0-rolling-daily","uncompressed_size_mb":7828,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/redroid:1.18.0-rolling-daily","uncompressed_size_mb":3897,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/redroid:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"c76f6ed4b53ea1889e2ec20d9ad2a31db73bcb7c"},{"description":"Remmina is a remote desktop client for POSIX-based computer operating systems. It supports the Remote Desktop Protocol, VNC, NX, XDMCP, SPICE and SSH.","docker_registry":"https://index.docker.io/v1/","image_src":"remmina.png","categories":["Productivity","Remote Access"],"friendly_name":"Remmina","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/remmina:1.16.1-rolling-daily","uncompressed_size_mb":2345,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/remmina:1.17.0-rolling-daily","uncompressed_size_mb":2566,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/remmina:1.18.0-rolling-daily","uncompressed_size_mb":2566,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/remmina:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"d4fe5dce54dac5f94a9ee896aa57f358a1e51ebe"},{"description":"REMnux is a Linux toolkit for reverse-engineering and analyzing malicious software.","docker_registry":"https://index.docker.io/v1/","image_src":"remnux.png","categories":["Desktop","Security","Development"],"notes":"A number of applications including VSCode and proxy browser within Burpsuite may require relaxed security in order to run correctly.\n\nAdding: {\"security_opt\":[\"seccomp=unconfined\"]} to the Docker Run Config Override (JSON) above may help these programs run with better compatibility.","friendly_name":"REMnux","architecture":["amd64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/remnux-focal-desktop:1.16.1-rolling-daily","uncompressed_size_mb":11451,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily"]}],"sha":"f88f0c4ea0c376f7d004db47e7df6a6b9a135406"},{"description":"RetroArch is a frontend for emulators, game engines and media players.","docker_registry":"https://index.docker.io/v1/","image_src":"retroarch.svg","categories":["Games"],"friendly_name":"RetroArch","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/retroarch:1.16.1-rolling-daily","uncompressed_size_mb":2573,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/retroarch:1.17.0-rolling-daily","uncompressed_size_mb":3140,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/retroarch:1.18.0-rolling-daily","uncompressed_size_mb":3140,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/retroarch:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"d59a98ba5c1a160ac3f3b1ed8c7b91f708a73ea3"},{"description":"Red Hat Enterprise Linux 9 (RHEL 9) is a Linux distribution developed by Red Hat, Inc., a subsidiary of IBM. It is designed for the commercial market and is known for its stability, security, and support.","docker_registry":"https://index.docker.io/v1/","image_src":"redhat.svg","categories":["Desktop","Productivity","Development"],"notes":"","friendly_name":"RHEL 9","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/rhel-9-desktop:1.16.1-rolling-daily","uncompressed_size_mb":8908,"available_tags":["develop","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/rhel-9-desktop:1.17.0-rolling-daily","uncompressed_size_mb":8908,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/rhel-9-desktop:1.18.0-rolling-daily","uncompressed_size_mb":8654,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/rhel-9-desktop:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"dddf142c6db8f0cbd66e07d94e3667ae5c1d93d3"},{"description":"Rocky Linux is a Linux distribution developed by Rocky Enterprise Software Foundation, which is a privately owned benefit corporation that describes itself as a \"self imposed not-for-profit\".","docker_registry":"https://index.docker.io/v1/","image_src":"rockylinux.svg","categories":["Desktop","Productivity","Development"],"friendly_name":"Rocky Linux 8","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/rockylinux-8-desktop:1.16.1-rolling-daily","uncompressed_size_mb":6606,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/rockylinux-8-desktop:1.17.0-rolling-daily","uncompressed_size_mb":9714,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/rockylinux-8-desktop:1.18.0-rolling-daily","uncompressed_size_mb":9714,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/rockylinux-8-desktop:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"1aeb3ab69125fd886d435ce720014a2f1b5b0664"},{"description":"Rocky Linux is a Linux distribution developed by Rocky Enterprise Software Foundation, which is a privately owned benefit corporation that describes itself as a \"self imposed not-for-profit\".","docker_registry":"https://index.docker.io/v1/","image_src":"rockylinux.svg","categories":["Desktop","Productivity","Development"],"notes":"The Kasm Rocky Linux 9 Workspace requires libseccomp => 2.5.3 to run.\n\nThis can be checked by running runc --version\n\nIf you still want to run Rocky Linux 9 but do not have the minimum required libseccomp version, it can be run in an unsecure manner by adding: {\"security_opt\":[\"seccomp=unconfined\"]} to the Docker Run Config Override (JSON) setting above.\n\nNOTE: This will run the Workspace without the docker seccomp sandbox and will significantly reduce the amount of protection that Kasm Workspaces can provide.\n","friendly_name":"Rocky Linux 9","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/rockylinux-9-desktop:1.16.1-rolling-daily","uncompressed_size_mb":5507,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/rockylinux-9-desktop:1.17.0-rolling-daily","uncompressed_size_mb":8470,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/rockylinux-9-desktop:1.18.0-rolling-daily","uncompressed_size_mb":8470,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/rockylinux-9-desktop:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"2d15ae8668943d7f4c1c8f3004dbe98ffb82f636"},{"description":"Chat app supporting end-to-end encryption.","docker_registry":"https://index.docker.io/v1/","image_src":"signal.png","categories":["Communication","Chat","Privacy"],"friendly_name":"Signal","architecture":["amd64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/signal:1.16.1-rolling-daily","uncompressed_size_mb":3180,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/signal:1.17.0-rolling-daily","uncompressed_size_mb":3024,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/signal:1.18.0-rolling-daily","uncompressed_size_mb":3024,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/signal:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"4c0ceacae73ba37f0fa1ecf93bfaaed714a79049"},{"description":"Slack is a new way to communicate with your team. It's faster, better organized, and more secure than email.","docker_registry":"https://index.docker.io/v1/","image_src":"slack.svg","categories":["Productivity","Chat","Communication"],"friendly_name":"Slack","architecture":["amd64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/slack:1.16.1-rolling-daily","uncompressed_size_mb":3370,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/slack:1.17.0-rolling-daily","uncompressed_size_mb":3232,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/slack:1.18.0-rolling-daily","uncompressed_size_mb":3232,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/slack:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"294cc7fccc93c55caf49873ecf814ffa6962a45a"},{"description":"SpiderFoot is an open source intelligence (OSINT) automation tool.","docker_registry":"https://index.docker.io/v1/","image_src":"spiderfoot.svg","categories":["Productivity","OSINT","Security"],"friendly_name":"Spiderfoot","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/spiderfoot:1.16.1-rolling-daily","uncompressed_size_mb":3048,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/spiderfoot:1.17.0-rolling-daily","uncompressed_size_mb":3437,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/spiderfoot:1.18.0-rolling-daily","uncompressed_size_mb":3437,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/spiderfoot:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"57c7e354746c2b5df487af65688b3984fe227737"},{"description":"Steam is the ultimate destination for playing, discussing, and creating games.","docker_registry":"https://index.docker.io/v1/","image_src":"steam.png","categories":["Games"],"run_config":{"security_opt":["seccomp=unconfined"],"privileged":true},"notes":"The Kasm Steam Workspace is highly experimental.\n\nNOTE: When using NVIDIA, 3D acceleration is provided by VirtualGL, if a game fails to run look into specific launch options that might be needed to leverage VirtualGL.\n","friendly_name":"Steam","architecture":["amd64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/steam:1.16.1-rolling-daily","uncompressed_size_mb":2776,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/steam:1.17.0-rolling-daily","uncompressed_size_mb":2823,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/steam:1.18.0-rolling-daily","uncompressed_size_mb":2823,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/steam:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"2f922fb6016aa3342c2f0fe3471a694d51caee46"},{"description":"Sublime Text is a sophisticated text editor for code, markup and prose.","docker_registry":"https://index.docker.io/v1/","image_src":"sublime-text.png","categories":["Development"],"friendly_name":"Sublime Text","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/sublime-text:1.16.1-rolling-daily","uncompressed_size_mb":2385,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/sublime-text:1.17.0-rolling-daily","uncompressed_size_mb":2601,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/sublime-text:1.18.0-rolling-daily","uncompressed_size_mb":2601,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/sublime-text:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"e6d0fa17eae9a275cc018d580f51ebeaf67bd44a"},{"description":"SuperTuxKart is a 3D open-source arcade racer with a variety characters, tracks, and modes to play.","docker_registry":"https://index.docker.io/v1/","image_src":"super-tux-kart.png","categories":["Games"],"notes":"SuperTuxKart requires a GPU for best performance","friendly_name":"SuperTuxKart","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/super-tux-kart:1.16.1-rolling-daily","uncompressed_size_mb":3087,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily"]},{"version":"1.17.0","image":"kasmweb/super-tux-kart:1.17.0-rolling-daily","uncompressed_size_mb":3087,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/super-tux-kart:1.18.0-rolling-daily","uncompressed_size_mb":3310,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]}],"sha":"4824caa015fad77cae72ed42cbc2ebbf3e3dcc16"},{"description":"Telegram is a messaging app with a focus on speed and security.","docker_registry":"https://index.docker.io/v1/","image_src":"telegram.png","categories":["Communication"],"friendly_name":"Telegram","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/telegram:1.16.1-rolling-daily","uncompressed_size_mb":2446,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/telegram:1.17.0-rolling-daily","uncompressed_size_mb":3116,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/telegram:1.18.0-rolling-daily","uncompressed_size_mb":3116,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/telegram:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"3df3c458774d654a311028722014f44071983735"},{"description":"Xfce Terminal is a lightweight and easy to use terminal emulator application with many advanced features including drop down, tabs, unlimited scrolling, full colors, fonts, transparent backgrounds, and more.","docker_registry":"https://index.docker.io/v1/","run_config":{"hostname":"kasm","environment":{"TERMINAL_ARGS":"--fullscreen --hide-borders --hide-menubar --zoom=-1 --hide-scrollbar"}},"image_src":"terminal.png","friendly_name":"Terminal","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/terminal:1.16.1-rolling-daily","uncompressed_size_mb":2797,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/terminal:1.17.0-rolling-daily","uncompressed_size_mb":3114,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/terminal:1.18.0-rolling-daily","uncompressed_size_mb":3114,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/terminal:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"337d28e1a3d2ecea78921204147ccfade3499101"},{"description":"A free and open-source cross-platform email client, personal information manager, news client, RSS and chat client.","docker_registry":"https://index.docker.io/v1/","image_src":"thunderbird.png","categories":["Productivity","Communication"],"friendly_name":"Thunderbird","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/thunderbird:1.16.1-rolling-daily","uncompressed_size_mb":2560,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/thunderbird:1.17.0-rolling-daily","uncompressed_size_mb":2833,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/thunderbird:1.18.0-rolling-daily","uncompressed_size_mb":2833,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/thunderbird:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"1a3634051b494c4cda00c3b03ac6fc7a35bf0fdd"},{"description":"Tor is free and open-source software for enabling anonymous communication by directing Internet traffic through a free, worldwide, volunteer overlay network.","docker_registry":"https://index.docker.io/v1/","image_src":"tor-browser.png","run_config":{"hostname":"kasm"},"exec_config":{"go":{"cmd":"bash -c '/dockerstartup/custom_startup.sh --go --url \"$KASM_URL\"'"},"assign":{"cmd":"bash -c '/dockerstartup/custom_startup.sh --assign --url \"$KASM_URL\"'"}},"categories":["Browser","Privacy"],"friendly_name":"Tor-Browser","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/tor-browser:1.16.1-rolling-daily","uncompressed_size_mb":2626,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/tor-browser:1.17.0-rolling-daily","uncompressed_size_mb":2862,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/tor-browser:1.18.0-rolling-daily","uncompressed_size_mb":2862,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/tor-browser:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"0e0cf865d18a388a42cff2079540960566f2561c"},{"description":"Trace Labs OSINT Image for Kasm Workspaces","docker_registry":"https://index.docker.io/v1/","image_src":"tracelabs.svg","run_config":{},"exec_config":{},"categories":["Productivity"],"friendly_name":"Trace Labs","architecture":["amd64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/tracelabs:1.16.1-rolling-daily","uncompressed_size_mb":13152,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/tracelabs:1.17.0-rolling-daily","uncompressed_size_mb":13338,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/tracelabs:1.18.0-rolling-daily","uncompressed_size_mb":13338,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/tracelabs:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"49d787d829fe5c9f604631f958c44b0517e28cf8"},{"description":"Ubuntu is a Linux distribution based on Debian. This container includes Ubuntu Focal with tools for using popular VPN services.","docker_registry":"https://index.docker.io/v1/","image_src":"ubuntu.png","run_config":{"environment":{"TAILSCALE_KEY":"","SHOW_VPN_STATUS":"1","SHOW_IP_STATUS":"1"},"sysctls":{"net.ipv4.conf.all.src_valid_mark":1},"dns":["8.8.8.8","8.8.4.4"]},"exec_config":{"first_launch":{"user":"root","privileged":true,"cmd":"bash -c '/usr/bin/desktop_ready && /dockerstartup/start_vpn.sh'"}},"categories":["Desktop","Productivity","Development"],"friendly_name":"Ubuntu Focal VPN","architecture":["amd64","arm64"],"launch_config":{"file_mapping":{"destination":"/dockerstartup/launch_selections.json"},"launch_form":[{"key":"vpn_service","label":"VPN Service","value":null,"allow_saving":true,"required":true,"placeholder":null,"help":"Select the desired VPN service to use","input_type":"select","options":[{"value":"openvpn","label":"OpenVPN"},{"value":"tailscale","label":"TailScale"},{"value":"wireguard","label":"WireGuard"}],"validator_regex":null,"validator_regex_description":null,"display_if":null},{"key":"tailscale_key","label":"Tailscale Auth Key","value":null,"allow_saving":true,"placeholder":"tskey-xxx","required":true,"help":"The Auth key for tailscale","input_type":"password","options":[],"validator_regex":"^tskey-[\\w\\-]{0,100}","validator_regex_description":"Alphanumeric, including underscores and hyphens, Max 100 characters. Must start with tskey-","display_if":[{"key":"vpn_service","value_regex":"tailscale"}]},{"key":"openvpn_config","label":"OpenVPN Conf","value":null,"allow_saving":true,"placeholder":"OpenVPN configuration details","required":true,"help":"The OpenVPN Connection Configuration","input_type":"passwordtextarea","options":[],"validator_regex":null,"validator_regex_description":null,"display_if":[{"key":"vpn_service","value_regex":"openvpn"}]},{"key":"openvpn_username","label":"OpenVPN Username","value":null,"allow_saving":true,"placeholder":"username","required":true,"help":"The OpenVPN Service Username","input_type":"text","options":[],"validator_regex":null,"validator_regex_description":null,"display_if":[{"key":"vpn_service","value_regex":"openvpn"}]},{"key":"openvpn_password","label":"OpenVPN Password","value":null,"allow_saving":true,"placeholder":"password","required":true,"help":"The OpenVPN Service Password","input_type":"password","options":[],"validator_regex":null,"validator_regex_description":null,"display_if":[[{"key":"vpn_service","value_regex":"openvpn"}]]},{"key":"wireguard_config","label":"WireGuard Conf","value":null,"allow_saving":true,"placeholder":null,"required":true,"help":"The WireGuard Connection Configuration","input_type":"passwordtextarea","options":[],"validator_regex":null,"validator_regex_description":null,"display_if":[{"key":"vpn_service","value_regex":"wireguard"}]}]},"compatibility":[{"version":"1.16.x","image":"kasmweb/ubuntu-focal-desktop-vpn:1.16.1-rolling-daily","uncompressed_size_mb":4535,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily"]}],"sha":"4d11b69f75e99a7efc0364288eaadbe572a69b47"},{"description":"Ubuntu is a Linux distribution based on Debian.","docker_registry":"https://index.docker.io/v1/","image_src":"ubuntu.png","run_config":{"hostname":"kasm"},"categories":["Desktop","Productivity","Development"],"friendly_name":"Ubuntu Focal","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/ubuntu-focal-desktop:1.16.1-rolling-daily","uncompressed_size_mb":4483,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily"]}],"sha":"00d8ab9188212fdd35370215f2e7c5126d951f26"},{"description":"Ubuntu is a Linux distribution based on Debian. This container includes Ubuntu Jammy with tools for using popular VPN services.","docker_registry":"https://index.docker.io/v1/","image_src":"ubuntu.png","run_config":{"environment":{"TAILSCALE_KEY":"","SHOW_VPN_STATUS":"1","SHOW_IP_STATUS":"1"},"sysctls":{"net.ipv4.conf.all.src_valid_mark":1},"dns":["8.8.8.8","8.8.4.4"]},"exec_config":{"first_launch":{"user":"root","privileged":true,"cmd":"bash -c '/usr/bin/desktop_ready && /dockerstartup/start_vpn.sh'"}},"categories":["Desktop","Productivity","Development"],"friendly_name":"Ubuntu Jammy VPN","architecture":["amd64","arm64"],"launch_config":{"file_mapping":{"destination":"/dockerstartup/launch_selections.json"},"launch_form":[{"key":"vpn_service","label":"VPN Service","value":null,"allow_saving":true,"required":true,"placeholder":null,"help":"Select the desired VPN service to use","input_type":"select","options":[{"value":"openvpn","label":"OpenVPN"},{"value":"tailscale","label":"TailScale"},{"value":"wireguard","label":"WireGuard"}],"validator_regex":null,"validator_regex_description":null,"display_if":null},{"key":"tailscale_key","label":"Tailscale Auth Key","value":null,"allow_saving":true,"placeholder":"tskey-xxx","required":true,"help":"The Auth key for tailscale","input_type":"password","options":[],"validator_regex":"^tskey-[\\w\\-]{0,100}","validator_regex_description":"Alphanumeric, including underscores and hyphens, Max 100 characters. Must start with tskey-","display_if":[{"key":"vpn_service","value_regex":"tailscale"}]},{"key":"openvpn_config","label":"OpenVPN Conf","value":null,"allow_saving":true,"placeholder":"OpenVPN configuration details","required":true,"help":"The OpenVPN Connection Configuration","input_type":"passwordtextarea","options":[],"validator_regex":null,"validator_regex_description":null,"display_if":[{"key":"vpn_service","value_regex":"openvpn"}]},{"key":"openvpn_username","label":"OpenVPN Username","value":null,"allow_saving":true,"placeholder":"username","required":true,"help":"The OpenVPN Service Username","input_type":"text","options":[],"validator_regex":null,"validator_regex_description":null,"display_if":[{"key":"vpn_service","value_regex":"openvpn"}]},{"key":"openvpn_password","label":"OpenVPN Password","value":null,"allow_saving":true,"placeholder":"password","required":true,"help":"The OpenVPN Service Password","input_type":"password","options":[],"validator_regex":null,"validator_regex_description":null,"display_if":[[{"key":"vpn_service","value_regex":"openvpn"}]]},{"key":"wireguard_config","label":"WireGuard Conf","value":null,"allow_saving":true,"placeholder":null,"required":true,"help":"The WireGuard Connection Configuration","input_type":"passwordtextarea","options":[],"validator_regex":null,"validator_regex_description":null,"display_if":[{"key":"vpn_service","value_regex":"wireguard"}]}]},"compatibility":[{"version":"1.16.x","image":"kasmweb/ubuntu-jammy-desktop-vpn:develop","uncompressed_size_mb":8837,"available_tags":["develop","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/ubuntu-jammy-desktop-vpn:1.17.0-rolling-daily","uncompressed_size_mb":8837,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/ubuntu-jammy-desktop-vpn:1.18.0-rolling-daily","uncompressed_size_mb":8631,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/ubuntu-jammy-desktop-vpn:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"3871909458b1001317f06b2848425bfed16d67f1"},{"description":"Ubuntu is a Linux distribution based on Debian.","docker_registry":"https://index.docker.io/v1/","image_src":"ubuntu.png","run_config":{"hostname":"kasm"},"categories":["Desktop","Productivity","Development"],"notes":"The Kasm Ubuntu Jammy Workspace requires libseccomp => 2.5.3 to run.\n\nThis can be checked by running runc --version\n\nIf you still want to run Ubuntu Jammy but do not have the minimum required libseccomp version, it can be run in an unsecure manner by adding: {\"security_opt\":[\"seccomp=unconfined\"]} to the Docker Run Config Override (JSON) setting above.\n\nNOTE: This will run the Workspace without the docker seccomp sandbox and will significantly reduce the amount of protection that Kasm Workspaces can provide.\n","friendly_name":"Ubuntu Jammy","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/ubuntu-jammy-desktop:1.16.1-rolling-daily","uncompressed_size_mb":4446,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/ubuntu-jammy-desktop:1.17.0-rolling-daily","uncompressed_size_mb":8572,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/ubuntu-jammy-desktop:1.18.0-rolling-daily","uncompressed_size_mb":8572,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/ubuntu-jammy-desktop:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"9b8bca7126916fef517ae1ae43c9185b6eeeaf4c"},{"description":"Ubuntu is a Linux distribution based on Debian.","docker_registry":"https://index.docker.io/v1/","image_src":"ubuntu.png","run_config":{"hostname":"kasm"},"categories":["Desktop","Productivity","Development"],"notes":"The Kasm Ubuntu Noble Workspace requires libseccomp => 2.5.3 to run.\n\nThis can be checked by running runc --version\n\nIf you still want to run Ubuntu Noble but do not have the minimum required libseccomp version, it can be run in an unsecure manner by adding: {\"security_opt\":[\"seccomp=unconfined\"]} to the Docker Run Config Override (JSON) setting above.\n\nNOTE: This will run the Workspace without the docker seccomp sandbox and will significantly reduce the amount of protection that Kasm Workspaces can provide.\n","friendly_name":"Ubuntu Noble","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/ubuntu-noble-desktop:1.16.1-rolling-daily","uncompressed_size_mb":5415,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/ubuntu-noble-desktop:1.17.0-rolling-daily","uncompressed_size_mb":8859,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/ubuntu-noble-desktop:1.18.0-rolling-daily","uncompressed_size_mb":8859,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/ubuntu-noble-desktop:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"874f49fd4c62eb787ac07f4bc8566dd5349a25cd"},{"description":"Unity Hub manages multiple installations of Unity Editor, the world’s most popular development platform for creating 2D and 3D multiplatform games and interactive experiences.","docker_registry":"https://index.docker.io/v1/","image_src":"unityhub.png","categories":["Multimedia","Development"],"friendly_name":"Unity Hub","architecture":["amd64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/unityhub:1.16.1-rolling-daily","uncompressed_size_mb":3607,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/unityhub:1.17.0-rolling-daily","uncompressed_size_mb":3478,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/unityhub:1.18.0-rolling-daily","uncompressed_size_mb":3478,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/unityhub:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"922ce54936e3a925ccd7a8002afb233abb875008"},{"description":"Visual Studio Code is a code editor redefined and optimized for building and debugging modern web and cloud applications.","docker_registry":"https://index.docker.io/v1/","image_src":"vs-code.png","categories":["Development"],"friendly_name":"Visual Studio Code","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/vs-code:1.16.1-rolling-daily","uncompressed_size_mb":2738,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/vs-code:1.17.0-rolling-daily","uncompressed_size_mb":3593,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/vs-code:1.18.0-rolling-daily","uncompressed_size_mb":3593,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/vs-code:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"5ca70b8b6211685e36cf7453b22826a3070ec5a4"},{"description":"Vivaldi is a freeware, cross-platform web browser developed by Vivaldi Technologies.","docker_registry":"https://index.docker.io/v1/","image_src":"vivaldi.svg","run_config":{"hostname":"kasm"},"exec_config":{"go":{"cmd":"bash -c '/dockerstartup/custom_startup.sh --go --url \"$KASM_URL\"'"},"assign":{"cmd":"bash -c '/dockerstartup/custom_startup.sh --assign --url \"$KASM_URL\"'"}},"categories":["Browser"],"friendly_name":"Vivaldi","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/vivaldi:1.16.1-rolling-daily","uncompressed_size_mb":2758,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/vivaldi:1.17.0-rolling-daily","uncompressed_size_mb":2980,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/vivaldi:1.18.0-rolling-daily","uncompressed_size_mb":2980,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/vivaldi:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"24fc9dea90e7ae196c3b5ce5b3d51f0eec72c309"},{"description":"VLC media player is a free and open-source, portable, cross-platform media player software, and streaming media server.","docker_registry":"https://kcr.kasmweb.com/v1/","image_src":"vlc.png","categories":["Multimedia"],"friendly_name":"VLC","architecture":["amd64","arm64"],"compatibility":[{"version":"1.16.x","image":"kcr.kasmweb.com/kasmweb/vlc:1.16.1-rolling-daily","uncompressed_size_mb":2453,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kcr.kasmweb.com/kasmweb/vlc:1.17.0-rolling-daily","uncompressed_size_mb":2726,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/vlc:1.18.0-rolling-daily","uncompressed_size_mb":2726,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/vlc:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"ecb59b94f7ccee30f18ad5519092dd6a2f5c86b6"},{"description":"Videotelephony and online chat services.","docker_registry":"https://index.docker.io/v1/","run_config":{"security_opt":["seccomp=unconfined"]},"image_src":"zoom.png","categories":["Communication"],"notes":"The Kasm Zoom Workspace requires libseccomp => 2.5.3 to run.\n\nThis can be checked by running runc --version\n\nIf you still want to run Zoom but do not have the minimum required libseccomp version, it can be run in an unsecure manner by adding: {\"security_opt\":[\"seccomp=unconfined\"]} to the Docker Run Config Override (JSON) setting above.\n\nNOTE: This will run the Workspace without the docker seccomp sandbox and will significantly reduce the amount of protection that Kasm Workspaces can provide.\n","friendly_name":"Zoom","architecture":["amd64"],"compatibility":[{"version":"1.16.x","image":"kasmweb/zoom:1.16.1-rolling-daily","uncompressed_size_mb":3791,"available_tags":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly"]},{"version":"1.17.0","image":"kasmweb/zoom:1.17.0-rolling-daily","uncompressed_size_mb":3893,"available_tags":["develop","1.17.0","1.17.0-rolling-weekly","1.17.0-rolling-daily"]},{"version":"1.18.x","image":"kasmweb/zoom:1.18.0-rolling-daily","uncompressed_size_mb":3893,"available_tags":["develop","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"]},{"version":"1.19.0","image":"kasmweb/zoom:develop","uncompressed_size_mb":0,"available_tags":["develop"]}],"sha":"6173eeff3406ca77c65c0aced34368ef2c967178"}],"channels":["develop","1.16.0","1.16.0-rolling-weekly","1.16.0-rolling-daily","1.16.1","1.16.1-rolling-weekly","1.16.1-rolling-daily","1.17.0-rolling-weekly","1.17.0","1.17.0-rolling-daily","1.18.0","1.18.0-rolling-weekly","1.18.0-rolling-daily"],"default_channel":"1.18.0-rolling-weekly","signature":"eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJoYXNoIjoiMzVmMmNlODQwYjk0MWEyZjUzYWUwZWZiYTUzNWZkMTg0YjNmYTI1MjE5YzdjMWVlNTEwNjI5YTYzZmY2YzVkYyIsImlhdCI6MTc3MzEzNDg1M30.KCamlBsmgP77-uR_HMpZpfpRpYc24BRmg5fRG46R1Y3BZjVlXgfgkhMv6oSzWYgGzE8secGbjYBpjScHM9S_Hw"} \ No newline at end of file diff --git a/package.json b/package.json index d58376d..1b39770 100644 --- a/package.json +++ b/package.json @@ -8,11 +8,8 @@ }, "author": "", "license": "MIT", - "engines": { - "node": ">=18" - }, "dependencies": { - "dockerode": "^4.0.10", + "dockerode": "^3.3.2", "express": "^4.18.1", "js-yaml": "^4.1.0", "lodash": "^4.17.21", diff --git a/public/css/index.css b/public/css/index.css index 8dc5770..35d97af 100644 --- a/public/css/index.css +++ b/public/css/index.css @@ -2,17 +2,17 @@ display: none; position: fixed; width: 100%; - height: calc(100% - 65px); + height: calc(100% - 50px); left: 0; - top: 65px; + top: 50px; } #container { position: fixed; width: 100%; - height: calc(100% - 65px); + height: calc(100% - 50px); left: 0; - top: 65px; + top: 50px; overflow: auto; } @@ -25,12 +25,12 @@ top: 10%; left: 50%; transform: translate(-50%, -10%); - max-width: 740px; + box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2); } #EULAButton { position: absolute; - bottom: 0%; + top: 90%; left: 50%; transform: translate(-50%, -90%); box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2); @@ -38,10 +38,10 @@ #titleBar { width: 100%; - height: 65px; + height: 50px; + background: #595959; color: white; display: inline-block; - border-bottom: 1px solid #ffffff26; } form { @@ -52,16 +52,16 @@ form { #title { float: right; - height: 65px; - line-height: 65px; + height: 50px; + line-height: 50px; text-align: center; margin-right: 10px; } #logo { - width: 170px; - height: 35px; - margin: 15px; + width: 138px; + height: 40px; + margin: 5px; } .center { @@ -115,38 +115,3 @@ form { height: 100px; } - -fieldset { - background: #2b3352b3; - border: 1px solid #334155b3; - border-radius: 8px; -} - -input[type=email], input[type=number], input[type=password], input[type=search], input[type=text] { - border-radius: 0.25rem; - border: 1px solid #ffffff26; - border-radius: 5px; - background: #0f172ab3; - width: 100%; - padding: 0.75rem; - font-size: 1rem; -} -input::placeholder { - color: var(--font-color)!important; - opacity: 0.7; /* Firefox reduces opacity by default */ -} - -label { - font-weight: bold; - margin-bottom:0.5rem; - display: inline-block; -} - -legend { - font-size: 1.125rem; - background: #2b3352b3; - border: 1px solid #334155b3; - border-radius: 8px; - padding: 5px 20px; - -} \ No newline at end of file diff --git a/public/css/terminal.css b/public/css/terminal.css index 944d6c1..9808c9d 100644 --- a/public/css/terminal.css +++ b/public/css/terminal.css @@ -1 +1 @@ -:root{--global-font-size:15px;--global-line-height:1.4em;--global-space:10px;--font-stack:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--mono-font-stack:Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace,serif;--background-color:#21273f;--page-width:60em;--font-color:#b7cfec;--invert-font-color:#fff;--primary-color:#1a95e0;--secondary-color:#727578;--error-color:#d20962;--progress-bar-background:#727578;--progress-bar-fill:#151515;--code-bg-color:#e8eff2;--input-style:solid;--display-h1-decoration:none}*{box-sizing:border-box;text-rendering:geometricPrecision}::-moz-selection{background:var(--primary-color);color:var(--invert-font-color)}::selection{background:var(--primary-color);color:var(--invert-font-color)}body{font-size:var(--global-font-size);color:var(--font-color);line-height:var(--global-line-height);margin:0;font-family:var(--font-stack);word-wrap:break-word;background-color:var(--background-color)}.logo,h1,h2,h3,h4,h5,h6{line-height:var(--global-line-height)}a{cursor:pointer;color:var(--primary-color);text-decoration:none}a:hover{background-color:var(--primary-color);color:var(--invert-font-color)}em{font-size:var(--global-font-size);font-style:italic;font-family:var(--font-stack);color:var(--font-color)}blockquote,code,em,strong{line-height:var(--global-line-height)}.logo,blockquote,code,footer,h1,h2,h3,h4,h5,h6,header,li,ol,p,section,ul{float:none;margin:0;padding:0}.logo,blockquote,h1,ol,p,ul{margin-top:calc(var(--global-space) * 2);margin-bottom:calc(var(--global-space) * 2)}.logo,h1{position:relative;display:inline-block;display:table-cell;padding:calc(var(--global-space) * 2) 0 calc(var(--global-space) * 2);margin:0;overflow:hidden;font-weight:600}h1::after{content:"====================================================================================================";position:absolute;bottom:5px;left:0;display:var(--display-h1-decoration)}.logo+*,h1+*{margin-top:0}h2,h3,h4,h5,h6{position:relative;margin-bottom:var(--global-line-height);font-weight:600}blockquote{position:relative;padding-left:calc(var(--global-space) * 2);padding-left:2ch;overflow:hidden}blockquote::after{content:">\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>";white-space:pre;position:absolute;top:0;left:0;line-height:var(--global-line-height);color:#9ca2ab}code{font-weight:inherit;background-color:var(--code-bg-color);font-family:var(--mono-font-stack)}code::after,code::before{content:"`";display:inline}pre code::after,pre code::before{content:""}pre{display:block;word-break:break-all;word-wrap:break-word;color:var(--secondary-color);background-color:var(--background-color);border:1px solid var(--secondary-color);padding:var(--global-space);white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap}pre code{overflow-x:scroll;padding:0;margin:0;display:inline-block;min-width:100%;font-family:var(--mono-font-stack)}.terminal .logo,.terminal blockquote,.terminal code,.terminal h1,.terminal h2,.terminal h3,.terminal h4,.terminal h5,.terminal h6,.terminal strong{font-size:var(--global-font-size);font-style:normal;font-family:var(--font-stack);color:var(--font-color)}.terminal-prompt{position:relative;white-space:nowrap}.terminal-prompt::before{content:"> "}.terminal-prompt::after{content:"";-webkit-animation:cursor .8s infinite;animation:cursor .8s infinite;background:var(--primary-color);border-radius:0;display:inline-block;height:1em;margin-left:.2em;width:3px;bottom:-2px;position:relative}@-webkit-keyframes cursor{0%{opacity:0}50%{opacity:1}to{opacity:0}}@keyframes cursor{0%{opacity:0}50%{opacity:1}to{opacity:0}}li,li>ul>li{position:relative;display:block;padding-left:calc(var(--global-space) * 2)}nav>ul>li{padding-left:0}li::after{position:absolute;top:0;left:0}ul>li::after{content:"-"}nav ul>li::after{content:""}ol li::before{content:counters(item, ".") ". ";counter-increment:item}ol ol li::before{content:counters(item, ".") " ";counter-increment:item}.terminal-menu li::after,.terminal-menu li::before{display:none}ol{counter-reset:item}ol li:nth-child(n+10)::after{left:-7px}ol ol{margin-top:0;margin-bottom:0}.terminal-menu{width:100%}.terminal-nav{display:flex;flex-direction:column;align-items:flex-start}ul ul{margin-top:0;margin-bottom:0}.terminal-menu ul{list-style-type:none;padding:0!important;display:flex;flex-direction:column;width:100%;flex-grow:1;font-size:var(--global-font-size);margin-top:0}.terminal-menu li{display:flex;margin:0 0 .5em 0;padding:0}ol.terminal-toc li{border-bottom:1px dotted var(--secondary-color);padding:0;margin-bottom:15px}.terminal-menu li:last-child{margin-bottom:0}ol.terminal-toc li a{margin:4px 4px 4px 0;background:var(--background-color);position:relative;top:6px;text-align:left;padding-right:4px}.terminal-menu li a:not(.btn){text-decoration:none;display:block;width:100%;border:none;color:var(--secondary-color)}.terminal-menu li a.active{color:var(--font-color)}.terminal-menu li a:hover{background:0 0;color:inherit}ol.terminal-toc li::before{content:counters(item, ".") ". ";counter-increment:item;position:absolute;right:0;background:var(--background-color);padding:4px 0 4px 4px;bottom:-8px}ol.terminal-toc li a:hover{background:var(--primary-color);color:var(--invert-font-color)}hr{position:relative;overflow:hidden;margin:calc(var(--global-space) * 4) 0;border:0;border-bottom:1px dashed var(--secondary-color)}p{margin:0 0 var(--global-line-height);color:var(--global-font-color)}.container{max-width:var(--page-width)}.container,.container-fluid{margin:0 auto;padding:0 calc(var(--global-space) * 2)}img{width:100%}.progress-bar{height:8px;background-color:var(--progress-bar-background);margin:12px 0}.progress-bar.progress-bar-show-percent{margin-top:38px}.progress-bar-filled{background-color:var(--progress-bar-fill);height:100%;transition:width .3s ease;position:relative;width:0}.progress-bar-filled::before{content:"";border:6px solid transparent;border-top-color:var(--progress-bar-fill);position:absolute;top:-12px;right:-6px}.progress-bar-filled::after{color:var(--progress-bar-fill);content:attr(data-filled);display:block;font-size:12px;white-space:nowrap;position:absolute;border:6px solid transparent;top:-38px;right:0;transform:translateX(50%)}.progress-bar-no-arrow>.progress-bar-filled::after,.progress-bar-no-arrow>.progress-bar-filled::before{content:"";display:none;visibility:hidden;opacity:0}table{width:100%;border-collapse:collapse;color:var(--font-color);font-size:var(--global-font-size)}table td,table th{vertical-align:top;border:1px solid var(--font-color);line-height:var(--global-line-height);padding:calc(var(--global-space)/ 2);font-size:1em}table thead th{font-size:1em}table tfoot tr th{font-weight:500}table caption{font-size:1em;margin:0 0 1em 0}table tbody td:first-child{font-weight:700;color:var(--secondary-color)}.form{width:100%}fieldset{border:1px solid var(--font-color);padding:1em}label{font-size:1em;color:var(--font-color)}input[type=email],input[type=number],input[type=password],input[type=search],input[type=text]{border:1px var(--input-style) var(--font-color);width:100%;padding:.7em .5em;font-size:1em;font-family:var(--font-stack);-webkit-appearance:none;border-radius:0}input[type=email]:active,input[type=email]:focus,input[type=number]:active,input[type=number]:focus,input[type=password]:active,input[type=password]:focus,input[type=search]:active,input[type=search]:focus,input[type=text]:active,input[type=text]:focus{outline:0;-webkit-appearance:none;border:1px solid var(--font-color)}input[type=email]:not(:placeholder-shown):invalid,input[type=number]:not(:placeholder-shown):invalid,input[type=password]:not(:placeholder-shown):invalid,input[type=search]:not(:placeholder-shown):invalid,input[type=text]:not(:placeholder-shown):invalid{border-color:var(--error-color)}input,textarea{color:var(--font-color);background-color:var(--background-color)}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:var(--secondary-color)!important;opacity:1}input::-moz-placeholder,textarea::-moz-placeholder{color:var(--secondary-color)!important;opacity:1}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--secondary-color)!important;opacity:1}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--secondary-color)!important;opacity:1}input::placeholder,textarea::placeholder{color:var(--secondary-color)!important;opacity:1}textarea{height:auto;width:100%;resize:none;border:1px var(--input-style) var(--font-color);padding:.5em;font-size:1em;font-family:var(--font-stack);-webkit-appearance:none;border-radius:0}textarea:focus{outline:0;-webkit-appearance:none;border:1px solid var(--font-color)}textarea:not(:placeholder-shown):invalid{border-color:var(--error-color)}input:-webkit-autofill,input:-webkit-autofill:focus textarea:-webkit-autofill,input:-webkit-autofill:hover,select:-webkit-autofill,select:-webkit-autofill:focus,select:-webkit-autofill:hover,textarea:-webkit-autofill:hover textarea:-webkit-autofill:focus{border:1px solid var(--font-color);-webkit-text-fill-color:var(--font-color);box-shadow:0 0 0 1000px var(--invert-font-color) inset;-webkit-box-shadow:0 0 0 1000px var(--invert-font-color) inset;transition:background-color 5000s ease-in-out 0s}.form-group{margin-bottom:var(--global-line-height);overflow:auto}.btn{border-style:solid;border-width:1px;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;outline:0;padding:.65em 2em;font-size:1em;font-family:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;z-index:1}.btn:active{box-shadow:none}.btn.btn-ghost{border-color:var(--font-color);color:var(--font-color);background-color:transparent}.btn.btn-ghost:focus,.btn.btn-ghost:hover{border-color:var(--tertiary-color);color:var(--tertiary-color);z-index:2}.btn.btn-ghost:hover{background-color:transparent}.btn-block{width:100%;display:flex}.btn-default{background-color:var(--font-color);border-color:var(--invert-font-color);color:var(--invert-font-color)}.btn-default:focus:not(.btn-ghost),.btn-default:hover{background-color:var(--secondary-color);color:var(--invert-font-color)}.btn-default.btn-ghost:focus,.btn-default.btn-ghost:hover{border-color:var(--secondary-color);color:var(--secondary-color);z-index:2}.btn-error{color:var(--invert-font-color);background-color:var(--error-color);border:1px solid var(--error-color)}.btn-error:focus:not(.btn-ghost),.btn-error:hover{background-color:var(--error-color);border-color:var(--error-color)}.btn-error.btn-ghost{border-color:var(--error-color);color:var(--error-color)}.btn-error.btn-ghost:focus,.btn-error.btn-ghost:hover{border-color:var(--error-color);color:var(--error-color);z-index:2}.btn-primary{color:var(--invert-font-color);background-color:var(--primary-color);border:1px solid var(--primary-color)}.btn-primary:focus:not(.btn-ghost),.btn-primary:hover{background-color:var(--primary-color);border-color:var(--primary-color)}.btn-primary.btn-ghost{border-color:var(--primary-color);color:var(--primary-color)}.btn-primary.btn-ghost:focus,.btn-primary.btn-ghost:hover{border-color:var(--primary-color);color:var(--primary-color);z-index:2}.btn-small{padding:.5em 1.3em!important;font-size:.9em!important}.btn-group{overflow:auto}.btn-group .btn{float:left}.btn-group .btn-ghost:not(:first-child){margin-left:-1px}.terminal-card{border:1px solid var(--secondary-color)}.terminal-card>header{color:var(--invert-font-color);text-align:center;background-color:var(--secondary-color);padding:.5em 0}.terminal-card>div:first-of-type{padding:var(--global-space)}.terminal-timeline{position:relative;padding-left:70px}.terminal-timeline::before{content:' ';background:var(--secondary-color);display:inline-block;position:absolute;left:35px;width:2px;height:100%;z-index:400}.terminal-timeline .terminal-card{margin-bottom:25px}.terminal-timeline .terminal-card::before{content:' ';background:var(--invert-font-color);border:2px solid var(--secondary-color);display:inline-block;position:absolute;margin-top:25px;left:26px;width:15px;height:15px;z-index:400}.terminal-alert{color:var(--font-color);padding:1em;border:1px solid var(--font-color);margin-bottom:var(--global-space)}.terminal-alert-error{color:var(--error-color);border-color:var(--error-color)}.terminal-alert-primary{color:var(--primary-color);border-color:var(--primary-color)}@media screen and (max-width:960px){label{display:block;width:100%}pre::-webkit-scrollbar{height:3px}}@media screen and (max-width:480px){form{width:100%}}@media only screen and (min-width:30em){.terminal-nav{flex-direction:row;align-items:center}.terminal-menu ul{flex-direction:row;justify-items:flex-end;align-items:center;justify-content:flex-end;margin-top:calc(var(--global-space) * 2)}.terminal-menu li{margin:0;margin-right:2em}.terminal-menu li:last-child{margin-right:0}}.terminal-media:not(:last-child){margin-bottom:1.25rem}.terminal-media-left{padding-right:var(--global-space)}.terminal-media-left,.terminal-media-right{display:table-cell;vertical-align:top}.terminal-media-right{padding-left:var(--global-space)}.terminal-media-body{display:table-cell;vertical-align:top}.terminal-media-heading{font-size:1em;font-weight:700}.terminal-media-content{margin-top:.3rem}.terminal-placeholder{background-color:var(--secondary-color);text-align:center;color:var(--font-color);font-size:1rem;border:1px solid var(--secondary-color)}figure>img{padding:0}.terminal-avatarholder{width:calc(var(--global-space) * 5);height:calc(var(--global-space) * 5)}.terminal-avatarholder img{padding:0}figure{margin:0}figure>figcaption{color:var(--secondary-color);text-align:center}.hljs{display:block;overflow-x:auto;padding:.5em;background:var(--block-background-color);color:var(--font-color)}.hljs-comment,.hljs-quote{color:var(--secondary-color)}.hljs-variable{color:var(--font-color)}.hljs-built_in,.hljs-keyword,.hljs-name,.hljs-selector-tag,.hljs-tag{color:var(--primary-color)}.hljs-addition,.hljs-attribute,.hljs-literal,.hljs-section,.hljs-string,.hljs-template-tag,.hljs-template-variable,.hljs-title,.hljs-type{color:var(--secondary-color)}.hljs-string{color:var(--secondary-color)}.hljs-deletion,.hljs-meta,.hljs-selector-attr,.hljs-selector-pseudo{color:var(--primary-color)}.hljs-doctag{color:var(--secondary-color)}.hljs-attr{color:var(--primary-color)}.hljs-bullet,.hljs-link,.hljs-symbol{color:var(--primary-color)}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700} +:root{--global-font-size:15px;--global-line-height:1.4em;--global-space:10px;--font-stack:Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace,serif;--mono-font-stack:Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace,serif;--background-color:#fff;--page-width:60em;--font-color:#151515;--invert-font-color:#fff;--primary-color:#1a95e0;--secondary-color:#727578;--error-color:#d20962;--progress-bar-background:#727578;--progress-bar-fill:#151515;--code-bg-color:#e8eff2;--input-style:solid;--display-h1-decoration:none}*{box-sizing:border-box;text-rendering:geometricPrecision}::-moz-selection{background:var(--primary-color);color:var(--invert-font-color)}::selection{background:var(--primary-color);color:var(--invert-font-color)}body{font-size:var(--global-font-size);color:var(--font-color);line-height:var(--global-line-height);margin:0;font-family:var(--font-stack);word-wrap:break-word;background-color:var(--background-color)}.logo,h1,h2,h3,h4,h5,h6{line-height:var(--global-line-height)}a{cursor:pointer;color:var(--primary-color);text-decoration:none}a:hover{background-color:var(--primary-color);color:var(--invert-font-color)}em{font-size:var(--global-font-size);font-style:italic;font-family:var(--font-stack);color:var(--font-color)}blockquote,code,em,strong{line-height:var(--global-line-height)}.logo,blockquote,code,footer,h1,h2,h3,h4,h5,h6,header,li,ol,p,section,ul{float:none;margin:0;padding:0}.logo,blockquote,h1,ol,p,ul{margin-top:calc(var(--global-space) * 2);margin-bottom:calc(var(--global-space) * 2)}.logo,h1{position:relative;display:inline-block;display:table-cell;padding:calc(var(--global-space) * 2) 0 calc(var(--global-space) * 2);margin:0;overflow:hidden;font-weight:600}h1::after{content:"====================================================================================================";position:absolute;bottom:5px;left:0;display:var(--display-h1-decoration)}.logo+*,h1+*{margin-top:0}h2,h3,h4,h5,h6{position:relative;margin-bottom:var(--global-line-height);font-weight:600}blockquote{position:relative;padding-left:calc(var(--global-space) * 2);padding-left:2ch;overflow:hidden}blockquote::after{content:">\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>\A>";white-space:pre;position:absolute;top:0;left:0;line-height:var(--global-line-height);color:#9ca2ab}code{font-weight:inherit;background-color:var(--code-bg-color);font-family:var(--mono-font-stack)}code::after,code::before{content:"`";display:inline}pre code::after,pre code::before{content:""}pre{display:block;word-break:break-all;word-wrap:break-word;color:var(--secondary-color);background-color:var(--background-color);border:1px solid var(--secondary-color);padding:var(--global-space);white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap}pre code{overflow-x:scroll;padding:0;margin:0;display:inline-block;min-width:100%;font-family:var(--mono-font-stack)}.terminal .logo,.terminal blockquote,.terminal code,.terminal h1,.terminal h2,.terminal h3,.terminal h4,.terminal h5,.terminal h6,.terminal strong{font-size:var(--global-font-size);font-style:normal;font-family:var(--font-stack);color:var(--font-color)}.terminal-prompt{position:relative;white-space:nowrap}.terminal-prompt::before{content:"> "}.terminal-prompt::after{content:"";-webkit-animation:cursor .8s infinite;animation:cursor .8s infinite;background:var(--primary-color);border-radius:0;display:inline-block;height:1em;margin-left:.2em;width:3px;bottom:-2px;position:relative}@-webkit-keyframes cursor{0%{opacity:0}50%{opacity:1}to{opacity:0}}@keyframes cursor{0%{opacity:0}50%{opacity:1}to{opacity:0}}li,li>ul>li{position:relative;display:block;padding-left:calc(var(--global-space) * 2)}nav>ul>li{padding-left:0}li::after{position:absolute;top:0;left:0}ul>li::after{content:"-"}nav ul>li::after{content:""}ol li::before{content:counters(item, ".") ". ";counter-increment:item}ol ol li::before{content:counters(item, ".") " ";counter-increment:item}.terminal-menu li::after,.terminal-menu li::before{display:none}ol{counter-reset:item}ol li:nth-child(n+10)::after{left:-7px}ol ol{margin-top:0;margin-bottom:0}.terminal-menu{width:100%}.terminal-nav{display:flex;flex-direction:column;align-items:flex-start}ul ul{margin-top:0;margin-bottom:0}.terminal-menu ul{list-style-type:none;padding:0!important;display:flex;flex-direction:column;width:100%;flex-grow:1;font-size:var(--global-font-size);margin-top:0}.terminal-menu li{display:flex;margin:0 0 .5em 0;padding:0}ol.terminal-toc li{border-bottom:1px dotted var(--secondary-color);padding:0;margin-bottom:15px}.terminal-menu li:last-child{margin-bottom:0}ol.terminal-toc li a{margin:4px 4px 4px 0;background:var(--background-color);position:relative;top:6px;text-align:left;padding-right:4px}.terminal-menu li a:not(.btn){text-decoration:none;display:block;width:100%;border:none;color:var(--secondary-color)}.terminal-menu li a.active{color:var(--font-color)}.terminal-menu li a:hover{background:0 0;color:inherit}ol.terminal-toc li::before{content:counters(item, ".") ". ";counter-increment:item;position:absolute;right:0;background:var(--background-color);padding:4px 0 4px 4px;bottom:-8px}ol.terminal-toc li a:hover{background:var(--primary-color);color:var(--invert-font-color)}hr{position:relative;overflow:hidden;margin:calc(var(--global-space) * 4) 0;border:0;border-bottom:1px dashed var(--secondary-color)}p{margin:0 0 var(--global-line-height);color:var(--global-font-color)}.container{max-width:var(--page-width)}.container,.container-fluid{margin:0 auto;padding:0 calc(var(--global-space) * 2)}img{width:100%}.progress-bar{height:8px;background-color:var(--progress-bar-background);margin:12px 0}.progress-bar.progress-bar-show-percent{margin-top:38px}.progress-bar-filled{background-color:var(--progress-bar-fill);height:100%;transition:width .3s ease;position:relative;width:0}.progress-bar-filled::before{content:"";border:6px solid transparent;border-top-color:var(--progress-bar-fill);position:absolute;top:-12px;right:-6px}.progress-bar-filled::after{color:var(--progress-bar-fill);content:attr(data-filled);display:block;font-size:12px;white-space:nowrap;position:absolute;border:6px solid transparent;top:-38px;right:0;transform:translateX(50%)}.progress-bar-no-arrow>.progress-bar-filled::after,.progress-bar-no-arrow>.progress-bar-filled::before{content:"";display:none;visibility:hidden;opacity:0}table{width:100%;border-collapse:collapse;color:var(--font-color);font-size:var(--global-font-size)}table td,table th{vertical-align:top;border:1px solid var(--font-color);line-height:var(--global-line-height);padding:calc(var(--global-space)/ 2);font-size:1em}table thead th{font-size:1em}table tfoot tr th{font-weight:500}table caption{font-size:1em;margin:0 0 1em 0}table tbody td:first-child{font-weight:700;color:var(--secondary-color)}.form{width:100%}fieldset{border:1px solid var(--font-color);padding:1em}label{font-size:1em;color:var(--font-color)}input[type=email],input[type=number],input[type=password],input[type=search],input[type=text]{border:1px var(--input-style) var(--font-color);width:100%;padding:.7em .5em;font-size:1em;font-family:var(--font-stack);-webkit-appearance:none;border-radius:0}input[type=email]:active,input[type=email]:focus,input[type=number]:active,input[type=number]:focus,input[type=password]:active,input[type=password]:focus,input[type=search]:active,input[type=search]:focus,input[type=text]:active,input[type=text]:focus{outline:0;-webkit-appearance:none;border:1px solid var(--font-color)}input[type=email]:not(:placeholder-shown):invalid,input[type=number]:not(:placeholder-shown):invalid,input[type=password]:not(:placeholder-shown):invalid,input[type=search]:not(:placeholder-shown):invalid,input[type=text]:not(:placeholder-shown):invalid{border-color:var(--error-color)}input,textarea{color:var(--font-color);background-color:var(--background-color)}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:var(--secondary-color)!important;opacity:1}input::-moz-placeholder,textarea::-moz-placeholder{color:var(--secondary-color)!important;opacity:1}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--secondary-color)!important;opacity:1}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--secondary-color)!important;opacity:1}input::placeholder,textarea::placeholder{color:var(--secondary-color)!important;opacity:1}textarea{height:auto;width:100%;resize:none;border:1px var(--input-style) var(--font-color);padding:.5em;font-size:1em;font-family:var(--font-stack);-webkit-appearance:none;border-radius:0}textarea:focus{outline:0;-webkit-appearance:none;border:1px solid var(--font-color)}textarea:not(:placeholder-shown):invalid{border-color:var(--error-color)}input:-webkit-autofill,input:-webkit-autofill:focus textarea:-webkit-autofill,input:-webkit-autofill:hover,select:-webkit-autofill,select:-webkit-autofill:focus,select:-webkit-autofill:hover,textarea:-webkit-autofill:hover textarea:-webkit-autofill:focus{border:1px solid var(--font-color);-webkit-text-fill-color:var(--font-color);box-shadow:0 0 0 1000px var(--invert-font-color) inset;-webkit-box-shadow:0 0 0 1000px var(--invert-font-color) inset;transition:background-color 5000s ease-in-out 0s}.form-group{margin-bottom:var(--global-line-height);overflow:auto}.btn{border-style:solid;border-width:1px;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;outline:0;padding:.65em 2em;font-size:1em;font-family:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;z-index:1}.btn:active{box-shadow:none}.btn.btn-ghost{border-color:var(--font-color);color:var(--font-color);background-color:transparent}.btn.btn-ghost:focus,.btn.btn-ghost:hover{border-color:var(--tertiary-color);color:var(--tertiary-color);z-index:2}.btn.btn-ghost:hover{background-color:transparent}.btn-block{width:100%;display:flex}.btn-default{background-color:var(--font-color);border-color:var(--invert-font-color);color:var(--invert-font-color)}.btn-default:focus:not(.btn-ghost),.btn-default:hover{background-color:var(--secondary-color);color:var(--invert-font-color)}.btn-default.btn-ghost:focus,.btn-default.btn-ghost:hover{border-color:var(--secondary-color);color:var(--secondary-color);z-index:2}.btn-error{color:var(--invert-font-color);background-color:var(--error-color);border:1px solid var(--error-color)}.btn-error:focus:not(.btn-ghost),.btn-error:hover{background-color:var(--error-color);border-color:var(--error-color)}.btn-error.btn-ghost{border-color:var(--error-color);color:var(--error-color)}.btn-error.btn-ghost:focus,.btn-error.btn-ghost:hover{border-color:var(--error-color);color:var(--error-color);z-index:2}.btn-primary{color:var(--invert-font-color);background-color:var(--primary-color);border:1px solid var(--primary-color)}.btn-primary:focus:not(.btn-ghost),.btn-primary:hover{background-color:var(--primary-color);border-color:var(--primary-color)}.btn-primary.btn-ghost{border-color:var(--primary-color);color:var(--primary-color)}.btn-primary.btn-ghost:focus,.btn-primary.btn-ghost:hover{border-color:var(--primary-color);color:var(--primary-color);z-index:2}.btn-small{padding:.5em 1.3em!important;font-size:.9em!important}.btn-group{overflow:auto}.btn-group .btn{float:left}.btn-group .btn-ghost:not(:first-child){margin-left:-1px}.terminal-card{border:1px solid var(--secondary-color)}.terminal-card>header{color:var(--invert-font-color);text-align:center;background-color:var(--secondary-color);padding:.5em 0}.terminal-card>div:first-of-type{padding:var(--global-space)}.terminal-timeline{position:relative;padding-left:70px}.terminal-timeline::before{content:' ';background:var(--secondary-color);display:inline-block;position:absolute;left:35px;width:2px;height:100%;z-index:400}.terminal-timeline .terminal-card{margin-bottom:25px}.terminal-timeline .terminal-card::before{content:' ';background:var(--invert-font-color);border:2px solid var(--secondary-color);display:inline-block;position:absolute;margin-top:25px;left:26px;width:15px;height:15px;z-index:400}.terminal-alert{color:var(--font-color);padding:1em;border:1px solid var(--font-color);margin-bottom:var(--global-space)}.terminal-alert-error{color:var(--error-color);border-color:var(--error-color)}.terminal-alert-primary{color:var(--primary-color);border-color:var(--primary-color)}@media screen and (max-width:960px){label{display:block;width:100%}pre::-webkit-scrollbar{height:3px}}@media screen and (max-width:480px){form{width:100%}}@media only screen and (min-width:30em){.terminal-nav{flex-direction:row;align-items:center}.terminal-menu ul{flex-direction:row;justify-items:flex-end;align-items:center;justify-content:flex-end;margin-top:calc(var(--global-space) * 2)}.terminal-menu li{margin:0;margin-right:2em}.terminal-menu li:last-child{margin-right:0}}.terminal-media:not(:last-child){margin-bottom:1.25rem}.terminal-media-left{padding-right:var(--global-space)}.terminal-media-left,.terminal-media-right{display:table-cell;vertical-align:top}.terminal-media-right{padding-left:var(--global-space)}.terminal-media-body{display:table-cell;vertical-align:top}.terminal-media-heading{font-size:1em;font-weight:700}.terminal-media-content{margin-top:.3rem}.terminal-placeholder{background-color:var(--secondary-color);text-align:center;color:var(--font-color);font-size:1rem;border:1px solid var(--secondary-color)}figure>img{padding:0}.terminal-avatarholder{width:calc(var(--global-space) * 5);height:calc(var(--global-space) * 5)}.terminal-avatarholder img{padding:0}figure{margin:0}figure>figcaption{color:var(--secondary-color);text-align:center}.hljs{display:block;overflow-x:auto;padding:.5em;background:var(--block-background-color);color:var(--font-color)}.hljs-comment,.hljs-quote{color:var(--secondary-color)}.hljs-variable{color:var(--font-color)}.hljs-built_in,.hljs-keyword,.hljs-name,.hljs-selector-tag,.hljs-tag{color:var(--primary-color)}.hljs-addition,.hljs-attribute,.hljs-literal,.hljs-section,.hljs-string,.hljs-template-tag,.hljs-template-variable,.hljs-title,.hljs-type{color:var(--secondary-color)}.hljs-string{color:var(--secondary-color)}.hljs-deletion,.hljs-meta,.hljs-selector-attr,.hljs-selector-pseudo{color:var(--primary-color)}.hljs-doctag{color:var(--secondary-color)}.hljs-attr{color:var(--primary-color)}.hljs-bullet,.hljs-link,.hljs-symbol{color:var(--primary-color)}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700} diff --git a/public/img/logo.png b/public/img/logo.png new file mode 100644 index 0000000..1d37d0f Binary files /dev/null and b/public/img/logo.png differ diff --git a/public/img/logo.svg b/public/img/logo.svg deleted file mode 100644 index 5293b7a..0000000 --- a/public/img/logo.svg +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/index.html b/public/index.html index 3c90a5e..639912f 100644 --- a/public/index.html +++ b/public/index.html @@ -13,7 +13,7 @@
- +
diff --git a/public/js/index.js b/public/js/index.js index 77992ce..38635f7 100644 --- a/public/js/index.js +++ b/public/js/index.js @@ -1,21 +1,19 @@ // Variables -let EULA; -let images; -let gpus; -let term; -let installImages = []; -const installSettings = {}; -const upgradeSettings = {}; -let currentVersion = ''; -let isUpgrade = false; -let selected = false; +var EULA; +var images; +var gpus; +var term; +var installImages = []; +var installSettings = {}; +var upgradeSettings = {}; +var selected = false; // Socket.io connection -const host = window.location.hostname; -const port = window.location.port; -const protocol = window.location.protocol; -const path = window.location.pathname; -const socket = io(protocol + '//' + host + ':' + port, { path: path + 'socket.io'}); +var host = window.location.hostname; +var port = window.location.port; +var protocol = window.location.protocol; +var path = window.location.pathname; +var socket = io(protocol + '//' + host + ':' + port, { path: path + 'socket.io'}); //// Page Functions //// @@ -33,12 +31,8 @@ async function install() { if (installImages.length == 0) { socket.emit('install', [installSettings, false]); } else { - for (let image of installImages) { + for await (let image of installImages) { let srcImage = images.images.find(x => x.friendly_name === image); - if (!srcImage) { - alert('Error: image "' + image + '" not found. Please refresh and try again.'); - return; - } srcImage['enabled'] = true; selectedImages.images.push(srcImage); selectedImages.group_images.push({image_id: srcImage.image_id, group_id: "68d557ac-4cac-42cc-a9f3-1c7c853de0f3"}); @@ -49,10 +43,21 @@ async function install() { // Execute upgrade async function upgrade() { - isUpgrade = true; - showTerminal(); + showTerminal() titleChange('Upgrading'); - socket.emit('upgrade', [upgradeSettings, false]); + // Create new object based on image selection + let selectedImages = {alembic_version: images.alembic_version, images: [], group_images: []}; + if (installImages.length == 0) { + socket.emit('upgrade', [upgradeSettings, false]); + } else { + for await (let image of installImages) { + let srcImage = images.images.find(x => x.friendly_name === image); + srcImage['enabled'] = true; + selectedImages.images.push(srcImage); + selectedImages.group_images.push({image_id: srcImage.image_id, group_id: "68d557ac-4cac-42cc-a9f3-1c7c853de0f3"}); + } + socket.emit('upgrade', [upgradeSettings, selectedImages]); + } } // Show page container @@ -71,7 +76,7 @@ function showTerminal() { $('#terminal').empty(); $('#terminal').css('display', 'block'); term = new Terminal(); - let fitaddon = new FitAddon.FitAddon(); + fitaddon = new FitAddon.FitAddon(); term.loadAddon(fitaddon); term.open($('#terminal')[0]); fitaddon.fit(); @@ -83,18 +88,13 @@ function titleChange(value) { $('#title').text(value); } -function versionChange(ver, local) { - document.title = 'Kasm Wizard ' + ver + (local ? ' (local)' : ''); -} - // Render landing as installer page function renderInstall(data) { showContainer(); titleChange('EULA'); EULA = data[0]; images = data[1]; - gpus = data[2] || {}; - versionChange(data[3], data[4]); + gpus = data[2]; let EULADiv = $('
', {id: 'EULA'}).text(EULA); $('#container').append(EULADiv); let EULAButton = $('