FLATPAK-RUN(1)
okay bestie, you just opened FLATPAK RUN, section 1 of the manual. it's the flatpak run page and it is long, so buckle up. we're doing this together. π
β¨ NAME β¨
flatpak-run β runs an application, or opens a shell in a runtime. that's the whole vibe. that's the assignment. π
π¦ SYNOPSIS π¦
flatpak run [OPTION...] REF [ARG...]
like, that's it. REF and then whatever else you wanna throw at it. simple. iconic. β¨
πΈ DESCRIPTION πΈ
so here's the tea, bestie. if REF names an installed application, Flatpak runs that app inside a sandboxed environment. any extra arguments you tack on get passed straight through to the application. π«
the app's current branch and arch get used, unless you say otherwise with --branch or --arch. also go peek at flatpak-make-current(1) if you're curious. π
if REF names a runtime instead, then a shell gets opened inside the runtime. super handy for development and testing, ngl. if there's any ambiguity about which branch to use, you'll get prompted to choose β so use --branch to skip that whole conversation. and the primary arch gets used unless you specify otherwise with --arch. π
by default, Flatpak looks for the application or runtime in the per-user installation first, and then in all system installations. wanna override that? you got --user, --system and --installation. pick your fighter. π₯
π the sandbox, explained π
Flatpak creates a sandboxed environment for the app to run in, and it does that by:
- mounting the right runtime at
/usr - mounting a writable directory at
/var, whose contents are preserved between application runs - mounting the application itself at
/app
the deets of that sandboxed environment are controlled by the application metadata and by various options you pass to the run command, like --share and --socket. access is allowed if it was requested either in the application metadata file or with an option β and the user hasn't overridden it. no sneaking, no surprises. π΅οΈ
the remaining arguments get passed to the command that actually runs in the sandboxed environment. and if you're doing file stuff, go read up on the --file-forwarding option, it handles file arguments for you. π
π environment variables, aka the drama π
environment variables are generally passed on to the sandboxed application, with certain exceptions β as long as --clear-env is not specified. the application metadata can override environment variables, and so can the --env option. π
apart from all that, Flatpak always unsets or overrides the following variables, because their session values are likely to interfere with the functioning of the sandbox:
PATH
LD_LIBRARY_PATH
LD_PRELOAD
LD_AUDIT
XDG_CONFIG_DIRS
XDG_DATA_DIRS
SHELL
TEMP
TEMPDIR
TMP
TMPDIR
XDG_RUNTIME_DIR
container
TZDIR
PYTHONPATH
PYTHONPYCACHEPREFIX
PERLLIB
PERL5LIB
XCURSOR_PATH
GST_PLUGIN_PATH_1_0
GST_REGISTRY
GST_REGISTRY_1_0
GST_PLUGIN_PATH
GST_PLUGIN_SYSTEM_PATH
GST_PLUGIN_SCANNER
GST_PLUGIN_SCANNER_1_0
GST_PLUGIN_SYSTEM_PATH_1_0
GST_PRESET_PATH
GST_PTP_HELPER
GST_PTP_HELPER_1_0
GST_INSTALL_PLUGINS_HELPER
KRB5CCNAME
XKB_CONFIG_ROOT
GIO_EXTRA_MODULES
GDK_BACKEND
VK_ADD_DRIVER_FILES
VK_ADD_LAYER_PATH
VK_DRIVER_FILES
VK_ICD_FILENAMES
VK_LAYER_PATH
__EGL_EXTERNAL_PLATFORM_CONFIG_DIRS
__EGL_EXTERNAL_PLATFORM_CONFIG_FILENAMES
__EGL_VENDOR_LIBRARY_DIRS
__EGL_VENDOR_LIBRARY_FILENAMES
also? several environment variables with the prefix GST_ that gstreamer uses get unset too. since Flatpak 1.12.5. so don't come for me about your gstreamer plugins. π
π the XDG glow-up π
Flatpak also overrides the XDG environment variables so sandboxed applications get pointed at their writable filesystem locations under ~/.var/app/$APPID/:
XDG_DATA_HOME
XDG_CONFIG_HOME
XDG_CACHE_HOME
XDG_STATE_HOME (since Flatpak 1.13)
apps can use the --persist=.local/state and --unset-env=XDG_STATE_HOME options to get a Flatpak 1.13-compatible ~/.local/state on older versions of Flatpak. so you're not left out if you're on an older build, periodt. π«Ά
the host values of these variables are made available inside the sandbox through these HOST_-prefixed variables:
HOST_XDG_DATA_HOME
HOST_XDG_CONFIG_HOME
HOST_XDG_CACHE_HOME
HOST_XDG_STATE_HOME (since Flatpak 1.13)
π§ a few more iconic facts π§
Flatpak sets the environment variable FLATPAK_ID to the application ID of the running app. so the app always knows who it is. main character energy, honestly. π
Flatpak also bind-mounts, read-only, the host's /etc/os-release (or /usr/lib/os-release as a fallback, if the first one isn't available) to /run/host/os-release, in accordance with the os-release specification[1]. β
and if parental controls support is enabled, flatpak will check the current user's parental controls settings, and will refuse to run an app if it is blocklisted for the current user. nope. not today. π
π OPTIONS π
here are all the options you can understand, bestie. all of them. we're not skipping a single one. β¨
-h,--helpβ show the help options and dip out. π-u,--userβ look for the application and runtime in per-user installations.--systemβ look for the application and runtime in the default system-wide installations.--installation=NAMEβ look for the application and runtime in the system-wide installation named by NAME, chosen from the ones defined in/etc/flatpak/installations.d/. btw, using--installation=defaultis equivalent to using--system. π―-v,--verboseβ print debug information while the command is being processed. the receipts, basically. π§Ύ--ostree-verboseβ print OSTree debug information while the command is being processed. even more receipts. π--arch=ARCHβ the architecture to run. peepflatpak --supported-archesfor the architectures your host supports. ποΈ--command=COMMANDβ the command to run instead of the one listed in the application metadata. π«--cwd=DIRβ the directory to run the command in. heads up though: this has to be a directory inside the sandbox. π--branch=BRANCHβ the branch to use. πΏ-d,--develβ use the devel runtime that's specified in the application metadata instead of the regular runtime, and use a seccomp profile that is less likely to break development tools. devs, this one's for you. π₯--runtime=RUNTIMEβ use this runtime instead of the one specified in the application metadata. this is a full tuple, like for exampleorg.freedesktop.Sdk/x86_64/1.2, but partial tuples are allowed too. any empty or missing parts get filled in with the corresponding values specified by the app. π§©--runtime-version=VERSIONβ use this version of the runtime instead of the one specified in the application metadata. this overrides any version specified with the--runtimeoption. so it wins. periodt. π--share=SUBSYSTEMβ share a subsystem with the host session. this overrides the Context section from the application metadata. SUBSYSTEM must be one of:network,ipc. you can use this option multiple times. π«±--unshare=SUBSYSTEMβ don't share a subsystem with the host session. this overrides the Context section from the application metadata. SUBSYSTEM must be one of:network,ipc. you can use this option multiple times. π«--share-if=SUBSYSTEM:CONDITIONβ share a subsystem with the host session conditionally, only when the specified condition is met at runtime. this overrides the Context section from the application metadata. SUBSYSTEM must be one of:network,ipc. CONDITION must be one of:true,false,has-input-device,has-wayland,has-usb-device,has-usb-portal. conditions can be negated with!, for example!has-input-device. you can use this option multiple times. available since 1.17. π
see the Conditional Permissions section in flatpak-metadata(5) for more details. π
--socket=SOCKETβ expose a well known socket to the application. this overrides the Context section from the application metadata. SOCKET must be one of:x11,wayland,fallback-x11,pulseaudio,system-bus,session-bus,ssh-auth,pcsc,cups,gpg-agent,inherit-wayland-socket. you can use this option multiple times. π--nosocket=SOCKETβ don't expose a well known socket to the application. this overrides the Context section from the application metadata. SOCKET must be one of:x11,wayland,fallback-x11,pulseaudio,system-bus,session-bus,ssh-auth,pcsc,cups,gpg-agent,inherit-wayland-socket. you can use this option multiple times. π--socket-if=SOCKET:CONDITIONβ expose a well-known socket to the application conditionally, only when the specified condition is met at runtime. this overrides the Context section from the application metadata. SOCKET must be one of:x11,wayland,fallback-x11,pulseaudio,system-bus,session-bus,ssh-auth,pcsc,cups,gpg-agent,inherit-wayland-socket. CONDITION must be one of:true,false,has-input-device,has-wayland,has-usb-device,has-usb-portal. conditions can be negated with!, for example!has-wayland. you can use this option multiple times. available since 1.17. β¨
see the Conditional Permissions section in flatpak-metadata(5) for more details. π
--device=DEVICEβ expose a device to the application. this overrides the Context section from the application metadata. DEVICE must be one of:dri,input,usb,kvm,shm,all. you can use this option multiple times. π¨οΈ--nodevice=DEVICEβ don't expose a device to the application. this overrides the Context section from the application metadata. DEVICE must be one of:dri,input,usb,kvm,shm,all. you can use this option multiple times. π«--device-if=DEVICE:CONDITIONβ expose a device to the application conditionally, only when the specified condition is met at runtime. this overrides the Context section from the application metadata. DEVICE must be one of:dri,input,usb,kvm,shm,all. CONDITION must be one of:true,false,has-input-device,has-wayland,has-usb-device,has-usb-portal. conditions can be negated with!, for example!has-input-device. you can use this option multiple times. available since 1.17. π
see the Conditional Permissions section in flatpak-metadata(5) for more details. π
--allow=FEATUREβ allow access to a specific feature. this overrides the Context section from the application metadata. FEATURE must be one of:devel,multiarch,bluetooth. you can use this option multiple times. β
see flatpak-build-finish(1) for the meaning of the various features. π
--disallow=FEATUREβ disallow access to a specific feature. this overrides the Context section from the application metadata. FEATURE must be one of:devel,multiarch,bluetooth. you can use this option multiple times. β--allow-if=FEATURE:CONDITIONβ bestie this one is conditional access, the pickiest of permissions π It lets the app get at a specific feature, but only when the condition you name is actually true at runtime. It overrides theContextsection from the application metadata.FEATUREhas to be one of:devel,multiarch,bluetooth.CONDITIONhas to be one of:true,false,has-input-device,has-wayland,has-usb-device,has-usb-portal. You can negate a condition with!, like!has-input-deviceβ literally the "not" of it all. This option can be used multiple times. Available since 1.17. β¨
For the whole lore on this, go read the Conditional Permissions section in flatpak-metadata(5), no cap.
--filesystem=FILESYSTEMβ okay so this hands the app a slice of the filesystem. It overrides theContextsection from the application metadata.FILESYSTEMcan be one of:home,host,host-os,host-etc,host-root,xdg-desktop,xdg-documents,xdg-download,xdg-music,xdg-pictures,xdg-public-share,xdg-templates,xdg-videos,xdg-run,xdg-config,xdg-cache,xdg-data, an absolute path, or a homedir-relative path like~/dir, or paths relative to the xdg dirs likexdg-download/subdir. The optional:rosuffix means read-only, don't even think about writing. The optional:createsuffix means read-write and it gets created if it's not there yet. This option can be used multiple times. For what all these filesystems actually mean, check the"[Context] filesystems"list inflatpak-metadata(5). π«Ά--nofilesystem=FILESYSTEMβ the undo button π This reverses the effect of a previous--filesystem=FILESYSTEMin the app's manifest and/or the overrides you set up withflatpak-override(1). It overrides theContextsection of the application metadata.FILESYSTEMtakes the same values as for--filesystem, but heads up: the:roand:createsuffixes are not used here. This option can be used multiple times.
Important, listen up: this does not block access to a more narrowly-scoped--filesystem. Say an app has the equivalent of--filesystem=xdg-config/MyAppin its manifest or as a system-wide override, and thenflatpak override --user --nofilesystem=homeas a per-user override β it gets blocked from most of the home directory, yes, but it can still get into$XDG_CONFIG_HOME/MyApp. Sneaky, but that's how it is. π
And as a special case, --nofilesystem=host:reset ignores all --filesystem permissions inherited from the app manifest or flatpak-override(1), plus it does the same thing as --nofilesystem=host. Double whammy. π₯
--add-policy=SUBSYSTEM.KEY=VALUEβ adds a generic policy option. For example,"--add-policy=subsystem.key=v1 --add-policy=subsystem.key=v2"would map to this metadata:
[Policy subsystem]
key=v1;v2;
This option can be used multiple times.
--remove-policy=SUBSYSTEM.KEY=VALUEβ removes a generic policy option. This option can be used multiple times. Bye bye policy π--usb=TYPE[:DATA]β adds a USB device query to the application metadata, which lets the USB portal enumerate and use the device.TYPEmust be one of:all,cls,dev,vnd. Let's break it down πallβ matches all devices. all of them. every last one. πclsβ a device class and subclass query.DATAmust be in the formCLASS:SUBCLASSwhere bothCLASSandSUBCLASSmust be a valid 2-digit hexadecimal class id number. Alternatively,SUBCLASSmay be*to match all subclasses.devβ a device product id query.DATAmust be a valid 4-digit hexadecimal product id number, for example0a1b. It requires avndfilter in the query.vndβ a device vendor id query.DATAmust be a valid 4-digit hexadecimal vendor id number greater than zero, for example0fab.
You can compose multiple device queries together with the + sign, for example --usb=vnd:0123+dev:4567. The dev filter requires a vnd. Available since 1.15.11. π
--nousb=VENDOR_ID:PRODUCT_IDβ adds a blocking USB device query to the application metadata. Blocked devices take precedence over allowed devices β so yeah, the block wins, always. The syntax is exactly equal to--usb. Available since 1.15.11.--env=VAR=VALUEβ sets an environment variable in the application. This overrides theContextsection from the application metadata. This option can be used multiple times.--unset-env=VARβ unsets an environment variable in the application. This overrides theunset-environmententry in the[Context]group of the metadata, and the[Environment]group. This option can be used multiple times.--env-fd=FDβ reads environment variables from the file descriptorFD, and sets them as if via--env. Iconic for when you don't want environment variables and their values being visible to other users. π€«
Each environment variable is in the form VAR=VALUE followed by a zero byte. This is the same format used by env -0 and /proc/*/environ.
--clear-envβ does not pass environment variables from the outside into the sandboxed application. Explicitly set and unset environment variables still get applied though. So the ones you asked for stay. π--own-name=NAMEβ lets the application own the well known nameNAMEon the session bus. IfNAMEends with.*, it lets the app own all matching names. This overrides theContextsection from the application metadata. This option can be used multiple times.--talk-name=NAMEβ lets the application talk to the well known nameNAMEon the session bus. IfNAMEends with.*, it lets the app talk to all matching names. This overrides theContextsection from the application metadata. This option can be used multiple times.--no-talk-name=NAMEβ doesn't allow the application to talk to the well known nameNAMEon the session bus. IfNAMEends with.*, it allows the application to talk to all matching names. This overrides theContextsection from the application metadata. This option can be used multiple times.--system-own-name=NAMEβ lets the application own the well known nameNAMEon the system bus. IfNAMEends with.*, it lets the app own all matching names. This overrides theContextsection from the application metadata. This option can be used multiple times.--system-talk-name=NAMEβ lets the application talk to the well known nameNAMEon the system bus. IfNAMEends with.*, it lets the app talk to all matching names. This overrides theContextsection from the application metadata. This option can be used multiple times.--system-no-talk-name=NAMEβ doesn't allow the application to talk to the well known nameNAMEon the system bus. IfNAMEends with.*, it allows the application to talk to all matching names. This overrides theContextsection from the application metadata. This option can be used multiple times.--a11y-own-name=NAMEβ lets the application own the well known nameNAMEon the a11y bus. IfNAMEends with.*, it lets the app own all matching names. This overrides theContextsection from the application metadata. This option can be used multiple times.--persist=FILENAMEβ if the app doesn't have access to the real homedir, this makes the (homedir-relative) pathFILENAMEa bind mount to the corresponding path in the per-application directory, so that location can be used for persistent data. This overrides theContextsection from the application metadata. This option can be used multiple times. π¦--no-session-busβ runs this instance without the filtered access to the session dbus connection. Note: this is the default when run with--sandbox.--session-busβ allows filtered access to the session dbus connection. This is the default, except when run with--sandbox.
Sandbox mode lore: even if you allow access to the session bus, the sandbox can't talk to or own the application ids (org.the.App.*) on the bus β unless they're explicitly added β only names in the.Sandboxedsubset (org.the.App.Sandboxed.*andorg.mpris.MediaPlayer2.org.the.App.Sandboxed.*). Periodt.
--no-a11y-busβ runs this instance without access to the accessibility bus. Note: this is the default when run with--sandbox.--a11y-busβ allows access to the accessibility bus. This is the default, except when run with--sandbox.--sandboxβ runs the application in sandboxed mode, which means dropping all the extra permissions it would otherwise have, plus access to the session/system/a11y buses and document portal. It's giving β¨full lockdownβ¨.--log-session-busβ logs session bus traffic. Genuinely so useful for seeing what access you need to allow in your D-Bus policy. π--log-system-busβ logs system bus traffic. Also so useful for seeing what access you need to allow in your D-Bus policy.-p,--die-with-parentβ kills the entire sandbox when the launching process dies. Dramatic but necessary. π--parent-pid=PIDβ specifies the pid of the "parent" flatpak, used by--parent-expose-pidsand--parent-share-pids.--parent-expose-pidsβ makes the processes of the new sandbox visible in the sandbox of the parent flatpak, as defined by--parent-pid.--parent-share-pidsβ uses the same process ID namespace for the processes of the new sandbox and the sandbox of the parent flatpak, as defined by--parent-pid. Implies--parent-expose-pids.--instance-id-fdβ writes the instance ID string to the given file descriptor.--file-forwardingβ if this option is specified, the remaining arguments are scanned, and all arguments enclosed between a pair of@@arguments are interpreted as file paths, exported in the document store, and passed to the command in the form of the resulting document path. Arguments between"@@u"and"@@"are considered URIs, and any"file:"URIs are exported. The exports are non-persistent and with read and write permissions for the application. π--app-path=PATHβ instead of mounting the app's content on/appin the sandbox, mountPATHon/app, and the app's content on/run/parent/app. If the app has extensions, they will also be redirected into/run/parent/app, and will not be included in theLD_LIBRARY_PATHinside the sandbox.--app-path=β as a special case,--app-path=(with an emptyPATH) results in an empty directory being mounted on/app. Empty. Nothing. Void. π--usr-path=PATHβ okay so instead of mounting the runtime's files on/usrinside the sandbox, you mountPATHon/usrand the runtime's normal files get yeeted over to/run/parent/usr. And if the runtime has extensions? Those get redirected into/run/parent/usrtoo, and ngl they will not be in theLD_LIBRARY_PATHinside the sandbox. π
real talk: this one's basically only useful if you pair it up with--app-path=and--env=LD_LIBRARY_PATH=.... Like, it's giving very "situationship with two other flags" energy. π
β¨ EXAMPLES β¨
Okay bestie, here's the vibe in action π
$ flatpak run org.gnome.gedit
$ flatpak run --devel --command=bash org.gnome.Builder
$ flatpak run --command=bash org.gnome.Sdk
$ flatpak run org.gnome.Boxes --nousb=0fd9:*
See? Look at those. Chef's kiss. π Notice how the app arguments just come along for the ride at the end β --nousb=0fd9:* there is being passed to the app itself, not to flatpak run. That's the whole point. π¦
π SEE ALSO π
Your little squad of related pages, go read them fr fr:
π NOTES π
- os-release specification
https://www.freedesktop.org/software/systemd/man/os-release.html
And that's a wrap on the whole page, bestie!! πβ¨ This is the flatpak manual β page FLATPAK RUN(1) β so if you ever forget which page you're on, it's literally right there in the footer, giving main character energy at the bottom of the screen. π Go run something cute. π§
π¦ where this page comes from
- fedora 44: flatpak 1.18.4-1.fc44 Β· LGPL-2.1-or-later
- fedora 44: flatpak 1.18.4-1.fc44 Β· LGPL-2.1-or-later
- nixpkgs unstable: flatpak 1.18.4
- ubuntu stonking: flatpak 1.18.4-1
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms