Compare commits

...

7 Commits

Author SHA1 Message Date
2f224023fb Added buttons and font 2025-09-23 00:50:08 +02:00
cfe48023e6 Main HTML Templates 2025-09-23 00:49:17 +02:00
36f9f62a0e Added CSS components 2025-09-23 00:48:19 +02:00
9b7b19992c Added robots.txt to (hopefully) fuck scrapers 2025-09-23 00:47:41 +02:00
4d200e29d4 Added JSON configuration files 2025-09-23 00:46:31 +02:00
a9596734e4 Added main backend components 2025-09-23 00:45:03 +02:00
4d857fc787 Added gitignore 2025-09-23 00:43:51 +02:00
48 changed files with 2315 additions and 0 deletions

8
.gitignore vendored Normal file
View File

@@ -0,0 +1,8 @@
__pycache__
log
messages
static/docs/mailpassword
get-logs.sh
upload.sh
todo.txt
website

14
config-uwsgi.ini Normal file
View File

@@ -0,0 +1,14 @@
[uwsgi]
module = wsgi:app
plugins = python3
socket = /tmp/myapp.sock
chmod-socket = 660
chown-socket = www-data:www-data
vacuum = true
buffer-size=32768
master = true
processes = 4
logto = /var/log/nginx/%n.log
die-on-term = true

375
server.py Executable file
View File

@@ -0,0 +1,375 @@
#!/bin/python3
from flask import Flask, request, render_template, Response, send_file, g, url_for, redirect, make_response
from random import randint
import requests
import datetime
import smtplib
import flask
import time
import os
import json
app = Flask(__name__, static_url_path="", static_folder="static", template_folder="templates")
app.config['msgTime'] = datetime.datetime.now()
app.config['reloadTime'] = datetime.datetime.now()
weekday = [
"Mon", "Tue", "Wed", "Thu",
"Fri", "Sat", "Sun"
]
def getIpInfo(ip):
try:
endpoint = f'https://ipinfo.io/{ip}/json'
response = requests.get(endpoint, verify = True)
if response.status_code != 200:
return None
return response.json()
except:
return None
def logConnection(req:request, site:str):
scraper = False
ipInfo = getIpInfo(request.remote_addr);
logStr = f"{ req.remote_addr } connected on '{ time.asctime() }' to '{ site }' with user-agent '{ req.user_agent }'"
logFile = open(f"log/{datetime.datetime.now().strftime('%d.%m.%Y')}.log", "a")
try:
logStr += f"\n^\tIP Country: '{ipInfo['country']}'\t"
logStr += f"Region: '{ipInfo['region']}'\t"
logStr += f"City: '{ipInfo['city']}'\t"
logStr += f"Org: '{ipInfo['org']}'\t"
for i in app.config["config"]["blacklist"]:
if ipInfo['org'].lower().find(i.lower()) != -1:
scraper = True
logFile.write("Scraper detected, redirecting that fucko\n")
logStr += f"Hostname: '{ipInfo['hostname']}'"
except:
logStr += "\n^\tError with IP-Info getter"
logFile.write(f"{logStr}\n\n")
logFile.close()
if scraper:
flask.abort(406)
def generateNavbar(selectedElement):
return render_template("inline/navbar.html", navContent=app.config["config"]["navbar"], navSel=selectedElement,
randomQuote=app.config["quote"][0],
todos=app.config["todo"],
updates=app.config["updates"],
rndShit=app.config["random"][randint(0, len(app.config["random"])-1)])
def generateFooter():
updTime = datetime.datetime.fromtimestamp(os.path.getmtime("static/docs/config.json"))
timeStr = f"{updTime.day}.{updTime.month}.{updTime.year} ({weekday[updTime.weekday()]})"
return render_template("inline/footer.html", buttons=app.config["config"]["buttons"], updated=timeStr)
def generateStyle():
style = """
<style>
:root {
--main-bg-color: #fed6af;
--main-bg-end-color: #ffffee;
--main-color: #ffffff;
--main-fg-color: #800000;
--main-title-fg-color: #800000;
--title-align: left;
--border-style: solid;
--border-width: 0px;
--button-border-width: 1px;
--button-border-style: solid;
--button-selected-style: ridge;
--optional-link-background: #00000000;
--font-family: Arial, Helvetica, sans-serif;
--font-size: 13px;
--background-image: url(../images/fade.png);
}
</style>
"""
return style
def getMultiples(i) -> str: #lol
ret = "s"
if i == 1:
ret = ""
return ret
@app.errorhandler(406)
def not_found_error(error):
return render_template("scraper.html"), 406
@app.before_request
def reload_jsons(anyway=False):
try:
test = app.config["config"]["navbar"]
except:
anyway = True
if anyway or (datetime.datetime.now() - app.config['reloadTime']).seconds > 5:
todoRaw = open("static/docs/todo.json", "r")
app.config["todo"] = json.load(todoRaw)["todo"]
randomRaw = open("static/docs/random.json", "r")
app.config["random"] = json.load(randomRaw)["rnd"]
quoteRaw = open("static/docs/lessons.json", "r")
app.config["quote"] = json.load(quoteRaw)["lessons"]
funRaw = open("static/docs/funfacts.json", "r")
app.config["fun"] = json.load(funRaw)["funfacts"]
updatesRaw = open("static/docs/updates.json", "r")
app.config["updates"] = json.load(updatesRaw)["updates"]
photobookRaw = open("static/docs/photobook.json", "r")
app.config["photobook"] = json.load(photobookRaw)["photobook"]
configRaw = open("static/docs/config.json", "r")
app.config["config"] = json.load(configRaw)
passwordRaw = open("static/docs/mailpassword", "r")
app.config["password"] = passwordRaw.readlines()[0].replace("\n", "")
todoRaw.close()
randomRaw.close()
quoteRaw.close()
funRaw.close()
updatesRaw.close()
photobookRaw.close()
configRaw.close()
passwordRaw.close()
app.config["reloadTime"] = datetime.datetime.now()
print("Reloaded JSON's")
if not anyway:
if request.method == "POST":
if "test" in request.form:
print("bruh")
@app.route("/", methods=["GET", "POST"])
def homepage():
logConnection(request, "homepage");
diff = datetime.datetime.now() - datetime.datetime(2006, 3, 30)
error = ""
textinput = ""
TEXTLEN = app.config["config"]["Textlength"]
RATELIM = app.config["config"]["Ratelimit"]
if request.method == "POST":
textinput = request.form["textvalue"]
if "send" in request.form:
if (datetime.datetime.now() - app.config['msgTime']).seconds < RATELIM:
waitTime = RATELIM - ((datetime.datetime.now() - app.config['msgTime']).seconds)
error = f"Messages are rate limited. Please wait {waitTime} second{getMultiples(waitTime)} before trying again."
elif len(textinput) > TEXTLEN :
remChars = len(textinput) - TEXTLEN
error = f"Your text is too long. Trim by {remChars} char{getMultiples(remChars)}."
elif len(textinput) < 3:
error = "Too short lol"
else:
msg = open(f"messages/{datetime.datetime.now().strftime('%d.%m.%Y - %H:%M:%S')} : {request.remote_addr}", "w")
txt = f"IP: '{request.remote_addr}' with user-agent '{request.user_agent}' wrote:\n\n----------\n\n{textinput}\n\n--------\n\n"
msg.write(txt)
info = ""
try:
info = getIpInfo(request.remote_addr)
msg.write(str(info))
except:
None
msg.close();
s = smtplib.SMTP("mail.weingardt.dev", 587)
s.starttls()
s.login("messages", app.config["password"])
try:
s.sendmail("messages@weingardt.dev", "gabriel@weingardt.dev", f"Subject: NEW MESSAGE FUCKO\n\n{txt}\n\n{info}")
except:
s.sendmail("messages@weingardt.dev", "gabriel@weingardt.dev", f"Subject: NEW MESSAGE BUT KINDOF BROKEN\n\nIdk, failed to send mail but u got a message")
s.quit()
textinput = ""
error = "Message send!"
app.config['msgTime'] = datetime.datetime.now()
elif "clear" in request.form:
textinput = ""
error = ""
return render_template("home.html", style=generateStyle(), navbar=generateNavbar("Home"), footer=generateFooter(),
lol="nope", errorValue=error, textvalue=textinput, textlength=TEXTLEN, ageinsert=f"{int(diff.days / 30 / 12)}")
@app.route("/me")
def me():
logConnection(request, "me");
# Epic Birthday leak
diff = datetime.datetime.now() - datetime.datetime(2006, 3, 30)
return render_template("me.html", style=generateStyle(), navbar=generateNavbar("Me"), footer=generateFooter(),
ageinsert=f"{int(diff.days / 30 / 12)}",
funfact=app.config["fun"][randint(0, len(app.config["fun"])-1)])
@app.route("/photobook/<pagenr>")
def photobook(pagenr="0"):
def generateContent(index) -> str:
ret = ""
style = "photo"
if len(app.config["photobook"][index]) == 4:
style = app.config["photobook"][index][3]
for i in app.config["photobook"][index][2]:
ret += f'<a href="../images/photobook/{ i }"><img src="../images/photobook/{ i }" class="{style}" loading="lazy"></a>'
return ret
pagecarry = int(pagenr.split("&")[0])
nextDisabled = ""
previousDisabled = ""
if pagenr.find("++") != -1:
return redirect(url_for("photobook", pagenr=str(pagecarry + 1)))
elif pagenr.find("--") != -1:
return redirect(url_for("photobook", pagenr=str(pagecarry - 1)))
elif pagenr.find("rnd") != -1:
return redirect(url_for("photobook", pagenr=str(randint(0, int(((len(app.config["photobook"]) - 1 )/2)) ))))
logConnection(request, f"photobook/{pagecarry}")
if pagecarry < 1:
previousDisabled = "disabled"
if pagecarry >= (len(app.config["photobook"])/2) - 1:
nextDisabled = "disabled"
leftDate = ""
rightDate = ""
leftDesc = ""
rightDesc = ""
leftContent = ""
rightContent= ""
for i in range(pagecarry*2, (pagecarry*2)+2):
if i >= len(app.config["photobook"]):
break
if i % 2 == 0:
leftDate = app.config["photobook"][i][0]
leftDesc = app.config["photobook"][i][1]
leftContent = generateContent(i)
else:
rightDate = app.config["photobook"][i][0]
rightDesc = app.config["photobook"][i][1]
rightContent = generateContent(i)
return render_template("photobook.html", nextDisabled=nextDisabled, previousDisabled=previousDisabled,
pageLeftDate=leftDate, pageRightDate=rightDate,
pageLeftDesc=leftDesc, pageRightDesc=rightDesc,
contentLeftInsert=leftContent, contentRightInsert=rightContent)
@app.route("/photobook")
def photobook_redirect():
return redirect(url_for("photobook", pagenr="0"))
@app.route("/info")
def info():
logConnection(request, "info")
return render_template("info.html", style=generateStyle(), navbar=generateNavbar("Info"), footer=generateFooter())
@app.route("/ls7")
def ls7():
logConnection(request, "ls7.html")
return render_template("ls7.html")
@app.route("/projects")
def projects():
logConnection(request, "projects")
return render_template("projects.html", style=generateStyle(), navbar=generateNavbar("Projects"), footer=generateFooter())
@app.route("/posts")
def posts():
logConnection(request, "posts")
return render_template("posts.html", style=generateStyle(), navbar=generateNavbar("Posts"), footer=generateFooter())
@app.route("/misc")
def misc():
logConnection(request, "misc")
return render_template("misc.html", style=generateStyle(), navbar=generateNavbar("Misc"), footer=generateFooter())
@app.route("/lessons")
def lessons():
logConnection(request, "lessons")
return render_template("lessons.html", style=generateStyle(), randomQuote=app.config["quote"])
@app.route("/ssup")
def ssup():
logConnection(request, "ssup")
return render_template("ssup.html", style=generateStyle(), navbar=generateNavbar("Projects"), footer=generateFooter())
@app.route("/changestyle", methods=["GET","POST"])
def changeStyle():
resp = make_response("Set style cookie")
if request.method == "POST":
if "change" in request.form:
print(request.form["stylebox"])
#resp.set_cookie("style", request.form["stylebox"])
return resp
if __name__ == "__main__":
reload_jsons(True)
app.run(host="0.0.0.0")

