add waterfox.

This commit is contained in:
Miroslav Šedivý 2025-02-17 17:49:22 +01:00
parent 2dd5585b49
commit a750a078aa
11 changed files with 1016 additions and 2 deletions

View file

@ -0,0 +1,35 @@
ARG BASE_IMAGE=m1k1o/neko:base
FROM $BASE_IMAGE
ARG SRC_URL="https://cdn1.waterfox.net/waterfox/releases/latest/linux"
#
# install waterfox
RUN set -eux; apt-get update; \
apt-get install -y --no-install-recommends openbox \
xz-utils bzip2 libgtk-3-0 libdbus-glib-1-2; \
#
# fetch latest release
wget -O /tmp/waterfox-setup.tar.bz2 "${SRC_URL}"; \
mkdir /usr/lib/waterfox; \
tar -xjf /tmp/waterfox-setup.tar.bz2 -C /usr/lib; \
rm -f /tmp/waterfox-setup.tar.bz2; \
ln -s /usr/lib/waterfox/waterfox /usr/bin/waterfox; \
#
# create a profile directory
mkdir -p /home/neko/.waterfox/profile.default/extensions; \
chown -R neko:neko /home/neko/.waterfox/profile.default; \
#
# clean up
apt-get --purge autoremove -y xz-utils bzip2; \
apt-get clean -y; \
rm -rf /var/lib/apt/lists/* /var/cache/apt/*
#
# copy configuation files
COPY supervisord.conf /etc/neko/supervisord/waterfox.conf
COPY neko.js /usr/lib/waterfox/mozilla.cfg
COPY autoconfig.js /usr/lib/waterfox/defaults/pref/autoconfig.js
COPY policies.json /usr/lib/waterfox/distribution/policies.json
COPY --chown=neko profiles.ini /home/neko/.waterfox/profiles.ini
COPY openbox.xml /etc/neko/openbox.xml

View file

@ -0,0 +1,2 @@
pref("general.config.obscure_value", 0);
pref("general.config.filename", "mozilla.cfg");

37
.docker/waterfox/neko.js Normal file
View file

@ -0,0 +1,37 @@
// firefox config for neko
lockPref("browser.tabs.closeWindowWithLastTab", false);
lockPref("app.update.auto", false);
lockPref("app.update.enabled", false);
lockPref("app.update.silent", true);
lockPref("browser.cache.disk.capacity", 1000);
lockPref("browser.download.useDownloadDir", false);
lockPref("browser.rights.3.shown", true);
lockPref("browser.search.update", false);
lockPref("browser.shell.checkDefaultBrowser", false);
lockPref("extensions.update.enabled", false);
lockPref("plugin.default_plugin_disabled", false);
lockPref("plugin.scan.plid.all", true);
lockPref("plugins.hide_infobar_for_missing_plugin", true);
lockPref("profile.allow_automigration", false);
lockPref("signon.prefillForms", false);
lockPref("signon.rememberSignons", false);
lockPref("xpinstall.enabled", false);
lockPref("xpinstall.whitelist.required", true);
lockPref("browser.download.manager.retention", 0);
lockPref("browser.download.folderList", 2);
lockPref("browser.download.forbid_open_with", true);
lockPref("browser.safebrowsing.downloads.enabled", false);
lockPref("browser.safebrowsing.downloads.remote.enabled", false);
lockPref("browser.helperApps.alwaysAsk.force", false);
lockPref("browser.helperApps.neverAsk.saveToDisk", "application/zip,application/octet-stream,image/jpeg,application/vnd.ms-outlook,text/html,application/pdf");
lockPref("browser.helperApps.neverAsk.openFile", "application/zip,application/octet-stream,image/jpeg,application/vnd.ms-outlook,text/html,application/pdf");
lockPref("browser.newtabpage.activity-stream.default.sites", "https://ipleak.net/,https://www.youtube.com/,https://www.google.com/");
// dark mode
lockPref("reader.color_scheme", "dark");
lockPref("devtools.theme", "dark");
lockPref("ui.systemUsesDarkTheme", 1);
lockPref("lightweightThemes.usedThemes","[]");
lockPref("lightweightThemes.selectedThemeID", "firefox-compact-dark@mozilla.org");
lockPref("extensions.activeThemeID", "firefox-compact-dark@mozilla.org");
lockPref("browser.theme.toolbar-theme", 0);
lockPref("browser.in-content.dark-mode", true);

View file

@ -0,0 +1,763 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Default openbox config but all window decorations are moved
thereby making it harder to accidentally close the virtual browser -->
<openbox_config xmlns="http://openbox.org/3.4/rc"
xmlns:xi="http://www.w3.org/2001/XInclude">
<resistance>
<strength>10</strength>
<screen_edge_strength>20</screen_edge_strength>
</resistance>
<applications>
<!-- Match all windows and remove their decorations (obxprop | grep "^_OB_APP") -->
<application class="waterfox" name="Navigator" role="browser">
<decor>no</decor>
<maximized>true</maximized>
<focus>yes</focus>
<layer>normal</layer>
</application>
</applications>
<focus>
<focusNew>yes</focusNew>
<!-- always try to focus new windows when they appear. other rules do
apply -->
<followMouse>no</followMouse>
<!-- move focus to a window when you move the mouse into it -->
<focusLast>yes</focusLast>
<!-- focus the last used window when changing desktops, instead of the one
under the mouse pointer. when followMouse is enabled -->
<underMouse>no</underMouse>
<!-- move focus under the mouse, even when the mouse is not moving -->
<focusDelay>200</focusDelay>
<!-- when followMouse is enabled, the mouse must be inside the window for
this many milliseconds (1000 = 1 sec) before moving focus to it -->
<raiseOnFocus>no</raiseOnFocus>
<!-- when followMouse is enabled, and a window is given focus by moving the
mouse into it, also raise the window -->
</focus>
<placement>
<policy>Smart</policy>
<!-- 'Smart' or 'UnderMouse' -->
<center>yes</center>
<!-- whether to place windows in the center of the free area found or
the top left corner -->
<monitor>Primary</monitor>
<!-- with Smart placement on a multi-monitor system, try to place new windows
on: 'Any' - any monitor, 'Mouse' - where the mouse is, 'Active' - where
the active window is, 'Primary' - only on the primary monitor -->
<primaryMonitor>1</primaryMonitor>
<!-- The monitor where Openbox should place popup dialogs such as the
focus cycling popup, or the desktop switch popup. It can be an index
from 1, specifying a particular monitor. Or it can be one of the
following: 'Mouse' - where the mouse is, or
'Active' - where the active window is -->
</placement>
<theme>
<name>Clearlooks</name>
<titleLayout>NLIMC</titleLayout>
<!--
available characters are NDSLIMC, each can occur at most once.
N: window icon
L: window label (AKA title).
I: iconify
M: maximize
C: close
S: shade (roll up/down)
D: omnipresent (on all desktops).
-->
<keepBorder>yes</keepBorder>
<animateIconify>yes</animateIconify>
<font place="ActiveWindow">
<name>sans</name>
<size>8</size>
<!-- font size in points -->
<weight>bold</weight>
<!-- 'bold' or 'normal' -->
<slant>normal</slant>
<!-- 'italic' or 'normal' -->
</font>
<font place="InactiveWindow">
<name>sans</name>
<size>8</size>
<!-- font size in points -->
<weight>bold</weight>
<!-- 'bold' or 'normal' -->
<slant>normal</slant>
<!-- 'italic' or 'normal' -->
</font>
<font place="MenuHeader">
<name>sans</name>
<size>9</size>
<!-- font size in points -->
<weight>normal</weight>
<!-- 'bold' or 'normal' -->
<slant>normal</slant>
<!-- 'italic' or 'normal' -->
</font>
<font place="MenuItem">
<name>sans</name>
<size>9</size>
<!-- font size in points -->
<weight>normal</weight>
<!-- 'bold' or 'normal' -->
<slant>normal</slant>
<!-- 'italic' or 'normal' -->
</font>
<font place="ActiveOnScreenDisplay">
<name>sans</name>
<size>9</size>
<!-- font size in points -->
<weight>bold</weight>
<!-- 'bold' or 'normal' -->
<slant>normal</slant>
<!-- 'italic' or 'normal' -->
</font>
<font place="InactiveOnScreenDisplay">
<name>sans</name>
<size>9</size>
<!-- font size in points -->
<weight>bold</weight>
<!-- 'bold' or 'normal' -->
<slant>normal</slant>
<!-- 'italic' or 'normal' -->
</font>
</theme>
<desktops>
<!-- this stuff is only used at startup, pagers allow you to change them
during a session
these are default values to use when other ones are not already set
by other applications, or saved in your session
use obconf if you want to change these without having to log out
and back in -->
<number>1</number>
<firstdesk>1</firstdesk>
<names>
<!-- set names up here if you want to, like this:
<name>desktop 1</name>
<name>desktop 2</name>
-->
</names>
<popupTime>875</popupTime>
<!-- The number of milliseconds to show the popup for when switching
desktops. Set this to 0 to disable the popup. -->
</desktops>
<resize>
<drawContents>yes</drawContents>
<popupShow>Nonpixel</popupShow>
<!-- 'Always', 'Never', or 'Nonpixel' (xterms and such) -->
<popupPosition>Center</popupPosition>
<!-- 'Center', 'Top', or 'Fixed' -->
<popupFixedPosition>
<!-- these are used if popupPosition is set to 'Fixed' -->
<x>10</x>
<!-- positive number for distance from left edge, negative number for
distance from right edge, or 'Center' -->
<y>10</y>
<!-- positive number for distance from top edge, negative number for
distance from bottom edge, or 'Center' -->
</popupFixedPosition>
</resize>
<!-- You can reserve a portion of your screen where windows will not cover when
they are maximized, or when they are initially placed.
Many programs reserve space automatically, but you can use this in other
cases. -->
<margins>
<top>0</top>
<bottom>0</bottom>
<left>0</left>
<right>0</right>
</margins>
<dock>
<position>TopLeft</position>
<!-- (Top|Bottom)(Left|Right|)|Top|Bottom|Left|Right|Floating -->
<floatingX>0</floatingX>
<floatingY>0</floatingY>
<noStrut>no</noStrut>
<stacking>Above</stacking>
<!-- 'Above', 'Normal', or 'Below' -->
<direction>Vertical</direction>
<!-- 'Vertical' or 'Horizontal' -->
<autoHide>no</autoHide>
<hideDelay>300</hideDelay>
<!-- in milliseconds (1000 = 1 second) -->
<showDelay>300</showDelay>
<!-- in milliseconds (1000 = 1 second) -->
<moveButton>Middle</moveButton>
<!-- 'Left', 'Middle', 'Right' -->
</dock>
<keyboard>
<chainQuitKey>C-g</chainQuitKey>
<!-- Keybindings for desktop switching -->
<keybind key="C-A-Left">
<action name="GoToDesktop"><to>left</to><wrap>no</wrap></action>
</keybind>
<keybind key="C-A-Right">
<action name="GoToDesktop"><to>right</to><wrap>no</wrap></action>
</keybind>
<keybind key="C-A-Up">
<action name="GoToDesktop"><to>up</to><wrap>no</wrap></action>
</keybind>
<keybind key="C-A-Down">
<action name="GoToDesktop"><to>down</to><wrap>no</wrap></action>
</keybind>
<keybind key="S-A-Left">
<action name="SendToDesktop"><to>left</to><wrap>no</wrap></action>
</keybind>
<keybind key="S-A-Right">
<action name="SendToDesktop"><to>right</to><wrap>no</wrap></action>
</keybind>
<keybind key="S-A-Up">
<action name="SendToDesktop"><to>up</to><wrap>no</wrap></action>
</keybind>
<keybind key="S-A-Down">
<action name="SendToDesktop"><to>down</to><wrap>no</wrap></action>
</keybind>
<keybind key="W-F1">
<action name="GoToDesktop"><to>1</to></action>
</keybind>
<keybind key="W-F2">
<action name="GoToDesktop"><to>2</to></action>
</keybind>
<keybind key="W-F3">
<action name="GoToDesktop"><to>3</to></action>
</keybind>
<keybind key="W-F4">
<action name="GoToDesktop"><to>4</to></action>
</keybind>
<keybind key="W-d">
<action name="ToggleShowDesktop"/>
</keybind>
<!-- Keybindings for windows -->
<keybind key="A-F4">
<action name="Close"/>
</keybind>
<keybind key="A-Escape">
<action name="Lower"/>
<action name="FocusToBottom"/>
<action name="Unfocus"/>
</keybind>
<keybind key="A-space">
<!--action name="ShowMenu"><menu>client-menu</menu></action-->
</keybind>
<!-- Take a screenshot of the current window with scrot when Alt+Print are pressed -->
<keybind key="A-Print">
<action name="Execute"><command>scrot -s</command></action>
</keybind>
<!-- Keybindings for window switching -->
<keybind key="A-Tab">
<action name="NextWindow">
<finalactions>
<action name="Focus"/>
<action name="Raise"/>
<action name="Unshade"/>
</finalactions>
</action>
</keybind>
<keybind key="A-S-Tab">
<action name="PreviousWindow">
<finalactions>
<action name="Focus"/>
<action name="Raise"/>
<action name="Unshade"/>
</finalactions>
</action>
</keybind>
<keybind key="C-A-Tab">
<action name="NextWindow">
<panels>yes</panels><desktop>yes</desktop>
<finalactions>
<action name="Focus"/>
<action name="Raise"/>
<action name="Unshade"/>
</finalactions>
</action>
</keybind>
<!-- Keybindings for window switching with the arrow keys -->
<keybind key="W-S-Right">
<action name="DirectionalCycleWindows">
<direction>right</direction>
</action>
</keybind>
<keybind key="W-S-Left">
<action name="DirectionalCycleWindows">
<direction>left</direction>
</action>
</keybind>
<keybind key="W-S-Up">
<action name="DirectionalCycleWindows">
<direction>up</direction>
</action>
</keybind>
<keybind key="W-S-Down">
<action name="DirectionalCycleWindows">
<direction>down</direction>
</action>
</keybind>
<!-- Keybindings for running applications -->
<keybind key="W-e">
<action name="Execute">
<startupnotify>
<enabled>true</enabled>
<name>Konqueror</name>
</startupnotify>
<command>kfmclient openProfile filemanagement</command>
</action>
</keybind>
<!-- Launch scrot when Print is pressed -->
<keybind key="Print">
<action name="Execute"><command>scrot</command></action>
</keybind>
</keyboard>
<mouse>
<dragThreshold>1</dragThreshold>
<!-- number of pixels the mouse must move before a drag begins -->
<doubleClickTime>500</doubleClickTime>
<!-- in milliseconds (1000 = 1 second) -->
<screenEdgeWarpTime>400</screenEdgeWarpTime>
<!-- Time before changing desktops when the pointer touches the edge of the
screen while moving a window, in milliseconds (1000 = 1 second).
Set this to 0 to disable warping -->
<screenEdgeWarpMouse>false</screenEdgeWarpMouse>
<!-- Set this to TRUE to move the mouse pointer across the desktop when
switching due to hitting the edge of the screen -->
<context name="Frame">
<mousebind button="A-Left" action="Press">
<action name="Focus"/>
<action name="Raise"/>
</mousebind>
<mousebind button="A-Left" action="Click">
<action name="Unshade"/>
</mousebind>
<mousebind button="A-Left" action="Drag">
<action name="Move"/>
</mousebind>
<mousebind button="A-Right" action="Press">
<action name="Focus"/>
<action name="Raise"/>
<action name="Unshade"/>
</mousebind>
<mousebind button="A-Right" action="Drag">
<action name="Resize"/>
</mousebind>
<mousebind button="A-Middle" action="Press">
<action name="Lower"/>
<action name="FocusToBottom"/>
<action name="Unfocus"/>
</mousebind>
<mousebind button="A-Up" action="Click">
<action name="GoToDesktop"><to>previous</to></action>
</mousebind>
<mousebind button="A-Down" action="Click">
<action name="GoToDesktop"><to>next</to></action>
</mousebind>
<mousebind button="C-A-Up" action="Click">
<action name="GoToDesktop"><to>previous</to></action>
</mousebind>
<mousebind button="C-A-Down" action="Click">
<action name="GoToDesktop"><to>next</to></action>
</mousebind>
<mousebind button="A-S-Up" action="Click">
<action name="SendToDesktop"><to>previous</to></action>
</mousebind>
<mousebind button="A-S-Down" action="Click">
<action name="SendToDesktop"><to>next</to></action>
</mousebind>
</context>
<context name="Titlebar">
<mousebind button="Left" action="Drag">
<action name="Move"/>
</mousebind>
<mousebind button="Left" action="DoubleClick">
<action name="ToggleMaximize"/>
</mousebind>
<mousebind button="Up" action="Click">
<action name="if">
<shaded>no</shaded>
<then>
<action name="Shade"/>
<action name="FocusToBottom"/>
<action name="Unfocus"/>
<action name="Lower"/>
</then>
</action>
</mousebind>
<mousebind button="Down" action="Click">
<action name="if">
<shaded>yes</shaded>
<then>
<action name="Unshade"/>
<action name="Raise"/>
</then>
</action>
</mousebind>
</context>
<context name="Titlebar Top Right Bottom Left TLCorner TRCorner BRCorner BLCorner">
<mousebind button="Left" action="Press">
<action name="Focus"/>
<action name="Raise"/>
<action name="Unshade"/>
</mousebind>
<mousebind button="Middle" action="Press">
<action name="Lower"/>
<action name="FocusToBottom"/>
<action name="Unfocus"/>
</mousebind>
<!--mousebind button="Right" action="Press">
<action name="Focus"/>
<action name="Raise"/>
<action name="ShowMenu"><menu>client-menu</menu></action>
</mousebind-->
</context>
<context name="Top">
<mousebind button="Left" action="Drag">
<action name="Resize"><edge>top</edge></action>
</mousebind>
</context>
<context name="Left">
<mousebind button="Left" action="Drag">
<action name="Resize"><edge>left</edge></action>
</mousebind>
</context>
<context name="Right">
<mousebind button="Left" action="Drag">
<action name="Resize"><edge>right</edge></action>
</mousebind>
</context>
<context name="Bottom">
<mousebind button="Left" action="Drag">
<action name="Resize"><edge>bottom</edge></action>
</mousebind>
<!--mousebind button="Right" action="Press">
<action name="Focus"/>
<action name="Raise"/>
<action name="ShowMenu"><menu>client-menu</menu></action>
</mousebind-->
</context>
<context name="TRCorner BRCorner TLCorner BLCorner">
<mousebind button="Left" action="Press">
<action name="Focus"/>
<action name="Raise"/>
<action name="Unshade"/>
</mousebind>
<mousebind button="Left" action="Drag">
<action name="Resize"/>
</mousebind>
</context>
<context name="Client">
<mousebind button="Left" action="Press">
<action name="Focus"/>
<action name="Raise"/>
</mousebind>
<mousebind button="Middle" action="Press">
<action name="Focus"/>
<action name="Raise"/>
</mousebind>
<mousebind button="Right" action="Press">
<action name="Focus"/>
<action name="Raise"/>
</mousebind>
</context>
<context name="Icon">
<!--mousebind button="Left" action="Press">
<action name="Focus"/>
<action name="Raise"/>
<action name="Unshade"/>
<action name="ShowMenu"><menu>client-menu</menu></action>
</mousebind>
<mousebind button="Right" action="Press">
<action name="Focus"/>
<action name="Raise"/>
<action name="ShowMenu"><menu>client-menu</menu></action>
</mousebind-->
</context>
<context name="AllDesktops">
<mousebind button="Left" action="Press">
<action name="Focus"/>
<action name="Raise"/>
<action name="Unshade"/>
</mousebind>
<mousebind button="Left" action="Click">
<action name="ToggleOmnipresent"/>
</mousebind>
</context>
<context name="Shade">
<mousebind button="Left" action="Press">
<action name="Focus"/>
<action name="Raise"/>
</mousebind>
<mousebind button="Left" action="Click">
<action name="ToggleShade"/>
</mousebind>
</context>
<context name="Iconify">
<mousebind button="Left" action="Press">
<action name="Focus"/>
<action name="Raise"/>
</mousebind>
<mousebind button="Left" action="Click">
<action name="Iconify"/>
</mousebind>
</context>
<context name="Maximize">
<mousebind button="Left" action="Press">
<action name="Focus"/>
<action name="Raise"/>
<action name="Unshade"/>
</mousebind>
<mousebind button="Middle" action="Press">
<action name="Focus"/>
<action name="Raise"/>
<action name="Unshade"/>
</mousebind>
<mousebind button="Right" action="Press">
<action name="Focus"/>
<action name="Raise"/>
<action name="Unshade"/>
</mousebind>
<mousebind button="Left" action="Click">
<action name="ToggleMaximize"/>
</mousebind>
<mousebind button="Middle" action="Click">
<action name="ToggleMaximize"><direction>vertical</direction></action>
</mousebind>
<mousebind button="Right" action="Click">
<action name="ToggleMaximize"><direction>horizontal</direction></action>
</mousebind>
</context>
<context name="Close">
<mousebind button="Left" action="Press">
<action name="Focus"/>
<action name="Raise"/>
<action name="Unshade"/>
</mousebind>
<mousebind button="Left" action="Click">
<action name="Close"/>
</mousebind>
</context>
<context name="Desktop">
<mousebind button="Up" action="Click">
<action name="GoToDesktop"><to>previous</to></action>
</mousebind>
<mousebind button="Down" action="Click">
<action name="GoToDesktop"><to>next</to></action>
</mousebind>
<mousebind button="A-Up" action="Click">
<action name="GoToDesktop"><to>previous</to></action>
</mousebind>
<mousebind button="A-Down" action="Click">
<action name="GoToDesktop"><to>next</to></action>
</mousebind>
<mousebind button="C-A-Up" action="Click">
<action name="GoToDesktop"><to>previous</to></action>
</mousebind>
<mousebind button="C-A-Down" action="Click">
<action name="GoToDesktop"><to>next</to></action>
</mousebind>
<mousebind button="Left" action="Press">
<action name="Focus"/>
<action name="Raise"/>
</mousebind>
<mousebind button="Right" action="Press">
<action name="Focus"/>
<action name="Raise"/>
</mousebind>
</context>
<context name="Root">
<!-- Menus -->
<!--mousebind button="Middle" action="Press">
<action name="ShowMenu"><menu>client-list-combined-menu</menu></action>
</mousebind>
<mousebind button="Right" action="Press">
<action name="ShowMenu"><menu>root-menu</menu></action>
</mousebind-->
</context>
<context name="MoveResize">
<mousebind button="Up" action="Click">
<action name="GoToDesktop"><to>previous</to></action>
</mousebind>
<mousebind button="Down" action="Click">
<action name="GoToDesktop"><to>next</to></action>
</mousebind>
<mousebind button="A-Up" action="Click">
<action name="GoToDesktop"><to>previous</to></action>
</mousebind>
<mousebind button="A-Down" action="Click">
<action name="GoToDesktop"><to>next</to></action>
</mousebind>
</context>
</mouse>
<menu>
<!-- You can specify more than one menu file in here and they are all loaded,
just don't make menu ids clash or, well, it'll be kind of pointless -->
<!-- default menu file (or custom one in $HOME/.config/openbox/) -->
<!-- system menu files on Debian systems -->
<!--file>/var/lib/openbox/debian-menu.xml</file-->
<file>menu.xml</file>
<hideDelay>200</hideDelay>
<!-- if a press-release lasts longer than this setting (in milliseconds), the
menu is hidden again -->
<middle>no</middle>
<!-- center submenus vertically about the parent entry -->
<submenuShowDelay>100</submenuShowDelay>
<!-- time to delay before showing a submenu after hovering over the parent
entry.
if this is a negative value, then the delay is infinite and the
submenu will not be shown until it is clicked on -->
<submenuHideDelay>400</submenuHideDelay>
<!-- time to delay before hiding a submenu when selecting another
entry in parent menu
if this is a negative value, then the delay is infinite and the
submenu will not be hidden until a different submenu is opened -->
<showIcons>yes</showIcons>
<!-- controls if icons appear in the client-list-(combined-)menu -->
<manageDesktops>yes</manageDesktops>
<!-- show the manage desktops section in the client-list-(combined-)menu -->
</menu>
<applications>
<!--
# this is an example with comments through out. use these to make your
# own rules, but without the comments of course.
# you may use one or more of the name/class/role/title/type rules to specify
# windows to match
<application name="the window's _OB_APP_NAME property (see obxprop)"
class="the window's _OB_APP_CLASS property (see obxprop)"
groupname="the window's _OB_APP_GROUP_NAME property (see obxprop)"
groupclass="the window's _OB_APP_GROUP_CLASS property (see obxprop)"
role="the window's _OB_APP_ROLE property (see obxprop)"
title="the window's _OB_APP_TITLE property (see obxprop)"
type="the window's _OB_APP_TYPE property (see obxprob)..
(if unspecified, then it is 'dialog' for child windows)">
# you may set only one of name/class/role/title/type, or you may use more
# than one together to restrict your matches.
# the name, class, role, and title use simple wildcard matching such as those
# used by a shell. you can use * to match any characters and ? to match
# any single character.
# the type is one of: normal, dialog, splash, utility, menu, toolbar, dock,
# or desktop
# when multiple rules match a window, they will all be applied, in the
# order that they appear in this list
# each rule element can be left out or set to 'default' to specify to not
# change that attribute of the window
<decor>yes</decor>
# enable or disable window decorations
<shade>no</shade>
# make the window shaded when it appears, or not
<position force="no">
# the position is only used if both an x and y coordinate are provided
# (and not set to 'default')
# when force is "yes", then the window will be placed here even if it
# says you want it placed elsewhere. this is to override buggy
# applications who refuse to behave
<x>center</x>
# a number like 50, or 'center' to center on screen. use a negative number
# to start from the right (or bottom for <y>), ie -50 is 50 pixels from
# the right edge (or bottom). use 'default' to specify using value
# provided by the application, or chosen by openbox, instead.
<y>200</y>
<monitor>1</monitor>
# specifies the monitor in a xinerama setup.
# 1 is the first head, or 'mouse' for wherever the mouse is
</position>
<size>
# the size to make the window.
<width>20</width>
# a number like 20, or 'default' to use the size given by the application.
# you can use fractions such as 1/2 or percentages such as 75% in which
# case the value is relative to the size of the monitor that the window
# appears on.
<height>30%</height>
</size>
<focus>yes</focus>
# if the window should try be given focus when it appears. if this is set
# to yes it doesn't guarantee the window will be given focus. some
# restrictions may apply, but Openbox will try to
<desktop>1</desktop>
# 1 is the first desktop, 'all' for all desktops
<layer>normal</layer>
# 'above', 'normal', or 'below'
<iconic>no</iconic>
# make the window iconified when it appears, or not
<skip_pager>no</skip_pager>
# asks to not be shown in pagers
<skip_taskbar>no</skip_taskbar>
# asks to not be shown in taskbars. window cycling actions will also
# skip past such windows
<fullscreen>yes</fullscreen>
# make the window in fullscreen mode when it appears
<maximized>true</maximized>
# 'Horizontal', 'Vertical' or boolean (yes/no)
</application>
# end of the example
-->
</applications>
</openbox_config>

View file

@ -0,0 +1,129 @@
{
"policies": {
"BlockAboutAddons": false,
"BlockAboutConfig": true,
"BlockAboutProfiles": true,
"BlockAboutSupport": true,
"Bookmarks": [
{
"Title": "IPLeak",
"URL": "https://ipleak.net/",
"Favicon": "https://ipleak.net/favicon.ico",
"Folder": "Pages",
"Placement": "toolbar"
},
{
"Title": "YouTube",
"URL": "https://www.youtube.com/",
"Favicon": "https://www.youtube.com/favicon.ico",
"Folder": "Pages",
"Placement": "toolbar"
},
{
"Title": "Google",
"URL": "https://www.google.com/",
"Favicon": "https://www.google.com/favicon.ico",
"Folder": "Pages",
"Placement": "toolbar"
}
],
"CaptivePortal": false,
"DisableAppUpdate": true,
"DisableBuiltinPDFViewer": true,
"DisableDeveloperTools": false,
"DisableFeedbackCommands": true,
"DisableFirefoxAccounts": true,
"DisableFirefoxScreenshots": true,
"DisableFirefoxStudies": true,
"DisableForgetButton": true,
"DisableMasterPasswordCreation": true,
"DisablePocket": true,
"DisablePrivateBrowsing": true,
"DisableProfileImport": true,
"DisableProfileRefresh": true,
"DisableSafeMode": true,
"DisableSetDesktopBackground": true,
"DisableSystemAddonUpdate": true,
"DisableTelemetry": true,
"DisplayBookmarksToolbar": false,
"DontCheckDefaultBrowser": true,
"EnableTrackingProtection": {
"Cryptomining": true,
"Fingerprinting": true,
"Value": true
},
"ExtensionSettings": {
"*": {
"installation_mode": "blocked"
},
"sponsorBlocker@ajay.app": {
"install_url": "https://addons.mozilla.org/firefox/downloads/latest/sponsorblock/latest.xpi",
"installation_mode": "force_installed"
},
"uBlock0@raymondhill.net": {
"install_url": "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi",
"installation_mode": "force_installed"
}
},
"ExtensionUpdate": false,
"FirefoxHome": {
"Highlights": false,
"Pocket": false,
"Search": true,
"Snippets": false,
"TopSites": true
},
"FlashPlugin": {},
"HardwareAcceleration": false,
"Homepage": {
"Additional": [],
"StartPage": "home"
},
"NewTabPage": true,
"NoDefaultBookmarks": true,
"OfferToSaveLogins": false,
"OfferToSaveLoginsDefault": false,
"OverrideFirstRunPage": "",
"OverridePostUpdatePage": "",
"PasswordManagerEnabled": false,
"Permissions": {
"Camera": {
"BlockNewRequests": true
},
"Location": {
"BlockNewRequests": true
},
"Microphone": {
"BlockNewRequests": true
},
"Notifications": {
"BlockNewRequests": true
}
},
"Preferences": {
"browser.tabs.warnOnClose": false,
"browser.urlbar.suggest.bookmark": false,
"browser.urlbar.suggest.history": false,
"browser.urlbar.suggest.openpage": false,
"datareporting.policy.dataSubmissionPolicyBypassNotification": true,
"dom.disable_window_flip": true,
"dom.disable_window_move_resize": true,
"dom.event.contextmenu.enabled": true,
"extensions.getAddons.showPane": false,
"places.history.enabled": false,
"privacy.file_unique_origin": true,
"ui.key.menuAccessKeyFocuses": false
},
"PromptForDownloadLocation": false,
"SanitizeOnShutdown": {
"Cache": true,
"Cookies": true,
"Downloads": true,
"FormData": true,
"History": true,
"OfflineApps": true,
"Sessions": true,
"SiteSettings": true
}
}
}

View file

@ -0,0 +1,8 @@
[General]
StartWithLastProfile=1
[Profile0]
Name=default
IsRelative=1
Path=profile.default
Default=1

View file

@ -0,0 +1,22 @@
[program:waterfox]
environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s"
command=/usr/bin/waterfox --no-remote -P default --display=%(ENV_DISPLAY)s -setDefaultBrowser -width 1280 -height 720
stopsignal=INT
autorestart=true
priority=800
user=%(ENV_USER)s
stdout_logfile=/var/log/neko/waterfox.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

View file

@ -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, vivaldi, opera, tor-browser, remmina, vlc, xfce, kde ]
tags: [ firefox, waterfox, chromium, google-chrome, ungoogled-chromium, microsoft-edge, brave, vivaldi, opera, tor-browser, remmina, vlc, xfce, kde ]
env:
DOCKER_TAG: ${{ matrix.tags }}
steps:

View file

@ -70,6 +70,7 @@ jobs:
matrix:
include:
- tag: firefox
- tag: waterfox
- tag: chromium
- tag: google-chrome
- tag: ungoogled-chromium

View file

@ -41,7 +41,8 @@ In comparison to Chromium-based browsers, Firefox-based browsers do not require
| Icon | Name | Docker Image |
| ---- | ---- | ------------ |
| <img src="/img/icons/firefox.svg" width="60" height="60" /> | [Firefox](https://www.mozilla.org/firefox/) <br /> The open-source browser from Mozilla. | [`ghcr.io/m1k1o/neko/firefox`](https://ghcr.io/m1k1o/neko/firefox) |
| <img src="/img/icons/tor-browser.svg" width="60" height="60" /> | [Tor Browser](https://www.torproject.org/) <br /> The privacy-focused browser from the Tor Project. | [`ghcr.io/m1k1o/neko/tor-browser`](https://ghcr.io/m1k1o/neko/tor-browser) |
| <img src="/img/icons/tor-browser.svg" width="60" height="60" /> | [Tor Browser](https://www.torproject.org/) <br /> A browser designed to access the Tor network for enhanced privacy. | [`ghcr.io/m1k1o/neko/tor-browser`](https://ghcr.io/m1k1o/neko/tor-browser) |
| <img src="/img/icons/waterfox.svg" width="60" height="60" /> | [Waterfox](https://www.waterfox.net/) <br /> A privacy-focused browser based on Firefox. | [`ghcr.io/m1k1o/neko/waterfox`](https://ghcr.io/m1k1o/neko/waterfox) |
### Chromium-based browsers

View file

@ -0,0 +1,16 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" version="1">
<path style="opacity:0.2" d="m 55.245771,20.996622 a 6.8097245,6.8097245 0 0 0 -6.3046,4.101505 l -5.398363,11.988115 -0.0078,-0.0156 0.0196,-0.03516 c -1.113598,-1.984757 -2.312787,-4.296549 -3.632761,-6.589753 -0.622387,1.040496 -1.233387,2.054308 -1.898412,3.117145 l -0.226558,0.347651 -5.808514,10.331889 5.964759,10.60532 a 6.8097245,6.8097245 0 0 0 3.960883,3.742136 6.8097245,6.8097245 0 0 0 1.738258,0.382807 c 0.03906,0.0034 0.0781,0.0011 0.117179,0.004 a 6.8097245,6.8097245 0 0 0 0.648426,0.0118 c 0.103179,-0.0024 0.205624,-0.0048 0.30859,-0.0118 a 6.8097245,6.8097245 0 0 0 0.347651,-0.03906 c 2.236953,-0.26197 4.356078,-1.590856 5.417895,-3.976506 l 3.874946,-8.722535 c -0.0036,0.0022 -0.008,0.0018 -0.0118,0.004 l 7.003819,-15.554684 a 6.8097245,6.8097245 0 0 0 -6.113197,-9.691271 z m -46.6946638,0.0039 a 6.8097245,6.8097245 0 0 0 -5.910074,9.687365 l 7.0116213,15.574001 c 1.9168845,1.106687 3.9336785,1.707523 5.7382015,-0.218746 l 5.050711,-8.972532 -0.02344,-0.03516 c 0.0026,-0.0046 0.0052,-0.011 0.0078,-0.0156 L 15.058829,25.098127 A 6.8097245,6.8097245 0 0 0 8.5511072,21.000528 Z m 17.5622568,33.687031 -0.476557,0.843739 c -1.18964,2.112978 -3.20077,3.245515 -5.285083,3.437452 a 6.8097245,6.8097245 0 0 0 5.76164,-4.281191 z m -5.871012,4.289003 c -0.214135,0.0164 -0.429966,0.0152 -0.644523,0.0118 a 6.8097245,6.8097245 0 0 0 0.644523,-0.0118 z"/>
<path style="opacity:0.2" d="m 44.999819,6.9999974 a 2.9999583,2.9999583 0 0 0 -2.999958,2.9999586 2.9999583,2.9999583 0 0 0 2.999958,2.999958 2.9999583,2.9999583 0 0 0 2.999959,-2.999958 2.9999583,2.9999583 0 0 0 -2.999959,-2.9999586 z m -11.2225,1.9999722 c -0.876891,0.00108 -1.80703,0.2636894 -2.746055,0.7890514 -3.50476,1.960851 -5.229878,5.354885 -5.011649,9.855331 0.05508,1.137341 0.225665,2.35677 0.378901,2.710901 0.153238,0.354133 0.407256,0.644523 0.566398,0.644523 0.159138,0 0.836136,-0.617672 1.503885,-1.371075 0.908102,-1.024598 1.693499,-1.62159 3.121051,-2.367155 3.815093,-1.992489 4.165996,-2.215664 5.081961,-3.296829 1.72737,-2.038919 1.770436,-4.046126 0.124998,-5.687421 C 35.943991,9.426649 34.90477,8.998568 33.777319,8.9999696 Z M 19.343926,16.999858 c -0.210135,-0.0059 -0.423215,0.0097 -0.632804,0.05078 -1.664941,0.328945 -2.967099,2.821794 -2.667931,5.101493 0.185485,1.413512 1.451061,3.573864 2.531215,4.324157 0.468942,0.325732 1.079011,0.560425 1.355449,0.519525 0.432955,-0.0641 0.527118,-0.329319 0.679679,-1.910129 0.09738,-1.009332 0.457738,-2.524799 0.800769,-3.367141 0.748594,-1.838189 0.770814,-2.435677 0.140618,-3.503859 -0.428244,-0.725872 -1.296434,-1.186764 -2.206995,-1.214827 z"/>
<path style="fill:none;stroke:#00a5f5;stroke-width:13.61808777;stroke-linecap:round;stroke-linejoin:round" d="M 8.8492517,26.90046 19.743721,51.102305"/>
<path style="fill:none;stroke:#7369e8;stroke-width:13.61808777;stroke-linecap:round;stroke-linejoin:round" d="M 44.256278,51.102305 55.150748,26.90046 v 0 0"/>
<path style="opacity:0.1;fill:#ffffff" d="M 55.244141 20.003906 A 6.8097248 6.8097248 0 0 0 48.941406 24.105469 L 38.046875 48.306641 A 6.8097248 6.8097248 0 0 0 37.431641 51.716797 A 6.8097248 6.8097248 0 0 1 38.046875 49.306641 L 48.941406 25.105469 A 6.8097248 6.8097248 0 0 1 55.244141 21.003906 A 6.8097248 6.8097248 0 0 1 61.974609 27.287109 A 6.8097248 6.8097248 0 0 0 55.244141 20.003906 z M 8.5507812 20.007812 A 6.8097248 6.8097248 0 0 0 2.0253906 27.34375 A 6.8097248 6.8097248 0 0 1 8.5507812 21.007812 A 6.8097248 6.8097248 0 0 1 15.058594 25.105469 L 25.953125 49.306641 A 6.8097248 6.8097248 0 0 1 26.568359 51.658203 A 6.8097248 6.8097248 0 0 0 25.953125 48.306641 L 15.058594 24.105469 A 6.8097248 6.8097248 0 0 0 8.5507812 20.007812 z"/>
<path style="fill:#00aeda" d="m 31.403572,24.642791 c 9.752859,9.431653 1.048674,-1.335312 2.884746,-0.713782 4.453896,1.473033 0.416117,-1.71228 2.426811,0.559724 2.747839,3.592998 4.895072,8.077978 6.840958,11.546118 l -0.02128,0.03458 5.048268,8.974107 c 1.81913,1.941861 3.854282,1.320666 5.785027,0.196818 l -3.875304,8.718768 c -2.276384,5.114497 -9.408707,5.450045 -12.155207,0.571854 L 26.177063,32.912266 25.95364,32.563833 c -2.430862,-3.88499 4.370175,-0.841185 1.104657,-3.796039 -0.365301,-0.323188 0.764395,-0.720724 0.990316,-1.273957 0.916203,-2.243607 0.787157,1.129425 2.716204,0.725938 0.402001,-0.05536 -0.440466,0.0072 0,0 z"/>
<path style="opacity:0.2;fill:#ffffff" d="M 36.113281 23.650391 C 36.093612 23.683349 36.2202 23.87539 36.466797 24.181641 C 36.559075 23.959748 36.154327 23.581614 36.113281 23.650391 z M 36.466797 24.181641 C 36.382398 24.384586 35.884786 24.45744 34.289062 23.929688 C 33.863725 23.785706 34.011968 24.263564 34.357422 24.949219 C 35.884632 25.445815 36.383951 25.380852 36.466797 25.181641 C 35.705607 24.236313 36.603295 24.853416 36.466797 25.181641 C 36.548616 25.283252 36.589611 25.346774 36.714844 25.488281 C 39.462683 29.081279 41.610755 33.567016 43.556641 37.035156 L 43.535156 37.070312 L 48.583984 46.042969 C 50.21971 47.789051 52.029161 47.459167 53.78125 46.558594 L 54.367188 45.240234 C 52.436443 46.364082 50.403114 46.98483 48.583984 45.042969 L 43.535156 36.070312 L 43.556641 36.035156 C 41.610755 32.567016 39.462683 28.081279 36.714844 24.488281 C 36.589611 24.346774 36.548616 24.283252 36.466797 24.181641 z M 31.404297 24.642578 L 30.769531 28.201172 C 30.865364 28.194987 30.950689 28.195218 30.765625 28.220703 C 28.836578 28.62419 28.965031 25.250534 28.048828 27.494141 C 27.822907 28.047374 26.693293 28.44439 27.058594 28.767578 C 27.212472 28.906817 27.322402 29.020814 27.433594 29.134766 C 27.678163 28.945039 27.949657 28.736989 28.048828 28.494141 C 28.965031 26.250534 28.836578 29.62419 30.765625 29.220703 C 30.527931 29.224589 30.657194 29.208422 30.769531 29.201172 L 31.404297 25.642578 C 36.441994 30.514361 36.537666 29.979122 35.722656 28.425781 C 35.146146 28.110469 33.865126 27.022361 31.404297 24.642578 z M 30.769531 29.201172 L 30.765625 29.220703 C 30.950689 29.195218 30.865364 29.194987 30.769531 29.201172 z M 30.765625 28.220703 L 30.769531 28.201172 C 30.657194 28.208422 30.527931 28.224589 30.765625 28.220703 z M 27.535156 30.234375 C 26.693922 30.396129 24.966727 30.192093 25.552734 31.763672 C 26.209647 30.892842 29.01197 31.817861 27.535156 30.234375 z"/>
<path style="fill:#20ebff" d="m 36.457902,18.360578 c -4.453896,1.473034 -7.186834,3.76467 -9.197528,6.036674 C 24.512532,27.99025 22.3653,32.47523 20.419413,35.94337 l 0.02128,0.03458 -5.04827,8.974108 c -1.81913,1.941861 -3.854281,1.320665 -5.7850264,0.196817 L 13.4827,53.867643 c 2.276385,5.114497 9.408707,5.450044 12.155207,0.571854 L 37.798433,32.820783 38.021854,32.47235 c 2.430865,-3.88499 4.312438,-7.739652 7.577957,-10.694507 2.987731,-3.015075 -6.026632,-4.28853 -9.141909,-3.417265 z"/>
<circle style="fill:#20ebff" cx="45" cy="9.001" r="3"/>
<path style="fill:#20ebff" d="m 33.778861,8.0007256 c -0.876891,0.00108 -1.807643,0.2621028 -2.746667,0.7874647 -3.50476,1.9608507 -5.23195,5.3562367 -5.013721,9.8566837 0.05508,1.13734 0.225737,2.357755 0.378973,2.711887 0.153238,0.354133 0.40902,0.643767 0.568162,0.643767 0.159138,0 0.83544,-0.616428 1.503189,-1.369831 0.908102,-1.024598 1.695303,-1.620953 3.122855,-2.366518 3.815093,-1.992489 4.163302,-2.218912 5.079265,-3.300077 1.727372,-2.038919 1.772196,-4.044172 0.126758,-5.6854678 C 35.944857,8.4279879 34.906322,7.999324 33.778871,8.0007256 Z"/>
<path style="fill:#20ebff" d="m 19.344389,16.001766 c -0.210135,-0.0059 -0.42243,0.01042 -0.632019,0.05151 -1.664941,0.328945 -2.968361,2.818024 -2.669193,5.09772 0.185485,1.413513 1.450798,3.576725 2.530952,4.327018 0.468942,0.325732 1.07855,0.558693 1.354988,0.517793 0.432955,-0.0641 0.527102,-0.328839 0.679663,-1.909649 0.09738,-1.009332 0.457904,-2.524425 0.800935,-3.366768 0.748594,-1.838188 0.773128,-2.436635 0.142938,-3.504816 -0.42825,-0.725872 -1.297712,-1.184714 -2.208272,-1.212776 z"/>
<path style="opacity:0.2" d="m 36.457902,19.452029 c -4.453896,1.473034 -7.186834,3.764672 -9.197528,6.036676 -2.747842,3.592998 -4.895074,8.077978 -6.840961,11.546118 l 0.02128,0.03458 -5.04827,8.974108 c -1.81913,1.941861 -3.854281,1.320665 -5.7850264,0.196817 L 13.4827,54.959096 c 2.276385,5.114496 9.408707,5.450044 12.155207,0.571854 l 12.160526,-21.618714 0.223421,-0.348433 c 2.430865,-3.88499 4.312438,-7.739652 7.577957,-10.694507 2.987731,-3.015076 -6.026632,-4.288532 -9.141909,-3.417267 z"/>
<path style="fill:#20ebff" d="m 36.457902,18.452058 c -4.453896,1.473034 -7.186834,3.764671 -9.197528,6.036675 -2.747842,3.592998 -4.895074,8.077978 -6.840961,11.546118 l 0.02128,0.03458 -5.04827,8.974107 c -1.81913,1.941861 -3.854281,1.320666 -5.7850264,0.196818 L 13.4827,53.959123 c 2.276385,5.114497 9.408707,5.450045 12.155207,0.571854 l 12.160526,-21.618713 0.223421,-0.348433 c 2.430865,-3.88499 4.312438,-7.739653 7.577957,-10.694508 2.987731,-3.015075 -6.026632,-4.28853 -9.141909,-3.417265 z"/>
<path style="opacity:0.2;fill:#ffffff" d="M 45 6 A 2.9999583 2.9999583 0 0 0 42 9 A 2.9999583 2.9999583 0 0 0 42.042969 9.4863281 A 2.9999583 2.9999583 0 0 1 45 7 A 2.9999583 2.9999583 0 0 1 47.957031 9.5136719 A 2.9999583 2.9999583 0 0 0 48 9 A 2.9999583 2.9999583 0 0 0 45 6 z M 33.779297 8 C 32.902406 8.00108 31.970274 8.2637006 31.03125 8.7890625 C 27.52649 10.749913 25.799349 14.144084 26.017578 18.644531 C 26.018589 18.665402 26.02235 18.684156 26.023438 18.705078 C 26.079492 14.677002 27.778251 11.609057 31.03125 9.7890625 C 31.970274 9.2637006 32.902406 9.00108 33.779297 9 C 34.906748 8.9985984 35.944057 9.4286507 36.796875 10.279297 C 37.448406 10.929188 37.824942 11.637331 37.947266 12.380859 C 38.105419 11.270318 37.734506 10.214567 36.796875 9.2792969 C 35.944057 8.4286506 34.906748 7.9985984 33.779297 8 z M 19.34375 16.001953 C 19.133615 15.996053 18.92248 16.011644 18.712891 16.052734 C 17.083887 16.374579 15.811554 18.763703 16.037109 21.001953 C 16.205851 19.100674 17.326572 17.326631 18.712891 17.052734 C 18.92248 17.011654 19.133615 16.996053 19.34375 17.001953 C 20.25431 17.030014 21.124484 17.488972 21.552734 18.214844 C 21.748173 18.546115 21.873929 18.833217 21.941406 19.125 C 22.088057 18.386044 21.953565 17.894258 21.552734 17.214844 C 21.124484 16.488972 20.25431 16.030015 19.34375 16.001953 z M 39.621094 18.195312 C 38.384595 18.151338 37.235851 18.233356 36.457031 18.451172 C 32.003135 19.924206 29.27046 22.216277 27.259766 24.488281 C 24.511924 28.081279 22.365809 32.567016 20.419922 36.035156 L 20.441406 36.070312 L 15.392578 45.042969 C 13.573448 46.98483 11.538167 46.364082 9.6074219 45.240234 L 10.193359 46.556641 C 11.946104 47.457937 13.756217 47.78973 15.392578 46.042969 L 20.441406 37.070312 L 20.419922 37.035156 C 22.365809 33.567016 24.511924 29.081279 27.259766 25.488281 C 29.27046 23.216277 32.003135 20.924206 36.457031 19.451172 C 37.235851 19.233352 38.384595 19.151342 39.621094 19.195312 C 42.307807 19.290864 45.401143 19.991638 46.058594 21.228516 C 46.936728 19.368569 42.962341 18.314142 39.621094 18.195312 z"/>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB