more updates
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				Build and push container image / build-and-push-image (push) Successful in 2m59s
				
			
		
		
	
	
				
					
				
			@@ -1,5 +1,5 @@
 | 
				
			|||||||
# Imports
 | 
					# 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
 | 
					from os import getenv as env
 | 
				
			||||||
import logging
 | 
					import logging
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,22 +23,31 @@ def index():
 | 
				
			|||||||
    return render_template('index.html')
 | 
					    return render_template('index.html')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Route for robots.txt, sitemap.xml, and favicon.ico
 | 
					# Route for favicon
 | 
				
			||||||
@bp.route('/robots.txt')
 | 
					 | 
				
			||||||
@bp.route('/sitemap.xml')
 | 
					 | 
				
			||||||
@bp.route('/favicon.ico')
 | 
					@bp.route('/favicon.ico')
 | 
				
			||||||
def web_stuffs():
 | 
					def favicon():
 | 
				
			||||||
    return send_from_directory(
 | 
					    return send_file('../static/content/other/favicon.ico')
 | 
				
			||||||
        env('STATIC_FOLDER', default='../static'),
 | 
					 | 
				
			||||||
        request.path.lstrip('/')
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# catch-all route for any other static pages (only in root path)
 | 
					# Route for robots.txt
 | 
				
			||||||
@bp.route('/<string:filename>')
 | 
					@bp.route('/robots.txt')
 | 
				
			||||||
def static_files(filename):
 | 
					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:
 | 
					    try:
 | 
				
			||||||
        return render_template(filename if filename.endswith('.html') else filename + '.html')
 | 
					        return render_template(f'pages/{filename}')
 | 
				
			||||||
    except Exception as e:
 | 
					    except Exception as e:
 | 
				
			||||||
        log.error(f"Error serving static file {filename}: {e}")
 | 
					        abort(404, f"Template '{filename}' not found: {e}")
 | 
				
			||||||
        abort(404)
 | 
					 | 
				
			||||||
| 
		 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');
 | 
					@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-face {
 | 
				
			||||||
    font-family:"Irken";
 | 
					    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-weight:normal;
 | 
				
			||||||
    font-style:normal;
 | 
					    font-style:normal;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -227,7 +227,7 @@ main section a {
 | 
				
			|||||||
    right: 0;
 | 
					    right: 0;
 | 
				
			||||||
    bottom: 0;
 | 
					    bottom: 0;
 | 
				
			||||||
    opacity: 0.1;
 | 
					    opacity: 0.1;
 | 
				
			||||||
    background-image: url('/static/content/background.png');
 | 
					    background-image: url('/static/content/general_images/background.png');
 | 
				
			||||||
    background-repeat: no-repeat;
 | 
					    background-repeat: no-repeat;
 | 
				
			||||||
    background-position: 50% 0;
 | 
					    background-position: 50% 0;
 | 
				
			||||||
    background-size: cover;
 | 
					    background-size: cover;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,6 +34,35 @@ ul#toaster-specs li {
 | 
				
			|||||||
    height: 100%;
 | 
					    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) {
 | 
					@media screen and (max-width: 740px) {
 | 
				
			||||||
    .flex-row {
 | 
					    .flex-row {
 | 
				
			||||||
        flex-direction: column;
 | 
					        flex-direction: column;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -118,7 +118,7 @@ if (document.getElementById('spotify')) {
 | 
				
			|||||||
// load buttons
 | 
					// load buttons
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function loadButtons() {
 | 
					function loadButtons() {
 | 
				
			||||||
    fetch('/static/content/buttons.txt').then(response => {
 | 
					    fetch('/static/content/other/buttons.txt').then(response => {
 | 
				
			||||||
        return response.text();
 | 
					        return response.text();
 | 
				
			||||||
    }).then(data => {
 | 
					    }).then(data => {
 | 
				
			||||||
        container = document.getElementById('button-collection');
 | 
					        container = document.getElementById('button-collection');
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,7 +7,7 @@
 | 
				
			|||||||
    <link rel="icon" href="/static/content/icon.webp">
 | 
					    <link rel="icon" href="/static/content/icon.webp">
 | 
				
			||||||
    <link rel="stylesheet" href="/static/css/base.css">
 | 
					    <link rel="stylesheet" href="/static/css/base.css">
 | 
				
			||||||
    <meta name="description" content="{% block description %}server backend survivor{% endblock %}">
 | 
					    <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="author" content="Alfie King">
 | 
				
			||||||
    <meta name="robots" content="all">
 | 
					    <meta name="robots" content="all">
 | 
				
			||||||
    <meta name="theme-color" content="#63de90" data-react-helmet="true">
 | 
					    <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:url" content="https://alfieking.dev/">
 | 
				
			||||||
    <meta property="og:title" content="{{ self.title() }}">
 | 
					    <meta property="og:title" content="{{ self.title() }}">
 | 
				
			||||||
    <meta property="og:description" content="{{ self.description() }}">
 | 
					    <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 %}
 | 
					    {% block head %}
 | 
				
			||||||
    {% endblock %}
 | 
					    {% endblock %}
 | 
				
			||||||
</head>
 | 
					</head>
 | 
				
			||||||
@@ -62,12 +62,12 @@
 | 
				
			|||||||
        <section>
 | 
					        <section>
 | 
				
			||||||
            <pre class="vsmoltext">      |\      _,,,---,,_<br>ZZZzz /,`.-'`'    -.  ;-;;,_<br>     |,4-  ) )-,_. ,\ (  `'-'<br>    '---''(_/--'  `-'\_)</pre>
 | 
					            <pre class="vsmoltext">      |\      _,,,---,,_<br>ZZZzz /,`.-'`'    -.  ;-;;,_<br>     |,4-  ) )-,_. ,\ (  `'-'<br>    '---''(_/--'  `-'\_)</pre>
 | 
				
			||||||
        </section>
 | 
					        </section>
 | 
				
			||||||
        <img src="/static/content/haj.gif" alt="haj" class="haj">
 | 
					        <img src="/static/content/general_images/haj.gif" alt="haj" class="haj">
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
    <main id="main">
 | 
					    <main id="main">
 | 
				
			||||||
        <header id="home">
 | 
					        <header id="home">
 | 
				
			||||||
            <div class="row">
 | 
					            <div class="row">
 | 
				
			||||||
                <img src="/static/content/icon.webp">
 | 
					                <img src="/static/content/general_images/icon.webp">
 | 
				
			||||||
                <div>
 | 
					                <div>
 | 
				
			||||||
                    <h1>Alfie King</h1>
 | 
					                    <h1>Alfie King</h1>
 | 
				
			||||||
                    <h2 id="typing">server backend survivor</h2>
 | 
					                    <h2 id="typing">server backend survivor</h2>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,6 +3,12 @@
 | 
				
			|||||||
{% block title %}Toaster - Alfie's basement{% endblock %}
 | 
					{% block title %}Toaster - Alfie's basement{% endblock %}
 | 
				
			||||||
{% block description %}furry corner{% endblock %}
 | 
					{% block description %}furry corner{% endblock %}
 | 
				
			||||||
{% block og_image %}/static/content/Toaster_v1.0_Dark.png{% 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 %}
 | 
					{% block head %}
 | 
				
			||||||
<link rel="stylesheet" href="/static/css/toaster.css">
 | 
					<link rel="stylesheet" href="/static/css/toaster.css">
 | 
				
			||||||
@@ -45,7 +51,7 @@
 | 
				
			|||||||
        </ul>
 | 
					        </ul>
 | 
				
			||||||
    </section>
 | 
					    </section>
 | 
				
			||||||
    <div class="flex-col">
 | 
					    <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">
 | 
					        <section class="fill-height">
 | 
				
			||||||
            <p>
 | 
					            <p>
 | 
				
			||||||
                NEW AND IMPROVED! Toaster v1.0 is here!
 | 
					                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).
 | 
					        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>
 | 
					    </p>
 | 
				
			||||||
</section>
 | 
					</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 %}
 | 
					{% endblock %}
 | 
				
			||||||