diff --git a/app/config.py.example b/app/config.py.example
index 45a791b..29379df 100644
--- a/app/config.py.example
+++ b/app/config.py.example
@@ -8,14 +8,13 @@ class Config:
'sqlite:///' + os.path.join(basedir, '../instance/registration.db')
SQLALCHEMY_TRACK_MODIFICATIONS = False
- # Email Settings (Update these!)
- MAIL_SERVER =
- MAIL_PORT =
+ MAIL_SERVER = 'mail.your-server.de'
+ MAIL_PORT = 587
MAIL_USE_TLS = True
MAIL_USERNAME = os.environ.get('EMAIL_USER')
MAIL_PASSWORD = os.environ.get('EMAIL_PASS')
MAIL_DEFAULT_SENDER = os.environ.get('EMAIL_USER')
- MAX_SPOTS =
+ MAX_SPOTS = 84
TUM_DOMAIN = "tum.de"
- DISCORD_LINK =
+ DISCORD_LINK = os.environ.get('DISCORD_LINK')
diff --git a/app/routes.py b/app/routes.py
index 4355f53..b8184dc 100644
--- a/app/routes.py
+++ b/app/routes.py
@@ -13,10 +13,11 @@ def send_verification_email(user_email):
s = URLSafeTimedSerializer(current_app.config['SECRET_KEY'])
token = s.dumps(user_email, salt='email-confirm-h4tum-ctf-2025')
link = url_for('main.verify_email', token=token, _external=True)
+ logo = url_for('static', filename='h4tum_white.png', _external=True)
- #msg = Message('Verify your CTF Registration', recipients=["fdohq9ipugtc@mockmail.io"])
- #msg.body = f'Click here to confirm your spot: {link}\nThanks for registering {user_email}'
- print(link)
+ msg = Message('Verify your CTF Registration', recipients=[user_email])
+ msg.html = render_template("email.html", user_email=user_email, link=link, logo_url=logo)
+ mail.send(msg)
@bp.route('/', methods=['GET', 'POST'])
def index():
diff --git a/app/static/h4tum_white.png b/app/static/h4tum_white.png
new file mode 100644
index 0000000..674c206
Binary files /dev/null and b/app/static/h4tum_white.png differ
diff --git a/app/static/timeline.css b/app/static/timeline.css
new file mode 100644
index 0000000..4871a5a
--- /dev/null
+++ b/app/static/timeline.css
@@ -0,0 +1,81 @@
+.timeline-container {
+ position: relative;
+ padding: 0 20px;
+}
+
+/* The actual horizontal line */
+.line {
+ position: absolute;
+ top: 50%;
+ left: 0;
+ right: 0;
+ height: 4px;
+ background: #dfe6e9;
+ transform: translateY(-50%);
+ z-index: 1;
+}
+
+.items-wrapper {
+ display: flex;
+ justify-content: space-between;
+ position: relative;
+ z-index: 2;
+}
+
+.item {
+ width: 120px;
+ text-align: center;
+ position: relative;
+ /* This height ensures the time is above and label is below the line */
+ height: 120px;
+}
+
+/* The Dot - centered perfectly on the line */
+.dot {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%); /* Centers the dot exactly */
+ width: 16px;
+ height: 16px;
+ background: #00ff00;
+ border: 2px solid #1a1a1a;
+ border-radius: 50%;
+ box-shadow: 0 0 8px #00ff00;
+}
+
+/* Time - positioned above the dot */
+.time {
+ position: absolute;
+ bottom: 65%; /* Push above the center line */
+ left: 0;
+ right: 0;
+ font-weight: bold;
+ color: #ffffff;
+}
+
+/* Label - positioned below the dot */
+.label {
+ position: absolute;
+ top: 65%; /* Push below the center line */
+ left: 0;
+ right: 0;
+ font-size: 0.9rem;
+ color: #ffffff;
+}
+
+.label span {
+ display: block;
+ font-size: 0.75rem;
+ color: #dddddd;
+ margin-top: 4px;
+}
+
+/* Mobile: Stack vertically */
+@media (max-width: 700px) {
+ .line { display: none; }
+ .items-wrapper { flex-direction: column; gap: 10px; align-items: flex-start; }
+ .item { height: auto; text-align: center; width: 100%; }
+ .dot { display: none;}
+ .time, .label { position: static; }
+}
diff --git a/app/templates/email.html b/app/templates/email.html
new file mode 100644
index 0000000..bce7d06
--- /dev/null
+++ b/app/templates/email.html
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+ Registration Received
+ |
+
+
+
+
+ Thanks for registering
+ {{ user_email }}
+ To secure your spot at the event, please confirm your attendance by clicking the button below.
+ |
+
+
+
+ |
+
+ |
+
+
+
+ |
+ If you didn't request this, you can safely ignore this email.
+ |
+
+
+
+ |
+
+
+
+
diff --git a/app/templates/index.html b/app/templates/index.html
index d38c092..a9c16a3 100644
--- a/app/templates/index.html
+++ b/app/templates/index.html
@@ -1,7 +1,9 @@
{% extends "base.html" %}
{% block content %}
-
+
+
+
> Info
- Date: 23.01.2026
@@ -23,7 +25,44 @@
- Teams will be finalized on site at the competition
-
Rules and further information
+
> Timeline
+
+
+
+
+
+
12:00
+
+
EntrySetup & find team
+
+
+
+
13:00
+
+
Start of Event
+
+
+
+
~18:30
+
+
Pizza Time
Bring cash. Menu
+
+
+
+
21:00
+
+
End of Event
+
+
+
+
+
+
+
Rules and Code of Conduct