Files
plate-software-web/site/apps/index.html
T
2026-06-22 17:28:13 +02:00

122 lines
5.5 KiB
HTML

<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Apps — plate-software.de</title>
<meta name="description" content="Die Anwendungen, die aus dem plate-software-Homelab live laufen: CannaManage, InspectFlow und mehr." />
<meta name="author" content="Patrick Plate" />
<meta name="robots" content="index, follow" />
<meta property="og:title" content="Apps — plate-software.de" />
<meta property="og:description" content="Die Anwendungen, die aus dem plate-software-Homelab live laufen." />
<meta property="og:type" content="website" />
<meta property="og:locale" content="de_DE" />
<meta property="og:locale:alternate" content="en_US" />
<link rel="icon" href="data:image/svg+xml,&lt;svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22&gt;&lt;text y=%22.9em%22 font-size=%2290%22&gt;⬡&lt;/text&gt;&lt;/svg&gt;" />
<link rel="stylesheet" href="/assets/style.css" />
</head>
<body>
<header>
<div class="wrap nav">
<a class="brand" href="/"><span class="mark"></span> plate-software.de</a>
<nav class="nav-links">
<a href="/">
<span data-lang-de>Start</span>
<span data-lang-en>Home</span>
</a>
<a href="/apps/" class="active">Apps</a>
<a href="/homelab/">Homelab</a>
</nav>
<div class="lang-toggle" role="group" aria-label="Language">
<button id="btn-de" class="active" onclick="setLang('de')">DE</button>
<button id="btn-en" onclick="setLang('en')">EN</button>
</div>
</div>
</header>
<main>
<section class="hero" style="padding: 56px 0 24px;">
<div class="wrap">
<a class="back-link" href="/">
<span data-lang-de>← Zurück</span>
<span data-lang-en>← Back</span>
</a>
<h1>
<span data-lang-de>Apps aus dem <span class="grad">Homelab</span></span>
<span data-lang-en>Apps from the <span class="grad">homelab</span></span>
</h1>
<p class="lead">
<span data-lang-de>Built in the homelab, served from IONOS — same continuous-deploy story as this page itself.</span>
<span data-lang-en>Built in the homelab, served from IONOS — same continuous-deploy story as this page itself.</span>
</p>
</div>
</section>
<section style="padding: 24px 0 56px;">
<div class="wrap">
<div class="grid">
<!-- CannaManage -->
<div class="card">
<div class="icon">🌿</div>
<h3>CannaManage <span class="badge live">🟢 Live</span></h3>
<div class="sub" data-lang-de>Mitgliederverwaltung für Cannabis-Anbauvereinigungen</div>
<div class="sub" data-lang-en>Member management for German Cannabis Cultivation Associations</div>
<p data-lang-de>Mitgliederverwaltung für Cannabis-Anbauvereinigungen nach KCanG. Mitglieder, Beitragszahlungen, Abgabemengen-Tracking, gerichtsfeste Audit-Logs.</p>
<p data-lang-en>Member management for German Cannabis Cultivation Associations (CSCs) per KCanG. Members, dues, distribution tracking, court-proof audit logs.</p>
<a class="link" href="https://cannamanage.plate-software.de" target="_blank" rel="noopener">cannamanage.plate-software.de ↗</a>
</div>
<!-- InspectFlow -->
<div class="card">
<div class="icon">🛡️</div>
<h3>InspectFlow <span class="badge live">🟢 Live</span></h3>
<div class="sub" data-lang-de>Maschinen- und Sicherheitsinspektionen</div>
<div class="sub" data-lang-en>Machine and safety inspections</div>
<p data-lang-de>Maschinen- und Sicherheitsinspektionen für Produktionsbetriebe. Fragebogen-Engine, Tickets, Archiv, Audit-Trail mit Hibernate Envers.</p>
<p data-lang-en>Machine and safety inspections for production facilities. Questionnaire engine, tickets, archive, audit trail via Hibernate Envers.</p>
<a class="link" href="https://inspectflow.plate-software.de" target="_blank" rel="noopener">inspectflow.plate-software.de ↗</a>
</div>
</div>
</div>
</section>
</main>
<footer>
<div class="wrap foot-row">
<div>© <span id="year"></span> Patrick Plate · plate-software.de</div>
<div class="foot-links">
<a href="/">
<span data-lang-de>Start</span>
<span data-lang-en>Home</span>
</a>
<a href="/apps/">Apps</a>
<a href="/homelab/">Homelab</a>
</div>
</div>
<div class="wrap">
<p class="deploy-badge" data-de="Letzter Deploy: <!--DEPLOY_INFO-->" data-en="Last deploy: <!--DEPLOY_INFO-->"></p>
</div>
</footer>
<script>
function setLang(lang) {
document.documentElement.lang = lang;
document.getElementById('btn-de').classList.toggle('active', lang === 'de');
document.getElementById('btn-en').classList.toggle('active', lang === 'en');
document.querySelectorAll('[data-de][data-en]').forEach(function (el) {
el.textContent = el.getAttribute(lang === 'en' ? 'data-en' : 'data-de');
});
try { localStorage.setItem('ps-lang', lang); } catch (e) {}
}
(function () {
var saved;
try { saved = localStorage.getItem('ps-lang'); } catch (e) {}
var nav = (navigator.language || 'de').slice(0, 2);
setLang(saved || (nav === 'en' ? 'en' : 'de'));
var y = document.getElementById('year');
if (y) y.textContent = new Date().getFullYear();
})();
</script>
</body>
</html>