What I do after installing Ubuntu as a SWE
I mainly develop software on Ubuntu. Ubuntu is my daily driver for Android app development, Go web development, Laravel full stack web development, and Go CLI app development. In this blog post, I document my process of making my new Ubuntu setup.
This post idea came to me when I was thinking about upgrading from Ubuntu 24.04.3 LTS to the upcoming Ubuntu 26.04 LTS which will land on April 2026.
Actually, I wrote a simpler blog post about “ 10 things to do after installing Ubuntu 21.10 ”. It was about a very useful list of recommended steps to do after installing Ubuntu 21.10 .
This blog post is heavily tailored to my opinions and how I setup my Ubuntu workstation. Read all things but do what you need/want on your own setup.
minor tweaks and changes to settings ๐
- switch from light mode to dark mode (night mode).
- show battery percentage.
- GNOME tweaks to make more customization on the feel and look of GNOME desktop environment. I install it using
sudo apt install gnome-tweaks.
install ‘restricted’ software (media codecs) ๐
If you have not chose to install the restricted software to play audio and video media files while installing Ubuntu, you can do it now. GNOME default video player, can not play the basic mp4 files without restricted software.
So, to install them, open the terminal and run the below command to install.
sudo apt install ubuntu-restricted-extras
You can now play most video/audio files without any problem in Ubuntu. If you need an alternate video player, install VLC player or MPV player.
enable GNOME extension support ๐
You need to install chrome-gnome-shell (or via sudo apt install chrome-gnome-shell) from the repos, and then the official GNOME browser extension from here (
extensions.gnome.org
).
programs for creation and editing image ๐
GIMP ๐
GIMP is short for GNU Image Manipulation Program. It is an image editing program. I install it via Snap system package manager like this:
sudo snap install gimp
or using i:
i install --snap gimp
krita ๐
Krita is a painting and photo editing program. I install it via APT system package manager.
sudo apt install krita
Or using i:
i install krita
programs for audio recording and manipulation ๐
Audacity ๐
Audacity is an audio editing software. I install it via APT system package manager.
sudo apt install audacity
Or I use i like this:
i install audacity
program to record desktop (screencasting software) ๐
OBS Studio ๐
I install OBS studio via APT system package manager.
sudo apt install obs-studio
programs for communication and social media ๐
telegram desktop ๐
I install it via Snap package manager.
sudo snap install telegram-desktop
office suite ๐
ONLYOFFICE ๐
OnlyOffice: An office suite that allows to create, view and edit local documents.
sudo snap install onlyoffice-desktopeditors
LibreOffice ๐
LibreOffice: office productivity suite (metapackage)
LibreOffice is a full-featured office productivity suite that provides a near drop-in replacement for Microsoft(R) Office.
This metapackage installs all components of libreoffice:
- libreoffice-writer: Word processor
- libreoffice-calc: Spreadsheet
- libreoffice-impress: Presentation
- libreoffice-draw: Drawing
- libreoffice-base: Database
- libreoffice-math: Equation editor
It also recommends additional packages (e.g. fonts) in order to match an upstream LibreOffice install as closely as possible.
You can extend the functionality of LibreOffice by installing these packages:
- hunspell-/myspell-: Hunspell/Myspell dictionaries for use with LibreOffice
- libreoffice-l10n-*: UI interface translation
- libreoffice-help-*: User help
- mythes-*: Thesauri for the use with LibreOffice
- hyphen-*: Hyphenation patterns for LibreOffice
- libreoffice-gtk(2|3): Gtk UI Plugin, GNOME File Picker support
- libreoffice-gnome: GIO backend
- unixodbc: ODBC database support
- cups-bsd: Allows LibreOffice to detect your CUPS printer queues automatically
- libsane: Use your sane-supported scanner with LibreOffice
- libxrender1: Speed up display by using Xrender library
- libgl1: OpenGL support
- openclipart-libreoffice: Open Clip Art Gallery with LibreOffice index files
- firefox-esr | thunderbird | firefox: Mozilla profile with Certificates needed for XML Security.
- openjdk-11-jre | openjdk-8-jre | java8-runtime: Java Runtime Environment for use with LibreOffice
- pstoedit / imagemagick / ghostscript: helper tools for EPS
- gstreamer0.10-plugins-*: GStreamer plugins for use with LibreOffices media backend
- libpaper-utils: papersize detection support via paperconf
- bluez: Bluetooth support for Impress (slideshow remote control)
I install LibreOffice via APT system package manager like this:
sudo apt install libreoffice
programs for programming and software development ๐
Terminal emulator ๐
I prefer default terminal which is GNOME Terminal on mainstream Ubuntu LTS.
Other terminal emulator I sometimes use:
- kitty
- ghostty
Terminal text editor ๐
- VIM: I install vim via APT system package manager.
- NVIM (neovim): I install nvim via Snap (
sudo snap install nvim). - Orbiton: I install Orbiton (also aliased as
o) via Go toolchain. - Helix: I install Helix text editor via Snapcraft (Snap package manager).
IDE for PHP Laravel web dev ๐
I prefer vscode for writing PHP Laravel code for web development.
source code editor for Go web dev ๐
I prefer vscode for writing Go code for backend web development.
IDE for Android app dev ๐
I prefer Android Studio, the recommended official IDE. I install it via the official .deb.
Code editor for AI-based app dev ๐
I like using Antigravity editor for AI vibe coding.
Antigravity editor adds PPA source to facilitate upgrading via APT system package manager. Here is the PPA source it adds:
$ sudo cat /etc/apt/sources.list.d/antigravity.list
deb [arch=amd64 signed-by=/etc/apt/keyrings/antigravity-repo-key.gpg] https://us-central1-apt.pkg.dev/projects/antigravity-auto-updater-dev/ antigravity-debian main
alternative code editor ๐
I tried Zed editor for many tasks and projects. Unfortunately, it is not good enough for my work. Why?
- I need the support for Arabic language to be good.
- It crashes on my Ubuntu 24.04.3 LTS setup. I don’t know why.
- Autocomplete is not working properly.
I think it will eventually get there. So, I keep it installed on my laptop and use it sometimes.
web browser ๐
Google Chrome ๐
Google Chrome
: I install it manually then it adds its PPA source and let me update via APT system package manager later. It is called google-chrome-stable if I want to call it from the command line.
Here is the PPA source it added:
$ sudo cat /etc/apt/sources.list.d/google-chrome.list
### THIS FILE IS AUTOMATICALLY CONFIGURED ###
# You may comment out this entry, but any other modifications may be lost.
deb [arch=amd64] https://dl.google.com/linux/chrome/deb/ stable main
Mozilla Firefox ๐
Firefox is an opensource web browser, created by Mozilla. I install it via Snap system package manager.
sudo snap install firefox
Docker ๐
I install docker on my development laptop using this script https://github.com/docker/docker-install/ .
The purpose of that install script is for a convenience for quickly installing the latest Docker-CE releases on the supported linux distros (such as Ubuntu - my distro of choice).
The script installs these packages:
- docker-ce-cli
- docker-ce
- docker-compose
Here is the PPA source of docker added by the install script:
$ sudo cat /etc/apt/sources.list.d/docker.list
deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu noble stable
Install lazydocker by Go toolchain like this:
go install github.com/jesseduffield/lazydocker@latest
Fish shell ๐
I prefer FISH shell, the friendly interactive modern shell.
I use the v4 via this official source:
$ sudo cat /etc/apt/sources.list.d/fish-shell-ubuntu-release-4-noble.sources
Types: deb
URIs: https://ppa.launchpadcontent.net/fish-shell/release-4/ubuntu/
Suites: noble
Components: main
Signed-By: -----BEGIN PGP PUBLIC KEY BLOCK-----
.
mQINBGY0i8EBEAC787CEn0bb9R6lgxSjwEzrfUGK2HVfUoSfKiKILlU/p+nwdBdx
zKOGEtl2O8W4Q+KZkwEbD4llJKPFhzjF2CeP2qRKd/PLpiZoKhAr/NR7klQveqGx
Hop3uXsdGFxsNv2z0VEyJ7vhO+X0AuAW9BcXpXBexltrIzqbuGg+BKTwAOc5qaWx
xzDgcTvXR7xeudHv4vqXez93pd93WaRnjNB0vOUm03cKqFvfzfn1mJruThO3WE6S
ISjC/rQF4IquNS5ncA2+NLfb7fsPpYUmfKCTucYK2i929Xw/cwLfqE668kQLfJ6G
TiUK6B0EMK/Cvb/LYdN7RMXFrnWt6FnZORZM+9u4ZiCIa60OfW+xXjhmU6Lln3ZV
enhcD0qZHqZLQIxWGxK9rKJsasoBFnbDzBNyMM6BfukQqh6VP3UzdXixPCW1lOFl
omsPj3eoqmIf6tmyINMiJbmQrZmJ7Zn1tpTqScfdPJU06z26hcTQrn2+rvHtQV5V
ebj9JMqvKuk5mG7zkjFgMHoqP6jLlVqsReCfY66VuYLg4o2m0r2F+wv7ZfFXYcCq
LOycszdQe/SgJHobJc/yt/brZMrqFmGtYAERU7NcbRceuc4i2k1VnlygBT1AuvGT
HoSgm9ct0MZlfKRLhkZm+izwxLqxVSAsB/DZJ3uWp4XsKx4XHjw2VFw5aQARAQAB
tChMYXVuY2hwYWQgUFBBIGZvciBGaXNoIHNoZWxsIG1haW50YWluZXJziQJOBBMB
CgA4FiEEiEIecD7cevVJZ97Uc8n8yeK7SNoFAmY0i8ECGwMFCwkIBwIGFQoJCAsC
BBYCAwECHgECF4AACgkQc8n8yeK7SNoJUA//bnOSCrdit87tvsDmaok9+kQ2YYqL
X4KVsKxI2QVsKhRXPJb3yRwQRLArEUhT8yg5kQBIaHKdDhAkH9PRFZeCin25x/lq
LvjpnyslhlI9fhnImC21KqAPs8Svrb2LrvtfQK+072Fw5bISGJ6qlINU1vmJ0AIF
poojZaudcGLiQym1hkyf7HU4loHdkyUKX0jCTS8c9E8pRrDpwdHkKI3pEZpVWva1
zsmPgYXR/RRCt4zV4/lwX2WiCmYBBGdXn3D2mfA+ONfExngDfjpzXAQ8Dp9m3bDI
AmtlaKRjHa9VKKd0wt6LH2JYmt52lUwoEvoiVf8M0poKrmPN+ft8EaOMpgORS8ut
RZzVndHx4jFyZ+pVDt00J16Bblq6MSaGZalPneIfycx4tuwPPTX7CALUeMQ0V/Gy
p053yvotLwsBC6KGjKugxUzgbSlp7WWiPEbYXZfjb7IZpNmKXtuvfyBo8rs3icez
ZkUmljl2J27bhSIUZQ124ham6yQ3B8MfXUdctiWUCkOdunqUuBeHa5yeKJHTcFUH
Y5nyyn79L5VLZ6YlwYn9qW0V/LvfnW2JmrXTVFjEhfUoEm0Zck8UBqWn2wfSagTI
2KWU87IgN3MF7QG5EiLEAUA/DfagBwgjCpRFH8VUeWqMjTkQs9kjB/kvCcvHGp8g
WVimNlxjmpCZsvk=
=5r0P
-----END PGP PUBLIC KEY BLOCK-----
I use functions in ~/.config/fish/functions/ for all repeated tasks/scripts. I document my fish functions and abbr in my private Github repo. (I will publish it publicly SOON)
Go language ๐
I prefer Go language for web development and CLI app development.
I install and upgrade Go toolchain/compiler using GoUp - my script.
I install some tools and programs via Go toolchain such as gosec, hugo, lazydocker, i, lazyinstaller, lazysql, and gh.
Hugo the static site generator ๐
I prefer Hugo for building static websites. I install Hugo using Go toolchain like this:
go install github.com/gohugoio/hugo@latest
The same command will upgrade it if it is already installed.
Ghostscript (gs) ๐
I use gs to optimize/compress PDF files using this FISH function/script:
function optimizePDF --description "optimizePDF <input.pdf> <output.pdf>"
if not set -q argv[1]
echo "input PDF file is not set"
return 1
end
if not set -q argv[2]
echo "output PDF file name is not set, re-using the same input filename with '-o' in the output filename"
set -f out (string split -r -m1 . $argv[1])[1]-o.pdf
else
set -f out $argv[2]
end
if not string match -q '*.pdf' $out
echo "output file is not ended with the right extension (.pdf)"
return 1
end
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=$out $argv[1] && echo "compressed the pdf file and saved it as $out"
return 0
end
And I use it too to merge two or more PDF files into one PDF file using this script (FISH function):
function mergePDFs --description "mergePDFs <file.pdf> ..."
if test (count $argv) -eq 0
echo "no PDF files specified"
echo "Usage example:"
echo " mergePDFs 1.pdf another-file.pdf"
return 1
end
for i in $argv
if not string match -q '*.pdf' $i
echo "the file is not a PDF file"
return 1
end
end
gs -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=merged_files.pdf -dBATCH $argv
if test $status -ne 0
echo "Error: the PDF files merging process failed."
return 1
end
echo "merges all theses PDFs ($argv) into one PDF file named 'merged_files.pdf'"
end
Git ๐
I install the latest Git and gh (github CLI) and lazygit.
Here is the PPA source of gh (Github CLI) from where I pull:
$ sudo cat /etc/apt/sources.list.d/github-cli.list
deb [arch=amd64 signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main
I install lazygit via Go toolchain like this:
go install github.com/jesseduffield/lazygit@latest
Activity monitor, system monitor, and task manager tools ๐
- htop: an ncurses-based process viewer similar to
top, but it allows one to scroll the list vertically and horizontally to see all processes and their full command lines. Tasks related to processes (killing, renicing) can be done without entering their PIDs. Once installed (sudo snap install htop), this snap can optionally be connected to some extra plugs:sudo snap connect htop:mount-observeand/orsudo snap connect htop:network-control # DELAYACCT support. - btop: resource monitor that shows usage and stats for processor, memory, disks, network and processes. C++ version and continuation of bashtop and bpytop. I install it using
sudo snap install btop. - atop: monitor for system resources and process activity. Atop is an ASCII full-screen performance monitor, similar to the top command, but atop only shows the active system-resources and processes, and only shows the deviations since the previous interval. At regular intervals, it shows system-level activity related to the CPU, memory, swap, disks and network layers, and it shows for every active process the CPU utilization in system and user mode, the virtual and resident memory growth, priority, username, state, and exit code. The process level activity is also shown for processes which finished during the last interval, to get a complete overview about the consumers of things such as CPU time.
- iftop: displays bandwidth usage information on an network interface iftop does for network usage what top does for CPU usage. It listens to network traffic on a named interface and displays a table of current bandwidth usage by pairs of hosts. Handy for answering the question “Why is my Internet link so slow?”.
- powertop: diagnose issues with power consumption and management. PowerTOP is a Linux tool to diagnose issues with power consumption and power management. In addition to being a diagnostic tool, PowerTOP also has an interactive mode you can use to experiment with various power management settings, for cases where the Linux distribution has not enabled those settings. PowerTOP reports which components in the system are most likely to blame for higher-than-needed power consumption, ranging from software applications to active components in the system. Detailed screens are available for CPU C and P states, device activity, and software activity.
CUDA Nvidia framework and graphics driver ๐
I install Cuda via this PPA source:
$ sudo cat /etc/apt/sources.list.d/cuda-ubuntu2404-x86_64.list
deb [signed-by=/usr/share/keyrings/cuda-archive-keyring.gpg] https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/ /
I found these packages installed on my Ubuntu 24.04.3 LTS (current system):
- nvidia-cuda-dev
- nvidia-cuda-toolkit
- nvidia-driver-580
- nvidia-utils-570
- nvidia-utils-580
- nvidia-vaapi-driver
- linux-modules-nvidia-580-generic-hwe-24.04
- libnvidia-compute-580
Here is the NVIDIA graphics driver PPA source:
$ sudo cat /etc/apt/sources.list.d/graphics-drivers-ubuntu-ppa-noble.sources
Types: deb
URIs: https://ppa.launchpadcontent.net/graphics-drivers/ppa/ubuntu/
Suites: noble
Components: main
Signed-By: -----BEGIN PGP PUBLIC KEY BLOCK-----
.
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
=wqY5
-----END PGP PUBLIC KEY BLOCK-----
Tesseract OCR ๐
I install tesseract OCR toolkit via APT. Here is the packages I install via sudo apt install tesseract-ocr-all:
- tesseract-ocr-all
- tesseract-ocr-ara
- tesseract-ocr-deu
- tesseract-ocr-ell
- tesseract-ocr-enm
- tesseract-ocr-fas
- tesseract-ocr-fin
- tesseract-ocr-fra
- tesseract-ocr-grc
- tesseract-ocr-heb
- tesseract-ocr-hin
- tesseract-ocr-ind
- tesseract-ocr-ita-old
- tesseract-ocr-ita
- tesseract-ocr-lat
- tesseract-ocr-osd
- tesseract-ocr-por
- tesseract-ocr-rus
- tesseract-ocr-script-arab
- tesseract-ocr
And I installed the library:
- libtesseract-dev
- libtesseract5
NodeJS ๐
To have up to date Node and NPM, I use this PPA source:
$ sudo cat /etc/apt/sources.list.d/nodesource.list
deb [arch=amd64 signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_24.x nodistro main
And I can install latest nodejs via APT system package manager normally.
LLVM ๐
I use up to date LLVM toolchain via this PPA source:
$ sudo cat /etc/apt/sources.list.d/llvm.list
deb [arch=amd64] http://apt.llvm.org/noble/ llvm-toolchain-noble main
# deb-src http://apt.llvm.org/noble/ llvm-toolchain-noble main
SQL tools ๐
sqlitebrowser ๐
I use SQLiteBrowser for creating and editing SQLite databases. I install Sqlitebrowser via Snap like this:
sudo snap install sqlitebrowser
lazysql ๐
I install lazysql TUI via Go toolchain like this:
go install github.com/jorgerojas26/lazysql@latest
MySQL workbench community ๐
I install mysql-workbench-community as a snap like this:
sudo snap install mysql-workbench-community
ffmpeg ๐
Tools for transcoding, streaming and playing of multimedia files. FFmpeg is the leading multimedia framework, able to decode, encode, transcode, mux, demux, stream, filter and play pretty much anything that humans and machines have created. It supports the most obscure ancient formats up to the cutting edge.
This package contains:
- ffmpeg: a command line tool to convert multimedia files between formats.
- ffplay: a simple media player based on SDL and the FFmpeg libraries
- ffprobe: a simple multimedia stream analyzer
- qt-faststart: a utility to rearrange Quicktime files
I use these packages/executables for scripting and manipulating video streams and video files.
I have a FISH function that removes exact frames from a video file to reduce its size. I wrote this function into ~/.config/fish/functions/exactframes.fish, here is the function code.
function exactframes --description "exactframes <input-video-file>"
# check for at least one argument using set -q
if not set -q argv[1]
echo "no files provided"
echo " exactframes <input-video-file>"
return 1
end
# access the first argument/flag (the filename)
set infilename $argv[1]
set outfilename (string split -r -m1 . $argv[1])[1]-removedExactFrames.mp4
# execute ffmpeg command with proper formatting
ffmpeg -i "$infilename" -vf mpdecimate,setpts=N/FRAME_RATE/TB "$outfilename"
# handle potential errors (optional)
if test $status -ne 0
echo "Error: ffmpeg command failed."
return 1
end
echo "Successfully processed '$infilename' into '$outfilename'"
end
A function/script to convert an image to optimized/compressed file formats which are JPG, WebP, and AVIF.
Here is the content of opt4web Fish function I add in ~/.config/fish/functions/opt4web.fish:
function opt4web --description "opt4web <filename.png>"
if not set -q argv[1]
echo "[ERROR] no image path specified."
echo "Usage:"
echo " opt4web path/to/image.png"
return 1
end
set in $argv[1]
set out (string split -r -m1 . $argv[1])[1]
if is_wsl
ffmpeg.exe -i $in $out.avif -y
ffmpeg.exe -i $in $out.webp -y
ffmpeg.exe -i $in -q:v 10 $out.jpg -y
else
ffmpeg -i $in $out.avif -y
ffmpeg -i $in $out.webp -y
ffmpeg -i $in -q:v 10 $out.jpg -y
end
end
I wrote a function/script to use fixed lower bitrate and added it in ~/.config/fish/functions/vidbitrate.fish. Here is the Fish function code:
function vidbitrate --description "vidbitrate <input-video-file>"
if test (count $argv) -eq 1
set in $argv[1]
set out (string split -r -m1 . $argv[1])[1]-fixedBitrate.mp4
ffmpeg -i $in -b:v 1M -b:a 192k $out
if test $status -ne 0
echo "Error: ffmpeg command failed."
return 1
end
echo "Successfully processed '$in' to have fixed bitrate to reduce the disk space usage, and saved it as '$out'"
else
echo "no files provided"
echo " vidbitrate <input-video-file>"
return 1
end
end
I use ffmpeg to compress and optimize MP3 audio files. I add the Fish function code in ~/.config/fish/functions/compressMP3.fish:
function compressMP3 --description "compressMP3 <audio-file.mp3>"
if not string match -q '*.mp3' $argv[1]
echo "the audio file is not MP3"
return 1
end
set in $argv[1]
set out (string split -r -m1 . $argv[1])[1]-o.mp3
ffmpeg -i $in -vn -acodec libmp3lame -ac 2 -qscale:a 4 -ar 48000 $out
end
ffconvert - a Fish shell function for video conversion with hardware acceleration. I add this function/script in ~/.config/fish/functions/ffconvert.fish.
# ffconvert - A fish shell function for video conversion with hardware acceleration.
#
# This function automates FFmpeg video conversions, prioritizing NVIDIA NVENC
# hardware acceleration for H.264 encoding if an NVIDIA GPU is detected and
# FFmpeg is compiled with NVENC support. If NVENC is not available, it falls
# back to software encoding using libx264.
#
# Usage:
# ffconvert -i <input_file> -o <output_file> [options]
#
# Options:
# -i, --input <file> Input video file (required).
# -o, --output <file> Output video file (required).
#
# -c, --codec-v <codec> Specify video codec (e.g., libx264, h264_nvenc, hevc_nvenc).
# If not specified, h264_nvenc is preferred if detected, else libx264.
#
# --preset <preset> Video encoding preset.
# - For libx264 (software): ultrafast, superfast, fast, medium (default), slow, slower, veryslow.
# - For h264_nvenc (hardware): p1 (fastest) to p7 (slowest), or default (p5).
#
# --tune <tune> Video encoding tune.
# - For libx264: film, animation, grain, stillimage, fastdecode, zerolatency, psnr, ssim.
# - For h264_nvenc: hq (high quality, default), ll (low latency), ull (ultra low latency), vbr (variable bitrate).
#
# --crf <value> Constant Rate Factor for libx264 (e.g., 18-28). Lower is higher quality.
# Only applicable for software encoders.
#
# --cq <value> Constant Quality for h264_nvenc (e.g., 1-51). Lower is higher quality.
# Only applicable for hardware encoders.
#
# -c-a, --codec-a <codec> Specify audio codec (default: aac).
#
# -b-a, --bitrate-a <rate> Audio bitrate (default: 128k).
#
# --hwaccel-decode Attempt hardware-accelerated decoding with CUDA for the input video.
# This can speed up processing if your input video's codec is supported
# by your NVIDIA GPU's hardware decoder (NVDEC).
#
# Examples:
# ffconvert -i input.webm -o output.mp4
# ffconvert -i input.mkv -o output.mp4 --codec-v libx264 --crf 20 --preset slow
# ffconvert -i input.mov -o output_fast.mp4 --hwaccel-decode --preset p1 --cq 25
# ffconvert -i video.mp4 -o smaller.mp4 --codec-v h264_nvenc --preset p7 --tune hq --cq 18 # Explicit NVENC with high quality
# ffconvert -i highres.mov -o new.mp4 --hwaccel-decode # Decode with GPU, encode with default (NVENC if available)
function ffconvert --description "Convert video with FFmpeg, prioritizing NVIDIA hardware acceleration"
# Parse arguments using argparse for robust flag handling
argparse 'i/input=' 'o/output=' 'c/codec-v=' 'preset=' 'tune=' 'crf=' 'cq=' 'hwaccel-decode' -- $argv
or begin
# If argparse fails, show usage and exit
__ffconvert_usage
return 1
end
# Assign parsed input and output file paths
set _input_file $_flag_input
set _output_file $_flag_output
# --- Input Validation ---
if not set -q _input_file
echo "Error: Input file (-i) is required."
__ffconvert_usage
return 1
end
if not set -q _output_file
echo "Error: Output file (-o) is required."
__ffconvert_usage
return 1
end
# --- Hardware Acceleration Decoding Setup ---
set _hwaccel_decode_params # Initialize as empty list
if set -q _flag_hwaccel_decode
# If --hwaccel-decode is specified, attempt CUDA decoding.
# This assumes an NVIDIA GPU. For other hardware (Intel QSV, AMD AMF),
# these parameters would need to be adapted (e.g., -hwaccel vaapi).
# The current implementation focuses on NVIDIA as requested.
set _hwaccel_decode_params -hwaccel cuda -hwaccel_output_format cuda
echo "Attempting hardware-accelerated decoding with CUDA."
end
# --- Video Codec Selection and Default Parameters ---
# Set default values for video encoding parameters
set _default_video_codec "libx264"
set _default_video_preset "medium"
set _default_video_tune "" # Not all libx264 presets use a tune by default
set _default_video_crf "23"
set _default_video_cq "" # CQ is only for hardware encoders
# Check for NVIDIA NVENC H.264 encoder availability
# `2>&1` redirects stderr to stdout, as `ffmpeg -encoders` might print to stderr.
# `grep -c` counts occurrences.
set _nvenc_h264_available (test (ffmpeg -encoders 2>&1 | grep -c h264_nvenc) -gt 0)
if $_nvenc_h264_available
# If NVENC H.264 is available, set it as the preferred default codec
set _default_video_codec "h264_nvenc"
set _default_video_preset "p5" # A good balance for NVENC
set _default_video_tune "hq" # High quality tune for NVENC
set _default_video_crf "" # CRF is not used with NVENC
set _default_video_cq "22" # Constant Quality for NVENC
echo "NVIDIA NVENC (h264_nvenc) detected. Prioritizing hardware encoding."
else
# If NVENC H.264 is not found, inform the user about falling back to software
echo "NVIDIA NVENC (h264_nvenc) not found. Falling back to software encoding (libx264)."
end
# --- Apply User Overrides for Video Encoding Parameters ---
# `fish_default` sets the variable to the first argument if it's not empty,
# otherwise it uses the second argument (the default).
set _video_codec (fish_default $_flag_codec_v $_default_video_codec)
set _video_preset (fish_default $_flag_preset $_default_video_preset)
set _video_tune (fish_default $_flag_tune $_default_video_tune)
set _video_crf (fish_default $_flag_crf $_default_video_crf)
set _video_cq (fish_default $_flag_cq $_default_video_cq)
# --- Validate CRF/CQ usage based on the chosen codec ---
# Provide warnings if the user tries to use a quality parameter incompatible with the codec.
if test "$_video_codec" = "libx264" -a -n "$_flag_cq"
echo "Warning: --cq is typically for hardware encoders. Ignoring --cq and using --crf for libx264."
set _video_cq "" # Unset CQ if CRF is used
else if string match -q "*_nvenc" "$_video_codec" -a -n "$_flag_crf"
echo "Warning: --crf is typically for software encoders. Ignoring --crf and using --cq for NVENC."
set _video_crf "" # Unset CRF if CQ is used
end
# --- Audio Encoding Parameters ---
set _audio_codec (fish_default $_flag_codec_a "aac")
set _audio_bitrate (fish_default $_flag_bitrate_a "128k")
# --- Construct Video Encoder Options List ---
# Build the list of video encoder-specific options dynamically
set _video_encoder_options
# Add preset if it's set
if test -n "$_video_preset"
set _video_encoder_options $_video_encoder_options -preset $_video_preset
end
# Add tune if it's set
if test -n "$_video_tune"
set _video_encoder_options $_video_encoder_options -tune $_video_tune
end
# Add quality parameter (CRF or CQ) based on which one is applicable and set
if test -n "$_video_crf"
set _video_encoder_options $_video_encoder_options -crf $_video_crf
else if test -n "$_video_cq"
set _video_encoder_options $_video_encoder_options -cq $_video_cq
end
# --- Final FFmpeg Command Construction ---
# Assemble the complete FFmpeg command
set _ffmpeg_cmd ffmpeg $_hwaccel_decode_params -i "$_input_file" -c:v $_video_codec $_video_encoder_options -c:a $_audio_codec -b:a $_audio_bitrate "$_output_file"
echo "---"
echo "Executing FFmpeg command:"
echo "$_ffmpeg_cmd"
echo "---"
# Execute the FFmpeg command
# `eval` is used here to correctly expand the command components,
# especially with potentially dynamic options and quoted file paths.
eval $_ffmpeg_cmd
end
# Helper function to display usage instructions for ffconvert
function __ffconvert_usage
echo "Usage: ffconvert -i <input_file> -o <output_file> [options]"
echo ""
echo "This function converts video files using FFmpeg. It prioritizes NVIDIA hardware acceleration (NVENC) for H.264 encoding if available. Otherwise, it falls back to software encoding (libx264)."
echo ""
echo "Options:"
echo " -i, --input <file> Input video file (required)."
echo " -o, --output <file> Output video file (required)."
echo " -c, --codec-v <codec> Specify video codec (e.g., libx264, h264_nvenc, hevc_nvenc)."
echo " If not specified, h264_nvenc is preferred if detected, else libx264."
echo " --preset <preset> Video encoding preset."
echo " - For libx264: ultrafast, superfast, fast, medium (default), slow, slower, veryslow."
echo " - For h264_nvenc: p1 (fastest) to p7 (slowest), or default (p5)."
echo " --tune <tune> Video encoding tune."
echo " - For libx264: film, animation, grain, stillimage, fastdecode, zerolatency, psnr, ssim."
echo " - For h264_nvenc: hq (high quality, default), ll (low latency), ull (ultra low latency), vbr (variable bitrate)."
echo " --crf <value> Constant Rate Factor for libx264 (e.g., 18-28). Lower is higher quality."
echo " --cq <value> Constant Quality for h264_nvenc (e.g., 1-51). Lower is higher quality."
echo " Only one of --crf or --cq should be used, depending on the encoder."
echo " -c-a, --codec-a <codec> Specify audio codec (default: aac)."
echo " -b-a, --bitrate-a <rate> Audio bitrate (default: 128k)."
echo " --hwaccel-decode Attempt hardware-accelerated decoding with CUDA for input."
echo ""
echo "Examples:"
echo " ffconvert -i input.webm -o output.mp4"
echo " ffconvert -i input.mkv -o output.mp4 --codec-v libx264 --crf 20 --preset slow"
echo " ffconvert -i input.mov -o output_fast.mp4 --hwaccel-decode --preset p1"
end
I wrote a Fish function in ~/.config/fish/functions/fsubtitle.fish to add subtitles in the video container itself.
function fsubtitle --description "fsubtitle <video-file> <subtitles.srt>"
if test (count $argv) -eq 3
set vid $argv[1]
set sub $argv[2]
set out $vid-subtitled.mp4
ffmpeg -i $vid -vf subtitles=$sub $out
if test $status -ne 0
echo "Error: ffmpeg command failed."
return 1
end
echo "Successfully added subtitles on the video, and saved it as '$out'"
else
echo "not enough arguments."
echo " fsubtitle <video-file> <subtitles.srt>"
return 1
end
end
webm2mp4 is a Fish function to convert webm video into an MP4 using ffmpeg. Here is the Fish function I added it in ~/.config/fish/functions/webm2mp4.fish:
function webm2mp4 --description "webm2mp4 <input.webm> ..."
for i in $argv
if string match -q "*.mp4" "$i"
echo "it is already an MP4 video"
return 1
end
if not string match -q "*.webm" "$i"
echo "the file is not WebM video file"
return 1
end
set in $i
set out (string split -r -m1 . $i)[1].mp4
# macOS specific
#ffmpeg -loglevel quiet -i $in -c:v h264_videotoolbox -preset slow -crf 22 -c:a aac -b:a 128k $out
# linux
ffmpeg -i $in -c:v libx264 -preset slow -crf 22 -c:a aac -b:a 128k $out
# nvidia GPU accelerated command
# ffmpeg -i $in -c:v h264_nvenc -preset slow -crf 22 -c:a aac -b:a 128k $out
# ffmpeg -i in.webm -c:v h264_nvenc -preset p5 -tune hq -cq 22 -c:a aac -b:a 128k out.mp4
# simple command, but too slow
# ffmpeg -i video.webm output.mp4
echo "'$in' converted into webm video format and saved as '$out'."
end
end
vidfps is a Fish function that uses ffmpeg to set the video to 24 frames per second (fps). Here is the source code I have in ~/.config/fish/functions/vidfps.fish:
function vidfps --description "vidfps <input.mp4>"
if not set -q argv[1]
echo "[ERROR] no video specified."
echo "Usage:"
echo " vidfps path/to/video.mp4"
return 1
end
ffmpeg -i $argv -filter:v fps=fps=24 (string split -r -m1 . $argv)[1]-24fps.mp4
end
screencast is a custom Fish function that uses ffmpeg to record the screen and save the recorded video into ~/Videos/ directory. Here is its source code I have in ~/.config/fish/functions/screencast.fish:
function screencast --description "screencast ~/Videos/<title dir>"
set current_datetime (date +%Y-%m-%dT%H-%M-%S)
if not set -q argv[1]
echo "[WARNING] no location/directory specified to save the screencast into."
echo "saving the screencast into ~/Videos ..."
ffmpeg -f x11grab -i "$DISPLAY" ~/Videos/$current_datetime.webm
return 0
end
set dir $argv[1]
# create the directory if not found
if not test -d $dir
mkdir -p $dir
end
ffmpeg -f x11grab -i "$DISPLAY" $dir/$current_datetime.webm
end
dim2x is a Fish function I wrote to use ffmpeg to make the resolution/scale of the video grow by 2 folds. Here is the source code of this Fish function I have in ~/.config/fish/functions/dim2x.fish:
function dim2x --description "dim2x <input-video-file>"
# check for at least one argument using set -q
if not set -q argv[1]
echo "no files provided"
echo " dim2x <input-video-file>"
return 1
end
set infilename $argv[1]
set inbase (string split -r -m1 . $argv[1])[1]
set inext (string split -r -m1 . $argv[1])[2]
set outfilename $inbase-2x.$inext
ffmpeg -i "$infilename" -vf "scale=iw*2:ih*2" "$outfilename"
if test $status -ne 0
echo "Error: ffmpeg command failed."
return 1
end
echo "Successfully processed and enlarged by 2X from '$infilename' into '$outfilename'"
end
ffmpegthumbnailer is a fast and lightweight video thumbnailer.
Video editors ๐
- shotcut as a snap
- kdenlive (snap)
Video players & music players ๐
- mpv as a snap
Gobuster ๐
Gobuster - Directory/file & DNS busting tool written in Go.
Modes:
dir- the classic directory brute-forcing modedns- DNS subdomain brute-forcing modes3- Enumerate open S3 buckets and look for existence and bucket listingsgcs- Enumerate open google cloud bucketsvhost- virtual host brute-forcing mode - not the same as DNSfuzz- some basic fuzzing, replaces the FUZZ keywordtftp- bruteforce tftp files
Usage:
- gobuster help
- gobuster help < mode >
- gobuster dir < flags >
- gobuster dns < flags >
- gobuster s3 < flags >
- gobuster gcs < flags >
- gobuster vhost < flags >
- gobuster fuzz < flags >
- gobuster tftp < flags >
Gobuster is a tool used to brute-force: URIs (directories and files) in web sites, DNS subdomains (with wildโ card support), Virtual Host names on target web servers, Open Amazon S3 buckets, Open Google Cloud buckets and TFTP servers.
Gobuster is useful for pentesters, ethical hackers and forensics experts. It also can be used for security tests.
Examples:
gobuster dir -u <https://mysite.com/path/to/folder> -c 'session=123456' -t 50 -w common-files.txt -x .php,.html
gobuster dns -d mysite.com -t 50 -w common-names.txt
gobuster s3 -w bucket-names.txt
gobuster gcs -w bucket-names.txt
gobuster vhost -u https://mysite.com -w common-vhosts.txt
gobuster fuzz -u https://example.com?FUZZ=test -w parameter-names.txt
gobuster tftp -s tftp.example.com B-w common-filenames.txt
grep & ripgrep (rg) ๐
grep, egrep, fgrep, rgrep - print lines that match patterns.
grep searches for PATTERNS in each FILE. PATTERNS is one or more patterns separated by newline characters, and grep prints each line that matches a pattern. Typically PATTERNS should be quoted when grep is used in a shell command.
A FILE of “-” stands for standard input. If no FILE is given, recursive searches examine the working directory, and nonrecursive searches read standard input.
Debian also includes the variant programs egrep, fgrep and rgrep. These programs are the same as grep -E, grep -F, and grep -r, respectively. These variants are deprecated upstream, but Debian provides for backward compatibility. For portability reasons, it is recommended to avoid the variant programs, and use grep with the related option instead.
-n, --line-number: prefix each line of output with the 1-based line number within its input file.
-r, --recursive: read all files under each directory, recursively, following symbolic links only if they are on the command line. Note that if no file operand is given, grep searches the working directory. This is equivalent to the -d recurse option.
-i, --ignore-case: ignore case distinctions in patterns and input data, so that characters that differ only in case match each other.
Here is how I use grep to get all TODO comments I left in source code files while I am programming:
grep -rni "TODO" --exclude-dir=.git --exclude-dir=node_modules
I sometimes use it simply like this:
grep -rni "todo"
-rni is a compact succinct way of writing -r -n -i.Sometimes, I have multilanguage project with Javascript, Go and other languages, so I get the “todo” comments I left in Go files only by specifying the file extension with --include flag/option like this:
grep -rni "todo" --include="*.go" --exclude-dir=.git
Some errors shown in terminal, I send them in the “black hole” like this:
grep -rni "todo" --include="*.go" --exclude-dir=.git 2> /dev/null
When I work on a project with other developers, they sometimes use “todo” comments, “fixme” comments, or “fix” comments. So, I include them all in the search like this:
grep -rni "todo\\|fixme\\|fix" --include="*.go" --exclude-dir=.git 2> /dev/null
I can use ripgrep (rg) as an alternative to grep. But I generally prefer grep as I used to it.
rg --type-add 'go:*.go' "TODO|FIXME|todo|fixme|fix" --glob '!.git/'
If I want to get all the lines that end with a specific sequence of letters, I can do it like this:
grep 'ing$' content/posts/*
In the above example, I want to list all files inside content/posts/* that has a line that ends with ing. The indicator of ending is $ at the end of REGEX pattern.
If I am working on a huge Android app project and I want to know the entry point of the app (which is complicated because of dependency injection DI), I run this in the terminal in the root of the project.
grep -rnw . -e "@AndroidEntryPoint"
-w, --word-regexp: select only those lines containing matches that form whole words. The test is that the matching substring must either be at the beginning of the line, or preceded by a non-word constituent character. Similarly, it must be either at the end of the line or followed by a non-word constituent character. Word-constituent characters are letters, digits, and the underscore. This option has no effect if -x is also specified.
If I want to list only directories/folder, I do this:
ls -l | egrep '^d'
So, I added these commands as abbreviations in ~/.config/fish/conf.d/abbr.fish the Fish shell abbr file:
abbr -a -- ldir "ls -l | egrep '^d'"
And if I want to list files only, I do this as I added it into Fish shell abbr(s) too:
abbr -a -- lfiles "ls -l | egrep -v '^d'"
If I want to list all hidden directories/folders and files (which have a DOT at the beginning), I do this:
ls -a | egrep '^\.'
So, I included this abbreviation to Fish shell abbr file:
abbr -a -- l. "ls -a | egrep '^\.'"
When I want to clean the disk storage from unwanted and obsolete files, I search for error logging files and delete them. Those files are ending with .err. So, I find them like this:
find / -type f 2> /dev/null | grep '\.err$'
If I want to list all file names that has a specific pattern, I run this command:
grep -rlZ '<body dir="rtl">' .
-l (lowercase L = list) : instead of printing matching lines, it prints only the names of files that contain a match.
-Z: outputs file names followed by a null character (\0) instead of a newline. This is useful when piping the results to other commands that safely handle filenames with spaces or special characters (like xargs -0).
When some program terminate automatically, I investigate that using this command:
sudo dmesg -T | grep -Ei 'killed process|oom.killer'
It shows the error messages, then I filter them to show only the messages that has “killed process” or “oom.killer”.
oom stands for “out of memory”. It means that the program is terminated or got killed because it consumed too much RAM memory.-E, --extended-regexp: interpret PATTERNS as extended regular expressions (EREs).
REGULAR EXPRESSIONS:
A regular expression is a pattern that describes a set of strings. Regular expressions are constructed analogously to arithmetic expressions, by using various operators to combine smaller expressions.
grep understands three different versions of regular expression syntax: “basic” (BRE), “extended” (ERE) and “perl” (PCRE). In GNU grep, basic and extended regular expressions are merely different notations for the same pattern-matching functionality. In other implementations, basic regular expressions are ordinarily less powerful than extended, though occasionally it is the other way around. The following description applies to extended regular expressions; differences for basic regular expressions are summarized afterwards. Perl-compatible regular expressions have different functionality, and are documented in pcre2syntax(3) and pcre2pattern(3), but work only if PCRE support is enabled.
The fundamental building blocks are the regular expressions that match a single character. Most characters, including all letters and digits, are regular expressions that match themselves. Any meta-character with special meaning may be quoted by preceding it with a backslash.
The period . matches any single character. It is unspecified whether it matches an encoding error.
When I want to list a specific process, filtered by program/process name, I do it like this:
abbr -a -- psgrep "ps aux | grep -v grep | grep -i -e VSZ -e"
Here is how I use it:
$ ps aux | grep -v grep | grep -i -e VSZ -e fish # filtering to show 'fish' shell
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
aba 558 0.0 0.3 289684 14356 pts/0 Ssl 02:15 0:02 -fish
aba 647 0.0 0.2 152432 10240 pts/1 S+ 02:15 0:00 -fish
Software testing, cracking, hacking tools ๐
- tshark
- cowpatty: WPA-PSK dictionary attack.
- john
- fcrackzip: a fast/free zip password cracker.
- wifite
- crunch: wordlist generator.
- hashcat
- websploit
- rarcrack
- pdfcrack
- ophcrack
- nmap: The Network Mapper. Nmap is a utility for network exploration or security auditing. It supports ping scanning (determine which hosts are up), many port scanning techniques, version detection (determine service protocols and application versions listening behind ports), and TCP/IP fingerprinting (remote host OS or device identification). Nmap also offers flexible target and port specification, decoy/stealth scanning, sunRPC scanning, and more. Most Unix and Windows platforms are supported in both GUI and commandline modes. Several popular handheld devices are also supported, including the Sharp Zaurus and the iPAQ.
- ncrack: high-speed network authentication cracking tool. Ncrack is a high-speed network authentication cracking tool. It was built to help companies secure their networks by proactively testing all their hosts and networking devices for poor passwords. Security professionals also rely on Ncrack when auditing their clients. Ncrack was designed using a modular approach, a command-line syntax similar to Nmap and a dynamic engine that can adapt its behaviour based on network feedback. It allows for rapid, yet reliable large-scale auditing of multiple hosts. Ncrack’s features include a very flexible interface granting the user full control of network operations, allowing for very sophisticated bruteforcing attacks, timing templates for ease of use, runtime interaction similar to Nmap’s and many more. Protocols supported include RDP, SSH, http(s), SMB, pop3(s), VNC, FTP, and telnet.
- nikto: web server security scanner. Nikto is a pluggable web server and CGI scanner written in Perl, using rfp’s LibWhisker to perform fast security or informational checks. Features:
- Easily updatable CSV-format checks database
- Output reports in plain text or HTML
- Available HTTP versions automatic switching
- Generic as well as specific server software checks
- SSL support (through libnet-ssleay-perl)
- Proxy support (with authentication)
- Cookies support
oneAPI ๐
I install Intel toolkit such as OneAPI, HPC, and Rendering from Intel docs , which are:
- Intelยฎ oneAPI Base Toolkit
- Intelยฎ HPC Toolkit
- Intelยฎ Rendering Toolkit
Here is the PPA source added for oneAPI on my installation of Ubuntu 24.04 LTS:
$ sudo cat /etc/apt/sources.list.d/oneAPI.list
deb [signed-by=/usr/share/keyrings/oneapi-archive-keyring.gpg] https://apt.repos.intel.com/oneapi all main
Google cloud SDK ๐
I installed cloud sdk and it added this PPA source:
$ sudo cat /etc/apt/sources.list.d/google-cloud-sdk.list
deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main
tailscale ๐
Tailscale added this PPA source to make it easier to upgrade it via APT:
$ sudo cat /etc/apt/sources.list.d/tailscale.list
# Tailscale packages for ubuntu noble
deb [signed-by=/usr/share/keyrings/tailscale-archive-keyring.gpg] https://pkgs.tailscale.com/stable/ubuntu noble main
Ubuntu noble numpat sources ๐
$ sudo cat /etc/apt/sources.list.d/ubuntu.sources
Types: deb
URIs: http://archive.ubuntu.com/ubuntu
Suites: noble noble-updates noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
Types: deb
URIs: http://security.ubuntu.com/ubuntu/
Suites: noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
And this backport sources:
$ sudo cat /etc/apt/sources.list.d/ubuntu.sources.curtin.orig
# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.
## Ubuntu distribution repository
##
## The following settings can be adjusted to configure which packages to use from Ubuntu.
## Mirror your choices (except for URIs and Suites) in the security section below to
## ensure timely security updates.
##
## Types: Append deb-src to enable the fetching of source package.
## URIs: A URL to the repository (you may add multiple URLs)
## Suites: The following additional suites can be configured
## <name>-updates - Major bug fix updates produced after the final release of the
## distribution.
## <name>-backports - software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
## Components: Aside from main, the following components can be added to the list
## restricted - Software that may not be under a free license, or protected by patents.
## universe - Community maintained packages. Software in this repository receives maintenance
## from volunteers in the Ubuntu community, or a 10 year security maintenance
## commitment from Canonical when an Ubuntu Pro subscription is attached.
## multiverse - Community maintained of restricted. Software from this repository is
## ENTIRELY UNSUPPORTED by the Ubuntu team, and may not be under a free
## licence. Please satisfy yourself as to your rights to use the software.
## Also, please note that software in multiverse WILL NOT receive any
## review or updates from the Ubuntu security team.
##
## See the sources.list(5) manual page for further settings.
Types: deb
URIs: http://archive.ubuntu.com/ubuntu/
Suites: noble noble-updates noble-backports
Components: main universe restricted multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
## Ubuntu security updates. Aside from URIs and Suites,
## this should mirror your choices in the previous section.
Types: deb
URIs: http://security.ubuntu.com/ubuntu/
Suites: noble-security
Components: main universe restricted multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
And this backport, too:
$ sudo cat /etc/apt/sources.list.d/ubuntu.sources.save
Types: deb
URIs: http://archive.ubuntu.com/ubuntu
Suites: noble noble-updates noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
Types: deb
URIs: http://security.ubuntu.com/ubuntu/
Suites: noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
virtualbox ๐
I installed virtualbox-7.2 via APT system package manager.
$ sudo cat /etc/apt/sources.list.d/virtualbox.list
deb [arch=amd64 signed-by=/usr/share/keyrings/oracle-virtualbox-2016.gpg] https://download.virtualbox.org/virtualbox/debian noble contrib
tools I install via Go toolchain ๐
air: a tool for hot reloading Go web projects:
go install github.com/air-verse/air@latest
hugo: a static site generator/builder.
go install github.com/gohugoio/hugo@latest
i the installer: a wrapper over all system package managers such as APT, Pacman, Yum, Snap, Flatpak, .. etc.
go install github.com/abanoubha/i@latest
Orbiton (o): a simple terminal text editor.
go install github.com/xyproto/orbiton/v2@latest && cp -i ~/go/bin/orbiton ~/go/bin/o
lazygit: a TUI tool to use Git in the terminal.
go install github.com/jesseduffield/lazygit@latest
gosec - Go Security Checker: inspects source code for security problems by scanning the Go AST and SSA code representation.
go install github.com/securego/gosec/v2/cmd/gosec@latest
nvim ๐
I use neovim in the terminal to write and edit config files, scripts, and backend coding files.
I configure NVIM by lazyvim.
I install nvim via snap package manager (snapcraft).
vim ๐
I use VIM to write/edit simple config files and scripts. I have a simple configuration for my VIM setup. I insall vim via APT system package manager.
programming languages and frameworks ๐
- postman: to test API request. I install it via
sudo snap install postman. - marktext: markdown editor. I install it via
sudo snap install marktext. - inkscape: vector image editor and creator. I install it via
sudo snap install inkscape. - fx: Terminal JSON viewer. I install it via
sudo snap install fx. - astral-uv:
sudo snap install astral-uv. - bun-js:
sudo snap install bun-js. - dbeaver-ce: database.
sudo snap install dbeaver-ce. - drawio: drawing app.
sudo snap install drawio. - adb: Android debug bridge.
- asciinema: record terminal and replay it.
- bat:
catalternative, written in Rust. - bc: terminal calculator.
- build-essential: a metapackage with all essential tools for building software on Debian-based Linux distros.
- cargo: package manager for Rust language.
- rustc: Rust compiler.
- clinfo: Display properties of all available OpenCL platforms and devices.
- cloc: count lines of code, ex:
cloc . --exclude-dir=node_modules,.next,dist,.turbo,.git,vendor --vcs git - cmake
- composer : PHP’s package manager.
- containerd.io: high performance container runtime.
- curl: a command-line tool for transferring data from or to a server using URLs. It supports many protocols, such as DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP.
- diff (diffutils)
eza: alternative tolsandtree.- fd-find: alternative to
findcoreutils. - findutils:
find - httrack: copy websites to your computer (Offline browser). HTTrack is an offline browser utility, allowing you to download a World Wide website from the Internet to a local directory, building recursively all directories, getting html, images, and other files from the server to your computer. HTTrack arranges the original site’s relative link-structure. Simply open a page of the “mirrored” website in your browser, and you can browse the site from link to link, as if you were viewing it online. HTTrack can also update an existing mirrored site, and resume interrupted downloads. HTTrack is fully configurable, and has an integrated help system.
- p7zip
- preload
- remmina
- rfkill
- sqlite3
- testdisk
- tree: If it is not installed by default, I install
eza -Tinstead. - unzip
- vim
- wget
- whatweb
- xz-utils
- zip
I hope you enjoyed reading this post as much as I enjoyed writing it. If you know a person who can benefit from this information, send them a link of this post. If you want to get notified about new posts, follow me on YouTube , Twitter (x) , LinkedIn , and GitHub .