more updates
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				Build and push container image / build-and-push-image (push) Successful in 2m59s
				
			
		
		
	
	
				
					
				
			@@ -1,5 +1,5 @@
 | 
			
		||||
# Imports
 | 
			
		||||
from flask import Blueprint, render_template, request, abort, send_from_directory
 | 
			
		||||
from flask import Blueprint, render_template, request, abort, send_from_directory, send_file
 | 
			
		||||
from os import getenv as env
 | 
			
		||||
import logging
 | 
			
		||||
 | 
			
		||||
@@ -23,22 +23,31 @@ def index():
 | 
			
		||||
    return render_template('index.html')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Route for robots.txt, sitemap.xml, and favicon.ico
 | 
			
		||||
@bp.route('/robots.txt')
 | 
			
		||||
@bp.route('/sitemap.xml')
 | 
			
		||||
# Route for favicon
 | 
			
		||||
@bp.route('/favicon.ico')
 | 
			
		||||
def web_stuffs():
 | 
			
		||||
    return send_from_directory(
 | 
			
		||||
        env('STATIC_FOLDER', default='../static'),
 | 
			
		||||
        request.path.lstrip('/')
 | 
			
		||||
    )
 | 
			
		||||
def favicon():
 | 
			
		||||
    return send_file('../static/content/other/favicon.ico')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# catch-all route for any other static pages (only in root path)
 | 
			
		||||
@bp.route('/<string:filename>')
 | 
			
		||||
def static_files(filename):
 | 
			
		||||
# Route for robots.txt
 | 
			
		||||
@bp.route('/robots.txt')
 | 
			
		||||
def robots():
 | 
			
		||||
    return send_file('../static/content/other/robots.txt')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Route for sitemap.xml
 | 
			
		||||
@bp.route('/sitemap.xml')
 | 
			
		||||
def sitemap():
 | 
			
		||||
    return send_file('../static/content/other/sitemap.xml')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Catch-all route for generic pages
 | 
			
		||||
@bp.route('/<path:filename>')
 | 
			
		||||
def catch_all(filename):
 | 
			
		||||
    # try to find template in the pages directory and add .html extension
 | 
			
		||||
    if not filename.endswith('.html'):
 | 
			
		||||
        filename += '.html'
 | 
			
		||||
    try:
 | 
			
		||||
        return render_template(filename if filename.endswith('.html') else filename + '.html')
 | 
			
		||||
        return render_template(f'pages/{filename}')
 | 
			
		||||
    except Exception as e:
 | 
			
		||||
        log.error(f"Error serving static file {filename}: {e}")
 | 
			
		||||
        abort(404)
 | 
			
		||||
        abort(404, f"Template '{filename}' not found: {e}")
 | 
			
		||||
| 
		 After Width: | Height: | Size: 3.2 MiB  | 
| 
		 After Width: | Height: | Size: 2.0 MiB  | 
| 
		 After Width: | Height: | Size: 4.6 MiB  | 
| 
		 After Width: | Height: | Size: 3.5 MiB  | 
| 
		 After Width: | Height: | Size: 3.3 MiB  | 
| 
		 After Width: | Height: | Size: 4.0 MiB  | 
| 
		 After Width: | Height: | Size: 4.5 MiB  | 
| 
		 After Width: | Height: | Size: 4.7 MiB  | 
| 
		 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  | 
| 
		 Before Width: | Height: | Size: 240 KiB After Width: | Height: | Size: 240 KiB  | 
| 
		 Before Width: | Height: | Size: 2.7 MiB After Width: | Height: | Size: 2.7 MiB  | 
@@ -1,7 +1,7 @@
 | 
			
		||||
@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");
 | 
			
		||||
    src:url("/static/content/fonts/Irken-Like-AllCaps.woff") format("woff");
 | 
			
		||||
    font-weight:normal;
 | 
			
		||||
    font-style:normal;
 | 
			
		||||
}
 | 
			
		||||