BIN
static/buttons/cc-by-sa.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

BIN
static/buttons/f_ckfb.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 780 B

BIN
static/buttons/fftake.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
static/buttons/gitea.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 550 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

BIN
static/buttons/landchad.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
static/buttons/larbs.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

BIN
static/buttons/latex.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 457 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
static/buttons/nochrome.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
static/buttons/noweb3.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
static/buttons/ublock.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
static/buttons/vocaloid.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

BIN
static/buttons/vscodium.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 415 B

BIN
static/buttons/win10no.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

65
static/docs/config.json Normal file
View File

@@ -0,0 +1,65 @@
{
"Textlength": 512,
"Ratelimit": 30,
"navbar": [
["P", "🏠 Home", "homepage"],
["P", "🧍 Me", "me"],
["SEP"],
["P", "📸 Photobook", "photobook_redirect"],
["D", "🛠️ Projects", "projects"],
["D", "🪧 Misc", "misc"],
["SEP"],
["D", "📂 Git", "https://git.weingardt.dev/explore/repos"],
["P", " Website Info", "info"]
],
"buttons" : [
["CC BY-SA 4.0", "https://creativecommons.org/licenses/by-sa/4.0/", "cc-by-sa.png"],
["Right to repair", "", "right2repair.gif"],
["Made on Gnu/Linux", "https://www.gnu.org/home.en.html", "gnu-linux.gif"],
["Anything but Chrome", "https://librewolf.net/", "nochrome.png"],
["UBlock Origin Now!", "https://ublockorigin.com/", "ublock.png"],
["Latex!", "", "latex.gif"],
["Get a Website - Landchad", "https://landchad.net/", "landchad.gif"],
["Discord? No Way!", "", "discord-no-way.gif"],
["Noobuntu is Bloated!", "https://larbs.xyz/", "larbs.gif"],
["Take back the Web", "", "fftake.gif"],
["My Gitea", "https://git.weingardt.dev", "gitea.gif"]
],
"blacklist": [
"TECHOFF",
"Contabo",
"Charter",
"DigitalOcean",
"Censys",
"Tencent",
"Cyberzone",
"Amazon",
"Comcast",
"Oracle",
"CHINANET",
"province",
"China",
"Internet Utilities",
"Limited",
"EGIHosting",
"Henan Mobile Communications",
"Alibaba",
"Chongqing"
],
"altbuttons": [
["Made with VSCodium", "https://vscodium.com/", "vscodium.png"],
["Windows 10, NO", "", "win10no.gif"],
["No NFT's", "", "nftbutton.gif"],
["Internet Privacy Now!", "https://anonymousplanet.org/", "internetprivacy.gif"],
["Vocaloid Now!", "", "vocaloid.gif"],
["Encrypt Your Shit", "https://gitlab.com/cryptsetup/cryptsetup", "encryptyourshit.gif"],
["No Web 3!", "", "noweb3.gif"],
"https://tosdr.org",
["D", "📰 Posts", "posts"]
]
}

20
static/docs/funfacts.json Normal file
View File

@@ -0,0 +1,20 @@
{
"funfacts" : [
"I'm left handed!",
"I daily a 18 y/o laptop",
"In my head I think I'm special eventhough I'm not",
"When I'm bored at REDACTED, I program in PowerShell",
"I still use X11",
"I use a minidisk player. Fuck streaming services",
"I like public transport",
"I lost my sence of purpose xD",
"I write a diary",
"I prefer pen'n paper over something digital",
"I do electronics since I'm 14y/o",
"I hate social media",
"I don't watch porn",
"I want a cabin in the woods",
"Money doesn't make me happy",
"I hate mainstream media and mass entertainment and avoid it"
]
}

15
static/docs/lessons.json Normal file
View File

@@ -0,0 +1,15 @@
{
"lessons": [
["10.09.2025", "Clippies are a blessing"],
["06.09.2025", "Plan before cutting"],
["01.09.2025", "Don't loose your favorite pen :("],
["30.08.2025", "Imagination is evil"],
["25.08.2025", "Who would have guessed that eating hotpot also equals to a hotpot aftermath. Never. again"],
["22.08.2025", "Underpromisse and still underdeliver is a bad strategy"],
["21.08.2025", "As a child I was told I was a void pointer. As an adult I've come to realise that I'm actually a null pointer"],
["20.08.2025", "<img src='../images/headbang.gif' width='80' height='80'>"],
["19.08.2025", "Work is just daycare for adults"],
["14.08.2025", "Is there a cheatcode for infinite motivation? Some have found it, while I'm still searching"],
["13.08.2025", "Maybe don't be lazy '\\^^/'"]
]
}

143
static/docs/photobook.json Normal file
View File

