diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,7 @@
+0.5.2
+===
+* dependency bumps for 9.10
+
 0.5
 ===
 * complete refactor
diff --git a/box-socket.cabal b/box-socket.cabal
--- a/box-socket.cabal
+++ b/box-socket.cabal
@@ -1,6 +1,6 @@
 cabal-version: 3.0
 name: box-socket
-version: 0.5.1.0
+version: 0.5.2.0
 license: BSD-3-Clause
 license-file: LICENSE
 copyright: Tony Day (c) 2017
@@ -13,10 +13,12 @@
 description: Websockets built with the box library.
 build-type: Simple
 tested-with:
-    GHC ==8.10.7 || ==9.2.7 || ==9.4.7 || ==9.6.3 || ==9.8.1
+    , GHC == 9.10.1
+    , GHC == 9.6.5
+    , GHC == 9.8.2
 extra-doc-files:
     ChangeLog.md
-    readme.org
+    readme.md
 
 source-repository head
     type: git
@@ -41,60 +43,7 @@
         -Wredundant-constraints
 
 common ghc2021-stanza
-    if impl ( ghc >= 9.2 )
-        default-language: GHC2021
-
-    if impl ( ghc < 9.2 )
-        default-language: Haskell2010
-        default-extensions:
-            BangPatterns
-            BinaryLiterals
-            ConstrainedClassMethods
-            ConstraintKinds
-            DeriveDataTypeable
-            DeriveFoldable
-            DeriveFunctor
-            DeriveGeneric
-            DeriveLift
-            DeriveTraversable
-            DoAndIfThenElse
-            EmptyCase
-            EmptyDataDecls
-            EmptyDataDeriving
-            ExistentialQuantification
-            ExplicitForAll
-            FlexibleContexts
-            FlexibleInstances
-            ForeignFunctionInterface
-            GADTSyntax
-            GeneralisedNewtypeDeriving
-            HexFloatLiterals
-            ImplicitPrelude
-            InstanceSigs
-            KindSignatures
-            MonomorphismRestriction
-            MultiParamTypeClasses
-            NamedFieldPuns
-            NamedWildCards
-            NumericUnderscores
-            PatternGuards
-            PolyKinds
-            PostfixOperators
-            RankNTypes
-            RelaxedPolyRec
-            ScopedTypeVariables
-            StandaloneDeriving
-            StarIsType
-            TraditionalRecordSyntax
-            TupleSections
-            TypeApplications
-            TypeOperators
-            TypeSynonymInstances
-
-    if impl ( ghc < 9.2 ) && impl ( ghc >= 8.10 )
-        default-extensions:
-            ImportQualifiedPost
-            StandaloneKindSignatures
+    default-language: GHC2021
 
 library
     import: ghc-options-stanza
@@ -102,13 +51,13 @@
     hs-source-dirs: src
     build-depends:
         , async          >=2.2.3 && <2.3
-        , base           >=4.8 && <5
+        , base           >=4.14 && <5
         , box            >=0.9.3 && <0.10
         , bytestring     >=0.11.3 && <0.13
         , network-simple >=0.4 && <0.5
         , profunctors    >=5.6 && <5.7
         , text           >=1.2 && <2.2
-        , websockets     >=0.12 && <0.13
+        , websockets     >=0.12 && <0.14
     exposed-modules:
         Box.Socket.Types
         Box.TCP
@@ -123,6 +72,16 @@
     main-is: box-socket.hs
     hs-source-dirs: app
     build-depends:
-        , base                 >=4.7 && <5
+        , base                 >=4.14 && <5
         , box-socket
         , optparse-applicative >=0.17 && <0.19
