diff --git a/cli.go b/cli.go
index ad93475e8d9fc59a92245c6377c0042a42fcf58b..2e86318ad9ba73cf776f2e1f37febbf965f92dec 100644
--- a/cli.go
+++ b/cli.go
@@ -21,17 +21,14 @@ import (
 	"os/signal"
 	"reflect"
 	"syscall"
+	"time"
 
 	"github.com/urfave/cli"
 )
 
-//
 // newOauthProxyApp creates a new cli application and runs it
-//
 func newOauthProxyApp() *cli.App {
 	config := newDefaultConfig()
-
-	// step: create the cli application
 	app := cli.NewApp()
 	app.Name = prog
 	app.Usage = description
@@ -50,7 +47,6 @@ func newOauthProxyApp() *cli.App {
 	// step: set the default action
 	app.Action = func(cx *cli.Context) error {
 		configFile := cx.String("config")
-
 		// step: do we have a configuration file?
 		if configFile != "" {
 			if err := readConfigFile(configFile, config); err != nil {
@@ -93,278 +89,67 @@ func newOauthProxyApp() *cli.App {
 // getCLIOptions returns the command line options
 func getCLIOptions() []cli.Flag {
 	defaults := newDefaultConfig()
-	return []cli.Flag{
-		cli.StringFlag{
-			Name:   "config",
-			Usage:  "the path to the configuration file for the keycloak proxy",
-			EnvVar: "PROXY_CONFIG_FILE",
-		},
-		cli.StringFlag{
-			Name:   "listen",
-			Usage:  "the interface the service should be listening on",
-			Value:  defaults.Listen,
-			EnvVar: "PROXY_LISTEN",
-		},
-		cli.StringFlag{
-			Name:   "listen-http",
-			Usage:  "the interface you want the http-only service to use on",
-			EnvVar: "PROXY_HTTP_LISTEN",
-		},
-		cli.StringFlag{
-			Name:   "discovery-url",
-			Usage:  "the discovery url to retrieve the openid configuration",
-			EnvVar: "PROXY_DISCOVERY_URL",
-		},
-		cli.StringFlag{
-			Name:   "client-secret",
-			Usage:  "the client secret used to authenticate to the oauth server (access_type: confidential)",
-			EnvVar: "PROXY_CLIENT_SECRET",
-		},
-		cli.StringFlag{
-			Name:   "client-id",
-			Usage:  "the client id used to authenticate to the oauth service",
-			EnvVar: "PROXY_CLIENT_ID",
-		},
-		cli.StringSliceFlag{
-			Name:  "scopes",
-			Usage: "a variable list of scopes requested when authenticating the user",
-		},
-		cli.BoolFlag{
-			Name:  "token-validate-only",
-			Usage: "validate the token and roles only, no required implement oauth",
-		},
-		cli.StringFlag{
-			Name:   "redirection-url",
-			Usage:  fmt.Sprintf("redirection url for the oauth callback url (%s is added)", oauthURL),
-			EnvVar: "PROXY_REDIRECTION_URL",
-		},
-		cli.StringFlag{
-			Name:   "revocation-url",
-			Usage:  "the url for the revocation endpoint to revoke refresh token",
-			EnvVar: "PROXY_REVOCATION_URL",
-		},
-		cli.StringFlag{
-			Name:   "store-url",
-			Usage:  "url for the storage subsystem, e.g redis://127.0.0.1:6379, file:///etc/tokens.file",
-			EnvVar: "PROXY_STORE_URL",
-		},
-		cli.StringFlag{
-			Name:   "upstream-url",
-			Usage:  "the url for the upstream endpoint you wish to proxy to",
-			Value:  defaults.Upstream,
-			EnvVar: "PROXY_UPSTREAM_URL",
-		},
-		cli.BoolTFlag{
-			Name:  "upstream-keepalives",
-			Usage: "enables or disables the keepalive connections for upstream endpoint",
-		},
-		cli.DurationFlag{
-			Name:  "upstream-timeout",
-			Usage: "is the maximum amount of time a dial will wait for a connect to complete",
-			Value: defaults.UpstreamTimeout,
-		},
-		cli.DurationFlag{
-			Name:  "upstream-keepalive-timeout",
-			Usage: "specifies the keep-alive period for an active network connection",
-			Value: defaults.UpstreamKeepaliveTimeout,
-		},
-		cli.BoolTFlag{
-			Name:  "secure-cookie",
-			Usage: "enforces the cookie to be secure, default to true",
-		},
-		cli.BoolFlag{
-			Name:  "http-only-cookie",
-			Usage: "enforces the cookie is in http only mode, default to false",
-		},
-		cli.StringFlag{
-			Name:  "cookie-domain",
-			Usage: "a domain the access cookie is available to, defaults host header",
-		},
-		cli.StringFlag{
-			Name:  "cookie-access-name",
-			Usage: "the name of the cookie use to hold the access token",
-			Value: defaults.CookieAccessName,
-		},
-		cli.StringFlag{
-			Name:  "cookie-refresh-name",
-			Usage: "the name of the cookie used to hold the encrypted refresh token",
-			Value: defaults.CookieRefreshName,
-		},
-		cli.StringFlag{
-			Name:  "encryption-key",
-			Usage: "the encryption key used to encrpytion the session state",
-		},
-		cli.BoolFlag{
-			Name:  "no-redirects",
-			Usage: "do not have back redirects when no authentication is present, 401 them",
-		},
-		cli.StringSliceFlag{
-			Name:  "hostname",
-			Usage: "a list of hostnames the service will respond to, defaults to all",
-		},
-		cli.BoolTFlag{
-			Name:  "enable-https-redirection",
-			Usage: "enable the http to https redirection on the http service",
-		},
-		cli.BoolTFlag{
-			Name:  "enable-login-handler",
-			Usage: "this enables the login hanlder /oauth/login, by default this is disabled",
-		},
-		cli.BoolTFlag{
-			Name:  "enable-authorization-header",
-			Usage: "adds the authorization header to the proxy request",
-		},
-		cli.BoolTFlag{
-			Name:  "enable-refresh-tokens",
-			Usage: "enables the handling of the refresh tokens",
-		},
-		cli.BoolTFlag{
-			Name:  "enable-metrics",
-			Usage: "enable the prometheus metrics collector on /oauth/metrics",
-		},
-		cli.BoolFlag{
-			Name:  "enable-proxy-protocol",
-			Usage: "whether to enable proxy protocol",
-		},
-		cli.BoolFlag{
-			Name:  "enable-forwarding",
-			Usage: "enables the forwarding proxy mode, signing outbound request",
-		},
-		cli.BoolTFlag{
-			Name:  "enable-profiling",
-			Usage: "switching on the golang profiling via pprof on /debug/pprof, /debug/pprof/heap etc",
-		},
-		cli.BoolTFlag{
-			Name:  "enable-security-filter",
-			Usage: "enables the security filter handler",
-		},
-		cli.BoolTFlag{
-			Name:  "localhost-only-metrics",
-			Usage: "enforces the metrics page can only been requested from 127.0.0.1",
-		},
-		cli.StringFlag{
-			Name:  "forwarding-username",
-			Usage: "the username to use when logging into the openid provider",
-		},
-		cli.StringFlag{
-			Name:  "forwarding-password",
-			Usage: "the password to use when logging into the openid provider",
-		},
-		cli.StringSliceFlag{
-			Name:  "forwarding-domains",
-			Usage: "a list of domains which should be signed; everything else is relayed unsigned",
-		},
-		cli.StringFlag{
-			Name:  "tls-cert",
-			Usage: "the path to a certificate file used for TLS",
-		},
-		cli.StringFlag{
-			Name:  "tls-private-key",
-			Usage: "the path to the private key for TLS support",
-		},
-		cli.StringFlag{
-			Name:  "tls-ca-certificate",
-			Usage: "the path to the ca certificate used for mutual TLS",
-		},
-		cli.StringFlag{
-			Name:  "tls-ca-key",
-			Usage: "the path the ca private key, used by the forward signing proxy",
-		},
-		cli.StringFlag{
-			Name:  "tls-client-certificate",
-			Usage: "the path to the client certificate, used to outbound connections in reverse and forwarding proxy modes",
-		},
-		cli.BoolTFlag{
-			Name:  "skip-upstream-tls-verify",
-			Usage: "whether to skip the verification of any upstream TLS (defaults to true)",
-		},
-		cli.BoolTFlag{
-			Name:  "skip-openid-provider-tls-verify",
-			Usage: "whether to skip the verification of any TLS communication with the openid provider (defaults to false)",
-		},
-		cli.StringSliceFlag{
-			Name:  "match-claims",
-			Usage: "keypair values for matching access token claims e.g. aud=myapp, iss=http://example.*",
-		},
-		cli.StringSliceFlag{
-			Name:  "add-claims",
-			Usage: "retrieve extra claims from the token and inject into headers, e.g given_name -> X-Auth-Given-Name",
-		},
-		cli.StringSliceFlag{
-			Name:  "resource",
-			Usage: "a list of resources 'uri=/admin|methods=GET,PUT|roles=role1,role2'",
-		},
-		cli.StringSliceFlag{
-			Name:  "headers",
-			Usage: "Add custom headers to the upstream request, key=value",
-		},
-		cli.StringFlag{
-			Name:  "sign-in-page",
-			Usage: "a custom template displayed for signin",
-		},
-		cli.StringFlag{
-			Name:  "forbidden-page",
-			Usage: "a custom template used for access forbidden",
-		},
-		cli.StringSliceFlag{
-			Name:  "tag",
-			Usage: "keypair's passed to the templates at render,e.g title='My Page'",
-		},
-		cli.StringSliceFlag{
-			Name:  "cors-origins",
-			Usage: "list of origins to add to the CORE origins control (Access-Control-Allow-Origin)",
-		},
-		cli.StringSliceFlag{
-			Name:  "cors-methods",
-			Usage: "the method permitted in the access control (Access-Control-Allow-Methods)",
-		},
-		cli.StringSliceFlag{
-			Name:  "cors-headers",
-			Usage: "a set of headers to add to the CORS access control (Access-Control-Allow-Headers)",
-		},
-		cli.StringSliceFlag{
-			Name:  "cors-exposes-headers",
-			Usage: "set the expose cors headers access control (Access-Control-Expose-Headers)",
-		},
-		cli.DurationFlag{
-			Name:  "cors-max-age",
-			Usage: "the max age applied to cors headers (Access-Control-Max-Age)",
-		},
-		cli.BoolTFlag{
-			Name:  "cors-credentials",
-			Usage: "the credentials access control header (Access-Control-Allow-Credentials)",
-		},
-		cli.BoolTFlag{
-			Name:  "filter-browser-xss",
-			Usage: "enable the adds the X-XSS-Protection header with mode=block",
-		},
-		cli.BoolTFlag{
-			Name:  "filter-content-nosniff",
-			Usage: "adds the X-Content-Type-Options header with the value nosniff",
-		},
-		cli.BoolFlag{
-			Name:  "skip-token-verification",
-			Usage: "TESTING ONLY; bypass token verification, only expiration and roles enforced",
-		},
-		cli.BoolTFlag{
-			Name:  "json-logging",
-			Usage: "switch on json logging rather than text (defaults true)",
-		},
-		cli.BoolTFlag{
-			Name:  "log-requests",
-			Usage: "switch on logging of all incoming requests (defaults true)",
-		},
-		cli.BoolTFlag{
-			Name:  "verbose",
-			Usage: "switch on debug / verbose logging",
-		},
+	var flags []cli.Flag
+	count := reflect.TypeOf(Config{}).NumField()
+	for i := 0; i < count; i++ {
+		field := reflect.TypeOf(Config{}).Field(i)
+		usage, found := field.Tag.Lookup("usage")
+		if !found {
+			continue
+		}
+		envName := field.Tag.Get("env")
+		if envName != "" {
+			envName = envPrefix + envName
+		}
+		optName := field.Tag.Get("yaml")
+
+		switch t := field.Type; t.Kind() {
+		case reflect.Bool:
+			dv := reflect.ValueOf(defaults).Elem().FieldByName(field.Name).Bool()
+			msg := fmt.Sprintf("%s (default: %t)", usage, dv)
+			flags = append(flags, cli.BoolTFlag{
+				Name:   optName,
+				Usage:  msg,
+				EnvVar: envName,
+			})
+		case reflect.String:
+			defaultValue := reflect.ValueOf(defaults).Elem().FieldByName(field.Name).String()
+			flags = append(flags, cli.StringFlag{
+				Name:   optName,
+				Usage:  usage,
+				EnvVar: envName,
+				Value:  defaultValue,
+			})
+		case reflect.Slice:
+			fallthrough
+		case reflect.Map:
+			flags = append(flags, cli.StringSliceFlag{
+				Name:  optName,
+				Usage: usage,
+			})
+		case reflect.Int64:
+			switch t.String() {
+			case "time.Duration":
+				dv := reflect.ValueOf(defaults).Elem().FieldByName(field.Name).Int()
+				flags = append(flags, cli.DurationFlag{
+					Name:  optName,
+					Usage: usage,
+					Value: time.Duration(dv),
+				})
+			default:
+				panic("unknown uint64 type in the Config struct")
+			}
+		default:
+			errMsg := fmt.Sprintf("field: %s, type: %s, kind: %s is not being handled", field.Name, t.String(), t.Kind())
+			panic(errMsg)
+		}
 	}
+
+	return flags
 }
 
-//
 // parseCLIOptions parses the command line options and constructs a config object
 // @TODO look for a shorter way of doing this, we're maintaining the same options in multiple places, it's tedious!
-//
 func parseCLIOptions(cx *cli.Context, config *Config) (err error) {
 	// step: we can ignore these options in the Config struct
 	ignoredOptions := []string{"tag-data", "match-claims", "resources", "headers"}
diff --git a/doc.go b/doc.go
index 783026213a0f6ddce938e32b98353a57f3e5e3cb..4b83a47f7719591ce1d35da480ffc4b5804ab746 100644
--- a/doc.go
+++ b/doc.go
@@ -40,6 +40,7 @@ const (
 	userContextName     = "identity"
 	authorizationHeader = "Authorization"
 	versionHeader       = "X-Auth-Proxy-Version"
+	envPrefix           = "PROXY_"
 
 	oauthURL         = "/oauth"
 	authorizationURL = "/authorize"
@@ -103,142 +104,142 @@ type Cors struct {
 
 // Config is the configuration for the proxy
 type Config struct {
+	// ConfigFile is the binding interface
+	ConfigFile string `json:"config" yaml:"config" usage:"path the a configuration file" env:"CONFIG_FILE"`
 	// Listen is the binding interface
-	Listen string `json:"listen" yaml:"listen"`
+	Listen string `json:"listen" yaml:"listen" usage:"the interface the service should be listening on" env:"LISTEN"`
 	// ListenHTTP is the interface to bind the http only service on
-	ListenHTTP string `json:"listen-http" yaml:"listen-http"`
+	ListenHTTP string `json:"listen-http" yaml:"listen-http" usage:"interface we should be listening" env:"LISTEN_HTTP"`
 	// DiscoveryURL is the url for the keycloak server
-	DiscoveryURL string `json:"discovery-url" yaml:"discovery-url"`
+	DiscoveryURL string `json:"discovery-url" yaml:"discovery-url" usage:"discovery url to retrieve the openid configuration" env:"DISCOVERY_URL"`
 	// ClientID is the client id
-	ClientID string `json:"client-id" yaml:"client-id"`
+	ClientID string `json:"client-id" yaml:"client-id" usage:"client id used to authenticate to the oauth service" env:"CLIENT_ID"`
 	// ClientSecret is the secret for AS
-	ClientSecret string `json:"client-secret" yaml:"client-secret"`
+	ClientSecret string `json:"client-secret" yaml:"client-secret" usage:"client secret used to authenticate to the oauth service" env:"CLIENT_SECERT"`
 	// RedirectionURL the redirection url
-	RedirectionURL string `json:"redirection-url" yaml:"redirection-url"`
+	RedirectionURL string `json:"redirection-url" yaml:"redirection-url" usage:"redirection url for the oauth callback url" env:"REDIRECTION_URL"`
 	// RevocationEndpoint is the token revocation endpoint to revoke refresh tokens
-	RevocationEndpoint string `json:"revocation-url" yaml:"revocation-url"`
+	RevocationEndpoint string `json:"revocation-url" yaml:"revocation-url" usage:"url for the revocation endpoint to revoke refresh token" env:"REVOCATION_URL"`
 	// SkipOpenIDProviderTLSVerify skips the tls verification for openid provider communication
-	SkipOpenIDProviderTLSVerify bool `json:"skip-openid-provider-tls-verify" yaml:"skip-openid-provider-tls-verify"`
+	SkipOpenIDProviderTLSVerify bool `json:"skip-openid-provider-tls-verify" yaml:"skip-openid-provider-tls-verify" usage:"skip the verification of any TLS communication with the openid provider"`
 	// Scopes is a list of scope we should request
-	Scopes []string `json:"scopes" yaml:"scopes"`
+	Scopes []string `json:"scopes" yaml:"scopes" usage:"list of scopes requested when authenticating the user"`
 	// Upstream is the upstream endpoint i.e whom were proxying to
-	Upstream string `json:"upstream-url" yaml:"upstream-url"`
+	Upstream string `json:"upstream-url" yaml:"upstream-url" usage:"url for the upstream endpoint you wish to proxy" env:"UPSTREAM_URL"`
 	// Resources is a list of protected resources
-	Resources []*Resource `json:"resources" yaml:"resources"`
+	Resources []*Resource `json:"resources" yaml:"resources" usage:"list of resources 'uri=/admin|methods=GET,PUT|roles=role1,role2'"`
 	// Headers permits adding customs headers across the board
-	Headers map[string]string `json:"headers" yaml:"headers"`
+	Headers map[string]string `json:"headers" yaml:"headers" usage:"custom headers to the upstream request, key=value"`
 
 	// EnableForwarding enables the forwarding proxy
-	EnableForwarding bool `json:"enable-forwarding" yaml:"enable-forwarding"`
+	EnableForwarding bool `json:"enable-forwarding" yaml:"enable-forwarding" usage:"enables the forwarding proxy mode, signing outbound request"`
 	// EnableSecurityFilter enabled the security handler
-	EnableSecurityFilter bool `json:"enable-security-filter" yaml:"enable-security-filter"`
+	EnableSecurityFilter bool `json:"enable-security-filter" yaml:"enable-security-filter" usage:"enables the security filter handler"`
 	// EnableRefreshTokens indicate's you wish to ignore using refresh tokens and re-auth on expiration of access token
-	EnableRefreshTokens bool `json:"enable-refresh-tokens" yaml:"enable-refresh-tokens"`
+	EnableRefreshTokens bool `json:"enable-refresh-tokens" yaml:"enable-refresh-tokens" usage:"nables the handling of the refresh tokens" env:"ENABLE_SECURITY_FILTER"`
 	// EnableLoginHandler indicates we want the login handler enabled
-	EnableLoginHandler bool `json:"enable-login-handler" yaml:"enable-login-handler"`
+	EnableLoginHandler bool `json:"enable-login-handler" yaml:"enable-login-handler" usage:"enables the handling of the refresh tokens" env:"ENABLE_LOGIN_HANDLER"`
 	// EnableAuthorizationHeader indicates we should pass the authorization header
-	EnableAuthorizationHeader bool `json:"enable-authorization-header" yaml:"enable-authorization-header"`
+	EnableAuthorizationHeader bool `json:"enable-authorization-header" yaml:"enable-authorization-header" usage:"adds the authorization header to the proxy request"`
 	// EnableHTTPSRedirect indicate we should redirection http -> https
-	EnableHTTPSRedirect bool `json:"enable-https-redirection" yaml:"enable-https-redirection"`
+	EnableHTTPSRedirect bool `json:"enable-https-redirection" yaml:"enable-https-redirection" usage:"enable the http to https redirection on the http service"`
 	// EnableProfiling indicates if profiles is switched on
-	EnableProfiling bool `json:"enable-profiling" yaml:"enable-profiling"`
+	EnableProfiling bool `json:"enable-profiling" yaml:"enable-profiling" usage:"switching on the golang profiling via pprof on /debug/pprof, /debug/pprof/heap etc"`
 	// EnableMetrics indicates if the metrics is enabled
-	EnableMetrics bool `json:"enable-metrics" yaml:"enable-metrics"`
-	// EnableURIMetrics indicates we want to keep metrics on uri request times
-	EnableURIMetrics bool `json:"enable-uri-metrics" yaml:"enable-uri-metrics"`
+	EnableMetrics bool `json:"enable-metrics" yaml:"enable-metrics" usage:"enable the prometheus metrics collector on /oauth/metrics"`
 	// EnableBrowserXSSFilter indicates you want the filter on
-	EnableBrowserXSSFilter bool `json:"filter-browser-xss" yaml:"filter-browser-xss"`
+	EnableBrowserXSSFilter bool `json:"filter-browser-xss" yaml:"filter-browser-xss" usage:"enable the adds the X-XSS-Protection header with mode=block"`
 	// EnableContentNoSniff indicates you want the filter on
-	EnableContentNoSniff bool `json:"filter-content-nosniff" yaml:"filter-content-nosniff"`
+	EnableContentNoSniff bool `json:"filter-content-nosniff" yaml:"filter-content-nosniff" usage:"adds the X-Content-Type-Options header with the value nosniff"`
 	// EnableFrameDeny indicates the filter is on
-	EnableFrameDeny bool `json:"filter-frame-deny" yaml:"filter-frame-deny"`
+	EnableFrameDeny bool `json:"filter-frame-deny" yaml:"filter-frame-deny" usage:"enable to the frame deny header"`
 	// ContentSecurityPolicy allows the Content-Security-Policy header value to be set with a custom value
-	ContentSecurityPolicy string `json:"content-security-policy" yaml:"content-security-policy"`
+	ContentSecurityPolicy string `json:"content-security-policy" yaml:"content-security-policy" usage:"specify the content security policy"`
 	// LocalhostMetrics indicated the metrics can only be consume via localhost
-	LocalhostMetrics bool `json:"localhost-metrics" yaml:"localhost-metrics"`
+	LocalhostMetrics bool `json:"localhost-metrics" yaml:"localhost-metrics" usage:"enforces the metrics page can only been requested from 127.0.0.1"`
 
 	// CookieDomain is a list of domains the cookie is available to
-	CookieDomain string `json:"cookie-domain" yaml:"cookie-domain"`
+	CookieDomain string `json:"cookie-domain" yaml:"cookie-domain" usage:"domain the access cookie is available to, defaults host header"`
 	// CookieAccessName is the name of the access cookie holding the access token
-	CookieAccessName string `json:"cookie-access-name" yaml:"cookie-access-name"`
+	CookieAccessName string `json:"cookie-access-name" yaml:"cookie-access-name" usage:"name of the cookie use to hold the access token"`
 	// CookieRefreshName is the name of the refresh cookie
-	CookieRefreshName string `json:"cookie-refresh-name" yaml:"cookie-refresh-name"`
+	CookieRefreshName string `json:"cookie-refresh-name" yaml:"cookie-refresh-name" usage:"name of the cookie used to hold the encrypted refresh token"`
 	// SecureCookie enforces the cookie as secure
-	SecureCookie bool `json:"secure-cookie" yaml:"secure-cookie"`
+	SecureCookie bool `json:"secure-cookie" yaml:"secure-cookie" usage:"enforces the cookie to be secure"`
 	// HTTPOnlyCookie enforces the cookie as http only
-	HTTPOnlyCookie bool `json:"http-only-cookie" yaml:"http-only-cookie"`
+	HTTPOnlyCookie bool `json:"http-only-cookie" yaml:"http-only-cookie" usage:"enforces the cookie is in http only mode"`
 
 	// MatchClaims is a series of checks, the claims in the token must match those here
-	MatchClaims map[string]string `json:"match-claims" yaml:"match-claims"`
+	MatchClaims map[string]string `json:"match-claims" yaml:"match-claims" usage:"keypair values for matching access token claims e.g. aud=myapp, iss=http://example.*"`
 	// AddClaims is a series of claims that should be added to the auth headers
-	AddClaims []string `json:"add-claims" yaml:"add-claims"`
+	AddClaims []string `json:"add-claims" yaml:"add-claims" usage:"extra claims from the token and inject into headers, e.g given_name -> X-Auth-Given-Name"`
 
 	// TLSCertificate is the location for a tls certificate
-	TLSCertificate string `json:"tls-cert" yaml:"tls-cert"`
+	TLSCertificate string `json:"tls-cert" yaml:"tls-cert" usage:"path to ths TLS certificate"`
 	// TLSPrivateKey is the location of a tls private key
-	TLSPrivateKey string `json:"tls-private-key" yaml:"tls-private-key"`
+	TLSPrivateKey string `json:"tls-private-key" yaml:"tls-private-key" usage:"path to the private key for TLS"`
 	// TLSCaCertificate is the CA certificate which the client cert must be signed
-	TLSCaCertificate string `json:"tls-ca-certificate" yaml:"tls-ca-certificate"`
+	TLSCaCertificate string `json:"tls-ca-certificate" yaml:"tls-ca-certificate" usage:"path to the ca certificate used for signing requests"`
 	// TLSCaPrivateKey is the CA private key used for signing
-	TLSCaPrivateKey string `json:"tls-ca-key" yaml:"tls-ca-key"`
+	TLSCaPrivateKey string `json:"tls-ca-key" yaml:"tls-ca-key" usage:"path the ca private key, used by the forward signing proxy"`
 	// TLSClientCertificate is path to a client certificate to use for outbound connections
-	TLSClientCertificate string `json:"tls-client-certificate" yaml:"tls-client-certificate"`
+	TLSClientCertificate string `json:"tls-client-certificate" yaml:"tls-client-certificate" usage:"path to the client certificate for outbound connections in reverse and forwarding proxy modes"`
 	// SkipUpstreamTLSVerify skips the verification of any upstream tls
-	SkipUpstreamTLSVerify bool `json:"skip-upstream-tls-verify" yaml:"skip-upstream-tls-verify"`
+	SkipUpstreamTLSVerify bool `json:"skip-upstream-tls-verify" yaml:"skip-upstream-tls-verify" usage:"skip the verification of any upstream TLS"`
 
 	// CorsOrigins is a list of origins permitted
-	CorsOrigins []string `json:"cors-origins" yaml:"cors-origins"`
+	CorsOrigins []string `json:"cors-origins" yaml:"cors-origins" usage:"origins to add to the CORE origins control (Access-Control-Allow-Origin)"`
 	// CorsMethods is a set of access control methods
-	CorsMethods []string `json:"cors-methods" yaml:"cors-methods"`
+	CorsMethods []string `json:"cors-methods" yaml:"cors-methods" usage:"methods permitted in the access control (Access-Control-Allow-Methods)"`
 	// CorsHeaders is a set of cors headers
-	CorsHeaders []string `json:"cors-headers" yaml:"cors-headers"`
+	CorsHeaders []string `json:"cors-headers" yaml:"cors-headers" usage:"set of headers to add to the CORS access control (Access-Control-Allow-Headers)"`
 	// CorsExposedHeaders are the exposed header fields
-	CorsExposedHeaders []string `json:"cors-exposed-headers" yaml:"cors-exposed-headers"`
+	CorsExposedHeaders []string `json:"cors-exposed-headers" yaml:"cors-exposed-headers" usage:"expose cors headers access control (Access-Control-Expose-Headers)"`
 	// CorsCredentials set the creds flag
-	CorsCredentials bool `json:"cors-credentials" yaml:"cors-credentials"`
+	CorsCredentials bool `json:"cors-credentials" yaml:"cors-credentials" usage:"credentials access control header (Access-Control-Allow-Credentials)"`
 	// CorsMaxAge is the age for CORS
-	CorsMaxAge time.Duration `json:"cors-max-age" yaml:"cors-max-age"`
+	CorsMaxAge time.Duration `json:"cors-max-age" yaml:"cors-max-age" usage:"max age applied to cors headers (Access-Control-Max-Age)"`
 
 	// Hostname is a list of hostname's the service should response to
-	Hostnames []string `json:"hostnames" yaml:"hostnames"`
+	Hostnames []string `json:"hostnames" yaml:"hostnames" usage:"list of hostnames the service will respond to"`
 
 	// Store is a url for a store resource, used to hold the refresh tokens
-	StoreURL string `json:"store-url" yaml:"store-url"`
+	StoreURL string `json:"store-url" yaml:"store-url" usage:"url for the storage subsystem, e.g redis://127.0.0.1:6379, file:///etc/tokens.file"`
 	// EncryptionKey is the encryption key used to encrypt the refresh token
-	EncryptionKey string `json:"encryption-key" yaml:"encryption-key"`
+	EncryptionKey string `json:"encryption-key" yaml:"encryption-key" usage:"encryption key used to encrpytion the session state"`
 
 	// LogRequests indicates if we should log all the requests
-	LogRequests bool `json:"log-requests" yaml:"log-requests"`
+	LogRequests bool `json:"log-requests" yaml:"log-requests" usage:"enable http logging of the requests"`
 	// LogFormat is the logging format
-	LogJSONFormat bool `json:"json-format" yaml:"json-format"`
+	LogJSONFormat bool `json:"json-format" yaml:"json-format" usage:"switch on json logging rather than text"`
 	// NoRedirects informs we should hand back a 401 not a redirect
-	NoRedirects bool `json:"no-redirects" yaml:"no-redirects"`
+	NoRedirects bool `json:"no-redirects" yaml:"no-redirects" usage:"do not have back redirects when no authentication is present, 401 them"`
 	// SkipTokenVerification tells the service to skipp verifying the access token - for testing purposes
-	SkipTokenVerification bool `json:"skip-token-verification" yaml:"skip-token-verification"`
+	SkipTokenVerification bool `json:"skip-token-verification" yaml:"skip-token-verification" usage:"TESTING ONLY; bypass token verification, only expiration and roles enforced"`
 	// UpstreamKeepalives specifies whether we use keepalives on the upstream
-	UpstreamKeepalives bool `json:"upstream-keepalives" yaml:"upstream-keepalives"`
+	UpstreamKeepalives bool `json:"upstream-keepalives" yaml:"upstream-keepalives" usage:"enables or disables the keepalive connections for upstream endpoint"`
 	// UpstreamTimeout is the maximum amount of time a dial will wait for a connect to complete
-	UpstreamTimeout time.Duration `json:"upstream-timeout" yaml:"upstream-timeout"`
+	UpstreamTimeout time.Duration `json:"upstream-timeout" yaml:"upstream-timeout" usage:"maximum amount of time a dial will wait for a connect to complete"`
 	// UpstreamKeepaliveTimeout
-	UpstreamKeepaliveTimeout time.Duration `json:"upstream-keepalive-timeout" yaml:"upstream-keepalive-timeout"`
+	UpstreamKeepaliveTimeout time.Duration `json:"upstream-keepalive-timeout" yaml:"upstream-keepalive-timeout" usage:"specifies the keep-alive period for an active network connection"`
 	// Verbose switches on debug logging
-	Verbose bool `json:"verbose" yaml:"verbose"`
+	Verbose bool `json:"verbose" yaml:"verbose" usage:"switch on debug / verbose logging"`
 	// EnableProxyProtocol controls the proxy protocol
-	EnableProxyProtocol bool `json:"enabled-proxy-protocol" yaml:"enabled-proxy-protocol"`
+	EnableProxyProtocol bool `json:"enabled-proxy-protocol" yaml:"enabled-proxy-protocol" usage:"enable proxy protocol"`
 
 	// SignInPage is the relative url for the sign in page
-	SignInPage string `json:"sign-in-page" yaml:"sign-in-page"`
+	SignInPage string `json:"sign-in-page" yaml:"sign-in-page" usage:"path to custom template displayed for signin"`
 	// ForbiddenPage is a access forbidden page
-	ForbiddenPage string `json:"forbidden-page" yaml:"forbidden-page"`
+	ForbiddenPage string `json:"forbidden-page" yaml:"forbidden-page" usage:"path to custom template used for access forbidden"`
 	// TagData is passed to the templates
-	TagData map[string]string `json:"tag-data" yaml:"tag-data"`
+	TagData map[string]string `json:"tag-data" yaml:"tag-data" usage:"keypair's passed to the templates at render,e.g title=Page"`
 
 	// ForwardingUsername is the username to login to the oauth service
-	ForwardingUsername string `json:"forwarding-username" yaml:"forwarding-username"`
+	ForwardingUsername string `json:"forwarding-username" yaml:"forwarding-username" usage:"username to use when logging into the openid provider"`
 	// ForwardingPassword is the password to use for the above
-	ForwardingPassword string `json:"forwarding-password" yaml:"forwarding-password"`
+	ForwardingPassword string `json:"forwarding-password" yaml:"forwarding-password" usage:"password to use when logging into the openid provider"`
 	// ForwardingDomains is a collection of domains to signs
-	ForwardingDomains []string `json:"forwarding-domains" yaml:"forwarding-domains"`
+	ForwardingDomains []string `json:"forwarding-domains" yaml:"forwarding-domains" usage:"list of domains which should be signed; everything else is relayed unsigned"`
 }
 
 // store is used to hold the offline refresh token, assuming you don't want to use