commit 9169af831d8f0e5144643bf49bd358383dfcde6a Author: ZeroZipp Date: Wed Jun 10 19:16:52 2026 +0200 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1b72444 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/Cargo.lock +/target diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..d250f87 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "Website" +version = "0.1.0" +edition = "2024" + +[dependencies] +rocket = "0.5.1" diff --git a/frontend/icons/arrow-right.svg b/frontend/icons/arrow-right.svg new file mode 100644 index 0000000..aafc5d5 --- /dev/null +++ b/frontend/icons/arrow-right.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/frontend/icons/chip.svg b/frontend/icons/chip.svg new file mode 100644 index 0000000..5a53fcc --- /dev/null +++ b/frontend/icons/chip.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/icons/code.svg b/frontend/icons/code.svg new file mode 100644 index 0000000..3241789 --- /dev/null +++ b/frontend/icons/code.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/frontend/icons/cube.svg b/frontend/icons/cube.svg new file mode 100644 index 0000000..879b240 --- /dev/null +++ b/frontend/icons/cube.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/frontend/icons/envelope.svg b/frontend/icons/envelope.svg new file mode 100644 index 0000000..4f22d54 --- /dev/null +++ b/frontend/icons/envelope.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/frontend/icons/external-link.svg b/frontend/icons/external-link.svg new file mode 100644 index 0000000..0a85886 --- /dev/null +++ b/frontend/icons/external-link.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/frontend/icons/github.svg b/frontend/icons/github.svg new file mode 100644 index 0000000..34a45c6 --- /dev/null +++ b/frontend/icons/github.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/frontend/icons/globe.svg b/frontend/icons/globe.svg new file mode 100644 index 0000000..19e54df --- /dev/null +++ b/frontend/icons/globe.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/frontend/icons/layout.svg b/frontend/icons/layout.svg new file mode 100644 index 0000000..a863723 --- /dev/null +++ b/frontend/icons/layout.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/frontend/icons/menu.svg b/frontend/icons/menu.svg new file mode 100644 index 0000000..1bf94e0 --- /dev/null +++ b/frontend/icons/menu.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/frontend/icons/server.svg b/frontend/icons/server.svg new file mode 100644 index 0000000..5e1d9a3 --- /dev/null +++ b/frontend/icons/server.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/frontend/icons/shield.svg b/frontend/icons/shield.svg new file mode 100644 index 0000000..f81dc03 --- /dev/null +++ b/frontend/icons/shield.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/frontend/icons/terminal.svg b/frontend/icons/terminal.svg new file mode 100644 index 0000000..c43e78a --- /dev/null +++ b/frontend/icons/terminal.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..255af3c --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,369 @@ + + + + + + + Jarne Götz - Portfolio + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ Terminal + Software Developer +
+ +

+ Building.
+ Secure.
+ Efficient. +

+ +

+ I develop software solutions ranging from Rust-based AI agents to self-hosted infrastructure. + Focused on security, performance, and modern tech. +

+ +
+ Focus: + AI Agents + Security + Infrastructure +
+ + +
+
+ + +
+
+ Rust + // + Kotlin + // + Docker + // + Alpine Linux + // + Arch Linux + // + Node.js + // + Caddy +
+
+ + +
+
+
+

Selected Projects

+ 03 / REPOS +
+ +
+ +
+
+
+ Chip +

Folyo

+
+

+ AI Agent Device Control System. Enables AI agents to control physical and virtual devices + through a high-performance Rust server. +

+
+ Rust + Agents + IoT +
+
+ +
+ + +
+
+
+ Cube +

Agent

+
+

+ A modern Minecraft Mod Loader developed from scratch in Kotlin. Provides + a flexible architecture for mod developers. +

+
+ Kotlin + Minecraft + Plugins +
+
+ +
+ + +
+
+
+ Globe +

Marick Studio

+
+

+ Full-stack development of a corporate website using Next.js and Tailwind CSS. Features + a booking system, video optimization, and animations. +

+
+ Next.js + React + Tailwind +
+
+ +
+
+
+
+ + +
+
+
+ +
+

About

+
+

+ Software development is more than just writing code. It is about understanding systems, + designing robust architectures, and continuous learning. +

+

+ My work focuses on three core areas: building autonomous AI agents, analyzing systems from a + security perspective, + and maintaining full control over infrastructure through self-hosting. +

+

+ In my Home Lab, I deploy services like Matrix, Gitea, and Home Assistant on Alpine Linux + containers. + On the desktop, I use Arch Linux to stay close to the system. +

