website

Portfolio website
git clone https://willem.vanzwol.com/git/website/repo.bundle
Log | Files | Refs | README | LICENSE

commit 498c1ec5477a5b860c15f38496ff75d69c2892ee
Author: Willem Van Zwol <willem@vanzwol.com>
Date:   Sun, 10 May 2026 15:11:30 -0700

init

Diffstat:
ALICENSE | 15+++++++++++++++
Aicons/external-link.svg | 3+++
Aicons/git.svg | 3+++
Aindex.html | 93+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Astyles.css | 255+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 369 insertions(+), 0 deletions(-)

diff --git a/LICENSE b/LICENSE @@ -0,0 +1,15 @@ +My professional site: serves as a resume, portfolio, blog and whatever else I decide. +Copyright (C) 2026 Willem Van Zwol + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see <https://www.gnu.org/licenses/>. diff --git a/icons/external-link.svg b/icons/external-link.svg @@ -0,0 +1,3 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12"> + <path d="M6 1h5v5L8.86 3.85 4.7 8 4 7.3l4.15-4.16zM2 3h2v1H2v6h6V8h1v2a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1"/> +</svg> diff --git a/icons/git.svg b/icons/git.svg @@ -0,0 +1,3 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"> + <path d="M15,5.6,10.4,1A3.4,3.4,0,0,0,5.78.86L7.66,2.74a1.25,1.25,0,0,1,1.67,1.2V4a1.23,1.23,0,0,1-.08.38l2.45,2.4a1.17,1.17,0,0,1,.37-.08A1.3,1.3,0,1,1,10.77,8h0a1.17,1.17,0,0,1,.08-.37L8.6,5.38v5.23a1.28,1.28,0,0,1,.73,1.15,1.3,1.3,0,0,1-2.6,0,1.27,1.27,0,0,1,.67-1.11V5.07A1.27,1.27,0,0,1,6.73,4a1.17,1.17,0,0,1,.08-.37l-1.9-1.9L1,5.6a3.38,3.38,0,0,0,0,4.79H1L5.6,15a3.38,3.38,0,0,0,4.79,0h0L15,10.4a3.38,3.38,0,0,0,0-4.79Z"/> +</svg> diff --git a/index.html b/index.html @@ -0,0 +1,93 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> + <title>Portfolio</title> + <link rel="stylesheet" type="text/css" href="styles.css"> +</head> +<body> + <nav> + <!-- LEFT HAND SIDE --> + <a href="./index.html">index</a> ~ + <a href="">blog</a> ~ + <a href="">git</a> ~ + <a href="">contact</a> + + <!-- RIGHT HAND SIDE --> + <a href=""><img src="./icons/git.svg" alt="git" style="width: 1em" /></a> + <input type="checkbox" id="theme-toggle" class="toggle"> + <label for="theme-toggle" class="btn"> + <!-- sun --> + <svg class="sun" viewBox="0 0 24 24"> + <path d="M12 18a6 6 0 1 1 0-12 6 6 0 0 1 0 12zm0-16h1v3h-1zm0 17h1v3h-1zM4.22 5.64l.71-.71 2.12 2.12-.7.7zm12.73 12.73.7-.7 2.12 2.12-.7.7zM2 11h3v1H2zm17 0h3v1h-3zM4.22 18.36l2.12-2.12.7.7-2.11 2.12zm12.73-12.73 2.12-2.12.7.7-2.11 2.12z"/> + </svg> + <!-- moon --> + <svg class="moon" viewBox="0 0 24 24"> + <path d="M21 12.79A9 9 0 0 1 11.21 3c0-.34.02-.67.05-1A10 10 0 1 0 22 12c-.33.05-.66.07-1 .07z"/> + </svg> + </label> + </nav> + + <h1>Hello, I am Willem :3</h1> + <h3>I build local-first distributed systems in <a href="https://rust-lang.org/">Rust</a> and <a href="https://go.dev/">Go</a>.</h3> + <p> + I am a pragmatist, focused on protocol design, cryptography, reproducible infrastructure, and library-first architecture. + <br><br> + Here is my stack and what I am proficient in: + <table> + <tr> <td>Frontend</td> + <td>HTML/CSS/JS</td> </tr> + + <tr> <td>Backend</td> + <td>Rust, Golang, C/C++ Python, Java</td> </tr> + + <tr> <td>Data management</td> + <td>PostgreSQL, SQLite, Redis, CSV, JSON</td> </tr> + + <tr> <td>Misc</td> + <td>NixOS (Linux), Git, Bash, Neovim (DapUI)</td> </tr> + </table> + </p> + <h1>About this site</h1> + <p> + This webpage for now serves nothing more than the purpose of a template. + I may use a proper <abbr title="Static Site generator">SSG</abbr> like + <a href="https://www.getzola.org/">Zola</a>. + + That said, I did have a lot of fun just setting this up. Doesn't seem too hard -- I may just commit fully to raw <code>html/css</code>. + </p> + <hr> + <p> + I like having this style emulate markdown, so I mma just use this paragraph to demonstrate other rich text displayed nicely with my <code>css</code>. <em>italics</em>, <b>bold</b>, <del>strickthrough</del> + <blockquote cite="https://example.com"> + Hello world + <ul> + <li>item</li> + <li>item</li> + </ul> + <a class="quote-source" + href="https://example.com" + aria-label="Source" + ></a> + </blockquote> + + <div class="callout note"> + This is a note. + </div> + + <div class="callout important"> + This is important. + </div> + + </p> + <h1>Projects</h1> + <p> + This will contain a <abbr title="perhaps tiles, with titles, descriptions, and tags much like an interface to a blog">list</abbr> of projects I have worked on. <br><br> + + For now, simply visit <a href="https://github.com/WillemDoesIt">my github</a>. Which I do hope to distance myself from, I prefer decentrlized--self hosting of repositories. I may use something like or <a href="https://git.zx2c4.com/cgit/about/">cgit</a>, specifically that may be nice because it is static, however that means no cloning. + </p> + +</body> + +</html> diff --git a/styles.css b/styles.css @@ -0,0 +1,255 @@ +:root { + --bg: #fff; + --text: #000; + --border: #d0d0d0; + --link: #0645ad; + + --transition-fast: 120ms; +} + +/* system default already applies via :root */ + +/* manual override */ +body:has(#theme-toggle:checked) { + --bg: #090909; + --text: #eaeaea; + --border: #262626; + --link: #6aa7ff; + + a[href^="http://"]::after, + a[href^="https://"]::after { + filter: invert(1); + } +} + +a[href^="http"]::after { + content: ""; + display: inline-block; + + width: 0.85em; + height: 0.85em; + margin-left: 0.15em; + + background: url("./icons/external-link.svg") no-repeat center / contain; + + vertical-align: text-top; +} + +/* Markdown symbols */ +h1::before { content: "# "; } +h2::before { content: "## "; } +h3::before { content: "### "; } + +h1::before, h2::before, h3::before { + color: color-mix(in srgb, currentColor 25%, transparent); +} + +em::before { content: "_"; } +em::after { content: "_"; } +b::before { content: "**"; } +b::after { content: "**"; } +del::before { content: "~~"; } +del::after { content: "~~"; } + +em::before, em::after, +b::before, b::after, +del::before, del::after { + color: color-mix(in srgb, currentColor 40%, transparent); +} + +hr { + border: none; + border-top: 1px solid var(--border); +} + +a { + color: var(--link); + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + + +abbr[title] { + text-decoration: underline dotted; + text-decoration-thickness: 2px; + text-decoration-color: color-mix(in srgb, currentColor 50%, transparent); + cursor: help; +} + +code { + font-family: "Liberation Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; + background: var(--bg-secondary); + padding: 0.2em; + border: 1px solid var(--border); + font-size: 0.9em; +} + +table { + width: fit; + border-collapse: collapse; +} + +th, +td { + padding: 0.3em 0.8em; + border: 1px solid var(--border); + text-align: left; +} + +th { + background: var(--bg-secondary); +} + +blockquote { + position: relative; + + margin: 1em 0.4em; + padding: 0.15em 0.8em; + + border-left: 0.3em solid var(--border); +} + +.quote-source { + position: absolute; + top: 0.4rem; + right: 0.5rem; + + opacity: 0.45; + text-decoration: none; + + transition: opacity var(--transition-fast); +} + +.quote-source:hover { + opacity: 1; +} + +ul, +ol { + padding-left: 1.5em; + margin: 0; +} + +li::marker { + color: color-mix(in srgb, var(--text) 50%, transparent); +} + +.callout { + position: relative; + + margin: 1em 0.4em; + padding: 1em 0.8em; + + background: var(--callout-bg); + border: 1px solid var(--callout-accent); +} + +.callout::before { + content: var(--callout-label); + position: absolute; + top: -0.6em; + left: 0.6em; + + font-family: "Liberation Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; + font-size: 0.75em; + + padding: 0 0.4em; + + background: var(--bg); + color: var(--callout-accent); + border: 1px solid var(--callout-accent); +} + +.callout.note { + --callout-label: "![NOTE]"; + --callout-accent: #3b82f6; + --callout-bg: color-mix(in srgb, var(--callout-accent) 10%, transparent); +} + +.callout.important { + --callout-label: "![IMPORTANT]"; + --callout-accent: #facc15; + --callout-bg: color-mix(in srgb, var(--callout-accent) 10%, transparent); +} + +body { + background: var(--bg); + color: var(--text); + font-family: "FreeSans", "Liberation Sans", Arial, sans-serif; + font-size: 12pt; + line-height: 1.5; + margin: 1rem auto 0; + width: clamp(30rem, 50%, 50rem); + padding: 2.5rem; + border: 1px solid var(--border); + + transition: + background var(--transition-fast), + color var(--transition-fast), + border-color var(--transition-fast); +} + +a { + color: var(--link); + text-decoration: none; +} + +nav { + font-family: "Nimbus Mono L", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; + margin: 0; + + display: flex; + align-items: center; + gap: 1ch; + flex-wrap: wrap; +} + +/* toggle */ +.toggle { + display: none; +} + +.btn { + width: 1em; + height: 1em; + display: inline-block; + position: relative; + cursor: pointer; + vertical-align: -0.15em; + + margin-left: auto; +} + +.btn svg { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + transition: opacity var(--transition-fast) ease, transform var(--transition-fast) ease; +} + +/* default = system light assumed */ +.sun { + fill: currentColor; + opacity: 1; +} + +.moon { + fill: currentColor; + opacity: 0; + transform: rotate(90deg) scale(0.75); +} + +/* toggle flips theme */ +body:has(#theme-toggle:checked) .sun { + opacity: 0; + transform: rotate(-90deg) scale(0.75); +} + +body:has(#theme-toggle:checked) .moon { + opacity: 1; + transform: rotate(0deg) scale(1); +}