diff --git a/qbar/app/Main.hs b/qbar/app/Main.hs
index c0e6c83e0cec08954c428283893755a185739d33..3631ce6f3c4515b040237ce205e0b30f1bd17abb 100644
--- a/qbar/app/Main.hs
+++ b/qbar/app/Main.hs
@@ -1,4 +1,4 @@
-module Main where
+module Main (main) where
 
 import QBar.Cli
 import QBar.Prelude
diff --git a/qbar/src/QBar/BlockHelper.hs b/qbar/src/QBar/BlockHelper.hs
index 6707c2a1f36de18472b13df63d660083d2225964..0a3ff063e54c45e4c429ed724398e57f61ca61fd 100644
--- a/qbar/src/QBar/BlockHelper.hs
+++ b/qbar/src/QBar/BlockHelper.hs
@@ -1,4 +1,21 @@
-module QBar.BlockHelper where
+module QBar.BlockHelper (
+  PollBlock',
+  PollBlock,
+  PollSignal,
+  Signal(..),
+  SignalBlock,
+  SignalBlockConfiguration(..),
+  respondBlockUpdate,
+  respondEmptyBlockUpdate,
+  runPollBlock',
+  runPollBlock,
+  runSignalBlock,
+  runSignalBlockConfiguration,
+  runSignalBlockFn',
+  runSignalBlockFn,
+  yieldBlockUpdate,
+  yieldEmptyBlockUpdate,
+) where
 
 import QBar.BlockOutput
 import QBar.Core
