diff --git a/Changelog.md b/Changelog.md
--- a/Changelog.md
+++ b/Changelog.md
@@ -1,4 +1,7 @@
-## 0.7.1
+### 0.7.2
+* Render Unicode codepoints beyond `0xFFFF` properly.
+
+### 0.7.1
 * Remove the `wiki-suite` test suite from `blank-canvas.cabal`, as it was never
   intended to work as a traditional test suite. The functionality of
   `wiki-suite` has moved to a subdirectory of the upstream `blank-canvas`
diff --git a/Graphics/Blank/JavaScript.hs b/Graphics/Blank/JavaScript.hs
--- a/Graphics/Blank/JavaScript.hs
+++ b/Graphics/Blank/JavaScript.hs
@@ -1,35 +1,38 @@
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE NoImplicitPrelude #-}
 {-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TemplateHaskell   #-}
 module Graphics.Blank.JavaScript where
 
-import           Data.Char (isControl, isAscii, ord)
+import           Data.Bits                       (shiftR, (.&.))
+import           Data.Char                       (isAscii, isControl, ord)
 import           Data.Colour
 import           Data.Colour.SRGB
 import           Data.Default.Class
 import           Data.Ix
-import           Data.List
+import           Data.List                       hiding (length)
 import           Data.String
-import           Data.Text (Text)
-import qualified Data.Text.Lazy as TL
-import qualified Data.Text.Lazy.Builder as B (singleton)
-import qualified Data.Vector.Unboxed as V
-import           Data.Vector.Unboxed (Vector, toList)
-import           Data.Word (Word8)
+import           Data.Text                       (Text)
+import qualified Data.Text.Lazy                  as TL
+import qualified Data.Text.Lazy.Builder          as B (singleton)
+import           Data.Vector.Unboxed             (Vector, toList)
+import qualified Data.Vector.Unboxed             as V
+import           Data.Word                       (Word8)
 
 import           Graphics.Blank.Parser
 
 import           Prelude.Compat
 
-import           Text.ParserCombinators.ReadP (choice, skipSpaces)
+import           Text.ParserCombinators.ReadP    (choice, skipSpaces)
 import           Text.ParserCombinators.ReadPrec (lift)
-import           Text.Read (Read(..), parens, readListPrecDefault)
+import           Text.Read                       (Read (..), parens,
+                                                  readListPrecDefault)
 
+import           Numeric                         (showHex)
 import           TextShow
-import           TextShow.Data.Floating (showbFFloat)
-import           TextShow.Data.Integral (showbHex)
-import           TextShow.TH (deriveTextShow)
+import           TextShow.Data.Floating          (showbFFloat)
+import           TextShow.Data.Integral          (showbHex)
+import           TextShow.TH                     (deriveTextShow)
 
 -------------------------------------------------------------
 
@@ -543,13 +546,6 @@
 jsQuoteBuilder :: Builder -> Builder
 jsQuoteBuilder b = B.singleton '"' <> b <> B.singleton '"'
 
--- | Transform a character to a lazy 'TL.Text' that represents its JS
---   unicode escape sequence.
-jsUnicodeChar :: Char -> TL.Text
-jsUnicodeChar c =
-    let hex = toLazyText . showbHex $ ord c
-    in "\\u" <> TL.replicate (4 - TL.length hex) (TL.singleton '0') <> hex
-
 -- | Correctly replace a `Builder'`s characters by the JS escape sequences.
 jsEscapeBuilder :: Builder -> Builder
 jsEscapeBuilder = fromLazyText . TL.concatMap jsEscapeChar . toLazyText
@@ -558,8 +554,6 @@
 jsEscapeChar :: Char -> TL.Text
 jsEscapeChar '\\' = "\\\\"
 -- Special control sequences.
-jsEscapeChar '\0' = jsUnicodeChar '\0' -- Ambigous with numbers
-jsEscapeChar '\a' = jsUnicodeChar '\a' -- Non JS
 jsEscapeChar '\b' = "\\b"
 jsEscapeChar '\f' = "\\f"
 jsEscapeChar '\n' = "\\n"
@@ -568,7 +562,17 @@
 jsEscapeChar '\v' = "\\v"
 jsEscapeChar '\"' = "\\\""
 jsEscapeChar '\'' = "\\'"
--- Non-control ASCII characters can remain as they are.
-jsEscapeChar c' | not (isControl c') && isAscii c' = TL.singleton c'
--- All other non ASCII signs are escaped to unicode.
-jsEscapeChar c' = jsUnicodeChar c'
+-- Code borrowed from GHCJS implementation: https://github.com/ghcjs/ghcjs/blob/718b37fc7167269ebca633914c716c3dbe6d0faf/src/Compiler/JMacro/Base.hs#L887-L905
+jsEscapeChar '/'  = "\\/"
+jsEscapeChar c
+    -- Non-control ASCII characters can remain as they are.
+    | not (isControl c) && isAscii c = TL.singleton c
+    | ord c <= 0xff   = hexxs "\\x" 2 (ord c)
+    -- All other non ASCII signs are escaped to unicode.
+    | ord c <= 0xffff = hexxs "\\u" 4 (ord c)
+    | otherwise      = let cp0 = ord c - 0x10000 -- output surrogate pair
+                       in hexxs "\\u" 4 ((cp0 `shiftR` 10) + 0xd800) `mappend`
+                          hexxs "\\u" 4 ((cp0 .&. 0x3ff) + 0xdc00)
+    where hexxs prefix pad cp =
+            let h = showHex cp ""
+            in  TL.pack (prefix ++ replicate (pad - length h) '0' ++ h)
diff --git a/blank-canvas.cabal b/blank-canvas.cabal
--- a/blank-canvas.cabal
+++ b/blank-canvas.cabal
@@ -1,5 +1,5 @@
 Name:                blank-canvas
-Version:             0.7.1
+Version:             0.7.2
 Synopsis:            HTML5 Canvas Graphics Library
 
 Description:      @blank-canvas@ is a Haskell binding to the complete
@@ -47,7 +47,8 @@
                    , GHC == 8.2.2
                    , GHC == 8.4.4
                    , GHC == 8.6.5
-                   , GHC == 8.8.1
+                   , GHC == 8.8.3
+                   , GHC == 8.10.1
 data-files:
     static/index.html
     static/jquery.js
@@ -74,8 +75,8 @@
                        Paths_blank_canvas
 
   default-language:    Haskell2010
-  build-depends:       aeson                 >= 0.7     && < 1.5,
-                       base64-bytestring     == 1.0.*,
+  build-depends:       aeson                 >= 0.7     && < 1.6,
+                       base64-bytestring     >= 1.0     && < 1.3,
                        base                  >= 4.7     && < 4.15,
                        base-compat-batteries >= 0.10    && < 0.12,
                        bytestring            == 0.10.*,
@@ -86,7 +87,7 @@
                        http-types            >= 0.8     && < 0.13,
                        mime-types            >= 0.1.0.3 && < 0.2,
                        kansas-comet          >= 0.4     && < 0.5,
-                       scotty                >= 0.10    && < 0.12,
+                       scotty                >= 0.10    && < 0.13,
                        semigroups            >= 0.18    && < 1,
                        stm                   >= 2.2     && < 2.6,
                        text                  >= 1.1     && < 1.3,
