diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,15 @@
 # Changelog for extensible-effects-concurrent
 
+## 0.21.1
+
+- Remove dependency to the `socket` and `socket-unix` packages
+  - they are marked as *broken* by in NixOS
+  - the code based on `network` is much shorter
+
+- Rewrite the UDP log writer to use `network`
+
+- Rewrite the UnixSocket log writer to use `network`
+
 ## 0.21.0
 
 - Add more log message renderers
diff --git a/extensible-effects-concurrent.cabal b/extensible-effects-concurrent.cabal
--- a/extensible-effects-concurrent.cabal
+++ b/extensible-effects-concurrent.cabal
@@ -1,6 +1,6 @@
 cabal-version:  2.0
 name:           extensible-effects-concurrent
-version:        0.21.0
+version:        0.21.1
 description:    Please see the README on GitHub at <https://github.com/sheyll/extensible-effects-concurrent#readme>
 synopsis:       Message passing concurrency as extensible-effect
 homepage:       https://github.com/sheyll/extensible-effects-concurrent#readme
@@ -59,9 +59,8 @@
       extensible-effects >= 5 && < 6,
       stm >= 2.4.5 && <2.6,
       transformers-base >= 0.4 && < 0.5,
-      socket >= 0.8 && < 0.9,
-      socket-unix >= 0.2 && < 0.3,
-      text >= 1.2 && < 1.3
+      text >= 1.2 && < 1.3,
+      network >=2 && <4
   autogen-modules: Paths_extensible_effects_concurrent
   exposed-modules:
                   Control.Eff.Loop,
diff --git a/src/Control/Eff/Log.hs b/src/Control/Eff/Log.hs
--- a/src/Control/Eff/Log.hs
+++ b/src/Control/Eff/Log.hs
@@ -1,26 +1,16 @@
--- | A logging effect.
+-- | Logging via @extensible-effects@
 --
--- There is just one log message type: 'LogMessage' and it is written using 'logMsg' and
--- the functions built on top of it.
+-- Logging consist of __two__ effects:
 --
--- The 'Logs' effect is tightly coupled with the 'LogWriterReader' effect.
--- When using the 'Control.Monad.Trans.ControlMonadBaseControl' instance, the underlying monad of the 'LogWriter',
--- that is expected to be present through the respective 'LogWriterReader', is
--- constrained to be the base monad itself, e.g. 'IO'.
+-- * __Receiving__ log messages sent by the code using e.g. 'logInfo'; this also include deep evaluation and
+--    dropping messages not satisfying the current 'LogPredicate'.
 --
--- The log message type is fixed to 'LogMessage', and there is a type class for
--- converting to that, call 'ToLogMessage'.
+-- * __Writing__ log message to disk, network, ... etc; this also includes rendering log messages and setting
+--     fields like the hostname, timestamp, etc
 --
--- There is a single global 'LogPredicate' that can be used to suppress logs directly
--- at the point where they are sent, in the 'logMsg' function.
+-- == Example
 --
--- Note that all logging is eventually done via 'logMsg'; 'logMsg' is the __only__ place where
--- log filtering should happen.
 --
--- Also, 'LogMessage's are evaluated using 'Control.DeepSeq.deepseq', __after__ they pass the 'LogPredicate', also inside 'logMsg'.
---
--- Example:
---
 -- > exampleLogging :: IO ()
 -- > exampleLogging =
 -- >     runLift
@@ -38,16 +28,47 @@
 -- >             logWarning "test 2.2"
 -- >       logCritical "test 1.3"
 --
--- == Asynchronous Logging
+-- == Log Message Data Type
 --
--- Logging in a 'Control.Concurrent.Async.withAsync' spawned thread is done using 'withAsyncLogging'.
+-- A singular /logging event/  is contained in a __'LogMessage's__ value.
 --
--- == 'LogPredicate's
+-- The 'LogMessage' is modelled along RFC-5424.
 --
