From 1a5380e17eeb0d58f6e7a6b49279b71145b1038d Mon Sep 17 00:00:00 2001 From: Alfie King Date: Tue, 3 Mar 2026 14:11:55 +0000 Subject: [PATCH] major update --- .gitea/workflows/deploy.yaml | 29 +------ .gitignore | 6 +- dockerfile | 22 ------ run.sh | 5 -- src/{routes => }/dynamic_routes.py | 32 ++++---- src/errors.py | 39 +++++++++ src/main.py | 74 ++++++++++++++++++ src/pg_log.py | 35 +++++++++ src/routes/error_handlers.py | 52 ------------ src/wsgi.py | 63 --------------- static/content/other/robots.txt | 4 +- static/content/other/sitemap.xml | 9 --- .../PXL_20250803_140629639.jpg | Bin .../PXL_20250803_141242090.jpg | Bin .../PXL_20250803_141943558.jpg | Bin .../PXL_20250803_150138054.jpg | Bin .../PXL_20250803_150249916.jpg | Bin .../PXL_20250803_182023562.jpg | Bin .../PXL_20250803_183614897.jpg | Bin .../PXL_20250803_184321576.jpg | Bin .../PXL_20250803_200906329.jpg | Bin .../PXL_20250823_130640362.jpg | Bin .../PXL_20250823_130648109.jpg | Bin .../PXL_20250823_130659800.jpg | Bin .../PXL_20250726_152110445.jpg | Bin .../PXL_20250726_155134418.jpg | Bin .../PXL_20250726_155226274.jpg | Bin .../PXL_20250726_155434701.jpg | Bin templates/bases/base.html | 2 +- templates/pages/events/crittersmk.html | 14 ++-- templates/pages/events/paws-n-pistons.html | 18 ++--- templates/pages/test.md | 4 - templates/{pages => }/toaster.html | 16 ++-- 33 files changed, 193 insertions(+), 231 deletions(-) delete mode 100644 dockerfile delete mode 100755 run.sh rename src/{routes => }/dynamic_routes.py (57%) create mode 100644 src/errors.py create mode 100644 src/main.py create mode 100644 src/pg_log.py delete mode 100644 src/routes/error_handlers.py delete mode 100644 src/wsgi.py rename static/content/{ => photos}/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_140629639.jpg (100%) rename static/content/{ => photos}/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_141242090.jpg (100%) rename static/content/{ => photos}/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_141943558.jpg (100%) rename static/content/{ => photos}/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_150138054.jpg (100%) rename static/content/{ => photos}/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_150249916.jpg (100%) rename static/content/{ => photos}/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_182023562.jpg (100%) rename static/content/{ => photos}/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_183614897.jpg (100%) rename static/content/{ => photos}/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_184321576.jpg (100%) rename static/content/{ => photos}/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_200906329.jpg (100%) rename static/content/{ => photos}/fur_meets/23-08-2025_critters_mk/PXL_20250823_130640362.jpg (100%) rename static/content/{ => photos}/fur_meets/23-08-2025_critters_mk/PXL_20250823_130648109.jpg (100%) rename static/content/{ => photos}/fur_meets/23-08-2025_critters_mk/PXL_20250823_130659800.jpg (100%) rename static/content/{ => photos}/fur_meets/26-07-2025_critters_mk/PXL_20250726_152110445.jpg (100%) rename static/content/{ => photos}/fur_meets/26-07-2025_critters_mk/PXL_20250726_155134418.jpg (100%) rename static/content/{ => photos}/fur_meets/26-07-2025_critters_mk/PXL_20250726_155226274.jpg (100%) rename static/content/{ => photos}/fur_meets/26-07-2025_critters_mk/PXL_20250726_155434701.jpg (100%) delete mode 100644 templates/pages/test.md rename templates/{pages => }/toaster.html (83%) diff --git a/.gitea/workflows/deploy.yaml b/.gitea/workflows/deploy.yaml index d93d5e3..bd9bdf0 100644 --- a/.gitea/workflows/deploy.yaml +++ b/.gitea/workflows/deploy.yaml @@ -1,33 +1,8 @@ -name: Build and push container image -run-name: ${{ gitea.actor }} is building and pushing container image +name: Deploy website +run-name: ${{ gitea.actor }} is deploying update on: push: branches: - main -env: - GITEA_DOMAIN: git.alfieking.dev - GITEA_REGISTRY_USER: acetheking987 - RESULT_IMAGE_NAME: acetheking987/alfieking.dev - jobs: - build-and-push-image: - runs-on: ubuntu-latest - container: - image: catthehacker/ubuntu:act-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - name: Log in to registry - uses: docker/login-action@v3 - with: - registry: ${{ env.GITEA_DOMAIN }} - username: ${{ env.GITEA_REGISTRY_USER }} - password: ${{ secrets.CONTAINER_REGISTRY_TOKEN }} - - name: Build and push image - uses: docker/build-push-action@v6 - with: - push: true - tags: ${{ env.GITEA_DOMAIN }}/${{ env.RESULT_IMAGE_NAME }}:latest \ No newline at end of file diff --git a/.gitignore b/.gitignore index 8ac8f71..8637cef 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,3 @@ -.venv .env -flask_session __pycache__ -.vscode -db -app.log \ No newline at end of file +.venv \ No newline at end of file diff --git a/dockerfile b/dockerfile deleted file mode 100644 index 36948e9..0000000 --- a/dockerfile +++ /dev/null @@ -1,22 +0,0 @@ -FROM python:alpine - -# Set the working directory -WORKDIR /app - -# Copy the requirements file into the container -COPY requirements.txt . - -# Install the required packages -RUN pip install --no-cache-dir -r requirements.txt -RUN pip install gunicorn - -# Copy the rest of the application code into the container -COPY src src -COPY templates templates -COPY static static - -# Expose the port the app runs on -EXPOSE 5000 - -# run the application -ENTRYPOINT [ "gunicorn", "-b", ":5000", "--access-logfile", "-", "--error-logfile", "-", "src.wsgi:app" ] \ No newline at end of file diff --git a/run.sh b/run.sh deleted file mode 100755 index 461da21..0000000 --- a/run.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -[ ! -f .env ] || export $(grep -v '^#' .env | xargs) - -flask --app src.wsgi.py --debug run \ No newline at end of file diff --git a/src/routes/dynamic_routes.py b/src/dynamic_routes.py similarity index 57% rename from src/routes/dynamic_routes.py rename to src/dynamic_routes.py index 73dbffe..f66647b 100644 --- a/src/routes/dynamic_routes.py +++ b/src/dynamic_routes.py @@ -1,22 +1,21 @@ # Imports from flask import Blueprint, render_template, abort -from os import getenv as env -import logging, os, markdown +import os, markdown + # Create blueprint -bp = Blueprint( - 'dynamic_routes', - __name__, - template_folder=env('TEMPLATE_FOLDER', default='templates'), - static_folder=env('STATIC_FOLDER', default='../static') -) +bp = Blueprint('dynamic_routes', __name__) +template_folder = "templates" + + +# helper func +def get_path(file) -> str: + return os.path.join(template_folder, "pages", file) -# Create logger -log = logging.getLogger(__name__) # Get all files in folder def ListFiles(path): - path = os.path.join(bp.template_folder, 'pages', path) + path = get_path(path) files = [] for root, dirs, files_in_dir in os.walk(path): for file in files_in_dir: @@ -25,11 +24,12 @@ def ListFiles(path): files.append(os.path.relpath(os.path.join(root, dir), path) + '/') return files + # Catch-all route for generic pages @bp.route('/') def catch_all(filename): - if os.path.exists(os.path.join(bp.template_folder, 'pages', filename)): - if os.path.isdir(os.path.join(bp.template_folder, 'pages', 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, @@ -38,11 +38,11 @@ def catch_all(filename): return render_template(f'pages/{filename}') - elif os.path.exists(os.path.join(bp.template_folder, 'pages', filename + '.html')): + elif os.path.exists(get_path(filename + '.html')): return render_template(f'pages/{filename}.html') - elif os.path.exists(os.path.join(bp.template_folder, 'pages', filename + '.md')): - output = markdown.markdown(open(os.path.join(bp.template_folder, 'pages', filename + '.md'), "r").read()) + elif os.path.exists(get_path(filename + '.md')): + output = markdown.markdown(open(get_path(filename + '.md'), "r").read()) return render_template( f'bases/md.html', title = filename.split("/")[-1], diff --git a/src/errors.py b/src/errors.py new file mode 100644 index 0000000..77abdf1 --- /dev/null +++ b/src/errors.py @@ -0,0 +1,39 @@ +from flask import Blueprint, render_template +from werkzeug.exceptions import HTTPException +from os import getenv as env + + +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, + name = error.name + ), error.code \ No newline at end of file diff --git a/src/main.py b/src/main.py new file mode 100644 index 0000000..4ea2577 --- /dev/null +++ b/src/main.py @@ -0,0 +1,74 @@ +# IMPORTS +from flask import Flask, render_template +from dotenv import load_dotenv +from os import getenv as env +import logging + +try: + import src.dynamic_routes as dynamic_routes + import src.errors as errors + import src.pg_log as pg_log +except ImportError: + import dynamic_routes, errors, pg_log + + +# ENV +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.") + + +# CREATE FLASK APP +app = Flask( + __name__, + template_folder="../templates", + static_folder="../static" +) + + +# BLUEPRINTS +app.register_blueprint(errors.bp, url_prefix="/errors") +app.register_blueprint(dynamic_routes.bp, url_prefix="/") + + +# ROUTES +@app.route("/") +def index(): + return render_template("index.html") + +@app.route("/toaster") +def toaster(): + return render_template("toaster.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) \ No newline at end of file diff --git a/src/pg_log.py b/src/pg_log.py new file mode 100644 index 0000000..e2aa39c --- /dev/null +++ b/src/pg_log.py @@ -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() \ No newline at end of file diff --git a/src/routes/error_handlers.py b/src/routes/error_handlers.py deleted file mode 100644 index afa3707..0000000 --- a/src/routes/error_handlers.py +++ /dev/null @@ -1,52 +0,0 @@ -# Imports -from flask import Blueprint, render_template -from werkzeug.exceptions import HTTPException -from os import getenv as env -import logging - -# Create blueprint -bp = Blueprint( - 'error_handlers', - __name__, - template_folder=env('TEMPLATE_FOLDER', default='../templates'), - static_folder=env('STATIC_FOLDER', default='../static') -) - -# Create logger -log = logging.getLogger(__name__) - -# Route for 500 error -@bp.route('/500') -@bp.app_errorhandler(500) -def internal_server_error(error:HTTPException=None): - return render_template('errors/500.html', error=error), 500 - -# Route for 404 error -@bp.route('/404') -@bp.app_errorhandler(404) -def not_found(error:HTTPException=None): - return render_template('errors/404.html', error=error), 404 - -# Route for 400 error -@bp.route('/400') -@bp.app_errorhandler(400) -def bad_request(error:HTTPException=None): - return render_template('errors/400.html', error=error), 400 - -# Route for all other errors -@bp.route('/idk') -@bp.app_errorhandler(Exception) -def nah(error:HTTPException=None): - if isinstance(error, HTTPException): - return render_template( - 'errors/error.html', - code = error.code, - description = error.description, - name = error.name - ), error.code - return render_template( - 'errors/error.html', - code=418, - description="I honestly dont know", - name="I'm a teapot" - ), 418 \ No newline at end of file diff --git a/src/wsgi.py b/src/wsgi.py deleted file mode 100644 index 3c01824..0000000 --- a/src/wsgi.py +++ /dev/null @@ -1,63 +0,0 @@ -# Imports -from flask import Flask, render_template, send_file -from flask_session import Session - -from dotenv import load_dotenv -from os import getenv as env -import logging - -import src.routes.error_handlers -import src.routes.dynamic_routes - -# Load env -load_dotenv() - -# Create logger -stream_handler = logging.StreamHandler() -stream_handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')) -stream_handler.setLevel(logging.INFO) - -file_handler = logging.FileHandler(filename='app.log') -file_handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')) -file_handler.setLevel(logging.DEBUG) - -# Add handlers to the logger -log = logging.getLogger() -log.setLevel(logging.DEBUG) -log.addHandler(stream_handler) -log.addHandler(file_handler) -log.info("Logging initialized") - -# Create flask app -app = Flask( - __name__, - template_folder=env('TEMPLATE_FOLDER', default='../templates'), - static_folder=env('STATIC_FOLDER', default='../static') -) - -# Configure sessions -app.config["SESSION_PERMANENT"] = True -app.config["SESSION_TYPE"] = "filesystem" -Session(app) - -# Load routes -app.register_blueprint(src.routes.error_handlers.bp, url_prefix='/error') -app.register_blueprint(src.routes.dynamic_routes.bp, url_prefix='/') - -# Generic routes -@app.route('/') -def index(): - return render_template('index.html') - -@app.route('/favicon.ico') -def favicon(): - return send_file('../static/content/other/favicon.ico') - -@app.route('/robots.txt') -def robots(): - return send_file('../static/content/other/robots.txt') - -# Route for sitemap.xml -@app.route('/sitemap.xml') -def sitemap(): - return send_file('../static/content/other/sitemap.xml') \ No newline at end of file diff --git a/static/content/other/robots.txt b/static/content/other/robots.txt index 01c41cd..14a01e1 100644 --- a/static/content/other/robots.txt +++ b/static/content/other/robots.txt @@ -1,8 +1,6 @@ User-agent: * Allow: / -Disallow: /404 -Disallow: /500 -Disallow: /400 +Disallow: /errors Sitemap: https://alfieking.dev/sitemap.xml diff --git a/static/content/other/sitemap.xml b/static/content/other/sitemap.xml index 2490a2f..e3bb78a 100644 --- a/static/content/other/sitemap.xml +++ b/static/content/other/sitemap.xml @@ -6,13 +6,4 @@ https://alfieking.dev/toaster - - https://alfieking.dev/events - - - https://alfieking.dev/events/paws-n-pistons - - - https://alfieking.dev/events/crittersmk - \ No newline at end of file diff --git a/static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_140629639.jpg b/static/content/photos/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_140629639.jpg similarity index 100% rename from static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_140629639.jpg rename to static/content/photos/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_140629639.jpg diff --git a/static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_141242090.jpg b/static/content/photos/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_141242090.jpg similarity index 100% rename from static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_141242090.jpg rename to static/content/photos/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_141242090.jpg diff --git a/static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_141943558.jpg b/static/content/photos/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_141943558.jpg similarity index 100% rename from static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_141943558.jpg rename to static/content/photos/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_141943558.jpg diff --git a/static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_150138054.jpg b/static/content/photos/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_150138054.jpg similarity index 100% rename from static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_150138054.jpg rename to static/content/photos/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_150138054.jpg diff --git a/static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_150249916.jpg b/static/content/photos/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_150249916.jpg similarity index 100% rename from static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_150249916.jpg rename to static/content/photos/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_150249916.jpg diff --git a/static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_182023562.jpg b/static/content/photos/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_182023562.jpg similarity index 100% rename from static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_182023562.jpg rename to static/content/photos/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_182023562.jpg diff --git a/static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_183614897.jpg b/static/content/photos/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_183614897.jpg similarity index 100% rename from static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_183614897.jpg rename to static/content/photos/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_183614897.jpg diff --git a/static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_184321576.jpg b/static/content/photos/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_184321576.jpg similarity index 100% rename from static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_184321576.jpg rename to static/content/photos/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_184321576.jpg diff --git a/static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_200906329.jpg b/static/content/photos/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_200906329.jpg similarity index 100% rename from static/content/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_200906329.jpg rename to static/content/photos/fur_meets/03-08-2025_paws_n_pistons/PXL_20250803_200906329.jpg diff --git a/static/content/fur_meets/23-08-2025_critters_mk/PXL_20250823_130640362.jpg b/static/content/photos/fur_meets/23-08-2025_critters_mk/PXL_20250823_130640362.jpg similarity index 100% rename from static/content/fur_meets/23-08-2025_critters_mk/PXL_20250823_130640362.jpg rename to static/content/photos/fur_meets/23-08-2025_critters_mk/PXL_20250823_130640362.jpg diff --git a/static/content/fur_meets/23-08-2025_critters_mk/PXL_20250823_130648109.jpg b/static/content/photos/fur_meets/23-08-2025_critters_mk/PXL_20250823_130648109.jpg similarity index 100% rename from static/content/fur_meets/23-08-2025_critters_mk/PXL_20250823_130648109.jpg rename to static/content/photos/fur_meets/23-08-2025_critters_mk/PXL_20250823_130648109.jpg diff --git a/static/content/fur_meets/23-08-2025_critters_mk/PXL_20250823_130659800.jpg b/static/content/photos/fur_meets/23-08-2025_critters_mk/PXL_20250823_130659800.jpg similarity index 100% rename from static/content/fur_meets/23-08-2025_critters_mk/PXL_20250823_130659800.jpg rename to static/content/photos/fur_meets/23-08-2025_critters_mk/PXL_20250823_130659800.jpg diff --git a/static/content/fur_meets/26-07-2025_critters_mk/PXL_20250726_152110445.jpg b/static/content/photos/fur_meets/26-07-2025_critters_mk/PXL_20250726_152110445.jpg similarity index 100% rename from static/content/fur_meets/26-07-2025_critters_mk/PXL_20250726_152110445.jpg rename to static/content/photos/fur_meets/26-07-2025_critters_mk/PXL_20250726_152110445.jpg diff --git a/static/content/fur_meets/26-07-2025_critters_mk/PXL_20250726_155134418.jpg b/static/content/photos/fur_meets/26-07-2025_critters_mk/PXL_20250726_155134418.jpg similarity index 100% rename from static/content/fur_meets/26-07-2025_critters_mk/PXL_20250726_155134418.jpg rename to static/content/photos/fur_meets/26-07-2025_critters_mk/PXL_20250726_155134418.jpg diff --git a/static/content/fur_meets/26-07-2025_critters_mk/PXL_20250726_155226274.jpg b/static/content/photos/fur_meets/26-07-2025_critters_mk/PXL_20250726_155226274.jpg similarity index 100% rename from static/content/fur_meets/26-07-2025_critters_mk/PXL_20250726_155226274.jpg rename to static/content/photos/fur_meets/26-07-2025_critters_mk/PXL_20250726_155226274.jpg diff --git a/static/content/fur_meets/26-07-2025_critters_mk/PXL_20250726_155434701.jpg b/static/content/photos/fur_meets/26-07-2025_critters_mk/PXL_20250726_155434701.jpg similarity index 100% rename from static/content/fur_meets/26-07-2025_critters_mk/PXL_20250726_155434701.jpg rename to static/content/photos/fur_meets/26-07-2025_critters_mk/PXL_20250726_155434701.jpg diff --git a/templates/bases/base.html b/templates/bases/base.html index d01da80..e3759af 100644 --- a/templates/bases/base.html +++ b/templates/bases/base.html @@ -41,7 +41,7 @@
-
heya, try typing "furry", "irken" or scratch into this page!
+
heya, try typing "furry", "irken" or "scratch" into this page!

