diff --git a/src/Quasar/Observable.hs b/src/Quasar/Observable.hs
index 939002fd9785ef284607d507685f3c571aa68c8d..549b838375a75fa17a035db3280568019653950f 100644
--- a/src/Quasar/Observable.hs
+++ b/src/Quasar/Observable.hs
@@ -22,6 +22,7 @@ module Quasar.Observable (
   mergeObservable,
   joinObservable,
   bindObservable,
+  unsafeObservableIO,
 
   -- * Helper types
   ObservableCallback,
@@ -303,6 +304,21 @@ constObservable :: v -> Observable v
 constObservable = Observable . ConstObservable
 
 
+-- | Create an observable by simply running an IO action whenever a value is requested or a callback is registered.
+--
+-- There is no mechanism to send more than one update, so the resulting `Observable` will only be correct in specific
+-- situations.
+unsafeObservableIO :: forall v. IO v -> Observable v
+unsafeObservableIO action = synchronousFnObservable observeFn action
+  where
+    observeFn :: (ObservableMessage v -> IO ()) -> IO Disposable
+    observeFn callback = do
+      callback ObservableLoading
+      value <- (ObservableUpdate <$> action) `catchAll` (pure . ObservableNotAvailable @v)
+      callback value
+      pure noDisposable
+
+
 -- TODO implement
 --cacheObservable :: IsObservable v o => o -> Observable v
 --cacheObservable = undefined