Skip to content

Instantly share code, notes, and snippets.

@SanderTheDragon
Last active March 26, 2026 10:57
Show Gist options
  • Select an option

  • Save SanderTheDragon/1331397932abaa1d6fbbf63baed5f043 to your computer and use it in GitHub Desktop.

Select an option

Save SanderTheDragon/1331397932abaa1d6fbbf63baed5f043 to your computer and use it in GitHub Desktop.
A shellscript to create a Postman .deb file, for simple installation on Debian-based Linux distro's. Also creates a .desktop file.

Postman Debian Package Builder

Usage

Simply run the one of the following commands in your terminal and it will download the latest Postman version, build a .deb package and ask you if you want to install it.

if you have curl:

curl https://gist.githubusercontent.com/SanderTheDragon/1331397932abaa1d6fbbf63baed5f043/raw/postman-deb.sh | sh

If you do not have curl:

wget -O - https://gist.githubusercontent.com/SanderTheDragon/1331397932abaa1d6fbbf63baed5f043/raw/postman-deb.sh | sh

License

This script is licensed under the MIT License.

Contributors

  • pedzed: idea for this script
  • SanderTheDragon: initial script and updates

Issues

Building Problems
  • chrisbjr: missing -e in some shells
  • cyfrost: -e not working with direct command
  • fakhamatia: dpkg-deb not building with wrong permissions
Missing Dependencies
  • jveillet: gconf2
  • kagurazakakotori: libgtk2.0-0 and libcanberra-gtk-module
  • wirwolf: desktop-file-utils
Installation Problems
  • maxgalbu, R0nAk: desktop file not installing
Upstream Changes
  • emamut: changed icon path
  • mikiTesf: changed tarball name from Postman to postman
  • stillru: changed tarball name to one without version information
  • 0xjams: changed from GTK 2 to GTK 3

Other

  • sgtcoder: change package name from Postman to postman to follow standards
  • sgtcoder: remove unnecessary creation of postman_$version/usr/share/applications/Postman.desktop

Ideas

  • xlmnxp, cyfrost, Killea: direct curl command (at the top)
  • cyfrost: version check before building
  • n8eloy: -y flag for apt install
  • stillru: using date as version
  • 0xjams: support for ARM64
  • sgtcoder: adding StartupWMClass to Postman.desktop
