diff --git a/cmd/root.go b/cmd/root.go
index f169f788796bdfb283551a142664b931f999a447..90269fcd4b8be18e168c15074b8fafc7c2bdbdda 100644
--- a/cmd/root.go
+++ b/cmd/root.go
@@ -1,7 +1,9 @@
 package cmd
 
 import (
+	"encoding/json"
 	"fmt"
+	"net/http"
 	"os"
 
 	"github.com/joho/godotenv"
@@ -9,15 +11,41 @@ import (
 	"github.com/spf13/viper"
 )
 
+type Tunnel struct {
+	Name      string `json:"name"`
+	PublicURL string `json:"public_url"`
+}
+
+var ngrok bool
+
 var rootCmd = &cobra.Command{
 	Use:   "go-ipa",
 	Short: "Root Short",
 	Long:  `Root Long`,
+	PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
+		if ngrok {
+			resp, err := http.Get("http://127.0.0.1:4040/api/tunnels/command_line")
+			if err != nil {
+				return err
+			}
+			defer resp.Body.Close()
+			var tunnel Tunnel
+			err = json.NewDecoder(resp.Body).Decode(&tunnel)
+			if err != nil {
+				return err
+			}
+			viper.Set("BASE_URL", tunnel.PublicURL)
+			viper.Set("SSL", "false")
+			return err
+		}
+		return nil
+	},
 }
 
 func init() {
 	cobra.OnInitialize(initEnv)
 	rootCmd.PersistentFlags().StringP("url", "b", "", "Set a base URL")
+	rootCmd.PersistentFlags().BoolVarP(&ngrok, "ngrok", "n", false, "Use ngrok public url")
 	viper.SetEnvPrefix("DIPA")
 	viper.BindPFlag("BASE_URL", rootCmd.PersistentFlags().Lookup("url"))
 }
diff --git a/cmd/share.go b/cmd/share.go
index 15c744693ecc0555cbb90e62a7f471cb3b3cfd07..79b6cfb415eca289984777ca6ddf611dd9d00d68 100644
--- a/cmd/share.go
+++ b/cmd/share.go
@@ -26,7 +26,6 @@ type ExtendedAppInfo struct {
 	DownloadURL string
 }
 
-var useTLS bool
 var useHalfBlock bool
 
 var scheme string
@@ -119,10 +118,14 @@ var shareCmd = &cobra.Command{
 			} else {
 				qrterminal.Generate(extAppInfo.DownloadURL, qrterminal.L, os.Stdout)
 			}
+		} else {
+			fmt.Println("Base url not set")
 		}
 
+		fmt.Println(viper.GetBool("SSL"))
+
 		addr := viper.GetString("ADDR")
-		if useTLS {
+		if viper.GetBool("SSL") {
 			scheme = "https"
 			return http.ListenAndServeTLS(addr, viper.GetString("CERT"), viper.GetString("KEY"), nil)
 		}
@@ -133,12 +136,13 @@ var shareCmd = &cobra.Command{
 
 func init() {
 	rootCmd.AddCommand(shareCmd)
-	shareCmd.Flags().BoolVar(&useTLS, "ssl", true, "enable SSL/TLS")
 	shareCmd.Flags().BoolVar(&useHalfBlock, "half", false, "generate a smaller QR code in the terminal")
 	shareCmd.Flags().StringP("addr", "a", ":8080", "address and port on which the server will accept requests")
 	shareCmd.Flags().StringP("cert", "c", "", "path to SSL certificate")
 	shareCmd.Flags().StringP("key", "k", "", "path to SSL secret key")
+	shareCmd.Flags().Bool("ssl", true, "enable SSL/TLS")
 	viper.BindPFlag("ADDR", shareCmd.Flags().Lookup("addr"))
 	viper.BindPFlag("CERT", shareCmd.Flags().Lookup("cert"))
 	viper.BindPFlag("KEY", shareCmd.Flags().Lookup("key"))
+	viper.BindPFlag("SSL", shareCmd.Flags().Lookup("ssl"))
 }
diff --git a/vendor/vendor.json b/vendor/vendor.json
index 8ce6ed34f360b81482c9aab5be445c3094ef6e10..4d5201bad9f4436d2b29a12ca1bafafa2a7bcd32 100644
--- a/vendor/vendor.json
+++ b/vendor/vendor.json
@@ -206,7 +206,7 @@
 			"revisionTime": "2019-09-17T10:36:37Z"
 		},
 		{
-			"checksumSHA1": "MIB4bZiAqyrMRlIrPg99hCzzDQ4=",
+			"checksumSHA1": "CIkqNgrWiMPe6F2pXY8ED3A3a2M=",
 			"path": "golang.org/x/sys/unix",
 			"revision": "d5e6a3e2c0ae16fc7480523ebcb7fd4dd3215489",
 			"revisionTime": "2020-02-16T19:14:09Z"
@@ -218,7 +218,7 @@
 			"revisionTime": "2019-11-14T14:00:43Z"
 		},
 		{
-			"checksumSHA1": "eTvVCF1qJTPYUphbo7NpQ7kXzPE=",
+			"checksumSHA1": "1C/qZEW+DDmMf7Y823CMSbhMA0A=",
 			"path": "golang.org/x/text/unicode/norm",
 			"revision": "929e72ca90deac4784bbe451caf10faa5b256ebe",
 			"revisionTime": "2019-11-14T14:00:43Z"
@@ -242,7 +242,7 @@
 			"revisionTime": "2018-06-05T10:54:35Z"
 		},
 		{
-			"checksumSHA1": "WTjGqpo7TWA+9/HkTikQRa1bePM=",
+			"checksumSHA1": "cCb4q+jBCc35Mg77eeey7WUoLzo=",
 			"path": "rsc.io/qr/coding",
 			"revision": "ca9a01fc2f9505024045632c50e5e8cd6142fafe",
 			"revisionTime": "2018-06-05T10:54:35Z"