@@ -0,0 +1,143 @@
{
"photobook": [
[ "18.09.2025", "Found some young <a href='https://en.wikipedia.org/wiki/Fomitopsis_betulina'>birch polypore</a> and made tea out of those. This mushroom is full of vital substances and can even be consumed raw when young and squishy. The tea tastet very spicy, but only when it's hot, as soon as it cools down it wasn't as spicy.",
[ "mushrooms/staeublinge.jpeg", "mushrooms/birken_porling_tea.jpeg"]
],
[ "13.09.2025", "",
[ "misc/tree-love.jpeg" ], "dontSquish"
],
[ "07.09.2025", "Butterairplane",
[ "misc/butterfly.jpeg" ], "dontSquish"
],
[ "30.08.2025", "<a href='https://inv.nadeko.net/watch?v=gChOifUJZMc'>Autobahn</a>",
[ "misc/autobahn.png" ], "dontSquish"
],
[ "24.08.2025", "Gamescom. PRAY!",
[ "misc/gamescom2025.jpg", "misc/gamescom2025_enderpray.jpg",
"misc/gamescom2025_pray.jpg", "misc/gamescom2025_stab.jpg" ]
],
[ "23.08.2025", "My try on a 3D renderer with triangles written in plain C. It's shit lol. Still have to implement depth and the camera.",
[ "projects/3drenderer.jpg" ], "dontSquish"
],
[ "17.08.2025", "Went again with my mum. Found alot of Hexenröhrlinge, Perlpilze and Frauentäublinge. Seems my odds with women aren't all that bad.",
[ "mushrooms/mushrooms3.jpg" ], "dontSquish"
],
[ "16.08.2025", "Wanted to collect mushrooms on my own. Found a rare one called 'Eichhase'<br>It's apparently good against lung cancer and leuchemia and one can also eat is raw. I choose to dry mine. But yes some of the others look dry. Hasn't rained in a few days.",
[ "mushrooms/mushrooms2.jpg", "mushrooms/mushrooms2_dried.jpg",
"misc/rodina1.jpg", "misc/rodina2.jpg" ]
],
[ "12.08.2025", "Found almost 2kg's of Steinpilze with ma mum. Hehe dried them all ;)",
[ "mushrooms/mushrooms1.jpg", "mushrooms/mushrooms1_dried.jpg" ]
],
[ "10.08.2025", "Wandern on the Rhine with cool friends",
[ "wandern/mirror_pic.jpg", "wandern/pain_in_feet_help.jpg",
"wandern/marching.jpg", "wandern/cool_selfie.jpg" ]
],
[ "10.08.2025", "",
[ "wandern/rail_shot.jpg", "wandern/parasol_grilled.jpg",
"wandern/bonfire.jpg", "wandern/rhein.jpg" ]
],
[ "24.07.2025", "Wow this all Denmark got to offer :( ?<br>(I really tried my best lol) But idc, ate him anyway.",
[ "misc/denmark_fish.jpg" ], "dontSquish"
],
[ "16.07.2025", "Trip round the hood. I like the old syrup bottle :D",
[ "weida/inside_long_exposure.jpg", "weida/outside.jpg",
"weida/lift.jpg", "weida/cool_wall.jpg",
"weida/river.jpg", "weida/sirup.jpg" ]
],
[ "16.07.2025", "Just a ink factory chilling there. <br>Closed ~1988",
[ "ink-factory/sacrifice_wtf.jpg", "ink-factory/inside.jpg", "ink-factory/chimney_tree.jpg",
"ink-factory/outside.jpg", "ink-factory/upstairs.jpg", "ink-factory/docs.jpg"
]
],
[ "15.07.2025", "Rittergut in Gera. An old porzellan factory <br>Close date idk",
[ "rittergut/ddr_sign.jpg", "rittergut/karl_marx_sign.jpg",
"rittergut/outside.jpg", "rittergut/kitchen.jpg"
]
],
[ "15.07.2025", "Always wanted to eat breakfast in school",
[ "misc/school_breakfast.jpg" ], "dontSquish"
],
[ "14.07.2024", "Now look what we found. An original UDSSR cigarette pack, but without content ofc xD",
[ "russian-factory/udssr_ciggs_front.jpg", "russian-factory/udssr_ciggs_bottom.jpg" ]
],
[ "14.07.2025", "Russian factory again :D (this time with food and a proper camera). <br>Closed ~1991",
[ "russian-factory/house.jpg", "russian-factory/roofview.jpg", "russian-factory/grownroom.jpg",
"russian-factory/where_floor.jpg", "russian-factory/cooking.jpg", "russian-factory/food.jpg"
]
],
[ "13.07.2025", "Railroad adventures",
[ "misc/railroad-1.jpg", "misc/railroad-2.jpg" ],
"dontSquish"
],
[ "11.07.2025", "Sleeping outside is like therapy<br>(Wtf, since when got ticks this fucking small?)",
[ "camping/camping2.jpeg", "camping/cool_tree.jpeg",
"camping/morning.jpeg", "camping/tick.jpeg" ]
],
[ "08.07.2025", "Thinkpad Folterbank (last photo before it's neck broke)",
[ "projects/thinkpad_folterbank.jpg" ], "dontSquish"
],
[ "03.07.2025", "Hehe random abandoned Russian factory",
[ "russian-factory/basement.jpeg", "russian-factory/plant_room.jpeg",
"russian-factory/rooftop_view.png", "russian-factory/pinwall.png"]
],
[ "29.06.2025", "Cool dude, recommend u visit him ;)",
[ "misc/cool_dude.jpg" ], "dontSquish"
],
[ "23.06.2025", "Sad day.<br>Hopefully things get better",
[ "misc/white_elster.jpeg", "misc/bridge.jpeg" ]
],
[ "21.06.2025", "Boy does it feel good to be home again",
[ "misc/cherry-tree.jpeg", "misc/home.jpeg" ]
],
[ "10.06.2025", "If you dig hard enough, you also may end up finding a Commodore PET in your school :)",
[ "misc/pet.jpeg" ], "dontSquish"
],
[ "09.06.2025", "Don't enjoy the things one used to enjoy? Then do the things you don't enjoy: Jogging",
[ "me/walk.jpeg" ], "dontSquish"
],
[ "07.06.2025", "Camping!",
[ "camping/camping.jpeg" ], "dontSquish"
],
[ "03.06.2025", "One of my most favorite dishes: Stroganov with Buckwheat.<br>A Russian classic fit to my liking.",
[ "misc/stroganov.jpeg" ], "dontSquish"
],
[ "12.05.2025", "Thuringa in May.<br>A very beautiful view and sad day.",
[ "misc/gera.jpeg" ], "dontSquish"
],
[ "06.04.2025", "LS7 computer rev. 2 PCB<br>This was a weeks worth of just PCB drawing. Will order that shit in a week or so.",
[ "projects/ls7computer_raytraced1.png", "projects/ls7computer_raytraced2.png" ] ,
"dontSquish"
],
[ "02.04.2025", "Don't mind me, just recording my Minidisks",
[ "misc/minidisk.jpeg" ], "dontSquish"
],
[ "20.03.2025", "Forg!",
[ "misc/forg.jpeg" ], "dontSquish"
],
[ "09.03.2025", "LS7 Wozmon! (and secret plans for the future)",
[ "projects/ls7_wozmon.jpeg" ], "dontSquish"
],
[ "17.02.2025", "Look what ma (not so anymore) girlfriend made for me!",
[ "misc/tux_plush.jpeg" ], "dontSquish"
],
[ "14.02.2025", "Casually testing my kernel in school",
[ "projects/kernel_testing_in_school.jpeg" ], "dontSquish"
],
[ "12.01.2025", "",
[ "misc/me_workplace.jpeg" ], "dontSquish"
],
[ "26.12.2024", "Testing the new video card design. Got it down from 26 to 25 chips!",
[ "projects/video_card_testing.jpeg" ], "dontSquish"
],
[ "03.12.2024", "Ooooh yes, finally left Arch for good. Finally installed gentoo on my Thinkpad X61t, just how it's meant to be.",
[ "misc/gentoo_thinkpad_x61t.jpeg" ], "dontSquish"
],
[ "20.11.2024", "Server Love",
[ "me/server_love.jpeg" ], "dontSquish"
],
[ "19.11.2024", "All my beloved ThinkPads ;)",
[ "misc/all_my_thinkpads.jpg" ], "dontSquish"
]
]
}

42
static/docs/random.json Normal file
View File

