diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,10 @@
 # Revision history for fuyu-gpio-direct
 
+## 0.2.0.0 -- 2026-09-06
+
+* **Breaking change**: Switch filesystem device path types from `ByteString` to `PosixPath` (`filepath >= 1.5.5.0`) in `chipOpen`, `chipPath`, and `isGPIOChip`.
+* Cleaned up and improved Haddock documentation formatting across opaque handles and types.
+
 ## 0.1.0.0 -- 2026-07-29
 
 * Initial release. Low-level FFI bindings for libgpiod v2 in Haskell.
diff --git a/fuyu-gpio-direct.cabal b/fuyu-gpio-direct.cabal
--- a/fuyu-gpio-direct.cabal
+++ b/fuyu-gpio-direct.cabal
@@ -1,6 +1,6 @@
 cabal-version:      3.0
 name:               fuyu-gpio-direct 
-version:            0.1.0.0
+version:            0.2.0.0
 synopsis:           Direct Haskell bindings for Linux libgpiod v2
 description:
     Mid-level and low-level Haskell bindings for interacting with Linux GPIO
@@ -29,7 +29,8 @@
     build-depends:    base >= 4.18 && < 5,
                       bytestring >= 0.10 && < 0.13,
                       unix >= 2.7 && < 2.9,
-                      vector >= 0.12 && < 0.14
+                      vector >= 0.12 && < 0.14,
+                      filepath >= 1.5.5.0 && < 1.6
     extra-libraries:  gpiod
     hs-source-dirs:   src
     default-language: Haskell2010
diff --git a/src/Fuyu/GPIO/Direct.hs b/src/Fuyu/GPIO/Direct.hs
--- a/src/Fuyu/GPIO/Direct.hs
+++ b/src/Fuyu/GPIO/Direct.hs
@@ -191,6 +191,7 @@
   , gpiodAPIVersion
   ) where
 
+import qualified System.Posix.PosixPath.FilePath  as PP
 import System.Posix.Types (Fd)
 import Data.ByteString (ByteString)
 import qualified Data.ByteString as BS
@@ -202,7 +203,7 @@
 import qualified Data.Vector.Storable as V
 import qualified Data.Vector.Storable.Mutable as MV
 import Data.Word (Word64)
-
+import System.OsPath.Posix (PosixPath)
 import Fuyu.GPIO.Direct.Bindings
 import Fuyu.GPIO.Direct.Types
 
@@ -252,9 +253,9 @@
 -- Returns 'Right' t'Chip on success, or 'Left' 'Errno' on failure (such as 'Foreign.C.Error.eACCES'
 -- if permissions are missing or 'Foreign.C.Error.eNOENT' if the path does not exist).
 -- The returned handle must be closed with 'chipClose' when finished to free file descriptors and memory.
-chipOpen :: ByteString -> IO (Either Errno Chip)
-chipOpen bs = BS.useAsCString bs $ \cStr -> do
-  res <- checkNull (c_gpiod_chip_open cStr)
+chipOpen :: PosixPath -> IO (Either Errno Chip)
+chipOpen pospath = PP.withFilePath pospath $ \path -> do 
+  res <- checkNull $ c_gpiod_chip_open  path
   return $ Chip <$> res
 
 -- | Close an open GPIO chip device handle and release associated kernel and C resources.
@@ -272,13 +273,13 @@
 
 -- | Retrieve the filesystem device path used when opening the chip.
 --
--- Returns 'Right' 'ByteString' containing the path (e.g. @"\/dev\/gpiochip0"@).
-chipPath :: Chip -> IO (Either Errno ByteString)
+-- Returns 'Right' 'PosixPath' containing the path (e.g. @"\/dev\/gpiochip0"@).
+chipPath :: Chip -> IO (Either Errno PosixPath)
 chipPath (Chip ptr) = do
   res <- checkNull (c_gpiod_chip_get_path ptr)
   case res of
     Left err -> return (Left err)
-    Right cStr -> Right <$> BS.packCString cStr
+    Right cStr -> Right <$> PP.peekFilePath cStr
 
 -- | Query a snapshot of status and configuration information for a specific line offset.
 --
@@ -365,7 +366,7 @@
 chipInfoFree :: ChipInfo -> IO ()
 chipInfoFree (ChipInfo info) = c_gpiod_chip_info_free info 
 
--- | Retrieve the kernel device name string of the chip (e.g. @"gpiochip4"@).
+-- | Retrieve the kernel device name string of the chip (e.g. @"gpiochip0"@).
 chipInfoName :: ChipInfo -> IO ByteString
 chipInfoName (ChipInfo info) = do
   res <- c_gpiod_chip_info_get_name info
