Compare commits

...

11 Commits

15 changed files with 380 additions and 172 deletions

7
.gitignore vendored
View File

@ -137,6 +137,11 @@ config.json
.db_init
public/
src/css/main.css
.njs.provider
# exclude idea folder
.idea/
.idea/
# bun
bun.lock
bun.lockb

View File

@ -1,4 +1,5 @@
# aidxnFUN
[![License: CC0-1.0](https://img.shields.io/badge/License-CC0_1.0-lightgrey.svg)](http://creativecommons.org/publicdomain/zero/1.0/)
[![Latest Release](https://img.shields.io/badge/latest_version-v.1.30-purple)](https://github.com/ihatenodejs/aidxnFUN/releases)
[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fihatenodejs%2FaidxnFUN.svg?type=shield&issueType=license)](https://app.fossa.com/projects/git%2Bgithub.com%2Fihatenodejs%2FaidxnFUN?ref=badge_shield&issueType=license)
@ -8,52 +9,88 @@
The full code of my website, under the CC0-1.0 license (public domain). Built with Tailwind CSS, EJS, Express.js, and Node.js
# Install and self-host
## Install and self-host
Have a weird obsession? Want a pre-built site you can use for free? Host aidxnFUN! As the code is available under the CC0-1.0 license, which means you should feel free and encouraged to change content, design, whatever!
During this process, `node` (20.08.0), `npm`, and `netcat` will be installed. If you use Windows, you must manually install NodeJS.
During this process, `node` (20.08.0), `npm`, and `netcat` will be installed. If you use Windows, you must manually install Node.js.
**Please note:** The /status endpoint will be broken with default servers (ones I own) as CORS will block requests not made from aidxn.fun
## Debian-based distributions (Ubuntu, etc.)
### Debian/Ubuntu/Arch Linux
1. Clone the repo
```bash
git clone https://github.com/ihatenodejs/aidxnFUN
cd aidxnFUN
```
2. Setup `manage`
2. Setup `manage` (installs everything you need)
```bash
./manage setup
```
3. Start the server
```bash
./manage up
```
A server will now start on port :5566, and be accessible from your web browser at http://localhost:5566/. I highly suggest creating a NGINX reverse proxy for this, especially if you plan to point this to a domain.
## Windows
### Windows
Windows-based hosts are only partially supported. I have no plans to write a script for Windows as of now, though that may change in the future, based on demand. However, `package.json` have bundled scripts to allow hosting on Windows. If you plan to host this website, I **STRONGLY** recommend that you use Linux.
**Windows hosting has not been tested in a while, and may not work perfectly.**
1. Install NodeJS and NPM for Windows from [nodejs.org](https://nodejs.org/)
1. Install Node.js and NPM (or Bun) for Windows from [Node.js.org](https://nodejs.org/) or [bun.sh](https://bun.sh/)
2. Open a Node.js command prompt
3. Clone the repo
```bat
git clone https://github.com/ihatenodejs/aidxnFUN
cd aidxnFUN
```
4. Build the app
**Bun**
```bat
npm run winbuild
bun run build:win:bun
```
5. Run the app on port 5566
**NPM**
```bat
set PORT=5566 && node app.js
npm run build:win:npm
```
5. Run the app
**Bun**
```bat
set PORT=5566 && bun run start:win:bun
```
**NPM**
```bat
set PORT=5566 && npm run start:win:npm
```
You may use the `PORT` variable to set a custom port. While Windows tends to default to 3000, we will use 5566, which is the default for aidxnFUN on Linux.
# How it works
This website uses Node.js, Express.js for a server, EJS for templating, and Tailwind CSS for the frontend CSS.
## How it works
### Stack/Technical Stuff
This website uses Node.js, Express.js, EJS for templating, and Tailwind CSS.
The `manage` script uses all of those tools to manage the server for you executes the repetitive tasks for you automatically.
@ -61,9 +98,14 @@ The views contain both regular page shards (full-ish pages) and generic shards (
Thus far, shards are included for a music widget, the header, and the footer of the pages.
### Music
Music (as featured on the home page) is fetched from an API (hosted on https://biancarosa.com.br), which I am in the process of setting up for myself. It works with a LastFM account (I linked this to my Spotify) and can track your live listening with amazing accuracy. The repo can be found at [biancarosa/lastfm-last-played](https://github.com/biancarosa/lastfm-last-played).
# Using the `manage` script
I'm in the process of migrating this project over to MusicBrainz.
## Using the `manage` script
You may have noticed you have a `manage` file after cloning. `manage` is a command-line tool to manage the server. It can automatically start, stop, and restart your instance. This script only supports Linux-based systems.
First, you must complete the setup with the following commands:
@ -74,28 +116,31 @@ chmod +x manage
After doing that, you are now ready to use the script.
## `manage` usage
### `manage` usage
`./manage [command] [options]`
## `manage` commands
### `manage` commands
+ `./manage up` - Builds the project and starts the server
+ `./manage down` - Stops the server
+ `./manage restart` - Restarts the server
+ `./manage status, -s, --status` - Checks if the server is running
+ `./manage help, -h, --help` - Shows the help message
# Troubleshooting
I highly suggest you take a peek at the `node.log` file's contents. It's in the same directory as the `manage` script. This file contains the NodeJS server logs, which can be very helpful for debugging and/or troubleshooting.
## Troubleshooting
# To-Do
I highly suggest you take a peek at the `node.log` file's contents. It's in the same directory as the `manage` script. This file contains the Node.js server logs, which can be very helpful for debugging and/or troubleshooting.
## To-Do
- [ ] Add instructions for setting up without `manage`
- [ ] Fix spacing issues with footer (not the same size across pages)
- [ ] Add status tracking for main server
- [ ] Fix status tracking and add tracking for latest servers
- [X] Improve dropdown menu style
- [X] Add link to pontus.aidxn.fun in menu
- [X] Restructure menu with dropdowns
- [X] Implement PGP message verification
- [X] Add menu link to tilde website
- [X] Update projects page to latest information
# License
[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fihatenodejs%2FaidxnFUN.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fihatenodejs%2FaidxnFUN?ref=badge_large)

306
manage
View File

@ -1,7 +1,7 @@
#!/bin/bash
SC_VERSION=1.3.0
SC_CODENAME="bionic"
SC_VERSION=1.4.0
SC_CODENAME="seahorse"
PORT=5566
SETUP_FILE=".setup_complete"
COLOR_RESET="\033[0m"
@ -10,65 +10,145 @@ COLOR_RED="\033[1;31m"
COLOR_YELLOW="\033[1;33m"
COLOR_BLUE="\033[1;34m"
COLOR_CYAN="\033[1;36m"
DISTRO=$(grep '^NAME=' /etc/os-release | cut -d '=' -f2 | tr -d '"')
NOB="inactive"
function command_exists() {
command -v "$1" &> /dev/null
}
function install_tools() {
# Check for NodeJS, and install if not found
if ! command_exists node; then
echo -e "${COLOR_RED}NodeJS is not installed. Installing now...${COLOR_RESET}"
echo -e "${COLOR_YELLOW}You may need to enter your sudo password.${COLOR_RESET}\n"
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
# shellcheck disable=SC2155
export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
nvm install 20.18.0
echo -e "\n${COLOR_GREEN}NodeJS installed successfully.${COLOR_RESET}\n"
# Perform updates
echo -e "${COLOR_BLUE}Updating package lists...${COLOR_RESET}"
if [ "$DISTRO" == "Ubuntu" ]; then
# shellcheck disable=SC2024
sudo apt-get update >> install.log
echo -e "${COLOR_GREEN}Done!${COLOR_RESET}\n"
elif [ "$DISTRO" == "Arch Linux" ]; then
# shellcheck disable=SC2024
sudo pacman -Sy >> install.log
echo -e "${COLOR_GREEN}Done!${COLOR_RESET}\n"
fi
echo -e "${COLOR_BLUE}Starting system dependency install...${COLOR_RESET}"
# Check for curl, and install if not found
if ! command_exists curl; then
echo -e "${COLOR_RED}curl is not installed. Installing now...${COLOR_RESET}"
if [ "$DISTRO" == "Ubuntu" ]; then
# shellcheck disable=SC2024
sudo apt-get install curl -y >> install.log
elif [ "$DISTRO" == "Arch Linux" ]; then
# shellcheck disable=SC2024
sudo pacman -S --noconfirm curl >> install.log
fi
echo -e "\n${COLOR_GREEN}curl installed successfully.${COLOR_RESET}\n"
else
echo -e "${COLOR_GREEN}curl is installed.${COLOR_RESET}"
fi
# Check for NodeJS/Bun and install if not found
if ! command_exists node && ! command_exists bun; then
for i in {1..3}; do
echo -e "${COLOR_BLUE}Do you want to install and use Node.js or Bun? (node/bun)${COLOR_RESET}"
read -r -p "" NOB
if [ "$NOB" == "node" ]; then
curl -o .install.sh https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh >> install.log
chmod +x .install.sh
bash .install.sh >> install.log
rm .install.sh # cleanup
# shellcheck disable=SC2155
export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
nvm install 23 >> install.log
echo -e "\n${COLOR_GREEN}NodeJS installed successfully.${COLOR_RESET}\n"
NOB="node_installed"
if ! command_exists npm; then
echo -e "${COLOR_RED}NPM is not installed. Installing now...${COLOR_RESET}"
if [ "$DISTRO" == "Ubuntu" ]; then
# shellcheck disable=SC2024
sudo apt-get install npm -y >> install.log
elif [ "$DISTRO" == "Arch Linux" ]; then
# shellcheck disable=SC2024
sudo pacman -S --noconfirm npm >> install.log
fi
echo -e "\n${COLOR_GREEN}NPM installed successfully.${COLOR_RESET}\n"
else
echo -e "${COLOR_GREEN}NPM is installed. Version: $(npm -v)${COLOR_RESET}"
fi
break
elif [ "$NOB" == "bun" ]; then
curl -fsSL --output .install.sh https://bun.sh/install >> install.log
chmod +x .install.sh
bash .install.sh >> install.log
rm .install.sh # cleanup
# this puts bun in the path for the initial install, we later instruct the user to add it to their shell profile
export BUN_INSTALL="$HOME/.bun"
export PATH="$BUN_INSTALL/bin:$PATH"
echo -e "\n${COLOR_GREEN}Bun installed successfully.${COLOR_RESET}\n"
NOB="bun_installed"
break
else
echo -e "${COLOR_RED}Invalid option, please enter 'node' or 'bun'${COLOR_RESET}"
fi
done
if [ "$NOB" != "node_installed" ] && [ "$NOB" != "bun_installed" ]; then
# this is mainly intended to catch the case where the user doesn't enter anything 3+ times
echo -e "${COLOR_RED}[!] Failed to install, exiting.${COLOR_RESET}"
exit 1
fi
elif command_exists bun; then
echo -e "${COLOR_GREEN}NodeJS is installed (provided through Bun). Version: $(bun -v)${COLOR_RESET}"
elif command_exists node; then
echo -e "${COLOR_GREEN}NodeJS is installed. Version: $(node -v)${COLOR_RESET}"
fi
# Check for Netcat, and install if not found
if ! command_exists nc; then
echo -e "${COLOR_RED}Netcat is not installed. Installing now...${COLOR_RESET}"
echo -e "${COLOR_YELLOW}You may need to enter your sudo password.${COLOR_RESET}\n"
sudo apt-get install netcat-traditional
if [ "$DISTRO" == "Ubuntu" ]; then
# shellcheck disable=SC2024
sudo apt-get install netcat-traditional -y >> install.log
elif [ "$DISTRO" == "Arch Linux" ]; then
# shellcheck disable=SC2024
sudo pacman -S --noconfirm netcat >> install.log
fi
echo -e "\n${COLOR_GREEN}Netcat installed successfully.${COLOR_RESET}\n"
else
echo -e "${COLOR_GREEN}Netcat is installed.${COLOR_RESET}"
fi
# Check for NPM, and install if not found
if ! command_exists npm; then
echo -e "${COLOR_RED}NPM is not installed. Installing now...${COLOR_RESET}"
echo -e "${COLOR_YELLOW}You may need to enter your sudo password.${COLOR_RESET}\n"
sudo apt-get update
sudo apt-get install npm
if [ ! -f "config.json" ]; then
echo -e "${COLOR_BLUE}Copying config file...${COLOR_RESET}"
if [ ! -f "config.json.example" ]; then
echo "Couldn't find example config file"
else
cp config.json.example config.json
fi
else
echo -e "${COLOR_GREEN}config file already exists, skipping.${COLOR_RESET}"
fi
echo -e "${COLOR_BLUE}Installing NPM deps...${COLOR_RESET}"
npm install
echo -e "\n${COLOR_GREEN}NPM installed successfully.${COLOR_RESET}\n"
touch $SETUP_FILE
# Check for lsof, and install if not found
if ! command_exists lsof && [ "$DISTRO" == "Arch Linux" ]; then
echo -e "${COLOR_RED}lsof is not installed. Installing now...${COLOR_RESET}"
# shellcheck disable=SC2024
sudo pacman -S --noconfirm lsof >> install.log
echo -e "\n${COLOR_GREEN}lsof installed successfully.${COLOR_RESET}\n"
else
echo -e "${COLOR_GREEN}NPM is installed. Version: $(npm -v)${COLOR_RESET}"
touch $SETUP_FILE
echo -e "${COLOR_GREEN}lsof is installed.${COLOR_RESET}"
fi
}
# Checks if a config.json file exists
function check_config() {
if [ ! -f "config.json" ]; then
echo -e "\n${COLOR_BLUE}Copying config file...${COLOR_RESET}"
if [ ! -f "config.json.example" ]; then
echo -e "${COLOR_RED}[!] Couldn't find example config file${COLOR_RESET}"
else
cp config.json.example config.json
echo -e "${COLOR_GREEN}Done!${COLOR_RESET}"
fi
else
echo -e "${COLOR_GREEN}Config file already exists, skipping.${COLOR_RESET}"
fi
}
# Show help message
function show_help() {
echo -e "${COLOR_GREEN}manage version:${COLOR_RESET} ${COLOR_BLUE}${SC_VERSION} ${SC_CODENAME}${COLOR_RESET}"
echo -e "${COLOR_GREEN}manage for aidxnFUN:${COLOR_RESET} ${COLOR_BLUE}v${SC_VERSION} (${SC_CODENAME})${COLOR_RESET}"
echo -e "${COLOR_BLUE}Usage:${COLOR_RESET} ./manage [command]\n"
echo -e "${COLOR_YELLOW}Commands:${COLOR_RESET}"
echo -e " ${COLOR_CYAN}help, -h, --help${COLOR_RESET} Shows this help message."
@ -93,11 +173,10 @@ function check_dirs() {
fi
done
if [ "$created_count" -gt 0 ]; then
echo -e "${COLOR_GREEN}Done.${COLOR_RESET}"
echo -e "${COLOR_GREEN}Done!${COLOR_RESET}"
else
echo -e "${COLOR_GREEN}Done.${COLOR_RESET}"
echo -e "${COLOR_YELLOW}Done, nothing created.${COLOR_RESET}"
fi
elif [ "$action" == "delete" ]; then
if [ -d "./public" ]; then
echo -e "${COLOR_BLUE}Deleting public directory...${COLOR_RESET}"
@ -106,9 +185,9 @@ function check_dirs() {
fi
if [ "$deleted_count" -gt 0 ]; then
echo -e "${COLOR_GREEN}Done.${COLOR_RESET}"
echo -e "${COLOR_GREEN}Done!${COLOR_RESET}"
else
echo -e "${COLOR_GREEN}Done.${COLOR_RESET}"
echo -e "${COLOR_YELLOW}Done, nothing deleted.${COLOR_RESET}"
fi
else
echo -e "${COLOR_RED}Invalid action: $action. Use 'create' or 'delete'.${COLOR_RESET}"
@ -120,14 +199,13 @@ function restart_server() {
check_setup
if [ -d './public' ]; then
echo -e "${COLOR_BLUE}Deleting public directories...${COLOR_RESET}"
check_dirs "delete"
fi
if [ -f './src/css/main.css' ]; then
echo -e "${COLOR_BLUE}Deleting old Tailwind CSS...${COLOR_RESET}"
rm ./src/css/main.css
echo -e "${COLOR_GREEN}Done.${COLOR_RESET}"
echo -e "${COLOR_GREEN}Done!${COLOR_RESET}"
fi
PIDS=$(lsof -t -i:$PORT)
@ -135,38 +213,53 @@ function restart_server() {
if [ -n "$PIDS" ]; then
echo -e "${COLOR_BLUE}Stopping server...${COLOR_RESET}"
for PID in $PIDS; do
kill "$PID" || echo -e "${COLOR_RED}Failed to kill PID: $PID${COLOR_RESET}"
kill "$PID" >> /dev/null || echo -e "${COLOR_RED}Failed to kill PID: $PID${COLOR_RESET}"
done
echo -e "${COLOR_GREEN}Done.${COLOR_RESET}"
echo -e "${COLOR_GREEN}Done!${COLOR_RESET}"
else
echo -e "${COLOR_YELLOW}No process found on port $PORT.${COLOR_RESET}"
fi
echo -e "${COLOR_BLUE}Creating public directories...${COLOR_RESET}"
check_dirs "create"
echo -e "${COLOR_BLUE}Building project...${COLOR_RESET}"
if ! npm run build > node.log 2>&1; then
echo -e "${COLOR_RED}Build failed. Please check for errors above.${COLOR_RESET}"
exit 1
if command_exists bun && command_exists bunx; then
if ! bun run build:linux:bun > node.log 2>&1; then
echo -e "${COLOR_RED}Build failed. Please check for errors above.${COLOR_RESET}"
exit 1
else
echo -e "${COLOR_GREEN}Done!${COLOR_RESET}"
fi
elif command_exists npm; then
if ! npm run build:linux:npm > node.log 2>&1; then
echo -e "${COLOR_RED}Build failed. Please check for errors above.${COLOR_RESET}"
exit 1
else
echo -e "${COLOR_GREEN}Done!${COLOR_RESET}"
fi
else
echo -e "${COLOR_GREEN}Done!${COLOR_RESET}"
echo -e "${COLOR_RED}NodeJS is somehow not installed, exiting.${COLOR_RESET}"
exit 1
fi
if [ -f './public/css/base.css' ]; then
echo -e "${COLOR_BLUE}Cleaning up base Tailwind CSS file...${COLOR_RESET}"
rm ./public/css/base.css
echo -e "${COLOR_GREEN}Done.${COLOR_RESET}"
echo -e "${COLOR_GREEN}Done!${COLOR_RESET}"
fi
if [ -f './node.log' ]; then
echo -e "${COLOR_BLUE}Deleting node log...${COLOR_RESET}"
rm ./node.log
echo -e "${COLOR_GREEN}Done.${COLOR_RESET}"
echo -e "${COLOR_GREEN}Done!${COLOR_RESET}"
fi
echo -e "${COLOR_BLUE}Starting server...${COLOR_RESET}"
npm start > node.log 2>&1 &
if command_exists bun; then
bun run start:bun > node.log 2>&1 &
elif command_exists npm; then
npm run start:npm > node.log 2>&1 &
fi
MAX_RETRIES=10
RETRY_INTERVAL=1
@ -174,10 +267,10 @@ function restart_server() {
for ((i=1; i<=MAX_RETRIES; i++)); do
PIDS=$(lsof -t -i:$PORT)
if [ -n "$PIDS" ]; then
echo -e "${COLOR_GREEN}\nDone. Server up and running on port $PORT!\n${COLOR_RESET}"
echo -e "${COLOR_GREEN}\nDone! Server up and running on port $PORT!\n${COLOR_RESET}"
break
else
echo -e "${COLOR_YELLOW}Waiting for server to start on port $PORT... Attempt $i/${MAX_RETRIES}${COLOR_RESET}"
echo -e "${COLOR_YELLOW}[WAITING FOR SERVER]${COLOR_RESET} Attempt $i/${MAX_RETRIES}"
sleep $RETRY_INTERVAL
fi
done
@ -203,37 +296,52 @@ function start_server() {
return
fi
echo -e "${COLOR_BLUE}Creating public directories...${COLOR_RESET}"
check_dirs "create"
if [ -f './src/css/main.css' ]; then
echo -e "${COLOR_BLUE}Deleting old Tailwind CSS...${COLOR_RESET}"
rm ./src/css/main.css
echo -e "${COLOR_GREEN}Done.${COLOR_RESET}"
echo -e "${COLOR_GREEN}Done!${COLOR_RESET}"
fi
if [ -f './node.log' ]; then
echo -e "${COLOR_BLUE}Deleting node log...${COLOR_RESET}"
rm ./node.log
echo -e "${COLOR_GREEN}Done.${COLOR_RESET}"
echo -e "${COLOR_GREEN}Done!${COLOR_RESET}"
fi
echo -e "${COLOR_BLUE}Building project...${COLOR_RESET}"
if ! npm run build > node.log 2>&1; then
echo -e "${COLOR_RED}Build failed. Please check for errors above.${COLOR_RESET}"
exit 1
if command_exists bun && command_exists bunx; then
if ! bun run build:linux:bun > node.log 2>&1; then
echo -e "${COLOR_RED}Build failed. Please check for errors above.${COLOR_RESET}"
exit 1
else
echo -e "${COLOR_GREEN}Done!${COLOR_RESET}"
fi
elif command_exists npm; then
if ! npm run build:linux:npm > node.log 2>&1; then
echo -e "${COLOR_RED}Build failed. Please check for errors above.${COLOR_RESET}"
exit 1
else
echo -e "${COLOR_GREEN}Done!${COLOR_RESET}"
fi
else
echo -e "${COLOR_GREEN}Done!${COLOR_RESET}"
echo -e "${COLOR_RED}NodeJS is somehow not installed, exiting.${COLOR_RESET}"
exit 1
fi
if [ -f './public/css/base.css' ]; then
echo -e "${COLOR_BLUE}Cleaning up base Tailwind CSS file...${COLOR_RESET}"
rm ./public/css/base.css
echo -e "${COLOR_GREEN}Done.${COLOR_RESET}"
echo -e "${COLOR_GREEN}Done!${COLOR_RESET}"
fi
echo -e "${COLOR_BLUE}Starting server...${COLOR_RESET}"
npm start > node.log 2>&1 &
if command_exists bun; then
bun run start:bun > node.log 2>&1 &
elif command_exists npm; then
npm run start:npm > node.log 2>&1 &
fi
MAX_RETRIES=10
RETRY_INTERVAL=1
@ -241,10 +349,10 @@ function start_server() {
for ((i=1; i<=MAX_RETRIES; i++)); do
PIDS=$(lsof -t -i:$PORT)
if [ -n "$PIDS" ]; then
echo -e "${COLOR_GREEN}\nDone. Server up and running on port $PORT!\n${COLOR_RESET}"
echo -e "${COLOR_GREEN}\nDone! Server up and running on port $PORT!\n${COLOR_RESET}"
break
else
echo -e "${COLOR_YELLOW}Waiting for server to start on port $PORT... Attempt $i/${MAX_RETRIES}${COLOR_RESET}"
echo -e "${COLOR_YELLOW}[WAITING FOR SERVER]${COLOR_RESET} Attempt $i/${MAX_RETRIES}"
sleep $RETRY_INTERVAL
fi
done
@ -264,20 +372,19 @@ function stop_server() {
PID=$(lsof -t -i:$PORT)
if [ -d './public' ]; then
echo -e "${COLOR_BLUE}Deleting public directories...${COLOR_RESET}"
check_dirs "delete"
fi
if [ -f './src/css/main.css' ]; then
echo -e "${COLOR_BLUE}Deleting Tailwind CSS...${COLOR_RESET}"
rm ./src/css/main.css
echo -e "${COLOR_GREEN}Done.${COLOR_RESET}"
echo -e "${COLOR_GREEN}Done!${COLOR_RESET}"
fi
if [ -f './node.log' ]; then
echo -e "${COLOR_BLUE}Deleting node log...${COLOR_RESET}"
rm ./node.log
echo -e "${COLOR_GREEN}Done.${COLOR_RESET}"
echo -e "${COLOR_GREEN}Done!${COLOR_RESET}"
fi
PIDS=$(lsof -t -i:$PORT)
@ -285,9 +392,9 @@ function stop_server() {
if [ -n "$PIDS" ]; then
echo -e "${COLOR_BLUE}Stopping server...${COLOR_RESET}"
for PID in $PIDS; do
kill "$PID" || echo -e "${COLOR_RED}Failed to kill PID: $PID${COLOR_RESET}"
kill "$PID" >> /dev/null || echo -e "${COLOR_RED}Failed to kill PID: $PID${COLOR_RESET}"
done
echo -e "${COLOR_GREEN}Done.${COLOR_RESET}"
echo -e "${COLOR_GREEN}Done!${COLOR_RESET}"
else
echo -e "${COLOR_YELLOW}No process found on port $PORT.${COLOR_RESET}"
fi
@ -298,46 +405,82 @@ function check_status() {
check_setup
PID=$(lsof -t -i:$PORT)
echo -e "${COLOR_GREEN}manage for aidxnFUN:${COLOR_RESET} ${COLOR_BLUE}v${SC_VERSION} (${SC_CODENAME})${COLOR_RESET}"
if [ -n "$PID" ]; then
echo -e "${COLOR_GREEN}Server running with PID: $PID${COLOR_RESET}"
echo -e "${COLOR_GREEN}[SERVER]${COLOR_RESET} Running with PID: $PID"
else
echo -e "${COLOR_RED}Server not running.${COLOR_RESET}"
echo -e "${COLOR_RED}[SERVER]${COLOR_RESET} Down${COLOR_RESET}"
fi
}
# Master setup function/process
function setup() {
if [ "$DISTRO" != "Ubuntu" ] && [ "$DISTRO" != "Arch Linux" ]; then
echo -e "${COLOR_RED}This script is only supported on Ubuntu and Arch Linux${COLOR_RESET}"
exit 1
fi
clear
echo -e "${COLOR_BLUE}Welcome to the aidxnFUN 'manage' script setup!\n${COLOR_RESET}${COLOR_CYAN}You are running manage ${SC_VERSION} ${SC_CODENAME}${COLOR_RESET}\n"
echo -e "${COLOR_BLUE}Welcome to the aidxnFUN 'manage' script setup!\n${COLOR_RESET}${COLOR_CYAN}You are running manage v${SC_VERSION} (${SC_CODENAME})${COLOR_RESET}\n"
echo -e "${COLOR_GREEN}A custom script built by ihatenodejs${COLOR_RESET}"
echo -e "${COLOR_YELLOW}and presented by forkers like you...${COLOR_RESET}"
echo -e "\nPress any key to continue..."
read -n 1 -s -r -p ""
clear
echo -e "This script requires Node.js, NPM, and Netcat to be installed on your system."
echo "Please ensure you have these tools installed before proceeding."
echo -e "${COLOR_BLUE}This script requires Node.js+NPM/Bun, curl, lsof, and Netcat to be installed on your system.${COLOR_RESET}"
echo -e "${COLOR_BLUE}It will attempt to install all of the required dependencies, although this might not work every time.${COLOR_RESET}"
echo -e "${COLOR_YELLOW}You may need to enter your sudo password.${COLOR_RESET}"
echo -e "\nPress any key to continue with tool installation..."
read -n 1 -s -r -p ""
clear
# Execute install tool script
install_tools
# Install NPM dependencies
npm install
# Check if config file exists
check_config
# Configure provider and install Node dependencies
if command_exists bun; then
echo -e "\n${COLOR_BLUE}Setting provider to Bun...${COLOR_RESET}"
echo "DO NOT EDIT THIS: bun" > .njs.provider
echo -e "${COLOR_GREEN}Done!${COLOR_RESET}"
echo -e "\n${COLOR_BLUE}Installing dependencies with Bun...${COLOR_RESET}"
bun install >> install.log
echo -e "${COLOR_GREEN}Done!${COLOR_RESET}"
elif command_exists npm; then
echo -e "\n${COLOR_BLUE}Setting provider to Node/NPM...${COLOR_RESET}"
echo "DO NOT EDIT THIS: node" > .njs.provider
echo -e "${COLOR_GREEN}Done!${COLOR_RESET}"
echo -e "\n${COLOR_BLUE}Installing dependencies with NPM...${COLOR_RESET}"
npm install >> install.log
echo -e "${COLOR_GREEN}Done!${COLOR_RESET}"
else
echo -e "${COLOR_RED}NodeJS is somehow not installed, exiting.${COLOR_RESET}"
exit 1
fi
echo -e "\n${COLOR_GREEN}Dependency installation complete!${COLOR_RESET}"
echo -e "\n${COLOR_BLUE}If you would like to view the install logs, please do so, or click [ENTER] to continue to the next step.${COLOR_RESET}\n"
echo -e "${COLOR_BLUE}You can view the complete log of the installation process in the install.log file${COLOR_RESET}"
if [ "$NOB" == "bun_installed" ]; then
echo -e "\n${COLOR_RED}Make sure to add this to your shell profile (most likely ~/.bashrc):${COLOR_RESET}"
echo -e "${COLOR_GREEN}export BUN_INSTALL=\"$HOME/.bun\"${COLOR_RESET}"
echo -e "${COLOR_GREEN}export PATH=\"\$BUN_INSTALL/bin:\$PATH\"${COLOR_RESET}"
fi
echo -e "\nPress [ENTER] to continue to the next step."
read -n 1 -s -r -p ""
clear
echo -e "${COLOR_GREEN}Now, take a look at the commands you can use with this script:${COLOR_RESET}\n"
echo -e "${COLOR_GREEN}Take a look at the tasks you can perform automatically with manage:${COLOR_RESET}\n"
# Show the user help message
show_help
echo -e "\nPress any key to continue to the final step..."
read -n 1 -s -r -p ""
clear
# Quick commands
echo -e "${COLOR_BLUE}Now, you may start the server with this command:${COLOR_RESET}"
echo -e "${COLOR_GREEN}./manage up${COLOR_RESET}\n"
echo -e "\n${COLOR_BLUE}If you need help, or to get info about other commands, simply use:${COLOR_RESET}"
@ -346,6 +489,7 @@ function setup() {
read -n 1 -s -r -p ""
clear
echo -e "${COLOR_GREEN}Thank you for using manage ${SC_VERSION} ${SC_CODENAME}!${COLOR_RESET}\n"
touch $SETUP_FILE
exit 0
}

View File

@ -1,32 +1,36 @@
{
"name": "aidxnfun",
"version": "1.0.0",
"version": "1.4.0",
"main": "index.js",
"scripts": {
"build:css:linux": "npx tailwindcss -i ./src/css/base.css -o ./src/css/main.css && cp -r ./src/css ./public/",
"build:css:linux:npx": "npx @tailwindcss/cli -i ./src/css/base.css -o ./src/css/main.css && cp -r ./src/css ./public/",
"build:css:linux:bunx": "bunx @tailwindcss/cli -i ./src/css/base.css -o ./src/css/main.css && cp -r ./src/css ./public/",
"build:js:linux": "cp -r ./src/js ./public/",
"build:img:linux": "cp -r ./src/img ./public/",
"build:pgp:linux": "cp -r ./src/pgp ./public/",
"copy:favicon:linux": "cp ./src/favicon.ico ./public/",
"build:css:win": "npx tailwindcss -i ./src/css/base.css -o ./src/css/main.css && xcopy /E /I /Y \"./src/css\" \"./public/css\"",
"build:css:win:npx": "npx @tailwindcss/cli -i ./src/css/base.css -o ./src/css/main.css && xcopy /E /I /Y \"./src/css\" \"./public/css\"",
"build:css:win:bunx": "npx @tailwindcss/cli -i ./src/css/base.css -o ./src/css/main.css && xcopy /E /I /Y \"./src/css\" \"./public/css\"",
"build:js:win": "xcopy /E /I /Y \"./src/js\" \"./public/js\"",
"build:img:win": "xcopy /E /I /Y \"./src/img\" \"./public/img\"",
"build:pgp:win": "xcopy /E /I /Y \"./src/pgp\" \"./public/pgp\"",
"copy:favicon:win": "copy /Y \"./src/favicon.ico\" \"./public/\"",
"build:linux": "npm run build:css:linux && npm run build:js:linux && npm run build:img:linux && npm run build:pgp:linux && npm run copy:favicon:linux",
"build:win": "npm run build:css:win && npm run build:js:win && npm run build:img:win && npm run build:pgp:win && npm run copy:favicon:win",
"build": "npm run build:linux",
"winbuild": "npm run build:win",
"start": "node app.js"
"build:linux:npm": "npm run build:css:linux:npx && npm run build:js:linux && npm run build:img:linux && npm run build:pgp:linux && npm run copy:favicon:linux",
"build:linux:bun": "bun run build:css:linux:bunx && bun run build:js:linux && bun run build:img:linux && bun run build:pgp:linux && bun run copy:favicon:linux",
"build:win:npm": "npm run build:css:win:npx && npm run build:js:win && npm run build:img:win && npm run build:pgp:win && npm run copy:favicon:win",
"build:win:bun": "bun run build:css:win:bunx && bun run build:js:win && bun run build:img:win && bun run build:pgp:win && bun run copy:favicon:win",
"start:bun": "bun app.js",
"start:npm": "npm app.js"
},
"private": true,
"devDependencies": {
"autoprefixer": "^10.4.20",
"postcss": "^8.4.47",
"tailwindcss": "^3.4.13"
"postcss": "^8.5.3",
"tailwindcss": "^4.0.12"
},
"dependencies": {
"@fortawesome/fontawesome-free": "^6.6.0",
"@fortawesome/fontawesome-free": "^6.7.2",
"@tailwindcss/cli": "^4.0.12",
"ansi-regex": "^6.1.0",
"ansi-styles": "^6.2.1",
"any-promise": "^1.3.0",
@ -37,35 +41,35 @@
"brace-expansion": "^4.0.0",
"braces": "^3.0.3",
"camelcase-css": "^2.0.1",
"chokidar": "^4.0.1",
"chokidar": "^4.0.3",
"color-convert": "^2.0.1",
"color-name": "^2.0.0",
"commander": "^13.0.0",
"cross-spawn": "^7.0.3",
"commander": "^13.1.0",
"cross-spawn": "^7.0.6",
"cssesc": "^3.0.0",
"didyoumean": "^1.2.2",
"dlv": "^1.1.3",
"eastasianwidth": "^0.3.0",
"ejs": "^3.1.10",
"emoji-regex": "^10.4.0",
"express": "^4.21.1",
"fast-glob": "^3.3.2",
"fastq": "^1.17.1",
"express": "^4.21.2",
"fast-glob": "^3.3.3",
"fastq": "^1.19.1",
"fill-range": "^7.1.1",
"foreground-child": "^3.3.0",
"foreground-child": "^3.3.1",
"function-bind": "^1.1.2",
"glob": "^11.0.0",
"glob": "^11.0.1",
"glob-parent": "^6.0.2",
"hasown": "^2.0.2",
"is-binary-path": "^3.0.0",
"is-core-module": "^2.15.1",
"is-core-module": "^2.16.1",
"is-extglob": "^2.1.1",
"is-fullwidth-code-point": "^5.0.0",
"is-glob": "^4.0.3",
"is-number": "^7.0.0",
"isexe": "^3.1.1",
"jackspeak": "^4.0.2",
"jiti": "^2.4.1",
"jackspeak": "^4.1.0",
"jiti": "^2.4.2",
"lilconfig": "^3.1.3",
"lines-and-columns": "^2.0.4",
"lru-cache": "^11.0.2",
@ -73,18 +77,18 @@
"micromatch": "^4.0.8",
"minimatch": "^10.0.1",
"minipass": "^7.1.2",
"mysql2": "^3.11.3",
"mysql2": "^3.13.0",
"mz": "^2.7.0",
"nanoid": "^5.0.9",
"nanoid": "^5.1.3",
"normalize-path": "^3.0.0",
"object-assign": "^4.1.1",
"object-hash": "^3.0.0",
"openpgp": "^6.0.0",
"openpgp": "^6.1.0",
"package-json-from-dist": "^1.0.1",
"path-key": "^4.0.0",
"path-parse": "^1.0.7",
"path-scurry": "^2.0.0",
"picocolors": "^1.1.0",
"picocolors": "^1.1.1",
"picomatch": "^4.0.2",
"pify": "^6.1.0",
"pirates": "^4.0.6",
@ -92,13 +96,13 @@
"postcss-js": "^4.0.1",
"postcss-load-config": "^6.0.1",
"postcss-nested": "^7.0.2",
"postcss-selector-parser": "^7.0.0",
"postcss-selector-parser": "^7.1.0",
"postcss-value-parser": "^4.2.0",
"queue-microtask": "^1.2.3",
"read-cache": "^1.0.0",
"readdirp": "^4.0.2",
"resolve": "^1.22.8",
"reusify": "^1.0.4",
"readdirp": "^4.1.2",
"resolve": "^1.22.10",
"reusify": "^1.1.0",
"run-parallel": "^1.2.0",
"shebang-command": "^2.0.0",
"shebang-regex": "^4.0.0",
@ -118,10 +122,13 @@
"which": "^5.0.0",
"wrap-ansi": "^9.0.0",
"wrap-ansi-cjs": "^8.0.0",
"yaml": "^2.5.1"
"yaml": "^2.7.0"
},
"keywords": [],
"author": "ihatenodejs",
"license": "CC0-1.0",
"description": "The full code of my website"
"description": "The full code of my website",
"trustedDependencies": [
"@parcel/watcher"
]
}

View File

@ -1,6 +1,26 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
@import 'tailwindcss';
@theme {
--font-afacad-flux: 'Afacad Flux', sans-serif;
}
/*
The default border color has changed to `currentColor` in Tailwind CSS v4,
so we've added these compatibility styles to make sure everything still
looks the same as it did with Tailwind CSS v3.
If we ever want to remove these styles, we need to add an explicit border
color utility to any element that depends on these defaults.
*/
@layer base {
*,
::after,
::before,
::backdrop,
::file-selector-button {
border-color: var(--color-gray-200, currentColor);
}
}
.glow-txt {
text-shadow: 0 0 10px rgba(255, 255, 255, 0.7), 0 0 20px rgba(255, 255, 255, 0.5), 0 0 30px rgba(255, 255, 255, 0.3);

View File

@ -1,13 +0,0 @@
/** @type {import('tailwindcss').Config} */
module.exports = {
content: ["./views/**/*.{ejs,js}"],
theme: {
extend: {
fontFamily: {
'afacad-flux': ['"Afacad Flux"', 'sans-serif'],
},
},
},
plugins: [],
};

View File

@ -9,13 +9,13 @@
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Afacad+Flux:wght@100..1000&display=swap" rel="stylesheet">
</head>
<body class="bg-gradient-to-br from-slate-900 to-black text-white font-afacad-flux">
<body class="bg-linear-to-br from-slate-900 to-black text-white font-afacad-flux">
<%- include('shards/header.ejs', { req: req }) %>
<header class="flex flex-col items-center justify-center h-[40vh] p-6">
<h1 class="text-5xl font-bold mb-2 text-center">About Me</h1>
<p class="text-lg text-gray-300 max-w-xl text-center mt-3">Looking to learn more?</p>
</header>
<div class="bg-gradient-to-br from-slate-800/80 to-slate-900/80 border border-slate-800 backdrop-blur-md shadow-xl rounded-2xl p-8 mx-4">
<div class="bg-linear-to-br from-slate-800/80 to-slate-900/80 border border-slate-800 backdrop-blur-md shadow-xl rounded-2xl p-8 mx-4">
<h3 class="text-2xl font-bold mb-4 text-white">What you're looking for</h3>
<p class="text-slate-300 mb-4">Heyo! I'm Aidan, and I'm a human being, like you. I'm a Wikipedia editor, hobbyist programmer (Python, Node.js and PHP) and student. I am a troubled teen industry survivor and I also <i>love</i> music! I love walking (pretty much anywhere), particularly Boston and some Mass suburbs. I'm a cryptocurrency user and love it way more than credit cards/cash. However, I am strongly opposed to the adoption of Web3 technology.</p>
<p class="text-slate-300 mb-4">I archive adverts and culture items (especially digital media) over on my secondary website for my online personality, <a href="https://p0ntus.com" class="underline">p0ntus.com</a>. Maybe give it a peek! Most items are uploaded in full quality, and files are served from a server in Michigan.</p>

View File

@ -9,13 +9,13 @@
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Afacad+Flux:wght@100..1000&display=swap" rel="stylesheet">
</head>
<body class="bg-gradient-to-br from-slate-900 to-black text-white font-afacad-flux">
<body class="bg-linear-to-br from-slate-900 to-black text-white font-afacad-flux">
<%- include('shards/header.ejs', { req: req }) %>
<header class="flex flex-col items-center justify-center h-[40vh] p-6">
<h1 class="text-5xl font-bold mb-2 text-center">Cloud</h1>
<p class="text-lg text-gray-300 max-w-xl text-center mt-3">Looking to learn about my experience with the cloud?</p>
</header>
<div class="bg-gradient-to-br from-slate-800/80 to-slate-900/80 border border-slate-800 backdrop-blur-md shadow-xl rounded-2xl p-8 mx-4">
<div class="bg-linear-to-br from-slate-800/80 to-slate-900/80 border border-slate-800 backdrop-blur-md shadow-xl rounded-2xl p-8 mx-4">
<h3 class="text-2xl font-bold mb-4 text-white">Platforms</h3>
<p class="text-slate-300 mb-4">I also work a <i>LOT</i> in the cloud, but not the type you might be thinking about. I almost have an obsession to enterprise cloud computing. Hell, you're actually connected to one... right now! Here are some of my favorite platforms, ranked.</p>
<p class="text-slate-300 mb-4">This section is a work in progress, for those who don't know cloud computing. I'm working to make the wording clearer, so the non-technical folk can still understand everything here!</p>

View File

@ -10,7 +10,7 @@
<link href="https://fonts.googleapis.com/css2?family=Afacad+Flux:wght@100..1000&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.6.0/css/all.min.css" integrity="sha512-Kc323vGBEqzTmouAECnVceyQqyqdsSiqLQISBL29aUW4U/M7pSPA/gEUZQqv1cwx4OnYxTxve5UMg5GT6L4JJg==" crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
<body class="bg-gradient-to-br from-slate-900 to-black text-white font-afacad-flux">
<body class="bg-linear-to-br from-slate-900 to-black text-white font-afacad-flux">
<%- include('shards/header.ejs', { req: req }) %>
<header class="flex flex-col items-center justify-center h-[40vh] p-6">
@ -18,7 +18,7 @@
<p class="text-lg text-gray-300 max-w-xl text-center mt-3">Looking to contact me? You found it!</p>
</header>
<div class="bg-gradient-to-br from-slate-800/80 to-slate-900/80 border border-slate-800 backdrop-blur-md shadow-xl rounded-2xl p-8 mx-4">
<div class="bg-linear-to-br from-slate-800/80 to-slate-900/80 border border-slate-800 backdrop-blur-md shadow-xl rounded-2xl p-8 mx-4">
<h3 class="text-2xl font-bold mb-4 text-white">Contact Details</h3>
<p class="text-slate-300 mb-4">This one can be a hard one for most people, as I'm not a fan of modern social media, albeit I give in here and there.</p>
<p class="text-slate-300 mb-4">If you're looking for my email, simply replace the brackets with the character it's referencing, like so: test[at]test[dot]com becomes test@test.com. This is in order to prevent bots from contacting me!</p>

View File

@ -20,7 +20,7 @@
</div>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 gap-6 p-4">
<div class="bg-gradient-to-br from-slate-800/80 to-slate-900/80 border border-slate-800 backdrop-blur-md shadow-xl rounded-2xl p-8">
<div class="bg-linear-to-br from-slate-800/80 to-slate-900/80 border border-slate-800 backdrop-blur-md shadow-xl rounded-2xl p-8">
<h1 class="text-4xl font-bold mb-4 text-white">Welcome!</h1>
<p class="text-slate-300">Outside of the internet, I am known as Aidan. If you are a <a class="underline" href="https://tilde.club">tilde.club</a> user, you will know me as <a class="underline" href="https://tilde.club/~lxu">~lxu</a>! I am a technology enthusiast, Wikipedia editor, personal systems administator, and Linux user.</p>
<p class="text-slate-300 mt-3">Here, you can learn more about me, put my programming skills to the test, and even have some fun along the way!</p>
@ -28,13 +28,13 @@
<p class="text-slate-300 mt-3">This website is currently hosted in Frankfurt, Germany. Page load speeds may be impacted, however my website's data is hosted under stricter data protection laws. I'm not a millionaire, and hosting out of Germany helps me save money on hosting, and serve a wider range of countries with better speeds.</p>
<p class="text-slate-300 mt-3">The content and code of this website is hereby released under the public domain. You are free to use this servers content for whatever you please, and you can additionally view this website's source code on GitHub <a class="underline" href="https://github.com/ihatenodejs/aidxnFUN/">here</a>.</p>
</div>
<div class="bg-gradient-to-br from-slate-800/80 to-slate-900/80 border border-slate-800 backdrop-blur-md shadow-xl rounded-2xl p-8">
<div class="bg-linear-to-br from-slate-800/80 to-slate-900/80 border border-slate-800 backdrop-blur-md shadow-xl rounded-2xl p-8">
<h1 class="text-4xl font-bold mb-4 text-white">Where to start</h1>
<p class="text-slate-300">This website has a lot of content, albeit spread apart. If you're interested in learning about me as a person, I'd obviously suggest <a class="underline" href="/about">my about page</a>. For opinionated content, my <a class="underline" href="https://blog.aidxn.fun">blog</a> (currently down) is a great place to check out. I also write casually on my <a class="underline" href="https://tilde.club/~lxu">tilde site</a> hosted on <a class="underline" href="https://tilde.club/">tilde.club</a>.</p>
<p class="text-slate-300 mt-3">If you merely need to contact me, check out the <a class="underline" href="/contact">contact page</a> on the sidebar (or you could click that link).</p>
<p class="text-slate-300 mt-3">This website is always a work in progress, and not every page is going to be finished, however I aim for every page to be functional and relevant. Content is always being added, as I progress through my life. Why not start early?</p>
</div>
<div class="bg-gradient-to-br from-slate-800/80 to-slate-900/80 border border-slate-800 backdrop-blur-md shadow-xl rounded-2xl p-8">
<div class="bg-linear-to-br from-slate-800/80 to-slate-900/80 border border-slate-800 backdrop-blur-md shadow-xl rounded-2xl p-8">
<h1 class="text-4xl font-bold mb-4 text-white">Music</h1>
<%- include('shards/music.ejs') %>
<h1 class="text-3xl text-white py-3.5">My Music Taste</h1>
@ -42,7 +42,7 @@
<p class="text-slate-300 mt-3">Some of my favorite artists include tobi lou, Flyana Boss, and Kali Uchis. Some of my "classics" are Mike Stud (before his name change to "mike."), Skizzy Mars, tobi lou, The Neighbourhood, and Ryan Caraveo.</p>
<p class="text-slate-300 mt-3">If you are interested, you can check out my LastFM profile <a class="underline" href="https://www.last.fm/user/aidxn_">here</a>.
</div>
<div class="bg-gradient-to-br from-slate-800/80 to-slate-900/80 border border-slate-800 backdrop-blur-md shadow-xl rounded-2xl p-8">
<div class="bg-linear-to-br from-slate-800/80 to-slate-900/80 border border-slate-800 backdrop-blur-md shadow-xl rounded-2xl p-8">
<h1 class="text-4xl font-bold mb-4 text-white">About the design</h1>
<p class="text-slate-300">With this revision, I was aiming to provide a modern design, with an easy-to-navigate interface. I always appreciate dark-themed websites, and decided to add some subtle gradients with glass effects to spice the design up. While I am a developer more than I am a designer, I quite favor this design and it has become the pinnacle of my design work.</p>
<p class="text-slate-300 mt-3">For this design, I chose Tailwind CSS. I appreciate their flexibility, although it appears their documentation poorly written on purpose. They encourage purchasing their components subscription (which costs a lot of money!) all over the documentation, especially in confusing ways. While it has been a poor experience there, I have been able to figure it out with the help of their free elements, documentation, prior knowledge, and the docs.</p>

View File

@ -9,13 +9,13 @@
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Afacad+Flux:wght@100..1000&display=swap" rel="stylesheet">
</head>
<body class="bg-gradient-to-br from-slate-900 to-black text-white font-afacad-flux">
<body class="bg-linear-to-br from-slate-900 to-black text-white font-afacad-flux">
<%- include('shards/header.ejs', { req: req }) %>
<header class="flex flex-col items-center justify-center h-[40vh] p-6">
<h1 class="text-5xl font-bold mb-2 text-center">Digital Manifesto</h1>
<p class="text-lg text-gray-300 max-w-xl text-center mt-3">A commitment from me for a better Internet space.</p>
</header>
<div class="bg-gradient-to-br from-slate-800/80 to-slate-900/80 border border-slate-800 backdrop-blur-md shadow-xl rounded-2xl p-8 mx-4">
<div class="bg-linear-to-br from-slate-800/80 to-slate-900/80 border border-slate-800 backdrop-blur-md shadow-xl rounded-2xl p-8 mx-4">
<h3 class="text-2xl font-bold mb-4 text-white">1. Empathy and Understanding</h3>
<p class="text-slate-300 mb-4">We live in a distant world. People I meet are from all over, which can be hard to understand for others. I aim to utilize my ability to connect by understanding and getting <i>interested</i> in people's lives. I pledge to:</p>
<ul class="list-disc pl-5 space-y-2">

View File

@ -9,13 +9,13 @@
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Afacad+Flux:wght@100..1000&display=swap" rel="stylesheet">
</head>
<body class="bg-gradient-to-br from-slate-900 to-black text-white font-afacad-flux">
<body class="bg-linear-to-br from-slate-900 to-black text-white font-afacad-flux">
<%- include('shards/header.ejs', { req: req }) %>
<header class="flex flex-col items-center justify-center h-[40vh] p-6">
<h1 class="text-5xl font-bold mb-2 text-center">Projects</h1>
<p class="text-lg text-gray-300 max-w-xl text-center mt-3">Looking to learn more about my projects?</p>
</header>
<div class="bg-gradient-to-br from-slate-800/80 to-slate-900/80 border border-slate-800 backdrop-blur-md shadow-xl rounded-2xl p-8 mx-4">
<div class="bg-linear-to-br from-slate-800/80 to-slate-900/80 border border-slate-800 backdrop-blur-md shadow-xl rounded-2xl p-8 mx-4">
<h3 class="text-2xl font-bold mb-4 text-white">Currently working on</h3>
<p class="text-slate-300 mb-4">You can check out my GitHub account right <a href="https://github.com/ihatenodejs">here</a>.</p>
<p class="text-slate-300 mb-4">I am currently working on the following projects (in order of activity):</p>

View File

@ -1,7 +1,7 @@
<!-- The body/head/html tag is purposely not included here, as it gives the user easier freedom to control the stying and details of the page (such as title) -->
<div id="notification-banner" class="relative isolate flex items-center gap-x-6 overflow-hidden bg-gray-800/50 backdrop-blur-md px-6 py-2.5 rounded-lg shadow-lg">
<div class="absolute left-0 top-1/2 -z-10 -translate-y-1/2 transform-gpu blur-2xl">
<div class="aspect-[577/310] w-[36.0625rem] bg-gradient-to-r from-[#ff80b5] to-[#9089fc] opacity-30" style="clip-path: polygon(74.8% 41.9%, 97.2% 73.2%, 100% 34.9%, 92.5% 0.4%, 87.5% 0%, 75% 28.6%, 58.5% 54.6%, 50.1% 56.8%, 46.9% 44%, 48.3% 17.4%, 24.7% 53.9%, 0% 27.9%, 11.9% 74.2%, 24.9% 54.1%, 68.6% 100%, 74.8% 41.9%)"></div>
<div class="aspect-577/310 w-[36.0625rem] bg-linear-to-r from-[#ff80b5] to-[#9089fc] opacity-30" style="clip-path: polygon(74.8% 41.9%, 97.2% 73.2%, 100% 34.9%, 92.5% 0.4%, 87.5% 0%, 75% 28.6%, 58.5% 54.6%, 50.1% 56.8%, 46.9% 44%, 48.3% 17.4%, 24.7% 53.9%, 0% 27.9%, 11.9% 74.2%, 24.9% 54.1%, 68.6% 100%, 74.8% 41.9%)"></div>
</div>
<div class="flex flex-wrap items-center gap-x-4 gap-y-2">
<p class="text-sm leading-6 text-gray-100">
@ -11,7 +11,7 @@
</svg>
Check out old.aidxn.fun for a retro experience!
</p>
<a href="https://old.aidxn.fun" class="flex-none rounded-full bg-gray-900 px-3.5 py-1 text-sm font-semibold text-white shadow-sm hover:bg-gray-700 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-slate-700">Go retro <span aria-hidden="true">&rarr;</span></a>
<a href="https://old.aidxn.fun" class="flex-none rounded-full bg-gray-900 px-3.5 py-1 text-sm font-semibold text-white shadow-xs hover:bg-gray-700 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-slate-700">Go retro <span aria-hidden="true">&rarr;</span></a>
</div>
<div class="flex flex-1 justify-end">
<button type="button" id="dismiss-btn" class="-m-3 p-3 focus-visible:outline-offset-[-4px]">
@ -48,7 +48,7 @@
<path fill-rule="evenodd" d="M5.22 8.22a.75.75 0 0 1 1.06 0L10 11.94l3.72-3.72a.75.75 0 1 1 1.06 1.06l-4.25 4.25a.75.75 0 0 1-1.06 0L5.22 9.28a.75.75 0 0 1 0-1.06Z" clip-rule="evenodd" />
</svg>
</a>
<div class="absolute right-0 z-10 w-56 origin-top-right rounded-md bg-gray-800 shadow-lg ring-1 ring-gray-700 focus:outline-none mt-5 hidden" role="menu" aria-orientation="vertical" aria-labelledby="menu-button" tabindex="-1">
<div class="absolute right-0 z-10 w-56 origin-top-right rounded-md bg-gray-800 shadow-lg ring-1 ring-gray-700 focus:outline-hidden mt-5 hidden" role="menu" aria-orientation="vertical" aria-labelledby="menu-button" tabindex="-1">
<div class="py-1" role="none">
<a href="https://aidxn.cc" class="block px-4 py-2 text-sm text-gray-100 hover:bg-gray-700" role="menuitem" tabindex="-1" id="menu-item-1">Main Site</a>
<a href="https://blog.aidxn.fun" class="block px-4 py-2 text-sm text-gray-100 hover:bg-gray-700" role="menuitem" tabindex="-1" id="menu-item-1">Blog</a>

View File

@ -10,7 +10,7 @@
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Afacad+Flux:wght@100..1000&display=swap" rel="stylesheet">
</head>
<body class="bg-gradient-to-br from-slate-900 to-black text-white font-afacad-flux">
<body class="bg-linear-to-br from-slate-900 to-black text-white font-afacad-flux">
<%- include('shards/header.ejs', { req: req }) %>
<header class="flex flex-col items-center justify-center h-[40vh] p-6">
@ -23,7 +23,7 @@
<h1 class="text-2xl font-bold">Testing pings...</h1>
</div>
<div id="content" class="hidden bg-gradient-to-br from-slate-800/80 to-slate-900/80 border border-slate-800 backdrop-blur-md shadow-xl rounded-2xl p-8 mx-4">
<div id="content" class="hidden bg-linear-to-br from-slate-800/80 to-slate-900/80 border border-slate-800 backdrop-blur-md shadow-xl rounded-2xl p-8 mx-4">
<div>
<h3 class="text-2xl font-bold mb-4 text-white">What is this page?</h3>
<p class="text-slate-300 mb-4">This page displays information about the status of my personal servers. This excludes private servers, which are used for projects such as my "home" lab (it's hosted in the cloud).</p>

View File

@ -10,7 +10,7 @@
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Afacad+Flux:wght@100..1000&display=swap" rel="stylesheet">
</head>
<body class="bg-gradient-to-br from-slate-900 to-black text-white font-afacad-flux">
<body class="bg-linear-to-br from-slate-900 to-black text-white font-afacad-flux">
<%- include('shards/header.ejs', { req: req }) %>
<header class="flex flex-col items-center justify-center h-[40vh] p-6">
@ -18,7 +18,7 @@
<p class="text-lg text-gray-300 max-w-xl text-center mt-3">Let's check if that message really came from me!</p>
</header>
<div class="bg-gradient-to-br from-slate-800/80 to-slate-900/80 border border-slate-800 backdrop-blur-md shadow-xl rounded-2xl p-8 mx-4">
<div class="bg-linear-to-br from-slate-800/80 to-slate-900/80 border border-slate-800 backdrop-blur-md shadow-xl rounded-2xl p-8 mx-4">
<h3 class="text-2xl font-bold mb-4 text-white">Introduction</h3>
<p class="text-slate-300 mb-4">Did I send you a PGP signed message? Let's check it's actually from me! The form below will verify the message was signed by my key.</p>
<p class="text-slate-300 mb-4"><span class="font-bold">Remember</span>, if you have confirmed my key in person, you should always trust that key over this page.</p>
@ -27,10 +27,10 @@
<form action="/verify" method="POST" class="space-y-4">
<label for="pgpMessage" class="block text-slate-300">PGP Message:</label>
<textarea id="pgpMessage" name="pgpMessage" class="w-full p-2 bg-slate-800 text-slate-300 rounded-md" rows="10" placeholder="Paste a PGP-signed message here"></textarea>
<button type="submit" class="bg-blue-500 hover:bg-blue-600 text-white font-bold py-2 px-4 rounded">Verify</button>
<button type="submit" class="bg-blue-500 hover:bg-blue-600 text-white font-bold py-2 px-4 rounded-sm">Verify</button>
</form>
<% if (verifyResult) { %>
<div class="mt-4 p-4 rounded bg-slate-800 text-white">
<div class="mt-4 p-4 rounded-sm bg-slate-800 text-white">
<p><%= verifyResult %></p>
</div>
<% } %>