<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Minerva – Alles für Arbeit und Kreativität an einem Ort</title>
<meta name="description" content="Projekte planen, im Team arbeiten, Arbeit finden und vergeben – mit Agenten für die Routine. Im Browser, als Desktop-App oder auf dem eigenen Server. Lokal von Haus aus.">
<link rel="stylesheet" href="/static/vendor/fontawesome/css/fontawesome.min.css">
<link rel="stylesheet" href="/static/vendor/fontawesome/css/solid.min.css">
<link rel="stylesheet" href="/static/landung.css?v={{ v() }}">
</head>
<body>
<nav class="leiste" aria-label="Abschnitte">
  <a class="leiste__logo" href="#oben" title="Nach oben"><img src="/static/symbol.png" alt="Minerva"></a>
  <a href="#planung" title="Planung" aria-current="false"><i class="fa-solid fa-calendar-days"></i></a>
  <a href="#werkstatt" title="Dateien und Werkstatt" aria-current="false"><i class="fa-solid fa-folder-tree"></i></a>
  <a href="#zusammenarbeit" title="Zusammenarbeit" aria-current="false"><i class="fa-solid fa-users"></i></a>
  <a href="#markt" title="Markt und Wissen" aria-current="false"><i class="fa-solid fa-handshake"></i></a>
  <a href="#automatisierung" title="Automatisierung" aria-current="false"><i class="fa-solid fa-robot"></i></a>
  <a href="#lokal" title="Lokal von Haus aus" aria-current="false"><i class="fa-solid fa-shield-halved"></i></a>
  <a class="leiste__ende" href="#herunterladen" title="Herunterladen" aria-current="false"><i class="fa-solid fa-download"></i></a>
</nav>

<div class="seite" id="oben">
  <header class="kopf">
    <a class="marke" href="/"><img src="/static/symbol.png" alt=""> Minerva</a>
    <nav>
      <a href="#herunterladen">Herunterladen</a>
      <a class="knopf knopf--voll" href="{{ app_url }}"><i class="fa-solid fa-right-to-bracket"></i> Im Browser starten</a>
    </nav>
  </header>

  <section class="held">
    <h1>Alles für Arbeit und Kreativität an einem Ort.</h1>
    <p class="rede">Projekte planen, im Team arbeiten, Arbeit finden und vergeben.
       Agenten übernehmen die Routine; du setzt die Ziele und behältst den Überblick.
       Minerva läuft im Browser, auf deinem Rechner oder auf deinem eigenen Server –
       und baut von sich aus keine Verbindung nach außen auf.</p>
    <div class="wege">
      <a class="knopf knopf--voll knopf--gross" href="{{ app_url }}"><i class="fa-solid fa-right-to-bracket"></i> Im Browser starten</a>
      <a class="knopf knopf--rand knopf--gross" href="#herunterladen"><i class="fa-solid fa-laptop"></i> Desktop-App herunterladen</a>
      <a class="still" href="#server">Selbst betreiben</a>
    </div>
    <figure class="held__bild">
      <div class="schirm">
        <img src="/static/landung/web-tag.png" width="1250" height="833"
             alt="Mein Tag: drei Vorgänge auf den Tag verteilt, daneben Auslastung und nächste Besprechungen">
      </div>
      <figcaption>Mein Tag verteilt die freie Zeit auf die eigenen offenen Vorgänge – kritische zuerst – und zeigt, was heute nicht mehr passt.</figcaption>
    </figure>
  </section>
</div>

<section class="abschnitt" id="planung">
  <div class="seite abschnitt__innen">
    <div>
      <h2>Vier Ansichten, dieselben Daten</h2>
      <p>Kalender über alle Projekte, Balkenplan mit kritischem Pfad und Puffern,
         Kanban zum Ziehen, Vorgangsliste als Tabelle. Termine rechnet Minerva
         selbst: wer einen Vorgang verschiebt, sieht sofort, was nachrückt.</p>
      <ul class="punkte">
        <li>Kritischer Pfad, Puffer und Meilensteine aus den Anordnungsbeziehungen</li>
        <li>Terminvorschläge für Besprechungen aus den Arbeitszeiten aller Beteiligten</li>
        <li>Risiken ohne Sprachmodell: überfällig, ohne Fortschritt, überlastet – gerechnet, nicht geschätzt</li>
        <li>Statusbericht als Markdown, mit Zahlen und einem Erzählteil</li>
      </ul>
    </div>
    <figure class="schirm">
      <img src="/static/landung/web-gantt.png" width="1250" height="833" loading="lazy"
           alt="Balkenplan eines Projekts mit kritischem Pfad, Heute-Linie, Puffer und Meilenstein">
    </figure>
  </div>
</section>

