Repository: cogentcore/core
Pull request #1593 (2025-07-16 22:17:01)

Move core command to root for easier installation
This PR moves the `core` command to the root of the repository for easier installation. Installing now requires this command, which the docs have been updated to reflect:

```
go install cogentcore.org/core@main
```

This PR also reorganizes the structure of the cmd packages to reduce unnecessary nesting of folders.


Patch:
diff --git a/.github/workflows/core.yml b/.github/workflows/core.yml
index f7df8f221..9458c4ab9 100644
--- a/.github/workflows/core.yml
+++ b/.github/workflows/core.yml
@@ -40,7 +40,7 @@ jobs:
           go-version: '1.23.4'
 
       - name: Install Core
-        run: go install ./cmd/core
+        run: go install
 
       - name: Build Docs
         run: core build web -dir docs -o static -vanity-url cogentcore.org/core -github-vanity-repository cogentcore/core
diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml
index 99398318d..5c7274803 100644
--- a/.github/workflows/go.yml
+++ b/.github/workflows/go.yml
@@ -26,7 +26,7 @@ jobs:
         go-version: '1.23.4'
 
     - name: Set up Core
-      run: go install ./cmd/core && core setup
+      run: go install && core setup
 
     - name: "Install video dependencies (TODO: move to a command)"
       run: sudo add-apt-repository ppa:savoury1/ffmpeg4 && sudo apt install libswscale-dev libavcodec-dev libavformat-dev libswresample-dev libavutil-dev libasound2-dev
