{"id":38973784,"url":"https://github.com/patricktcoakley/fgvm","last_synced_at":"2026-01-17T16:43:37.421Z","repository":{"id":265583523,"uuid":"896238164","full_name":"patricktcoakley/fgvm","owner":"patricktcoakley","description":"A friendly Godot version manager.","archived":false,"fork":false,"pushed_at":"2025-11-21T02:25:37.000Z","size":923,"stargazers_count":11,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-11-21T04:09:24.550Z","etag":null,"topics":["cli","csharp","dotnet","gdvm","godot","hacktoberfest","tui"],"latest_commit_sha":null,"homepage":"https://gdvm.dev","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/patricktcoakley.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-11-29T21:09:43.000Z","updated_at":"2025-11-21T02:04:58.000Z","dependencies_parsed_at":"2024-11-30T02:27:54.871Z","dependency_job_id":"594d9b12-1a14-4d6c-8855-f9e737942e99","html_url":"https://github.com/patricktcoakley/fgvm","commit_stats":null,"previous_names":["patricktcoakley/gdvm","patricktcoakley/fgvm"],"tags_count":24,"template":false,"template_full_name":null,"purl":"pkg:github/patricktcoakley/fgvm","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patricktcoakley%2Ffgvm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patricktcoakley%2Ffgvm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patricktcoakley%2Ffgvm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patricktcoakley%2Ffgvm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/patricktcoakley","download_url":"https://codeload.github.com/patricktcoakley/fgvm/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patricktcoakley%2Ffgvm/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28511868,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-17T13:38:16.342Z","status":"ssl_error","status_checked_at":"2026-01-17T13:37:44.060Z","response_time":85,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","csharp","dotnet","gdvm","godot","hacktoberfest","tui"],"created_at":"2026-01-17T16:43:34.370Z","updated_at":"2026-01-17T16:43:37.380Z","avatar_url":"https://github.com/patricktcoakley.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# fgvm\n\n**fgvm**, a ***friendly*** **Godot version manager**.\n\n\u003e [!IMPORTANT]\n\u003e This project was previously known as `gdvm`, but as of 2.0 has now been renamed to `fgvm`. Most users won't be significantly impacted,\n\u003e but some changes were breaking and will require users to switch over to `fgvm`; please see [this section](#migrating-from-gdvm) for information on how to migrate.\n\n## Introduction\n\nfgvm is a friendly Godot version manager that lets users install and manage multiple versions of Godot with ease. It uses a hybrid CLI/TUI design, meaning that in certain places where it makes sense\nit will prompt you to let you select what you're looking for instead of having to pass in confusing arguments, as well as support for [passing it unstructured queries](#usage) to help find the\nappropriate version based on your input, like `4 dev` or `latest`. It's released as a static binary that can work on Windows, macOS, and Linux by just putting it somewhere and calling it in the\nterminal, or, the preferred method of installation, using a [package manager](#package-managers).\n\n## Features\n\n- **Version Management**: Easily manage multiple Godot installations side-by-side, allowing you to try out the latest versions or keep older versions for compatibility testing, including Godot 1.0 to\n  the latest development builds, including both standard and .NET builds.\n- **Hybrid CLI/TUI Interface**: Simple command-line interface with interactive TUI prompts for easy navigation and selection when you don't specify arguments.\n- **Flexible Query System**: Powerful query system for finding and installing versions using keywords like `latest`, `4 mono`, `3.3 rc`, etc.\n- **Project Aware**: Lock a project to a specific Godot version using a `.fgvm-version` file in the project directory, which can be automatically detected from `project.godot` or manually customized\n  if needed. Also prompts to install missing versions when opening a project that is using a version that isn't currently installed. Finally, automatically launch your project using the `godot`\n  command directly from the terminal.\n- **Smart Argument Handling**: Detection of arguments passed to Godot that contextually switch to an attached mode when necessary to display terminal output.\n- **CI-Ready**: Perfect for remote installations, CI/CD pipelines, WSL, and containerized environments with its single static binary.\n\n## Installation\n\n\u003e [!NOTE]\n\u003e In order to use the symlink feature for **Windows**, you first need to enable [Developer Mode](https://learn.microsoft.com/en-us/windows/apps/get-started/enable-your-device-for-development).\n\u003e Without it, you can still install, remove, etc, but you won't have the added benefit of having a symlink pointing to your desired version, which is what the `fgvm godot` command uses to launch Godot\n\u003e directly from the terminal and you would simply have to navigate to the Godot installation directory to launch it (i.e., `C:\\Users\\USERNAME\\fgvm\\4.5.1-stable-standard\\Godot_v4.5.1-stable_win64.exe`).\n\u003e\n\u003e In addition, Powershell, the default shell for Windows, doesn't support the emojis out of the box. To fix this, you simply need to update the `$PROFILE`/profile.ps1:\n\u003e ```powershell \n\u003e '[console]::InputEncoding = [console]::OutputEncoding = [System.Text.UTF8Encoding]::new()' | Add-Content -Path $PROFILE\n\u003e ```\n\u003e\n\u003e Also, if you are using `cmd`, you can also try the beta unicode support by going to Region in the control panel, going to Administrative, clicking Change system locale, and checking the Beta:\n\u003e Use Unicode UTF-8 for worldwide language support checkbox. You will have to restart your computer, but it should enable emoji support there as well.\n\n\n### Package Managers\n\nThe recommended way to install fgvm is through a package manager, which will make it easier to keep up to date and manage your installations:\n\n#### Homebrew (macOS/Linux)\n\nIf you're on macOS or Linux, you can install fgvm using [Homebrew](https://brew.sh) by running the following commands:\n\n```shell\nbrew tap patricktcoakley/formulae\nbrew install fgvm\n```\n\nNote that you may periodically need to run `brew update` if any changes are applied to the formula.\n\n#### Scoop (Windows)\n\nIf you're on Windows, you can install fgvm using [Scoop](https://scoop.sh) by running the following commands:\n\n```powershell\nscoop bucket add patricktcoakley https://github.com/patricktcoakley/scoop-bucket\nscoop install patricktcoakley/fgvm\n```\n\n### fgvmup (Currently Windows only)\n\nThere is also an **experimental** tool called `fgvmup` that can manage your installations on **Windows** using a Powershell script. I've only done preliminary testing and am open to feedback, but be\naware things there may be issues. To try it out, you can do the following:\n\n```powershell\nirm https://raw.githubusercontent.com/patricktcoakley/fgvm/main/installer.ps1 | iex\n```\n\nwhich will install the latest version and add fgvmup, fgvm, and the Godot alias directories to your PATH automatically. fgvmup\ncan handle installation, upgrade, and deletion of the fgvm tool, but it's a WIP and may change or be integrated into the main application in the future.\n\nUsage:\n\n- `install` [`--quiet`] [`--version VERSION`] [`--force`] installs fgvmup and fgvm, with the optional arguments for quiet output, a specific version, or forcing an installation.\n- `uninstall` removes **everything**, including fgvm, fgvmup, and all Godot installations.\n- `upgrade` just reinstalls everything and will likely be removed in the future unless I can think of a use case.\n\nAs of now I really only created it as a proof-of-concept but could expand it later in the future. If there is interest I will also consider a macOS/Linux version of this tool using a traditional shell\nscript.\n\n### Pre-built Binaries (Windows/Linux)\n\nIf you don't want to use a package manager you can download the latest pre-built binary release from the [releases page](https://github.com/patricktcoakley/fgvm/releases).\n\n### Build From Source\n\nSee [Build](#build) for instructions on how to build fgvm from source.\n\n## Usage\n\n### Getting Started\n\nfgvm downloads and installs Godot into folders inside of `~/fgvm/` for macOS and Linux, and `$env:USERPROFILE\\fgvm\\` for Windows. You can customize this location using the `FGVM_HOME` environment variable (see [Environment Variables](#environment-variables)).\nEach installation will be in a folder with the `\u003cVERSION\u003e-\u003cTYPE\u003e-\u003cRUNTIME\u003e`; which equates to version number, the release type (stable, dev, etc), and the runtime (standard or .NET). For example, \nif you installed the 4.3 stable with .NET support, it would be in a folder marked `4.3-stable-mono`. \n\nBy default, when you install a version a [symlink](https://en.wikipedia.org/wiki/Symbolic_link) is created in a folder called `bin`. This is what the `fgvm godot` command is running when you don't pass any arguments,\nbut you can also just run `fgvm godot -i` to pick any another installation to launch, or you can simply use `fgvm set` to pick the version you want to launch by default.\n\nRight now fvgm supports installing whatever your computer supports by CPU and OS, so if you're running Windows on a standard x86_64 CPU you are able to install\nand run versions of Godot all the way back to 1.x. macOS went through multiple architecture transitions since Godot 1 and so most modern Macs will only support releases\nas far back as ~3.3, but if you have an older Mac you should still be able to install whatever it supports (should fgvm itself be able to run on the system). An override to force downloads on\nunsupported systems may be added later, but it hasn't come up as a requested feature yet.\n\n### Commands\n\nAll of this is also available in the `--help` section of the app:\n\n```shell\nfgvm --help\n```\n\nbut here is a detailed summary of the available commands:\n\n\u003e **Note:** Many commands support short-form aliases for faster usage (e.g., `fgvm i` for `fgvm install`, `fgvm g` for `fgvm godot`).\n\n- `fgvm list` or `fgvm l` [`--json`] will list locally installed Godot versions. Use `--json` to output in JSON format.\n- `fgvm install` or `fgvm i` `[\u003c...strings\u003e]` [`--default|-D|--set-default`] will prompt the user to install a version if no arguments are supplied, or will\n  try to find the closest matching version based on the query, defaulting to \"stable\" if no other release type is supplied.\n  It will automatically set the installed version as the default if it's the first installation. Use `--default` (or `-D`) to explicitly set the installed version as the default regardless of whether other versions are already installed.\n    - Queries:\n        - `latest` or `latest standard` will install the latest stable, and `latest mono` will install the latest .NET stable.\n        - `4 mono` will grab the latest stable 4.x .NET release, `3.3 rc` will grab the latest rc of 3.3 standard, `1` would take the last stable version `1`, and so on.\n    - Examples:\n        - `fgvm install 4.3` - Install 4.3 stable\n        - `fgvm install 4.3 mono` - Install the latest 4.6 dev mono\n        - `fgvm i latest --default` - Install latest stable standard and set as default\n- `fgvm godot` or `fgvm g` runs the appropriate Godot version, or with the `--interactive` or `-i` flag, will prompt the user to launch an installed version. When run in a project directory with a `.fgvm-version`\n  file, it will use that project-specific version. If no `.fgvm-version` file exists, it will use the global default version. The command will automatically detect and launch the project if a\n  `project.godot` file is found.\n    - Once a version is installed, it will launch the editor with the project directly from the terminal This feature will only work on projects using `config_version=5` in `project.godot`, which is *\n      *Godot 4.0 and later**.\n    - Optionally, pass in arguments to the Godot executable directly using the `--args` parameter, such as `fgvm godot --args=\"--headless\"` or `fgvm godot --args=\"--version\"`. Multiple arguments should be\n      passed as a quoted string, such as `--args=\"--headless -v\"`.\n    - Use the `--attached` or `-a` flag to force Godot connected to the terminal for output; by default, Godot runs in detached mode and will launch in a separate instance. Using an argument detection\n      system, certain arguments (like `--version`, `--help`, `--headless`) automatically trigger this mode since they would otherwise be useless without printing to standard out.\n    - The command will only read existing `.fgvm-version` files for version selection, and does not create or modify version files. Use `fgvm local` to manage `.fgvm-version` files.\n- `fgvm set [\u003c...strings\u003e]` prompts the user to set an installed version of Godot if no arguments are supplied, or will\n  try to find the closest matching version based on the query, including release type (`stable`) and version (`4`, `4.4`), or an exact match (`4.4.1-stable-mono`).\n- `fgvm local [\u003c...strings\u003e]` sets the Godot version for the current project by creating or updating a `.fgvm-version` file in the current directory. If no `.fgvm-version` file\n  exists and no arguments are provided, it will automatically detect the project version from `project.godot` and install the most recent compatible version if not already installed.\n    - If a list of arguments are provided, it will find the best matching version based on the query (including runtime preferences like `mono` or `standard`) and install it if necessary.\n- `fgvm which` [`--json`] displays the location that the current Godot symlink points to. Use `--json` to output in JSON format.\n- `fgvm remove` or `fgvm r` `[\u003c...strings\u003e]` prompts the user to select multiple installations to delete, or optionally takes a query to filter down to specific versions to delete. If there is only one match, it\n  will delete it directly. If there are multiple matches, it will prompt the user to select which ones to delete.\n    - For example, if you wanted to list all of the `4.y.z` versions to remove, you could just do `fgvm r 4` to list all of the 4 major releases. However, if remove a specific version, like\n      `4.4.1-stable-mono`, it will just delete that version directly. Deleting the currently set version will unset it and you will need to set a new one.\n- `fgvm logs` [`--level|-l \u003cstring\u003e`] [`--message|-m \u003cstring\u003e`] [`--json`] displays all the of the logs, or optionally takes a level or message filter. Use `--json` to output in JSON format.\n- `fgvm search` or `fgvm s` `[\u003c...strings\u003e]` [`--json|-j`] takes an optional query to search all available remote versions of Godot. Use `--json` or `-j` to output in JSON format.\n    - Queries:\n        - `4` would filter all 4.x releases, including \"stable\", \"dev\", etc.\n        - `4.2-rc` would only list the `4.2` `rc` releases, but `4.2 rc` would list all `4.2.x` releases with the `rc` release type, including `4.2.2.-rc3`\n\n### Project Version Management\n\nfgvm supports project-specific version management through `.fgvm-version` files. Here's how it works:\n\n#### Setting up a project version:\n\n```bash\n# Navigate to your project directory\ncd my-godot-project\n\n# Option 1: Auto-detect version from project.godot\nfgvm local                    # Detects version from project.godot, creates .fgvm-version\n\n# Option 2: Explicitly set a version\nfgvm local 4.3 mono          # Creates .fgvm-version with 4.3-stable-mono\n```\n\n#### Using project versions:\n\n```bash\n# In a project directory with .fgvm-version file\nfgvm godot                    # Uses version from .fgvm-version\n# Or use short form\nfgvm g                        # Same as above\n\n# In a project directory without .fgvm-version file\nfgvm godot                    # Uses global default version\n\n# In any directory\nfgvm godot -i                 # Interactive selection from installed versions\nfgvm g -i                     # Same as above\n```\n\n#### Workflow:\n\n1. **`fgvm local`** - Creates/updates `.fgvm-version` file for project-specific version management\n2. **`fgvm godot`** (or `fgvm g`) - Respects `.fgvm-version` file if present, otherwise uses global default\n3. **`fgvm set`** - Sets the global default version used when no `.fgvm-version` exists\n\n### Configuration\n\nOnce you've installed fgvm, there should be a `fgvm.ini` file located inside of the root `fgvm` directory. Currently, the only supported\nsetting is to set a [GitHub token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-personal-access-token-classic) to\ndisable\nrate limiting on queries and installations. In order to do so, you need to edit the `fgvm.ini` to look like the following:\n\n```ini\n# FGVM Configuration File\n[github]\ntoken = \"\u003cMY_SUPER_SECRET_TOKEN\u003e\"\n```\n\nwhich allows you to use `fgvm` without\nthe [60 requests per hour restriction](https://docs.github.com/en/rest/using-the-rest-api/rate-limits-for-the-rest-api?apiVersion=2022-11-28#primary-rate-limit-for-unauthenticated-users). There may be\nother use cases in the future, but otherwise all functionality exists inside the CLI itself.\n\n#### Environment Variables\n\n- **`FGVM_HOME`**: Customize the installation directory for fgvm. By default, fgvm uses `~/fgvm/` (macOS/Linux) or `$env:USERPROFILE\\fgvm\\` (Windows). Setting this variable allows you to use a different location:\n\n  macOS/Linux:\n    ```bash\n    # Temporary (current session only)\n    export FGVM_HOME=/custom/path\n    fgvm list  # Will use /custom/path/fgvm/ instead\n\n    # Persistent (add to ~/.bashrc, ~/.zshrc, or ~/.profile)\n    echo 'export FGVM_HOME=/custom/path' \u003e\u003e ~/.bashrc\n    ```\n\n  Windows:\n    ```powershell\n    # Temporary (current session only)\n    $env:FGVM_HOME = \"C:\\custom\\path\"\n    fgvm list  # Will use C:\\custom\\path\\fgvm\\ instead\n\n    # Persistent (for current user)\n    [System.Environment]::SetEnvironmentVariable('FGVM_HOME', 'C:\\custom\\path', 'User')\n    ```\n\n  This is particularly useful for testing, CI/CD environments, or keeping your Godot installations on a separate storage device for backup purposes.\n\n## Development\n\n### Build\n\nIn order to build this project, you just need the .NET 9 SDK. Running `dotnet run -- \u003ccommand\u003e [args]` will let you run commands immediately, but you can also run `dotnet build -c Release` to get a\nrelease build and just copy to a directory in your PATH:\n\n```shell\ngit clone https://github.com/patricktcoakley/fgvm.git\ncd fgvm\ndotnet restore\ndotnet build -c Release\n```\n\n### Test\n\n```shell\ndotnet test\n```\n\n### Contributing\n\nThis project uses [Conventional Commits](https://www.conventionalcommits.org/) for commit messages and [Versionize](https://github.com/versionize/versionize) for automated versioning and changelog\ngeneration.\n\nWhen making changes:\n\n1. Use conventional commit format: `type(scope): description`.\n2. Supported types: `feat`, `fix`, `docs`, `refactor`, `perf`, `test`, `chore`, `ci`, `build`.\n3. The changelog is automatically generated from these commits.\n\nExample:\n\n```shell\ngit commit -m \"feat(environment): Added suport for OpenBSD.\"\n```\n\nAlso please make sure to run `dotnet format` before committing to ensure code style consistency.\n\nSee: https://github.com/patricktcoakley/fgvm\n\n## Roadmap\n\n- Possibly consider adding multi-select and multi-query to installations so that you could bulk-install multiple versions.\n- I currently have [fgvmup](#fgvmup-currently-windows-only) for Windows, and it would make sense to port that script to bash for macOS and Linux support, allowing users to more easily install fgvm\n  without having to rely on a package manager, but at the cost of extra maintenance and overhead.\n\n## Migrating from gdvm\n\nIf you were using this project in the past then you'll know it used to be called `gdvm`. Prior to this project's creation and after, there have been several other projects with similar goals using the same name. \n\nIn an effort to differentiate this project I decided to change the name to stand out, and am also using it as an opportunity to implement some breaking changes due to some recent updates in the libraries I am using to write this tool.\n\nWhat this means for you:\n- `gdvm` and `fgvm` are mostly the same workflow but there were minor changes to the commands that are breaking, so consult the updated documentation if you get stuck\n- If you are using a package manager (the recommend way to install), you will have to remove the `gdvm` package and install `fgvm`\n  - Homebrew users: `brew update \u0026\u0026 brew uninstall gdvm \u0026\u0026 brew install fgvm`\n  - Scoop users: `scoop update \u0026\u0026 scoop uninstall gdvm \u0026\u0026 scoop install fgvm`\n- If you want to keep your current installations, you can copy the existing `gdvm` directory to `fgvm`, which will preserve everything. Here are some one-liners that copy them over and delete the gdvm folder:\n  - macOS \u0026 Linux users: `mkdir -p ~/fgvm \u0026\u0026 cp -r ~/gdvm/* ~/fgvm/ \u0026\u0026 rm -rf ~/gdvm`\n  - Windows users: `mkdir -Force $env:USERPROFILE\\fgvm ; cp -r $env:USERPROFILE\\gdvm\\* $env:USERPROFILE\\fgvm\\ ; rm -r -Force $env:USERPROFILE\\gdvm`\n  - `gdvmup` is now called `fgvmup`. If you were using the old `gdvmup` installer, run `gdvmup uninstall` first, which removes everything, then follow the [installation instructions](#installation) above. Be sure to copy over your existing installations using the above commands if you want to keep them.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpatricktcoakley%2Ffgvm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpatricktcoakley%2Ffgvm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpatricktcoakley%2Ffgvm/lists"}