diff --git a/antiope-messages.cabal b/antiope-messages.cabal
--- a/antiope-messages.cabal
+++ b/antiope-messages.cabal
@@ -1,7 +1,7 @@
 cabal-version: 2.2
 
 name:               antiope-messages
-version:            7.2.2
+version:            7.3.0
 synopsis:           Please see the README on Github at <https://github.com/arbor/antiope#readme>
 description:        Please see the README on Github at <https://github.com/arbor/antiope#readme>.
 category:           Services
@@ -25,6 +25,7 @@
   exposed-modules:
       Antiope.Messages
       Antiope.Messages.Types
+      Antiope.Messages.Via
   hs-source-dirs: src
   default-extensions: BangPatterns GeneralizedNewtypeDeriving OverloadedStrings TupleSections
   ghc-options: -Wall -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints -msse4.2
diff --git a/src/Antiope/Messages/Types.hs b/src/Antiope/Messages/Types.hs
--- a/src/Antiope/Messages/Types.hs
+++ b/src/Antiope/Messages/Types.hs
@@ -5,22 +5,23 @@
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE ScopedTypeVariables   #-}
 {-# LANGUAGE TypeApplications      #-}
+
 module Antiope.Messages.Types
-( WithEncoded(..)
-, With(..)
-, FromWith(..)
-, fromWith2, fromWith3, fromWith4, fromWith5, fromWith6
-) where
+  ( WithEncoded(..)
+  , With(..)
+  , FromWith(..)
+  , fromWith2, fromWith3, fromWith4, fromWith5, fromWith6
+  ) where
 
 import Data.Aeson   (FromJSON (..), ToJSON (..), eitherDecodeStrict, encode, withObject, (.:), (.=))
+import Data.Coerce  (coerce)
+import Data.Proxy
 import Data.Text    (Text)
 import GHC.TypeLits
 
 import qualified Data.Aeson           as Aeson
 import qualified Data.Aeson.Types     as Aeson
 import qualified Data.ByteString.Lazy as LBS
-import           Data.Coerce          (Coercible, coerce)
-import           Data.Proxy
 import qualified Data.Text            as Text
 import qualified Data.Text.Encoding   as Text
 
diff --git a/src/Antiope/Messages/Via.hs b/src/Antiope/Messages/Via.hs
new file mode 100644
--- /dev/null
+++ b/src/Antiope/Messages/Via.hs
@@ -0,0 +1,15 @@
+{-# LANGUAGE DataKinds      #-}
+{-# LANGUAGE KindSignatures #-}
+{-# LANGUAGE TypeOperators  #-}
+
+module Antiope.Messages.Via where
+
+import qualified Antiope.Messages.Types as T
+import qualified Data.Kind              as K
+import qualified GHC.TypeLits           as TL
+
+type (/) (s :: TL.Symbol) (k :: K.Type) = T.With s k
+infixr 2 /
+
+type (//) (s :: TL.Symbol) (k :: K.Type) = T.WithEncoded s k
+infixr 2 //
