diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,14 @@
-## [_Unreleased_](https://github.com/freckle/freckle-app/compare/v1.16.0.0...main)
+## [_Unreleased_](https://github.com/freckle/freckle-app/compare/v1.17.0.0...main)
+
+## [v1.17.0.0](https://github.com/freckle/freckle-app/compare/v1.16.0.0...v1.17.0.0)
+
+- Require Blammo 1.2
+- Remove `LoggingT` from the definitions of `AppT` and `AppExample`
+- Users are advised to use the new `withLogger` utility available as of Blammo 1.2
+  to intialize an application's logger. In places other than the top level of an
+  application, most uses of `runLoggerLoggingT` should be replaced with
+  `runWithLogger` or `runAppT`.
+- Add instance `MonadTrans AppT`
 
 ## [v1.16.0.0](https://github.com/freckle/freckle-app/compare/v1.15.5.0...v1.16.0.0)
 
diff --git a/freckle-app.cabal b/freckle-app.cabal
--- a/freckle-app.cabal
+++ b/freckle-app.cabal
@@ -1,6 +1,6 @@
 cabal-version:      1.18
 name:               freckle-app
-version:            1.16.0.0
+version:            1.17.0.0
 license:            MIT
 license-file:       LICENSE
 maintainer:         Freckle Education
@@ -103,7 +103,7 @@
         -Wno-prepositive-qualified-module -Wno-safe -Wno-unsafe
 
     build-depends:
-        Blammo >=1.1.2.0,
+        Blammo >=1.2.0.0,
         Glob >=0.10.2,
         MonadRandom >=0.5.3,
         QuickCheck >=2.14.3,
@@ -266,7 +266,7 @@
         -rtsopts -with-rtsopts=-N
 
     build-depends:
-        Blammo >=1.1.2.0,
+        Blammo >=1.2.0.0,
         QuickCheck >=2.14.3,
         aeson >=2.0.3.0,
         base >=4.16.4.0 && <5,
diff --git a/library/Freckle/App.hs b/library/Freckle/App.hs
--- a/library/Freckle/App.hs
+++ b/library/Freckle/App.hs
@@ -122,12 +122,12 @@
 -- > loadApp :: (App -> IO a) -> IO a
 -- > loadApp f = do
 -- >   appConfig{..} <- loadConfig
--- >   appLogger <- newLogger configLoggerSettings
--- >   appSqlPool <- runLoggerLoggingT appLogger $ makePostgresPool configDbPoolSize
--- >   withTracerProvider $ \tracerProvider -> do
--- >     withStatsClient configStatsSettings $ \appStatsClient -> do
--- >       let appTracer = makeTracer tracerProvider "my-app" tracerOptions
--- >       f App{..}
+-- >   withLogger configLoggerSettings $ \appLogger ->
+-- >     appSqlPool <- runWithLogger appLogger $ makePostgresPool configDbPoolSize
+-- >     withTracerProvider $ \tracerProvider -> do
+-- >       withStatsClient configStatsSettings $ \appStatsClient -> do
+-- >         let appTracer = makeTracer tracerProvider "my-app" tracerOptions
+-- >         f App{..}
 --
 -- This unlocks @'runDB'@ for your application:
 --
@@ -196,8 +196,7 @@
 import System.IO (BufferMode (..), hSetBuffering, stderr, stdout)
 
 runApp
-  :: HasLogger app
-  => (forall b. (app -> IO b) -> IO b)
+  :: (forall b. (app -> IO b) -> IO b)
   -> AppT app IO a
   -> IO a
 runApp loadApp action = do
@@ -214,7 +213,7 @@
   hSetBuffering stderr LineBuffering
 
 newtype AppT app m a = AppT
-  { unAppT :: ReaderT app (LoggingT (ResourceT m)) a
+  { unAppT :: ReaderT app (ResourceT m) a
   }
   deriving newtype
     ( Functor
@@ -225,21 +224,18 @@
     , MonadThrow
     , MonadCatch
     , MonadMask
-    , MonadLogger
-    , MonadLoggerIO
     , MonadResource
     , MonadReader app
     )
+  deriving (MonadLogger, MonadLoggerIO) via WithLogger app (ResourceT m)
 
+instance MonadTrans (AppT app) where
+  lift = AppT . lift . lift
+
 instance PrimMonad m => PrimMonad (AppT app m) where
   type PrimState (AppT app m) = PrimState m
 
-  -- This should really just be `lift . primitive`, but:
-  --
-  -- - We'd need `MonadTrans (AppT app)`, which meh
-  -- - We'd need an orphan `Primitive LoggingT`, which no thanks
-  --
-  primitive = AppT . lift . lift . lift . primitive
+  primitive = lift . primitive
   {-# INLINE primitive #-}
 
 instance (MonadUnliftIO m, HasTracer app) => MonadHttp (AppT app m) where
@@ -259,6 +255,6 @@
   where
   runSqlTx = runDB
 
-runAppT :: (MonadUnliftIO m, HasLogger app) => AppT app m a -> app -> m a
+runAppT :: MonadUnliftIO m => AppT app m a -> app -> m a
 runAppT action app =
-  runResourceT $ runLoggerLoggingT app $ runReaderT (unAppT action) app
+  runResourceT $ runReaderT (unAppT action) app
diff --git a/library/Freckle/App/Test.hs b/library/Freckle/App/Test.hs
--- a/library/Freckle/App/Test.hs
+++ b/library/Freckle/App/Test.hs
@@ -66,7 +66,7 @@
 -- - Export @LOG_LEVEL=error@, if this would be quiet enough, or
 -- - Export @LOG_DESTINATION=@/dev/null@ to fully silence
 newtype AppExample app a = AppExample
-  { unAppExample :: ReaderT app (LoggingT IO) a
+  { unAppExample :: ReaderT app IO a
   }
   deriving newtype
     ( Applicative
@@ -79,9 +79,11 @@
     , MonadUnliftIO
     , MonadReader app
     , MonadThrow
-    , MonadLogger
     , Fail.MonadFail
     )
+  deriving
+    (MonadLogger, MonadLoggerIO)
+    via WithLogger app IO
 
 instance MonadMask (AppExample app) where
   mask = UnliftIO.mask
@@ -106,12 +108,12 @@
   type PrimState (AppExample app) = PrimState IO
   primitive = liftIO . primitive
 
-instance HasLogger app => Example (AppExample app a) where
+instance Example (AppExample app a) where
   type Arg (AppExample app a) = app
 
   evaluateExample (AppExample ex) params action =
     evaluateExample
-      (action $ \app -> void $ runLoggerLoggingT app $ runReaderT ex app)
+      (action $ \app -> void $ runReaderT ex app)
       params
       ($ ())
 
diff --git a/package.yaml b/package.yaml
--- a/package.yaml
+++ b/package.yaml
@@ -1,5 +1,5 @@
 name: freckle-app
-version: 1.16.0.0
+version: 1.17.0.0
 maintainer: Freckle Education
 category: Utils
 github: freckle/freckle-app
