GeistHaus
log in · sign up

https://shodantltwb.neocities.org/feed.xml

atom
6 posts
Polling state
Status active
Last polled May 19, 2026 05:52 UTC
Next poll May 20, 2026 08:33 UTC
Poll interval 86400s
ETag W/"69fcb331-c9c4"
Last-Modified Thu, 07 May 2026 15:43:45 GMT

Posts

Social Media: Frontline of “Truth”, the Propaganda Machine
blogtechcomputerspsychologypolitics
In March of 2006, the world wide web was introduced to Twitter, a micro-blogging website that started the phenomenon of social media. A few months later, in September, Facebook turned public, and with it, introduced a different paradigm - social networking - with more complex networking abilities than other competitors of the time, like MySpace.
Show full content

In March of 2006, the world wide web was introduced to Twitter, a micro-blogging website that started the phenomenon of social media. A few months later, in September, Facebook turned public, and with it, introduced a different paradigm - social networking - with more complex networking abilities than other competitors of the time, like MySpace.

Every one of these applications at the time had its own “gimmick”, its own use case: Instagram was for photography broadcasting; Snapchat introduced “Snaps” - messages and photos with 24 hour lifetimes that would disappear once elapsed. With the introduction of this last one, the paradigm of isolated, use case specific apps disappeared. It went belly up the moment Instagram decided to copy the “Snap” functionality with their own name: “Stories”.

This behavior of unification of content formats became noticeable across various different platforms, with the “Stories” functionality showing up in Facebook, then later in WhatsApp (a messaging app, mind you) as “Statuses”. Content was becoming unified, posted in the same couple of formats, in a variety of different websites. It was easy to spread messages, and easy to exploit the system in order to disseminate the right kind of messages, if you had the know how.

People did have the know how. That’s why the Trump presidential campaign made use of data gathered by Cambridge Analytica in the 2010s to build psychological profiles on 87 million Facebook users, giving them an idea of what kind of content to pump into these websites and what kind of profiles to appeal to in order to win majority vote. A lot of it, nowadays, is what we describe as “misinformation” and what in more radical circles has received the overused misnomer of “fake news”.

Today, a lot of misinformation is circulated but for a while it did not have the impact that companies and political actors wanted. Misinformation is built on 3 pillars. In order to have the desired impact, it needs to appeal to 3 specific problems with the way we see the world. Back then, 2 of these were already easily exploitable.

First, we have the human brain’s inherent Confirmation Bias. If not trained in the opposite direction, the brain has a usual tendency to seek, interpret and remember information in ways that confirm beliefs we already hold. It is one of the main biases we must be aware of when doing any kind of research, as it might lead to erroneous conclusions.

The second are our emotions. Not that it’s a flaw of the human brain to feel, I’d never claim something like that, but the human is more likely than not to think with the heart rather than the brain. Enter the Appeal to Emotion. If you see a lot of stuff on the internet, you’ll probably already identify this one. The type of content you’ll most likely see trying to make claims that are not completely true but use this fallacy to lead you in their direction is the so called “ragebait”. It appeals to human emotion and it works wonders because it especially appeals to negative emotions - which are already proven to have a higher impact on our perception of the world than positive emotions (Gaskell, 2021). Appeal to Emotion is a logical fallacy in content trying to weave an argument about the reality of the world, as it makes a claim based on sympathy or empathy instead of sound or logical grounds.

One final pillar remained then for bad actors attempting to weave a network of misinformation, and one that still hadn’t been perfected: Argument from Repetition. To talk about this one, I need to talk a bit about how its potential was spotted in a new phenomenon that was starting to rise after Snapchat’s “Snaps” and Instagram’s “Stories”: “short-form content”.

2012’s Vine might be the most important platforms to talk about because it was one of the first and most successful to try its hand at what we now call “short-form content” - videos of, at most, 6 seconds were the only thing allowed on the platform.

It was short lived, as it did not survive the advent of Musical.ly, an app that also incentivized short form content but was focused more on lip syncing to songs and didn’t have a content time limit. You might not know it because it too was short lived. After only 3 years of operation, its parent company was bought by ByteDance Ltd., and merged into a little app you might know today as TikTok.

