diff --git a/openssh-github-keys.cabal b/openssh-github-keys.cabal
--- a/openssh-github-keys.cabal
+++ b/openssh-github-keys.cabal
@@ -1,13 +1,18 @@
 name:                openssh-github-keys
-version:             0.1.0.0
-synopsis:            Fetch OpenSSH keys from a Github team
+version:             0.1.1.0
+synopsis:            Fetch OpenSSH keys from a GitHub team
 description:
   .
   This package fetches the OpenSSH public keys for all users from a
-  Github team. It is intended to be executed from the AuthorizedKeys
+  GitHub team. It is intended to be executed from the AuthorizedKeys
   command in the sshd_config file, which then allows users to log in
   using keys that they have in their Github accounts.
   .
+
+  Please see the
+  <https://github.com/stackbuilders/openssh-github-keys GitHub page>
+  for detailed usage information.
+  .
 homepage:            https://github.com/stackbuilders/openssh-github-keys
 license:             MIT
 license-file:        LICENSE
@@ -26,7 +31,7 @@
   main-is:             Main.hs
   -- other-modules:
   -- other-extensions:
-  build-depends:       base >=4.5 && <4.8
+  build-depends:       base >=4.5 && <4.9
                        , octohat >=0.1.2
                        , dotenv
                        , text
@@ -34,6 +39,8 @@
                        , directory
                        , filepath
                        , unix
+                       , keyword-args
+                       , parsec
 
   hs-source-dirs:      src
   ghc-options:         -Wall
@@ -43,7 +50,7 @@
 library
   exposed-modules:    System.OpensshGithubKeys
 
-  build-depends:         base >=4.5 && <4.8
+  build-depends:         base >=4.5 && <4.9
                        , octohat >=0.1.2
                        , text
 
@@ -56,11 +63,14 @@
   type: exitcode-stdio-1.0
   hs-source-dirs: spec, src
   main-is: Spec.hs
-  build-depends:       base >=4.5 && <4.8
+  build-depends:       base >=4.5 && <4.9
                        , octohat >=0.1.2
                        , text
-
                        , hspec
+                       , keyword-args
+                       , optparse-applicative
+                       , parsec
+                       , keyword-args
 
   default-language:    Haskell2010
   ghc-options:         -Wall
diff --git a/src/Main.hs b/src/Main.hs
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -2,84 +2,34 @@
 
 module Main where
 
-import Options.Applicative
-
-import qualified Data.Text as T
-
-import Network.Octohat (keysOfTeamInOrganization)
-import Network.Octohat.Types (runGitHub, OrganizationName(..),
-                              TeamName(..))
-
-import System.OpensshGithubKeys (formatKey)
-
-import System.Timeout (timeout)
-
-import qualified Configuration.Dotenv as Dotenv
-
-data Options = Options
-  { localUser    :: String
-  , organization :: String
-  , team         :: String
-  , users        :: [String]
-  , dotfile      :: Maybe FilePath
-
-  } deriving (Show)
-
+import qualified Configuration.Dotenv            as Dotenv
+import           Control.Monad                   (when)
+import qualified Data.Text                       as T
+import           Network.Octohat                 (keysOfTeamInOrganization)
+import           Network.Octohat.Types           (OrganizationName (..),
+                                                  TeamName (..), runGitHub)
+import           Options.Applicative
+import           System.OpensshGithubKeys        (formatKey)
+import           System.OpensshGithubKeys.Config (options, readFileOptions)
+import           System.OpensshGithubKeys.Types  (Options (..))
+import           System.Timeout                  (timeout)
 
 fetchKeys :: Options -> IO ()
-fetchKeys opts = do
-  if any (\u -> localUser opts == u) (users opts)
-    then do
-      res <- runGitHub $ keysOfTeamInOrganization
-             (OrganizationName $ T.pack $ organization opts)
-             (TeamName $ T.pack $ team opts)
-
-      case res of
-        Right membersWithKeys ->
-          putStrLn $ unlines $ concatMap formatKey membersWithKeys
-
-        Left e -> error $ "Error retrieving keys for organization '" ++ show e
-
-    else return ()
-
-config :: Parser Options
-config = Options
-     <$> argument str (metavar "AUTHENTICATE"
-                       <> help "Local user trying to authenticate currently")
-
-     <*> strOption (
-             long "organization"
-             <> short 'o'
-             <> metavar "ORGANIZATION"
-             <> help "GitHub organization from which to select teams")
-
-     <*> strOption (
-                  long "team"
-                  <> short 't'
-                  <> metavar "TEAM"
-                  <> help "GitHub team from which to select members' keys" )
-
-     <*> some (strOption (
-                  long "user"
-                  <> short 'u'
-                  <> metavar "USER"
-                  <> help "A local user that we should try to authenticate using Github" ))
-
-     <*> strOptional (
-                  long "dotfile"
-                  <> short 'f'
-                  <> metavar "DOTFILE"
-                  <> help "File in 'dotfile' format specifying GITHUB_TOKEN" )
+fetchKeys os = when (any (\u -> localUser os == u) (users os)) $ do
+  res <- runGitHub $ keysOfTeamInOrganization
+         (OrganizationName $ T.pack $ organization os)
+         (TeamName $ T.pack $ team os)
 
-strOptional :: Mod OptionFields String -> Parser (Maybe String)
-strOptional flags = Just <$> strOption flags <|> pure Nothing
+  case res of
+   Right membersWithKeys -> putStrLn $ unlines $ concatMap formatKey membersWithKeys
+   Left e -> error $ "Error retrieving keys for organization '" ++ show e
 
 main :: IO ()
 main = do
-  options <- execParser opts
-  readDotenvFile options
-
-  res <- timeout allowedTime (fetchKeys options)
+  d <- readFileOptions "/etc/openssh-github-keys/login.conf"
+  opts <- execParser $ options d
+  readDotenvFile opts
+  res <- timeout allowedTime (fetchKeys opts)
   case res of
     Nothing -> error $ "Allowed time of " ++ show allowedTime ++
                " microseconds exceeded while fetching keys from GitHub."
@@ -87,22 +37,7 @@
 
   where
     allowedTime = 5 * 1000000 -- Allowed time in microseconds for fetching keys
-    opts = info (helper <*> config)
-      ( fullDesc
 
-     <> progDesc (unlines
-        [ "Fetches ssh public keys from TEAMS under ORGANIZATION on GitHub."
-        , "The output format is suitable for AuthorizedKeysCommand in"
-        , "sshd_config. Requires a github token, which can be specified"
-        , "in an environment variable GITHUB_TOKEN or in a dotenv file which"
-        , "can be specified with the -f option."])
-
-     <> header "openssh-github-keys - fetches team member keys from GitHub"
-      )
-
 -- | Conditionally reads the ~/.github_token file if it exists.
 readDotenvFile :: Options -> IO ()
-readDotenvFile opts =
-  case dotfile opts of
-    Just f -> Dotenv.loadFile False f
-    Nothing -> return ()
+readDotenvFile = Dotenv.loadFile False . dotfile