BUTTONS

diff --git a/templates/pages/events/crittersmk.html b/templates/pages/events/crittersmk.html index b18defc..0f89127 100644 --- a/templates/pages/events/crittersmk.html +++ b/templates/pages/events/crittersmk.html @@ -37,18 +37,18 @@ protogen v1.0, toaster v1.0
diff --git a/templates/pages/events/paws-n-pistons.html b/templates/pages/events/paws-n-pistons.html index adb28ac..8be9763 100644 --- a/templates/pages/events/paws-n-pistons.html +++ b/templates/pages/events/paws-n-pistons.html @@ -42,7 +42,7 @@ protogen v1.0, toaster v1.0 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).
- me in a fursuit + me in a fursuit
The fursuit belongs to Tricky the Fox, they are a very chill person and I had a great time talking to them ^w^.

Photos :3

@@ -52,14 +52,14 @@ protogen v1.0, toaster v1.0 diff --git a/templates/pages/test.md b/templates/pages/test.md deleted file mode 100644 index 3b838d8..0000000 --- a/templates/pages/test.md +++ /dev/null @@ -1,4 +0,0 @@ -# hello -## this is a test - -this is actually a md file, try putting .md at the end of this path \ No newline at end of file diff --git a/templates/pages/toaster.html b/templates/toaster.html similarity index 83% rename from templates/pages/toaster.html rename to templates/toaster.html index d8a7383..eddae6c 100644 --- a/templates/pages/toaster.html +++ b/templates/toaster.html @@ -86,19 +86,19 @@ protogen v1.0, toaster v1.0
  • Critters MK - A furmeet in Milton Keynes.
  • Paws'N'Pistons - A furry car meet around the UK.
  • Click on the links to view more photos from each event :3