@@ -0,0 +1,42 @@
{
"rnd" : [
"<marquee><h1>SHIT</h1></marquee>",
"This is random",
"<img src='/buttons/slowuserbox.png'>",
"<img src='/images/pixels.png'>",
"<img src='/images/4get.png'><br><a href='https://4get.weingardt.dev/'>4GET! EVERYTHING</a>",
"<img src='/images/hittingfloor.gif'>",
"<img src='/images/keep_seeding.gif'>",
"I'm just a arkward little person wandering back and forth",
"Gentoo love",
"Lucky you",
"This site is always under construction",
"What the fuck is wrong with me?",
"Will someone ever read this?",
"Orphelins are underrated 🍀",
"I hate HTML+CSS",
"<img src='/images/texture.png'>",
"<img src='/images/crybitch.jpg'>",
"<img src='/images/programming_affection.png'>",
"<img src='/images/stallman_floor_absolute_proprietary.png'>",
"<img src='/images/stallman_gets_bitches.png'>",
"<img src='/images/stallman_pls_respond.png'>",
"<img src='/images/stallman_shooting_you.png'>",
"<img src='/images/what_humans_were_made_to_do.png'>",
"<img src='/images/wojak_apple_consoomer.png'>",
"<img src='/images/wojak_hates_paper_money.png'>",
"<img src='/images/bash.webp'>",
"1337",
"<a href='https://dimden.dev/'>👉 ^ dimden.dev ^ 👈</a>",
"Fuck YouTube <a href='https://inv.nadeko.net/'>inv.nadeko.net</a>",
"<img src='/images/morrita.gif'>",
"<img src='/images/4evar.gif'>",
"LOLCAT HAS MY GIF ON HIS SITE!!"
],
"alt": [
""
]
}

24
static/docs/todo.json Normal file
View File

@@ -0,0 +1,24 @@
{
"comment": [
"0 = NOT",
"1 = CHECKED",
"s = Striketrough"
],
"todo" : [
["1", "Get this shit Online"],
["0", "Finish this Website"],
["1", "Rework Photobook"],
["s", "Re-Add styles with cookies"],
["0", "Video about LS7 Computer"],
["0", "Build ma beloved 6502 phone"],
["0", "Build a simple wrist watch"],
["0", "Get a drivers license lol"],
["0", "Code a somewhat usable 3D renderer"],
["0", "Write docs for LS7 Computer 😭"],
["0", "Build LS7 Laptop"],
["0", "Finish LS7 Kernel (IKARUS)"],
["0", "Get a girlfriend lol"]
]
}

11
static/docs/updates.json Normal file
View File

@@ -0,0 +1,11 @@
{
"updates" : [
["21.09.2025", "Finally fixed my mail server and last updated label"],
["13.09.2025", "privatebin instance now online on https://bin.weingardt.dev/"],
["05.09.2025", "4get instance now has https"],
["01.09.2025", "Fixed shitty spelling"],
["29.08.2025", "Migrated to a new Server and got this shit online!"],
["19.08.2025", "Photobook got reworked :)"],
["14.08.2025", "Website got completly rewritten and doesn't use JavaScript anymore!"]
]
}

BIN
static/fonts/FreePixel.ttf Normal file

Binary file not shown.

29
static/robots.txt Executable file
View File

@@ -0,0 +1,29 @@
# When the robots.txt is sus
# ⠀⠀⠀⡯⡯⡾⠝⠘⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢊⠘⡮⣣⠪⠢⡑⡌
# ⠀⠀⠀⠟⠝⠈⠀⠀⠀⠡⠀⠠⢈⠠⢐⢠⢂⢔⣐⢄⡂⢔⠀⡁⢉⠸⢨⢑⠕⡌
# ⠀⠀⡀⠁⠀⠀⠀⡀⢂⠡⠈⡔⣕⢮⣳⢯⣿⣻⣟⣯⣯⢷⣫⣆⡂⠀⠀⢐⠑⡌
# ⢀⠠⠐⠈⠀⢀⢂⠢⡂⠕⡁⣝⢮⣳⢽⡽⣾⣻⣿⣯⡯⣟⣞⢾⢜⢆⠀⡀⠀⠪
# ⣬⠂⠀⠀⢀⢂⢪⠨⢂⠥⣺⡪⣗⢗⣽⢽⡯⣿⣽⣷⢿⡽⡾⡽⣝⢎⠀⠀⠀⢡
# ⣿⠀⠀⠀⢂⠢⢂⢥⢱⡹⣪⢞⡵⣻⡪⡯⡯⣟⡾⣿⣻⡽⣯⡻⣪⠧⠑⠀⠁⢐
# ⣿⠀⠀⠀⠢⢑⠠⠑⠕⡝⡎⡗⡝⡎⣞⢽⡹⣕⢯⢻⠹⡹⢚⠝⡷⡽⡨⠀⠀⢔
# ⣿⡯⠀⢈⠈⢄⠂⠂⠐⠀⠌⠠⢑⠱⡱⡱⡑⢔⠁⠀⡀⠐⠐⠐⡡⡹⣪⠀⠀⢘
# ⣿⣽⠀⡀⡊⠀⠐⠨⠈⡁⠂⢈⠠⡱⡽⣷⡑⠁⠠⠑⠀⢉⢇⣤⢘⣪⢽⠀⢌⢎
# ⣿⢾⠀⢌⠌⠀⡁⠢⠂⠐⡀⠀⢀⢳⢽⣽⡺⣨⢄⣑⢉⢃⢭⡲⣕⡭⣹⠠⢐⢗
# ⣿⡗⠀⠢⠡⡱⡸⣔⢵⢱⢸⠈⠀⡪⣳⣳⢹⢜⡵⣱⢱⡱⣳⡹⣵⣻⢔⢅⢬⡷
# ⣷⡇⡂⠡⡑⢕⢕⠕⡑⠡⢂⢊⢐⢕⡝⡮⡧⡳⣝⢴⡐⣁⠃⡫⡒⣕⢏⡮⣷⡟
# ⣷⣻⣅⠑⢌⠢⠁⢐⠠⠑⡐⠐⠌⡪⠮⡫⠪⡪⡪⣺⢸⠰⠡⠠⠐⢱⠨⡪⡪⡰
# ⣯⢷⣟⣇⡂⡂⡌⡀⠀⠁⡂⠅⠂⠀⡑⡄⢇⠇⢝⡨⡠⡁⢐⠠⢀⢪⡐⡜⡪⡊
# ⣿⢽⡾⢹⡄⠕⡅⢇⠂⠑⣴⡬⣬⣬⣆⢮⣦⣷⣵⣷⡗⢃⢮⠱⡸⢰⢱⢸⢨⢌
# ⣯⢯⣟⠸⣳⡅⠜⠔⡌⡐⠈⠻⠟⣿⢿⣿⣿⠿⡻⣃⠢⣱⡳⡱⡩⢢⠣⡃⠢⠁
# ⡯⣟⣞⡇⡿⣽⡪⡘⡰⠨⢐⢀⠢⢢⢄⢤⣰⠼⡾⢕⢕⡵⣝⠎⢌⢪⠪⡘⡌⠀
# ⡯⣳⠯⠚⢊⠡⡂⢂⠨⠊⠔⡑⠬⡸⣘⢬⢪⣪⡺⡼⣕⢯⢞⢕⢝⠎⢻⢼⣀⠀
# ⠁⡂⠔⡁⡢⠣⢀⠢⠀⠅⠱⡐⡱⡘⡔⡕⡕⣲⡹⣎⡮⡏⡑⢜⢼⡱⢩⣗⣯⣟
# ⢀⢂⢑⠀⡂⡃⠅⠊⢄⢑⠠⠑⢕⢕⢝⢮⢺⢕⢟⢮⢊⢢⢱⢄⠃⣇⣞⢞⣞⢾
# ⢀⠢⡑⡀⢂⢊⠠⠁⡂⡐⠀⠅⡈⠪⠪⠪⠣⠫⠑⡁⢔⠕⣜⣜⢦⡰⡎⡯⡾⡽
User-agent: *
Disallow: /me
Disallow: /info
Disallow: /*
host: weingardt.dev

13
static/styles/misc.css Normal file
View File

@@ -0,0 +1,13 @@
.misc_button{
width: 100px;
background: gray;
text-align: center;
border: black;
border-top-style: none;
border-right-style: none;
border-bottom-style: none;
border-left-style: none;
border-style: outset;
}

64
static/styles/nav.css Normal file
View File

@@ -0,0 +1,64 @@
nav{
height:40px;
position:inherit;
top:0;
z-index:1;
text-align: center;
display: grid;
}
.nav{
display:flex;
justify-content:center;
align-items:center;
min-height:32px;
background:none;
text-decoration:none;
cursor:pointer;
float:left;
clear:left;
text-align:center;
font-size: var(--font-size);
width:100%;
margin:0 0 10px 0;
background-color: var(--main-color);
color:var(--main-fg-color);
text-decoration-color:#d4d4d4;
border-color: #000000;
border-width: var(--button-border-width);
border-style: var(--button-border-style);
}
.navSep {
width: 100%;
float:left;
margin-bottom: 20px;
background-color: var(--main-title-fg-color);
border-color: var(--main-title-fg-color);
}
.selected-nav {
border-style: var(--button-selected-style);
background-color: var(--main-bg-color);
color: var(--main-title-fg-color);
}
.disabled-nav {
color: gray;
cursor: default;
}

220
static/styles/newstyle.css Normal file
View File

@@ -0,0 +1,220 @@
* {
box-sizing:border-box
}
@font-face {
font-family: FreePixel;
font-style: normal;
font-weight: 400;
src: url("/fonts/FreePixel.ttf");
}
body {
/*font-family: "FreePixel";
* font-size:16px;*/
font-family: var(--font-family);
font-size: var(--font-size);
color:var(--main-fg-color);
background-image: /*url(../images/light.png)*/var(--background-image);
background-repeat: repeat-x;
background-color: var(--main-bg-end-color);
background-position: left top;
padding-bottom:26px;
text-rendering: optimizelegibility;
text-shadow: rgba(0,0,0,.01) 0 0 1px;
}
main{
width: 75%;
margin-left: auto;
margin-right: auto;
}
.content,#footnote{
min-height: calc(80vh - 200px);
border-style: solid;
border-width: 1px;
background: var(--main-color);
padding: 10px 10px 10px 10px;
.titlebar {
margin: -10px -10px 0 -10px;
background: var(--main-bg-color);
color: var(--main-title-fg-color);
padding: 5px 5px 5px 10px;
margin-bottom: 10px;
text-align: var(--title-align);
border-style: var(--border-style);
border-width: var(--border-width);
}
}
.fit,#footnote{
min-height: fit-content;
}
.smol{
max-height: 200px;
div{
overflow: auto;
max-height: 150px;
}
}
footer{
height:fit-content;
background-color: var(--main-color);
color: var(--main-fg-color);
display:flex;
padding:0 10px;
align-items:center;
overflow-x:hidden;
position:fixed;
font-family: "FreePixel";
bottom:0;
width:100%
}
#footnote{
margin-bottom: 20px;
height: max-content;
border-style: solid;
border-width: 1px;
padding: 10px 10px 10px 10px;
margin-right: auto;
margin-left: auto;
background-color: var(--main-color);
}
#gif{
margin-left: auto;
margin-right: auto;
align-items: center;
scale: 100%;
display:flex;
flex-wrap:wrap;
justify-content:center;
gap:10px;
margin-bottom: 40px;
}
.text-center{
text-align:center;
display: block;
width: max-content;
margin-left: auto;
margin-right: auto;
}
.columnsplitter{
display: grid;
columns: 2;
grid-template-columns: auto 300px;
column-gap: 20px;
}
.singlecolumn{
grid-template-columns: auto;
}
.rowsplitter{
display: grid;
columns: 1;
row-gap: 20px;
}
.chatbox{
margin-top: 10px;
textarea {
font-family: "FreePixel";
resize: none;
}
input{
border-style: solid;
border-width: 1px;
border-color: black;
}
}
.info {
background-color: red;
color: var(--main-bg-color);
}
.tworowtext {
dl dt{
float:left;
clear:left;
text-align:right;
width:130px;
font-weight:700
}
dl dd{
margin-left:calc(130px + 20px)
}
}
.button-container{
display:flex;
flex-wrap:wrap;
justify-content:center;
gap:20px;
margin-bottom: 20px;
}
.squeeze{
width: auto;
img{
width: 100%;
image-rendering: optimizespeed;
}
}
.leftpad{
float: right;
}
.list-left{
ul{
text-align: left;
list-style: disclosure-closed;
list-style-position: inside;
padding-left: 0px;
}
}
.centered{
margin-left: auto;
margin-right: auto;
width: fit-content;
}
.rndText {
}

