diff options
-rw-r--r-- | .gitignore | 4 | ||||
-rw-r--r-- | GNUmakefile | 25 | ||||
-rw-r--r-- | content/archive/index.md | 60 | ||||
-rw-r--r-- | content/home/index.md | 32 | ||||
-rw-r--r-- | content/keys/index.md | 24 | ||||
-rw-r--r-- | content/posts/coding_standards.md | 54 | ||||
-rw-r--r-- | content/posts/gentoo.md | 78 | ||||
-rw-r--r-- | content/posts/index.md | 20 | ||||
-rw-r--r-- | content/posts/nophone.md | 142 | ||||
-rw-r--r-- | content/posts/selfhostmail.md | 55 | ||||
-rw-r--r-- | content/posts/software.md | 82 | ||||
-rw-r--r-- | content/posts/website_created.md | 28 | ||||
-rw-r--r-- | index_pages.mk | 5 | ||||
-rw-r--r-- | scripts/boiler.py | 55 | ||||
-rwxr-xr-x | scripts/build_page | 45 | ||||
-rwxr-xr-x | scripts/filter_proper_md | 14 | ||||
-rwxr-xr-x | scripts/generate_post_index | 35 | ||||
-rw-r--r-- | scripts/parse_frontmatter.py | 19 | ||||
-rw-r--r-- | static/favicon.ico | bin | 0 -> 700 bytes | |||
-rw-r--r-- | static/keys/id_ed25519.pub | 1 | ||||
-rw-r--r-- | static/keys/pubkey.asc | 86 | ||||
-rw-r--r-- | static/style.css | 88 |
22 files changed, 952 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bfd0ece --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +__pycache__/ +install.mk +public/ +*.tar.gz diff --git a/GNUmakefile b/GNUmakefile new file mode 100644 index 0000000..0d49d96 --- /dev/null +++ b/GNUmakefile @@ -0,0 +1,25 @@ +MD = $(shell find content/ -name '*.md') +PROPERMD = $(shell scripts/filter_proper_md $(MD)) +HTML = $(patsubst content/%.md, public/%.html, $(PROPERMD)) +STATICASSETS = $(shell find static -type f) +PUBLICASSETS = $(patsubst static/%, public/%, $(STATICASSETS)) + +# Calling make is used for making sure that index pages are build first +all: + $(MAKE) -f index_pages.mk + $(MAKE) pages + +pages: $(HTML) $(PUBLICASSETS) + +public/%.html: content/%.md + mkdir -p $$(dirname $@) + scripts/build_page $< > $@ + +$(PUBLICASSETS): public/%: static/% + mkdir -p $$(dirname $@) + cp $< $@ + +clean: + rm -rf public + +.PHONY: all clean pages diff --git a/content/archive/index.md b/content/archive/index.md new file mode 100644 index 0000000..bc3c1e6 --- /dev/null +++ b/content/archive/index.md @@ -0,0 +1,60 @@ +--- +title: "Archive" +slug: "archive" +--- + +This archive includes both my own project and third-party software that I use. + +## My Projects + +## SLCF + +- Description: Suleyman's Linux Configuration Files. +- Source: https://git.farajli.net/slcf +- Downloads + - [slcf.tar.gz](/archive/slcf.tar.gz) + +### DWM + +- Description: My build of Dynamic Window Manager. +- Source: https://git.farajli.net/dwm +- Downloads + - [dwm_farajli-6.5.0.tar.gz](/archive/dwm_farajli-6.5.0.tar.gz) + +### ST + +- Description: My build of Simple Terminal. +- Source: https://git.farajli.net/st +- Downloads + - [st_farajli-0.9.2.0.tar.gz](/archive/st_farajli-0.9.2.0.tar.gz) + +### DMenu + +- Description: My build of Dynamic Menu. +- Source: https://git.farajli.net/dmenu +- Downloads + - [dmenu_farajli-5.3.0.tar.gz](/archive/dmenu_farajli-5.3.0.tar.gz) + + +### SLStatus + +- Description: My build of SLStatus. +- Source: https://git.farajli.net/slstatus +- Downloads + - [dmenu_farajli-5.3.0.tar.gz](/archive/dmenu_farajli-5.3.0.tar.gz) + + +## Third-Party Software + +### Liberation Mono +- Description: The font I use in my desktop environment. +- Homepage: https://www.dafont.com/liberation-mono.font +- Mirror: + - [LiberationMono.tar.gz](/archive/LiberationMono.tar.gz) + +### Jetbrains Mono Nerd Font +- Description: The font required by neo-tree nvim plugin. +- Homepage: https://www.nerdfonts.com/ +- Mirror: + - [JetBrainsMono.tar.gz](/archive/JetBrainsMono.tar.gz) + (2024-08-15) diff --git a/content/home/index.md b/content/home/index.md new file mode 100644 index 0000000..88ad694 --- /dev/null +++ b/content/home/index.md @@ -0,0 +1,32 @@ +--- +title: "Home" +slug: "home" +css: | + time { + font-size: 16px; + color: #bbbbbb; + padding-right: 0.5em; + } + #email { + font-size: 16px; + padding-right: 3.4em; + color: #bbbbbb; + } + #github { + font-size: 16px; + padding-right: 2.8em; + color: #bbbbbb; + } +--- + +### posts +<time>2025-01-24:</time> [Hosting an email server is not possible.](/posts/selfhostmail.html) +<time>2024-12-27:</time> [Software I use.](/posts/software.html) +<time>2024-09-25:</time> [I dislike modern smartphones.](/posts/nophone.html) +<time>2024-09-06:</time> [Why I like Gentoo.](/posts/gentoo.html) +<time>2024-06-09:</time> [New webiste.](/posts/website_created.html) + +### links and contact info + +<span id="email">email:</span> [suleyman@farajli.net](mailto:suleyman@farajli.net) +<span id="github">github:</span> [sfarajli](https://github.com/sfarajli) diff --git a/content/keys/index.md b/content/keys/index.md new file mode 100644 index 0000000..e728b61 --- /dev/null +++ b/content/keys/index.md @@ -0,0 +1,24 @@ +--- +title: "Public keys" +slug: "public-keys" +--- + +# GPG Key + +### suleyman@farajli.net + +- Created: 2025-05-27 +- Expires: 2027-01-01 +- Fingerprint: AE38 55F0 F5E9 F27C 5F4D CBC6 E340 C0B8 5F70 7B8C + +Import: +```curl https://farajli.net/keys/pubkey.asc | gpg --import``` + +Download: [pubkey.asc](https://farajli.net/keys/pubkey.asc) + +# SSH Key + +Add to authorized keys: +`curl https://farajli.net/keys/id_ed25519.pub >> ~/.ssh/authorized_keys` + +Download: [id_ed25519.pub](https://farajli.net/keys/id_ed25519.pub) diff --git a/content/posts/coding_standards.md b/content/posts/coding_standards.md new file mode 100644 index 0000000..728b7dd --- /dev/null +++ b/content/posts/coding_standards.md @@ -0,0 +1,54 @@ +--- +title: "Post Title" +slug: post-title +created: 2024-12-31 +updated: 2025-06-23 +description: "A brief summary of what this page is about." +tags: [linux, self-hosting, minimalism] +draft: true +--- + + +Here are my **personal** coding standards for some languages. + +## Interpreted languages +#### Never put the file extension to the source file instead use a shebang. +`` + #!/bin/sh + #!/bin/python3 + #!/bin/perl +`` + +## Posix shell +#### Always wrap variables with `"${}"` to prevent globbing. +`` + echo "${var}" + echo "${1}" + echo "${@}" +`` + +## Makefiles +#### If Makefile is fully posix complient and doesn't have anything extra add +`.POSIX:` to the beginning of the file + +## C +#### Use K&R style `if`s +`` + if (condition) { + do this; + do that; + do another; + } +`` +#### if only one line don't use curly braces. +`` + while (condition) + do this +`` + +`` + if (condition) + do this + else + do that +`` diff --git a/content/posts/gentoo.md b/content/posts/gentoo.md new file mode 100644 index 0000000..ee89d40 --- /dev/null +++ b/content/posts/gentoo.md @@ -0,0 +1,78 @@ +--- +title: "Why I like Gentoo." +slug: "gentoo" +created: 2024-09-06 +description: "Why I think source based distros are better." +tags: [Technology] +draft: false +--- + +### Why I prefer Gentoo over Arch. +A lot of people say very good things about gentoo linux, it is very well maintained, +It is more secure, It is lightweight and so on. But when it comes down to it, +very few people actually use gentoo, I think that is because they install it +and after a month or so they really get sick of waiting for the packages to compile +and they switch back to whatever they were using before. I know it because, +I had done that in the past, I dual-booted my machine with gentoo and arch linux +intending to only use gentoo, and arch only when I didn't have the time to wait +for the package to compile, but ended up only booting to arch and almost never +to gentoo, at that time if you were to ask me the best package manager +I would have unhesitatingly said arch's pacman, while I still think that pacman is the best +**binary** package manager +for the past few months I have started to really like gentoo and its package manager +portage and there are different reasons for that. + +### Compiling programs makes more sense than downloading binaries. +On unix-like operating systems you generally use +open-source software and that software is made to be compiled by the users specific +to their machines, but on binary based distros you use programs that are compiled for +you by someone else and again to me, personally, compiling just makes more sense. + +### It gives you more perspective to the program you use. +If you'd downloaded a binary package you would only be able to tell if a program is fast, +has enough features and so on, but you wouldn't have known how much time it takes +to compile, what the build dependencies are, and even sometimes the +programming language that it is written in. I do agree that knowing those abstract details +of a package is utterly useless for a typical end-user who is not a programmer +but for a programmer those details are very important, since you get to know what build systems are +faster what programming language compiles faster, builds better and sometimes you +get to learn some stuff that you didn't even know existed. You can build programs from source in other distros +as well but gentoo makes it easier and forces you to do that +and be honest, If you could install binary package in 10 seconds +you wouldn't even bother waiting for it to compile for 20 minutes. + +### You install less packages. +In order to avoid compilation you tent to install less pieces of software +resulting in more stable and more performant system. God forbid you if +you are using arch linux and have access to the AUR +(I had installed more than 2000 useless packages on my arch system). + +### It is more secure, lightweight and faster (at least in theory). +I have not noticed any significant difference in terms of performance +between gentoo and binary based distros and I kind of think that security +on client OSes is overrated, but for some few people these might be important +since you literally can skip some useless parts of a program (useless for you of course) +resulting in less bloated, therefore faster and more secure programs, but again I +don't really find it that important. + +### **No systemd**! +I am not against systemd but I prefer to not use it. +On gentoo the default init system is openrc and it works +with no problem. + +### Bad parts. +Like everything, it has some negative stuff about it as well, +those are + +- Compilation can take some time. +- Gentoo is the one of **the hardest** distro to manage. + +I am saying both of those with an asterisk, because +although I agree that there are some big pieces of software that you basically have to have +like a browser, (it took 6h to compile a browser on my machine) but most of the time +if software takes too much time to compile that indicates that it is +overcomplicated and you shouldn't even be using it. +Gentoo is hard to use but, that also means gentoo forces to know more, making you better at +system administration. + +So, that is all. diff --git a/content/posts/index.md b/content/posts/index.md new file mode 100644 index 0000000..31ebb2b --- /dev/null +++ b/content/posts/index.md @@ -0,0 +1,20 @@ +--- +title: "Posts" +slug: "posts" +css: | + time { + font-size: 16px; + color: #bbbbbb; + padding-right: 0.5em; + } +--- +<time>2025-01-24:</time> [Hosting an email server is not possible.](/posts/selfhostmail.html) + +<time>2024-12-27:</time> [Software I use.](/posts/software.html) + +<time>2024-09-25:</time> [I dislike modern smartphones.](/posts/nophone.html) + +<time>2024-09-06:</time> [Why I like Gentoo.](/posts/gentoo.html) + +<time>2024-06-09:</time> [New webiste.](/posts/website_created.html) + diff --git a/content/posts/nophone.md b/content/posts/nophone.md new file mode 100644 index 0000000..9592805 --- /dev/null +++ b/content/posts/nophone.md @@ -0,0 +1,142 @@ +--- +title: "I dislike modern smartphones." +slug: "no-smart-phone" +created: 2024-09-25 +description: "Explaining why I prefer not to use a smartphone." +tags: [Technology] +draft: false +--- + + +### Why I absolutely hate smartphones. + +For the past few years, the question that I have been asked the most +is that "why don't you use a smartphone", but I've never really +answered any of those questions, even though, +I do have different reasons not to use one. + +The main point is that if you ever use any sort of properly +designed "normal" operating systems and hardware you can't really +go back and use garbage computer operating systems or phones +without getting disgusted. +With smartphones, it is even worse than toy-like computer OSes like windows +or mac, because with those systems you at least get some sort of +proper hardware components like a keyboard, +a monitor with "normal" screen ratio and so on. +But with phones, not only you get an operating system that is no better than +trash, but also some very cringe way to interact with the hardware. +(Yes, I am talking about sensor screens.) + +Now, let's talk about why + +- Operating systems +- Package Management +- User space applications +- Hardware +- Privacy and Security +Absolutely suck on "smart" phones. + +### Operating Systems +There are 2 main OSes for phones: iOS and Android, there are also some not widely used ones +like legacy Windows Phone and even some open-source ones, though here, I shall only talk about the +first 2 that I have mentioned, but that should also be somewhat relevant +to almost all the other phone OSes as well. + +**Android Sucks**! because, you can't even perform the most basic +computer functionalities +like compiling very simple software, writing scripts, and so on, you don't even have +the root access to the phone you "own", but the company that sold you that has full +access to the phone over the internet, that is basically like slavery with extra steps, lol. +Some people might say "Well, that is not a computer +you are not supposed to compile programs and write scripts!" I don't buy that argument +because, in reality, computers and phones are indeed the same thing, the way that they +function is the same, the way they connect with other computers is the same, +they use the same technologies to function (in fact, Android uses the Linux kernel). +The difference between properly written computer OSes and android is that +computer OSes care about the users while phones are trying to keep you under control. +It is also worth mentioning that I am not talking about the pure open source Android +project, I am talking about Android, on which companies put a load of garbage to make +it more "beneficial" for the company. + +With iPhones, it's the same thing except it is even worse, +it should be obvious why, apple! the single worst company +that has ever existed, Apple is trying so hard to keep you +inside of its garbage-like "ecosystem" by making it very hard +and even sometimes impossible to connect with hardware/software +other than Apple's, and all these ***morons*** will be like +> "BuT, DuuuuuDe, APpLE DeVIces WeRk WItH oTher AppLE DeViCes sO SMoOthLy" +Yeah, by making it impossible to work with basically everything else +and you have to have apple garbage all around you. + +### Package Management +Android and iOS do have some sort of package management, +on Android, it's Play store (But you can also install packages using .apk format) +on iOS, you have app store. +Google owns Play Store, and you have to have a google account to be able to use +Play Store (which on Android you basically also have to), on iOS, Apple owns +app store. +That might not seem like a huge deal, but it is. It basically means Google and Apple +have all the control of the programs uploaded to Play Store and app store respectively, +meaning that Google and Apple can block and even change the source code of some programs, +inject absolutely anything inside them. +Those companies need profit no matter what, meaning they would do anything to +get profit, even unethical stuff, and you are the one who let them do that to you. + +### User Space applications +By user space applications, I mean just the programs that people +install on smartphones. Frankly speaking, those programs are +just for normies who don't understand +technology and advances users are completely ignored. Phone programs +are graphical, thus they use more ram and cpu and most of the time they are +full of advertisements (Xiaomi Phones even have ads in the system's gallery). +They are not privacy-respecting, bloated, and kind of useless. +There is one program, however, that is worth talking about separately, and that is +"WhatsApp". It is the most widely used messaging application, though it has absolutely +nothing extraordinary and some stuff that is even worse than an average messaging program. +Here are some bad stuff about it: + +- WhatsApp is not private, **at all**! +- You have to have a smartphone and a phone number. + +Imagine a piece of software requires you to have a phone to be able to use it, +that is basically like saying that a $400 device is a dependency of that program, +this is absolutely *nuts*. I find it quite absurd +that people don't find it absurd. +> If a program as simple as a messaging app requires you to have +> a cell phone, you shouldn't even be using that, +> no matter how many people around you use it! + +### Hardware +Hardware of cellphones absolutely suck they are designed to be broken so easily you can +break them by accident, that is, of course, +to sell more of them, they are nothing like old classic solid Nokia phones +with buttons and stuff, instead you have only a screen and you touch on it +which is very very cringe. +I just want buttons to press, not touchscreens to touch. +Another thing is that you can't upgrade your RAM or your storage and you're supposed to use overpriced +services like iCloud or Google Drive. + +### Privacy and security +Privacy just doesn't exist on smartphones; that is just a matter of fact. +If you use an iPhone, all your photos are sent to Apple servers and can be hacked +(though not quite probable) since, they are not stored only on your local system +which makes it less secure as well, +On Android, people use Google Photos, which is basically as bad as iPhones. + +### Health +Phones are also bad for your health, I can't +tell you the specifics since I am not a doctor. +But it is common knowledge that phones are bad for you. + +### Good stuff about phones +The only good thing about a phone is its camera. +though many people take too many useless pictures +resulting in a mess of data. Nonetheless, cameras are very useful +but it is not worth it to use a smartphone just because of that. + +### Summing it up +Smartphones are useless pieces of garbage that are overpriced, not privacy respecting and +meant for normies who don't understand how technology +works, or at least how it should work, ***no offense***. +Even if you must use a smartphone, that doesn't change the fact that they are +bad for you. diff --git a/content/posts/selfhostmail.md b/content/posts/selfhostmail.md new file mode 100644 index 0000000..f0469ef --- /dev/null +++ b/content/posts/selfhostmail.md @@ -0,0 +1,55 @@ +--- +title: "Hosting an email server is not possible." +slug: "hosting-email-server" +created: 2025-01-24 +description: "Explaining why don't host an email server." +tags: [Technology] +draft: false +--- + +### Reasons to not host your own email server. + +Last summer, I had successfully managed to host my email server but +a couple of days ago I completely removed everything from my server +and purchased an email hosting service. + +I'd like to share my experience with hosting an email server +and what makes the process an absolute nightmare. + +#### - It's hard to find an affordable VPS provider that doesn't block port 25. + +If you don't know anything about email, you need the port 25 to be open to send mails but +most server providers block it to reduce spam and the ones that don't costs more than +the usual ones. + +#### - Getting a domain and IP that is not blacklisted. + +If you have already bought a domain it might be blacklisted meaning that +all the mails you'll send is going to go right into the spam folder of the receiver. +It's the same for IP but chaining it is a lot easier than getting a new domain on most +server providers. + +#### - Not enough documentation is available and some is outdated. + +There isn't that much documentation for setting up an email server, I think that is +partially because of the process being so tough that no one really wants to document it +and there are so many commands involved in the process +even just a small update on one program can make the documentation outdated. + +#### - It's very hard to set up. +Configuring an email server was perhaps the hardest thing that I'd ever done +(even after finding the proper documentation), I spent weeks on that. + +#### - Almost certainly, your mails won't be delivered. + +Even after going through the very difficult process of finding the correct server provider, +documentation and setting everything up (DKIM, SPF etc.) you'll still end up in spams, +you might be able to pass spam filters of some email services, but you'll never feel +confident of sending mails because big email services sometimes update their spam filters +and you got to keep up with those as well, so it doesn't just end there when you set it up. + +#### Summing it up + +I'd gladly host an email server, but I just can't make it work half as good as the paid +email service providers. In the future I might try to do it again +(though I don't think the results will be different) but now I'll stick to email services. diff --git a/content/posts/software.md b/content/posts/software.md new file mode 100644 index 0000000..09f4f6c --- /dev/null +++ b/content/posts/software.md @@ -0,0 +1,82 @@ +--- +title: "Software I use." +slug: "software" +created: 2024-12-27 +description: "Software I recommend, use and some I dislike." +tags: [Technology] +draft: false +--- + + +Here are some of the programs I use, recommend and some I dislike. +You can get my configuration for most of these programs [here](https://git.farajli.net/slcf.git). + +### Criteria +For software to be usable for me it has to be: +1. Free and Open-source +1. Uncomplicated, simple to use +1. Lightweight +1. Fast + +### Operating systems +* [Arch Linux](https://archlinux.org): The best linux distro for most people, since installing packages is very convenient using the AUR and has a great wiki. +* [Gentoo](https://gentoo.org): Unique operating system with a proper wiki, see my [post](../posts/gentoo.html) about it. +* [Void](https://voidlinux.org): Great linux distros free from filthy systemd and glibc. +* [Debian](https://www.debian.org/): Easy to install and use, the best distro for beginners. +* [FreeBSD](https://www.freebsd.org/): Simple operating system with a clean and elegant codebase. +* <a href="https://ubuntu.com" class=orange_text>Ubuntu</a>: Debian done wrong with snaps. +* <a href="https://manjaro.org" class=orange_text>Manjaro</a>: Same as ubuntu except even worse doesn't even work properly. +* <span class=orange_text>MacOS</span>: BSD done wrong, with apple garbage. +* <span class=orange_text>Windows</span>: Graphical trash. + +### Programming languages +* C: Portable assembly, basically the default programming language for unix. +* Go: Modern version of C, very convenient and safe to write programs in. +* Posix Shell: Concise and convenient for scripts and small programs. +* <strong class=orange_text>C++</strong>: Bloated, not safe and a mess, literally every bad piece of software I've ever used was written in C++. + +### Window managers +* [DWM](https://dwm.suckless.org): At first a little hard to configure but at the end totally worth it. +* [BSPWM](https://github.com/baskerville/bspwm): Best static window manager, easy to configure with and an extraordinary tool called bspc. +* [i3wm](https://i3wm.org/): An average window manager, good for beginners. + +### Text editors +* vim and [nvim](https://neovim.io/): Just way too convenient to be real. +* <span class=orange_text>JetBrains IDEs</span>: Bloated, heavy, overcomplicated and costs money(?). + +### Browser +* [Qutebrowser](https://www.qutebrowser.org/): Has vim-keybinds making it very convenient to use. +* [Firefox](https://www.mozilla.org/en-GB/firefox/new/): Sometimes, you need a bloated browser to view bloated sites. + +### Terminal and terminal Utilities +* [st](https://st.suckless.org/): Terminal emulator though a little hard to configure. +* [alacritty](https://alacritty.org/): Terminal emulator which works perfectly fine without any configuration. +* [cmus](https://cmus.github.io/): Music player. +* [zsh](https://www.zsh.org/): Interactive shell. +* [dash](http://gondor.apana.org.au/~herbert/dash/): Shell script interpreter. +* [lf](https://github.com/gokcehan/lf): File manager. +* [translate-shell](https://github.com/soimort/translate-shell): Cli translator. + +### Xorg utilities +* [dmenu](https://tools.suckless.org/dmenu/): Interactive menu to select items. +* [slstatus](https://tools.suckless.org/slstatus/): Status monitor. +* [mpv](https://mpv.io/): Media player. +* [nsxiv](https://nsxiv.codeberg.page/): Image viewer. +* [zathura](https://pwmt.org/projects/zathura/): pdf viewer. + +### Other +* [pandoc](https://pandoc.org): Document converter. +* [git](https://git-scm.com/): Version control system. + +### About hardware +I don't really care about hardware because it is easily replacable and I am fine with whatever just works, +as long as it not overpriced. If you use proper software any hardware should get the job done. + +I am not going to shill thinkpads like everyone else, though I think they are fine, to me only 2 things +set apart thinkpads from all the other laptops, firstly, the fact that they are librebootable and, secondly, +they are really cheap. + +### See also +* [Suckless Rocks page](https://suckless.org/rocks/) +* [Cat-v harmful stuff](https://harmful.cat-v.org/software/) +* [Luke Smith's Post](https://lukesmith.xyz/programs/) diff --git a/content/posts/website_created.md b/content/posts/website_created.md new file mode 100644 index 0000000..fa42637 --- /dev/null +++ b/content/posts/website_created.md @@ -0,0 +1,28 @@ +--- +title: "New webiste." +slug: "new-website" +created: 2024-06-09 +description: "Announcing my new website." +tags: [Technology] +draft: false +--- + + +### I have a website! + +As of June 13th 2024, the best website on the internet has officially been created. + +This site is not made by using one of those fancy and bloated site generators +or any garbage like that, it was created, quite surprisingly, by writing HTML and +CSS, as it is supposed to be, though it is a little inefficient, error-prone +and a pain writing HTML and adding boilerplate code to each file, +thus it's quite probable that I shall write a small program to do that automatically +for me in the future, but that program won't be the same as bloated site generators, +in fact, it'd basically be the same as manual way of writing HTML. +Here are some of the advantages of my website compared to a lot of contemporary ones. + +- Doesn't fill your entire ram. +- Doesn't have ads, tracker or unnecessary JavaScript. +- Loads **Fast**! + +As of now, there isn't that much of content here, but I will probably add a lot more. diff --git a/index_pages.mk b/index_pages.mk new file mode 100644 index 0000000..e8e0c54 --- /dev/null +++ b/index_pages.mk @@ -0,0 +1,5 @@ +POSTS = $(filter-out content/posts/index.md, $(wildcard content/posts/*.md)) +GENERATEDMD = content/posts/index.md + +content/posts/index.md: $(POSTS) + scripts/generate_post_index > $@ diff --git a/scripts/boiler.py b/scripts/boiler.py new file mode 100644 index 0000000..b5d75f4 --- /dev/null +++ b/scripts/boiler.py @@ -0,0 +1,55 @@ +import textwrap + +def print_html_head(title, style=None): + print(textwrap.dedent(f"""\ + <!DOCTYPE html> + <html lang="en"> + <head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=1024"> + <link rel='stylesheet' type='text/css' href="/style.css"> + <link rel="icon" type="image/x-icon" href="/favicon.ico"> + <title>{title}</title>""")) + + if style: + print(textwrap.dedent(f"""\ + <style> + {style} + </style>""")) + + print(textwrap.dedent("""\ + </head> + <body> + <table id="bar"> + <tr> + <td id='header-name'>Suleyman Farajli</td> + <td id='quote'></td> + </tr> + </table> + <script> + let quotes = ["Uncensored", "Oh mamma mia!", "Memento Mori!", "Oh là là!", "C'est légal parce que je le veux", "Sweet Dreams Are Made of This"]; + let randomQuote = quotes[Math.floor(Math.random() * quotes.length)]; + document.getElementById("quote").innerText = randomQuote; + </script> + + <hr class="separator"> + + <div class="menu"> + <a class="menu_item" href="/home/index.html">Home/</a> + <a class="menu_item" href="/posts/index.html">Posts/</a> + <a class="menu_item" href="/archive/index.html">Archive/</a> + <a class="menu_item" href="/keys/index.html">Keys/</a> + <a class="menu_item right_menu_item" href="https://git.farajli.net">Git</a> + </div> + <div class="text">""")) + +def print_html_tail(): + print(textwrap.dedent("""\ + </div> + <p> + <a id="copyleft" href="https://creativecommons.org/licenses/by-sa/4.0/" target="_blank" rel="noopener noreferrer"> + copyleft (c) 2024-2025 Suleyman Farajli + </a> + </p> + </body> + </html>""")) diff --git a/scripts/build_page b/scripts/build_page new file mode 100755 index 0000000..51be92c --- /dev/null +++ b/scripts/build_page @@ -0,0 +1,45 @@ +#!/usr/bin/env python3 + +import boiler +from parse_frontmatter import parse_frontmatter +from pathlib import Path +import subprocess +import sys + +script_dir = Path(__file__).resolve().parent +filepath = Path(sys.argv[1]).resolve() + +# Parse frontmatter and skip draft posts +frontmatter = parse_frontmatter(filepath) +if frontmatter.get("draft"): + print(f"{filepath}: is draft", file=sys.stderr) + sys.exit(1) + +if not frontmatter.get("title"): + print(f"{filepath}: title is missing", file=sys.stderr) + sys.exit(1) + +boiler.print_html_head(frontmatter["title"], frontmatter.get("css")) + +# Read file contents and strip frontmatter manually +inside_frontmatter = False +content = [] + +with open(filepath, encoding="utf-8") as f: + for line in f: + if line.strip() == "---": + inside_frontmatter = not inside_frontmatter + continue + if not inside_frontmatter: + content.append(line) + +# Convert Markdown to HTML using `smu` +html = subprocess.run( + ["smu"], + input="".join(content), + text=True, + capture_output=True +).stdout + +print(html, end="") +boiler.print_html_tail() diff --git a/scripts/filter_proper_md b/scripts/filter_proper_md new file mode 100755 index 0000000..ed1be7f --- /dev/null +++ b/scripts/filter_proper_md @@ -0,0 +1,14 @@ +#!/usr/bin/env python3 + +import sys +from parse_frontmatter import parse_frontmatter +from pathlib import Path + +def isproper(file): + frontmatter = parse_frontmatter(file) + if not frontmatter.get("draft"): + print(file) + +script_dir = Path(__file__).resolve().parent +for arg in sys.argv[1:]: + isproper(arg) diff --git a/scripts/generate_post_index b/scripts/generate_post_index new file mode 100755 index 0000000..44aa756 --- /dev/null +++ b/scripts/generate_post_index @@ -0,0 +1,35 @@ +#!/usr/bin/env python3 + +from parse_frontmatter import parse_frontmatter +from pathlib import Path + +def generate_post_index(): + script_dir = Path(__file__).parent.resolve() + posts_directory = script_dir / "../content/posts" + posts = [] + for file in posts_directory.iterdir(): + if file.is_file() and file.name != "index.md": + frontmatter=parse_frontmatter(file.resolve()) + frontmatter["filename"] = file.name + if frontmatter["draft"]: + continue + posts.append(frontmatter) + + sorted_posts = sorted(posts, key=lambda x: x["created"], reverse=True) + + for i in sorted_posts: + html_file = i['filename'].replace(".md", ".html") + print(f"<time>{i['created']}:</time> [{i['title']}](/posts/{html_file})\n") + +print("""--- +title: "Posts" +slug: "posts" +css: | + time { + font-size: 16px; + color: #bbbbbb; + padding-right: 0.5em; + } +---""") + +generate_post_index() diff --git a/scripts/parse_frontmatter.py b/scripts/parse_frontmatter.py new file mode 100644 index 0000000..2d5c60e --- /dev/null +++ b/scripts/parse_frontmatter.py @@ -0,0 +1,19 @@ +import yaml + +def parse_frontmatter(filepath): + with open(filepath, 'r', encoding='utf-8') as f: + lines = f.readlines() + + if not lines or lines[0].strip() != '---': + return {} + + frontmatter_lines = [] + for line in lines[1:]: + if line.strip() == '---': + break + frontmatter_lines.append(line) + + frontmatter_str = ''.join(frontmatter_lines) + frontmatter = yaml.safe_load(frontmatter_str) or {} + + return frontmatter diff --git a/static/favicon.ico b/static/favicon.ico Binary files differnew file mode 100644 index 0000000..2720d38 --- /dev/null +++ b/static/favicon.ico diff --git a/static/keys/id_ed25519.pub b/static/keys/id_ed25519.pub new file mode 100644 index 0000000..923d50c --- /dev/null +++ b/static/keys/id_ed25519.pub @@ -0,0 +1 @@ +ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILPpdEyLRGs3GnlvL4aDR06dYCDv8Rag1d31oSDgkmC/ suleyman@farajli.net diff --git a/static/keys/pubkey.asc b/static/keys/pubkey.asc new file mode 100644 index 0000000..df2f9fb --- /dev/null +++ b/static/keys/pubkey.asc @@ -0,0 +1,86 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +58KbeUOtcSF5k/beMBAEFWpmN4NRZhg= +=z7yo +-----END PGP PUBLIC KEY BLOCK----- diff --git a/static/style.css b/static/style.css new file mode 100644 index 0000000..e23d743 --- /dev/null +++ b/static/style.css @@ -0,0 +1,88 @@ +/* +* Stylesheet of farajli.net +*/ + +/* FIXME: Don't use google fonts */ +@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@370&display=swap'); + +.jetbrains-mono { + font-family: "JetBrains Mono", serif; + font-optical-sizing: auto; + font-weight: 370; + font-style: normal; +} + +body { + font-family: "JetBrains Mono"; + font-size: 18px; + width: 60em; + display: block; + background-color: #1c1c1c; /* Almost Black */ + color: #ffffff; /* White */ + padding-left: 1em; + margin: auto; +} + +a { + text-decoration: none; + color: #5E81AC; /* Blue */ +} + +a:hover { + color: #B48EAD; /* Purple */ +} + +ul, ol { + margin: 0; + padding: 0; + list-style-position: inside; /* optional: keeps bullets/numbers inside */ +} + +li > ul, +li > ol { + margin-left: 1.2em; /* or adjust as needed */ + padding-left: 1em; +} + +.menu_item { + color: #BB6767; /* Red */ + /* font-weight: bold; */ + padding: 0.4em; + padding-right: 3em; + font-size: 20px; + margin-right: 0.2em; + margin-left: 0.2em; +} + +.right_menu_item { + float: right; + padding-right: 1em; +} + +#header-name { + text-align: left; + font-size: 25px; + padding-top: 20px; + color: #FFFFFF; /* White */ + font-weight: normal; +} + +#quote { + font-size: 20px; + text-align: right; + color: #C0C0C0; /* Darkish gray */ + padding-top: 20px; + font-weight: 430; +} + +#bar{ + width: 100%; + line-height: 35px; +} + +#copyleft { + color: #696969; /* Dark Gray */ + /* display: block; */ + margin-top: 2em; + margin-bottom: 1em; +} |