quiet redesign yo

This commit is contained in:
2026-05-01 15:29:05 +02:00
parent 9832565fbb
commit 3c1dfde620
4 changed files with 123 additions and 49 deletions
+24 -10
View File
@@ -1,5 +1,5 @@
<!DOCTYPE html>
<html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="description" content="GDPR Notice | Veit Heller—Technologist at Large">
@@ -12,6 +12,7 @@
src: url('charter_regular-webfont.woff') format('woff');
font-weight: normal;
font-style: normal;
font-display: swap;
}
html {
box-sizing: border-box;
@@ -25,7 +26,7 @@
width: 100vw;
height: 100vh;
margin: 0;
background-color: #fafaf3;
background-color: #fafaf7;
}
.main {
max-width: 600px;
@@ -37,16 +38,31 @@
font-size: 28px;
font-weight: 400;
}
.main h2 {
font-size: 22px;
font-weight: 400;
margin-top: 2em;
}
.main a {
color: #000;
text-decoration: none;
border-bottom: 2px solid #d6dde3;
}
.site-link {
font-size: 16px;
color: #444;
margin-bottom: 0.5em;
}
.site-link a {
border-bottom: none;
color: #444;
}
</style>
<title>GDPR Notice | Veit Heller—Technologist at Large</title>
</head>
<body>
<div class="main">
<p class="site-link"><a href="/">← Veit Heller</a></p>
<h1>GDPR Notice</h1>
<p>
This is the personal website of Veit Heller. I will provide a notice that
@@ -57,12 +73,12 @@
It collects the requesting partys IP address and user agent from the
HTTP request, but does not store them.
</p>
<h2 id="analytics">Web analytics (Plausible)</h2>
<p>
<h2 id="analytics">Web analytics (Plausible)</h2>
<p>
This site uses <a href="https://plausible.io">Plausible Analytics</a>. Plausible works without cookies
and without cross-site tracking. No personal data is stored.
</p>
<ul>
</p>
<ul>
<li><strong>Per pageview captured:</strong> page URL (without query params except common campaign tags),
referrer, and derived browser/OS/device type; city-level location is inferred from the IP.</li>
<li><strong>No raw identifiers stored:</strong> Plausible does not store IP addresses or full user-agents.
@@ -75,7 +91,7 @@
<li><strong>Retention:</strong> Only aggregated statistics are kept for as long as the site is active.
You can contact me if you have questions regarding this processing.</li>
<li><strong>Public stats:</strong> For transparency, I made the statistics publicly available <a href="https://plausible.io/veitheller.de">here</a>.</li>
</ul>
</ul>
<p>For any questions or concerns contact:<br/>
Veit Heller<br/>
Moltkestr. 5<br/>
@@ -83,9 +99,7 @@
Germany
</p>
<p>Don't know what this is? This is a necessity dictated by European law.</p>
<hr/>
<a href="mailto:veit@veitheller.de">Shoot me an e-mail</a><br/>
<a href="./">Head back home</a>
<p>See also: <a href="./imprint.html">Imprint</a></p>
</div>
</body>
</html>
+12 -4
View File
@@ -1,5 +1,5 @@
<!DOCTYPE html>
<html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="description" content="Imprint | Veit Heller—Technologist at Large">
@@ -43,11 +43,21 @@
text-decoration: none;
border-bottom: 2px solid #d6dde3;
}
.site-link {
font-size: 16px;
color: #444;
margin-bottom: 0.5em;
}
.site-link a {
border-bottom: none;
color: #444;
}
</style>
<title>Imprint | Veit Heller—Technologist at Large</title>
</head>
<body>
<div class="main">
<p class="site-link"><a href="/">← Veit Heller</a></p>
<h1>Imprint</h1>
<p>Veit Heller<br/>
Moltkestr. 5<br/>
@@ -55,9 +65,7 @@
Germany
</p>
<p>Don't know what this is? This is a necessity dictated by German law.</p>
<hr/>
<a href="mailto:veit@veitheller.de">Shoot me an e-mail</a><br/>
<a href="./">Head back home</a>
<p>See also: <a href="./gdpr_notice.html">GDPR Notice</a></p>
</div>
</body>
</html>
+1 -4
View File
@@ -135,9 +135,6 @@
.broken-up {
display: block;
}
.broken-up li {
list-style: circle;
}
.main h1 {
font-size: 20px;
}
@@ -291,7 +288,7 @@
<ul>
<li>Community events: travel-only (free if remote)</li>
<li>Corporate talks (4560 min): 1,900€–2,400€</li>
<li>Corporate talks (7590 min): 2,400€-2,800€</li>
<li>Corporate talks (7590 min): 2,400€2,800€</li>
<li>Half-day workshop (24h): 2,500€–3,000€</li>
<li>Full-day workshop (68h): 4,200€–4,800€</li>
<li>Prep and post is included</li>
+72 -17
View File
@@ -35,7 +35,6 @@
font-family: 'charterregular', Georgia, serif;
font-size: 18px;
width: 100vw;
height: 100vh;
margin: 0;
background-color: #fafaf7;
}
@@ -76,7 +75,7 @@
}
.main .rule {
border-top: 1px solid #aaa;
width: calc(100%-6em);
width: calc(100% - 6em);
margin-left: 3em;
margin-right: 3em;
height: 0px;
@@ -118,6 +117,25 @@
color: #000;
border-bottom-color: #000;
}
.site-link {
font-size: 16px;
color: #444;
margin-bottom: 0.5em;
}
.site-link a {
border-bottom: none;
color: #444;
}
.legal {
margin-top: 2.5em;
padding-top: 1em;
border-top: 1px solid #d6dde3;
font-size: 14px;
color: #444;
}
.legal a {
margin-right: 1em;
}
@media(max-width: 700px) {
.main h1 {
font-size: 20px;
@@ -127,6 +145,7 @@
</head>
<body>
<main class="main">
<p class="site-link"><a href="/">← Veit Heller</a></p>
<h1>Workshops, Talks, Publications</h1>
<p class="description">I speak and write about systems of all shapes and
sizes.</p>
@@ -135,21 +154,21 @@
<input type="radio" name="tab" id="tab-talks" class="tab-input">
<input type="radio" name="tab" id="tab-publications" class="tab-input">
<nav class="tabs">
<label for="tab-bookable">Bookable</label>
<label for="tab-talks">Talks</label>
<label for="tab-publications">Publications</label>
<nav class="tabs" role="tablist">
<label for="tab-bookable" id="label-bookable" role="tab" aria-controls="bookable" tabindex="0">Bookable</label>
<label for="tab-talks" id="label-talks" role="tab" aria-controls="talks" tabindex="0">Talks</label>
<label for="tab-publications" id="label-publications" role="tab" aria-controls="publications" tabindex="0">Publications</label>
</nav>
<section id="bookable" class="panel">
<section id="bookable" class="panel" role="tabpanel" aria-labelledby="label-bookable">
<h3>Practical threat modelling for engineering teams</h3>
<p>Lightweight, repeatable threat modelling you can actually run in sprint cadence. We cut jargon, pick a fit-for-purpose method, and get to work quickly. <a href="https://blog.veitheller.de/Threat_Modeling_For_the_Rest_of_Us.html">Read about it here.</a></p>
<ul>
<li><strong>Takeaways:</strong> initial model (only for workshops), playbook, templates, 30-day plan to make it stick.</li>
<li><strong>Formats:</strong> 4590min talk, ~3h half-day (guided exercise), 68h full-day (hands-on)</li>
<li><strong>Formats:</strong> 4590min talk, ~3h half-day, 68h full-day (hands-on)</li>
</ul>
<p><a href="mailto:veit@veitheller.de?subject=threat modelling workshop inquiry">Book this workshop</a></p>
<p><a href="mailto:veit@veitheller.de?subject=Threat modelling workshop inquiry">Book this workshop</a></p>
<div class="rule"></div>
@@ -159,7 +178,7 @@
<li><strong>Takeaways:</strong> control set, CI/CD hooks for evidence (workshop only), audit-ready checklists.</li>
<li><strong>Formats:</strong> 4590min talk, ~3h half-day, 68h full-day (hands-on)</li>
</ul>
<p><a href="mailto:veit@veitheller.de?subject=isms and ssdlc workshop inquiry">Book this workshop</a></p>
<p><a href="mailto:veit@veitheller.de?subject=ISMS and SSDLC workshop inquiry">Book this workshop</a></p>
<div class="rule"></div>
@@ -167,9 +186,9 @@
<p>What VCs, acquirers, and enterprise buyers actually check, and how to be ready to answer. Architecture narrative, risk posture, and processes that actually give you something in return. <a href="https://blog.veitheller.de/What_good_looks_like_in_a_data_room.html">Read about it here.</a></p>
<ul>
<li><strong>Takeaways:</strong> a DD checklist, a clean architecture one-pager, a 30-day prep plan including process refinements (workshop only).</li>
<li><strong>Formats:</strong> 4590min talk, ~3h workshop, 6-8h full-day (hands on)</li>
<li><strong>Formats:</strong> 4590min talk, ~3h half-day, 68h full-day (hands-on)</li>
</ul>
<p><a href="mailto:veit@veitheller.de?subject=funding and buyer readiness workshop inquiry">Book this workshop</a></p>
<p><a href="mailto:veit@veitheller.de?subject=Funding and buyer readiness workshop inquiry">Book this workshop</a></p>
<div class="rule"></div>
@@ -177,17 +196,17 @@
</section>
<section id="talks" class="panel">
<section id="talks" class="panel" role="tabpanel" aria-labelledby="label-talks">
<article>
<h3><i>Upcoming:</i> Type Systems You Might Not Know (But Will Love)</h3>
<p><em>WeAreDevelopers World Congress Europe, 2026</em><br>
<p>A tour through beautiful but lesser-known type systems.</p>
A tour through beautiful but lesser-known type systems.</p>
</article>
<article>
<h3>Von der Cloud ins Rack Wie Netzautomatisierung souveräne RZ-Umgebungen ermöglicht</h3>
<p><em>Rack & Stack 2026</em><br>
<p>A German talk on high fidelity network automation to drive the adoption of sovereign data infrastructure.</p>
A German talk on high fidelity network automation to drive the adoption of sovereign data infrastructure.</p>
<p><i>Recording pending</i></p>
</article>
@@ -230,7 +249,7 @@
<h3>Brainfuck, Carp, Macros, and Futamura Projections</h3>
<p><em>LambdaLounge, 2021</em><br>
A technical presentation connecting minimal languages, metaprogramming, and interpreter folding techniques.</p>
<p><a href="https://www.youtube.com/watch?v=G-0Vic9fQU0">Watch →</a></p>
<p><a href="https://www.youtube.com/watch?v=wwwa5TG70UA">Watch →</a></p>
</article>
<article>
@@ -269,7 +288,7 @@
</article>
</section>
<section id="publications" class="panel">
<section id="publications" class="panel" role="tabpanel" aria-labelledby="label-publications">
<article>
<h3>Efficient Module-Level Dynamic Analysis for Dynamic Languages with Module Recontextualization</h3>
@@ -285,6 +304,42 @@
<p><a href="https://sigbovik.org/2019/proceedings.pdf">Read →</a></p>
</article>
</section>
<footer class="legal">
<a href="./imprint.html">Imprint</a>
<a href="./gdpr_notice.html">GDPR Notice</a>
</footer>
</main>
<script>
(function() {
var tabs = ['bookable', 'talks', 'publications'];
var labels = document.querySelectorAll('nav.tabs label');
function syncAria(active) {
labels.forEach(function(l) {
l.setAttribute('aria-selected', l.getAttribute('for') === 'tab-' + active ? 'true' : 'false');
});
}
var hash = location.hash.substring(1);
if (tabs.indexOf(hash) !== -1) {
var input = document.getElementById('tab-' + hash);
if (input) input.checked = true;
syncAria(hash);
} else {
syncAria('bookable');
}
labels.forEach(function(l) {
l.addEventListener('click', function() {
var name = l.getAttribute('for').replace('tab-', '');
history.replaceState(null, '', '#' + name);
syncAria(name);
});
l.addEventListener('keydown', function(e) {
if (e.key === 'Enter' || e.key === ' ') {
e.preventDefault();
l.click();
}
});
});
})();
</script>
</body>
</html>