diff --git a/cmdEnv/envVars.go b/cmdEnv/envVars.go
index e287e5a..1d8eaaa 100644
--- a/cmdEnv/envVars.go
+++ b/cmdEnv/envVars.go
@@ -4,6 +4,7 @@ import (
 	"fmt"
 	"kode-creator/config"
 	"kode-creator/configFile"
+	"os/exec"
 
 	"kode-creator/utils"
 	"os"
@@ -28,17 +29,8 @@ var EnvCmd = &cobra.Command{
 	Long:  `A simple CLI option to manage environment variables`,
 	Run: func(cmd *cobra.Command, args []string) {
 
-<<<<<<< HEAD
 		// Start Env command
 		startEnvVar(cmd, args)
-=======
-		config.SetInformations(cmd, args)
-
-		// if option --env or -e is set then print environment variables
-		if config.GetEnvVariablesFlag() {
-			printEnvVariables()
-		}
->>>>>>> b7ba427 (corr. envVar)
 
 	},
 }
@@ -55,6 +47,7 @@ func startEnvVar(cmd *cobra.Command, args []string) {
 
 	CfgGlobal.DebugPrintConfig("Function StartEnvVar")
 
+	// check if env flag EnvVariablesListFlag is set
 	if CfgGlobal.GetEnvListFlag() {
 
 		if !CfgGlobal.GetJsonFlag() {
@@ -74,6 +67,40 @@ func startEnvVar(cmd *cobra.Command, args []string) {
 			fmt.Println(json)
 		}
 
+		// check if env flag EnvVariablesSetFlag is set
+	} else if CfgGlobal.GetEnvSetFlag() {
+
+		// if key and value are not empty
+		if CfgGlobal.GetEnvKey() != "" && CfgGlobal.GetEnvValue() != "" {
+
+			// set environment variable with key and value permanently
+			if utils.IsWindows() {
+				createEnvVariableWindows(CfgGlobal.GetEnvKey(), CfgGlobal.GetEnvValue())
+			} else {
+				createEnvVariableLinux(CfgGlobal.GetEnvKey(), CfgGlobal.GetEnvValue())
+			}
+
+			utils.PrintHeader()
+			color.Green.Println("\n   S E T   E N V I R O N M E N T   V A R I A B L E   ")
+			color.Yellow.Println(utils.CreateLine(15))
+			color.Green.Println("Key: " + CfgGlobal.GetEnvKey())
+			color.Green.Println("Value: " + CfgGlobal.GetEnvValue())
+			// get all environment variables
+			printEnvVariables()
+
+			color.Yellow.Println(utils.CreateLine(15))
+
+		} else {
+			utils.PrintHeader()
+			color.Green.Println("\n   S E T   E N V I R O N M E N T   V A R I A B L E   ")
+			color.Yellow.Println(utils.CreateLine(15))
+			color.Red.Println("Error: key and value are required")
+			fmt.Println("\nExample: kode-creator env -s -k KEY -v VALUE")
+			color.Yellow.Println(utils.CreateLine(15))
+			return
+		}
+
+		// check if env flag EnvVariablesYmlFlag is set
 	} else if CfgGlobal.GetEnvYmlFileFlag() {
 		cfgYmlFile := configFile.LoadConfigFile(CfgGlobal)
 
@@ -146,8 +173,9 @@ func startEnvVar(cmd *cobra.Command, args []string) {
 		}
 
 	} else {
+		utils.PrintHeader()
 		cmd.Help()
-		fmt.Println(utils.CreateLine(8))
+		color.Yellow.Println(utils.CreateLine(15))
 	}
 
 }
@@ -307,8 +335,14 @@ func listEnvVariables() error {
 }
 
 func printEnvVariables() {
-	fmt.Println("E n v i r o n m e n t   v a r i a b l e s")
-	fmt.Println("-----------------------------------------")
+
+	// print header if json flag is not set
+	if !CfgGlobal.GetJsonFlag() {
+		utils.PrintHeader()
+	}
+
+	color.Green.Println("E n v i r o n m e n t   v a r i a b l e s")
+	color.Yellow.Println(utils.CreateLine(15))
 
 	nb := 1
 
@@ -320,13 +354,14 @@ func printEnvVariables() {
 		nb++
 	}
 
-	fmt.Println("-----------------------------------------")
+	color.Yellow.Println(utils.CreateLine(15))
 }
 
 func printEnvVariablesFilter(filter string, showAll bool) {
-	fmt.Println("Filter Environment variables")
-	// fmt.Println("---------------------")
-	utils.CreateLine(5)
+
+	utils.PrintHeader()
+	color.Green.Println("F i l t e r   E n v i r o n m e n t   v a r i a b l e s")
+	color.Yellow.Println(utils.CreateLine(15))
 
 	nb := 1
 	var str2, str3 string
@@ -359,4 +394,81 @@ func printEnvVariablesFilter(filter string, showAll bool) {
 		nb++
 
 	}
+	color.Yellow.Println(utils.CreateLine(15))
+}
+
+// create a permanent environment variable on Windows with key and value
+func createEnvVariableWindows(key string, value string) error {
+
+	// detect if OS is Windows
+	if utils.IsWindows() {
+
+		// set environment variable with key and value permanently
+		// setx Key "Value"
+		cmd := exec.Command("cmd", "/C", "setx", key, value)
+		err := cmd.Run()
+		if err != nil {
+			color.Red.Println("Error:", err)
+		}
+
+	}
+	return nil
+
+}
+
+// create a permanent environment variable on Linux with key and value
+func createEnvVariableLinux(key string, value string) error {
+
+	// detect if OS is Linux
+	if !utils.IsWindows() {
+
+		// set environment variable with key and value permanently
+		// setx Key "Value"
+		cmd := exec.Command("export", key+"="+value)
+		err := cmd.Run()
+		if err != nil {
+			color.Red.Println("Error:", err)
+		}
+
+	}
+	return nil
+
+}
+
+// delete a permanent environment variable on Windows with key
+func deleteEnvVariableWindows(key string) error {
+
+	// detect if OS is Windows
+	if utils.IsWindows() {
+
+		// set environment variable with key and value permanently
+		// setx Key "Value"
+		cmd := exec.Command("cmd", "/C", "setx", key, "")
+		err := cmd.Run()
+		if err != nil {
+			color.Red.Println("Error:", err)
+		}
+
+	}
+	return nil
+
+}
+
+// delete a permanent environment variable on Linux with key
+func deleteEnvVariableLinux(key string) error {
+
+	// detect if OS is Linux
+	if !utils.IsWindows() {
+
+		// set environment variable with key and value permanently
+		// setx Key "Value"
+		cmd := exec.Command("unset", key)
+		err := cmd.Run()
+		if err != nil {
+			color.Red.Println("Error:", err)
+		}
+
+	}
+	return nil
+
 }
diff --git a/cmdLists/lists.go b/cmdLists/lists.go
index a01ab5b..f134691 100644
--- a/cmdLists/lists.go
+++ b/cmdLists/lists.go
@@ -7,6 +7,7 @@ import (
 	"kode-creator/utils"
 	"net/http"
 
+	"github.com/gookit/color"
 	"github.com/spf13/cobra"
 )
 
@@ -55,10 +56,10 @@ func startList(cmd *cobra.Command, args []string) {
 		// if -o flag is set, list projects for that org
 		if CfgGlobal.GetListOrganizationFlag() {
 			if !CfgGlobal.GetJsonFlag() {
-				fmt.Println("\n   L I S T   P R O J E C T S   F O R   O R G. ")
-				fmt.Println(utils.CreateLine(8))
-				fmt.Println("   ==>  " + CfgGlobal.GetListOrganization() + "  <== ")
-				fmt.Println(utils.CreateLine(8))
+				color.Green.Println("\n   L I S T   P R O J E C T S   F O R   O R G. ")
+				color.Yellow.Println(utils.CreateLine(15))
+				color.Green.Println("   ==>  " + CfgGlobal.GetListOrganization() + "  <== ")
+				color.Yellow.Println(utils.CreateLine(15))
 			}
 			projects, err := ListGitTeaProjects(CfgGlobal.GetListOrganization())
 			if err != nil {
@@ -66,10 +67,9 @@ func startList(cmd *cobra.Command, args []string) {
 				return
 			}
 			for _, project := range projects {
-				fmt.Println(project)
-				// fmt.Print(project)
+				fmt.Print(project)
 			}
-			fmt.Println(utils.CreateLine(8))
+			color.Yellow.Println(utils.CreateLine(15))
 
 		} else {
 			orgs, err := ListGitTeaOrganization()
@@ -78,14 +78,14 @@ func startList(cmd *cobra.Command, args []string) {
 				return
 			}
 			if !CfgGlobal.GetJsonFlag() {
-				fmt.Println("\n   L I S T   O R G A N I Z A T I O N S")
-				fmt.Println(utils.CreateLine(8))
+				color.Green.Println("\n   L I S T   O R G A N I Z A T I O N S")
+				color.Yellow.Println(utils.CreateLine(15))
 			}
 			for _, org := range orgs {
 
 				fmt.Print(org)
 			}
-			fmt.Println(utils.CreateLine(8))
+			color.Yellow.Println(utils.CreateLine(15))
 		}
 
 		// if Github flag is set
@@ -94,8 +94,8 @@ func startList(cmd *cobra.Command, args []string) {
 		// if user flag is set, list projects for that user
 		if CfgGlobal.GetListUserFlag() {
 
-			fmt.Println("\n   L I S T   G I T H U B   P R O J E C T S   F O R  : " + CfgGlobal.GetListUser())
-			fmt.Println(utils.CreateLine(11))
+			color.Green.Println("\n   L I S T   G I T H U B   P R O J E C T S   F O R  : " + CfgGlobal.GetListUser())
+			color.Yellow.Println(utils.CreateLine(15))
 			repos, err := ListGitHubProjectsfromUser(CfgGlobal.GetListUser(), CfgGlobal.GetGithubTokenEnv())
 			if err != nil {
 				fmt.Println("Error:", err)
@@ -108,8 +108,8 @@ func startList(cmd *cobra.Command, args []string) {
 			}
 		} else if CfgGlobal.GetGitHubSearchFlag() {
 
-			fmt.Println("\n   L I S T   G I T H U B   P R O J E C T S   F R O M   S E A R C H  : " + CfgGlobal.GetListCmd().GitHubSearch)
-			fmt.Println(utils.CreateLine(11))
+			color.Green.Println("\n   L I S T   G I T H U B   P R O J E C T S   F R O M   S E A R C H  : " + CfgGlobal.GetListCmd().GitHubSearch)
+			color.Yellow.Println(utils.CreateLine(15))
 			repos, err := SearchGitHubProjectsfromSearch(CfgGlobal.GetListCmd().GitHubSearch, CfgGlobal.GetGithubTokenEnv())
 			if err != nil {
 				fmt.Println("Error:", err)
@@ -128,7 +128,7 @@ func startList(cmd *cobra.Command, args []string) {
 
 		// print help if no flag is set
 		cmd.Help()
-		fmt.Println(utils.CreateLine(11))
+		color.Yellow.Println(utils.CreateLine(15))
 
 	}
 
diff --git a/config/config.go b/config/config.go
index 94c6845..aeb6f5c 100644
--- a/config/config.go
+++ b/config/config.go
@@ -68,6 +68,9 @@ type EnvCmdConfig struct {
 	EnvVariablesCategory     string
 	EnvVariablesSetFlag      bool
 	EnvVariablesShowAllFlag  bool
+	EnvVariablesKey          string
+	EnvVariablesValue        string
+	EnvVariablesDeleteFlag   bool
 }
 
 // * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -104,24 +107,9 @@ func (c *Config) SetAuthor(value string) {
 	c.author = value
 }
 
-<<<<<<< HEAD
 // Getter for modifDate field
 func (c *Config) GetModifDate() string {
 	return c.ModifDate
-=======
-func GetEnvVariablesFlag() bool {
-	return envVariablesFlag
-}
-
-func SetEnvVariablesFlag(flag bool) {
-	envVariablesFlag = flag
-}
-
-// functions for list command
-// --------------------------
-func SetListOrganisation(name string) {
-	listOrganization = name
->>>>>>> b7ba427 (corr. envVar)
 }
 
 // Setter for modifDate field
@@ -561,6 +549,36 @@ func (c *Config) SetEnvShowAllFlag(value bool) {
 	c.EnvCmd.EnvVariablesShowAllFlag = value
 }
 
+// Getter for env Key
+func (c *Config) GetEnvKey() string {
+	return c.EnvCmd.EnvVariablesKey
+}
+
+// Setter for env Key
+func (c *Config) SetEnvKey(value string) {
+	c.EnvCmd.EnvVariablesKey = value
+}
+
+// Getter for env Value
+func (c *Config) GetEnvValue() string {
+	return c.EnvCmd.EnvVariablesValue
+}
+
+// Setter for env Value
+func (c *Config) SetEnvValue(value string) {
+	c.EnvCmd.EnvVariablesValue = value
+}
+
+// Getter for env Delete flag
+func (c *Config) GetEnvDeleteFlag() bool {
+	return c.EnvCmd.EnvVariablesDeleteFlag
+}
+
+// Setter for env Delete flag
+func (c *Config) SetEnvDeleteFlag(value bool) {
+	c.EnvCmd.EnvVariablesDeleteFlag = value
+}
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 // initialize basic configuration
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -580,11 +598,11 @@ func (c *Config) Init() {
 	c.SetConfigFileYmlName(configFileYmlName)
 
 	// set Github token from environment variable
-	var githubTokenEnv string = utils.GetEnvVarValueFromOsEnv("GITHUB_TOKEN")
+	var githubTokenEnv string = utils.GetGitTokenFromOsEnv()
 	c.SetGithubTokenEnv(githubTokenEnv)
 
 	// set Gitea token from environment variable
-	var giteaTokenEnv string = utils.GetEnvVarValueFromOsEnv("GITEA_TOKEN")
+	var giteaTokenEnv string = utils.GetGitTeaTokenFromOsEnv()
 	c.SetGitTeaTokenEnv(giteaTokenEnv)
 
 	// set verbose flag
@@ -599,6 +617,9 @@ func (c *Config) Init() {
 	// set help flag
 	c.SetHelpFlag(false)
 
+	// set delete flag
+	c.SetEnvDeleteFlag(false)
+
 	// set url base
 	var urlBase string = "https://git.bcmaison.cf"
 	c.SetUrlBase(urlBase)
@@ -829,7 +850,7 @@ func (c *Config) DebugPrintString(str string) {
 func (c *Config) printAllConfiguration() {
 
 	fmt.Println("General Configuration:")
-	fmt.Println("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -")
+	fmt.Println("- - - - - - - - - - - - - - - GIT_TOKEN- - - - - - - - - - - - - - -")
 	fmt.Println("Config: DebugMode: ", c.GetDebugMode())
 	fmt.Println("Config: LogLevel: ", c.GetLogLevel())
 	fmt.Println("config: Author: ", c.GetAuthor())
@@ -874,6 +895,10 @@ func (c *Config) printAllConfiguration() {
 	fmt.Println("config: EnvVariablesCategoryFlag: ", c.GetEnvCategoryFlag())
 	fmt.Println("config: EnvVariablesCategory: ", c.GetEnvCategoryInfo())
 	fmt.Println("config: EnvVariablesSetFlag: ", c.GetEnvSetFlag())
+	fmt.Println("config: EnvVariablesShowAllFlag: ", c.GetEnvShowAllFlag())
+	fmt.Println("config: EnvVariablesKey: ", c.GetEnvKey())
+	fmt.Println("config: EnvVariablesValue: ", c.GetEnvValue())
+	fmt.Println("config: EnvVariablesDeleteFlag: ", c.GetEnvDeleteFlag())
 	fmt.Println("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -")
 
 }
diff --git a/go.mod b/go.mod
index 94e2b0d..52715f1 100644
--- a/go.mod
+++ b/go.mod
@@ -4,7 +4,7 @@ go 1.19
 
 require (
 	github.com/google/go-github v17.0.0+incompatible
-	github.com/gookit/color v1.5.3
+	github.com/gookit/color v1.5.4
 	github.com/joho/godotenv v1.5.1
 	github.com/spf13/cobra v1.7.0
 	golang.org/x/oauth2 v0.9.0
@@ -18,7 +18,7 @@ require (
 	github.com/spf13/pflag v1.0.5 // indirect
 	github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect
 	golang.org/x/net v0.11.0 // indirect
-	golang.org/x/sys v0.9.0 // indirect
+	golang.org/x/sys v0.10.0 // indirect
 	google.golang.org/appengine v1.6.7 // indirect
 	google.golang.org/protobuf v1.28.0 // indirect
 )
diff --git a/go.sum b/go.sum
index 767cfad..9288afa 100644
--- a/go.sum
+++ b/go.sum
@@ -13,6 +13,8 @@ github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD
 github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
 github.com/gookit/color v1.5.3 h1:twfIhZs4QLCtimkP7MOxlF3A0U/5cDPseRT9M/+2SCE=
 github.com/gookit/color v1.5.3/go.mod h1:NUzwzeehUfl7GIb36pqId+UGmRfQcU/WiiyTTeNjHtE=
+github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0=
+github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w=
 github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
 github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
@@ -24,6 +26,7 @@ github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRM
 github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
 github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
 github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
+github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
 github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 h1:QldyIu/L63oPpyvQmHgvgickp1Yw510KJOqX7H24mg8=
 github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
@@ -35,6 +38,8 @@ golang.org/x/oauth2 v0.9.0/go.mod h1:qYgFZaFiu6Wg24azG8bdV52QJXJGbZzIIsRCdVKzbLw
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s=
 golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA=
+golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
diff --git a/install/install.ps1 b/install/install.ps1
new file mode 100644
index 0000000..e69de29
diff --git a/install/install_example_scoop.ps1 b/install/install_example_scoop.ps1
new file mode 100644
index 0000000..a0fdb36
--- /dev/null
+++ b/install/install_example_scoop.ps1
@@ -0,0 +1,697 @@
+# Issue Tracker: https://github.com/ScoopInstaller/Install/issues
+# Unlicense License:
+#
+# This is free and unencumbered software released into the public domain.
+#
+# Anyone is free to copy, modify, publish, use, compile, sell, or
+# distribute this software, either in source code form or as a compiled
+# binary, for any purpose, commercial or non-commercial, and by any
+# means.
+#
+# In jurisdictions that recognize copyright laws, the author or authors
+# of this software dedicate any and all copyright interest in the
+# software to the public domain. We make this dedication for the benefit
+# of the public at large and to the detriment of our heirs and
+# successors. We intend this dedication to be an overt act of
+# relinquishment in perpetuity of all present and future rights to this
+# software under copyright law.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# For more information, please refer to 
+
+<#
+.SYNOPSIS
+    Scoop installer.
+.DESCRIPTION
+    The installer of Scoop. For details please check the website and wiki.
+.PARAMETER ScoopDir
+    Specifies Scoop root path.
+    If not specified, Scoop will be installed to '$env:USERPROFILE\scoop'.
+.PARAMETER ScoopGlobalDir
+    Specifies directory to store global apps.
+    If not specified, global apps will be installed to '$env:ProgramData\scoop'.
+.PARAMETER ScoopCacheDir
+    Specifies cache directory.
+    If not specified, caches will be downloaded to '$ScoopDir\cache'.
+.PARAMETER NoProxy
+    Bypass system proxy during the installation.
+.PARAMETER Proxy
+    Specifies proxy to use during the installation.
+.PARAMETER ProxyCredential
+    Specifies credential for the given proxy.
+.PARAMETER ProxyUseDefaultCredentials
+    Use the credentials of the current user for the proxy server that is specified by the -Proxy parameter.
+.PARAMETER RunAsAdmin
+    Force to run the installer as administrator.
+.LINK
+    https://scoop.sh
+.LINK
+    https://github.com/ScoopInstaller/Scoop/wiki
+#>
+param(
+    [String] $ScoopDir,
+    [String] $ScoopGlobalDir,
+    [String] $ScoopCacheDir,
+    [Switch] $NoProxy,
+    [Uri] $Proxy,
+    [System.Management.Automation.PSCredential] $ProxyCredential,
+    [Switch] $ProxyUseDefaultCredentials,
+    [Switch] $RunAsAdmin
+)
+
+# Disable StrictMode in this script
+Set-StrictMode -Off
+
+function Write-InstallInfo {
+    param(
+        [Parameter(Mandatory = $True, Position = 0)]
+        [String] $String,
+        [Parameter(Mandatory = $False, Position = 1)]
+        [System.ConsoleColor] $ForegroundColor = $host.UI.RawUI.ForegroundColor
+    )
+
+    $backup = $host.UI.RawUI.ForegroundColor
+
+    if ($ForegroundColor -ne $host.UI.RawUI.ForegroundColor) {
+        $host.UI.RawUI.ForegroundColor = $ForegroundColor
+    }
+
+    Write-Output "$String"
+
+    $host.UI.RawUI.ForegroundColor = $backup
+}
+
+function Deny-Install {
+    param(
+        [String] $message,
+        [Int] $errorCode = 1
+    )
+
+    Write-InstallInfo -String $message -ForegroundColor DarkRed
+    Write-InstallInfo "Abort."
+
+    # Don't abort if invoked with iex that would close the PS session
+    if ($IS_EXECUTED_FROM_IEX) {
+        break
+    } else {
+        exit $errorCode
+    }
+}
+
+function Test-ValidateParameter {
+    if ($null -eq $Proxy -and ($null -ne $ProxyCredential -or $ProxyUseDefaultCredentials)) {
+        Deny-Install "Provide a valid proxy URI for the -Proxy parameter when using the -ProxyCredential or -ProxyUseDefaultCredentials."
+    }
+
+    if ($ProxyUseDefaultCredentials -and $null -ne $ProxyCredential) {
+        Deny-Install "ProxyUseDefaultCredentials is conflict with ProxyCredential. Don't use the -ProxyCredential and -ProxyUseDefaultCredentials together."
+    }
+}
+
+function Test-IsAdministrator {
+    return ([Security.Principal.WindowsPrincipal]`
+            [Security.Principal.WindowsIdentity]::GetCurrent()`
+    ).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) -and $env:USERNAME -ne 'WDAGUtilityAccount'
+}
+
+function Test-Prerequisite {
+    # Scoop requires PowerShell 5 at least
+    if (($PSVersionTable.PSVersion.Major) -lt 5) {
+        Deny-Install "PowerShell 5 or later is required to run Scoop. Go to https://microsoft.com/powershell to get the latest version of PowerShell."
+    }
+
+    # Scoop requires TLS 1.2 SecurityProtocol, which exists in .NET Framework 4.5+
+    if ([System.Enum]::GetNames([System.Net.SecurityProtocolType]) -notcontains 'Tls12') {
+        Deny-Install "Scoop requires .NET Framework 4.5+ to work. Go to https://microsoft.com/net/download to get the latest version of .NET Framework."
+    }
+
+    # Ensure Robocopy.exe is accessible
+    if (!(Test-CommandAvailable('robocopy'))) {
+        Deny-Install "Scoop requires 'C:\Windows\System32\Robocopy.exe' to work. Please make sure 'C:\Windows\System32' is in your PATH."
+    }
+
+    # Detect if RunAsAdministrator, there is no need to run as administrator when installing Scoop.
+    if (!$RunAsAdmin -and (Test-IsAdministrator)) {
+        Deny-Install "Running the installer as administrator is disabled by default, see https://github.com/ScoopInstaller/Install#for-admin for details."
+    }
+
+    # Show notification to change execution policy
+    $allowedExecutionPolicy = @('Unrestricted', 'RemoteSigned', 'ByPass')
+    if ((Get-ExecutionPolicy).ToString() -notin $allowedExecutionPolicy) {
+        Deny-Install "PowerShell requires an execution policy in [$($allowedExecutionPolicy -join ", ")] to run Scoop. For example, to set the execution policy to 'RemoteSigned' please run 'Set-ExecutionPolicy RemoteSigned -Scope CurrentUser'."
+    }
+
+    # Test if scoop is installed, by checking if scoop command exists.
+    if (Test-CommandAvailable('scoop')) {
+        Deny-Install "Scoop is already installed. Run 'scoop update' to get the latest version."
+    }
+}
+
+function Optimize-SecurityProtocol {
+    # .NET Framework 4.7+ has a default security protocol called 'SystemDefault',
+    # which allows the operating system to choose the best protocol to use.
+    # If SecurityProtocolType contains 'SystemDefault' (means .NET4.7+ detected)
+    # and the value of SecurityProtocol is 'SystemDefault', just do nothing on SecurityProtocol,
+    # 'SystemDefault' will use TLS 1.2 if the webrequest requires.
+    $isNewerNetFramework = ([System.Enum]::GetNames([System.Net.SecurityProtocolType]) -contains 'SystemDefault')
+    $isSystemDefault = ([System.Net.ServicePointManager]::SecurityProtocol.Equals([System.Net.SecurityProtocolType]::SystemDefault))
+
+    # If not, change it to support TLS 1.2
+    if (!($isNewerNetFramework -and $isSystemDefault)) {
+        # Set to TLS 1.2 (3072), then TLS 1.1 (768), and TLS 1.0 (192). Ssl3 has been superseded,
+        # https://docs.microsoft.com/en-us/dotnet/api/system.net.securityprotocoltype?view=netframework-4.5
+        [System.Net.ServicePointManager]::SecurityProtocol = 3072 -bor 768 -bor 192
+        Write-Verbose "SecurityProtocol has been updated to support TLS 1.2"
+    }
+}
+
+function Get-Downloader {
+    $downloadSession = New-Object System.Net.WebClient
+
+    # Set proxy to null if NoProxy is specificed
+    if ($NoProxy) {
+        $downloadSession.Proxy = $null
+    } elseif ($Proxy) {
+        # Prepend protocol if not provided
+        if (!$Proxy.IsAbsoluteUri) {
+            $Proxy = New-Object System.Uri("http://" + $Proxy.OriginalString)
+        }
+
+        $Proxy = New-Object System.Net.WebProxy($Proxy)
+
+        if ($null -ne $ProxyCredential) {
+            $Proxy.Credentials = $ProxyCredential.GetNetworkCredential()
+        } elseif ($ProxyUseDefaultCredentials) {
+            $Proxy.UseDefaultCredentials = $true
+        }
+
+        $downloadSession.Proxy = $Proxy
+    }
+
+    return $downloadSession
+}
+
+function Test-isFileLocked {
+    param(
+        [String] $path
+    )
+
+    $file = New-Object System.IO.FileInfo $path
+
+    if (!(Test-Path $path)) {
+        return $false
+    }
+
+    try {
+        $stream = $file.Open(
+            [System.IO.FileMode]::Open,
+            [System.IO.FileAccess]::ReadWrite,
+            [System.IO.FileShare]::None
+        )
+        if ($stream) {
+            $stream.Close()
+        }
+        return $false
+    } catch {
+        # The file is locked by a process.
+        return $true
+    }
+}
+
+function Expand-ZipArchive {
+    param(
+        [String] $path,
+        [String] $to
+    )
+
+    if (!(Test-Path $path)) {
+        Deny-Install "Unzip failed: can't find $path to unzip."
+    }
+
+    # Check if the zip file is locked, by antivirus software for example
+    $retries = 0
+    while ($retries -le 10) {
+        if ($retries -eq 10) {
+            Deny-Install "Unzip failed: can't unzip because a process is locking the file."
+        }
+        if (Test-isFileLocked $path) {
+            Write-InstallInfo "Waiting for $path to be unlocked by another process... ($retries/10)"
+            $retries++
+            Start-Sleep -Seconds 2
+        } else {
+            break
+        }
+    }
+
+    # Workaround to suspend Expand-Archive verbose output,
+    # upstream issue: https://github.com/PowerShell/Microsoft.PowerShell.Archive/issues/98
+    $oldVerbosePreference = $VerbosePreference
+    $global:VerbosePreference = 'SilentlyContinue'
+
+    # Disable progress bar to gain performance
+    $oldProgressPreference = $ProgressPreference
+    $global:ProgressPreference = 'SilentlyContinue'
+
+    # PowerShell 5+: use Expand-Archive to extract zip files
+    Microsoft.PowerShell.Archive\Expand-Archive -Path $path -DestinationPath $to -Force
+    $global:VerbosePreference = $oldVerbosePreference
+    $global:ProgressPreference = $oldProgressPreference
+}
+
+function Out-UTF8File {
+    param(
+        [Parameter(Mandatory = $True, Position = 0)]
+        [Alias("Path")]
+        [String] $FilePath,
+        [Switch] $Append,
+        [Switch] $NoNewLine,
+        [Parameter(ValueFromPipeline = $True)]
+        [PSObject] $InputObject
+    )
+    process {
+        if ($Append) {
+            [System.IO.File]::AppendAllText($FilePath, $InputObject)
+        } else {
+            if (!$NoNewLine) {
+                # Ref: https://stackoverflow.com/questions/5596982
+                # Performance Note: `WriteAllLines` throttles memory usage while
+                # `WriteAllText` needs to keep the complete string in memory.
+                [System.IO.File]::WriteAllLines($FilePath, $InputObject)
+            } else {
+                # However `WriteAllText` does not add ending newline.
+                [System.IO.File]::WriteAllText($FilePath, $InputObject)
+            }
+        }
+    }
+}
+
+function Import-ScoopShim {
+    Write-InstallInfo "Creating shim..."
+    # The scoop executable
+    $path = "$SCOOP_APP_DIR\bin\scoop.ps1"
+
+    if (!(Test-Path $SCOOP_SHIMS_DIR)) {
+        New-Item -Type Directory $SCOOP_SHIMS_DIR | Out-Null
+    }
+
+    # The scoop shim
+    $shim = "$SCOOP_SHIMS_DIR\scoop"
+
+    # Convert to relative path
+    Push-Location $SCOOP_SHIMS_DIR
+    $relativePath = Resolve-Path -Relative $path
+    Pop-Location
+    $absolutePath = Resolve-Path $path
+
+    # if $path points to another drive resolve-path prepends .\ which could break shims
+    $ps1text = if ($relativePath -match '^(\.\\)?\w:.*$') {
+        @(
+            "# $absolutePath",
+            "`$path = `"$path`"",
+            "if (`$MyInvocation.ExpectingInput) { `$input | & `$path $arg @args } else { & `$path $arg @args }",
+            "exit `$LASTEXITCODE"
+        )
+    } else {
+        @(
+            "# $absolutePath",
+            "`$path = Join-Path `$PSScriptRoot `"$relativePath`"",
+            "if (`$MyInvocation.ExpectingInput) { `$input | & `$path $arg @args } else { & `$path $arg @args }",
+            "exit `$LASTEXITCODE"
+        )
+    }
+    $ps1text -join "`r`n" | Out-UTF8File "$shim.ps1"
+
+    # make ps1 accessible from cmd.exe
+    @(
+        "@rem $absolutePath",
+        "@echo off",
+        "setlocal enabledelayedexpansion",
+        "set args=%*",
+        ":: replace problem characters in arguments",
+        "set args=%args:`"='%",
+        "set args=%args:(=``(%",
+        "set args=%args:)=``)%",
+        "set invalid=`"='",
+        "if !args! == !invalid! ( set args= )",
+        "where /q pwsh.exe",
+        "if %errorlevel% equ 0 (",
+        "    pwsh -noprofile -ex unrestricted -file `"$absolutePath`" $arg %args%",
+        ") else (",
+        "    powershell -noprofile -ex unrestricted -file `"$absolutePath`" $arg %args%",
+        ")"
+    ) -join "`r`n" | Out-UTF8File "$shim.cmd"
+
+    @(
+        "#!/bin/sh",
+        "# $absolutePath",
+        "if command -v pwsh.exe > /dev/null 2>&1; then",
+        "    pwsh.exe -noprofile -ex unrestricted -file `"$absolutePath`" $arg `"$@`"",
+        "else",
+        "    powershell.exe -noprofile -ex unrestricted -file `"$absolutePath`" $arg `"$@`"",
+        "fi"
+    ) -join "`n" | Out-UTF8File $shim -NoNewLine
+}
+
+function Get-Env {
+    param(
+        [String] $name,
+        [Switch] $global
+    )
+
+    $RegisterKey = if ($global) {
+        Get-Item -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager'
+    } else {
+        Get-Item -Path 'HKCU:'
+    }
+
+    $EnvRegisterKey = $RegisterKey.OpenSubKey('Environment')
+    $RegistryValueOption = [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames
+    $EnvRegisterKey.GetValue($name, $null, $RegistryValueOption)
+}
+
+function Publish-Env {
+    if (-not ("Win32.NativeMethods" -as [Type])) {
+        Add-Type -Namespace Win32 -Name NativeMethods -MemberDefinition @"
+[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
+public static extern IntPtr SendMessageTimeout(
+    IntPtr hWnd, uint Msg, UIntPtr wParam, string lParam,
+    uint fuFlags, uint uTimeout, out UIntPtr lpdwResult);
+"@
+    }
+
+    $HWND_BROADCAST = [IntPtr] 0xffff
+    $WM_SETTINGCHANGE = 0x1a
+    $result = [UIntPtr]::Zero
+
+    [Win32.Nativemethods]::SendMessageTimeout($HWND_BROADCAST,
+        $WM_SETTINGCHANGE,
+        [UIntPtr]::Zero,
+        "Environment",
+        2,
+        5000,
+        [ref] $result
+    ) | Out-Null
+}
+
+function Write-Env {
+    param(
+        [String] $name,
+        [String] $val,
+        [Switch] $global
+    )
+
+    $RegisterKey = if ($global) {
+        Get-Item -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager'
+    } else {
+        Get-Item -Path 'HKCU:'
+    }
+
+    $EnvRegisterKey = $RegisterKey.OpenSubKey('Environment', $true)
+    if ($val -eq $null) {
+        $EnvRegisterKey.DeleteValue($name)
+    } else {
+        $RegistryValueKind = if ($val.Contains('%')) {
+            [Microsoft.Win32.RegistryValueKind]::ExpandString
+        } elseif ($EnvRegisterKey.GetValue($name)) {
+            $EnvRegisterKey.GetValueKind($name)
+        } else {
+            [Microsoft.Win32.RegistryValueKind]::String
+        }
+        $EnvRegisterKey.SetValue($name, $val, $RegistryValueKind)
+    }
+    Publish-Env
+}
+
+function Add-ShimsDirToPath {
+    # Get $env:PATH of current user
+    $userEnvPath = Get-Env 'PATH'
+
+    if ($userEnvPath -notmatch [Regex]::Escape($SCOOP_SHIMS_DIR)) {
+        $h = (Get-PSProvider 'FileSystem').Home
+        if (!$h.EndsWith('\')) {
+            $h += '\'
+        }
+
+        if (!($h -eq '\')) {
+            $friendlyPath = "$SCOOP_SHIMS_DIR" -Replace ([Regex]::Escape($h)), "~\"
+            Write-InstallInfo "Adding $friendlyPath to your path."
+        } else {
+            Write-InstallInfo "Adding $SCOOP_SHIMS_DIR to your path."
+        }
+
+        # For future sessions
+        Write-Env 'PATH' "$SCOOP_SHIMS_DIR;$userEnvPath"
+        # For current session
+        $env:PATH = "$SCOOP_SHIMS_DIR;$env:PATH"
+    }
+}
+
+function Use-Config {
+    if (!(Test-Path $SCOOP_CONFIG_FILE)) {
+        return $null
+    }
+
+    try {
+        return (Get-Content $SCOOP_CONFIG_FILE -Raw | ConvertFrom-Json -ErrorAction Stop)
+    } catch {
+        Deny-Install "ERROR loading $SCOOP_CONFIG_FILE`: $($_.Exception.Message)"
+    }
+}
+
+function Add-Config {
+    param (
+        [Parameter(Mandatory = $True, Position = 0)]
+        [String] $Name,
+        [Parameter(Mandatory = $True, Position = 1)]
+        [String] $Value
+    )
+
+    $scoopConfig = Use-Config
+
+    if ($scoopConfig -is [System.Management.Automation.PSObject]) {
+        if ($Value -eq [bool]::TrueString -or $Value -eq [bool]::FalseString) {
+            $Value = [System.Convert]::ToBoolean($Value)
+        }
+        if ($null -eq $scoopConfig.$Name) {
+            $scoopConfig | Add-Member -MemberType NoteProperty -Name $Name -Value $Value
+        } else {
+            $scoopConfig.$Name = $Value
+        }
+    } else {
+        $baseDir = Split-Path -Path $SCOOP_CONFIG_FILE
+        if (!(Test-Path $baseDir)) {
+            New-Item -Type Directory $baseDir | Out-Null
+        }
+
+        $scoopConfig = New-Object PSObject
+        $scoopConfig | Add-Member -MemberType NoteProperty -Name $Name -Value $Value
+    }
+
+    if ($null -eq $Value) {
+        $scoopConfig.PSObject.Properties.Remove($Name)
+    }
+
+    ConvertTo-Json $scoopConfig | Set-Content $SCOOP_CONFIG_FILE -Encoding ASCII
+    return $scoopConfig
+}
+
+function Add-DefaultConfig {
+    # If user-level SCOOP env not defined, save to root_path
+    if (!(Get-Env 'SCOOP')) {
+        if ($SCOOP_DIR -ne "$env:USERPROFILE\scoop") {
+            Write-Verbose "Adding config root_path: $SCOOP_DIR"
+            Add-Config -Name 'root_path' -Value $SCOOP_DIR | Out-Null
+        }
+    }
+
+    # Use system SCOOP_GLOBAL, or set system SCOOP_GLOBAL
+    # with $env:SCOOP_GLOBAL if RunAsAdmin, otherwise save to global_path
+    if (!(Get-Env 'SCOOP_GLOBAL' -global)) {
+        if ((Test-IsAdministrator) -and $env:SCOOP_GLOBAL) {
+            Write-Verbose "Setting System Environment Variable SCOOP_GLOBAL: $env:SCOOP_GLOBAL"
+            [Environment]::SetEnvironmentVariable('SCOOP_GLOBAL', $env:SCOOP_GLOBAL, 'Machine')
+        } else {
+            if ($SCOOP_GLOBAL_DIR -ne "$env:ProgramData\scoop") {
+                Write-Verbose "Adding config global_path: $SCOOP_GLOBAL_DIR"
+                Add-Config -Name 'global_path' -Value $SCOOP_GLOBAL_DIR | Out-Null
+            }
+        }
+    }
+
+    # Use system SCOOP_CACHE, or set system SCOOP_CACHE
+    # with $env:SCOOP_CACHE if RunAsAdmin, otherwise save to cache_path
+    if (!(Get-Env 'SCOOP_CACHE' -global)) {
+        if ((Test-IsAdministrator) -and $env:SCOOP_CACHE) {
+            Write-Verbose "Setting System Environment Variable SCOOP_CACHE: $env:SCOOP_CACHE"
+            [Environment]::SetEnvironmentVariable('SCOOP_CACHE', $env:SCOOP_CACHE, 'Machine')
+        } else {
+            if ($SCOOP_CACHE_DIR -ne "$SCOOP_DIR\cache") {
+                Write-Verbose "Adding config cache_path: $SCOOP_CACHE_DIR"
+                Add-Config -Name 'cache_path' -Value $SCOOP_CACHE_DIR | Out-Null
+            }
+        }
+    }
+
+    # save current datatime to last_update
+    Add-Config -Name 'last_update' -Value ([System.DateTime]::Now.ToString('o')) | Out-Null
+}
+
+function Test-CommandAvailable {
+    param (
+        [Parameter(Mandatory = $True, Position = 0)]
+        [String] $Command
+    )
+    return [Boolean](Get-Command $Command -ErrorAction SilentlyContinue)
+}
+
+function Install-Scoop {
+    Write-InstallInfo "Initializing..."
+    # Validate install parameters
+    Test-ValidateParameter
+    # Check prerequisites
+    Test-Prerequisite
+    # Enable TLS 1.2
+    Optimize-SecurityProtocol
+
+    # Download scoop from GitHub
+    Write-InstallInfo "Downloading ..."
+    $downloader = Get-Downloader
+    [bool]$downloadZipsRequired = $True
+
+    if (Test-CommandAvailable('git')) {
+        $old_https = $env:HTTPS_PROXY
+        $old_http = $env:HTTP_PROXY
+        try {
+            if ($downloader.Proxy) {
+                #define env vars for git when behind a proxy
+                $Env:HTTP_PROXY = $downloader.Proxy.Address
+                $Env:HTTPS_PROXY = $downloader.Proxy.Address
+            }
+            Write-Verbose "Cloning $SCOOP_PACKAGE_GIT_REPO to $SCOOP_APP_DIR"
+            git clone -q $SCOOP_PACKAGE_GIT_REPO $SCOOP_APP_DIR
+            if (-Not $?) {
+                throw "Cloning failed. Falling back to downloading zip files."
+            }
+            Write-Verbose "Cloning $SCOOP_MAIN_BUCKET_GIT_REPO to $SCOOP_MAIN_BUCKET_DIR"
+            git clone -q $SCOOP_MAIN_BUCKET_GIT_REPO $SCOOP_MAIN_BUCKET_DIR
+            if (-Not $?) {
+                throw "Cloning failed. Falling back to downloading zip files."
+            }
+            $downloadZipsRequired = $False
+        } catch {
+            Write-Warning "$($_.Exception.Message)"
+            $Global:LastExitCode = 0
+        } finally {
+            $env:HTTPS_PROXY = $old_https
+            $env:HTTP_PROXY = $old_http
+        }
+    }
+
+    if ($downloadZipsRequired) {
+        # 1. download scoop
+        $scoopZipfile = "$SCOOP_APP_DIR\scoop.zip"
+        if (!(Test-Path $SCOOP_APP_DIR)) {
+            New-Item -Type Directory $SCOOP_APP_DIR | Out-Null
+        }
+        Write-Verbose "Downloading $SCOOP_PACKAGE_REPO to $scoopZipfile"
+        $downloader.downloadFile($SCOOP_PACKAGE_REPO, $scoopZipfile)
+        # 2. download scoop main bucket
+        $scoopMainZipfile = "$SCOOP_MAIN_BUCKET_DIR\scoop-main.zip"
+        if (!(Test-Path $SCOOP_MAIN_BUCKET_DIR)) {
+            New-Item -Type Directory $SCOOP_MAIN_BUCKET_DIR | Out-Null
+        }
+        Write-Verbose "Downloading $SCOOP_MAIN_BUCKET_REPO to $scoopMainZipfile"
+        $downloader.downloadFile($SCOOP_MAIN_BUCKET_REPO, $scoopMainZipfile)
+
+        # Extract files from downloaded zip
+        Write-InstallInfo "Extracting..."
+        # 1. extract scoop
+        $scoopUnzipTempDir = "$SCOOP_APP_DIR\_tmp"
+        Write-Verbose "Extracting $scoopZipfile to $scoopUnzipTempDir"
+        Expand-ZipArchive $scoopZipfile $scoopUnzipTempDir
+        Copy-Item "$scoopUnzipTempDir\scoop-*\*" $SCOOP_APP_DIR -Recurse -Force
+        # 2. extract scoop main bucket
+        $scoopMainUnzipTempDir = "$SCOOP_MAIN_BUCKET_DIR\_tmp"
+        Write-Verbose "Extracting $scoopMainZipfile to $scoopMainUnzipTempDir"
+        Expand-ZipArchive $scoopMainZipfile $scoopMainUnzipTempDir
+        Copy-Item "$scoopMainUnzipTempDir\Main-*\*" $SCOOP_MAIN_BUCKET_DIR -Recurse -Force
+
+        # Cleanup
+        Remove-Item $scoopUnzipTempDir -Recurse -Force
+        Remove-Item $scoopZipfile
+        Remove-Item $scoopMainUnzipTempDir -Recurse -Force
+        Remove-Item $scoopMainZipfile
+    }
+    # Create the scoop shim
+    Import-ScoopShim
+    # Finially ensure scoop shims is in the PATH
+    Add-ShimsDirToPath
+    # Setup initial configuration of Scoop
+    Add-DefaultConfig
+
+    Write-InstallInfo "Scoop was installed successfully!" -ForegroundColor DarkGreen
+    Write-InstallInfo "Type 'scoop help' for instructions."
+}
+
+function Write-DebugInfo {
+    param($BoundArgs)
+
+    Write-Verbose "-------- PSBoundParameters --------"
+    $BoundArgs.GetEnumerator() | ForEach-Object { Write-Verbose $_ }
+    Write-Verbose "-------- Environment Variables --------"
+    Write-Verbose "`$env:USERPROFILE: $env:USERPROFILE"
+    Write-Verbose "`$env:ProgramData: $env:ProgramData"
+    Write-Verbose "`$env:SCOOP: $env:SCOOP"
+    Write-Verbose "`$env:SCOOP_CACHE: $SCOOP_CACHE"
+    Write-Verbose "`$env:SCOOP_GLOBAL: $env:SCOOP_GLOBAL"
+    Write-Verbose "-------- Selected Variables --------"
+    Write-Verbose "SCOOP_DIR: $SCOOP_DIR"
+    Write-Verbose "SCOOP_CACHE_DIR: $SCOOP_CACHE_DIR"
+    Write-Verbose "SCOOP_GLOBAL_DIR: $SCOOP_GLOBAL_DIR"
+    Write-Verbose "SCOOP_CONFIG_HOME: $SCOOP_CONFIG_HOME"
+}
+
+# Prepare variables
+$IS_EXECUTED_FROM_IEX = ($null -eq $MyInvocation.MyCommand.Path)
+
+# Scoop root directory
+$SCOOP_DIR = $ScoopDir, $env:SCOOP, "$env:USERPROFILE\scoop" | Where-Object { -not [String]::IsNullOrEmpty($_) } | Select-Object -First 1
+# Scoop global apps directory
+$SCOOP_GLOBAL_DIR = $ScoopGlobalDir, $env:SCOOP_GLOBAL, "$env:ProgramData\scoop" | Where-Object { -not [String]::IsNullOrEmpty($_) } | Select-Object -First 1
+# Scoop cache directory
+$SCOOP_CACHE_DIR = $ScoopCacheDir, $env:SCOOP_CACHE, "$SCOOP_DIR\cache" | Where-Object { -not [String]::IsNullOrEmpty($_) } | Select-Object -First 1
+# Scoop shims directory
+$SCOOP_SHIMS_DIR = "$SCOOP_DIR\shims"
+# Scoop itself directory
+$SCOOP_APP_DIR = "$SCOOP_DIR\apps\scoop\current"
+# Scoop main bucket directory
+$SCOOP_MAIN_BUCKET_DIR = "$SCOOP_DIR\buckets\main"
+# Scoop config file location
+$SCOOP_CONFIG_HOME = $env:XDG_CONFIG_HOME, "$env:USERPROFILE\.config" | Select-Object -First 1
+$SCOOP_CONFIG_FILE = "$SCOOP_CONFIG_HOME\scoop\config.json"
+
+# TODO: Use a specific version of Scoop and the main bucket
+$SCOOP_PACKAGE_REPO = "https://github.com/ScoopInstaller/Scoop/archive/master.zip"
+$SCOOP_MAIN_BUCKET_REPO = "https://github.com/ScoopInstaller/Main/archive/master.zip"
+
+$SCOOP_PACKAGE_GIT_REPO = "https://github.com/ScoopInstaller/Scoop.git"
+$SCOOP_MAIN_BUCKET_GIT_REPO = "https://github.com/ScoopInstaller/Main.git"
+
+# Quit if anything goes wrong
+$oldErrorActionPreference = $ErrorActionPreference
+$ErrorActionPreference = 'Stop'
+
+# Logging debug info
+Write-DebugInfo $PSBoundParameters
+# Bootstrap function
+Install-Scoop
+
+# Reset $ErrorActionPreference to original value
+$ErrorActionPreference = $oldErrorActionPreference
\ No newline at end of file
diff --git a/kode-creator.go b/kode-creator.go
index 20cb30c..c548e33 100644
--- a/kode-creator.go
+++ b/kode-creator.go
@@ -17,8 +17,8 @@ var CfgGlobal = &config.Config{}
 // rootCmd represents the base command when called without any subcommands
 var rootCmd = &cobra.Command{
 	Use:   "kode-creator.exe",
-	Short: "Simple cli app create startup project",
-	Long:  `A simple CLI app to work with Github, Gitea`,
+	Short: "Simple cli to manage projects development, environment variables develepment tools and more.",
+	Long:  `Simple cli to manage projects development, environment variables develepment tools and more.`,
 	Run: func(cmd *cobra.Command, args []string) {
 
 		mainProgram(cmd, args)
@@ -31,14 +31,17 @@ func init() {
 	CfgGlobal.Init()
 
 	// root menu section
+	// option : debug(d), version(V), help(h)
 	// - - - - - - - - - - -
 	rootCmd.PersistentFlags().BoolVarP(&CfgGlobal.JsonFlag, "json", "j", false, "JSON output format")
-	rootCmd.PersistentFlags().BoolVarP(&CfgGlobal.VerboseFlag, "verbose", "v", false, "VERBOSE mode output")
+	rootCmd.PersistentFlags().BoolVarP(&CfgGlobal.VerboseFlag, "debug", "d", false, "Debug mode output")
 	rootCmd.Flags().BoolVarP(&CfgGlobal.VersionFlag, "version", "V", false, "Show VERSION of "+CfgGlobal.GetApplicationName())
 	rootCmd.Flags().BoolP("help", "h", false, "Show help for "+CfgGlobal.GetApplicationName())
 	rootCmd.CompletionOptions.DisableDefaultCmd = true
 	rootCmd.Flags().SortFlags = false
+
 	// List menu section
+	// option : git(g), tea(a), search(s), user(u), org(o)
 	// - - - - - - - - - - -
 	cmdLists.ListCmd.Flags().StringVarP(&CfgGlobal.TokenEnv, "token", "t", "", "TOKEN for Gitea or Github")
 	cmdLists.ListCmd.Flags().BoolVarP(&CfgGlobal.ListCmd.GitFlag, "git", "g", false, "List all repositories from GITHUB")
@@ -49,6 +52,7 @@ func init() {
 	cmdLists.ListCmd.Flags().SortFlags = false
 
 	// Create menu section (create project directories structure, init git, Github or Gitea repository, create README.md template )
+	// option : name(n), desc(d), struc(s), control(c), readme(r), token(t), org(o), private(p)
 	// - - - - - - - - - - - - - - - - - - -
 	// project informations
 	cmdCreate.CreateCmd.Flags().StringVarP(&CfgGlobal.CreateCmd.Name, "name", "n", "", "NAME of the Project")
@@ -66,14 +70,20 @@ func init() {
 	cmdCreate.CreateCmd.Flags().SortFlags = false
 
 	// Env menu section
+	// option : group(g), list(l), filter(f), yml(y), cat(c), set(s), key(k), value(v), all(a)
 	// - - - - - - - - - - -
-	cmdEnv.EnvCmd.Flags().BoolVarP(&CfgGlobal.EnvCmd.EnvVariablesFlag, "group", "g", false, "GROUP environnement variables by categories")
-	cmdEnv.EnvCmd.Flags().BoolVarP(&CfgGlobal.EnvCmd.EnvVariablesListFlag, "list", "l", false, "LIST environnement variables")
-	cmdEnv.EnvCmd.Flags().StringVarP(&CfgGlobal.EnvCmd.EnvVariablesFilter, "filter", "f", "", "HIGHLIGHT a specific word in environnement variables")
-	cmdEnv.EnvCmd.Flags().BoolVarP(&CfgGlobal.EnvCmd.EnvVariablesYmlFlag, "yml", "y", false, "YAML List environnement variables from config.yml")
-	cmdEnv.EnvCmd.Flags().StringVarP(&CfgGlobal.EnvCmd.EnvVariablesCategory, "cat", "c", "", "FILTER for a specific category")
-	cmdEnv.EnvCmd.Flags().BoolVarP(&CfgGlobal.EnvCmd.EnvVariablesSetFlag, "set", "s", false, "Set environnement variable available from config.yml")
-	cmdEnv.EnvCmd.Flags().BoolVarP(&CfgGlobal.EnvCmd.EnvVariablesShowAllFlag, "all", "a", false, "Show all environnement variables")
+
+	cmdEnv.EnvCmd.Flags().BoolVarP(&CfgGlobal.EnvCmd.EnvVariablesListFlag, "list", "l", false, "==> LIST environnement variables")
+	cmdEnv.EnvCmd.Flags().StringVarP(&CfgGlobal.EnvCmd.EnvVariablesFilter, "filter", "f", "", "(LIST) HIGHLIGHT a specific word in environnement variables")
+	cmdEnv.EnvCmd.Flags().BoolVarP(&CfgGlobal.EnvCmd.EnvVariablesSetFlag, "set", "s", false, "CREATE or modified environnement variable available from config.yml")
+	// delete environnement variable flag
+	cmdEnv.EnvCmd.Flags().BoolVarP(&CfgGlobal.EnvCmd.EnvVariablesDeleteFlag, "DEL", "D", false, "DELETE environnement variable from config.yml")
+	cmdEnv.EnvCmd.Flags().StringVarP(&CfgGlobal.EnvCmd.EnvVariablesKey, "key", "k", "", "(MODIF) create a KEY for environnement variable")
+	cmdEnv.EnvCmd.Flags().StringVarP(&CfgGlobal.EnvCmd.EnvVariablesValue, "value", "v", "", "(MODIF) create a VALUE for environnement variable")
+	cmdEnv.EnvCmd.Flags().BoolVarP(&CfgGlobal.EnvCmd.EnvVariablesYmlFlag, "yml", "y", false, "==> YAML List environnement variables from config.yml")
+	cmdEnv.EnvCmd.Flags().BoolVarP(&CfgGlobal.EnvCmd.EnvVariablesFlag, "group", "g", false, "(YAML) GROUP environnement variables by categories")
+	cmdEnv.EnvCmd.Flags().StringVarP(&CfgGlobal.EnvCmd.EnvVariablesCategory, "cat", "c", "", "(YAML) FILTER for a specific category")
+	// cmdEnv.EnvCmd.Flags().BoolVarP(&CfgGlobal.EnvCmd.EnvVariablesShowAllFlag, "all", "a", false, "Show all environnement variables")
 	cmdEnv.EnvCmd.Flags().SortFlags = false
 
 	// Add subcommands
@@ -116,7 +126,8 @@ func main() {
 	cmdEnv.InitConfig(CfgGlobal)
 
 	// set debug mode
-	CfgGlobal.SetDebugMode(true)
+	// CfgGlobal.SetDebugMode(true)
+	CfgGlobal.SetDebugMode(false)
 	CfgGlobal.DebugPrintConfig("Function main")
 
 	// execute root command
diff --git a/readme.md b/readme.md
index 4cff443..907bddf 100644
--- a/readme.md
+++ b/readme.md
@@ -73,10 +73,28 @@ You can set the following environment variables:
 (Github Token from Github)[ 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 ]
 
 ## TODO
+### create github project
+- [  ] Create a Github project
+
+
+### Manage environment variables
+- [x] Commanand to list and filter environment variables 
+  - [x] ex: .\kode-creator.exe env -l
+  - [x] ex: .\kode-creator.exe env -l -f "jdk"
+
+### LIST Github, Gitea orgs, project
+- [x] Command to list Github orgs and repos
+  - [x] ex: .\kode-creator.exe list -t  -o 
+- [ ] Command to list Gitea orgs and repos
+  - [ ] ex: .\kode-creator.exe list -t  -o 
+- [ ] Command to list Github orgs and repos
+  - [ ] ex: .\kode-creator.exe list -t  -o 
+
+
 - add fonctionnalities to .bachrc file
   - show .bashrc file
   - add export variables configure in your yaml config
 
-##License
+## License
 
 MIT License.
\ No newline at end of file
diff --git a/utils/utils.go b/utils/utils.go
index 4ed0887..2c8952e 100644
--- a/utils/utils.go
+++ b/utils/utils.go
@@ -60,7 +60,12 @@ func GetEnvVarValueFromOsEnv(key string) string {
 }
 
 func GetGitTokenFromOsEnv() string {
-	token := os.Getenv("GIT_TOKEN")
+	token := os.Getenv("GITHUB_TOKEN")
+	return token
+}
+
+func GetGitTeaTokenFromOsEnv() string {
+	token := os.Getenv("GITEA_TOKEN")
 	return token
 }
 
@@ -171,3 +176,13 @@ func GetProgramDir() string {
 
 	return exPath
 }
+
+// function check if  OS = Windows
+func IsWindows() bool {
+	return os.PathSeparator == '\\' && os.PathListSeparator == ';'
+}
+
+// function check if  OS = Linux
+func IsLinux() bool {
+	return os.PathSeparator == '/' && os.PathListSeparator == ':'
+}
diff --git a/version/version-number.go b/version/version-number.go
index 4bd8904..8d1c03e 100644
--- a/version/version-number.go
+++ b/version/version-number.go
@@ -15,7 +15,7 @@ type Version struct {
 
 // version variable that will be set at build time by versionManager.exe
 // *** DO NOT EDIT ***
-var versionNumber Version = Version{0, 0, 0, 42}
+var versionNumber Version = Version{0, 0, 0, 44}
 
 // GetFullVersion returns the full version number as a string
 func GetFullVersion() string {