TikTok was perfect. Not in our optic, it’s one of the worst apps we as a human species have ever invented, but in the optics of people who want to spread misinformation, it was perfect. Despite making ample use of Musical.ly’s lip syncing mechanics, it also allowed people to make videos of themselves just talking, to stitch themselves into other people’s videos and to duet with other videos, normally used to “react” to videos. It also, just like Musical.ly, did not have a content time limit.

The moment this kind of format appeared, it shot like wild fire to other platforms. Instagram introduced Reels into its app, which quickly showed up on Facebook as well. YouTube introduced Shorts, which were the exact same format. None of these formats were regulated for misinformation and everyone was allowed to make videos about anything, and using any kind of auxiliary content like music, video, whatever, as it wasn’t seen as a serious format. It should be. It was the ground-works for content to be weaponized in order to weave Arguments from Repetition. The feed allows you to scroll through millions of short videos in an hour, and from this, the only thing that dictates your viewing experience is an algorithm that picks and chooses videos according to your tastes. At least, that’s how it’s sold.

The reality is much more grim. This is the trifecta: Content, long or short, that works off your psychological profile of what content you value, and normally, this is content that reacts with your Confirmation Bias, content that appeals to the echo chamber you’re already a part of. This confirmatory content must also, from time to time, Appeal to Emotion, especially negative emotions, as these will rile you up and cement that content in your brain, and in return, will boost engagement for the app. Finally, the cherry on top of the cake - Argument from Repetition: what if we can make you believe something by showing you content weaving the same argument, with the same kind of format that already confirms what you believe in and appeals to your anger, or sadness, or indignation, or hatred, and does it over, and over again until you start hearing it in your sleep.

For certain circles, this entire system has already been gamed to work as a propaganda machine, because short form content was meant to be binge consumed and not scrutinized. The “Manosphere” weaves conservative and toxic messaging about the role of the man in society, and its messages can be condensed and delivered in short, syringe shots through short form content (Breuer, 2025). The Far Right is incredible at this, being able to twist numerous forms of imagery of innocuous nature by falsely contextualizing and, thus, presenting them as the very “evil” they criticize day in and day out (Shaw, 2023). Certain messaging like this even seeps into other kinds of feeds of more innocuous nature in order to realign people’s thinking towards certain extremes. And it’s not just the Far Right that gets its messaging across. I’ve seen my own feed, of bigger Leftist lenience, also try to force me into its own machine with content that confirms my pre-held beliefs, appeals to my negative emotions and weaves its arguments through constant repetition.

You see it once, you see it everywhere, and if you see it, maybe it’s time to leave the platform, the app, whatever it is you see. Yes, it’s harder to maintain contact with people, but it’s better to be a bit more digitally isolated than to be digitally indoctrinated by anyone.

https://shodantltwb.neocities.org/pages/shodanwashere/shodantltwb.neocities.org/blog/2026/04/10/socialmedia
Installing Kali NetHunter (Svirusx Kernel) on Samsung Galaxy S20 FE 5G (Snapdragon) running Lineage OS 23.2 (Android 16)
bloginfoseckaliandroidcomputers
NetHunter (the custom kernel version) supports a myriad of devices, old and new, and I decided to run a little project where I’d set up my own NetHunter capable phone.
Show full content

NetHunter (the custom kernel version) supports a myriad of devices, old and new, and I decided to run a little project where I’d set up my own NetHunter capable phone.

I decided to go with the Samsung S20 FE 5G, as it is the only one with support for very recent versions of Android, courtesy of the team at LineageOS.

If you work only from the available front page downloads, you’ll see that NetHunter is only available, however, if your S20 FE 5G is running the stock firmware - OneUI 5.0, i.e., Android 13. Not optimal.

Anything we can do to change this? Surprisingly, yes! Following a paper trail of documentation, you can see that there’s a custom kernel specifically for the Samsung Galaxy S20 FE 5G running LineageOS 23.