127
static/styles/photobook.css Normal file
View File

@@ -0,0 +1,127 @@
* {
box-sizing:border-box
}
body {
min-height: 100vh;
background-image: url(../images/gera_landschaft.jpeg);
background-size: cover;
display: flex;
}
main{
margin: auto;
}
.paper{
width: 100%;
position: relative;
#background {
width: 100%;
border-width: 1px;
border-style: solid;
border-color: black;
z-index: 0;
position: relative;
@media (min-width: 1080px){
zoom: 1.8;
}
@media (min-width: 720px){
zoom: 1.3;
}
}
}
.controlbox{
display: flex;
top: 0;
position: absolute;
padding: 20px;
width: 100%;
height: 20px;
z-index: 1;
a{
border-style: outset;
height: fit-content;
background-color: #80808045;
padding-right: 5px;
padding-left: 5px;
border-width: 2px;
color: black;
text-decoration: none;
}
.disabled{
color: gray;
cursor: not-allowed;
}
.padding{
margin-left: auto;
margin-right: auto;
}
}
.page{
display: grid;
position: absolute;
top: 0px;
width: 50%;
height: 100%;
padding: 20px 20px 0px 20px;
.content{
margin-top: 30px;
overflow-y: auto;
img {
border-style: solid;
border-width: 2px;
border-color: black;
}
}
.infocontainer{
bottom: 0;
width: 100%;
padding: 0 20px 0 0px;
.description{
}
.date{
font-style: italic;
text-decoration: underline;
text-align: right;
}
}
}
.right{
left: 50%;
}
.photo{
width: 48%;
margin: 1%;
}
.dontSquish{
width: 100%;
}

548
static/styles/style.css Normal file
View File

@@ -0,0 +1,548 @@
* {
box-sizing:border-box
}
body {
/*font-family: "FreePixel";
font-size:16px;*/
font-family: var(--font-family);
font-style: 13px/1.231;
font-size: var(--font-size);
color:var(--main-fg-color);
background-image: var(--background-image);
background-repeat: repeat-x;
background-color: var(--main-bg-end-color);
background-position: left top;
margin:0;
padding-bottom:26px;
text-rendering: optimizelegibility;
text-shadow: rgba(0,0,0,.01) 0 0 1px;
}
.linespan{
display: flex;
clear: both;
justify-content: center;
}
.linebutton{
display:flex;
justify-content:center;
align-items:center;
min-height:48px;
cursor:pointer;
float:left;
text-align:center;
color: var(--main-fg-color);
font-size: var(--font-size);
box-sizing: border-box;
width:40%;
margin:0 10px 10px 0;
background-color: var(--main-bg-color);
border-style: var(--button-border-style);
border-width: var(--button-border-width);
border-color: #000000;
text-decoration-color:#d4d4d4;
color:var(--main-fg-color);
text-decoration:none;
}
nav{
height:40px;
position:inherit;
top:0;
z-index:1;
text-align: center;
display: grid;
margin-top: 20px;
}
.nav{
display:flex;
justify-content:center;
align-items:center;
min-height:32px;
background:none;
text-decoration:none;
cursor:pointer;
float:left;
clear:left;
text-align:center;
margin-right: 20px;
margin-top: 10px;
color: var(--main-fg-color);
font-size: var(--font-size);
}
.navSep {
width: 100%;
float:left;
margin-bottom: 20px;
background-color: var(--main-title-fg-color);
border-color: var(--main-title-fg-color);
}
main{
width:100%;
min-height:calc(100vh - 60px - 26px);
overflow-x:hidden;
padding:20px 20px;
}
.content,#footnote{
min-height: calc(80vh - 200px);
border-style: solid;
border-width: 1px;
background: var(--main-color);
margin-bottom: 10px;
padding: 10px 10px 10px 10px;
.titlebar {
margin: -10px -10px 0 -10px;
background: var(--main-bg-color);
color: var(--main-title-fg-color);
padding: 5px 5px 5px 10px;
margin-bottom: 10px;
text-align: var(--title-align);
border-style: var(--border-style);
border-width: var(--border-width);
}
}
.fit,#footnote{
min-height: fit-content;
}
.smol{
max-height: 200px;
div{
overflow: auto;
max-height: 150px;
}
}
.inline{
img{
width: 200px;
float: right;
}
}
div>.inline{
min-height: 200px;
}
footer{
height:fit-content;
background-color: var(--main-color);
color: var(--main-fg-color);
display:flex;
padding:0 10px;
align-items:center;
overflow-x:hidden;
position:fixed;
font-family: "FreePixel";
bottom:0;
width:100%
}
#footnote{
margin-bottom: 20px;
height: max-content;
border-style: solid;
border-width: 1px;
padding: 10px 10px 10px 10px;
margin-right: auto;
margin-left: auto;
background-color: var(--main-color);
}
#gif{
margin-left: auto;
margin-right: auto;
align-items: center;
scale: 100%;
display:flex;
flex-wrap:wrap;
justify-content:center;
gap:10px;
margin-bottom: 40px;
}
@font-face {
font-family: FreePixel;
font-style: normal;
font-weight: 400;
src: url("../src/FreePixel.ttf");
}
@media (max-width: 576px) {
.nav::before,.nav::after{
content: "/";
}
.navSep {
scale: 0%;
}
.selected-nav{
text-decoration-color: var(--main-fg-color);
text-decoration-line: underline;
}
nav{
position: inherit;
width: 100%;
height: fit-content;
overflow: scroll;
display: flex;
margin-left :calc(576px - 80px * 2);
}
.nav{
white-space: nowrap;
font-size: 12px;
margin-right: 10px;
}
}
@media (min-width: 576px){
nav{
width:250px;
position:absolute;
height:auto;
margin-left :calc(992px - 80px * 2);
}
.nav{
width:100%;
margin:0 0 10px 0;
background-color: var(--main-color);
color:var(--main-fg-color);
text-decoration-color:#d4d4d4;
border-style: solid;
border-width: 1px;
border-color: #000000;
border-width: var(--button-border-width);
border-style: var(--button-border-style);
}
main{
width:calc(576px - 80px);
max-width:100vw;
min-height:calc(100vh - 26px);
}
.selected-nav {
border-style: var(--button-selected-style);
background-color: var(--main-bg-color);
color: var(--main-title-fg-color);
}
}
@media (min-width: 768px){
body{
padding-left:calc((100vw - 768px - 200px)*.5)
}
main{
width:calc(768px - 80px * 2)
}
footer{
margin-left:calc((100vw - 768px - 200px)*-.5)
}
}
@media (min-width: 992px){
body{
padding-left:calc((100vw - 992px - 50px)*.5)
}
main{
width:calc(992px - 80px * 2)
}
footer{
margin-left:calc((100vw - 992px - 200px)*-.5)
}
}
div.button-container{
display:flex;
flex-wrap:wrap;
justify-content:center;
gap:20px;
margin-bottom: 10px;
}
div.contact-text{
margin-left:calc(130px + 20px)
}
.license-img{
height:31px;
width:88px;
}
.construction-img{
margin-left:auto;
margin-right:auto;
margin-bottom:20px;
display:block;
width: 80%;
}
.smaltext{
font-size: xx-small;
text-align:center
}
.image-rounded{
border-radius:50%;
}
.text-center{
text-align:center;
display: block;
width: max-content;
margin-left: auto;
margin-right: auto;
}
.margin-list{
li {
margin-bottom: 10px;
}
}
dl dt{
float:left;
clear:left;
text-align:right;
width:130px;
font-weight:700
}
dl dd{
margin-left:calc(130px + 20px)
}
.inline-icon{
display:flex;
flex-wrap:wrap;
justify-content:left;
gap:10px;
}
.section-header{
display:flex;
justify-content:space-between;
align-items:center
}
.post-footer{
display:flex;
justify-content:right;
align-items:center
}
.post-footer>p{
margin:0 5%
}
p.info{
font-size:.8rem;
margin-top:5px
}
span {
display: block ruby;
font-size: small;
}
.info {
background-color: red;
color: var(--main-bg-color);
}
p.info span{
display:block;
margin-right:20px;
}
p.info span i{
margin-right:.5em
}
@media (min-width: 768px){
p.info span{
display:inline
}
}
h1,h2,h3,h4,h5,h6{
margin:20px 0
}
h1+p.info,h2+p.info,h3+p.info,h4+p.info,h5+p.info,h6+p.info{
margin-top:-15px;
margin-bottom:20px
}
code,pre{
font-size:.875em;
font-family: "FreePixel";
font-feature-settings:"calt" 1;
font-variant-ligatures:normal;
border-color:var(--main-fg-color);
border-style:solid;
border-radius:3px;
background-color: var(--main-bg-end-color-color);
color: var(--main-fg-color);
}
code{
border-width:1px 0
}
pre{
border-width:1px;
overflow-x:auto;
padding:4px 2px
}
.nobr {
white-space: nowrap;
white-space-collapse: nowrap;
}
pre>code{
border-width:0
}
h1 code,h2 code,h3 code,h4 code,h5 code,h6 code{
border-width:0
}
.form-group{
padding:5px 0
}
.form-group>label{
display:block;
font-size:14px
}
.form-group>.error{
color:red;
font-size:14px
}
input{
width:100%;
padding-top:2px
}
.right-div{
width: fit-content;
text-align: left;
margin-left: auto;
margin-right: 0;
h2{
text-align: right;
}
a.right-div{
text-align: right;
display: block;
}
}
.postlist {
margin-top: 20px;
a {
font-size: 15px;
}
ul {
list-style-type: none;
}
li {
margin-bottom: 20px;
font-size: 10px;
}
}
.prefSpan{
display: block;
}
a {
color: #0066cc;
}
.floating {
background: var(--optional-link-background);
}
.buttonToggle {
width: fit-content;
}
.styleSelector {
float:right;
display: flex;
align-items: center;
}

20
static/styles/theme.css Normal file
View File

@@ -0,0 +1,20 @@
:root {
--main-bg-color: "#fed6af";
--main-bg-end-color: "#ffffee";
--main-color: "#ffffff";
--main-fg-color: "#800000";
--main-title-fg-color: "#800000";
--title-align: left;
--border-style: solid;
--border-width: 0px;
--button-border-width: 1px;
--button-border-style: solid;
--button-selected-style: ridge;
--optional-link-background: #00000000;
--font-family: "Arial, Helvetica, sans-serif";
--font-size: 13px;
}

98
templates/home.html Normal file
View File

@@ -0,0 +1,98 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no">
{{style | safe}}
<link rel="stylesheet" href="/styles/newstyle.css">
<link rel="stylesheet" href="/styles/nav.css">
<title>Gabriel's personal website</title>
</head>
<body>
<main>
<form method="POST">
<div class="columnsplitter">
<div class="rowsplitter">
<div id="home" class="content fit">
<h2 class="titlebar">🏠 <a href="https://www.weingardt.dev/">Weingardt.dev</a> - Home</h2>
<p>
A visitor! It appears you have found my website (I wonder how...)<br><br>
I'm Gabriel, a {{ ageinsert }} year old student from Germany 🇩🇪.<br>
I mainly do programming and computer stuff. See my /<s><a>projects</a></s>/ if u wanna learn more.<br>
You'll find more about me on <a href="{{ url_for('me') }}">/me/</a>
<br><br>
Also see <s><a>this</a></s>, one of my greatest projects (as of yet).
A homebrew computer I developed over the last three years.
Note, this projects is still ongoing and stuff is always changing.
<br><br>
Feel free to browse this little site.
There is more to this site than this page!<br>
(Refreshing the page also does some magic)
</p>
<p class="text-center">
<br><br>
<marquee><h2>Still under reconstruction!&emsp;&emsp;&emsp;&emsp;&emsp; IM LAZY AS FUCK</h2></marquee>
<br>
Regardless, thank you for taking a look at my little corner of the internet, and I hope you enjoy your visit.
</p>
<br><br><br>
<p>
Due to my <i>lazy as fuck</i> state, I can't get behind my own shit.
Including making a tutorial and page for all the LS7 stuff.
<br>
So if you're lookin for any of that, here ya go with the
<a href="https://www.weingardt.dev/ls7schematic.pdf">schematics</a>,
<a href="https://www.weingardt.dev/ls7pcb.pdf">pcb</a> and
<a href="https://www.weingardt.dev/ls7files.zip">KiCad files</a>.
<br>
All this shit is licensed under <a href="https://creativecommons.org/licenses/by-sa/4.0/">CC BY-SA</a>.
</p>
</div>
<!--div class="content fit">
<h2 class="titlebar">🎯 Stuff you maybe interested in</h2>
<a href="{{ url_for('ssup') }}">SSUP</a>
</div-->
<div class="content fit">
<h2 class="titlebar" id="Wannasaysomething">🗯️ Wanna say something to me?</h2>
Wanna say something? Do it. No need for a stupid registration, you can do so anonymously.
Your messages are only visible to me. Not to any other users of this site.
<br>
Messages are limited to {{textlength}} characters.
To avoid spamming, a message can only be send every 30 seconds.
This applies to all simuntanious users of the site. Don't be an asshole.
<br><br>
This is one way communication. I have no way of contacting you back, so if you want that
please provide an adiquate solution lol.
<br><br>
<div class="chatbox">
<textarea rows="8" cols="60" name="textvalue" placeholder="Message (max {{textlength}} characters)">{{ textvalue }}</textarea>
<div>
<input type="submit" name="send" value="Submit">
<input type="submit" name="clear" value="Clear">
</div>
</div>
<p>{{ errorValue }}</p>
</div>
{{footer | safe}}
</div>
{{navbar | safe}}
</div>
</form>
</main>
</body>
</html>

