diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+# 0.4.2.0
+
+* Added `useShortcutFrom`.
+* `@` is now allowed in Github/Gitlab/Bitbucket nicks.
+
 # 0.4.1.0
 
 * Exported `useShortcut` (gee).
diff --git a/shortcut-links.cabal b/shortcut-links.cabal
--- a/shortcut-links.cabal
+++ b/shortcut-links.cabal
@@ -1,5 +1,5 @@
 name:                shortcut-links
-version:             0.4.1.0
+version:             0.4.2.0
 synopsis:            Link shortcuts for use in text markup
 description:
   This package is a database of link shortcuts. A Markdown example: 
diff --git a/src/ShortcutLinks.hs b/src/ShortcutLinks.hs
--- a/src/ShortcutLinks.hs
+++ b/src/ShortcutLinks.hs
@@ -8,6 +8,7 @@
   Shortcut,
   allShortcuts,
   useShortcut,
+  useShortcutFrom,
 )
 where
 
@@ -22,15 +23,29 @@
 
 -- | Use a shortcut from 'allShortcuts'.
 --
--- This is the main function you should use. It does the lookup and so on.
+-- This is the main function you should use.
 useShortcut
-  :: Text          -- ^ Shortcut name
-  -> Maybe Text    -- ^ Option
-  -> Text          -- ^ Link text
-  -> Result Text   -- ^ Resulting URL
-useShortcut name option link =
+  :: Text                   -- ^ Shortcut name
+  -> Maybe Text             -- ^ Option
+  -> Text                   -- ^ Link text
+  -> Result Text            -- ^ Resulting URL
+useShortcut = useShortcutFrom allShortcuts
+
+-- | Use a shortcut from a list.
+--
+-- For instance, if you want to add @hk@ as a synonym for @hackage@, you'd
+-- write:
+--
+-- >>> useShortcutFrom ((["hk"], hackage) : allShortcuts)
+useShortcutFrom
+  :: [([Text], Shortcut)]
+  -> Text                   -- ^ Shortcut name
+  -> Maybe Text             -- ^ Option
+  -> Text                   -- ^ Link text
+  -> Result Text            -- ^ Resulting URL
+useShortcutFrom shortcuts name option link =
   let givenShortcut (names,_) = name `elem` names
-  in  case filter givenShortcut allShortcuts of
+  in  case filter givenShortcut shortcuts of
         []   -> fail (format "there's no shortcut named '{}'" name)
         [sh] -> (snd sh) option link
         _    -> fail (format "there's more than one shortcut named '{}'" name)
diff --git a/src/ShortcutLinks/All.hs b/src/ShortcutLinks/All.hs
--- a/src/ShortcutLinks/All.hs
+++ b/src/ShortcutLinks/All.hs
@@ -573,8 +573,10 @@
 -}
 github :: Shortcut
 github mbOwner q = case mbOwner of
-  Nothing    -> return $ format "https://github.com/{}" q
-  Just owner -> return $ format "https://github.com/{}/{}" owner q
+  Nothing    -> return $ format "https://github.com/{}" (stripAt q)
+  Just owner -> return $ format "https://github.com/{}/{}" (stripAt owner) q
+  where
+    stripAt x = if T.head x == '@' then T.tail x else x
 
 {- | <https://bitbucket.org Bitbucket> (shortcut: “bitbucket”)
 
@@ -601,8 +603,10 @@
 -}
 bitbucket :: Shortcut
 bitbucket mbOwner q = case mbOwner of
-  Nothing    -> return $ format "https://bitbucket.org/{}" q
-  Just owner -> return $ format "https://bitbucket.org/{}/{}" owner q
+  Nothing    -> return $ format "https://bitbucket.org/{}" (stripAt q)
+  Just owner -> return $ format "https://bitbucket.org/{}/{}" (stripAt owner) q
+  where
+    stripAt x = if T.head x == '@' then T.tail x else x
 
 {- | <https://gitlab.com Gitlab> (shortcut: “gitlab”)
 
@@ -629,8 +633,10 @@
 -}
 gitlab :: Shortcut
 gitlab mbOwner q = case mbOwner of
-  Nothing    -> return $ format "https://gitlab.com/{}" q
-  Just owner -> return $ format "https://gitlab.com/{}/{}" owner q
+  Nothing    -> return $ format "https://gitlab.com/{}" (stripAt q)
+  Just owner -> return $ format "https://gitlab.com/{}/{}" (stripAt owner) q
+  where
+    stripAt x = if T.head x == '@' then T.tail x else x
 
 {- | __Android__ – <https://play.google.com Google Play> (formerly Play Market) (shortcut: “gplay” or “googleplay”)
 