Offensive Security has a number of scripts available to use, one of them being used for building NetHunter Installer Images. I used that to create an image specifically to install NetHunter 2026.1 on the S20 FE 5G using this custom kernel, but when it came to installing it through Magisk, I ran into problems.

It was giving me a cryptic error referencing an inability to copy system modules to the /system partition of the phone, something you’d normally be able to do with root access.

I quickly opened an issue on their GitLab project to track this problem but didn’t think much of it.

Incredibly a few hours later, the original author of the kernel, Svirusx (KUDOS!) responded with some insight.

This response gave me an idea for a strategy which, surprisingly, worked for me in installing the kernel. So here’s a guide on “How to Install NetHunter on the Samsung S20 FE 5G for LineageOS 23.2”:

1. Installing LineageOS 23.2 on the Phone

This is the simple part. I’ll assume you have your phone still using the stock firmware. Good! It’s a pre-requirement for a LineageOS installation.

Make sure that the phone’s OEM is unlocked and that you’ve unlocked the bootloader. You can do this by setting the OEM unlock setting to “On” on the Developer Settings, then turning off the phone and turning it on in “Download mode”, which is done by holding the Volume Up+Volume Down keys and plugging the USB cable while doing it. It should show a screen similar to this:

Once you see this screen, let go of both keys. To unlock the bootloader, hold the Volume Up key for a few seconds. Reboot the phone and consult the Developer Options to make sure the OEM unlock setting is now greyed out. You’re ready to go.

1.1. Flashing the Verified Boot Metadata Partition

First thing we need is to do is flash the VBMeta (Verified Boot Metadata) partition, which is the central data structure used in a process called Android Verified Boot. Download vbmeta.img from here. To flash these partitions we’re talking about, you’ll need a proper program to flash partitions on a Samsung phone.

A good program back in the day was Odin, but that’s closed source and platform dependent (Windows). A much better alternative nowadays is Heimdall which is cross-platform and cross-architecture.

Put your phone back in “Download mode”. Press the Volume Up key once to start a flashing procedure. Open your terminal and proceed to where you’ve downloaded vbmeta.img to. Once you’re there, the command to flash it is:

$ heimdall flash --VBMETA vbmeta.img

Let the partition flash, then check to see if the phone reboots by itself. Once it does, it’ll enter recovery mode and tell you to factory reset the phone. Proceed.

1.2. Flashing the Recovery Partition

Next, we’ll flash the recovery partition with LineageOS’ own custom recovery. Once you’re finished with the factory reset, let the phone finish setting up, then go back to “Download mode” again.

Download recovery.img from here. With the flashing procedure started, run the following command:

$ heimdall flash --RECOVERY recovery.img --no-reboot

This time, we do not want the phone to reboot automatically once it is finished flashing. Follow the procedure on the terminal to check that it finishes flashing completely.

Once that happens, hold the Volume Down and Side keys for 7 seconds to reboot the phone. The moment the screen turns off and the reboot procedure initiates, hold the Volume Up and Side keys to make the phone boot in Recovery mode.

If successful, your phone will boot up into this screen:

1.3. Patching LineageOS 23.2 on top of the Stock ROM

Now that both VBMeta and Recovery partitions are flashed and persistent, it’s time to install LineageOS on the phone - specifically, to patch LineageOS on top of the stock ROM.

First, use the Volume Keys to scroll down to Factory reset and select Format data/Factory Reset to remove the data and the encryption underneath.

Once that is completed, download the most recent build of LineageOS (lineage-23.2-YYYYMMDD-nightly-r8q-signed.zip) from here. To patch this in, select Apply update, then ADB sideload. On the terminal, go to where you downloaded the LineageOS build to and run the following command:

$ adb -d sideload lineage-23.2-YYYYMMDD-nightly-r8q-signed.zip

Let the .zip build install itself. It’s completely normal if it stalls at 47%, then suddenly finishes the installation.

1.3.1. (Optional) Installing Google Apps

If you feel like it will be absolutely necessary to install Google Apps on the phone, you’ll need to take care of this now before booting into LineageOS. If not, skip this step.

You’ll want to download the “MintTheGapps” add-on for LineageOS 23.0 (16.0.0), for ARM64 and repeat the same steps as patching LineageOS, but for this addon. Apply Update -> ADB Sideload and run the following command:

