Explaining Everything In My XMonad Config

DistroTube
233 followers
Oct 25, 2024
i've been getting a lot of questions
recently about xmo nad because i haven't
made a video
about the x moment ad telling window
manager in a while
and i've made a lot of videos about it
in the past so if you guys are
interested you're just now starting with
x monet or maybe you're just now
starting with
tiling window managers in general go
check out some of those older videos
that i've done on exmonet
they'll really help but today what i
wanted to do was i wanted to show you
guys
my current configuration file because
i'm always tweaking things in my xml net
can fix i'm going to
go through my very massive xmo.net
config file and i'm going to break down
every section of my config file and
explain exactly
what those little snippets of code do so
let me switch over to the desktop here
of course this is xmonet if i opened a
few terminals here you can see that's
the standard master and stack layout
there in xmo ned
the panel at the top is xmobar now let
me go over my config i'm going to go
over
my config section by section and show
you guys exactly what's going
on uh how i get all the effects and
everything that i want in my xmonet and
hopefully you guys can
glean a little information and take
parts of my config that you guys may
want
uh throw away the parts that you don't
want so let me open up doom emacs and
i'm going to open up my xml ad config
and my exmonet config is normally a
literate config it is a uh
an org document so it's going to have a
lot of comments and everything
now your nad config is just going to be
a haskell file
so your exponent config is actually
going to be
xmonet.hs it's going to be in your home
directory slash
dot xmonad slash xmonet.hs
and that's just a haskell document the
org document is
the same as just i have comments this is
the only thing
writing it as an org file here in emacs
it's a little cleaner and
easier to read so i just wanted to
explain the difference why my
xml ad config may look a little bit
different because i'm going to have
bullet points and everything
just ignore those yours is just going to
be nothing but straight haskell of
course
so going over a little bit of my xmonet
config here the very first section of
your config
is likely going to be a section of
imports
this is where you import various exmonet
contrib libraries let me zoom in here a
little bit so we can
better read some of this so when you
install xmonet typically you install
two programs to install xmlnet you
install xmonet which is the base window
manager with the base packages it's very
small like smo nad is a very
minimal kind of window manager very
suckless
even though it's not a success program
but you also need to install
xmonet dash contrib what is this this is
a set of
extra modules that you probably are
going to want
most of these modules are what are
actually being imported in my config
these are these extra third-party
modules in the x-moned contrib package
that allow you to extend x-moned
in some ways that you can't with the
base package so if i go over to the
browser here and this is what you guys
need to do
i i would bookmark this page this is
from haskell.org they have a
search engine called hackage that you
can look up various haskell modules and
things like that
and i'm looking up x-moned-contrib i
will link to this page
in the show description but
x-moned-contrib is the third-party
extensions for x-modem
so again when you install x-moned you
also need to install x-monet dash
contrib
and if i go through the documentation
here
we have modules and there are i don't
know probably 100 of them it's a very
long list of modules
and these modules are what you end up
importing
here in your config you see you know
things like
import xmlned.actions.copywindow
and if i got into my xmonet
contrib documentation here exmonet
actions
dot copy window right there for some
reason i needed this particular module
what does it do it provides bindings to
duplicate a window on multiple
workspaces providing dwm like tagging
functionality
so i actually don't use this i added it
to my config file probably because
somebody else needed it
at some point you know i've got a lot of
people hey x mode ad doesn't work like
dwm how do i do this
x mode add doesn't work like awesome how
do i do that you know
x monad doesn't work like i3 how do i do
this so
i do have a lot of extra stuff in my
config file that i don't actually use
but anyway this is what you do you go in
here and find all these third-party
modules that do
you know whatever it is that you need to
get done
in your xmode config and then you import
those modules so that is the import
section here and i've got a lot of
things imported in mind
i'm actually going to scroll back up to
the imports because i do want to just
briefly cover
what some of the various uh imported
modules due
not specifically but the sections for
example we have
uh import and then xmonet.actions.name
of module
so these are various action modules for
example the copy window kill one that's
to kill a window with a key binding is
what that is
move to shift to next screen previous
screen these are actions that you do
on windows to move them amongst
different workspaces you know swap
between different monitors and things
like that so that's the actions
modules and then you have a data section
here and this is where i do things like
import data dot
char so data characters is space and two
upper
i know two upper is a module that
basically takes a string of characters
and makes it
uppercase so i know what that one is so
we have the hooks section here this is
import exmoned.hooks.name of module
and these are typically hooks related to
xmobar especially such as the dynamic
log hook
these are things that we're going to use
for
our x mobile config
xmonet.hooks.managedocs is another very
important one because that
includes modules for doing things like
avoid struts
avoid struts is the reason the window
does not cover up the xml bar panel
so that's avoiding struts toggle struts
is toggling on that functionality
so i have a key binding in my xmode
config where if i do super enter
i actually turn off the avoid struts so
it toggles the struts right
meaning my window no longer respects
that there's a panel on the screen right
it just takes up the
full screen real estate 100 uh
it also toggles off the border so that's
a different uh
module that i've imported so i have that
key binding that toggles struts and
turns off borders
and if i toggle it again of course i get
back into the
the normal avoid struts where it
respects the screen real estate at the
top
that should be occupied by xmobile the
next section
of imported modules is
xmonet.layout.name of module and these
of course are
layouts so grid variance grid so that's
for the grid layout so if i open up a
second window here i'm going to open up
four windows and if i do
super tab on my config changes the
layouts and
if i get to this one here this is the
grid layout
and i have that grid layout because i
imported that grid
module there and then
xmonad.layout.simplestfloat is a
floating layout
spiral resizable tile tab i have a tab
to layout three columns i have a three
columned layout
where everything is in three columns
dividing the screen vertically
i also have this section of what i call
layout modifiers these aren't
necessarily
layouts but these modify
layouts so for example the uh
no borders layout here so i showed you
that
you know i can get rid of the borders by
hitting super enter
it toggles struts and it does the no
borders command actually does two things
when i
do that command that's not a layout in
itself
no borders but it is a modifier to any
layout i can actually make any layout
toggle on and off no borders if i want
to also
under the layout modifiers i have
xmonet.layout.show w
name that's show workspace name and
this is an interesting little bling
effect
so right now i'm on workspace 2 which is
www
workspace 3 is called sys let me go to
workspace
3 so i'm going to do super 3 on the
keyboard and you see in the center of
the screen
it told me what workspace i just went to
let me go back to workspace 2
super too and it tells me www i just
went back to the www workspace
now uh that's a really neat kind of
effect
is it that useful no because i mean i
have a panel at the top of the screen
i never not know what workspace i'm on
but it is a really neat effect scrolling
down a little bit i also have imported a
lot of
exmonad prompts prompts for example for
man page for pass
that's the unix pass store we have a
shell prompt
ssh prompt a unicode prompt and the
exmonad prompt which is a prompt that
gives me
x monad con commands so
what are xml ad prompts well let me do
super shift enter in my config
brings up a run prompt and this is just
a standard run prompt
if i wanted to run alacrity for example
i just start typing
ala and if i hit enter you know it opens
up my alacrity
terminal that is the standard run prompt
now if i wanted to show you some of
these other prompts if i do
super p followed by a m this is the man
page prompt if i wanted the man page for
the ls command you know i could type ls
and hit enter
and get a man page pop up for ls
the ssh prompt is just ssh into remote
servers the unicode prompt is to search
through unicode characters for emojis
and then have it copied to a clipboard
and the exmonad prompt again is exmonad
commands so if i do
super p followed by x this is the
exmonet prompt and you can see it's
viewing workspaces
shifting to different workspaces killing
xmonet
restarting x-monet you know it's
x-monet's specific commands
in that particular prompt now scrolling
down a little further i have a section
in my config i call
variables this is just setting variables
that you're going to use
later in your config file if you have a
string of characters
that appears many many times in your
config for example my key bindings and
my key bindings
i have key bindings for a lot of
terminal based applications matter of
fact let me go
down to the bottom of my config to my
keybindings and i will show you some of
this so these are my key bindings
and let me find some that involve my
terminal ah right here
for example super enter mod return
spawns my terminal plus plus e fish
so it launches my terminal and then
launches the fish shell
it looks like uh super alt h launches my
terminal and then it launches
h top so let me try that super alt h
and it launches my terminal and then
h-stop within my terminal and i've got a
lot of these commands that involve
my terminal so let me get back uh to the
top here
to my variables and i have a variable
that i set
called my terminal and i set it to equal
alacrity
why did i do that well if i have a dozen
different key bindings
in my config that involve a terminal and
what if i change my default terminal
what if
a month from now i no longer want to use
alacrity as my standard default
terminal maybe i want to switch to urxvt
well instead of having to go change a
dozen different key bindings and
changing alacrity a dozen different
times in those key bindings
since i use this variable in those key
bindings my terminal all i have to do is
change
this one variable and you know
right then and there you know if i save
and restart x monet all those key
bindings now are using
x u r x v t as the terminal rather than
alacrity it just saves you
from having to change a ton of lines
later now i actually don't want to use
ursvt because i don't even have it
installed so i'm going to go back to
allegrity
i have a lot of key bindings that also
involve my browser so i set my browser
to be
cute browser and my cute browser binding
is cute browser with a space behind it
because
these key bindings that i will use cute
browser
will be cute browser space and then name
of website you know url
of website and you need a space
somewhere you either need that space to
be
at the end of cube browser in the
variable or
just remember in the key bindings
themselves to add a space
uh in the appropriate spot but you do
need to make sure when you do these
variables if it involves the terminal
and the browser and then some extra
information some other arguments
make sure you place uh the space in the
correct
places some other things i said i set a
variable for my font
my emoji font i set variables for normal
color focus
color border width uh the key that i
want to be the mod key
should be somewhere in here it's right
here it's
mod mask my mod mask equals mod 4 mask
that sets the
mod key to be the super key i also set
alt mask
to be mod 1 mask so alt mass means
it's the alt key so any key binding or
anything that refers to alt mask
actually refers to the alt key i could
change that of course to some other key
if i wanted
the next section of my config is the
auto start section
so i have this here my startup hook
equals do
and then after do i have spawn once name
a program spawn once name a program
spawn once name a program
basically a command to run and this is
where i put
all the programs that i want to
automatically start as soon as x monad
starts so
when x monad starts up i want lx session
to run that's you know the
session manager i want that to run in
the background i also want to
spawn once nitrogen dash dash restore
that sets my wallpaper because if i
don't have something that sets my
wallpaper as soon as i log into x-monad
i'm just going to have a black
background then i spawn once picom
picom is the compositor i spawn once uh
trayer
trayer is the system tray here at the
end of xmobar that's actually a separate
program from
exmobar it's a completely separate
program
so that's trayer and then within the
system tray trayer
i have network manager applet volume
icon i also
auto start the emacs daemon because i
used emacs client
as my editor and if you're going to use
emacs client you have to have the emac
server running the emax name and running
so i how do i accomplish that well i
just put it
in my startup hook here in exmoned i
also have a couple of demons
that i've commented out in haskell to do
a comment you do two dashes
i used to use the cacoon editor and i
used to start cacoon as a daemon
i also have urx vtd that's the urx vt
terminal
daemon i no longer use ursvt because i
use alacrity but if i
did use ur xvt i would definitely use
the daemon running in the background
the next section of my config is called
grid select now grid select
is interesting it's this interesting
little effect
that let me show you guys grid select so
that is grid select it's just a grid of
programs that i have set i i guess
you could call it almost like quick
launcher kind of programs instead of
doing it the traditional way where you
have quick launchers maybe with icons
sitting in a panel that you could click
on
in exmonet if you wanted you know some
kind of quick launcher kind of applet
i would probably just use this grid
select menu
and you could do the vm keys h j k l or
up
down left right if you could use the
arrow keys for example if i wanted to i
could scroll over here
to uh dead beef if i wanted to and i
could
launch my dead beef music player it
looks like i was listening to
heart's greatest hits the last time i
was listening to something in dead beef
now my grit select config gets a little
deep very detailed here i'm not going to
cover
everything in my grid select but you
guys can check that out
on your own the next section similar to
grid select
there is a feature called tree select
it's a tree menu
so in my config if i do control t
followed by t
this is my tree select menu and i could
use the vim keys to navigate down and i
could go
i don't know into bookmarks here into
linux into arch linux
and then finally go to the archwiki and
hit enter
and this should launch i i should have
launched uh cute browser
but it looks like cube browser has an
error i haven't actually run cute
browser in a couple of weeks
i'm assuming what has happened is cute
browser probably has
had an update recently and their update
broke my config.pi
which is the config file for cute
browser so i need to investigate
that issue but again the tree select
menu is this really neat tree
kind of menu if i go through here and i
go to multimedia
and i go down to uh vlc i don't think i
have vlc installed do i yes i do all
right
so i can launch programs i can go
through i can set bookmarks in the tree
select menu you can add anything you
want to
to the tree select menu here it's pretty
self-explanatory i have a ton of stuff
in my tree select i'm not going to go
over all the tree select
settings you guys can investigate that
further if you're interested
grid select and tree select they're kind
of cool but they're probably not
something that most people are going to
want in their config so i'm not going to
spend a ton of time on that
i will spend some time on the xmo.net
prompts so i
showed you where you import the various
xmonet prompts
the modules you're going to use this is
setting
some settings for those props things
like what do i want the color to be the
foreground color the background color
what do i want the font to be
i want the font to be my font remember i
set a variable at the top of my config
for
setting my font that saves me from
having to type that very long string
you know xft colon name of font and
all of that i just set a variable one
time and anytime i need to call upon
that font
i just set it to my font so
that's one of the reasons why i have
that particular variable but you guys
can check out these uh
they're called xp configs for x prompt
configs i called mine
dt xp config because i changed some
things from the
default xp config i have a section here
called custom prompts these are
x prompts but these are custom props now
i'm not a haskell
master i don't know much about haskell i
know enough to hack on my ex monad
config
but basically i found these snippets of
haskell somewhere probably on
stack overflow right so this calc prompt
if i
do super p c for calculator i have this
calculator prompt here where i could do
something like two plus two
and hit enter and it says 2 plus 2
equals 4 and then i get another prompt
and then i could do i don't know how
about 4 times 4
and 4 times 4 equals 16 and then of
course i get the prompt again
and that is achieved by this little bit
of haskell code here
of course i had to import the exmonet
prompt module
but after that it's really just a few
lines of haskell
made that happen that this particular
calculator prompt
uses a program called calculate dash gtk
so you do have to have that installed on
the system if you're going to use
this calculator prompt i also have this
edit prompt here
and this is just a way for me to get a
run prompt
type a path to a file and it will open
in emacs it's not a very useful prompt
it's just me playing around with trying
to figure out how
xmode ad prompts work so i'm actually
not going to spend time talking about
that but i left it in the config here
just in case you guys want to
investigate it because maybe you want to
see how the code works that's why i left
it there
in case i ever want to come back and try
to figure out how to create my own
custom xml net prompts
that's really the only reason i have the
calculator prompt or the edit prompt
here
it's just for educational purposes x
prompt key map
are key bindings that work when you're
inside
one of these you know x prompts so
anytime you launch one of the xmonet run
prompts or ssh prompts or anything
these key bindings should work within
those prompts i have a
search engine section to my config where
i can search
various search engines so this lengthy
list right here is all the search
engines that are available for me
to search from directly from an exmonet
prompt
so i have this this list of search
engines and most of these search engines
are built into an xmln contrib module
called
i believe it's xmonet.actions
but i wanted to add some that were not
part of that module
and you can see right here i have these
six search engines here
i added these these were not part of the
module but i wanted to add them so i
have these lines here and then down here
where i have the complete
search engine list the ones that begin
with a capital s
such as s dot dot go those were the ones
that were already built into the module
the ones that don't begin with s dot
such as this archwiki search engine
right here that was one of the custom
ones
that i added to see these search prompts
in action
what you want to do in my config i have
super s
followed by a key and the key that you
need to hit will depend on which search
engines for example archwiki the key is
a
go the key is d i hope that makes sense
so if i do
super s a we can search the archwiki i
can search for
i don't know flatpak and it should open
the flat pack page from the archwiki
inside uh cube browser but again
my cute browser config may be broken so
uh
now that i think about it recently i did
change my web browser my default web
browser on my
system it's always been firefox and
recently i removed firefox
from my machine and it still may be set
as my default browser so that may be
what these key bindings are trying to
find it's trying to find firefox and
it's no longer on my system
i this video is going to run very long
so just very briefly i do want to cover
uh three
really important sections of my config
that's the layouts the key bindings and
then the
actual main section of the config so the
layouts this is where i define of course
the layouts that i use
such as the default tall layout which
i'm in now which is the
master and stack layout but if i do
super tab i can
go through a bunch of different layouts
let me open some windows so you can see
this is the master and stack layout this
is a magnify layout where
whichever window has focus it zooms
itself in
really neat little layout this is the
monocle layout so
full screen everything's stacked on top
of each other full screen
but it does leave room for the bar at
the top and then
this is the floating layout so all the
windows float now
i could grab them with the mouse and
move them around this is the tab
layout you can see we have tabs at the
top here of course you can use the mouse
to click on the tabs you can also use
the keyboard
to navigate through the tabs and then i
have a grid layout
i have the spiral layout where if i kept
opening windows you know
things would just keep spiraling around
and then i have the three column layout
which is three columns it's a master and
stack three columns where the first
column is a little bigger
than the other two columns and then
three row
layout is similar to three columns and
then finally
master and stack again the tall layout
and you can see
i've defined all those layouts here in
this section i also have these lines
here about spacing
the my spacing and then the my spacing
prime here
this is how i get gaps around the
windows i'm just setting
specific numbers for the pixel size of
gaps i want around the windows in
each different layout for example in the
tall layout the master and stack layout
i have
my spacing 8 that's setting the spacing
around the windows
to be 8 pixels scrolling down past the
layout section i have the
show window name the workspace name that
is and this is where
i set the font size and the colors for
that neat effect that i get
when i switch workspaces where you get
the the workspace name here
and then we get to the actual workspaces
themselves i've set
the workspace names dev www assist doc v
box chat muse vid graphics and those are
the nine workspaces here in xmode bar
they are clickable i can actually click
on them with the mouse if i wanted to i
sometimes forget that those things are
clickable because most of the time of
course you're going to use the keyboard
of course to
you know switch workspaces and this is a
section that i've cleaned up a bit
recently this section used to be quite a
bit bigger i used to have two different
sections one for non-clickable
workspaces and one for clickable
workspaces
depending on which one you want to use i
can condensed it down though into just
having clickable workspaces and i've
made the code a little cleaner too
this code was actually suggested from
somebody over on my gitlab they opened
up an issue
and actually gave me a little bit
cleaner haskell here to get that
clickable workspace
effect and with the names not really
being affected
because before the code i was using the
names for the workspaces that appeared
on the screen were really long because
the names of the workspaces
were this here action equals x do tool
key super plus
plus because that's the actual workspace
you can see clickable workspace equals
and so that's the workspace name well he
gave me this code here
where it changes the workspace names
from this
action here the clickable action you
know clicking on the workspaces to
the actual names so i really appreciate
that i
should have went to my git lab and got
that guy's name that left me that code
but i really appreciate the tip there
manage hook here
this is setting window rules for example
when i open up firefox which is no
longer on my system
it automatically opens up firefox on
workspace too
the code remember in programming
typically
everything starts at zero so if you have
uh
ten workspaces it's zero through nine
not one through ten so
do shift my workspace uh exclamation
point exclamation point one
is actually sending firefox to workspace
2 because
workspace 1 would actually be 0. i hope
that makes sense so that's how the
manage hook section works for
giving you some window rules as far as
what workspaces they appear
and what layout they appear whether
they're floating or what have you
the key bindings section is pretty
self-explanatory
i have my keys home equals and then this
very long list of key bindings
and you can see what the key bindings
are the capital m
is the mod key that's the super key
capital s is
shift capital m1 is alt capital c
is control and i am using the easy key
bindings here in my config so if i go
back to the top
and go to import and somewhere in import
i believe utils import
xmed.util.easyconfig
that is how you get the easy config key
bindings
rather than the standard key bindings
the standard keybindings in xmonet look
something like this
instead of capital m for the mod key
it's actually modium
right and instead of capital c for
control it's control mask
capital s for shift is really shift mask
yeah that's a lot of tedious writing
well if you import the exmoned util easy
config module
and then you know you can go in your
config and change all of those
rather lengthy uh shift mass control
mask mod
m and all of that to just capital m or
capital c capital s
what have you and then finally the last
section of my config is the main this is
where everything
that i put previously in the config
comes together
this is your main block you have main
equals do
and then it executes all of this code
and all of this code
is basically all the the sections from
earlier
in the config i have these three
sections here xm
proc for xmobar process because i have
three different
xml bar processes going on i have three
monitors and i have three different
configs for each of my three
x mode bars because i've got different
widgets on each of them i hope that
makes sense so that's why i have
three different xm procs there
in xm proc i could have named that
anything and just made
sense xmobar process01n2
and then after i set that then we have
this block here x monet dollar symbol
and i have ewmh
def def stands for defaults and then i
have this opening
brace and then later i'll have an ending
brace and everything
in between that brace and that brace is
really
your xmode ad config this is everything
that
it all comes together right here and
this is where
you tell it uh mod mask equals
my mod mask that's the variable i set
before so mod mask equals the super key
terminal equals my terminal
again alacrity is what i said startup
hook equals the my startup hook section
from earlier that's
all the auto start programs layout hook
equals the
show workspace name and then my layout
hook there's a section
earlier my config called my layout hook
it so all the window rules and
everything
workspaces equals the my workspaces
section
from earlier in my config you guys get
the idea and then later we've got log
hook
log hook is where all the xmo bar stuff
comes together
so that is this section here and in
between these braces here
you have all of these statements that
begin with pp this is a
pretty printing uh libraries here is
basically what this is pp
output is hey what output is getting
outputted into the xmo bar well
we're getting output from xm proc 0 xm
proc 1 and xm proc 2
my three different x mobile configs that
i set earlier
and i set exactly what monitors they're
on zero
one and two for monitors one two and
three pp current is the x mode bar
uh color config for the current
workspace i'm on in exmo war
so right now i'm on workspace 2 www and
it's this green
color and then pp visible is the exmo
bar
workspace color for visible workspaces
so workspaces i have on
other monitors not my current monitor so
i can see them
and so that's workspace one which is the
div oh i shouldn't have clicked it i
forgot these are clickable workspaces so
one and eight are visible workspaces
because they're on my first and third
monitors
i hope that makes sense and pp hidden is
the workspaces that are not currently
viewed on any of my monitors and they
are colored purple because
i set that right here in the color here
and of course this clickable part
makes those workspaces clickable that's
why i can click on them
and it will actually take me to those
workspaces so i have all these xmobar
settings here and at the end
additional keys and this is where it's
setting all of my key bindings remember
i had the list of key bindings
well actually all of that goes right
here at the end of the main
equals do block it just makes things
easier though
instead of having this massive main
equals do block
you break everything down into sections
like key bindings and layouts and
workspaces
and then you just call upon them here
by saying hey terminal equals and then
my terminal because you set a variable
for it
workspaces equals my workspaces because
you set that block of workspaces earlier
in the config
it just makes things a little cleaner so
that was just a little bit of my
exmonad config some things have changed
since the last time i made a video but
for the most part about 95 percent of
that config is exactly the way it was
before
xmo nad has really been my preferred
window manager
for most of my desktop linux experience
since for
since i switched to desktop linux back
in 2008
i spent most of my time in standalone
window managers almost 100
of my time as a desktop linux user i've
been a window manager
user done some floating window managers
like open box love open box spent years
playing around
in open box and fluxbox and things like
that but early early on when i switched
to linux
one of the very first window managers i
ever tried was
x-moned and it's one i keep coming back
to
because it's just so dang good i know
the config for xmo.net can be tough
especially for newer users but i hope
seeing me
go through my config and breaking some
things down and tell you
exactly what some of that code is doing
i hope that makes things a little easier
obviously i can't completely spoon feed
you
as far as you know i i can't tell you
how to do things
that i don't do but i often get people
asking me support kinds of questions hey
i want my window manager to do this
how do i do it and it's not something
that i do in my config obviously so
i would have to go and learn it myself
and figure out how to configure
to somebody else's liking to help them
i'm not going to do that
at some point you do have to do some of
the heavy lifting yourself
but from this video and some of my past
videos i really think i've done enough
that you guys probably can figure out
exactly how to get xmo nad set up
now before i go i need to thank a few
special people i need to thank the
producers of this episode i need to
thank absie dallas gay blue mitchell
allen akami architect 5530 chuck david
the other david dilling gregory lewis
paul scott west and willie
they are my highest tiered patrons over
on patreon they are the producers of
this episode
i also need to thank each and every one
of these ladies and gentlemen as well
all these names are seeing on the screen
right now these are all my supporters
over on patreon because the distrotube
channel
does not have any corporate sponsors i'm
sponsored by you guys the community
if you would like to support my work
look for dt over on patreon
alright guys peace
you
