All Posts programming What I do after installing Ubuntu as a SWE

What I do after installing Ubuntu as a SWE

ยท 7445 words ยท 35 minute read

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.

info
All points I mentioned are said like this about Zed compared to VSCode.

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).

Warning
The developers do not recommend us to depend on this “docker-install” script for deployment to production systems.

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-observe and/or sudo 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 mode
  • dns - DNS subdomain brute-forcing mode
  • s3 - Enumerate open S3 buckets and look for existence and bucket listings
  • gcs - Enumerate open google cloud buckets
  • vhost - virtual host brute-forcing mode - not the same as DNS
  • fuzz - some basic fuzzing, replaces the FUZZ keyword
  • tftp - 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"
info
-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”.

Note
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: cat alternative, 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 to ls and tree.
  • fd-find: alternative to find coreutils.
  • 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 -T instead.
  • 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 .