On Linux, installing an app is not always the same thing as downloading it.
Sometimes you download an .rpm file. Sometimes you get an AppImage. Sometimes the app comes as a .zip or .tar.gz archive. And sometimes, like with Antigravity IDE, you extract a folder, click the binary, and the app opens.
But then you hit the annoying part: The app works, but it does not show up in your app launcher. You cannot search for it from GNOME. You cannot run it from anywhere in the terminal. And if you leave it in your Downloads folder, your setup starts to feel messy.
This guide explains how to install those apps properly on Fedora.
We will cover three:
- How to install apps from RPM files.
- How to handle apps that come as
.zipor.tar.gzarchives. - How to create a launcher so the app appears in your Fedora app menu.
By the end, you should understand what Fedora expects from a manually installed app. I also included a small Bash script at the end that automates most of the process, but we will start with the manual steps first so the script does not feel like magic.
P.S. This guide uses Fedora for the examples, but the manual install pattern works on most Linux distributions. The main difference is the package manager. Fedora uses dnf for .rpm files, Ubuntu and Debian use apt for .deb files, Arch uses pacman, and openSUSE uses zypper. But for apps distributed as .zip, .tar.gz, or AppImage files, the core workflow is almost the same: extract the app, move it to a stable location, optionally symlink the executable into ~/.local/bin, then create a .desktop launcher in ~/.local/share/applications.
The simple rule
There are three different things people often call “installing” an app on Linux.
The first is placing the app files somewhere sensible.
The second is making the app executable from the terminal.
The third is creating a .desktop launcher so your desktop environment can show the app like a normal application.
For example, if you extract an app into your Downloads folder and run it like this:
./my-app
That app is not really installed. It is just being executed from the current folder.
A cleaner setup looks like this:
~/.local/opt/my-app/ # app files live here
~/.local/bin/my-app # command available from terminal
~/.local/share/applications/my-app.desktop # app launcher lives here
This gives you a clean user-level install without needing to touch system directories.
Recommended folders for manual app installs
For apps you install only for your own user account, use:
~/.local/opt
For apps you want available system-wide, use:
/opt
For most personal Fedora setups, I recommend ~/.local/opt.
Why?
Because it does not need sudo, it keeps your app files away from Downloads, and it follows the idea of user-local software.
Create the folder once:
mkdir -p ~/.local/opt
You can also create these two folders:
mkdir -p ~/.local/bin
mkdir -p ~/.local/share/applications
They will be useful later.
Case 1: Installing an RPM file on Fedora
If the app comes as an .rpm file, that is the easiest case.
For example:
some-app.rpm
Install it with dnf:
sudo dnf install ./some-app.rpm
The ./ matters if the file is in your current directory. It tells Fedora you are installing a local file, not searching online repositories.
Example:
cd ~/Downloads
sudo dnf install ./postman.rpm
Once installed, Fedora should handle the app launcher, icons, executable paths, and menu integration automatically.
You can usually run the app from the terminal by typing its command name, or search for it from the app launcher.
If you are on an Ubuntu-based distro, the equivalent command is usually:
sudo apt install ./some-app.deb
But on Fedora, use:
sudo dnf install ./some-app.rpm
Case 2: Installing a compressed app archive
Some apps do not come as RPMs. They come as archives.
Common examples:
app-name.zip
app-name.tar.gz
app-name.tar.xz
Postman, Antigravity IDE, and many Electron-based apps often follow this pattern.
In this case, Fedora does not automatically know how to install the app. You need to extract it, move it somewhere sensible, and create the launcher yourself.
Extract the archive
For a .zip file:
cd ~/Downloads
unzip app-name.zip
If unzip is not installed:
sudo dnf install unzip
For a .tar.gz file:
cd ~/Downloads
tar -xzf app-name.tar.gz
For a .tar.xz file:
cd ~/Downloads
tar -xf app-name.tar.xz
After extraction, inspect the folder:
ls
You are looking for the actual executable.
For example, with Antigravity IDE, the executable may be:
/home/gideon/.local/opt/Antigravity IDE/antigravity-ide
With Postman, it may be:
/home/gideon/.local/opt/Postman/Postman
Move the app out of Downloads
Do not leave manually installed apps in Downloads.
Move them to ~/.local/opt.
Example:
mkdir -p ~/.local/opt
mv "Antigravity IDE" ~/.local/opt/
Now the app lives here:
/home/gideon/.local/opt/Antigravity IDE
Test the executable directly:
"/home/gideon/.local/opt/Antigravity IDE/antigravity-ide"
If the app opens, the binary works.
Now you only need to integrate it with your desktop and terminal.
Make the app runnable from anywhere
If you want to run the app from any terminal location, create a symbolic link in ~/.local/bin.
First, make sure ~/.local/bin exists:
mkdir -p ~/.local/bin
Then create a symlink:
ln -s "/home/gideon/.local/opt/Antigravity IDE/antigravity-ide" ~/.local/bin/antigravity-ide
Now try:
antigravity-ide
If the command does not work, check whether ~/.local/bin is in your PATH:
echo $PATH
You should see something like:
/home/gideon/.local/bin
If it is missing, add it to your shell configuration.
For Bash:
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
For Zsh:
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
Now the app should run from anywhere:
antigravity-ide
Make the app show up in Fedora’s app launcher
This is where .desktop files come in.
A .desktop file tells GNOME or KDE:
- the app name
- where the executable lives
- which icon to use
- whether it should open in a terminal
- which category it belongs to
User-level launchers live here:
~/.local/share/applications
Create the launcher:
nano ~/.local/share/applications/antigravity-ide.desktop
Paste this:
[Desktop Entry]
Name=Antigravity IDE
Comment=AI coding editor
Exec="/home/gideon/.local/opt/Antigravity IDE/antigravity-ide"
Icon=/home/gideon/.local/share/icons/antigravity-ide.png
Terminal=false
Type=Application
Categories=Development;IDE;
StartupWMClass=antigravity-ide
Save the file.
In Nano:
Ctrl + O
Enter
Ctrl + X
Then make it executable:
chmod +x ~/.local/share/applications/antigravity-ide.desktop
Update the desktop database:
update-desktop-database ~/.local/share/applications
Now search for “Antigravity IDE” from your Fedora app launcher.
Understanding the .desktop file
Here is what each line does.
[Desktop Entry]
This tells Linux that the file is a desktop launcher.
Name=Antigravity IDE
This is the name that appears in your app launcher.
Comment=AI coding editor
This is a short description of the app.
Exec="/home/gideon/.local/opt/Antigravity IDE/antigravity-ide"
This is the command Fedora runs when you click the app.
Because the folder name has a space, the path is wrapped in quotes.
Icon=applications-development
Using applications-development tells Fedora to use a generic development icon. Instead, I downloaded an icon and placed it in the icons directory which I had previously created for icons that do not ship with the tarball file. So you don’t get all worked up if you do not see the icons directory (I talk about this in the next section in a little bit more detail).
If you have a real icon file, you use an absolute path instead:
Icon=/home/gideon/.local/share/icons/antigravity-ide.png
If your application ships with an icon there’s no need for that workaround, just point to it instead like I did with this Postman config:
Icon=/home/gideon/.local/opt/Postman/app/resources/app/assets/icon.png
Terminal=false
This means the app should open normally, not inside a terminal.
Type=Application
This tells the desktop environment that the launcher opens an app.
Categories=Development;IDE;
This helps Fedora group the app correctly.
StartupWMClass=antigravity-ide
This helps GNOME match the running window to the launcher icon.
What if the app has no icon?
Some downloaded apps do not include a normal .png, .svg, or .ico file.
You can check with:
find ~/.local/opt/Antigravity\ IDE -iname "*.png"
find ~/.local/opt/Antigravity\ IDE -iname "*.svg"
find ~/.local/opt/Antigravity\ IDE -iname "*.ico"
If nothing appears, use a generic icon:
Icon=applications-development
Other useful generic icons include:
Icon=utilities-terminal
Icon=application-x-executable
Icon=system-run
If you later download or create a real icon, save it here:
mkdir -p ~/.local/share/icons
For example:
/home/gideon/.local/share/icons/antigravity.png
Then update the .desktop file:
Icon=/home/gideon/.local/share/icons/antigravity.png
After that, refresh the desktop database:
update-desktop-database ~/.local/share/applications
You may need to log out and log back in if GNOME keeps showing the old icon.
Testing the launcher
You can test a desktop launcher without searching through the app menu.
Use:
gtk-launch antigravity-ide
The name comes from the desktop file name.
For example:
antigravity-ide.desktop
becomes:
gtk-launch antigravity-ide
If the app opens, your launcher works.
You can also validate the desktop file:
desktop-file-validate ~/.local/share/applications/antigravity-ide.desktop
If there is no output, the file is valid.
If the command is missing, install the desktop utilities package:
sudo dnf install desktop-file-utils
Avoid spaces in app folder names if possible
Linux can handle spaces in paths, but they are annoying.
This works:
"/home/gideon/.local/opt/Antigravity IDE/antigravity-ide"
But this is cleaner:
/home/gideon/.local/opt/Antigravity-IDE/antigravity-ide
You can rename the folder:
mv "/home/gideon/.local/opt/Antigravity IDE" "/home/gideon/.local/opt/Antigravity-IDE"
Then update your desktop file:
Exec=/home/gideon/.local/opt/Antigravity-IDE/antigravity-ide
And update your symlink:
rm ~/.local/bin/antigravity-ide
ln -s /home/gideon/.local/opt/Antigravity-IDE/antigravity-ide ~/.local/bin/antigravity-ide
This is less error-prone.
Example: Full Antigravity IDE setup
Assume the app is already extracted and lives here:
/home/gideon/.local/opt/Antigravity IDE
And the executable is:
/home/gideon/.local/opt/Antigravity IDE/antigravity-ide
First, test it:
"/home/gideon/.local/opt/Antigravity IDE/antigravity-ide"
Then create a terminal command:
mkdir -p ~/.local/bin
ln -s "/home/gideon/.local/opt/Antigravity IDE/antigravity-ide" ~/.local/bin/antigravity-ide
Test it:
antigravity-ide
Then create the launcher:
nano ~/.local/share/applications/antigravity-ide.desktop
Paste:
[Desktop Entry]
Name=Antigravity IDE
Comment=AI coding editor
Exec="/home/gideon/.local/opt/Antigravity IDE/antigravity-ide"
Icon=applications-development
Terminal=false
Type=Application
Categories=Development;IDE;
StartupWMClass=antigravity-ide
Then run:
chmod +x ~/.local/share/applications/antigravity-ide.desktop
update-desktop-database ~/.local/share/applications
Test it:
gtk-launch antigravity-ide
If it opens, you are done.
Example: Full Postman setup
Assume Postman was extracted into:
~/Downloads/Postman
Move it:
mkdir -p ~/.local/opt
mv ~/Downloads/Postman ~/.local/opt/
Test the executable:
/home/gideon/.local/opt/Postman/Postman
Create a symlink:
mkdir -p ~/.local/bin
ln -s /home/gideon/.local/opt/Postman/Postman ~/.local/bin/postman
Now you can run:
postman
Create the launcher:
nano ~/.local/share/applications/postman.desktop
Paste:
[Desktop Entry]
Name=Postman
Comment=API development environment
Exec=/home/gideon/.local/opt/Postman/Postman
Icon=/home/gideon/.local/opt/Postman/app/resources/app/assets/icon.png
Terminal=false
Type=Application
Categories=Development;Utility;
StartupWMClass=Postman
Then run:
chmod +x ~/.local/share/applications/postman.desktop
update-desktop-database ~/.local/share/applications
Now Postman should appear in your app launcher.
Troubleshooting
The app opens from the terminal but not from the launcher
Check the Exec= path.
Run:
ls -al "/path/to/the/executable"
If the file does not exist, the launcher cannot work.
Also make sure the executable has execute permission:
chmod +x "/path/to/the/executable"
The app appears in the launcher but has no icon
The icon path is probably wrong.
Check whether the icon file exists:
ls -al /path/to/icon.png
If you do not have an icon, use a generic one:
Icon=applications-development
The app opens, but Fedora does not group the window correctly
The StartupWMClass may be wrong.
Open the app, then run:
xprop WM_CLASS
Click the app window.
You may see something like:
WM_CLASS(STRING) = "antigravity-ide", "Antigravity IDE"
Use the correct value in your desktop file:
StartupWMClass=Antigravity IDE
or:
StartupWMClass=antigravity-ide
Then refresh:
update-desktop-database ~/.local/share/applications
The command does not run from anywhere
Check your PATH:
echo $PATH
Make sure this appears somewhere:
/home/gideon/.local/bin
If not, add it:
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
Then test again:
antigravity-ide
The mental model
Here is the clean way to think about it:
An RPM installs the app for you.
A Flatpak installs the app for you.
But a .zip or .tar.gz archive usually just gives you files.
When you manually install an archived app, you are responsible for three things:
- Put the app somewhere stable.
- Make it runnable from the terminal.
- Create a desktop launcher.
A good Fedora setup looks like this:
~/.local/opt/app-name
~/.local/bin/app-name
~/.local/share/applications/app-name.desktop
Once you understand that, manually installing apps on Fedora stops feeling mysterious.
Want to automate this?
After going through the manual process a few times, I turned it into a small Bash script.
The script asks for the downloaded app location, lets you choose where to install it, helps you create a terminal command, and generates a .desktop launcher so the app can appear in your app menu.
It does not try to replace your package manager. It is mainly for apps that come as archives, such as .zip, .tar.gz, .tar.xz, and similar formats.
The basic idea is the same as the manual process in this guide:
- Extract the downloaded app.
- Move it to a stable location.
- Make the executable runnable.
- Create a command in `
~/.local/bin. - Generate a
.desktoplauncher.
You can find the script here:
`
https://github.com/YOUR_USERNAME/linux-app-launcher-installer
`
It is still an early version, so you may run into edge cases with apps that use unusual folder layouts, missing icons, AppImages, or desktop launchers that need extra fields like Path= or StartupWMClass.
That said, the script is intentionally simple. You can inspect it, modify it, and adapt it to your own Linux setup.
If you are learning Linux, I recommend doing the manual process at least once before using the script. The script is useful, but the real value is understanding what it automates.

Top comments (0)