diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -31,7 +31,7 @@
 
 A worked example of this approach can be found in the
 [flashblast](https://gitlab.com/homotopic-tech/flashblast)
-repository. In this we want to take a configuration in dhall,
+repository. In this we want to take a configuration,
 and process it in some way an output of flashcards.
 
 We might model this as such:
@@ -47,7 +47,7 @@
 -- | A `DeckConfiguration` indicates how we create cards.
 data DeckConfiguration
 
--- | A `CollectionsPackage` indicates.
+-- | A `CollectionsPackage` indicates the desired output format.
 data CollectionsPackage
 
 -- | The Construction Methodology for flashblast.
@@ -85,25 +85,14 @@
   | BasicReversed   [BasicReversedCard]
   | MinimalReversed [MinimalReversedCard]
     deriving stock Generic
-    deriving D.FromDhall
-      via D.Codec (D.Field (D.DropPrefix "_")) Spec
 
 makePrisms ''Spec
 
-data Part = Part {
-  _outfile :: Path Rel File
-, _spec    :: Spec
-} deriving Generic
-  deriving D.FromDhall
-    via D.Codec (D.Field (D.DropPrefix "_")) Part
-
 data Deck = Deck {
   _resourceDirs :: ResourceDirs
 , _exportDirs   :: ExportDirs
-, _parts        :: [Part]
+, _parts        :: [Spec]
 } deriving stock Generic
-  deriving D.FromDhall
-    via D.Codec (D.Field (D.DropPrefix "_")) Deck
 ```
 
 ```
@@ -116,8 +105,8 @@
   deriving Monoid via GenericMonoid Deck
 
 main = do
-  Config.FlashBlast{..} <- D.input D.auto "./index.dhall"
-  forM_ _decks $ \x -> do
+  decks <- ...
+  forM_ decks $ \x -> do
     flashblast @Config.Deck @Deck
       & runM
 ```
@@ -211,57 +200,53 @@
 it.
 
 ```
-type DeckSplit = '[Map (Path Rel File) [Config.MinimalReversedCard]
-                 , Map (Path Rel File) [Config.BasicReversedCard]
-                 , Map (Path Rel File) [Config.ExcerptSpec]
-                 , Map (Path Rel File) [Config.PronunciationSpec]
-                 ]
-
-type FileMap b = Map (Path b File)
-
-extractParts :: Prism' Config.Spec x -> Config.Deck -> Map (Path Rel File) x
-extractParts x = Map.fromList . itoListOf
-                  ( Config.parts
-                  % itraversed
-                  %> reindexed (view Config.outfile) selfIndex
-                  % Config.spec
-                  % x
-                  )
-
-
-
 main = do
-  Config.FlashBlast{..} <- D.input D.auto "./index.dhall"
-  forM_ _decks $ \x -> do
+  forM_ decks $ \x -> do
     flashblast @Config.Deck @Deck
       & untag @ConstructionMethodology
       & decomposeMethodology @Config.Deck @DeckSplit @Deck
-        -- We pull out `Config.Deck -> (FileMap Rel [Config.MinimalReversedCard]` as its own `Methodology`.
-        & separateMethodologyInitial @Config.Deck @(FileMap Rel [Config.MinimalReversedCard])
+        -- We pull out `Config.Deck -> [Config.MinimalReversedCard]` as its own `Methodology`.
+        & separateMethodologyInitial @Config.Deck @[Config.MinimalReversedCard])
           -- And then immediately solve it purely.
-          & runMethodologyPure (extractParts Config._MinimalReversed)
-        -- and do the same for each one in the list.
-        & separateMethodologyInitial @Config.Deck @(FileMap Rel [Config.BasicReversedCard])
-          & runMethodologyPure (extractParts Config._BasicReversed)
-        & separateMethodologyInitial @Config.Deck @(FileMap Rel [Config.ExcerptSpec])
-          & runMethodologyPure (extractParts Config._Excerpt)
-        & separateMethodologyInitial @Config.Deck @(FileMap Rel [Config.PronunciationSpec])
-          & runMethodologyPure (extractParts Config._Pronunciation)
+          & runMethodologyPure _
+        & separateMethodologyInitial @Config.Deck @[Config.BasicReversedCard]
+          & runMethodologyPure _
+        & separateMethodologyInitial @Config.Deck @[Config.ExcerptSpec]
+          & runMethodologyPure _
+        & separateMethodologyInitial @Config.Deck @[Config.PronunciationSpec]
+          & runMethodologyPure _
         & endMethodologyInitial
