diff --git a/.docker/vivaldi/Dockerfile b/.docker/vivaldi/Dockerfile
new file mode 100644
index 0000000..b5fa22d
--- /dev/null
+++ b/.docker/vivaldi/Dockerfile
@@ -0,0 +1,42 @@
+ARG BASE_IMAGE=m1k1o/neko:base
+FROM $BASE_IMAGE
+
+ARG VIVALDI_VERSION="5.3.2679.34-1"
+# TODO: Get chromium version from vivaldi
+ARG CHROMIUM_VERSION="102.0.5005.72"
+
+#
+# install vivaldi
+SHELL ["/bin/bash", "-c"]
+RUN set -eux; apt-get update; \
+ wget -O /tmp/vivaldi.deb "https://downloads.vivaldi.com/stable/vivaldi-stable_${VIVALDI_VERSION}_amd64.deb"; \
+ apt-get install -y --no-install-recommends wget unzip xz-utils jq openbox /tmp/vivaldi.deb; \
+ /opt/vivaldi/update-ffmpeg; \
+ #
+ # install latest version of uBlock Origin and SponsorBlock for YouTube
+ EXTENSIONS_DIR="/usr/share/chromium/extensions"; \
+ EXTENSIONS=( \
+ cjpalhdlnbpafiamejdnhcphjbkeiagm \
+ mnjggcdmjocbbbhaepdhchncahnbgone \
+ ); \
+ mkdir -p "${EXTENSIONS_DIR}"; \
+ for EXT_ID in "${EXTENSIONS[@]}"; \
+ do \
+ EXT_URL="https://clients2.google.com/service/update2/crx?response=redirect&nacl_arch=x86-64&prodversion=${CHROMIUM_VERSION}&acceptformat=crx2,crx3&x=id%3D${EXT_ID}%26installsource%3Dondemand%26uc"; \
+ EXT_PATH="${EXTENSIONS_DIR}/${EXT_ID}.crx"; \
+ wget -O "${EXT_PATH}" "${EXT_URL}"; \
+ EXT_VERSION="$(unzip -p "${EXT_PATH}" manifest.json 2>/dev/null | jq -r ".version")"; \
+ echo -e "{\n \"external_crx\": \"${EXT_PATH}\",\n \"external_version\": \"${EXT_VERSION}\"\n}" > "${EXTENSIONS_DIR}"/"${EXT_ID}".json; \
+ done; \
+ #
+ # clean up
+ apt-get --purge autoremove -y xz-utils jq; \
+ apt-get clean -y; \
+ rm -rf /var/lib/apt/lists/* /var/cache/apt/*
+
+#
+# copy configuation files
+COPY supervisord.conf /etc/neko/supervisord/vivaldi-browser.conf
+COPY --chown=neko preferences.json /home/neko/.config/vivaldi/Default/Preferences
+COPY policies.json /etc/opt/vivaldi/policies/managed/policies.json
+COPY openbox.xml /etc/neko/openbox.xml
diff --git a/.docker/vivaldi/openbox.xml b/.docker/vivaldi/openbox.xml
new file mode 100644
index 0000000..94fb830
--- /dev/null
+++ b/.docker/vivaldi/openbox.xml
@@ -0,0 +1,763 @@
+
+
+
+
+
+
+
+ 10
+ 20
+
+
+
+
+
+ no
+ true
+ yes
+ normal
+
+
+
+
+ yes
+
+ no
+
+ yes
+
+ no
+
+ 200
+
+ no
+
+
+
+
+ Smart
+
+ yes
+
+ Primary
+
+ 1
+
+
+
+
+ Clearlooks
+ NLIMC
+
+ yes
+ yes
+
+ sans
+ 8
+
+ bold
+
+ normal
+
+
+
+ sans
+ 8
+
+ bold
+
+ normal
+
+
+
+ sans
+ 9
+
+ normal
+
+ normal
+
+
+
+ sans
+ 9
+
+ normal
+
+ normal
+
+
+
+ sans
+ 9
+
+ bold
+
+ normal
+
+
+
+ sans
+ 9
+
+ bold
+
+ normal
+
+
+
+
+
+
+ 1
+ 1
+
+
+
+ 875
+
+
+
+
+ yes
+ Nonpixel
+
+ Center
+
+
+
+
+ 10
+
+ 10
+
+
+
+
+
+
+ 0
+ 0
+ 0
+ 0
+
+
+
+ TopLeft
+
+ 0
+ 0
+ no
+ Above
+
+ Vertical
+
+ no
+ 300
+
+ 300
+
+ Middle
+
+
+
+
+ C-g
+
+
+
+ leftno
+
+
+ rightno
+
+
+ upno
+
+
+ downno
+
+
+ leftno
+
+
+ rightno
+
+
+ upno
+
+
+ downno
+
+
+ 1
+
+
+ 2
+
+
+ 3
+
+
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ scrot -s
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ yesyes
+
+
+
+
+
+
+
+
+
+
+
+ right
+
+
+
+
+ left
+
+
+
+
+ up
+
+
+
+
+ down
+
+
+
+
+
+
+
+ true
+ Konqueror
+
+ kfmclient openProfile filemanagement
+
+
+
+
+ scrot
+
+
+
+
+ 1
+
+ 500
+
+ 400
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ previous
+
+
+ next
+
+
+ previous
+
+
+ next
+
+
+ previous
+
+
+ next
+
+
+
+
+
+
+
+
+
+
+
+
+
+ no
+
+
+
+
+
+
+
+
+
+
+ yes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ top
+
+
+
+
+
+ left
+
+
+
+
+
+ right
+
+
+
+
+
+ bottom
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ vertical
+
+
+ horizontal
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ previous
+
+
+ next
+
+
+
+ previous
+
+
+ next
+
+
+ previous
+
+
+ next
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ previous
+
+
+ next
+
+
+ previous
+
+
+ next
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.docker/vivaldi/policies.json b/.docker/vivaldi/policies.json
new file mode 100644
index 0000000..1c46099
--- /dev/null
+++ b/.docker/vivaldi/policies.json
@@ -0,0 +1,38 @@
+{
+ "HomepageLocation": "",
+ "AutoFillEnabled": false,
+ "AutofillAddressEnabled": false,
+ "AutofillCreditCardEnabled": false,
+ "BrowserSignin": 0,
+ "DefaultNotificationsSetting": 2,
+ "DeveloperToolsAvailability": 2,
+ "EditBookmarksEnabled": false,
+ "FullscreenAllowed": true,
+ "IncognitoModeAvailability": 1,
+ "SyncDisabled": true,
+ "AutoplayAllowed": true,
+ "BrowserAddPersonEnabled": false,
+ "BrowserGuestModeEnabled": false,
+ "DefaultPopupsSetting": 2,
+ "DownloadRestrictions": 3,
+ "VideoCaptureAllowed": true,
+ "AllowFileSelectionDialogs": false,
+ "PromptForDownloadLocation": false,
+ "BookmarkBarEnabled": false,
+ "PasswordManagerEnabled": false,
+ "URLBlacklist": [
+ "file://*",
+ "chrome://policy"
+ ],
+ "ExtensionInstallForcelist": [
+ "cjpalhdlnbpafiamejdnhcphjbkeiagm;https://clients2.google.com/service/update2/crx",
+ "mnjggcdmjocbbbhaepdhchncahnbgone;https://clients2.google.com/service/update2/crx"
+ ],
+ "ExtensionInstallWhitelist": [
+ "cjpalhdlnbpafiamejdnhcphjbkeiagm",
+ "mnjggcdmjocbbbhaepdhchncahnbgone"
+ ],
+ "ExtensionInstallBlacklist": [
+ "*"
+ ]
+}
diff --git a/.docker/vivaldi/preferences.json b/.docker/vivaldi/preferences.json
new file mode 100644
index 0000000..54cfc02
--- /dev/null
+++ b/.docker/vivaldi/preferences.json
@@ -0,0 +1,339 @@
+{
+ "homepage": "http://www.google.com",
+ "homepage_is_newtabpage": false,
+ "first_run_tabs": [
+ "https://www.google.com/_/chrome/newtab?ie=UTF-8"
+ ],
+ "custom_links": {
+ "initialized": true,
+ "list": [
+ {
+ "title": "YouTube",
+ "url": "https://www.youtube.com/"
+ },
+ {
+ "title": "Netflix",
+ "url": "https://netflix.com"
+ },
+ {
+ "title": "Hulu",
+ "url": "https://www.hulu.com/"
+ },
+ {
+ "title": "9Anime",
+ "url": "https://9anime.to/"
+ },
+ {
+ "title": "Crunchy Roll",
+ "url": "https://www.crunchyroll.com/"
+ },
+ {
+ "title": "Funimation",
+ "url": "https://www.funimation.com/"
+ },
+ {
+ "title": "Disney+",
+ "url": "https://www.disneyplus.com/"
+ },
+ {
+ "title": "HBO Now",
+ "url": "https://play.hbonow.com/"
+ },
+ {
+ "title": "Amazon Video",
+ "url": "https://www.amazon.com/Amazon-Video/b?node=2858778011"
+ },
+ {
+ "title": "VRV",
+ "url": "https://vrv.co/"
+ },
+ {
+ "title": "Twitch",
+ "url": "https://www.twitch.tv/"
+ },
+ {
+ "title": "Mixer",
+ "url": "https://mixer.com/"
+ }
+ ]
+ },
+ "browser": {
+ "custom_chrome_frame": false,
+ "show_home_button": true,
+ "window_placement": {
+ "maximized": true
+ }
+ },
+ "bookmark_bar": {
+ "show_on_all_tabs": false
+ },
+ "sync_promo": {
+ "show_on_first_run_allowed": false
+ },
+ "default_search_provider_data": {
+ "image_template_url_data": {
+ "alternate_urls": ["https://www.google.com/#q={searchTerms}", "https://www.google.com/search#q={searchTerms}", "https://www.google.com/webhp#q={searchTerms}", "https://www.google.com/s#q={searchTerms}", "https://www.google.com/s?q={searchTerms}"],
+ "contextual_search_url": "",
+ "created_by_policy": false,
+ "created_from_play_api": false,
+ "date_created": "0",
+ "doodle_url": "",
+ "favicon_url": "https://www.google.com/favicon.ico",
+ "id": "11",
+ "image_url": "https://www.google.com/searchbyimage/upload",
+ "image_url_post_params": "encoded_image={google:imageThumbnail},image_url={google:imageURL},sbisrc={google:imageSearchSource},original_width={google:imageOriginalWidth},original_height={google:imageOriginalHeight}",
+ "input_encodings": ["UTF-8"],
+ "is_active": 0,
+ "keyword": "g",
+ "last_modified": "0",
+ "last_visited": "0",
+ "logo_url": "",
+ "new_tab_url": "",
+ "originating_url": "",
+ "position": "IhxEc1dKb3ZJanppM1NCWTZhRHNGN0ljYkRHeVk9",
+ "preconnect_to_search_url": false,
+ "prepopulate_id": 1,
+ "safe_for_autoreplace": true,
+ "search_url_post_params": "",
+ "short_name": "Google",
+ "side_search_param": "",
+ "suggestions_url": "",
+ "suggestions_url_post_params": "",
+ "url": "https://www.google.com/search?q={searchTerms}&{google:originalQueryForSuggestion}{google:prefetchSource}{google:sourceId}{google:contextualSearchVersion}ie={inputEncoding}",
+ "usage_count": 0
+ },
+ "private_template_url_data": {
+ "alternate_urls": [],
+ "contextual_search_url": "",
+ "created_by_policy": false,
+ "created_from_play_api": false,
+ "date_created": "0",
+ "doodle_url": "",
+ "favicon_url": "https://duckduckgo.com/favicon.ico",
+ "id": "4",
+ "image_url": "",
+ "image_url_post_params": "",
+ "input_encodings": ["UTF-8"],
+ "is_active": 0,
+ "keyword": "d",
+ "last_modified": "0",
+ "last_visited": "0",
+ "logo_url": "",
+ "new_tab_url": "",
+ "originating_url": "",
+ "position": "Ih3bMkFheVB5WitEdGZmeU9hV0d5K3RGUXRhR3RFPQ==",
+ "preconnect_to_search_url": false,
+ "prepopulate_id": 7,
+ "safe_for_autoreplace": true,
+ "search_url_post_params": "",
+ "short_name": "DuckDuckGo",
+ "side_search_param": "",
+ "suggestions_url": "https://duckduckgo.com/ac/?q={searchTerms}&type=list",
+ "suggestions_url_post_params": "",
+ "url": "https://duckduckgo.com/?q={searchTerms}&{ddg:Referral}",
+ "usage_count": 0
+ },
+ "speeddials_template_url_data": {
+ "alternate_urls": ["https://www.google.com/#q={searchTerms}", "https://www.google.com/search#q={searchTerms}", "https://www.google.com/webhp#q={searchTerms}", "https://www.google.com/s#q={searchTerms}", "https://www.google.com/s?q={searchTerms}"],
+ "contextual_search_url": "",
+ "created_by_policy": false,
+ "created_from_play_api": false,
+ "date_created": "0",
+ "doodle_url": "",
+ "favicon_url": "https://www.google.com/favicon.ico",
+ "id": "11",
+ "image_url": "https://www.google.com/searchbyimage/upload",
+ "image_url_post_params": "encoded_image={google:imageThumbnail},image_url={google:imageURL},sbisrc={google:imageSearchSource},original_width={google:imageOriginalWidth},original_height={google:imageOriginalHeight}",
+ "input_encodings": ["UTF-8"],
+ "is_active": 0,
+ "keyword": "g",
+ "last_modified": "0",
+ "last_visited": "0",
+ "logo_url": "",
+ "new_tab_url": "",
+ "originating_url": "",
+ "position": "IhxEc1dKb3ZJanppM1NCWTZhRHNGN0ljYkRHeVk9",
+ "preconnect_to_search_url": false,
+ "prepopulate_id": 1,
+ "safe_for_autoreplace": true,
+ "search_url_post_params": "",
+ "short_name": "Google",
+ "side_search_param": "",
+ "suggestions_url": "",
+ "suggestions_url_post_params": "",
+ "url": "https://www.google.com/search?q={searchTerms}&{google:originalQueryForSuggestion}{google:prefetchSource}{google:sourceId}{google:contextualSearchVersion}ie={inputEncoding}",
+ "usage_count": 0
+ },
+ "template_url_data": {
+ "alternate_urls": ["https://www.google.com/#q={searchTerms}", "https://www.google.com/search#q={searchTerms}", "https://www.google.com/webhp#q={searchTerms}", "https://www.google.com/s#q={searchTerms}", "https://www.google.com/s?q={searchTerms}"],
+ "contextual_search_url": "",
+ "created_by_policy": false,
+ "created_from_play_api": false,
+ "date_created": "0",
+ "doodle_url": "",
+ "favicon_url": "https://www.google.com/favicon.ico",
+ "id": "11",
+ "image_url": "https://www.google.com/searchbyimage/upload",
+ "image_url_post_params": "encoded_image={google:imageThumbnail},image_url={google:imageURL},sbisrc={google:imageSearchSource},original_width={google:imageOriginalWidth},original_height={google:imageOriginalHeight}",
+ "input_encodings": ["UTF-8"],
+ "is_active": 0,
+ "keyword": "g",
+ "last_modified": "0",
+ "last_visited": "0",
+ "logo_url": "",
+ "new_tab_url": "",
+ "originating_url": "",
+ "position": "IhxEc1dKb3ZJanppM1NCWTZhRHNGN0ljYkRHeVk9",
+ "preconnect_to_search_url": false,
+ "prepopulate_id": 1,
+ "safe_for_autoreplace": true,
+ "search_url_post_params": "",
+ "short_name": "Google",
+ "side_search_param": "",
+ "suggestions_url": "",
+ "suggestions_url_post_params": "",
+ "url": "https://www.google.com/search?q={searchTerms}&{google:originalQueryForSuggestion}{google:prefetchSource}{google:sourceId}{google:contextualSearchVersion}ie={inputEncoding}",
+ "usage_count": 0
+ }
+ },
+ "distribution": {
+ "import_bookmarks_from_file": "bookmarks.html",
+ "import_bookmarks": true,
+ "import_history": true,
+ "import_home_page": true,
+ "import_search_engine": true,
+ "ping_delay": 60,
+ "do_not_create_desktop_shortcut": true,
+ "do_not_create_quick_launch_shortcut": true,
+ "do_not_create_taskbar_shortcut": true,
+ "do_not_launch_chrome": true,
+ "do_not_register_for_update_launch": true,
+ "make_chrome_default": true,
+ "make_chrome_default_for_user": true,
+ "system_level": false,
+ "verbose_logging": false
+ },
+ "enable_do_not_track": true,
+ "profile": {
+ "avatar_index": 34,
+ "default_content_setting_values": {
+ "clipboard": 2,
+ "cookies": 4,
+ "geolocation": 2,
+ "media_stream_camera": 2,
+ "media_stream_mic": 2,
+ "midi_sysex": 2,
+ "payment_handler": 2,
+ "usb_guard": 2
+ },
+ "name": "Neko",
+ "using_default_avatar": false,
+ "using_default_name": false,
+ "using_gaia_avatar": false
+ },
+ "signin": {
+ "allowed": false
+ },
+ "vivaldi": {
+ "address_bar": {
+ "autocomplete": {
+ "enabled": false
+ },
+ "omnibox": {
+ "show_browser_history": false,
+ "show_search_history": false,
+ "show_typed_history": false
+ },
+ "search": {
+ "display": 1,
+ "in_new_tab": false
+ },
+ "show_full_url": true,
+ "show_qr_generator": true,
+ "visible": true
+ },
+ "bookmarks": {
+ "deleted_partners": [
+ "f79cd6e8-ebc0-444d-ac96-00da456dcb59",
+ "d680347f-1073-46b9-a546-ae0238e7b9d9"
+ ],
+ "language": "en-US",
+ "version": "24"
+ },
+ "downloads": {
+ "notify_on_complete": false,
+ "open_panel_on_new": false,
+ "start_automatically": false,
+ "update_default_download_when_saving_as": false
+ },
+ "history": {
+ "days_to_keep_visits": 0
+ },
+ "homepage": "vivaldi://startpage",
+ "incognito": {
+ "show_intro": false
+ },
+ "language_at_install": "en-US",
+ "menu": {
+ "icon_type": 1
+ },
+ "mouse_gestures": {
+ "enabled": false,
+ "rocker_gestures": {
+ "enabled": false
+ }
+ },
+ "popups": {
+ "show_in_tab": true
+ },
+ "settings": {
+ "in_tab": true
+ },
+ "startpage": {
+ "navigation": 1,
+ "speed_dial": {
+ "add_button_visible": false,
+ "allow_dnd": false,
+ "columns": 4,
+ "delete_visible": false,
+ "display_search": true,
+ "privacy_stats_show": false,
+ "tracker_suggestion_show": false,
+ "width": 170
+ }
+ },
+ "startup": {
+ "check_is_default": false,
+ "has_seen_feature": 1
+ },
+ "status_bar": {
+ "display": 0,
+ "minimized": 0
+ },
+ "system": {
+ "show_exit_confirmation_dialog": true
+ },
+ "tabs": {
+ "new_placement": 3,
+ "open_new_in_background": false,
+ "stacking": {
+ "open_accordions": []
+ }
+ },
+ "theme": {
+ "schedule": {
+ "o_s": {
+ "dark": "Vivaldi2",
+ "light": "Vivaldi2"
+ }
+ },
+ "use_animation": false
+ },
+ "translate": {
+ "enabled": false
+ },
+ "windows": {
+ "use_native_decoration": true
+ }
+ }
+}
diff --git a/.docker/vivaldi/supervisord.conf b/.docker/vivaldi/supervisord.conf
new file mode 100644
index 0000000..c972801
--- /dev/null
+++ b/.docker/vivaldi/supervisord.conf
@@ -0,0 +1,22 @@
+[program:vivaldi-stable]
+environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s"
+command=/usr/bin/vivaldi-stable --no-sandbox --window-position=0,0 --display=%(ENV_DISPLAY)s --user-data-dir=/home/neko/.config/vivaldi --no-first-run --start-maximized --bwsi --force-dark-mode --disable-file-system --disable-gpu --disable-software-rasterizer --disable-dev-shm-usage
+stopsignal=INT
+autorestart=true
+priority=800
+user=%(ENV_USER)s
+stdout_logfile=/var/log/neko/vivaldi.log
+stdout_logfile_maxbytes=100MB
+stdout_logfile_backups=10
+redirect_stderr=true
+
+[program:openbox]
+environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s"
+command=/usr/bin/openbox --config-file /etc/neko/openbox.xml
+autorestart=true
+priority=300
+user=%(ENV_USER)s
+stdout_logfile=/var/log/neko/openbox.log
+stdout_logfile_maxbytes=100MB
+stdout_logfile_backups=10
+redirect_stderr=true
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index a93225d..f9e429b 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -50,7 +50,7 @@ jobs:
# Will build all images even if some fail.
fail-fast: false
matrix:
- tags: [ firefox, chromium, google-chrome, ungoogled-chromium, microsoft-edge, brave, tor-browser, remmina, vlc, xfce ]
+ tags: [ firefox, chromium, google-chrome, ungoogled-chromium, microsoft-edge, brave, vivaldi, tor-browser, remmina, vlc, xfce ]
env:
DOCKER_TAG: ${{ matrix.tags }}
steps:
diff --git a/.github/workflows/tags.yml b/.github/workflows/tags.yml
index 16dfd70..26cbf32 100644
--- a/.github/workflows/tags.yml
+++ b/.github/workflows/tags.yml
@@ -78,6 +78,8 @@ jobs:
platforms: linux/amd64
- tag: brave
platforms: linux/amd64
+ - tag: vivaldi
+ platforms: linux/amd64
- tag: tor-browser
platforms: linux/amd64,linux/arm64
- tag: remmina
diff --git a/docs/changelog.md b/docs/changelog.md
index a51fc57..5d30683 100644
--- a/docs/changelog.md
+++ b/docs/changelog.md
@@ -2,6 +2,9 @@
## master branch
+### New Features
+- Added `m1k1o/neko:vivaldi` tag (thanks @Xeddius).
+
## [n.eko v2.6](https://github.com/m1k1o/neko/releases/tag/v2.6)
### Bugs
diff --git a/docs/getting-started/README.md b/docs/getting-started/README.md
index 38b0dd6..a3495ca 100644
--- a/docs/getting-started/README.md
+++ b/docs/getting-started/README.md
@@ -7,6 +7,7 @@ Use the following docker images:
- `m1k1o/neko:ungoogled-chromium` - for [Ungoogled Chromium](https://github.com/Eloston/ungoogled-chromium) (needs `--cap-add=SYS_ADMIN`, see the [security implications](https://www.redhat.com/en/blog/container-tidbits-adding-capabilities-container)) (by @whalehub).
- `m1k1o/neko:microsoft-edge` - for Microsoft Edge (needs `--cap-add=SYS_ADMIN`, see the [security implications](https://www.redhat.com/en/blog/container-tidbits-adding-capabilities-container)).
- `m1k1o/neko:brave` - for [Brave Browser](https://brave.com) (needs `--cap-add=SYS_ADMIN`, see the [security implications](https://www.redhat.com/en/blog/container-tidbits-adding-capabilities-container)).
+- `m1k1o/neko:vivaldi` - for [Vivaldi Browser](https://vivaldi.com) (needs `--cap-add=SYS_ADMIN`, see the [security implications](https://www.redhat.com/en/blog/container-tidbits-adding-capabilities-container)) (by @Xeddius).
- `m1k1o/neko:tor-browser` - for Tor Browser.
- `m1k1o/neko:remmina` - for remote desktop connection (by @lowne).
- Pass env var `REMMINA_URL=://[[:]@]server[:port]` (proto being `vnc`, `rdp` or `spice`).