diff --git a/ChangeLog.md b/ChangeLog.md
new file mode 100644
--- /dev/null
+++ b/ChangeLog.md
@@ -0,0 +1,5 @@
+# Revision history for debug-tracy
+
+## 0.1.0.0  -- YYYY-mm-dd
+
+* First version. Released on an unsuspecting world.
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright (c) 2017, Isaac Shapira
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+
+    * Neither the name of Isaac Shapira nor the names of other
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/debug-tracy.cabal b/debug-tracy.cabal
new file mode 100644
--- /dev/null
+++ b/debug-tracy.cabal
@@ -0,0 +1,30 @@
+-- Initial debug-tracy.cabal generated by cabal init.  For further
+-- documentation, see http://haskell.org/cabal/users-guide/
+
+name:                debug-tracy
+version:             0.1.0.0
+synopsis:            More useful trace functions for investigating bugs
+description:         A collection of things for debugging, (to prevent me from writing them again)
+license:             BSD3
+license-file:        LICENSE
+author:              Isaac Shapira
+maintainer:          fresheyeball@gmail.com
+-- copyright:
+category:            Development
+build-type:          Simple
+extra-source-files:  ChangeLog.md
+cabal-version:       >=1.10
+
+source-repository head
+  type: git
+  location: https://gitlab.com/fresheyeball/debug-tracy.git
+
+library
+  exposed-modules:     Debug.Tracy
+  -- other-modules:
+  -- other-extensions:
+  build-depends:       base >=4.9 && <4.10
+                     , random
+                     , transformers
+  hs-source-dirs:      src
+  default-language:    Haskell2010
diff --git a/src/Debug/Tracy.hs b/src/Debug/Tracy.hs
new file mode 100644
--- /dev/null
+++ b/src/Debug/Tracy.hs
@@ -0,0 +1,151 @@
+{-# LANGUAGE DeriveFoldable            #-}
+{-# LANGUAGE ExistentialQuantification #-}
+{-# LANGUAGE LambdaCase                #-}
+
+module Debug.Tracy
+  ( module Debug.Trace
+  , tracy
+  , keanu
+  , arnold
+  , hasLength
+  , isFound
+  , Find
+  , FindT )  where
+
+
+import           Control.Monad.Trans.Maybe
+import qualified Data.Foldable             as Fold
+import           Debug.Trace               (trace)
+import           System.IO.Unsafe          (unsafePerformIO)
+import           System.Random             (randomRIO)
+
+
+
+delimit :: String -> String -> String
+delimit s s' = s ++ " -> " ++ s'
+
+-- | trace with show and a delimiter built in
+tracy :: Show a => String -> a -> a
+tracy s x = trace (delimit s $ show x) x
+
+-- | Spit out a random Keanu Reaves quote when @a@ is evauluated
+keanu :: a -> a
+keanu x = trace (delimit "KEANU" . (ks !!) . unsafePerformIO $ randomRIO (0, length ks - 1)) x
+  where
+   ks = [ "Woah"
+        , "I am the one."
+        , "Party on"
+        , "No way"
+        , "Woah"
+        , "I know kung fu"
+        , "Excellent!"
+        , "Huh?"
+        , "Whoah.."
+        , "All we are is dust in the wind, dude"
+        , "Most Triumphant"
+        , "Strange things are a foot at the Circle K"
+        , "no way"
+        , "69 Dudes!"
+        , "Those are historic babes!"
+        , "Bodacious!"
+        , "Fully full on evil robots"
+        , "So-crates"
+        , "Morpheous"
+        , "I'm going to learn jiu jitsu?"
+        , "My name is Neo."
+        , "No."
+        , "take 1 step out and take my hand"
+        , "freeze"
+        , "id wanna know what bus it was"
+        , "bomb on bus"
+        , "i need to know can you handle this bus"
+        , "the man has no time"
+        , "theres a gap in the freeway"
+        , "thats all we can do"
+        , "floor it"
+        , "thats against the rules"
+        , "im gonna rip your fucking spine out i swear to god"
+        , "pop quiz asshole"
+        , "your crazy your fuckin crazy"
+        , "he lost his head" ]
+
+-- | spit out a random Arnold Schwarzenegger quote when @a@ is evaluated
+arnold :: a -> a
+arnold x = trace (delimit "ARNOLD" . (as !!) . unsafePerformIO $ randomRIO (0, length as - 1)) x
+  where
+  as = [ "It's simple, if it jiggles, it's fat."
+       , "Milk is for babies. When you grow up you have to drink beer."
+       , "The best activities for your health are pumping and humping."
+       , "You're Fiuhed!"
+       , "Cookies, who told you you could MY COOKIES!!!!??"
+       , "Who is your Daddy, and what does he do?"
+       , "I'm detective John Kimble"
+       , "Get in the chopper, now!!"
+       , "Guwhah ruuugh guawh!"
+       , "Grrrgh uu ahhh!"
+       , "Naaa gruh aagghh!!!"
+       , "Grrruu guaw ghh raaaaaagh!"
+       , "IT'S NOT A TUMOR!"
+       , "SHAAAD AAAAAAAAAAAAAAAP!"
+       , "I let him go.."
+       , "He had to split"
+       , "Remember Sully when I said I'd kill you last? I lied."
+       , "You are not sending me to the coolah..."
+       , "Stop CHEEERING ME UP!"
+       , "You are one ugly motherfucker..."
+       , "Do it."
+       , "I'll be back."
+       , "Foget it, I'm nut goiing to sit on yo lap" ]
+
+-- | Inspect if @t a@ is null
+isFound :: Foldable t => String -> t a -> t a
+isFound s x = trace  (delimit s $ "was" ++ (if Fold.null x then " NOT" else "") ++ " found") x
+
+-- | Inspect if @t a@ contains @a@
+isElem :: (Foldable t, Eq a, Show a) => String -> a -> t a -> t a
+isElem s x t = let s' = show x in trace (delimit s $
+             if Fold.elem x t then "contains " ++ s' else "does NOT contain " ++ s') t
+
+-- | Inspect if @Bool@ is legit
+isTrue :: String -> Bool -> Bool
+isTrue s x = trace (delimit s $ if x then "is legit" else "is buillshit") x
+
+-- | Inspect the size of a collection
+hasLength :: Foldable t => String -> t a -> t a
+hasLength s f = trace (delimit s $ "has length " ++ show (Fold.length f)) f
+
+
+-- | Wrapper for inspecting a usage of the Maybe Monad
+data Find a = Find String (Maybe a)
+  deriving (Show, Eq, Ord, Foldable)
+
+instance Functor Find where
+  fmap f (Find s x) = Find s $ f <$> isFound s x
+
+instance Applicative Find where
+  pure = Find "pure" . pure
+  Find _ mf <*> Find s x = Find s $ mf <*> isFound s x
+
+instance Monad Find where
+  Find s x >>= f = case isFound s x of
+    Just x' -> f x'
+    _       -> Find s Nothing
+
+-- | Wrapper for inspecting a usage of the MaybeT Monad Transformer
+data FindT m a = FindT String (MaybeT m a)
+
+runFindT (FindT _ x) = x
+
+instance Monad m => Functor (FindT m) where
+  fmap f (FindT s x) = FindT s . MaybeT $ fmap f . isFound s <$> runMaybeT x
+
+instance Monad m => Applicative (FindT m) where
+  pure = FindT "pure" . pure
+  FindT _ mf <*> FindT s x = FindT s $ mf <*> MaybeT (isFound s <$> runMaybeT x)
+
+instance Monad m => Monad (FindT m) where
+  FindT s x >>= f = FindT s $ MaybeT $ do
+    y <- runMaybeT x
+    case isFound s y of
+      Just x' -> runMaybeT $ runFindT (f x')
+      _       -> return Nothing
