diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,10 @@
 # Changelog for shake-plus-extended
 
-## Unreleased changes
+## v0.1.1.0
+
+* Add `HasLocalOut` class for accessing a lens with a local output directory.
+* Add filerules `(/%>)` and `(/|%>)` for implicit rules inside a local directory.
+
+## v0.1.0.0
+
+* Initial commit with basic `within` style rules and loaders.
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -4,8 +4,9 @@
 [shake-plus](https://hackage.haskell.org/package/shake-plus), which enriches
 [shake](https://hackage.haskell.org/package/shake) with `ReaderT` and the
 `Path` library. This extended ruleset introduces
-[within](https://hackage.haskell.org/package/within), for better keeping track of
-source and output directories, as well as batch loading mechanisms.
+[within](https://hackage.haskell.org/package/within), for better keeping track
+of source and output directories, as well as batch loading mechanisms using
+[ixset-typed](https://hackage.haskell.org/package/ixset-typed).
 
 ## Using Within
 
diff --git a/shake-plus-extended.cabal b/shake-plus-extended.cabal
--- a/shake-plus-extended.cabal
+++ b/shake-plus-extended.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           shake-plus-extended
-version:        0.1.0.0
+version:        0.1.1.0
 synopsis:       Experimental extensions to shake-plus
 description:    Experimental extensions to shake-plus - `within`-style file rules, HashMap and IxSet batch loaders.
 category:       development, shake
@@ -28,6 +28,7 @@
       Development.Shake.Plus.Extended
       Development.Shake.Plus.Extended.FileRules
       Development.Shake.Plus.Extended.Loaders
+      Development.Shake.Plus.Extended.Local
       Development.Shake.Plus.Extended.Simple
   other-modules:
       Paths_shake_plus_extended
diff --git a/src/Development/Shake/Plus/Extended.hs b/src/Development/Shake/Plus/Extended.hs
--- a/src/Development/Shake/Plus/Extended.hs
+++ b/src/Development/Shake/Plus/Extended.hs
@@ -11,9 +11,11 @@
 module Development.Shake.Plus.Extended (
   module Development.Shake.Plus.Extended.FileRules
 , module Development.Shake.Plus.Extended.Loaders
+, module Development.Shake.Plus.Extended.Local
 , module Development.Shake.Plus.Extended.Simple
 ) where
 
 import Development.Shake.Plus.Extended.FileRules
 import Development.Shake.Plus.Extended.Loaders
+import Development.Shake.Plus.Extended.Local
 import Development.Shake.Plus.Extended.Simple
diff --git a/src/Development/Shake/Plus/Extended/FileRules.hs b/src/Development/Shake/Plus/Extended/FileRules.hs
--- a/src/Development/Shake/Plus/Extended/FileRules.hs
+++ b/src/Development/Shake/Plus/Extended/FileRules.hs
@@ -1,7 +1,7 @@
 {- |
    Module     : Development.Shake.Plus.Extended.FileRules
    Copyright  : Copyright (C) 2020 Daniel Firth
-   Maintainer : Daniel Firth <dan.firth@homotopic.tech
+   Maintainer : Daniel Firth <dan.firth@homotopic.tech>
    License    : MIT
    Stability  : experimental
 
diff --git a/src/Development/Shake/Plus/Extended/Local.hs b/src/Development/Shake/Plus/Extended/Local.hs
new file mode 100644
--- /dev/null
+++ b/src/Development/Shake/Plus/Extended/Local.hs
@@ -0,0 +1,19 @@
+module Development.Shake.Plus.Extended.Local where
+
+import Development.Shake.Plus
+import RIO
+import Path
+import Within
+
+class HasLocalOut r where
+  localOutL :: Lens' r (Path Rel Dir)
+
+(/%>) :: (MonadReader r m, HasLocalOut r, MonadRules m) => FilePattern -> ((Path Rel Dir, Path Rel File) -> RAction r ()) -> m ()
+(/%>) xs ract = ask >>= \r -> do
+  let d = view localOutL r
+  (toFilePath d <> xs) %> (stripProperPrefix d >=> \x -> ract (d, x))
+
+(/|%>) :: (MonadReader r m, HasLocalOut r, MonadRules m) => [FilePattern] -> ((Path Rel Dir, Path Rel File) -> RAction r ()) -> m ()
+(/|%>) xs ract = ask >>= \r -> do
+  let d = view localOutL r
+  ((toFilePath d <>) <$> xs) |%> (stripProperPrefix d >=> \x -> ract (d, x))
