mirror of
https://github.com/pepaskopec-blip/skopec.dev.git
synced 2026-10-27 15:14:33 +00:00
FAQ data now matches the page, filters announce the active chip, and the mobile menu closes when you click outside it. Co-authored-by: Cursor <cursoragent@cursor.com>
638 lines
32 KiB
HTML
638 lines
32 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="cs">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<meta name="description" content="Josef’s projects — Graduately, skopec.dev, the Proxmox homelab, Jellyfin, Immich, Ollama, and more.">
|
||
<title>Projects — websites, services & games · Josef</title>
|
||
<link rel="canonical" href="https://skopec.dev/projects.html">
|
||
<meta property="og:title" content="Projects — Josef">
|
||
<meta property="og:description" content="Projects, websites, homelab services, games, and school experiments.">
|
||
<meta property="og:type" content="website">
|
||
<meta property="og:url" content="https://skopec.dev/projects.html">
|
||
<meta property="og:image" content="https://skopec.dev/og-image.jpg">
|
||
<meta property="og:image:alt" content="Josef. — skopec.dev">
|
||
<meta property="og:site_name" content="skopec.dev">
|
||
<meta name="twitter:card" content="summary_large_image">
|
||
<meta name="twitter:title" content="Projects — Josef">
|
||
<meta name="twitter:description" content="Websites, homelab services, games, and school experiments.">
|
||
<meta name="twitter:image" content="https://skopec.dev/og-image.jpg">
|
||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||
<link href="https://fonts.googleapis.com/css2?family=Instrument+Sans:ital,wght@0,400..700;1,400..700&family=Syne:wght@500..800&display=swap" rel="stylesheet">
|
||
<link rel="icon" href="favicon.svg" type="image/svg+xml">
|
||
<link rel="icon" href="favicon-32.png" sizes="32x32" type="image/png">
|
||
<link rel="apple-touch-icon" href="apple-touch-icon.png">
|
||
<meta name="theme-color" content="#07090d">
|
||
<script>
|
||
(function () {
|
||
try {
|
||
document.documentElement.dataset.theme =
|
||
localStorage.getItem("theme") === "light" ? "light" : "dark";
|
||
} catch (error) {
|
||
document.documentElement.dataset.theme = "dark";
|
||
}
|
||
})();
|
||
</script>
|
||
<link rel="stylesheet" href="style.css?v=20261027">
|
||
<script type="application/ld+json">
|
||
{
|
||
"@context": "https://schema.org",
|
||
"@type": "BreadcrumbList",
|
||
"itemListElement": [
|
||
{"@type": "ListItem", "position": 1, "name": "Home", "item": "https://skopec.dev/"},
|
||
{"@type": "ListItem", "position": 2, "name": "Projects", "item": "https://skopec.dev/projects.html"}
|
||
]
|
||
}
|
||
</script>
|
||
</head>
|
||
<body>
|
||
<a class="skip-link" href="#main">Skip to content</a>
|
||
|
||
<header class="site-header">
|
||
<div class="nav-inner">
|
||
<a class="brand" href="index.html">Josef<span>.</span></a>
|
||
<ul class="nav-links" id="site-nav">
|
||
<li><a href="index.html">Home</a></li>
|
||
<li><a href="projects.html" aria-current="page">Projects</a></li>
|
||
<li><a href="hardware.html">Hardware</a></li>
|
||
</ul>
|
||
<div class="nav-actions">
|
||
<button class="theme-toggle" type="button" aria-label="Switch to light mode" aria-pressed="false" title="Toggle theme">
|
||
<svg class="icon-sun" viewBox="0 0 24 24" aria-hidden="true">
|
||
<circle cx="12" cy="12" r="4.2"></circle>
|
||
<path d="M12 2.6v2.2M12 19.2v2.2M4.2 12H2M22 12h-2.2M6.3 6.3 4.8 4.8M19.2 19.2l-1.5-1.5M17.7 6.3l1.5-1.5M4.8 19.2l1.5-1.5"></path>
|
||
</svg>
|
||
<svg class="icon-moon" viewBox="0 0 24 24" aria-hidden="true">
|
||
<path d="M20.5 14.3A8.6 8.6 0 0 1 9.7 3.5a8.6 8.6 0 1 0 10.8 10.8Z"></path>
|
||
</svg>
|
||
</button>
|
||
<button class="nav-toggle" type="button" aria-expanded="false" aria-controls="site-nav" aria-label="Open menu">
|
||
<span></span><span></span><span></span>
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</header>
|
||
|
||
<main id="main" class="page">
|
||
<header class="page-hero wrap reveal">
|
||
<nav class="breadcrumbs" aria-label="Breadcrumb">
|
||
<ol>
|
||
<li><a href="index.html">Home</a></li>
|
||
<li><span aria-current="page">Projects</span></li>
|
||
</ol>
|
||
</nav>
|
||
<div class="projects-hero-top">
|
||
<div>
|
||
<h1>Projects</h1>
|
||
<p>Websites, self-hosted services, games, and school projects.</p>
|
||
</div>
|
||
<div class="project-filters" role="toolbar" aria-label="Filter projects">
|
||
<button class="filter-chip is-active" type="button" data-filter="all">All <span>14</span></button>
|
||
<button class="filter-chip" type="button" data-filter="apps">Apps & Web</button>
|
||
<button class="filter-chip" type="button" data-filter="infra">Homelab & Program</button>
|
||
<button class="filter-chip" type="button" data-filter="services">Services</button>
|
||
<button class="filter-chip" type="button" data-filter="games">Games</button>
|
||
</div>
|
||
</div>
|
||
</header>
|
||
|
||
<section class="section projects-section" aria-labelledby="projects-list-title">
|
||
<div class="wrap reveal">
|
||
<p class="section-label">Selected</p>
|
||
<h2 id="projects-list-title">Work</h2>
|
||
<p class="section-lead">Things I’ve built or run — open a project for more.</p>
|
||
|
||
<ul class="project-grid">
|
||
<!-- Graduately (Featured full-width card) -->
|
||
<li class="project-card project-card-featured" data-category="apps">
|
||
<div class="project-card-body">
|
||
<div class="project-card-meta">
|
||
<span class="tag">Swift, Kotlin</span>
|
||
<span class="project-badge">Featured project</span>
|
||
</div>
|
||
<h3>
|
||
<a href="https://github.com/pepaskopec-blip/Graduately" target="_blank" rel="noopener noreferrer">Graduately</a>
|
||
</h3>
|
||
<p>My biggest project yet. It is an educational SwiftUI/ Kotlin app for maturita/graduation preparation — The app is cross-platform and it is available on Mac, iPhone, Android, iPad, Windows and Linux. I am really proud of it.</p>
|
||
<ul class="project-pills" aria-label="Platforms and technologies">
|
||
<li>SwiftUI</li>
|
||
<li>Kotlin + Compose</li>
|
||
<li>macOS & iOS</li>
|
||
<li>Android</li>
|
||
<li>Windows & Linux</li>
|
||
<li>13 subjects</li>
|
||
</ul>
|
||
<div class="project-card-actions">
|
||
<a class="btn btn-primary" href="https://github.com/pepaskopec-blip/Graduately" target="_blank" rel="noopener noreferrer">View on GitHub →</a>
|
||
<a class="btn btn-ghost" href="https://github.com/pepaskopec-blip/Graduately#install" target="_blank" rel="noopener noreferrer">Install guide</a>
|
||
</div>
|
||
</div>
|
||
<a class="project-preview project-preview-graduately" href="https://github.com/pepaskopec-blip/Graduately" target="_blank" rel="noopener noreferrer" aria-label="Open Graduately on GitHub">
|
||
<img class="preview-graduately-shot" src="graduately-home.webp" width="1600" height="1199" loading="lazy" decoding="async" alt="Graduately app dashboard screenshot">
|
||
<img class="preview-graduately-icon" src="graduately-icon.webp" width="256" height="256" loading="lazy" decoding="async" alt="">
|
||
</a>
|
||
</li>
|
||
|
||
<!-- Homelab -->
|
||
<li class="project-card" data-category="infra">
|
||
<a class="project-preview project-preview-homelab" href="index.html#services" aria-hidden="true" tabindex="-1">
|
||
<div class="mock-rack">
|
||
<div class="mock-rack-header">
|
||
<span class="mock-status-dot"></span>
|
||
<span class="mock-rack-title">pve-node · 10.0.0.200</span>
|
||
<span class="mock-rack-uptime">10+ LXC / VMs</span>
|
||
</div>
|
||
<div class="mock-rack-bars">
|
||
<div class="mock-bar-row">
|
||
<span>CPU · Xeon 10C/20T</span>
|
||
<div class="mock-bar"><i style="width: 34%"></i></div>
|
||
</div>
|
||
<div class="mock-bar-row">
|
||
<span>RAM · 40 GB ECC</span>
|
||
<div class="mock-bar"><i style="width: 62%"></i></div>
|
||
</div>
|
||
</div>
|
||
<div class="mock-service-chips">
|
||
<span>Jellyfin</span>
|
||
<span>Ollama</span>
|
||
<span>Navidrome</span>
|
||
<span>Immich</span>
|
||
<span>Pi-hole</span>
|
||
<span>SearXNG</span>
|
||
<span>Joplin</span>
|
||
<span>NAS</span>
|
||
<span>Tailscale</span>
|
||
<span>Cloudflared</span>
|
||
</div>
|
||
</div>
|
||
</a>
|
||
<div class="project-card-body">
|
||
<div class="project-card-meta">
|
||
<span class="tag">Proxmox</span>
|
||
<span class="project-status">Self-hosted · 24/7</span>
|
||
</div>
|
||
<h3>
|
||
<a href="index.html#services">Homelab</a>
|
||
</h3>
|
||
<p>I just wanted a NAS server, but now I host almost everything. It uses Proxmox as the operating system and virtualization. I have more than ten LXC containers and VMs for my services. I also set up automatic restarts for maximum safety and updates.</p>
|
||
<ul class="project-pills" aria-label="Technologies">
|
||
<li>Proxmox VE</li>
|
||
<li>LXC & QEMU</li>
|
||
<li>Tailscale</li>
|
||
<li>Cloudflare Tunnels</li>
|
||
</ul>
|
||
<a class="project-link" href="index.html#services">See services →</a>
|
||
</div>
|
||
</li>
|
||
|
||
<!-- skopec.dev -->
|
||
<li class="project-card" data-category="apps">
|
||
<a class="project-preview project-preview-site" href="https://github.com/pepaskopec-blip/skopec.dev" target="_blank" rel="noopener noreferrer" aria-hidden="true" tabindex="-1">
|
||
<div class="mock-browser">
|
||
<div class="mock-browser-bar">
|
||
<span class="mock-dots"><i></i><i></i><i></i></span>
|
||
<span class="mock-url">https://skopec.dev</span>
|
||
<span class="mock-cache-tag">CF HIT</span>
|
||
</div>
|
||
<div class="mock-browser-canvas">
|
||
<div class="mock-site-hero">
|
||
<div class="mock-site-lines">
|
||
<span class="mock-line-title">Josef<i>.</i></span>
|
||
<span class="mock-line-sub"></span>
|
||
<span class="mock-line-sub short"></span>
|
||
</div>
|
||
<div class="mock-site-orb"></div>
|
||
</div>
|
||
<div class="mock-pipeline">
|
||
<span>Proxmox Origin</span>
|
||
<span class="mock-arrow">→</span>
|
||
<span>Cloudflared</span>
|
||
<span class="mock-arrow">→</span>
|
||
<span class="mock-edge">Edge Cache</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</a>
|
||
<div class="project-card-body">
|
||
<div class="project-card-meta">
|
||
<span class="tag">HTML</span>
|
||
<span class="project-status">Live · Cached</span>
|
||
</div>
|
||
<h3>
|
||
<a href="https://github.com/pepaskopec-blip/skopec.dev" target="_blank" rel="noopener noreferrer">skopec.dev</a>
|
||
</h3>
|
||
<p>This site, written in html, hosted on my Homelab/Proxmox server. It has caching enabled on Cloudflared so it does not have to load everything from the origin server.</p>
|
||
<ul class="project-pills" aria-label="Technologies">
|
||
<li>HTML5 & CSS3</li>
|
||
<li>Vanilla JS</li>
|
||
<li>Cloudflared</li>
|
||
<li>Zero dependencies</li>
|
||
</ul>
|
||
<a class="project-link" href="https://github.com/pepaskopec-blip/skopec.dev" target="_blank" rel="noopener noreferrer">View on GitHub →</a>
|
||
</div>
|
||
</li>
|
||
|
||
<!-- Snake-Pygame- -->
|
||
<li class="project-card" data-category="games">
|
||
<div class="project-preview project-preview-snake">
|
||
<div class="mock-arcade">
|
||
<div class="mock-arcade-hud">
|
||
<span>SNAKE.PY</span>
|
||
<span data-snake-score>SCORE 0140</span>
|
||
</div>
|
||
<canvas class="snake-canvas" data-snake-canvas width="280" height="126" aria-label="Animated Snake game preview"></canvas>
|
||
</div>
|
||
</div>
|
||
<div class="project-card-body">
|
||
<div class="project-card-meta">
|
||
<span class="tag">Python</span>
|
||
<span class="project-status">Arcade game</span>
|
||
</div>
|
||
<h3>
|
||
<a href="https://github.com/pepaskopec-blip/Snake-Pygame-" target="_blank" rel="noopener noreferrer">Snake-Pygame-</a>
|
||
</h3>
|
||
<p>My first game in python, it is like 90% ai code, when I made it for the first time, I thought that it looks good, but now it looks like ai slop. Still it is very solid game packed with a lot of features, so it is pretty fun to play or try :D</p>
|
||
<ul class="project-pills" aria-label="Technologies">
|
||
<li>Python</li>
|
||
<li>Pygame</li>
|
||
<li>Power-ups</li>
|
||
<li>Arcade modes</li>
|
||
</ul>
|
||
<a class="project-link" href="https://github.com/pepaskopec-blip/Snake-Pygame-" target="_blank" rel="noopener noreferrer">View on GitHub →</a>
|
||
</div>
|
||
</li>
|
||
|
||
<!-- BatchGym -->
|
||
<li class="project-card" data-category="games">
|
||
<a class="project-preview project-preview-batch" href="https://github.com/pepaskopec-blip/BatchGym" target="_blank" rel="noopener noreferrer" aria-hidden="true" tabindex="-1">
|
||
<div class="mock-terminal">
|
||
<div class="mock-terminal-bar">
|
||
<span>C:\WINDOWS\system32\cmd.exe — BatchGym.bat</span>
|
||
<span>×</span>
|
||
</div>
|
||
<div class="mock-terminal-body">
|
||
<div class="term-header">[ BATCH GYM RPG · DAY 12 · CASH: $85 ]</div>
|
||
<div class="term-stats">
|
||
<span>STR ████████░░ 80%</span>
|
||
<span>NRG ███████░░░ 70%</span>
|
||
</div>
|
||
<div class="term-log">> Stack: Creatine + Whey Isolate</div>
|
||
<div class="term-prompt">> [1] Bench Press [2] Shop [3] Rest<i class="term-cursor"></i></div>
|
||
</div>
|
||
</div>
|
||
</a>
|
||
<div class="project-card-body">
|
||
<div class="project-card-meta">
|
||
<span class="tag">Batchfile</span>
|
||
<span class="project-status">Console RPG</span>
|
||
</div>
|
||
<h3>
|
||
<a href="https://github.com/pepaskopec-blip/BatchGym" target="_blank" rel="noopener noreferrer">BatchGym</a>
|
||
</h3>
|
||
<p>First game ever — a freshman school project for console application, written in bash, it can natively run only on Windows. Text-based RPG that simulates a gym visit: manage money, buy supplements, and complete sets.</p>
|
||
<ul class="project-pills" aria-label="Technologies">
|
||
<li>Windows Batch</li>
|
||
<li>CLI RPG</li>
|
||
<li>School project</li>
|
||
</ul>
|
||
<a class="project-link" href="https://github.com/pepaskopec-blip/BatchGym" target="_blank" rel="noopener noreferrer">View on GitHub →</a>
|
||
</div>
|
||
</li>
|
||
|
||
<!-- Terra -->
|
||
<li class="project-card" data-category="infra">
|
||
<a class="project-preview project-preview-terra" href="https://terra.hackclub.com/" target="_blank" rel="noopener noreferrer" aria-hidden="true" tabindex="-1">
|
||
<div class="mock-terra">
|
||
<div class="mock-terra-top">
|
||
<span class="mock-terra-badge">HACK CLUB · YSWS</span>
|
||
<span class="mock-terra-duration">3 MONTHS</span>
|
||
</div>
|
||
<div class="mock-terra- tracks">
|
||
<div class="mock-terra-track">
|
||
<div class="mock-terra-label">
|
||
<span>Human coding</span>
|
||
<strong>10h / week</strong>
|
||
</div>
|
||
<div class="mock-bar"><i style="width: 78%"></i></div>
|
||
</div>
|
||
<div class="mock-terra-track">
|
||
<div class="mock-terra-label">
|
||
<span>AI coding</span>
|
||
<strong>30h / week</strong>
|
||
</div>
|
||
<div class="mock-bar"><i style="width: 65%"></i></div>
|
||
</div>
|
||
</div>
|
||
<div class="mock-terra-reward">
|
||
<span>Final reward</span>
|
||
<strong>Framework Laptop / iPad</strong>
|
||
</div>
|
||
</div>
|
||
</a>
|
||
<div class="project-card-body">
|
||
<div class="project-card-meta">
|
||
<span class="tag">Terra</span>
|
||
<span class="project-status">Hack Club · Active</span>
|
||
</div>
|
||
<h3>
|
||
<a href="https://terra.hackclub.com" target="_blank" rel="noopener noreferrer">Terra</a>
|
||
</h3>
|
||
<p>Terra is a You Ship, We Ship program run by Hack Club. It combines gamified farming mechanics with real-world software development, where coding translates into in-game resources to earn a free modular laptop or tablet.</p>
|
||
<ul class="project-pills" aria-label="Program details">
|
||
<li>Hack Club</li>
|
||
<li>10h / 30h weekly</li>
|
||
<li>Framework / iPad</li>
|
||
</ul>
|
||
<a class="project-link" href="https://terra.hackclub.com/" target="_blank" rel="noopener noreferrer">View their site →</a>
|
||
</div>
|
||
</li>
|
||
|
||
<!-- Jellyfin -->
|
||
<li class="project-card" data-category="services">
|
||
<a class="project-preview" href="https://jelly.skopec.dev" target="_blank" rel="noopener noreferrer" aria-hidden="true" tabindex="-1">
|
||
<div class="mock-svc">
|
||
<div class="mock-svc-top">
|
||
<span class="mock-status-dot"></span>
|
||
<span>jellyfin</span>
|
||
<span class="mock-svc-host">jelly.skopec.dev</span>
|
||
</div>
|
||
<div class="mock-posters" aria-hidden="true"><i></i><i></i><i></i><i></i></div>
|
||
<div class="mock-now"><strong>Library</strong> · movies & TV on the NAS</div>
|
||
</div>
|
||
</a>
|
||
<div class="project-card-body">
|
||
<div class="project-card-meta">
|
||
<span class="tag">Jellyfin</span>
|
||
<span class="project-status">Movies & TV</span>
|
||
</div>
|
||
<h3>
|
||
<a href="https://jelly.skopec.dev" target="_blank" rel="noopener noreferrer">Jellyfin</a>
|
||
</h3>
|
||
<p>Movies and TV on my own server, with the library on the NAS. This is the one service with a public address — jelly.skopec.dev — the rest stay on the LAN or Tailscale.</p>
|
||
<ul class="project-pills" aria-label="Details">
|
||
<li>Self-hosted</li>
|
||
<li>Movies & TV</li>
|
||
<li>jelly.skopec.dev</li>
|
||
</ul>
|
||
<a class="project-link" href="https://jelly.skopec.dev" target="_blank" rel="noopener noreferrer">Open Jellyfin →</a>
|
||
</div>
|
||
</li>
|
||
|
||
<!-- Navidrome -->
|
||
<li class="project-card" data-category="services">
|
||
<a class="project-preview" href="http://10.0.0.103:4533" target="_blank" rel="noopener noreferrer" aria-hidden="true" tabindex="-1">
|
||
<div class="mock-svc">
|
||
<div class="mock-svc-top">
|
||
<span class="mock-status-dot"></span>
|
||
<span>navidrome</span>
|
||
<span class="mock-svc-host">10.0.0.103:4533</span>
|
||
</div>
|
||
<div class="mock-track">
|
||
<div class="mock-album" aria-hidden="true"></div>
|
||
<div>
|
||
<div class="mock-track-title">Library</div>
|
||
<div class="mock-track-by">Music · on the LAN</div>
|
||
<div class="mock-bar"><i style="width: 46%"></i></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</a>
|
||
<div class="project-card-body">
|
||
<div class="project-card-meta">
|
||
<span class="tag">Navidrome</span>
|
||
<span class="project-status">Music</span>
|
||
</div>
|
||
<h3>
|
||
<a href="http://10.0.0.103:4533" target="_blank" rel="noopener noreferrer">Navidrome</a>
|
||
</h3>
|
||
<p>Music from the homelab. Navidrome serves the library over the Subsonic API, so the same collection plays in the browser or in a phone app on my network.</p>
|
||
<ul class="project-pills" aria-label="Details">
|
||
<li>Self-hosted</li>
|
||
<li>Subsonic API</li>
|
||
<li>Music</li>
|
||
</ul>
|
||
<a class="project-link" href="http://10.0.0.103:4533" target="_blank" rel="noopener noreferrer">Open Navidrome →</a>
|
||
</div>
|
||
</li>
|
||
|
||
<!-- Ollama -->
|
||
<li class="project-card" data-category="services">
|
||
<a class="project-preview" href="http://10.0.0.106:3000" target="_blank" rel="noopener noreferrer" aria-hidden="true" tabindex="-1">
|
||
<div class="mock-svc">
|
||
<div class="mock-svc-top">
|
||
<span class="mock-status-dot"></span>
|
||
<span>ollama</span>
|
||
<span class="mock-svc-host">10.0.0.106:3000</span>
|
||
</div>
|
||
<div class="mock-chat">
|
||
<div class="mock-bubble ask">run it locally</div>
|
||
<div class="mock-bubble reply">model on the homelab · stays on the network</div>
|
||
</div>
|
||
</div>
|
||
</a>
|
||
<div class="project-card-body">
|
||
<div class="project-card-meta">
|
||
<span class="tag">Ollama</span>
|
||
<span class="project-status">Local AI</span>
|
||
</div>
|
||
<h3>
|
||
<a href="http://10.0.0.106:3000" target="_blank" rel="noopener noreferrer">Ollama</a>
|
||
</h3>
|
||
<p>Local AI on the Proxmox box. Models run on my hardware, so a prompt stays on the network instead of going out to a hosted API. I do not have dedicated GPU, so all of the llms run on CPU, which limits me for only some weaker models under 15B parameters.</p>
|
||
<ul class="project-pills" aria-label="Details">
|
||
<li>Self-hosted</li>
|
||
<li>Local LLM</li>
|
||
<li>Private</li>
|
||
</ul>
|
||
<a class="project-link" href="http://10.0.0.106:3000" target="_blank" rel="noopener noreferrer">Open Ollama →</a>
|
||
</div>
|
||
</li>
|
||
|
||
<!-- SearXNG -->
|
||
<li class="project-card" data-category="services">
|
||
<a class="project-preview" href="http://10.0.0.104:8080" target="_blank" rel="noopener noreferrer" aria-hidden="true" tabindex="-1">
|
||
<div class="mock-svc">
|
||
<div class="mock-svc-top">
|
||
<span class="mock-status-dot"></span>
|
||
<span>searxng</span>
|
||
<span class="mock-svc-host">10.0.0.104:8080</span>
|
||
</div>
|
||
<div class="mock-search"><span class="mock-search-icon" aria-hidden="true">⌕</span><span>search the web</span></div>
|
||
<div class="mock-search-meta"><span>general</span><span>images</span><span>news</span></div>
|
||
</div>
|
||
</a>
|
||
<div class="project-card-body">
|
||
<div class="project-card-meta">
|
||
<span class="tag">SearXNG</span>
|
||
<span class="project-status">Search</span>
|
||
</div>
|
||
<h3>
|
||
<a href="http://10.0.0.104:8080" target="_blank" rel="noopener noreferrer">SearXNG</a>
|
||
</h3>
|
||
<p>Search I run myself. SearXNG asks other engines and brings the results back, without an account on a big search site.</p>
|
||
<ul class="project-pills" aria-label="Details">
|
||
<li>Self-hosted</li>
|
||
<li>Metasearch</li>
|
||
<li>Private</li>
|
||
</ul>
|
||
<a class="project-link" href="http://10.0.0.104:8080" target="_blank" rel="noopener noreferrer">Open SearXNG →</a>
|
||
</div>
|
||
</li>
|
||
|
||
<!-- ConvertX -->
|
||
<li class="project-card" data-category="services">
|
||
<a class="project-preview" href="http://10.0.0.107:3000" target="_blank" rel="noopener noreferrer" aria-hidden="true" tabindex="-1">
|
||
<div class="mock-svc">
|
||
<div class="mock-svc-top">
|
||
<span class="mock-status-dot"></span>
|
||
<span>convertx</span>
|
||
<span class="mock-svc-host">10.0.0.107:3000</span>
|
||
</div>
|
||
<div class="mock-jobs">
|
||
<div><span>image</span><em>→</em><span>png</span><b>local</b></div>
|
||
<div><span>document</span><em>→</em><span>pdf</span><b>local</b></div>
|
||
<div><span>audio</span><em>→</em><span>mp3</span><b>local</b></div>
|
||
</div>
|
||
</div>
|
||
</a>
|
||
<div class="project-card-body">
|
||
<div class="project-card-meta">
|
||
<span class="tag">ConvertX</span>
|
||
<span class="project-status">File conversion</span>
|
||
</div>
|
||
<h3>
|
||
<a href="http://10.0.0.107:3000" target="_blank" rel="noopener noreferrer">ConvertX</a>
|
||
</h3>
|
||
<p>File conversion on the lab. When something needs another format, it converts here instead of uploading the file to a random website.</p>
|
||
<ul class="project-pills" aria-label="Details">
|
||
<li>Self-hosted</li>
|
||
<li>Files</li>
|
||
<li>Private</li>
|
||
</ul>
|
||
<a class="project-link" href="http://10.0.0.107:3000" target="_blank" rel="noopener noreferrer">Open ConvertX →</a>
|
||
</div>
|
||
</li>
|
||
|
||
<!-- Pi-hole -->
|
||
<li class="project-card" data-category="services">
|
||
<a class="project-preview" href="http://10.0.0.100/admin" target="_blank" rel="noopener noreferrer" aria-hidden="true" tabindex="-1">
|
||
<div class="mock-svc">
|
||
<div class="mock-svc-top">
|
||
<span class="mock-status-dot"></span>
|
||
<span>pi-hole</span>
|
||
<span class="mock-svc-host">10.0.0.100</span>
|
||
</div>
|
||
<div class="mock-stat">
|
||
<strong>DNS</strong>
|
||
<span>ads & trackers</span>
|
||
</div>
|
||
<div class="mock-bar"><i style="width: 38%"></i></div>
|
||
<div class="mock-stat-rows">
|
||
<div><span>Blocking</span><span>on</span></div>
|
||
<div><span>Resolver</span><span>LAN</span></div>
|
||
</div>
|
||
</div>
|
||
</a>
|
||
<div class="project-card-body">
|
||
<div class="project-card-meta">
|
||
<span class="tag">Pi-hole</span>
|
||
<span class="project-status">DNS</span>
|
||
</div>
|
||
<h3>
|
||
<a href="http://10.0.0.100/admin" target="_blank" rel="noopener noreferrer">Pi-hole</a>
|
||
</h3>
|
||
<p>DNS for the network, with ad blocking in front of it. Probably the most useful service on my homelab, it is able to block ads even in apps on mobile, also it blocks malware and dangerous content. Not a long time ago, I have set up DNS over HTTPS for maximum privacy.</p>
|
||
<ul class="project-pills" aria-label="Details">
|
||
<li>DNS</li>
|
||
<li>Ad blocking</li>
|
||
<li>Network</li>
|
||
</ul>
|
||
<a class="project-link" href="http://10.0.0.100/admin" target="_blank" rel="noopener noreferrer">Open Pi-hole →</a>
|
||
</div>
|
||
</li>
|
||
|
||
<!-- Joplin -->
|
||
<li class="project-card" data-category="services">
|
||
<a class="project-preview" href="http://10.0.0.111:22300" target="_blank" rel="noopener noreferrer" aria-hidden="true" tabindex="-1">
|
||
<div class="mock-svc">
|
||
<div class="mock-svc-top">
|
||
<span class="mock-status-dot"></span>
|
||
<span>joplin</span>
|
||
<span class="mock-svc-host">10.0.0.111:22300</span>
|
||
</div>
|
||
<div class="mock-notes">
|
||
<div><i></i>Notes</div>
|
||
<div><i></i>Sync server</div>
|
||
<div><i></i>On the homelab</div>
|
||
</div>
|
||
</div>
|
||
</a>
|
||
<div class="project-card-body">
|
||
<div class="project-card-meta">
|
||
<span class="tag">Joplin</span>
|
||
<span class="project-status">Notes</span>
|
||
</div>
|
||
<h3>
|
||
<a href="http://10.0.0.111:22300" target="_blank" rel="noopener noreferrer">Joplin</a>
|
||
</h3>
|
||
<p>Notes that sync to the homelab. Joplin is the notebook, and the sync target is my own server instead of someone else’s cloud.</p>
|
||
<ul class="project-pills" aria-label="Details">
|
||
<li>Self-hosted</li>
|
||
<li>Notes</li>
|
||
<li>Sync</li>
|
||
</ul>
|
||
<a class="project-link" href="http://10.0.0.111:22300" target="_blank" rel="noopener noreferrer">Open Joplin →</a>
|
||
</div>
|
||
</li>
|
||
|
||
<!-- Immich -->
|
||
<li class="project-card" data-category="services">
|
||
<a class="project-preview" href="http://10.0.0.109:2283" target="_blank" rel="noopener noreferrer" aria-hidden="true" tabindex="-1">
|
||
<div class="mock-svc">
|
||
<div class="mock-svc-top">
|
||
<span class="mock-status-dot"></span>
|
||
<span>immich</span>
|
||
<span class="mock-svc-host">10.0.0.109:2283</span>
|
||
</div>
|
||
<div class="mock-photos" aria-hidden="true"><i></i><i></i><i></i><i></i><i></i><i></i></div>
|
||
<div class="mock-now"><strong>Library</strong> · photos on the NAS</div>
|
||
</div>
|
||
</a>
|
||
<div class="project-card-body">
|
||
<div class="project-card-meta">
|
||
<span class="tag">Immich</span>
|
||
<span class="project-status">Photos</span>
|
||
</div>
|
||
<h3>
|
||
<a href="http://10.0.0.109:2283" target="_blank" rel="noopener noreferrer">Immich</a>
|
||
</h3>
|
||
<p>Photo library on the NAS. Immich is where the pictures live, with a web UI instead of a shared folder.</p>
|
||
<ul class="project-pills" aria-label="Details">
|
||
<li>Self-hosted</li>
|
||
<li>Photos</li>
|
||
<li>NAS</li>
|
||
</ul>
|
||
<a class="project-link" href="http://10.0.0.109:2283" target="_blank" rel="noopener noreferrer">Open Immich →</a>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</section>
|
||
</main>
|
||
|
||
<footer class="site-footer">
|
||
<div class="footer-inner">
|
||
<span>© <span data-year></span> Josef · skopec.dev</span>
|
||
<nav class="footer-links" aria-label="Footer">
|
||
<a href="index.html">Home</a>
|
||
<a href="hardware.html">Hardware</a>
|
||
<a href="index.html#connect">Get in touch</a>
|
||
<a href="privacy.html">Privacy</a>
|
||
</nav>
|
||
</div>
|
||
</footer>
|
||
|
||
<script src="script.js?v=20261027" defer></script>
|
||
</body>
|
||
</html>
|