-          & separateMethodologyTerminal @(FileMap Rel [Config.MinimalReversedCard]) @Deck
+          & separateMethodologyTerminal @[Config.MinimalReversedCard] @Deck
             & runMethodologyPure _
-          & separateMethodologyTerminal @(FileMap Rel [Config.BasicReversedCard]) @Deck
+          & separateMethodologyTerminal @[Config.BasicReversedCard] @Deck
             & runMethodologyPure _
-          & separateMethodologyTerminal @(FileMap Rel [Config.ExcerptSpec]) @Deck
+          & separateMethodologyTerminal @[Config.ExcerptSpec] @Deck
             & runMethodologySem _
-          & separateMethodologyTerminal @(FileMap Rel [Config.PronunciationSpec]) @Deck
+          & separateMethodologyTerminal @[Config.PronunciationSpec] @Deck
             & runMethodologySem _
 ```
 
 We have left holes that polysemy will now tell us need to be
 filled by nice clean `a -> b` or `a -> Sem r b` functions.
 Any effects we add here we can deal with after this block, or
-we can decompose this even further (see flashblast for details).
+we can decompose this even further (see flashblast for more details).
+
+## Logging
+
+You can also surround `Methodology`s with logging using the
+`traceMethodologyStart`, `traceMethodologyEnd` and `traceMethodologyAround`
+functions.
+
+```
+    & decomposeMethodology @Config.Deck @DeckSplit @Deck
+    & traceMethodologyAround @Config.Deck @(HList DeckSplit)
+            (const $ T.unpack $ "Analysing Deck: " <> n)
+            (const $ T.unpack $ "Finished Analysing Deck: " <> n)
+      & separateMethodologyInitial @Config.Deck @[Config.MinimalReversedCard]
+      & traceMethodologyAround @Config.Deck @[Config.MinimalReversedCard]
+             (const "Extracting Minimal Reversed Card Specs")
+             (\c -> "Found " <> show (length c) <> " Minimal Card specs.")
+```
 
 ## Notes
 
diff --git a/polysemy-methodology.cabal b/polysemy-methodology.cabal
--- a/polysemy-methodology.cabal
+++ b/polysemy-methodology.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           polysemy-methodology
-version:        0.1.2.1
+version:        0.1.3.0
 synopsis:       Domain modelling algebra for polysemy
 category:       Polysemy
 author:         Daniel Firth
diff --git a/src/Polysemy/Methodology.hs b/src/Polysemy/Methodology.hs
--- a/src/Polysemy/Methodology.hs
+++ b/src/Polysemy/Methodology.hs
@@ -18,6 +18,7 @@
 import Polysemy.Input
 import Polysemy.Output
 import Polysemy.Several
+import Polysemy.Trace
 
 -- | A `Methodology` generalises a semantic process from `b` to `c`.
 data Methodology b c m a where
@@ -218,3 +219,40 @@
 traverseMethodology = interpret \case
   Process b -> sequenceA <$> traverse (process @b @(f c)) b
 
+-- | `Trace` a `String` based on the input to a `Methodology`.
+traceMethodologyStart :: forall b c r a.
+                         Members '[Methodology b c,
+                                   Trace] r
+                       => (b -> String)
+                       -> Sem r a
+                       -> Sem r a
+traceMethodologyStart f = intercept \case
+  Process b -> trace (f b) >> process @b @c b
+
+-- | `Trace` a `String` based on the output to a `Methodology`.
+traceMethodologyEnd :: forall b c r a.
+                       Members '[Methodology b c,
+                                Trace] r
+                       => (c -> String)
+                       -> Sem r a
+                       -> Sem r a
+traceMethodologyEnd f = intercept \case
+  Process b -> do
+    c <- process @b @c b
+    trace $ f c
+    return c
+
+-- | `Trace` both the start and the end of a `Methodology`.
+traceMethodologyAround :: forall b c r a.
+                           Members '[Methodology b c,
+                                     Trace] r
+                       => (b -> String)
+                       -> (c -> String)
+                       -> Sem r a
+                       -> Sem r a
+traceMethodologyAround f g = intercept \case
+  Process b -> do
+    trace $ f b
+    c <- process @b @c b
+    trace $ g c
+    return c