diff --git a/cmd/core/core.go b/cmd.go
similarity index 85%
rename from cmd/core/core.go
rename to cmd.go
index c7adb53ed..aa5d33a67 100644
--- a/cmd/core/core.go
+++ b/cmd.go
@@ -8,9 +8,9 @@ package main
 
 import (
 	"cogentcore.org/core/cli"
-	"cogentcore.org/core/cmd/core/cmd"
-	"cogentcore.org/core/cmd/core/config"
-	"cogentcore.org/core/cmd/core/generate"
+	"cogentcore.org/core/cmd"
+	"cogentcore.org/core/cmd/config"
+	"cogentcore.org/core/cmd/generate"
 )
 
 func main() {
diff --git a/cmd/core/cmd/build.go b/cmd/build.go
similarity index 95%
rename from cmd/core/cmd/build.go
rename to cmd/build.go
index 614fe40a8..7c742bebc 100644
--- a/cmd/core/cmd/build.go
+++ b/cmd/build.go
@@ -15,9 +15,9 @@ import (
 	"path/filepath"
 
 	"cogentcore.org/core/base/exec"
-	"cogentcore.org/core/cmd/core/config"
-	"cogentcore.org/core/cmd/core/mobile"
-	"cogentcore.org/core/cmd/core/web"
+	"cogentcore.org/core/cmd/config"
+	"cogentcore.org/core/cmd/mobile"
+	"cogentcore.org/core/cmd/web"
 )
 
 // Build builds an executable for the package
diff --git a/cmd/core/cmd/changed.go b/cmd/changed.go
similarity index 97%
rename from cmd/core/cmd/changed.go
rename to cmd/changed.go
index 6afb0b893..86b569ffa 100644
--- a/cmd/core/cmd/changed.go
+++ b/cmd/changed.go
@@ -15,7 +15,7 @@ import (
 
 	"cogentcore.org/core/base/exec"
 	"cogentcore.org/core/base/logx"
-	"cogentcore.org/core/cmd/core/config"
+	"cogentcore.org/core/cmd/config"
 )
 
 // Changed concurrently prints all of the repositories within this directory
diff --git a/cmd/core/config/config.go b/cmd/config/config.go
similarity index 100%
rename from cmd/core/config/config.go
rename to cmd/config/config.go
diff --git a/cmd/core/config/platform.go b/cmd/config/platform.go
similarity index 100%
rename from cmd/core/config/platform.go
rename to cmd/config/platform.go
diff --git a/cmd/config/typegen.go b/cmd/config/typegen.go
new file mode 100644
index 000000000..0daa41fef
--- /dev/null
+++ b/cmd/config/typegen.go
@@ -0,0 +1,19 @@
+// Code generated by "core generate"; DO NOT EDIT.
+
+package config
+
+import (
+	"cogentcore.org/core/types"
+)
+
+var _ = types.AddType(&types.Type{Name: "cogentcore.org/core/cmd/config.Config", IDName: "config", Doc: "Config is the main config struct that contains all of the configuration\noptions for the Cogent Core command line tool.", Directives: []types.Directive{{Tool: "types", Directive: "add"}}, Fields: []types.Field{{Name: "Name", Doc: "Name is the user-friendly name of the project.\nThe default is based on the current directory name."}, {Name: "NamePrefix", Doc: "NamePrefix is the prefix to add to the default name of the project\nand any projects nested below it. A separating space is automatically included."}, {Name: "ID", Doc: "ID is the bundle / package ID to use for the project\n(required for building for mobile platforms and packaging\nfor desktop platforms). It is typically in the format com.org.app\n(eg: com.cogent.mail). It defaults to com.parentDirectory.currentDirectory."}, {Name: "About", Doc: "About is the about information for the project, which can be viewed via\nthe \"About\" button in the app bar. It is also used when packaging the app."}, {Name: "Version", Doc: "the version of the project to release"}, {Name: "Content", Doc: "Content, if specified, indicates that the app has core content pages\nlocated at this directory. If so, a directory tree will be made for all\nof the pages when building for platform web. This defaults to \"content\"\nwhen building an app for platform web that imports content."}, {Name: "Build", Doc: "the configuration options for the build, install, run, and pack commands"}, {Name: "Pack", Doc: "the configuration information for the pack command"}, {Name: "Web", Doc: "the configuration information for web"}, {Name: "Log", Doc: "the configuration options for the log and run commands"}, {Name: "Generate", Doc: "the configuration options for the generate command"}}})
+
+var _ = types.AddType(&types.Type{Name: "cogentcore.org/core/cmd/config.Build", IDName: "build", Directives: []types.Directive{{Tool: "types", Directive: "add"}}, Fields: []types.Field{{Name: "Target", Doc: "the target platforms to build executables for"}, {Name: "Dir", Doc: "Dir is the directory to build the app from.\nIt defaults to the current directory."}, {Name: "Output", Doc: "Output is the directory to output the built app to.\nIt defaults to the current directory for desktop executables\nand \"bin/{platform}\" for all other platforms and command \"pack\"."}, {Name: "Debug", Doc: "Debug is whether to build/run the app in debug mode, which sets\nthe \"debug\" tag when building and prevents the default stripping\nof debug symbols. On iOS and Android, this also prints the program output."}, {Name: "Ldflags", Doc: "Ldflags are optional additional linker flags to pass to go build commands."}, {Name: "Trimpath", Doc: "Trimpath is whether to replace file system paths with module paths\nin the resulting executable. It is on by default for commands other\nthan core run."}, {Name: "Windowsgui", Doc: "Windowsgui is whether to make this a \"Windows GUI\" application that\nopens without a terminal window on Windows. It is on by default for\ncommands other than core run."}, {Name: "IOSVersion", Doc: "the minimum version of the iOS SDK to compile against"}, {Name: "AndroidMinSDK", Doc: "the minimum supported Android SDK (uses-sdk/android:minSdkVersion in AndroidManifest.xml)"}, {Name: "AndroidTargetSDK", Doc: "the target Android SDK version (uses-sdk/android:targetSdkVersion in AndroidManifest.xml)"}}})
+
+var _ = types.AddType(&types.Type{Name: "cogentcore.org/core/cmd/config.Pack", IDName: "pack", Directives: []types.Directive{{Tool: "types", Directive: "add"}}, Fields: []types.Field{{Name: "DMG", Doc: "whether to build a .dmg file on macOS in addition to a .app file.\nThis is automatically disabled for the install command."}}})
+
+var _ = types.AddType(&types.Type{Name: "cogentcore.org/core/cmd/config.Log", IDName: "log", Directives: []types.Directive{{Tool: "types", Directive: "add"}}, Fields: []types.Field{{Name: "Target", Doc: "the target platform to view the logs for (ios or android)"}, {Name: "Keep", Doc: "whether to keep the previous log messages or clear them"}, {Name: "All", Doc: "messages not generated from your app equal to or above this log level will be shown"}}})
+
+var _ = types.AddType(&types.Type{Name: "cogentcore.org/core/cmd/config.Generate", IDName: "generate", Directives: []types.Directive{{Tool: "types", Directive: "add"}}, Fields: []types.Field{{Name: "Enumgen", Doc: "the enum generation configuration options passed to enumgen"}, {Name: "Typegen", Doc: "the generation configuration options passed to typegen"}, {Name: "Dir", Doc: "the source directory to run generate on (can be multiple through ./...)"}, {Name: "Icons", Doc: "Icons, if specified, indicates to generate an icongen.go file with\nicon variables for the icon svg files in the specified folder."}}})
+
+var _ = types.AddType(&types.Type{Name: "cogentcore.org/core/cmd/config.Web", IDName: "web", Doc: "Web containts the configuration information for building for web and creating\nthe HTML page that loads a Go wasm app and its resources.", Directives: []types.Directive{{Tool: "types", Directive: "add"}}, Fields: []types.Field{{Name: "Port", Doc: "Port is the port to serve the page at when using the serve command."}, {Name: "RandomVersion", Doc: "RandomVersion is whether to make the app worker version random.\nIt is enabled by default and should be kept on for easy deployment."}, {Name: "Gzip", Doc: "Gzip is whether to gzip the app.wasm file that is built in the build command\nand serve it as a gzip-encoded file in the run command."}, {Name: "GenerateHTML", Doc: "GenerateHTML is whether to generate an HTML version of app content for\npreview and SEO purposes."}, {Name: "Lang", Doc: "The page language.\n\nDEFAULT: en."}, {Name: "Author", Doc: "The page authors."}, {Name: "Keywords", Doc: "The page keywords."}, {Name: "Image", Doc: "The path of the default image that is used by social networks when\nlinking the app."}, {Name: "Styles", Doc: "Styles is a list of URLs to CSS stylesheets that are loaded in the HTML page.\nThis is often used for custom fonts; see https://cogentcore.org/core/font."}, {Name: "AutoUpdateInterval", Doc: "The interval between each app auto-update while running in a web browser.\nZero or negative values deactivate the auto-update mechanism. The auto-update\nmechanism updates the WASM file for the app from the server if it has changed.\n\nDefault is 10 seconds."}, {Name: "VanityURL", Doc: "If specified, make this page a Go import vanity URL with this\nmodule URL, pointing to the GitHub repository specified by GithubVanityURL\n(eg: cogentcore.org/core)."}, {Name: "GithubVanityRepository", Doc: "If VanityURL is specified, the underlying GitHub repository for the vanity URL\n(eg: cogentcore/core)."}, {Name: "Env", Doc: "The environment variables that are passed to the progressive web app.\n\nReserved keys:\n- GOAPP_STATIC_RESOURCES_URL"}, {Name: "WasmContentLengthHeader", Doc: "The HTTP header to retrieve the WebAssembly file content length.\n\nContent length finding falls back to the Content-Length HTTP header when\nno content length is found with the defined header."}}})
diff --git a/cmd/core/config/web.go b/cmd/config/web.go
similarity index 100%
rename from cmd/core/config/web.go
rename to cmd/config/web.go
diff --git a/cmd/core/cmd/typegen.go b/cmd/core/cmd/typegen.go
deleted file mode 100644
index c1b274cdf..000000000
--- a/cmd/core/cmd/typegen.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Code generated by "core generate"; DO NOT EDIT.
-
-package cmd
-
-import (
-	"cogentcore.org/core/types"
-)
-
-var _ = types.AddFunc(&types.Func{Name: "cogentcore.org/core/cmd/core/cmd.Build", Doc: "Build builds an executable for the package\nat the config path for the config platforms.", Directives: []types.Directive{{Tool: "types", Directive: "add"}}, Args: []string{"c"}, Returns: []string{"error"}})
-
-var _ = types.AddFunc(&types.Func{Name: "cogentcore.org/core/cmd/core/cmd.Changed", Doc: "Changed concurrently prints all of the repositories within this directory\nthat have been changed and need to be updated in Git.", Directives: []types.Directive{{Tool: "types", Directive: "add"}}, Args: []string{"c"}, Returns: []string{"error"}})
-
-var _ = types.AddFunc(&types.Func{Name: "cogentcore.org/core/cmd/core/cmd.Install", Doc: "Install installs the package on the local system.\nIt uses the same config info as build.", Directives: []types.Directive{{Tool: "types", Directive: "add"}}, Args: []string{"c"}, Returns: []string{"error"}})
-
-var _ = types.AddFunc(&types.Func{Name: "cogentcore.org/core/cmd/core/cmd.Log", Doc: "Log prints the logs from your app running on Android to the terminal.\nAndroid is the only supported platform for log; use the -debug flag on\nrun for other platforms.", Directives: []types.Directive{{Tool: "types", Directive: "add"}}, Args: []string{"c"}, Returns: []string{"error"}})
-
-var _ = types.AddFunc(&types.Func{Name: "cogentcore.org/core/cmd/core/cmd.Pack", Doc: "Pack builds and packages the app for the target platform.\nFor android, ios, and web, it is equivalent to build.", Directives: []types.Directive{{Tool: "types", Directive: "add"}}, Args: []string{"c"}, Returns: []string{"error"}})
-
-var _ = types.AddFunc(&types.Func{Name: "cogentcore.org/core/cmd/core/cmd.Pull", Doc: "Pull concurrently pulls all of the Git repositories within the current directory.", Directives: []types.Directive{{Tool: "types", Directive: "add"}}, Args: []string{"c"}, Returns: []string{"error"}})
-
-var _ = types.AddFunc(&types.Func{Name: "cogentcore.org/core/cmd/core/cmd.Release", Doc: "Release releases the project with the specified git version tag.", Directives: []types.Directive{{Tool: "types", Directive: "add"}}, Args: []string{"c"}, Returns: []string{"error"}})
-
-var _ = types.AddFunc(&types.Func{Name: "cogentcore.org/core/cmd/core/cmd.NextRelease", Doc: "NextRelease releases the project with the current git version\ntag incremented by one patch version.", Directives: []types.Directive{{Tool: "types", Directive: "add"}}, Args: []string{"c"}, Returns: []string{"error"}})
-
-var _ = types.AddFunc(&types.Func{Name: "cogentcore.org/core/cmd/core/cmd.Run", Doc: "Run builds and runs the config package. It also displays the logs generated\nby the app. It uses the same config info as build.", Directives: []types.Directive{{Tool: "types", Directive: "add"}}, Args: []string{"c"}, Returns: []string{"error"}})
-
-var _ = types.AddFunc(&types.Func{Name: "cogentcore.org/core/cmd/core/cmd.Setup", Doc: "Setup installs platform-specific dependencies for the current platform.\nIt only needs to be called once per system.", Directives: []types.Directive{{Tool: "types", Directive: "add"}}, Args: []string{"c"}, Returns: []string{"error"}})
diff --git a/cmd/core/config/typegen.go b/cmd/core/config/typegen.go
deleted file mode 100644
index c521d0b63..000000000
--- a/cmd/core/config/typegen.go
+++ /dev/null
@@ -1,19 +0,0 @@
-// Code generated by "core generate"; DO NOT EDIT.
-
-package config
-
-import (
-	"cogentcore.org/core/types"
-)
-
-var _ = types.AddType(&types.Type{Name: "cogentcore.org/core/cmd/core/config.Config", IDName: "config", Doc: "Config is the main config struct that contains all of the configuration\noptions for the Cogent Core command line tool.", Directives: []types.Directive{{Tool: "types", Directive: "add"}}, Fields: []types.Field{{Name: "Name", Doc: "Name is the user-friendly name of the project.\nThe default is based on the current directory name."}, {Name: "NamePrefix", Doc: "NamePrefix is the prefix to add to the default name of the project\nand any projects nested below it. A separating space is automatically included."}, {Name: "ID", Doc: "ID is the bundle / package ID to use for the project\n(required for building for mobile platforms and packaging\nfor desktop platforms). It is typically in the format com.org.app\n(eg: com.cogent.mail). It defaults to com.parentDirectory.currentDirectory."}, {Name: "About", Doc: "About is the about information for the project, which can be viewed via\nthe \"About\" button in the app bar. It is also used when packaging the app."}, {Name: "Version", Doc: "the version of the project to release"}, {Name: "Content", Doc: "Content, if specified, indicates that the app has core content pages\nlocated at this directory. If so, a directory tree will be made for all\nof the pages when building for platform web. This defaults to \"content\"\nwhen building an app for platform web that imports content."}, {Name: "Build", Doc: "the configuration options for the build, install, run, and pack commands"}, {Name: "Pack", Doc: "the configuration information for the pack command"}, {Name: "Web", Doc: "the configuration information for web"}, {Name: "Log", Doc: "the configuration options for the log and run commands"}, {Name: "Generate", Doc: "the configuration options for the generate command"}}})
-
-var _ = types.AddType(&types.Type{Name: "cogentcore.org/core/cmd/core/config.Build", IDName: "build", Directives: []types.Directive{{Tool: "types", Directive: "add"}}, Fields: []types.Field{{Name: "Target", Doc: "the target platforms to build executables for"}, {Name: "Dir", Doc: "Dir is the directory to build the app from.\nIt defaults to the current directory."}, {Name: "Output", Doc: "Output is the directory to output the built app to.\nIt defaults to the current directory for desktop executables\nand \"bin/{platform}\" for all other platforms and command \"pack\"."}, {Name: "Debug", Doc: "Debug is whether to build/run the app in debug mode, which sets\nthe \"debug\" tag when building and prevents the default stripping\nof debug symbols. On iOS and Android, this also prints the program output."}, {Name: "Ldflags", Doc: "Ldflags are optional additional linker flags to pass to go build commands."}, {Name: "Trimpath", Doc: "Trimpath is whether to replace file system paths with module paths\nin the resulting executable. It is on by default for commands other\nthan core run."}, {Name: "Windowsgui", Doc: "Windowsgui is whether to make this a \"Windows GUI\" application that\nopens without a terminal window on Windows. It is on by default for\ncommands other than core run."}, {Name: "IOSVersion", Doc: "the minimum version of the iOS SDK to compile against"}, {Name: "AndroidMinSDK", Doc: "the minimum supported Android SDK (uses-sdk/android:minSdkVersion in AndroidManifest.xml)"}, {Name: "AndroidTargetSDK", Doc: "the target Android SDK version (uses-sdk/android:targetSdkVersion in AndroidManifest.xml)"}}})
-
-var _ = types.AddType(&types.Type{Name: "cogentcore.org/core/cmd/core/config.Pack", IDName: "pack", Directives: []types.Directive{{Tool: "types", Directive: "add"}}, Fields: []types.Field{{Name: "DMG", Doc: "whether to build a .dmg file on macOS in addition to a .app file.\nThis is automatically disabled for the install command."}}})
-
-var _ = types.AddType(&types.Type{Name: "cogentcore.org/core/cmd/core/config.Log", IDName: "log", Directives: []types.Directive{{Tool: "types", Directive: "add"}}, Fields: []types.Field{{Name: "Target", Doc: "the target platform to view the logs for (ios or android)"}, {Name: "Keep", Doc: "whether to keep the previous log messages or clear them"}, {Name: "All", Doc: "messages not generated from your app equal to or above this log level will be shown"}}})
-
-var _ = types.AddType(&types.Type{Name: "cogentcore.org/core/cmd/core/config.Generate", IDName: "generate", Directives: []types.Directive{{Tool: "types", Directive: "add"}}, Fields: []types.Field{{Name: "Enumgen", Doc: "the enum generation configuration options passed to enumgen"}, {Name: "Typegen", Doc: "the generation configuration options passed to typegen"}, {Name: "Dir", Doc: "the source directory to run generate on (can be multiple through ./...)"}, {Name: "Icons", Doc: "Icons, if specified, indicates to generate an icongen.go file with\nicon variables for the icon svg files in the specified folder."}}})
-
-var _ = types.AddType(&types.Type{Name: "cogentcore.org/core/cmd/core/config.Web", IDName: "web", Doc: "Web containts the configuration information for building for web and creating\nthe HTML page that loads a Go wasm app and its resources.", Directives: []types.Directive{{Tool: "types", Directive: "add"}}, Fields: []types.Field{{Name: "Port", Doc: "Port is the port to serve the page at when using the serve command."}, {Name: "RandomVersion", Doc: "RandomVersion is whether to make the app worker version random.\nIt is enabled by default and should be kept on for easy deployment."}, {Name: "Gzip", Doc: "Gzip is whether to gzip the app.wasm file that is built in the build command\nand serve it as a gzip-encoded file in the run command."}, {Name: "GenerateHTML", Doc: "GenerateHTML is whether to generate an HTML version of app content for\npreview and SEO purposes."}, {Name: "Lang", Doc: "The page language.\n\nDEFAULT: en."}, {Name: "Author", Doc: "The page authors."}, {Name: "Keywords", Doc: "The page keywords."}, {Name: "Image", Doc: "The path of the default image that is used by social networks when\nlinking the app."}, {Name: "Styles", Doc: "Styles is a list of URLs to CSS stylesheets that are loaded in the HTML page.\nThis is often used for custom fonts; see https://cogentcore.org/core/font."}, {Name: "AutoUpdateInterval", Doc: "The interval between each app auto-update while running in a web browser.\nZero or negative values deactivate the auto-update mechanism. The auto-update\nmechanism updates the WASM file for the app from the server if it has changed.\n\nDefault is 10 seconds."}, {Name: "VanityURL", Doc: "If specified, make this page a Go import vanity URL with this\nmodule URL, pointing to the GitHub repository specified by GithubVanityURL\n(eg: cogentcore.org/core)."}, {Name: "GithubVanityRepository", Doc: "If VanityURL is specified, the underlying GitHub repository for the vanity URL\n(eg: cogentcore/core)."}, {Name: "Env", Doc: "The environment variables that are passed to the progressive web app.\n\nReserved keys:\n- GOAPP_STATIC_RESOURCES_URL"}, {Name: "WasmContentLengthHeader", Doc: "The HTTP header to retrieve the WebAssembly file content length.\n\nContent length finding falls back to the Content-Length HTTP header when\nno content length is found with the defined header."}}})
diff --git a/cmd/core/generate/typegen.go b/cmd/core/generate/typegen.go
deleted file mode 100644
index d702ebbeb..000000000
--- a/cmd/core/generate/typegen.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Code generated by "core generate"; DO NOT EDIT.
-
-package generate
-
-import (
-	"cogentcore.org/core/types"
-)
-
-var _ = types.AddFunc(&types.Func{Name: "cogentcore.org/core/cmd/core/generate.Generate", Doc: "Generate is the main entry point to code generation\nthat does all of the generation according to the\ngiven config info. It overrides the\n[config.Config.Generate.Typegen.InterfaceConfigs] info.", Directives: []types.Directive{{Tool: "types", Directive: "add"}}, Args: []string{"c"}, Returns: []string{"error"}})
diff --git a/cmd/core/generate/generate.go b/cmd/generate/generate.go
similarity index 99%
rename from cmd/core/generate/generate.go
rename to cmd/generate/generate.go
index f603d4680..1e67bdf64 100644
--- a/cmd/core/generate/generate.go
+++ b/cmd/generate/generate.go
@@ -16,7 +16,7 @@ import (
 
 	"cogentcore.org/core/base/generate"
 	"cogentcore.org/core/base/ordmap"
-	"cogentcore.org/core/cmd/core/config"
+	"cogentcore.org/core/cmd/config"
 	"cogentcore.org/core/enums/enumgen"
 	"cogentcore.org/core/types"
 	"cogentcore.org/core/types/typegen"
diff --git a/cmd/core/generate/icons.go b/cmd/generate/icons.go
similarity index 98%
rename from cmd/core/generate/icons.go
rename to cmd/generate/icons.go
index 1053094d6..40607638b 100644
--- a/cmd/core/generate/icons.go
+++ b/cmd/generate/icons.go
@@ -15,7 +15,7 @@ import (
 
 	"cogentcore.org/core/base/generate"
 	"cogentcore.org/core/base/strcase"
-	"cogentcore.org/core/cmd/core/config"
+	"cogentcore.org/core/cmd/config"
 )
 
 // iconData contains the data for an icon
diff --git a/cmd/generate/typegen.go b/cmd/generate/typegen.go
new file mode 100644
index 000000000..aa3d99973
--- /dev/null
+++ b/cmd/generate/typegen.go
@@ -0,0 +1,9 @@
+// Code generated by "core generate"; DO NOT EDIT.
+
+package generate
+
+import (
+	"cogentcore.org/core/types"
+)
+
+var _ = types.AddFunc(&types.Func{Name: "cogentcore.org/core/cmd/generate.Generate", Doc: "Generate is the main entry point to code generation\nthat does all of the generation according to the\ngiven config info. It overrides the\n[config.Config.Generate.Typegen.InterfaceConfigs] info.", Directives: []types.Directive{{Tool: "types", Directive: "add"}}, Args: []string{"c"}, Returns: []string{"error"}})
diff --git a/cmd/core/cmd/install.go b/cmd/install.go
similarity index 94%
rename from cmd/core/cmd/install.go
rename to cmd/install.go
index 554e74eae..690a364a7 100644
--- a/cmd/core/cmd/install.go
+++ b/cmd/install.go
@@ -11,8 +11,8 @@ import (
 	"runtime"
 
 	"cogentcore.org/core/base/exec"
-	"cogentcore.org/core/cmd/core/config"
-	"cogentcore.org/core/cmd/core/mobile"
+	"cogentcore.org/core/cmd/config"
+	"cogentcore.org/core/cmd/mobile"
 )
 
 // Install installs the package on the local system.
diff --git a/cmd/core/cmd/log.go b/cmd/log.go
similarity index 96%
rename from cmd/core/cmd/log.go
rename to cmd/log.go
index aa9688a1f..e7cbf176a 100644
--- a/cmd/core/cmd/log.go
+++ b/cmd/log.go
@@ -9,7 +9,7 @@ import (
 	"fmt"
 
 	"cogentcore.org/core/base/exec"
-	"cogentcore.org/core/cmd/core/config"
+	"cogentcore.org/core/cmd/config"
 )
 
 // Log prints the logs from your app running on Android to the terminal.
diff --git a/cmd/core/mobile/binres/genarsc.go b/cmd/mobile/binres/genarsc.go
similarity index 95%
rename from cmd/core/mobile/binres/genarsc.go
rename to cmd/mobile/binres/genarsc.go
index 9c680f409..0858999a5 100644
--- a/cmd/core/mobile/binres/genarsc.go
+++ b/cmd/mobile/binres/genarsc.go
@@ -17,7 +17,7 @@ import (
 	"os"
 	"strconv"
 
-	"cogentcore.org/core/cmd/core/mobile/binres"
+	"cogentcore.org/core/cmd/mobile/binres"
 )
 
 const tmpl = `// Copyright 2016 The Go Authors.  All rights reserved.
diff --git a/cmd/core/mobile/binres/node.go b/cmd/mobile/binres/node.go
similarity index 100%
rename from cmd/core/mobile/binres/node.go
rename to cmd/mobile/binres/node.go
diff --git a/cmd/core/mobile/binres/pool.go b/cmd/mobile/binres/pool.go
similarity index 100%
rename from cmd/core/mobile/binres/pool.go
rename to cmd/mobile/binres/pool.go
diff --git a/cmd/core/mobile/binres/sdk.go b/cmd/mobile/binres/sdk.go
similarity index 98%
rename from cmd/core/mobile/binres/sdk.go
rename to cmd/mobile/binres/sdk.go
index e63e42648..adbfc068a 100644
--- a/cmd/core/mobile/binres/sdk.go
+++ b/cmd/mobile/binres/sdk.go
@@ -10,7 +10,7 @@ import (
 	"os"
 	"path/filepath"
 
-	"cogentcore.org/core/cmd/core/mobile/sdkpath"
+	"cogentcore.org/core/cmd/mobile/sdkpath"
 )
 
 // MinSDK is the targeted sdk version for support by package binres.
diff --git a/cmd/core/mobile/binres/table.go b/cmd/mobile/binres/table.go
similarity index 100%
rename from cmd/core/mobile/binres/table.go
rename to cmd/mobile/binres/table.go
diff --git a/cmd/core/mobile/binres/testdata/bootstrap-res/mipmap-xxxhdpi/icon.png b/cmd/mobile/binres/testdata/bootstrap-res/mipmap-xxxhdpi/icon.png
similarity index 100%
rename from cmd/core/mobile/binres/testdata/bootstrap-res/mipmap-xxxhdpi/icon.png
rename to cmd/mobile/binres/testdata/bootstrap-res/mipmap-xxxhdpi/icon.png
diff --git a/cmd/core/mobile/binres/testdata/bootstrap.arsc b/cmd/mobile/binres/testdata/bootstrap.arsc
similarity index 100%
rename from cmd/core/mobile/binres/testdata/bootstrap.arsc
rename to cmd/mobile/binres/testdata/bootstrap.arsc
diff --git a/cmd/core/mobile/binres/testdata/bootstrap.bin b/cmd/mobile/binres/testdata/bootstrap.bin
similarity index 100%
rename from cmd/core/mobile/binres/testdata/bootstrap.bin
rename to cmd/mobile/binres/testdata/bootstrap.bin
diff --git a/cmd/core/mobile/binres/testdata/bootstrap.xml b/cmd/mobile/binres/testdata/bootstrap.xml
similarity index 100%
rename from cmd/core/mobile/binres/testdata/bootstrap.xml
rename to cmd/mobile/binres/testdata/bootstrap.xml
diff --git a/cmd/core/mobile/binres/testdata/gen.sh b/cmd/mobile/binres/testdata/gen.sh
similarity index 100%
rename from cmd/core/mobile/binres/testdata/gen.sh
rename to cmd/mobile/binres/testdata/gen.sh
diff --git a/cmd/core/mobile/build.go b/cmd/mobile/build.go
similarity index 99%
rename from cmd/core/mobile/build.go
rename to cmd/mobile/build.go
index 2f0b5d12b..d6cb323cb 100644
--- a/cmd/core/mobile/build.go
+++ b/cmd/mobile/build.go
@@ -24,7 +24,7 @@ import (
 
 	"cogentcore.org/core/base/exec"
 	"cogentcore.org/core/base/logx"
-	"cogentcore.org/core/cmd/core/config"
+	"cogentcore.org/core/cmd/config"
 	"golang.org/x/tools/go/packages"
 )
 
diff --git a/cmd/core/mobile/build_androidapp.go b/cmd/mobile/build_androidapp.go
similarity index 98%
rename from cmd/core/mobile/build_androidapp.go
rename to cmd/mobile/build_androidapp.go
index 1e6aebeb4..796876afa 100644
--- a/cmd/core/mobile/build_androidapp.go
+++ b/cmd/mobile/build_androidapp.go
@@ -21,9 +21,9 @@ import (
 	"cogentcore.org/core/base/elide"
 	"cogentcore.org/core/base/exec"
 	"cogentcore.org/core/base/logx"
-	"cogentcore.org/core/cmd/core/config"
-	"cogentcore.org/core/cmd/core/mobile/binres"
-	"cogentcore.org/core/cmd/core/rendericon"
+	"cogentcore.org/core/cmd/config"
+	"cogentcore.org/core/cmd/mobile/binres"
+	"cogentcore.org/core/cmd/rendericon"
 	"golang.org/x/tools/go/packages"
 )
 
diff --git a/cmd/core/mobile/build_apple.go b/cmd/mobile/build_apple.go
similarity index 99%
rename from cmd/core/mobile/build_apple.go
rename to cmd/mobile/build_apple.go
index 72315bac9..668b5a6d9 100644
--- a/cmd/core/mobile/build_apple.go
+++ b/cmd/mobile/build_apple.go
@@ -16,8 +16,8 @@ import (
 
 	"cogentcore.org/core/base/elide"
 	"cogentcore.org/core/base/exec"
-	"cogentcore.org/core/cmd/core/config"
-	"cogentcore.org/core/cmd/core/rendericon"
+	"cogentcore.org/core/cmd/config"
+	"cogentcore.org/core/cmd/rendericon"
 	"github.com/jackmordaunt/icns/v2"
 	"golang.org/x/tools/go/packages"
 )
diff --git a/cmd/core/mobile/cert.go b/cmd/mobile/cert.go
similarity index 100%
rename from cmd/core/mobile/cert.go
rename to cmd/mobile/cert.go
diff --git a/cmd/core/mobile/cert_test.go b/cmd/mobile/cert_test.go
similarity index 100%
rename from cmd/core/mobile/cert_test.go
rename to cmd/mobile/cert_test.go
diff --git a/cmd/core/mobile/dex.go b/cmd/mobile/dex.go
similarity index 100%
rename from cmd/core/mobile/dex.go
rename to cmd/mobile/dex.go
diff --git a/cmd/core/mobile/env.go b/cmd/mobile/env.go
similarity index 99%
rename from cmd/core/mobile/env.go
rename to cmd/mobile/env.go
index ab8f76a1a..00e64ca61 100644
--- a/cmd/core/mobile/env.go
+++ b/cmd/mobile/env.go
@@ -15,8 +15,8 @@ import (
 
 	"cogentcore.org/core/base/exec"
 	"cogentcore.org/core/base/logx"
-	"cogentcore.org/core/cmd/core/config"
-	"cogentcore.org/core/cmd/core/mobile/sdkpath"
+	"cogentcore.org/core/cmd/config"
+	"cogentcore.org/core/cmd/mobile/sdkpath"
 )
 
 // General mobile build environment. Initialized by envInit.
diff --git a/cmd/core/mobile/gendex.go b/cmd/mobile/gendex.go
similarity index 98%
rename from cmd/core/mobile/gendex.go
rename to cmd/mobile/gendex.go
index eb3cd7735..b1b967dc7 100644
--- a/cmd/core/mobile/gendex.go
+++ b/cmd/mobile/gendex.go
@@ -30,7 +30,7 @@ import (
 	"path/filepath"
 	"strings"
 
-	"cogentcore.org/core/cmd/core/mobile/sdkpath"
+	"cogentcore.org/core/cmd/mobile/sdkpath"
 )
 
 var outfile = flag.String("o", "", "result will be written file")
diff --git a/cmd/core/mobile/install.go b/cmd/mobile/install.go
similarity index 96%
rename from cmd/core/mobile/install.go
rename to cmd/mobile/install.go
index b4f2b6757..6f615ffbe 100644
--- a/cmd/core/mobile/install.go
+++ b/cmd/mobile/install.go
@@ -9,7 +9,7 @@ import (
 	"path/filepath"
 
 	"cogentcore.org/core/base/exec"
-	"cogentcore.org/core/cmd/core/config"
+	"cogentcore.org/core/cmd/config"
 )
 
 // Install installs the app named by the import path on the attached mobile device.
diff --git a/cmd/core/mobile/manifest.go b/cmd/mobile/manifest.go
similarity index 100%
rename from cmd/core/mobile/manifest.go
rename to cmd/mobile/manifest.go
diff --git a/cmd/core/mobile/sdkpath/sdkpath.go b/cmd/mobile/sdkpath/sdkpath.go
similarity index 100%
rename from cmd/core/mobile/sdkpath/sdkpath.go
rename to cmd/mobile/sdkpath/sdkpath.go
diff --git a/cmd/core/mobile/utils.go b/cmd/mobile/utils.go
similarity index 96%
rename from cmd/core/mobile/utils.go
rename to cmd/mobile/utils.go
index 46470b599..ce5f50748 100644
--- a/cmd/core/mobile/utils.go
+++ b/cmd/mobile/utils.go
@@ -10,7 +10,7 @@ import (
 	"strings"
 
 	"cogentcore.org/core/base/exec"
-	"cogentcore.org/core/cmd/core/config"
+	"cogentcore.org/core/cmd/config"
 	"golang.org/x/tools/go/packages"
 )
 
diff --git a/cmd/core/mobile/utils_test.go b/cmd/mobile/utils_test.go
similarity index 100%
rename from cmd/core/mobile/utils_test.go
rename to cmd/mobile/utils_test.go
diff --git a/cmd/core/mobile/writer.go b/cmd/mobile/writer.go
similarity index 100%
rename from cmd/core/mobile/writer.go
rename to cmd/mobile/writer.go
diff --git a/cmd/core/mobile/writer_test.go b/cmd/mobile/writer_test.go
similarity index 100%
rename from cmd/core/mobile/writer_test.go
rename to cmd/mobile/writer_test.go
diff --git a/cmd/core/cmd/pack.go b/cmd/pack.go
similarity index 99%
rename from cmd/core/cmd/pack.go
rename to cmd/pack.go
index 93d706e73..5c1f6497f 100644
--- a/cmd/core/cmd/pack.go
+++ b/cmd/pack.go
@@ -14,8 +14,8 @@ import (
 	"cogentcore.org/core/base/exec"
 	"cogentcore.org/core/base/iox/imagex"
 	"cogentcore.org/core/base/strcase"
-	"cogentcore.org/core/cmd/core/config"
-	"cogentcore.org/core/cmd/core/rendericon"
+	"cogentcore.org/core/cmd/config"
+	"cogentcore.org/core/cmd/rendericon"
 	"github.com/jackmordaunt/icns/v2"
 )
 
diff --git a/cmd/core/cmd/pull.go b/cmd/pull.go
similarity index 95%
rename from cmd/core/cmd/pull.go
rename to cmd/pull.go
index 5fffc8ab8..a5879c1dc 100644
--- a/cmd/core/cmd/pull.go
+++ b/cmd/pull.go
@@ -13,7 +13,7 @@ import (
 	"sync"
 
 	"cogentcore.org/core/base/exec"
-	"cogentcore.org/core/cmd/core/config"
+	"cogentcore.org/core/cmd/config"
 )
 
 // Pull concurrently pulls all of the Git repositories within the current directory.
diff --git a/cmd/core/cmd/registry_notwindows.go b/cmd/registry_notwindows.go
similarity index 100%
rename from cmd/core/cmd/registry_notwindows.go
rename to cmd/registry_notwindows.go
diff --git a/cmd/core/cmd/registry_test.go b/cmd/registry_test.go
similarity index 100%
rename from cmd/core/cmd/registry_test.go
rename to cmd/registry_test.go
diff --git a/cmd/core/cmd/registry_windows.go b/cmd/registry_windows.go
similarity index 100%
rename from cmd/core/cmd/registry_windows.go
rename to cmd/registry_windows.go
diff --git a/cmd/core/cmd/release.go b/cmd/release.go
similarity index 98%
rename from cmd/core/cmd/release.go
rename to cmd/release.go
index e69d982e4..3dc36237a 100644
--- a/cmd/core/cmd/release.go
+++ b/cmd/release.go
@@ -9,7 +9,7 @@ import (
 	"strings"
 
 	"cogentcore.org/core/base/exec"
-	"cogentcore.org/core/cmd/core/config"
+	"cogentcore.org/core/cmd/config"
 	"github.com/Masterminds/semver/v3"
 )
 
diff --git a/cmd/core/rendericon/rendericon.go b/cmd/rendericon/rendericon.go
similarity index 100%
rename from cmd/core/rendericon/rendericon.go
rename to cmd/rendericon/rendericon.go
diff --git a/cmd/core/cmd/run.go b/cmd/run.go
similarity index 95%
rename from cmd/core/cmd/run.go
rename to cmd/run.go
index 233c2ca3b..a76091700 100644
--- a/cmd/core/cmd/run.go
+++ b/cmd/run.go
@@ -11,9 +11,9 @@ import (
 
 	"cogentcore.org/core/base/exec"
 	"cogentcore.org/core/base/logx"
-	"cogentcore.org/core/cmd/core/config"
-	"cogentcore.org/core/cmd/core/mobile"
-	"cogentcore.org/core/cmd/core/web"
+	"cogentcore.org/core/cmd/config"
+	"cogentcore.org/core/cmd/mobile"
+	"cogentcore.org/core/cmd/web"
 )
 
 // Run builds and runs the config package. It also displays the logs generated
diff --git a/cmd/core/cmd/setup.go b/cmd/setup.go
similarity index 99%
rename from cmd/core/cmd/setup.go
rename to cmd/setup.go
index f91f6ad4e..5c48cb7ef 100644
--- a/cmd/core/cmd/setup.go
+++ b/cmd/setup.go
@@ -14,7 +14,7 @@ import (
 
 	"cogentcore.org/core/base/exec"
 	"cogentcore.org/core/base/logx"
-	"cogentcore.org/core/cmd/core/config"
+	"cogentcore.org/core/cmd/config"
 	"github.com/mitchellh/go-homedir"
 )
 
diff --git a/cmd/core/cmd/setup_test.go b/cmd/setup_test.go
similarity index 100%
rename from cmd/core/cmd/setup_test.go
rename to cmd/setup_test.go
diff --git a/cmd/typegen.go b/cmd/typegen.go
new file mode 100644
index 000000000..975176298
--- /dev/null
+++ b/cmd/typegen.go
@@ -0,0 +1,27 @@
+// Code generated by "core generate"; DO NOT EDIT.
+
+package cmd
+
+import (
+	"cogentcore.org/core/types"
+)
+
+var _ = types.AddFunc(&types.Func{Name: "cogentcore.org/core/cmd.Build", Doc: "Build builds an executable for the package\nat the config path for the config platforms.", Directives: []types.Directive{{Tool: "types", Directive: "add"}}, Args: []string{"c"}, Returns: []string{"error"}})
+
+var _ = types.AddFunc(&types.Func{Name: "cogentcore.org/core/cmd.Changed", Doc: "Changed concurrently prints all of the repositories within this directory\nthat have been changed and need to be updated in Git.", Directives: []types.Directive{{Tool: "types", Directive: "add"}}, Args: []string{"c"}, Returns: []string{"error"}})
+
+var _ = types.AddFunc(&types.Func{Name: "cogentcore.org/core/cmd.Install", Doc: "Install installs the package on the local system.\nIt uses the same config info as build.", Directives: []types.Directive{{Tool: "types", Directive: "add"}}, Args: []string{"c"}, Returns: []string{"error"}})
+
+var _ = types.AddFunc(&types.Func{Name: "cogentcore.org/core/cmd.Log", Doc: "Log prints the logs from your app running on Android to the terminal.\nAndroid is the only supported platform for log; use the -debug flag on\nrun for other platforms.", Directives: []types.Directive{{Tool: "types", Directive: "add"}}, Args: []string{"c"}, Returns: []string{"error"}})
+
+var _ = types.AddFunc(&types.Func{Name: "cogentcore.org/core/cmd.Pack", Doc: "Pack builds and packages the app for the target platform.\nFor android, ios, and web, it is equivalent to build.", Directives: []types.Directive{{Tool: "types", Directive: "add"}}, Args: []string{"c"}, Returns: []string{"error"}})
+
+var _ = types.AddFunc(&types.Func{Name: "cogentcore.org/core/cmd.Pull", Doc: "Pull concurrently pulls all of the Git repositories within the current directory.", Directives: []types.Directive{{Tool: "types", Directive: "add"}}, Args: []string{"c"}, Returns: []string{"error"}})
+
+var _ = types.AddFunc(&types.Func{Name: "cogentcore.org/core/cmd.Release", Doc: "Release releases the project with the specified git version tag.", Directives: []types.Directive{{Tool: "types", Directive: "add"}}, Args: []string{"c"}, Returns: []string{"error"}})
+
+var _ = types.AddFunc(&types.Func{Name: "cogentcore.org/core/cmd.NextRelease", Doc: "NextRelease releases the project with the current git version\ntag incremented by one patch version.", Directives: []types.Directive{{Tool: "types", Directive: "add"}}, Args: []string{"c"}, Returns: []string{"error"}})
+
+var _ = types.AddFunc(&types.Func{Name: "cogentcore.org/core/cmd.Run", Doc: "Run builds and runs the config package. It also displays the logs generated\nby the app. It uses the same config info as build.", Directives: []types.Directive{{Tool: "types", Directive: "add"}}, Args: []string{"c"}, Returns: []string{"error"}})
+
+var _ = types.AddFunc(&types.Func{Name: "cogentcore.org/core/cmd.Setup", Doc: "Setup installs platform-specific dependencies for the current platform.\nIt only needs to be called once per system.", Directives: []types.Directive{{Tool: "types", Directive: "add"}}, Args: []string{"c"}, Returns: []string{"error"}})
diff --git a/cmd/core/web/README.md b/cmd/web/README.md
similarity index 100%
rename from cmd/core/web/README.md
rename to cmd/web/README.md
diff --git a/cmd/core/web/build.go b/cmd/web/build.go
similarity index 98%
rename from cmd/core/web/build.go
rename to cmd/web/build.go
index 32f5a51bd..02284d282 100644
--- a/cmd/core/web/build.go
+++ b/cmd/web/build.go
@@ -17,8 +17,8 @@ import (
 	"cogentcore.org/core/base/exec"
 	"cogentcore.org/core/base/iox/imagex"
 	"cogentcore.org/core/base/iox/jsonx"
-	"cogentcore.org/core/cmd/core/config"
-	"cogentcore.org/core/cmd/core/rendericon"
+	"cogentcore.org/core/cmd/config"
+	"cogentcore.org/core/cmd/rendericon"
 	"cogentcore.org/core/content/bcontent"
 	strip "github.com/grokify/html-strip-tags-go"
 )
diff --git a/cmd/core/web/embed.go b/cmd/web/embed.go
similarity index 100%
rename from cmd/core/web/embed.go
rename to cmd/web/embed.go
diff --git a/cmd/core/web/embed/app-worker.js b/cmd/web/embed/app-worker.js
similarity index 100%
rename from cmd/core/web/embed/app-worker.js
rename to cmd/web/embed/app-worker.js
diff --git a/cmd/core/web/embed/app.css b/cmd/web/embed/app.css
similarity index 100%
rename from cmd/core/web/embed/app.css
rename to cmd/web/embed/app.css
diff --git a/cmd/core/web/embed/app.js b/cmd/web/embed/app.js
similarity index 100%
rename from cmd/core/web/embed/app.js
rename to cmd/web/embed/app.js
diff --git a/cmd/core/web/embed/index.html b/cmd/web/embed/index.html
similarity index 100%
rename from cmd/core/web/embed/index.html
rename to cmd/web/embed/index.html
diff --git a/cmd/core/web/embed/manifest.webmanifest b/cmd/web/embed/manifest.webmanifest
similarity index 100%
rename from cmd/core/web/embed/manifest.webmanifest
rename to cmd/web/embed/manifest.webmanifest
diff --git a/cmd/core/web/embed/wasm_exec.js b/cmd/web/embed/wasm_exec.js
similarity index 100%
rename from cmd/core/web/embed/wasm_exec.js
rename to cmd/web/embed/wasm_exec.js
diff --git a/cmd/core/web/serve.go b/cmd/web/serve.go
similarity index 96%
rename from cmd/core/web/serve.go
rename to cmd/web/serve.go
index 548ca8230..ac01250f8 100644
--- a/cmd/core/web/serve.go
+++ b/cmd/web/serve.go
@@ -11,7 +11,7 @@ import (
 	"strings"
 
 	"cogentcore.org/core/base/logx"
-	"cogentcore.org/core/cmd/core/config"
+	"cogentcore.org/core/cmd/config"
 )
 
 // Serve serves the build output directory on the default network address at the config port.
diff --git a/cmd/core/web/tmpl.go b/cmd/web/tmpl.go
similarity index 99%
rename from cmd/core/web/tmpl.go
rename to cmd/web/tmpl.go
index 1965f03ab..16008148c 100644
--- a/cmd/core/web/tmpl.go
+++ b/cmd/web/tmpl.go
@@ -12,7 +12,7 @@ import (
 	"text/template"
 
 	"cogentcore.org/core/base/elide"
-	"cogentcore.org/core/cmd/core/config"
+	"cogentcore.org/core/cmd/config"
 	"cogentcore.org/core/content/bcontent"
 	strip "github.com/grokify/html-strip-tags-go"
 )
diff --git a/cmd/core/cmd/windowsinstaller.go.tmpl b/cmd/windowsinstaller.go.tmpl
similarity index 100%
rename from cmd/core/cmd/windowsinstaller.go.tmpl
rename to cmd/windowsinstaller.go.tmpl
diff --git a/docs/content/install.md b/docs/content/install.md
index 468d988ec..6b83514cf 100644
--- a/docs/content/install.md
+++ b/docs/content/install.md
@@ -5,7 +5,7 @@ You can complete the three steps below to **install** Cogent Core on your system
 2. Run the following command to install the Cogent Core command line tool. You should run this command again each time you update to a new version of Cogent Core.
 
 ```sh
-go install cogentcore.org/core/cmd/core@main
+go install cogentcore.org/core@main
 ```
 
 3. **After** reading the info for your platform below, run the following command to install platform-specific dependencies. You **must** restart your shell/prompt/terminal after running the command.
@@ -28,7 +28,7 @@ This installs Go, gcc, and various graphics libraries. You may need to enter you
 
 If you want to install manually instead, the commands for each distro are listed below.
 
-<!-- To update this, copy the output of [cogentcore.org/core/cmd/core/cmd.TestLinuxDistroString]; DO NOT EDIT manually -->
+<!-- To update this, copy the output of [cogentcore.org/core/cmd.TestLinuxDistroString]; DO NOT EDIT manually -->
 
 {collapsed="true" title="Linux install commands"}
 ```sh
diff --git a/system/README.md b/system/README.md
index be55d18c2..576b59082 100644
--- a/system/README.md
+++ b/system/README.md
@@ -14,4 +14,4 @@ The `Platform` type enumerates these supported platforms and should be used to c
 
 ## IMPORTANT
 
-After making any changes to `GoNativeActivity.java` in the Android driver, you **need** to run go generate in [../cmd/core/mobile](../cmd/core/mobile) and reinstall the core tool.
+After making any changes to `GoNativeActivity.java` in the Android driver, you **need** to run go generate in [../cmd/mobile](../cmd/mobile) and reinstall the core tool.


Test patch:
diff --git a/cmd/core/mobile/binres/arsc.go b/cmd/mobile/binres/arsc.go
similarity index 100%
rename from cmd/core/mobile/binres/arsc.go
rename to cmd/mobile/binres/arsc.go
diff --git a/cmd/core/mobile/binres/binres.go b/cmd/mobile/binres/binres.go
similarity index 100%
rename from cmd/core/mobile/binres/binres.go
rename to cmd/mobile/binres/binres.go
diff --git a/cmd/core/mobile/binres/binres_string.go b/cmd/mobile/binres/binres_string.go
similarity index 100%
rename from cmd/core/mobile/binres/binres_string.go
rename to cmd/mobile/binres/binres_string.go
diff --git a/cmd/core/mobile/binres/binres_test.go b/cmd/mobile/binres/binres_test.go
similarity index 99%
rename from cmd/core/mobile/binres/binres_test.go
rename to cmd/mobile/binres/binres_test.go
index bce3ba39f..71ee208fe 100644
--- a/cmd/core/mobile/binres/binres_test.go
+++ b/cmd/mobile/binres/binres_test.go
@@ -17,7 +17,7 @@ import (
 	"strings"
 	"testing"
 
-	"cogentcore.org/core/cmd/core/mobile/sdkpath"
+	"cogentcore.org/core/cmd/mobile/sdkpath"
 )
 
 func init() {
diff --git a/cmd/core/mobile/build_darwin_test.go b/cmd/mobile/build_darwin_test.go
similarity index 99%
rename from cmd/core/mobile/build_darwin_test.go
rename to cmd/mobile/build_darwin_test.go
index f0594919b..631cfc9c9 100644
--- a/cmd/core/mobile/build_darwin_test.go
+++ b/cmd/mobile/build_darwin_test.go
@@ -12,7 +12,7 @@ import (
 
 	"cogentcore.org/core/base/exec"
 	"cogentcore.org/core/cli"
-	"cogentcore.org/core/cmd/core/config"
+	"cogentcore.org/core/cmd/config"
 )
 
 func TestAppleBuild(t *testing.T) {
diff --git a/cmd/core/mobile/build_test.go b/cmd/mobile/build_test.go
similarity index 98%
rename from cmd/core/mobile/build_test.go
rename to cmd/mobile/build_test.go
index 2bc435a4a..468e08d26 100644
--- a/cmd/core/mobile/build_test.go
+++ b/cmd/mobile/build_test.go
@@ -17,8 +17,8 @@ import (
 
 	"cogentcore.org/core/base/exec"
 	"cogentcore.org/core/base/reflectx"
-	"cogentcore.org/core/cmd/core/config"
-	"cogentcore.org/core/cmd/core/mobile/sdkpath"
+	"cogentcore.org/core/cmd/config"
+	"cogentcore.org/core/cmd/mobile/sdkpath"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 )
diff --git a/cmd/core/mobile/env_test.go b/cmd/mobile/env_test.go
similarity index 99%
rename from cmd/core/mobile/env_test.go
rename to cmd/mobile/env_test.go
index fdab9aa21..6709a5689 100644
--- a/cmd/core/mobile/env_test.go
+++ b/cmd/mobile/env_test.go
@@ -11,7 +11,7 @@ import (
 	"testing"
 
 	"cogentcore.org/core/cli"
-	"cogentcore.org/core/cmd/core/config"
+	"cogentcore.org/core/cmd/config"
 )
 
 func TestNdkRoot(t *testing.T) {