#!/bin/sh
# SPDX-FileCopyrightText: 2017-2026 SanderTheDragon <sanderthedragon@zoho.com>
#
# SPDX-License-Identifier: MIT
arch=$(dpkg --print-architecture)
echo "Detected architecture: $arch"
case "$arch" in
amd64) downloadURL="https://dl.pstmn.io/download/latest/linux64";;
arm64) downloadURL="https://dl.pstmn.io/download/latest/linux_arm64";;
*)
echo "Unsupported architecture: $arch"
exit
;;
esac
curlExists=$(command -v curl)
echo "Testing Postman version"
dateString=""
if [ -z $curlExists ]; then
dateString=$(wget -S --spider $downloadURL 2>&1 | grep "Date" | awk -F ':' '{ print $2 }')
else
dateString=$(curl -sI $downloadURL 2>&1 | grep "date" | awk -F ':' '{ print $2 }')
fi
targetName="postman-$(date --date="$dateString" "+%y-%j-%H").tar.gz"
versionMaj=$(echo "$targetName" | awk -F '.' '{ print $1 }' | awk -F '-' '{ print $2 }')
versionMin=$(echo "$targetName" | awk -F '.' '{ print $1 }' | awk -F '-' '{ print $3 }')
versionRev=$(echo "$targetName" | awk -F '.' '{ print $1 }' | awk -F '-' '{ print $4 }')
version="$versionMaj.$versionMin-$versionRev"
echo "Most recent Postman version V$version"
current=$(dpkg-query --showformat='${Version}' --show postman 2> /dev/null)
if [ $? -gt 0 ]; then
echo "Postman is not installed"
else
echo "Installed version V$current"
if [ "$current" = "$version" ]; then
echo "The most recent version of Postman is currently installed"
exit
else
echo "Updating Postman to the latest version"
fi
fi
originalPWD="$(pwd)"
targetPWD="$(mktemp -d postman.XXXXXX)"
cd "$targetPWD"
echo "Downloading latest Postman tarball"
if [ -z $curlExists ]; then
wget -q --show-progress $downloadURL -O $targetName
else
curl -# $downloadURL -o $targetName
fi
if [ $? -gt 0 ]; then
echo "Failed to download Postman tarball"
exit
fi
echo "Extracting Postman tarball"
tar -xf $targetName
if [ $? -gt 0 ]; then
echo "Failed to extract Postman tarball"
exit
fi
echo "Creating 'postman_$version' folder structure and files"
mkdir -m 0755 -p "postman_$version"
mkdir -m 0755 -p "postman_$version/usr/share/icons/hicolor/128x128/apps"
mkdir -m 0755 -p "postman_$version/opt/postman"
mkdir -m 0755 -p "postman_$version/DEBIAN"
touch "postman_$version/DEBIAN/control" "postman_$version/DEBIAN/postinst" "postman_$version/DEBIAN/prerm"
echo "Copying files"
cp "Postman/app/resources/app/assets/icon.png" "postman_$version/usr/share/icons/hicolor/128x128/apps/postman.png"
cp -R "Postman/"* "postman_$version/opt/postman/"
echo "Testing whether to use '-e'"
lines=$(echo "\n" | wc -l)
e=""
if [ $lines -eq 1 ]; then
echo "'-e' is required"
e="-e"
else
echo "'-e' is not required"
fi
echo "Writing files"
echo $e "[Desktop Entry]\nType=Application\nName=Postman\nGenericName=Postman API Tester\nIcon=postman\nExec=postman\nPath=/opt/postman\nCategories=Development;\nStartupWMClass=postman" > "postman_$version/opt/postman/Postman.desktop"
echo $e "Package: postman\nVersion: $version\nSection: devel\nPriority: optional\nArchitecture: $arch\nDepends: libgtk-3-0, desktop-file-utils\nMaintainer: You\nDescription: Postman\n API something" > "postman_$version/DEBIAN/control"
echo $e "ln -sf \"/opt/postman/Postman\" \"/usr/bin/postman\"\n\ndesktop-file-install \"/opt/postman/Postman.desktop\"" > "postman_$version/DEBIAN/postinst"
echo $e "rm -f \"/usr/bin/postman\" \"\$(update-desktop-database -v 2>&1 | grep \"Postman.desktop\" | awk -F '\"' '{ print \$2 }')\"" > "postman_$version/DEBIAN/prerm"
echo "Setting modes"
chmod 0775 "postman_$version/opt/postman/Postman.desktop"
chmod 0775 "postman_$version/DEBIAN/control"
chmod 0775 "postman_$version/DEBIAN/postinst"
chmod 0775 "postman_$version/DEBIAN/prerm"
echo "Validating modes"
nc=""
if [ $(stat -c "%a" "postman_$version/DEBIAN/control") != "775" ]; then
echo "File modes are invalid, calling 'dpkg-deb' with '--nocheck'"
nc="--nocheck"
else
echo "File modes are valid"
fi
echo "Building 'postman_$version.deb'"
dpkg-deb $nc -b "postman_$version" > /dev/null
if [ $? -gt 0 ]; then
echo "Failed to build 'postman_$version.deb'"
exit
fi
mv "postman_$version.deb" "$originalPWD"
cd "$originalPWD"
echo "Cleaning up"
rm -rf "$targetPWD"
while true; do
read -p "Do you want to install 'postman_$version.deb' [Y/n] " yn
if [ -z $yn ]; then
yn="y"
fi
case $yn in
[Yy]* ) break;;
[Nn]* ) exit;;
esac
done
echo "Installing"
sudo apt install -y "./postman_$version.deb"
if [ $? -gt 0 ]; then
echo "Failed to install 'postman_$version.deb'"
exit
fi
echo "Removing 'postman_$version.deb'"
rm -f "postman_$version.deb"
@muhammadk1607
Copy link
Copy Markdown