+
+
+ + +
+

Capabilities

+
+
+ Code +
+

Languages

+

Rust, Kotlin, Java, TypeScript, Python

+
+
+
+ Server +
+

Infrastructure

+

Docker, Alpine Linux, Arch Linux, Caddy

+
+
+
+ Shield +
+

Security

+

Pen Testing Basics, System Hardening

+
+
+
+ Layout +
+

Web

+

Node.js, React, Tailwind CSS

+
+
+
+
+ +
+
+
+ + +
+ +
+ + +
+ +
+ + + + + + \ No newline at end of file diff --git a/frontend/style.css b/frontend/style.css new file mode 100644 index 0000000..31f1a2e --- /dev/null +++ b/frontend/style.css @@ -0,0 +1,455 @@ +:root { + /* Monochromatic Palette */ + --bg-body: #09090b; + /* neutral-950 */ + --bg-card: #09090b; + --bg-hover: #18181b; + /* neutral-900 */ + --fg-primary: #fafafa; + /* neutral-50 */ + --fg-secondary: #a1a1aa; + /* neutral-400 */ + --fg-muted: #71717a; + /* neutral-500 */ + --border: #27272a; + /* neutral-800 */ + --accent: #ffffff; + + --spacing-unit: 1rem; + --container-width: 960px; +} + +/* Reset & Base */ +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +html { + scroll-behavior: smooth; +} + +body { + background-color: var(--bg-body); + color: var(--fg-primary); + font-family: 'Space Grotesk', sans-serif; + line-height: 1.6; + -webkit-font-smoothing: antialiased; +} + +/* Typography */ +h1, +h2, +h3, +h4, +p { + font-weight: 400; +} + +h1 { + font-size: clamp(2.5rem, 5vw, 4rem); + line-height: 0.95; + font-weight: 700; + letter-spacing: -0.03em; +} + +h2 { + font-size: clamp(1.5rem, 3vw, 2.25rem); + font-weight: 700; + letter-spacing: -0.02em; +} + +h3 { + font-size: 1.25rem; + font-weight: 700; +} + +a { + color: inherit; + text-decoration: none; + transition: color 0.15s ease; +} + +ul { + list-style: none; +} + +/* Layout Utilities */ +.container { + max-width: var(--container-width); + margin: 0 auto; + padding: 0 1.5rem; +} + +.section { + padding: 5rem 0; +} + +.grid { + display: grid; + gap: 1px; + background-color: var(--border); + border: 1px solid var(--border); +} + +.grid-item { + background-color: var(--bg-card); + padding: 2rem; +} + +.grid-cols-2 { + grid-template-columns: 1fr; +} + +.grid-cols-3 { + grid-template-columns: 1fr; +} + +@media (min-width: 768px) { + .grid-cols-2 { + grid-template-columns: 1fr 1fr; + } + + .grid-cols-3 { + grid-template-columns: repeat(3, 1fr); + } +} + +/* Navigation */ +nav { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 64px; + background-color: rgba(9, 9, 11, 0.9); + backdrop-filter: blur(8px); + border-bottom: 1px solid var(--border); + z-index: 50; + display: flex; + align-items: center; +} + +.nav-inner { + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; +} + +.logo { + font-weight: 700; + font-size: 1.25rem; + letter-spacing: -0.03em; +} + +/* Mobile Menu - CSS Only with Checkbox Hack */ +#menu-toggle { + display: none; +} + +.nav-links { + display: none; + gap: 2rem; + font-size: 0.875rem; + font-weight: 500; + position: absolute; + top: 64px; + left: 0; + right: 0; + background-color: rgba(9, 9, 11, 0.98); + border-bottom: 1px solid var(--border); + flex-direction: column; + padding: 1rem 1.5rem; + gap: 1rem; +} + +@media (min-width: 768px) { + .nav-links { + display: flex; + position: static; + background-color: transparent; + border-bottom: none; + flex-direction: row; + padding: 0; + } +} + +#menu-toggle:checked+.nav-inner .nav-links { + display: flex; +} + +.nav-links a:hover { + color: var(--fg-muted); +} + +.nav-links a { + padding: 0.5rem 0; +} + +@media (min-width: 768px) { + .nav-links a { + padding: 0; + } +} + +/* Hamburger Menu Label */ +.mobile-menu-label { + display: flex; + align-items: center; + justify-content: center; + background: none; + border: none; + color: white; + cursor: pointer; + padding: 0.5rem; +} + +@media (min-width: 768px) { + .mobile-menu-label { + display: none; + } +} + +/* Components */ +.btn { + display: inline-flex; + align-items: center; + gap: 0.5rem; + padding: 0.75rem 1.5rem; + font-size: 0.875rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.05em; + border: 1px solid var(--border); + transition: all 0.2s ease; +} + +.btn-primary { + background-color: white; + color: black; + border-color: white; +} + +.btn-primary:hover { + background-color: #e5e5e5; + border-color: #e5e5e5; +} + +.btn-secondary { + background-color: transparent; + color: white; + border-color: var(--fg-muted); +} + +.btn-secondary:hover { + border-color: white; + background-color: rgba(255, 255, 255, 0.05); +} + +.tag { + font-size: 0.75rem; + text-transform: uppercase; + letter-spacing: 0.05em; + padding: 0.25rem 0.5rem; + border: 1px solid var(--border); + color: var(--fg-muted); + display: inline-block; +} + +/* Tech Strip - Fixed Overflow */ +.tech-strip { + border-top: 1px solid var(--border); + border-bottom: 1px solid var(--border); + background-color: #18181b33; + padding: 2rem 0; + overflow-x: auto; + white-space: nowrap; + -ms-overflow-style: none; + /* IE and Edge */ + scrollbar-width: none; + /* Firefox */ +} + +.tech-strip::-webkit-scrollbar { + display: none; + /* Chrome, Safari, Opera */ +} + +.tech-strip-inner { + display: flex; + width: 100%; +} + +.tech-strip span { + margin-right: 2rem; + color: var(--fg-muted); + font-size: 0.875rem; +} + +.tech-strip span:last-child { + margin-right: 0; +} + +/* Project Cards */ +.project-card { + display: flex; + justify-content: space-between; + align-items: flex-start; + gap: 2rem; +} + +.project-card { + flex-direction: column; +} + +@media (min-width: 768px) { + .project-card { + flex-direction: row; + } +} + +.project-links { + display: flex; + flex-direction: column; + gap: 0.75rem; + min-width: 140px; +} + +.lab-item { + display: flex; + flex-direction: column; + justify-content: space-between; + height: 100%; + gap: 0.5rem; +} + +.lab-item:hover { + background-color: var(--bg-hover); +} + +.contact-card { + display: flex; + flex-direction: column; + justify-content: space-between; + height: 12rem; + border: 1px solid var(--border); + padding: 2rem; + transition: border-color 0.2s ease, background-color 0.2s ease; +} + +.contact-card:hover { + border-color: white; + background-color: var(--bg-hover); +} + +.icon-box { + width: 40px; + height: 40px; + border: 1px solid var(--border); + display: flex; + align-items: center; + justify-content: center; +} + +/* Utils */ +.text-muted { + color: var(--fg-secondary); +} + +.text-sm { + font-size: 0.875rem; +} + +.mb-4 { + margin-bottom: 1rem; +} + +.mb-6 { + margin-bottom: 1.5rem; +} + +.mb-8 { + margin-bottom: 2rem; +} + +.mb-12 { + margin-bottom: 3rem; +} + +.flex { + display: flex; +} + +.flex-col { + flex-direction: column; +} + +.items-center { + align-items: center; +} + +.gap-2 { + gap: 0.5rem; +} + +.gap-4 { + gap: 1rem; +} + +.uppercase { + text-transform: uppercase; +} + +.font-mono { + font-family: monospace; +} + +/* Footer */ +footer { + border-top: 1px solid var(--border); + padding: 2rem 0; + font-size: 0.75rem; + color: var(--fg-muted); + text-transform: uppercase; + letter-spacing: 0.05em; +} + +footer .flex { + justify-content: space-between; +} + +@media (max-width: 768px) { + footer .flex { + flex-direction: column; + align-items: center; + gap: 1rem; + } +} + +/* SVG Icons */ +svg { + width: 20px; + height: 20px; + stroke: currentColor; + fill: none; + stroke-width: 2; + stroke-linecap: round; + stroke-linejoin: round; +} + +.icon-sm { + width: 16px; + height: 16px; +} + +.icon-md { + width: 24px; + height: 24px; +} + +.icon-lg { + width: 28px; + height: 28px; +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..b6da5f0 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,9 @@ +use rocket::fs::FileServer; + +#[rocket::main] +async fn main() -> Result<(), Box> { + let frontend = FileServer::from("frontend"); + let server = rocket::build().mount("/", frontend); + server.launch().await?; + Ok(()) +}