<section class="abschnitt" id="werkstatt">
  <div class="seite abschnitt__innen">
    <div>
      <h2>Ein Arbeitsordner je Projekt</h2>
      <p>Dateien liegen beim Projekt, nicht daneben. Der Explorer zeigt den Ordner
         als Baum, der Editor ist der von VS Code – mitgeliefert, auch ohne Netz.
         Unten laufen Protokoll und Aufträge, in der Desktop-App auch die Konsole.</p>
      <ul class="punkte">
        <li>Suchen und Ersetzen, Mehrfachcursor, Sprache nach Dateiendung, Markdown mit Vorschau</li>
        <li>Speichern mit Stand: hat jemand die Datei inzwischen geändert, fragt ein Dialog</li>
        <li>Befehlspalette mit <kbd>Strg</kbd>+<kbd>Umschalt</kbd>+<kbd>P</kbd>, Dateien mit <kbd>Strg</kbd>+<kbd>P</kbd></li>
        <li>Reiter, Seitenleiste und Breite merkt sich der Browser je Projekt</li>
      </ul>
    </div>
    <figure class="schirm">
      <img src="/static/landung/werkstatt.png" width="1500" height="950" loading="lazy"
           alt="Werkstatt: Explorer mit Arbeitsordner, Editor mit README.md, unten das Protokoll">
    </figure>
  </div>
</section>

<section class="abschnitt" id="zusammenarbeit">
  <div class="seite abschnitt__innen">
    <div>
      <h2>Struktur wie im Haus, Rollen von oben nach unten</h2>
      <p>Unternehmen, Niederlassungen und Abteilungen bilden einen Baum – so
         verzweigt wie die echte Firma. Eine Rolle vererbt sich nach unten:
         Administration, Leitung oder Mitglied. Arbeit, Freelance und Persönliches
         bleiben getrennte Bereiche in derselben Anwendung.</p>
      <ul class="punkte">
        <li>Kommentare mit Checklisten direkt am Vorgang</li>
        <li>Dokumente je Projekt; eine gleichnamige Datei wird zur neuen Fassung</li>
        <li>Chat je Arbeitsbereich und Projekt, Gespräche zu zweit</li>
        <li>Post aus dem eigenen Postfach: eine Mail wird zum Vorgang oder zur Nachricht</li>
      </ul>
    </div>
    <figure class="schirm">
      <img src="/static/landung/web-vorgang.png" width="1250" height="833" loading="lazy"
           alt="Ein Vorgang mit Terminen, Verantwortlicher, Vorgängern und Kommentaren mit Checkliste">
    </figure>
  </div>
</section>

<section class="abschnitt" id="markt">
  <div class="seite abschnitt__innen">
    <div>
      <h2>Arbeit ausschreiben, bieten, vergeben</h2>
      <p>Wer einen Bereich leitet, schreibt Arbeit aus – im Haus oder als
         Freelance-Auftrag. Alle anderen bieten, mit Preis und Begründung; Gebote
         sieht nur die Leitung. Wissenstests zeigen im Profil, wer was kann, und
         eine Ausschreibung kann eine Stufe verlangen.</p>
    </div>
    <ol class="schritte">
      <li class="schritt"><b><span>1</span>Ausschreiben</b><p>Titel, Budget, Aufwand, Frist – wahlweise mit Projektbezug.</p></li>
      <li class="schritt"><b><span>2</span>Bieten</b><p>Ein Gebot je Person, Nachbessern erlaubt. Niemand sieht die Gebote der anderen.</p></li>
      <li class="schritt"><b><span>3</span>Zuschlag</b><p>Legt den Vorgang im Projekt an, weist ihn zu und gibt der Person Zugang.</p></li>
    </ol>
  </div>
</section>

<section class="abschnitt" id="automatisierung">
  <div class="seite abschnitt__innen">
    <div>
      <h2>Agenten für die Routine, das Sprachmodell auf deinem Rechner</h2>
      <p>Der Assistent kennt das Projekt – Vorgänge, Puffer, Beteiligte, Risiken –
         und schlägt Änderungen vor, führt sie aber nie selbst aus. Die
         Agenten-Zentrale zeigt Aufträge im Hintergrund, eigene Agenten und
         externe, die sich per Token melden.</p>
    </div>
    <ul class="punkte">
      <li>Das Sprachmodell läuft lokal in LM Studio; ein Cloud-Anbieter ist ein Konnektor, den du ausdrücklich einschaltest</li>
      <li>Konnektoren für Modellanbieter, GitHub und ausgehende Webhooks – alle als „sendet Daten nach außen“ gekennzeichnet, keiner vorausgewählt</li>
      <li>Erweiterungen als Pakete wie in VS Code: abgeschaltet heißt kein Menüpunkt, kein Skript, kein Endpunkt</li>
      <li>Aufgaben aus dem Besprechungsprotokoll, Agenda-Vorschlag, Tageszusammenfassung per Mail</li>
    </ul>
  </div>
</section>