Thanks a lot @SanderTheDragon !

@rizperdana
Copy link
Copy Markdown

Thanks a lot @SanderTheDragon this script really helpful, it works on pop os 22.04, should work on ubuntu and linux mint version too!

@LeCongNam
Copy link
Copy Markdown

Thank you @SanderTheDragon. I'm find postman fix cursor very long until I found it this repo.

@0xjams
Copy link
Copy Markdown

0xjams commented Apr 2, 2024

I added a check so that it downloads the right version depending on the architecture. I also removed gconf2 as a dependency, and it seemed to work just fine.

https://gist.github.com/0xjams/d8ca3c2448e97bfae1cf1812d6e7f9ee

@SanderTheDragon
Copy link
Copy Markdown
Author

@0xjams Thanks for these improvements!

I moved the architecture check to the top, so the date/version is checked for the correct architecture (I would expect that they are the same, but just to be sure).
I also checked the dependencies, and it seems like it now depends on GTK 3 instead of GTK 2, so gconf2 is not needed anymore.

@lopezdonaque
Copy link
Copy Markdown

Thanks for it!!

@sgtcoder
Copy link
Copy Markdown

The P in this should be p. So when you publish it to your repo it follows the lowercase standards.

echo $e "Package: Postman\nVersion: $version\nSection: devel\nPriority: optional\nArchitecture: $arch\nDepends: libgtk-3-0, desktop-file-utils\nMaintainer: You\nDescription: Postman\n API something" > "postman_$version/DEBIAN/control"
Package: Postman
Package: postman

@SanderTheDragon
Copy link
Copy Markdown
Author

@sgtcoder Thanks for the note! I updated it to be postman now.

@OmG3r
Copy link
Copy Markdown

OmG3r commented Aug 18, 2025

Thank you ! 🚀

@sgtcoder
Copy link
Copy Markdown

I also noticed a couple other issues.

We are touching and setting file permission on /usr/share/applications/Postman.desktop, but inserting the content in /opt/postman/Postman.Desktop.

The other thing is I added the WMClass for postman as well

echo $e "[Desktop Entry]\nType=Application\nName=Postman\nGenericName=Postman API Tester\nIcon=postman\nExec=postman\nPath=/opt/postman\nCategories=Development;\nStartupWMClass=postman" >"postman_$version/usr/share/applications/Postman.desktop"
echo $e "Package: postman\nVersion: $version\nSection: devel\nPriority: optional\nArchitecture: $arch\nDepends: libgtk-3-0, desktop-file-utils\nMaintainer: You\nDescription: Postman\n API something" >"postman_$version/DEBIAN/control"
echo $e "if [ -f \"/usr/bin/postman\" ]; then\n\tsudo rm -f \"/usr/bin/postman\"\nfi\n\nsudo ln -s \"/opt/postman/Postman\" \"/usr/bin/postman\"\n\ndesktop-file-install \"/usr/share/applications/Postman.desktop\"" >"postman_$version/DEBIAN/postinst"
echo $e "if [ -f \"/usr/bin/postman\" ]; then\n\tsudo rm -f \"/usr/bin/postman\"\nfi" >"postman_$version/DEBIAN/prerm"

@SanderTheDragon
Copy link
Copy Markdown
Author

@sgtcoder Thanks for the improvements! The intention was actually to create the desktop file in /opt/postman, and then install it into the correct location with desktop-file-install, because simple putting it in /usr/share/applications was not working for everyone. So, the creation of the /usr/share/applications/Postman.desktop was the unnecessary thing.

But, creating this file did make it possible for users where /usr/share/applications is the correct path to also remove the desktop file with apt remove. I changed it now to have the prerm script get the desktop file path from update-desktop-database and delete it, which means that it should correctly delete the desktop file for anyone when removing.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment