Compare commits

..
5 Commits
Author SHA1 Message Date
pizza2d1 71dc685362 add images 2026-10-04 16:37:13 -06:00
pizza2d1 0bba05f0ed services page done, working on projects 2026-10-04 16:27:58 -06:00
pizza2d1 3e3e604cc3 Made a whoopsie 2026-10-03 23:57:07 -06:00
pizza2d1 b394489b36 Finished styling services section on main page 2026-10-03 23:50:27 -06:00
pizza2d1 bfd0c93dbb Separating free services from user-required services 2026-10-03 22:45:57 -06:00
35 changed files with 428 additions and 54 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Before

Width:  |  Height:  |  Size: 139 KiB

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 KiB

Before

Width:  |  Height:  |  Size: 6.0 MiB

After

Width:  |  Height:  |  Size: 6.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 266 KiB

+7
View File
@@ -0,0 +1,7 @@
ffmpeg -i ./building_rack.png -vf "scale=382:288" ./building_rack_smaller.png
ffmpeg -i ./laptop_to_rack.png -vf "scale=382:288" ./laptop_to_rack_smaller.png
ffmpeg -i ./server_all.png -vf "scale=382:288" ./server_all_smaller.png
ffmpeg -i ./server_back.png -vf "scale=382:288" ./server_back_smaller.png
ffmpeg -i ./server_front.png -vf "scale=382:288" ./server_front_smaller.png
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 231 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 258 KiB

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

