diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,9 +1,11 @@
-## Usage
+# Use
 
-`xmonad` with a custom configuration, in a project to be compiled with stack or cabal. You can also use the library by itself (the executable is not build by default).
+`xmonad` with a custom configuration, in a project to be compiled with cabal. You can also use the library by itself.
 
-### Requirements
+## Requirements
+
 Requires libxft-dev, amixer for volume, gnome-terminal, and setxkbmap to switch keyboard layouts.
 
-### Sugestions
-Use dmenu, libx11-dev, libxinerama, and yeganesh as well. 
+## Sugestions
+
+Use dmenu, libx11-dev, libxinerama, xmobar, and yeganesh as well.
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/cabal.project.local b/cabal.project.local
new file mode 100644
--- /dev/null
+++ b/cabal.project.local
@@ -0,0 +1,4 @@
+constraints: xmonad-vanessa -library
+with-compiler: ghc-8.2.2
+optimization: 2
+documentation: True
diff --git a/src/XMonad/Config/Vanessa.hs b/src/XMonad/Config/Vanessa.hs
--- a/src/XMonad/Config/Vanessa.hs
+++ b/src/XMonad/Config/Vanessa.hs
@@ -1,3 +1,4 @@
+{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
 -- | Configuration with defaults I like and brightness adjustable for my computer and appropriate
 module XMonad.Config.Vanessa (vConfig) where
 
@@ -5,6 +6,7 @@
 import           Data.Maybe
 import           Data.Monoid
 import           Data.Ratio                ((%))
+import           System.IO                 (Handle)
 import           XMonad                    hiding (workspaces)
 import           XMonad.Actions.GridSelect
 import           XMonad.Hooks.DynamicLog
@@ -14,7 +16,7 @@
 import           XMonad.Layout.Mosaic
 import           XMonad.Layout.Reflect
 import           XMonad.Layout.Spiral
-import           XMonad.StackSet           hiding (filter)
+import           XMonad.StackSet           hiding (float)
 import           XMonad.Util.Brightness
 import           XMonad.Util.Keyboard
 import           XMonad.Util.MediaKeys
@@ -24,8 +26,8 @@
 
 -- | IO action of the whole thing
 vConfig :: IO ()
-vConfig = xmonad . config =<< spawnPipe "xmobar"
-    where config = myConfig
+vConfig = xmonad . config' =<< spawnPipe "xmobar"
+    where config' = myConfig
 
 -- | Custom configuration taking in one pipe to xmobar
 myConfig xmproc = fullscreenSupport $ docks $ def { terminal   = "alacritty"
@@ -45,6 +47,7 @@
     pure . xmobarColor "green" "black" . take 40 $ wt
 
 -- | Provides custom hooks to xmonad. This disables printing the window title/connects xmobar and xmonad.
+vLogHook :: Handle -> X ()
 vLogHook xmproc = musicString >>= \m -> dynamicLogWithPP xmobarPP { ppOutput = hPutStrLn xmproc
                                                                   , ppTitle = const m
                                                                   , ppLayout = const ""
@@ -70,12 +73,17 @@
                           , className =? "qemu-system-x86_64"                  --> doFloat
                           ]
 
+-- TODO gaps between windows?
+
+mkSmall :: Window -> X ()
+mkSmall = flip tileWindow (Rectangle 850 150 600 400)
+
 -- | Custom keymaps to adjust volume, brightness, and
 myKeys :: XConfig t -> M.Map (KeyMask, KeySym) (X ())
 myKeys XConfig {XMonad.modMask = modm} = mediaKeys . M.fromList $
              [ --volume control
-               ((modm, xK_Up), raiseVolume 5)
-             , ((modm, xK_Down), lowerVolume 5)
+               ((modm, xK_Up), raiseVolume (5 :: Word))
+             , ((modm, xK_Down), lowerVolume (5 :: Word))
              , ((modm, xK_Delete), toggleMute)
              --personal (extra) media keys
              , ((modm, xK_Page_Down), audioNext)
@@ -86,21 +94,18 @@
              , ((modm, xK_Right), brighten 100)
              --program shortcuts
              , ((modm, xK_q), spawn "spotify")
+             , ((modm .|. shiftMask, xK_n), spawn "firefox")
              , ((modm .|. controlMask, xK_Return), spawn "gnome-terminal")
-             --open signal
-             , ((modm .|. shiftMask, xK_n), spawn "google-chrome --profile-directory=Default --app-id=bikioccmkafdpakkkcpdbppfkghcmihk")
              --launch bar
-             , ((modm, xK_p), spawn "$(yeganesh -x)")
-             -- bash command execution bar
-             , ((modm .|. shiftMask, xK_l), spawn "launcher")
+             , ((modm, xK_p), spawn "yeganesh -x")
              --screenshots
-             , ((0, xK_Print), spawn "cd ~/.screenshots && scrot") -- TODO figure out how to surpress window size information
+             , ((0, xK_Print), spawn "cd ~/.screenshots && scrot")
+             -- open scratchpad
+             , ((modm .|. shiftMask, xK_p), withFocused (mconcat . sequence [float, mkSmall]))
              --shutdown etc.
              , ((modm .|. shiftMask, xK_End), spawn "shutdown now")
              -- lock screen
              , ((controlMask, xK_End), spawn "slock")
-             -- function lock
-             -- , ((modm, xK_Insert, XF86ModeLock
              --switch keyboards
              , ((modm, xK_F1), setLang def)
              , ((modm, xK_F2), setLang tibetan)
@@ -111,7 +116,7 @@
              , ((modm, xK_F7), setLang dansk)
              , ((modm, xK_F9), setLang dzongkha)
              -- hide windows
-             , ((modm .|. shiftMask, xK_h), withFocused hide >> withFocused hideWindow)
+             , ((modm .|. shiftMask, xK_h), withFocused (mconcat . sequence [hide, hideWindow]))
              , ((modm, xK_u), popNewestHiddenWindow >> withFocused reveal)
              -- grid select
              , ((modm, xK_g), goToSelected def)
@@ -127,8 +132,9 @@
         [ ((modm, xK_p), pure ()) ]
 
 -- | Gives a better ratio for the master pane and lets us spiral windows
-myLayout = (avoidStruts . hiddenWindows $ mosaic 1.33 (take 6 $ iterate (* (4 % 5)) 1) ||| normalPanes ||| reflectHoriz normalPanes ||| Full) ||| hiddenWindows (spiral (6/7))
+myLayout = (avoidStruts . hiddenWindows $ mosaic 1.33 mosaicSettings ||| normalPanes ||| reflectHoriz normalPanes ||| Full) ||| hiddenWindows (spiral (6/7))
     where normalPanes = Tall 1 (3/100) (3/7)
+          mosaicSettings = take 6 $ iterate (* (4 % 5)) 1
 
 -- | Make new key layout from a given keyboard layout
 newKeys :: XConfig Layout -> M.Map (KeyMask, KeySym) (X ())
diff --git a/src/XMonad/Util/Keyboard.hs b/src/XMonad/Util/Keyboard.hs
--- a/src/XMonad/Util/Keyboard.hs
+++ b/src/XMonad/Util/Keyboard.hs
@@ -16,7 +16,7 @@
 -- TODO module for battery
 
 import           Control.Composition
-import           System.Process          hiding (spawn)
+import           System.Process
 import           XMonad
 import           XMonad.Hooks.DynamicLog
 
@@ -33,6 +33,7 @@
     show (Simple "is") = "Ænglisc"
     show (Simple "de") = "De"
     show (Simple "dk") = "Dk"
+    show _ = xmobarColor "red" "black" "ERROR"
 
 -- | Set default keyboard layout to vanilla "us"
 instance Default KbLayout where
@@ -46,7 +47,7 @@
 parseKB :: IO KbLayout
 parseKB = do
     out <- lines <$> readCreateProcess (shell "setxkbmap -query") ""
-    let strip = dropWhile (==' ') . (drop 1) . (dropWhile (/=':')) .* (!!)
+    let strip = dropWhile (==' ') . drop 1 . dropWhile (/=':') .* (!!)
     let line = strip out
     if length out == 3 then
         pure (Simple (line 2))
@@ -55,7 +56,7 @@
 
 -- | keyboard layout for typing Tibetan text
 tibetan :: KbLayout
-tibetan  = (Regional "cn" "tib")
+tibetan  = Regional "cn" "tib"
 
 -- | AZERTY French keyboard
 français :: KbLayout
@@ -79,7 +80,7 @@
 
 -- | Alr-gr keyboard providing common accents on a US keyboard
 accented :: KbLayout
-accented = (Regional "us" "altgr-intl")
+accented = Regional "us" "altgr-intl"
 
 -- | Set keyboard layout
 setLang :: KbLayout -> X ()
diff --git a/src/XMonad/Util/MediaKeys.hs b/src/XMonad/Util/MediaKeys.hs
--- a/src/XMonad/Util/MediaKeys.hs
+++ b/src/XMonad/Util/MediaKeys.hs
@@ -20,28 +20,31 @@
 
 -- | Given your keymaps, add the media keybindings
 mediaKeys :: M.Map (KeyMask, KeySym) (X ()) -> M.Map (KeyMask, KeySym) (X ())
-mediaKeys = M.fromList . ((<>) mediaKeyList) . M.toList
+mediaKeys = M.fromList . (<>) mediaKeyList . M.toList
 
 mediaKeyList :: [((KeyMask, KeySym), X ())]
 mediaKeyList = [ ((0, xF86XK_AudioNext), audioNext)
                , ((0, xF86XK_AudioPrev), audioPrev)
                , ((0, xF86XK_AudioPlay), audioPlayPause)
                , ((0, xF86XK_AudioMute), toggleMute)
-               , ((0, xF86XK_AudioLowerVolume), lowerVolume 5) --module elsewhere?
-               , ((0, xF86XK_AudioRaiseVolume), raiseVolume 5)
+               , ((0, xF86XK_AudioLowerVolume), lowerVolume (5 :: Word))
+               , ((0, xF86XK_AudioRaiseVolume), raiseVolume (5 :: Word))
                ]
 
 -- | Helper function for use with dbus
 sp :: String -> X ()
-sp = spawn . ((<>) "dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.")
+sp = spawn . (<>) "dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player."
 
 -- | Action in the 'X' monad to go to next
+audioNext :: X ()
 audioNext      = sp "Next"
 
 -- | Action in the 'X' monad to go the previous
+audioPrev :: X ()
 audioPrev      = sp "Previous"
 
 -- | Action in the 'X' monad to play/pause
+audioPlayPause :: X ()
 audioPlayPause = sp "PlayPause"
 
 -- lana = sp "OpenUri string:6QOU3FhUkPeA2RtaXcvgi7"
diff --git a/stack.yaml b/stack.yaml
deleted file mode 100644
--- a/stack.yaml
+++ /dev/null
@@ -1,8 +0,0 @@
-resolver: lts-10.2
-packages:
-- .
-extra-deps: []
-flags:
-    xmonad-vanessa:
-        library: false
-extra-package-dbs: []
diff --git a/xmonad-vanessa.cabal b/xmonad-vanessa.cabal
--- a/xmonad-vanessa.cabal
+++ b/xmonad-vanessa.cabal
@@ -1,74 +1,81 @@
-name:                xmonad-vanessa
-version:             0.1.1.6
-synopsis:            Custom xmonad, which builds with stack or cabal.
-description:         Please see README.md
-homepage:            https://hub.darcs.net/vmchale/xmonad-vanessa
-license:             BSD3
-license-file:        LICENSE
-author:              Vanessa McHale
-maintainer:          vanessa.mchale@reconfigure.io
-copyright:           2017 Vanessa McHale
-category:            Web
-build-type:          Simple
-extra-source-files:  README.md, stack.yaml
-cabal-version:       >=1.10
+cabal-version: >=1.10
+name: xmonad-vanessa
+version: 0.1.1.8
+license: BSD3
+license-file: LICENSE
+copyright: 2017-2018 Vanessa McHale
+maintainer: vamchale@gmail.com
+author: Vanessa McHale
+homepage: https://hub.darcs.net/vmchale/xmonad-vanessa
+synopsis: Custom xmonad, which builds with stack or cabal.
+description:
+    Custom xmonad example, plus several bits of functionality for managing media within XMonad.
+category: Web
+build-type: Simple
+extra-source-files:
+    README.md
+    cabal.project.local
 
-Flag library {
-  Description: Don't build an executable
-  Default:     True
-}
+source-repository head
+    type: darcs
+    location: https://hub.darcs.net/vmchale/xmonad-vanessa
 
+flag library
+    description:
+        Don't build an executable
+
 library
-  hs-source-dirs:      src
-  exposed-modules:     XMonad.Config.Vanessa
-                     , XMonad.Util.Brightness
-                     , XMonad.Util.Keyboard
-                     , XMonad.Util.Volume
-                     , XMonad.Util.MediaKeys
-  build-depends:       base >= 4.8 && < 5
-                     , xmonad >= 0.13
-                     , xmonad-contrib >= 0.13
-                     , composition-prelude
-                     , containers
-                     , process
-                     , X11
-                     , transformers
-  ghc-options:         -fwarn-unused-imports
-  default-language:    Haskell2010
+    exposed-modules:
+        XMonad.Config.Vanessa
+        XMonad.Util.Brightness
+        XMonad.Util.Keyboard
+        XMonad.Util.Volume
+        XMonad.Util.MediaKeys
+    hs-source-dirs: src
+    default-language: Haskell2010
+    ghc-options: -Wall
+    build-depends:
+        base >=4.8 && <5,
+        xmonad >=0.13,
+        xmonad-contrib >=0.13,
+        composition-prelude -any,
+        containers -any,
+        process -any,
+        X11 -any,
+        transformers -any
 
 executable xmonad
-  if flag(library)
-    Buildable:         False
-  hs-source-dirs:      app
-  main-is:             Main.hs
-  ghc-options:         -O2
-  build-depends:       base
-                     , xmonad-vanessa
-  default-language:    Haskell2010
+    main-is: Main.hs
+    hs-source-dirs: app
+    default-language: Haskell2010
+    ghc-options: -O2
+    build-depends:
+        base -any,
+        xmonad-vanessa -any
+    
+    if flag(library)
+        buildable: False
 
 executable getkb
-  if flag(library)
-    Buildable:         False
-  hs-source-dirs:      app
-  main-is:             ParseKBLayout.hs
-  ghc-options:         -threaded -O2
-  -- -rtsopts -with-rtsopts=-N
-  -- -fllvm -optlo-O3
-  build-depends:       base
-                     , xmonad-vanessa
-  default-language:    Haskell2010
+    main-is: ParseKBLayout.hs
+    hs-source-dirs: app
+    default-language: Haskell2010
+    ghc-options: -O2
+    build-depends:
+        base -any,
+        xmonad-vanessa -any
+    
+    if flag(library)
+        buildable: False
 
 test-suite xmonad-test
-  type:                exitcode-stdio-1.0
-  hs-source-dirs:      test
-  main-is:             Spec.hs
-  build-depends:       base
-                     , xmonad-vanessa
-                     , hspec
-                     , xmonad
-  ghc-options:         -threaded -rtsopts -with-rtsopts=-N 
-  default-language:    Haskell2010
-
-source-repository head
-  type:     darcs
-  location: https://hub.darcs.net/vmchale/xmonad-vanessa
+    type: exitcode-stdio-1.0
+    main-is: Spec.hs
+    hs-source-dirs: test
+    default-language: Haskell2010
+    ghc-options: -threaded -rtsopts -with-rtsopts=-N
+    build-depends:
+        base -any,
+        xmonad-vanessa -any,
+        hspec -any,
+        xmonad -any
