diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -229,7 +229,7 @@
   - [Link](http://fizruk.github.io/fpconf-2017-talk/miso-aframe-demo/dist/demo.jsexe/index.html) / [Source](https://github.com/fizruk/miso-aframe)
 
 ### Pixel Card Wars
-  - [Link](https://www.schplaf.org/hgames/darkcraw/) / [Source](https://github.com/smelc/miso-darkcraw)
+  - [Link](https://smelc3.itch.io/pixel-card-wars) / [Source](https://github.com/smelc/miso-darkcraw)
 
 ### Currency Converter
   - [Link](https://functora.github.io/apps/currency-converter) / [Source](https://github.com/functora/functora.github.io/tree/master/ghcjs/currency-converter)
@@ -442,7 +442,7 @@
 
 ## Pinning nixpkgs
 
-By default `miso` uses a known-to-work, pinned version of [`nixpkgs`](https://github.com/dmjio/miso/blob/master/nixpkgs.json).
+By default `miso` uses a known-to-work, pinned version of [`nixpkgs`](https://github.com/dmjio/miso/blob/master/nix/nixpkgs.json).
 
 ## Binary cache
 
diff --git a/miso.cabal b/miso.cabal
--- a/miso.cabal
+++ b/miso.cabal
@@ -1,5 +1,5 @@
 name:                miso
-version:             1.8.4.0
+version:             1.8.5.0
 category:            Web, Miso, Data Structures
 license:             BSD3
 license-file:        LICENSE
diff --git a/src/Miso.hs b/src/Miso.hs
--- a/src/Miso.hs
+++ b/src/Miso.hs
@@ -22,6 +22,7 @@
 module Miso
   ( miso
   , startApp
+  , sink
   , module Miso.Effect
   , module Miso.Event
   , module Miso.Html
@@ -41,17 +42,18 @@
 import           Control.Monad.IO.Class
 import           Data.IORef
 import           Data.List
-import           Data.Sequence ((|>))
+import           Data.Sequence                 ((|>))
+import qualified Data.Sequence                 as S
+import qualified JavaScript.Object.Internal    as OI
+import           System.IO.Unsafe
 import           System.Mem.StableName
-import qualified Data.Sequence as S
-import qualified JavaScript.Object.Internal as OI
 
 #ifndef ghcjs_HOST_OS
-import           Language.Javascript.JSaddle (eval, waitForAnimationFrame)
+import           Language.Javascript.JSaddle   (eval, waitForAnimationFrame)
 #ifdef IOS
 import           Miso.JSBits
 #else
-import           GHCJS.Types (JSString)
+import           GHCJS.Types                   (JSString)
 import           Data.FileEmbed
 #endif
 #else
@@ -99,6 +101,8 @@
   let writeEvent a = void . liftIO . forkIO $ do
         atomicModifyIORef' actionsRef $ \as -> (as |> a, ())
         notify
+  -- init global sink
+  liftIO (writeIORef sinkRef writeEvent)
   -- init Subs
   forM_ subs $ \sub ->
     sub writeEvent
@@ -151,6 +155,16 @@
     let initialVTree = VTree (OI.Object iv)
     -- Create virtual dom, perform initial diff
     liftIO (newIORef initialVTree)
+
+sinkRef :: IORef (Sink action)
+{-# NOINLINE sinkRef #-}
+sinkRef = unsafePerformIO $ newIORef (\_ -> pure ())
+
+-- | Global sink exposed as a backdoor
+-- Meant for usage in long running IO actions, or custom callbacks
+-- Good for integrating with third-party components.
+sink :: Sink action
+sink = unsafePerformIO (readIORef sinkRef)
 
 -- | Runs a miso application
 startApp :: Eq model => App model action -> JSM ()
