diff --git a/canvas2d/Main.hs b/canvas2d/Main.hs
--- a/canvas2d/Main.hs
+++ b/canvas2d/Main.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE OverloadedStrings #-}
 module Main where
@@ -19,9 +20,9 @@
 main :: IO ()
 main = do
   [sun, moon, earth] <- replicateM 3 newImage
-  setSrc sun "https://mdn.mozillademos.org/files/1456/Canvas_sun.png"
-  setSrc moon "https://mdn.mozillademos.org/files/1443/Canvas_moon.png"
-  setSrc earth "https://mdn.mozillademos.org/files/1429/Canvas_earth.png"
+  setSrc sun "https://7b40c187-5088-4a99-9118-37d20a2f875e.mdnplay.dev/en-US/docs/Web/API/Canvas_API/Tutorial/Basic_animations/canvas_sun.png"
+  setSrc moon "https://7b40c187-5088-4a99-9118-37d20a2f875e.mdnplay.dev/en-US/docs/Web/API/Canvas_API/Tutorial/Basic_animations/canvas_moon.png"
+  setSrc earth "https://7b40c187-5088-4a99-9118-37d20a2f875e.mdnplay.dev/en-US/docs/Web/API/Canvas_API/Tutorial/Basic_animations/canvas_earth.png"
   startApp App { initialAction = GetTime
                , update = updateModel (sun,moon,earth)
                , ..
@@ -70,6 +71,31 @@
   drawImage sun 0 0 300 300 ctx
   pure GetTime
 
+#ifndef ghcjs_HOST_OS
+foreign import javascript unsafe "((x) => { x.globalCompositeOperation = 'destination-over'; })"
+  setGlobalCompositeOperation :: Context -> IO ()
+
+foreign import javascript unsafe "((x, y, z, w) => { w.drawImage(x,y,z); })"
+  drawImage' :: Image -> Double -> Double -> Context -> IO ()
+
+foreign import javascript unsafe "(() => { return document.getElementById('canvas').getContext('2d'); })"
+  getCtx :: IO Context
+
+foreign import javascript unsafe "(() => { return new Image(); })"
+  newImage :: IO Image
+
+foreign import javascript unsafe "((x, y) => { x.src = y; })"
+  setSrc :: Image -> MisoString -> IO ()
+
+foreign import javascript unsafe "(() => { return new Date(); })"
+  newDate :: IO JSVal
+
+foreign import javascript unsafe "((x) => { return x.getSeconds(); })"
+  getSecs :: JSVal -> IO Double
+
+foreign import javascript unsafe "((x) => { return x.getMilliseconds(); })"
+  getMillis :: JSVal -> IO Double
+#else
 foreign import javascript unsafe "$1.globalCompositeOperation = 'destination-over';"
   setGlobalCompositeOperation :: Context -> IO ()
 
@@ -93,4 +119,5 @@
 
 foreign import javascript unsafe "$r = $1.getMilliseconds();"
   getMillis :: JSVal -> IO Double
+#endif
 
diff --git a/file-reader/Main.hs b/file-reader/Main.hs
--- a/file-reader/Main.hs
+++ b/file-reader/Main.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP                 #-}
 {-# LANGUAGE DeriveGeneric       #-}
 {-# LANGUAGE OverloadedStrings   #-}
 {-# LANGUAGE ScopedTypeVariables #-}
@@ -12,7 +13,11 @@
 import           Control.Concurrent.MVar
 
 import GHCJS.Types
+#ifndef ghcjs_HOST_OS
+import GHC.JS.Foreign.Callback
+#else
 import GHCJS.Foreign.Callback
+#endif
 
 -- | Model
 data Model
@@ -71,6 +76,22 @@
       , div_ [] [ text info ]
       ]
 
+#ifndef ghcjs_HOST_OS
+foreign import javascript unsafe "(() => { return new FileReader(); })"
+  newReader :: IO JSVal
+
+foreign import javascript unsafe "((x) => { return x.files[0]; })"
+  getFile :: JSVal -> IO JSVal
+
+foreign import javascript unsafe "((x, y) => { x.onload = y; })"
+  setOnLoad :: JSVal -> Callback (IO ()) -> IO ()
+
+foreign import javascript unsafe "((x) => { return x.result; })"
+  getResult :: JSVal -> IO MisoString
+
+foreign import javascript unsafe "((x, y) => { x.readAsText(y); })"
+  readText :: JSVal -> JSVal -> IO ()
+#else
 foreign import javascript unsafe "$r = new FileReader();"
   newReader :: IO JSVal
 
@@ -85,3 +106,4 @@
 
 foreign import javascript unsafe "$1.readAsText($2);"
   readText :: JSVal -> JSVal -> IO ()
+#endif
diff --git a/miso-examples.cabal b/miso-examples.cabal
--- a/miso-examples.cabal
+++ b/miso-examples.cabal
@@ -1,16 +1,16 @@
+cabal-version:       2.2
 name:                miso-examples
-version:             1.8.5.0
+version:             1.8.6.0
 category:            Web, Miso, Data Structures
-author:              David M. Johnson <djohnson.m@gmail.com>
-maintainer:          David M. Johnson <djohnson.m@gmail.com>
+author:              David M. Johnson <code@dmj.io>
+maintainer:          David M. Johnson <code@dmj.io>
 homepage:            http://github.com/dmjio/miso
-copyright:           Copyright (c) 2017-2020 David M. Johnson
+copyright:           Copyright (c) 2016-2025 David M. Johnson
 bug-reports:         https://github.com/dmjio/miso/issues
 build-type:          Simple
-cabal-version:       1.22
-synopsis:            A tasty Haskell front-end framework
+synopsis:            A tasty Haskell front-end web framework
 description:         Examples for miso
-license:             BSD3
+license:             BSD-3-Clause
 license-file:        LICENSE
 
 extra-source-files:
@@ -31,6 +31,8 @@
     Cross compile to iOS
 
 executable simple
+  default-language:
+    Haskell2010
   main-is:
     Main.hs
   if !impl(ghcjs) && !flag(jsaddle)
@@ -48,8 +50,6 @@
       containers,
       miso,
       transformers
-    default-language:
-      Haskell2010
     if flag(ios)
       cpp-options:
         -DIOS
@@ -62,6 +62,8 @@
         jsaddle-warp
 
 executable todo-mvc
+  default-language:
+    Haskell2010
   main-is:
     Main.hs
   if !impl(ghcjs) && !arch(javascript) && !flag(jsaddle)
@@ -82,8 +84,6 @@
       containers,
       miso,
       transformers
-    default-language:
-      Haskell2010
     if flag(ios)
       cpp-options:
         -DIOS
@@ -96,6 +96,8 @@
         jsaddle-warp
 
 executable threejs
+  default-language:
+    Haskell2010
   main-is:
     Main.hs
   if !impl(ghcjs) && !arch(javascript)
@@ -113,10 +115,10 @@
       ghcjs-base,
       containers,
       miso
-    default-language:
-      Haskell2010
 
 executable file-reader
+  default-language:
+    Haskell2010
   main-is:
     Main.hs
   if !impl(ghcjs) && !arch(javascript)
@@ -134,10 +136,10 @@
       containers,
       ghcjs-base,
       miso
-    default-language:
-      Haskell2010
 
 executable xhr
+  default-language:
+    Haskell2010
   main-is:
     Main.hs
   if !impl(ghcjs) && !arch(javascript)
@@ -155,10 +157,10 @@
       containers,
       ghcjs-base,
       miso
-    default-language:
-      Haskell2010
 
 executable canvas2d
+  default-language:
+    Haskell2010
   main-is:
     Main.hs
   if !impl(ghcjs) && !arch(javascript)
@@ -175,10 +177,10 @@
       base < 5,
       ghcjs-base,
       miso
-    default-language:
-      Haskell2010
 
 executable router
+  default-language:
+    Haskell2010
   main-is:
     Main.hs
   if !impl(ghcjs) && !arch(javascript) && !flag(jsaddle)
@@ -200,8 +202,6 @@
       miso,
       servant,
       transformers
-    default-language:
-      Haskell2010
     if flag(ios)
       cpp-options:
         -DIOS
@@ -214,6 +214,8 @@
         jsaddle-warp
 
 executable websocket
+  default-language:
+    Haskell2010
   main-is:
     Main.hs
   if !impl(ghcjs) && !arch(javascript) && !flag(jsaddle)
@@ -234,8 +236,6 @@
       containers,
       miso,
       transformers
-    default-language:
-      Haskell2010
     if flag(ios)
       cpp-options:
        -DIOS
@@ -248,6 +248,8 @@
         jsaddle-warp
 
 executable mario
+  default-language:
+    Haskell2010
   main-is:
     Main.hs
   if !impl(ghcjs) && !arch(javascript) && !flag(jsaddle)
@@ -282,10 +284,10 @@
     if !flag(ios)
       build-depends:
         jsaddle-warp
-    default-language:
-      Haskell2010
 
 executable svg
+  default-language:
+    Haskell2010
   main-is:
     Main.hs
   if !impl(ghcjs) && !arch(javascript)
@@ -304,10 +306,10 @@
       containers,
       aeson,
       miso
-    default-language:
-      Haskell2010
 
 executable compose-update
+  default-language:
+    Haskell2010
   main-is:
     Main.hs
   if !impl(ghcjs) && !arch(javascript)
@@ -322,10 +324,10 @@
     build-depends:
       base < 5,
       miso
-    default-language:
-      Haskell2010
 
 executable mathml
+  default-language:
+    Haskell2010
   main-is:
     Main.hs
   if !impl(ghcjs) && !arch(javascript)
@@ -340,5 +342,3 @@
     build-depends:
       base < 5,
       miso
-    default-language:
-      Haskell2010
diff --git a/three/Main.hs b/three/Main.hs
--- a/three/Main.hs
+++ b/three/Main.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP               #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards   #-}
 module Main where
@@ -97,6 +98,61 @@
 updateModel _ (SetTime m) _ =
   m <# pure GetTime
 
+#ifndef ghcjs_HOST_OS
+foreign import javascript unsafe "(() => { return new Stats(); })"
+  newStats :: IO JSVal
+
+foreign import javascript unsafe "((x) => { x.begin(); })"
+  statsBegin :: JSVal -> IO ()
+
+foreign import javascript unsafe "((x) => { x.end(); })"
+  statsEnd :: JSVal -> IO ()
+
+foreign import javascript unsafe "((x) => { x.showPanel(0); })"
+  showPanel :: JSVal -> IO ()
+
+foreign import javascript unsafe "(() => { return new THREE.Scene();})"
+  newScene :: IO JSVal
+
+foreign import javascript unsafe "((x,y,z) => { return new THREE.BoxGeometry(x,y,z); })"
+  newBoxGeometry :: Int -> Int -> Int -> IO JSVal
+
+foreign import javascript unsafe "(() => { return new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 ); })"
+  newCamera :: IO JSVal
+
+foreign import javascript unsafe "((x,y) => { return new THREE.Mesh( x, y ); })"
+  newMesh :: JSVal -> JSVal -> IO JSVal
+
+foreign import javascript unsafe "(() => { return new THREE.MeshBasicMaterial( { color: 0x00ff00 } ); })"
+  newMeshBasicMaterial :: IO JSVal
+
+foreign import javascript unsafe "((x) => { return new THREE.WebGLRenderer({canvas:x, antialias : true}); })"
+  newRenderer :: JSVal -> IO JSVal
+
+foreign import javascript unsafe "((x) => { x.setSize( window.innerWidth, window.innerHeight ); })"
+  setSize :: JSVal -> IO ()
+
+foreign import javascript unsafe "((x, y) => { x.add(y); })"
+  addToScene :: JSVal -> JSVal -> IO ()
+
+foreign import javascript unsafe "((x, y) => { x.position.z = y; })"
+  cameraZ :: JSVal -> Int -> IO ()
+
+foreign import javascript unsafe "((a, y) => { a.rotation.x += y; })"
+  rotateX :: JSVal -> Double -> IO ()
+
+foreign import javascript unsafe "((x, a) => { x.rotation.y += a; })"
+  rotateY :: JSVal -> Double -> IO ()
+
+foreign import javascript unsafe "((x, y, z) => { x.render(y, z); })"
+  render :: JSVal -> JSVal -> JSVal -> IO ()
+
+foreign import javascript unsafe "((x, y) => { x.position.z = y; })"
+  positionCamera :: JSVal -> Double -> IO ()
+
+foreign import javascript unsafe "((x, y) => { x.appendChild( y.domElement ); })"
+  addStatsToDOM :: JSVal -> JSVal -> IO ()
+#else
 foreign import javascript unsafe "$r = new Stats();"
   newStats :: IO JSVal
 
@@ -150,3 +206,4 @@
 
 foreign import javascript unsafe "$1.appendChild( $2.domElement );"
   addStatsToDOM :: JSVal -> JSVal -> IO ()
+#endif