diff --git a/qbar/src/QBar/BlockOutput.hs b/qbar/src/QBar/BlockOutput.hs
index 35b1016775e2125fcbe11dbcf362951a3c51d8fb..551a2e61a19eb78a0f19df2cd8ec6f9887c7e6bf 100644
--- a/qbar/src/QBar/BlockOutput.hs
+++ b/qbar/src/QBar/BlockOutput.hs
@@ -1,6 +1,43 @@
 {-# LANGUAGE TemplateHaskell #-}
 
-module QBar.BlockOutput where
+module QBar.BlockOutput (
+  BlockOutput(..),
+  BlockText(..),
+  BlockTextSegment(..),
+  Importance(..),
+  activeImportantText,
+  activeText,
+  addIcon,
+  blockName,
+  criticalImportant',
+  criticalImportant,
+  emptyBlock,
+  errorImportant',
+  errorImportant,
+  fullText,
+  importantText,
+  invalid,
+  invalidateBlock,
+  isCritical,
+  isError,
+  isNormal,
+  isWarning,
+  mkBlockOutput',
+  mkBlockOutput,
+  mkErrorOutput,
+  mkStyledText,
+  mkText,
+  normalImportant',
+  normalImportant,
+  normalText,
+  printedLength,
+  rawText,
+  shortText,
+  surroundWith,
+  toImportance,
+  warnImportant',
+  warnImportant,
+) where
 
 import QBar.Color
 import QBar.Prelude
diff --git a/qbar/src/QBar/Blocks.hs b/qbar/src/QBar/Blocks.hs
index 1dccb3a9fced84b13d587f68fb78578812ddb6c7..03db1c674330da7400a01b817e12bb54e80b070f 100644
--- a/qbar/src/QBar/Blocks.hs
+++ b/qbar/src/QBar/Blocks.hs
@@ -1,17 +1,16 @@
-module QBar.Blocks
-  ( QBar.Blocks.Battery.batteryBlock,
-    QBar.Blocks.CpuUsage.cpuUsageBlock,
-    QBar.Blocks.Date.dateBlock,
-    QBar.Blocks.DiskUsage.diskUsageBlock,
-    QBar.Blocks.NetworkManager.networkManagerBlock,
-    QBar.Blocks.Qubes.diskUsageQubesBlock,
-    QBar.Blocks.Qubes.qubesMonitorPropertyBlock,
-    QBar.Blocks.Qubes.qubesVMCountBlock,
-    QBar.Blocks.Script.scriptBlock,
-    QBar.Blocks.Script.pollScriptBlock,
-    QBar.Blocks.Squeekboard.squeekboardBlock,
-  )
-where
+module QBar.Blocks (
+  QBar.Blocks.Battery.batteryBlock,
+  QBar.Blocks.CpuUsage.cpuUsageBlock,
+  QBar.Blocks.Date.dateBlock,
+  QBar.Blocks.DiskUsage.diskUsageBlock,
+  QBar.Blocks.NetworkManager.networkManagerBlock,
+  QBar.Blocks.Qubes.diskUsageQubesBlock,
+  QBar.Blocks.Qubes.qubesMonitorPropertyBlock,
+  QBar.Blocks.Qubes.qubesVMCountBlock,
+  QBar.Blocks.Script.scriptBlock,
+  QBar.Blocks.Script.pollScriptBlock,
+  QBar.Blocks.Squeekboard.squeekboardBlock,
+) where
 
 import qualified QBar.Blocks.Battery
 import qualified QBar.Blocks.CpuUsage
diff --git a/qbar/src/QBar/Blocks/Battery.hs b/qbar/src/QBar/Blocks/Battery.hs
index a93b6f83104972024da6fafaea3641d1c149be33..b9d32f9bd1c24ec3475d3deda29bd843098cb3b5 100644
--- a/qbar/src/QBar/Blocks/Battery.hs
+++ b/qbar/src/QBar/Blocks/Battery.hs
@@ -1,4 +1,6 @@
-module QBar.Blocks.Battery where
+module QBar.Blocks.Battery (
+  batteryBlock,
+) where
 
 import QBar.BlockHelper
 import QBar.Core
diff --git a/qbar/src/QBar/Blocks/CpuUsage.hs b/qbar/src/QBar/Blocks/CpuUsage.hs
index f74b05b9a1f1f8f4f4d7bdedd7cc6288f957d35b..a3ffb0ad680cbda831fb83d08c299c560b71c454 100644
--- a/qbar/src/QBar/Blocks/CpuUsage.hs
+++ b/qbar/src/QBar/Blocks/CpuUsage.hs
@@ -1,6 +1,8 @@
 {-# LANGUAGE TemplateHaskell #-}
 
-module QBar.Blocks.CpuUsage where
+module QBar.Blocks.CpuUsage (
+  cpuUsageBlock,
+) where
 
 import QBar.BlockHelper
 import QBar.BlockOutput
diff --git a/qbar/src/QBar/Blocks/Date.hs b/qbar/src/QBar/Blocks/Date.hs
index b60119e3f5186c2103778c1dcb68dba8186d7277..9194dac77f906b7ec5d59cafd1434ed9543603f8 100644
--- a/qbar/src/QBar/Blocks/Date.hs
+++ b/qbar/src/QBar/Blocks/Date.hs
@@ -1,4 +1,6 @@
-module QBar.Blocks.Date where
+module QBar.Blocks.Date (
+  dateBlock,
+) where
 
 import QBar.BlockHelper
 import QBar.BlockOutput
diff --git a/qbar/src/QBar/Blocks/DiskUsage.hs b/qbar/src/QBar/Blocks/DiskUsage.hs
index e93adc89111d3cf91472113c5db1e0f8319ab5ce..ebdf1c71675b6bfedcf4da725ffcf4856b2dbbf6 100644
--- a/qbar/src/QBar/Blocks/DiskUsage.hs
+++ b/qbar/src/QBar/Blocks/DiskUsage.hs
@@ -1,4 +1,6 @@
-module QBar.Blocks.DiskUsage where
+module QBar.Blocks.DiskUsage (
+  diskUsageBlock,
+) where
 
 import QBar.BlockHelper
 import QBar.BlockOutput
diff --git a/qbar/src/QBar/Blocks/NetworkManager.hs b/qbar/src/QBar/Blocks/NetworkManager.hs
index 7aca6e6a375e8077be0ecb0937baff379456fa09..6c84053da7ac2bfc89c2a8173f0afcbb5ac4fb8b 100644
--- a/qbar/src/QBar/Blocks/NetworkManager.hs
+++ b/qbar/src/QBar/Blocks/NetworkManager.hs
@@ -1,4 +1,8 @@
-module QBar.Blocks.NetworkManager where
+module QBar.Blocks.NetworkManager (
+  getDBusProperty,
+  networkManagerBlock,
+  runExceptT_,
+) where
 
 import Control.Monad.Except (ExceptT, MonadError, runExceptT, throwError)
 import qualified DBus
diff --git a/qbar/src/QBar/Blocks/Pipe.hs b/qbar/src/QBar/Blocks/Pipe.hs
index 05b26a98ee1712a56fa88ef1efb5c8f608573a9e..57183a965ff076ee4155d4ec14e0791dd17e4c21 100644
--- a/qbar/src/QBar/Blocks/Pipe.hs
+++ b/qbar/src/QBar/Blocks/Pipe.hs
@@ -1,4 +1,6 @@
-module QBar.Blocks.Pipe where
+module QBar.Blocks.Pipe (
+  runPipeClient,
+) where
 
 import QBar.ControlSocket
 import QBar.Core
diff --git a/qbar/src/QBar/Blocks/Qubes.hs b/qbar/src/QBar/Blocks/Qubes.hs
index 092907a43c720c82441f6daf07303d9ce550660c..52b4c33c19be9a2244a4963e9db368ede7f5963a 100644
--- a/qbar/src/QBar/Blocks/Qubes.hs
+++ b/qbar/src/QBar/Blocks/Qubes.hs
@@ -1,4 +1,8 @@
-module QBar.Blocks.Qubes where
+module QBar.Blocks.Qubes (
+  diskUsageQubesBlock,
+  qubesMonitorPropertyBlock,
+  qubesVMCountBlock,
+) where
 
 import QBar.BlockHelper
 import QBar.BlockOutput
diff --git a/qbar/src/QBar/Blocks/Script.hs b/qbar/src/QBar/Blocks/Script.hs
index 3d1ffbd5c52c788596b08c7c77c4a38b91fe0295..0f3bae9fe5c42231e68fe2bfe4c88d8ccf399cf2 100644
--- a/qbar/src/QBar/Blocks/Script.hs
+++ b/qbar/src/QBar/Blocks/Script.hs
@@ -1,4 +1,7 @@
-module QBar.Blocks.Script where
+module QBar.Blocks.Script (
+  pollScriptBlock,
+  scriptBlock,
+) where
 
 import QBar.BlockHelper
 import QBar.BlockOutput
diff --git a/qbar/src/QBar/Blocks/Squeekboard.hs b/qbar/src/QBar/Blocks/Squeekboard.hs
index 9b6b89617ffba1fe72b846d37f1289978a964cea..3b8262e80ba26f8917eaed2aa9eedc6097a0df1e 100644
--- a/qbar/src/QBar/Blocks/Squeekboard.hs
+++ b/qbar/src/QBar/Blocks/Squeekboard.hs
@@ -1,4 +1,6 @@
-module QBar.Blocks.Squeekboard where
+module QBar.Blocks.Squeekboard (
+  squeekboardBlock,
+) where
 
 import Control.Monad.Except (MonadError)
 import Data.Either (isRight)
diff --git a/qbar/src/QBar/Blocks/Utils.hs b/qbar/src/QBar/Blocks/Utils.hs
index c894acc833566b7e8f29fb789767cef65d467a5a..2a3b3be70c342984a9c43a8b4da5fd2f05a7e7c2 100644
--- a/qbar/src/QBar/Blocks/Utils.hs
+++ b/qbar/src/QBar/Blocks/Utils.hs
@@ -1,4 +1,10 @@
-module QBar.Blocks.Utils where
+module QBar.Blocks.Utils (
+  ensure,
+  formatFloatN,
+  parseFile,
+  tryMaybe',
+  tryMaybe,
+) where
 
 import QBar.Prelude
 
diff --git a/qbar/src/QBar/Cli.hs b/qbar/src/QBar/Cli.hs
index 4689340241e0321cf5cbf2824d82694a26c02161..d4e6d64a0a1afffc2520c011eac87e53e2502dd7 100644
--- a/qbar/src/QBar/Cli.hs
+++ b/qbar/src/QBar/Cli.hs
@@ -1,7 +1,9 @@
 {-# LANGUAGE ApplicativeDo #-}
 {-# LANGUAGE TemplateHaskell #-}
 
-module QBar.Cli where
+module QBar.Cli (
+  runQBar,
+) where
 
 import QBar.Blocks
 import QBar.Blocks.Pipe
diff --git a/qbar/src/QBar/Color.hs b/qbar/src/QBar/Color.hs
index 1b79b237549db8a7d28d73bf5e4320f1e2c3cdf4..b39faf5b2fd6210cdfe4ad9d5667cb953b23fd29 100644
--- a/qbar/src/QBar/Color.hs
+++ b/qbar/src/QBar/Color.hs
@@ -1,4 +1,8 @@
-module QBar.Color where
+module QBar.Color (
+  Color(..),
+  colorParser,
+  hexColorText,
+) where
 
 import QBar.Prelude
 
diff --git a/qbar/src/QBar/ControlSocket.hs b/qbar/src/QBar/ControlSocket.hs
index 4986dec267e07eba65134ff4f8a035e7683897a6..ce2665f91b27fce4e1802bc6dfb94fca1ee82a33 100644
--- a/qbar/src/QBar/ControlSocket.hs
+++ b/qbar/src/QBar/ControlSocket.hs
@@ -1,7 +1,18 @@
 {-# LANGUAGE CPP #-}
 {-# LANGUAGE TemplateHaskell #-}
-
-module QBar.ControlSocket where
+{-# LANGUAGE TypeFamilies #-}
+
+module QBar.ControlSocket (
+  Command(..),
+  CommandResult(..),
+  Down,
+  Up,
+  addServerMirrorStream,
+  listenUnixSocketAsync,
+  sendBlockStream,
+  sendBlockStreamStdio,
+  sendIpc,
+) where
 
 import QBar.BlockOutput
 import QBar.Core
diff --git a/qbar/src/QBar/Core.hs b/qbar/src/QBar/Core.hs
index 945c47994179d62014c888e4066810fdcd6e5fe4..6e35ca8567578ed202056500d62f7e00392c494d 100644
--- a/qbar/src/QBar/Core.hs
+++ b/qbar/src/QBar/Core.hs
@@ -1,6 +1,45 @@
-{-# LANGUAGE TemplateHaskell #-}
-
-module QBar.Core where
+module QBar.Core (
+  Bar(..),
+  BarIO,
+  BarUpdateChannel(..),
+  BarUpdateEvent,
+  Block',
+  Block,
+  BlockCache,
+  BlockEvent(..),
+  BlockEventHandler,
+  BlockState,
+  BlockUpdate,
+  BlockUpdateReason(..),
+  ExitBlock(..),
+  IsCachable(..),
+  MainOptions(..),
+  MonadBarIO(..),
+  addBlock,
+  addBlockCache,
+  askBar,
+  autoPadding,
+  barAsync,
+  defaultInterval,
+  exitBlock,
+  hasEventHandler,
+  invalidateBlockState,
+  mkBlockState',
+  mkBlockState,
+  modify,
+  newCache',
+  newCache,
+  newCacheIO,
+  pushBlockUpdate',
+  pushBlockUpdate,
+  pushEmptyBlockUpdate,
+  runBarIO,
+  updateBar',
+  updateBar,
+  updateBarDefault',
+  updateBarDefault,
+  updateEventHandler,
+) where
 
 import QBar.BlockOutput
 import QBar.Prelude
diff --git a/qbar/src/QBar/DefaultConfig.hs b/qbar/src/QBar/DefaultConfig.hs
index 8743526ff6aa33bbfa269d2f89fe8c440d04b4eb..0193190f30f9d41c894104859eb010093a51b635 100644
--- a/qbar/src/QBar/DefaultConfig.hs
+++ b/qbar/src/QBar/DefaultConfig.hs
@@ -1,4 +1,6 @@
-module QBar.DefaultConfig where
+module QBar.DefaultConfig (
+  defaultBarConfig
+) where
 
 import QBar.Blocks
 import QBar.Core
diff --git a/qbar/src/QBar/Host.hs b/qbar/src/QBar/Host.hs
index db471003f3ae89f2493c34f5fd124b7324067cd2..169656256f4908231f6fe00039b6df28fb893ecf 100644
--- a/qbar/src/QBar/Host.hs
+++ b/qbar/src/QBar/Host.hs
@@ -1,4 +1,14 @@
-module QBar.Host where
+module QBar.Host (
+  HostHandle(..),
+  attachBarOutput,
+  eventDispatcher,
+  filterDuplicates,
+  installSignalHandlers,
+  requestBarUpdateHandler,
+  runBarHost',
+  runBarHost,
+  runBlocks,
+) where
 
 import QBar.BlockOutput
 import QBar.Core
diff --git a/qbar/src/QBar/Pango.hs b/qbar/src/QBar/Pango.hs
index bbfa830fefd7091b2419d050ab11fe27d5fbc839..4be97b74ed8cbb5cd36a6036b7dd169ad4b27d53 100644
--- a/qbar/src/QBar/Pango.hs
+++ b/qbar/src/QBar/Pango.hs
@@ -1,4 +1,7 @@
-module QBar.Pango (PangoText, renderPango) where
+module QBar.Pango (
+  PangoText,
+  renderPango,
+) where
 
 import QBar.Color
 import QBar.Prelude
diff --git a/qbar/src/QBar/Prelude.hs b/qbar/src/QBar/Prelude.hs
index efa804626921596bc0eff39fc4edfdccf527d122..5fcd403aedf0ae294958e70607d179d0c9192fa2 100644
--- a/qbar/src/QBar/Prelude.hs
+++ b/qbar/src/QBar/Prelude.hs
@@ -1,32 +1,31 @@
-module QBar.Prelude
-  ( module Prelude,
-    ByteString.ByteString,
-    (>=>),
-    (<=<),
-    Control.Monad.forever,
-    Control.Monad.unless,
-    Control.Monad.void,
-    Control.Monad.when,
-    Control.Monad.IO.Class.MonadIO,
-    Control.Monad.IO.Class.liftIO,
-    Text.Text,
-    Maybe.listToMaybe,
-    error,
-    errorWithoutStackTrace,
-    head,
-    intercalate,
-    trace,
-    traceId,
-    traceShow,
-    traceShowId,
-    traceM,
-    traceShowM,
-    traceIO,
-    traceShowIO,
-    traceShowIdIO,
-    undefined,
-  )
-where
+module QBar.Prelude (
+  module Prelude,
+  (<=<),
+  (>=>),
+  ByteString.ByteString,
+  Control.Monad.IO.Class.MonadIO,
+  Control.Monad.IO.Class.liftIO,
+  Control.Monad.forever,
+  Control.Monad.unless,
+  Control.Monad.void,
+  Control.Monad.when,
+  Maybe.listToMaybe,
+  Text.Text,
+  error,
+  errorWithoutStackTrace,
+  head,
+  intercalate,
+  trace,
+  traceIO,
+  traceId,
+  traceM,
+  traceShow,
+  traceShowIO,
+  traceShowId,
+  traceShowIdIO,
+  traceShowM,
+  undefined,
+) where
 
 import Prelude hiding
   ( error,
diff --git a/qbar/src/QBar/Qubes/AdminAPI.hs b/qbar/src/QBar/Qubes/AdminAPI.hs
index ae8b08802840761ff4b2abac56546368f0e0c766..fe6866cb1aa25ef9654fb58a98462decf153f118 100644
--- a/qbar/src/QBar/Qubes/AdminAPI.hs
+++ b/qbar/src/QBar/Qubes/AdminAPI.hs
@@ -1,4 +1,19 @@
-module QBar.Qubes.AdminAPI where
+module QBar.Qubes.AdminAPI (
+  QubesPropertyInfo(..),
+  QubesVMInfo(..),
+  QubesVMState(..),
+  printEvents,
+  qubesEvents,
+  qubesGetProperty,
+  qubesListLabelNames,
+  qubesListLabels,
+  qubesListProperties,
+  qubesListVMs,
+  qubesListVMsP,
+  qubesMonitorProperty,
+  qubesUsageOfDefaultPool,
+  qubesVMStats,
+) where
 
 import QBar.Prelude
 
diff --git a/qbar/src/QBar/Server.hs b/qbar/src/QBar/Server.hs
index ff8d4d81a2d0f8b37c095c2c4f049ce3affafcd6..d31a7d3b37c8a4553ae8c128069b76aa6bce8a40 100644
--- a/qbar/src/QBar/Server.hs
+++ b/qbar/src/QBar/Server.hs
@@ -1,4 +1,7 @@
-module QBar.Server where
+module QBar.Server (
+  runBarServer,
+  runBarServerMirror,
+) where
 
 import QBar.BlockOutput
 import QBar.Core
diff --git a/qbar/src/QBar/TagParser.hs b/qbar/src/QBar/TagParser.hs
index a81c59c518ffa3dd3c5b486dfe729dfe2da19456..1eb605175240734825dad73244cd5516b5237bd6 100644
--- a/qbar/src/QBar/TagParser.hs
+++ b/qbar/src/QBar/TagParser.hs
@@ -1,4 +1,9 @@
-module QBar.TagParser where
+module QBar.TagParser (
+  TagState,
+  parseTags,
+  parseTags',
+  parseTags'',
+) where
 
 import QBar.BlockOutput
 import QBar.Color
diff --git a/qbar/src/QBar/Theme.hs b/qbar/src/QBar/Theme.hs
index cb518506579bc96c5ad3f652e82c571bf0d4360e..feb9ef5159e0a1c82a5ce9cea6e49cc7b12e1d33 100644
--- a/qbar/src/QBar/Theme.hs
+++ b/qbar/src/QBar/Theme.hs
@@ -1,4 +1,17 @@
-module QBar.Theme where
+module QBar.Theme (
+  Theme(..),
+  ThemedBlockOutput(..),
+  ThemedBlockText(..),
+  ThemedBlockTextSegment(..),
+  defaultTheme,
+  findTheme,
+  isAnimated,
+  mkTheme,
+  mkThemedBlockOutput,
+  themeNames,
+  themes,
+  whiteThemedBlockOutput,
+) where
 
 import QBar.BlockOutput
 import QBar.Color
diff --git a/qbar/src/QBar/Time.hs b/qbar/src/QBar/Time.hs
index c57d2978af80e12893f29c6b5b30ac5c010d40f7..b205165bb244524a783af3d1fa2986b873738eb1 100644
--- a/qbar/src/QBar/Time.hs
+++ b/qbar/src/QBar/Time.hs
@@ -1,6 +1,19 @@
 {-# LANGUAGE OverloadedLists #-}
 
-module QBar.Time (SleepScheduler, HasSleepScheduler(..), Interval(..), createSleepScheduler, sleepUntil, sleepUntil', sleepUntilInterval, sleepUntilInterval', everyMinute, everyNSeconds, nextIntervalTime, humanReadableInterval) where
+module QBar.Time (
+  HasSleepScheduler(..),
+  Interval(..),
+  SleepScheduler,
+  createSleepScheduler,
+  everyMinute,
+  everyNSeconds,
+  humanReadableInterval,
+  nextIntervalTime,
+  sleepUntil',
+  sleepUntil,
+  sleepUntilInterval',
+  sleepUntilInterval,
+) where
 
 import QBar.Prelude
 
diff --git a/qbar/src/QBar/Utils.hs b/qbar/src/QBar/Utils.hs
index ca0c2fc7c4f95b41bb4dbb458539624de578dd12..b5442e67eeef3e2d9b876f47e2ea13513c0133d4 100644
--- a/qbar/src/QBar/Utils.hs
+++ b/qbar/src/QBar/Utils.hs
@@ -1,4 +1,9 @@
-module QBar.Utils where
+module QBar.Utils (
+  mkBroadcastCacheP,
+  mkBroadcastP,
+  randomIdentifier,
+  signalEventPipe,
+) where
 
 import QBar.Prelude