47 Commits

Author SHA1 Message Date
Alfie King 936cadfea8 small update
Deploy website / deploy (push) Successful in 3m11s
2026-07-03 00:24:59 +01:00
Alfie King cb7ec029eb update music api to listenbrainz
Deploy website / deploy (push) Successful in 3m1s
2026-06-15 21:56:41 +01:00
Alfie King af5116d931 update idk
Deploy website / deploy (push) Successful in 2m1s
2026-03-29 15:50:47 +01:00
Alfie King 8dae4c1b5d ring fix
Deploy website / deploy (push) Successful in 1m8s
2026-03-08 23:27:30 +00:00
Alfie King 8e67e714d0 news post and "ads" XD
Deploy website / deploy (push) Successful in 56s
2026-03-05 00:23:01 +00:00
Alfie King 7c9aaa04ba volume and icon
Deploy website / deploy (push) Successful in 54s
2026-03-04 22:07:03 +00:00
Alfie King 93ecd4999f deploy fix
Deploy website / deploy (push) Successful in 1m19s
2026-03-04 21:58:57 +00:00
Alfie King 0d367e43a6 audio "fix"
Deploy website / deploy (push) Successful in 26s
2026-03-04 21:54:21 +00:00
Alfie King 3afab4c7fa smileos
Deploy website / deploy (push) Successful in 39s
2026-03-04 21:32:30 +00:00
Alfie King 885d2559af webrings and buttons
Deploy website / deploy (push) Successful in 26s
2026-03-03 18:01:44 +00:00
Alfie King 8f1e4e60e1 more logs
Deploy website / deploy (push) Successful in 35s
2026-03-03 15:13:51 +00:00
Alfie King a47c2a3886 f*ck
Deploy website / deploy (push) Successful in 22s
2026-03-03 15:06:57 +00:00
Alfie King 11d8621f9b pls work :3
Deploy website / deploy (push) Failing after 23s
2026-03-03 15:05:38 +00:00
Alfie King b683a2721a fix
Deploy website / deploy (push) Failing after 11s
2026-03-03 15:03:40 +00:00
Alfie King 7a60ca468d deploy script
Deploy website / deploy (push) Failing after 1m46s
2026-03-03 15:00:11 +00:00
Alfie King 1a5380e17e major update 2026-03-03 14:11:55 +00:00
Alfie King 6e92e40f1c markdown support
Build and push container image / build-and-push-image (push) Successful in 5m35s
2026-02-26 23:14:36 +00:00
Alfie King b4e6b4c296 scratch
Build and push container image / build-and-push-image (push) Successful in 6m3s
2026-02-09 13:34:47 +00:00
Alfie King 9700a5dc7f music update
Build and push container image / build-and-push-image (push) Successful in 4m39s
2026-02-02 01:24:14 +00:00
Alfie King 067f0e189d toaster button
Build and push container image / build-and-push-image (push) Successful in 4m7s
2026-01-29 01:24:53 +00:00
Alfie King 639a8e2fb0 Merge pull request 'major update :O' (#2) from major-redesign into main
Build and push container image / build-and-push-image (push) Successful in 5m57s
Reviewed-on: https://git.alfieking.dev/acetheking987/alfieking.dev/pulls/2
2026-01-18 23:25:17 +00:00
Alfie King 25b03aa105 major update :O 2026-01-18 23:21:44 +00:00
Alfie King 53cd3852aa update
Build and push container image / build-and-push-image (push) Successful in 6m29s
2025-08-27 21:53:25 +01:00
Alfie King f67f377be1 new images 2025-08-23 16:10:25 +01:00
Alfie King bfb1b8a21e sitemap
Build and push container image / build-and-push-image (push) Successful in 3m59s
2025-08-13 22:54:24 +01:00
Alfie King ef459d728a update link
Build and push container image / build-and-push-image (push) Successful in 3m16s
2025-08-10 19:53:31 +01:00
Alfie King 5690bcadf9 I fkin found em
Build and push container image / build-and-push-image (push) Successful in 4m21s
2025-08-08 20:31:55 +01:00
Alfie King 8b5b80f7c5 Merge remote-tracking branch 'refs/remotes/gitea/main'
Build and push container image / build-and-push-image (push) Successful in 3m7s
2025-08-07 21:26:35 +01:00
Alfie King 66806ad922 events 2025-08-07 21:25:10 +01:00
Alfie King b29a61a44b fix name box
Build and push container image / build-and-push-image (push) Successful in 3m2s
2025-08-07 11:28:24 +00:00
Alfie King a0562330a3 more updates
Build and push container image / build-and-push-image (push) Successful in 2m59s
2025-08-06 22:39:06 +01:00
Alfie King df59a2c097 fix typos and css
Build and push container image / build-and-push-image (push) Successful in 2m31s
2025-08-06 01:33:56 +01:00
Alfie King 8209f52fa7 update og image
Build and push container image / build-and-push-image (push) Successful in 2m19s
2025-08-06 01:15:44 +01:00
Alfie King b029eba456 fix
Build and push container image / build-and-push-image (push) Successful in 2m27s
2025-08-06 00:54:30 +01:00
Alfie King 1b2425a493 toaster update :3
Build and push container image / build-and-push-image (push) Failing after 5m28s
2025-08-06 00:41:26 +01:00
Alfie King e66f7e0588 update 2025-06-28 18:12:09 +01:00
Alfie King d48dd04af9 snake "security" 2025-06-22 16:07:01 +01:00
Alfie King f3d5cb9d53 cleaned backend 2025-06-22 15:56:38 +01:00
Alfie King da447939bb css fixes 2025-06-21 14:03:39 +01:00
Alfie King 968a4cb442 mobile fixes 2025-06-21 02:40:25 +01:00
Alfie King 189d63d7ba toaster 2025-06-21 02:26:24 +01:00
Alfie King 4a577e928a typer fix 2025-06-20 13:32:04 +01:00
Alfie King e95e424a1e mobile fix 2025-06-20 11:14:03 +01:00
Alfie King 2b6ae9c640 oops 2025-06-20 09:55:20 +01:00
Alfie King 0115328180 Merge pull request 'templated' (#1) from templated into main
Reviewed-on: https://git.alfieking.dev/acetheking987/alfieking.dev/pulls/1
2025-06-20 08:50:41 +00:00
Alfie King f2cffc4400 500&404 errors 2025-06-20 09:48:20 +01:00
Alfie King 30884ecaa4 snake 2025-06-20 01:45:09 +01:00
98 changed files with 2262 additions and 767 deletions
+65
View File
@@ -0,0 +1,65 @@
name: Deploy website
run-name: ${{ gitea.actor }} is deploying update
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Setup SSH
run: |
mkdir -p ~/.ssh
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan ${{ secrets.SSH_HOST }} >> ~/.ssh/known_hosts
- name: Deploy
run: |
ssh ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} << 'EOF'
set -e
APP_DIR=/var/www/alfieking.dev
RELEASES_DIR=$APP_DIR/releases
TIMESTAMP=$(date +%Y%m%d%H%M%S)
NEW_RELEASE=$RELEASES_DIR/$TIMESTAMP
KEEP_RELEASES=5
echo "Creating release directory..."
mkdir -p $NEW_RELEASE
echo "Cloning public repository..."
git clone --depth 1 -b main \
https://git.alfieking.dev/acetheking987/alfieking.dev.git \
$NEW_RELEASE
echo "Installing dependencies..."
source $APP_DIR/venv/bin/activate
pip install -r $NEW_RELEASE/requirements.txt
echo "Switching symlink..."
ln -sfn $NEW_RELEASE $APP_DIR/current
echo "Changing ownership..."
chown -R www-data:www-data /var/www/alfieking.dev/releases/$TIMESTAMP
chown -R www-data:www-data /var/www/alfieking.dev/current
echo "Restarting Gunicorn (downtime incomming XD)..."
systemctl restart alfieking.dev.service
echo "Cleaning old releases..."
CURRENT_TARGET=$(readlink -f $APP_DIR/current)
cd $RELEASES_DIR
for dir in $(ls -dt */ | tail -n +$((KEEP_RELEASES+1))); do
FULL_PATH="$RELEASES_DIR/${dir%/}"
if [ "$FULL_PATH" != "$CURRENT_TARGET" ]; then
rm -rf "$FULL_PATH"
fi
done
echo "Deployment successful."
EOF
+3
View File
@@ -0,0 +1,3 @@
.env
__pycache__
.venv
-87
View File
@@ -1,87 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Alfie's basement</title>
<link rel="icon" href="/static/content/icon.webp">
<link rel="stylesheet" href="/static/css/index.css">
<meta name="description" content="Alfie's basement">
<meta name="keywords" content="Alfie King, Alfie, King, Alfieking, Alfieking.dev, dev, server">
<meta name="author" content="Alfie King">
<meta name="robots" content="all">
<meta name="theme-color" content="#63de90" data-react-helmet="true">
<meta property="og:site_name" content="Alfieking.dev">
<meta property="og:url" content="https://alfieking.dev">
<meta property="og:title" content="Alfie's basement">
<meta property="og:description" content="server backend survivor">
<meta property="og:image" content="static/content/icon.webp">
</head>
<body>
<div id="furry"></div>
<div id="sidebar">
<nav>
<section>
<h1>Things to see :3</h1>
<ul>
<li><a href="/">Home</a></li>
<li><a href="https://git.alfieking.dev/acetheking987">Gitea</a></li>
<li><a href="https://www.last.fm/user/acetheking987">LastFm</a></li>
<li><a href="https://prismic.alfieking.dev">Prismic</a></li>
<li><a href="https://open.spotify.com/user/xz02oolstlvwxqu1pfcua9exz?si=14396e637f284e03">Spotify</a></li>
<li><a href="https://steamcommunity.com/id/acetheking987/">Steam</a></li>
<li><a href="https://www.youtube.com/@acetheking987">YouTube</a></li>
<li><a href="https://acetheking987.tumblr.com/">Tumblr</a></li>Instagram
<li><a href="https://www.reddit.com/user/acetheking987">Reddit</a></li>
</ul>
</section>
</nav>
<section>
<h6 class="irken">heya, try typing "furry" and "irken" into this page!</h6>
</section>
<section id="buttons">
<h1>BUTTONS</h1>
<ul>
<li><a href="https://dimden.dev/"><img src="https://dimden.dev/services/images/88x31.gif" alt="dimden"></a></li>
<li><a href="https://ne0nbandit.neocities.org/"><img src="https://ne0nbandit.github.io/assets/img/btn/mine/nbbanner.png" alt="ne0nbandit"></a></li>
<li><a href="https://thinliquid.dev"><img src="https://thinliquid.dev/thnlqd.png" alt="thinliquid"></a></li>
<li><a href="https://nekoweb.org/"><img src="https://nekoweb.org/assets/buttons/button6.gif" alt="nekoweb"></a><!-- button by s1nez.nekoweb.org --></li>
<li><a href="https://s1nez.nekoweb.org/"><img src="https://s1nez.nekoweb.org/BUTTON.gif" alt="s1nez"></a></li>
<li><a href="https://beeps.website"><img src="https://beeps.website/assets/images/88x31-d.gif" alt="beeps"></a></li>
<li><a href="https://itsnotstupid.com"><img src="https://itsnotstupid.com/pics/button1.gif" alt="itsnotstupid"></a></li>
<li><a href='https://blinkies.cafe'><img src='https://blinkies.cafe/b/display/blinkiesCafe-badge.gif' alt='blinkies.cafe | make your own blinkies!'></a></li>
<li><a href="https://eightyeightthirty.one"><img src="https://eightyeightthirty.one/88x31.png" alt="88x31"></a></li>
<li><a href="https://neocities.org"><img src="https://cyber.dabamos.de/88x31/neocities-now.gif" alt="neocities"></a></li>
<li><a href="https://tuxedodragon.art"><img src="https://tuxedodragon.art/tuxedodragon%2088x31.gif" alt="tuxedodragon"></a></li>
</ul>
</section>
<section>
<pre class="vsmoltext"> |\ _,,,---,,_<br>ZZZzz /,`.-'`' -. ;-;;,_<br> |,4- ) )-,_. ,\ ( `'-'<br> '---''(_/--' `-'\_)</pre>
</section>
<img src="static/content/haj.gif" alt="haj" class="haj">
</div>
<main id="main">
<header id="home">
<div class="row">
<img src="/static/content/icon.webp">
<div>
<h1>Alfie King</h1>
<h2 id="typing">server backend survivor</h2>
</div>
</div>
</header>
<section>
<h1>404</h1>
<p>
It seems like the thing you are looking for is not here :[
</p>
</section>
<section>
<footer>
<p>legal stuff idk :3 | icba to &copy; this :P | made with &hearts; and caffine</p>
</footer>
</section>
</main>
<script src="/static/js/index.js"></script>
</body>
</html>
-201
View File
@@ -1,201 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Alfie's basement</title>
<link rel="icon" href="/static/content/icon.webp">
<link rel="stylesheet" href="/static/css/index.css">
<meta name="description" content="Alfie's basement">
<meta name="keywords" content="Alfie King, Alfie, King, Alfieking, Alfieking.dev, dev, server">
<meta name="author" content="Alfie King">
<meta name="robots" content="all">
<meta name="theme-color" content="#63de90" data-react-helmet="true">
<meta property="og:site_name" content="Alfieking.dev">
<meta property="og:url" content="https://alfieking.dev">
<meta property="og:title" content="Alfie's basement">
<meta property="og:description" content="server backend survivor">
<meta property="og:image" content="static/content/icon.webp">
</head>
<body>
<div id="furry"></div>
<div id="sidebar">
<nav>
<section>
<h1>Things to see :3</h1>
<ul>
<li><a href="#Home" onclick="alert('ur already here :3')">Home</a></li>
<li><a href="https://git.alfieking.dev/acetheking987">Gitea</a></li>
<li><a href="https://www.last.fm/user/acetheking987">LastFm</a></li>
<li><a href="https://prismic.alfieking.dev">Prismic</a></li>
<li><a href="https://open.spotify.com/user/xz02oolstlvwxqu1pfcua9exz?si=14396e637f284e03">Spotify</a></li>
<li><a href="https://steamcommunity.com/id/acetheking987/">Steam</a></li>
<li><a href="https://www.youtube.com/@acetheking987">YouTube</a></li>
<li><a href="https://acetheking987.tumblr.com/">Tumblr</a></li>
<li><a href="https://www.reddit.com/user/acetheking987">Reddit</a></li>
</ul>
</section>
</nav>
<section>
<h6 class="irken">heya, try typing "furry" and "irken" into this page!</h6>
</section>
<section id="buttons">
<h1>BUTTONS</h1>
<ul>
<li><a href="https://dimden.dev/"><img src="https://dimden.dev/services/images/88x31.gif" alt="dimden"></a></li>
<li><a href="https://ne0nbandit.neocities.org/"><img src="https://ne0nbandit.github.io/assets/img/btn/mine/nbbanner.png" alt="ne0nbandit"></a></li>
<li><a href="https://thinliquid.dev"><img src="https://thinliquid.dev/thnlqd.png" alt="thinliquid"></a></li>
<li><a href="https://nekoweb.org/"><img src="https://nekoweb.org/assets/buttons/button6.gif" alt="nekoweb"></a><!-- button by s1nez.nekoweb.org --></li>
<li><a href="https://s1nez.nekoweb.org/"><img src="https://s1nez.nekoweb.org/BUTTON.gif" alt="s1nez"></a></li>
<li><a href="https://beeps.website"><img src="https://beeps.website/assets/images/88x31-d.gif" alt="beeps"></a></li>
<li><a href="https://itsnotstupid.com"><img src="https://itsnotstupid.com/pics/button1.gif" alt="itsnotstupid"></a></li>
<li><a href='https://blinkies.cafe'><img src='https://blinkies.cafe/b/display/blinkiesCafe-badge.gif' alt='blinkies.cafe | make your own blinkies!'></a></li>
<li><a href="https://eightyeightthirty.one"><img src="https://eightyeightthirty.one/88x31.png" alt="88x31"></a></li>
<li><a href="https://neocities.org"><img src="https://cyber.dabamos.de/88x31/neocities-now.gif" alt="neocities"></a></li>
<li><a href="https://tuxedodragon.art"><img src="https://tuxedodragon.art/tuxedodragon%2088x31.gif" alt="tuxedodragon"></a></li>
</ul>
</section>
<section>
<pre class="vsmoltext"> |\ _,,,---,,_<br>ZZZzz /,`.-'`' -. ;-;;,_<br> |,4- ) )-,_. ,\ ( `'-'<br> '---''(_/--' `-'\_)</pre>
</section>
<img src="static/content/haj.gif" alt="haj" class="haj">
</div>
<main id="main">
<header id="home">
<div class="row">
<img src="/static/content/icon.webp">
<div>
<h1>Alfie King</h1>
<h2 id="typing">server backend survivor</h2>
</div>
</div>
</header>
<nav id="alt-nav">
<ul>
<li><a href="https://git.alfieking.dev/acetheking987">Gitea</a></li>
<li><a href="https://www.last.fm/user/acetheking987">LastFm</a></li>
<li><a href="https://prismic.alfieking.dev">Prismic</a></li>
<li><a href="https://open.spotify.com/user/xz02oolstlvwxqu1pfcua9exz?si=14396e637f284e03">Spotify</a></li>
<li><a href="https://steamcommunity.com/id/acetheking987/">Steam</a></li>
<li><a href="https://www.youtube.com/@acetheking987">YouTube</a></li>
<li><a href="https://acetheking987.tumblr.com/">Tumblr</a></li>
<li><a href="https://www.reddit.com/user/acetheking987">Reddit</a></li>
</ul>
</nav>
<section>
<h1>A lil bit abt me</h1>
<p>
Im not good with writing so dont expect much here. I am a student who is learning c++ and python. I've Done a few projects that i think
are decent enough to show off, so I have put them on this website. I like to mess around with linux and have a few servers that I run. I've
been running a server for a few years now, and I have learned a lot from it. I have also switched to linux on my main computer, which has been
slightly annoying at times (mainly because one of my most played games' anticheat doesn't support on linux atm. Also, the lack of photoshop is
a pain).
<br><br>
I would like to make some more projects in the future, but I am not sure what I want to make yet. I tend to make thing on impulse a lot, and motivation
is "lacking" at times. So the few ideas I do have may never come to fruition. I hope to get better at art so i could hopefully make a game that is somewhat
interesting. But im at a lack of ideas at the moment.
<br><br>
I would also like to have a functional blog on this site, but I bearly talk about much so I dont know what I would write about. I like to ramble on about
random things, but I dont think that would be very interesting to read, and I think that I would forget to update it. I have a tumblr that I have had for a few
years now, but I dont post on it (the social anxiety is too much for me :<). However I hope to get better at that in the future.
</p>
</section>
<section class="blinkies">
<img src="https://adriansblinkiecollection.neocities.org/x45.gif" alt="">
<img src="https://adriansblinkiecollection.neocities.org/t3.gif" alt="">
<img src="https://adriansblinkiecollection.neocities.org/k25.gif" alt="">
<img src="https://s1nez.nekoweb.org/img/52475686_BP77MK3UdnLmIQk.gif" alt="">
<img src="https://s1nez.nekoweb.org/img/hc/hc%20(79).gif" alt="">
<img src="https://dewside.neocities.org/blinkies/bisigns.gif" alt="">
<img src="https://s1nez.nekoweb.org/g/ggg/gg%20(32).gif" alt="">
<img src="https://s1nez.nekoweb.org/img/7dcd20d4.gif" alt="">
</section>
<section class="rowsect">
<a href="" id="spotify-link">
<div id="spotify">
<h1 id="spotify-title"></h1>
<h2 id="spotify-artist"></h2>
</div>
</a>
<div class="stamps">
<img src="https://s1nez.nekoweb.org/img/other/ba4ba47a.png" alt="">
<img src="https://s1nez.nekoweb.org/img/fa02abd7.png" alt="">
<img src="https://s1nez.nekoweb.org/img/hc/hc%20(172).gif" alt="">
<img src="https://gligar.neocities.org/furret2.png" alt="">
<img src="https://gligar.neocities.org/ralsei2.png" alt="">
<img src="https://gligar.neocities.org/tism.png" alt="">
<img src="https://64.media.tumblr.com/11957593416710af9ff049ff6ae7ab63/tumblr_pbb7cd42Ln1xz2nuuo4_100.gif" alt="">
<img src="https://dewside.neocities.org/stamps/dogofwisdom.gif" alt="">
<img src="https://dewside.neocities.org/stamps/kazookid.gif" alt="">
<img src="https://64.media.tumblr.com/3085aeace24ca0c5ddf08aac37cc3ab4/45a30eb92e06a85c-3a/s100x200/b7bfb2e91adbc310f712f4492e668298bd0779de.gif" alt="">
<img src="https://s1nez.nekoweb.org/img/hc/hc%20(27).png" alt="">
<img src="https://s1nez.nekoweb.org/g/ggg/gg%20(13).gif" alt="">
<img src="https://kopawz.neocities.org/stamphoard/stamps2/kriswhere.png" alt="">
<img src="https://adriansblinkiecollection.neocities.org/stamps/g5.gif" alt="">
<img src="https://adriansblinkiecollection.neocities.org/stamps/e40.gif" alt="">
<img src="https://adriansblinkiecollection.neocities.org/stamps/e43.gif" alt="">
</div>
</section>
<section>
<h1>Projects & stuff</h1>
<p>just some projects ive worked on over time</p>
<ul>
<li>
<h2>alfieking.dev</h2>
<p>
This website is a project that I have been working on for a while now. I have made a few versions of it, but I have
never been happy with them. I am quite happy with this version atm since it is more organized and has a design that I
like.
<a href="https://git.alfieking.dev/acetheking987/alfieking.dev">source code</a>
</p>
</li>
<li>
<h2>owo (the terminal command)</h2>
<p>
I made this project as a joke, I can't remember exactly what I baised it off other than the fact that it was somthing
similar to this but in a different language. I originally made it in python, but I have since rewritten it in c++ so
that it would be faster and so that I could learn c++.
<a href="https://git.alfieking.dev/acetheking987/term-owo-cpp">source code</a>
</p>
</li>
<li>
<h2>prismic</h2>
<p>
Prismic is a basic message board that I made, it was mainly made to learn how to use templating and more backend
web development. it uses flask for the web framework and uses a sqlite database to store the messages. I have thought
about remaking it in c++ since I found a c++ web framework that I would like to try out.
<a href="https://prismic.alfieking.dev">Primic</a> | <a href="https://git.alfieking.dev/acetheking987/prismic">source code</a>
</p>
</li>
</ul>
</section>
<section>
<h1>The button collection™</h1>
<div id="button-collection">
</div>
</section>
<section>
<h1>Some News</h1>
<h6>(dont expect this to be updated often tho :P)</h6>
<ul>
<li>
<h2>18-06-2025</h2>
<p>
I plan on updating the site soon, I have a few ideas that I want to implement. I want to make it more
interactive and fun to use. I also want to add a blog section so that I can write about random things that I find interesting. I also
want to add a few more projects that I have been working on. Annoyingly I think it would be a good idea to remake this site with some sort of
framework so i can use templating, however this kinda bothers me since I like the simplicity of this site. And prefer to keep it as a static site
that i can just throw at nginx.
</p>
</li>
</ul>
</section>
<section>
<footer>
<p>legal stuff idk :3 | icba to &copy; this :P | made with &hearts; and caffine</p>
</footer>
</section>
</main>
<script src="/static/js/index.js"></script>
</body>
</html>
+7
View File
@@ -0,0 +1,7 @@
psycopg2-binary
python-dotenv
flask-session
requests
flask
markdown
gunicorn
+16
View File
@@ -0,0 +1,16 @@
from os import getenv as env
import psycopg2, logging
log = logging.getLogger("blog")
log.info("connecting to database")
conn = psycopg2.connect(
host = env("PG_HOST"),
port = env("PG_PORT"),
dbname = env("PG_DBNAME"),
user= env("PG_USER"),
password = env("PG_PASSWORD")
)
cursor = conn.cursor()
+73
View File
@@ -0,0 +1,73 @@
# Imports
from flask import Blueprint, render_template, abort
import os, importlib, logging
# Logging
log = logging.getLogger("__main__")
# Create blueprint
bp = Blueprint('dynamic', __name__)
template_folder = "templates"
# helper func
def get_path(file) -> str:
return os.path.join(template_folder, "pages", file)
# Get all files in folder
def ListFiles(path):
path = get_path(path)
files = []
for root, dirs, files_in_dir in os.walk(path):
for file in files_in_dir:
files.append(os.path.relpath(os.path.join(root, file), path))
for dir in dirs:
files.append(os.path.relpath(os.path.join(root, dir), path) + '/')
return files
# Import handlers
handlers_unloaded = os.listdir("src/handlers")
handlers_unloaded = [handler for handler in handlers_unloaded if handler.endswith(".py")]
handlers = {}
for handler in handlers_unloaded:
try:
try: module = importlib.import_module(f'src.handlers.{handler[:-3]}')
except ImportError: module = importlib.import_module(f'handlers.{handler[:-3]}')
handlers[handler[:-3]] = module.callback
log.info(f"Loaded handler {handler}: {module.callback}")
except Exception as e:
log.error(f"Failed to load handler {handler}: {e}")
continue
# Catch-all route for generic pages
@bp.route('/<path:filename>')
def catch_all(filename):
if os.path.exists(get_path(filename)):
if os.path.isdir(get_path(filename)):
return render_template(
'bases/directory.html',
directory=filename + "/" if not filename.endswith('/') else filename,
pages=ListFiles(filename)
)
if filename.split('.')[-1] in handlers.keys():
return handlers[filename.split('.')[-1]](filename)
return render_template(f'pages/{filename}')
elif os.path.exists(get_path(filename + '.html')):
return render_template(f'pages/{filename}.html')
else:
for ext in handlers.keys():
if os.path.exists(get_path(filename + f".{ext}")):
return handlers[ext](filename + f".{ext}")
abort(404, f"'{filename}' not found")
+38
View File
@@ -0,0 +1,38 @@
from flask import Blueprint, render_template
from werkzeug.exceptions import HTTPException
bp = Blueprint("errors", __name__)
@bp.route('/500')
@bp.app_errorhandler(500)
def internal_server_error(error:HTTPException=None):
return render_template('errors/500.html', error=error), 500
@bp.route('/404')
@bp.app_errorhandler(404)
def not_found(error:HTTPException=None):
return render_template('errors/404.html', error=error), 404
@bp.route('/400')
@bp.app_errorhandler(400)
def bad_request(error:HTTPException=None):
return render_template('errors/400.html', error=error), 400
@bp.route('/idk')
@bp.app_errorhandler(Exception)
def idk(error:HTTPException=None):
if not isinstance(error, HTTPException):
error = HTTPException("I honestly dont know")
error.code = 418
return render_template(
'errors/error.html',
code = error.code,
description = error.description,
err_name = error.name,
), error.code
+10
View File
@@ -0,0 +1,10 @@
from flask import render_template
import markdown, os
def callback(filename):
output = markdown.markdown(open(os.path.join("templates", "pages", filename), "r").read())
return render_template(
f'bases/md.html',
title = filename.split("/")[-1],
markdown = output
)
+84
View File
@@ -0,0 +1,84 @@
# IMPORTS
from flask import Flask, render_template, request
from os import getenv as env
import logging
try:
import src.pg_log as pg_log
except ImportError:
import pg_log
from dotenv import load_dotenv
load_dotenv()
# LOGGING
pg_log_handler = pg_log.PgLog(
host = env("PG_HOST"),
port = env("PG_PORT"),
dbname = env("PG_DBNAME"),
user= env("PG_USER"),
password = env("PG_PASSWORD")
)
pg_log_handler.setLevel(logging.DEBUG)
stream_log_handler = logging.StreamHandler()
stream_log_handler.setFormatter(
logging.Formatter("%(asctime)s - %(levelname)s: %(message)s")
)
stream_log_handler.setLevel(logging.INFO)
log = logging.getLogger(__name__)
log.setLevel(logging.DEBUG)
log.addHandler(stream_log_handler)
log.addHandler(pg_log_handler)
werkzeug_logger = logging.getLogger("werkzeug")
werkzeug_logger.setLevel(logging.DEBUG)
werkzeug_logger.addHandler(pg_log_handler)
werkzeug_logger.addHandler(stream_log_handler)
log.info("Logging initialized.")
try:
import src.dynamic as dynamic
import src.errors as errors
import src.music_metadata as music_metadata
except ImportError:
import dynamic, errors, music_metadata
# CREATE FLASK APP
app = Flask(
__name__,
template_folder="../templates",
static_folder="../static"
)
log.info("Flask initialized.")
# BLUEPRINTS
app.register_blueprint(errors.bp, url_prefix="/errors")
app.register_blueprint(music_metadata.bp, url_prefix="/music")
app.register_blueprint(dynamic.bp, url_prefix="/")
log.info("Blueprints registered.")
# ROUTES
@app.route("/")
def index():
return render_template("index.html")
@app.route("/toaster")
def toaster():
return render_template("toaster.html")
@app.route("/terminal")
def terminal():
return render_template("terminal.html")
# DEBUG (DONT RUN LIKE THIS IN PROD)
if __name__ == "__main__":
log.warning(f"RUNNING IN DEBUG MODE DO NOT USE FOR PRODUCTION!")
app.run(debug=True)
+25
View File
@@ -0,0 +1,25 @@
from flask import Blueprint, request, abort
from os import getenv as env
from urllib.parse import quote
import requests
bp = Blueprint("music", __name__)
@bp.route("/metadata")
def metadata():
if not request.args.get("recording_name"):
abort(400, "Recording name is required")
if not request.args.get("artist_name"):
abort(400, "Artist name is required")
data = requests.get(
f"https://api.listenbrainz.org/1/metadata/lookup/?recording_name={quote(request.args.get('recording_name'))}&artist_name={quote(request.args.get('artist_name'))}&metadata=true&inc=artist+tag+release",
headers={
"Authorization": f"Token {env("LISTENBRAINZ_TOKEN")}"
}
)
if data.status_code == 200:
return data.json()
else:
abort(500, "Failed to retrieve metadata")
+35
View File
@@ -0,0 +1,35 @@
import psycopg2, logging
class PgLog(logging.StreamHandler):
def __init__(self, host, port, dbname, user, password):
super().__init__()
self.host = host
self.port = port
self.dbname = dbname
self.user = user
self.password = password
self.conn = psycopg2.connect(
database = dbname,
user = user,
password = password,
host = host,
port = port
)
self.cursor = self.conn.cursor()
def __del__(self):
self.cursor.close()
self.conn.close()
def emit(self, record):
self.cursor.execute(
f"INSERT INTO logs (level, message) VALUES (%s, %s)",
(
record.levelname,
record.getMessage(),
)
)
self.conn.commit()
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

@@ -3,7 +3,6 @@ https://cyber.dabamos.de/88x31/anythingbut.gif
https://cyber.dabamos.de/88x31/bestdesktop.gif
https://kopawz.neocities.org/buttonhoard/buttonsfldr2/diagnosedwithGAY.gif
https://kopawz.neocities.org/indexgraphics/buttondecor/ilikecomputer.png
https://identity-crisis.carrd.co/assets/images/gallery04/ad4f8d52.jpg?v=4e55d939
https://anlucas.neocities.org/best_viewed_with_eyes.gif
https://anlucas.neocities.org/html_learn_it_today.gif
https://highway.eightyeightthirty.one/badge/5d58a8f32b007d4897db6f862a895a81674fb35f5cc3947fc66595817ca174db
Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 965 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 743 KiB

After

Width:  |  Height:  |  Size: 743 KiB

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 240 KiB

@@ -1,6 +1,6 @@
User-agent: *
Allow: /
Disallow: /404.html
Disallow: /errors
Sitemap: https://alfieking.dev/sitemap.xml
@@ -1,6 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://www.example.com/index.html</loc>
<loc>https://alfieking.dev/</loc>
</url>
<url>
<loc>https://alfieking.dev/toaster</loc>
</url>
</urlset>
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 710 B

Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 170 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 830 KiB

+460
View File
@@ -0,0 +1,460 @@
@import url('https://fonts.googleapis.com/css2?family=Fredoka:wdth,wght@125,700&family=Space+Mono:ital,wght@0,400;0,700;1,400;1,700&display=swap');
@font-face {
font-family:"Irken";
src:url("/static/content/fonts/Irken-Like-AllCaps.woff") format("woff");
font-weight:normal;
font-style:normal;
}
@font-face {
font-family:"Scratch";
src:url("/static/content/fonts/avali-scratch.otf.woff2") format("woff2");
font-weight:normal;
font-style:normal;
}
@font-face {
font-family:"Ultrafont";
src:url("/static/content/fonts/ultrakill-font.woff2") format("woff2");
font-weight:normal;
font-style:normal;
}
@font-face {
font-family:"Ultrafont2";
src:url("/static/content/fonts/ultrakill-font-2.woff2") format("woff2");
font-weight:normal;
font-style:normal;
}
:root {
--primary-color: #5cdd8b;
--primary-color-but-slightly-transparent: #5cdd8b44;
--text-color: #b1b8c0;
--background-color: #020205;
--secondary-background-color: #090914;
--secondary-background-color-but-slightly-transparent: #09091444;
--font-size: 0.5cm;
--font-family: "Space Mono", "serif";
--title-font: 'Roboto Mono', sans-serif;
--irken-font: 'Irken';
--scratch-font: 'Scratch';
--ultrafont-font: 'Ultrafont';
--smileos2-box: url(/static/content/smileos/SmileOS_2_Box.webp) 17 3 3 fill / 51px 9px 9px;
--smileos2-font: 'Ultrafont2';
--smileos2-emphasis: #FF4343;
--line-height: normal;
--header-line-height: normal;
}
body {
background-color: var(--background-color);
background-image: url("https://blinkies.cafe/purple-stars-bg.gif");
color: var(--text-color);
font-size: var(--font-size);
font-family: var(--font-family);
line-height: var(--line-height);
display: grid;
grid-template-columns: auto auto;
grid-template-rows: 1fr;
grid-template-areas: "main sidebar";
margin: 7% auto 7% auto;
gap: 1rem;
justify-content: center;
width: 940px;
}
h1, h2, h3, h4, h5, h6 {
line-height: var(--header-line-height);
}
#sidebar {
grid-area: sidebar;
display: flex;
flex-direction: column;
gap: 1rem;
width: 174px;
}
#sidebar section {
backdrop-filter: blur(2px) brightness(0.6);
border: var(--secondary-background-color) 2px solid;
border-radius: 10px;
padding: 10px;
}
#sidebar ul {
list-style-type: none;
margin: 0;
padding: 0;
display: flex;
flex-direction: column;
}
#sidebar ul li {
width: fit-content;
}
#sidebar ul li a {
color: var(--text-color);
text-decoration: none;
font-weight: 100;
transition: all 0.2s ease-in-out
}
#sidebar ul li a:hover {
color: var(--primary-color);
font-weight: 900;
}
#sidebar ul li img {
transition: all 0.2s ease-in-out;
}
#sidebar ul li img:hover {
transform: scale(1.1);
}
#sidebar h1 {
font-family: var(--title-font);
font-size: 1.5rem;
font-weight: 900;
margin: 0;
padding: 0;
}
#sidebar h6 {
font-weight: 100;
margin: 0;
padding: 0;
}
#buttons {
text-align: center;
}
#buttons h1 {
font-family: var(--title-font);
font-size: 1.3rem;
font-weight: 900;
margin: 0;
padding: 0;
text-shadow: var(--text-color) 1px 0 10px;
}
#buttons ul {
list-style-type: none;
margin: 0;
padding: 0;
display: flex;
flex-direction: column;
margin-top: 5px;
align-items: center;
}
.vsmoltext {
font-size: 0.5rem;
}
main {
grid-area: main;
width: 761px;
height: 100%;
display: flex;
flex-direction: column;
gap: 1rem;
}
header {
backdrop-filter: blur(2px) brightness(0.6);
border: var(--secondary-background-color) 2px solid;
border-radius: 10px;
padding: 15px;
}
header div.row {
display: flex;
flex-direction: row;
margin: 0;
gap: 1.5rem;
}
header div.column {
display: flex;
flex-direction: column;
justify-content: center;
margin: 0;
}
header img {
width: 9rem;
height: 9rem;
}
header h1 {
font-family: var(--title-font);
font-size: 5rem;
font-weight: 900;
padding: 0;
margin: 0;
}
header h2 {
font-family: var(--title-font);
font-size: 1.75rem;
font-weight: 100;
padding: 0;
margin: 0;
position: relative;
top: -1rem;
}
main section {
backdrop-filter: blur(2px) brightness(0.6);
width: 100%;
display: flex;
flex-direction: column;
border: var(--secondary-background-color) 2px solid;
border-radius: 10px;
padding: 15px;
box-sizing: border-box;
}
main section h1 {
font-size: 3rem;
font-weight: 900;
margin: 0;
padding: 0;
}
main section h2 {
font-size: 1.5rem;
font-weight: 900;
margin: 0;
padding: 0;
}
main section h6 {
font-size: 0.7rem;
font-weight: 100;
margin: 0;
padding: 0;
}
main section p {
font-size: 1rem;
margin: 0;
padding: 0;
font-weight: 300;
}
main section a {
color: var(--primary-color);
text-decoration: none;
}
.smileos {
border-image: var(--smileos2-box);
padding: 54px 15px 12px;
image-rendering: pixelated;
font-size: 1.25rem;
font-family: var(--smileos2-font);
color: #fff;
}
#furry {
position: fixed;
left: 0;
top: 0;
right: 0;
bottom: 0;
opacity: 0.1;
background-image: url('/static/content/general_images/background.png');
background-repeat: no-repeat;
background-position: 50% 0;
background-size: cover;
z-index: -1;
display: none;
}
.haj {
width: 100%;
filter: drop-shadow(0 0 0.5rem rgb(88, 214, 245));
}
.irken {
font-family: var(--irken-font);
}
.scratch {
font-family: var(--scratch-font);
}
.ultrafont {
font-family: var(--ultrafont-font);
}
#alt-nav {
display: none;
backdrop-filter: blur(2px) brightness(0.6);
width: 100%;
border: var(--secondary-background-color) 2px solid;
border-radius: 10px;
padding: 15px;
box-sizing: border-box;
}
#alt-nav ul {
list-style-type: none;
margin: 0;
padding: 0;
display: flex;
flex-wrap: wrap;
flex-direction: row;
gap: 1.5rem;
justify-content: center;
}
#alt-nav ul li {
width: fit-content;
}
#alt-nav ul li a {
color: var(--text-color);
text-decoration: none;
font-weight: 100;
transition: all 0.2s ease-in-out
}
#alt-nav ul li a:hover {
color: var(--primary-color);
font-weight: 900;
}
.title-font {
font-family: var(--title-font);
}
.flex-col {
display: flex;
flex-direction: column;
gap: 1rem;
}
.flex-row {
display: flex;
flex-direction: row;
gap: 1rem;
}
.no-sect {
backdrop-filter: none;
border: none;
border-radius: 0;
padding: 0;
box-sizing: border-box;
}
a {
text-decoration: none;
}
code {
background-color: var(--secondary-background-color-but-slightly-transparent);
padding: 4px 6px;
border-radius: 4px;
font-size: 0.9rem;
color: var(--primary-color);
}
#toaster-wave {
position: absolute;
left: -145px;
top: 200px;
}
.webring {
text-align: center;
}
.webring a {
text-decoration: none;
color: var(--primary-color);
font-size: 1.2rem;
}
.webring a:hover {
font-weight: 900;
text-shadow: 0px 0px 10px var(--primary-color-but-slightly-transparent);
}
@media screen and (max-width: 1240px) {
#toaster-wave {
display: none;
}
}
@media screen and (max-width: 1000px) {
body {
background-color: var(--background-color);
background-image: url("https://blinkies.cafe/purple-stars-bg.gif");
color: var(--text-color);
font-size: var(--font-size);
font-family: var(--font-family);
display: grid;
grid-template-columns: auto;
grid-template-rows: 1fr;
grid-template-areas: "main";
margin: 7% 0 7% 0;
gap: 1rem;
justify-content: center;
width: 100%;
}
#sidebar {
display: none;
}
#alt-nav {
display: block;
}
main {
width: 100%;
box-sizing: border-box;
padding: 0 1rem 0 1rem;
}
}
@media screen and (max-width: 650px) {
.flex-row {
flex-direction: column;
}
.flex-col {
flex-direction: row;
}
header img {
display: none;
}
header div.row {
justify-content: center;
}
header div {
text-align: center;
}
header h2 {
display: none;
}
div#spotify {
box-sizing: border-box;
background-repeat: no-repeat;
background-size: contain;
height: 100%;
width: auto;
aspect-ratio: 1/1;
display: flex;
flex-direction: column;
}
}
+13
View File
@@ -0,0 +1,13 @@
section#directory ul {
list-style: none;
padding: 0;
margin: 0;
}
section#directory li {
margin: 0.5rem 0;
}
section#directory a:hover {
scale: 1.05;
}
+3
View File
@@ -0,0 +1,3 @@
section h2 {
margin-top: 2rem !important;
}
+8
View File
@@ -0,0 +1,8 @@
.bluescreen {
background-color: #0077D6;
color: #fff;
padding:40px;
display: flex;
flex-direction: column;
gap: 20px;
}
+23
View File
@@ -0,0 +1,23 @@
.gallery {
width: 100%;
}
.gallery .gallery-images {
display: flex;
flex-direction: column;
justify-content: space-between;
gap: 1rem;
overflow: hidden;
}
.gallery .gallery-images img {
max-width: 100%;
height: auto;
border-radius: 10px;
}
.gallery h2.gallery-date {
position: relative;
top: 0;
left: 0;
}
+17 -351
View File
@@ -1,240 +1,3 @@
@import url('https://fonts.googleapis.com/css2?family=Fredoka:wdth,wght@125,700&family=Space+Mono:ital,wght@0,400;0,700;1,400;1,700&display=swap');
@font-face {
font-family:"Irken";
src:url("/static/content/Irken-Like-AllCaps.woff") format("woff");
font-weight:normal;
font-style:normal;
}
:root {
--primary-color: #5cdd8b;
--primary-color-but-slightly-transparent: #5cdd8b44;
--text-color: #b1b8c0;
--background-color: #020205;
--secondary-background-color: #090914;
--secondary-background-color-but-slightly-transparent: #09091444;
--font-size: 0.5cm;
--font-family: "Space Mono", "serif";
--title-font: 'Roboto Mono', sans-serif;
--irken-font: 'Irken';
}
body {
background-color: var(--background-color);
background-image: url("https://blinkies.cafe/purple-stars-bg.gif");
color: var(--text-color);
font-size: var(--font-size);
font-family: var(--font-family);
display: grid;
grid-template-columns: auto auto;
grid-template-rows: 1fr;
grid-template-areas: "main sidebar";
margin: 7% auto 7% auto;
gap: 1rem;
justify-content: center;
width: 940px;
}
#sidebar {
grid-area: sidebar;
display: flex;
flex-direction: column;
gap: 1rem;
width: 174px;
}
#sidebar section {
backdrop-filter: blur(2px) brightness(0.6);
border: var(--secondary-background-color) 2px solid;
border-radius: 10px;
padding: 10px;
}
#sidebar ul {
list-style-type: none;
margin: 0;
padding: 0;
display: flex;
flex-direction: column;
}
#sidebar ul li {
width: fit-content;
}
#sidebar ul li a {
color: var(--text-color);
text-decoration: none;
font-weight: 100;
transition: all 0.2s ease-in-out
}
#sidebar ul li a:hover {
color: var(--primary-color);
font-weight: 900;
}
#sidebar ul li img {
transition: all 0.2s ease-in-out;
}
#sidebar ul li img:hover {
transform: scale(1.1);
}
#sidebar h1 {
font-family: var(--title-font);
font-size: 1.5rem;
font-weight: 900;
margin: 0;
padding: 0;
}
#sidebar h6 {
font-weight: 100;
margin: 0;
padding: 0;
}
#buttons {
text-align: center;
}
#buttons h1 {
font-family: var(--title-font);
font-size: 1.3rem;
font-weight: 900;
margin: 0;
padding: 0;
text-shadow: var(--text-color) 1px 0 10px;
}
#buttons ul {
list-style-type: none;
margin: 0;
padding: 0;
display: flex;
flex-direction: column;
margin-top: 5px;
align-items: center;
}
.vsmoltext {
font-size: 0.5rem;
}
main {
grid-area: main;
width: 761px;
height: 100%;
display: flex;
flex-direction: column;
gap: 1rem;
}
header {
backdrop-filter: blur(2px) brightness(0.6);
border: var(--secondary-background-color) 2px solid;
border-radius: 10px;
padding: 15px;
}
header div.row {
display: flex;
flex-direction: row;
margin: 0;
gap: 1.5rem;
}
header div.column {
display: flex;
flex-direction: column;
justify-content: center;
margin: 0;
}
header img {
width: 9rem;
height: 9rem;
}
header h1 {
font-family: var(--title-font);
font-size: 5rem;
font-weight: 900;
padding: 0;
margin: 0;
}
header h2 {
font-family: var(--title-font);
font-size: 1.75rem;
font-weight: 100;
padding: 0;
margin: 0;
position: relative;
top: -1rem;
}
main section {
backdrop-filter: blur(2px) brightness(0.6);
width: 100%;
display: flex;
flex-direction: column;
border: var(--secondary-background-color) 2px solid;
border-radius: 10px;
padding: 15px;
box-sizing: border-box;
}
main section h1 {
font-size: 3rem;
font-weight: 900;
margin: 0;
padding: 0;
}
main section h2 {
font-size: 1.5rem;
font-weight: 900;
margin: 0;
padding: 0;
}
main section h6 {
font-size: 0.7rem;
font-weight: 100;
margin: 0;
padding: 0;
}
main section p {
font-size: 1rem;
margin: 0;
padding: 0;
font-weight: 300;
}
main section a {
color: var(--primary-color);
text-decoration: none;
}
#furry {
position: fixed;
left: 0;
top: 0;
right: 0;
bottom: 0;
opacity: 0.1;
background-image: url('/static/content/background.png');
background-repeat: no-repeat;
background-position: 50% 0;
background-size: cover;
z-index: -1;
display: none;
}
.blinkies {
justify-content: center;
display: flex;
@@ -256,22 +19,6 @@ main section a {
transform: scale(1.1) rotate(-5deg);
}
section.rowsect {
width: 100%;
display: grid;
grid-template-columns: auto auto;
gap: 1rem;
backdrop-filter: none;
border: none;
padding: 0;
}
section.rowsect>div {
backdrop-filter: blur(2px) brightness(0.6);
border: var(--secondary-background-color) 2px solid;
border-radius: 10px;
}
.stamps {
display: flex;
flex-direction: row;
@@ -296,7 +43,7 @@ section.rowsect>div {
transform: scale(1.1) rotate(-5deg);
}
#spotify {
#listenbrainz {
background-image: none;
backdrop-filter: blur(2px) brightness(0.6);
border: var(--secondary-background-color) 2px solid;
@@ -311,8 +58,8 @@ section.rowsect>div {
flex-direction: column;
}
#spotify-title {
font-size: 1.5rem;
#listenbrainz-title {
font-size: 1.2rem;
font-weight: 900;
margin: 0;
padding: 0;
@@ -320,22 +67,27 @@ section.rowsect>div {
color: white;
}
#spotify-artist {
#listenbrainz-artist {
color: white;
font-size: 1rem;
font-size: 0.7rem;
font-weight: 900;
margin: 0;
padding: 0;
mix-blend-mode: difference;
}
.haj {
width: 100%;
filter: drop-shadow(0 0 0.5rem rgb(88, 214, 245));
}
.irken {
font-family: var(--irken-font);
#listenbrainz-live {
color: white;
font-size: 0.6rem;
font-weight: 900;
margin: 0;
padding: 0;
margin-top: auto;
margin-left: auto;
background-color: gray;
border-radius: 30px;
padding: 2px 6px;
font-family: var(--ultrafont-font);
}
#button-collection {
@@ -357,93 +109,7 @@ section.rowsect>div {
transform: scale(1.1) rotate(-5deg);
}
#alt-nav {
display: none;
backdrop-filter: blur(2px) brightness(0.6);
width: 100%;
border: var(--secondary-background-color) 2px solid;
border-radius: 10px;
padding: 15px;
box-sizing: border-box;
}
#alt-nav ul {
list-style-type: none;
margin: 0;
padding: 0;
display: flex;
flex-wrap: wrap;
flex-direction: row;
gap: 1.5rem;
justify-content: center;
}
#alt-nav ul li {
width: fit-content;
}
#alt-nav ul li a {
color: var(--text-color);
text-decoration: none;
font-weight: 100;
transition: all 0.2s ease-in-out
}
#alt-nav ul li a:hover {
color: var(--primary-color);
font-weight: 900;
}
@media screen and (max-width: 1000px) {
body {
background-color: var(--background-color);
background-image: url("https://blinkies.cafe/purple-stars-bg.gif");
color: var(--text-color);
font-size: var(--font-size);
font-family: var(--font-family);
display: grid;
grid-template-columns: auto;
grid-template-rows: 1fr;
grid-template-areas: "main";
margin: 7% 0 7% 0;
gap: 1rem;
justify-content: center;
width: 100%;
}
#sidebar {
display: none;
}
#alt-nav {
display: block;
}
main {
width: 100%;
box-sizing: border-box;
padding: 0 1rem 0 1rem;
}
}
@media screen and (max-width: 650px) {
header img {
display: none;
}
header div.row {
justify-content: center;
}
section.rowsect {
width: 100%;
display: flex;
flex-direction: column;
gap: 1rem;
backdrop-filter: none;
border: none;
padding: 0;
}
div#spotify {
box-sizing: border-box;
background-repeat: no-repeat;
+131
View File
@@ -0,0 +1,131 @@
@font-face {
font-family:"Ultrafont2";
src:url("/static/content/fonts/ultrakill-font-2.woff2") format("woff2");
font-weight:normal;
font-style:normal;
}
#terminal {
aspect-ratio: 4/3;
padding: 0;
font-family: "Ultrafont2";
font-size: 1.2rem;
color: #ffffff;
border: none;
}
.smileos-header {
height: 9%;
border-image: url(/static/content/smileos/SmileOS_2_Header.webp) 3 fill / 9px;
display: flex;
flex-direction: row;
align-items: center;
padding: 0;
font-size: 1.4rem;
font-weight: 900;
padding-left: 7px;
padding-right: 7px;
image-rendering: pixelated;
}
.smileos-header img {
height: 100%;
object-fit: contain;
}
#terminal-container {
border-image: url(/static/content/smileos/SmileOS_2_Content.webp) 1 3 3 fill / 3px 9px 9px;
height: 100%;
display: grid;
grid-template-areas:
"logo window"
"buttons window";
grid-template-columns: 40% 1fr;
grid-template-rows: 25% 1fr;
padding: 15px;
box-sizing: border-box;
image-rendering: pixelated;
}
#smileos-logo {
width: 250px;
grid-area: logo;
margin: auto;
image-rendering: pixelated;
}
#terminal-window {
height: 100%;
grid-area: window;
}
#window-container {
border-image: url(/static/content/smileos/SmileOS_2_Content.webp) 1 3 3 fill / 3px 9px 9px;
height: 91%;
padding: 35px;
box-sizing: border-box;
image-rendering: pixelated;
}
#window-content {
border-image: url(/static/content/smileos/SmileOS_2_inset_panel.webp) 1 fill / 3px;
height: 100%;
box-sizing: border-box;
padding: 15px;
display: flex;
justify-content: center;
align-items: center;
text-align: center;
image-rendering: pixelated;
}
.red {
color: #ff4343;
}
#terminal-buttons {
grid-area: buttons;
display: flex;
flex-direction: column;
align-items: center;
gap: 10px;
}
.terminal-button {
border-image: url(/static/content/smileos/SmileOS_2_Button_transparent.png) 2 / 9px;
background: url(/static/content/smileos/SmileOS_2_Button_Background.png);
background-repeat: repeat-x;
background-size: 100% 100%;
border-radius: 15px;
height: 75px;
width: 270px;
image-rendering: pixelated;
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
font-family: "Ultrafont2";
font-size: 1.2rem;
color: #ffffff;
}
.terminal-button:hover {
filter: contrast(110%);
}
.terminal-button:active {
filter: contrast(125%);
}
#smileos-window-content img {
width: 100%;
}
#smileos-restart-music {
color: #FF4343;
cursor: pointer;
}
#smileos-restart-music:hover {
font-weight: 700;
}
+88
View File
@@ -0,0 +1,88 @@
ul#toaster-specs {
padding: 0;
margin: 5px 0;
display: flex;
flex-direction: column;
gap: 2px;
min-width: 400px;
}
ul#toaster-specs li {
display: flex;
justify-content: space-between;
gap: 2rem;
height: 35px;
align-items: center;
}
.color {
border-radius: 10px;
border: 2px solid var(--secondary-background-color);
padding: 1px 5px;
box-sizing: border-box;
height: min-content;
}
#toaster-img {
max-width: 100%;
object-fit: contain;
border-radius: 10px;
border: 2px solid var(--secondary-background-color);
}
.fill-height {
height: 100%;
}
.fur-meet-gallery-small {
display: flex;
flex-wrap: wrap;
gap: 5px;
}
.fur-meet-gallery-small img {
width: 150px;
height: 150px;
object-fit: cover;
border-radius: 10px;
border: 2px solid var(--secondary-background-color);
}
.fur-meet-gallery-small img:hover {
transform: scale(1.05);
transition: transform 0.2s ease-in-out;
cursor: pointer;
}
#fur-meets {
list-style: none;
padding: 0;
margin: 10px;
display: flex;
flex-direction: column;
gap: 10px;
}
@media screen and (max-width: 740px) {
.flex-row {
flex-direction: column;
}
.flex-col {
flex-direction: row;
}
#toaster-img {
width: 100%;
}
}
@media screen and (max-width: 690px) {
.flex-col {
flex-direction: column;
}
}
#toaster-wave {
display: none;
}
+107
View File
@@ -0,0 +1,107 @@
const values = [
"Web developer",
"Pc games enjoyer",
"Server backend survivor",
"python programmer",
"Javascript disliker",
"I use Arch btw",
"Owo, what's this?",
"Ultimate procrastinator",
"Ultrakill gaming",
"00111010 00110011",
"fistful of dollar",
"Thy end is now!!!",
"Possibly a furry",
"Prepare thyself!!!",
"Spegatti code master",
"Ethernet cable untangler",
"Caffeine addict",
"I'm not a robot ☑",
"Loud Music enjoyer",
"part time femboy :<",
];
let typing_direction = 1;
let text = "";
let speed = 100;
let selectedValue = 0;
let currentValueIndex = 0;
let pause = false;
function randomValue() {
selectedValue = Math.floor(Math.random() * values.length);
currentValueIndex = 0;
}
function type() {
if (typing_direction == 1) {
if (currentValueIndex < values[selectedValue].length) {
text += values[selectedValue][currentValueIndex];
currentValueIndex++;
} else {
typing_direction = -1;
pause = true;
}
} else {
if (currentValueIndex > 0) {
text = text.slice(0, -1);
currentValueIndex--;
} else {
typing_direction = 1;
randomValue();
}
}
}
function typing() {
type();
document.getElementById("typing").innerHTML = "$ " + text;
if (typing_direction == 1) {
speed = 80 + Math.random() * 100;
} else {
speed = 60 + (Math.random() * 100) / 2;
}
if (!pause) {
setTimeout(typing, speed);
} else {
setTimeout(typing, 500);
pause = false;
}
}
typing();
// HIDDEN STUFF (shh don't tell anyone >:3)
let last15Chars = "";
document.addEventListener('keydown', function(event) {
last15Chars += event.key;
if (last15Chars.includes("owo")) {
console.log("owo, whats this?");
document.getElementById('furry').style.display = 'block';
last15Chars = "";
}
if (last15Chars.includes("doom")) {
console.log("Im gonna sing the doom song now");
document.querySelector(":root").style.setProperty('--font-family', 'Irken');
document.querySelector(":root").style.setProperty('--ultrafont-font', 'Irken');
document.querySelector(":root").style.setProperty('--smileos2-font', 'Irken');
document.querySelector(":root").style.setProperty('--title-font', '1.5em');
document.querySelector(":root").style.setProperty('--line-height', 'default');
document.querySelector(":root").style.setProperty('--header-line-height', 'default');
last15Chars = "";
}
if (last15Chars.includes("kfc")) {
console.log("space chicken");
document.querySelector(":root").style.setProperty('--font-family', 'Scratch');
document.querySelector(":root").style.setProperty('--title-font', '1em');
document.querySelector(":root").style.setProperty('--line-height', '120%');
document.querySelector(":root").style.setProperty('--header-line-height', '150%');
document.querySelector(":root").style.setProperty('--ultrafont-font', 'Scratch');
document.querySelector(":root").style.setProperty('--smileos2-font', 'Scratch');
last15Chars = "";
}
while (last15Chars.length >= 15) {
last15Chars = last15Chars.slice(1);
}
});
+70
View File
@@ -0,0 +1,70 @@
// onionring.js is made up of four files - onionring-widget.js (this one!), onionring-index.js, onionring-variables.js and onionring.css
// it's licensed under the cooperative non-violent license (CNPL) v4+ (https://thufie.lain.haus/NPL.html)
// it was originally made by joey + mord of allium (蒜) house, last updated 2020-11-24
// === ONIONRING-WIDGET ===
//this file contains the code which builds the widget shown on each page in the ring. ctrl+f 'EDIT THIS' if you're looking to change the actual html of the widget
var tag = document.getElementById(ringID); //find the widget on the page
thisSite = window.location.href; //get the url of the site we're currently on
thisIndex = null;
// FIX
thisSite = thisSite.replace("alfieking.dev", "proot.uk"); // fix domain
thisSite = thisSite.replace("http:\/\/127.0.0.1:5000", "https:\/\/proot.uk"); // For debug purposes
// go through the site list to see if this site is on it and find its position
for (i = 0; i < sites.length; i++) {
if (thisSite.startsWith(sites[i])) { //we use startswith so this will match any subdirectory, users can put the widget on multiple pages
thisIndex = i;
break; //when we've found the site, we don't need to search any more, so stop the loop
}
}
function randomSite() {
otherSites = sites.slice(); //create a copy of the sites list
otherSites.splice(thisIndex, 1); //remove the current site so we don't just land on it again
randomIndex = Math.floor(Math.random() * otherSites.length);
location.href = otherSites[randomIndex];
}
//if we didn't find the site in the list, the widget displays a warning instead
if (thisIndex == null) {
tag.insertAdjacentHTML('afterbegin', `
<table>
<tr>
<td>This site isn't part of the ${ringName} webring yet 😿</td>
</tr>
</table>
`);
}
else {
//find the 'next' and 'previous' sites in the ring. this code looks complex
//because it's using a shorthand version of an if-else statement to make sure
//the first and last sites in the ring join together correctly
previousIndex = (thisIndex-1 < 0) ? sites.length-1 : thisIndex-1;
nextIndex = (thisIndex+1 >= sites.length) ? 0 : thisIndex+1;
indexText = ""
//if you've chosen to include an index, this builds the link to that
if (useIndex) {
indexText = `<a href='${indexPage}'>index</a> | `;
}
randomText = ""
//if you've chosen to include a random button, this builds the link that does that
if (useRandom) {
randomText = `<a href='javascript:void(0)' onclick='randomSite()'>random</a> | `;
}
tag.classList = "webring";
//this is the code that displays the widget - EDIT THIS if you want to change the structure
tag.insertAdjacentHTML('afterbegin', `
<a href='${indexPage}'>${ringName}</a><br>
<a href='${sites[previousIndex]}'><--</a>
<a href='${sites[nextIndex]}'>--></a>
`);
}
+42 -125
View File
@@ -1,126 +1,5 @@
// TYPERWRITER
const values = [
"Web developer",
"Pc games enjoyer",
"Server backend survivor",
"python programmer",
"Javascript disliker",
"I use Arch btw",
"Owo, what's this?",
"Ultimate procrastinator",
"Ultrakill gaming",
"00111010 00110011",
"fistful of dollar",
"Thy end is now!!!",
"Possibly a furry",
"Prepare thyself!!!",
"Spegatti code master",
"Ethernet cable untangler",
"Caffeine addict",
"I'm not a robot ☑",
"Loud Music enjoyer",
"part time femboy :<",
];
var direction = 1;
var text = "";
var speed = 100;
var selectedValue = 0;
var currentValueIndex = 0;
var pause = false;
function randomValue() {
selectedValue = Math.floor(Math.random() * values.length);
currentValueIndex = 0;
}
function type() {
if (direction == 1) {
if (currentValueIndex < values[selectedValue].length) {
text += values[selectedValue][currentValueIndex];
currentValueIndex++;
} else {
direction = -1;
pause = true;
}
} else {
if (currentValueIndex > 0) {
text = text.slice(0, -1);
currentValueIndex--;
} else {
direction = 1;
randomValue();
}
}
}
function typing() {
type();
document.getElementById("typing").innerHTML = "$ " + text;
if (direction == 1) {
speed = 80 + Math.random() * 100;
} else {
speed = 60 + (Math.random() * 100) / 2;
}
if (!pause) {
setTimeout(typing, speed);
} else {
setTimeout(typing, 500);
pause = false;
}
}
typing();
// HIDDEN STUFF (shh don't tell anyone >:3)
var last5Chars = "";
document.addEventListener('keydown', function(event) {
last5Chars += event.key;
if (last5Chars == "furry") {
console.log("owo, whats this?");
document.getElementById('furry').style.display = 'block';
}
if (last5Chars == "irken") {
console.log("doom doom doom!");
document.querySelector(":root").style.setProperty('--font-family', 'Irken');
document.querySelector(":root").style.setProperty('--title-font', '1.5em');
}
while (last5Chars.length >= 5) {
last5Chars = last5Chars.slice(1);
}
});
// Spotify API
function getSpotify() {
fetch('https://api.alfieking.dev/spotify/nowplaying/xz02oolstlvwxqu1pfcua9exz').then(response => {
return response.json();
}).then(data => {
if (data.item == null) {
document.getElementById('spotify').style.backgroundImage = "none";
document.getElementById('spotify-title').innerHTML = "Spotify is not playing anything";
document.getElementById('spotify-artist').innerHTML = ":(";
document.getElementById('spotify-link').href = "https://open.spotify.com/";
return;
}
document.getElementById('spotify').style.backgroundImage = "url(" + data.item.album.images[0].url + ")";
document.getElementById('spotify-title').innerHTML = data.item.name;
document.getElementById('spotify-artist').innerHTML = data.item.artists[0].name;
document.getElementById('spotify-link').href = data.item.external_urls.spotify;
});
}
if (document.getElementById('spotify')) {
getSpotify();
setInterval(getSpotify, 15000);
}
// load buttons
function loadButtons() {
fetch('/static/content/buttons.txt').then(response => {
fetch('/static/content/buttons/non_link_buttons.txt').then(response => {
return response.text();
}).then(data => {
container = document.getElementById('button-collection');
@@ -135,6 +14,44 @@ function loadButtons() {
});
}
if (document.getElementById('button-collection')) {
loadButtons();
}
function getAlbumArt(songName, artistName) {
fetch("/music/metadata?recording_name=" + encodeURIComponent(songName) + "&artist_name=" + encodeURIComponent(artistName)).then(response => response.json()).then(data => {
if (Object.keys(data).length > 0) {
document.getElementById('listenbrainz').style.backgroundImage = "url(https://coverartarchive.org/release/" + data.release_mbid + "/front)";
} else {
console.log("No album art found for the given song and artist");
document.getElementById('listenbrainz').style.backgroundImage = "url(https://placehold.co/512x512/transparent/777?text=[Insert%20art%20here])";
}
});
}
function getMusic() {
fetch("https://api.listenbrainz.org/1/user/acetheking987/playing-now").then(response => response.json()).then(data => {
if (data.payload.count != 0) {
let song_data = data.payload.listens[0].track_metadata;
getAlbumArt(song_data.track_name, song_data.artist_name);
document.getElementById('listenbrainz-title').innerHTML = song_data.track_name;
document.getElementById('listenbrainz-artist').innerHTML = song_data.artist_name;
document.getElementById('listenbrainz-link').href = "https://listenbrainz.org/user/acetheking987/";
document.getElementById('listenbrainz-live').style.backgroundColor = "red";
document.getElementById('listenbrainz-live').innerHTML = "Live";
} else {
fetch("https://api.listenbrainz.org/1/user/acetheking987/listens?count=1").then(response => response.json()).then(data => {
if (data.payload.count != 0) {
let song_data = data.payload.listens[0].track_metadata;
getAlbumArt(song_data.track_name, song_data.artist_name);
document.getElementById('listenbrainz-title').innerHTML = song_data.track_name;
document.getElementById('listenbrainz-artist').innerHTML = song_data.artist_name;
document.getElementById('listenbrainz-link').href = "https://listenbrainz.org/user/acetheking987/";
document.getElementById('listenbrainz-live').style.backgroundColor = "grey";
document.getElementById('listenbrainz-live').innerHTML = "Not Live :<";
}
});
}
});
}
loadButtons();
getMusic();
setInterval(getMusic, 15000);
+115
View File
@@ -0,0 +1,115 @@
const tips_of_the_day = [
`The Revolver deals <span style="color:var(--smileos2-emphasis)">locational damage</span>.<br>A <span style="color:var(--smileos2-emphasis)">headshot</span> deals <span style="color:var(--smileos2-emphasis)">2x</span> damage and a <span style="color:var(--smileos2-emphasis)">limbshot</span> deals <span style="color:var(--smileos2-emphasis)">1.5x</span> damage.`,
`<span style="color:var(--smileos2-emphasis)">Dash</span>: Fully invincible, costs stamina<br><span style="color:var(--smileos2-emphasis)">Slide</span>: Greater distance, no invincibility<br><span style="color:var(--smileos2-emphasis)">Jump</span>: Quickly out of melee range, less control`,
`<span style="color:var(--smileos2-emphasis)">Shotgun parries</span>: A <span style="color:var(--smileos2-emphasis)">point-blank</span> Shotgun shot to the torso right before an enemy attack lands will deal massive damage.`,
`<span style="color:var(--smileos2-emphasis)">Attack sound cues</span> allow you to keep track of enemies who are off screen.`,
`Some enemies make <span style="color:var(--smileos2-emphasis)">idle sounds</span> to make them easier to track.`,
`Use the <span style="color:cyan">ATTRACTOR NAILGUN</span>'s magnets to form concentrated <span style="color:var(--smileos2-emphasis)">orbs</span> of nails that can be <span style="color:var(--smileos2-emphasis)">moved</span> around using the pull force of <span style="color:var(--smileos2-emphasis)">other magnets</span>.`,
`Enemies <span style="color:var(--smileos2-emphasis)">can hurt</span> other enemy types. With quick thinking and positioning, powerful enemies can turn into powerful weapons.`,
`The <span style="color:cyan">ATTRACTOR NAILGUN</span>'s magnets can be attached to enemies to make mobile targets easy to hit with nails.`,
`Enemies <span style="color:var(--smileos2-emphasis)">scream</span> when falling from a <span style="color:var(--smileos2-emphasis)">fatal height</span>.`,
`<span style="color:var(--smileos2-emphasis)">SLAM BOUNCING</span>: Jump immediately after landing from a <span style="color:var(--smileos2-emphasis)">ground slam</span> to jump higher. The longer the ground slam fall, the higher the bounce.`,
`<span style="color:var(--smileos2-emphasis)">RAILCANNON</span> variations all share the same cooldown. Choose wisely which variation best fits the situation.`,
`<span style="color:var(--smileos2-emphasis)">SLIDING</span> will retain previous momentum for a short amount of time. Chaining quick <span style="color:var(--smileos2-emphasis)">SLIDE JUMPS</span> after a <span style="color:var(--smileos2-emphasis)">DASH JUMP</span> will give you incredible sustained speed.`,
`<span style="color:var(--smileos2-emphasis)">Environmental hazards</span> such as harmful liquids will hurt enemies as well.`,
`If you're having trouble keeping up with a tough enemy, <span style="color:var(--smileos2-emphasis)">stand back and observe</span>. Every enemy has its <span style="color:var(--smileos2-emphasis)">tells</span> and <span style="color:var(--smileos2-emphasis)">patterns</span> and learning those can be your key to victory.`,
`<span style="color:var(--smileos2-emphasis)">HITSCAN</span> weapons can be used to hit the shotgun's <span style="color:cyan">CORE EJECT</span> in mid-air to increase its damage and blast radius.`,
`<span style="color:var(--smileos2-emphasis)">POWER-UPS</span> can be stacked.`,
`Hitting an enemy with only the <span style="color:var(--smileos2-emphasis)">edge</span> of an <span style="color:var(--smileos2-emphasis)">explosion</span> will launch them without dealing much damage, making it a risky but effective tool against <span style="color:var(--smileos2-emphasis)">Stalkers</span>.`,
`Airborne <span style="color:var(--smileos2-emphasis)">coins</span> can be shot with any <span style="color:var(--smileos2-emphasis)">hitscan</span> weapon.`,
`Falling <span style="color:var(--smileos2-emphasis)">underwater</span> is slow, but a <span style="color:var(--smileos2-emphasis)">ground slam</span> allows for a quick return to the ground.`,
`<span style="color:var(--smileos2-emphasis)">Sliding</span> onto water will cause one to <span style="color:var(--smileos2-emphasis)">skip across</span> its surface.`,
`If an enemy is <span style="color:var(--smileos2-emphasis)">blessed</span> by an <span style="color:var(--smileos2-emphasis)">Idol</span>, a direct visible connection is formed between the two, allowing one to easily <span style="color:var(--smileos2-emphasis)">track down</span> and destroy the protector.`,
`<span style="color:var(--smileos2-emphasis)">Explosions</span> deflect <span style="color:var(--smileos2-emphasis)">projectiles</span>.<br><br>If an explosion is caused right from where an enemy shoots a projectile, it can <span style="color:var(--smileos2-emphasis)">backfire</span> and <span style="color:var(--smileos2-emphasis)">hit them</span> instead.`,
`The space of a <span style="color:var(--smileos2-emphasis)">large</span> arena can be used to one's advantage. Using the environment to <span style="color:var(--smileos2-emphasis)">break line-of-sight</span> with enemies allows for some breathing room and time to consider <span style="color:var(--smileos2-emphasis)">target prioritization</span>.`,
`<span style="color:var(--smileos2-emphasis)">DON'T</span> WASTE STAMINA! Dashing <span style="color:var(--smileos2-emphasis)">needlessly</span> while fighting very <span style="color:var(--smileos2-emphasis)">aggressive foes</span> will quickly cause one to have none left when it is most needed.`,
`<span style="color:var(--smileos2-emphasis)">Homing projectiles</span> may be more difficult to dodge, but their tracking and slower speed makes them much <span style="color:var(--smileos2-emphasis)">easier</span> to <span style="color:var(--smileos2-emphasis)">parry</span>.`,
`<span style="color:var(--smileos2-emphasis)">Mannequins</span> can be hard to hit due to their speed, but they lose air control when <span style="color:var(--smileos2-emphasis)">launched</span> or <span style="color:var(--smileos2-emphasis)">shot down</span> from a surface, making them <span style="color:var(--smileos2-emphasis)">unable to move</span> for a short moment.`,
`The <span style="color:red">Knuckleblaster</span>'s <span style="color:var(--smileos2-emphasis)">blast wave</span> is also capable of breaking a <span style="color:var(--smileos2-emphasis)">Gutterman's shield</span>, and is much easier to land in a chaotic scenario.`,
`A <span style="color:var(--smileos2-emphasis)">direct hit</span> from the <span style="color:red">Knuckleblaster</span> has extremely powerful <span style="color:var(--smileos2-emphasis)">knockback</span>, making it extremely powerful for launching enemies into <span style="color:var(--smileos2-emphasis)">pits</span> and other <span style="color:var(--smileos2-emphasis)">environmental hazards</span>.`,
`Didn't expect me, huh?`,
`<span style="color:#FF0078">Magenta</span> colored attacks can <span style="color:var(--smileos2-emphasis)">not</span> be dashed through and must be <span style="color:var(--smileos2-emphasis)">avoided entirely</span>.`,
`<span style="color:var(--smileos2-emphasis)">Blood Puppets</span> do not grant kills or style points, but their <span style="color:var(--smileos2-emphasis)">blood</span> can still <span style="color:var(--smileos2-emphasis)">heal</span>.`,
`When facing down <span style="color:var(--smileos2-emphasis)">a difficult foe</span>, it may be beneficial to first get rid of the <span style="color:var(--smileos2-emphasis)">fodder</span> to reduce distractions.`,
`Sometimes it may be more beneficial to <span style="color:var(--smileos2-emphasis)">stay at a distance</span> and wait for an opening <span style="color:var(--smileos2-emphasis)">before</span> getting close.`,
`If you're having <span style="color:var(--smileos2-emphasis)">trouble</span> with a specific encounter, take a moment to <span style="color:var(--smileos2-emphasis)">weigh your options</span>. <br> There may be some <span style="color:var(--smileos2-emphasis)">trick</span>, <span style="color:var(--smileos2-emphasis)">tool</span> or <span style="color:var(--smileos2-emphasis)">alternative prioritization</span> that will tip the scales in your favor.`,
`<span style="color:var(--smileos2-emphasis)">ENEMY STEP</span>: Jump while in mid-air <span style="color:var(--smileos2-emphasis)">near an enemy</span> to jump off the enemy. This resets the amount of available walljumps without needing to land.`,
`<span style="color:var(--smileos2-emphasis)">Parries</span> can be used as a powerful healing tool.<br><br>Parrying any enemy projectile or melee attack will <span style="color:red">fully replenish your health</span> up to the hard damage limit.`,
`H a v e &nbsp; f u n .`,
`If blown too far off the arena, <span style="color:lime">PUMP CHARGE</span>'s overcharge is a good way to get back.`,
`<span style="color:var(--smileos2-emphasis)">CHEATS</span> can be enabled in other levels by inputting <span style="color:var(--smileos2-emphasis)">🡡 🡡 🡣 🡣 🡠 🡢 🡠 🡢 B A</span> Enabling cheats will disable ranks`,
`You can pick up the cut weapons on the second floor.`
]
var click = new Audio('/static/content/smileos/SmileOS2Click.ogx');
document.getElementById("smileos-about").addEventListener("click", function() {
click.play();
document.getElementById("smileos-window-title").innerHTML = "About";
document.getElementById("smileos-window-content").innerHTML = `
<span class="red">SmileOS</span>: is the operating system found on most digital interfaces found throughout
<span class="red">Hell</span>. <span class="red">SmileOS 1.0</span> is employed on pannels despite its poor user and developer experience to conserve
blood after the war, while <span class="red">SmileOS 2.0</span> is used for terminals requireing higher blood consumption.
`;
});
document.getElementById("smileos-snake").addEventListener("click", function() {
click.play();
document.getElementById("smileos-window-title").innerHTML = "Snake";
document.getElementById("smileos-window-content").innerHTML = `
<img src="/static/content/smileos/KITR_Build.webp" alt="under construction">
`;
});
document.getElementById("smileos-leaderboard").addEventListener("click", function() {
click.play();
document.getElementById("smileos-window-title").innerHTML = "Leaderboard";
document.getElementById("smileos-window-content").innerHTML = `
<img src="/static/content/smileos/KITR_Build.webp" alt="under construction">
`;
});
document.getElementById("smileos-tip").addEventListener("click", function() {
click.play();
document.getElementById("smileos-window-title").innerHTML = "Tip of the Day";
document.getElementById("smileos-window-content").innerHTML = tips_of_the_day[Math.floor(Math.random() * tips_of_the_day.length)];
});
async function playAudio(url) {
return new Promise((resolve) => {
const audio = new Audio(url);
audio.addEventListener('ended', resolve); // Resolve the promise when audio ends
audio.volume = 0.4;
audio.play();
});
}
document.addEventListener("DOMContentLoaded", async function() {
document.getElementById("smileos-window-title").innerHTML = "Tip of the Day";
document.getElementById("smileos-window-content").innerHTML = tips_of_the_day[Math.floor(Math.random() * tips_of_the_day.length)];
await playAudio('/static/content/smileos/SmileOS2Startup.ogx');
var music = new Audio('/static/content/smileos/Shopmusic.ogx');
music.loop = true;
music.volume = 0.2;
music.play();
});
document.getElementById("smileos-restart-music").addEventListener("click", async function() {
await playAudio('/static/content/smileos/SmileOS2Startup.ogx');
var music = new Audio('/static/content/smileos/Shopmusic.ogx');
music.loop = true;
music.volume = 0.2;
music.play();
});
document.getElementById("secret").addEventListener("click", function() {
click.play();
document.getElementById("smileos-window-title").innerHTML = "Secret :3";
document.getElementById("smileos-window-content").innerHTML = `
Well you found me, here's your <a class="red" href="https://www.youtube.com/watch?v=dQw4w9WgXcQ">Prize</a> :3
`;
});
+78
View File
@@ -0,0 +1,78 @@
//YELLOW TERMINAL
// onionring.js is made up of four files - onionring-widget.js (this one!), onionring-index.js, onionring-variables.js and onionring.css
// it's licensed under the cooperative non-violent license (CNPL) v4+ (https://thufie.lain.haus/NPL.html)
// it was originally made by joey + mord of allium (蒜) house, last updated 2020-11-24
// === ONIONRING-WIDGET ===
//this file contains the code which builds the widget shown on each page in the ring. ctrl+f 'EDIT THIS' if you're looking to change the actual html of the widget
var tag = document.getElementById(ringID); //find the widget on the page
thisSite = window.location.href; //get the url of the site we're currently on
thisIndex = null;
// FIX
thisSite = thisSite.replace("alfieking.dev", "proot.uk"); // fix domain
thisSite = thisSite.replace("http:\/\/127.0.0.1:5000", "https:\/\/proot.uk"); // For debug purposes
// go through the site list to see if this site is on it and find its position
for (i = 0; i < sites.length; i++) {
if (thisSite.startsWith(sites[i])) { //we use startswith so this will match any subdirectory, users can put the widget on multiple pages
thisIndex = i;
break; //when we've found the site, we don't need to search any more, so stop the loop
}
}
function randomUltraRingSite() {
otherSites = sites.slice(); //create a copy of the sites list
otherSites.splice(thisIndex, 1); //remove the current site so we don't just land on it again
randomIndex = Math.floor(Math.random() * otherSites.length);
location.href = otherSites[randomIndex];
}
//if we didn't find the site in the list, the widget displays a warning instead
if (thisIndex == null) {
tag.insertAdjacentHTML('afterbegin', `
<table>
<tr>
<td>This site isn't part of <a href="https://jack-dawlia.neocities.org/page/shrines/ultrakill/ULTRARING" target='_parent'>${ringName}</a> yet!</td>
</tr>
</table>
`);
}
else {
//find the 'next' and 'previous' sites in the ring. this code looks complex
//because it's using a shorthand version of an if-else statement to make sure
//the first and last sites in the ring join together correctly
previousIndex = (thisIndex-1 < 0) ? sites.length-1 : thisIndex-1;
nextIndex = (thisIndex+1 >= sites.length) ? 0 : thisIndex+1;
indexText = ""
//if you've chosen to include an index, this builds the link to that
if (useIndex) {
indexText = `<a href='${indexPage}' class="textshadow" target='_parent'>[INDEX]</a> | `;
}
randomText = ""
//if you've chosen to include a random button, this builds the link that does that
if (useRandom) {
randomText = `<a href='javascript:void(0)' onclick='randomUltraRingSite()' style="color: red;" class="textshadow" target='_parent'>[RANDOM]</a>`;
}
//this is the code that displays the widget - EDIT THIS if you want to change the structure
tag.insertAdjacentHTML('afterbegin', `
<table>
<tr>
<td class='webring-prev'><a href='${sites[previousIndex]}' style="color: red;" class="textshadow" title="[PREV]" target='_parent'><<</a></td>
<td class='webring-info'><a href="https://jack-dawlia.neocities.org/page/shrines/ultrakill/ULTRARING" style="color: red;" target='_parent'><img src="https://jack-dawlia.neocities.org/image/ultraring-yellow-terminal.png" alt="This site is part of ULTRARING" title="ULTRARING" style="max-width:100%"></a></br>
<span class='webring-links'>
${randomText}
${indexText}
<td class='webring-next'><a href='${sites[nextIndex]}' style="color: red;" title="[NEXT]" target='_parent'>>></a></td>
</tr>
</table>
`);
}
+137
View File
@@ -0,0 +1,137 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block title %}Toasters's basement{% endblock %}</title>
<link rel="icon" href="toaster/Toaster_v1.0_sticker.png">
<link rel="stylesheet" href="/static/css/bases/base.css">
<meta name="description" content="{% block description %}server backend survivor{% endblock %}">
<meta name="keywords" content="{% block keywords %}Alfie King, Alfie, King, Alfieking, Alfieking.dev, dev, server, developer, backend, selfhost, homelab, Toaster, Toastergen, proot.uk, protogen, furry, fursona{% endblock %}">
<meta name="author" content="Alfie King">
<meta name="robots" content="all">
<meta name="theme-color" content="#63de90" data-react-helmet="true">
<meta property="og:site_name" content="proot.uk">
<meta property="og:url" content="https://proot.uk/">
<meta property="og:title" content="{{ self.title() }}">
<meta property="og:description" content="{{ self.description() }}">
<meta property="og:image" content="toaster/Toaster_v1.0_sticker.png">
{% block head %}
{% endblock %}
</head>
<body>
<div id="furry"></div>
<div id="sidebar">
<nav>
<section>
<h1>Things to see :3</h1>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/toaster">Toaster</a></li>
<li><a href="/terminal" class="ultrafont">Terminal</a></li>
<li><a href="/events">Events</a></li>
<li><a href="https://git.alfieking.dev/acetheking987">Gitea</a></li>
<li><a href="https://listenbrainz.org/user/acetheking987/">Music</a></li>
<li><a href="https://prismic.alfieking.dev">Prismic</a></li>
<li><a href="https://open.spotify.com/user/xz02oolstlvwxqu1pfcua9exz?si=14396e637f284e03">Spotify</a></li>
<li><a href="https://steamcommunity.com/id/acetheking987/">Steam</a></li>
<li><a href="https://www.youtube.com/@acetheking987">YouTube</a></li>
<li><a href="https://acetheking987.tumblr.com/">Tumblr</a></li>
<li><a href="https://www.reddit.com/user/acetheking987">Reddit</a></li>
</ul>
</section>
</nav>
<section>
<h6 class="irken">heya, try typing "owo", "doom" or "<span class="scratch">kfc</span>" into this page!</h6>
</section>
<section id="buttons">
<h1>BUTTONS</h1>
<ul>
<li><a herf="https://hijpixel.nekoweb.org/"><img src="/static/content/buttons/hijpixel.gif" alt="hijpixel"></a></li>
<li><a href="https://lensdeer.neocities.org/"><img src="/static/content/buttons/lensdeer.gif" alt="lensdeer"></a></li>
<li><a href="https://emmixis.net/"><img src="/static/content/buttons/emmixis.gif" alt="emmixis"></a></li>
<li><a href="https://dimden.dev/"><img src="https://dimden.dev/services/images/88x31.gif" alt="dimden"></a></li><!-- hotlink on purpose -->
<li><a href="https://ne0nbandit.neocities.org/"><img src="/static/content/buttons/ne0nbandit.png" alt="ne0nbandit"></a></li>
<li><a href="https://thinliquid.dev"><img src="/static/content/buttons/thnlqd.png" alt="thinliquid"></a></li>
<li><a href="https://nekoweb.org/"><img src="/static/content/buttons/nekoweb.gif" alt="nekoweb"></a><!-- button by s1nez.nekoweb.org --></li>
<li><a href="https://s1nez.nekoweb.org/"><img src="/static/content/buttons/s1nez.gif" alt="s1nez"></a></li>
<li><a href="https://beeps.website"><img src="/static/content/buttons/beeps.gif" alt="beeps"></a></li>
<li><a href="https://itsnotstupid.com"><img src="/static/content/buttons/insia.gif" alt="itsnotstupid"></a></li>
<li><a href='https://blinkies.cafe'><img src='/static/content/buttons/blinkiescafe.gif' alt='blinkies.cafe | make your own blinkies!'></a></li>
<li><a href="https://eightyeightthirty.one"><img src="/static/content/buttons/8831.png" alt="88x31"></a></li>
<li><a href="https://neocities.org"><img src="/static/content/buttons/neocities.gif" alt="neocities"></a></li>
<li><a href="https://tuxedodragon.art"><img src="/static/content/buttons/tuxedodragon.gif" alt="tuxedodragon"></a></li>
<li><a href="https://beepi.ng"><img src="https://beepi.ng/88x31.png" width="88" height="31" alt="unnick"></a></li>
<li><a href="https://sneexy.synth.download"><img src="https://synth.download/assets/buttons/sneexy.svg" alt="Sneexy"></a></li>
<li><a href="https://kraafter.me/"><img src="https://kraafter.me/assets/img/button.png" alt="Kraafter.me button" title="kraaftersite"></a></li>
</ul>
</section>
<section>
<div id='furnix'>
<script type="text/javascript" src="https://tapeykatt.neocities.org/furnix/onionring-variables.js"></script>
<script type="text/javascript" src="/static/js/furnix_widget.js"></script>
</div>
</section>
<section class="webring">
<a href="https://stellophiliac.github.io/roboring">Roboring</a><br>
<a href="https://stellophiliac.github.io/roboring/Toaster/previous"><--</a>
<a href="https://stellophiliac.github.io/roboring/Toaster/next">--></a>
</section>
<section>
<div id='ultraring'>
<script type="text/javascript" src="https://jack-dawlia.neocities.org/page/shrines/ultrakill/ULTRARING/onionring-variables.js"></script>
<script type="text/javascript" src="/static/js/ultraring_widget.js"></script>
<noscript>
This site is part of <a href="https://jack-dawlia.neocities.org/page/shrines/ultrakill/ULTRARING">ULTRARING</a>!
</noscript>
</div>
</section>
<section class="webring">
<a href="https://keithhacks.cyou/furryring.php">Furryring</a><br>
<a href="https://keithhacks.cyou/furryring.php?prev=proot.uk"><--</a>
<a href="https://keithhacks.cyou/furryring.php?next=proot.uk">--></a>
</section>
<iframe width="150" height="450" style="border:none" src="https://dogspit.nekoweb.org/sidelink.html" name="sidelink"></iframe>
<section>
<pre class="vsmoltext"> |\ _,,,---,,_<br>ZZZzz /,`.-'`' -. ;-;;,_<br> |,4- ) )-,_. ,\ ( `'-'<br> '---''(_/--' `-'\_)</pre>
</section>
<img src="/static/content/general_images/haj.gif" alt="haj" class="haj">
</div>
<main id="main">
<header id="home">
<div class="row">
<img src="/static/content/toaster/Toaster_v1.0_sticker.png">
<div>
<h1>Toaster</h1>
<h2 id="typing">server backend survivor</h2>
</div>
</div>
<a href="/toaster" id="toaster-wave">
<img src="/static/content/toaster/Toaster_v1.1.png" alt="toaster">
</a>
</header>
<nav id="alt-nav">
<ul>
<li><a href="/">Home</a></li>
<li><a href="/toaster">Toaster</a></li>
<li><a href="https://git.alfieking.dev/acetheking987">Gitea</a></li>
<li><a href="https://www.last.fm/user/acetheking987">LastFm</a></li>
<li><a href="https://prismic.alfieking.dev">Prismic</a></li>
<li><a href="https://open.spotify.com/user/xz02oolstlvwxqu1pfcua9exz?si=14396e637f284e03">Spotify</a></li>
<li><a href="https://steamcommunity.com/id/acetheking987/">Steam</a></li>
<li><a href="https://www.youtube.com/@acetheking987">YouTube</a></li>
<li><a href="https://acetheking987.tumblr.com/">Tumblr</a></li>
<li><a href="https://www.reddit.com/user/acetheking987">Reddit</a></li>
</ul>
</nav>
{% block content %}{% endblock %}
<section>
<footer>
<p>legal stuff idk :3 | icba to &copy; this :P | made with &hearts; and caffine</p>
</footer>
</section>
</main>
{% block scripts %}{% endblock %}
<script src="/static/js/base.js"></script>
</body>
</html>
+22
View File
@@ -0,0 +1,22 @@
{% extends "bases/base.html" %}
{% block title %}/{{ directory }} - Toaster's basement{% endblock %}
{% block description %}server backend survivor{% endblock %}
{% block head %}
<link rel="stylesheet" href="/static/css/bases/directory.css">
{% endblock %}
{% block scripts %}
{% endblock %}
{% block content %}
<section id="directory">
<h1>/{{ directory }}</h1>
<ul>
{% for page in pages %}
<li><a href="/{{ directory }}{{ page.split('.')[0] }}">{{ page.split('.')[0] }}</a></li>
{% endfor %}
</ul>
</section>
{% endblock %}
+11
View File
@@ -0,0 +1,11 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block title %}Gallery - Toasters's basement{% endblock %}</title>
</head>
<body>
</body>
</html>
+10
View File
@@ -0,0 +1,10 @@
{% extends "bases/base.html" %}
{% block title %}{{ title }} - Toaster's basement{% endblock %}
{% block description %}server backend survivor{% endblock %}
{% block content %}
<section>
{{ markdown|safe }}
</section>
{% endblock %}
+29
View File
@@ -0,0 +1,29 @@
{% extends "bases/base.html" %}
{% block title %}400 - Internal Server Error{% endblock %}
{% block description %}Bad request. The server could not understand the request due to invalid syntax.{% endblock %}
{% block head %}
<link rel="stylesheet" href="/static/css/errors/400.css">
{% endblock %}
{% block content %}
<section>
<h1>400 - Bad Request</h1>
<p>
What did you do? The server could not understand the request due to invalid syntax. Please check your request and try again.
</p>
<h2>The fuckup in question</h2>
<p>
{% if error %}
{{ error }}
{% else %}
No specific error message provided.
{% endif %}
</p>
<h2>What to do now</h2>
<p>
idk :P
</p>
</section>
{% endblock %}
+19
View File
@@ -0,0 +1,19 @@
{% extends "bases/base.html" %}
{% block title %}404 - Not Found{% endblock %}
{% block description %}The page you are looking for does not exist.{% endblock %}
{% block content %}
<section>
<h1>404</h1>
<p>
It seems like the thing you are looking for does not exist or <code>rm -rf</code> itself out of exsistance.
</p>
</section>
<section>
<h2>Actual error</h2>
<p>
{{ error }}
</p>
</section>
{% endblock %}
+23
View File
@@ -0,0 +1,23 @@
{% extends "bases/base.html" %}
{% block title %}500 - Internal Server Error{% endblock %}
{% block description %}An unexpected error occurred on the server.{% endblock %}
{% block head %}
<link rel="stylesheet" href="/static/css/errors/500.css">
{% endblock %}
{% block content %}
<section class="bluescreen">
<h1>:(</h1>
<p>
Oopsie Woopsie! Uwu We made a fucky wucky!! A wittle fucko boingo! The code monkeys at our headquarters are working VEWY HAWD to fix this!
</p>
</section>
<section>
<h2>Actual error</h2>
<p>
{{ error }}
</p>
</section>
{% endblock %}
+16
View File
@@ -0,0 +1,16 @@
{% extends "bases/base.html" %}
{% block title %}{{ code }} - {{ err_name }}{% endblock %}
{% block description %}The page you are looking for does not exist.{% endblock %}
{% block content %}
<section>
<img src="https://http.cat/images/{{ code }}.jpg" alt="">
</section>
<section>
<h2>Actual error</h2>
<p>
{{ description }}
</p>
</section>
{% endblock %}
+167
View File
@@ -0,0 +1,167 @@
{% extends "bases/base.html" %}
{% block title %}Home - Toaster's basement{% endblock %}
{% block description %}server backend survivor{% endblock %}
{% block head %}
<link rel="stylesheet" href="/static/css/index.css">
{% endblock %}
{% block content %}
<section>
<h1>A lil bit abt me</h1>
<p>
<span style="color: yellow; font-size: 0.8rem;">This is a "bit" out of date, will update soon ^^</span><br>
Im not good with writing so dont expect much here. I was a student learning c++ and python. I've Done a few projects that i think
are decent enough to show off, so I have put them on this website. I like to mess around with linux and have a few servers that I run. I've
been running a server for a few years now, and I have learned a lot from it. I have also switched to linux on my main computer, which has been
slightly annoying at times (mainly because one of my most played games' anticheat doesn't support on linux atm. Also, the lack of photoshop is
a pain).
<br><br>
I would like to make some more projects in the future, but I am not sure what I want to make yet. I tend to make thing on impulse a lot, and motivation
is "lacking" at times. So the few ideas I do have may never come to fruition. I hope to get better at art so i could hopefully make a game that is somewhat
interesting. But im at a lack of ideas at the moment.
<br><br>
I would also like to have a functional blog on this site, but I bearly talk about much so I dont know what I would write about. I like to ramble on about
random things, but I dont think that would be very interesting to read, and I think that I would forget to update it. I have a tumblr that I have had for a few
years now, but I dont post on it (the social anxiety is too much for me :<). However I hope to get better at that in the future.
</p>
</section>
<section class="blinkies">
<img src="https://adriansblinkiecollection.neocities.org/x45.gif" alt="">
<img src="https://adriansblinkiecollection.neocities.org/t3.gif" alt="">
<img src="https://adriansblinkiecollection.neocities.org/k25.gif" alt="">
<img src="https://s1nez.nekoweb.org/img/52475686_BP77MK3UdnLmIQk.gif" alt="">
<img src="https://s1nez.nekoweb.org/img/hc/hc%20(79).gif" alt="">
<img src="https://dewside.neocities.org/blinkies/bisigns.gif" alt="">
<img src="https://s1nez.nekoweb.org/g/ggg/gg%20(32).gif" alt="">
<img src="https://s1nez.nekoweb.org/img/7dcd20d4.gif" alt="">
</section>
<div class="flex-row">
<a href="https://listenbrainz.org/user/acetheking987/" id="listenbrainz-link">
<div id="listenbrainz">
<h1 id="listenbrainz-title">Loading...</h1>
<h2 id="listenbrainz-artist">be patient, listenbrainz is slow :P</h2>
<h3 id="listenbrainz-live">Not Live :<</h3>
</div>
</a>
<section class="stamps">
<img src="https://s1nez.nekoweb.org/img/other/ba4ba47a.png" alt="">
<img src="https://s1nez.nekoweb.org/img/fa02abd7.png" alt="">
<img src="https://s1nez.nekoweb.org/img/hc/hc%20(172).gif" alt="">
<img src="https://gligar.neocities.org/furret2.png" alt="">
<img src="https://gligar.neocities.org/ralsei2.png" alt="">
<img src="https://gligar.neocities.org/tism.png" alt="">
<img src="https://64.media.tumblr.com/11957593416710af9ff049ff6ae7ab63/tumblr_pbb7cd42Ln1xz2nuuo4_100.gif" alt="">
<img src="https://dewside.neocities.org/stamps/dogofwisdom.gif" alt="">
<img src="https://dewside.neocities.org/stamps/kazookid.gif" alt="">
<img src="https://64.media.tumblr.com/3085aeace24ca0c5ddf08aac37cc3ab4/45a30eb92e06a85c-3a/s100x200/b7bfb2e91adbc310f712f4492e668298bd0779de.gif" alt="">
<img src="https://s1nez.nekoweb.org/img/hc/hc%20(27).png" alt="">
<img src="https://s1nez.nekoweb.org/g/ggg/gg%20(13).gif" alt="">
<img src="https://kopawz.neocities.org/stamphoard/stamps2/kriswhere.png" alt="">
<img src="https://adriansblinkiecollection.neocities.org/stamps/g5.gif" alt="">
<img src="https://adriansblinkiecollection.neocities.org/stamps/e40.gif" alt="">
<img src="https://adriansblinkiecollection.neocities.org/stamps/e43.gif" alt="">
</section>
</div>
<section class="smileos">
<span style="margin: auto;">
Try going to the <span style="color: var(--smileos2-emphasis);">Terminal</span> for more information
</span>
</section>
<section>
<h1>Projects & stuff</h1>
<p>just some projects ive worked on over time</p>
<ul>
<li>
<h2>alfieking.dev/proot.uk</h2>
<p>
This website is a project that I have been working on for a while now. I have made a few versions of it, but I have
never been happy with them. I am quite happy with this version atm since it is more organized and has a design that I
like.
<a href="https://git.alfieking.dev/acetheking987/alfieking.dev">source code</a>
</p>
</li>
<li>
<h2>owo (the terminal command)</h2>
<p>
I made this project as a joke, I can't remember exactly what I baised it off other than the fact that it was somthing
similar to this but in a different language. I originally made it in python, but I have since rewritten it in c++ so
that it would be faster and so that I could learn c++.
<a href="https://git.alfieking.dev/acetheking987/term-owo-cpp">source code</a>
</p>
</li>
<li>
<h2>prismic</h2>
<p>
Prismic is a basic message board that I made, it was mainly made to learn how to use templating and more backend
web development. it uses flask for the web framework and uses a sqlite database to store the messages. I have thought
about remaking it in c++ since I found a c++ web framework that I would like to try out.
<a href="https://prismic.alfieking.dev">Primic</a> | <a href="https://git.alfieking.dev/acetheking987/prismic">source code</a>
</p>
</li>
</ul>
</section>
<section>
<h1>The button collection™</h1>
<div id="button-collection">
</div>
</section>
<section>
<h1>Some News</h1>
<h6>(dont expect this to be updated often tho :P)</h6>
<ul>
<li>
<h2>28-03-2026</h2>
<span style="color: gray; font-size: 0.8rem;">[insert a few hours later meme here]</span><br>
Ok so it has been a "while", I recently got the domain proot.uk, so if you are accessing this site from there then all of the content relating to my name and
the tv head guy is replaced with toaster. I was too indicisive on what to do with the domain since I wanted to keep the old one but the new domain is now the
"main site". <span style="color: gray; font-size: 0.8rem;">As I was typing this I realised that it would prob be better to just redirect the old domain to
the new one and remove the complicated name system, so I will do that. And yes im leaving this in, cus I find it funny.</span>
</li>
<li>
<h2>05-03-2026</h2>
<p>
This is a short post since i plan on reworking these in the next few days, but i had mad a lot of changes to the site. Some are visible and some are not;
the bigget change in the new terminal page that needs more features but that is a later me issue. I also redid the backend so making updates are much
easier now. I also need to update the main about me and projects sections since they are old and not very good. """hopefully""" i should make a new news post
soon when i have reworked the system.
</p>
</li>
<li>
<h2>18-01-2026</h2>
<p>
:O an update! thats unheard of on this site (aleast its more often than tf2 gets updates). finding motivation to work on things has been painful
recently, but im wokring on my mental state a bit so hopefully there will be more updates. I am writing this before i make any major changes but
i hope to add a blog or something, or maybe a daily thoughts thing that pings my phone to get me to write something. I also need to rewrite most
of the home page as well since its kinda out of date :P
</p>
</li>
<li>
<h2>28-06-2025</h2>
<p>
I have updated the site a bit, I have added a few more featues, but the main update is that the site is now using flask as a backend.
I didn't want to use a framework at first, mainly because I like the simplicity of a static site, but it allows me to use templatiing and makes
adding new features easier and more organized. The site is also more interacive now, with a few secrets on some of the pages. I still plan on adding
more secrets and features. I also plan on adding a blog section, that I will move this to, so that I can give updates on the site and other things
that I find interesting.
</p>
</li>
<li>
<h2>18-06-2025</h2>
<p>
I plan on updating the site soon, I have a few ideas that I want to implement. I want to make it more
interactive and fun to use. I also want to add a blog section so that I can write about random things that I find interesting. I also
want to add a few more projects that I have been working on. Annoyingly I think it would be a good idea to remake this site with some sort of
framework so i can use templating, however this kinda bothers me since I like the simplicity of this site. And prefer to keep it as a static site
that i can just throw at nginx.
</p>
</li>
</ul>
</section>
<iframe src="https://john.citrons.xyz/embed?ref=alfieking.dev" style="margin-left:auto;display:block;margin-right:auto;max-width:732px;width:100%;height:94px;border:none;"></iframe>
{% endblock %}
{% block scripts %}
<script src="/static/js/index.js"></script>
{% endblock %}
+55
View File
@@ -0,0 +1,55 @@
{% extends "bases/base.html" %}
{% block title %}Critters MK - Toaster's basement{% endblock %}
{% block description %}furry corner{% endblock %}
{% block og_image %}/static/content/Toaster_v1.0_Dark.png{% endblock %}
{% block keywords %}
Alfie King, Alfie, King, Alfieking, Alfieking.dev, dev, server, developer, backend, selfhost, homelab, furry, protogen, toaster,
fursona, fur, furmeet, fursuit, persona, character, protogen fursona, protogen character, protogen fursona design,
protogen character design, critters mk, critters cmk, paws n pistons, paws'n'pistons, paws n pistons furry meet, paws'n'pistons furry meet,
protogen v1.0, toaster v1.0
{% endblock %}
{% block head %}
<link rel="stylesheet" href="/static/css/gallery.css">
{% endblock %}
{% block content %}
<section>
<h1>Critters MK</h1>
<p>
Critters Mk is a fur meet based in Milton Keynes, UK. They hold a meet once a month on saturdays around the area, usually at local parks. They are a
therian friendly group, and there are a variety of fursuiters and non-fursuiters that attend. The group is very welcoming to newcomers, and the meets
are a great way to meet new people in the furry community. There is also atleast one fursuit maker in the group to my knowledge, so if you are looking
for a fursuit, you may be able to find one there. The group is also very active on Telegram, and they have a Twitter page where they post updates about
the meets.
<br><br>
I have attended a few of the meets, and I enjoyed talking to the people there. I plan on attending every meet I can in the future, as well as any other local events
that I can find. If you are in the area, I highly recommend checking them out. You can find more information about the group on their
<a href="https://x.com/cmkfurmeet" target="_blank">Twitter page</a> (I don't know if I can link their Telegram group :<)
</p>
</section>
<section>
<h1>Photos :3</h1>
<p>
Here are some photos from the meets I have attended. I will add more as I attend more meets.
</p>
<div class="gallery">
<h2 class="gallery-date">26th July 2025</h2>
<div class="gallery-images">
<img src="/static/content/photos/fur_meets/26-07-2025_critters_mk/PXL_20250726_152110445.jpg" alt="Critters MK">
<img src="/static/content/photos/fur_meets/26-07-2025_critters_mk/PXL_20250726_155134418.jpg" alt="Critters MK">
<img src="/static/content/photos/fur_meets/26-07-2025_critters_mk/PXL_20250726_155226274.jpg" alt="Critters MK">
<img src="/static/content/photos/fur_meets/26-07-2025_critters_mk/PXL_20250726_155434701.jpg" alt="Critters MK">
</div>
</div>
<div class="gallery">
<h2 class="gallery-date">23rd Aug 2025</h2>
<div class="gallery-images">
<img src="/static/content/photos/fur_meets/23-08-2025_critters_mk/PXL_20250823_130640362.jpg" alt="Critters MK">
<img src="/static/content/photos/fur_meets/23-08-2025_critters_mk/PXL_20250823_130648109.jpg" alt="Critters MK">
<img src="/static/content/photos/fur_meets/23-08-2025_critters_mk/PXL_20250823_130659800.jpg" alt="Critters MK">
</div>
</div>
</section>
{% endblock %}
@@ -0,0 +1,66 @@
{% extends "bases/base.html" %}
{% block title %}Paws'N'Pistons - Toaster's basement{% endblock %}
{% block description %}furry corner{% endblock %}
{% block og_image %}/static/content/Toaster_v1.0_Dark.png{% endblock %}
{% block keywords %}
Alfie King, Alfie, King, Alfieking, Alfieking.dev, dev, server, developer, backend, selfhost, homelab, furry, protogen, toaster,
fursona, fur, furmeet, fursuit, persona, character, protogen fursona, protogen character, protogen fursona design,
protogen character design, critters mk, critters cmk, paws n pistons, paws'n'pistons, paws n pistons furry meet, paws'n'pistons furry meet,
protogen v1.0, toaster v1.0
{% endblock %}
{% block head %}
<link rel="stylesheet" href="/static/css/gallery.css">
<style>
#woooooo {
max-width: 50%;
height: auto;
border-radius: 10px;
margin: 10px;
}
@media (max-width: 600px) {
#woooooo {
max-width: 100%;
}
}
</style>
{% endblock %}
{% block content %}
<section>
<h1>Paws'N'Pistons</h1>
<p>
Paws'N'Pistons is a furry car meet that takes place across the UK. They are a very welcoming group that is open to all furries, regardless
of whether you have a car or not. Their meets last all day and involve multiple hours of driving across the country to various locations. They
also have a <a href="https://pawsnpistons.com" target="_blank">shop</a> where you can buy car stickers and other merch. They also hand out free
stickers at their meets. Their main social media is their <a href="https://www.instagram.com/paws_n_pistons/" target="_blank">Instagram</a>, where
they post photos from their meets and updates about upcoming events.
<br><br>
I've only attended one meet on the 3rd of August 2025, and it was a great experience. The people were very chill and I enjoyed driving around with them.
ALSO, one of them offered to let me try their fursuit!!! Im now going to speedrun going broke trying to get a fursuit of my own cus of this :3 (I was
already planning on getting one, but this just made me want one more).
<br>
<img src="/static/content/photos/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_200906329.jpg" alt="me in a fursuit" id="woooooo">
<br>
The fursuit belongs to <a href="https://www.tiktok.com/@trickythefox" target="_blank">Tricky the Fox</a>, they are a very chill person and I had a great time talking to them ^w^.
<h1>Photos :3</h1>
<p>
Here are some photos from the meets I have attended. I will add more as I attend more meets.
</p>
<div class="gallery">
<h2 class="gallery-date">3rd Aug 2025</h2>
<div class="gallery-images">
<img src="/static/content/photos/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_141943558.jpg" alt="Paws'N'Pistons">
<img src="/static/content/photos/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_150138054.jpg" alt="Paws'N'Pistons">
<img src="/static/content/photos/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_150249916.jpg" alt="Paws'N'Pistons">
<img src="/static/content/photos/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_183614897.jpg" alt="Paws'N'Pistons">
<img src="/static/content/photos/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_140629639.jpg" alt="Paws'N'Pistons">
<img src="/static/content/photos/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_141242090.jpg" alt="Paws'N'Pistons">
<img src="/static/content/photos/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_182023562.jpg" alt="Paws'N'Pistons">
<img src="/static/content/photos/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_184321576.jpg" alt="Paws'N'Pistons">
</div>
</div>
</section>
{% endblock %}
+21
View File
@@ -0,0 +1,21 @@
{% extends "bases/base.html" %}
{% block content %}
<section>
<h1>Test</h1>
<img src="static/content/photos/fur_meets/26-07-2025_critters_mk/PXL_20250726_155226274.jpg" alt="toaster" id="img1">
<p id="makeAndModel"></p>
<script src="https://cdn.jsdelivr.net/npm/exif-js"></script>
<script>
window.onload=getExif;
function getExif() {
var img1 = document.getElementById("img1");
EXIF.getData(img1, function() {
var make = EXIF.pretty(this);
makeAndModel.innerHTML = `${make}`;
});
}
</script>
</section>
{% endblock %}
+63
View File
@@ -0,0 +1,63 @@
{% extends "bases/base.html" %}
{% block title %}SmileOS 2.0{% endblock %}
{% block description %}SmileOS 2.0{% endblock %}
{% block og_image %}static/content/smileos/SmileOS_2_icon_smile.webp{% endblock %}
{% block icon %}static/content/smileos/SmileOS_2_icon_smile.webp{% endblock %}
{% block head %}
<link rel="stylesheet" href="/static/css/terminal.css">
{% endblock %}
{% block content %}
<section id="terminal">
<div class="smileos-header">
<img src="/static/content/smileos/SmileOS_2_icon_smile.webp" alt="smile" id="secret">
SmileOS 2.0
<img src="/static/content/smileos/SmileOS_2_top_button_5.png" alt="minimize" style="margin-left: auto;">
<img src="/static/content/smileos/SmileOS_2_top_button_4.png" alt="maximize">
<img src="/static/content/smileos/SmileOS_2_top_button_3.png" alt="close">
</div>
<div id="terminal-container">
<img src="/static/content/smileos/SmileOS2.webp" alt="logo" id="smileos-logo">
<div id="terminal-buttons">
<button class="terminal-button" id="smileos-tip">
Tip of the Day
</button>
<button class="terminal-button" id="smileos-snake">
Snake
</button>
<button class="terminal-button" id="smileos-leaderboard">
Leaderboard
</button>
<button class="terminal-button" id="smileos-about">
About
</button>
</div>
<div id="terminal-window">
<div class="smileos-header">
<img src="/static/content/smileos/SmileOS_2_icon_tip.webp" alt="tip">
<span id="smileos-window-title">Tip of the Day</span>
<img src="/static/content/smileos/SmileOS_2_top_button_5.png" alt="minimize" style="margin-left: auto;">
<img src="/static/content/smileos/SmileOS_2_top_button_4.png" alt="maximize">
<img src="/static/content/smileos/SmileOS_2_top_button_3.png" alt="close">
</div>
<div id="window-container">
<div id="window-content">
<span id="smileos-window-content"><span class="red">SLAM BOUNCING</span>: Jump immediately after landing from a <span class="red">ground slam</span> to jump higher. The longer the ground slam fall, the higher the bounce.</span>
</div>
</div>
</div>
</div>
</section>
<section>
<p>
Note: this page has background music, you may have to allow the music in the browser and refesh to let it play, or you can try
press <a id="smileos-restart-music">this</a> to restart it
</p>
</section>
{% endblock %}
{% block scripts %}
<script src="/static/js/smileos.js"></script>
{% endblock %}
+107
View File
@@ -0,0 +1,107 @@
{% extends "bases/base.html" %}
{% block title %}Toaster - Toaster's basement{% endblock %}
{% block description %}furry corner{% endblock %}
{% block og_image %}/static/content/Toaster_v1.0_Dark.png{% endblock %}
{% block keywords %}
Alfie King, Alfie, King, Alfieking, Alfieking.dev, dev, server, developer, backend, selfhost, homelab, furry, protogen, toaster,
fursona, fur, furmeet, fursuit, persona, character, protogen fursona, protogen character, protogen fursona design,
protogen character design, critters mk, critters cmk, paws n pistons, paws'n'pistons, paws n pistons furry meet, paws'n'pistons furry meet,
protogen v1.0, toaster v1.0
{% endblock %}
{% block head %}
<link rel="stylesheet" href="/static/css/toaster.css">
{% endblock %}
{% block content %}
<section>
<h1>Toaster</h1>
<p>
heya, you may have guessed by now that I am a furry. Specifically my fursona is a protogen called Toaster. I didn't actually choose the name,
I just couldn't think of a name and a few people just started calling me Toaster because I am a protogen.
<br><br>
Originally (before I was a furry), I had a unnamed charcater that was just saved as "lil_guy.png" in my files. He is the tv head character
that I the main "mascot" of my website, I drew him a while ago when I was planning to make a functional tv head.
<br><br>
Once I eventually got out of the furry closet, I was trying to think of a species to choose and I thought that protogens are a mix of having a
screen for a face and being fluffy, so I thought it would be a good fit. I still want to keep the tv head character in some places since I rly like him,
however I plan on using Toaster more. So he may become the main mascot of my website "soon ish".
</p>
</section>
<div class="flex-row">
<section>
<h1>Specs</h1>
<h6>(Additional specs coming "soon ish", Very subject to change :P)</h6>
<ul id="toaster-specs">
<li><b>Species:</b><span>Protogen</span></li>
<li><b>Version:</b><span>v1.0</span></li>
<li><b>Height:</b><span>1.73m</span></li>
<li><b>Weight:</b><span>Mild Chonk</span></li>
<li><b>Base Color:</b><span class="color" style="background-color: #0e0c11">#0e0c11</span></li>
<li><b>Accent Color:</b><span class="color" style="background-color: #a685c6">#a685c6</span></li>
<li><b>Operating System:</b><span>Proot OS&trade;</span></li>
<li><b>Processor:</b><span>Fried Potato</span></li>
<li><b>RAM:</b><span>Not Enough</span></li>
<li><b>Storage:</b><span>1.44MB Floppy</span></li>
<li><b>Ports:</b><span>USB-C</span></li> <!-- You know exactly where this is dont you :3 (note: this is a joke (probably), there are ports are behind the round screens tho)-->
<li><b>Accessories:</b><span>"Neck Armor"</span></li>
<li><b>Bugs:</b><span>Anxiety<sup>2</sup></span></li>
<li><b>Gender:</b><span>Male</span></li>
</ul>
</section>
<div class="flex-col">
<img src="/static/content/toaster/Toaster_v1.0_Dark.png" alt="toaster" id="toaster-img">
<section class="fill-height smileos">
<p>
<span style="color: var(--smileos2-emphasis);">NEW AND IMPROVED!</span> Toaster v1.0 is here!
<br><br>
Toaster v1.0 is the first version of Toaster that I have drawn that I am actually happy with.
Im still working on the design, so it may change in the future, but I think I like this enough to keep it for now.
</p>
</section>
</div>
</div>
<section>
<h1>Plans</h1>
<p>
I plan on drawing Toaster "properly" soon, im quite happy with the current design, but I want to add more detail and personality to him.
I also want to make a proper ref sheet for him, so it looks like I have a decent idea of what im doing, cus im kinda winging it right now.
<br><br>
I also wanna try make a fursuit head of Toaster, but I am not sure how well that will go. I can handle the electronics and I know a few people
with 3d printers, so I can get the base printed. However I have never made a fursuit before, so idk how well it will go, expecially with the fur.
I have no clue how to make the fur look good, so I may just end up getting someone else to help me with that. Budget is also a concern, cus im
clinically broke. So rn im working of whatever I can buy from shady chinese websites for electronics and whatever I can find in my local area for the fur.
<br><br>
If I end up making a fursuit, I will probably make a post about it on my site and maybe even make a video of it (but dont hold me to that).
</p>
</section>
<section>
<h1>Events</h1>
<p>
There are a few events that ive been to, however I plan on trying to go to more in the future.
<br>
</p>
<ul id="fur-meets">
<li>
<a href="/events/crittersmk"><b>Critters MK</b></a> - A furmeet in Milton Keynes.
<div class="fur-meet-gallery-small">
<img src="/static/content/photos/fur_meets/26-07-2025_critters_mk/PXL_20250726_152110445.jpg" alt="Critters MK">
<img src="/static/content/photos/fur_meets/26-07-2025_critters_mk/PXL_20250726_155134418.jpg" alt="Critters MK">
<img src="/static/content/photos/fur_meets/26-07-2025_critters_mk/PXL_20250726_155226274.jpg" alt="Critters MK">
<img src="/static/content/photos/fur_meets/26-07-2025_critters_mk/PXL_20250726_155434701.jpg" alt="Critters MK">
</div>
</li>
<li>
<a href="/events/paws-n-pistons"><b>Paws'N'Pistons</b></a> - A furry car meet around the UK.
<div class="fur-meet-gallery-small">
<img src="/static/content/photos/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_141943558.jpg" alt="Paws'N'Pistons">
<img src="/static/content/photos/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_150138054.jpg" alt="Paws'N'Pistons">
<img src="/static/content/photos/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_150249916.jpg" alt="Paws'N'Pistons">
<img src="/static/content/photos/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_183614897.jpg" alt="Paws'N'Pistons">
</div>
</li>
<p>Click on the links to view more photos from each event :3</p>
</ul>
</section>
{% endblock %}