--- See "Control.Eff.Log.Handler#LogPredicate"
+-- There is the 'ToLogMessage' class for converting to 'LogMessage'.
+--  /Although the author is not clear on how to pursue the approach./
+--
+-- == Receiving and Filtering
+--
+-- 'LogMessage's are sent using 'logMsg' and friends, see "Control.Eff.Log#SendingLogs"
+--
+-- === Log Message Predicates
+--
+-- There is a single global 'LogPredicate' that can be used to suppress logs before
+-- they are passed to any 'LogWriter'.
+--
+-- This is done by the 'logMsg' function.
+--
+-- Also, 'LogMessage's are evaluated using 'Control.DeepSeq.deepseq', __after__ they pass the 'LogPredicate',
+-- also inside 'logMsg'.
+--
+-- See "Control.Eff.Log#LogPredicate"
+--
+-- == Writing and Rendering
+--
+-- Writing is done through a 'LogWriter'; the current 'LogWriter' value to use is held by the
+-- 'LogWriterReader' effect.
+--
+-- === Log Message Rendering
+--
+-- Message are rendered by 'LogMessageRenderer's found in the "Control.Eff.Log.MessageRenderer".
+--
+-- === 'LogWriter's
+--
+-- * Logging in a 'Control.Concurrent.Async.withAsync' spawned thread is done using 'withAsyncLogging'.
+
 module Control.Eff.Log
   ( -- * Logging API
-    -- ** Sending Log Messages
+    -- ** Sending Log Messages #SendingLogs#
     logMsg
   , logWithSeverity
   , logWithSeverity'
@@ -119,3 +140,16 @@
 import           Control.Eff.Log.Message
 import           Control.Eff.Log.MessageRenderer
 import           Control.Eff.Log.Writer
+
+-- $LogPredicate
+--
+-- Ways to change the 'LogPredicate' are:
+--
+--  * 'setLogPredicate'.
+--  * 'modifyLogPredicate'.
+--  * 'includeLogMessages'
+--  * 'excludeLogMessages'
+--
+-- The current predicate is retrieved via 'askLogPredicate'.
+--
+-- Some pre-defined 'LogPredicate's can be found here: "Control.Eff.Log.Message#PredefinedPredicates"
diff --git a/src/Control/Eff/Log/Handler.hs b/src/Control/Eff/Log/Handler.hs
--- a/src/Control/Eff/Log/Handler.hs
+++ b/src/Control/Eff/Log/Handler.hs
@@ -28,7 +28,6 @@
   , logDebug'
 
   -- ** Log Message Pre-Filtering #LogPredicate#
-  -- $LogPredicate
   , includeLogMessages
   , excludeLogMessages
   , setLogPredicate
@@ -90,7 +89,7 @@
 -- | This effect sends 'LogMessage's and is a reader for a 'LogPredicate'.
 --
 -- Logs are sent via 'logMsg';
--- for more information about log predicates, see "Control.Eff.Log.Handler#LogPredicate"
+-- for more information about log predicates, see "Control.Eff.Log#LogPredicate"
 --
 -- This effect is handled via 'withLogging'.
 data Logs v where
@@ -434,22 +433,9 @@
   -> Eff e ()
 logDebug' = withFrozenCallStack (logWithSeverity' debugSeverity)
 
--- $LogPredicate
---
--- Ways to change the 'LogPredicate' are:
---
---  * 'setLogPredicate'.
---  * 'modifyLogPredicate'.
---  * 'includeLogMessages'
---  * 'excludeLogMessages'
---
--- The current predicate is retrieved via 'askLogPredicate'.
---
--- Some pre-defined 'LogPredicate's can be found here: "Control.Eff.Log.Message#PredefinedPredicates"
-
 -- | Get the current 'Logs' filter/transformer function.
 --
--- See "Control.Eff.Log.Handler#LogPredicate"
+-- See "Control.Eff.Log#LogPredicate"
 askLogPredicate :: forall e . (Member Logs e) => Eff e LogPredicate
 askLogPredicate = send @Logs AskLogFilter
 
@@ -471,7 +457,7 @@
 --
 -- In order to also delegate to the previous predicate, use 'modifyLogPredicate'
 --
--- See "Control.Eff.Log.Handler#LogPredicate"
+-- See "Control.Eff.Log#LogPredicate"
 setLogPredicate
   :: forall r b
    . (Member Logs r, HasCallStack)
@@ -493,7 +479,7 @@
 --                        logMsg "this message might be logged")
 -- @
 --
--- See "Control.Eff.Log.Handler#LogPredicate"
+-- See "Control.Eff.Log#LogPredicate"
 modifyLogPredicate
   :: forall e b
    . (Member Logs e, HasCallStack)
@@ -516,7 +502,7 @@
 -- Although it is enough if the previous predicate holds.
 -- See 'excludeLogMessages' and 'modifyLogPredicate'.
 --