$ adb -d sideload MindTheGapps-16.0.0-arm64-YYYYMMDD_xxxxxx.zip

You’ll most likely get a failed signature validation error. Allow the installation anyway.


Once you’re done, select “Reboot system now” and proceed with the device configuration! Your phone is now using LineageOS 23!

2. Rooting the device using Magisk

Now we have to root the phone itself. Rooting is essentially just a way escalating privileges and persisting that elevated access on an Android device. It’s called rooting because, like with Linux, the user with highest privileges in the device is called the root user. However, the access to this user is normally blocked by carriers and hardware manufacturers in order to segregate privileges and allow for uninstallable software to be present in the device (so called “bloatware”). We know better than that.

2.1. Patching Magisk on top of LineageOS

To do this, we’ll simply patch the latest release of Magisk on top of LineageOS. Magisk is a userspace systemless rooting tool for Android versions 6.0 or higher. Normally, it has to be patched into the phone’s firmware (init_boot.img or boot.img), but since LineageOS is a more open OS, we can just patch it from the Recovery mode.

First, download the most recent version of Magisk from here. You’ll download a release with the following naming scheme: Magisk-vXX.Y.apk.

Before flashing it, we’ll need to change this into a format that the custom recovery will accept, a .zip archive. You’d think this process would be hard, but APKs are just ZIP files actually. Sorry to shatter your illusions of the world.

$ mv Magisk-vXX.Y.apk Magisk-vXX.Y.zip

Once you’ve renamed your file, it’s just a matter of rebooting back into recovery mode. With LineageOS, this process is much simpler too. In the Settings app, go to System > Buttons > Power Menu and turn on the Advanced Reboot option. Once this is done, you’ll notice that, when the phone is unlocked and you attempt to restart the phone, you’ll be prompted with the mode you want to restart the phone into. Select “Recovery”.

In the Recovery menu, follow the steps to patch. Apply Update -> ADB Sideload and run the following command:

$ adb -d sideload Magisk-vXX.Y.zip

Once more, you’ll get a failed signature validation error. Allow the installation anyway, let it install, then reboot the phone.

Once you reboot the phone, open the Magisk app and finish the setup. The phone will reboot once more. You can check the Magisk app and confirm the device is rooted.

3. Installing NetHunter on top of the Rooted LineageOS install

Now’s the interesting part. Installing NetHunter on top of your rooted installation of LineageOS. Make sure you have a lot of internal storage capacity on your computer. You’re gonna need it.

3.1. Building the Installation Module

First we’ll need to build the module to install NetHunter through Magisk. Clone the building script:

$ git clone https://gitlab.com/kalilinux/nethunter/build-scripts/kali-nethunter-installer.git

Then head into the directory and initialize the kernels repo with the bootstrap.sh script.

$ ./bootstrap.sh
[?] Would you like to grab the full history of kernels? (y/N): N
[?] Would you like to use SSH authentication (faster, but requires a GitLab account with SSH keys)? (y/N): N
[i] Running command: git clone --depth 1 https://gitlab.com/kalilinux/nethunter/build-scripts/kali-nethunter-kernels.git kernels
Cloning into 'kernels'...

[!danger] OI! This is the most important fucking step. Do not lose yourself.

Navigate into the S20 FE 5G’s custom kernel directory.

$ cd kernels/sixteen/r8q-los

After that, delete all the contents inside the modules directory. We can restore them later to introduce on the system once NetHunter is done installing.

