[{"content":"","date":"2026-01-28","externalUrl":null,"permalink":"/tags/arch/","section":"Tags","summary":"","title":"Arch","type":"tags"},{"content":"","date":"2026-01-28","externalUrl":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","date":"2026-01-28","externalUrl":null,"permalink":"/tags/dual_boot/","section":"Tags","summary":"","title":"Dual_boot","type":"tags"},{"content":"Arch Linux and Secure Boot don’t always get along out of the box. While Arch is famous for flexibility and control, Secure Boot is strict, opinionated, and unforgiving when things aren’t signed correctly.\nIn this guide, you’ll learn how to run Arch Linux with Secure Boot enabled using the rEFInd boot manager, with a focus on dual booting alongside Windows. This setup is especially useful if you:\nWant a clean and modern UEFI boot experience Dual boot Arch Linux and Windows on the same system Play games that require Secure Boot, such as VALORANT Prefer managing your own Machine Owner Keys (MOK) By the end of this guide, you’ll have a Secure Boot–enabled Arch Linux system that boots reliably using rEFInd, without disabling firmware security features.\nWhat You’ll Need # refind – Boot manager shim-signed – Secure Boot–compatible-preloader (from the AUR) sbsigntool – EFI binary signing mokutil – MOK key management openssl – Key generation yay -S refind sbsigntool shim-signed mokutil openssl Generate Secure Boot Keys # mkdir -p ~/secureboot \u0026amp;\u0026amp; cd ~/secureboot sudo openssl req -newkey rsa:2048 -nodes -keyout MOK.key -new -x509 -sha256 -days 3650 -subj \u0026#34;/CN=Arch Secure Boot/\u0026#34; -out MOK.crt sudo openssl x509 -outform DER -in MOK.crt -out MOK.cer Move the generated key in rEFInd directory # sudo cp ~/secureboot/MOK.key /etc/refind.d/refind_local.key sudo cp ~/secureboot/MOK.cer /etc/refind.d/refind_local.cer sudo cp ~/secureboot/MOK.crt /etc/refind.d/refind_local.crt sudo cp ~/secureboot/* /root/ Installing rEFInd to the system # sudo refind-install --shim /usr/share/shim-signed/shimx64.efi --localkeys --yes Regenerating the kernel image # sudo mkinitcpio -P Signing the kernel # sudo sbsign --key ~/secureboot/MOK.key --cert /secureboot/MOK.crt --output /boot/vmlinuz-linux /boot/vmlinuz-linux Automating the kernel signing # Create this file /etc/initcpio/post/kernel-sbsign:\n#!/usr/bin/env bash kernel=\u0026#34;$1\u0026#34; [[ -n \u0026#34;$kernel\u0026#34; ]] || exit 0 # use already installed kernel if it exists [[ ! -f \u0026#34;$KERNELDESTINATION\u0026#34; ]] || kernel=\u0026#34;$KERNELDESTINATION\u0026#34; keypairs=(/root/MOK.key /root/MOK.crt) for (( i=0; i\u0026lt;${#keypairs[@]}; i+=2 )); do key=\u0026#34;${keypairs[$i]}\u0026#34; cert=\u0026#34;${keypairs[(( i + 1 ))]}\u0026#34; if ! sbverify --cert \u0026#34;$cert\u0026#34; \u0026#34;$kernel\u0026#34; \u0026amp;\u0026gt;/dev/null; then sbsign --key \u0026#34;$key\u0026#34; --cert \u0026#34;$cert\u0026#34; --output \u0026#34;$kernel\u0026#34; \u0026#34;$kernel\u0026#34; fi done Make it executable # sudo chmod +x /etc/initcpio/post/kernel-sbsign Pacman hook for rEFInd # Create this file /etc/pacman.d/hooks/refind.hook:\n[Trigger] Operation=Upgrade Type=Package Target=refind [Action] Description = Updating rEFInd on ESP When=PostTransaction Exec=/usr/bin/refind-install --shim /usr/share/shim-signed/shimx64.efi --localkeys --yes Enroll the MOK key to the system\u0026rsquo;s UEFI # sudo mokutil --import ~/secureboot/MOK.cer you will be prompted to enter a password choose a simple one then reboot into the bios\nEnable secure boot make rEFInd Boot Manager the default or move it to the top Save and exit Now MOK manager will ask if you want to proceed with booting or enroll the key. Choose \u0026ldquo;Enroll MOK\u0026rdquo; -\u0026gt; \u0026ldquo;Continue\u0026rdquo; and enter the ==password created when enrolling== If you don\u0026rsquo;t see Enroll MOK option you can use Enroll key from disk and then navigate to your /boot/EFI/refind/keys/refind_local.cer and hit enter -\u0026gt; continue -\u0026gt;Yes\n","date":"2026-01-28","externalUrl":null,"permalink":"/arch-with-secure-boot/","section":"Posts","summary":"Arch Linux and Secure Boot don’t always get along out of the box. While Arch is famous for flexibility and control, Secure Boot is strict, opinionated, and unforgiving when things aren’t signed correctly.\n","title":"How to Use Arch Linux with Secure Boot Using rEFInd (Dual-Boot Guide)","type":"posts"},{"content":"","date":"2026-01-28","externalUrl":null,"permalink":"/categories/linux/","section":"Categories","summary":"","title":"Linux","type":"categories"},{"content":"","date":"2026-01-28","externalUrl":null,"permalink":"/tags/linux/","section":"Tags","summary":"","title":"Linux","type":"tags"},{"content":"","date":"2026-01-28","externalUrl":null,"permalink":"/posts/","section":"Posts","summary":"","title":"Posts","type":"posts"},{"content":"","date":"2026-01-28","externalUrl":null,"permalink":"/tags/refind/","section":"Tags","summary":"","title":"REFInd","type":"tags"},{"content":"","date":"2026-01-28","externalUrl":null,"permalink":"/tags/securboot/","section":"Tags","summary":"","title":"Securboot","type":"tags"},{"content":"","date":"2026-01-28","externalUrl":null,"permalink":"/tags/secure_boot/","section":"Tags","summary":"","title":"Secure_boot","type":"tags"},{"content":"","date":"2026-01-28","externalUrl":null,"permalink":"/","section":"SudoStart","summary":"","title":"SudoStart","type":"page"},{"content":"","date":"2026-01-28","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"UNIX systems have been around for decades, and one of the reasons for their long-lasting reputation is their strong approach to password security. The UNIX Password Scheme is a foundational method that protects user credentials using encryption, hashing, and secure storage techniques. Understanding how it works helps you appreciate why UNIX remains a trusted operating system in cybersecurity.\nWhat Is the UNIX Password Scheme? # The UNIX Password Scheme is the system UNIX uses to store and verify user passwords securely. Instead of storing passwords in plain text, UNIX stores hashed and salted versions of them. This means attackers cannot easily steal or read actual passwords even if they gain access to password files.\nHow the UNIX Password Scheme Works # Here’s a simplified breakdown of the steps UNIX uses to handle user passwords:\n1. User Creates a Password # When a user sets a password, the system does not store it directly. Instead, UNIX prepares it for secure storage.\n2. Password Is Combined With a Salt # A salt is a random value added to the password before it’s hashed.\nWhy salt matters:\nPrevents attackers from using pre-computed hash tables (like rainbow tables)\nEnsures that even identical passwords produce different hashes\nAdds randomness, making cracking harder\n3. The System Hashes the Password + Salt # UNIX uses a hashing function—traditionally DES-based crypt(), but modern systems use stronger algorithms like MD5, SHA-256, or SHA-512.\nHashing transforms the password into an irreversible “fingerprint.”\nKey point:\nHashing cannot be reversed. You can verify a password, but you can’t “unhash” it.\n4. The Hashed Password Is Stored in /etc/shadow # Older UNIX systems stored password hashes in /etc/passwd, which was world-readable and not secure.\nModern UNIX systems store hashes in:\n/etc/shadow — readable only by root.\nThis file contains:\nUsername\nSalt\nHashed password\nPassword expiration info\n5. Password Verification During Login # When a user logs in:\nThey type their password.\nUNIX retrieves the salt from /etc/shadow.\nUNIX hashes the entered password + salt.\nIf the result matches the stored hash, access is granted.\nAt no point is the actual password stored or transmitted.\nSecurity Strengths of the UNIX Password Scheme # ✔ Salted Hashing # Makes pre-computed attacks extremely difficult.\n✔ Strong Hash Functions # Modern UNIX systems use SHA-based hashing which is slow and resistant to brute-force attacks.\n✔ Secure Storage # Sensitive password hashes are locked away in /etc/shadow.\n✔ Easy to Upgrade # UNIX allows administrators to adopt new hashing algorithms without breaking existing logins.\nLimitations # Even though strong, the scheme is not perfect:\nWeak user passwords can still be vulnerable to dictionary attacks\nIf attackers gain root access, they can steal password hashes\nOld DES-based systems are outdated and insecure\nModern systems mitigate these issues by enforcing stronger password policies and using more robust hashing algorithms.\nWhy the UNIX Password Scheme Still Matters # The UNIX password system set the foundation for modern authentication security. Concepts like hashing, salting, and secure file storage are used in Linux, macOS, and countless web applications today. Even though newer methods like MFA and passwordless authentication are rising, the UNIX scheme remains a classic example of robust, well-designed security.\n","date":"2025-11-22","externalUrl":null,"permalink":"/how-unix-systems-protect-user-passwords/","section":"Posts","summary":"UNIX systems have been around for decades, and one of the reasons for their long-lasting reputation is their strong approach to password security. The UNIX Password Scheme is a foundational method that protects user credentials using encryption, hashing, and secure storage techniques. Understanding how it works helps you appreciate why UNIX remains a trusted operating system in cybersecurity.\n","title":"The UNIX Password Scheme: How UNIX Systems Protect User Passwords","type":"posts"},{"content":" Introduction # A general-purpose computer is a programmable electronic device that can run many different types of software and perform many different tasks, such as word processing, web browsing, playing games, or watching videos.\nIn this series of articles, we\u0026rsquo;ll build both the hardware and software of a fully functional general-purpose computer.\nWe\u0026rsquo;ll start with a simple logic gate called NAND (the elementary building block in our computer), It\u0026rsquo;ll serve as a layer of abstraction from the electronics world. We\u0026rsquo;ll use it as an interface that hides the complexity and frees up mental space for what\u0026rsquo;s ahead (We already have enough complexity to deal with).\nAbstraction is the key of building a very large complex piece of engineering. And that\u0026rsquo;s what makes us able to make a general-purpose computer starting from nothing but NAND gates.\nSo, what the prerequisites for this series of articles? Just to be a good learner, basic knowledge of electrical engineering and programming concepts is a plus. Understanding just what is NAND gate is an enough indication that you can continue.\nBy the end of this series, you’ll really appreciate how far computers have come.\nLogic gates # Computers operate on electricity (discrete electrical signals), which is abstracted into binary values: 0s and 1s. These correspond to true or false, high or low voltage levels (for example, 5V and 0V).\nFirst we\u0026rsquo;ll know about NAND and how to create other logic gates using it like NOT, AND, OR, NOR, XOR, XNOR, then we\u0026rsquo;ll learn about boolean expressions and functions.\nYou can use Logisim-evolution for simulation.\nNAND # What\u0026rsquo;s NAND gate? as we said before, it\u0026rsquo;s an abstraction, so we don\u0026rsquo;t have to worry about how it works, we only need to know what it is to use it.\nOutputs 0 only when all inputs are 1. Here is all inputs and outputs conditions:\nA B NAND 0 0 1 0 1 1 1 0 1 1 1 0 NOT # Outputs the reverse (compliment) of the input. How to make this functionality using the NAND gate?\nA NOT 0 1 1 0 So, the NOT gate is abstracted to be like this:\nNow, we don\u0026rsquo;t care that the NOT gate is implemented using the NAND gate, just we\u0026rsquo;ll use it when we need it. This what we\u0026rsquo;ll do for the next gates.\nAND # Outputs only 1 when all inputs are 1.\nNow it\u0026rsquo;s the time to use our abstraction, the NOT gate and the NAND gate to construct the AND gate.\nA B AND 0 0 0 0 1 0 1 0 0 1 1 1 OR # Outputs 1 when at least one input is 1.\nHow to make the OR gate using the NAND gate? — Reverse thing, it\u0026rsquo;s output is 0 when all inputs are 0, so you can use NAND but invert all its inputs.\nA B OR 0 0 0 0 1 1 1 0 1 1 1 1 XOR # Outputs 1 only when its inputs are different, odd number of 1s. How to construct that using the previous gates? Try it yourself before seeing the solution, the K-Map (Karnaugh Map) technique may help you.\nA B XOR 0 0 0 0 1 1 1 0 1 1 1 0 Now, you can forget about what you did to construct the XOR gate and just focus on what the use of it.\nOther gates like XNOR just the XOR inverted, same thing for NOR.\nInside the NAND gate (Optional) # This is the implementation of the NAND gate using two NPN transistors. Once we abstract it into a NAND, we no longer have to think about the transistors underneath.\nI hope you now appreciate the beauty of abstraction — a trick of the mind that allows us to design larger and larger systems.\nBoolean expressions and functions # This is where we stop thinking in terms of physical gates and start describing logic mathematically.\nThis way allows us to design, simplify, and reason about circuits before we ever touch hardware.\nWhat is a Boolean Expression? # A Boolean expression is a mathematical representation of a logic circuit using variables, constants (0/1) and logical operators. Each variable can have only two possible values — 1 (True) or 0 (False) — just like the outputs of our logic gates.\nThese expressions use operators such as:\nOperator Symbol Equivalent Gate Description AND · or no symbol (e.g., AB) AND True only if all inputs are True OR + OR True if at least one input is True NOT ¬ or ’ (A’, ¬A) NOT Inverts the input XOR ⊕ XOR True if inputs are different So, for example, if you have a simple circuit with two inputs A and B, and an output that is 1 only when both are 1, you can represent it as:\nF = A · B\nThis means “F equals A AND B”.\nAnother example, let’s say you have a circuit that outputs 1 when either A is 1, or B is 0.\nThe Boolean expression for that is:\nF = A + B’\nHere, B’ means NOT B — the inverse of B.\nSo, if B = 0 → B’ = 1.\nBoolean Functions # A Boolean function is simply a relationship between one or more input variables and a single output, defined using a Boolean expression.\nFor instance, consider this function:\nF(A, B, C) = A·B + ¬C\nThis describes a logic circuit that outputs 1 if A AND B are both 1, or if C is 0.\nYou can think of a Boolean function as a recipe that tells the circuit what to do for every possible combination of inputs.\nA B C F(A,B,C) = A·B + ¬C 0 0 0 1 0 0 1 0 0 1 0 1 0 1 1 0 1 0 0 1 1 0 1 0 1 1 0 1 1 1 1 1 From this truth table, you can visualize the function’s behavior across all inputs.\nCanonical Forms (Sum of Products and Product of Sums) # To simplify and standardize Boolean logic, we use two common forms of expression:\n1. Sum of Products (SOP) # In SOP form, the function is expressed as a sum (OR) of multiple product (AND) terms.\nExample:\nF = A’B + AB’\nEach term (like A’B) corresponds to a row in the truth table where the output is 1.\n2. Product of Sums (POS) # In POS form, the function is written as a product (AND) of multiple sum (OR) terms.\nExample:\nF = (A + B)(A’ + C)\nEach term corresponds to a row in the truth table where the output is 0.\nBoth forms describe the same logic but in different structural ways.\nDigital circuit designers often convert between them for optimization or implementation purposes.\nSimplifying Boolean Expressions # Just like simplifying algebraic equations, Boolean algebra allows us to reduce complex expressions into simpler ones — which means fewer gates and faster circuits.\nHere are a few essential Boolean laws:\nLaw Expression Expression Identity A + 0 = A A · 1 = A Null A + 1 = 1 A · 0 = 0 Idempotent A + A = A A · A = A Complement A + A’ = 1 A · A’ = 0 Distributive A(B + C) = AB + AC A + BC = (A + B)(A + C) De Morgan’s ¬(A·B) = ¬A + ¬B ¬(A + B) = ¬A·¬B Simplification helps transform expressions like:\nF = A·B + A·B’\ninto: F = A(B + B’) F = A · 1 F = A\n— a huge efficiency gain when building circuits!\nVisualization with Karnaugh Maps (K-Maps) # For functions with more than two or three variables, manual simplification can get messy.\nThat’s where Karnaugh Maps (K-Maps) come in — a graphical tool that helps you visually minimize Boolean expressions by grouping 1’s in the truth table.\nUsing K-Maps ensures your final circuit uses the minimum possible number of gates — a critical skill for anyone learning digital logic design.\n","date":"2025-10-11","externalUrl":null,"permalink":"/building-general-purpose-computer-1/","section":"Posts","summary":"Introduction # A general-purpose computer is a programmable electronic device that can run many different types of software and perform many different tasks, such as word processing, web browsing, playing games, or watching videos.\n","title":"Building a modern computer from scratch | part 1","type":"posts"},{"content":"","date":"2025-10-11","externalUrl":null,"permalink":"/tags/hardware/","section":"Tags","summary":"","title":"Hardware","type":"tags"},{"content":"","date":"2025-10-11","externalUrl":null,"permalink":"/categories/nand-to-tetris/","section":"Categories","summary":"","title":"Nand to Tetris","type":"categories"},{"content":"","date":"2025-10-11","externalUrl":null,"permalink":"/categories/projects/","section":"Categories","summary":"","title":"Projects","type":"categories"},{"content":"","date":"2025-10-11","externalUrl":null,"permalink":"/tags/projects/","section":"Tags","summary":"","title":"Projects","type":"tags"},{"content":"If you’ve ever used Arch Linux, you already know about the Arch User Repository (AUR).\nIt’s one of the main reasons Arch has such a strong community: a collection of build scripts that let you install almost anything with pacman.\nBut what if you’ve written your own tool, or found software not yet in the AUR?\nIn this guide, I’ll show you step by step how to create a PKGBUILD, test it properly, and upload it to the AUR.\n📦 What is the AUR? # The AUR is a community-maintained collection of build recipes.\nEach package is defined by a file called a PKGBUILD, which is essentially a Bash script that tells Arch how to build, install, and manage software.\nWhen you install a package from the AUR using helpers like yay or paru:\nThe PKGBUILD is downloaded. The package is compiled locally on your machine. It’s installed with pacman as if it came from the official repositories. ✅ Step 1: Prerequisites # Before you start, make sure you have:\nAn AUR account. You\u0026rsquo;ll need SSH keys to be configured with the AUR (you’ll need this to push code). You can see the wiki for the SSH Authentication\nInstalled base tools:\nsudo pacman -S --needed base-devel git 📝 Step 2: Writing a PKGBUILD # You can find templates for PKGBUILD in /usr/share/pacman/ which is a good to start with.\nThis is a practical example of PKGBUILD of my previous project Islamic prayer timings\n# Maintainer: Abdalrahman Shaban \u0026lt;abdalrahmanshaban52@gmail.com\u0026gt; pkgname=islamic-prayer-timings pkgver=1.1.1 pkgrel=1 pkgdesc=\u0026#34;Utility and daemon to get Islamic prayer timings using aladhan.com API\u0026#34; arch=(\u0026#39;x86_64\u0026#39;) url=\u0026#34;https://github.com/abdalrahmanshaban0/islamic-prayer-timings\u0026#34; license=(\u0026#39;GPL-3.0-or-later\u0026#39;) depends=(\u0026#39;curl\u0026#39; \u0026#39;libnotify\u0026#39;) makedepends=(\u0026#39;git\u0026#39; \u0026#39;cmake\u0026#39; \u0026#39;nlohmann-json\u0026#39;) provides=(\u0026#34;$pkgname\u0026#34;) conflicts=(\u0026#39;islamic-prayer-timings-git\u0026#39;) source=(\u0026#34;git+$url.git#tag=v$pkgver\u0026#34;) sha256sums=(\u0026#39;SKIP\u0026#39;) build() { cmake -S \u0026#34;$srcdir/$pkgname\u0026#34; -B build -DCMAKE_BUILD_TYPE=Release cmake --build build } package() { install -Dm755 build/islamic-prayer-timings \u0026#34;$pkgdir/usr/bin/islamic-prayer-timings\u0026#34; } Explanation of important fields: # pkgname → the name of your package.\nNormal release package\npkgname=islamic-prayer-timings This corresponds to official tagged releases (e.g., v1.1.1). Users who want a stable version will install this one. Git package (-git)\npkgname=islamic-prayer-timings-git This is a VCS package that always builds from the latest commit in your GitHub repo of the project. pkgver() is usually auto-generated with git describe --tags or git rev-parse --short HEAD. Users who want bleeding-edge development versions will install this one. Binary package (-bin)\npkgname=islamic-prayer-timings-bin Instead of building from source, this downloads your prebuilt binary release from GitHub (.tar.gz, .AppImage, etc.). Saves compilation time, but depends on you providing binaries in your releases. Useful for users who just want to install quickly. pkgver → the upstream version (e.g., 1.0.1).\npkgrel → increment if you change the PKGBUILD without a new upstream release.\npkgdesc → a short description of your package (keep it short, under ~80 characters).\narch → the supported system architectures.\nMost common: ('x86_64'). For cross-platform builds, you may include others like ('aarch64' 'armv7h'). url → the project’s homepage or repository URL.\nlicense → license under which the software is distributed.\nUse valid SPDX identifiers, e.g., ('GPL-3.0-or-later'). depends → runtime dependencies required for the program to work.\nmakedepends → build-time dependencies required only during compilation.\nprovides → what this package provides (useful if multiple packages share the same binary).\nconflicts → packages that cannot be installed alongside this one.\nsource → where to fetch the source code (What branch or version).\nsha256sums → security check for sources (use updpkgsums to update).\nbuild() → function describing how to build the software.\nTypically runs cmake, make, or similar commands. package() → function that installs the built files into $pkgdir, which mimics the system root.\nThis is how files get placed in /usr/bin, /usr/share, etc. To know more any time about PKGBUILD you can uses\nman PKGBUILD 🔨 Step 3: Testing Your Package # Test your PKGBUILD locally: makepkg -si\nThis will:\nDownload the sources. Build the software. Install it on your system. For more robust testing, build in a clean chroot (recommended for AUR submission):\nsudo pacman -S devtools extra-x86_64-build This ensures your package builds on a clean Arch environment, just like it will for other users.\n📄 Step 4: Generating .SRCINFO # The AUR requires a .SRCINFO file, which describes your package in a machine-readable format. Generate it with:\nmakepkg --printsrcinfo \u0026gt; .SRCINFO` Both PKGBUILD and .SRCINFO must be committed to your Git repository.j\n🚀 Step 5: Uploading to the AUR # Clone your package repository from the AUR (replace with your package name):\ngit clone ssh://aur@aur.archlinux.org/myproject.git cd myproject Copy your PKGBUILD and .SRCINFO into this folder.\nCommit and push your changes:\ngit add PKGBUILD .SRCINFO git commit -m \u0026#34;Initial commit\u0026#34; git push 🎉 Done! Your package is now live on the AUR.\n📌 Step 6: Versioning Best Practices # New upstream release? Update pkgver, reset pkgrel=1. Changed PKGBUILD only? Increment pkgrel. Development (“-git”) packages? Use pkgname=myproject-git and write a pkgver() function that generates version numbers from Git commits or tags. ⚠️ Step 7: Common Pitfalls # Forgetting .SRCINFO → AUR won’t show your update.\nWrong license identifiers → use official SPDX IDs\nAdding unnecessary dependencies → only include what’s actually needed.\nNot testing in a chroot → package may break for other users.\n🎯 Final Thoughts # Publishing your software on the AUR is one of the best ways to give back to the Arch community. Once you go through the process once or twice, it becomes straightforward.\nRemember:\nKeep your PKGBUILD clean.\nFollow Arch packaging standards.\nTest before uploading.\nBy doing this, you ensure your package is reliable and useful for thousands of Arch users worldwide.\nSee also:\nAccessing Remote Git Repositories on Linux How to contribute to open-source ","date":"2025-10-01","externalUrl":null,"permalink":"/creating-packages-for-the-aur/","section":"Posts","summary":"If you’ve ever used Arch Linux, you already know about the Arch User Repository (AUR).\nIt’s one of the main reasons Arch has such a strong community: a collection of build scripts that let you install almost anything with pacman.\n","title":"How to create packages to the AUR - Arch User Repository","type":"posts"},{"content":"","date":"2025-10-01","externalUrl":null,"permalink":"/categories/software/","section":"Categories","summary":"","title":"Software","type":"categories"},{"content":"","date":"2025-09-30","externalUrl":null,"permalink":"/tags/github/","section":"Tags","summary":"","title":"GitHub","type":"tags"},{"content":"GitHub has become the go-to platform for software collaboration, whether you’re a small startup team, a university project group, or a large enterprise. But many developers new to GitHub only scratch the surface—pushing code and opening issues—without setting up a proper workflow that helps everyone stay organized and productive.\nIn this guide, we’ll cover best practices for working together on GitHub as a team, from project setup to code reviews, so your collaboration feels smooth instead of chaotic.\nSetting Up the Repository # Before any code is written, set up a well-structured repository:\nRepository name: Choose a clear, concise name that reflects the project.\nREADME.md: Document the description or purpose of the project and contribution guidelines.\nLICENSE: Select an open-source license if you want to share your code publicly.\n.gitignore: Prevents unnecessary files (like IDE workspace-specific settings and configurations e.g. .vscode or .idea) from being tracked.\nBranch protection rules: Enforce code review and CI checks before merging into main.\nTip: Keep your default branch (main or master) deployable at all times.\nOrganizing Work With Issues # GitHub Issues are the core of project tracking:\nCreate issues for tasks: Each bug, feature, or improvement should have its own issue. Use labels: Categorize issues with labels like bug, enhancement, documentation, or priority-high. Assign issues: The assignee is responsible for completing the task. Milestones: Group issues into larger goals, like “v1.0 release.” Well-written issues act as the team’s to-do list and knowledge base.\nBranching Strategy # To avoid stepping on each other’s toes, agree on a branching workflow:\nMain branch (main): Always stable and ready to release. Feature branches: For new features, e.g. feature/user-authentication. Bugfix branches: For fixes, e.g. bugfix/login-error. A common strategy is GitHub Flow:\nBranch off main. Commit your changes. Open a Pull Request. Get reviews and approvals. Merge into main. The conventional commits format # The conventional commits format is a style for commits that uses structured prefixes (like feat:, fix:, docs:, etc.) to make commit history machine-readable and more consistent.\nCommon Types # \u0026lt;type\u0026gt;[optional scope]: \u0026lt;short description\u0026gt; \u0026lt;BLANK LINE\u0026gt; [optional body] \u0026lt;BLANK LINE\u0026gt; [optional footer(s)] feat – a new feature (feat: add user profile picture upload)\nfix – a bug fix (fix: prevent crash when saving empty form)\ndocs – documentation only (docs: update API usage examples)\nstyle – formatting, whitespace, no code changes (style: format code with clang-format)\nrefactor – code change that isn’t a feature or fix (refactor: simplify validation logic)\nperf – performance improvement (perf: improve query speed with index)\ntest – adding or fixing tests (test: add unit test for password hashing)\nchore – don’t affect the application’s source code as maintenance tasks, build, deps (update Dockerfile to use Node 20)\nUse parentheses to narrow down where the change applies.\nfeat(auth): add JWT token refresh fix(ui): correct button alignment Commit Description \u0026amp; Footer\nBody: Explain reasoning, details, limitations. Footer: Link issues/tickets or note breaking changes. Why Use This Style? # Standardized commit history. Auto-generates changelogs (e.g., with semantic-release). Helps tooling understand semantic versioning (feat = minor, fix = patch, breaking = major). Pull Requests and Code Reviews # Pull Requests (PRs) are where collaboration shines:\nDescribe the change clearly: What does it fix or add? Why? Link related issues: Use Closes #123 to auto-close an issue when merged. Request reviews: At least one teammate should review before merging. Discuss in comments: Reviewers can suggest improvements inline. Use draft PRs for work in progress. This process ensures quality and knowledge sharing.\nContinuous Integration (CI) and Testing # Automating checks saves time:\nUse GitHub Actions or other CI tools to run tests on every PR. Lint and format code automatically. Add status checks so PRs can’t merge unless tests pass e.g. Unit tests passing Code builds successfully Linting/formatting checks Security scans pass Code coverage above a threshold This prevents broken code from reaching main.\nDocumentation and Wikis # Don’t let knowledge live only in people’s heads:\nUpdate the README as the project evolves. Maintain a /docs/ folder or use the GitHub Wiki for deeper guides. Document setup steps so onboarding new contributors is easy. Communication and Collaboration # GitHub isn’t just code—it’s a collaboration platform:\nDiscussions: Great for brainstorming outside of issues also can be on platforms like Discord or Slack. Project boards: Use Kanban boards to track progress visually. Notifications: Watch or subscribe to repos to stay updated. Combine GitHub with a chat tool (like Slack or Discord) for real-time updates.\nReleases and Tags # When a version is ready:\nTag a release with semantic versioning (e.g. v1.0.0). Publish release notes to summarize changes. Optionally attach build artifacts. This gives users and teammates a clear history of project evolution.\nSemantic Versioning (SemVer) # The format is:\nMAJOR.MINOR.PATCH MAJOR → Breaking changes (incompatible API changes, redesigns, etc.).\nMINOR → New features that are backwards-compatible.\nPATCH → Bug fixes or small improvements, fully backwards-compatible.\nBest Practices for Teams # Start at v0.x.x for early development until you’re confident in stability. Tag every release with a version so it’s easy to roll back. Automate versioning with tools like semantic-release Security Best Practices # Never commit secrets (API keys, passwords). Enable Dependabot alerts to stay updated on vulnerabilities ـــ alerts are security notifications sent by GitHub to inform you when your project\u0026rsquo;s software dependencies have known security vulnerabilities, such as insecure packages or malware* Use branch protections and required reviews. Enable two-factor authentication for all team members. GitHub Deployments \u0026amp; Environments # Deployments are the automated steps that move built artifacts into an environment (staging, production, preview). On GitHub, deployments are typically implemented using GitHub Actions and enhanced with Environments and the Deployments API.\nWhat to use GitHub deployments for:\nDeploy a static site (Hugo) to GitHub Pages, S3, or Netlify. Deploy a backend to a server, Kubernetes cluster, or cloud provider. Create ephemeral preview environments for pull requests. Example Workflow in Action # Here’s how a feature might flow through the system:\nSomeone opens an issue: “Add dark mode.” A developer is assigned and creates a branch: feature/dark-mode. They commit code and push to GitHub. A Pull Request is opened, linked to the issue.5. CI checks run, all tests pass. Teammates review, suggest changes, and approve. The PR is merged into main. The issue is automatically closed. The feature ships in the next release. Conclusion # GitHub provides powerful tools for collaboration, but they work best when your team follows consistent workflows. By structuring your repo, using issues, branching properly with protecting rules, and embracing Pull Requests, you’ll avoid chaos and ship better software faster.\nWhether you’re building a side project or managing a production system, adopting these GitHub best practices helps your team stay aligned and productive.\nSee also\nHow to Contribute to Open Source\n","date":"2025-09-30","externalUrl":null,"permalink":"/collaborate-on-github/","section":"Posts","summary":"GitHub has become the go-to platform for software collaboration, whether you’re a small startup team, a university project group, or a large enterprise. But many developers new to GitHub only scratch the surface—pushing code and opening issues—without setting up a proper workflow that helps everyone stay organized and productive.\n","title":"How to Collaborate Effectively on GitHub for Software Projects","type":"posts"},{"content":"Open-source software powers the world — from Linux to browsers, frameworks, and libraries. But open source isn’t just about using free tools; it’s about collaboration and giving back to the community.\nRecently, I shared on LinkedIn how I started contributing to the Quran Companion project, a cross-platform C++ application I use daily. I wanted to add a simple feature: a delay between repeated verses. That small improvement led me down the exciting path of open-source contribution. And also contributed to Hyprland window manager.\nIf you’ve been wondering “How do I contribute to open-source?” — here’s a practical, beginner-friendly guide.\nWhy Contribute to Open Source? # Learn by doing: Work with real-world codebases and improve your skills. Build your profile: Your contributions are public and can showcase your expertise. Solve real problems: You can improve tools you and many others already use. Join a community: Collaboration brings you closer to like-minded developers worldwide. Step 1: Use the Project Like a User # Start as a regular user. Install the project, explore its features, and see what works well or what could be improved.\nAsk yourself:\nIs there a bug that bothers me? Is there a missing feature I’d like to add? 👉 Example: I realized the Quran Companion app needed a delay between repeated verses — a small but useful improvement.\nStep 2: Explore the Repository and Issues # Go to the project’s GitHub repository:\nCheck the Issues tab to see if your problem or idea already exists and if you can work on other issues. Look at labels (like good first issue, bug, enhancement) to find beginner-friendly tasks. If your idea isn’t listed, you can open a new issue describing it. Step 3: Set Up Your Development Environment # When you decide to work on an issue:\nFork the repository to your GitHub account. Clone it locally: git clone https://github.com/your-username/project-name.git Install the project’s dependencies. For C++ projects, this often means using CMake or other build tools. Open the project in an IDE, let it index the code, and ensure you can build and run it. ✅ At this point, you should be confident that your setup works.\nStep 4: Make Changes and Test # Write your code following the project’s code style. Split your work into logical commits with clear commit messages. Test your changes thoroughly before submitting. Step 5: Open a Pull Request (PR) # When ready:\nPush your changes to your fork. Open a Pull Request (PR) to the main repository. Write a clear title and detailed description. Explain what you changed and why. Most projects have automated checks (like formatting or build tests). If your PR fails a check, fix the issues and push again. Then, a reviewer will look at your PR:\nThey may request changes (like handling an edge case). Or, they may approve and merge your contribution 🎉. Remember: reviewers are volunteers. Take your time, respond respectfully, and don’t worry about deadlines — there usually aren’t any.\nFinal Tips for Beginners # Start small. Even fixing a typo or improving documentation counts. Be patient with reviews and feedback. Read the project’s CONTRIBUTING.md if available. Don’t be afraid to ask questions — open source is about learning and sharing. Conclusion # Contributing to open source can feel intimidating at first, but it’s one of the most rewarding ways to grow as a developer.\nWhether you’re fixing a bug, adding a new feature, or improving documentation, every contribution makes a difference. And who knows? The project you help today might become the one someone else depends on tomorrow.\nSo go ahead: pick a project you use, explore its repository, and make your first contribution 🚀.\nHave you contributed to open source before? Share your experience in the comments or link to your favorite project on GitHub!\nSee also:\nAccessing Remote Git Repositories on Linux ","date":"2025-09-27","externalUrl":null,"permalink":"/how-to-contribute-to-open-source/","section":"Posts","summary":"Open-source software powers the world — from Linux to browsers, frameworks, and libraries. But open source isn’t just about using free tools; it’s about collaboration and giving back to the community.\n","title":"How to Contribute to Open Source: A Beginner-Friendly Guide","type":"posts"},{"content":"","date":"2025-09-24","externalUrl":null,"permalink":"/tags/keepassxc/","section":"Tags","summary":"","title":"Keepassxc","type":"tags"},{"content":"One of the most important things you can do to keep yourself safe online is to ensure that your passwords are unique in every website or service and also to be hard and difficult to guess or brute force.\nIt’s almost impossible to remember every password. So, managing passwords securely is a non-negotiable part of modern digital life. If you\u0026rsquo;re on Linux or Windows or Mac and want a secure, open-source, and flexible password manager, KeePassXC is one of the best tools available.\nIn this post, I’ll walk you through my personal setup:\nKeePassXC as the password manager, passwords database is stored locally The official KeePassXC-Firefox extension for autofill Syncing the encrypted database via a private GitHub repository This workflow gives me the balance of security, privacy, and convenience I need.\nWhy Use a Password Manager? # A password manager solves three problems at once:\nStrong passwords — No need to remember them, so they can be long and random. Convenience — Autofill credentials in browsers like Firefox without copying/pasting. Security — Protects against phishing and reuse of weak passwords. Unlike proprietary cloud-based managers, KeePassXC keeps you in control of your data. No third-party servers, no subscription fees, and full offline functionality.\nSetting Up KeePassXC on Linux # On most distributions, KeePassXC is available via package managers:\n# Ubuntu / Debian sudo apt install keepassxc # Fedora sudo dnf install keepassxc # Arch Linux sudo pacman -S keepassxc Once installed:\nCreate a new database. Choose a strong master password (this is the only one you’ll need to remember). Optionally, add a key file for extra protection. KeePassXC + Firefox Integration # KeePassXC comes with a browser integration feature.\nSteps to enable it in Firefox:\nInstall the KeePassXC-Browser extension. In KeePassXC, go to Tools → Settings → Browser Integration and enable Firefox. Pair Firefox with KeePassXC (you’ll be prompted with a key exchange). Now, whenever you visit a login page, KeePassXC can autofill your credentials. This keeps things both secure and fast.\nSyncing the Database via GitHub # I keep my password database in a private GitHub repository. Why?\nEasy syncing across multiple devices. Version control for peace of mind. End-to-end security because the database is encrypted locally. There\u0026rsquo;s 2-step authentication in my GitHub account, so it\u0026rsquo;s another layer of protection. Setup: # # Clone your private repo git clone git@github.com:your-username/passwords.git # Move your KeePassXC database into it mv ~/Documents/passwords.kdbx ~/passwords/ # Commit and push cd ~/passwords git add passwords.kdbx git commit -m \u0026#34;Add KeePassXC database\u0026#34; git push origin main Now, on another machine, just clone or pull the repo and open the database with KeePassXC.\nImportant: The database is encrypted, but avoid syncing plaintext key files or backups in GitHub. Keep those strictly offline.\nWhy This Setup Works for Me # Open-source tools only (KeePassXC + GitHub + Firefox). No vendor lock-in — I can migrate anytime. Offline first — Works without internet. Secure syncing with end-to-end encryption. It’s not a one-click solution like Bitwarden or 1Password, but if you’re already comfortable with Git and Linux, this setup is hard to beat.\nFAQ # Is KeePassXC safe for Linux users? # Yes. KeePassXC uses strong AES-256 encryption and is fully open source, meaning its code is audited and trusted by the Linux security community.\nWhy not just use a cloud password manager? # Cloud services are convenient, but they’re also centralized targets for hackers. With KeePassXC, you own your data and can sync it however you like.\nCan I use GitHub for password syncing? # Yes, but always in a private repository. Since the database itself is encrypted, the contents remain secure as long as your master password is strong and also you can use a file (image) with it for more security.\nFinal Thoughts # For me, the combo of KeePassXC + Firefox + private GitHub repo has been rock-solid.\nIf you’re already using Linux, Windows, Mac, give it a try — you might never look back at proprietary password managers again.\nSee also:\nAccessing Remote Git Repositories on Linux ","date":"2025-09-24","externalUrl":null,"permalink":"/password-managers-keepassxc/","section":"Posts","summary":"One of the most important things you can do to keep yourself safe online is to ensure that your passwords are unique in every website or service and also to be hard and difficult to guess or brute force.\n","title":"Password Managers | My Setup with KeePassXC, Firefox, and GitHub","type":"posts"},{"content":"","date":"2025-09-24","externalUrl":null,"permalink":"/categories/productivity/","section":"Categories","summary":"","title":"Productivity","type":"categories"},{"content":"","date":"2025-09-24","externalUrl":null,"permalink":"/tags/security/","section":"Tags","summary":"","title":"Security","type":"tags"},{"content":" Fish shell # Why use Fish? Because it’s user-friendly, comes with auto suggestions, syntax highlighting, and is much more modern compared to Bash or zsh.\nsudo pacman -S fish Making fish the default shell: # chsh -s /usr/bin/fish Edit greeting message # set -U fish_greeting \u0026#34;Hello there\u0026#34; or you can disable it\nset -U fish_greeting customize fish prompt # The reference is Tide fish prompt.\n# install fisher (to easily install fish plugins) sudo pacman -S fisher # install tide prompt fisher install IlanCosman/tide@v6 # to open the configuration wizard tide configure Terminal (with cursor animations) # Alacritty terminal with cursor animations I\u0026rsquo;ve tried 2 terminals that enables cursor trail or animations, Alacritty and Kitty. It\u0026rsquo;s by default available in kitty but in alacritty you must build it from source with some shaders. Here are the 2 options, my default terminal now is Kitty as also it supports images like in fastfetch shows below and other features.\nAlacritty # There\u0026rsquo;s an Alacritty fork that supports cursor animations which looks stunning.\nYou can build it from source or install it from the AUR if you\u0026rsquo;re using Arch Linux:\nparu -S alacritty-smooth-cursor-git You can find my alacirtty config in my repo for Arch-Dots.\nKitty # Just by adding this in ~/.config/kitty/kitty.conf cursor trail will work\ncursor_trail 10 cursor_trail_decay 0.1 0.3 cursor_trail_start_threshold 0 Making commands output look better # ls alternative (eza) # sudo pacman -S eza You can these aliases (put them in ~/.config/fish/config.fish):\nalias ls=\u0026#34;eza -l --color --icons --git --group-directories-first\u0026#34; alias la=\u0026#34;eza -la --color --icons --git --group-directories-first\u0026#34; Pacman # To enable colors and change progress bar look, edit /etc/pacman.conf, under [options], add or uncomment Color and ILoveCandy.\nPacman with colors and ILoveCandy progress bar Fastfetch # Fastfetch is a CLI tool for fetching system information and displaying them in a pretty way. It\u0026rsquo;s better than neofetch which is deprecated now.\nFirst you should specify what info to be displayed and the ascii figure that will appear.\nYou can run fastfetch --gen-config-full to generate a full config file with all optional options then you can comment what you don\u0026rsquo;t want to be displayed.\nThere will be default default ascii logo for your distro you can search on the web for any thing else. And feel free to see my dotfiles\nYou must install imagemagick to use png logos in fastfetch if your terminal supports that (kitty does).\nsudo pacman -S imagemagick Btop # You can edit just 2 lines to make it looks like this: color_theme = \u0026#34;tokyo-night\u0026#34; theme_background = False Also you can select what blocks to show by default, I added gpu0\nshown_boxes = \u0026#34;mem net proc gpu0 cpu\u0026#34; 👉 You\u0026rsquo;re welcome to visit my Arch-Dots repo for all my dotfiles.\nSee also:\nArch Linux with Hyprland | Comprehensive guide ","date":"2025-09-22","externalUrl":null,"permalink":"/make-your-linux-terminal-look-cool/","section":"Posts","summary":"Fish shell # Why use Fish? Because it’s user-friendly, comes with auto suggestions, syntax highlighting, and is much more modern compared to Bash or zsh.\n","title":"Make your Linux terminal look cool","type":"posts"},{"content":"Version control is the backbone of modern software development, and Git is its most widely used tool. Whether you’re working solo or collaborating on open-source projects, you need to know how to connect your local Linux machine to remote repositories.\nIn this guide, you’ll learn:\nHow to authenticate via HTTPS and SSH How to clone, pull, and push to remotes What You Need Before Starting # Make sure you have:\nGit installed:\ngit --version If missing:\nsudo apt install git # Debian/Ubuntu sudo dnf install git # Fedora sudo pacman -S git # Arch A GitHub/GitLab account (or another Git hosting service).\nBasic knowledge of Linux terminal commands.\nSetting Your Git Identity # Configure your username and email once for all:\ngit config --global user.name \u0026#34;Jane Doe\u0026#34; git config --global user.email \u0026#34;jane_doe@example.com\u0026#34; Verify settings:\ngit config --list Authentication Methods: HTTPS vs SSH # SSH (Recommended) # URL format:\ngit@github.com:user/repo.git Pros: No password prompts after setup. Steps: Generate a key: ssh-keygen -t ed25519 -C \u0026#34;jane_doe@example.com\u0026#34; Copy your key to clipboard: cat ~/.ssh/id_ed25519.pub Add it to GitHub/GitLab → Settings → SSH Keys. Test connection: ssh -T git@github.com HTTPS # URL format:\nhttps://github.com/user/repo.git Pros: Simple to set up. Steps: got to Github Settings → Developer Settings → Tokens Generate a new token and copy it git clone https://github.com/user/repo.git Username: your-github-username Password: \u0026lt;paste your personal access token\u0026gt; Cons: May prompt for credentials unless you enable a credential helper: git config --global credential.helper store Cloning a Remote Repository # To download a repository:\ngit clone https://github.com/user/repo.git # or using SSH: git clone git@github.com:user/repo.git This creates a project directory containing all files and commit history. You can add --recursive after clone if the repository you are cloning contains submodules.\nLinking a Local Project to a Remote # If you already have a project and want to push it online:\ngit init git remote add origin https://github.com/user/repo.git git add . git commit -m \u0026#34;Initial commit\u0026#34; git push -u origin main Fetching, Pulling, and Pushing # Fetch: Download remote changes without merging.\ngit fetch origin Pull: Download and merge changes into your branch.\ngit pull origin main Push: Upload your local changes.\ngit push origin main ","date":"2025-09-03","externalUrl":null,"permalink":"/accessing-remote-git-repositories-on-linux/","section":"Posts","summary":"Version control is the backbone of modern software development, and Git is its most widely used tool. Whether you’re working solo or collaborating on open-source projects, you need to know how to connect your local Linux machine to remote repositories.\n","title":"Accessing Remote Git Repositories on Linux","type":"posts"},{"content":"","date":"2025-09-03","externalUrl":null,"permalink":"/tags/git/","section":"Tags","summary":"","title":"Git","type":"tags"},{"content":"Welcome to SudoStart — your terminal the world of computers, programming, Linux, and tech curiosity.\nThis blog is a space for explaining my programming projects, technical posts, solving problems, and sharing what I learn along the way. Whether you\u0026rsquo;re a geek or tech enthousiaste, or a computer science or endineering student, you\u0026rsquo;re in the right place.\nMy name is Abdalrahman Shaban, you can find out about me.\nI built this site with Hugo and the BlowFish theme to keep things fast, lightweight, and focused on content.\nIf you have questions, feedback, or just want to say hello, feel free to contact me.\n","date":"2025-08-02","externalUrl":null,"permalink":"/about/","section":"SudoStart","summary":"Welcome to SudoStart — your terminal the world of computers, programming, Linux, and tech curiosity.\nThis blog is a space for explaining my programming projects, technical posts, solving problems, and sharing what I learn along the way. Whether you’re a geek or tech enthousiaste, or a computer science or endineering student, you’re in the right place.\n","title":"About","type":"page"},{"content":" Education # 4th year Electrical Engineering Student at Assiut University, Computers and Systems section, 2021-2026. Total grade: Good (72.75%).\nProjects # CryptoBagua # CryptoBagua – An Android application for monitoring crypto-mining balances using UnMineable USDT wallets. Implemented secure user authentication with JWT, encrypted wallet storage using AES-256, and password hashing with bcrypt. Built fine-grained access control allowing users to grant or revoke balance-view permissions to other users. Integrated secure backend communication over HTTPS, rate limiting, CORS protection, and secure HTTP headers, with a strong focus on data protection and account security.\nTalabat-Lite # Talabat-Lite is a server-client application for android. It facilitates food, goods or medicines delivery and other services, connecting customers with local vendors and managing delivery personnel.\nThe server is written in C++ communicating with client over HTTP using crow (microframework for the web, uses routing similar to Python\u0026rsquo;s Flask). For database it uses SQLite C/C++ interface. The client is a Java Android application.\nSmart Home # Smart Home Automation is a microcontroller-based system for secure home control with password protection with security lockout and buzzer alert after 3 repeated failed attempts. Features include isolated lamps toggling and dimming via PWM, automatic fan control using temperature sensing, servo-driven door lock, and real-time LCD status display. Provides both local keypad access and remote admin control over UART.\nChess Over Sockets # Simple 2 player Chess C++ console game connecting over Unix sockets. It detects win, lose and draw situations.\nIslamic Prayer Timings for Linux # A daemon or service for notifying about Islamic prayers timings on Linux using an API from aladhan.com. Supported to be custom module for Waybar\nIslamic Prayer Timings for Android # An Android application that displays Islamic prayer times with a persistent notification showing the next prayer name, time, and countdown. Built with Kotlin, this app offers 24-hour / 12-hour format switching, Arabic \u0026amp; English language support, and runs a foreground service to keep you updated throughout the day.\nSudoku Game # A simple GUI sudoku game with both 6x6 and 9x9 written in C with GTK.\nActivities \u0026amp; Certifications # Open-Source Contributions: # Hyprland: Unix sockets error handling and minor refactoring. #9536 Hyprland-Wiki: Adding missing dependencies in manual installation for Arch Linux. #987 Quran-Companion: Feature: Adding a spin for verse frequency delay #129 Updating README.md to successfully clone, build and install for Linux. #127, #133. Problem Solving: # 38th place in the 2023 ICPC ECPC Qualifications Collegiate Programming Contest Day 10. Cert Winter Camp Phase 1 Training at ICPC Assiut community. Cert 37th place in The 2022 ICPC ECPC Qualifications Collegiate Programming Contest Day 10. Cert HackerRank Basic Problem Solving. Cert Solving programming problems, my profile at Codeforces, Leetcode and AtCoder. • MATLAB Onramp Cert • Writing in LaTeX ”Simple Electronics Handbook” to summarize most of Electronics course in my college. Book • Making tech videos about Linux, Programming, .. in my YouTube channel. Skills # C/C++ Java Linux Android Git Problem solving Diagrams and presentation Teamwork ","date":"2025-08-02","externalUrl":null,"permalink":"/aboutme/","section":"SudoStart","summary":"Education # 4th year Electrical Engineering Student at Assiut University, Computers and Systems section, 2021-2026. Total grade: Good (72.75%).\n","title":"About me","type":"page"},{"content":"Last updated: August 2, 2025\nAt SudoStart, accessible at https://sudostart.com, we respect your privacy and are committed to protecting it through this Privacy Policy.\nThis page outlines the types of information we collect, how it\u0026rsquo;s used, and your choices.\n1. Information We Collect # We do not collect personal data directly. However, certain third-party tools may collect data as described below:\na. Analytics # We use Cloudflare Web Analytics to gather anonymous statistics such as page views, device types, and referrer URLs.\nCloudflare Analytics:\nDoes not use cookies Does not track personal identifiers Is GDPR and CCPA compliant b. Comments via Utterances # We use Utterances to enable comments on blog posts. Utterances is a GitHub-based comment system.\nWhen you leave a comment:\nYou must log in with your GitHub account Your GitHub username, avatar, and profile link will be displayed publicly Your comment is stored as a public GitHub issue in our repository Please refer to GitHub’s Privacy Policy for more information.\n2. Planned Use of Google AdSense # We may use Google AdSense in the future to serve advertisements.\nWhen enabled, Google AdSense may:\nUse cookies to personalize ads based on your browsing behavior. You can know more about How Google uses cookies Collect data through cookies and web beacons Share usage data with advertising partners You can manage your ad preferences or opt out of personalized ads via Google Ad Settings.\nUntil ads are enabled, no advertising-related cookies are set.\n3. Cookies # Currently, this website does not use cookies directly.\nHowever, third-party services (like AdSense in the future) may place cookies to function.\nWhen this occurs, we will update this policy accordingly.\n4. Data Sharing # We do not sell, trade, or rent your personal data.\nThird-party services may collect data independently. These include:\nGitHub (for comments) Google (if/when ads are added) Cloudflare (for analytics) We recommend reviewing their respective privacy policies for more information.\n5. Links to Other Sites # Articles may contain links to external websites. We are not responsible for their content or privacy practices.\n6. Children’s Privacy # This website is not intended for children under 13. We do not knowingly collect personal information from children.\nIf you believe a child has submitted personal information, please contact us.\n7. Your Rights # Depending on your location, you may have certain rights under privacy laws such as the GDPR or CCPA.\nThese may include:\nThe right to access, update, or delete your data The right to object to data processing The right to data portability As we do not collect personal data directly, these requests typically apply to third-party services (e.g. GitHub or Google).\n8. Changes to This Policy # We may update this Privacy Policy at any time. Changes will be posted on this page with an updated revision date.\n9. Contact Us # If you have any questions about this Privacy Policy, contact us\n","date":"2025-08-02","externalUrl":null,"permalink":"/privacy-policy/","section":"SudoStart","summary":"Last updated: August 2, 2025\nAt SudoStart, accessible at https://sudostart.com, we respect your privacy and are committed to protecting it through this Privacy Policy.\nThis page outlines the types of information we collect, how it’s used, and your choices.\n","title":"Privacy Policy","type":"page"},{"content":"Last updated: August 2, 2025\nWelcome to SudoStart — your terminal where ideas take root.\nPlease read these Terms and Conditions (\u0026ldquo;Terms\u0026rdquo;) carefully before using https://sudostart.com (the \u0026ldquo;Website\u0026rdquo;).\nBy accessing or using this Website, you agree to be bound by these Terms. If you do not agree, please do not use the Website.\n1. Use of the Site # This Website is a personal technical blog intended for informational and educational purposes only. You may:\nRead, share, and link to the content Use the knowledge here to build or learn Comment on articles via GitHub (Utterances) You may not:\nCopy or redistribute content as your own Use the site to spread spam, malware, or hate Attempt to disrupt or compromise the site\u0026rsquo;s infrastructure 2. Intellectual Property # Unless otherwise stated, all content on SudoStart — including text, code snippets, images, and designs — is the property of the author.\nYou may quote or reference content with credit and a backlink.\nAll trademarks and third-party logos are the property of their respective owners.\n3. Comments \u0026amp; User Content # We use Utterances, which requires a GitHub account to post comments.\nBy posting a comment:\nYou retain ownership of your content You grant us the right to display it publicly on the blog You agree not to post anything unlawful, offensive, or misleading We reserve the right to remove comments that violate these terms, or that are off-topic, abusive, or spammy.\n4. Disclaimer of Warranties # All content on this site is provided \u0026ldquo;as is\u0026rdquo; and without warranty of any kind.\nWhile we aim for accuracy, we make no guarantees about:\nThe correctness, completeness, or timeliness of the information Whether it suits your specific needs or goals Use the content at your own risk. We are not responsible for any decisions or actions you take based on the content.\n5. External Links # Articles may contain links to third-party websites.\nWe have no control over the content or privacy practices of those websites and do not endorse them.\nAlways review the terms and privacy policies of external sites.\n6. Affiliate Disclosure (If applicable in future) # In the future, we may include affiliate links or sponsored content. If so, we’ll clearly disclose when links may earn us a commission — without costing you anything extra.\n7. Advertising (Google AdSense) # We may serve ads via Google AdSense in the future.\nThese ads may use cookies to personalize your experience. For details on how your data may be used, see our Privacy Policy.\n8. Changes to These Terms # We reserve the right to modify these Terms at any time. Changes will be posted here with a revised date.\nContinued use of the Website after any changes means you accept the new Terms.\n9. Governing Law # These Terms are governed by and construed under the laws of the jurisdiction of the site owner (currently Egypt, unless otherwise stated), without regard to its conflict of law principles.\n10. Contact # For any questions about these Terms, contact us\n","date":"2025-08-02","externalUrl":null,"permalink":"/terms/","section":"SudoStart","summary":"Last updated: August 2, 2025\nWelcome to SudoStart — your terminal where ideas take root.\nPlease read these Terms and Conditions (“Terms”) carefully before using https://sudostart.com (the “Website”).\nBy accessing or using this Website, you agree to be bound by these Terms. If you do not agree, please do not use the Website.\n","title":"Terms and Conditions","type":"page"},{"content":"For me, Knowing that 3 hours left until Fajr is more informative than knowing that it\u0026rsquo;s 2 AM now. That was the motivation to create a Linux daemon and waybar custom module for Islamic prayer timings using Aladhan API.\nRequirements \u0026amp; Features # Finding an API to get the correct timings for your location.\nReading the config variables, country, city, hour24 and onAdhan from ~/.config/IslamicPrayerTimings.\nThis is a configuration file example:\n{ \u0026#34;country\u0026#34;: \u0026#34;Egypt\u0026#34;, \u0026#34;city\u0026#34;: \u0026#34;Cairo\u0026#34;, \u0026#34;hour24\u0026#34;: false, \u0026#34;onAdhan\u0026#34;: \u0026#34;~/.config/IslamicPrayerTimings/inAdhan.sh\u0026#34; } Making an update worker (thread) to get and store updated prayer timings and hijri date on program startup and at midnight.\nCaching the latest response in ~/.local/share/IslamicPrayerTimings/timings.json in case starting the daemon without internet.\nMaking a daemon that calculates the next prayer timing, time difference and starts a timer with the countdown.\nWhen the timer is finished, a notification will be sent and the user\u0026rsquo;s shell script will run (optional) e.g. lock the screen, play a sound, \u0026hellip;. This is example of such a script:\n#!/bin/bash # play adhan audio AUDIO_FILE=\u0026#34;$HOME/.local/share/IslamicPrayerTimings/adhan-mansour-al-zahrani.mp3\u0026#34; mpv --no-video --loop=no --really-quiet \u0026#34;$AUDIO_FILE\u0026#34; \u0026amp; sleep 10 # lock screen (for hyprland) hyprlock Development # Dependencies:\ng++ : C++ compiler CMake : building tool for C++ nlohmann-json : to parse json files curl : to send http get request to retrieve the timings from the API libnotify : for sending notification to a notification server Notification manager: like swaync, mako, dunst or any other suitable notification server (notification daemon to receive and show notification) I\u0026rsquo;ll retrieve the timings using an aladhan API : https://api.aladhan.com/v1/timingsByCity?city=Cairo\u0026amp;country=Egypt\nTest the response using e.g. postman. I used curl to send a GET request to retrieve that response.\nThe response is in JSON format, I used nlohmann-json for parsing it.\nAI tools like ChatGPT will be very useful to help in using libcurl, nlohmann-json and std::filesystem, generally saves the time of reading documentation or showing examples.\nTo use a new thread to update the timings, a race condition may happens in case of reading the timings in the main thread before being fully written and updated by the update thread (even if this happens, it\u0026rsquo;ll be corrected 1 second after).\nBefore calculating the next prayer timing and starting the countdown, the timings must be fully fetched and updated first (the shared data) which happens in another thread, so a condition_variable will be used to ensure at the main thread that the update thread finished his work.\nFor piping to waybar, I print (dump) json format in stdout contains the text and tooltip fields that Waybar custom module will be using.\nWaybar custom module # You can see the wiki for how to add a custom module to Waybar. I want to show the next prayer timing name and a countdown timer. With tooltip on hover with the day prayer timings.\n\u0026#34;custom/prayerTimings\u0026#34;: { \u0026#34;exec\u0026#34;: \u0026#34;$HOME/.config/waybar/modules/IslamicPrayerTimings/build/IPT -d\u0026#34;, \u0026#34;format\u0026#34;: \u0026#34;🕋 {text}\u0026#34;, \u0026#34;return-type\u0026#34;: \u0026#34;json\u0026#34;, \u0026#34;tooltip\u0026#34;: true } You can find the code and installing instructions in my GitHub repo:\nabdalrahmanshaban0/Islamic-Prayer-Timings A daemon or service for notifying about Islamic prayers timings on Linux using an API from aladhan.com. Supported to be custom module for Waybar C\u0026#43;\u0026#43; 17 0 ","date":"2025-07-06","externalUrl":null,"permalink":"/islamic-prayer-timings-for-linux/","section":"Posts","summary":"For me, Knowing that 3 hours left until Fajr is more informative than knowing that it’s 2 AM now. That was the motivation to create a Linux daemon and waybar custom module for Islamic prayer timings using Aladhan API.\n","title":"Islamic Prayer Timings for Linux","type":"posts"},{"content":"","date":"2025-07-06","externalUrl":null,"permalink":"/tags/waybar/","section":"Tags","summary":"","title":"Waybar","type":"tags"},{"content":" Start with the programs # You should begin with the programs you\u0026rsquo;re willing to use, then choose the suitable hardware with your targeted OS in mind. Examples:\nThe free version of Davinci Resolve on Linux doesn\u0026rsquo;t support H264 codec unlike Windows, but supports AV1, so you need a graphic card with AV1 encoder or to buy the paid version of Davinci Resolve or to dual boot Windows. If you\u0026rsquo;ll use Blender then, you should buy some Nvidia GPU as CUDA is very supported on Blender. Blender and CUDA works very well on both Linux and Windows. Running LLMs locally, VRAM will be very important, Apple\u0026rsquo;s unified memory may be very useful. Adobe programs, Microsoft Office, Valorant, \u0026hellip; Not working on Linux but very supported on Windows. Have a program or two to run on Windows? Very simple, dual-boot.\nChoosing a Linux distribution # In my opinion easing the use of Linux makes it harder. Any problem may faces you, you\u0026rsquo;re on your own to fix it. So, at least the ability to read and write English well is a must to get started e.g. to:\nSearch online or ask AI tools like ChatGPT Read a wiki or documentation Read forums and Reddit posts Read a comprehensive guide like this The fear and difficulty of using a terminal is what makes you a beginner, and \u0026ldquo;Easy distros\u0026rdquo; is very bad in making you in no need to open a one.\nSearching, basic commands, basic vim usage, basic knowledge about Linux filesystem and the most important is\u0026hellip; getting started.\nWhy Arch Linux # I\u0026rsquo;ve had a good experience with Arch Linux + Hyprland. What I mean by good experience is whether the system fits my needs or not.\nArch Wiki is one of the most comprehensive and valuable resources for Linux users not just Arch. Rolling release Arch Linux follows a rolling release model, meaning it receives continuous updates instead of periodic major releases Bleeding-edge packages and drivers You get access to the latest versions of software, libraries, and drivers as soon as they’re released. Endless Software Availability The AUR is a community-driven repository that offers packages not included in the official Arch Linux repositories. Community You\u0026rsquo;ll find so many solved problems you may face in Arch Linux, also there\u0026rsquo;s a newbie corner that almost will cover all beginner\u0026rsquo;s questions. My reasons to use Arch Linux # Building the latest versions of open-source projects like Hyprland, Waybar and Quran-Companion to modify and tinker with the code. New packages and drivers, specially Nvidia GPU drivers. A newer GPU driver may affect the performance to make Arch Linux better than gaming distros like Nobara Linux AUR make it very easy to install latest versions of libraries, IDEs, programs. e.g. clipse-bin, google-chrome, clion, intellij, android-studio, \u0026hellip; instead of building from source or installing appimage from a website. AUR helpers like paru makes it more easier to manage and update these packages. This is a walkthrough video for this tutorial:\nInstalling Arch Linux + Hyprland # Connect to internet (WIFI) # rfkill unblock wifi iwctl device list # replace wlan0 with your device station wlan0 scan station wlan0 connect SSID archinstall # proceed with minimal profile with NetworkManager, pipewire and grub selected.\nPost fresh minimal installation # sudo without password # To run all commands without password (you still need sudo for root permission)\n# add this at the end of /etc/sudoers %wheel ALL=(ALL:ALL) NOPASSWD: ALL connect to internet: # nmtui # Activate connection Install paru (AUR helper): # mkdir .src cd .src git clone https://aur.archlinux.org/paru.git cd paru makepkg -si Configure pacman: # In /etc/pacman.conf:\nEnable multilib # Uncomment these 2 lines:\n[multilib] Include = /etc/pacman.d/mirrorlist Enable colors and change progress bar look # Under [options], add or uncomment Color and ILoveCandy\nHyprland installation # Install using the package manager # It\u0026rsquo;s the recommended way for normal users\nsudo pacman -S hyprland Manual installation # Install Hyprland dependencies: # git clone https://github.com/hyprwm/hyprland-wiki open using vim pages/Getting Started/Installation copy the dependencies of Arch Linux manual installation (y in vim) :term in vim and paste it and enjoy you don\u0026rsquo;t have to write them one by one :\u0026lsquo;D\nBuild and install Hyprland # git clone --recursive https://github.com/hyprwm/hyprland cd Hyprland make all \u0026amp;\u0026amp; sudo make install Install kitty, the default terminal for Hyprland and give a look to the default keybindings, just the necessary ones until you apply your configuration.\nsudo pacman -S kitty NVIDIA GPUs # Very important references:\nNvidia GPU - Arch Wiki Nvidia GPU - Hyprland Wiki Multi-GPU - Hyprland Wiki sudo pacman -S nvidia-open-dkms nvidia-utils lib32-nvidia-utils libva-nvidia-driver Create this file /etc/modprobe.d/nvidia.conf:\noptions nvidia_drm modeset=1 Edit this file /etc/mkinitcpio.conf:\nMODULES=(nvidia nvidia_modeset nvidia_uvm nvidia_drm) Add this environment variables to hyprland config:\nenv = LIBVA_DRIVER_NAME,nvidia env = __GLX_VENDOR_LIBIRARY_NAME,nvidia env = NVD_BACKEND,direct env = ELECTRON_OZONE_PLATFORM_HINT,auto Display manager and Hyprland session # The recommended way to start Hyprland is using uwsm in systemd distros (or just write Hyprland after login in tty). Also you can use SDDM with some fancy theme.\nUsing uwsm (Universal Wayland Session Manager) # uwsm - Arch Wiki\nsudo pacman -S uwsm vim To launch Hyprland directly after tty login : paste this in your shell profile (mostly ~/.bashrc)\nif uwsm check may-start; then exec uwsm start hyprland.desktop fi Using SDDM # SDDM - Arch Wiki\nsudo pacman -S sddm sudo systemctl enable sddm Install or make your dots # I already have configs for my workflow on Hyprland on a GitHub repo. You can also clone them and edit to fit yours. https://github.com/abdalrahmanshaban0/Arch-Dots\nInstall all your favorite programs from a script # You may install some programs or dependencies on demand or don\u0026rsquo;t remember to write then in a single script for installation, a tip for that is to open ~/.bash_history and search for every -S and collect these packages in a script. But first, you must know and choose what these programs are.\nPrograms # Displays settings # To configure your monitors in hyperland easily via GUI without manually editing the hypr config you can use nwg-displays\nsudo pacman -S nwg-displays Fonts # sudo pacman -S noto-fonts noto-fonts-emoji ttf-liberation ttf-jetbrains-mono ttf-hack-nerd ttf-dejavu noto-fonts-cjk Text editor # paru -S neovim gvim Bash prompt # pacman -S starship # add this to the end of ~/.bashrc eval \u0026#34;$(starship init bash)\u0026#34; Application launcher # sudo pacman -S wofi # open it using: pidof wofi || wofi --show drun Wallpapers # paru -S swww waypaper Network manager and Bluetooth # paru -S network-manager-applet bluez bluez-utils bluez-obex blueman sudo systemctl enable bluetooth.service Firewall # sudo pacman -S ufw sudo ufw enable sudo systemctl enable ufw.service File manager and archiving # sudo pacman -S thunar gvfs gvfs-mtp ntfs-3g thunar-volman ffmpegthumbnailer tumbler man-db lsd bzip2 gzip p7zip unrar zip unzip Terminal # sudo pacman -S alacritty Clipboard # paru -S wl-clipboard wl-clip-persist clipse-bin In ~/.conf/hypr/hyprland.conf\nexec-once = clipse -listen windowrulev2 = float, class:(clipse) windowrulev2 = size 622 652, class:(clipse) windowrulev2 = stayfocused, class:(clipse) bind = $mainMod SHIFT, V, exec, alacritty --class clipse -e clipse Audio # paru -S pipewire pipewire-pulse pipewire-alsa wireplumber pavucontrol Authentication for GUI apps # Hyprland wiki\nsudo pacman -S hyprpolkitagent # exec-once = systemctl --user start hyprpolkitagent Optional (just to be cool) # paru -S cava fastfetch cmatrix # A dock if you want paru -S nwg-dock-hyprland Notification manager # sudo pacman -S swaync Screenshots # paru -S grimblast # example grimblast copysave area Web browser # paru -S brave-bin google-chrome firefox # for English spell checking support \u0026amp; Text-to-Speech sudo pacman -S hunspell-en_US speech-dispatcher uBlock Origin filter list to hide YouTube Shorts for firefox here\nChromium-based browsers flags for Wayland (google-chrome, brave, \u0026hellip;): PDF viewer # paru -S evince xournalpp GTK settings (themes) # paru -S nwg-look papirus-icon-theme # I use Catppuccin Mocha GTK Theme # Download it from https://www.gnome-look.org/p/1996672 # unzip it and copy it to /usr/share/themes media player # paru -S mpv playerctl poweroff, reboot, logout, lock # paru -S wlogout hyprlock Note taking # paru -S obsidian Brightness control # paru -S brightnessctl git commands UI # paru -S lazygit System monitoring # paru -S btop Image viewer and editor tool # paru -S swappy satty Printing # paru -S cups cups-pdf ghostscript gsfonts gutenprint system-config-printer sudo systemctl enable cups Status bar (Waybar) # sudo pacman -S waybar My Islamic prayer timings daemon and custom-module for Waybar.\nNice icons:\nparu -S ttf-font-awesome ttf-bootstrap-icons ttf-nerd-fonts-symbols Fid your icons:\nBootstrap Nerd Fonts Awesome Fonts Photo editing # paru -S gimp # mostly I use online AI tools Wine (Run windows programs) # enable multilib in /etc/pacman.conf\nsudo pacman -Syyu wine wine-mono wine-gecko winetricks Quran # paru -S quran-companion Screen sharing # paru -S obs-studio xdg-desktop-portal-hyprland Video editing # Kdenlive sucks and Davinci Resolve on Linux doesn\u0026rsquo;t support H.264 codec (the paid version does, also you can transcode all of your project videos for some hours and torture your hardware). The best solution for me is using a GPU that supports AV1 video encoder. For audio, the ACC is not supported, so I use PCM 24-bit, For further information about Supported Condecs\nI\u0026rsquo;m currently using an AMD CPU that contains an integrated graphics that has AV1 encoder and Nvidia RTX4060 that also has AV1 encoder (I use the 4060 of course). This is my OBS studio settings: Installing Davinci Resolve # After installing the program from the official website:\n# necessary packages sudo pacman -S libxcrypt libxcrypt-compat pango # run the application with this command: LD_PRELOAD=\u0026#34;/usr/lib/libgio-2.0.so /usr/lib/libgmodule-2.0.so /usr/lib/libglib-2.0.so\u0026#34; /opt/resolve/bin/resolve # Note: you can edit the exec in the application launcher of davinci resolve at /usr/share/applications/com.blackmagicdesign.resolve.desktop Exec=env LD_PRELOAD=\u0026#34;/usr/lib/libgio-2.0.so /usr/lib/libgmodule-2.0.so /usr/lib/libglib-2.0.so\u0026#34; /opt/resolve/bin/resolve %u AMD GPU # You need to download packages to support OpenCl to make Davinci Resolve work:\nsudo pacman -S rocm-opencl-runtime opencl-rusticl-mesa Note: Maybe you\u0026rsquo;ll need to download packgaes for ROCm of AMD if Davinci Resolve supports it.\nNvidia GPU # # If needed only (No GPU problem) sudo pacman -S cuda Digital Camera as webcam # First make sure that your cam in Supported Cameras. Also you need to see the ArchWiki for more details.\nsudo pacman -S v4l2loopback-dkms v4l2loopback-utils v4l-utils gphoto2 gvfs-gphoto2 First, connect your camera by usb to your computer. Runs this command and make sure you see your camera name gphoto2 --auto-detect. Show connected devices: v4l2-ctl --list-devices. You may find /dev/video0 , in a laptop you may find 2 devices.\nLoading v4l2loopback kernel module:\n# Edit /etc/mkinitcpio.conf MODULES=(... v4l2loopback ...) # create /etc/modprobe.d/webcam.conf options v4l2loopback card_label=Video-Loopback exclusive_caps=1 This is my aliases for some controls of my DSLR (Canon 2000d).\nalias dslrcam=\u0026#34;gphoto2 --stdout --capture-movie | ffmpeg -i - -vcodec rawvideo -pix_fmt yuv420p -threads 0 -f v4l2 /dev/video0\u0026#34; alias dslrphoto=\u0026#34;gphoto2 --capture-image-and-download\u0026#34; To preview your webcam in just a window:\nffplay /dev/video0 In OBS studio, add video capture device, this is my settings: In my case, I don\u0026rsquo;t have a capture card, I connect the camera using usb, so the resolution I have is 1024x576 so I add a filer for upscaling to 1920x1080: I recommend using capture card if your camera has clean HDMI output, if not you may try to crop the portion of the video the focus square appears in.\nGaming # sudo pacman --needed -S lutris mangohud gamemode libxnvctrl goverlay vulkan-tools vulkan-icd-loader lib32-vulkan-icd-loader freetype2 lib32-freetype2 Torrent client # sudo pacman -S qbittorrent Password manager # sudo pacman -S keepassxc Dual Boot # I\u0026rsquo;m dual booting on 2 different drives and choose which one to boot in using Grub. This is the easier way, the order of installing linux or windows doesn\u0026rsquo;t matter.\nIf you want to dual boot on the same drive, Install Linux first with manual partitioning and let a free (unallocated) space at the end for Windows. like this: To make Grub supports that :\nparu -S os-prober Edit /etc/default/grub to uncomment the line (maybe last line) :\nGRUB_DISABLE_OS_PROBER=false You can add a Grub theme (install one from gnome-look). The theme dir usually contains install.sh that you can run as root to install the theme.\nFor manual way, copy the theme dir (that contains theme.txt) to either /usr/share/grub/themes or /boot/grub/themes. Then edit this line in /etc/default/grub with the theme.txt path like this:\nGRUB_THEME=\u0026#34;/boot/grub/themes/Xenlism-Arch/theme.txt\u0026#34; update grub (generating grub.cfg)\nsudo grub-mkconfig -o /boot/grub/grub.cfg See also:\nMake your Linux terminal look cool ","date":"2025-06-24","externalUrl":null,"permalink":"/arch-linux-guide/","section":"Posts","summary":"Start with the programs # You should begin with the programs you’re willing to use, then choose the suitable hardware with your targeted OS in mind. Examples:\n","title":"Arch Linux with Hyprland | Comprehensive guide","type":"posts"},{"content":"","date":"2025-06-24","externalUrl":null,"permalink":"/tags/hyprland/","section":"Tags","summary":"","title":"Hyprland","type":"tags"},{"content":"Have a question, suggestion, or just want to say hi? Feel free to reach out!\n📬 Email # You can email me directly at:\nabdalrahman@sudostart.com\n💬 Comments \u0026amp; Discussions # If your message relates to a blog post, feel free to leave a comment directly under that article (via GitHub-powered Utterances).\n🔐 Privacy Note # We respect your privacy. Emails are kept confidential and used solely to respond to your inquiry. For more information, read our Privacy Policy.\n","externalUrl":null,"permalink":"/contact/","section":"SudoStart","summary":"Have a question, suggestion, or just want to say hi? Feel free to reach out!\n📬 Email # You can email me directly at:\n","title":"Contact","type":"page"}]