eget helps locate, download, and extract prebuilt binaries from GitHub, GitLab, Gitea/Forgejo, and SourceForge.
Forked from https://github.com/zyedidia/eget Refactored and enhanced the tool's functionality.
- Multi-source installs: install or download binaries from GitHub, GitLab, Gitea/Forgejo, SourceForge, direct download URLs, and local files.
- Automatic selection and extraction: filter release assets by OS/arch, keyword, or regex, with SHA-256 verification and common archive extraction.
- Managed package workflow: use
add,list,update, anduninstallto manage frequently used tools, record install state, and check batch updates. - Query and search: query GitHub release info, query SourceForge latest/assets, and search repositories with native GitHub search qualifiers.
- Cache and proxy support: use download cache, API response cache,
proxy_url, andghproxyfor restricted networks or repeated installs. - Config-driven usage: configure global defaults, repo-level options, and
packages.<name>managed packages; config and installed store default to~/.config/eget/.
- Download from Releases https://github.com/inherelab/eget/releases
- Install by
go installcommand (requires a local Go SDK)
go install github.com/inherelab/eget/cmd/eget@latesteget <command> --options... arguments...Install from GitHub:
# quickly
eget i ORG/REPO
# install with tag
eget install --tag nightly inhere/markview
# Install and override the executable name
eget install --name chlog gookit/gitw
# Install and override the asset name
eget install --asset zip windirstat/windirstat
# Filter assets with regex
eget install --asset "REG:\\.deb$" owner/repo
# Install to a custom directory
eget install --to ~/.local/bin/fzf junegunn/fzfInstall a SourceForge project:
# Install a SourceForge project directly
eget install --asset x64,PerUser,setup sourceforge:winmergeInstall a GitLab/Gitea/Forgejo project:
# Install from GitLab releases
eget install gitlab:fdroid/fdroidserver
eget install gitlab:gitlab.gnome.org/GNOME/gtk
# Install from Gitea/Forgejo-compatible releases
eget install --asset linux,amd64 gitea:codeberg.org/forgejo/forgejoInstall and record:
# Install and record the package definition
eget install --add junegunn/fzf
eget install --add --name rg BurntSushi/ripgrep
# Add a SourceForge project as a managed package
eget add --name winmerge --system windows/amd64 --asset x64,PerUser,setup sourceforge:winmerge
# Install every package configured under [packages]
eget install --allInstall GUI apps:
# Install a GUI app; portable GUI apps use global.gui_target by default
eget install --gui sipeed/picoclaw
eget add --gui --name picoclaw sipeed/picoclaw# download
eget download ip7z/7zip
eget download --file go --to ~/go1.17.5 https://go.dev/dl/go1.17.5.linux-amd64.tar.gz
eget download --file README.md,LICENSE --to ./dist owner/repo
eget download --file "*.txt" owner/repo
eget download --file "bin/*" owner/repo
eget download --extract-all --to ./dist windirstat/windirstatQuery repository info:
# query repo info
eget query owner/repo
eget query --action releases --limit 5 owner/repo
eget query --action assets --tag v1.2.3 owner/repo
# query SourceForge latest version or assets
eget query sourceforge:winmerge
eget query --action assets sourceforge:winmerge/stable
eget query --action assets --tag 2.16.44 sourceforge:winmerge/stableSearch GitHub repositories:
eget search ripgrep
eget search skillc language:go user:inhere
eget search --limit 5 --sort stars --order desc terminal ui
eget search --json picoclaw user:sipeed# uninstall
eget uninstall fzf
# list installed packages
eget list|ls
# list all managed and installed packages
eget list --all
# list GUI packages
eget list --gui
# update fzf
eget update fzf
eget update --all# config
eget add --name fzf --to ~/.local/bin junegunn/fzf
eget config init
eget config list|ls
eget config get global.target
eget config set global.target ~/.local/binThe target argument accepted by install and download can be:
nameconfigured in packages- GitHub repository, for example
owner/repo - GitHub repository URL, for example
https://github.com/owner/repo - GitLab target, for example
gitlab:fdroid/fdroidserverorgitlab:gitlab.gnome.org/GNOME/gtk - Gitea/Forgejo target, for example
gitea:codeberg.org/forgejo/forgejo - SourceForge target, for example
sourceforge:winmergeorsourceforge:winmerge/stable - Direct download URL, for example
https://example.com/file.tar.gz - Local file path, for example
file:///path/to/file
Note: GitLab and Gitea/Forgejo support currently covers
install,download, andupdatefor release assets. SourceForge also supportsquery latestandquery assets. Search parity, private repository authentication, and automatic provider detection from arbitrary web URLs are not provided.
install (aliases: i, ins)
- Resolve, download, verify, and extract a target, then record installation state.
--namecan be used to override the installed executable name; without--to, it also acts as the rename hint for single-file assets.--guimarks the target as a GUI application. Portable GUI apps useglobal.gui_targetby default, while GUI installers such as.msiorsetup.exeare launched and do not record a final install directory. Without--gui, installer-like assets prompt before launch; with--add, a confirmed installer is persisted withis_gui = true.- With
--add, a successful install also writes the repo target to[packages.<name>]; use--nameto override the package name. - Use
--allwithout a target to install every package configured under[packages]. Package-level options are merged the same way as single package installs.
download (alias: dl)
- Reuses the install pipeline without recording installed state.
- Downloads the raw asset by default; archive extraction only happens when
--fileor--extract-allis set.
add
- Writes a managed package definition to
[packages.<name>]in the config file.
uninstall (aliases: uni, rm)
- Removes installed files and clears the installed store entry without deleting
[packages.<name>].
list (alias: ls)
- Lists installed packages by default.
- Use
--all/-ato list the union of local managed packages and installed-store entries. - Use
--guito filter the current list view to GUI applications.
query (alias: q)
- Queries GitHub repository release metadata and SourceForge latest/assets without installing anything or touching local state.
- Defaults to the
latestaction, and can switch toinfo,releases, orassetswith--action.
search
- Searches GitHub repositories without installing anything or touching local state.
- Uses the first argument as the keyword and passes remaining arguments through as GitHub search qualifiers, for example
language:go,user:inhere, ortopic:cli.
update (alias: up)
- Updates a single managed package, or all managed packages with
--all.
config (alias: cfg)
- Supports
init,list/ls,get KEY, andset KEY VALUE.
install, download, and add share these installation-related options:
--tag: Select a release tag; defaults tolatestwhen omitted.--system: Override the target OS/arch, for examplewindows/amd64orlinux/arm64.--to: Set the install or download output path; accepts either a directory or a full file path.--file: Select file(s) to extract from an archive; supports comma-separated file names or glob patterns such asREADME.md,LICENSE.--asset: Filter release assets by keyword; multiple filters can be separated by commas. Regex is also supported with theREG:prefix, for exampleREG:\\.deb$, and exclusions can use^REG:....--source: Download the source archive instead of a prebuilt binary release.--extract-all,--ea: Extract all files from the archive instead of selecting a single target file.--chunk N: Control HTTP Range chunk concurrency for one downloaded file.0means auto,1means single-connection download, and values greater than1request up to that many chunks.--quiet: Reduce normal command output for scripting or batch use.
install and download also support --fallback-versions N for SourceForge targets. When the latest version folder does not contain a matching asset, eget scans up to N older version folders and uses the first folder where the current --asset / --system filters produce a single match.
Cache behavior is configured via
config set global.cache_dir ...or thecache_dirfield in the config file.
install additionally supports:
--add: After a successful install, append the repo target to[packages.<name>]managed config.--all: Install every package configured under[packages]; cannot be combined with a target or--add.--batch N: Control package task concurrency forinstall --all.0means auto,1means serial, and values greater than1process up to that many packages at once.--gui: Install as a GUI application; with--add, persistis_gui = true. Installer-like assets selected without--guiprompt before launch and also persistis_gui = truewhen confirmed with--add.--name: Override the managed package name; for single executable assets, it also acts as the default output-name hint.
update options:
--all: Check managed packages and update only outdated installed packages.--batch N: Control package task concurrency forupdate --all.0means auto,1means serial, and values greater than1process up to that many packages at once.--chunk N: Control HTTP Range chunk concurrency for downloads triggered by update.--check: Check and list outdated installed packages, same aslist --outdated.--dry-run: Preview the update plan without performing installation changes.--interactive: Interactively select which managed packages to update.
query options:
--action,-a: Query action. Supported values:latest,releases,assets,info.--tag,-t: Select the release tag for theassetsaction; defaults to latest when omitted.--limit,-l: Limit the number of rows returned by thereleasesaction. Default:10.--json,-j: Output JSON for scripting or automation.--prerelease,-p: Include prerelease entries forlatestandreleases.
SourceForge query targets use sourceforge:<project> or sourceforge:<project>/<path> and currently support only latest and assets. info, releases, --limit, and --prerelease remain GitHub-only.
search options:
--limit,-l: Limit the number of repositories returned. Default:10.--sort: Sort search results. Supported values:stars,updated.--order: Sort order. Supported values:desc,asc.--json,-j: Output JSON for scripting or automation.
Global options:
-v,--verbose: Show more execution details such as API requests, response summaries, asset selection, cache hits, and key workflow steps.
Notes:
install --namecan rename a single executable asset, for example installingchlog-windows-amd64.exeaschlog.exe.install --addonly applies to repo targets and appends the managed package definition after a successful install.global.gui_targetis used only for portable GUI applications. GUI installers such as.msiorsetup.exeare launched and do not record a final install directory.downloadstores the raw downloaded asset by default; extraction only happens when--fileor--extract-allis provided.- Archive extraction currently supports
zip,tar.*, and7z. - Argument order follows the
cflag/cappparser constraint and must beCMD --OPTIONS... ARGUMENTS....
The config file is resolved in this order:
EGET_CONFIG~/.config/eget/eget.toml- XDG / LocalAppData fallback path
- Legacy
~/.eget.toml
Supported config sections:
[global]["owner/repo"][packages.<name>]
Example:
[global]
target = "~/.local/bin"
cache_dir = "~/.cache/eget"
proxy_url = "http://127.0.0.1:7890"
system = "windows/amd64"
chunk_concurrency = 0
batch_concurrency = 0
[api_cache]
enable = false
cache_time = 300
[ghproxy]
enable = false
host_url = ""
support_api = true
fallbacks = []
["inhere/markview"]
tag = "nightly"
[packages.markview]
repo = "inhere/markview"
target = "~/.local/bin"
tag = "nightly"
asset_filters = ["windows"]
[packages.winmerge]
repo = "sourceforge:winmerge"
source_path = "stable"
system = "windows/amd64"
asset_filters = ["x64", "PerUser", "setup"]
[packages.forgejo]
repo = "gitea:codeberg.org/forgejo/forgejo"
system = "linux/amd64"
asset_filters = ["linux", "amd64"]Common fields:
targetgui_targetcache_dirproxy_urlchunk_concurrencybatch_concurrencyapi_cache.enableapi_cache.cache_timeghproxy.enableghproxy.host_urlghproxy.support_apighproxy.fallbackssystemtagsource_pathfileasset_filtersdownload_sourceextract_allis_guiquietupgrade_only
Default initialization:
eget config initThis writes:
global.target = "~/.local/bin"global.cache_dir = "~/.cache/eget"global.proxy_url = ""global.chunk_concurrency = 0global.batch_concurrency = 0api_cache.enable = falseapi_cache.cache_time = 300ghproxy.enable = falseghproxy.host_url = ""ghproxy.support_api = true
By default, the file is created at ~/.config/eget/eget.toml.
Directory semantics:
targetis the default install directorycache_diris the default download cache directoryproxy_urlis the global proxy for remote requests; both GitHub lookups and remote downloads use itsource_pathnarrows SourceForge discovery under a project's files area, for examplestableapi_cacheonly caches GitHub APIGETresponses, and the cache file directory is derived as{cache_dir}/api-cache/cache_timeis measured in seconds; expired cache entries are refreshed from the networkghproxyrewrites GitHub asset download URLs; whensupport_api = true, it also rewritesapi.github.comrequestsghproxy.fallbacksare tried in order when the primary ghproxy host failsproxy_urlis the HTTP-layer proxy, whileghproxyrewrites request URLs; both can be enabled togetherdownloadusescache_dirby default when--tois not providedinstallanddownloadwill reuse cached remote download contents fromcache_dirwhen available
The installed-state store also defaults to ~/.config/eget/installed.toml.
make build
make testThe current version has been restructured into an explicit subcommand CLI, with the entry point in cmd/eget/main.go and business logic concentrated under internal/.
cmd/eget: command entry pointinternal/cli:cappcommand registration and argument bindinginternal/app: install/add/list/update/config use-case orchestrationinternal/install: find, download, verify, and extract execution pipelineinternal/config: config loading, merging, and persistenceinternal/installed: installed-state storageinternal/source/github: GitHub asset discoveryinternal/source/forge: GitLab/Gitea/Forgejo asset discovery
For more details, see docs/DOCS.md.