diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,12 @@
 
 ## [Unreleased]
 
+## [0.0.3.0] - 2023-08-17
+### Added
+- `IsString` instance for `Cond` and `Conds`.
+### Fixed
+- `:&&:` and `:||:` render to Cypher with correct operator precedence.
+
 ## [0.0.2.2] - 2023-05-05
 ### Changed
 - Add `HasCallStack` to a lot of unpacking functions.
diff --git a/hasbolt-extras.cabal b/hasbolt-extras.cabal
--- a/hasbolt-extras.cabal
+++ b/hasbolt-extras.cabal
@@ -1,5 +1,5 @@
 name:           hasbolt-extras
-version:        0.0.2.2
+version:        0.0.3.0
 synopsis:       Extras for hasbolt library
 description:    Extras for hasbolt library
 homepage:       https://github.com/biocad/hasbolt-extras#readme
diff --git a/src/Database/Bolt/Extras/DSL/Internal/Instances.hs b/src/Database/Bolt/Extras/DSL/Internal/Instances.hs
--- a/src/Database/Bolt/Extras/DSL/Internal/Instances.hs
+++ b/src/Database/Bolt/Extras/DSL/Internal/Instances.hs
@@ -11,6 +11,7 @@
 
 import           Control.Monad.Writer                    (execWriter, tell)
 import           Data.Function                           ((&))
+import           Data.String                             (IsString(..))
 import           Data.Proxy                              (Proxy (..))
 import           Data.Text                               (intercalate, pack)
 import           Database.Bolt.Extras                    (ToCypher (..),
@@ -127,14 +128,22 @@
 instance ToCypher Selectors where
   toCypher = intercalate ", " . fmap toCypher
 
+instance IsString Cond where
+  fromString str = TC $ pack str
+
 instance ToCypher Cond where
   toCypher (ID t bId)   = pack $ printf "ID(%s)=%d" t (fromInt bId)
   toCypher (IDs t bIds) = pack $ printf "ID(%s) in [%s]" t (intercalate ", " $ fmap (pack . show) bIds)
   toCypher (IN t txts)  = pack $ printf "%s in [%s]" t (intercalate ", " $ fmap (\s -> [text|"$s"|]) txts)
   toCypher (TC txt)     = txt
 
+instance IsString Conds where
+  fromString str = C $ TC $ pack str
+
 instance ToCypher Conds where
-  toCypher (fcp :&&: scp) = toCypher fcp <> " AND " <> toCypher scp
-  toCypher (fcp :||: scp) = toCypher fcp <> " OR " <> toCypher scp
-  toCypher (Not cp)       = "NOT " <> toCypher cp
+  -- Adding "(" ")" to have correct precedence in Cypher
+  -- "(a :&&: b) :||: c" should mean "(a AND b) OR c", not "a AND b OR c"
+  toCypher (fcp :&&: scp) = "(" <> toCypher fcp <> ") AND (" <> toCypher scp <> ")"
+  toCypher (fcp :||: scp) = "(" <> toCypher fcp <> ") OR (" <> toCypher scp <> ")"
+  toCypher (Not cp)       = "NOT (" <> toCypher cp <> ")"
   toCypher (C cp)         = toCypher cp
diff --git a/src/Database/Bolt/Extras/DSL/Internal/Types.hs b/src/Database/Bolt/Extras/DSL/Internal/Types.hs
--- a/src/Database/Bolt/Extras/DSL/Internal/Types.hs
+++ b/src/Database/Bolt/Extras/DSL/Internal/Types.hs
@@ -133,6 +133,12 @@
 
 infixr 3 :&&:
 infixr 2 :||:
+-- | Conditional expressions in Cypher.
+--
+-- Can be used with @OverloadedStrings@ to include atomic text conditions.
+--
+-- > toCypher $ ("x = 5" :&&: "y = 10") :||: Not "z = 20"
+-- > "((x = 5) AND (y = 10)) OR (NOT (z = 20))"
 data Conds = Conds :&&: Conds -- ^ 'condition' AND 'condition'
            | Conds :||: Conds -- ^ 'condition' OR 'condition'
            | C Cond           -- ^ single 'condition'
