Projekte aktualisiert und Design ueberarbeitet
All checks were successful
Deploy go.vanityontour.de / deploy (push) Successful in 7s

VanityCast fehlte komplett, obwohl die App in Version 1.4 im App Store ist.
Neu dazu kommt eine Karte fuer Code & Infrastruktur (Forgejo/GitHub). News und
Stats bleiben aussen vor - beide leiten auf /admin bzw. /login und sind nicht
oeffentlich nutzbar.

Design: Abstands- und Typo-Skala ueber Custom Properties statt frei gewaehlter
Pixelwerte, Karten-Grid auf auto-fit umgestellt, je Projekt ein eigener Akzent
als Farbkante. Dazu Fokus-Ringe fuer Tastaturnutzung, prefers-reduced-motion
und scroll-margin, damit der Sticky-Header keine Ankerziele verdeckt.

Ausgehende Links laufen jetzt ueber die eigenen Kurzlinks, womit die Seite
Klickstatistiken bekommt. Impressum, Datenschutz und Mailto bleiben direkt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Oliver 2026-07-27 09:45:46 +02:00
parent 94d3a2bae5
commit 03c1a526bd
No known key found for this signature in database
2 changed files with 383 additions and 179 deletions

View file

@ -1,36 +1,76 @@
:root{ :root{
--bg:#0b0f14; --bg:#0b0f14;
--panel:#0f1720;
--panel2:#0c141c;
--text:#e9eef6; --text:#e9eef6;
--muted:#a8b3c2; --muted:#a8b3c2;
--line:rgba(255,255,255,.10); --line:rgba(255,255,255,.10);
--line-strong:rgba(255,255,255,.20);
--accent:#ff9b54; --accent:#ff9b54;
--accent2:#ffd29a; --accent2:#ffd29a;
/* Pro Karte ueberschrieben, damit die Projekte visuell auseinandergehen,
ohne dass jede Karte eine eigene Regel braucht. */
--card-accent: var(--accent);
--shadow: 0 18px 60px rgba(0,0,0,.45); --shadow: 0 18px 60px rgba(0,0,0,.45);
--radius:18px; --radius:18px;
--radius-sm:12px;
--max:1100px; --max:1100px;
--font: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, "Apple Color Emoji","Segoe UI Emoji";
/* Ein Abstands-Raster statt frei gewaehlter Pixelwerte. */
--sp-1:.5rem;
--sp-2:.75rem;
--sp-3:1rem;
--sp-4:1.5rem;
--sp-5:2rem;
--sp-6:3rem;
--sp-7:4.5rem;
--font: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial,
"Apple Color Emoji", "Segoe UI Emoji";
color-scheme: dark;
} }
*{ box-sizing:border-box; } *{ box-sizing:border-box; }
html,body{ height:100%; }
html{ scroll-behavior:smooth; }
/* Sticky Header darf Ankerziele nicht verdecken. */
:target{ scroll-margin-top: 6rem; }
body{ body{
margin:0; margin:0;
min-height:100%;
font-family:var(--font); font-family:var(--font);
background: radial-gradient(1200px 700px at 20% -10%, rgba(255,155,84,.18), transparent 65%), background:
radial-gradient(900px 600px at 85% 5%, rgba(255,210,154,.12), transparent 60%), radial-gradient(1200px 700px at 20% -10%, rgba(255,155,84,.18), transparent 65%),
var(--bg); radial-gradient(900px 600px at 85% 5%, rgba(255,210,154,.12), transparent 60%),
var(--bg);
background-attachment: fixed;
color:var(--text); color:var(--text);
line-height:1.55; line-height:1.6;
-webkit-font-smoothing: antialiased;
text-wrap: pretty;
} }
a{ color:inherit; text-decoration:none; } a{ color:inherit; text-decoration:none; }
a:hover{ text-decoration:underline; } a:hover{ text-decoration:underline; }
/* Sichtbarer Fokus fuer Tastaturnutzung, aber kein Ring bei Mausklick. */
a:focus-visible,
summary:focus-visible{
outline:2px solid var(--accent2);
outline-offset:3px;
border-radius:6px;
text-decoration:none;
}
img, svg{ max-width:100%; }
h1,h2,h3{ text-wrap: balance; }
.container{ .container{
width: min(var(--max), calc(100% - 40px)); width: min(var(--max), calc(100% - 2.5rem));
margin: 0 auto; margin-inline: auto;
} }
.skip{ .skip{
@ -38,97 +78,95 @@ a:hover{ text-decoration:underline; }
width:1px; height:1px; overflow:hidden; width:1px; height:1px; overflow:hidden;
} }
.skip:focus{ .skip:focus{
left:20px; top:16px; width:auto; height:auto; left:1.25rem; top:1rem; width:auto; height:auto;
padding:10px 14px; border-radius:10px; padding:.625rem .875rem; border-radius:var(--radius-sm);
background:var(--panel); border:1px solid var(--line); background:#0f1720; border:1px solid var(--line-strong);
z-index:999; z-index:999;
} }
/* ---------- Header ---------- */
.site-header{ .site-header{
position:sticky; top:0; z-index:50; position:sticky; top:0; z-index:50;
background: rgba(11,15,20,.75); background: rgba(11,15,20,.72);
backdrop-filter: blur(10px); backdrop-filter: blur(12px);
border-bottom:1px solid var(--line); border-bottom:1px solid var(--line);
} }
.header-inner{ .header-inner{
display:flex; display:flex;
justify-content:space-between; justify-content:space-between;
align-items:center; align-items:center;
padding: 14px 0; padding: var(--sp-2) 0;
gap:16px; gap: var(--sp-3);
flex-wrap:wrap;
} }
.brand{ display:flex; align-items:center; gap:12px; } .brand{ display:flex; align-items:center; gap:var(--sp-2); }
.brand:hover{ text-decoration:none; }
.brand-mark{ filter: drop-shadow(0 6px 18px rgba(0,0,0,.35)); } .brand-mark{ filter: drop-shadow(0 6px 18px rgba(0,0,0,.35)); }
.brand-text{ display:flex; flex-direction:column; line-height:1.25; }
.brand-title{ font-weight:800; letter-spacing:.2px; } .brand-title{ font-weight:800; letter-spacing:.2px; }
.brand-sub{ font-size:.92rem; color:var(--muted); } .brand-sub{ font-size:.9rem; color:var(--muted); }
.top-nav{ display:flex; gap:14px; flex-wrap:wrap; justify-content:flex-end; } .top-nav{ display:flex; gap:var(--sp-1); flex-wrap:wrap; }
.nav-link{ .nav-link{
padding:8px 10px; padding:.5rem .75rem;
border-radius:10px; border-radius:var(--radius-sm);
border:1px solid transparent; border:1px solid transparent;
color:var(--muted); color:var(--muted);
font-size:.95rem;
transition: color .15s ease, border-color .15s ease, background .15s ease;
} }
.nav-link:hover{ .nav-link:hover{
text-decoration:none; text-decoration:none;
color:var(--text); color:var(--text);
border-color: var(--line); border-color: var(--line);
background: rgba(255,255,255,.03); background: rgba(255,255,255,.04);
} }
.hero{ padding: 56px 0 36px; } /* ---------- Hero ---------- */
.hero{ padding: var(--sp-7) 0 var(--sp-6); }
.hero-inner{ .hero-inner{
display:grid; display:grid;
grid-template-columns: 1.2fr .8fr; grid-template-columns: 1.15fr .85fr;
gap: 28px; gap: var(--sp-5);
align-items:center; align-items:center;
} }
.kicker{ .kicker{
display:inline-block; display:inline-block;
padding:6px 10px; padding:.375rem .75rem;
border-radius:999px; border-radius:999px;
border:1px solid var(--line); border:1px solid var(--line);
background: rgba(255,255,255,.03); background: rgba(255,255,255,.03);
color:var(--muted); color:var(--muted);
margin:0 0 14px; font-size:.9rem;
margin:0 0 var(--sp-3);
} }
h1{ h1{
margin:0 0 14px; margin:0 0 var(--sp-3);
font-size: clamp(2.0rem, 3.4vw, 3.2rem); font-size: clamp(2rem, 1.3rem + 2.9vw, 3.4rem);
line-height:1.1; line-height:1.08;
letter-spacing:-.6px; letter-spacing:-.02em;
font-weight:800;
} }
.accent{ color: var(--accent2); } .accent{ color: var(--accent2); }
.lead{ .lead{
margin:0 0 18px; margin:0 0 var(--sp-4);
color:var(--muted); color:var(--muted);
max-width: 52ch; max-width: 52ch;
font-size: clamp(1rem, .96rem + .2vw, 1.125rem);
} }
.hero-cta{ display:flex; gap:12px; flex-wrap:wrap; margin-bottom:14px; } .hero-cta{ display:flex; gap:var(--sp-2); flex-wrap:wrap; margin-bottom: var(--sp-4); }
.btn{
display:inline-flex; align-items:center; justify-content:center;
padding: 11px 14px;
border-radius: 12px;
border:1px solid var(--line);
background: rgba(255,255,255,.03);
box-shadow: 0 0 0 rgba(0,0,0,0);
font-weight:700;
transition: transform .12s ease, background .12s ease, border-color .12s ease;
white-space:nowrap;
}
.btn:hover{ text-decoration:none; transform: translateY(-1px); border-color: rgba(255,255,255,.18); background: rgba(255,255,255,.06); }
.btn.primary{
border-color: rgba(255,155,84,.55);
background: linear-gradient(180deg, rgba(255,155,84,.28), rgba(255,155,84,.10));
}
.btn.ghost{ color:var(--text); }
.hero-badges{ display:flex; gap:10px; flex-wrap:wrap; } .hero-badges{
display:flex; gap:var(--sp-1); flex-wrap:wrap;
list-style:none; margin:0; padding:0;
}
.badge{ .badge{
font-size:.88rem; font-size:.85rem;
padding:6px 10px; padding:.375rem .75rem;
border-radius:999px; border-radius:999px;
border:1px solid var(--line); border:1px solid var(--line);
color:var(--muted); color:var(--muted);
@ -138,57 +176,115 @@ h1{
.hero-art{ .hero-art{
color: var(--accent); color: var(--accent);
background: linear-gradient(180deg, rgba(255,155,84,.16), rgba(255,155,84,.05)); background: linear-gradient(180deg, rgba(255,155,84,.16), rgba(255,155,84,.05));
border: 1px solid rgba(255,255,255,.10); border: 1px solid var(--line);
border-radius: var(--radius); border-radius: var(--radius);
box-shadow: var(--shadow); box-shadow: var(--shadow);
padding: 14px; padding: var(--sp-2);
} }
.hero-art svg{ width:100%; height:auto; display:block; } .hero-art svg{ width:100%; height:auto; display:block; }
.section{ padding: 44px 0; } /* ---------- Buttons ---------- */
.btn{
display:inline-flex; align-items:center; justify-content:center;
padding: .7rem 1.05rem;
border-radius: var(--radius-sm);
border:1px solid var(--line);
background: rgba(255,255,255,.03);
font-weight:700;
font-size:.95rem;
transition: transform .12s ease, background .12s ease, border-color .12s ease;
}
.btn:hover{
text-decoration:none;
transform: translateY(-1px);
border-color: var(--line-strong);
background: rgba(255,255,255,.07);
}
.btn:active{ transform: translateY(0); }
.btn.primary{
border-color: color-mix(in srgb, var(--card-accent) 55%, transparent);
background: linear-gradient(180deg,
color-mix(in srgb, var(--card-accent) 28%, transparent),
color-mix(in srgb, var(--card-accent) 10%, transparent));
}
.btn.primary:hover{
border-color: color-mix(in srgb, var(--card-accent) 75%, transparent);
}
.btn.ghost{ color: var(--text); }
/* ---------- Sections ---------- */
.section{ padding: var(--sp-6) 0; }
.section.alt{ .section.alt{
background: linear-gradient(180deg, rgba(255,255,255,.02), transparent); background: linear-gradient(180deg, rgba(255,255,255,.025), transparent);
border-top: 1px solid var(--line); border-top: 1px solid var(--line);
border-bottom: 1px solid var(--line); border-bottom: 1px solid var(--line);
} }
.section-head{ margin-bottom: var(--sp-4); }
.section-head h2{ .section-head h2{
margin:0 0 6px; margin:0 0 .375rem;
font-size: 1.6rem; font-size: clamp(1.4rem, 1.2rem + .8vw, 1.9rem);
letter-spacing:-.2px; letter-spacing:-.01em;
} }
.section-head p{ margin:0 0 18px; color:var(--muted); } .section-head p{ margin:0; color:var(--muted); max-width: 60ch; }
/* ---------- Projektkarten ---------- */
.grid{ .grid{
display:grid; display:grid;
grid-template-columns: repeat(2, minmax(0,1fr)); grid-template-columns: repeat(auto-fit, minmax(min(100%, 22rem), 1fr));
gap: 16px; gap: var(--sp-3);
} }
.card{ .card{
position:relative;
overflow:hidden;
border-radius: var(--radius); border-radius: var(--radius);
background: linear-gradient(180deg, rgba(255,255,255,.04), rgba(255,255,255,.02)); background: linear-gradient(180deg, rgba(255,255,255,.045), rgba(255,255,255,.02));
border:1px solid var(--line); border:1px solid var(--line);
box-shadow: 0 10px 40px rgba(0,0,0,.25); box-shadow: 0 10px 40px rgba(0,0,0,.25);
padding: 18px; padding: var(--sp-4);
display:flex; display:flex;
flex-direction:column; flex-direction:column;
gap: var(--sp-3);
justify-content:space-between; justify-content:space-between;
min-height: 210px; transition: border-color .15s ease, transform .15s ease;
} }
.card h3{ margin:8px 0 10px; font-size:1.25rem; } /* Farbkante oben statt bunter Flaeche - ordnet zu, ohne laut zu sein. */
.card p{ margin:0 0 14px; color:var(--muted); } .card::before{
content:"";
position:absolute; inset:0 0 auto 0;
height:3px;
background: linear-gradient(90deg, var(--card-accent), transparent 70%);
opacity:.9;
}
.card:hover{
border-color: color-mix(in srgb, var(--card-accent) 40%, var(--line));
transform: translateY(-2px);
}
.card h3{ margin:.25rem 0 .5rem; font-size:1.3rem; letter-spacing:-.01em; }
.card p{ margin:0; color:var(--muted); }
.card strong{ color: var(--text); font-weight:700; }
.card-meta{
display:flex; align-items:center; gap:var(--sp-1);
flex-wrap:wrap; margin:0;
}
.card-tag{ font-size:.85rem; color:var(--muted); }
.card-actions{ display:flex; gap:var(--sp-1); flex-wrap:wrap; }
.card-actions{ display:flex; gap:10px; flex-wrap:wrap; }
.pill{ .pill{
display:inline-flex; display:inline-flex;
align-items:center; align-items:center;
justify-content:center; padding: .3rem .7rem;
padding: 5px 10px;
border-radius: 999px; border-radius: 999px;
background: rgba(255,155,84,.18); background: color-mix(in srgb, var(--card-accent) 18%, transparent);
border:1px solid rgba(255,155,84,.35); border:1px solid color-mix(in srgb, var(--card-accent) 40%, transparent);
font-size:.85rem; font-size:.8rem;
font-weight:800; font-weight:800;
color: var(--accent2); letter-spacing:.02em;
color: color-mix(in srgb, var(--card-accent) 65%, white);
} }
.pill.subtle{ .pill.subtle{
background: rgba(255,255,255,.05); background: rgba(255,255,255,.05);
@ -196,71 +292,90 @@ h1{
color: var(--muted); color: var(--muted);
} }
.note{ /* Markenfarben der einzelnen Projekte. */
margin-top: 16px; .is-cast{ --card-accent:#34bed1; }
padding: 14px 16px; .is-stay{ --card-accent:#7bd88f; }
border-radius: 14px; .is-expense{ --card-accent:#ffd29a; }
border:1px dashed rgba(255,255,255,.18); .is-code{ --card-accent:#9d8cff; }
background: rgba(255,255,255,.02); .is-blog{ --card-accent:#ff9b54; }
color: var(--muted);
} /* ---------- Support ---------- */
.split{ .split{
display:flex; display:flex;
align-items:center; align-items:center;
justify-content:space-between; justify-content:space-between;
gap: 18px; gap: var(--sp-4);
flex-wrap:wrap; flex-wrap:wrap;
} }
.support-actions{ display:flex; gap:10px; flex-wrap:wrap; } .split-copy{ max-width: 58ch; }
.split-copy h2{ margin:0 0 .5rem; font-size: clamp(1.4rem, 1.2rem + .8vw, 1.9rem); }
.split-copy p{ margin:0; color:var(--muted); }
.support-actions{ display:flex; gap:var(--sp-1); flex-wrap:wrap; }
/* ---------- Social & Kontakt ---------- */
.social{ .social{
display:flex; display:flex;
gap:10px; gap:var(--sp-1);
flex-wrap:wrap; flex-wrap:wrap;
margin-bottom: 18px; margin-bottom: var(--sp-4);
} }
.social-link{ .social-link{
border:1px solid var(--line); border:1px solid var(--line);
background: rgba(255,255,255,.03); background: rgba(255,255,255,.03);
padding: 10px 12px; padding: .6rem .9rem;
border-radius: 12px; border-radius: var(--radius-sm);
color: var(--text); color: var(--text);
font-size:.95rem;
transition: transform .12s ease, border-color .12s ease, background .12s ease;
}
.social-link:hover{
text-decoration:none;
transform: translateY(-1px);
border-color: var(--line-strong);
background: rgba(255,255,255,.06);
} }
.social-link:hover{ text-decoration:none; transform: translateY(-1px); }
.contact{ .contact{
border-radius: var(--radius); border-radius: var(--radius);
border:1px solid var(--line); border:1px solid var(--line);
background: rgba(255,255,255,.02); background: rgba(255,255,255,.025);
padding: 16px; padding: var(--sp-4);
} }
.contact h3{ margin:0 0 8px; } .contact h3{ margin:0 0 .5rem; }
.fineprint{ margin:10px 0 0; color:var(--muted); font-size:.92rem; } .contact p{ margin:0; color:var(--muted); }
.contact-mail{
color: var(--accent2);
font-weight:700;
word-break: break-word;
}
.fineprint{ margin-top:.75rem !important; font-size:.92rem; }
.fineprint a{ color: var(--accent2); }
/* ---------- FAQ ---------- */
.faq{ .faq{
border-radius: var(--radius); border-radius: var(--radius);
border:1px solid var(--line); border:1px solid var(--line);
background: rgba(255,255,255,.02); background: rgba(255,255,255,.025);
padding: 12px 14px; padding: var(--sp-2) var(--sp-3);
margin: 10px 0; margin-bottom: var(--sp-1);
} }
.faq summary{ .faq summary{
cursor:pointer; cursor:pointer;
font-weight:800; font-weight:700;
} padding: .35rem 0;
.faq-body{ color:var(--muted); padding-top: 10px; } list-style-position: outside;
code{
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
font-size: .95em;
background: rgba(255,255,255,.06);
border: 1px solid var(--line);
padding: 2px 6px;
border-radius: 8px;
} }
.faq[open]{ border-color: var(--line-strong); }
.faq-body{ color:var(--muted); padding: .5rem 0 .35rem; }
.faq-body p{ margin:0; }
/* ---------- Footer ---------- */
.site-footer{ .site-footer{
padding: 22px 0; padding: var(--sp-4) 0;
border-top:1px solid var(--line); border-top:1px solid var(--line);
color: var(--muted); color: var(--muted);
} }
@ -268,17 +383,36 @@ code{
display:flex; display:flex;
justify-content:space-between; justify-content:space-between;
align-items:flex-start; align-items:flex-start;
gap: 12px; gap: var(--sp-3);
flex-wrap:wrap; flex-wrap:wrap;
} }
.footer-links{ display:flex; gap:12px; flex-wrap:wrap; } .footer-brand{ margin:0; }
.footer-links{ display:flex; gap:var(--sp-3); flex-wrap:wrap; }
.footer-links a{ color: var(--muted); } .footer-links a{ color: var(--muted); }
.footer-links a:hover{ color: var(--text); text-decoration:none; } .footer-links a:hover{ color: var(--text); text-decoration:none; }
.muted{ color: var(--muted); } .muted{ color: var(--muted); }
/* ---------- Responsive ---------- */
@media (max-width: 900px){ @media (max-width: 900px){
.hero{ padding: var(--sp-5) 0 var(--sp-4); }
.hero-inner{ grid-template-columns: 1fr; } .hero-inner{ grid-template-columns: 1fr; }
.hero-art{ order: -1; } .hero-art{ order: -1; }
.grid{ grid-template-columns: 1fr; } .header-inner{ gap: var(--sp-1); }
}
@media (max-width: 560px){
.brand-sub{ display:none; }
.card-actions .btn,
.hero-cta .btn{ flex: 1 1 auto; }
}
@media (prefers-reduced-motion: reduce){
html{ scroll-behavior:auto; }
*, *::before, *::after{
animation-duration:.01ms !important;
transition-duration:.01ms !important;
}
.btn:hover, .card:hover, .social-link:hover{ transform:none; }
} }

View file

@ -3,18 +3,23 @@
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" /> <meta name="viewport" content="width=device-width,initial-scale=1" />
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; script-src 'none'; frame-src 'none'; object-src 'none'; upgrade-insecure-requests; block-all-mixed-content;" /> <meta http-equiv="Content-Security-Policy" content="default-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; script-src 'none'; frame-src 'none'; object-src 'none'; base-uri 'none'; form-action 'none'; upgrade-insecure-requests; block-all-mixed-content;" />
<meta name="referrer" content="strict-origin-when-cross-origin" /> <meta name="referrer" content="strict-origin-when-cross-origin" />
<meta name="description" content="Vanity on Tour: Vanlife trifft Technik Apps, Tools, Blog & Projekte." /> <meta name="description" content="Vanity on Tour: Vanlife trifft Technik. VanityCast, StaySense, Expense Logbook, Blog und Open-Source-Projekte gebündelt an einem Ort." />
<title>Vanity on Tour Go</title> <meta name="theme-color" content="#0b0f14" />
<title>Vanity on Tour Alle Projekte an einem Ort</title>
<!-- Open Graph --> <!-- Open Graph -->
<meta property="og:title" content="Vanity on Tour Go" /> <meta property="og:title" content="Vanity on Tour Alle Projekte an einem Ort" />
<meta property="og:description" content="Vanlife trifft Technik Apps, Tools, Blog & Projekte an einem Ort." /> <meta property="og:description" content="VanityCast, StaySense, Expense Logbook, Blog und Open Source. Vanlife trifft Technik." />
<meta property="og:type" content="website" /> <meta property="og:type" content="website" />
<meta property="og:locale" content="de_DE" />
<meta property="og:site_name" content="Vanity on Tour" />
<meta property="og:url" content="https://go.vanityontour.de/" /> <meta property="og:url" content="https://go.vanityontour.de/" />
<meta property="og:image" content="https://go.vanityontour.de/assets/img/og.jpg" /> <meta property="og:image" content="https://go.vanityontour.de/assets/img/og.jpg" />
<meta name="twitter:card" content="summary_large_image" />
<link rel="canonical" href="https://go.vanityontour.de/" />
<link rel="icon" href="/assets/img/favicon.svg" type="image/svg+xml" /> <link rel="icon" href="/assets/img/favicon.svg" type="image/svg+xml" />
<link rel="stylesheet" href="/assets/css/style.css" /> <link rel="stylesheet" href="/assets/css/style.css" />
</head> </head>
@ -24,18 +29,18 @@
<header class="site-header"> <header class="site-header">
<div class="container header-inner"> <div class="container header-inner">
<div class="brand"> <a class="brand" href="/" aria-label="Vanity on Tour Startseite">
<img class="brand-mark" src="/assets/img/van.svg" alt="" width="40" height="40" /> <img class="brand-mark" src="/assets/img/van.svg" alt="" width="40" height="40" />
<div class="brand-text"> <span class="brand-text">
<div class="brand-title">Vanity on Tour</div> <span class="brand-title">Vanity on Tour</span>
<div class="brand-sub">Vanlife trifft Technik</div> <span class="brand-sub">Vanlife trifft Technik</span>
</div> </span>
</div> </a>
<nav class="top-nav" aria-label="Schnellzugriff"> <nav class="top-nav" aria-label="Schnellzugriff">
<a class="nav-link" href="#projekte">Projekte</a> <a class="nav-link" href="#projekte">Projekte</a>
<a class="nav-link" href="#support">Support</a> <a class="nav-link" href="#support">Support</a>
<a class="nav-link" href="#social">Social</a> <a class="nav-link" href="#social">Kontakt</a>
</nav> </nav>
</div> </div>
</header> </header>
@ -47,24 +52,24 @@
<p class="kicker">🚐 unterwegs. technisch. ehrlich.</p> <p class="kicker">🚐 unterwegs. technisch. ehrlich.</p>
<h1>Alles Wichtige von <span class="accent">Vanity on Tour</span> an einem Ort.</h1> <h1>Alles Wichtige von <span class="accent">Vanity on Tour</span> an einem Ort.</h1>
<p class="lead"> <p class="lead">
Tools, Apps, Blog & Projekte für Menschen, die lieber frei stehen als still sitzen. Apps, Tools, Blog und Open Source für Menschen, die lieber frei stehen
als still sitzen.
</p> </p>
<div class="hero-cta"> <div class="hero-cta">
<a class="btn primary" href="#projekte">Aktuelle Projekte</a> <a class="btn primary" href="#projekte">Projekte ansehen</a>
<a class="btn ghost" href="https://vanityontour.de" target="_blank" rel="noopener">Zum Blog</a> <a class="btn ghost" href="https://go.vanityontour.de/blog" rel="noopener">Zum Blog</a>
</div> </div>
<div class="hero-badges" aria-label="Highlights"> <ul class="hero-badges" aria-label="Eigenschaften">
<span class="badge">Schnell</span> <li class="badge">Ohne Konto nutzbar</li>
<span class="badge">Mobilefirst</span> <li class="badge">Kein Tracking durch Dritte</li>
<span class="badge">DSGVOfreundlich</span> <li class="badge">Selbst gehostet</li>
</div> </ul>
</div> </div>
<div class="hero-art" aria-hidden="true"> <div class="hero-art" aria-hidden="true">
<!-- Lightweight inline SVG (no external images required) --> <svg viewBox="0 0 540 420" focusable="false">
<svg viewBox="0 0 540 420" role="img" aria-label="">
<defs> <defs>
<linearGradient id="g" x1="0" y1="0" x2="1" y2="1"> <linearGradient id="g" x1="0" y1="0" x2="1" y2="1">
<stop offset="0%" stop-color="currentColor" stop-opacity="0.35" /> <stop offset="0%" stop-color="currentColor" stop-opacity="0.35" />
@ -92,64 +97,105 @@
<div class="container"> <div class="container">
<div class="section-head"> <div class="section-head">
<h2>Projekte</h2> <h2>Projekte</h2>
<p>Das Zeug, das wirklich klickt. (Und hoffentlich dein Vanlife leichter macht.)</p> <p>Apps und Werkzeuge, die im Van entstanden sind und dort auch benutzt werden.</p>
</div> </div>
<div class="grid"> <div class="grid">
<article class="card"> <article class="card is-cast">
<div class="card-top"> <div class="card-top">
<span class="pill">Neu</span> <p class="card-meta">
<h3>StaySense</h3> <span class="pill">iOS App</span>
<span class="card-tag">Version 1.4</span>
</p>
<h3>VanityCast</h3>
<p> <p>
Standort-Infos für Camper: UmweltKontext, Umgebung & nützliche Hinweise Die Podcast-App für bewusstes Hören: eigene Audio-Engine mit
direkt im Browser. <strong>Spots in der Nähe</strong> sind geplant (2026). Lautstärke-Angleichung und Smart Speed, smarte Inbox, Hörstatistiken
und Playlisten. Läuft auf iPhone und CarPlay <strong>komplett ohne Konto</strong>.
</p> </p>
</div> </div>
<div class="card-actions"> <div class="card-actions">
<a class="btn primary" href="https://staysense.vanityontour.de" target="_blank" rel="noopener">StaySense öffnen</a> <a class="btn primary" href="https://go.vanityontour.de/vanitycast-ios" rel="noopener">Im App Store laden</a>
<a class="btn ghost" href="https://landing.staysense.vanityontour.de" target="_blank" rel="noopener noreferrer">Was kann das?</a> <a class="btn ghost" href="https://go.vanityontour.de/vanitycast-web" rel="noopener">Alle Funktionen</a>
<a class="btn ghost" href="https://go.vanityontour.de/vanitycast" rel="noopener">Beta testen</a>
</div> </div>
</article> </article>
<article class="card"> <article class="card is-stay">
<div class="card-top"> <div class="card-top">
<span class="pill subtle">App</span> <p class="card-meta">
<span class="pill subtle">Web-App</span>
</p>
<h3>StaySense</h3>
<p>
Standort-Check fürs Vanlife: Umwelt-Kontext, Umgebung und nützliche
Hinweise direkt im Browser, ohne Store-Download.
<strong>Spots in der Nähe</strong> sind für 2026 geplant.
</p>
</div>
<div class="card-actions">
<a class="btn primary" href="https://go.vanityontour.de/staysense" rel="noopener">StaySense öffnen</a>
<a class="btn ghost" href="https://go.vanityontour.de/staysense-info" rel="noopener">Was kann das?</a>
</div>
</article>
<article class="card is-expense">
<div class="card-top">
<p class="card-meta">
<span class="pill subtle">App</span>
</p>
<h3>Vanity Expense Logbook</h3> <h3>Vanity Expense Logbook</h3>
<p> <p>
Ausgaben & Fahrten im Griff fürs Leben unterwegs. Ausgaben und Fahrten im Griff fürs Leben unterwegs.
Ideal, wenn du wissen willst, wohin dein Geld fährt. Ideal, wenn du wissen willst, wohin dein Geld fährt.
</p> </p>
</div> </div>
<div class="card-actions"> <div class="card-actions">
<a class="btn primary" href="https://app.vanityontour.de" target="_blank" rel="noopener">Mehr erfahren</a> <a class="btn primary" href="https://go.vanityontour.de/expense" rel="noopener">Mehr erfahren</a>
<a class="btn ghost" href="mailto:app@vanityontour.de">Feedback geben</a> <a class="btn ghost" href="mailto:app@vanityontour.de">Feedback geben</a>
</div> </div>
</article> </article>
<article class="card"> <article class="card is-code">
<div class="card-top"> <div class="card-top">
<span class="pill subtle">Blog</span> <p class="card-meta">
<h3>Vanity on Tour</h3> <span class="pill subtle">Open Source</span>
</p>
<h3>Code &amp; Infrastruktur</h3>
<p> <p>
Produkttests, StellplatzTests, TechnikKram und gesellschaftliche Themen Werkzeuge, Landingpages und Automatisierungen liegen offen
ohne Marketing-Zuckerguss. auf der eigenen Forgejo-Instanz und gespiegelt nach GitHub.
Selbst gehostet, weil es geht.
</p> </p>
</div> </div>
<div class="card-actions"> <div class="card-actions">
<a class="btn primary" href="https://vanityontour.de" target="_blank" rel="noopener">Zum Blog</a> <a class="btn primary" href="https://go.vanityontour.de/git" rel="noopener">Forgejo</a>
<a class="btn ghost" href="https://vanityontour.de" target="_blank" rel="noopener">Neueste Artikel</a> <a class="btn ghost" href="https://go.vanityontour.de/github" rel="noopener">GitHub</a>
</div> </div>
</article> </article>
<article class="card is-blog">
<div class="card-top">
<p class="card-meta">
<span class="pill subtle">Blog</span>
</p>
<h3>Vanity on Tour</h3>
<p>
Produkttests, Stellplatz-Tests, Technik-Kram und gesellschaftliche
Themen ohne Marketing-Zuckerguss.
</p>
</div>
<div class="card-actions">
<a class="btn primary" href="https://go.vanityontour.de/blog" rel="noopener">Zum Blog</a>
</div>
</article>
</div> </div>
</div>
<div style="height: 3rem;"></div>
</section> </section>
<section id="support" class="section alt"> <section id="support" class="section alt">
<div class="container split"> <div class="container split">
<div> <div class="split-copy">
<h2>Support</h2> <h2>Support</h2>
<p> <p>
Wenn dir meine Tools, Tests oder Artikel helfen: Ein kleiner Support ist wie ein Wenn dir meine Tools, Tests oder Artikel helfen: Ein kleiner Support ist wie ein
@ -157,7 +203,7 @@
</p> </p>
</div> </div>
<div class="support-actions"> <div class="support-actions">
<a class="btn primary" href="https://ko-fi.com/vanityontour" target="_blank" rel="noopener">Support-Seite öffnen</a> <a class="btn primary" href="https://go.vanityontour.de/support" rel="noopener">Support-Seite öffnen</a>
<a class="btn ghost" href="#contact">Kooperation anfragen</a> <a class="btn ghost" href="#contact">Kooperation anfragen</a>
</div> </div>
</div> </div>
@ -166,26 +212,29 @@
<section id="social" class="section"> <section id="social" class="section">
<div class="container"> <div class="container">
<div class="section-head"> <div class="section-head">
<h2>Social & Kontakt</h2> <h2>Social &amp; Kontakt</h2>
<p>Such dir den Kanal aus ich bin nicht wählerisch.</p> <p>Such dir den Kanal aus ich bin nicht wählerisch.</p>
</div> </div>
<div class="social"> <nav class="social" aria-label="Social-Media-Kanäle">
<a class="social-link" href="https://vanityontour.de" target="_blank" rel="noopener" aria-label="Website">🌐 Website</a> <a class="social-link" href="https://go.vanityontour.de/blog" rel="noopener"><span aria-hidden="true">🌐</span> Website</a>
<a class="social-link" href="https://github.com/OliverGiertz" target="_blank" rel="noopener" aria-label="GitHub">💻 GitHub</a> <a class="social-link" href="https://go.vanityontour.de/git" rel="noopener"><span aria-hidden="true">🧑‍💻</span> Forgejo</a>
<a class="social-link" href="https://www.instagram.com/vanity.on.tour/" target="_blank" rel="noopener" aria-label="Instagram">📷 Instagram</a> <a class="social-link" href="https://go.vanityontour.de/github" rel="noopener"><span aria-hidden="true">💻</span> GitHub</a>
<a class="social-link" href="https://bsky.app/profile/olivergiertz.bsky.social" target="_blank" rel="noopener" aria-label="Bluesky">🦋 Bluesky</a> <a class="social-link" href="https://go.vanityontour.de/instagram" rel="noopener"><span aria-hidden="true">📷</span> Instagram</a>
<a class="social-link" href="https://x.com/olivergiertz" target="_blank" rel="noopener" aria-label="X">𝕏 Twitter</a> <a class="social-link" href="https://go.vanityontour.de/bluesky" rel="noopener"><span aria-hidden="true">🦋</span> Bluesky</a>
</div> <a class="social-link" href="https://go.vanityontour.de/x" rel="noopener"><span aria-hidden="true">𝕏</span> Twitter</a>
</nav>
<div id="contact" class="contact"> <div id="contact" class="contact">
<h3>Kontakt</h3> <h3>Kontakt</h3>
<p> <p>
Für Kooperationen, Presse oder „Kannst du mal eben…?“ Für Kooperationen, Presse oder „Kannst du mal eben…?“<br />
<br /> <a class="contact-mail" href="mailto:kontakt@vanityontour.de">kontakt@vanityontour.de</a>
<a href="mailto:kontakt@vanityontour.de">kontakt@vanityontour.de</a> </p>
<p class="fineprint">
Fragen zu einer App? Dann direkt an
<a href="mailto:app@vanityontour.de">app@vanityontour.de</a>.
</p> </p>
<div style="height: 2rem;"></div>
</div> </div>
</div> </div>
</section> </section>
@ -193,45 +242,66 @@
<section id="faq" class="section alt"> <section id="faq" class="section alt">
<div class="container"> <div class="container">
<div class="section-head"> <div class="section-head">
<h2>MiniFAQ</h2> <h2>Mini-FAQ</h2>
<p>Damit niemand raten muss, was Sache ist.</p> <p>Damit niemand raten muss, was Sache ist.</p>
</div> </div>
<details class="faq">
<summary>Was ist VanityCast?</summary>
<div class="faq-body">
<p>
Eine Podcast-App für iPhone und CarPlay, die auf bewusstes Hören ausgelegt ist:
smarte Inbox statt endloser Feed-Liste, Hörstatistiken, eigene Audio-Engine.
Es gibt keinen Account und keine Registrierung.
</p>
</div>
</details>
<details class="faq"> <details class="faq">
<summary>Ist StaySense eine App?</summary> <summary>Ist StaySense eine App?</summary>
<div class="faq-body"> <div class="faq-body">
<p> <p>
Eher eine Website, die sich wie eine App anfühlt. Du kannst sie überall nutzen Eher eine Website, die sich wie eine App anfühlt. Du kannst sie überall nutzen
ohne StoreDownload: <a href="https://staysense.vanityontour.de" target="_blank" rel="noopener">staysense.vanityontour.de</a> ohne Store-Download.
</p> </p>
</div> </div>
</details> </details>
<details class="faq"> <details class="faq">
<summary>StaySense - Warum keine Spots?</summary> <summary>StaySense warum keine Spots?</summary>
<div class="faq-body"> <div class="faq-body">
<p> <p>
Fokus auf StandortInfos statt „hier ist ein Spot“. Spots in der Nähe sind geplant Fokus auf Standort-Infos statt „hier ist ein Spot“. Spots in der Nähe sind geplant
aber erst, wenn es sauber & sinnvoll umgesetzt ist. aber erst, wenn es sauber und sinnvoll umgesetzt ist.
</p> </p>
</div> </div>
</details> </details>
<details class="faq">
<summary>Warum laufen die Links über go.vanityontour.de?</summary>
<div class="faq-body">
<p>
Alle Weiterleitungen laufen über einen selbst gehosteten Kurzlink-Dienst auf dem
eigenen Server. Kein Bitly, keine Weitergabe an Dritte und Ziele bleiben
änderbar, ohne dass ein gedruckter QR-Code neu gemacht werden muss.
</p>
</div>
</details>
</div> </div>
</section> </section>
</main> </main>
<footer class="site-footer"> <footer class="site-footer">
<div class="container footer-inner"> <div class="container footer-inner">
<div> <p class="footer-brand">
<strong>Oliver / Vanity on Tour</strong><br/> <strong>Oliver / Vanity on Tour</strong><br/>
<span class="muted">Vanlife seit Jahren Technik im Kopf, Staub an den Reifen.</span> <span class="muted">Vanlife seit Jahren Technik im Kopf, Staub an den Reifen.</span>
</div> </p>
<div class="footer-links"> <nav class="footer-links" aria-label="Rechtliches">
<a href="https://vanityontour.de/impressum" target="_blank" rel="noopener">Impressum</a> <a href="https://vanityontour.de/impressum" target="_blank" rel="noopener">Impressum</a>
<a href="https://vanityontour.de/datenschutz" target="_blank" rel="noopener">Datenschutz</a> <a href="https://vanityontour.de/datenschutz" target="_blank" rel="noopener">Datenschutz</a>
</div> </nav>
</div> </div>
</footer> </footer>
</body> </body>