@@ -1,6 +0,0 @@
A while ago I had acquired a chromebook from my school as they were doing a cleanout, so I was able to nab this crappy school chromebook that had a detachable battery and a 5GB 2.5" internal SSD
!image assets/img/projects/arch_chromebook/arch_chromebook.jpg
I wanted to try and install a new operating system on it, and since I was in my distrohopping phase I wanted to try installing Arch Linux on it, since I figure that would allow it to be actually usable rather than in it's chromeOS state
The main issue was that the current operating system had a lock on it that made it so that you as a student wouldn't be able to boot into a different operating system, either through installing a new OS on the current drive or through using a LiveCD.
So what I had to do was go INTO the currently installed operating system, toggle a setting, and then use a tool that would install <a href='https://chromeos.google/products/chromeos-flex/'>ChromeFlex</a>, which basically acted as an intermediary operating system so that I could unlock the actual firmware, letting me plug in a better drive
Now that I could put in my own drive and not have the device yell at me for not having a ChromeOS operating system I went ahead and installed Arch Linux on the drive and booted it up
@@ -0,0 +1,11 @@
One of my most prominent and biggest projects has got to be my homelab server. I have spend many hundreds of hours tinkering and improving it over the course of a couple years that I now use it everyday, whether for network storage, a shadowsocks VPN, a game server, or just as a website.
At the start I had only a single HP PROLIANT N36L Gen 7 MicroServer (<a href='https://www.itpro.com/630898/hp-proliant-microserver-n36l-review'>Third-party review</a>) which was very much a low grade NAS for people who want to run many different services without needing to worry about speed and network speeds.
!image assets/img/projects/server_setup/hp_proliant_preview.png
With only 2 cpu cores and 2 GB of memory it was only good for very simple tasks which was fine enough when I was just starting out with homelabbing
But then my laptop that I was using for school broke because the hinge gave out (because it was a crappy HP laptop hinge) and was breaking the screen, making it so that it was only usable as a server. So I plugged in an ethernet adapter and a 1TB USB SSD and hooked it up to my "cluster"
!image assets/img/projects/server_setup/laptop_setup.jpg
I wanted to try and install a new operating system on it, and since I was in my distrohopping phase I wanted to try installing Arch Linux on it, since I figure that would allow it to be actually usable rather than in it's chromeOS state
The main issue was that the current operating system had a lock on it that made it so that you as a student wouldn't be able to boot into a different operating system, either through installing a new OS on the current drive or through using a LiveCD.
So what I had to do was go INTO the currently installed operating system, toggle a setting, and then use a tool that would install <a href='https://chromeos.google/products/chromeos-flex/'>ChromeFlex</a>, which basically acted as an intermediary operating system so that I could unlock the actual firmware, letting me plug in a better drive
Now that I could put in my own drive and not have the device yell at me for not having a ChromeOS operating system I went ahead and installed Arch Linux on the drive and booted it up
+11
View File
@@ -4,6 +4,17 @@ function head($title) {
<head> <head>
<meta charset='UTF-8' /> <meta charset='UTF-8' />
<meta name='viewport' content='width=device-width, initial-scale=1.0' /> <meta name='viewport' content='width=device-width, initial-scale=1.0' />
<meta property='og:title' content=\"Pizza2d1's Project Page\" />
<meta property='og:description' content='A hub of projects and services by pizza2d1' />
<meta property='og:image' content='https://www.happylizard.me/assets/img/pizza-icon.png' />
<meta property='og:image:width' content='630' />
<meta property='og:image:height' content='630' />
<meta property='og:url' content='https://happylizard.me' />
<meta property='og:type' content='website' />
<meta property='og:site_name' content='Inshallah the internet becomes decentralized' />
<meta property='og:locale' content='en_US' />
<script src='https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4'></script> <script src='https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4'></script>
<title>" . $title . "</title> <title>" . $title . "</title>
</head>"; </head>";
+19 -20
View File
@@ -98,10 +98,11 @@ function grid() {
<div class='max-w-7xl mx-auto px-4 sm:px-6 lg:px-8'> <div class='max-w-7xl mx-auto px-4 sm:px-6 lg:px-8'>
<!-- Centered Header --> <!-- Centered Header -->
<div class='text-center max-w-3xl mx-auto mb-16' data-motion='header' style='opacity: 1;'> <div class='text-center max-w-3xl mx-auto mb-16' data-motion='header' style='opacity: 1;'>
<!-- <h1 class='text-indigo-400 text-l font-bold'>Balls</h1> --> <a href='/services'>
<h2 class='text-slate-900 dark:text-white text-4xl sm:text-5xl font-bold mb-6'> <h2 class='text-green-700 dark:text-green-500 text-4xl sm:text-5xl font-bold mb-6' style='text-decoration: underline'>
Services Services
</h2> </h2>
</a>
<div id='content'> <div id='content'>
<p data-animate='text' class='text-slate-600 dark:text-neutral-400 text-lg' style='opacity: 1;'> <p data-animate='text' class='text-slate-600 dark:text-neutral-400 text-lg' style='opacity: 1;'>
A list of just SOME of the services that are available on the website FOR FREE (if you want accounts you need to contact me) <a href='/socials'>Contact Page</a> A list of just SOME of the services that are available on the website FOR FREE (if you want accounts you need to contact me) <a href='/socials'>Contact Page</a>
@@ -142,7 +143,7 @@ function grid() {
<a href='https://navidrome.happylizard.me'> <a href='https://navidrome.happylizard.me'>
<div> <div>
<div data-motion='icon' class='w-20 h-20 rounded-xl flex items-center justify-center mb-6'> <div data-motion='icon' class='w-20 h-20 rounded-xl flex items-center justify-center mb-6'>
<img src='assets/img/navidrome_dark.png'> <img src='/assets/img/navidrome_dark.png'>
</div> </div>
<h3 class='text-white text-xl font-semibold mb-3'>Navidrome</h3> <h3 class='text-white text-xl font-semibold mb-3'>Navidrome</h3>
<p class='text-indigo-100 text-base'> <p class='text-indigo-100 text-base'>
@@ -160,11 +161,11 @@ function grid() {
<!-- ROW 2 --> <!-- ROW 2 -->
<div data-motion='card' class='p-8 bg-fuchsia-700/40 rounded-3xl flex flex-col justify-between'> <div data-motion='card' class='p-8 bg-fuchsia-800/80 dark:bg-fuchsia-700/40 rounded-3xl flex flex-col justify-between'>
<a href='https://navidrome.happylizard.me'> <a href='https://gitea.happylizard.me'>
<div> <div>
<div data-motion='icon' class='w-20 h-20 rounded-xl flex items-center justify-center mb-6'> <div data-motion='icon' class='w-25 h-20 rounded-xl flex items-center justify-center mb-6'>
<img src='assets/img/gitea.png'> <img src='/assets/img/gitea.png'>
</div> </div>
<h3 class='text-white text-xl font-semibold mb-3'>Gitea</h3> <h3 class='text-white text-xl font-semibold mb-3'>Gitea</h3>
<p class='text-indigo-100 text-base'> <p class='text-indigo-100 text-base'>
@@ -204,7 +205,7 @@ function grid() {
<a href='https://gameyfin.happylizard.me'> <a href='https://gameyfin.happylizard.me'>
<div> <div>
<div data-motion='icon' class='w-20 h-20 rounded-xl flex items-center justify-center mb-6'> <div data-motion='icon' class='w-20 h-20 rounded-xl flex items-center justify-center mb-6'>
<img src='assets/img/gameyfin_small.png'> <img src='/assets/img/gameyfin_small.png'>
</div> </div>
<h3 class='text-black text-xl font-semibold mb-3'>Gameyfin</h3> <h3 class='text-black text-xl font-semibold mb-3'>Gameyfin</h3>
<p class='text-black text-base'> <p class='text-black text-base'>
@@ -214,23 +215,23 @@ function grid() {
</a> </a>
</div> </div>
<div data-motion='card' class='p-6 bg-white dark:bg-neutral-800 rounded-3xl' style='opacity: 1; transform: translateY(0px); filter: blur(0px);'> <div data-motion='card' class='p-6 bg-neutral-300 dark:bg-neutral-800 rounded-3xl' style='opacity: 1; transform: translateY(0px); filter: blur(0px);'>
<a href='https://convert.happylizard.me'> <a href='https://convert.happylizard.me'>
<div data-motion='icon' class='w-15 h-15 flex items-center justify-center mb-5'> <div data-motion='icon' class='w-20 h-20 flex items-center justify-center mb-5'>
<img src='assets/img/portal_runner.png'> <img src='/assets/img/portal_runner.png'>
</div> </div>
<h3 class='text-slate-900 dark:text-white text-lg font-semibold mb-2'>Any-File converter</h3> <h3 class='text-slate-900 dark:text-white text-lg font-semibold mb-2'>Any-File converter</h3>
<p class='text-slate-600 dark:text-neutral-400 text-sm'> <p class='text-black dark:text-neutral-400 text-sm'>
A ffmpeg converter that attempts to take any file and convert it into another format SYNCRONOUSLY A ffmpeg converter that attempts to take any file and convert it into another format SYNCRONOUSLY
</p> </p>
</a> </a>
<a data-motion='button' href='https://www.youtube.com/watch?v=btUbcsTbVA8' class='inline-flex items-center gap-2 text-white font-medium hover:gap-3 transition-all duration-300 w-fit mt-6'> <a data-motion='button' href='https://www.youtube.com/watch?v=btUbcsTbVA8' class='inline-flex items-center gap-2 text-black dark:text-white font-medium hover:gap-3 transition-all duration-300 w-fit mt-6'>
Youtube video explaining it Youtube video explaining it
<svg class='w-4 h-4' fill='none' stroke='currentColor' viewBox='0 0 24 24'> <svg class='w-4 h-4' fill='none' stroke='currentColor' viewBox='0 0 24 24'>
<path stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M17 8l4 4m0 0l-4 4m4-4H3'></path> <path stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M17 8l4 4m0 0l-4 4m4-4H3'></path>
</svg> </svg>
</a> </a>
<a data-motion='button' href='https://github.com/p2r3/convert' class='inline-flex items-center gap-2 text-white font-medium hover:gap-3 transition-all duration-300 w-fit mt-6'> <a data-motion='button' href='https://github.com/p2r3/convert' class='inline-flex items-center gap-2 text-black dark:text-white font-medium hover:gap-3 transition-all duration-300 w-fit mt-6'>
Github to project Github to project
<svg class='w-4 h-4' fill='none' stroke='currentColor' viewBox='0 0 24 24'> <svg class='w-4 h-4' fill='none' stroke='currentColor' viewBox='0 0 24 24'>
<path stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M17 8l4 4m0 0l-4 4m4-4H3'></path> <path stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M17 8l4 4m0 0l-4 4m4-4H3'></path>
@@ -238,11 +239,11 @@ function grid() {
</a> </a>
</div> </div>
<div data-motion='card' class='p-8 bg-blue-800/60 rounded-3xl flex flex-col justify-between'> <div data-motion='card' class='p-7 bg-blue-800/80 rounded-3xl flex flex-col justify-between'>
<a href='https://copyparty.happylizard.me'> <a href='https://copyparty.happylizard.me'>
<div> <div>
<div data-motion='icon' class='w-20 h-20 rounded-xl flex items-center justify-center mb-6'> <div data-motion='icon' class='w-22 h-20 rounded-xl flex items-center justify-center mb-6'>
<img src='assets/img/copyparty.png'> <img src='/assets/img/copyparty.png'>
</div> </div>
<h3 class='text-white text-xl font-semibold mb-3'>Copyparty</h3> <h3 class='text-white text-xl font-semibold mb-3'>Copyparty</h3>
<p class='text-indigo-100 text-base'> <p class='text-indigo-100 text-base'>
@@ -251,11 +252,9 @@ function grid() {
</div> </div>
</a> </a>
</div> </div>
</div> </div>
</div> </div>
</section> </section>
"; ";
} }
+3 -1
View File
@@ -128,7 +128,9 @@ function get_blog_content($dots, $project_name, $project_content_dir) {
$image_link = str_replace("!image " , "", $line); $image_link = str_replace("!image " , "", $line);
$output .= " $output .= "
<div class='pb-10'><div class='relative rounded-3xl overflow-hidden h-80 lg:h-full group'> <div class='pb-10'><div class='relative rounded-3xl overflow-hidden h-80 lg:h-full group'>
<img data-motion='image' src='". "$dots/$image_link" ."' class='w-full h-full object-cover group-hover:scale-105 transition-transform duration-700' style='opacity: 1; transform: scale(1); filter: blur(0px);'> <a href='$dots/$image_link'>
<img data-motion='image' src='$dots/$image_link' class='w-full h-full object-cover group-hover:scale-105 transition-transform duration-700' style='opacity: 1; transform: scale(1); filter: blur(0px);'>
</a>
</div></div> </div></div>
"; ";
} else { } else {
+346
View File
@@ -0,0 +1,346 @@
<?php
include_once("vars.php");
function title() {
return "
<section id='_hero_creative_journey_v6_001' class='py-20 sm:py-24 bg-white dark:bg-neutral-950'>
<div class='max-w-7xl mx-auto px-4 sm:px-6 lg:px-8'>
<!-- Centered Header -->
<div class='text-center max-w-3xl mx-auto' data-motion='hero' style='opacity: 1;'>
<h1 class='text-3xl sm:text-5xl lg:text-6xl font-bold text-slate-900 dark:text-white leading-tight mb-6'>Services</h1>
<p class='text-lg text-slate-600 dark:text-neutral-400 mb-8' data-animate='text' style='opacity: 1;'>
A (incomplete) list of services that I self-host
</p>
<div class='flex flex-wrap justify-center gap-4'>
<a href='https://pizza2d1.github.io/server_links' data-motion='button' class='px-6 py-3 bg-indigo-600 hover:bg-indigo-700 transition-colors rounded-full text-white font-semibold' style='opacity: 1; transform: translateY(0px); filter: blur(0px);'>
Service uptime checker
</a>
</div>
</div>
</section>
";
}
function main_images() {
$project_object_list = get_project_data();
return "
<section id='_hero_creative_journey_v6_001' class='pu-12 pb-12 bg-white dark:bg-neutral-950'>
<div class='max-w-7xl mx-auto px-4 sm:px-6 lg:px-8'>
<!-- Asymmetric Image Grid -->
<div class='grid lg:grid-cols-12 gap-2'>
<div class='lg:col-span-3 flex flex-col gap-5'>
<div data-motion='card' class='rounded-3xl overflow-hidden h-48' style='opacity: 1; transform: translateY(0px); filter: blur(0px);'>
<a href='". $project_object_list[2]->link ."'>
<img data-motion='image' src='" . $project_object_list[2]->image . "' alt='Team meeting' class='w-full h-full object-cover hover:scale-105 transition-transform duration-700' style='opacity: 1; transform: scale(1); filter: blur(0px);'>
<div class='absolute inset-0 bg-linear-to-t from-slate-900/60 via-transparent to-transparent'></div>
<div class='absolute bottom-6 left-6 right-6'>
<h3 class='text-white text-l font-bold text-shadow-lg drop-shadow-[0_2.2px_2.2px_rgba(0,0,128,0.8)]'>". $project_object_list[2]->text ."</h3>
</div>
</a>
</div>
<div data-motion='card' class='rounded-3xl overflow-hidden h-64' style='opacity: 1; transform: translateY(0px); filter: blur(0px);'>
<a href='". $project_object_list[3]->link ."'>
<img data-motion='image' src='" . $project_object_list[3]->image . "' alt='Creative brainstorming session' class='w-full h-full object-cover group-hover:scale-105 transition-transform duration-700' style='opacity: 1; transform: scale(1); filter: blur(0px);'>
<div class='absolute inset-0 bg-linear-to-t from-slate-900/60 via-transparent to-transparent'></div>
<div class='absolute bottom-6 left-6 right-6'>
<h3 style='color: rgb(0, 191, 10)' class='text-black text-l font-bold text-shadow-lg drop-shadow-[0_2.2px_2.2px_rgba(0,0,0,1)]'>". $project_object_list[3]->text ."</h3>
</div>
</a>
</div>
</div>
<div class='lg:col-span-6' data-motion='card' style='opacity: 1; transform: translateY(0px); filter: blur(0px);'>
<div class='relative rounded-3xl overflow-hidden h-80 lg:h-full group'>
<a href='". $project_object_list[0]->link ."'><img data-motion='image' src='" . $project_object_list[0]->image . "' alt='Creative brainstorming session' class='w-full h-full object-cover group-hover:scale-105 transition-transform duration-700' style='opacity: 1; transform: scale(1); filter: blur(0px);'>
<div class='absolute inset-0 bg-linear-to-t from-slate-900/60 via-transparent to-transparent'></div>
<div class='absolute bottom-6 left-6 right-6'>
<h3 class='text-white text-xl font-bold text-shadow-lg drop-shadow-[0_2.2px_2.2px_rgba(0,0,128,0.8)]'>". $project_object_list[0]->text ."</h3>
</div>
</a>
</div>
</div>
<!-- Right Column - 2 stacked images -->
<div class='lg:col-span-3 flex flex-col gap-5'>
<div data-motion='card' class='rounded-3xl overflow-hidden h-72' style='opacity: 1; transform: translateY(0px); filter: blur(0px);'>
<a href='". $project_object_list[5]->link ."'>
<img data-motion='image' src='". $project_object_list[5]->image ."' alt='Team meeting' class='w-full h-full object-cover hover:scale-105 transition-transform duration-700' style='opacity: 1; transform: scale(1); filter: blur(0px);'>
<div class='absolute inset-0 bg-linear-to-t from-slate-900/60 via-transparent to-transparent'></div>
<div class='absolute bottom-6 left-6 right-6'>
<h3 class='text-white text-l font-bold text-shadow-lg drop-shadow-[0_2.2px_2.2px_rgba(0,0,128,0.8)]'>". $project_object_list[5]->text ."</h3>
</div>
</a>
</div>
<div data-motion='card' class='rounded-3xl overflow-hidden h-40' style='opacity: 1; transform: translateY(0px); filter: blur(0px);'>
<a href='". $project_object_list[6]->link ."'>
<img data-motion='image' src='". $project_object_list[6]->image ."' alt='Creative workshop' class='w-full h-full object-cover hover:scale-105 transition-transform duration-700' style='opacity: 1; transform: scale(1); filter: blur(0px);'>
<div class='absolute inset-0 bg-linear-to-t from-slate-900/60 via-transparent to-transparent'></div>
<div class='absolute bottom-6 left-6 right-6'>
<h3 class='text-white text-l font-bold text-shadow-lg drop-shadow-[0_2.2px_2.2px_rgba(0,0,128,0.8)]'>". $project_object_list[6]->text ."</h3>
</div>
</a>
</div>
</div>
</section>
";
}
function open_services_grid() {
return "
<section class='py-20 sm:py-24 bg-slate-50 dark:bg-neutral-900'>
<div class='max-w-7xl mx-auto px-8 sm:px-6 lg:px-8'>
<!-- Centered Header -->
<div class='text-center max-w-4xl mx-auto mb-16' data-motion='header' style='opacity: 1;'>
<a href='/services'>
<h2 class='text-green-700 dark:text-green-500 text-2xl sm:text-3xl font-bold mb-6'>
Open Services
</h2>
</a>
<div id='content'>
<p data-animate='text' class='text-slate-600 dark:text-neutral-400 text-lg' style='opacity: 1;'>
(services that don't require an existing account)
</p>
</div>
</div>
<div class='grid lg:grid-cols-2 gap-5 pb-4'>
<div data-motion='card' class='p-8 bg-blue-800/80 rounded-3xl flex flex-col justify-between'>
<a href='https://copyparty.happylizard.me'>
<div>
<div data-motion='icon' class='w-20 h-20 rounded-xl flex items-center justify-center mb-6'>
<img src='/assets/img/copyparty.png'>
</div>
<h3 class='text-white text-xl font-semibold mb-3'>Copyparty</h3>
<p class='text-indigo-100 text-base'>
A web fileserver that anybody can use, hosts most of the server files and has very good network drive support
</p>
</div>
</a>
</div>
<div data-motion='card' class='p-6 bg-neutral-300 dark:bg-neutral-800 rounded-3xl' style='opacity: 1; transform: translateY(0px); filter: blur(0px);'>
<a href='https://convert.happylizard.me'>
<div data-motion='icon' class='w-20 h-20 flex items-center justify-center mb-5'>
<img src='/assets/img/portal_runner.png'>
</div>
<h3 class='text-slate-900 dark:text-white text-lg font-semibold mb-2'>Any-File converter</h3>
<p class='text-black dark:text-neutral-400 text-sm'>
A ffmpeg converter that attempts to take any file and convert it into another format SYNCRONOUSLY
</p>
</a>
<a data-motion='button' href='https://www.youtube.com/watch?v=btUbcsTbVA8' class='inline-flex items-center gap-2 text-black dark:text-white font-medium hover:gap-3 transition-all duration-300 w-fit mt-6'>
Youtube video explaining it
<svg class='w-4 h-4' fill='none' stroke='currentColor' viewBox='0 0 24 24'>
<path stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M17 8l4 4m0 0l-4 4m4-4H3'></path>
</svg>
</a>
<a data-motion='button' href='https://github.com/p2r3/convert' class='inline-flex items-center gap-2 text-black dark:text-white font-medium hover:gap-3 transition-all duration-300 w-fit mt-6'>
Github to project
<svg class='w-4 h-4' fill='none' stroke='currentColor' viewBox='0 0 24 24'>
<path stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M17 8l4 4m0 0l-4 4m4-4H3'></path>
</svg>
</a>
</div>
</div>
</div>
</section>
";
}
function middle_services_grid() {
return "
<section id='_features_minimal_icons_v6_001' class='py-20 sm:py-24 bg-slate-50 dark:bg-neutral-950'>
<div class='max-w-7xl mx-auto px-4 sm:px-6 lg:px-8'>
<!-- Centered Header -->
<div class='text-center max-w-3xl mx-auto mb-16' data-motion='header' style='opacity: 1;'>
<h2 class='text-orange-900 dark:text-orange-800 text-3xl sm:text-3xl font-bold mb-6'>
User-based services
</h2>
<div id='content'>
<p class='text-slate-600 dark:text-neutral-400 text-lg' style='opacity: 1;'>
Services that either require you to make a user account or can be accessed with
</p>
<p class='text-slate-600 dark:text-neutral-400 text-lg' style='opacity: 1;'>
Username: \"user\" and Password: \"password\"
</p>
</div>
</div>
<!-- Bento Grid Features -->
<div class='grid lg:grid-cols-2 gap-5 pb-5'>
<div data-motion='card' class='lg:col-span-2 p-8 bg-neutral-300 dark:bg-neutral-800 rounded-3xl'>
<a href='https://jellyfin.happylizard.me'>
<div class='grid sm:grid-cols-2 gap-8'>
<div>
<div data-motion='icon' class='w-25 h-25 rounded-2xl flex items-center justify-center mb-6'>
<img src='/assets/img/jellyfin.png'>
</div>
<h3 class='text-slate-900 dark:text-white text-2xl font-semibold mb-3'>Jellyfin</h3>
<p class='text-slate-600 dark:text-neutral-400 text-base'>
A media sharing tool that has shows, movies, anime and music that can be streamed and downloaded
</p>
</div>
<div class='rounded-2xl overflow-hidden'>
<img data-motion='image' src='/assets/img/jellyfin_showcase2.png' class='w-full object-cover rounded-3xl'>
</div>
</div>
</a>
<a data-motion='button' href='https://jellyfin.org/' class='inline-flex items-center gap-2 text-purple-500 font-medium hover:gap-3 transition-all duration-300 w-fit mt-6'>
Jellyfin Official Website
<svg class='w-4 h-4' fill='none' stroke='currentColor' viewBox='0 0 24 24'>
<path stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M17 8l4 4m0 0l-4 4m4-4H3'></path>
</svg>
</a>
</div>
</div>
<div class='grid lg:grid-cols-3 gap-5'>
<!-- Accent Card -->
<div data-motion='card' class='p-8 bg-indigo-600 rounded-3xl flex flex-col justify-between'>
<a href='https://navidrome.happylizard.me'>
<div>
<div data-motion='icon' class='w-20 h-20 rounded-xl flex items-center justify-center mb-6'>
<img src='/assets/img/navidrome_dark.png'>
</div>
<h3 class='text-white text-xl font-semibold mb-3'>Navidrome</h3>
<p class='text-indigo-100 text-base'>
Music streaming service that you can connect to your laptop/phone with compatible subsonic/opensonic clients (5000+ songs)
</p>
</div>
</a>
<a data-motion='button' href='https://www.navidrome.org/apps/' class='inline-flex items-center gap-2 text-white font-medium hover:gap-3 transition-all duration-300 w-fit mt-6'>
Navidrome compatible clients
<svg class='w-4 h-4' fill='none' stroke='currentColor' viewBox='0 0 24 24'>
<path stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M17 8l4 4m0 0l-4 4m4-4H3'></path>
</svg>
</a>
</div>
<!-- ROW 2 -->
<div data-motion='card' class='p-8 bg-fuchsia-800/80 dark:bg-fuchsia-700/40 rounded-3xl flex flex-col justify-between'>
<a href='https://gitea.happylizard.me'>
<div>
<div data-motion='icon' class='w-25 h-20 rounded-xl flex items-center justify-center mb-6'>
<img src='/assets/img/gitea.png'>
</div>
<h3 class='text-white text-xl font-semibold mb-3'>Gitea</h3>
<p class='text-indigo-100 text-base'>
A self-hosted version of github/gitlab that works pretty well
</p>
</div>
</a>
</div>
<!-- Small Feature Cards -->
<div data-motion='card' class='p-8 bg-orange-500/80 rounded-3xl flex flex-col justify-between'>
<a href='https://gameyfin.happylizard.me'>
<div>
<div data-motion='icon' class='w-20 h-20 rounded-xl flex items-center justify-center mb-6'>
<img src='/assets/img/gameyfin_small.png'>
</div>
<h3 class='text-black text-xl font-semibold mb-3'>Gameyfin</h3>
<p class='text-black text-base'>
A game-sharing site, with many nintendo, steam, and other misc. games
</p>
</div>
</a>
</div>
</div>
</div>
</section>
";
}
function closed_services_grid() {
return "
<section class='py-20 sm:py-24 bg-slate-50 dark:bg-neutral-900'>
<div class='max-w-7xl mx-auto px-8 sm:px-6 lg:px-8'>
<!-- Centered Header -->
<div class='text-center max-w-4xl mx-auto mb-16' data-motion='header' style='opacity: 1;'>
<a href='/services'>
<h2 class='text-red-700 dark:text-red-500 text-2xl sm:text-3xl font-bold mb-6'>
Closed Services
</h2>
</a>
<div id='content'>
<p data-animate='text' class='text-slate-600 dark:text-neutral-400 text-lg' style='opacity: 1;'>
A list of services that require a trusted account that is created by contacting me
</p>
</div>
</div>
<div class='grid lg:grid-cols-2 gap-5 pb-4'>
<!-- Large Feature Card -->
<div data-motion='card' class='lg:col-span-2 p-8 bg-neutral-300 dark:bg-neutral-800 rounded-3xl' style='opacity: 1; transform: translateY(0px); filter: blur(0px);'>
<a href='https://nextcloud.happylizard.me'>
<div class='grid sm:grid-cols-2 gap-8'>
<div>
<div data-motion='icon' class='w-40 h-20 rounded-2xl flex items-center justify-center mb-6'>
<img src='/assets/img/nextcloud.png'>
</div>
<h3 class='text-slate-900 dark:text-white text-2xl font-semibold mb-3'>Nextcloud</h3>
<p class='text-slate-600 dark:text-neutral-400 text-base'>
A open source collaboration tool with file storage, nextcloud talk, nextcloud office and other suite options
</p>
</div>
<div class='rounded-2xl overflow-hidden'>
<img data-motion='image' src='/assets/img/nextcloud_showcase.png' class='w-full object-cover rounded-3xl'>
</div>
</div>
</a>
<a data-motion='button' href='https://nextcloud.com/' class='inline-flex items-center gap-2 text-purple-500 font-medium hover:gap-3 transition-all duration-300 w-fit mt-6' style='opacity: 1; transform: translateY(0px); filter: blur(0px);'>
Nextcloud Official Website
<svg class='w-4 h-4' fill='none' stroke='currentColor' viewBox='0 0 24 24'>
<path stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M17 8l4 4m0 0l-4 4m4-4H3'></path>
</svg>
</a>
</div>
</div>
<!-- Bento Grid Features -->
<div class='grid lg:grid-cols-4 gap-3 pb'>
<div data-motion='card' class='p-8 bg-indigo-700/80 dark:bg-indigo-950/70 rounded-3xl flex flex-col justify-between'>
<a href='https://radarr.happylizard.me'>
<div>
<div data-motion='icon' class='w-15 h-10 rounded-xl flex items-center justify-center mb-6'>
<img src='/assets/img/radarr_small.png'>
</div>
<h3 class='text-slate-900 dark:text-white text-xl font-semibold mb-3'>Radarr</h3>
<p class='text-slate-900 dark:text-white text-base'>User-friendly MOVIE requesting tool</p>
</div></a>
</div>
<div data-motion='card' class='p-8 bg-amber-700/80 dark:bg-amber-950/70 rounded-3xl flex flex-col justify-between'>
<a href='https://sonarr.happylizard.me'>
<div>
<div data-motion='icon' class='w-15 h-10 rounded-xl flex items-center justify-center mb-6'>
<img src='/assets/img/sonarr_small.png'>
</div>
<h3 class='text-slate-900 dark:text-white text-xl font-semibold mb-3'>sonarr</h3>
<p class='text-slate-900 dark:text-white text-base'>User-friendly MOVIE requesting tool</p>
</div></a>
</div>
<div data-motion='card' class='p-8 bg-pink-700/80 dark:bg-pink-950/70 rounded-3xl flex flex-col justify-between'>
<a href='https://lidarr.happylizard.me'>
<div>
<div data-motion='icon' class='w-15 h-10 rounded-xl flex items-center justify-center mb-6'>
<img src='/assets/img/lidarr_small.png'>
</div>
<h3 class='text-slate-900 dark:text-white text-xl font-semibold mb-3'>lidarr</h3>
<p class='text-slate-900 dark:text-white text-base'>User-friendly MOVIE requesting tool</p>
</div></a>
</div>
<div data-motion='card' class='p-8 bg-lime-700/80 dark:bg-lime-950/70 rounded-3xl flex flex-col justify-between'>
<a href='https://seerr.happylizard.me'>
<div>
<div data-motion='icon' class='w-15 h-10 rounded-xl flex items-center justify-center mb-6'>
<img src='/assets/img/seerr_small.png'>
</div>
<h3 class='text-slate-900 dark:text-white text-xl font-semibold mb-3'>seerr</h3>
<p class='text-slate-900 dark:text-white text-base'>User-friendly MOVIE requesting tool</p>
</div></a>
</div>
</div>
</div>
</section>
";
}
?>
+11 -12
View File
@@ -1,19 +1,18 @@
<?php $dots=str_repeat("../", substr_count(__DIR__, '/')-1); ?>
<?php <?php
header('Location: /wip'); include_once("$dots/includes/all.php");
exit(); include_once("$dots/includes/projects.php");
$project_name = "Server Setup";
$project_content_dir = "$dots/assets/project_blogs/server_setup";
?> ?>
<?php $srv_root = __DIR__; $dots = "";
$slash_count = substr_count($srv_root, '/');
for ($i = 1; $i < $slash_count; $i++) {$dots .= "../";};?>
<?php include_once("$dots/includes/all.php"); ?>
<?php include_once("$dots/includes/projects.php"); ?>
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html>
<?php echo head("test"); ?> <?php echo head_css($project_name, ["projects.css"], $dots); ?>
<body> <body>
<?php echo title("Python Website"); ?> <?php echo navbar("2"); ?>
<?php echo make_blog($dots, $project_name, $project_content_dir); ?>
<?php echo footer(); ?> <?php echo footer(); ?>
</body> </body>
</html> </html>
+14 -9
View File
@@ -1,19 +1,24 @@
<?php <?php
header('Location: https://pizza2d1.github.io/server_links'); // header('Location: https://pizza2d1.github.io/server_links');
exit(); // exit();
?> ?>
<?php $srv_root = __DIR__; $dots = ""; <?php $dots=str_repeat("../", substr_count(__DIR__, '/')-1); ?>
$slash_count = substr_count($srv_root, '/');
for ($i = 1; $i < $slash_count; $i++) {$dots .= "../";};?>
<?php include_once("$dots/includes/all.php"); ?> <?php include_once("$dots/includes/all.php"); ?>
<?php include_once("$dots/includes/projects.php"); ?> <?php include_once("$dots/includes/services.php"); ?>
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html>
<?php echo head("test"); ?> <?php echo head("Services"); ?>
<body> <body>
<?php echo title("Python Website"); ?> <?php echo navbar("3"); ?>
<?php echo title(""); ?>
<?php echo open_services_grid(); ?>
<?php echo middle_services_grid(); ?>
<?php echo closed_services_grid(); ?>
<?php echo footer(); ?> <?php echo footer(); ?>
</body> </body>
</html> </html>
<!-- Fuck my chungus life -->