$ rm modules/*

After that, go back to the kali-nethunter-installer base directory. You’ll first need to setup the build script’s dependencies.

$ python3 -m venv .env
$ source .env/bin/activate
(.env) $ python3 -m pip install requests pyyaml

Finally, all we have to do is build the image itself. The command to build a 2026.1 release of NetHunter with this kernel is the following:

(.env) $ python3 build.py --kernel r8q-los -16 --rootfs full --release 2026.1
3.2. Installing NetHunter through Magisk

Now that the installation module is built, all we have to do is install it through Magisk as a module. Go to the Settings app, turn on Developer Options and turn on USB Debugging. Plug your phone into your PC, then, on the directory where your NetHunter ZIP module is, run the following command:

$ adb push nethunter-XXXYYYZZZ.zip /sdcard/Download

Wait for the push to finish and that’s likely one of the last times you’ll need to plug the phone into your PC. Now all you have to do is open Magisk, click on Modules > Install from local storage and then select the ZIP file you have in your Downloads folder (how’d it get in there?)

Wait for the installation to finish and boom! NetHunter is installed!

3.2.1. Installing the missing modules

Ok, maybe not completely. If those modules for CARsenal are really itching your stitching, you can install them manually now.

A good utility for this is MiXplorer, which is straight up just a file browser that can request Root access to browse system files. Download the most recent APK release for arm64, then plug your phone into the PC for USB debugging. To install the APK, run the following command:

$ adb -d install MiXplorer_vX.YY.Z_Byymmddnn-arm64.apk

Once it’s installed, go to the kernels directory of your kali-nethunter-installer again and restore all the files you deleted.

$ cd kali-nethunter-installer/kernels/sixteen/r8q-los/modules
$ git restore *

Once it’s restored, you can just push all the kernel modules over to your phone on the Downloads folder:

$ adb push *.ko /sdcard/Download

Now, just use MiXplorer to move these .ko files into the /system/lib/modules directory. Once they’re moved, just reboot the phone and you’re done!

Credits

Thanks to the LineageOS team for the great work they do, and to the Offensive Security team, especially the volunteer developers doing a lot of the development work on Kali Linux and NetHunter - way too specifically, thanks to Volk3n for pointing me in the right direction and to Tomasz Pograniczny (aka Svirusx) for the support on getting the kernel to work.

Happy hunting. :)

https://shodantltwb.neocities.org/pages/shodanwashere/shodantltwb.neocities.org/blog/2026/04/02/nethuntersvirusxS20FE5G
I Finally Finished Tony Hawk’s Undeground
bloggaming
oh my god i finally finished tony hawk’s underground and this is probably one of the best games ever. it’s pretty rough around the edges but its to be expected from an arcadey and more interconnected experience. i will say, though, there are a couple of sections in this game that are severe bullshit, and the one that pissed me most off was the last line: Eric Sparrow’s “epic” line in New Jersey
Show full content

oh my god i finally finished tony hawk’s underground and this is probably one of the best games ever. it’s pretty rough around the edges but its to be expected from an arcadey and more interconnected experience. i will say, though, there are a couple of sections in this game that are severe bullshit, and the one that pissed me most off was the last line: Eric Sparrow’s “epic” line in New Jersey

this line will take you around the entire town and test a number of different skills, from holding grinds to successfully and accurately making jumps over large gaps, both horizontally and vertically, and just simply not bailing all the fucking time.

if you want a feeling for how hard this fucking line is, here’s a video by @Skifts of him completing that line on Sick Difficulty in one continuous combo:

in short, rest in piss, Eric Sparrow. let us meet again in Underground 2 so i can kick your ass again

https://shodantltwb.neocities.org/pages/shodanwashere/shodantltwb.neocities.org/blog/2026/02/16/ifinallyfinishedthug
I Finally Have a Wii U!
bloggaminghomebrewcomputers
words cannot express how fucking happy i am right now. yes, you read the title right. 13 years after launch, 8 after it was discontinued, i finally - FINALLY - have a Wii U in my hands.
Show full content

words cannot express how fucking happy i am right now. yes, you read the title right. 13 years after launch, 8 after it was discontinued, i finally - FINALLY - have a Wii U in my hands.

this console was part of my childhood but at the time it released, i was a snotty 12 year old brat and my family was not financially well, so i didn’t have the guts to ask for one. we already had a Wii after all. asking for another was pushing it.

but ever since i was a kid, i was obsessed with this fucking thing. the gamepad seemed like magic. oh it is magic alright. dark fucking magic.

turns out there are many reasons why the wii u flopped hard. one is definitely the gamepad, and there are a miriad of reasons for this:

  • the first and most agregious of all is the fact that this giant fucking gamepad, with a TOUCH SCREEN ON IT mind you, as a battery life of a whopping… 1550 mAh. That’s around 3-5 hours of play time if your battery is not degraded already. i already have plans to swap mine for a 6000 mAh battery, but this is already a handicap on most. it’s also kind of weird how Nintendo’s own official “High Capacity Battery” for the Wii U is only 2550 mAh. it’s like they didn’t want you to play this thing. which leads me to my next point:
  • excessive tethering! Seriously! the wii u is so clingy with the gamepad, it needs it for EVERYTHING. there are specifically things that it will refuse to start up if you do not have a functional gamepad. things like,
    • the settings!
    • the Mii Editor!
    • several fucking games on its library!
    • YouTube!
    • etc.
  • finally, for a console that bitches and moans about needing the gamepad for everything, it sure is underutilized in its games. Rayman Legends and Nintendo Land seem to be standout contradictions to this, as a lot of their mechanics were built with gamepad functionality in mind, but everything else is so… lackluster. Bayonetta only uses the gamepad as a second screen, but will REFUSE to start up without the gamepad connected. New Super Mario Bros. U only uses the gamepad as a crutch to place blocks for other players if they get stuck. Breath of the Wild straight up has no gamepad functionality other than a couple of shrines where it uses the gamepad’s gyroscope for those weird ball maze puzzles. that’s it. this console had a lot of potential and Nintendo just left that potential gathering dust, and it resulted in a couple of lackluster games.

speaking of, the games. they’re not bad, but the library here is quite small in terms of exclusive Wii U titles. i’m still trying out some and currently i think, gamepad usage aside, New Super Mario Bros. U and Mario Kart 8 are the stand outs. 8 Deluxe is way better than Mario Kart 8, but this one has its own merits. and New Mario U has a lot of character. yes, it is borrowing from the New Mario Bros. art style, but there’s a lot here that is its own thing, with zones that have very unique mechanics, art styles, and a more challenging level of platforming that one-ups New Mario Bros. Wii, and stands shoulder to shoulder with New Super Mario Bros. 2 - which makes me wonder why the two never had any sort of wireless connection between the Wii U and the 3DS, but i digress.

Anyway, I’m gonna keep letting my inner child have some fun. Be back in a few!

https://shodantltwb.neocities.org/pages/shodanwashere/shodantltwb.neocities.org/blog/2025/11/11/ifinallyhaveawiiu
My PC Setup
blogcomputers
hey! :D i finally finished up my computer setup, at least on my desk!
Show full content

hey! :D i finally finished up my computer setup, at least on my desk!

The setup is composed of a couple of components:

1. keyboard and mouse

The keyboard and mouse are both very beige coded and are from unexpected brands

First, the Keyboard is from the standard for pre-built keyboards nowadays, a Ducky Origin Vintage with MX Cherry Red Switches.

As is usual with Ducky keyboards, this one has a USB-C port at the top so the keyboard can be cordless during transport. The cable can also be changed if necessary.

Buy Ducky Origin Vintage

The mouse is from Cherry, the company that MAKES MX Cherry switches (hehehe). It’s a very basic USB Mouse known as the Cherry WheelMouse and is made to look like one of those vintage ball mouses. Not the greatest thing out there, but has been robust for my use cases and is pretty cheap.

Buy Cherry WheelMouse

2. monitor

The monitor is no longer sold around but it’s a Fujitsu B-22W-7. This poor bastard is locked down to a max resolution of 1680x1050, aka, an Aspect Ratio of 16:10, a TN matte-panel and it only takes VGA (D-Sub), DVI and DisplayPort. For this situation, I am also using an active HDMI to DisplayPort adapter.

Fujitsu B-22W-7 BENFEI HDMI to DisplayPort Active Adapter

3. kvm switch

Now, I don’t just use a single desktop or laptop. I use multiple machines on the same table and I HATE remoting into machines. For this reason, I use a KVM Switch. This KVM takes the input from all my peripherals, my keyboard, mouse, mic and webcam and output for the monitor, and redirects them all between either my desktop or a USB-C dock to which I connect either my personal MacBook Air or my work MacBook Pro. The switch is done by just clicking a button and honestly… it just works :)

KVM Switch i use, but any that has these specs will do

https://shodantltwb.neocities.org/pages/shodanwashere/shodantltwb.neocities.org/blog/2025/10/22/mysetup
How I Built This Site
blogprogrammingcomputers
hi :) today i wanna talk about how i made this cool website part 1: jekyll and hyding the mess if you’re not familiar with working with static websites but wanna give them a bit more ooomph, i really recommend checking out Jekyll. Jekyll is a static website generator that also helps you with blogging!
Show full content

hi :) today i wanna talk about how i made this cool website

part 1: jekyll and hyding the mess

if you’re not familiar with working with static websites but wanna give them a bit more ooomph, i really recommend checking out Jekyll. Jekyll is a static website generator that also helps you with blogging!

at first, i was managing my website like i would any other simple html webpage. the issue was that, as it grew more complex, it became what we the portuguese call a “gatafunhada”. worse than a simple mess, it becomes unsustainable. i had elements that were common between all pages and had to be equalized all the time. if i wanted to do a mini blog in here something had to change.

with Jekyll, this all changes. instead, i can just write my own layouts for simple pages or blog posts and all i have to worry is about the main content. if there’s something on those common elements on both of the bars you see on the left and the right i need to update, i can just update the layout and it will update for all other pages.

part 2: IN A LINK TO THE PAST, YOU EQUIP AN ITEM, PRESS A BUTTON AND YOU’RE THERE

this was all good with jekyll but this added another layer of overhead whenever i wanted to upload changes from my website to neocities.

some of this could be mitigated using the Neocities CLI utility but that’s still a pretty manual setup! you have to push the website over to neocities EVERY TIME you make a little change. that doesn’t quite scale…

nevertheless, neocities cli would prove to be a crucial piece. i decided i’d move development of this website over to github and have deployment be done through github actions. let’s see how that’s setup:

name: CI/CD
on: push
jobs:
  build:
    name: Build
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Build
        uses: actions/jekyll-build-pages@v1
      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: site
          path: _site
          if-no-files-found: error
  deploy:
    name: Deploy
    needs: build
    runs-on: ubuntu-latest
    steps:
      - name: Setup Ruby
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: head
      - name: Install Neocities CLI
        run: gem install neocities -v 0.0.20
      - name: Get artifact
        uses: actions/download-artifact@v4
        with:
          name: site
          path: _site
      - name: Upload artifact to Neocities
        run: |
          mkdir -p $HOME/.config/neocities
          echo "{\"API_KEY\":\"$\",\"SITENAME\":\"shodantltwb\"}" > $HOME/.config/neocities/config.json
          neocities push _site

As you can see, this pipeline has two main steps:

  1. the build stage where we use the “jekyll-build-pages” action to build our website for us, then upload the generated website as an artifact
  2. the deployment stage, where we install the neocities cli, configure it and upload the contents of the artifact to our website.

notice the configuration step specifically:

...
        run: |
          mkdir -p $HOME/.config/neocities
          echo "{\"API_KEY\":\"$\",\"SITENAME\":\"shodantltwb\"}" > $HOME/.config/neocities/config.json
...

You’ll need to plug your Neocities API key into the cli preemptively, which you can get by going to https://neocities.org/settings/{your_site_name}#apikey. Don’t reveal this to anyone! if you did so accidentally, generate a new one immediately!

To make sure you also don’t reveal this accidentally in the pipeline, we’ll make use of repository secrets on GitHub. On your repository’s “Settings”, you’ll want to go “Secrets and Variables” > “Actions” > “Repository Secrets”, then create one for your Neocities API Key, like so:

This way, once the pipeline runs, your secret will be used to push the website to neocities and will never be exposed!

I’m thinking maybe at a later date changing to a private instance of GitLab as GitHub is known to crawl even private repositories for code to train Copilot but in the meantime this is a good solution.

https://shodantltwb.neocities.org/pages/shodanwashere/shodantltwb.neocities.org/blog/2025/10/15/howibuiltthis