Compare commits
7 Commits
b29a61a44b
...
main
Author | SHA1 | Date | |
---|---|---|---|
53cd3852aa | |||
f67f377be1 | |||
bfb1b8a21e | |||
ef459d728a | |||
5690bcadf9 | |||
8b5b80f7c5 | |||
66806ad922 |
3
.gitignore
vendored
@@ -3,4 +3,5 @@
|
||||
db.sqlite
|
||||
flask_session
|
||||
__pycache__
|
||||
app.log
|
||||
app.log
|
||||
.vscode
|
@@ -1,3 +1,4 @@
|
||||
psycopg2-binary
|
||||
python-dotenv
|
||||
flask-session
|
||||
requests
|
||||
|
@@ -1,7 +1,7 @@
|
||||
# Imports
|
||||
from flask import Blueprint, render_template, request, abort, send_from_directory, send_file
|
||||
from flask import Blueprint, render_template, request, abort, send_file
|
||||
from os import getenv as env
|
||||
import logging
|
||||
import logging, os
|
||||
|
||||
|
||||
# Create blueprint
|
||||
@@ -44,10 +44,22 @@ def sitemap():
|
||||
# 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(f'pages/{filename}')
|
||||
try: return render_template(f'pages/{filename if filename.endswith(".html") else filename + ".html"}')
|
||||
except Exception as e:
|
||||
# If the template is not found, check if it is a directory
|
||||
os_path = os.path.join(bp.template_folder, 'pages', filename)[3:]
|
||||
if os.path.isdir(os_path):
|
||||
# walk through the directory and find all files
|
||||
pages = []
|
||||
for root, dirs, files_in_dir in os.walk(os_path):
|
||||
for file in files_in_dir:
|
||||
pages.append(os.path.relpath(os.path.join(root, file), os_path))
|
||||
for dir in dirs:
|
||||
pages.append(os.path.relpath(os.path.join(root, dir), os_path) + '/')
|
||||
|
||||
# If it is a directory, render a directory page
|
||||
if not filename.endswith('/'): filename += '/'
|
||||
return render_template('bases/directory.html', directory=filename, pages=pages)
|
||||
|
||||
# If it is a file, return a 404 error
|
||||
abort(404, f"Template '{filename}' not found: {e}")
|
@@ -20,10 +20,17 @@ log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
# Create database instance
|
||||
db = database.Database(db_name=env('DB_NAME', default='db.sqlite'))
|
||||
db.execute('CREATE TABLE IF NOT EXISTS snake_scores (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, score INTEGER)')
|
||||
db = database.Database(
|
||||
host=env('DB_HOST', default='localhost'),
|
||||
port=env('DB_PORT', default=5432),
|
||||
user=env('DB_USER', default='user'),
|
||||
password=env('DB_PASSWORD', default='password'),
|
||||
db_name=env('DB_NAME', default='db_name')
|
||||
)
|
||||
|
||||
db.execute('CREATE TABLE IF NOT EXISTS snake_scores (id SERIAL PRIMARY KEY, name TEXT, score INTEGER)')
|
||||
db.execute('''CREATE TABLE IF NOT EXISTS snake_tokens (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
id SERIAL PRIMARY KEY,
|
||||
token TEXT UNIQUE NOT NULL,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
ip TEXT UNIQUE NOT NULL
|
||||
@@ -37,7 +44,7 @@ def valid_length(value, min_length=1, max_length=100):
|
||||
|
||||
|
||||
def valid_score(score, game_token):
|
||||
start_time = db.execute('SELECT created_at FROM snake_tokens WHERE token = ?', (game_token,)).fetchone()
|
||||
start_time = db.execute('SELECT created_at FROM snake_tokens WHERE token = %s', (game_token,)).fetchone()
|
||||
if not start_time:
|
||||
log.error("Game token not found.")
|
||||
return False
|
||||
@@ -59,7 +66,7 @@ def valid_score(score, game_token):
|
||||
return False
|
||||
|
||||
# delete the token after score validation
|
||||
db.execute('DELETE FROM snake_tokens WHERE token = ?', (game_token,))
|
||||
db.execute('DELETE FROM snake_tokens WHERE token = %s', (game_token,))
|
||||
log.info(f"Score {score} validated successfully for token {game_token}.")
|
||||
|
||||
return True
|
||||
@@ -90,8 +97,8 @@ def submit_score():
|
||||
abort(400, "Score not vilid, so either you are trying to cheat the leaderboard or something is seriously wrong.")
|
||||
|
||||
try:
|
||||
db.execute('INSERT INTO snake_scores (name, score) VALUES (?, ?)', (name, int(score)))
|
||||
db.execute('DELETE FROM snake_tokens WHERE token = ?', (game_token,))
|
||||
db.execute('INSERT INTO snake_scores (name, score) VALUES (%s, %s)', (name, int(score)))
|
||||
db.execute('DELETE FROM snake_tokens WHERE token = %s', (game_token,))
|
||||
log.info(f"Score submitted: {name} - {score}")
|
||||
return redirect('/404')
|
||||
|
||||
@@ -106,13 +113,13 @@ def generate_start_token():
|
||||
token = urandom(16).hex()
|
||||
ip = request.headers.get('X-Forwarded-For', request.remote_addr)
|
||||
|
||||
ip_token = db.execute('SELECT token FROM snake_tokens WHERE ip = ?', (ip,)).fetchone()
|
||||
ip_token = db.execute('SELECT token FROM snake_tokens WHERE ip = %s', (ip,)).fetchone()
|
||||
if ip_token:
|
||||
log.info(f"Token already exists for IP: {ip}, reusing token.")
|
||||
return ip_token[0]
|
||||
|
||||
log.info(f"Generated start token: {token}")
|
||||
db.execute('INSERT INTO snake_tokens (token, ip) VALUES (?, ?)', (token, ip))
|
||||
db.execute('INSERT INTO snake_tokens (token, ip) VALUES (%s, %s)', (token, ip))
|
||||
return token
|
||||
|
||||
|
||||
@@ -134,7 +141,7 @@ def clear_old_tokens():
|
||||
while True:
|
||||
try:
|
||||
one_hour_ago = datetime.datetime.now() - datetime.timedelta(hours=1)
|
||||
db.execute('DELETE FROM snake_tokens WHERE created_at < ?', (one_hour_ago,))
|
||||
db.execute('DELETE FROM snake_tokens WHERE created_at < %s', (one_hour_ago,))
|
||||
log.info("Old tokens cleared.")
|
||||
except Exception as e:
|
||||
log.error(f"Error clearing old tokens: {e}")
|
||||
|
@@ -1,10 +1,15 @@
|
||||
# Imports
|
||||
import sqlite3
|
||||
import psycopg2
|
||||
|
||||
# Database class
|
||||
class Database:
|
||||
def __init__(self, db_name='db.sqlite'):
|
||||
self.connection = sqlite3.connect(db_name, check_same_thread=False)
|
||||
def __init__(self, host, port, user, password, db_name):
|
||||
self.connection = psycopg2.connect(
|
||||
host=host,
|
||||
port=port,
|
||||
user=user,
|
||||
password=password,
|
||||
database=db_name
|
||||
)
|
||||
self.cursor = self.connection.cursor()
|
||||
|
||||
def execute(self, query, params=None):
|
||||
@@ -13,6 +18,6 @@ class Database:
|
||||
self.cursor.execute(query, params)
|
||||
self.connection.commit()
|
||||
return self.cursor
|
||||
|
||||
|
||||
def close(self):
|
||||
self.connection.close()
|
BIN
static/content/buttons/8831.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
static/content/buttons/beeps.gif
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
static/content/buttons/blinkiescafe.gif
Normal file
After Width: | Height: | Size: 6.8 KiB |
BIN
static/content/buttons/emmixis.gif
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
static/content/buttons/insia.gif
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
static/content/buttons/ne0nbandit.png
Normal file
After Width: | Height: | Size: 3.0 KiB |
BIN
static/content/buttons/nekoweb.gif
Normal file
After Width: | Height: | Size: 2.8 KiB |
BIN
static/content/buttons/neocities.gif
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
static/content/buttons/s1nez.gif
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
static/content/buttons/thnlqd.png
Normal file
After Width: | Height: | Size: 965 B |
BIN
static/content/buttons/tuxedodragon.gif
Normal file
After Width: | Height: | Size: 20 KiB |
After Width: | Height: | Size: 3.6 MiB |
After Width: | Height: | Size: 4.6 MiB |
After Width: | Height: | Size: 3.3 MiB |
After Width: | Height: | Size: 2.7 MiB |
After Width: | Height: | Size: 3.5 MiB |
After Width: | Height: | Size: 4.4 MiB |
After Width: | Height: | Size: 4.9 MiB |
After Width: | Height: | Size: 5.1 MiB |
Before Width: | Height: | Size: 3.3 MiB After Width: | Height: | Size: 3.3 MiB |
Before Width: | Height: | Size: 4.0 MiB After Width: | Height: | Size: 4.0 MiB |
Before Width: | Height: | Size: 4.5 MiB After Width: | Height: | Size: 4.5 MiB |
Before Width: | Height: | Size: 4.7 MiB After Width: | Height: | Size: 4.7 MiB |
@@ -1,6 +1,8 @@
|
||||
User-agent: *
|
||||
Allow: /
|
||||
Disallow: /404.html
|
||||
Disallow: /404
|
||||
Disallow: /500
|
||||
Disallow: /400
|
||||
|
||||
Sitemap: https://alfieking.dev/sitemap.xml
|
||||
|
||||
|
@@ -1,6 +1,18 @@
|
||||
<?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>
|
||||
<url>
|
||||
<loc>https://alfieking.dev/events</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://alfieking.dev/events/paws-n-pistons</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://alfieking.dev/events/crittersmk</loc>
|
||||
</url>
|
||||
</urlset>
|
13
static/css/directory.css
Normal 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;
|
||||
}
|
17
static/css/gallery.css
Normal file
@@ -0,0 +1,17 @@
|
||||
.gallery {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
justify-content: space-between;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.gallery img {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
.gallery-date {
|
||||
margin: 1rem 0 .25rem 0;
|
||||
font-size: 2rem;
|
||||
}
|
@@ -4,7 +4,7 @@
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{% block title %}Alfie's basement{% endblock %}</title>
|
||||
<link rel="icon" href="/static/content/icon.webp">
|
||||
<link rel="icon" href="/static/content/general_images/icon.webp">
|
||||
<link rel="stylesheet" href="/static/css/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{% endblock %}">
|
||||
@@ -28,6 +28,7 @@
|
||||
<ul>
|
||||
<li><a href="/">Home</a></li>
|
||||
<li><a href="/toaster">Toaster</a></li>
|
||||
<li><a href="/events">Events</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>
|
||||
@@ -46,17 +47,18 @@
|
||||
<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>
|
||||
<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>
|
||||
</ul>
|
||||
</section>
|
||||
<section>
|
||||
|
22
templates/bases/directory.html
Normal file
@@ -0,0 +1,22 @@
|
||||
{% extends "bases/base.html" %}
|
||||
|
||||
{% block title %}/{{ directory }} - Alfie's basement{% endblock %}
|
||||
{% block description %}server backend survivor{% endblock %}
|
||||
|
||||
{% block head %}
|
||||
<link rel="stylesheet" href="/static/css/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 %}
|
51
templates/pages/events/crittersmk.html
Normal file
@@ -0,0 +1,51 @@
|
||||
{% extends "bases/base.html" %}
|
||||
|
||||
{% block title %}Critters MK - 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/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>
|
||||
<h2 class="gallery-date">26th July 2025</h2>
|
||||
<div class="gallery">
|
||||
<img src="/static/content/fur_meets/26-07-2025_critters_mk/PXL_20250726_152110445.jpg" alt="Critters MK">
|
||||
<img src="/static/content/fur_meets/26-07-2025_critters_mk/PXL_20250726_155134418.jpg" alt="Critters MK">
|
||||
<img src="/static/content/fur_meets/26-07-2025_critters_mk/PXL_20250726_155226274.jpg" alt="Critters MK">
|
||||
<img src="/static/content/fur_meets/26-07-2025_critters_mk/PXL_20250726_155434701.jpg" alt="Critters MK">
|
||||
</div>
|
||||
<h2 class="gallery-date">23rd Aug 2025</h2>
|
||||
<div class="gallery">
|
||||
<img src="/static/content/fur_meets/23-08-2025_critters_mk/PXL_20250823_130640362.jpg" alt="Critters MK">
|
||||
<img src="/static/content/fur_meets/23-08-2025_critters_mk/PXL_20250823_130648109.jpg" alt="Critters MK">
|
||||
<img src="/static/content/fur_meets/23-08-2025_critters_mk/PXL_20250823_130659800.jpg"" alt="Critters MK">
|
||||
</div>
|
||||
</section>
|
||||
{% endblock %}
|
64
templates/pages/events/paws-n-pistons.html
Normal file
@@ -0,0 +1,64 @@
|
||||
{% extends "bases/base.html" %}
|
||||
|
||||
{% block title %}Paws'N'Pistons - 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/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/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>
|
||||
<h2 class="gallery-date">3rd Aug 2025</h2>
|
||||
<div class="gallery">
|
||||
<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">
|
||||
<img src="/static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_140629639.jpg" alt="Paws'N'Pistons">
|
||||
<img src="/static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_141242090.jpg" alt="Paws'N'Pistons">
|
||||
<img src="/static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_182023562.jpg" alt="Paws'N'Pistons">
|
||||
<img src="/static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_184321576.jpg" alt="Paws'N'Pistons">
|
||||
</div>
|
||||
</section>
|
||||
{% endblock %}
|
@@ -84,16 +84,16 @@ protogen v1.0, toaster v1.0
|
||||
</p>
|
||||
<ul id="fur-meets">
|
||||
<li>
|
||||
<a href="https://x.com/cmkfurmeet"><b>CrittersCMK</b></a> - A furmeet in Milton Keynes.
|
||||
<a href="/events/crittersmk"><b>Critters MK</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">
|
||||
<img src="/static/content/fur_meets/26-07-2025_critters_mk/PXL_20250726_152110445.jpg" alt="Critters MK">
|
||||
<img src="/static/content/fur_meets/26-07-2025_critters_mk/PXL_20250726_155134418.jpg" alt="Critters MK">
|
||||
<img src="/static/content/fur_meets/26-07-2025_critters_mk/PXL_20250726_155226274.jpg" alt="Critters MK">
|
||||
<img src="/static/content/fur_meets/26-07-2025_critters_mk/PXL_20250726_155434701.jpg" alt="Critters MK">
|
||||
</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.
|
||||
<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/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">
|
||||
@@ -101,6 +101,7 @@ protogen v1.0, toaster v1.0
|
||||
<img src="/static/content/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 %}
|