I always want the capability to reach my files and the software I use to edit them. Not all of my stuff exists as a webapp, so I use a webtop. A webtop is a desktop in a browser tab. Webtops are awesome.

I use the KasmVNC-based lsio containers. Earlier ones were based on xrdp & guacamole.

Rabbitholes within Rabbitholes.

Inside the webtop, I install:

  • Emacs
  • Obsidian
  • Remina
  • Double Commander
  • a browser

I mainly use Obsidian because Emacs on iOS isn’t there yet. Obsidian can’t open Resilio folders on iOS. beorg can’t open Syncthing folders on iOS.

future considerations

  • xrdp now supports h264. Haven’t had a chance to test that out yet.
  • research if the GUI Emacs in the webtop session should rather connect to a long-running Emacs server session elsewhere (see here)

flowchart LR

WT((Webtop))

MD -- volume mount --> Q((Quartz)) --> SW(static website)
OSI("Obsidian (iOS)") --> ST(SyncThing) --> MD(Markdown folder)
beorg("beorg (iOS)") --> RS(Resilio) --> org(Org folder) -- volume mount --> WT

MD -- volume mount --> WT

WT --> E(Emacs)
WT --> OS(Obsidian)
WT --> R(Remmina)
WT --> DC(Double Commander)

SW -- rsync --> jes_moe(jes.moe)

click WT "./webtop"
click Q "./quartz"
click jes_moe "https://jes.moe"

Like everything else, the webtop’s a docker container.

compose.yml

services:
  webtop:
    image: lscr.io/linuxserver/webtop:ubuntu-mate
    container_name: webtop
    security_opt:
      - seccomp:unconfined #optional
    environment:
      - PUID=1000
      - PGID=1000
      - CUSTOM_USER=foo
      - PASSWORD=bar
      - TZ=Europe/Berlin
      - SUBFOLDER=/ #optional
      - TITLE=Webtop #optional
      - DRINODE=/dev/dri/renderD128
      - DOCKER_MODS=linuxserver/mods:universal-package-install
      - INSTALL_PACKAGES=emacs|cmatrix|mesa-utils|caca-utils|xfce4-whiskermenu-plugin|ristretto|fonts-noto-cjk|libxcb-xinerama0|libxcb-cursor0|libnss3|zstd|libx11-xcb-dev|libglu1-mesa-dev|libxrender-dev|libxi-dev|libxkbcommon-dev|libxkbcommon-x11-dev
    volumes:
      - ./config:/config
      - /var/run/docker.sock:/var/run/docker.sock #optional
      - /mnt/hgfs/tree:/config/tree
      - /mnt/hgfs/SyncthingObsidianVault:/config/SyncthingObsidianVault
      - ./custom-cont-init.d:/custom-cont-init.d:ro
    ports:
      - 3001:3001
    devices:
      - /dev/dri:/dev/dri #optional
    shm_size: 1gb #optional
    restart: unless-stopped

(Re-) Install PRoot Apps:

rm -f $HOME/.local/bin/{ncat,proot-apps,proot,jq}
mkdir -p $HOME/.local/bin
curl -L https://github.com/linuxserver/proot-apps/releases/download/$(curl -sX GET "https://api.github.com/repos/linuxserver/proot-apps/releases/latest" | awk '/tag_name/{print $4;exit}' FS='[""]')/proot-apps-$(uname -m).tar.gz | tar -xzf - -C $HOME/.local/bin/
export PATH="$HOME/.local/bin:$PATH"
 
proot-apps install obsidian
proot-apps install remmina
proot-apps install retroarch
proot-apps install doublecmd

Update PRoot apps:

proot-apps update all