@@ -227,7 +227,7 @@ main section a {
 | 
			
		||||
    right: 0;
 | 
			
		||||
    bottom: 0;
 | 
			
		||||
    opacity: 0.1;
 | 
			
		||||
    background-image: url('/static/content/background.png');
 | 
			
		||||
    background-image: url('/static/content/general_images/background.png');
 | 
			
		||||
    background-repeat: no-repeat;
 | 
			
		||||
    background-position: 50% 0;
 | 
			
		||||
    background-size: cover;
 | 
			
		||||
 
 | 
			
		||||
@@ -34,6 +34,35 @@ ul#toaster-specs li {
 | 
			
		||||
    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;
 | 
			
		||||
 
 | 
			
		||||
@@ -118,7 +118,7 @@ if (document.getElementById('spotify')) {
 | 
			
		||||
// load buttons
 | 
			
		||||
 | 
			
		||||
function loadButtons() {
 | 
			
		||||
    fetch('/static/content/buttons.txt').then(response => {
 | 
			
		||||
    fetch('/static/content/other/buttons.txt').then(response => {
 | 
			
		||||
        return response.text();
 | 
			
		||||
    }).then(data => {
 | 
			
		||||
        container = document.getElementById('button-collection');
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
    <link rel="icon" href="/static/content/icon.webp">
 | 
			
		||||
    <link rel="stylesheet" href="/static/css/base.css">
 | 
			
		||||
    <meta name="description" content="{% block description %}server backend survivor{% endblock %}">
 | 
			
		||||
    <meta name="keywords" content="Alfie King, Alfie, King, Alfieking, Alfieking.dev, dev, server">
 | 
			
		||||
    <meta name="keywords" content="{% block keywords %}Alfie King, Alfie, King, Alfieking, Alfieking.dev, dev, server, developer, backend, selfhost, homelab{% endblock %}">
 | 
			
		||||
    <meta name="author" content="Alfie King">
 | 
			
		||||
    <meta name="robots" content="all">
 | 
			
		||||
    <meta name="theme-color" content="#63de90" data-react-helmet="true">
 | 
			
		||||
@@ -15,7 +15,7 @@
 | 
			
		||||
    <meta property="og:url" content="https://alfieking.dev/">
 | 
			
		||||
    <meta property="og:title" content="{{ self.title() }}">
 | 
			
		||||
    <meta property="og:description" content="{{ self.description() }}">
 | 
			
		||||
    <meta property="og:image" content="{% block og_image %}/static/content/icon.webp{% endblock %}">
 | 
			
		||||
    <meta property="og:image" content="{% block og_image %}/static/content/general_images/icon.webp{% endblock %}">
 | 
			
		||||
    {% block head %}
 | 
			
		||||
    {% endblock %}
 | 
			
		||||
</head>
 | 
			
		||||
@@ -62,12 +62,12 @@
 | 
			
		||||
        <section>
 | 
			
		||||
            <pre class="vsmoltext">      |\      _,,,---,,_<br>ZZZzz /,`.-'`'    -.  ;-;;,_<br>     |,4-  ) )-,_. ,\ (  `'-'<br>    '---''(_/--'  `-'\_)</pre>
 | 
			
		||||
        </section>
 | 
			
		||||
        <img src="/static/content/haj.gif" alt="haj" class="haj">
 | 
			
		||||
        <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/icon.webp">
 | 
			
		||||
                <img src="/static/content/general_images/icon.webp">
 | 
			
		||||
                <div>
 | 
			
		||||
                    <h1>Alfie King</h1>
 | 
			
		||||
                    <h2 id="typing">server backend survivor</h2>
 | 
			
		||||
 
 | 
			
		||||
@@ -3,6 +3,12 @@
 | 
			
		||||
{% block title %}Toaster - Alfie'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">
 | 
			
		||||
@@ -45,7 +51,7 @@
 | 
			
		||||
        </ul>
 | 
			
		||||
    </section>
 | 
			
		||||
    <div class="flex-col">
 | 
			
		||||
        <img src="/static/content/Toaster_v1.0_Dark.png" alt="toaster" id="toaster-img">
 | 
			
		||||
        <img src="/static/content/toaster/Toaster_v1.0_Dark.png" alt="toaster" id="toaster-img">
 | 
			
		||||
        <section class="fill-height">
 | 
			
		||||
            <p>
 | 
			
		||||
                NEW AND IMPROVED! Toaster v1.0 is here!
 | 
			
		||||
@@ -70,4 +76,31 @@
 | 
			
		||||
        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="https://x.com/cmkfurmeet"><b>CrittersCMK</b></a> - A furmeet in Milton Keynes.
 | 
			
		||||
            <div class="fur-meet-gallery-small">
 | 
			
		||||
                <img src="/static/content/fur_meets/26-08-2025_critters_mk/PXL_20250726_152110445.jpg" alt="CrittersCMK">
 | 
			
		||||
                <img src="/static/content/fur_meets/26-08-2025_critters_mk/PXL_20250726_155134418.jpg" alt="CrittersCMK">
 | 
			
		||||
                <img src="/static/content/fur_meets/26-08-2025_critters_mk/PXL_20250726_155226274.jpg" alt="CrittersCMK">
 | 
			
		||||
                <img src="/static/content/fur_meets/26-08-2025_critters_mk/PXL_20250726_155434701.jpg" alt="CrittersCMK">
 | 
			
		||||
            </div>
 | 
			
		||||
        </li>
 | 
			
		||||
        <li>
 | 
			
		||||
            <a href="https://www.instagram.com/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/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_141943558.jpg" alt="Paws'N'Pistons">
 | 
			
		||||
                <img src="/static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_150138054.jpg" alt="Paws'N'Pistons">
 | 
			
		||||
                <img src="/static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_150249916.jpg" alt="Paws'N'Pistons">
 | 
			
		||||
                <img src="/static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_183614897.jpg" alt="Paws'N'Pistons">
 | 
			
		||||
            </div>
 | 
			
		||||
        </li>
 | 
			
		||||
    </ul>
 | 
			
		||||
</section>
 | 
			
		||||
{% endblock %}
 | 
			
		||||