<section class="lokal" id="lokal">
  <div class="seite">
    <h2>Lokal von Haus aus.</h2>
    <p class="rede">Datenbank, Dateien und Sprachmodell laufen auf deinem Rechner oder
       deiner Infrastruktur. Eine Installation ohne Konnektoren baut keine
       Verbindung nach außen auf – das ist ein Versprechen, kein Standardwert.</p>
    <ul class="fakten">
      <li><i class="fa-solid fa-plug-circle-xmark"></i><b>Nichts sendet ungefragt</b>Jede Verbindung nach außen ist ein eigenes Modul, das du einschaltest.</li>
      <li><i class="fa-solid fa-lock"></i><b>Geheimnisse verschlüsselt</b>Schlüssel und Passwörter liegen verschlüsselt in der Datenbank, der Schlüssel dazu bei dir.</li>
      <li><i class="fa-solid fa-box"></i><b>Alles mitgeliefert</b>Symbole, Editor und Schriften kommen aus dem Paket, nicht aus einem Fremdnetz.</li>
    </ul>
  </div>
</section>

<section class="abschnitt" id="herunterladen">
  <div class="seite">
    <h2>Drei Wege, ein Minerva</h2>
    <p>Dieselbe Anwendung, du wählst den Ort der Daten.</p>
    <div class="wege3">
      <div class="weg">
        <h3>Im Browser</h3>
        <p>Konto anlegen und sofort loslegen. Für Teams, die nichts einrichten wollen.</p>
        <a class="knopf knopf--voll knopf--gross" href="{{ app_url }}"><i class="fa-solid fa-right-to-bracket"></i> Im Browser starten</a>
        <p class="hinweis">{{ app_url | replace("https://", "") }}</p>
      </div>
      <div class="weg" id="desktop">
        <h3>Auf dem eigenen Rechner</h3>
        <p>Ein Konto, keine Anmeldung, alle Daten im Benutzerverzeichnis.</p>
        {% if desktop %}
        <ul class="pakete">
          {% for os, p in desktop %}
          <li><a class="paket" href="/install/{{ p.name }}">
            <i class="fa-solid fa-laptop"></i>
            <span>{{ {'macos': 'macOS', 'windows': 'Windows', 'linux': 'Linux'}.get(os, 'Desktop') }}
              <small>{{ p.name }} ({{ p.groesse }})</small></span>
            <i class="fa-solid fa-download"></i></a></li>
          {% endfor %}
        </ul>
        {% else %}
        <p class="leer">Derzeit ist kein Desktop-Paket bereitgestellt.</p>
        {% endif %}
        <p class="hinweis">Die App ist nicht signiert. macOS fragt beim ersten Start nach:
           Systemeinstellungen, Datenschutz &amp; Sicherheit, „Trotzdem öffnen“.
           Windows: „Weitere Informationen“, „Trotzdem ausführen“.</p>
      </div>
      <div class="weg" id="server">
        <h3>Für das ganze Haus</h3>
        <p>Docker genügt. Das Paket bringt die Container-Abbilder mit und braucht beim Einrichten kein Internet.</p>
        <pre>tar -xzf minerva-&lt;version&gt;.tar.gz
cd minerva-&lt;version&gt;
./install.sh</pre>
        {% if server %}
        <ul class="pakete">
          {% for p in server %}
          <li><a class="paket" href="/install/{{ p.name }}">
            <i class="fa-solid fa-server"></i>
            <span>Serverpaket <small>{{ p.name }} ({{ p.groesse }})</small></span>
            <i class="fa-solid fa-download"></i></a></li>
          {% endfor %}
        </ul>
        {% else %}
        <p class="leer">Derzeit ist kein Serverpaket bereitgestellt.</p>
        {% endif %}
        <p class="hinweis">Eigene Adresse mit HTTPS, Sicherung, Aktualisierung: <a href="/install#server">Anleitung</a>.</p>
      </div>
    </div>
  </div>
</section>

<footer class="status">
  Minerva Platform
  <nav>
    <a href="/install">Anleitung</a>
    <a href="{{ app_url }}/api/docs">API</a>
    <a href="{{ app_url }}">Im Browser starten</a>
  </nav>
</footer>

<script>
  // Die Leiste zeigt den Abschnitt, der gerade in der Mitte des Fensters liegt.
  const verweise = [...document.querySelectorAll('.leiste a[href^="#"]:not(.leiste__logo)')];
  const beobachter = new IntersectionObserver((eintraege) => {
    const oben = eintraege.filter(e => e.isIntersecting)
                          .sort((a, b) => b.intersectionRatio - a.intersectionRatio)[0];
    if (!oben) return;
    for (const a of verweise) a.setAttribute('aria-current', String(a.getAttribute('href') === '#' + oben.target.id));
  }, { rootMargin: '-35% 0px -55% 0px' });
  for (const a of verweise) {
    const ziel = document.querySelector(a.getAttribute('href'));
    if (ziel) beobachter.observe(ziel);
  }
</script>
</body>
</html>