@@ -860,9 +861,9 @@
 --------------------------------------------------------------------------------
 
 -- | Check whether the filesystem path (e.g. @"\/dev\/gpiochip0"@) refers to a valid GPIO chip character device node.
-isGPIOChip :: ByteString -> IO Bool
-isGPIOChip path = do
-  BS.useAsCString path (fmap toBool . c_gpiod_is_gpiochip_device)
+isGPIOChip :: PosixPath -> IO Bool
+isGPIOChip pospath = do
+  PP.withFilePath pospath (fmap toBool . c_gpiod_is_gpiochip_device)
 
 -- | Retrieve the version string of the underlying C @libgpiod@ library (e.g. @"2.1"@).
 gpiodAPIVersion :: IO ByteString
diff --git a/src/Fuyu/GPIO/Direct/Types.hs b/src/Fuyu/GPIO/Direct/Types.hs
--- a/src/Fuyu/GPIO/Direct/Types.hs
+++ b/src/Fuyu/GPIO/Direct/Types.hs
@@ -56,61 +56,51 @@
 data CGpiodEdgeEvent
 
 -- | Opaque handle representing an open GPIO chip device controller.
---
 -- Must be explicitly closed with 'Fuyu.GPIO.Direct.chipClose' when no longer needed.
 newtype Chip = Chip (Ptr CGpiodChip)
   deriving (Eq, Ord, Show)
 
 -- | Opaque snapshot of static GPIO chip information (name, label, line count).
---
 -- Must be explicitly freed with 'Fuyu.GPIO.Direct.chipInfoFree'.
 newtype ChipInfo = ChipInfo (Ptr CGpiodChipInfo)
   deriving (Eq, Ord, Show)
 
 -- | Opaque event object emitted when a line watched on a chip changes status.
---
 -- Must be explicitly freed with 'Fuyu.GPIO.Direct.infoEventFree'.
 newtype InfoEvent = InfoEvent (Ptr CGpiodInfoEvent)
   deriving (Eq, Ord, Show)
 
 -- | Opaque snapshot of a single GPIO line\'s status and configuration attributes.
---
 -- Must be explicitly freed with 'Fuyu.GPIO.Direct.lineInfoFree'.
 newtype LineInfo = LineInfo (Ptr CGpiodLineInfo)
   deriving (Eq, Ord, Show)
 
 -- | Opaque accumulator for GPIO line configuration settings (direction, drive, bias, etc.).
---
 -- Must be explicitly freed with 'Fuyu.GPIO.Direct.lineSettingsFree'.
 newtype LineSettings = LineSettings (Ptr CGpiodLineSettings)
   deriving (Eq, Ord, Show)
 
 -- | Opaque map associating line offsets with their respective t'LineSettings.
---
 -- Must be explicitly freed with 'Fuyu.GPIO.Direct.lineConfigFree'.
 newtype LineConfig = LineConfig (Ptr CGpiodLineConfig)
   deriving (Eq, Ord, Show)
 
 -- | Opaque handle representing requested (claimed) GPIO lines under active kernel control.
---
 -- Must be explicitly released with 'Fuyu.GPIO.Direct.lineRequestRelease'.
 newtype LineRequest = LineRequest (Ptr CGpiodLineRequest)
   deriving (Eq, Ord, Show)
 
 -- | Opaque request configuration object (consumer name, kernel event buffer size).
---
 -- Must be explicitly freed with 'Fuyu.GPIO.Direct.requestConfigFree'.
 newtype RequestConfig = RequestConfig (Ptr CGpiodRequestConfig)
   deriving (Eq, Ord, Show)
 
 -- | Opaque fixed-capacity buffer storing edge detection events read from the kernel.
---
 -- Must be explicitly freed with 'Fuyu.GPIO.Direct.eventBufferFree'.
 newtype EventBuffer = EventBuffer (Ptr CGpiodEdgeEventBuffer) 
   deriving (Eq, Ord, Show)
 
 -- | Opaque reference to an individual edge detection event stored within an t'EventBuffer.
---
 -- Can be copied using 'Fuyu.GPIO.Direct.rawEdgeEventCopy', which returned copy must be freed
 -- via 'Fuyu.GPIO.Direct.rawEdgeEventFree'.
 newtype RawEdgeEvent = RawEdgeEvent (Ptr CGpiodEdgeEvent)
@@ -127,7 +117,6 @@
 --------------------------------------------------------------------------------
 
 -- | Logical line state representation.
---
 -- Note that logical values account for active-low inversion: an active-low line set to
 -- 'LineActive' corresponds to a physical logic low voltage level on hardware.
 newtype LineValue = LineValue CInt