--- See "Control.Eff.Log.Handler#LogPredicate"
+-- See "Control.Eff.Log#LogPredicate"
 includeLogMessages
   :: forall e a . (Member Logs e)
   => LogPredicate -> Eff e a -> Eff e a
@@ -530,7 +516,7 @@
 -- message to be logged.
 -- See 'excludeLogMessages' and 'modifyLogPredicate'.
 --
--- See "Control.Eff.Log.Handler#LogPredicate"
+-- See "Control.Eff.Log#LogPredicate"
 excludeLogMessages
   :: forall e a . (Member Logs e)
   => LogPredicate -> Eff e a -> Eff e a
diff --git a/src/Control/Eff/Log/Message.hs b/src/Control/Eff/Log/Message.hs
--- a/src/Control/Eff/Log/Message.hs
+++ b/src/Control/Eff/Log/Message.hs
@@ -537,12 +537,12 @@
 --  * 'discriminateByAppName'
 --
 -- To find out how to use these predicates,
--- goto "Control.Eff.Log.Handler#LogPredicate"
+-- goto "Control.Eff.Log#LogPredicate"
 
 
 -- | The filter predicate for message that shall be logged.
 --
--- See "Control.Eff.Log.Handler#LogPredicate"
+-- See "Control.Eff.Log#LogPredicate"
 type LogPredicate = LogMessage -> Bool
 
 -- | All messages.
diff --git a/src/Control/Eff/LogWriter/UDP.hs b/src/Control/Eff/LogWriter/UDP.hs
--- a/src/Control/Eff/LogWriter/UDP.hs
+++ b/src/Control/Eff/LogWriter/UDP.hs
@@ -7,10 +7,8 @@
 
 import           Control.Eff                   as Eff
 import           Control.Eff.Log
-import           Control.Eff.LogWriter.Console
 import           Control.Eff.LogWriter.IO
 import           Data.Text                     as T
-import           Data.Text.IO                  as T
 import           Data.Text.Encoding            as T
 import qualified Control.Exception.Safe        as Safe
 import           Control.Monad                  ( void )
@@ -19,10 +17,8 @@
                                                 , liftBaseOp
                                                 )
 import           GHC.Stack
-import qualified System.Socket                 as Socket
-import           System.Socket.Type.Datagram   as Socket
-import           System.Socket.Family.Inet     as Socket
-import qualified System.Socket.Protocol.UDP    as Socket
+import           Network.Socket          hiding ( sendTo )
+import           Network.Socket.ByteString
 
 -- | Enable logging to a remote host via __UDP__, with some 'LogMessage' fields preset
 -- as in 'withIoLogging'.
@@ -31,8 +27,8 @@
 withUDPLogging
   :: (HasCallStack, MonadBaseControl IO (Eff e), Lifted IO e)
   => (LogMessage -> Text) -- ^ 'LogMessage' rendering function
-  -> Text -- ^ Hostname or IP
-  -> Text -- ^ Port e.g. @"514"@
+  -> String -- ^ Hostname or IP
+  -> String -- ^ Port e.g. @"514"@
   -> Text -- ^ The default application name to put into the 'lmAppName' field.
   -> Facility -- ^ The default RFC-5424 facility to put into the 'lmFacility' field.
   -> LogPredicate -- ^ The inital predicate for log messages, there are some pre-defined in "Control.Eff.Log.Message#PredefinedPredicates"
@@ -49,8 +45,8 @@
 withUDPLogWriter
   :: (Lifted IO e, LogsTo IO e, MonadBaseControl IO (Eff e), HasCallStack)
   => (LogMessage -> Text) -- ^ 'LogMessage' rendering function
-  -> Text -- ^ Hostname or IP
-  -> Text -- ^ Port e.g. @"514"@
+  -> String -- ^ Hostname or IP
+  -> String -- ^ Port e.g. @"514"@
   -> Eff e b
   -> Eff e b
 withUDPLogWriter render hostname port e =
@@ -60,28 +56,25 @@
 withUDPSocket
   :: HasCallStack
   => (LogMessage -> Text) -- ^ 'LogMessage' rendering function
-  -> Text -- ^ Hostname or IP
-  -> Text -- ^ Port e.g. @"514"@
+  -> String -- ^ Hostname or IP
+  -> String -- ^ Port e.g. @"514"@
   -> (LogWriter IO -> IO a)
   -> IO a
 withUDPSocket render hostname port ioE = Safe.bracket