+
+test-suite doctests
+    import: ghc2021-stanza
+    main-is: doctests.hs
+    hs-source-dirs: test
+    build-depends:
+        , base             >=4.14 && <5
+        , doctest-parallel >=0.3 && <0.4
+    ghc-options: -threaded
+    type: exitcode-stdio-1.0
diff --git a/readme.md b/readme.md
new file mode 100644
--- /dev/null
+++ b/readme.md
@@ -0,0 +1,39 @@
+
+# Table of Contents
+
+1.  [Usage](#org6c95983)
+2.  [Design](#org6cb8437)
+
+[![img](https://img.shields.io/hackage/v/box-socket.svg)](https://hackage.haskell.org/package/box) [![img](https://github.com/tonyday567/box-socket/workflows/haskell-ci/badge.svg)](https://github.com/tonyday567/box/actions?query=workflow%3Ahaskell-ci)
+
+Socket API based on the box library, with websockets and TCP support.
+
+
+<a id="org6c95983"></a>
+
+# Usage
+
+    :set -XOverloadedStrings
+    import Box
+    import Box.Socket.Types
+    import Box.Websocket
+
+IO client:
+
+    clientBox defaultSocketConfig (CloseAfter 0) (stdBox "q")
+
+IO server:
+
+    serverBox defaultSocketConfig (CloseAfter 0) (stdBox "q")
+
+See examples in Box.Websocket.Example and Box.TCP.Example for a variety of usage.
+
+
+<a id="org6cb8437"></a>
+
+# Design
+
+-   The API attempts to be similar for TCP and Websocket
+
+-   A Codensity, continuation passing style is encouraged, similar to the box library.
+
diff --git a/readme.org b/readme.org
deleted file mode 100644
--- a/readme.org
+++ /dev/null
@@ -1,34 +0,0 @@
-#+TITLE: box-socket
-
-[[https://hackage.haskell.org/package/box][file:https://img.shields.io/hackage/v/box-socket.svg]] [[https://github.com/tonyday567/box/actions?query=workflow%3Ahaskell-ci][file:https://github.com/tonyday567/box-socket/workflows/haskell-ci/badge.svg]]
-
-Socket API based on the box library, with websockets and TCP support.
-
-* Usage
-
-#+begin_src haskell-ng
-:set -XOverloadedStrings
-import Box
-import Box.Socket.Types
-import Box.Websocket
-#+end_src
-
-IO client:
-
-#+begin_src haskell-ng :results output
-clientBox defaultSocketConfig (CloseAfter 0) (stdBox "q")
-#+end_src
-
-IO server:
-
-#+begin_src haskell-ng :results output
-serverBox defaultSocketConfig (CloseAfter 0) (stdBox "q")
-#+end_src
-
-See examples in Box.Websocket.Example and Box.TCP.Example for a variety of usage.
-
-* Design
-
-- The API attempts to be similar for TCP and Websocket
-
-- A Codensity, continuation passing style is encouraged, similar to the box library.
diff --git a/src/Box/Socket/Types.hs b/src/Box/Socket/Types.hs
--- a/src/Box/Socket/Types.hs
+++ b/src/Box/Socket/Types.hs
@@ -1,6 +1,3 @@
-{-# LANGUAGE AllowAmbiguousTypes #-}
-{-# LANGUAGE TypeFamilies #-}
-
 -- | Abstract sockets connected to 'Box'es.
 module Box.Socket.Types
   ( PostSend (..),
diff --git a/src/Box/TCP/Example.hs b/src/Box/TCP/Example.hs
--- a/src/Box/TCP/Example.hs
+++ b/src/Box/TCP/Example.hs
@@ -1,9 +1,4 @@
-{-# LANGUAGE DataKinds #-}
-{-# LANGUAGE FlexibleContexts #-}
-{-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# OPTIONS_GHC -Wall #-}
 
 -- | It's a box. It's a TCP socket. It's an example.
 module Box.TCP.Example where
diff --git a/src/Box/Websocket/Example.hs b/src/Box/Websocket/Example.hs
--- a/src/Box/Websocket/Example.hs
+++ b/src/Box/Websocket/Example.hs
@@ -1,9 +1,4 @@
-{-# LANGUAGE DataKinds #-}
-{-# LANGUAGE FlexibleContexts #-}
-{-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# OPTIONS_GHC -Wall #-}
 
 -- | It's a box. It's a websocket. It's an example.
 module Box.Websocket.Example where
diff --git a/test/doctests.hs b/test/doctests.hs
new file mode 100644
--- /dev/null
+++ b/test/doctests.hs
@@ -0,0 +1,8 @@
+module Main where
+
+import System.Environment (getArgs)
+import Test.DocTest (mainFromCabal)
+import Prelude (IO, (=<<))
+
+main :: IO ()
+main = mainFromCabal "box-socket" =<< getArgs
