g.extension(1grass)

πŸ’– g.extension πŸ’–

okay bestie, welcome to the GRASS User's Manual glow-up of g.extension ✨

Maintains GRASS Addons extensions in local GRASS installation.

Bestie it downloads and installs extensions from the GRASS Addons repository or other source into the local GRASS installation β€” or yeets installed extensions out. Periodt πŸ’…

KEYWORDS: general, installation, extensions, addons, download πŸŽ€


✨ SYNOPSIS ✨

lowkey here's how you call her:

g.extension
g.extension --help
g.extension [-lcgasdifto] extension=name operation=string  [url=url]
[prefix=path]   [proxy=proxy[,proxy,...]]   [branch=branch]   [--help]
[--verbose]  [--quiet]  [--ui]

🚩 Flags 🚩

like the vibes you can flip on:

  • -l β€” List available extensions in the official GRASS Addons repository πŸ‘‘
  • -c β€” List available extensions in the official GRASS Addons repository including module description (she gives you the tea β˜•)
  • -g β€” List available extensions in the official GRASS Addons repository (shell script style) 🐚
  • -a β€” List locally installed extensions 🌸
  • -s β€” Install system-wide (may need system administrator rights, so like... sudo energy πŸ‘‘)
  • -d β€” Download source code and exit πŸ¦‹
  • -i β€” Do not install new extension, just compile it 🧚
  • -f β€” Force removal when uninstalling extension (operation=remove) πŸ’€
  • -t β€” Operate on toolboxes instead of single modules (experimental β€” she's still in her testing era πŸ™ˆ)
  • -o β€” url refers to a fork of the official extension repository πŸ“
  • --help β€” Print usage summary
  • --verbose β€” Verbose module output (she tells you everything πŸ—£οΈ)
  • --quiet β€” Quiet module output (she says nothing 🀫)
  • --ui β€” Force launching GUI dialog

πŸŽ€ Parameters πŸŽ€

the ingredients for the potion:

  • extension=name [required] β€” Name of extension to install or remove. Also the name of the toolbox (set of extensions) when the -t flag is given πŸ’œ
  • operation=string [required] β€” Operation to be performed. Options: add, remove. Default: add. Like... are we adding or are we removing, bestie? pick one ✨
  • url=url β€” URL or directory to get the extension from (supported only on Linux and Mac). The official repository is used by default. User can specify a ZIP file, directory or a repository on common hosting services. If not identified, Subversion repository is assumed. See manual for all options. πŸ‘€
  • prefix=path β€” Prefix where to install extension (ignored when flag -s is given). Default: $GRASS_ADDON_BASE 🏠
  • proxy=proxy[,proxy,...] β€” Set the proxy with: "http=<value>,ftp=<value>" 🌐
  • branch=branch β€” Specific branch to fetch addon from (only used when fetching from git) 🌿

🌈 DESCRIPTION 🌈

so g.extension downloads and installs, removes or updates extensions (addons) from the official GRASS Addons repository or from user-specified source code repositories into the local GRASS installation. She does it all, no cap πŸ’…

Two types of extensions are supported, bestie:

  • Python scripts β€” they are installed without the need of compilation or (usually) the need of special dependencies. easy slay ✨
  • Source code (mostly written in C programming language; may also be written in C++, Fortran or other languages) β€” while on MS-Windows systems the requested GRASS extension is downloaded pre-compiled from the GRASS site, on Unix based systems the installation is preceded by the automated download of the extension's source code along with subsequent compilation and installation. This requires a compiler environment to be present on the user's computer. like, you gotta have the tools fr fr πŸ”§

πŸ’– Managing installed extensions πŸ’–

Re-running g.extension on an installed GRASS Addon extension re-installs the requested extension which may include updates. she just refreshes herself, iconic πŸ‘‘

To bulk-update all locally installed GRASS extensions, g.extension.all module is available. the group chat of updates 🫢

🌸 Where the extensions are installed 🌸

GRASS extensions are installed by g.extension into a dedicated directory. The default is a directory for application data and settings inside the user's home directory. On GNU/Linux it is $HOME/.grass8/addons, on MS-Windows it is %APPDATA%\Roaming\GRASS8\addons. The name of the directory is stored in the GRASS_ADDON_BASE environmental variable. πŸ“

The flag -s changes this install target directory to the GRASS installation directory (determined by GISBASE environmental variable, e.g. /usr/) rather than the default directory defined as per GRASS_ADDON_BASE (see also documentation for variables). g.extension checks if the user has permission to write to GISBASE or GRASS_ADDON_BASE. she double-checks before she does anything, queen behavior πŸ’…

The place where the extensions are installed can be customized by the option prefix. Ensuring that these extensions will be accessible in GRASS is in this case in the responsibility of the user. you're on your own for that part bestie, iykyk πŸ™ˆ

πŸ¦‹ Source code sources and repositories πŸ¦‹

GRASS Addons repository on GitHub

By default, g.extension installs extensions from the official GRASS Addons GitHub repository. However, different sources can be specified using the url option. 🌐

Individual extensions can also be installed by providing a URL to the source code on GitHub or OSGeo Trac. The latter, however, works only for certain directories where the download of ZIP files was enabled by project administrators of the trac server. so like... permissions matter, ngl πŸŽ€

Local source code directory

Optionally, new extension can be also installed from a source code placed in a local directory on disk. This is advantageous when developing a new module. To keep the directory clean, the directory content is copied to a temporary directory and the compilation happens there. she respects your workspace fr fr 🧹

Source code in a ZIP or TAR archive

In addition, new extension can be also installed from a ZIP file or an archive file from the TAR family (e.g., .tar.gz or .bz2). The file can be on disk (specified with a path), or on the web (specified by an URL). πŸ—œοΈ

Online repositories: GitHub, GitLab and Bitbucket

For well known general hosting services, namely GitHub, GitLab and Bitbucket, g.extension supports the download of a repository. Here the user only needs to provide a base URL to the repository web page (with or without the https:// part). For GitHub, GitLab and Bitbucket, the latest source code in the default branch is downloaded, unless a specific branch is requested in the branch option. Of course, a user can still specify the full URL of a ZIP file e.g. for a specific release and install the archived code in this way (ZIP file mechanism will be applied). 🌿

For the official repository, g.extension supports listing available extensions (addons) and few other metadata-related operations which depend on a specific infrastructure. For other sources and repositories, this is not supported because it is assumed that other sources contain only one extension, typically a module or group of modules with a Makefile at the root of the repository. no pretending bestie 🫢

Needed directory layout

When none of the above sources is identified, g.extension assumes that the source is in a GitHub repository and uses the git command line tool to obtain the source code. The expected structure of the repository should be the same as the one of the official repository. πŸ“‚

Non-official sources are supported on all operating systems except for MS-Windows. πŸ’€

⭐ Compilation and installation ⭐

On MS-Windows systems, where compilation tools are typically not readily locally installed, g.extension downloads a precompiled executable from the GRASS project server. On all other operating systems where it is not difficult to install compilation tools, g.extension downloads the source code of the requested extension (addon) and compiles it locally. This applies for both C and Python modules as well as any other extensions. The reason is that more things such as manual page are compiled, not only the source code (which is really necessary to compile just in case of C). she builds it properly bestie, not just the bare minimum πŸ”₯


🌟 EXAMPLES 🌟

Download and install of an extension

Download and install r.stream.distance into current GRASS installation:

g.extension extension=r.stream.distance

This installs the extension from the official repository. For convenience, a shorter syntax can be used:

g.extension r.stream.distance

Download and install of an extension when behind a proxy

Example for an open http proxy:

# syntax: http://proxyurl:proxyport
g.extension extension=r.stream.distance proxy="http=http://proxy.example.com:8080"

Example for a proxy with proxy authentication:

# syntax: http://username:password@proxyurl:proxyport
g.extension extension=r.stream.distance proxy="http=http://username:password@proxy.example.com:8080"

Managing the extensions

List all available extensions in the official GRASS Addons repository:

g.extension -l

List all locally installed extensions:

g.extension -a

Removal of a locally installed extension:

g.extension extension=r.stream.distance operation=remove

Installing from various online repositories: GitHub, GitLab, Bitbucket

Simple URL to GitHub, GitLab, Bitbucket repositories:

g.extension r.example.plus url="https://github.com/wenzeslaus/r.example.plus"

Simple URL to GitHub, GitLab, Bitbucket repositories from a specific (e.g. development) branch:

g.extension r.example.plus url="https://github.com/wenzeslaus/r.example.plus" branch=master

Simple URL to OSGeo Trac (downloads a ZIP file, requires download to be enabled in Trac):

g.extension r.example url=trac.osgeo.org/.../r.example

In general, when a ZIP file or other archive is provided, the full URL can be used:

g.extension r.example url=http://example.com/.../r.example?format=zip

Note that because of MS-Windows operating system architecture, only official repository is supported on this platform. πŸ’€

Install a specific version from Addons

To install a specific version from GRASS Addons, specify the full URL pointing to Trac code browser and include Subversion revision number. For example, this installs the version number 57854 of r.local.relief module:

g.extension r.local.relief url="https://trac.osgeo.org/grass/browser/grass-addons/grass7/raster/r.local.relief?rev=57854&format=zip"

Installing when writing a module locally

Having source code of a GRASS module in a directory on disk one can install it using:

g.extension r.example url=/local/directory/r.example/

🧚 REQUIREMENTS 🧚

In order to clone source code repositories, the git command line tool is required. The installation of single AddOns is most efficient with versions of git that support so called sparse checkout, which was introduced with version 2.25. With older versions of git, the entire AddOns repository will be downloaded. On UNIX like systems, installation is done with the make command line tool. For AddOns written in C / C++, a respective build environment is needed. πŸ”§


πŸ’€ KNOWN ISSUES πŸ’€

Toolboxes in the official repository cannot be downloaded. sorry bestie 🫠

On MS-Windows, only the official repository is working because there is no way of compiling the modules (a Python replacement for Python scripts should be implemented). πŸ’€


πŸ› οΈ TROUBLESHOOTING πŸ› οΈ

Okay bestie, real talk β€” this is where we handle the moments when things are not giving. πŸ’…

Here's the vibe: extensions have to be compiled on Unix based systems (think Linux, Mac OSX, etc.) β€” unless it's a Python extension you're installing. So if you're doing the compiling thing, you literally need a full compiler environment sitting on the user's computer. No compiler = no extension. Periodt. 😭


πŸ’€ ERROR: Please install GRASS development package πŸ’€

So GRASS is there on the user's computer, right? It's installed, it's vibing. But the respective development package is missing in action (it's giving ✨absent✨). πŸ™ˆ

If GRASS got installed from a (Linux) repository, then you also gotta install the grass-dev* package β€” it's commonly named grass-dev or grass-devel, and sometimes it comes with the version number attached. So like, go get that. 🫢

ERROR: Please install GRASS development package
tl;dr β€” GRASS present, dev package absent. Install the grass-dev* package and you're back in business. πŸ”₯

πŸ‘€ SEE ALSO πŸ‘€

  • g.extension.all
  • GRASS 8 Addons Manual pages
  • GRASS Addons wiki page.

πŸ‘‘ AUTHORS πŸ‘‘

  • Markus Neteler β€” original shell script 🐚
  • Martin Landa, Czech Technical University in Prague, Czech Republic β€” Python rewrite 🐍
  • Vaclav Petras, NCSU GeoForAll Lab β€” support for general sources, partial refactoring ✨

πŸ“¦ SOURCE CODE πŸ“¦

Available at: g.extension source code (history)

Latest change: Friday Feb 20 18:42:47 2026 in commit: e6b82e9558564ff8f07766a3d6c5ff08dfd69028

Main index | General index | Topics index | Keywords index | Graphical index | Full index


And that's a wrap, bestie! πŸŽ€ This whole thing lives in the GRASS 8.5.0 Reference Manual β€” the page is g.extension(1grass) β€” and the copyright belongs to Β© 2003-2026 GRASS Development Team. Go forth and extend, you absolute icon. πŸ’–πŸ¦‹πŸŒˆ

πŸ“¦ where this page comes from