diff options
104 files changed, 0 insertions, 2360 deletions
@@ -1,4 +0,0 @@ -AWS_BUCKET_NAME="kumar" -AWS_ENDPOINT="https://kumar.min.kumardamani.net" -AWS_UPLOAD_DIR="kumardamani.net" -AWS_LOCAL_DIR="public/" @@ -1,4 +0,0 @@ -if ! has nix_direnv_version || ! nix_direnv_version 3.0.5; then - source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/3.0.5/direnvrc" "sha256-RuwIS+QKFj/T9M2TFXScjBsLR6V3A17YVoEW/Q6AZ1w=" -fi -use flake .#website --impure @@ -1,4 +1 @@ -public/ .direnv -.devenv -credentials diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index ff7ca04..0000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "themes/risotto"] - path = themes/risotto - url = https://github.com/joeroe/risotto.git diff --git a/.hugo_build.lock b/.hugo_build.lock deleted file mode 100644 index e69de29..0000000 --- a/.hugo_build.lock +++ /dev/null diff --git a/archetypes/default.md b/archetypes/default.md deleted file mode 100644 index 00e77bd..0000000 --- a/archetypes/default.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: "{{ replace .Name "-" " " | title }}" -date: {{ .Date }} -draft: true ---- - diff --git a/content/_index.md b/content/_index.md deleted file mode 100644 index d52a325..0000000 --- a/content/_index.md +++ /dev/null @@ -1,134 +0,0 @@ -# About me -Hi. This is me: -{{< figure src="/kd.jpeg" alt="my pic" width="100" >}} - -My name is Kumar. Some people call me *kd*, or *ku-band-mar*, I'm known for being... - -* an advocate for de-centralization and self-hosting. [Why?](post/self-host) -* a programming purist, and a linguistics enthusiast. -* a recent amateur photographer. See some of my [pics](https://nc.kumardamani.net/apps/memories/a/vSk9IAWVUx2vcqphL9nMnLFmDQBDZWPr). -* 👎 on social-media. I think they lead to dystopia. [Read more](post/self-host#privacy). -* an NLP specialist from UofT. - -# My Active Projects -| | | -| -------------- | --------------- | -| [nixdots](https://gitlab.com/kdam0/dotfiles-nix) | My dotfiles for the Nix ecosystem as started in [this post](post/nixos-p1). | -| [home-lab](https://gitlab.com/kdam0/home-lab) | My Terraform, Ansible repository for self-hosting as described in [this post](post/framework-server). | -| [nccli](https://gitlab.com/kdam0/nccli) | A Docker-ized Golang CLI for CRUD ops for Namecheap's DNS settings. | - -> If you found something above to be useful, consider [sending](#donate) a few coins my way! - ---- - -# Professional Life -*Treat this section as an extension of my resume.* - -## 2020 - now -Currently working as a **DevOps** at [Kepler](https://kepler.space) :satellite:. - -This is mostly a software (infrastructure) dev gig for a start-up, which is a bit new to me -coming from a more traditional DevOps role with a mature company. -There is a ton of specialized *space* -related equipment here that present interesting problems in DevOps. - -I've learned a ton about embedded computers, networking and network automation, -which has opened my world up to all sorts of home projects for which I am very grateful for. -So far, I've been responsible for the following: - -* Establishing Infrastructure as Code (IaC) as standard practice with Ansible. -* Implementing a netboot infrastructure for our development servers - RPis - -using Packer, PXE, Awx (Ansible Tower) to keep them synced, predictable, and up-to-date. -* Built a custom Linux router to support our unique hardware testing requirements -for on-demand subnet generation/teardown for isolated tests. -* Automated our Lab network infrastructure with Ansible. -* Devised a test-automation framework using Django to facilitate reservation, -as well as [HIL](https://en.wikipedia.org/wiki/Hardware-in-the-loop_simulation) -(Hardware-In-the-Loop) testing to allow us to more reliably, and frequently test our HW. -* Designed and deployed our highly-available Kubernetes cluster to be our software -platform going forward. - -Beyond my work as an Individual Contributor (IC), I've also been responsible for instilling DevOps -*principles* within the team on our journey to maturity. - -## 2019 - 2020 -Worked as a **DevOps Engineer** at [AcuityAds](https://acuityads.com) in Toronto. -The main selling point for me to work here is that Acuity does not use -AWS, GCP or Azure etc. to host its infrastructure, it has its own on-prem 'cloud'. -This presents substantial challenges for us as DevOps Engineers that would normally be handled by a -public cloud provider. - -Apart from this, due to the nature of adtech, we deal with massive amounts of data, which forces -us to be very careful about the types of technologies we use (scale). -Here is a subset of what I've gained experience with during my time: - -* Infrastructure: VMWare, Physical -* Provisioning: Ansible, Terraform, Cobbler -* Containerization: Docker, Kubernetes -* CI/CD: Git, BitBucket, Bamboo (we host the entire Atlassian suite in-house) -* Monitoring: - * TICK (Telegraf, Influxdb, Chronograf, Kapacitor) - * ELK (Elasticsearch, Logstash, Kibana), with filebeat and metricbeat beats - * Prometheus - * Grafana - * Nagios, Pagerduty, Pingdom -* Data: MySql, Aerospike, Kafka, HDFS, Druid -* Scripting: Golang, Bash, Python. <em>Some</em> of my work can be on my Gitlab profile: - * Golang: - * a fast, containerized [cron script](https://gitlab.com/kdam0/go-druid-mysql-influx) - that interacts with Druid, MySql, and Influxdb written in Go. - Basic unit testing. - This is a job that powers one of our major alerting dashboards. - * a containerized highly modular [Rest Api](https://gitlab.com/kdam0/devops-api) - that writes to Influxdb. - This is something we run in K8S as a Service to monitor Cronjobs that run in K8S. - * Python: a [script](https://gitlab.com/kdam0/slack-to-teams) to migrate - Slack exports to MS Teams messages. - This is something we used when we gave up on Slack. - * Bash: a small [collection](https://gitlab.com/kdam0/random-shell-helpers) of helper - scripts that I used frequently for random things. - -## 2016 - 2017 -I worked at [Achiga](https://achiga.io) (formerly *WebCanada*) as -part of my [PEY](https://web.cs.toronto.edu/undergraduate/pey) (internship) -program from U of T for 12 months. As part of this, I was involved in: - -* A fast paced Agile environment where I was a Full Stack Developer working with - **PHP (Zend), MySql, and JavaScript**. -* Git + BitBucket + JIRA (basically the whole Atlassian suite), with Vagrant -* The Pipeline team working on day to day features and bugs in the CMS powering thousands of - local hotel sites around the world for Starwood Hotels. -* Debugging and optimizing cronjobs responsible for storing hotel rates in - our database which is critical to hotel revenue. -* Contributing to the Gallery Page (CMS as well as user facing UI). - See [Design Hotels Gallery Page](https://designhotels.com/gallery) - towards the end of my tenure. - -## 2014 - 2016 -I've worked on several other small-buisness type projects involving website designing, -and scripting over the years in between semesters. - ---- - -# Donate -<details> -<summary> Monero (XMR) </summary> -<br> - -``` -42hFshxmNoFZfAkDJTjSx9MUruMHdLTiDTE4efpP7xZTYwHMjwDZ6eJea2EnyBGGr5ab81cAovBxxT6KSvpUY5roUdkP1Qj -``` - -{{< figure src="/xmr.png" alt="xmr wallet qr code" width="100" >}} -</details> - -<details> -<summary> Bitcoin (BTC) </summary> -<br> - -``` -bc1q4em7f7mvl6wkzc8uyq4365td7w5n02uh64z2za -``` - -{{< figure src="/btc.png" alt="btc wallet qr code" width="100" >}} -</details> diff --git a/content/post/_index.md b/content/post/_index.md deleted file mode 100644 index 8a084d9..0000000 --- a/content/post/_index.md +++ /dev/null @@ -1,6 +0,0 @@ -+++ -aliases = ["posts", "articles", "blog", "showcase", "docs"] -title = "Posts" -author = "Hugo Authors" -tags = ["index"] -+++ diff --git a/content/post/framework-server-p2/current-lab.jpg b/content/post/framework-server-p2/current-lab.jpg Binary files differdeleted file mode 100644 index d64be2e..0000000 --- a/content/post/framework-server-p2/current-lab.jpg +++ /dev/null diff --git a/content/post/framework-server-p2/ethernet.png b/content/post/framework-server-p2/ethernet.png Binary files differdeleted file mode 100644 index f39110d..0000000 --- a/content/post/framework-server-p2/ethernet.png +++ /dev/null diff --git a/content/post/framework-server-p2/index.md b/content/post/framework-server-p2/index.md deleted file mode 100644 index 85b7aff..0000000 --- a/content/post/framework-server-p2/index.md +++ /dev/null @@ -1,106 +0,0 @@ ---- -title: "Letting my Framework 13 be a laptop again" -date: 2024-06-03T13:43:05-04:00 -draft: false -description: "Graduating to a more conventional home-lab." -author: "Kumar Damani" ---- - -My process of converting my Framework server back into a laptop. - -<!--more--> - -My wife needs an upgrade from her 2015 MacBook Pro, -but shelling out a cool $1600 + tax for one of the shiny new *M* MacBooks -for the 16GB variant hardly seems an ideal proposition now that Apple -has relinquished consideration of its customers who -would prefer to amortize upgrades over the lifespan of a machine. -It seems that leaving the Mac platform is our only consumer-friendly option, -which avoids fighting a losing battle with Apple w.r.t. upgradability. - -> :wave: Framework has entered the chat. - -Meanwhile, Framework seems to have upheld its promise of providing a path -to long-term upgradability for its products. -The new Ryzen mainboards being compatible with my original Framework 13 -(2021) is an example of this. -So at this point, I'm far more inclined to commit to the Framework ecosystem -for my wife (and probably myself) than Apple. - -Other than the initial non-trivial pain of migrating her from macOS to Windows, -she should have a substantially better user-experience running all of the -Adobe crapware she wants on my old Framework. - -**The only problem is that my entire home-lab currently [runs on my Framework](/post/framework-server) 😰.** - -:shopping_cart: time! - -# The Pledge -We'll be using second-hand equipment as much as possible. After all, -the point of all this is to avoid spending $1600 on a new laptop. -So we should be well under that to make it worthwhile. - -I picked these up from eBay: - - - - -| Part | Price (shipped) | -| -------------- | --------------- | -| HP Z240 Workstation Intel Xeon 3.4GHz 16G RAM 180G SSD Nvidia K620 | $150 | -| Mellanox ConnectX-2 PCIe x8 10Gbe SFP+ network card | $23 | - -> My Framework currently has 32GB of memory, and while this is much less, -it will still be okay with my current utilization for my current workload. - -One nice thing about this case is that it would be possible to rack-mount this -workstation sideways on a standard rack shelf if I decided to go that -route in the future. - -Also, I don't presently have 10Gb networking equipment at home to plug -anything into that network card, but I'm getting it now for future-proofing. - -IPMI would have been nice-to-have, but I decided that for this price, and the -bonus of that Nvidia K620 was too good to pass up! This is an -immediate upgrade from my current integrated Iris GPU on my Framework server. - - - -All of my home-lab VMs, and LXC containers run within Proxmox. -So I set up a fresh Proxmox here. - -Fortunately for me, `lspci` showed all the hardware on the first go. -But to use (pass-through) the Nvidia GPU in my guests, -I need to first set up the Proxmox host. -See my git repo for what I did to make this work. - -# The Turn - -To make the migration of our services *less painful*, -we utilize Proxmox's migration features. -We just need to make sure our nodes are part of a cluster. - -**Create the cluster on the old node.** -Then, from the new node, we **join** the existing cluster. - -> Proxmox 8 will not let a node with existing guests join a cluster. - -# The Prestige - -Now it really is as easy as selecting a VM or an LXC container, hitting -the Migrate button, and watching your guest fly away to the new node! -For guests with large OS disks, it takes a little longer to copy over -since my network is slow. -Eventually, I will use Ceph-backed VM storage to make this a zero-downtime op. - -In a few minutes, I could knock out all of my services. -Refer to my gitlab project to see how I handled the Nvidia K60 pass-through -to my Nextcloud AIO instance and Plex guests. - -Here's what my "rack" looks like now: - - - -Once everything was back online, I powered down the old Framework server -and re-installed it back onto its laptop chassis, bought a W10 license, and -finished the rest of the installation. diff --git a/content/post/framework-server-p2/server-front.png b/content/post/framework-server-p2/server-front.png Binary files differdeleted file mode 100644 index 31e34da..0000000 --- a/content/post/framework-server-p2/server-front.png +++ /dev/null diff --git a/content/post/framework-server-p2/server-inside.png b/content/post/framework-server-p2/server-inside.png Binary files differdeleted file mode 100644 index 79e7139..0000000 --- a/content/post/framework-server-p2/server-inside.png +++ /dev/null diff --git a/content/post/framework-server/bios.jpg b/content/post/framework-server/bios.jpg Binary files differdeleted file mode 100644 index 76cda35..0000000 --- a/content/post/framework-server/bios.jpg +++ /dev/null diff --git a/content/post/framework-server/bios2.png b/content/post/framework-server/bios2.png Binary files differdeleted file mode 100644 index 094e37e..0000000 --- a/content/post/framework-server/bios2.png +++ /dev/null diff --git a/content/post/framework-server/case.jpg b/content/post/framework-server/case.jpg Binary files differdeleted file mode 100644 index a40c172..0000000 --- a/content/post/framework-server/case.jpg +++ /dev/null diff --git a/content/post/framework-server/dmz.png b/content/post/framework-server/dmz.png Binary files differdeleted file mode 100644 index 372c12b..0000000 --- a/content/post/framework-server/dmz.png +++ /dev/null diff --git a/content/post/framework-server/dns.jpg b/content/post/framework-server/dns.jpg Binary files differdeleted file mode 100644 index 0b32528..0000000 --- a/content/post/framework-server/dns.jpg +++ /dev/null diff --git a/content/post/framework-server/dri.png b/content/post/framework-server/dri.png Binary files differdeleted file mode 100644 index a578c79..0000000 --- a/content/post/framework-server/dri.png +++ /dev/null diff --git a/content/post/framework-server/error.jpg b/content/post/framework-server/error.jpg Binary files differdeleted file mode 100644 index 429eef8..0000000 --- a/content/post/framework-server/error.jpg +++ /dev/null diff --git a/content/post/framework-server/eth.jpg b/content/post/framework-server/eth.jpg Binary files differdeleted file mode 100644 index f8ad12a..0000000 --- a/content/post/framework-server/eth.jpg +++ /dev/null diff --git a/content/post/framework-server/fail.png b/content/post/framework-server/fail.png Binary files differdeleted file mode 100644 index f0e06db..0000000 --- a/content/post/framework-server/fail.png +++ /dev/null diff --git a/content/post/framework-server/feelsbadman.png b/content/post/framework-server/feelsbadman.png Binary files differdeleted file mode 100644 index b1c2a26..0000000 --- a/content/post/framework-server/feelsbadman.png +++ /dev/null diff --git a/content/post/framework-server/fix1.png b/content/post/framework-server/fix1.png Binary files differdeleted file mode 100644 index b36489e..0000000 --- a/content/post/framework-server/fix1.png +++ /dev/null diff --git a/content/post/framework-server/fix2.png b/content/post/framework-server/fix2.png Binary files differdeleted file mode 100644 index 5b64900..0000000 --- a/content/post/framework-server/fix2.png +++ /dev/null diff --git a/content/post/framework-server/fix3.png b/content/post/framework-server/fix3.png Binary files differdeleted file mode 100644 index 9af2433..0000000 --- a/content/post/framework-server/fix3.png +++ /dev/null diff --git a/content/post/framework-server/fw1.png b/content/post/framework-server/fw1.png Binary files differdeleted file mode 100644 index 72a95ee..0000000 --- a/content/post/framework-server/fw1.png +++ /dev/null diff --git a/content/post/framework-server/fw2.png b/content/post/framework-server/fw2.png Binary files differdeleted file mode 100644 index cec00e1..0000000 --- a/content/post/framework-server/fw2.png +++ /dev/null diff --git a/content/post/framework-server/imp.png b/content/post/framework-server/imp.png Binary files differdeleted file mode 100644 index c11b806..0000000 --- a/content/post/framework-server/imp.png +++ /dev/null diff --git a/content/post/framework-server/index.md b/content/post/framework-server/index.md deleted file mode 100644 index 71e4941..0000000 --- a/content/post/framework-server/index.md +++ /dev/null @@ -1,487 +0,0 @@ -+++ -author = "Kumar Damani" -title = "Helping my Framework Laptop reach its destiny" -date = "2023-07-29" -draft = false -description = "Framework laptop as a standalone server." -tags = [ - "technology" -] -math = false -+++ - -How I re-purposed my Framework as a standalone server for my home-lab. -<!--more--> - -> This is not sponsored by Framework ... though I wish it were :) - -# Primary Motivation -I #feelsbad for abusing my lowly NAS - - -{{< figure src="feelsbadman.png" title="" width="150px" >}} - -Its not it's fault that its owner expected it to run Collabora Online -while running all his other services without instantly crashing... - - - -Did I learn anything? -Basically a NAS should just do NAS things like worry about storage. -Compute should be handled by something else. - -> Lesson learned. - - -# Secondary Motivation -Battery life is an issue with this gen. - -For my personal laptop I'd want something that has "all day" -battery like the newer gen Intels or Ryzens. - -My plan is to snag one of those when prices become -more attractive and retrofit it into my now hollow laptop chassis. - -Isn't this the Framework [mission](https://frame.work/ca/en/about#what-we-re-fixing)? - -> "Even better, what we've done to enable repair also opens up upgradability and customization. -This lets you get exactly the product you need and extends usable lifetime too." - - -# Idea -Re-purpose my 99%-of-the-time idle personal Framework laptop which is already -overkill for the remaining 1%-of-the-time tasks, to be a hypervisor server. - -Setup my home-lab services there, and provide data storage for those services over NFS from my NAS. - -I'll setup a dedicated "workstation" VM for those 1%-of-the-time tasks. - - - - -# Prior to starting! -To avoid making the same mistakes I made, do the following **while -the mainboard is still in the laptop chassis!** - - - -1. **Update your BIOS firmware to at least 3.17.** -It is **impossible** to do so once the battery is un-plugged from the board on older firmwares. -I learned this the hard-way. -This update will provide the critical options below for this process to be feasible. -1. In your BIOS settings, enable options for optimizing CPU performance over -battery life. -1. In your BIOS settings, enable "Standalone operation". -1. In your BIOS settings, under "Boot" enable the option to power-on on power-attach. - -1. Install Proxmox VE. Since this will require a screen, and keyboard input, you might as -well do it now. See the [hypervisor]({{< relref "#hypervisor" >}}) section below. - - ---- - -# Build -## Server -I'm using my original [Framework 13](https://frame.work/ca/en/products/mainboard-11th-gen-intel-core?v=FRANFG000B) laptop. - - - -Its an i7-1165G7 - yes a "mobile" CPU. -Am I asking for trouble? We'll see. -Its more than powerful enough for me (for now). - -Alternatively you could build/use another server. - -If you are also using the Framework 13, then you'll want to make sure -that you are running at least **BIOS 3.17**. -See the [issues]({{< relref "#issues" >}}) section below about my troubles. - - -## Case -As you can see above, I opted for the -[Coolermaster Case](https://frame.work/ca/en/products/cooler-master-mainboard-case) -because honestly it looks cool. - -Alternatively, you could self-print the [community](https://github.com/FrameworkComputer/Framework-Laptop-13) 3D case -or get someone else to print it. - - -## Network Connectivity -I opted for the 2.5G [ethernet expansion card](https://frame.work/ca/en/products/ethernet-expansion-card) -from Framework. - - - -I suppose one could also use a WiFi card, -but it makes more sense to go wired in a 24/7 "on" configuration. - -Alternatively, most thunderbolt-ethernet dongles should do the job. -You'd want to check that there are Linux drivers for it. - -Since I host a few publicly accessible services (this blog for example), -I also need a public static IP under which an internet user can access these services. - -So I opt for a cheap VPS from [Racknerd](https://www.racknerd.com/kvm-vps). -These are about a $1/mo for a public IPv4 IP, and a decent amount of network bandwidth. - - - -## Storage -### for VMs -I used the 1TB NVME drive I had on my Framework. - -### for Data -*You should have a storage solution (NAS) in place already!* - - - -Setting this up is beyond the scope of this post. -You can check out my DIY ZFS backed NAS setup [here](https://gitlab.com/kdam0/vps#nas-equipment). -I've had no (storage related) issues with my NAS since its inception over a year ago. - -Then when I need to allocate space for a new service I do: -```shell -zfs create <pool>/<dataset> -zfs set compression=on/off -zfs set sharenfs="..." sharesmb=".." -``` - -Then when the time comes, configure the NFS mount on the client VM that requires access to this -data store: -```bash -mount -t nfs hostname-of-your-nas:/mnt/pool/dataset /mnt/data -``` - -There are also many options for pre-made NAS appliances such as Synology. - - -## Power -Highly recommend a UPS such as [this](https://www.amazon.ca/APC-BE600M1-Back-Uninterrupted-Electronics-Computers/dp/B01FWAZEIU/ref=sr_1_6?crid=28ZH7JP9IYXPU&keywords=ups&qid=1690928556&sprefix=ups%2Caps%2C172&sr=8-6). - - - -Even if you don't care about uptime, **you should care about data integrity** issues -resulting from abrupt power-loss. - -A UPS should buy you enough time to power things down gracefully. - - -# Hypervisor -I opted for [Proxmox VE](https://www.proxmox.com/en/proxmox-virtual-environment/overview) -since v8 was just released, I've been itching to try it out. Now felt like the right time. - -There is also a Terraform [provider](https://registry.terraform.io/providers/Telmate/proxmox/latest/docs) -allowing provisioning of VMs, and LXC Containers through code. Neat! - -> I recommend you do this **before** taking the mainboard out of the laptop chassis as you -will need to provide keyboard input, as well as see whats going on the screen. - -* Install it. -I just followed the [official instructions](https://www.proxmox.com/en/proxmox-virtual-environment/get-started). - -* Under your host (mine's `pve`), under System, Network, create a bridge `vmbr0` with: - - - -This will make your Proxmox host available in your home network. -**Set this to something else if you like.** -> You should also reserve the corresponding IP in your home router for this host. - -While you're here, create another bridge `vmbr1` with `VLAN Aware` checked: - - - -> We are going to create our home-lab network primarily on `vmbr1`. -> Think of `vmbr0` as a *management* bridge. - -# Network -I always find it best to sort out networking **before** we start building stuff. - -Since I'm basically starting over, I want to do it properly. -A few design goals: - -1. I want segregation of my home-lab services from my non-home-lab hosts -(my "workstation" VM for example), as well as the rest of my home network. -1. I don't want to keep track of static IP leases, everything should be DHCP, and DNS. -1. I want all traffic to/from my home-lab segment to be encrypted. Non-home-lab -traffic does not need to be encrypted. -1. I need some way to make these services publicly accessible over the internet. - -The first two goals necessitate a virtual firewall/router deployment capable of -*selectively* routing a segment of my network over a VPN. - -Here is what I would like: - - - -## Goals: 1,2 -At first I went with the popular [pfSense]() VM. -For a [few]({{< relref "#pfsense" >}}) reasons, I abandoned it quickly. - ---- - -Then I decided to try out [OpenWRT](), and boy am I glad I did. - ---- - -I gave it two networking interfaces, each `vbmrX` we created earlier: - - -* `vmbr0` will be used to access our router from the home-network. -It will also be how our router gets access to the internet. Aka. **WAN**. -* `vmbr1` will be used to create various subnets for our home-lab. Aka. **LAN**. - -> You should reserve another IP in your home router using the MAC address generated for `net0`. -This will be how to access your home-lab router from your home network. - -I was able to setup a network with a few VLANs: - - -> This means that the next time we create a new VM or LXC container, we -can place it on `vmbr1`, with a particular VLAN Tag/`id` and it will start with -the corresponding IP for that network. - - -Few observations: -* The Luci web UI is much more minimal and to the point. -The terminology used for things are more in-line with what I'm familiar with. -* Soon I had the segregation I was looking for thanks to Firewall settings: - -* DHCP, **and** DNS working as expected. - -## Goals: 3 -Then I started working on setting up my VPN (Wireguard) remote on my VPS. - -* I followed the script from [here](https://github.com/angristan/wireguard-install). -Worked flawlessly. -* Added a peer through the script - my OpenWRT VM. -* Setup a domain - eg. `vpn.mydomain.com` to point to my VPS's public IP. -* Then I enabled the "DMZ" -setting (but **not** "Advanced DMZ" - which is probably the *real* DMZ) -on my home ISP router settings, and added my OpenWRT VM to it. - -* I also setup a port-forward for the Wireguard port 51820 from my ISP router settings, -to point to my OpenWRT VM's internal port 51820. - - -After all that, I started setting up Wireguard on OpenWRT. -* The corresponding OpenWRT package is called `luci-app-wireguard`. -* This will give you the ability to create a Wireguard interface on OpenWRT. - - -* I followed the following excellent tutorial for setting up the Wireguard interface, -configured to use my VPS as its peer: -{{< youtube id="04q41GEPvKA" title="Setting up Wireguard on OpenWRT" >}} -* Created the new interface and added the firewall settings: - - - -* As is, this will mean that **only** LAB will have internet access (using the Wireguard interface) - -which is not what I want. I still want other subnets to be routed via **WAN**. - -***If only there was a way to route by VLANs...*** - -> This is known as VPN *split-tunnelling*, or *Policy based routing*. - -Luckily OpenWRT has a way to accomplish exactly this with a package called `luci-app-pbr`. -This will add the PBR setting to your menu: - - - -* I followed the following tutorial: -{{< youtube id="FN2qfxNIs2g" title="Setting up PBR on OpenWRT" >}} - -* Set up the rule for my PBR: - - -* The default interface is set to `wan`, so everything else should behave as normal: - - -However, it did take many trail & error sessions -(see the [dns leakage issues]({{< relref "#pbr-dns-leakage" >}}) section below) -to get this working exactly as I wanted. - -**In summary**, - -When I create a VM/container in my *Lab* subnet, -* its external IP is that of my VPS -* when it reaches out to the internet, it goes through the Wireguard tunnel encrypted, -to the VPS, and out the VPS's ISP. - - -When I create a VM/container **not** in my Lab subnet, -* its external IP is the same as my home-network's public IP -* when it reaches out to the internet, it goes through my home ISP -(NAT), just like all other devices on my home-network. - - -PBR provides quite granular control over this, for example, if you run a Plex server, it frequently -needs to access the `plex.tv` domain. -You can choose to route any source going to `plex.tv` to route via the `wan` interface instead. - - - -## Goals: 4 -For publicly accessible services, I need to point their domains to my VPS. -I use sub-domains, so this is just a matter of creating `CNAME` records for these services. - -Then we setup our Wireguard on the VPS to forward all 80,443 TCP traffic to our -Wireguard on OpenWRT. -We'd need to add these lines **in addition** to your existing VPS `wg0` interface config: -``` -PostUp = iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 80 -j DNAT --to-destination <ip of your OpenWRT wg0>:80 -PostUp = iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 443 -j DNAT --to-destination <ip of your OpenWRT wg0>:443 -... -PostDown = iptables -t nat -D PREROUTING -p tcp -i eth0 --dport 80 -j DNAT --to-destination <ip of your OpenWRT wg0>:80 -PostDown = iptables -t nat -D PREROUTING -p tcp -i eth0 --dport 443 -j DNAT --to-destination <ip of your OpenWRT wg0>:443 -``` - -Then we also need to setup port-forwards for 80,443 on OpenWRT going to our Reverse Proxy VM/Container. - - -I just setup a temporary Caddy container in reverse-proxy mode to test this out. - - -Once this works, we can move on to building out our services :) - -# Home Lab Services -These are *some* of the services I run ad LXC container: -* [Nextcloud](https://nextcloud.com/athome/) - files, and image storage and sharing (thanks to the excellent [Memories](https://apps.nextcloud.com/apps/memories) app). I used the official [AIO](https://github.com/nextcloud/all-in-one) install. -* [Plex](https://www.plex.tv/) - media streaming. -* [Vaultwarden](https://github.com/dani-garcia/vaultwarden) - a self-hosted password manager based on Bitwarden. -* A few static websites. - -How I set up these services is beyond the scope of this post. -You should check out my git repo's [readme](https://gitlab.com/kdam0/home-lab) for instructions. -I will just briefly summarize my process here. - -* I use LXC wherever possible as it has lower overhead than VMs. -* LXC or VM hosts are provisioned by Terraform and services are configured -by Ansible. - -One thing to note is that as of now, there is no automated way to pass-through my -iGPU to my LXC containers that would benefit from this - -such as Nextcloud (for Memories app), Plex etc. - -Instead you must edit the config on Proxmox for the corresponding container, and add -the following lines and restart the container. Edit `/etc/pve/lxc/<id of your container>.conf`: -``` -lxc.cgroup2.devices.allow: c 226:0 rwm -lxc.cgroup2.devices.allow: c 226:128 rwm -lxc.cgroup2.devices.allow: c 29:0 rwm -lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir -lxc.mount.entry: /dev/dri/renderD128 dev/renderD128 none bind,optional,create=file -``` -Then inside your LXC container do `ls -al /dev/dri/` and you should see some devices. - - - -# Issues -## Intermittent connectivity loss with Framework -* When I initially started this project, I had already installed -Proxmox, and my setup my networking while on BIOS 3.16. -* However every couple of days (sometimes hours) I was observing loss of connectivity -to both my Proxmox host, and my virtual router. -* When I plugged in a monitor to see what was going on, I saw a few -messages on the TTY regarding `usbX disconnected...`. -* Unplugging and re-plugging in the ethernet card did not fix it. -* Usually a hard reset was required to bring things back to normal. - -I've encountered issues with other Framework peripherals in the past, -so I reached out to the Framework support folks, -and they immediately suggested a BIOS update. - -So I proceeded to give that a shot from within Proxmox using `fwupmgr`: - - -And to my surprise it was complaining about *battery level*? -Its not even connected to the battery... - -I brought this up to the support and they confirmed my fear -that it was not possible to update the BIOS while having the battery detached. -Yikes! - -This was a deal-breaker for this whole project, until they confirmed -that once I was on 3.17, -it would be possible to do future updates without the battery being connected. - -* So I went ahead and pretty much attached the whole thing back into the laptop chassis -* Updated to 3.17, and applied "Standalone operation" - - -* Thankfully, all my connectivity issues have gone away now. -* Framework support service is excellent! - - -## Intermittent loss of internet for hosts in Lab Vlan. -This one kept me up for many nights. To summarize: -* in a host in the Lab network, doing an `apt update` the first time would hang, -mid-way through -* running it a few times again, would eventually succeed the operation - - -Could it be DNS? -Could it be PBR? -Could it be Wireguard? - -After many hours of troubleshooting, I happened to have -seen errors during a `tcpdump` session on my VPN interface. - -Something about `...need to fragment...`. DOH! -* Lab internet access is via VPN (due to PBR). -* **VPN remote interface has an MTU of 1420, not 1500.** -* Proxmox `vmbr1` set MTU to 1500 by default. -* Therefore all hosts in Lab have a MTU mismatch trying -to get to the internet. - -> Fixed. It was not DNS... it was MTU. - -## PBR DNS leakage -The whole point having my Lab traffic go through Wireguard is -to prevent my home ISP from knowing what I am up to. -**DNS queries leaking to my ISP completely defeats this purpose!** - -Although my external IP would correctly report to being my VPS one, -tests like [this](https://github.com/macvk/dnsleaktest) -would show that DNS was still being sent to my home ISP. - - - -To fix this, I had to: -* **Un-check** setting default route on the Lab interface. - - -* Explicitly set DHCP DNS settings for my Lab gateway interface to -use my VPS's `wg0` interface IP. - - -* Needed a static route defied for the `wg0` interface targeting the VPN network -via the OpenWRT local IP for `wg0` as a gateway. - - -## pfSense -Few observations: -* Segregation was working how I wanted it to. -* A few firewall rules were required to allow access to parts of my home-network - NAS. -* DHCP, worked out of the box. -* However, DNS did not. - -I'm still not sure what the issue was, but it was probably something small. - -More importantly, I was quite overwhelmed with all the options in the UI for which I had no -knowledge of. - -Also, everything in pfSense pretty much *requires* a UI, which for now is fine, but -I'd like the option to move to a more automation friendly configuration in the future. - - -# Summary -The Framework laptop is happily fulfilling its destiny as a compute server, -and so is my NAS as a storage server. - -Since switching to this setup, I've observed a dramatic improvement -in responsiveness for all of my services. - - - -Overall I'm quite pleased with how everything turned out once the -appropriate BIOS was running on the Framework. diff --git a/content/post/framework-server/lab.png b/content/post/framework-server/lab.png Binary files differdeleted file mode 100644 index 6591a8b..0000000 --- a/content/post/framework-server/lab.png +++ /dev/null diff --git a/content/post/framework-server/lan.png b/content/post/framework-server/lan.png Binary files differdeleted file mode 100644 index 461d598..0000000 --- a/content/post/framework-server/lan.png +++ /dev/null diff --git a/content/post/framework-server/mistakes.jpg b/content/post/framework-server/mistakes.jpg Binary files differdeleted file mode 100644 index d4b2e12..0000000 --- a/content/post/framework-server/mistakes.jpg +++ /dev/null diff --git a/content/post/framework-server/nas.jpg b/content/post/framework-server/nas.jpg Binary files differdeleted file mode 100644 index 75f5251..0000000 --- a/content/post/framework-server/nas.jpg +++ /dev/null diff --git a/content/post/framework-server/net1.png b/content/post/framework-server/net1.png Binary files differdeleted file mode 100644 index a0a4eff..0000000 --- a/content/post/framework-server/net1.png +++ /dev/null diff --git a/content/post/framework-server/net2.png b/content/post/framework-server/net2.png Binary files differdeleted file mode 100644 index c5ad118..0000000 --- a/content/post/framework-server/net2.png +++ /dev/null diff --git a/content/post/framework-server/network.png b/content/post/framework-server/network.png Binary files differdeleted file mode 100644 index 1b1fba6..0000000 --- a/content/post/framework-server/network.png +++ /dev/null diff --git a/content/post/framework-server/pbr.png b/content/post/framework-server/pbr.png Binary files differdeleted file mode 100644 index 2b1e330..0000000 --- a/content/post/framework-server/pbr.png +++ /dev/null diff --git a/content/post/framework-server/pbr1.png b/content/post/framework-server/pbr1.png Binary files differdeleted file mode 100644 index 4d7f075..0000000 --- a/content/post/framework-server/pbr1.png +++ /dev/null diff --git a/content/post/framework-server/pbr2.png b/content/post/framework-server/pbr2.png Binary files differdeleted file mode 100644 index 0a07839..0000000 --- a/content/post/framework-server/pbr2.png +++ /dev/null diff --git a/content/post/framework-server/pfnet.png b/content/post/framework-server/pfnet.png Binary files differdeleted file mode 100644 index 67cc5f4..0000000 --- a/content/post/framework-server/pfnet.png +++ /dev/null diff --git a/content/post/framework-server/physical.png b/content/post/framework-server/physical.png Binary files differdeleted file mode 100644 index fc1cb81..0000000 --- a/content/post/framework-server/physical.png +++ /dev/null diff --git a/content/post/framework-server/port1.png b/content/post/framework-server/port1.png Binary files differdeleted file mode 100644 index 1b72ab1..0000000 --- a/content/post/framework-server/port1.png +++ /dev/null diff --git a/content/post/framework-server/port2.png b/content/post/framework-server/port2.png Binary files differdeleted file mode 100644 index 37ff887..0000000 --- a/content/post/framework-server/port2.png +++ /dev/null diff --git a/content/post/framework-server/rproxy.png b/content/post/framework-server/rproxy.png Binary files differdeleted file mode 100644 index 0d3f0bf..0000000 --- a/content/post/framework-server/rproxy.png +++ /dev/null diff --git a/content/post/framework-server/ups.jpg b/content/post/framework-server/ups.jpg Binary files differdeleted file mode 100644 index 4cd7aee..0000000 --- a/content/post/framework-server/ups.jpg +++ /dev/null diff --git a/content/post/framework-server/vps.png b/content/post/framework-server/vps.png Binary files differdeleted file mode 100644 index 7392495..0000000 --- a/content/post/framework-server/vps.png +++ /dev/null diff --git a/content/post/framework-server/wg.png b/content/post/framework-server/wg.png Binary files differdeleted file mode 100644 index 18896a0..0000000 --- a/content/post/framework-server/wg.png +++ /dev/null diff --git a/content/post/framework-server/wrtnet.png b/content/post/framework-server/wrtnet.png Binary files differdeleted file mode 100644 index 73d435d..0000000 --- a/content/post/framework-server/wrtnet.png +++ /dev/null diff --git a/content/post/framework-server/wrtnet2.png b/content/post/framework-server/wrtnet2.png Binary files differdeleted file mode 100644 index 34cd6b9..0000000 --- a/content/post/framework-server/wrtnet2.png +++ /dev/null diff --git a/content/post/framework-server/wtf.jpg b/content/post/framework-server/wtf.jpg Binary files differdeleted file mode 100644 index 995fefe..0000000 --- a/content/post/framework-server/wtf.jpg +++ /dev/null diff --git a/content/post/listing-my-fav-advice/balance.jpg b/content/post/listing-my-fav-advice/balance.jpg Binary files differdeleted file mode 100644 index ee5050c..0000000 --- a/content/post/listing-my-fav-advice/balance.jpg +++ /dev/null diff --git a/content/post/listing-my-fav-advice/boss.jpg b/content/post/listing-my-fav-advice/boss.jpg Binary files differdeleted file mode 100644 index 631a78a..0000000 --- a/content/post/listing-my-fav-advice/boss.jpg +++ /dev/null diff --git a/content/post/listing-my-fav-advice/chewing.gif b/content/post/listing-my-fav-advice/chewing.gif Binary files differdeleted file mode 100644 index 12b7d16..0000000 --- a/content/post/listing-my-fav-advice/chewing.gif +++ /dev/null diff --git a/content/post/listing-my-fav-advice/index.md b/content/post/listing-my-fav-advice/index.md deleted file mode 100644 index 24611f7..0000000 --- a/content/post/listing-my-fav-advice/index.md +++ /dev/null @@ -1,102 +0,0 @@ -+++ -author = "Kumar Damani" -title = "A list of my favourite life advice" -date = "2023-09-01" -draft = false -description = "A list of my favourite life advice." -tags = [ - "lists", - "personal", -] -math = false -+++ - -I outline my favourite life advice, where I have heard it, and what it means to me. -<!--more--> - -## Everything in moderation, including moderation. <cite>[^1]</cite> -<br> - -| | | -| -------- | -------- | -|  | | - - -The first part is fairly self-explanatory. -The second part says to moderate the moderation. -In other words, on occasion, it is ok to indulge. -After all, some of the best moments in life come from indulgence. -Don't be the person who is always moderating, or you will miss out on 100% of those moments. - - -This reminds me of a paradigm in Computation called [Reinforcement Learning](https://en.wikipedia.org/wiki/Reinforcement_learning) -(RL), where learning is maximized -by balancing existing knowledge, with occasional spurts of exploration. -Without exploration, we find that we are generally unlikely to end up at an -optimal solution, thus showing us its importance. - -If the objective of life is to attain long-term (cumulative) happiness, -then we can say that moderation is the current knowledge, and occasional indulgence -are the spurts of exploration, and both must be balanced in order to maximize our objective. - - -## Chew your food. Well. <cite>[^2]</cite> -<br> - - - -This one is quite underrated. -We all know that our digestion health is such a large contributor to our overall well-being. -Yet we religiously neglect the first step of the process - chewing. - -I specifically recall my grandpa saying "*chew it until it becomes a paste*". -Gross but effective. -No matter what your diet is composed of, its not debatable that chewing better will only -ever help your digestion, never harm. - -Another benefit? Sitting down and consciously chewing requires time and effort. -If you aren't doing it, maybe its a sign that you are rushing. -Why are you rushing? Maybe its time to re-evaluate some things in your life. - -## Don't worry so much about budgeting, focus on earning more. <cite>[^3]</cite> -<br> - - - -This one is somewhat controversial. -I think this stems from the notion that there is a hard limit to how much you can restrict your spending to - $0. -But no limit to how much you can earn. So why not focus on that? - -I think this is largely a time-management principle. -Maybe you've heard the idiom "penny wise, and pound foolish". -If money is the *penny*, then your time is the *pound*. -Don't be foolish with your time. - -People often will go out of their way believing they are saving a certain amount of money -but hardly ever factor in the value of the time spent saving that amount. -And more often than not, that time is spent doing something that is not enjoyable. - -That same time could've been spent on trying to earn more money than what was saved or -at the very least doing something actually enjoyable. - - -## Never work for someone who you don't want to become. <cite>[^4]</cite> -<br> - -{{< figure src="boss.jpg" title="" width="50%" >}} - -This one has helped me substantially in my career. -More important than finding the right role/career is finding the right mentor. -I've personally switched roles based on this advice, and I can attribute most -my success as a direct result of this. - -We tend to emulate people that we are influenced by. -By working for such a manager, you are setting yourself up to emulate someone you look up to - -which is a great thing! -I also consider this one of the few advantages of being an employee rather than an owner. -Don't waste it! - -[^1]: Kia - my Jitsu instructor at U of T -[^2]: Grandparents -[^3]: John Hill from the [Super Hoopers podcast](https://podcasts.apple.com/us/podcast/super-hoopers-an-nba-podcast/id1053263719) quoting some book -[^4]: Mark Cuban? or Mr. Wonderful? or someone from Shark Tank IIRC diff --git a/content/post/listing-my-fav-advice/indulgence.jpg b/content/post/listing-my-fav-advice/indulgence.jpg Binary files differdeleted file mode 100644 index 446e3fb..0000000 --- a/content/post/listing-my-fav-advice/indulgence.jpg +++ /dev/null diff --git a/content/post/listing-my-fav-advice/money.jpg b/content/post/listing-my-fav-advice/money.jpg Binary files differdeleted file mode 100644 index 451ff7c..0000000 --- a/content/post/listing-my-fav-advice/money.jpg +++ /dev/null diff --git a/content/post/nas-upgrade/cockpit-lxc.png b/content/post/nas-upgrade/cockpit-lxc.png Binary files differdeleted file mode 100644 index a2a9363..0000000 --- a/content/post/nas-upgrade/cockpit-lxc.png +++ /dev/null diff --git a/content/post/nas-upgrade/ethernet.png b/content/post/nas-upgrade/ethernet.png Binary files differdeleted file mode 100644 index f39110d..0000000 --- a/content/post/nas-upgrade/ethernet.png +++ /dev/null diff --git a/content/post/nas-upgrade/index.md b/content/post/nas-upgrade/index.md deleted file mode 100644 index ea7f0bb..0000000 --- a/content/post/nas-upgrade/index.md +++ /dev/null @@ -1,139 +0,0 @@ ---- -title: "NAS Upgrade" -date: 2024-06-01T15:56:10-04:00 -draft: false -description: "I upgrade my NAS hardware, and the platform it runs on." -author: "Kumar Damani" ---- - -Doing it right this time. - -<!--more--> - -Until now I've been using a [RockPro64](https://pine64.org/devices/rockpro64/) in the (excellent for starters) Pine64 [NAS case](https://wiki.pine64.org/wiki/NASCase) for my NAS. -It runs [Armbian](https://www.armbian.com/rockpro64/), `openzfs`, and I manage my ZFS as needed on the CLI. -I share my datasets over NFS to my Proxmox guest VMs for access. -This has served me reasonably well for the past few years. -But we have a baby coming soon, and along with that a flurry of new photos and videos -for my family to store on my NAS. -And although I *probably* have enough buffer to survive the initial few months, -I certainly wish to do better than my current 2xHDD mirrored pool giving me ~4TB of storage. - - - -# The Plan -Luckily I already possess the hard-drives I need for my desired pool. -In total, I have 2 HDDs from my current NAS, and 2 spares - -all the same 4TB capacity. - -I still want to keep my current NAS running as a backup store, -but I only need 1 drive for this purpose (for now). -That leaves me with 3 HDDs we can use for our new `raidz1` pool which would give -me 2 drives for storage and 1 for parity. - -Now for the platform. I have been a very happy user of [Proxmox](https://www.proxmox.com/en/proxmox-virtual-environment/overview) (on my compute node) -and it already comes ready with ZFS support so I'll stick with that. -I did consider [TrueNAS](https://www.truenas.com) (both standalone, and virtualized within Proxmox with -disk-passthrough), but when it comes to storage, I want as few surprises as possible -so I stuck with what I know. I'm already used to ZFS on the CLI and Proxmox is based on -Debian so if/when something goes wrong, I don't want to be messing around with an unfamiliar UI. - -Although I don't want to manage ZFS via a GUI, -I'd like a way to manage *access* to my datasets via a GUI. -[Cockpit](https://cockpit-project.org) seems like a good light-weight choice. -It runs as an LXC container within Proxmox using bind-mounts for the dataset paths. -I can then select which paths I allow access to over my network -using NFS, and SMB protocols on a per-user basis. - -# Shopping -Needs: -- `>= 3` hot-swappable HDD bays -- `>= 16` GB RAM (for ZFS) -- runs Proxmox - -Wants: -- IPMI -- 1U -- 10Gb networking - -On eBay, I ended up checking out with: - - - - -| Part | Price (shipped) | -| -------------- | --------------- | -| 1U 20" Short Depth Supermicro Server X9SCL-F XEON E3-1270 V2 16GB NIC Rails | $236 | -| Mellanox ConnectX-2 PCIe x8 10Gbe SFP+ network card | $23 | - -which gave me everything I needed **and** wanted! - -# Build -First I free one of my HDDs from my RockPro64 NAS for use in my new pool. -This means I am running on a single HDD for the remainder of the migration. - -With the free HDD, and my two spares, -I get everything assembled, and set up a new Proxmox node with a ZFS pool -from the UI using the 3 disks. - - - -# Sync -To migrate all of my data from the old pool to the new pool I use -[`syncoid`](https://github.com/jimsalterjrs/sanoid/tree/master?tab=readme-ov-file#syncoid). -It uses ZFS snapshots to accomplish this. It's awesome. - -This takes many hours depending on the size of your pool and your connection, -but since I saw almost full utilization of my network link -I was convinced it's the best I can do right now. - -I've seen in a few Reddit posts suggesting ways this can be optimized using -some combination of `zfs send` with `mbuffer` rather than `ssh` which -`syncoid` uses, but I'm happy with the convenience of `syncoid`. - -The best part is that everything can still be running while this is going on! -This is because only the first sync takes a long time since it needs to copy -*everything* over. All subsequent syncs only transfer the delta -since the last sync which should be pretty quick if your data does not change -all that much. - -That being said, since I am now running on a single drive, and hitting it hard during -sync, I do not want to stay in this state for any longer than I need to due to -potentially leading my single disk to failure. - -Once the sync is complete, I do a second sync (for the delta), and promptly -shut down all of my services to prepare for the cut-over. - -# Cockpit -Before I can re-enable my services. I need to expose my datasets on Cockpit. - -I create a Debian LXC, and assign the generated MAC a static IP on my network. -Other than that, I just make sure my container has the NFS feature enabled: - - - -Setting up user permissions is a pain, but once done -I expose the relevant NFS as well as Samba paths for my services - -replicating my old NAS's shared paths. - -# Voila -In my homelab nameserver, I update the A record -for my NAS to point to the new IP of my Cockpit LXC container, -and start my services back up. - -I confirm everything is still good by turning off the old NAS, and yep still good. - -Luckily for me all good on the first try! - -# Finishing touches -I set up a cron on my old NAS to sync data nightly from the new pool. -This will only work while the actual data size on my new pool is less than 4TB, -so I'll need to get a new drive with higher capacity to keep the backups going -in the future. - -Luckily I should have about a year until I exceed 4TB on the new pool so I'll be keeping -an eye on deals to snag an 8TB backup drive along with a few spares for my new NAS. - -# Resources -- https://www.apalrd.net/posts/2023/ultimate_nas/ -- https://blog.kye.dev/proxmox-cockpit diff --git a/content/post/nas-upgrade/nas-chassis.png b/content/post/nas-upgrade/nas-chassis.png Binary files differdeleted file mode 100644 index 5d70b60..0000000 --- a/content/post/nas-upgrade/nas-chassis.png +++ /dev/null diff --git a/content/post/nas-upgrade/oldnas.png b/content/post/nas-upgrade/oldnas.png Binary files differdeleted file mode 100644 index 15ad609..0000000 --- a/content/post/nas-upgrade/oldnas.png +++ /dev/null diff --git a/content/post/nas-upgrade/zfs-pool.png b/content/post/nas-upgrade/zfs-pool.png Binary files differdeleted file mode 100644 index ecf9605..0000000 --- a/content/post/nas-upgrade/zfs-pool.png +++ /dev/null diff --git a/content/post/nixos-p1/boot.png b/content/post/nixos-p1/boot.png Binary files differdeleted file mode 100644 index 4e3d972..0000000 --- a/content/post/nixos-p1/boot.png +++ /dev/null diff --git a/content/post/nixos-p1/dwl.png b/content/post/nixos-p1/dwl.png Binary files differdeleted file mode 100644 index 8ecbe4d..0000000 --- a/content/post/nixos-p1/dwl.png +++ /dev/null diff --git a/content/post/nixos-p1/fox.jpg b/content/post/nixos-p1/fox.jpg Binary files differdeleted file mode 100644 index 3ace57f..0000000 --- a/content/post/nixos-p1/fox.jpg +++ /dev/null diff --git a/content/post/nixos-p1/index.md b/content/post/nixos-p1/index.md deleted file mode 100644 index 920ca94..0000000 --- a/content/post/nixos-p1/index.md +++ /dev/null @@ -1,385 +0,0 @@ -+++ -author = "Kumar Damani" -title = "Adventures in NixOS - Part 1" -date = "2023-03-24" -draft = false -description = "Guide to getting started with NixOS the modern way." -tags = [ - "technology" -] -+++ - -Almost a guide to getting started with NixOS the modern (2023) way. -<!--more--> - -There seems to be a shortage of written guides on the Internet for setting up NixOS -the "modern" way - Flakes + Home Manager. It doesn't help that Nix's official -docs are very disjointed so hopefully this will fill in some gaps that I observed -when setting it all up. - - - -> Warning: NixOS is not exactly beginner friendly - -you should have familiarity installing Linux distros before trying this. - -## But Why NixOS? -Eh... FOMO regarding all the [memes](https://www.google.com/search?q=nixos+memes&tbm=isch). - -There is one particular feature that is intriguing - -the ability to roll-back your entire system (not incl. BIOS) in case of a -misconfiguration or a broken update. **You can't do this with Ansible.** -This allows you (in theory) to get the benefits of a rolling release as well as the -stability benefits of a traditional distro. - -> It takes the idea of reproducible builds, and extends it to the OS. - -For example, NixOS will present you with all previous "builds" at boot time -for you to revert to in case something gets messed up. - - -## Things I want to explore as part of this exercise: -1. How hard is it to go from a minimal install to productive? -At minimum I need a graphical environment with working vol, mic, camera, wifi, -and hibernation. -Is it harder than doing the same in something like Manjaro? -2. Is Wayland truly ready? -3. Try out [`dwl`](https://github.com/djpohly/dwl) (the Wayland port of `dwm` by the [suckless](https://suckless.org) folks) - -## Constraints -1. I want to stick to the "Nix" way of doing things as much as possible -*where it makes sense to me*. -2. Stick to Wayland only applications as much as possible. - -## Spoilers! (End result) - -(Probably too ugly for r/unixporn, but works for me :) - -## Installation -### Getting a Live USB going -* I used the [minimal iso](https://nixos.org/download.html#nixos-iso). -* Create a bootable USB with the usual - `sudo dd if=/path/to/iso of=/dev/sdX bs=4M`. -* Boot up. -* Then start following the steps for [manual installation](https://nixos.org/manual/nixos/stable/index.html#sec-installation-manual) -from the official guide to complete the install. - -> Make sure to give SWAP as much space as your memory capacity for hibernation to work properly. - -> Wifi did not work for me out of the box. So I used my phone to tether via USB. - -## First boot -If everything went well, you should be presented with a TTY prompting you to login: -``` -NixOS ... -Login: <your username> -Password: <your password> -``` -Once you login, you will still just have a TTY, but we can now go ahead and start -installing our graphical environment. - -## Housekeeping -* You should have two NixOS config files in `/etc/nixos/`: -``` -configuration.nix -hardware-configuration.nix -``` - -* Edit the `configuration.nix` file by setting the correct values for hostname, networking, timezone and users. I also add a few basic system-wide packages here such as `git, rsync, neovim, htop` etc. - -* To *apply and use* your changes to any of these files you need to run: -```bash -sudo nixos-rebuild switch -``` -* Since we want all our configuration to be version controlled, -I copied these files to live under my user's config: -`~/.config/{nix, nixpkgs}/`: -```bash -cp /etc/nix/nix.conf ~/.config/nix/nix.conf -cp /etc/nixos/configuration.nix ~/.config/nixpkgs/configuration.nix -``` - -Nix will now use these user-specific files to read its config :) - -### Flakes Support -Nix (the pkg mgr) does not come with Flakes support out-of-the-box. -So we need to enable it: -1. In `~/.config/nix/nix.conf` add: -``` -experimental-features = nix-command flakes -``` - -2. Apply it: -```bash -sudo nixos-rebuild switch -``` -Read about [Flakes](https://nixos.wiki/wiki/Flakes). - -### Home Manager Support -Now we can install the Home-Manager flake. -1. Init our base flake: -```bash -cd ~/.config/nixpkgs -nix flake init -``` -This should generate two files: -``` -flake.nix -flake.lock -``` -2. Next we tell `flake.nix` to manage all our configuration (system + home) for our system: -```nix -{ - description = "NixOS configuration"; - - inputs = { - nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; - home-manager.url = "github:nix-community/home-manager"; - home-manager.inputs.nixpkgs.follows = "nixpkgs"; - nixos-hardware.url = "github:NixOS/nixos-hardware/master"; - }; - - outputs = inputs@{ nixpkgs, home-manager, nixos-hardware, ... }: { - nixosConfigurations = { - # Change below to use your hostname from configuration.nix - "art-sr" = nixpkgs.lib.nixosSystem { - system = "x86_64-linux"; - modules = [ - ./configuration.nix - nixos-hardware.nixosModules.framework - home-manager.nixosModules.home-manager - { - home-manager.useGlobalPkgs = true; - home-manager.useUserPackages = true; - # Change below to use your username from configuration.nix - home-manager.users.kdam0 = import ./home.nix; - - # Optionally, use home-manager.extraSpecialArgs to pass - # arguments to home.nix - } - ]; - }; - }; - }; -} -``` ->"art-sr" is my hostname for this machine. - -In my case, I also have the following two lines specifically to load settings for my hardware: -``` - nixos-hardware.url = "github:NixOS/nixos-hardware/master"; - ... - nixos-hardware.nixosModules.framework -``` -you will need to modify these values based on your [hardware support](https://github.com/NixOS/nixos-hardware). - -3. Create a `~/.config/nixpkgs/home.nix` file with your values: -```nix -{ config, pkgs, ...}: -{ - home.username = "kdam0"; - home.homeDirectory = "/home/kdam0"; - - programs.home-manager.enable = true; - home.stateVersion = "22.11"; - - services.gpg-agent = { - enable = true; - defaultCacheTtl = 1800; - enableSshSupport = true; - }; -} -``` - -4. Apply: -```bash -sudo nixos-rebuild switch -``` -> It took a few attempts to get NixOS to re-build successfully. -I ran into a few different issues involving users, and hostnames -while following the official docs until I arrived at the configs above which worked. - -Read about [Home Manager flake](https://nix-community.github.io/home-manager/index.html#ch-nix-flakes). - -**This would be a good time init a git repo in `~/.config/nixpkgs/` and publish your progress.** - -## Setting up the GUI -### Window Manager + bar + system info. -Getting `dwl` is easy enough. In my `home.nix`: -``` - home.packages = [ - pkgs.dwl - ... - ]; -``` -This will install `dwl` on a rebuild. -Then I can run it with `dwl`. - -Oh it fails...something about permissions... -In `~/.config/nixpkgs/configuration.nix` make sure you have: -``` - security.polkit.enable = true; -``` - -Oh it fails again with GLE errors :( Add: -``` - hardware.opengl = { - enable = true; - driSupport = true; - }; -``` - -**Sweet now it launches!** - -But of course I need to configure the keys - that's the whole point of a WM. -Additionally, `dwl` requires a re-build on every config change... - -**How do I tell Nix to use my config file while installing/building `dwl`?** - -Lucking all packages (`pkgs.*`) build files are defined on their GitHub. -We can see that we are allowed to pass in a `conf` argument to -[this](https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/window-managers/dwl/default.nix) -file. - -After a bit of digging around, I arrived at how to do it: - -1. First copy your `config.h` to `~/.config/nixpkgs/dwl/config.h`. -2. Then point to it in your `home.nix`: -``` - home.packages = [ - (pkgs.dwl.override { - # trying to supply config.home.homeDirectory here leads to "impure" usage. - # so disabling it for now. - # conf = (builtins.readFile "${config.home.homeDirectory}/.config/dwl/config.h"); - conf = ./dwl/config.h; - }) - ... - ]; -``` - -> I know I can just clone the source myself and build it, but I like to use the default -package manager whenever possible to manage packages. - -Of course since `dwl` is as minimal as it gets, it does not ship with a bar. -We have many options for which bar to use, -I have very little use for a bar, so I kept it very simple and went with `somebar`: -``` - home.packages = [ - ... - pkgs.somebar - ... - ]; -``` - -If you want status info on your bar you can use something like `someblocks` - which will -let you script simple scripts with text output you want displayed in each block. -This will need to be cloned and built manually as it is not available in the Nix repos. - -Oh but you probably don't have `make` or any requirements to actually build it...fear not: -```bash -nix-shell -p gnumake -``` -which put you in a temporary environment with all the common build tools available. -Now you can: -```bash -sudo make install -``` - -`wbg` is a simple background setter for Wayland......aaaand BAM! - - - -### Terminal -I use [`foot`](https://codeberg.org/dnkl/foot). - -Create the config file in `~/.config/nixpkgs/foot/foot.ini`: -``` -# for transparency # -[colors] -alpha=0.7 -``` - -Use it in `home.nix`: -``` - home.file.".config/foot/foot.ini".source = ../../common/foot/foot.ini; -``` - -> I use this pattern for pretty much all my *dotfiles*: -``` - # script that sets a bg. - home.file."bg.sh".source = common/bg.sh; - # script that starts my gui env. - home.file."start.sh".source = common/start.sh; - # foot config - home.file.".config/foot/foot.ini".source = common/foot/foot.ini; - # wofi config (app launcher) - home.file.".config/wofi/style.css".source = common/wofi/style.css; - # mako config (notifications) - home.file.".config/mako/config".source = common/mako/config; -``` - -### Sound -In my `configuration.nix`: -``` - security.rtkit.enable = true; - services.pipewire = { - enable = true; - alsa.enable = true; - alsa.support32Bit = true; - pulse.enable = true; - wireplumber.enable = true; - media-session.enable = false; - jack.enable = true; - systemWide = false; - }; -``` - -### Nextcloud -I want a purely CLI way to handle this, and a periodic sync is sufficient for me. -We do this with `systemd-timers` (Nix advises against `cron`). -In my `home.nix`: -``` - systemd.user.services = { - nextcloud-sync = { - Unit = { - Description = "Auto sync Nextcloud"; - After = "network-online.target"; - }; - Service = { - Type = "simple"; - EnvironmentFile = "${config.home.homeDirectory}/.nextcloud.env"; - ExecStart = '' - ${pkgs.nextcloud-client}/bin/nextcloudcmd \ - -h --non-interactive \ - --user "''${NEXTCLOUD_USER}" \ - --password "''${NEXTCLOUD_PASSWORD}" \ - ''${NEXTCLOUD_DIR} \ - ''${NEXTCLOUD_URL} - ''; - TimeoutStopSec = "180"; - KillMode = "process"; - KillSignal = "SIGINT"; - }; - Install.WantedBy = ["multi-user.target"]; - }; - }; - systemd.user.timers = { - nextcloud-sync = { - Unit.Description = "Automatic sync files with Nextcloud when booted up after 5 minutes then rerun every 10 minutes"; - Timer.OnUnitActiveSec = "10min"; - Install.WantedBy = ["multi-user.target" "timers.target"]; - }; - }; - systemd.user.startServices = true; -``` - -## Conclusions -1. Yes setting things up from a minimal iso is harder than in Manjaro. -Although I got everything I wanted working, there were many times I felt -like giving up. (Aside: I am *so grateful* for Manjaro, and Arch wikis). -That said, I expect this friction is a one-time cost for building familiarity with Nix, -and well worth the benefits that come with it. -2. You bet Wayland is ready. Multi-monitor works out-of-the-box, -all my apps support it, and things just *feel* more polished than I have ever felt with Xorg. -3. `dwl` is as awesome as I had hoped! This is my daily driver now. - -## My configs -All the configs discussed (and more) are in my [nixdotfiles repo](https://gitlab.com/kdam0/dotfiles-nix). diff --git a/content/post/nixos-p1/rice.png b/content/post/nixos-p1/rice.png Binary files differdeleted file mode 100644 index 4fd97cf..0000000 --- a/content/post/nixos-p1/rice.png +++ /dev/null diff --git a/content/post/programming-as-art/code.png b/content/post/programming-as-art/code.png Binary files differdeleted file mode 100644 index 30c3522..0000000 --- a/content/post/programming-as-art/code.png +++ /dev/null diff --git a/content/post/programming-as-art/index.md b/content/post/programming-as-art/index.md deleted file mode 100644 index c724e68..0000000 --- a/content/post/programming-as-art/index.md +++ /dev/null @@ -1,94 +0,0 @@ -+++ -author = "Kumar Damani" -title = "Romanticism in Programming" -date = "2022-11-29" -draft = false -description = "How programming is romantic." -tags = [ - "personal" -] -math = true -+++ - -Why there is art in programming. -<!--more--> - -During my early days as a CS student, one of the first mind-blowing moments was -watching `Hello World!` getting printed out to the console thousands of times -in just two functional lines of code. - -```python -for _ in range(1, 1001): - print("Hello World!") -``` - -At the time it felt like having the [Elder Wand](https://harry-potter-compendium.fandom.com/wiki/Elder_Wand). - - -But there was more to our lesson. -The TA then asks us to put our newly found power to use by computing the -sum of 1 to 100. Of course, it was a natural application of what we had just done earlier: - -```python -sum = 0 -for i in range(1, 100+1): - sum = sum + i -``` - -Sure enough we saw the answer `5050` in the console. -But then the TA reminds us that we are making our computers **work too hard**. -In other words, the computer needs to do one-hundred ADD instructions in order to make this computation happen. - -What if the number was a million? How well would our method scale? - -Well then it would take a million ADD instructions. -We call this scaling *linearly* with the input size. -Later we would formalize this to $\mathcal{O}(n)$ (pronounced: *Big Oh of N*). - -The TA hinted that there is a better way, and that we already know of the better way in math. - - - -$\displaystyle S_n = \sum\limits_{i=1}^n i = 1 + 2 + ... + n = \frac{n (n + 1)}{2}$ - -With this we are no longer using loops, but a known mathematical fact about sequences. -If you don't belive me, see the [proof](https://letstalkscience.ca/educational-resources/backgrounders/gauss-summation). - -Written as code: -```python -sum = n (n + 1) / 2 -``` -This one-liner solves our problem with just 3 (ADD, MULTIPLY, DIVIDE) instructions. -Crucially, it does not depend on the size of the input like our previous solution, thus -**no matter the input, it always takes 3 instructions to compute!** -This is a HUGE win! - - - -Later we would formalize this to $\mathcal{O}(1)$, or *constant* scaling. - -> Yes, yes I know IRL the complier would optimize the loop solution -such that it does not take N instructions but for the purposes of -learning we were not allowed to depend on that. - -Looking back at it now, -both solutions are equally correct, and modern compilers would optimize the first solution -in the final instructions sent to the cpu, such that any performance differences would be negligible. -In other words, the computer wouldn't acutally be *working so hard*. - -Objectively, the first solution is more readable, and friendly to a new observer than the second. - -*Why then am I still so drawn to the second solution?* - -The first solution reminds me of the saying "to a hammer, eveything looks like a nail". -Its a brute force approach. -In comparison, the second solution is using the exact tool for our particular problem. -It somehow feels personalized and dare I say *romantic*. - -When I reflect on moments like this, it reminds me that there is emergent elegance and beauty -even in the seemingly arbitrary sequence of symbols that is `code`. - - -Programming is not quite as *objective* as people would have you believe. -There are trade-offs to each solution, and which solution you prefer relect on the trade-offs -you are willing to accept, which varies by the observer: much like *art*. diff --git a/content/post/programming-as-art/math.png b/content/post/programming-as-art/math.png Binary files differdeleted file mode 100644 index bbdc372..0000000 --- a/content/post/programming-as-art/math.png +++ /dev/null diff --git a/content/post/programming-as-art/teaching.png b/content/post/programming-as-art/teaching.png Binary files differdeleted file mode 100644 index 9bf5dce..0000000 --- a/content/post/programming-as-art/teaching.png +++ /dev/null diff --git a/content/post/programming-as-art/wand.png b/content/post/programming-as-art/wand.png Binary files differdeleted file mode 100644 index 5eefc9c..0000000 --- a/content/post/programming-as-art/wand.png +++ /dev/null diff --git a/content/post/programs/dwl.png b/content/post/programs/dwl.png Binary files differdeleted file mode 100644 index 8ecbe4d..0000000 --- a/content/post/programs/dwl.png +++ /dev/null diff --git a/content/post/programs/index.md b/content/post/programs/index.md deleted file mode 100644 index 691b90f..0000000 --- a/content/post/programs/index.md +++ /dev/null @@ -1,92 +0,0 @@ -+++ -author = "Kumar Damani" -title = "Programs and Equipment" -date = "2021-11-12" -description = "Overview for the programs and equipment I use day-to-day." -tags = [ - "personal", - "tech", -] -+++ - -The programs and equipment I use on a daily basis. -<!--more--> - -# Programs and Equipment I Use -I'm about getting things done quickly and having as little latency between -my thoughts and actions on the computer. - -I like having vim-like bindings and prefer running programs in the terminal for simplicity's sake. -That said, I'm very much against the cringe meme that things in the terminal are "cooler" or "nerdier" XD. -Terminals are good for most tasks, but useless for others, for example, browsing the web -(I admit this unfortunate fact with much consternation) or looking at maps. - -## Software I Use - -### OS Distribution -[NixOS](https://nixos.org/). NixOS is an immutable OS where you are only allowed to modify the system -via declarative config files. - -I've distro-hopped between Manjaro, Void, Debian, and Fedora, but since NixOS -this has largely stopped as I'm quite happy with my NixOS + Home Manager setup. -I did like Debian, and Fedora as well. - -You can find my configs [here](https://gitlab.com/kdam0/dotfiles-nix). -There is a dedicated [post]({{< ref "/post/nixos-p1" >}}) about this. - - -### Desktop Environment -I've settled on [DWL](https://github.com/djpohly/dwl) after many years of hopping. -Its clean, functional, and extremely light. - -Prior to this, I've used Bsmpw + Sxhkd, i3, Gnome, KDE Plasma etc. -I'm glad these exist and people get use out of it, but for now I do not miss it. - - - -### Text Editor -[(neo)vim](https://neovim.io/). Less of a text editor and more of a lifestyle. Check out my dotfiles for this. -No, I'm not going to ever switch to emacs. - - - -### Web Browser -[Firefox](https://www.mozilla.org/en-US/firefox/features/) / -[Brave](https://brave.com) / -[Vivaldi](https://vivaldi.com). -I have tried, Chromium, Qutebrowser in the past. - -### File Manager -[ranger](https://github.com/ranger/ranger). Yes, I've tried `nnn` and others. -Yes I know its not the fastest, but something about Ranger makes me keep coming back to it :shrug:. - - - -## Where can I find good software options? -The program of your dreams is probably listed below: -* The [suckless](https://suckless.org/rocks/) website's list of programs that "rock". -Generally minimalist programs. -* A more comprehensive [list](https://github.com/mayfrost/guides/blob/master/ALTERNATIVES.md) -of minimalist software. -* [FSF's Free Software Directory](https://directory.fsf.org/wiki/Main_Page). - Emphasis on libre software (although most software in the links above will have free licenses as well). -* [Gentoo Wiki Recommendations](https://wiki.installgentoo.com/index.php/List_of_recommended_GNU/Linux_software) - A good mix of programs for novices and advanced users. - -## Hardware I Use - -### Laptop -~~The main laptop I use is the [Framework laptop](https://frame.work/). -I'm a huge fan of the whole upgradability concept coming from a few generations of ThinkPads.~~ - -I've since re-purposed this laptop to be [something else]({{< ref "/post/framework-server" >}}). - -## What I don't use -Proprietary software. - -I'm not going to endorse proprietary services that have gone out of their way to spy on or politically -suppress their users, just as Facebook, Discord etc. -One of the many take-aways you should get from me is that the use of libre/free software, -by its nature, is more constructive and extensible; and **that's the point**. - -There are philosophical reasons for this I talk about [here]({{< ref "/post/self-host" >}}). diff --git a/content/post/self-host/6imv05.jpg b/content/post/self-host/6imv05.jpg Binary files differdeleted file mode 100644 index d042d7a..0000000 --- a/content/post/self-host/6imv05.jpg +++ /dev/null diff --git a/content/post/self-host/elections.jpg b/content/post/self-host/elections.jpg Binary files differdeleted file mode 100644 index ac4ac96..0000000 --- a/content/post/self-host/elections.jpg +++ /dev/null diff --git a/content/post/self-host/freedom.jpg b/content/post/self-host/freedom.jpg Binary files differdeleted file mode 100644 index d62048a..0000000 --- a/content/post/self-host/freedom.jpg +++ /dev/null diff --git a/content/post/self-host/index.md b/content/post/self-host/index.md deleted file mode 100644 index 238186a..0000000 --- a/content/post/self-host/index.md +++ /dev/null @@ -1,125 +0,0 @@ -+++ -author = "Kumar Damani" -title = "Why do I self-host?" -date = "2022-09-12" -description = "Overview of why I self-host." -tags = [ - "personal", - "tech", -] -+++ - -My reasons for self-hosting. -<!--more--> - -## Digital freedom/independence - - - -To put it simply, if you use a service such as Lastpass, iCloud, Dropbox, GDrive, OneDrive, etc. -to store your data, **you do not own it**. - -You are *trusting* corp. X to store it, secure it, and make it available to you. -Beyond the obvious privacy pitfalls with this, there are many other things that -could go wrong with your data being stored this way: - -* Corp. X could vanish/close/"declare bankruptcy" (as with many crypto corps. lately), and you lose your data. -* Corp. X could make a policy change and lock you out from accessing your account. -* Or you could "forget" to pay the bills a few times and get locked out. -* Corp. X could get hacked, and your data gets stolen. This is the latest trend! -* Many other doomsday 💀 scenarios. - -Personally, I don't feel comfortable depending on the existence of corp. X *for data that is important to - me* i.e. a lifetime's worth of documents, memories, and passwords etc. -I 💤 much better at night knowing I am avoiding most if not all of the risks above. - - -## Privacy -Normies often ask me some variation of: -* Why do I care if corp. X has my data? I have nothing to hide! -* Since I'm aware of targeted advertising, it won't work on me, - so why should I care if corp. X has my data? - -{{< figure src="why.jpg" alt="my pic" width="75%" >}} - -To such questions, I follow-up with: -> **Do you want to contribute to a dystopian ([Orwellian](https://en.wikipedia.org/wiki/Orwellian) future?** - -{{< figure src="police.jpg" alt="thought police" width="75%" >}} - -If your answer is *yes*, then no need to read further, the following will not change your mind. - -If your answer is *no*, but you aren't convinced that/how these are related, -then the *argument goes something like this...* -* We live in a world of mass data-collection/surveillance. -* This enables corp. X to use techniques such as ML (Machine Learning) to build/train models (or "AI" - - Artificial Intelligence)that aim to predict human behaviour. -* That by itself is not a problem here. -* The problems arise when corp. X use these techniques for profit without - regard for the harm they cause at a *population level*. - -I have unfortunately lived through enough of these cases to be able to cite a few recent examples: -* Instagram (etc.) designs its apps/products optimizing for maximum <cite> addiction[^1]</cite>. - Think slot-machines. - You might think you are "too smart" to fall for these tricks, and you might be right, - but what about the millions of adolescents using these platforms who aren't as wise as you? - The data collected, and techniques developed from *your usage* enables platforms - to target not only you, but *all* users on the platform, including the most vulnerable. - - Unfortunately, many of these kids will end up suffering from mental-health, - body-image, self-esteem <cite>issues[^2]</cite>, - and for some it **will be fatal**. - I do not think this is morally acceptable, and is primary reason I refuse - to participate in social-media platforms. - -  - [^1]: [Smartphones and dopamine](https://sitn.hms.harvard.edu/flash/2018/dopamine-smartphones-battle-time/) - [^2]: [Mental health and social media](https://onlinedegrees.unr.edu/online-master-of-public-health/impact-of-social-media-on-youth-mental-health/) - -You could say "well that's due to bad parenting", but the point remains that -more and more of the digital world is having <em>real world</em> negative consequences regardless of -your individual participation level. Another example: - -* By now its well known that Facebook's (etc.) targeted advertising - played a significant a role in the 2016 US <cite>Elections[^3]</cite>. - Facebook was able to do this thanks to its users voluntarily giving personal information for two decades. - However, the policies that come out of this election has real world consequences to millions - (if not billions) of people, regardless of their *individual* Facebook usage, which - undermines the very purpose of a democratic republic. - Regardless of your political affiliation, it should worry you that this *can* happen. - -  - [^3]: [Excerpt from Facebook ex-exec](https://www.theverge.com/2017/12/11/16761016/former-facebook-exec-ripping-apart-society) - -To summarize, it might not be a problem if individuals disregard their -privacy at the individual level, but in aggregate, a <em>population-wide</em> disregard -has dystopian consequences. - -So the question you have to ask yourself is: -> **What can I do?** - -Start by **valuing your privacy**. -Then, follow some of these tips to *say no...* -* **Limit your exposure to these services.** If a friend stops talking to you because - of this, then congratulations, you've just gotten rid of a fake friend. You're welcome. -* [Self-host](https://wiki.r-selfhosted.com/getting-started/what-is-self-hosting/) - as much as you can. - You can see how I [implement](https://gitlab.com/kdam0/vps) this and replicate it yourself, - though it is a bit involved for normies. -* If neither of the above work for you, then you'll need to do some research to - find an alternative source that you can trust isn't doing the same thing. - Use [this](https://github.com/awesome-selfhosted/awesome-selfhosted) - as a starting point and try to search (Ctrl+f) for your service. For eg. Twitter, and - Instagram both have popular options available. -* **Stop using Chrome.** If you must use it, use [Brave](https://brave.com/) instead. - I advocate for [Firefox](https://www.mozilla.org/en-US/firefox/new/?redirect_source=firefox-com). - Neither are perfect, but both offer privacy respecting options in their settings. - Specifically disabling cross-site tracking is important. - Beyond that, install an ad-blocker extension such as [UBlock Origin](https://ublockorigin.com/) - on both of them. Don't forget to do the same on your mobile device! -* Things get more complicated on cell-phones. - I suggest switching to a privacy respecting operating-system such as [GrapheneOS](https://grapheneos.org/) - Short of this, you can only limit your usage. -* Support government policies that respect user-privacy. - -{{< figure src="office.png" alt="office pic" width="75%" >}} diff --git a/content/post/self-host/office.png b/content/post/self-host/office.png Binary files differdeleted file mode 100644 index 9cff3ce..0000000 --- a/content/post/self-host/office.png +++ /dev/null diff --git a/content/post/self-host/police.jpg b/content/post/self-host/police.jpg Binary files differdeleted file mode 100644 index dde2b44..0000000 --- a/content/post/self-host/police.jpg +++ /dev/null diff --git a/content/post/self-host/why.jpg b/content/post/self-host/why.jpg Binary files differdeleted file mode 100644 index eda5402..0000000 --- a/content/post/self-host/why.jpg +++ /dev/null diff --git a/deploy.sh b/deploy.sh deleted file mode 100755 index 6364e94..0000000 --- a/deploy.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash -# more like build + deploy -hugo -source .env -AWS_CONFIG_FILE=credentials aws --endpoint-url ${AWS_ENDPOINT} s3 cp ${AWS_LOCAL_DIR} s3://${AWS_BUCKET_NAME}/${AWS_UPLOAD_DIR} --recursive diff --git a/flake.lock b/flake.lock deleted file mode 100644 index 3c8db2b..0000000 --- a/flake.lock +++ /dev/null @@ -1,471 +0,0 @@ -{ - "nodes": { - "cachix": { - "inputs": { - "devenv": "devenv_2", - "flake-compat": [ - "devenv", - "flake-compat" - ], - "nixpkgs": [ - "devenv", - "nixpkgs" - ], - "pre-commit-hooks": [ - "devenv", - "pre-commit-hooks" - ] - }, - "locked": { - "lastModified": 1712055811, - "narHash": "sha256-7FcfMm5A/f02yyzuavJe06zLa9hcMHsagE28ADcmQvk=", - "owner": "cachix", - "repo": "cachix", - "rev": "02e38da89851ec7fec3356a5c04bc8349cae0e30", - "type": "github" - }, - "original": { - "owner": "cachix", - "repo": "cachix", - "type": "github" - } - }, - "devenv": { - "inputs": { - "cachix": "cachix", - "flake-compat": "flake-compat_2", - "nix": "nix_2", - "nixpkgs": "nixpkgs_2", - "pre-commit-hooks": "pre-commit-hooks" - }, - "locked": { - "lastModified": 1720450778, - "narHash": "sha256-H4CcD1ZeaHTluZNbFMN6d4L1peG5LzJTp2bJKShkjGc=", - "owner": "cachix", - "repo": "devenv", - "rev": "c5cab22d9750a9aa88aa0946849903fb619be954", - "type": "github" - }, - "original": { - "owner": "cachix", - "repo": "devenv", - "type": "github" - } - }, - "devenv_2": { - "inputs": { - "flake-compat": [ - "devenv", - "cachix", - "flake-compat" - ], - "nix": "nix", - "nixpkgs": "nixpkgs", - "poetry2nix": "poetry2nix", - "pre-commit-hooks": [ - "devenv", - "cachix", - "pre-commit-hooks" - ] - }, - "locked": { - "lastModified": 1708704632, - "narHash": "sha256-w+dOIW60FKMaHI1q5714CSibk99JfYxm0CzTinYWr+Q=", - "owner": "cachix", - "repo": "devenv", - "rev": "2ee4450b0f4b95a1b90f2eb5ffea98b90e48c196", - "type": "github" - }, - "original": { - "owner": "cachix", - "ref": "python-rewrite", - "repo": "devenv", - "type": "github" - } - }, - "flake-compat": { - "flake": false, - "locked": { - "lastModified": 1673956053, - "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", - "type": "github" - }, - "original": { - "owner": "edolstra", - "repo": "flake-compat", - "type": "github" - } - }, - "flake-compat_2": { - "flake": false, - "locked": { - "lastModified": 1696426674, - "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", - "type": "github" - }, - "original": { - "owner": "edolstra", - "repo": "flake-compat", - "type": "github" - } - }, - "flake-parts": { - "inputs": { - "nixpkgs-lib": "nixpkgs-lib" - }, - "locked": { - "lastModified": 1719994518, - "narHash": "sha256-pQMhCCHyQGRzdfAkdJ4cIWiw+JNuWsTX7f0ZYSyz0VY=", - "owner": "hercules-ci", - "repo": "flake-parts", - "rev": "9227223f6d922fee3c7b190b2cc238a99527bbb7", - "type": "github" - }, - "original": { - "id": "flake-parts", - "type": "indirect" - } - }, - "flake-utils": { - "inputs": { - "systems": "systems" - }, - "locked": { - "lastModified": 1689068808, - "narHash": "sha256-6ixXo3wt24N/melDWjq70UuHQLxGV8jZvooRanIHXw0=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "919d646de7be200f3bf08cb76ae1f09402b6f9b4", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, - "flake-utils_2": { - "inputs": { - "systems": "systems_2" - }, - "locked": { - "lastModified": 1710146030, - "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, - "gitignore": { - "inputs": { - "nixpkgs": [ - "devenv", - "pre-commit-hooks", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1709087332, - "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", - "owner": "hercules-ci", - "repo": "gitignore.nix", - "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "gitignore.nix", - "type": "github" - } - }, - "nix": { - "inputs": { - "flake-compat": "flake-compat", - "nixpkgs": [ - "devenv", - "cachix", - "devenv", - "nixpkgs" - ], - "nixpkgs-regression": "nixpkgs-regression" - }, - "locked": { - "lastModified": 1712911606, - "narHash": "sha256-BGvBhepCufsjcUkXnEEXhEVjwdJAwPglCC2+bInc794=", - "owner": "domenkozar", - "repo": "nix", - "rev": "b24a9318ea3f3600c1e24b4a00691ee912d4de12", - "type": "github" - }, - "original": { - "owner": "domenkozar", - "ref": "devenv-2.21", - "repo": "nix", - "type": "github" - } - }, - "nix-github-actions": { - "inputs": { - "nixpkgs": [ - "devenv", - "cachix", - "devenv", - "poetry2nix", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1688870561, - "narHash": "sha256-4UYkifnPEw1nAzqqPOTL2MvWtm3sNGw1UTYTalkTcGY=", - "owner": "nix-community", - "repo": "nix-github-actions", - "rev": "165b1650b753316aa7f1787f3005a8d2da0f5301", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "nix-github-actions", - "type": "github" - } - }, - "nix_2": { - "inputs": { - "flake-compat": [ - "devenv", - "flake-compat" - ], - "nixpkgs": [ - "devenv", - "nixpkgs" - ], - "nixpkgs-regression": "nixpkgs-regression_2" - }, - "locked": { - "lastModified": 1712911606, - "narHash": "sha256-BGvBhepCufsjcUkXnEEXhEVjwdJAwPglCC2+bInc794=", - "owner": "domenkozar", - "repo": "nix", - "rev": "b24a9318ea3f3600c1e24b4a00691ee912d4de12", - "type": "github" - }, - "original": { - "owner": "domenkozar", - "ref": "devenv-2.21", - "repo": "nix", - "type": "github" - } - }, - "nixpkgs": { - "locked": { - "lastModified": 1692808169, - "narHash": "sha256-x9Opq06rIiwdwGeK2Ykj69dNc2IvUH1fY55Wm7atwrE=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "9201b5ff357e781bf014d0330d18555695df7ba8", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-lib": { - "locked": { - "lastModified": 1719876945, - "narHash": "sha256-Fm2rDDs86sHy0/1jxTOKB1118Q0O3Uc7EC0iXvXKpbI=", - "type": "tarball", - "url": "https://github.com/NixOS/nixpkgs/archive/5daf0514482af3f97abaefc78a6606365c9108e2.tar.gz" - }, - "original": { - "type": "tarball", - "url": "https://github.com/NixOS/nixpkgs/archive/5daf0514482af3f97abaefc78a6606365c9108e2.tar.gz" - } - }, - "nixpkgs-regression": { - "locked": { - "lastModified": 1643052045, - "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", - "type": "github" - } - }, - "nixpkgs-regression_2": { - "locked": { - "lastModified": 1643052045, - "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", - "type": "github" - } - }, - "nixpkgs-stable": { - "locked": { - "lastModified": 1710695816, - "narHash": "sha256-3Eh7fhEID17pv9ZxrPwCLfqXnYP006RKzSs0JptsN84=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "614b4613980a522ba49f0d194531beddbb7220d3", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-23.11", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_2": { - "locked": { - "lastModified": 1713361204, - "narHash": "sha256-TA6EDunWTkc5FvDCqU3W2T3SFn0gRZqh6D/hJnM02MM=", - "owner": "cachix", - "repo": "devenv-nixpkgs", - "rev": "285676e87ad9f0ca23d8714a6ab61e7e027020c6", - "type": "github" - }, - "original": { - "owner": "cachix", - "ref": "rolling", - "repo": "devenv-nixpkgs", - "type": "github" - } - }, - "nixpkgs_3": { - "locked": { - "lastModified": 1719957072, - "narHash": "sha256-gvFhEf5nszouwLAkT9nWsDzocUTqLWHuL++dvNjMp9I=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "7144d6241f02d171d25fba3edeaf15e0f2592105", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-23.11", - "repo": "nixpkgs", - "type": "github" - } - }, - "poetry2nix": { - "inputs": { - "flake-utils": "flake-utils", - "nix-github-actions": "nix-github-actions", - "nixpkgs": [ - "devenv", - "cachix", - "devenv", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1692876271, - "narHash": "sha256-IXfZEkI0Mal5y1jr6IRWMqK8GW2/f28xJenZIPQqkY0=", - "owner": "nix-community", - "repo": "poetry2nix", - "rev": "d5006be9c2c2417dafb2e2e5034d83fabd207ee3", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "poetry2nix", - "type": "github" - } - }, - "pre-commit-hooks": { - "inputs": { - "flake-compat": [ - "devenv", - "flake-compat" - ], - "flake-utils": "flake-utils_2", - "gitignore": "gitignore", - "nixpkgs": [ - "devenv", - "nixpkgs" - ], - "nixpkgs-stable": "nixpkgs-stable" - }, - "locked": { - "lastModified": 1713775815, - "narHash": "sha256-Wu9cdYTnGQQwtT20QQMg7jzkANKQjwBD9iccfGKkfls=", - "owner": "cachix", - "repo": "pre-commit-hooks.nix", - "rev": "2ac4dcbf55ed43f3be0bae15e181f08a57af24a4", - "type": "github" - }, - "original": { - "owner": "cachix", - "repo": "pre-commit-hooks.nix", - "type": "github" - } - }, - "root": { - "inputs": { - "devenv": "devenv", - "flake-parts": "flake-parts", - "nixpkgs": "nixpkgs_3" - } - }, - "systems": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - }, - "systems_2": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - } - }, - "root": "root", - "version": 7 -} diff --git a/flake.nix b/flake.nix deleted file mode 100644 index 0a5a069..0000000 --- a/flake.nix +++ /dev/null @@ -1,24 +0,0 @@ -{ - description = "My website project"; - - inputs = { - nixpkgs.url = "github:NixOS/nixpkgs/nixos-23.11"; - devenv.url = "github:cachix/devenv"; - }; - - outputs = inputs@{ flake-parts, nixpkgs, ... }: - flake-parts.lib.mkFlake { inherit inputs; } { - imports = [ - inputs.devenv.flakeModule - ]; - systems = nixpkgs.lib.systems.flakeExposed; - perSystem = { config, self', inputs', pkgs, system, ... }: { - devenv.shells.website = { - packages = [ pkgs.hugo pkgs.awscli ]; - enterShell = '' - echo this is my hugo website project shell. - ''; - }; - }; - }; -} diff --git a/hugo.toml b/hugo.toml deleted file mode 100644 index 8ab4448..0000000 --- a/hugo.toml +++ /dev/null @@ -1,94 +0,0 @@ -baseURL = 'https://kumardamani.net/' -languageCode = 'en-us' -title = 'Kumar Damani - Home' -theme = 'risotto' -paginate = 3 -enableEmoji = true -DefaultContentLanguage = "en" - -enableInlineShortcodes = true -# prevent build failures when using Hugo's Instagram shortcode due to deprecated Instagram API. -# See https://github.com/gohugoio/hugo/issues/7228#issuecomment-714490456 -ignoreErrors = ["error-remote-getjson"] -sectionPagesMenu = "main" - -[params] -noindex = false - -[params.theme] -palette = "tokyo-night-dark" -#palette = "base16-dark" - -# Sidebar: about/bio -[params.about] -title = "Links" -description = "Git, email, and resume" -logo_image = "images/rice.svg" - -[[params.socialLinks]] -icon = "fa-brands fa-gitlab" -title = "GitLab" -url = "https://gitlab.com/kdam0/" - -[[params.socialLinks]] -icon = "fa-solid fa-envelope" -title = "Email" -url = "mailto:me@kumardamani.net" - -[[params.socialLinks]] -icon = "fa-solid fa-file" -title = "Resume" -url = "/KumarDamaniCV.pdf" - -[menu] - - [[menu.main]] - identifier = "photos" - name = "Photos" - url = "https://nc.kumardamani.net/apps/memories/a/vSk9IAWVUx2vcqphL9nMnLFmDQBDZWPr" - weight = 10 - -[taxonomies] -category = "categories" -tag = "tags" -series = "series" - -# For hugo >= 0.60.0, enable inline HTML -[markup.goldmark.renderer] -unsafe = true - -[markup] - - # Table of contents - # Add toc = true to content front matter to enable - [markup.tableOfContents] - startLevel = 1 - endLevel = 4 - ordered = true - -[privacy] - - [privacy.vimeo] - disabled = false - simple = true - - [privacy.twitter] - disabled = false - enableDNT = true - simple = true - - [privacy.instagram] - disabled = false - simple = true - - [privacy.youtube] - disabled = false - privacyEnhanced = true - -[services] - - [services.instagram] - disableInlineCSS = true - - [services.twitter] - disableInlineCSS = true diff --git a/layouts/partials/head.html b/layouts/partials/head.html deleted file mode 100644 index 4c2061e..0000000 --- a/layouts/partials/head.html +++ /dev/null @@ -1,18 +0,0 @@ -<title>{{ with .Title }}{{ . }} – {{end}}{{ .Site.Title }}</title> -{{ with .Site.Params.about }}<meta name="description" content="{{ .description }}">{{ end }} - -<meta name="viewport" content="width=device-width, initial-scale=1"> -<meta charset="UTF-8"/> -{{ if .Site.Params.noindex }}<meta name="robots" content="noindex" /> {{ end }} -{{ if .Params.math }}{{ partial "helpers/katex.html" . }}{{ end }} - -<!-- FontAwesome <https://fontawesome.com/> --> -<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.2/css/all.min.css" integrity="sha512-1sCRPdkRXhBV2PBLUdRb4tMg1w2YPf37qatUFeS7zlBy7jJI8Lf4VHwWfZZfpXtYSLy85pkm9GaYVYMfw5BC1A==" crossorigin="anonymous" /> - -<!-- Academicons <https://jpswalsh.github.io/academicons/> --> -<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/academicons/1.9.1/css/academicons.min.css" integrity="sha512-b1ASx0WHgVFL5ZQhTgiPWX+68KjS38Jk87jg7pe+qC7q9YkEtFq0z7xCglv7qGIs/68d3mAp+StfC8WKC5SSAg==" crossorigin="anonymous" /> - -<!-- risotto theme --> -<link rel="stylesheet" href="{{ printf "css/palettes/%s.css" (.Site.Params.theme.palette | default "base16-dark") | absURL }}"> -<link rel="stylesheet" href="{{ "css/risotto.css" | absURL }}"> -<link rel="stylesheet" href="{{ "css/custom.css" | absURL }}"> diff --git a/layouts/partials/helpers/katex.html b/layouts/partials/helpers/katex.html deleted file mode 100644 index 26baa4a..0000000 --- a/layouts/partials/helpers/katex.html +++ /dev/null @@ -1,14 +0,0 @@ -<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.4/dist/katex.min.css" integrity="sha384-vKruj+a13U8yHIkAyGgK1J3ArTLzrFGBbBc0tDp4ad/EyewESeXE/Iv67Aj8gKZ0" crossorigin="anonymous"> -<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.4/dist/katex.min.js" integrity="sha384-PwRUT/YqbnEjkZO0zZxNqcxACrXe+j766U2amXcgMg5457rve2Y7I6ZJSm2A0mS4" crossorigin="anonymous"></script> -<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.4/dist/contrib/auto-render.min.js" integrity="sha384-+VBxd3r6XgURycqtZ117nYw44OOcIax56Z4dCRWbxyPt0Koah1uHoK0o4+/RRE05" crossorigin="anonymous" - onload="renderMathInElement(document.body);"></script> -<script> - document.addEventListener("DOMContentLoaded", function() { - renderMathInElement(document.body, { - delimiters: [ - {left: "$$", right: "$$", display: true}, - {left: "$", right: "$", display: false} - ] - }); - }); -</script> diff --git a/static/KumarDamaniCV.pdf b/static/KumarDamaniCV.pdf Binary files differdeleted file mode 100644 index 09c1c60..0000000 --- a/static/KumarDamaniCV.pdf +++ /dev/null diff --git a/static/btc.png b/static/btc.png Binary files differdeleted file mode 100644 index d076204..0000000 --- a/static/btc.png +++ /dev/null diff --git a/static/css/custom.css b/static/css/custom.css deleted file mode 100644 index 993305e..0000000 --- a/static/css/custom.css +++ /dev/null @@ -1,44 +0,0 @@ -@font-face { - font-family: "Zilla"; - src: url('../fonts/zilla/ZillaSlab-Regular.ttf') format('truetype'); - font-style: normal; - font-weight: normal; -} -@font-face { - font-family: "Zilla"; - src: url('../fonts/zilla/ZillaSlab-Italic.ttf') format('truetype'); - font-style: italic; - font-weight: normal; -} -@font-face { - font-family: "Zilla"; - src: url('../fonts/zilla/ZillaSlab-Bold.ttf') format('truetype'); - font-style: normal; - font-weight: bold; -} - -blockquote { - background: var(--inner-bg); - border-left: 4px solid var(--hover); - margin: 0 0 1.5rem 1.5rem; - padding: 0.5em 10px; - border-radius: 4px; -} - -blockquote > p { - font-style: normal; - color: var(--off-fg); - font-weight: normal; - font-family: "Zilla", serif; -} - -table { - border-collapse: collapse; - width: 100%; -} - -td { - border-top: 1px solid #ccc; - border-bottom: 1px solid #ccc; - padding: 0.6rem; -} diff --git a/static/fonts/zilla/ZillaSlab-Bold.ttf b/static/fonts/zilla/ZillaSlab-Bold.ttf Binary files differdeleted file mode 100644 index 41ef261..0000000 --- a/static/fonts/zilla/ZillaSlab-Bold.ttf +++ /dev/null diff --git a/static/fonts/zilla/ZillaSlab-BoldItalic.ttf b/static/fonts/zilla/ZillaSlab-BoldItalic.ttf Binary files differdeleted file mode 100644 index 2735488..0000000 --- a/static/fonts/zilla/ZillaSlab-BoldItalic.ttf +++ /dev/null diff --git a/static/fonts/zilla/ZillaSlab-Italic.ttf b/static/fonts/zilla/ZillaSlab-Italic.ttf Binary files differdeleted file mode 100644 index c0b99a8..0000000 --- a/static/fonts/zilla/ZillaSlab-Italic.ttf +++ /dev/null diff --git a/static/fonts/zilla/ZillaSlab-Light.ttf b/static/fonts/zilla/ZillaSlab-Light.ttf Binary files differdeleted file mode 100644 index 5709e4b..0000000 --- a/static/fonts/zilla/ZillaSlab-Light.ttf +++ /dev/null diff --git a/static/fonts/zilla/ZillaSlab-LightItalic.ttf b/static/fonts/zilla/ZillaSlab-LightItalic.ttf Binary files differdeleted file mode 100644 index 3c21c9b..0000000 --- a/static/fonts/zilla/ZillaSlab-LightItalic.ttf +++ /dev/null diff --git a/static/fonts/zilla/ZillaSlab-Medium.ttf b/static/fonts/zilla/ZillaSlab-Medium.ttf Binary files differdeleted file mode 100644 index 1d20d0c..0000000 --- a/static/fonts/zilla/ZillaSlab-Medium.ttf +++ /dev/null diff --git a/static/fonts/zilla/ZillaSlab-MediumItalic.ttf b/static/fonts/zilla/ZillaSlab-MediumItalic.ttf Binary files differdeleted file mode 100644 index c72c5eb..0000000 --- a/static/fonts/zilla/ZillaSlab-MediumItalic.ttf +++ /dev/null diff --git a/static/fonts/zilla/ZillaSlab-Regular.ttf b/static/fonts/zilla/ZillaSlab-Regular.ttf Binary files differdeleted file mode 100644 index c1188fa..0000000 --- a/static/fonts/zilla/ZillaSlab-Regular.ttf +++ /dev/null diff --git a/static/fonts/zilla/ZillaSlab-SemiBold.ttf b/static/fonts/zilla/ZillaSlab-SemiBold.ttf Binary files differdeleted file mode 100644 index 3486689..0000000 --- a/static/fonts/zilla/ZillaSlab-SemiBold.ttf +++ /dev/null diff --git a/static/fonts/zilla/ZillaSlab-SemiBoldItalic.ttf b/static/fonts/zilla/ZillaSlab-SemiBoldItalic.ttf Binary files differdeleted file mode 100644 index bee778e..0000000 --- a/static/fonts/zilla/ZillaSlab-SemiBoldItalic.ttf +++ /dev/null diff --git a/static/kd.jpeg b/static/kd.jpeg Binary files differdeleted file mode 100644 index 2613ece..0000000 --- a/static/kd.jpeg +++ /dev/null diff --git a/static/xmr.png b/static/xmr.png Binary files differdeleted file mode 100644 index 6f78ca0..0000000 --- a/static/xmr.png +++ /dev/null diff --git a/themes/risotto b/themes/risotto deleted file mode 160000 -Subproject 00d8fab5951bf85a6904cb5f78bfefd4b94417d |
