diff --git a/frontend/src/app/blog/archlinux-my_sanctum_sanctorum/content.md b/frontend/src/app/blog/archlinux-my_sanctum_sanctorum/content.md
new file mode 100644
index 0000000..aa4fe5b
--- /dev/null
+++ b/frontend/src/app/blog/archlinux-my_sanctum_sanctorum/content.md
@@ -0,0 +1,1061 @@
+
+# Archlinux - My Sanctum Sanctorum
+
+
+
+This guide is the only guide you'll ever need (lol) to set up your **Archlinux** system from ground up. Follow this only when you have gained familiarity to the **Linux** ecosystem using **Ubuntu** or any other OS. Preferable don't skip directly from **Windows** to **Arch**. You might wanna give **Manjaro** a try if you're coming from Windows, and are really keen on doing things the **Arch** way, since it's based on **Arch**, however has a GUI to help you out with most of the stuff. Well if you have time to kill and the internet at your disposal then you may begin your journey into the wonderful and awesome world of **Arch Linux**!
+
+## Requirements:
+
+- Internet
+- An old/new PC or laptop (I use Arch as my daily driver)
+- Patience
+- Patience
+- Patience
+
+Make sure you have at least **a few hours** of spare time.
+
+## Create a bootable USB for Archlinux
+
+On a Linux machine, connect the USB, and figure out the name of your USB
+using
+
+```bash
+lsblk
+```
+
+Run the following command, replacing **{x}** with your drive, e.g. **/dev/sdb**,
+if {x} = b. (**Do not append a partition number**, so do not use something
+like **/dev/sdb1**)
+
+```bash
+dd bs=4M if={path_to_archlinux.iso} of=/dev/sd{x} status=progress oflag=sync
+```
+
+## Installation
+
+- Boot into BIOS and **disable Secure Boot**. **UEFI is ON** but Secure Boot
+ is disabled. If you're not able to access the Secure Boot settings,
+ set a Supervisor Password in BIOS and then try again.
+- If you have a wired internet connection, plug-in the ethernet cable
+ before booting the PC.
+- Verify the Boot mode and ensure its UEFI. Do this by executing the
+ command below and verifying the directory exists
+
+ ```bash
+ ls /sys/firmware/efi/efivars
+ ```
+
+- Check the internet connection. Remember internet connection is
+ mandatory.
+
+ ```bash
+ ping -c3 google.com
+ ```
+
+- If connected, skip to the next step. Check the output of `ip link`
+ command. It should show a list of network interfaces to connect to.
+ The interfaces starting with 'w' are usually the ones dealing with
+ WiFi, and those starting with 'e' deal with the ethernet
+ connection.
+
+ ```bash
+ ip link
+ ```
+
+ If you have a wired ethernet cable, follow these steps, else, skip
+ to the WiFi section. Connect your LAN cable and execute this
+
+ ```bash
+ systemctl start dhcpcd@{ethernet_interface_name}.service
+ ```
+
+ Try pinging again. You should be connected to the internet now.
+
+#### Connection to WiFi:
+
+ - Find/Confirm your WiFi interface
+
+ ```bash
+ iw dev
+ ```
+
+ - Activate it using the {wifi~interfacename~}
+
+ ```bash
+ ip link set {wifi_interface_name} up
+ ```
+
+ - Check if there's 'UP' in between '\<' and '\>'.
+ {wifi~interfacename~} will be referred to as {interface}
+ henceforth
+
+ ```bash
+ ip link
+ ```
+
+ - Scan for WiFi
+
+ ```bash
+ iw dev {interface} scan | less
+ ```
+
+ If you're using it in adhoc mode (a mode in which there is no
+ central controller), you'll have to mention it, using this
+ command. If you're trying to connect to a WiFi router, it's
+ NOT adhoc mode, and you DON'T need to execute this command,
+ since the WiFi router acts as a central controller.
+
+ ```bash
+ ip link set {interface} down
+ iw dev {interface} set type ibss
+ ip link set {interface} up
+ ```
+
+ - Make a note of your
+ - SSID (name of your network)
+ - Security
+ - Encryption
+ - If there is no encryption on your WiFi, use
+
+ ```bash
+ iw dev {interface} connect "{your_ESSID}"
+ ```
+
+ - If there is encryption of type WEP
+ - using a hexadecimal or ASCII key (the format is
+ distinguished automatically, because a WEP key has a
+ fixed length):
+
+ ```bash
+ iw dev {interface} connect "{your_ESSID}" key 0:{your_key}
+ ```
+
+ - using a hexadecimal or ASCII key, specifying the
+ third set up key as default (keys are counted from
+ zero, four are possible):
+
+ ```bash
+ iw dev interface connect "{your_ESSID}" key d:2:{your_key}
+ ```
+
+ - If it's WPA or WPA2
+ - A passphrase is generated using
+
+ ```bash
+ wpa_passphrase {your_SSID} {passphrase}
+ ```
+
+ - Connect to the network using
+
+ ```bash
+ wpa_supplicant -B -i {interface} -c <(wpa_passphrase {MYSSID} {passphrase})
+ ```
+
+ - Get an IP address allocated to your PC using dhcp
+
+ ```bash
+ dhcpcd {interface}
+ ```
+
+ - Check if the interface is connected to the WiFi using
+
+ ```bash
+ iw dev {interface} link
+ ```
+
+ - Check the amount of bytes transmitted and received using
+
+ ```bash
+ iw dev {interface} station dump
+ ```
+
+ For more details visit [this page](https://wiki.archlinux.org/index.php/Wireless_network_configuration)
+
+- You can also SSH into this system if you want to execute commands
+ remotely for ease of use:
+
+ ```bash
+ systemctl start sshd
+ ```
+
+ Now find the IP of this system using
+
+ ```bash
+ ip addr
+ ```
+
+ And to connect to this system remotely, execute this on the PC you
+ want to connect to it form
+
+ ```bash
+ ssh {ip_addredd} -l root
+ ```
+
+- Set date
+
+ ```bash
+ timedatectl set-ntp true
+ ```
+
+- Partitioning the disk
+ - Check the contents of the disk
+
+ ```bash
+ lsblk
+ ```
+
+ - Make sure none of the partitions you want to make are mounted by
+ checking the MOUNTPOINT using
+
+ ```bash
+ lsblk -f
+ ```
+
+ In case they are mounted, use
+
+ ```bash
+ umount /dev/sd{device_letter}{partition_number}
+ ```
+
+ Do this for all the mounted partitions
+ - Making partitions
+
+ ```bash
+ gdisk /dev/sd{device_letter}
+ ```
+
+ - Delete everything and create a new partition table
+
+ ```bash
+ o
+ ```
+
+ - Create a new EFI partition
+
+ ```bash
+ n
+ ```
+
+ - Partition number (1-128, default 1):
+
+ ```bash
+ # press RETURN for default
+ ```
+
+ - First Sector (34-976773134, default=2048) or
+ {+-}size{KMGPT}:
+
+ ```bash
+ # press RETURN for default
+ ```
+
+ - Last Sector (2048-976773134, default=976773134) or
+ {+-}size{KMGPT}:
+
+ ```bash
+ +512M
+ ```
+
+ - Current type is 'Linux filesystem' HEX code or GUID (L
+ to show codes, Enter = 8300):
+
+ ```bash
+ EF00
+ ```
+
+ This makes it an EFI partition
+
+ - Create a new SWAP partition
+
+ ```bash
+ n
+ ```
+
+ - Partition number (2-128, default 2):
+
+ ```bash
+ # press RETURN for default
+ ```
+
+ - First Sector (34-976773134, default=1050624) or
+ {+-}size{KMGPT}:
+
+ ```bash
+ # press RETURN for default
+ ```
+
+ - Last Sector (1050624-976773134, default=976773134) or
+ {+-}size{KMGPT}:
+
+ ```bash
+ +20G
+ ```
+
+ - Current type is 'Linux filesystem' HEX code or GUID (L
+ to show codes, Enter = 8300):
+
+ ```bash
+ 8200
+ ```
+
+ This makes it a SWAP partition
+
+ - Create a new root partition
+
+ ```bash
+ n
+ ```
+
+ - Partition number (3-128, default 3):
+
+ ```bash
+ # press RETURN for default
+ ```
+
+ - First Sector (34-976773134, default=42993664) or
+ {+-}size{KMGPT}:
+
+ ```bash
+ # press RETURN for default
+ ```
+
+ - Last Sector (42993664-976773134, default=976773134) or
+ {+-}size{KMGPT}:
+
+ ```bash
+ +80G
+ ```
+
+ - Current type is 'Linux filesystem' HEX code or GUID (L
+ to show codes, Enter = 8300):
+
+ ```bash
+ 8304
+ ```
+
+ This makes it a root partition
+
+ - Create a new home partition
+
+ ```bash
+ n
+ ```
+
+ - Partition number (3-128, default 3):
+
+ ```bash
+ # press RETURN for default
+ ```
+
+ - First Sector (34-976773134, default=210765824) or
+ {+-}size{KMGPT}:
+
+ ```bash
+ # press RETURN for default
+ ```
+
+ - Last Sector (210765824-976773134, default=976773134) or
+ {+-}size{KMGPT}:
+
+ ```bash
+ # press RETURN for default, to select the remainder of the disk
+ ```
+
+ - Current type is 'Linux filesystem' HEX code or GUID (L
+ to show codes, Enter = 8300):
+
+ ```bash
+ 8300
+ ```
+
+ This makes it a home partition
+
+ Now write these changes to the disk
+
+ ```bash
+ w
+ ```
+
+ And proceed with a yes (`Y`) Now check if the partitions were
+ made according to your liking
+
+ ```bash
+ lsblk
+ ```
+
+ - Formatting partitions
+
+ ```bash
+ mkfs.fat -F32 /dev/sda1 # format EFI partition as FAT32
+
+ mkswap /dev/sda2 # format SWAP partition as SWAP
+ swapon /dev/sda2
+
+ mkfs.ext4 /dev/sda3 # format root partition as EXT4
+
+ mkfs.ext4 /dev/sda4 # format home partition as EXT4
+ ```
+
+- Mounting the file system. Same procedure to be followed for
+ debugging Archlinux
+
+ ```bash
+ mount /dev/sda3 /mnt # mount root
+
+ mkdir -p /mnt/boot # create boot directory in mount
+ mount /dev/sda1 /mnt/boot # mount boot directory
+
+ mkdir -p /mnt/home # create boot directory in mount
+ mount /dev/sda4 /mnt/home # mount boot directory
+ ```
+
+- Install Archlinux
+
+ ```bash
+ pacstrap /mnt base base-devel
+ ```
+
+- Generate an fstab file. The fstab file can be used to define how
+ disk partitions, various other block devices, or remote filesystems
+ should be mounted into the filesystem.
+
+ ```bash
+ genfstab -U /mnt >> /mnt/etc/fstab
+ ```
+
+ Check the resulting file in /mnt/etc/fstab afterwards, and edit it
+ in case of errors.
+
+- Change root into the new system. Chroot is an operation that changes
+ the apparent root directory for the current running process and
+ their children. Changing root is commonly done for performing system
+ maintenance on systems where booting and/or logging in is no longer
+ possible.
+
+ ```bash
+ arch-chroot /mnt
+ ```
+
+- Set the timezone
+
+ ```bash
+ ln -sf /usr/share/zoneinfo/{Region}/{City} /etc/localtime # Asia/Kolkata
+ ```
+
+- Run hwclock to generate /etc/adjtime:
+
+ ```bash
+ hwclock --systohc
+ ```
+
+- Uncomment `en_US.UTF-8 UTF-8` and other needed localizations in
+ /etc/locale.gen, and generate them with
+
+ ```bash
+ locale-gen
+ ```
+
+- Set the LANG variable in /etc/locale.conf accordingly, for example:
+
+ ```
+ LANG=en_US.UTF-8
+ LC_CTYPE=en_US.UTF-8
+ LC_MESSAGES=en_US.UTF-8
+ LC_ALL=en_US.UTF-8
+ LANGUAGE="en_US.UTF-8"
+ ```
+
+- Change the keyboard layout, by the /etc/vconsole.conf file. It is US
+ English by default
+
+ ```
+ KEYMAP=us
+ ```
+
+- Create hostname by editing /etc/hostname
+
+ ```
+ {my_host_name}
+ ```
+
+- Add this to /etc/hosts, if it doesn't exist
+
+ ```text
+ 127.0.0.1 localhost.localdomain localhost
+ ::1 localhost.localdomain localhost
+ 127.0.1.1 {my_host_name}.localdomain {my_host_name}
+ ```
+
+- Creating a new initramfs is usually not required, because mkinitcpio
+ was run on installation of the linux package with pacstrap. But run
+ it anyways
+
+ ```bash
+ mkinitcpio -p linux
+ ```
+
+- Set the root password using
+
+ ```bash
+ passwd
+ ```
+
+- Install intel-ucode. It provides microcode updates for Intel CPUs
+
+ ```bash
+ pacman -S intel-ucode
+ ```
+
+- To use SystemD as the bootloader follow these steps. Alternatively
+ you may use GRUB, skip this section to use GRUB
+ - Installing the bootloader systemd-boot
+
+ ```bash
+ bootctl install
+ bootctl update
+ ```
+
+ - Edit the /boot/loader/loader.conf file and remove the long text
+ and replace it with
+
+ ```
+ default arch
+ ```
+
+ - Adding boot entries. Create a file
+ `/boot/loader/entries/arch.conf`
+
+ ```bash
+ blkid -s UUID -o value /dev/sd{device_letter}{root_partition_number} > /boot/loader/entries/arch.conf
+ ```
+
+ The UUID of the root partition will be extracted and added to
+ the arch.conf file.
+
+ - Now edit the arch.conf file and add the following.
+
+ ```
+ title Arch Linux
+ linux /vmlinuz-linux # it is vmlinuz not vmlinux
+ initrd /intel-ucode.img # intel ucode thing provided you have installed it already
+ initrd /initramfs-linux.img
+ options root=UUID={UUID_of_root_partition} rw # rw at the end is important
+ ```
+
+ - For hibernation, increase the size of sys/power/image~size~, if
+ you have a large SWAP partition, and decrease if you have a
+ small one. By default it is 2/5 th the RAM size. Then make an
+ entry in arch.conf
+
+ ```bash
+ blkid -s UUID -o value /dev/sd{device_letter}{swap_partition_number} >> /boot/loader/entries/arch.conf
+ ```
+
+ This'll put the UUID of the SWAP partition at the end of the
+ arch.conf file. Now modify the last line of the conf file
+
+ ```
+ options root=UUID={UUID_of_root_partition} resume=UUID={UUID_of_swap_partition} rw
+ ```
+
+- Install packages to ease installation after boot List of packages
+ needed
+ - iproute2: for `ip` to manage networking
+ - acpi: for checking battery percentage and stuff
+ - iw: for wireless connections
+ - wpa~supplicant~: for wireless WPA protected connections
+ - git: a version control system
+ - dialog: A tool to display dialog boxes from shell scripts
+ - vim: a text editor
+ - zsh: shell
+ - curl: fetch things from internet
+ - wget: fetch things from internet
+ - aria2: the best download manager
+ - xdg-user-dirs: auto create and link \$HOME directory folders
+ like Documents, Downloads etc
+
+ ```bash
+ pacman -S iproute2 acpi iw wpa_supplicant dialog vim zsh git curl wget aria2 stow networkmanager xdg-user-dirs
+ ```
+
+- Reboot PC after unmounting the mounted partition
+
+ ```bash
+ exit
+ umount -R /mnt
+ poweroff
+ ```
+
+- Remove the installation media and start PC, and connect to internet
+
+- Optionally add your keys and turn on SSH for remote access
+
+ ```bash
+ mkdir -p ~/.ssh
+ curl -L https://github.com/{username}.keys >> ~/.ssh/authorized_keys
+ systemctl restart sshd
+ ```
+
+ You may SSH into the system now
+
+- Check battery
+
+ ```bash
+ acpi -b
+ ```
+
+- Activating zsh and using antigen
+
+ ```bash
+ chsh -s $(which zsh)
+ curl -L git.io/antigen > $HOME/antigen.zsh
+ curl -L 'https://raw.githubusercontent.com/codingCoffee/effective-enigma/master/.zshrc' > $HOME/.zshrc
+ exec zsh
+ ```
+
+- Editing the /etc/pacman.conf for the better.
+ 1. Uncomment and/or add this.
+
+ ```
+ #UseSyslog
+ #UseDelta #just mentioning, not fully supported in arch
+ Color
+ TotalDownload
+ CheckSpace
+ VerbosePkgLists
+ ILoveCandy
+ ```
+
+ 2. Skipping this step won't cause any harm Use `aria2c` as the
+ download manager instead of wget. Add the following new entry
+ just below the \"\#XferCommand = /usr/bin/curl -C - -f %u \>
+ %o\" line. The 2 caveats are you won't be able to see the
+ overall download size, but downloads will be faster, and
+ everytime you do `pacman -Syu` the database files will be
+ downloaded again.
+
+ ```
+ XferCommand = /usr/bin/aria2c --allow-overwrite=true --continue=true --file-allocation=none --log-level=error --max-tries=2 --max-connection-per-server=5 --max-file-not-found=1 --min-split-size=1M --no-conf --remote-time=true --summary-interval=0 --timeout=3 --dir=/ --out %o %u
+ ```
+
+- Create a user
+
+ ```bash
+ useradd -m -G wheel {your_username}
+ ```
+
+ Assign password to user
+
+ ```bash
+ passwd {your_username}
+ ```
+
+ Give the user sudo access by un-commenting `%wheel ALL=(ALL) ALL`
+
+ ```bash
+ visudo
+ ```
+
+ su into your user
+
+ ```bash
+ su - {your_username}
+ ```
+
+- Create the default folders using the xdg-user-dirs-update service
+
+ ```bash
+ xdg-user-dirs-update
+ ```
+
+- Now installing the main stuff
+ - plasma: KDE desktop environment and other things Select when
+ asked
+ - ibglvnd over nvidia-304xx-utils
+ - phonon-qt5-gstreamer over phonon-qt5-vlc
+ - libx264 over libx264-10bit
+ - docker
+ - firefox
+ - aria2c
+ - libreoffice-fresh
+ - dolphin
+ - dolphin-plugins
+ - zip
+ - unzip
+ - unrar
+ - vlc
+ - p7zip
+ - rsync
+ - syncthing
+ - konsole
+ - openssh
+ - git
+ - blender
+ - krita
+ - gimp
+ - inkscape
+ - scribus
+ - kwallet
+ - kwalletmanager
+ - networkmanager
+ - gst-plugins-bad: gstreamer plugins
+ - gst-plugins-ugly: gstreamer plugins
+ - gst-plugins-good: gstreamer plugins
+ - digikam: (gwenview alternative)
+ - spectacle: window management
+ - kio: Resource and network access abstraction
+ - kio-extras: extra utilities for kio
+ - ntfs-3g: NTFS filesystem driver and utilities
+ - fcron: feature rich cron implementation
+ - cups: printing daemon
+ - packagekit-qt5: installs packagekit as well (PackageKit is a
+ system designed to make installing and updating software on your
+ computer easier. The primary design goal is to unify all the
+ software graphical tools used in different distributions, and
+ use some of the latest technology like PolicyKit)
+ - print-manager
+ - gtk3: (for gtk3-print-backends)
+ - imagemagick: powerful tool to deal with images
+ - graphicsmagick: (imagemagick - bloat), however not as powerful
+ or feature rich as imagemagick, but faster in some cases
+ - mesa: an open-source implementation of the OpenGL specification
+ - clementine: music player
+ - okular: pdf reader
+ - latte-dock
+ - gparted
+ - screenfetch: to generate a cool ASCII Art based on linux distro
+ you're using
+ - bluez: bluetooth protocol stack
+ - bluez-utils: bluetoothctl utility
+ - pulseaudio-bluetooth: for interfacing bluetooth earphones
+ - thefuck: auto fix your commands
+ - linux-headers
+ - whois: reverse lookup IPs to domains
+ - noto-fonts: for normal fonts
+ - noto-fonts-cjk: for chinese, japanese and korean fonts
+ - noto-fonts-emoji: for emoji support
+ - noto-fonts-extra: for fonts
+ - arp-scan: commandline utility for scanning devices on network
+ - gtkglext: for any desk
+
+ ```bash
+ pacman -S plasma docker firefox aria2c libreoffice-fresh dolphin dolphin-plugins zip unzip unrar vlc p7zip rsync syncthing konsole openssh xdg-user-dirs git blender krita gimp inkscape scribus kwallet kwalletmanager networkmanager gst-plugins-bad gst-plugins-ugly gst-plugins-good digikam spectacle kio kio-extras ntfs-3g fcron cups packagekit-qt5 print-manager gtk3 imagemagick graphicsmagick mesa clementine okular latte-dock gparted screenfetch bluez bluez-utils pulseaudio-bluetooth thefuck linux-headers whois gtkglext
+ ```
+
+- Switch back to root using
+
+ ```bash
+ exit
+ ```
+
+- Final Steps to power up the System in GUI mode
+
+ ```bash
+ systemctl enable NetworkManager # for Network discovery
+ systemctl enable org.cups.cupsd # for printing services
+ systemctl enable sddm # for GUI
+ systemctl enable bluetooth # for bluetooth
+ systemctl enable sshd # for ssh server
+ ```
+
+ Now create the sddm config
+
+ ```bash
+ sddm --example-config > /etc/sddm.conf
+ ```
+
+ Now edit the /etc/sddm.conf file to modify the two variables
+ (Current, and CursorTheme) as shown
+
+ ```
+ [Theme]
+ Current=breeze
+ CursorTheme=breeze_cursors
+ ```
+
+- Optionally comment the root entry from /etc/fstab if you're using
+ systemd-boot as the boot manager instead of grub. (It'll make the
+ bootup a little faster :P)
+
+- Reboot your system
+
+ ```bash
+ reboot
+ ```
+
+- Install Sublime Text from its official repo Install the GPG key:
+
+ ```bash
+ curl -O https://download.sublimetext.com/sublimehq-pub.gpg && sudo pacman-key --add sublimehq-pub.gpg && sudo pacman-key --lsign-key 8A8F901A && rm sublimehq-pub.gpg
+ ```
+
+ Select the channel to use:
+
+ ```bash
+ echo -e "\n[sublime-text]\nServer = https://download.sublimetext.com/arch/stable/x86_64" | sudo tee -a /etc/pacman.conf
+ ```
+
+ Update pacman and install Sublime Text
+
+ ```bash
+ sudo pacman -Syu sublime-text
+ ```
+
+- Building packages from AUR post booting into GUI mode
+
+ ```bash
+ git clone {git_rpeo_url}
+ makepkg -sci
+ ```
+
+ -s: sync dependencies and install them if any -i: install the
+ package after building it
+
+- Packages to install from AUR
+ - google-chrome-beta
+ - spotify
+- Change terminal profile
+ - Open Konsole
+ - Settings -\> Edit Current Profile -\> Select 'Linux Colors',
+ then click on 'New'
+ - Modify the 1st and the 3rd background color to set 'Val' = 44
+ - Set Transparency to 10% and save
+
+
+### Common Commands
+
+1. To just update the database
+
+ ```bash
+ pacman -Syy
+ ```
+
+2. To update everything
+
+ ```bash
+ pacman -Syu
+ ```
+
+3. To install a package
+
+ ```bash
+ pacman -S {package_name}
+ ```
+
+4. To delete a package
+
+ ```bash
+ pacman -Rs {package_name}
+ ```
+
+5. To just search the database for a package
+
+ ```bash
+ pacman -Ss {package_name}
+ ```
+
+
+```
+DANGER!!!
+Mere mortals, this is where you stop
+DO NOT PROCEED FURTHER IF YOU DON'T KNOW WHAT YOU'RE DOING. IT CAN MESS UP YOUR SYSTEM REAL BAD
+
+Learn a little about the system and then maybe come back here after a year to lean more.
+
+YOU HAVE AN AMAZING SYSTEM UP AND RUNNING !!!
+```
+
+```
+YOU HAVE BEEN WARNED!
+```
+
+
+- NVIDIA Drivers for GTX 1060
+
+ 1. Installing nvidia optimus so that both GPUs can be used. Intel
+ GPU is used for normal display, and Nvidia GPU can be used at
+ will for machine learning and other stuff
+
+ ```bash
+ pacman -S bumblebee mesa nvidia xf86-video-intel
+ ```
+
+ 2. Add your user to the bumblebee group
+
+ ```bash
+ gpasswd -a {your_user_name} bumblebee
+ ```
+
+ 3. Enable bumblebee
+
+ ```bash
+ systemctl enable bumblebeed
+ ```
+
+ 4. Reboot
+
+ ```bash
+ reboot
+ ```
+
+ 5. Install other necessary stuff
+
+ ```bash
+ pacman -S mesa-demos nvidia-settings
+ ```
+
+ 6. If your other GPU is intel you can use `intel_gpu_top` to check
+ it's performance
+
+ ```bash
+ pacman -S intel_gpu_tools
+ ```
+
+ 7. To check the usage of your GPU
+
+ ```bash
+ nvidia-smi
+ ```
+
+ 8. In order to run anything on your GPU
+
+ ```bash
+ optirun -b none {application_name} -c :8
+ ```
+
+ 9. To install cuda and cudnn for machine learning
+
+ ```bash
+ pacman -S cuda cudnn
+ ```
+
+ 10. To ensure power saving by turning off the nvidia card when it is
+ not in use
+
+ ```bash
+ pacman -S bbswitch
+ ```
+
+ 11. Reboot
+
+ ```bash
+ reboot
+ ```
+
+- Install VirtualBox
+
+ ```bash
+ pacman -S virtualbox
+ ```
+
+ Use virtualbox-host-modules-arch over virtualbox-host-dkms To use
+ virtualbox:
+
+ ```bash
+ modprobe vboxdrv
+ ```
+
+- In order to reduce the shutdown time. Create a folder for your conf
+ file
+
+ ```bash
+ mkdir /etc/systemd/system.conf.d/
+ ```
+
+ Create a file named `timeout.conf` in the `system.conf.d` folder and
+ add the following to it
+
+ ```
+ [Manager]
+ DefaultTimeoutStartSec=15s
+ DefaultTimeoutStopSec=5s
+ ```
+
+- To get amazing customizable touchpad gestures
+ 1. Become a member of the input group
+
+ ```bash
+ gpasswd -a $USER input
+ ```
+
+ You'll have to logout and login for the gestures to workspace
+ 2. Download and install from the AUR repo
+
+ ```bash
+ git clone https://aur.archlinux.org/libinput-gestures.git
+ cd libinput-gestures
+ makepkg -sci
+ ```
+
+ 3. To activate gestures at boot
+
+ ```bash
+ libinput-gestures-setup autostart
+ ```
+
+ 4. Customize gestures The guide, and the main gestures are present
+ at `/etc/libinput-gestures.conf`. You can override these by
+ adding a file on `$HOME/.config/libinput-gestures.conf`
+
+ ```
+ # KDE: Present Windows (Current Desktop)
+ gesture swipe down 3 xdotool key ctrl+F9
+
+ # KDE: Present Windows (All Desktops)
+ gesture swipe down 4 xdotool key ctrl+F10
+
+ # KDE: Present Windows (All Desktops)
+ gesture swipe up xdotool key ctrl+F7
+
+ # KDE: Show desktop
+ gesture pinch out xdotool key ctrl+F12
+
+ # KDE: Switch one desktop to the left
+ gesture swipe right xdotool key Super+Left
+
+ # KDE: Switch one desktop to the right
+ gesture swipe left xdotool key Super+Right
+ ```
+
+ You'll have to logout and login for changes to take effect
+
+- To install Redshift
+
+ ```bash
+ pacman -S python-gobject python-xdg librsvg redshift
+ ```
+
+ Create a redshift config file in \~/.config/redshift.conf
+
+ ```
+ TODO
+ ```
+
+- \[Don't use, causes bluetooth problems\] To install power
+ management
+
+ ```bash
+ pacman -S tlp
+ ```
+
+ TO activate it run these commands
+
+ ```bash
+ systemctl enable tlp.service
+ systemctl enable tlp-sleep.service
+ systemctl mask systemd-rfkill.service
+ systemctl mask systemd-rfkill.socket
+ ```
+
+ Add the following to your \~/.profile file, where \"01:00.0\" is the
+ address of your GPU. You can get this using lspci
+
+ ```bash
+ export RUNTIME_PM_BLACKLIST="01:00.0"
+ ```
+
+- Set all fonts to noto Goto Settings -\> Fonts -\> Except for \"Fixed
+ Width\" which should be \"Noto Mono\", everything else should be
+ \"Noto Sana UI\" Also in Chrome do the same settings
+
diff --git a/frontend/src/app/blog/archlinux-my_sanctum_sanctorum/page.tsx b/frontend/src/app/blog/archlinux-my_sanctum_sanctorum/page.tsx
new file mode 100644
index 0000000..0cac8dc
--- /dev/null
+++ b/frontend/src/app/blog/archlinux-my_sanctum_sanctorum/page.tsx
@@ -0,0 +1,14 @@
+import MarkdownBlogComponent from "@/components/MarkdownBlogComponent";
+import path from "path";
+import { fileURLToPath } from "url";
+
+export default async function BlogPage() {
+ return (
+
+ );
+}
diff --git a/frontend/src/app/blog/cowin-exploring_the_API/content.md b/frontend/src/app/blog/cowin-exploring_the_API/content.md
new file mode 100644
index 0000000..dff29f4
--- /dev/null
+++ b/frontend/src/app/blog/cowin-exploring_the_API/content.md
@@ -0,0 +1,81 @@
+
+# CoWIN - Exploring the API 💉
+
+
+
+> Just to be fair this has not been tested. This is **not** the way I booked my slot for the vaccination.
+
+**TL;DR**: You can probably automate vaccination slot booking
+
+It is common knowledge that CoWIN has opened up its APIs. You can find more details about version 2 of their APIs on the [API Setu website](https://apisetu.gov.in/public/marketplace/api/cowin/cowin-protected-v2) (I'm yet to meet someone who gets their APIs right in v1 😛).
+
+Most of the writeups which I found online were of people using the API for notifying them of new slots opening up. Some have already created notification services around it like [getjab](https://getjab.in/) and [VaccinateMe](https://www.vaccinateme.in) along with a few Telegram groups popping up to serve the same purpose. Even PayTM has launched a Vaccine Slot Finder tool.
+
+But all these tools were missing a critical component, which was to actually book the slot. Due to shortage of vaccine availability these slots get filled up before anyone has time to react to the notifications. I wanted to go 1 step further and automate the booking process on availability of the slot.
+
+The APIs are divided into 2 parts [Public APIs](https://apisetu.gov.in/public/marketplace/api/cowin) and [Protected APIs](https://apisetu.gov.in/public/marketplace/api/cowin/cowin-protected-v2). The most important are the **Appointment Availability APIs** which are essentially what are used for the notifications feature. They have both a public and a private endpoint. The public endpoint does not need any form of auth, however it may return relatively older data (upto 30 mins old) due to returning from cache. The private endpoint requires auth (although I've hit it numerous times without auth, and it has returned the available slots successfully).
+
+But for booking a slot using [/v2/appointment/schedule](https://apisetu.gov.in/public/marketplace/api/cowin/cowin-protected-v2#/Vaccination%20Appointment%20APIs/schedule) I believe auth is critical.
+
+A POST request needs to be made to the above mentioned endpoint, with the following data
+
+```python
+data = {
+ "center_id": center_id,
+ "session_id": session_id,
+ "beneficiaries": [beneficiary],
+ "slot": slot,
+ "dose": 1
+}
+```
+
+The **center_id**, **session_id** and **slot** parameters are obtained from the response of the Appointment Availability APIs.
+The **dose** parameter is either **1** or **2** based on which vaccination shot you're going in for.
+And the **beneficiary** is obtained from decoding your JWT Access Token.
+
+While testing this out I faced numerous **403 Forbidden** responses, reasons for which I've mentioned at the end of the post. A **403** potentially indicates a ban, and given I didn't have enough data to infer the cause of the ban, I chose to spoof the headers on my request, so as to make it appear to be coming from a browser. You can find the headers used in my request below.
+
+```python
+headers = {
+ 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:87.0) Gecko/20100101 Firefox/87.0',
+ 'Accept': 'application/json, text/plain, */*',
+ 'Accept-Language': 'en-US,en;q=0.5',
+ 'Origin': 'https://selfregistration.cowin.gov.in',
+ 'Authorization': f'Bearer {access_token}',
+ 'DNT': '1',
+ 'Connection': 'keep-alive',
+ 'Referer': 'https://selfregistration.cowin.gov.in/',
+ 'Sec-GPC': '1',
+ 'TE': 'Trailers',
+}
+```
+
+The **access_token** mentioned above is used for the authentication of your request. You may read more about the same at [jwt.io](https://jwt.io/). They also have an in browser JWT Token decoder on their homepage. To get your personal JWT access token you'll have to login to the [self registration cowin portal](https://selfregistration.cowin.gov.in/) (use a PC). Once logged in, check the Session Storage of your Browser (told you to use a PC) and your JWT Access Token will pe present in the **userToken** variable. You may use decode this on [jwt.io](https://jwt.io) to fetch more details.
+
+```json
+{
+ "user_name": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
+ "user_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
+ "user_type": "BENEFICIARY",
+ "mobile_number": xxxxxxxxxx,
+ "beneficiary_reference_id": xxxxxxxxxxxxxx,
+ "ua": "Mozilla/5.0 (X11; Linux x86_64; rv:87.0) Gecko/20100101 Firefox/87.0",
+ "date_modified": "2021-05-05T14:32:15.194Z",
+ "iat": xxxxxxxxxx,
+ "exp": xxxxxxxxxx
+}
+```
+
+For obvious reasons I've censored out the sensitive information. You may use this decoded JSON to get your beneficiary ID since it is a required data argument in the POST request. And the entire encoded userToken can be used as is, in the headers for auth.
+
+I've a added a simple python script to automate the entire process from finding a slot to booking a appointment in a [GitHub Gist](https://gist.github.com/codingCoffee/9ef47b80054291a1e236607339efc388). The code certainly could use a lot of cleanup. It is just intended to be a proof of concept. Feel free to use / modify it as required.
+
+Personal Observations and Speculative Notes
+---
+
+- Frequetly hitting the API will get you banned. I'm not sure if this is purely an IP level ban or a ban on unauthenticated requests from your IP. I've had a server IP of mine banned. Even authenticated requests are getting 403 responses. This could also be a location (country) based ban.
+- User tokens are valid for around 30 mins. After that you may need to login again via OTP and update your access token in the script.
+- The CoWIN API website claims that one can make upto 100 requests in 5 minutes. However I believe the threshod is much lower than this. Maybe something like 10 requests per min. Again, more data is needed to infer this. I din't want to risk banning my Home IP, and didn't experiment further.
+- The Vaccination Appointment APIs accessible via the GET HTTP method can be used just the same with or without auth. I'm not sure if this is intended since the data is anyways accessible openly or just a misconfiguration. The POST methods however require auth, else they return a **401 Unauthorized**.
+- Using all the headers mentioned is obviouly not necessary. But I have faced **403**'s for not having spoofed atleast the "User-Agent" header. I presume this is checked at the backend to verify the request is coming in from a browser and not something like python requests library or curl. Since they would use their own headers.
+
diff --git a/frontend/src/app/blog/cowin-exploring_the_API/page.tsx b/frontend/src/app/blog/cowin-exploring_the_API/page.tsx
new file mode 100644
index 0000000..0cac8dc
--- /dev/null
+++ b/frontend/src/app/blog/cowin-exploring_the_API/page.tsx
@@ -0,0 +1,14 @@
+import MarkdownBlogComponent from "@/components/MarkdownBlogComponent";
+import path from "path";
+import { fileURLToPath } from "url";
+
+export default async function BlogPage() {
+ return (
+
+ );
+}
diff --git a/frontend/src/app/blog/docker_primer/content.md b/frontend/src/app/blog/docker_primer/content.md
index d3910ba..b09ad51 100644
--- a/frontend/src/app/blog/docker_primer/content.md
+++ b/frontend/src/app/blog/docker_primer/content.md
@@ -1,10 +1,7 @@
----
-title: Docker Primer
-date: 2018-02-13T13:56:12-05:00
-tags: ["docker", "containers"]
-type: Docker
-summary: Docker basics to get you started
----
+
+# Docker Primer
+
+
When we think of virtualization today, we may think of Virtual Box, which abstracts away the system processes, and lets you run a completely system from another. Think of Docker as Virtual Box, but extremely lightweight (in terms of resource consumption). Obviously I'm over simplifying the explanation a little, and a whole of things are getting lost in simplification. But for now, this will do.
diff --git a/frontend/src/app/blog/docker_primer/page.tsx b/frontend/src/app/blog/docker_primer/page.tsx
index 17b62f3..0cac8dc 100644
--- a/frontend/src/app/blog/docker_primer/page.tsx
+++ b/frontend/src/app/blog/docker_primer/page.tsx
@@ -1,24 +1,14 @@
-import MarkdownRenderer from "@/components/MarkdownRenderer";
-
-import { promises as fs } from "fs";
+import MarkdownBlogComponent from "@/components/MarkdownBlogComponent";
+import path from "path";
+import { fileURLToPath } from "url";
export default async function BlogPage() {
- try {
- // Read markdown file from project root
- const filePath = "src/app/blog/docker_primer/content.md";
- const markdownContent = await fs.readFile(filePath, "utf8");
-
- return (
-
-
;
- }
+ return (
+
+ );
}
diff --git a/frontend/src/app/blog/firewall_init/content.md b/frontend/src/app/blog/firewall_init/content.md
new file mode 100644
index 0000000..b4862b8
--- /dev/null
+++ b/frontend/src/app/blog/firewall_init/content.md
@@ -0,0 +1,75 @@
+
+# Firewall init
+
+
+
+Firewall is used to keep a check on the incoming and outgoing connections.
+
+We shall be using `ufw` (**Uncomplicated Firewall**) to close unwanted incoming connections from the Internet and allow outgoing ones.
+
+It's preferable to not use Scaleway servers, as something or the other used to get messed up on those. Digital Ocean and Vultr seem to do just fine.
+
+Make sure this is the first thing you do when setting up a server. This is to ensure, there is no data loss or time loss if anything goes wrong. There is a major chance of losing complete access to the server in case you don't configure something properly. So make sure to backup your data locally or on another server to prevent any data loss.
+
+- Install `ufw`
+
+```sh
+apt install ufw
+```
+
+
+- Edit `/etc/default/ufw` and modify all the three lines as shown below
+
+```
+DEFAULT_INPUT_POLICY="ACCEPT"
+DEFAULT_INPUT_POLICY="ACCEPT"
+DEFAULT_INPUT_POLICY="ACCEPT"
+```
+
+- Append a drop-all rule to the INPUT chain: Edit `/etc/ufw/after.rules`, add this line just before the final `COMMIT` line:
+
+```
+-A ufw-reject-input -j DROP
+```
+
+- Disable `ufw` logging (this seems to cause issues with Scaleway's default kernel):
+
+```sh
+ufw logging off
+```
+
+That's it, `ufw` is up and running, and NBD shouldn't cause issues.
+
+- This is also necessary since there seems to be some permissions issue with the following folders
+
+```sh
+chmod 751 /etc/default
+chmod 751 /etc
+chmod 751 /usr
+```
+
+- Setup a basic configuration to allow SSH, HTTPS and HTTP incoming
+
+```sh
+ufw default deny incoming
+ufw default allow outgoing
+ufw allow ssh
+ufw allow 80/tcp
+ufw allow 443/tcp
+ufw enable
+```
+
+In a new terminal window check that you can still access your host via ssh.
+
+- You can check the configuration at any time with:
+
+```sh
+ufw status verbose
+```
+
+- You can disable the `ufw` configuration at any time with:
+
+```sh
+sudo ufw disable
+```
+
diff --git a/frontend/src/app/blog/firewall_init/page.tsx b/frontend/src/app/blog/firewall_init/page.tsx
new file mode 100644
index 0000000..0cac8dc
--- /dev/null
+++ b/frontend/src/app/blog/firewall_init/page.tsx
@@ -0,0 +1,14 @@
+import MarkdownBlogComponent from "@/components/MarkdownBlogComponent";
+import path from "path";
+import { fileURLToPath } from "url";
+
+export default async function BlogPage() {
+ return (
+
+ );
+}
diff --git a/frontend/src/app/blog/page.tsx b/frontend/src/app/blog/page.tsx
index 0985da0..aefa5b6 100644
--- a/frontend/src/app/blog/page.tsx
+++ b/frontend/src/app/blog/page.tsx
@@ -1,8 +1,32 @@
-export default function Blog() {
+import { promises as fs } from "fs";
+import Link from "next/link";
+import { Suspense } from "react";
+
+async function getFolders(dirPath: string) {
+ try {
+ const items = await fs.readdir(dirPath, { withFileTypes: true });
+ return items.filter((item) => item.isDirectory()).map((item) => item.name);
+ } catch (err) {
+ console.error("Error reading directory:", err);
+ return [];
+ }
+}
+
+export default async function BlogList() {
+ const folders = await getFolders("src/app/blog/");
+
return (
-
- This is blogs index page
+
+