Light Desktop

Reemo’s Light Desktop is a complete Linux desktop, exposed securely via a Reemo session directly in the user’s browser. It includes a browser, the ONLYOFFICE office suite, a PDF reader, an archive manager, and the KeePass password manager.

Unlike other images in the catalog, which publish one application, this one publishes the desktop itself: no application is launched at startup, the user opens the ones they need, arranges their windows, and keeps their files.

This guide covers first the deployment (administrator side), then usage in daily work (end user side).

Template

This template is importable from the Images page of the administration interface. Refer to the Import and Export of Images section for the import and update procedure.

{
  "name": "Light Desktop",
  "type": "ALU",
  "comments": "Light Desktop: XFCE + ONLYOFFICE + Chromium + 7zip + KeePass + PDF viewer. Optional persistent home directory.",
  "reference": "registry.reemo.io/reemosblightdesktop",
  "icon": "<svg width=\"512\" height=\"512\" viewBox=\"0 0 512 512\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n    <rect x=\"50\" y=\"150\" width=\"412\" height=\"300\" rx=\"20\" fill=\"#2496ED\"/>\n    <path d=\"M50 150L256 50L462 150\" stroke=\"#1D84D1\" stroke-width=\"10\" stroke-linejoin=\"round\"/>\n    \n    <rect x=\"120\" y=\"200\" width=\"272\" height=\"180\" rx=\"10\" fill=\"white\"/>\n    <rect x=\"135\" y=\"215\" width=\"242\" height=\"130\" rx=\"5\" fill=\"#f0f0f0\"/>\n    \n    <rect x=\"135\" y=\"325\" width=\"242\" height=\"20\" rx=\"2\" fill=\"#3D4C5F\"/>\n    \n    <circle cx=\"160\" cy=\"245\" r=\"15\" fill=\"#DE3121\"/> <circle cx=\"210\" cy=\"245\" r=\"15\" fill=\"#4285F4\"/> <circle cx=\"260\" cy=\"245\" r=\"15\" fill=\"#6FB342\"/> <rect x=\"236\" y=\"380\" width=\"40\" height=\"30\" fill=\"white\"/>\n    <rect x=\"196\" y=\"410\" width=\"120\" height=\"10\" rx=\"5\" fill=\"white\"/>\n</svg>",
  "config": [
    {
      "conditionOp": "EQUAL",
      "conditionVal": "true",
      "conditionVar": "REEMO_PERSISTENT_SESSION",
      "defaultValue": null,
      "editable": true,
      "hint": "Disk mounted on the user home directory: desktop files, downloads, browser profile and KeePass database survive the session.",
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Persistent Disk",
      "optional": false,
      "placeholder": null,
      "type": "VOLUME",
      "uiPriority": 1100,
      "value": "",
      "variable": "REEMO_PERSISTENT_HOME",
      "volumeAccessMode": "READ_WRITE_ONCE",
      "volumeMode": "FILESYSTEM",
      "volumeName": "home",
      "volumeRequestSize": 10,
      "volumeRequestSizeOverhead": 8,
      "volumeStorageClass": "csi-rbd",
      "volumeTarget": "/home/reemo/"
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": "reemo",
      "editable": true,
      "hint": "Look of the desktop: Reemo (dark) or Windows-like (light theme, blue wallpaper).",
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Desktop Appearance",
      "optional": false,
      "placeholder": null,
      "type": "SELECT",
      "uiPriority": 1090,
      "value": "",
      "variable": "REEMO_DESKTOP_THEME",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": false,
      "hint": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Reemo",
      "optional": false,
      "placeholder": null,
      "type": "SELECT_OPTION",
      "uiPriority": 20,
      "value": "reemo",
      "variable": "REEMO_DESKTOP_THEME",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": false,
      "hint": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Windows-like",
      "optional": false,
      "placeholder": null,
      "type": "SELECT_OPTION",
      "uiPriority": 10,
      "value": "windows",
      "variable": "REEMO_DESKTOP_THEME",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": true,
      "hint": "Folders created on the desktop. Letters, digits and spaces only, comma-separated.",
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Desktop Folders",
      "optional": true,
      "placeholder": "Documents,Projects",
      "type": "STRING",
      "uiPriority": 1070,
      "value": "",
      "variable": "REEMO_DESKTOP_FOLDERS",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": true,
      "hint": "Files downloaded onto the desktop at startup, comma-separated URLs.",
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Desktop Files (URLs)",
      "optional": true,
      "placeholder": "https://host/file1.pdf,https://host/file2.pdf",
      "type": "STRING",
      "uiPriority": 1060,
      "value": "",
      "variable": "REEMO_FILE_DESKTOP",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": true,
      "hint": "KeePass database to open, base64-encoded. Left empty, KeePass starts without one.",
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "KeePass Database",
      "optional": true,
      "placeholder": null,
      "type": "TEXT",
      "uiPriority": 1050,
      "value": "",
      "variable": "REEMO_KEEPASS_DB",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": "https://reemo.io",
      "editable": true,
      "hint": "Page loaded when the browser starts, and target of the Home button.",
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Start URL / Homepage",
      "optional": false,
      "placeholder": "https://reemo.io",
      "type": "STRING",
      "uiPriority": 1000,
      "value": "",
      "variable": "REEMO_HOME",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": "BLANK",
      "editable": true,
      "hint": "What a new tab shows.",
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "New Tab Page",
      "optional": false,
      "placeholder": null,
      "type": "SELECT",
      "uiPriority": 990,
      "value": "",
      "variable": "REEMO_NEW_TAB",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": false,
      "hint": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Blank page",
      "optional": false,
      "placeholder": null,
      "type": "SELECT_OPTION",
      "uiPriority": 20,
      "value": "BLANK",
      "variable": "REEMO_NEW_TAB",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": false,
      "hint": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Custom URL",
      "optional": false,
      "placeholder": null,
      "type": "SELECT_OPTION",
      "uiPriority": 10,
      "value": "CUSTOM",
      "variable": "REEMO_NEW_TAB",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": "EQUAL",
      "conditionVal": "CUSTOM",
      "conditionVar": "REEMO_NEW_TAB",
      "defaultValue": null,
      "editable": true,
      "hint": "URL opened on each new tab.",
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "New Tab URL",
      "optional": true,
      "placeholder": null,
      "type": "STRING",
      "uiPriority": 980,
      "value": "",
      "variable": "REEMO_NEW_TAB_URL",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": "NONE",
      "editable": true,
      "hint": "How the browser reaches the web. Direct: no proxy. Upstream proxy: all traffic is routed through the proxy below.",
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Proxy Mode",
      "optional": false,
      "placeholder": null,
      "type": "SELECT",
      "uiPriority": 900,
      "value": "",
      "variable": "REEMO_PROXY",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": false,
      "hint": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Direct",
      "optional": false,
      "placeholder": null,
      "type": "SELECT_OPTION",
      "uiPriority": 20,
      "value": "NONE",
      "variable": "REEMO_PROXY",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": false,
      "hint": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Upstream proxy",
      "optional": false,
      "placeholder": null,
      "type": "SELECT_OPTION",
      "uiPriority": 10,
      "value": "EXTERNAL",
      "variable": "REEMO_PROXY",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": "EQUAL",
      "conditionVal": "EXTERNAL",
      "conditionVar": "REEMO_PROXY",
      "defaultValue": null,
      "editable": true,
      "hint": "Proxy the browser routes all its traffic through.",
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Upstream Proxy (host:port)",
      "optional": false,
      "placeholder": null,
      "type": "STRING",
      "uiPriority": 890,
      "value": "",
      "variable": "REEMO_EXTERNAL_PROXY",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": "EQUAL",
      "conditionVal": "EXTERNAL",
      "conditionVar": "REEMO_PROXY",
      "defaultValue": null,
      "editable": true,
      "hint": "Hosts reached directly, bypassing the proxy. Comma-separated.",
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Proxy Bypass List",
      "optional": true,
      "placeholder": "intranet.local,.internal",
      "type": "STRING",
      "uiPriority": 880,
      "value": "",
      "variable": "REEMO_NO_PROXY",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": true,
      "hint": "Only these are reachable; everything else is blocked. Comma-separated. Takes precedence over the blocked list.",
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Allowed Websites",
      "optional": true,
      "placeholder": "https://example.com/*",
      "type": "STRING",
      "uiPriority": 870,
      "value": "",
      "variable": "REEMO_ALLOWLIST",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": true,
      "hint": "These are blocked; everything else is allowed. Comma-separated. Ignored when an allowed list is set.",
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Blocked Websites",
      "optional": true,
      "placeholder": "https://example.com/*",
      "type": "STRING",
      "uiPriority": 860,
      "value": "",
      "variable": "REEMO_BLOCKLIST",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": "false",
      "editable": true,
      "hint": "Lets the browser open local files through file:// URLs.",
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Local File Navigation (file://)",
      "optional": false,
      "placeholder": null,
      "type": "SELECT",
      "uiPriority": 850,
      "value": "",
      "variable": "REEMO_ALLOW_FILE_PROTOCOL",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": false,
      "hint": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Enabled",
      "optional": false,
      "placeholder": null,
      "type": "SELECT_OPTION",
      "uiPriority": 20,
      "value": "true",
      "variable": "REEMO_ALLOW_FILE_PROTOCOL",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": false,
      "hint": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Disabled",
      "optional": false,
      "placeholder": null,
      "type": "SELECT_OPTION",
      "uiPriority": 10,
      "value": "false",
      "variable": "REEMO_ALLOW_FILE_PROTOCOL",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": "false",
      "editable": true,
      "hint": "Lets a website prompt the user to pick a file from the session.",
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "File Picker Dialogs",
      "optional": false,
      "placeholder": null,
      "type": "SELECT",
      "uiPriority": 840,
      "value": "",
      "variable": "REEMO_ALLOW_FILE_DIALOGS",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": false,
      "hint": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Enabled",
      "optional": false,
      "placeholder": null,
      "type": "SELECT_OPTION",
      "uiPriority": 20,
      "value": "true",
      "variable": "REEMO_ALLOW_FILE_DIALOGS",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": false,
      "hint": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Disabled",
      "optional": false,
      "placeholder": null,
      "type": "SELECT_OPTION",
      "uiPriority": 10,
      "value": "false",
      "variable": "REEMO_ALLOW_FILE_DIALOGS",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": "false",
      "editable": true,
      "hint": "Lets the user proceed past certificate errors (expired or self-signed). When disabled, those pages cannot be dismissed.",
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Allow SSL Certificate Override",
      "optional": false,
      "placeholder": null,
      "type": "SELECT",
      "uiPriority": 830,
      "value": "",
      "variable": "REEMO_SSL_ERROR_OVERRIDE",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": false,
      "hint": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Enabled",
      "optional": false,
      "placeholder": null,
      "type": "SELECT_OPTION",
      "uiPriority": 20,
      "value": "true",
      "variable": "REEMO_SSL_ERROR_OVERRIDE",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": false,
      "hint": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Disabled",
      "optional": false,
      "placeholder": null,
      "type": "SELECT_OPTION",
      "uiPriority": 10,
      "value": "false",
      "variable": "REEMO_SSL_ERROR_OVERRIDE",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": "false",
      "editable": true,
      "hint": "Dark rendering inside the browser only. The desktop itself follows Desktop Appearance above.",
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Browser Dark Mode",
      "optional": false,
      "placeholder": null,
      "type": "SELECT",
      "uiPriority": 820,
      "value": "",
      "variable": "REEMO_DARK_MODE",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": false,
      "hint": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Enabled",
      "optional": false,
      "placeholder": null,
      "type": "SELECT_OPTION",
      "uiPriority": 20,
      "value": "true",
      "variable": "REEMO_DARK_MODE",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": false,
      "hint": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Disabled",
      "optional": false,
      "placeholder": null,
      "type": "SELECT_OPTION",
      "uiPriority": 10,
      "value": "false",
      "variable": "REEMO_DARK_MODE",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": true,
      "hint": "Overrides the browser user agent. Left empty, Chromium uses its own.",
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "User Agent",
      "optional": true,
      "placeholder": null,
      "type": "STRING",
      "uiPriority": 810,
      "value": "",
      "variable": "REEMO_USER_AGENT",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": true,
      "hint": "Name of the bookmarks folder shown in the bar.",
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Bookmarks Folder Name",
      "optional": true,
      "placeholder": null,
      "type": "STRING",
      "uiPriority": 800,
      "value": "",
      "variable": "REEMO_BOOKMARKS_NAME",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": true,
      "hint": "Bookmarks as Name|URL pairs, comma-separated.",
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Bookmarks",
      "optional": true,
      "placeholder": "Reemo|https://reemo.io,Docs|https://docs.reemo.io",
      "type": "STRING",
      "uiPriority": 790,
      "value": "",
      "variable": "REEMO_BOOKMARKS",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": true,
      "hint": "Desktop icons opening a website, as Name|URL pairs, comma-separated.",
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Desktop Web Shortcuts",
      "optional": true,
      "placeholder": "Intranet|https://intranet.local",
      "type": "STRING",
      "uiPriority": 780,
      "value": "",
      "variable": "REEMO_CHROME_SHORTCUT",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": true,
      "hint": "Certificate authority to trust, in PEM format (-----BEGIN CERTIFICATE-----).",
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "CA Certificate",
      "optional": true,
      "placeholder": null,
      "type": "TEXT",
      "uiPriority": 700,
      "value": "",
      "variable": "REEMO_CERT",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": true,
      "hint": "Client certificate presented to sites requiring one (mTLS), in PEM format.",
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "User Certificate",
      "optional": true,
      "placeholder": null,
      "type": "TEXT",
      "uiPriority": 690,
      "value": "",
      "variable": "REEMO_USER_CERT",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": true,
      "hint": "Private key matching the client certificate above, in PEM format.",
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "User Key",
      "optional": true,
      "placeholder": null,
      "type": "TEXT",
      "uiPriority": 680,
      "value": "",
      "variable": "REEMO_USER_KEY",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": "5",
      "editable": true,
      "hint": "Maximum number of screens the user may open. Hard cap: 5.",
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Monitor Limit",
      "optional": false,
      "placeholder": null,
      "type": "SELECT",
      "uiPriority": 500,
      "value": "",
      "variable": "REEMO_LIMIT_MONITOR",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": false,
      "hint": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "5",
      "optional": false,
      "placeholder": null,
      "type": "SELECT_OPTION",
      "uiPriority": 50,
      "value": "5",
      "variable": "REEMO_LIMIT_MONITOR",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": false,
      "hint": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "4",
      "optional": false,
      "placeholder": null,
      "type": "SELECT_OPTION",
      "uiPriority": 40,
      "value": "4",
      "variable": "REEMO_LIMIT_MONITOR",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": false,
      "hint": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "3",
      "optional": false,
      "placeholder": null,
      "type": "SELECT_OPTION",
      "uiPriority": 30,
      "value": "3",
      "variable": "REEMO_LIMIT_MONITOR",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": false,
      "hint": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "2",
      "optional": false,
      "placeholder": null,
      "type": "SELECT_OPTION",
      "uiPriority": 20,
      "value": "2",
      "variable": "REEMO_LIMIT_MONITOR",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": false,
      "hint": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "1",
      "optional": false,
      "placeholder": null,
      "type": "SELECT_OPTION",
      "uiPriority": 10,
      "value": "1",
      "variable": "REEMO_LIMIT_MONITOR",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": "fr",
      "editable": true,
      "hint": "Keyboard layout for the session.",
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Keyboard",
      "optional": false,
      "placeholder": null,
      "type": "SELECT",
      "uiPriority": 480,
      "value": "",
      "variable": "REEMO_KEYMAP",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": false,
      "hint": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "French",
      "optional": false,
      "placeholder": null,
      "type": "SELECT_OPTION",
      "uiPriority": 30,
      "value": "fr",
      "variable": "REEMO_KEYMAP",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": false,
      "hint": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "English",
      "optional": false,
      "placeholder": null,
      "type": "SELECT_OPTION",
      "uiPriority": 20,
      "value": "us",
      "variable": "REEMO_KEYMAP",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": false,
      "hint": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Swedish",
      "optional": false,
      "placeholder": null,
      "type": "SELECT_OPTION",
      "uiPriority": 10,
      "value": "sv",
      "variable": "REEMO_KEYMAP",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": "fr",
      "editable": true,
      "hint": "Language of the desktop and its applications.",
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Language",
      "optional": false,
      "placeholder": null,
      "type": "SELECT",
      "uiPriority": 470,
      "value": "",
      "variable": "REEMO_LANGUAGE",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": false,
      "hint": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "French",
      "optional": false,
      "placeholder": null,
      "type": "SELECT_OPTION",
      "uiPriority": 20,
      "value": "fr",
      "variable": "REEMO_LANGUAGE",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": false,
      "hint": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "English",
      "optional": false,
      "placeholder": null,
      "type": "SELECT_OPTION",
      "uiPriority": 10,
      "value": "en",
      "variable": "REEMO_LANGUAGE",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": "Europe/Paris",
      "editable": true,
      "hint": "Time zone for the session.",
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Timezone",
      "optional": false,
      "placeholder": null,
      "type": "SELECT",
      "uiPriority": 460,
      "value": "",
      "variable": "REEMO_TIMEZONE",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": false,
      "hint": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Europe/Paris",
      "optional": false,
      "placeholder": null,
      "type": "SELECT_OPTION",
      "uiPriority": 30,
      "value": "Europe/Paris",
      "variable": "REEMO_TIMEZONE",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": false,
      "hint": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Europe/London",
      "optional": false,
      "placeholder": null,
      "type": "SELECT_OPTION",
      "uiPriority": 20,
      "value": "Europe/London",
      "variable": "REEMO_TIMEZONE",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": false,
      "hint": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Europe/Stockholm",
      "optional": false,
      "placeholder": null,
      "type": "SELECT_OPTION",
      "uiPriority": 10,
      "value": "Europe/Stockholm",
      "variable": "REEMO_TIMEZONE",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": "2.0.0",
      "editable": false,
      "hint": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "REEMO_TEMPLATE_VERSION",
      "optional": false,
      "placeholder": null,
      "type": "STRING",
      "uiPriority": 0,
      "value": "",
      "variable": "REEMO_TEMPLATE_VERSION",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": "false",
      "editable": true,
      "hint": "Keeps the user home directory across sessions. Disabled: everything is lost when the session ends.",
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Persistent Session",
      "optional": false,
      "placeholder": null,
      "type": "SELECT",
      "uiPriority": 1110,
      "value": "",
      "variable": "REEMO_PERSISTENT_SESSION",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": false,
      "hint": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Enabled",
      "optional": false,
      "placeholder": null,
      "type": "SELECT_OPTION",
      "uiPriority": 20,
      "value": "true",
      "variable": "REEMO_PERSISTENT_SESSION",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "editable": false,
      "hint": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "name": "Disabled",
      "optional": false,
      "placeholder": null,
      "type": "SELECT_OPTION",
      "uiPriority": 10,
      "value": "false",
      "variable": "REEMO_PERSISTENT_SESSION",
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeName": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "volumeStorageClass": null,
      "volumeTarget": null
    }
  ],
  "links": [],
  "usePushNotifications": false,
  "assignableToProvider": true,
  "os": null,
  "vmStartMode": null,
  "vmCreationMode": null,
  "vmCreationDate": null,
  "vmPersistentDisk": true,
  "official": false
}

Configuration and Deployment

Image Information

  • Image :

registry.reemo.io/reemosblightdesktop:latest
  • Internal Desktop: XFCE (window manager, desktop icons) and tint2 (taskbar)

  • Internal Browser: Chromium

  • Included Applications: ONLYOFFICE, PDF reader, archive manager, KeePass

Choosing Desktop Appearance

The Desktop Appearance selector determines what the desktop looks like when the user opens their session.

Option

Appearance Obtained

Reemo (default)

Reemo’s dark desktop: Reemo wallpaper, dark theme, and dark title bars. This is the default appearance of all images in the fleet.

Windows-like

Light theme, colorful icon set, blue wallpaper, and light title bars. Choose this for users coming from a Windows workstation and who should not have to relearn where things are.

Note

This setting changes only the appearance. The applications, desktop icons, and taskbar menu are the same in both cases. The taskbar itself remains dark regardless: it is styled by the platform, not by this setting.

Tip

On a persistent session (see below), the appearance is applied only at first startup. A user who then changes their wallpaper will find it again in subsequent sessions. Changing Desktop Appearance in the form takes control back: the new appearance is reapplied and overwrites the user’s choice. This is an operator instruction, not a suggestion.

Keeping Files Between Sessions

By default, a session is disposable: everything the user creates disappears when it closes. Two fields, linked together, change that.

Field

Description

Persistent Session

Disabled (default): nothing is kept. Enabled: makes the following field appear and keeps the user’s home directory.

Persistent Disk

The disk mounted on the home directory. Default is 10 GiB. Visible only when Persistent Session is enabled.

What then survives the end of a session: desktop files, downloads, browser profile (tabs, zoom, permissions), KeePass database, and wallpaper and appearance settings the user chose themselves.

Important

This image serves both use cases, and that’s why the disk is behind a switch: a named workstation that the user finds again each morning, or an ephemeral workstation opened for a task then closed. Choose deliberately — an ephemeral workstation with a persistent disk accumulates indefinitely, a named workstation without a disk loses everything each evening.

Warning

If Persistent Session is enabled but the platform does not actually attach a disk, the session starts normally and the user loses everything at the end. This case produces an explicit ERROR line in the container logs at startup: that’s where you see it, not on screen.

Preparing the User’s Desktop

Three optional fields fill the desktop before the user opens their session. They avoid having to ask them to find themselves what they will need.

Field

Description

Desktop Folders

Folders created on the desktop, separated by commas (e.g., Documents,Projects). Letters, numbers, and spaces only: a name containing anything else is ignored, and the log says which.

Desktop Files (URLs)

Files downloaded to the desktop at startup, designated by their web addresses separated by commas. Useful for an instruction, a document template, a procedure.

Desktop Web Shortcuts

Desktop icons that open a website in one click, in the form Name|URL separated by commas (e.g., Intranet|https://intranet.local).

Note

A Desktop Files (URLs) address that is unreachable at startup does not prevent the session from opening: the file is missing, and startup is flagged as degraded in the container logs, naming the address in question. On a persistent disk, a file already present is not re-downloaded.

Tip

Web shortcuts are desktop icons, not taskbar menu entries: that menu contains only the five applications, and its content is frozen in the image.

Providing a KeePass Database

Field

Description

KeePass Database

KeePass database opened by the desktop icon, base64-encoded. Left empty, KeePass starts without a database and the user creates one.

Warning

On a persistent session, the database already present on the disk takes precedence over this field: it is never overwritten by the one in the form. This is what prevents losing passwords added by the user each restart — but it also means updating this field does not update a database already in place.

Note

Content that is not valid base64 is refused: no database is written, an ERROR line says so in the logs, and KeePass opens without a database rather than on a truncated file and an “invalid database” message.

Choosing the Startup Page and New Tabs

Field

Description

Start URL / Homepage

Page loaded when the browser opens, and target of the Home button. Default: https://reemo.io.

New Tab Page

Blank page (default): empty tab. Custom URL: makes the following field appear.

New Tab URL

Address opened in each new tab. Visible only in Custom URL.

Tip

For an internal portal, put the same address in Start URL / Homepage and in New Tab URL: the user returns to it both when opening their session and when opening a tab or clicking Home.

Filtering Navigation

Two independent mechanisms, which combine: where the browser exits, and what it has the right to reach.

The Proxy Mode selector determines where the browser exits.

Option

Behavior

Direct (default)

Direct connection, no proxy.

Upstream proxy

Makes Upstream Proxy (host:port) appear: all browser traffic is routed to this existing proxy (e.g., proxy.corp.local:3128), and Proxy Bypass List: hosts joined directly, separated by commas.

The two list fields determine what the browser has the right to reach. They accept a comma-separated list.

Field

Semantics

Allowed Websites

Everything is blocked except what is listed.

Blocked Websites

Everything is allowed except what is listed.

Important

Allowed Websites takes precedence. If both fields are filled, the allowlist applies and Blocked Websites is purely ignored — not merged, not applied second. Filling both is the best way to believe a site is blocked when it is not, or vice versa: fill only one.

Each entry can take one of the following forms:

Form

Scope

reemo.io

This host alone.

*.github.com

All subdomains of github.com.

https://site.com/app

Full URL with path prefix.

*://*.cdn.net/*

Generic URL pattern.

Note

Filtering applies to all navigation, including a link followed from inside a page. A refused address displays a blocking page instead of loading.

Important

In Allowed Websites mode, remember to list all hosts that the application depends on, not just the home page host. An export, a download, or an API call served by a subdomain (api., export., files.) or by external storage (S3, CDN) is refused if that host is not listed, and the page most often stays silent: the button seems to have no effect.

Warning

This filtering concerns only the browser. This image is a desktop: other applications (ONLYOFFICE, KeePass) do not go through it. If the session must be confined to the network, that is decided at the container network level, not here.

Opening Local Files from the Browser

Two selectors, often confused, which do not govern the same thing.

Field

Behavior

Local File Navigation (file://)

Disabled (default): file:// addresses are blocked, the browser cannot serve as an explorer of the container. Enabled: it can resolve and display them.

File Picker Dialogs

Disabled (default): a site cannot open the “choose a file” dialog. Enabled: it can.

Tip

File Picker Dialogs is the one to enable so a user can upload a document from their session to a web application. This is the most frequent use case on this image, since the user produces files with ONLYOFFICE.

Warning

Enable Local File Navigation only if a specific use case requires it. Disabled, it prevents the end user from browsing the container’s internal file system from the address bar.

Adjusting Browser Rendering

Field

Description

Browser Dark Mode

Disabled (default). Enabled, forces dark rendering inside the browser only. The desktop follows Desktop Appearance above: the two settings are independent.

Allow SSL Certificate Override

Disabled (default): a page whose certificate is expired or self-signed cannot be forced by the user. Enabled, they can override. Prefer loading the authority in CA Certificate below rather than opening this door.

User Agent

Replaces the browser’s user agent. Left empty, Chromium uses its own. Useful for a web application that refuses a browser it does not recognize.

Note

A User Agent value containing unexpected characters (notably quotes) is refused outright: the default agent is kept and a warning says so in the logs. The value is not cleaned at best, it is rejected.

Publishing Bookmarks

Field

Description

Bookmarks

List of Name|URL pairs separated by commas, e.g., Reemo|https://reemo.io,Docs|https://docs.reemo.io.

Bookmarks Folder Name

Name of the folder displayed in the bookmark bar. Default: Bookmarks.

The folder is pushed by policy: the end user can neither modify nor delete it. Filling Bookmarks at the same time makes the bookmark bar visible; without bookmarks, it remains hidden.

Loading Certificates

Three optional fields feed the session’s certificate stores. They are taken into account at startup: modifying one of them requires restarting the session.

Field

Description

CA Certificate

Certification authority to be recognized by the browser, in PEM format. A single field accepts an entire chain: each certificate it contains is installed separately.

User Certificate

Client certificate presented by the browser to sites that require one (mTLS), in PEM format. RSA or EC key.

User Key

Private key corresponding to the client certificate, in PEM format and unencrypted (no passphrase).

CA Certificate covers two distinct needs:

  • internal sites signed by your own authority — without it, the browser displays a security warning that the end user must work around themselves, at each session;

  • a corporate proxy that inspects TLS traffic — it resigns connections with its own authority, to be declared here in addition to the Upstream Proxy (host:port) field.

User Certificate and User Key always go together: if either field remains empty, nothing is imported.

Note

The three fields expect PEM text, that is, blocks delimited by —–BEGIN CERTIFICATE—–. A binary DER or PFX file must be converted first:

openssl x509 -inform der -in autorite.der -out autorite.pem
openssl pkcs12 -in identite.pfx -clcerts -nokeys -out client.pem
openssl pkcs12 -in identite.pfx -nocerts -noenc  -out client.key

Warning

An unreadable certificate or key is ignored, and the session starts anyway. Actual loading is verified in the container logs, where each imported certificate and each rejection are recorded.

Configuring the Session

Field

Description

Monitor Limit

Maximum number of screens usable in the session, from 1 to 5. Default: 5. Lower it to curb resource consumption of a large session; it is a ceiling, not a number of screens imposed.

Keyboard

Session keyboard layout: French (default), English, Swedish.

Language

Desktop and application language: French (default), English. It changes the labels of the desktop, menus, and applications.

Timezone

Session timezone: Europe/Paris (default), Europe/London, Europe/Stockholm. It determines the time displayed and the date of files created in the session.

Note

These four fields are closed lists: the form offers only the values above. A value outside the list is refused and logged, never applied partially — but the fallback is not always the form default: Language falls back to an English interface, and Timezone to UTC.

Usage Guide

Opening the Session

When the Reemo session opens, the user arrives at a complete desktop. No application is launched: it is they who open the ones they need. No installation or configuration is asked of them.

The Desktop and Its Icons

The desktop bears one icon per application, plus a Home Folder icon that opens the file manager, as well as folders, files, and web shortcuts added at deployment.

Icon

What it opens

Chromium

The browser, on the session’s startup page.

ONLYOFFICE

The office suite: documents, spreadsheets, presentations. It also opens PDFs.

PDF Viewer

The PDF document reader.

7zip

The archive manager: ZIP, 7z, XZ, BZ2, GZIP, and TAR, for reading and creation.

KeePass

The password manager, on the database provided at deployment if applicable. The selected password is copied to the session clipboard.

The Taskbar

A taskbar is present at the bottom of each screen in the session. It lists the open windows of its screen: a window moved to the second screen appears in that screen’s taskbar, not the other.

The button with the Reemo logo, to the left of the taskbar, opens a menu that lists the five applications: this is the second way to launch them, without having to find the icon under open windows.

Note

This menu contains the five applications and nothing else. Web shortcuts added at deployment remain desktop icons.

Gesture on a window button

Effect

Click

Shows the window, or minimizes it if it is already in the foreground.

Middle click

Closes the window.

Hover

Shows the full title, useful when it is truncated.

Drag to another button

Reorders the windows in the taskbar.

The window in the foreground is signaled by a purple underline under its button.

Tip

To minimize, maximize, or close a window from a menu, right-click on its title bar.

Working on Multiple Screens

The user can open additional screens from their browser, within the limit set by Monitor Limit, and close them during the session. Each screen gets its own taskbar and the session wallpaper as soon as it appears.

Transferring Files

When file transfer is enabled for the session, the image exposes a transfer directory accessible from the Files menu of the Reemo browser. This directory is also the browser’s download folder: a file downloaded in the session is placed directly there, ready to be retrieved on the workstation.

Warning

On a non-persistent session, this directory is ephemeral like the rest. Remember to retrieve your files to your local workstation before closing the session.

What Remains Between Sessions

Element

Persistent Session

Disposable Session

Desktop files and folders

Kept

Lost

Downloads

Kept

Lost

Browser profile (tabs, zoom, permissions)

Kept

Lost

KeePass database

Kept

Lost

User-chosen wallpaper and appearance

Kept

Lost

Folders, files, and shortcuts from deployment

Recreated at each startup

Recreated at each startup

Security Constraints

The browser is locked down permanently. This is not a deployment option: the following restrictions apply to all sessions.

  • No access to browser configuration: settings pages, the extensions manager, and internal pages chrome:// and about:// are inaccessible.

  • No developer tools: console and inspector are disabled.

  • Extensions locked: no extension can be installed by the end user.

  • Functions disabled: account synchronization, built-in password manager, browsing history, printing, private browsing, search suggestions, and telemetry.

  • Local file navigation refused by default: file:// addresses are blocked unless a deployment explicitly allows them.

Important

The lockdown applies to the browser. This image delivers a desktop: the user has applications that read and write files, and a file manager. It is made to provide a workstation, not to confine a user to a single application — if that is the need, it is the HTTPS Bastion that should be deployed.

Changelog

v1.0.0 (2026-09-22)

First public release of the Light Desktop Reemo image: a complete Linux desktop delivered in the browser through Reemo, with a web browser, an office suite, a PDF viewer, an archive manager and a password manager already installed. Unlike the other images in the catalogue, which publish a single application, what this one delivers is the desktop itself: the user opens the applications they need, arranges their windows and keeps their files.

Added

  • A ready-to-use desktop in the browser. The session opens on a desktop with a taskbar and five applications the user launches from an icon or from the taskbar menu: a web browser, the ONLYOFFICE suite (documents, spreadsheets, presentations), a PDF viewer, an archive manager that opens ZIP, 7z, XZ, BZ2, GZIP and TAR, and the KeePass password manager. Nothing is installed on the user’s workstation, and no application is imposed at startup: the desktop is what the session serves.

  • A home directory that survives the session. A deployment can attach a persistent disk to the user’s home directory. Desktop files, downloads, the browser profile and the KeePass database are then found again at the next session, along with the wallpaper and the desktop settings the user chose themselves. Left off, the session is disposable and everything is released when it ends. When a disk is promised but the platform does not attach one, the container logs say so at startup rather than letting the session run and lose its contents at the end.

  • A choice of desktop appearance. Two looks are available: the Reemo appearance, dark, which is the default, and a Windows-like appearance with a light theme, a matching icon set and a blue wallpaper — for users moving over from a Windows workstation who should not have to relearn where things are.

  • A desktop prepared for the user before they arrive. A deployment can create folders on the desktop, place files there by giving their web addresses, add icons that open a website in one click, and supply the KeePass database the session opens. An existing database on a persistent disk is never overwritten by the one declared at deployment.

  • A locked-down browser. The browser cannot be reconfigured or repurposed by the end user: the settings pages, the extension manager, the internal browser pages and the developer tools are unreachable, and browsing local files through file:// addresses is refused unless a deployment enables it explicitly. Sync, the built-in password manager, browsing history, printing, private browsing, search suggestions and telemetry are disabled.

  • Website filtering, allowlist or blocklist. The session can be turned into a filtered gateway: either everything is blocked except the websites you list, or everything is allowed except those you list. Filtering applies to any navigation, including a link followed from inside a page, and a refused address shows a block page instead of loading. Alternatively, all browser traffic can be routed through an existing corporate proxy, with a list of hosts reached directly.

  • Managed bookmarks and a start page. A read-only bookmarks folder can be pushed into the browser bar, under a name of your choosing, and the page the browser opens on — as well as what a new tab shows — is chosen at deployment.

  • Certificates supplied at deployment. A deployment can hand the session a certificate authority to trust, so internal sites signed by your own authority — or reached through a proxy that inspects TLS — open without a security warning for the end user. A client certificate and its key can be supplied the same way, which the browser presents to sites that require one. Material that cannot be read is reported in the container logs rather than silently dropped.

  • A multi-screen desktop. The session can use up to five screens, added or removed on the fly during the session, each with its own taskbar and the correct wallpaper as soon as it appears. The maximum number of screens is set at deployment.

  • Downloads within reach. What the browser downloads lands in the folder the session exposes for file transfer, ready to be retrieved on the user’s workstation, instead of somewhere the transfer cannot see.

  • Keyboard layout, language and time zone chosen at deployment. The desktop and its applications follow the language selected, the keyboard matches the user’s own, and timestamps are in the right time zone.

Versions

Images published on registry.reemo.io/reemosblightdesktop. Each build exposes these pullable tags:

  • Latest (:latest) – the latest published release

  • Release (:vX.Y.Z) – always tracks the latest build of this version

  • Build (:vX.Y.Z-N) – a specific, frozen weekly build

  • Image (:<id>) – immutable reference to this exact build

Example: docker pull registry.reemo.io/reemosblightdesktop:vX.Y.Z-N

v1.0.0-1 (2026-09-22)

Release

v1.0.0

Build

v1.0.0-1

Image

d62df71712ae

Digest

sha256:d62df71712ae439af35f39f939f7eeb01cca986accd31555bcdac2f92cf1d8f5

Applications

chromium 153.0.8010.52

Reemo Agent

2.7.5

OS

Debian GNU/Linux 13 (trixie)

Size

1.45 GB

Patched CVEs

CVE-2018-7738, CVE-2019-16224, CVE-2019-16225, CVE-2019-16226, CVE-2019-16227, CVE-2019-16228, CVE-2022-0987, CVE-2024-36600 (+2974)