-  (Socket.socket :: IO (Socket.Socket Inet Datagram Socket.UDP))
-  (Safe.try @IO @Catch.SomeException . Socket.close)
-  (\s -> do
-    ai <- Socket.getAddressInfo (Just (T.encodeUtf8 hostname))
-                                (Just (T.encodeUtf8 port))
-                                mempty
-    case ai :: [Socket.AddressInfo Inet Datagram Socket.UDP] of
-      (a : _) -> do
-        let addr = Socket.socketAddress a
+  (do
+    let hints = defaultHints { addrSocketType = Datagram }
+    addr : _ <- getAddrInfo (Just hints) (Just hostname) (Just port)
+    s <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)
+    return (addr, s)
+  )
+  (Safe.try @IO @Catch.SomeException . close . snd)
+  (\(a, s) ->
+      let addr = addrAddress a
+      in
         ioE
           (mkLogWriterIO
-            (\lmStr -> void
-              $ Socket.sendTo s (T.encodeUtf8 (render lmStr)) Socket.msgNoSignal addr
+            (\lmStr ->
+              void $ sendTo s (T.encodeUtf8 (render lmStr)) addr
             )
           )
-
-      [] -> do
-        T.putStrLn ("could not resolve UDP syslog server: " <> hostname)
-        ioE consoleLogWriter
   )
diff --git a/src/Control/Eff/LogWriter/UnixSocket.hs b/src/Control/Eff/LogWriter/UnixSocket.hs
--- a/src/Control/Eff/LogWriter/UnixSocket.hs
+++ b/src/Control/Eff/LogWriter/UnixSocket.hs
@@ -19,11 +19,8 @@
                                                 , liftBaseOp
                                                 )
 import           GHC.Stack
-import qualified System.Socket                 as Socket
-import           System.Socket.Type.Datagram   as Socket
-import           System.Socket.Family.Unix     as Socket
-import qualified System.Socket.Protocol.Default
-                                               as Socket
+import           Network.Socket          hiding ( sendTo )
+import           Network.Socket.ByteString
 
 -- | Enable logging to a /unix domain socket/, with some 'LogMessage' fields preset
 -- as in 'withIoLogging'.
@@ -61,19 +58,31 @@
   -> (LogWriter IO -> IO a)
   -> IO a
 withUnixSocketSocket render socketPath ioE = Safe.bracket
-  (Socket.socket :: IO (Socket.Socket Unix Datagram Socket.Default))
-  (Safe.try @IO @Catch.SomeException . Socket.close)
-  (\s -> case socketAddressUnixPath (T.encodeUtf8 (T.pack socketPath)) of
-    Just addr -> do
-      Socket.connect s addr
-      ioE
-        (mkLogWriterIO
-          (\lmStr -> void
-            $ Socket.send s (T.encodeUtf8 (render lmStr)) Socket.msgNoSignal
+  (socket AF_UNIX Datagram defaultProtocol)
+  (Safe.try @IO @Catch.SomeException . close)
+  (\s ->
+      let addr = SockAddrUnix socketPath
+      in
+        ioE
+          (mkLogWriterIO
+            (\lmStr ->
+              void $ sendTo s (T.encodeUtf8 (render lmStr)) addr
+            )
           )
-        )
-
-    Nothing -> do
-      T.putStrLn $ "could not open unix domain socket: " <> T.pack socketPath
-      ioE consoleLogWriter
   )
+  -- (Socket.socket :: IO (Socket.Socket Unix Datagram Socket.Default))
+  -- (Safe.try @IO @Catch.SomeException . Socket.close)
+  -- (\s -> case socketAddressUnixPath (T.encodeUtf8 (T.pack socketPath)) of
+  --   Just addr -> do
+  --     Socket.connect s addr
+  --     ioE
+  --       (mkLogWriterIO
+  --         (\lmStr -> void
+  --           $ Socket.send s (T.encodeUtf8 (render lmStr)) Socket.msgNoSignal
+  --         )
+  --       )
+
+  --   Nothing -> do
+  --     T.putStrLn $ "could not open unix domain socket: " <> T.pack socketPath
+  --     ioE consoleLogWriter
+  -- )
diff --git a/stack.yaml b/stack.yaml
--- a/stack.yaml
+++ b/stack.yaml
@@ -41,8 +41,6 @@
   # (e.g., acme-missiles-0.3)
 extra-deps:
   - extensible-effects-5.0.0.1
-  - socket-unix-0.2.0.0
-  - socket-0.8.2.0
 
   # Override default flag values for local packages and extra-deps
   # flags: {}