59
templates/info.html Normal file
View File

@@ -0,0 +1,59 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no">
{{style | safe}}
<link rel="stylesheet" href="/styles/newstyle.css">
<link rel="stylesheet" href="/styles/nav.css">
<title>Website info</title>
</head>
<body>
<main>
<div class="columnsplitter">
<div class="rowsplitter">
<div class="content fit">
<h2 class="titlebar"> Website Info</h2>
This wonderful website was made my <i>me</i>.<br><br>
This site doesn't use JavaScript.
The site uses Python Flask for it's backend to serve rendered HTML files.
</div>
<div class="content fit">
<h2 class="titlebar">⚖️ Legal</h2>
If you wish to <a href="../contact">contact</a> me, or have any concerns about potential copyright infringement or similar, please
do here: <a href="mailto:legal@weingardt.dev">legal@weingardt.dev</a>
<br><br><hr><br>
The <u>content</u> of this website is licensed under the CC BY-SA 4.0 license, which gives you the unrestricted freedom to <u>share</u> and <u>modify</u>
copies of this website. You are even allowed to do so commercially.<br><br>
<b>But under the following terms:</b><br>
You have to give credit to me, <b>indicate if changes were made</b> and license the material under the same license.<br><br>
If you want to base your work of of mine, I suggest you to <a href="https://creativecommons.org/licenses/by-sa/4.0/">read the license</a>.<br><br>
</div>
<div class="content fit">
<h2 class="titlebar">💾 Website Source Code</h2>
All the source code is readily available on my Gitea instance <a href="https://git.weingardt.dev/0xmac/Website">here</a>.<br>
If issues occur, you want something added or something else, this is the place to make issues and pull requests.
</div>
<div class="content fit">
<h2 class="titlebar">📑 Logging</h2>
This website logs your visit with the information you give every website you visit,
like your IP-Adress and User Agent. This is just stored for me to see if anyone actually visits this
site. This data is not shared with anyone or anything or any third or second parties.
</div>
<div class="content fit">
<h2 class="titlebar">🖼️ 88x31 Buttons</h2>
Some of the cool 88x31 buttons, located in the footer are from <a href="https://www.deadnet.se/88x31/index.html">www.deadnet.se</a>,<br>
while some others I've yanked from other websites :P
</div>
{{footer | safe}}
</div>
{{navbar | safe}}
</div>
</main>
</body>
</html>

View File

@@ -0,0 +1,18 @@
<div class="content fit">
<h2 class="titlebar">🚧 Footer</h2>
<p class="text-center">I'm so sorry if you're viewing this shit on a phone</p>
<div class="centered"><img src="/images/under_construction_bar.gif"></div>
<div class="button-container">
{%for i in buttons%}
<a {% if i[1] != "": %} href="{{i[1]}}" {% endif %} ><img src="/buttons/{{i[2]}}" alt="{{i[0]}}"></a>
{%endfor%}
</div>
<div class="text-center">
<p>This site was last updated: {{updated}}</p>
<p>Website licensed under <a href="https://creativecommons.org/licenses/by-sa/4.0/">CC BY-SA 4.0</a></p>
<a href="{{url_for('homepage')}}">https://weingardt.dev/</a>
</div>
</div>

View File

@@ -0,0 +1,88 @@
<nav id="navbar">
<div class="rowsplitter">
<div class="content fit">
<h2 class="titlebar">🔗 Navbar</h2>
{%for i in navContent%}
{% if i[0] == "P": %}
<a class="nav {% if i[1].find(navSel) != -1: %} selected-nav {% endif %}"
href="{{url_for(i[2])}}">{% if i[1].find(navSel) != -1: %}> {% endif %}{{i[1]}}{% if i[1].find(navSel) != -1: %} <{% endif %}</a>
{% elif i[0] == "SEP": %}
<hr class="navSep">
{% elif i[0] == "L": %}
<a class="nav" href="{{i[2]}}">{{i[1]}}</a>
{% elif i[0] == "D": %}
<a class="nav disabled-nav">{{i[1]}}</a>
{% endif %}
{%endfor%}
</div>
<!--div class="content fit">
<h2 class="titlebar">🔀 Site Style</h2>
<form method="post" action="/changestyle">
<select name="stylebox">
<option value="A">A</option>
<option value="B">B</option>
<option value="-">Other</option>
</select>
<input type="submit" name="change" value="Apply">
</form>
</div-->
<div class="content fit">
<h2 class="titlebar"><marquee>💍 Webrings</marquee></h2>
<p class="text-center">--- Retronaut 🖥️ Webring ---</p>
<p>
<a href="https://webring.dinhe.net/prev/https://weingardt.dev">⬅️ Previous</a> |
<a href="https://webring.dinhe.net/random">Random</a> |
<a href="https://webring.dinhe.net/next/https://weingardt.dev">Next ➡️</a>
</p>
<p class="text-center">--- Hotline 📞 Webring ---</p>
<p>
<a href="https://hotlinewebring.club/weingardt/previous">⬅️ Previous</a> |
<a href="https://hotlinewebring.club/weingardt/next">Next ➡️</a>
</p>
<hr>
</div>
<div class="content fit">
<h2 class="titlebar">🔀 Random Shit</h2>
<div class="squeeze">{{rndShit | safe}}</div>
</div>
<div class="content fit smol">
<h2 class="titlebar">📖 Lesson of the Day <a class="leftpad" href="{{url_for('lessons')}}">>></a></h2>
<div>{{randomQuote[0]}}<br><br>{{randomQuote[1] | safe}}</div>
</div>
<div class="content fit smol">
<h2 class="titlebar">🎯 Goals/Todo</h2>
<div class="list-left">
<ul>
{%for i in todos%}
{% if i[0] == "s": %} <s> {% endif %}
<li> <input type="checkbox" disabled {% if i[0] == "1": %} checked {% endif %}>{{i[1]}}</li>
{% if i[0] == "s": %} </s> {% endif %}
{%endfor%}
</ul>
</div>
</div>
<div class="content fit smol">
<h2 class="titlebar">🆕 Site Updates</h2>
<div class="list-left">
<ul>
{%for i in updates%} <li>{{i[0]}} {{i[1]}}</li> {%endfor%}
</ul>
</div>
</div>
</div>
</nav>

33
templates/lessons.html Normal file
View File

@@ -0,0 +1,33 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no">
{{style | safe}}
<link rel="stylesheet" href="/styles/newstyle.css">
<title>Gabriel's personal website</title>
</head>
<body>
<main>
<form method="POST">
<div class="columnsplitter singlecolumn">
<div class="rowsplitter">
<div id="home" class="content">
<h2 class="titlebar">My stupid conclusions about certain days xD</h2>
<h3><a href="{{ url_for('homepage') }}"><- Back Home</a></h3>
<div class="list-left">
<ul>
{%for i in randomQuote%} <li>{{i[0]}} {{i[1] | safe}}</li> {%endfor%}
</ul>
</div>
</div>
</div>
</div>
</form>
</main>
</body>
</html>

37
templates/ls7.html Normal file
View File

@@ -0,0 +1,37 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no">
<link rel="stylesheet" href="../global/theme.css">
<script rel="text/javascript" src="../global/global.js"></script>
<link rel="stylesheet" href="../global/style.css">
<title>LS7 Computer</title>
</head>
<body>
<nav id="navbar"></nav>
<main>
<div class="content">
<h2 class="titlebar">LS7 Computer</h2>
<h1>SHIT NOTHING HERE YET</h1>
<h2>Im lazy as fuckk</h2>
<!--div class="linespan">
<a href="../dhge/" class="linebutton">🏫 School Stuff</a>
<a href="../services/" class="linebutton">🌐 Services</a>
</div-->
</div>
<div id="footnote"><var id="toplevel" data-="../">Please enable Javascript on this page as it's required to generate the footer and navigation bar.<br>For fear of non-free Javascript: The JS is licensed under GPL v.3</var></div>
</main>
<footer id="footer"></footer>
<!-- Some variables and script-call for global site elements -->
<var id="selected-nav" data-="Projects"></var>
</body>
</html>

168
templates/me.html Normal file
View File

