Reference
The mygo CLI
Its commands and flags.
mygo creates, develops, packages and publishes MyGo apps.
Install
Projects with a web frontend depend on the CLI as the mygo-cli npm
package, which holds a prebuilt binary for macOS, Linux and Windows on
arm64 and x64, and run it from their scripts:
bun add -d mygo-cli # or: npm install -D mygo-cli
bun run dev # "dev": "mygo dev" in package.json
bunx mygo doctor # any command, in the projectOutside a project, run bunx mygo-cli or npx mygo-cli, e.g.
bunx mygo-cli init my-app: npm has an unrelated package named mygo, so
bunx mygo would run it where mygo-cli is not installed. npm install -g mygo-cli puts mygo on your PATH. MYGO_CLI_BINARY makes the package
run another build of the CLI.
Projects of native UI have no npm packages: their go.mod has
the CLI as a tool,
which go tool mygo runs at the version it pins.
The CLI is a Go program, which Go runs too, without installing it:
go run github.com/egoist/mygo/cmd/mygo@latest init my-appgo install puts mygo on your PATH:
go install github.com/egoist/mygo/cmd/mygo@latestEither way, building apps needs Go, which compiles them.
The commands that take a project directory, [dir], default to the
current directory.
mygo init
mygo init [flags] <dir>Creates a project in a new or empty directory: a Go module and a
TypeScript frontend built with Vite, side by side, a default icon in
resources/icon.png, and a package.json with the scripts dev, build
and generate. It installs the dependencies with Bun and generates the
TypeScript client. See a web frontend.
With -template native the project is a Go module alone, whose window
shows native UI: main.go, a test of its view, mygo.json and the
icon. The module has the CLI as a tool,
so go tool mygo dev and go tool mygo build run the version it pins,
without Bun. See native UI.
Both templates include the mygo-maintenance agent skill in
.agents/skills/mygo-maintenance/, with guidance on element lifetimes,
stable identity, threading, and testing when maintaining the app.
| Flag | |
|---|---|
-template |
web, a TypeScript frontend (the default), or native, native UI in Go |
-name |
the app's name (default: the directory's name) |
-module |
the Go module path (default: the directory's name) |
-mygo |
a checkout of MyGo to use, through a replace directive, instead of the released module; the scripts then run the checkout's CLI with go run; run bun install && bun run build in the checkout first, for the web template |
mygo install-skills
mygo install-skills [dir]Installs or updates the agent skills bundled with the CLI version you run
in an existing project's .agents/skills/. The directory defaults to the
current directory; no project configuration, Go build, or frontend tools
are needed. New projects receive these skills through mygo init too.
The command overwrites bundled files such as
mygo-maintenance/SKILL.md and mygo-maintenance/agents/openai.yaml,
including local edits to those files. Other skills and extra custom files
are preserved. Upgrade the CLI, then run the command again to refresh its
guidance.
mygo dev
mygo dev [flags] [dir]Develops the app with live reload. It writes the TypeScript client, runs
devCommand from the configuration, such as a Vite dev server, waits for
devUrl to answer, then builds a development app, which loads devUrl in
place of its built frontend, and starts it. Without devUrl the app serves
frontendDist from disk.
Changes to the Go code, the configuration, the icon, the resources or the
catalogs rebuild the app, regenerate the TypeScript client and
the functions of the catalogs, and restart the app: the running
build quits, then the new one starts, so the two never hold the same files,
locks or web view profile at once. A build that fails to compile keeps the
running one. Frontend changes are the dev server's to handle. Quitting the app, or
Ctrl+C, ends mygo dev (press Ctrl+C again not to wait for the app to quit),
and App.Relaunch restarts the app, with the arguments it passes.
On a terminal, each step shows a spinner with what it does, such as the Go
packages being compiled, then how long it took; what the dev server and the
app print is labeled web │ and app │, and a rebuild names the files that
changed. Type a key, then Enter, as in Vite: r rebuilds and restarts the
app, c clears the console, q quits and h lists them. NO_COLOR turns
colors off, and output to a file or a pipe has a line per step.
The development app is named <name> Dev, with the identifier
<identifier>.dev, so that its data, preferences and single instance lock
stay apart from the installed app's. On macOS it is a real app bundle, in
.mygo/dev; on Windows its executable carries the icon, manifest and
version information that mygo build embeds.
On macOS mygo dev signs the development app with an Apple Development
identity from the user's keychains, as Xcode signs Debug builds: the one of
the team of macos.signingIdentity when there are several. Xcode makes one
for any Apple ID, free, under Settings > Accounts > Manage Certificates.
Its signature stays the same from build to build, so macOS keeps what the
user allowed the development app, such as Accessibility, Screen Recording
or the camera, and "Always Allow" for the Keychain items it reads through
mygo.Secrets. Without one, mygo dev signs ad hoc and
says so: ad hoc signatures change with every build, and macOS takes each
one for another app. -sign uses another identity, which a provisioning
profile needs, and -sign - signs ad hoc.
| Flag | |
|---|---|
With -web, mygo dev develops an app of native UI in browsers |
|
| instead: it compiles the app to WebAssembly, serves it at | |
http://localhost:5174 (or the next free port), opens it, and rebuilds it as |
|
| its Go code changes, which reloads the page. A build that fails to compile | |
| leaves the page running the last one, and shows why over it until a fix | |
compiles. o opens the page again. |
| Flag | |
|---|---|
-skip-dev-command |
does not run devCommand, e.g. when the dev server already runs |
-sign |
the identity that signs the development app on macOS (default: an Apple Development identity, see below, else -, ad hoc) |
-web |
develops the app in browsers |
-port |
with -web, the port to serve the app at, or the next free one (default: 5174) |
-open |
with -web, opens the app in the browser (default: true) |
-lang |
runs the app in a language, such as de or zh-Hant, or a pseudo locale, en-XA or ar-XB, without changing the language it keeps; see trying a language |
-background |
starts the app, and again after each rebuild, without bringing it to the front: its windows show without the focus until you click one, so the editor keeps it as you save (a maximized window on Windows still takes it) |
mygo build
mygo build [flags] [dir]Builds production apps: runs buildCommand, compiles the app with
frontendDist embedded, and packages it for each platform in
<out>/<os>-<arch>. See Building and distributing.
The platform web (or js/wasm) builds an app of native UI for browsers
into <out>/web, a static site to serve from anywhere: index.html, which
loads the app, Go's wasm_exec.js, the app's WebAssembly, named by its
content so that it can be cached for good, and the icon. See
Browsers.
| Flag | |
|---|---|
-platform |
comma separated GOOS/GOARCH targets, e.g. darwin/universal,windows/amd64,linux/amd64, or web (default: this machine's) |
-debug |
keeps development features, such as the web inspector and the inspector of native UI |
-o |
the output directory (default: out of the configuration) |
-sign |
the macOS signing identity (default: macos.signingIdentity) |
-skip-build-command |
does not run buildCommand |
-skip-dmg |
does not make macOS disk images |
-skip-notarize |
does not notarize, even with macos.notarize set |
-skip-installer |
does not make Windows installers, nor download NSIS for them (nor install.ps1, which runs the installer) |
-upload |
uploads the installers and updates to a draft GitHub release of the version (updates.github), with gh, or to the bucket of updates.s3 |
mygo generate
mygo generate [-o file] [dir]Writes the typed TypeScript client for the services bound with mygo.Bind
and the events declared with mygo.NewEvent, to bindings of the
configuration unless -o names another file. mygo dev and mygo build run
it for you; apps without a frontend get no client. See
the generated client.
With i18n in the configuration, it first checks the app's
catalogs and writes their functions: catalog_gen.go in the
catalogs' directory, and a TypeScript module next to the client, named
after the directory (src/locales.ts). Errors in the catalogs stop it.
mygo i18n check
mygo i18n check [dir]Checks the app's catalogs: it lists their errors, such as messages that do not parse or arguments a translation adds, and their warnings, such as missing translations, and exits with status 1 when there are errors.
mygo native
Experimental, as native modules are: these commands and their flags may
change in any release. The commands of native modules: Go interfaces
implemented in Swift, Rust or Zig, built into a library per platform, and
of the C libraries that packages bind with ffi
(bind a C library yourself).
[module dir] defaults to the current directory.
mygo native build
mygo native build [flags] [dir]Builds the native modules in dir, each in the
language of each platform (Swift on macOS where a module has it,
otherwise Rust, then Zig), and the libraries that the packages in dir
name in their mygo-plugin.json, from their sources, with swift, cargo
or zig, for every platform, writes the files to publish into
.mygo/native/release of the module, named after their SHA-256, and
their names, URLs and SHA-256 into mygo-plugin.json. Swift builds on a
Mac, universal, as a .tar.gz with the frameworks it brings
(darwin-universal). Platforms that do not build here (Rust's and
Swift's macOS libraries off a Mac) are listed at the end and left as they
were. Flags go before the directory. mygo dev and mygo build build the
modules and libraries of the app's own packages themselves; this
publishes those of a package for the apps of others, and for machines
without the languages' tools.
| Flag | |
|---|---|
-target |
the platforms, GOOS-GOARCH separated by commas, all (the default) or host, which builds this machine's library for go run and go test and leaves mygo-plugin.json alone |
-lang |
builds modules in this language (swift, rust or zig) where they are implemented in it, rather than in each platform's: with -target host, to test each implementation |
-release |
the URL of the directory the files are published in, as https://github.com/<owner>/<repo>/releases/download/<tag> (default: the library's release, else with -upload the library's release native-<name> of the repository of the git checkout) |
-out |
the directory of the files to publish |
-upload |
uploads the files to the GitHub release of -release with the GitHub CLI, creating it if needed |
-force |
builds the platforms whose published files were built from the sources as they are too, which it otherwise skips |
mygo native new
mygo native new [-lang <languages>] <module name>Makes a module in modules/<module name>, or at the path given instead of
a name: the Go package with the interface, its generated Go, an
AGENTS.md, and a directory per language. -lang takes the languages,
separated by commas: swift (the default), rust, zig, or none for
the Go side alone.
mygo native add
mygo native add <language> [module dir]Implements an existing module in another language, swift, rust or
zig, with a factory for every entry point and methods that say they are
unsupported, so the module builds at once.
mygo native check
mygo native check [-lang <language>] [module dir]Generates the module, builds its implementation for this machine, or the
one in -lang, and vets the Go package. It lists every problem as
file:line: message, with what to change, and exits with status 1 when
there are problems.
mygo native call
mygo native call [-timeout <duration>] [module dir] <Interface>.<Method> [<arguments>]Makes the implementation of an entry point, calls one method with
<arguments>, a JSON object of its parameters by their Go names, and
prints the result as JSON, a line per value of a stream. It makes the
method's context, which -timeout limits, and prints the calls of
callbacks.
mygo dev and mygo build generate and build every native module of the
app; see
build, run and test.
mygo keygen
mygo keygen [flags]Creates the key pair that signs updates: mygo-update.key,
the secret, and mygo-update.pub, and prints the updates section to add
to the configuration.
| Flag | |
|---|---|
-o |
the directory to write the keys to (default: mygo/update-keys in the user's configuration directory) |
-force |
replaces existing keys |
mygo doctor
Checks the development machine: Go, Bun and the webview of the platform,
which projects with a web frontend need (on Linux GTK 3 too, and not
WebKitGTK in a project whose linux.webview is false), and the tools of optional
features: NSIS for Windows installers (which mygo build downloads on
Windows), signtool or osslsigncode for signing Windows apps, gh for
-upload, and Developer ID identities for signing macOS apps.
mygo version
Prints the version of the CLI.
Environment variables
| Variable | |
|---|---|
CGO_ENABLED |
0 by default when unset or empty; set to 1 for app dependencies that need cgo, including in mygo dev, mygo build and mygo generate |
MYGO_LDFLAGS |
more -ldflags for the builds of mygo build, after its own, such as -X example.com/app/internal/crash.DSN=… or -buildid=; split at spaces outside quotes, as go build -ldflags splits them |
MYGO_INSPECTOR |
1 keeps the inspector of native UI in production builds of mygo build, which leave it out |
MYGO_UPDATER_PRIVATE_KEY |
the secret key that signs updates, for mygo build |
MYGO_WINDOWS_CERTIFICATE_PASSWORD |
the password of windows.certificate, for mygo build |
MYGO_CLI_BINARY |
a build of the CLI for the mygo-cli package to run |
MYGO_ENV |
production makes an app behave like a production build, e.g. without the web inspector |
MYGO_NATIVE_<NAME> |
the file of the native library <name> (in upper case, with _ for other characters than letters and digits) that package ffi loads, over the others |
MYGO_LOCALE |
the language the app runs in, over the one it keeps, which mygo dev -lang sets |
For an app with dependencies that need cgo:
CGO_ENABLED=1 go tool mygo dev
CGO_ENABLED=1 go tool mygo build