@@ -0,0 +1,168 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no">
{{style | safe}}
<link rel="stylesheet" href="/styles/newstyle.css">
<link rel="stylesheet" href="/styles/nav.css">
<title>Contact me</title>
</head>
<body>
<main>
<div class="columnsplitter">
<div class="rowsplitter">
<div class="content fit">
<h2 class="titlebar">🚶 Me!</h2>
<ul>
<li>Age: {{ ageinsert }}</li>
<li>Gender: Male</li>
<li>Occupation: Employed, touching computers all day. Also studying during that</li>
<li>Location: Somewhere in Germany</li>
<li>Hobbies: Programming, electronics and computing, trekking, carving wood</li>
<li>OS Affinity: <a href="https://www.gentoo.org/">Gentoo</a>, <a href="https://artixlinux.org/">Artix Linux</a></li>
<li>Interests: Old'n wheird Computers/Technologies, Terry Davis, Getting to know Nature and Self-Sustainability</li>
<li>Education: Computer Science, studying that aswell rn</li>
<li class="rndText">Random: {{funfact}}</li>
</ul>
</div>
<div class="content fit tworowtext">
<h2 class="titlebar">📫 Contact and Social Media</h2>
<img src="/images/send.gif" alt="gif" id="gif">
<dl>
<dt>E-Mail</dt><dd>gabriel@weingardt.dev</dd>
<dt>(old) E-Mail</dt><dd>gabriel.weingardt@gmail.com</dd>
</dl>
<div class="contact-text">
<p class="info">
Please use the @weingardt.dev domain for E-Mail communication.<br>
The Googlemail E-Mail is depricated and will delete it sometime end 2025.
</p>
All inquiries are welcome!
</div>
<hr>
<div class="contact-text">
<p>
I also exist at these places:
</p>
</div>
<dl>
<dt>Odysee 🎥</dt><dd><a href="https://odysee.com/@0xMAC-8205:e">xmac</a></dd>
<dt>YouTube 🎥</dt><dd><a href="https://www.youtube.com/@0xMAC-8205">xmac</a></dd>
<dt>GitHub 📂</dt><dd><a href="https://github.com/0xMAC8205">0xmac8205</a></dd>
</dl>
</div>
<div class="content fit">
<h2 class="titlebar">🔁 Everyday / 👜 Carry</h2>
This is a list of stuff I use and take with me everyday.
<br><br>
My laptop currently is a <a href="https://thinkwiki.de/X220">Thinkpad X220</a>,
serving as a replacement for my <a href="https://thinkwiki.de/X61#X61_Tablet">Thinkpad X61t</a>.
Sadly it's neck broke, but I want to switch back to it.
It's modified with all sorts
of stuff like an internal USB Hub with is connected to an Arduino.
It has a back OLED display displaying Gentoo ads and a link to my website.
I also have a SATA harddrive reader modded where should be the PCI Express card slot
(Taken-apart SSD's fit perfectly in that little space).
For my Linux distribution I currently run Artix Linux, since my old Gentoo installation
broke and I needed something quick. Will switch back to Gentoo sometime when I
repair my X61t. My X220 has a whole 16 Gigs of RAM, a 1TB SSD which is fully LUKS encrypted
and a 64GB MSATA drive holding data I want to quickly transfer across operating systems
and some backup data.
On the side of the Laptop I've also modded an external antenna port for more WIFI ;).
<br><br>
My main phone used to be a Nokia fliphone, but got replaced by a trusty old Google Pixel 6.
Nothin special about it, since it's just a phone.
<br><br>
For my music, since piss Google decided to remove the beloved headphone jack
I use a Sony Minidisk Walkman instead. Better choice anyway.
It's a blue <a href="https://www.minidisc.org/part_Sony_MZ-R70.html">MZ-R70</a> model with digital audio recording capability over ADAT.
I always carry my music library with me around, which consists of 7 Minidisks.
It's honestly great, since it just eats a single AA battery.
So with that I also take spare batteries with me (wich do last a long time).
(The motor sounds on this thing are just epic)
<br><br>
As for money, I always carry cash with me. I don't like using and paying
with my credit card. If I need money, I'll go to an ATM.
I always know how much money I have and how much I can spend.
Unlike with a credit card, where it's basically a gamble if the card
gets accepted or not. Had that happen to me a few times, where the card
was just declined. And you also loose the feeling of "spending"
with a card. Physical money is something, that hurts when
you spend alot of it, rather than just a number decreasing.
</div>
<div class="content fit">
<h2 class="titlebar">🚫 Nope</h2>
<ul>
<li>Social Media</li>
<li>Fast food</li>
<li>Soft drinks</li>
<li>Windows</li>
<li>Deoderant</li>
<li>Coffee with sugar and or milk</li>
<li>Overaccesive Phone use</li>
<li>Cities</li>
</ul>
</div>
<div class="content fit">
<h2 class="titlebar">⚙️ How</h2>
This site just used to be plain HTML and a JavaScipt script
wich was basically required for the site to function.
It would construct global elements like the navbar
and the CSS style variables. Since I can't
use that on terminal and old browsers it was only a temporary measure.
I wanted to learn how to use hugo, started but decided against it.
<br><br>
This site now operates via Python Flask as it's backend.
Each site is still HTML, but with tags inside them.
The backend then constructs the global elements and other stuff.
You may have noticed, that some elements like the random section in the navbar
change when the site refreshes. This is the backend at work.
This site uses no JavaScipt, the backend provides the rendered HTML and CSS files.
<br><br>
Some sections like the lists you see on this site and the photobook get
constructed via a JSON, to keep things simple and expandable.
</div>
<div class="content fit">
<h2 class="titlebar">❓ Why</h2>
Why does this exist? I have my reasons:
I hate social media. I think a website is the perfect way for someone
to really express themself. Of course it requires work, but the end result
is basically a infinite canvas to express oneself.
I don't want to see the positive and negative feedback I get for my stuff,
well if you actually want to share your opinion you can use the messagebox
on the homepage or just shoot an E-mail.
But most people won't do that because it's concidered inconvinient.
<br><br>
Algorythms also play a big role in my opinion.
I don't want, be it an AI or an algorytm to dictate what I see and
what I don't see. It's such a distopian idea but even worse
is that most people are not only okay with it and just accept it, but actively defent it.
<br><br>
If you haven't tried, use webrings. They really show how people feel like
and what they're capable of. And of course a bit of nostaliga
(wich I didn't had, but it's still cool).
</div>
{{footer | safe}}
</div>
{{navbar | safe}}
</div>
</main>
</body>
</html>

52
templates/photobook.html Normal file
View File

@@ -0,0 +1,52 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no">
<link rel="stylesheet" href="/styles/photobook.css">
<title>My Photobook</title>
</head>
<body>
<main>
<div class="paper">
<img src="/images/page2.avif" id="background">
<div class="controlbox">
<a {% if previousDisabled == '' : %} href="{{url_for( request.endpoint, **request.view_args)}}&--" {%endif%} class="{{ previousDisabled }}">↩️ Previous Page</a>
<a class="padding" href="{{ url_for('homepage') }}">🚪 Leave</a>
<a class="padding" href="{{ url_for( request.endpoint, **request.view_args) }}&rnd">🔄 Random Page</a>
<a {% if nextDisabled == '' : %} href="{{url_for( request.endpoint, **request.view_args)}}&++" {%endif%} class="{{ nextDisabled }}">Next Page ↪️</a>
</div>
<div class="page">
<div class="content">
{{contentLeftInsert | safe}}
</div>
<div class="infocontainer">
<p class="date">{{pageLeftDate}}</p>
<p class="description">{{pageLeftDesc | safe}}</p>
</div>
</div>
<div class="page right">
<div class="content">
{{contentRightInsert | safe}}
</div>
<div class="infocontainer">
<p class="date">{{pageRightDate}}</p>
<p class="description">{{pageRightDesc | safe}}</p>
</div>
</div>
</div>
</main>
</body>
</html>

19
templates/scraper.html Normal file
View File

@@ -0,0 +1,19 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Fuck U</title>
</head>
<body>
<main>
<h1>Fuck YOU</h1>
<h2>Why? Because you fucko are on my bot/scraper blacklist</h2>
<h2>I suggest u read my robots.txt bitch</h2>
<h2>But who cares about my robots.txt anyway ay?</h2>
<br><br>
<h2>Think I was a lil too harsh to u? OK, mail me (at) <a href="mailto:unblock@weingardt.dev">unblock@weingardt.dev</a></h2>
</main>
</body>
</html>

5
wsgi.py Normal file
View File

@@ -0,0 +1,5 @@
from server import app, reload_jsons
if __name__ == "__main__":
reload_jsons(True)
app.run()