` (z. B. `4096`) im Container; alternativ den Arbeitsbereich in mehreren Teilen exportieren.
- Die Datei wird nur einmal hochgeladen: Die Vorschau behält sie auf dem Server, **Importieren** verwendet sie weiter. Brichst du ab, wird sie gelöscht, sonst spätestens nach sechs Stunden.
- Der Inhalt wird wie beim Einfügen bereinigt: Skripte, Formulare und eingebettete Fremdseiten fallen weg. Dateinamen werden bereinigt; Dateien, die der Browser ausführen könnte (HTML, SVG), werden nur zum Herunterladen gespeichert.
- Links zwischen importierten Seiten zeigen auf die neuen Seiten. Bilder und Anhänge werden hochgeladen – jede Datei einmal, auch wenn mehrere Seiten sie zeigen.
- **Als neue Datenbank** wird jede Notiz ein Eintrag mit den Eigenschaften *Tags*, *Erstellt*, *Geändert*, *Ordner* (der Ordnerpfad) und – wenn vorhanden – *Quelle*. Als Seiten werden Tags zu [Tags der Seite](/page-tags#tags-und-eigenschaften); fehlende werden im Arbeitsbereich angelegt.
## Von Notion
::: steps
1. In Notion: **Einstellungen → Exportieren** (für den ganzen Arbeitsbereich) oder im Menü **…** einer Seite **Exportieren**. Als Format **HTML** (empfohlen) oder **Markdown & CSV** wählen und **Unterseiten einschließen** aktivieren. Nur der HTML-Export enthält Toggles (aufklappbare Blöcke), Toggle-Überschriften und Farben.
2. In Flowplan: **Einstellungen → Import & Export → Import**, oben den Zielbereich wählen und bei **Notion, AppFlowy oder Markdown-Export (ZIP)** das ZIP auswählen.
3. Fertig – der Import läuft in einem Schritt. Schlägt er fehl, bleibt nichts halb importiert zurück.
:::
Was daraus wird:
- Jede HTML- oder Markdown-Datei wird zu einer Seite, jeder Ordner mit dem Namen einer Seite zu ihren Unterseiten. Die Kennungen, die Notion an Datei- und Ordnernamen hängt, fallen weg.
- Aus dem HTML-Export: Toggles werden zu [aufklappbaren Blöcken](/documents#aufklappbare-bloecke), Toggle-Überschriften zu Überschriften, die sich einklappen lassen (oder, wo ihr Inhalt nicht bis zur nächsten Überschrift reicht, zu aufklappbaren Blöcken mit der Überschrift als Titel). Text- und Hintergrundfarben, Aufgaben, verschachtelte Listen, Tabellen, Formeln und Bildunterschriften bleiben erhalten.
- Jede CSV-Datei wird zu einer Datenbank. Liegen beide Fassungen vor, nimmt Flowplan `Name_all.csv` (alle Einträge) statt der aktuellen Ansicht.
- Spalten bekommen eine passende Art: Zahlen, Kontrollkästchen, Daten (auch im Notion-Format „September 24, 2026“) und Auswahlen mit ihren Optionen; der Rest bleibt Text.
- Die Seiten der Einträge werden ihren Einträgen als Dokument zugeordnet. Seiten, die in Notion unter einem Eintrag liegen (der Ordner mit dem Namen des Eintrags), werden zu seinen [Unterseiten](/databases#unterseiten-eines-eintrags) – keine losen Seiten und keine Ersatzseiten mehr.
- Bilder und Dateien, auf die Seiten verweisen, werden hochgeladen.
- Callouts werden zu [Hinweisen](/formatting#hinweise) und behalten ihr Emoji als Symbol.
- Links auf Überschriften (`Seite.md#ueberschrift`) führen zur Überschrift; `notion.so`-Links auf Seiten des Exports führen zur importierten Seite (Notions Markdown enthält keine Blockkennungen, Links auf einzelne Absätze führen daher zur Seite).
- Große Exporte, die Notion in mehrere ZIP-Dateien innerhalb des ZIPs aufteilt, werden erkannt.
Grenzen pro Import: 100 MB, standardmäßig 10.000 Seiten (`FLOWPLAN_IMPORT_MAX_DOCS`) und 5.000 Einträge je Tabelle. Größere Arbeitsbereiche exportierst du in Teilen, etwa Seite für Seite.
## Von AppFlowy
::: steps
1. In AppFlowy Seiten als **Markdown** und Datenbanken als **CSV** exportieren.
2. Die Dateien in einen Ordner legen – Unterordner werden zu Unterseiten – und als ZIP packen.
3. In Flowplan unter **Einstellungen → Import & Export → Import** importieren.
:::
Markdown wird zu Seiten, CSV zu Datenbanken; verlinkte Bilder und Dateien werden mitgenommen.
## Nach dem Umzug
- **Links prüfen:** Verweise zwischen importierten Seiten zeigen auf die neuen Seiten; Links auf Seiten außerhalb des Exports bleiben Links auf das alte Werkzeug.
- **Links auf Blöcke und Überschriften bleiben erhalten.** Zeigt ein Link in der Quelle auf eine bestimmte Stelle einer anderen (oder derselben) Seite, zeigt er nach dem Import auf denselben Block in Flowplan: Ein Klick öffnet die Seite und springt dorthin (siehe [Links auf Blöcke](/links-and-mentions#links-auf-bloecke)). Findet sich die Stelle nicht (etwa weil der Export sie nicht enthält), führt der Link zur Seite.
- **Ansichten einrichten:** Ein Import legt je Datenbank eine Tabelle an. Board, Kalender, Galerie oder Zeitleiste fügst du danach hinzu – siehe [Ansichten](/views).
- **Teilen:** Rechte werden nicht übernommen. Lade Mitglieder ein oder teile einzelne Seiten – siehe [Teilen und Veröffentlichen](/sharing).
- **Daten bleiben mitnehmbar:** Flowplan exportiert jederzeit wieder als Markdown mit Frontmatter, CSV und ZIP, auf Wunsch geplant und per Git – siehe [Import, Export und Versionen](/import-export-versions).
## Warum umziehen?
- **Komplett Open Source:** Der gesamte Quellcode steht unter der AGPL-3.0 auf [GitHub](https://github.com/yannicschuller/flowplan) – ohne geschlossene Enterprise-Version und ohne Funktionen hinter einer Lizenz.
- **Deine Daten, dein Server:** gehostet auf flowplan.org in Deutschland oder als ein Docker-Container auf deinem eigenen Server – siehe [Installation](/installation).
- **Kein Tracking.**
---
# Von AFFiNE
Aus AFFiNE kommen Dokumente, Datenbanken und Whiteboards samt Bildern und Anhängen nach Flowplan – über den Export des Arbeitsbereichs.
::: steps
1. In der AFFiNE-Desktop-App in den **Einstellungen des Arbeitsbereichs** den Export **Full Backup** („Export a complete workspace backup“) wählen. Es entsteht eine Datei `Name_….affine` – die ganze Datenbank des Arbeitsbereichs mit Dokumenten, Ordnern, Sammlungen, Journal und Dateien.
In der Web-App gibt es diese Datei nicht; dort exportierst du Dokumente als **Snapshot** (ZIP) – dafür muss in den Einstellungen des Arbeitsbereichs unter den experimentellen Funktionen **Enable Snapshot Import Export** eingeschaltet sein. Ein Snapshot enthält Dokumente, Datenbanken, Whiteboards und Dateien, aber keine Ordner, Sammlungen, Journal-Zuordnungen, Eigenschaften und Symbole. Tags enthalten nur Snapshots aus AFFiNE-Versionen bis Ende 2024 (mit einer Datei `info.json`); neuere Versionen schreiben keine Tags mehr in Snapshots. Wer Tags, Eigenschaften und Symbole mitnehmen will, nimmt die Arbeitsbereichsdatei (`.affine`) – die Vorschau weist darauf hin.
2. In Flowplan: **Einstellungen → Import & Export → Import**, den Zielbereich wählen und bei **AFFiNE, Confluence, Evernote, Google Docs oder Obsidian** die `.affine`-Datei oder das Snapshot-ZIP auswählen (Quelle **AFFiNE** oder automatisch).
3. Die Vorschau zeigt, was kommt: Seiten, Ordner, Dateien, Tags, Eigenschaften, Seitensymbole, Whiteboards, Datenbanken, Sammlungen, Tage fürs Journal und wie viele Dokumente als Inhalt von Datenbankeinträgen übernommen werden – und was nicht übernommen werden kann. **Importieren** legt alles in einem Schritt an.
:::
Was daraus wird:
- **Wohin es kommt:** Aus einer Arbeitsbereichsdatei (`.affine`) mit mehreren Einträgen auf oberster Ebene – Ordner, Dokumente ohne Ordner, Sammlungen – entsteht **eine Seite mit dem Namen des AFFiNE-Arbeitsbereichs**, unter der alles liegt; die Vorschau nennt sie („Alles unter einer Seite …“). Ein **Snapshot** und ein Arbeitsbereich mit nur einem Eintrag auf oberster Ebene kommen **direkt in den Zielbereich** – ohne leere Seite darüber. Ein Whiteboard zählt dabei zu seinem Dokument; Journal-Dokumente gehen ins Journal.
- **Ordner** werden zu Seiten mit ihren Dokumenten darunter. Steht ein Dokument in mehreren Ordnern, liegt es im ersten; die anderen Ordner verlinken es. Dokumente ohne Ordner liegen auf oberster Ebene – unter der Arbeitsbereichsseite, wenn es sie gibt.
- **Dokumente mit genau einem Verweis darunter einordnen** (Schalter in der Vorschau, standardmäßig an; die Vorschau nennt die Zahl): Ein Dokument ohne eigenen Ordner, auf das im Text genau ein anderes Dokument verweist, kommt unter dieses Dokument statt auf die oberste Ebene. Ketten werden verschachtelt (C unter B unter A). Nicht verschoben werden Dokumente in Ordnern, Journal-Tage, Inhalte von Datenbankeinträgen und Dokumente, auf die nur eine Datenbank, ein Whiteboard oder ein Journal-Tag verweist. Bei gegenseitigen Verweisen kommt das erste unter das andere. Die Links bleiben unverändert; beim Import als Datenbank gilt der Schalter nicht.
- **Text:** Überschriften, Absätze, Aufzählungen, nummerierte Listen, **To-dos** mit ihrem Haken, Aufklapplisten, Zitate, Codeblöcke mit Sprache, Hinweisblöcke (Callouts, Art nach Farbe: Rot → Achtung, Orange/Gelb → Warnung, Grün → Tipp, Lila → Wichtig, sonst Hinweis; ihr Emoji wird zum [Symbol des Hinweises](/formatting#eigenes-symbol-und-eigene-farbe)), Trennlinien, Tabellen, LaTeX (Block und im Text), Fett, Kursiv, Unterstrichen, Durchgestrichen, Code, Links, Text- und Hervorhebungsfarben.
- **Links zwischen Dokumenten** – im Text (@-Verweise), als Karten verlinkter oder synchronisierter Dokumente und als AFFiNE-App-Links – zeigen auf die importierten Seiten. Synchronisierte Dokumente werden dabei zu Links. Verweise auf einen Block (Verweise und Dokumentkarten mit Block, App-Links mit `?blockIds=`) führen zu diesem Block; Verweise auf Formen der Leinwand (`elementIds`) zur Seite.
- **Tags** werden zu Tags der Seite, mit ihren Farben aus AFFiNE (als neue Datenbank: Eigenschaft *Tags*).
- **Eigenschaften** eines Dokuments (Text, Zahl, Kontrollkästchen, Datum) werden zu [Eigenschaften der Seite](/page-tags#tags-und-eigenschaften) mit demselben Namen; fehlende Eigenschaften legt der Import an, wenn du den Arbeitsbereich verwalten darfst. Gelöschte Eigenschaften und AFFiNEs eigene Felder (Erstellt von, Modus, Vorlage …) bleiben weg.
- **Symbole:** Ein Emoji als Symbol eines Dokuments, Ordners oder einer Sammlung wird zum Symbol der Seite. Symbole aus AFFiNEs eigener Symbolbibliothek haben keine Entsprechung; die Vorschau nennt ihre Zahl.
- **Bilder und Anhänge** werden hochgeladen und an ihrer Stelle gezeigt – wie beim Hochladen im Editor: Bilder als Bild, **PDFs mit Vorschau** (öffnen sich im Betrachter), **Audio und Video mit Abspieler**, andere Dateien als Link. Lesezeichen und Einbettungen (YouTube, Figma, GitHub …) werden zu Links.
- **Datenbanken** werden zu einer Datenbank-Seite unter ihrem Dokument und erscheinen im Dokument an derselben Stelle als eingebettete Datenbank. Spalten: Titel, Text, Zahl, Auswahl, Mehrfachauswahl, Datum, Kontrollkästchen, Link (Adresse), Fortschritt (Zahl in Prozent) und Erstellt. Zeilen behalten ihren Inhalt als Dokument des Eintrags. Tabellenansichten bleiben Tabellen, Kanban-Ansichten werden Boards nach derselben Spalte. Die Spalten stehen in der Reihenfolge der AFFiNE-Ansicht (nicht in der, in der sie angelegt wurden); ausgeblendete Spalten bleiben ausgeblendet, Spaltenbreiten bleiben erhalten (80 bis 800 Pixel). Bild-Spalten werden nicht übernommen.
- **Dokumente aus Datenbankzeilen:** Hast du in AFFiNE eine Zeile einer Datenbank in ein eigenes Dokument umgewandelt (der Titel der Zeile ist dann ein Verweis auf das Dokument), wird dieses Dokument zum **Inhalt des Eintrags** – mit Text, Bildern, Anhängen, eingebetteten Datenbanken und Links, wie bei jeder Seite. Es entsteht **keine eigene Seite** dafür; Links auf das Dokument (im Text, als Karte, aus Sammlungen und auf Whiteboards) führen zum Eintrag, und ein Ordner, in dem das Dokument lag, listet einen Link darauf. Der Eintrag behält den Titel und die Spalten der Zeile; besteht der Titel nur aus dem Verweis, trägt er den Titel des Dokuments. Das gilt auch, wenn der einzige Inhalt der Zeile die Karte eines verlinkten oder synchronisierten Dokuments ist, und für Snapshots, die das Dokument enthalten.
- Besteht ein solches Dokument nur aus einer Datenbank (in AFFiNE gibt es keine Datenbank ohne Dokument), zeigt der Eintrag diese Datenbank als eingebettete Ansicht, und die Datenbank selbst liegt **unter der Datenbank-Seite** des Eintrags – Einträge haben keine Unterseiten. Ebenso landen Dokumente, die nur aus solchen Einträgen verlinkt sind, unter der Datenbank statt oben im Bereich; Datenbanken, die in AFFiNE nur auf dem Whiteboard eines Dokuments stehen, werden Datenbankseiten unter ihrem Dokument.
- **Vorlagen:** Dokumente, die in AFFiNE als Vorlage markiert sind, werden zu [Vorlagen des Arbeitsbereichs](/templates#eigene-vorlagen) (Kategorie *Sonstiges*, mit Emoji und Tags) statt zu Seiten; ein Dokument, das nur aus einer Datenbank besteht, wird eine Datenbank-Vorlage. Links auf eine Vorlage werden zu Text. Ob ein Dokument eine Vorlage ist, steht nur in der Arbeitsbereichsdatei (`.affine`) – aus einem Snapshot werden Vorlagen gewöhnliche Seiten. Wer den Arbeitsbereich nicht bearbeiten darf, bekommt die Vorlagen als „Nur für mich“. Die Import-Vorschau zeigt die Anzahl.
- Aus der Arbeitsbereichsdatei (`.affine`) kommen dazu das **Emoji-Symbol** des Dokuments (als Symbol des Eintrags), seine **Tags** in eine Mehrfachauswahl-Spalte **„Tags“** (oder „Schlagwörter“) der Datenbank und seine **Eigenschaften** in Spalten mit demselben Namen und passendem Typ, sofern die Zeile dort nichts eingetragen hat – Werte in den Spalten der Zeile bleiben immer, wie sie sind. Hat die Datenbank keine solche Spalte, fallen Tags oder Eigenschaften weg; die Vorschau nennt ihre Zahl.
- Verweisen **mehrere Zeilen** auf dasselbe Dokument, bekommt die erste (in der Reihenfolge des Imports) den Inhalt; die anderen behalten ihren eigenen Inhalt und beginnen mit einem Link auf diesen Eintrag. Ein **Journal-Dokument** bleibt ein Tag im Journal, und eine Zeile, die auf das Dokument mit ihrer eigenen Datenbank verweist, bekommt nur einen Link.
- Eigene Datenbanken des Dokuments werden dort angelegt, wo das Dokument lag (im Ordner bzw. ganz oben), und bleiben im Eintrag eingebettet; ein Whiteboard des Dokuments liegt ebenfalls dort, seine Karte zeigt auf den Eintrag.
- Beim Import **als neue Datenbank** fallen Datenbanken weg; solche Dokumente werden dann wie alle anderen zu Einträgen der neuen Datenbank.
- **Whiteboards (Edgeless):** Der Text eines Dokuments wird immer ein Dokument. Liegt auf seiner Edgeless-Fläche mehr als die Notiz mit dem Text – Formen, Verbinder, Texte, Bilder, Rahmen, weitere Notizen, Zeichnungen, Mindmaps – oder öffnet AFFiNE das Dokument im Edgeless-Modus, entsteht daneben ein Whiteboard **„Name – Whiteboard“**. Dokument und Whiteboard sind verlinkt: oben im Dokument steht der Link zum Whiteboard, auf dem Whiteboard zeigt eine Karte auf das Dokument (dort, wo die Notiz lag). Formen (Rechteck, abgerundet, Ellipse, Raute, Dreieck) mit Text und Farben, Verbinder (gerade, gewinkelt, gebogen, mit Pfeilen und Beschriftung, an ihren Formen befestigt), Texte, Pinselstriche, Bilder, Rahmen, weitere Notizen (als Haftnotizen), Gruppen und Mindmaps (Knoten als Formen, Äste als Verbinder) werden übernommen. Was keine Entsprechung hat, fällt weg; die Vorschau nennt die Zahl.
- **Sammlungen** werden je zu einer Seite **„Sammlung: Name“** mit Links auf ihre Dokumente zum Zeitpunkt des Imports: die von Hand hinzugefügten und die, auf die die Regeln passen (Tags, Erstellt/Geändert, Titel, Favoriten, Journal). Die Regeln stehen als Text auf der Seite. Lassen sich nicht alle Regeln auswerten (etwa Regeln auf eigene Eigenschaften), stehen nur die von Hand hinzugefügten Dokumente darin, mit einem Hinweis. Eine Sammlung in einem Ordner liegt in diesem Ordner.
- **Journal:** Journal-Dokumente von AFFiNE kommen in das [Journal](/journal) des Arbeitsbereichs, jeweils in den passenden Tag – ins Journal im Zielbereich, sonst in eines im Arbeitsbereich, in das du schreiben darfst; gibt es keines, legt der Import eines an. Fehlt der Tag, wird er angelegt; gibt es ihn schon, wird der Text unten angehängt (mit dem Titel des AFFiNE-Dokuments als Überschrift).
- Dokumente im **Papierkorb** von AFFiNE werden nicht übernommen. HTML-Einbettungen und Data Views fallen weg; die Vorschau nennt sie.
- Whiteboards, Datenbanken und Journal-Tage gibt es nur beim Import **als Seiten**; als neue Datenbank wird jedes Dokument ein Eintrag.
- **Große Arbeitsbereiche:** Die `.affine`-Datei darf größer als 100 MB sein (siehe [Grenzen oben](/migrate#confluence-evernote-google-docs-und-obsidian)). Der Server schreibt sie beim Hochladen direkt auf die Platte, liest die Dokumente beim Umwandeln einzeln und Bilder und Anhänge erst beim Schreiben einzeln – der Arbeitsspeicher hält immer nur ein Dokument und eine Datei. Arbeitsbereiche mit tausenden Dokumenten gehen in einem Import (bis `FLOWPLAN_IMPORT_MAX_DOCS`, standardmäßig 10.000 Seiten); Ordner tiefer als 50 Ebenen werden zusammengefasst. Steht ein Reverse-Proxy davor, muss er so große Anfragen durchlassen (siehe [Coolify und Reverse Proxy](/coolify-and-proxy#pangolin-traefik-und-andere-proxys)).
- Sicherheit: Die Datei wird nur gelesen; Größe, Anzahl und Verschachtelung der Dokumente sind begrenzt, Text wird nie als HTML übernommen, Links behalten nur `http`, `https` und `mailto`.
---
# Von Confluence, Evernote, Google Docs und Word
Schritt für Schritt aus Confluence, Evernote, Google Docs, Microsoft Word und OneNote nach Flowplan – mit Seitenbaum, Bildern und Anhängen.
## Von Confluence
::: steps
1. In Confluence: **Bereichseinstellungen → Exportieren** (Confluence Cloud: **Bereichseinstellungen → Bereich exportieren**). Wähle **HTML** oder **XML**, jeweils mit allen Seiten.
2. In Flowplan das ZIP wie oben importieren (Quelle **Confluence** oder automatisch).
:::
Was daraus wird:
- Der **Seitenbaum** des Bereichs wird zum Seitenbaum in Flowplan (aus `index.html` bzw. den Elternseiten in `entities.xml`; fehlt eine Seite dort, helfen die Brotkrumen).
- **Info-, Tipp-, Hinweis- und Warnungs-Makros** werden zu Hinweisblöcken (Info → Hinweis, Tipp → Tipp, Hinweis → Warnung, Warnung → Achtung), **Code-Makros** zu Codeblöcken, **Aufklappen** zu Aufklappblöcken, **Aufgabenlisten** zu Aufgaben mit ihrem Status.
- **Bilder** und **Anhänge** werden hochgeladen; Anhänge, die im Text nicht vorkommen, stehen als Links am Ende der Seite. **Links auf andere Seiten** des Bereichs zeigen auf die importierten Seiten. Anker-Links (`Seite.html#Seite-Ueberschrift`, `#…` auf derselben Seite, im XML-Export `ac:anchor`) führen zur Überschrift bzw. zum Anker.
- Im XML-Export zählt nur die aktuelle Fassung jeder Seite; ältere Versionen und Blogbeiträge werden übersprungen. Erstellungs- und Änderungsdatum werden übernommen.
- Makros ohne Entsprechung (etwa Inhaltsverzeichnis, Jira-Abfragen) fallen weg; die Vorschau nennt sie.
## Von Evernote
::: steps
1. In Evernote ein Notizbuch über **… → Notizbuch exportieren** als **ENEX** speichern. Mehrere Notizbücher packst du zusammen in ein ZIP.
2. In Flowplan die `.enex`-Datei oder das ZIP importieren.
:::
Was daraus wird:
- Jede **Notiz** wird eine Seite; bei mehreren Notizbüchern wird jedes Notizbuch eine Seite mit seinen Notizen darunter.
- Der Notiztext (ENML) wird zu normalem Text mit Formatierung, Listen und Tabellen; **Kontrollkästchen** werden zu Aufgaben.
- **Bilder und Anhänge** (in der ENEX-Datei eingebettet) werden hochgeladen und an ihrer Stelle im Text gezeigt; PDFs und andere Dateien als Link. Anhänge ohne Platz im Text kommen ans Ende.
- **Tags**, **Erstellt**/**Geändert** und die **Quelladresse** bleiben erhalten – am besten als neue Datenbank importieren, dann sind es Eigenschaften zum Filtern und Sortieren.
- Verschlüsselter Text lässt sich nicht übernehmen; die Vorschau warnt.
## Von Google Docs
::: steps
1. Unter [takeout.google.com](https://takeout.google.com) **Drive** wählen und bei den Formaten für Dokumente **HTML** (empfohlen) oder **Microsoft Word** einstellen. Einzelne Dokumente gehen auch über **Datei → Herunterladen → Webseite (.html, gezippt)** oder **Microsoft Word (.docx)**.
2. In Flowplan das Takeout-ZIP, das ZIP der Webseite oder die `.docx`-Datei importieren (Quelle **Google Docs**; einzelne `.docx`-Dateien gehen auch über [Microsoft Word](#von-microsoft-word)).
:::
Was daraus wird:
- Jedes Dokument wird eine Seite, **Drive-Ordner** werden zu übergeordneten Seiten.
- Überschriften, Fett, Kursiv, Unterstrichen, Durchgestrichen, **verschachtelte Listen**, Tabellen und Links werden übernommen; Googles Umleitungslinks zeigen wieder direkt auf ihr Ziel. Links auf Überschriften und Lesezeichen im selben Dokument (`#h.…`, `#kix.…`) bleiben Links auf diese Stelle.
- **Bilder** werden hochgeladen – auch die, die im HTML eingebettet sind.
- Word-Dateien: Absätze, Überschriften, Listen (nummeriert und mit Aufzählungszeichen, auch verschachtelt), Tabellen (mit verbundenen Spalten), Links und Bilder. Kommentare, Fußnoten und Kopf-/Fußzeilen fallen weg.
## Von Microsoft Word
Word-Dokumente (`.docx`) importierst du unter **Einstellungen → Import & Export → Import** mit der Quelle **Microsoft Word** (eine `.docx`-Datei wird auch automatisch erkannt):
- **Ein Dokument:** die `.docx`-Datei auswählen. Sie wird eine Seite mit dem Dateinamen als Titel.
- **Mehrere Dokumente:** die `.docx`-Dateien als ZIP packen und das ZIP auswählen. Jedes Dokument wird eine Seite, **Ordner** im ZIP werden zu übergeordneten Seiten. Liegt alles in einem einzigen Ordner, entfällt dieser.
Übernommen werden Absätze, Überschriften, Fett, Kursiv, Unterstrichen, Durchgestrichen, Listen (nummeriert und mit Aufzählungszeichen, auch verschachtelt), Tabellen (mit verbundenen Spalten), Links und Bilder. Kommentare, Fußnoten, Kopf- und Fußzeilen fallen weg. Word-Sperrdateien (`~$….docx`) werden übergangen.
**Ältere Word-Dateien (`.doc`, Word 97–2003)** kann Flowplan nicht lesen. Öffne die Datei in Word, LibreOffice oder Pages und speichere sie als `.docx`; dann importieren. Enthält ein ZIP neben `.docx`- auch `.doc`- oder OneNote-Dateien, werden die `.docx`-Dateien importiert und die übrigen in der Vorschau mit Grund aufgeführt.
### OneNote
OneNote-Dateien (`.one`, `.onetoc2`, `.onepkg`) liest Flowplan nicht direkt – Flowplan erkennt sie und sagt, was zu tun ist. Der Weg führt über OneNotes eigenen Export:
::: steps
1. In OneNote für Windows die Seite oder den Abschnitt öffnen und **Datei → Exportieren** wählen; als Format **Word-Dokument (.docx)**.
2. Die `.docx`-Datei (oder mehrere als ZIP) in Flowplan über **Microsoft Word** importieren.
:::
Bietet deine OneNote-Version keinen Export als Word-Dokument an, sondern nur PDF, importiere das PDF als Notizbuch (wie [aus GoodNotes](/migrate-notes#von-goodnotes)) oder lade es als Datei auf eine Seite hoch.
---
# Von Obsidian und GoodNotes
Markdown-Ordner wie ein Obsidian-Tresor werden zu Seiten oder Datenbanken, handschriftliche Notizbücher aus GoodNotes zu Flowplan-Notizbüchern.
## Von Obsidian und anderen Markdown-Ordnern
- **Ein Tresor als Seiten:** den Tresor-Ordner (mit dem Ordner `.obsidian`) als ZIP packen und unter **Einstellungen → Import & Export → Import** importieren – über **AFFiNE, Confluence, Evernote, Google Docs, GoodNotes, Microsoft Word oder Obsidian** mit Vorschau oder über den Notion-/Markdown-Import, der einen Tresor ebenfalls erkennt.
- **Ordner** werden zu Seiten mit ihren Notizen darunter. Eine **Ordnernotiz** (`Projekte/Projekte.md` oder `Projekte.md` neben dem Ordner) wird selbst zur Seite des Ordners.
- **Wikilinks** `[[Seite]]`, `[[Seite|Text]]`, `[[Ordner/Seite]]` und `[[Seite#Überschrift]]` werden zu Links auf die importierten Seiten – aufgelöst wie in Obsidian über den Pfad oder den Dateinamen. Links auf Notizen, die es nicht gibt, bleiben Text.
- `[[Seite#Überschrift]]`, `[[Seite#^id]]`, `[[#Überschrift]]` und Markdown-Links mit `#^id` werden zu Links auf die Überschrift bzw. den Block; die Markierungen `^id` am Zeilenende verschwinden aus dem Text und werden zur Kennung des Blocks.
- **Eingebettete Dateien** `![[bild.png]]` werden zu Bildern, `![[datei.pdf]]` zu Dateilinks; eingebettete Notizen `![[Notiz]]` werden zu Links.
- **Callouts** wie `> [!note]` oder `> [!warning] Titel` werden zu Hinweisblöcken der passenden Art.
- **Aufgaben** behalten ihren [Status](/tasks-in-documents#status-einer-aufgabe): `- [ ]` offen, `- [/]` in Arbeit, `- [x]`/`- [X]` erledigt, `- [-]` abgebrochen, `- [>]` verschoben. Andere Symbole aus Obsidian-Themes oder dem Tasks-Plugin (`[?]`, `[!]`, `[*]`, `["]`, `[<]` …) bleiben erhalten: Die Aufgabe gilt als offen, zeigt das Symbol klein im Kästchen und wird beim Markdown-Export und in Git mit demselben Symbol geschrieben. Ziffern wie `[1]` bleiben normaler Text.
- **Tags** aus dem Frontmatter (`tags:`) und im Text (`#tag`, nicht in Code) werden gesammelt: als Seiten als Tags der Seite, als neue Datenbank in der Eigenschaft *Tags* – zusammen mit *Ordner* für die Herkunft. Weitere Schlüssel des Frontmatters werden als Seiten zu [Eigenschaften](/import-export-versions#frontmatter-eintraege-als-markdown-dateien).
- **Notizen mit Frontmatter in eine vorhandene Datenbank:** in einer Datenbank **CSV oder Markdown importieren** wählen und die `.md`-Dateien oder ein ZIP nehmen. Die YAML-Eigenschaften werden zu Spalten – siehe [Frontmatter](/import-export-versions#frontmatter-eintraege-als-markdown-dateien).
- **Aliasse:** `aliases: [PAC, Pompe à chaleur]` (oder `alias:`) im Frontmatter wird zu den [Aliassen](/page-tags#aliasse) der Seite bzw. zur Eigenschaft [Aliasse](/properties-and-formulas#aliasse) des Eintrags. @-Erwähnungen, Suche und nicht verlinkte Erwähnungen finden „Chauffage“ dann auch über „PAC“, und der Markdown-Export schreibt sie wieder als `aliases:` zurück.
## Von GoodNotes
Notizbücher aus GoodNotes (5 und 6, iPad, iPhone und Mac) holst du als **PDF** herüber. Jedes PDF wird ein [Notizbuch](/notebooks) mit dem Dateinamen als Titel, jede Seite ein Blatt mit dieser Seite als Hintergrund – im selben Format und in derselben Ausrichtung. Darauf schreibst du in Flowplan weiter.
### Aus GoodNotes exportieren
**Ein Notizbuch:**
::: steps
1. Das Notizbuch in GoodNotes öffnen.
2. Oben auf **Teilen** bzw. **Exportieren** tippen (je nach Version das Symbol mit dem Pfeil oder im Menü **⋯**) und **Dieses Notizbuch exportieren** wählen – nicht nur die aktuelle Seite.
3. Als Format **PDF** wählen. Bietet GoodNotes **Seitenvorlagen einschließen** an, lass es eingeschaltet, sonst fehlen Linien, Karos und eingefügte PDF-Seiten im Hintergrund.
4. Das PDF in **Dateien** sichern, per AirDrop an den Mac schicken oder direkt im Browser mit Flowplan öffnen.
:::
**Mehrere Notizbücher:** In der Dokumentübersicht von GoodNotes über **Auswählen** mehrere Notizbücher markieren und gemeinsam als PDF exportieren. Ob GoodNotes dabei einzelne PDFs oder ein ZIP liefert, hängt von der Version ab – Flowplan nimmt beides.
**Alle Notizbücher auf einmal:** In den GoodNotes-Einstellungen die **automatische Sicherung** (Auto-Backup) einschalten, einen Cloud-Dienst wählen (iCloud Drive, Google Drive, Dropbox oder OneDrive) und als Format **PDF** einstellen. GoodNotes legt dann jedes Notizbuch als PDF in den Sicherungsordner, mit deinen Ordnern. Diesen Ordner lädst du als ZIP herunter (Google Drive und Dropbox bieten das im Browser an; auf dem Mac den Ordner im Finder mit **Komprimieren** packen). Die Menüs heißen je nach GoodNotes-Version etwas anders.
### In Flowplan importieren
::: steps
1. **Einstellungen → Import & Export → Import** öffnen und den Zielbereich wählen.
2. Als Quelle **GoodNotes** wählen (ein PDF wird auch automatisch erkannt).
3. **Datei auswählen und prüfen** und das PDF wählen – oder mehrere PDFs auf einmal oder ein ZIP mit PDFs.
4. Die Vorschau zeigt, wie viele Notizbücher und Blätter entstehen und was übersprungen wird. **Importieren** legt die Notizbücher an und öffnet das erste.
:::
Dabei gilt:
- **Mehrere PDFs** ergeben mehrere Notizbücher. **Ordner** im ZIP (etwa die Ordner der Sicherung) werden zu übergeordneten Seiten; Notizbücher stehen in natürlicher Reihenfolge („Heft 2“ vor „Heft 10“).
- **Handschrift und Hervorhebungen** aus GoodNotes stecken im PDF und bleiben scharf, sind in Flowplan aber Teil des Hintergrunds: Du kannst darüber weiterschreiben, die alten Striche aber nicht einzeln verschieben oder radieren.
- **Suche:** Der Text des PDFs – getippter Text und, wenn GoodNotes ihn mit exportiert, die erkannte Handschrift – wird wie bei jedem PDF indiziert (die ersten 200 Seiten je PDF). Neue Handschrift in Flowplan wird auf iPhone und iPad [erkannt](/notebooks#handschrift-erkennen-iphone-und-ipad).
- **Grenzen:** bis zu 500 Seiten je PDF (weitere Seiten nennt die Vorschau und lässt sie aus), 1000 Blätter je Notizbuch, ein PDF oder ZIP bis 100 MB. Beschädigte oder mit Passwort geschützte PDFs und andere Dateien im ZIP werden übersprungen und in der Vorschau genannt.
- Notizbücher entstehen nur beim Import **als Seiten**, nicht als neue Datenbank.
**Das GoodNotes-Format (`.goodnotes`)** und Sicherungen in diesem Format kann Flowplan nicht lesen: Es ist ein eigenes, nicht offengelegtes Format, das sich zwischen den GoodNotes-Versionen ändert. Flowplan erkennt solche Dateien und sagt, was zu tun ist – exportiere das Notizbuch als PDF oder stelle die automatische Sicherung auf PDF um. Liegen in einem ZIP `.goodnotes`-Dateien neben PDFs, werden die PDFs importiert und die übrigen in der Vorschau aufgeführt.
Auch PDFs aus anderen Notiz-Apps wie Notability, Noteshelf oder OneNote werden so zu Notizbüchern.
---
# Import, Inhaltsarchiv und Versionen
Inhalte kommen als Markdown, CSV oder Archiv herein und gehen als Markdown, PDF oder vollständiges Archiv wieder hinaus. Der Versionsverlauf holt frühere Stände zurück.
**Mehr zum Thema:** [Exportieren](/export) · [Drucken und PDF](/print-and-pdf)
## Importieren
Alle Importe stehen unter **Einstellungen → Import & Export → Import**; oben wählst du einmal den **Zielbereich** für alle.
- **Markdown, Text oder HTML**: **Markdown-, Text- oder HTML-Dateien**. Überschriften, Listen, Aufgaben, Tabellen, Code und Formeln werden zu Blöcken; Mermaid-Code (` ```mermaid `, in HTML `` oder ``) wird zu einem Codeblock, der das Diagramm zeigt – der Code ist einen Klick entfernt ([Vorschau](/math-and-code#formeln-diagramme-und-code)). Das gilt für alle Importe, auch AFFiNE, Notion, Obsidian, Confluence (Sprache der Code-Makros) und eingefügtes Markdown. Bildtitel und `Table:`-/`Listing:`-Zeilen werden zu [Beschriftungen](/formatting#beschriftungen), in HTML `
`/`` und ``. Beim AFFiNE-Import werden die Beschriftungen von Bildern und Codeblöcken übernommen.
- **Notion-, AppFlowy- oder Markdown-Export**: **Notion, AppFlowy oder Markdown-Export (ZIP)** nimmt ein ZIP mit Markdown- und CSV-Dateien an. Markdown wird zu Seiten, CSV zu Datenbanken, Tage eines Flowplan-Journals (`…/2026/10/2026-10-27.md` unter dem Journal) wieder zu Tagen dieses Journals, Excalidraw- und draw.io-Dateien zu [Whiteboards](/whiteboard-diagrams#excalidraw-und-draw-io-importieren), Ordner zu Unterseiten; verlinkte Bilder und Dateien werden hochgeladen, Datensatzseiten aus Notion den Einträgen zugeordnet. Ein [Markdown-Export aus Flowplan](/export) (eine Seite oder ein Bereich als ZIP) kommt mit Seitenbaum, Titeln und Datenbanken samt Einträgen zurück; Kommentare und frühere Versionen aus dem Export bleiben dabei draußen. Bis 100 MB, standardmäßig 10.000 Seiten (`FLOWPLAN_IMPORT_MAX_DOCS`) und 5.000 Einträge je Tabelle; einzelne Dateien im ZIP dürfen so groß sein wie die größte Datei beim Hochladen (mindestens 10 MB), ZIPs darin – etwa die „Export-…-Part-1.zip“ großer Notion-Exporte – werden mit entpackt, solange alles zusammen in die Grenzen des Imports passt. Den Zielbereich wählst du vorher.
- **Jira oder Trello**: **Jira oder Trello** – siehe [Projekte, Tickets und Sprints](/projects-and-tickets#import-aus-jira-und-trello).
- **CSV**: in einer Datenbank **CSV oder Markdown importieren** wählen und eine CSV-Datei nehmen; die Zeilen werden zu Einträgen. Eine aus Flowplan exportierte CSV kommt unverändert zurück: Text, der wie eine Formel aussieht (`=…`, `+…`, `@…`), bekommt beim Export einen schützenden Apostroph, den der Import wieder entfernt; Tags mit Komma (etwa „Nacht, Wochenende“) bleiben ein Tag, wenn es ihn unter den Optionen der Spalte gibt. Personen, verknüpfte Einträge, Dateien und Sprints findet der Import über ihren Namen (Personen auch über die E-Mail-Adresse) und verknüpft sie wieder – aber nur, wenn der Name eindeutig ist: Heißen zwei Einträge „Meeting“, bleibt die Zelle leer, statt den falschen zu verknüpfen. Spalten, die in der Datei fehlen, lässt der Import aus, statt sie zu leeren.
- **Werte lesen:** Leere Zahlenzellen bleiben leer (nicht 0), Summen und Filter wie „ist leer“ stimmen also nach dem Wiederimport. Zahlen dürfen ein Dezimalkomma und Tausenderpunkte haben („1,5“, „1.234,56“), Checkboxen stehen auch als Ja/Nein, x oder ✓ da, Datumswerte auch als `05.11.2026`. Eine Datei mit nur einer Spalte (etwa eine Ansicht, die nur den Titel zeigt), kurze Zeilen und Kommas am Zeilenende gehen ebenfalls; nur ein kaputtes Anführungszeichen macht die Datei unlesbar.
- **Passt ein Wert nicht** zu einer Zahl-, Datums- oder Checkbox-Eigenschaft (etwa „2026-02-30“), lehnt Flowplan den Import ab und nennt die Eigenschaft – statt den Wert wegzulassen oder als Text zu speichern.
- **Neue Optionen:** Werte, die eine Auswahl oder Mehrfachauswahl noch nicht als Option hat, legt der Import als neue Optionen an; bei anderer Groß- und Kleinschreibung nimmt er die vorhandene Option. Höchstens 100 neue Optionen je Import – eine Freitext-Spalte, die einer Auswahl zugeordnet ist, wird so abgelehnt, statt Tausende Optionen anzulegen. Ein Hinweis nennt, welche Optionen in welcher Eigenschaft dazugekommen sind.
- **Markdown mit Frontmatter in eine Datenbank** (etwa Notizen aus Obsidian): in der Datenbank **CSV oder Markdown importieren** wählen und eine oder mehrere `.md`-Dateien oder ein ZIP nehmen – siehe unten.
- **Inhaltsarchiv** (siehe unten).
### Frontmatter: Einträge als Markdown-Dateien
Notizen aus Obsidian, Logseq, Jekyll oder Hugo tragen ihre Eigenschaften als YAML-Frontmatter am Anfang der Datei:
```markdown
---
para: Resource
area: House
tags: [heating, maintenance]
created: 2026-03-14
---
# Heating – maintenance
…
```
**Import in eine Datenbank:** Jede Datei wird ein Eintrag. Der Titel kommt aus `title:`, sonst aus der ersten `#`-Überschrift oder dem Dateinamen; der übrige Text wird zum Dokument des Eintrags, verlinkte Bilder und Dateien aus dem ZIP werden hochgeladen und Links zwischen den importierten Dateien zu Links auf die neuen Einträge. Schlüssel werden Eigenschaften gleichen Namens zugeordnet (Groß- und Kleinschreibung egal):
- Auswahl und Mehrfachauswahl übernehmen die Werte und legen unbekannte als neue Optionen an (`tags:` landet so in **Tags**);
- Relationen finden den verknüpften Eintrag über seinen Titel (auch als `[[Titel]]`), Personen über Name oder E-Mail;
- Datumswerte werden als ISO-Datum gelesen, `true`/`false` als Kontrollkästchen, Zahlen als Zahl;
- `aliases:` (Liste oder ein Text, durch Kommas getrennt) und `alias:` füllen zusammen die Eigenschaft vom Typ [Aliasse](/properties-and-formulas#aliasse), wie auch immer sie heißt; fehlt sie, legt **Fehlende Eigenschaften anlegen** eine an. Hat die Datenbank keine Alias-Eigenschaft, aber eine Eigenschaft namens „aliases“, landen die Werte dort wie bisher;
- berechnete Eigenschaften (Formeln, Rollups, Zeitstempel) werden nicht überschrieben.
Beim Import von Einträgen (Markdown, CSV) in eine [Mehrfachauswahl mit den Tags des Arbeitsbereichs](/database-properties#mehrfachauswahl-mit-den-tags-des-arbeitsbereichs) bleiben die Werte Namen; fehlende Tags werden angelegt, wenn du Tags anlegen darfst (Mitglieder mit Bearbeitungsrecht) – sonst bleiben solche Werte weg.
Vor dem Import zeigt eine Vorschau, welche Eigenschaften passen und welche fehlen. **Fehlende Eigenschaften anlegen** erzeugt sie mit einem passenden Typ: Liste → Mehrfachauswahl, ISO-Datum → Datum, `true`/`false` → Kontrollkästchen, Zahl → Zahl, Adresse → URL, wenige wiederkehrende Werte → Auswahl, sonst Text. Bis 5.000 Dateien und 100 MB je Import.
**Export:** Im ZIP-Export beginnt jeder Eintrag unter `records/` mit `title:` und seinen Eigenschaften: Auswahl als Text, Mehrfachauswahl und Relationen (Titel der verknüpften Einträge) als Liste, Datum als ISO-Datum. Aliasse stehen unter dem Obsidian-Schlüssel `aliases:` als Liste, so dass sie einen Weg nach Obsidian und zurück überstehen. Berechnete Werte und die Kennung des Eintrags stehen unter `flowplan:` und werden beim Import übergangen. Wird ein so exportierter Eintrag wieder in dieselbe Datenbank importiert, bietet die Vorschau **aktualisieren statt neu anlegen** an: Der Eintrag mit derselben Kennung bekommt Eigenschaften und Text der Datei, der vorige Stand bleibt als Version erhalten. Ohne diese Wahl kommt er als neuer Eintrag hinzu.
**Seiten:** [Aliasse](/page-tags#aliasse), [Tags und Eigenschaften](/page-tags#tags-und-eigenschaften) einer Seite schreibt der Markdown-Export (einzeln, im Bereichs-Export, im geplanten Export und im Git-Export) als Frontmatter an den Anfang der Datei – so, wie Obsidian sie liest:
```markdown
---
tags:
- Kunde
- Angebot
Status: Gesendet
Budget: 12500
Fällig: 2026-12-01
Verantwortlich: Emil Beispiel
---
# Angebot Müller GmbH
```
Personen stehen mit ihrem Namen, Mehrfachauswahlen als Liste, Kontrollkästchen als `true`/`false`; die automatischen Eigenschaften (Erstellt am …) fehlen. Seiten ohne Aliasse, Tags und Werte bleiben ohne Frontmatter.
Beim Import von Markdown-Dateien, Markdown-ZIPs und Obsidian-Tresoren unter **Einstellungen → Import & Export** wird `aliases:`/`alias:` zu den Aliassen der neuen Seite und `tags:` (oder `tag:`, als Liste oder „a, b“) zu ihren Tags; fehlende Tags werden angelegt. Weitere Schlüssel werden zu Eigenschaften: Gibt es im Arbeitsbereich schon eine Eigenschaft mit dem Namen, bekommt die Seite dort ihren Wert. Unbekannte Schlüssel legen nur **Eigentümer** des Arbeitsbereichs als neue Eigenschaften an – der Typ ergibt sich aus dem Wert (`true` → Kontrollkästchen, Zahl → Zahl, `2026-12-01` → Datum, Liste → Mehrfachauswahl, Webadresse, E-Mail, sonst Text). Schlüssel von Veröffentlichungswerkzeugen (`cssclass`, `publish`, `permalink`, `layout`, `slug`, `draft` …) werden nie zu Eigenschaften. Ist das ganze Frontmatter übernommen, verschwindet es aus dem Text; sonst bleibt es wie bisher im Text stehen. Der Git-Export liest Aliasse, Tags und Werte geänderter Seiten aus dem Repository zurück.
**Wo exportieren:** In der Leiste einer Datenbank öffnet **Exportieren** ein Menü mit **CSV (aktuelle Ansicht)**, **Markdown mit Dateien (.zip)**, **Markdown (.md)** und **Als Word (DOCX)**. Einen einzelnen Eintrag exportiert das **…**-Menü im Kopf des Eintrags: **Als Markdown exportieren (.md)** (mit Frontmatter), **Markdown mit Dateien (.zip)**, **Als Word (DOCX)** (Eigenschaften als Tabelle, dann das Dokument) oder **Drucken / PDF** – mit denselben [Druckoptionen](/print-and-pdf#drucken-und-pdf); **Eigenschaften** steht dort für die Felder des Eintrags.
**CSV (aktuelle Ansicht)** schreibt die sichtbaren Spalten der Ansicht in ihrer Reihenfolge (Board, Galerie und andere Kartenansichten immer mit dem Titel) und die Werte so, wie die Tabelle sie zeigt: Personen (auch Erstellt von / Bearbeitet von) mit Namen, verknüpfte Einträge mit ihrem Titel, hochgeladene Dateien mit ihrem Namen (Links bleiben Links), Sprints mit Namen. Zahlen, Datumswerte und Checkboxen stehen wie gespeichert drin. Ist der Name einer Person nicht eindeutig, steht ihre E-Mail-Adresse da. Die CSV im Markdown-ZIP enthält weiterhin alle Eigenschaften.
**Aus Obsidian:** Links im Text werden als normale Markdown-Links gelesen. Wikilinks (`[[…]]`, `![[…]]`) vorher umwandeln – in Obsidian unter *Einstellungen → Dateien und Links* „[[Wikilinks]] verwenden“ ausschalten und relative Pfade wählen.
## Inhaltsarchiv
Unter **Einstellungen → Import & Export → Export → Arbeitsbereich als ZIP** lädst du ein ZIP deines Arbeitsbereichs herunter. Zurückholen – auch in eine andere Flowplan-Instanz – geht unter **Sicherungen → Flowplan-Archiv wiederherstellen**: Das Archiv wird als Kopie in neuen privaten Bereichen angelegt.
Die Sicherung der ganzen Instanz (mit Konten und Rechten) ist Sache der Administration: **Administration → Speicher & Sicherung**. Die Karte **Papierkorb & Aufbewahrung** führt zum Papierkorb und sagt, wie lange was aufbewahrt wird: gelöschte Seiten und Bereiche, bis jemand sie endgültig löscht, gelöschte Datenbank-Einträge 30 Tage; wie lange frühere Versionen bleiben, legt die Administration fest.
Enthalten: zugängliche Seiten samt Papierkorb, Datenbanken mit Ansichten und Einträgen, Dokumentinhalte, Relationen, Vorlagen, Kommentare, Versionen, Favoriten und Formularoptionen, dazu alle Dateien mit Prüfsummen. Außerdem die Einstellungen der Datenbanken (Erledigt-Regel, Workflow, Automationen, Sprints, Story Points – nie das Git-Token), Zeiteinträge und der Statusverlauf hinter den Burndown-Diagrammen, die Einstellungen und Tracker der Journale samt Werten und Ort jedes Tages, Handschrift auf PDFs und deine [Startseite](/first-steps#startseite-anpassen) (übernommen nur, wenn die importierende Person noch keine eigene hat).
Auch die Tags und Eigenschaften des Arbeitsbereichs (auch ungenutzte) und die Tags und Werte jeder Seite sind dabei. Beim Einspielen werden fehlende Tags angelegt, fehlende Eigenschaften nur, wenn du Eigentümer des Ziel-Arbeitsbereichs bist; vorhandene mit gleichem Namen werden weiterverwendet.
Ebenso gehören das [Erscheinungsbild](/workspace-appearance#erscheinungsbild) samt hochgeladener Schriften und die [automatischen Links](/workspace-appearance#automatische-links) des Arbeitsbereichs dazu (der JSON-Export enthält beides ohne die Schriftdateien): Beim Einspielen übernimmt sie nur ein Eigentümer des Ziel-Arbeitsbereichs – Link-Regeln zusätzlich zu den vorhandenen (bei gleichem Muster bleibt die vorhandene, höchstens 50), das Erscheinungsbild nur, wenn dort noch Flowplans eigenes Aussehen gilt. Was die Prüfung der Einstellungen nicht besteht (ungültige Regel, keine Schriftdatei, über 5 MB, mehr als 20 Schriften, Speicherkontingent voll), wird ausgelassen und in der Meldung gezählt, ohne den Import abzubrechen.
Das Archiv enthält nur, was du selbst sehen darfst: private Einträge anderer samt ihrer Kommentare und Dateien fehlen, ebenso Journale hinter einer PIN, die du gerade nicht entsperrt hast. Versionen einer Datenbank kommen nur bei Besitzern mit, weil sie alle Einträge enthalten. Jede Version enthält die ganze Datenbank; passen bei großen Datenbanken nicht alle ins Archiv, kommen die neuesten mit und ältere bleiben zurück – die aktuellen Einträge sind immer dabei.
- Beim Import entstehen neue IDs; interne Links und Relationen werden umgeschrieben – auch eingebettete Whiteboards, synchronisierte Blöcke, Kennzahlen, Zeichenblöcke und Einträge auf Whiteboard-Karten.
- Stammt das Archiv von jemand anderem, werden dessen Zuweisungen und Erwähnungen zu deinen; Aufgaben in Dokumenten erscheinen sofort unter **Meine Aufgaben**.
- Ältere Archive lassen sich wie bisher importieren; ältere Server überspringen, was sie nicht kennen.
- Importierte Bereiche und Vorlagen sind privat, Freigaben und Formulare nicht aktiv.
- Ein fehlerhafter Import wird vollständig zurückgerollt.
- Grenzen: 2 GB ZIP, 20.000 Dateien, 50.000 Seiten, 200.000 Einträge je Datenbank und 64 MB für Seiten, Einträge, Kommentare und Versionen ohne die Dateien (die Datei `flowplan.json` im Archiv) – je nach Inhalt reicht das für rund 100.000 Einträge. Dieselbe Grenze gilt beim Export, beim Import und beim Wiederherstellen; Versionen von Datenbanken kommen nur mit, solange sie darin Platz haben.
Konten, Sitzungen und Anmeldung gehören nicht dazu – die sichert der Betrieb täglich mit der gesamten Instanz.
## Versionsverlauf
**Seitenaktionen → Versionsverlauf**:
- Dokumente sichern automatisch höchstens alle fünf Minuten, Datenbanken vor der ersten Änderung nach zehn Minuten Ruhe.
- **Aktuelle Version sichern** legt jederzeit einen Stand an; manuell gesicherte Versionen bleiben dauerhaft.
- **Änderungen** vergleicht eine Version mit dem aktuellen Stand oder mit einer beliebigen anderen Version (**Vergleichen mit**): hinzugefügter und entfernter Text, bei Datenbanken neue, geänderte und entfernte Einträge und Eigenschaften.
- **Vergleich im Detail**: Der Vergleich geht Block für Block durch das Dokument – Überschriften, Absätze, Listenpunkte, Tabellenzellen, Zitate und Code bleiben als solche erkennbar – und markiert innerhalb eines geänderten Blocks die einzelnen Wörter: Hinzugefügtes grün, Entferntes rot und durchgestrichen; unveränderte Blöcke sind abgeblendet. Eine Zusammenfassung zeigt, wie viele Wörter hinzugekommen und weggefallen sind (etwa „+120 Wörter · −35 Wörter“), und mit den Pfeilen springst du von Änderung zu Änderung – auch per Tastatur. Das Gleiche gilt für die Versionen eines Eintragsdokuments. Sehr lange Dokumente (über 60.000 Wörter auf beiden Seiten zusammen) oder Versionen, die sich an zu vielen Stellen unterscheiden, meldet Flowplan als zu groß zum Vergleichen; wiederherstellen lassen sie sich trotzdem.
- **Einzelne Absätze zurückholen**: Im Vergleich mit dem aktuellen Stand hat jeder entfernte oder geänderte Absatz den Knopf **Wiederherstellen**. Der Absatz kommt mit seiner Formatierung an seinen alten Platz zurück; der Rest der Seite bleibt, wie er ist.
- **Wiederherstellen** setzt die Seite auf diesen Stand zurück. Danach beginnt die Anzeige der [Autoren](/reading-and-presenting#autoren-anzeigen) neu; der wiederhergestellte Text erscheint als „früher“.
- **Datenbanken** kommen beim Wiederherstellen mit Eigenschaften, Optionen und Einträgen zurück – und mit den Einstellungen, die Optionen beim Namen nennen: Erledigt-Regel, Workflow, Automationen und die Status-Zuordnung der Issue-Synchronisierung, so wie sie damals waren. Die Version von vor einer [umbenannten Option](/properties-and-formulas#optionen-umbenennen-und-zusammenfuehren) lässt die Erledigt-Regel also nicht beim neuen Namen stehen. Kommt eine Automation dabei verändert zurück, handelt sie danach im Namen der Person, die wiederhergestellt hat. Ältere und importierte Versionen lassen die Einstellungen, wie sie sind.
Automatische Versionen werden nach sieben Tagen auf eine je Tag verdichtet und nach 180 Tagen gelöscht (einstellbar in der Administration).
---
# Exportieren
Seiten, Datenbanken und ganze Bereiche als Markdown, HTML, Word, PDF oder E-Book exportieren – und als Text für Jira und Confluence.
**Seitenaktionen → Exportieren**:
| Format | Inhalt |
| --- | --- |
| **Markdown (.md)** | Eine Datei mit dem Seiteninhalt; Datenbanken mit Übersicht, Eigenschaften und den Dokumenten aller Einträge. |
| **Markdown mit Dateien (.zip)** | `index.md`, Unterseiten unter `pages/`, die Tage eines Journals in seinem Ordner unter `2026/10/2026-10-27.md` (siehe unten), Eintragsdokumente unter `records/`, Datenbanken zusätzlich als CSV unter `tables/`, Anhänge unter `assets/` – alles relativ verlinkt. Jeder Eintrag unter `records/` beginnt mit seinen Eigenschaften als YAML-Frontmatter (siehe unten). Mit **Kommentare und frühere Versionen einschließen** kommen `.comments.md` und `.versions/` dazu. |
| **Als Word (DOCX)** | Ein Word-Dokument der Seite – siehe [Word, PDF mit Unterseiten und E-Book](#word-pdf-mit-unterseiten-und-e-book). |
| **Als PDF (mit Unterseiten)** | Die Seite mit ihren Unterseiten als ein Dokument mit Deckblatt und Inhaltsverzeichnis, das der Druckdialog als PDF sichert. |
| **Als E-Book (EPUB)** | Die Seite mit ihren Unterseiten als E-Book für Lesegeräte und E-Book-Apps. |
| **Jira (Wiki-Markup)** | Die Seite als Jira-Wiki-Markup zum Einfügen in Beschreibungen und Kommentare – siehe [Jira und Confluence](#jira-und-confluence). |
| **Confluence (Speicherformat)** | Die Seite im Speicherformat von Confluence (XHTML) – siehe [Jira und Confluence](#jira-und-confluence). |
| **HTML / JSON** | Das ältere Format für Dokumente und Datenbanken. |
**In die Zwischenablage statt als Datei.** Bei den Textformaten – Markdown (.md), Jira, Confluence und HTML / JSON – wählst du unter **Ziel** zwischen **Datei** und **Zwischenablage**. Mit **Zwischenablage** heißt der Knopf **Kopieren**: Der Text landet direkt in der Zwischenablage, eine Meldung bestätigt es, und du fügst ihn in eine Mail, einen Chat, ein Jira-Ticket oder einen Editor ein. HTML kommt dabei zugleich als formatierter Text mit, sodass Mailprogramme und Textverarbeitungen Überschriften, Listen und Tabellen übernehmen; ein Code-Editor bekommt den HTML-Quelltext. Bilder und Anhänge kommen nicht mit – sie bleiben Links auf Flowplan mit vollständiger Adresse und öffnen sich nur für Personen mit Zugang. Flowplan merkt sich deine Wahl auf diesem Gerät. Dateiformate (Markdown mit Dateien, Word, PDF, E-Book) gibt es nur als Datei. Das funktioniert im Browser, in der Desktop-App und in den Apps für iPhone, iPad und Android.
**Drucken / PDF** öffnet die Druckansicht des Browsers; dort als PDF sichern. Vorher fragt ein kleines Fenster nach den [Druckoptionen](/print-and-pdf#drucken-und-pdf). Apps auf dem Home-Bildschirm von iPhone und iPad können nicht selbst drucken: Sie öffnen die Seite 15 Minuten lang unter einer geheimen Adresse in Safari. Diese Druckansicht zeigt nur Inhalt – keine Formularfelder, Knöpfe oder Skripte – und oben, wer sie erstellt hat.
Der Export berücksichtigt Leserechte und enthält alle Einträge unabhängig von Ansichtsfiltern. Formeln und Mermaid bleiben als Quelltext erhalten.
**Beschriftungen in Markdown**: Die [Beschriftung](/formatting#beschriftungen) eines Bildes wird zu seinem Titel, die einer Tabelle zu einer Zeile `Table: …` darunter (wie in Pandoc), die eines Codeblocks zu `Listing: …`:

| Posten | Betrag |
| --- | --- |
| Server | 40 € |
Table: Kosten im Überblick
```ts
const x = 1;
```
Listing: Ein Beispiel
Der Markdown-Import (auch ZIP, Git und **Als Markdown bearbeiten**) liest das wieder als Beschriftungen ein, ebenso Pandocs Kurzform `: …` unter einer Tabelle. Der Titel eines Bildes aus anderen Quellen (``) wird dabei zur Beschriftung. Ein gewöhnlicher Absatz, der zufällig mit `Table:` oder `Listing:` direkt unter einer Tabelle oder einem Codeblock ohne Beschriftung steht, wird beim Export als `Table\:` geschrieben und bleibt so ein Absatz. Nummeriert die Seite ihre Beschriftungen, steht das im Frontmatter (`flowplan: captions: numbered`); die Nummern selbst stehen nicht im Text, damit sie beim Import nicht Teil der Beschriftung werden.
**Whiteboards** kommen im ZIP als SVG-Bild unter `assets/` mit: Eine Whiteboard-Seite zeigt ihr Bild, ein in ein Dokument eingebettetes Whiteboard wird zum Bild mit einem Link zum Board in Flowplan. Das Bild ist zugeschnitten wie **Als SVG exportieren** im Board, Bilder auf dem Board liegen daneben unter `assets/`. Verdeckte Elemente bleiben verdeckt, Kommentar-Pins sind nicht enthalten; ein leeres Board ergibt einen kurzen Hinweis statt eines Bildes. Weil SVG Text ist, zeigt Git Änderungen an einem Board als lesbaren Diff. Bearbeitbar ist das Board außerhalb von Flowplan nicht.
**Journaltage** liegen im ZIP sortierbar im Ordner ihres Journals: `2026/10/2026-10-27.md` neben der `index.md` eines exportierten Journals, bei einem Journal unter einer anderen Seite unter `pages/-/2026/10/…`. Die Überschrift ist der Titel des Tages in der Sprache des Exports („Dienstag, 27. Oktober 2026“; ein umbenannter Tag behält seinen Titel), das Frontmatter nennt Kennung und Datum (`flowplan: id, date`). Das gilt für Seiten- und Bereichs-Export, den geplanten Export und Git. Der ZIP-Import macht daraus wieder ein Journal mit seinen Tagen, ohne Ordnerseiten „2026“ oder „10“; eine zweite Datei desselben Datums wird kein zweiter Tag.
**Blocklinks im Markdown-Export.** Links auf Blöcke werden im ZIP zu relativen Links mit Anker, wie Obsidian sie schreibt: `[Projekt › Ziele](<../index.md#^k3x9a2b1>)`. Der verlinkte Block trägt dazu seine Kennung als Markierung: ein Absatz, eine Überschrift oder ein Listenpunkt am Zeilenende (`Unsere Ziele für 2027 ^k3x9a2b1`), jeder andere Block (Tabelle, Code, Zitat, Liste …) in einer eigenen Zeile direkt darunter (`^k3x9a2b1`). Markiert werden nur Blöcke, auf die ein Link im Arbeitsbereich zeigt – der Rest des Markdowns bleibt sauber. Obsidian versteht beides als Blockverweis; andere Markdown-Programme zeigen die kurze Markierung als Text. Beim Import (ZIP, Obsidian-Tresor, [Git-Export](/markdown-git-export#in-ein-git-repository-uebertragen) mit Übernahme der Änderungen, **Als Markdown bearbeiten**) wird die Markierung wieder zur Kennung des Blocks, und die Links zeigen wieder auf ihn. Außerhalb eines ZIP (einzelne Markdown-Datei, MCP) bleibt der Link die Adresse in Flowplan mit `&block=…`.
Grenzen je Export: 500 Seiten, 200.000 Einträge, 250 MB Inhalt (davon höchstens 200 MB Text); das ZIP darf höchstens 100 MB groß sein. Die Grenzen gelten auch für den [geplanten Markdown-Export](/markdown-git-export), der ganze Datenbanken samt Kommentaren und Versionen sichert.
## Word, PDF mit Unterseiten und E-Book
Drei weitere Formate für Handbücher, Berichte und alles, was außerhalb von Flowplan gelesen oder weiterbearbeitet wird. Alle drei gehen vom selben bereinigten Seiteninhalt aus wie der Markdown-Export und berücksichtigen Leserechte genauso: Enthalten ist nur, was du lesen darfst – private Einträge, Journale mit PIN und Bilder aus Seiten, die du nicht öffnen darfst, bleiben draußen (statt eines Bildes steht dann ein Hinweis, ein Link auf eine unzugängliche Seite wird zu Text).
**Als Word (DOCX)** – **Seitenaktionen → Exportieren → Als Word (DOCX)**, bei einer Datenbank auch über **Exportieren** in der Werkzeugleiste, bei einem einzelnen Eintrag über das **…**-Menü im Kopf des Eintrags. Die Datei kommt ohne Word-Bibliothek direkt aus Flowplan und öffnet sich in Word, LibreOffice und Pages:
- Überschriften (als Word-Überschriftenstile, also mit Navigationsbereich), Absätze mit Ausrichtung, **fett**, *kursiv*, unterstrichen, durchgestrichen, Code, Markierungen, Textfarbe, Hoch- und Tiefstellung, Links.
- Aufzählungen und nummerierte Listen auch verschachtelt, Aufgaben mit ☐/☑ und Fälligkeitsdatum.
- Tabellen mit verbundenen Zellen und hervorgehobener Kopfzeile.
- Bilder (PNG, JPEG, GIF, WebP) eingebettet und auf die Textbreite verkleinert; das Titelbild der Seite oben.
- [Beschriftungen](/formatting#beschriftungen) von Bildern, Tabellen und Code im Word-Stil „Beschriftung“ unter dem Block; nummeriert die Seite ihre Beschriftungen, sind die Nummern Word-Felder (SEQ), sodass ein Abbildungsverzeichnis in Word sie aufnimmt.
- Hinweise (Notiz, Tipp, Wichtig, Warnung, Achtung) als farbig hinterlegte Absätze, Zitate mit Randlinie, Code-Blöcke, Formeln und Mermaid-Diagramme in Schreibmaschinenschrift, aufklappbare Abschnitte mit ihrem Titel, Spalten nacheinander.
- Fußnoten als echte Word-Fußnoten, Zitate und das Literaturverzeichnis als Text.
- Eine Datenbank wird zur Tabelle aller Einträge, gefolgt vom Dokument jedes Eintrags; ein einzelner Eintrag beginnt mit seinen Eigenschaften als Tabelle.
- Nicht enthalten: Whiteboards, eingebettete Videos, Audios, PDFs, Linkkarten und verknüpfte Datenbanken (sie bleiben Links auf Flowplan), Funktionsgraphen und Kennzahlen (ein Hinweis), Kommentare und Versionen.
**Als PDF (mit Unterseiten)** – **Seitenaktionen → Exportieren → Als PDF (mit Unterseiten)**: Die Seite mit allen zugänglichen Unterseiten (abwählbar) wird zu einer Druckansicht mit Deckblatt, Inhaltsverzeichnis und jeder Seite als nummeriertem Kapitel auf einer neuen Seite; Links zwischen den Seiten springen innerhalb des Dokuments. Wie bei **Drucken / PDF** öffnet sich der Druckdialog des Browsers – dort **als PDF sichern**. Apps auf dem Home-Bildschirm von iPhone und iPad öffnen die Ansicht wie gewohnt in Safari. Whiteboards kommen als Bild mit, Datenbanken als Tabelle mit den Dokumenten der Einträge. Vor dem Druckdialog lassen sich Titelseite, Inhaltsverzeichnis, Titelbilder, Seitenzahlen, Papierformat, Schriften und Links wählen ([Druckoptionen](/print-and-pdf#drucken-und-pdf)). Seitenzahlen in der Fußzeile setzen Chrome und Edge; die Seitenzahlen im Inhaltsverzeichnis zeigen nur Renderer, die `target-counter` kennen (Prince, Paged.js). Für Skripte: `GET /api/export/pdf?page=&children=1` liefert das HTML der Druckansicht.
**Als E-Book (EPUB)** – **Seitenaktionen → Exportieren → Als E-Book (EPUB)**: Die Seite mit ihren Unterseiten als EPUB 3 – jede Seite ein Kapitel, das Inhaltsverzeichnis verschachtelt wie der Seitenbaum, Bilder und Whiteboards als Ressourcen, Links zwischen den Seiten innerhalb des Buchs, Fußnoten am Kapitelende. Geeignet für Apple Books, Kindle (nach Umwandlung), Calibre, Thorium und andere Reader. Für Skripte: `GET /api/export/epub?page=&children=1`.
Grenzen: 200 Seiten je PDF- oder EPUB-Export, 5.000 Datensätze, 100 MB Anhänge (Dateien über 25 MB werden ausgelassen). Datenbanktabellen mit mehr als 200 Spalten lassen sich nicht nach Word exportieren.
## Jira und Confluence
Zwei Textformate für Teams, die mit Atlassian-Werkzeugen arbeiten. Beide exportieren **nur die geöffnete Seite** (oder einen einzelnen Eintrag), ohne Unterseiten – wie **Markdown (.md)**. Sie berücksichtigen Leserechte wie die anderen Exporte: Bilder aus Seiten, die du nicht öffnen darfst, werden zu einem Hinweis, Links auf unzugängliche Seiten zu Text. Links und Bilder behalten ihre vollständige Adresse in Flowplan; Jira und Confluence zeigen Bilder aus Flowplan nur, wenn der Browser dort angemeldet ist.
**Jira (Wiki-Markup)** – zum Einfügen in Beschreibungen und Kommentare von Jira Server/Data Center (und in Felder von Jira Cloud, die Wiki-Markup annehmen):
- Überschriften als `h1.` bis `h6.`, `*fett*`, `_kursiv_`, `-durchgestrichen-`, `+unterstrichen+`, `{{Code}}`, Hoch- und Tiefstellung, Textfarbe, Links als `[Text|Adresse]`.
- Aufzählungen und nummerierte Listen mit `*` und `#`, auch verschachtelt (`*#`); Aufgaben als `* [ ]` und `* [x]` (abgesagte durchgestrichen).
- Tabellen mit `||Kopf||` und `|Zelle|`; verbundene Zellen werden zu leeren Zellen.
- Code-Blöcke als `{code:sprache}`, ohne Sprache als `{noformat}`; Formeln als `{noformat}`, Mermaid als `{code}`.
- Zitate als `{quote}`, Hinweise als `{info}` (Notiz, Wichtig), `{tip}`, `{note}` (Warnung) und `{warning}` (Achtung), aufklappbare Abschnitte und Besprechungen als `{panel}`, Trennlinien als `----`.
- Bilder als `!Adresse!`, Erwähnungen als Name, Fußnoten als hochgestellte Nummern mit einer Liste am Ende.
- Zeichen, die in Jira Formatierung auslösen (`* _ { } [ ] | ! ^ ~ +`, Striche am Wortrand, `??`, `(y)` …), werden maskiert und erscheinen so, wie du sie geschrieben hast.
**Confluence (Speicherformat)** – das XHTML, in dem Confluence seine Seiten speichert: für den Quelltext-Editor, die REST-API (`representation: storage`) oder Werkzeuge, die nach Confluence veröffentlichen. Code-Blöcke werden zum Code-Makro mit Sprache, Hinweise zu den Makros Info, Tipp, Notiz und Warnung, aufklappbare Abschnitte zu „Erweitern“ (expand), Besprechungen zu Panels, Aufgaben zu Confluence-Aufgabenlisten (mit Fälligkeitsdatum), Bilder zu `` mit ihrer Adresse in Flowplan. Tabellen, Listen, Links, Zitate und Fußnoten bleiben gewöhnliches XHTML.
Als Datei heißen die Exporte `.jira.txt` und `.confluence.xhtml`. Für Skripte: `GET /api/export/jira?page=` bzw. `GET /api/export/confluence?page=`, mit `&row=` für einen einzelnen Eintrag einer Datenbank; persönliche API-Tokens mit Lesezugriff genügen.
## Einen ganzen Bereich exportieren
Das Download-Symbol neben dem Namen eines Bereichs in der Seitenleiste (oder **Einstellungen → Import & Export → Export → Einen Bereich**) öffnet den Export des Bereichs. Neben dem Markdown-ZIP stehen dort **Bereich als PDF** (eine Druckansicht aller Seiten des Bereichs mit Deckblatt und Inhaltsverzeichnis, siehe oben) und **Bereich als E-Book (EPUB)** zur Wahl – jeweils mit allem, was du lesen darfst, bis 200 Seiten (`GET /api/export/pdf?space=` bzw. `/api/export/epub?space=`). Das Markdown-ZIP lädt den ganzen Bereich als **ein** Archiv herunter – zum Archivieren, offline Lesen oder für ein eigenes Git-Repository:
- Jede Seite der obersten Ebene liegt mit allem, was darunter hängt, in einem eigenen Ordner `-/` – derselbe Aufbau wie beim [geplanten Markdown-Export](/markdown-git-export). Darin gilt das Format von **Markdown mit Dateien (.zip)**.
- `index.md` oben listet die Seiten des Bereichs; Links zwischen Seiten des Bereichs sind relativ, Links in andere Bereiche zeigen weiter auf Flowplan.
- Exportieren darf jede Person, die den Bereich lesen kann, ohne Administrator. Enthalten ist nur, was sie lesen darf: private Einträge und Journale mit PIN anderer bleiben draußen, private Bereiche anderer lassen sich nicht exportieren.
- **Kommentare und frühere Versionen einschließen** wie beim Seitenexport; es gelten dieselben Grenzen, für den ganzen Bereich.
- Für Skripte mit einem Lese-Token: `{"spaceId":"…","format":"zip","history":true}` an `/api/markdown-export` (siehe [API-Tokens](/api-and-webhooks)). Die Kennung des Bereichs steht im Export-Dialog.
- Regelmäßig in ein Git-Repository, ohne eigenes Skript: der [Git-Export eines Bereichs](/markdown-git-export#git-export-eines-bereichs), den die Eigentümerin oder der Eigentümer des Bereichs einrichtet.
---
# Drucken und PDF
Seiten drucken oder als PDF sichern – mit Druckoptionen, Vorlagen und Seitenumbrüchen dort, wo du sie haben willst.
## Drucken und PDF
**Seitenaktionen → Drucken / PDF** (oder `> drucken` in der Schnellsuche, oder ++⌘ P++ bzw. ++Strg P++ bei geöffneter Seite) öffnet zuerst ein kleines Fenster mit den Druckoptionen; **Drucken** (oder Enter ) öffnet dann den Druckdialog des Browsers, wo du die Seite auch **als PDF sichern** kannst. Seitenleiste, Werkzeugleisten, Griffe, Kommentarleisten, Hinweise und Knöpfe wie „Cover ändern“ oder „+ Tag“ erscheinen nie auf dem Papier; die Farben sind immer hell, Blöcke werden nicht mitten auf der Seite getrennt und lange Codezeilen umbrochen.
**Inhalt** – was mitgedruckt wird:
| Option | Wirkung |
| --- | --- |
| **Titelbild** | Das Cover der Seite oder des Eintrags (beim PDF mit Unterseiten auch die Cover der Kapitel). |
| **Icon** | Das Seitensymbol bzw. das Symbol eines Datenbankeintrags. |
| **Tags** | Die Tags der Seite. |
| **Eigenschaften** | Die Eigenschaften der Seite bzw. die Felder eines Eintrags (Tag-Felder eines Eintrags gehören dazu). |
| **Seitenzahlen** | Eine Seitenzahl unten in der Mitte. |
| **Titelseite**, **Inhaltsverzeichnis** | Nur beim PDF mit Unterseiten und beim Bereich als PDF. |
**Aussehen**: **Papierformat** (Standard – das des Druckers, beim PDF mit Unterseiten A4 –, A4 oder US Letter), **Titelgröße** (Klein, Normal, Groß – für den Seitentitel und die Überschriften), **Schrift für Text** und **Schrift für Überschriften** (Standard, Serifenschrift, serifenlose Schrift oder die [Schriften des Arbeitsbereichs](/workspace-appearance#erscheinungsbild)) und **Links**: Standard (beim Drucken einer Seite wie in Flowplan, beim PDF mit Unterseiten mit der Adresse in Klammern), wie normaler Text, unterstrichen, gestrichelt unterstrichen oder mit der Adresse in Klammern.
Ohne Änderung druckt Flowplan wie bisher, nur mit Seitenzahlen. Deine letzte Auswahl merkt sich Flowplan für dich auf allen Geräten.
> Seitenzahlen in der Fußzeile setzen Chrome und Edge (ab Version 131). Firefox und Safari kennen diese Angabe nicht: Schalte dort im Druckdialog des Browsers **Kopf- und Fußzeilen** ein, dann druckt der Browser seine eigene Seitenzahl (zusammen mit Datum, Titel und Adresse).
### Druckvorlagen
Eine **Druckvorlage** ist eine benannte Auswahl dieser Optionen, etwa „Intern“ (alles) und „Sauber für extern“ (ohne Titelbild, Icon, Tags und Eigenschaften, Links wie Text). Im Druckfenster wählst du sie oben unter **Druckvorlage**; ändert sich danach eine Option, steht dort **Eigene Auswahl**.
- **Als Vorlage speichern …** legt die aktuelle Auswahl als eigene Vorlage an. Eigene Vorlagen umbenennen oder löschen die Stift- und Papierkorb-Knöpfe daneben, verwalten lassen sie sich auch unter **Einstellungen → Drucken / PDF**.
- **Vorlagen des Arbeitsbereichs** legen Eigentümerinnen und Eigentümer an – im Druckfenster (**Speichern für → Für den Arbeitsbereich**) oder unter **Einstellungen → Arbeitsbereich → Druckvorlagen**. Alle Mitglieder und Gäste können sie wählen, aber nicht ändern; im Druckfenster tragen sie das Abzeichen **Arbeitsbereich**. Mit dem Stern wird eine von ihnen zur **Standardvorlage**: Mit ihr beginnt das Druckfenster für alle, die noch nichts gewählt haben.
- Höchstens 30 Vorlagen je Person und je Arbeitsbereich. Die Vorlagen des Arbeitsbereichs kommen im [Inhaltsarchiv](/import-export-versions#inhaltsarchiv) und im JSON-Export mit; beim Import ergänzen sie die vorhandenen (gleichnamige bleiben, wie sie sind).
- Für Skripte: `profile.print` (eigene Auswahl und Vorlagen) und `workspace.printPresets` (Vorlagen des Arbeitsbereichs, nur Eigentümer) über `/api/command`; das PDF mit Unterseiten nimmt die Optionen als JSON im Parameter `print` (`GET /api/export/pdf?page=&children=1&print={"toc":false}`).
## Seitenumbruch
Ein **Seitenumbruch** (`/seitenumbruch`, auch `/umbruch` oder `/pagebreak`) legt fest, wo beim Drucken eine neue Seite beginnt. Im Editor ist er eine feine gestrichelte Linie mit der Aufschrift „Seitenumbruch“; anklicken markiert ihn, ⌫ löscht ihn wie eine Trennlinie, am Griff `⋮⋮` lässt er sich verschieben.
- **Drucken / PDF** einer Seite und das [PDF mit Unterseiten](/export#word-pdf-mit-unterseiten-und-e-book) beginnen danach eine neue Seite; die Linie selbst wird nicht gedruckt. Auf dem Bildschirm, auf veröffentlichten Seiten und in der Präsentation bleibt es bei der Linie.
- **Word (DOCX)** bekommt einen echten Seitenumbruch, **E-Books** einen Umbruch, wo das Lesegerät ihn beachtet.
- **Markdown-Export** schreibt `
` – das verstehen Pandoc, Typora und die meisten Markdown-zu-PDF-Werkzeuge. Der **Markdown-Import** macht daraus wieder einen Seitenumbruch, ebenso aus `\pagebreak` oder `\newpage` auf einer eigenen Zeile. Eingefügtes HTML aus Word oder Google Docs mit einem Seitenumbruch wird ebenfalls zum Block.
- In [verschlüsselten Bereichen](/encrypted-spaces) gibt es den Block nicht.
---
# Dokumente und Editor
Der Editor arbeitet mit Blöcken: Jeder Absatz, jede Liste, Tabelle oder Einbettung ist ein Block, den du einfügen, formatieren, einrücken und [verschieben](/blocks) kannst. Gespeichert wird laufend, auch ohne Verbindung.

**Mehr zum Thema:** [Blöcke bearbeiten](/blocks) · [Markdown im Editor](/markdown-editor) · [Formatieren, Hinweise und Beschriftungen](/formatting) · [Aufgaben in Dokumenten](/tasks-in-documents) · [Bilder, Dateien und Sprachnotizen](/media-and-files) · [Formeln, Diagramme, Code und Rechnen](/math-and-code) · [Links, Erwähnungen und Graph](/links-and-mentions) · [Fußnoten, Zitate und Literatur](/academic-writing) · [Lesen, Präsentieren und Überblick](/reading-and-presenting) · [Drucken und PDF](/print-and-pdf)
## Das Blockmenü mit /
Am Zeilenanfang oder nach einem Leerzeichen öffnet `/` das Blockmenü direkt an der Schreibmarke. Weitertippen filtert: `/h2`, `/todo`, `/code`, `/tab`. Pfeiltasten wählen, Enter oder Tab fügt ein, Esc schließt.
> [!TIP]
> Einen normalen Schrägstrich schreibst du, indem du nach `/` ein Leerzeichen tippst oder das Menü mit Esc schließt. In Codeblöcken ist `/` immer ein gewöhnliches Zeichen.
| Block | Kürzel im Menü | Wofür |
| --- | --- | --- |
| Text | `/text` | Normaler Absatz |
| Überschrift 1–4 | `/h1`, `/h2`, `/h3`, `/h4` | Gliederung; erscheinen im Inhaltsverzeichnis |
| Aufgabenliste | `/todo` | Abhakbare Aufgaben |
| Aufzählung, Nummerierte Liste | `/ul`, `/ol` | Listen, beliebig verschachtelt |
| Zitat | `/quote` | Hervorgehobenes Zitat (bei `/zitat` erscheint zuerst das Literaturzitat) |
| Hinweis, Tipp, Wichtig, Warnung, Achtung | `/hinweis`, `/tipp`, `/wichtig`, `/warnung`, `/achtung` | Farbiger Kasten mit Symbol und Titel – die fünf Arten der GitHub-Hinweise |
| Aufklappbarer Block | `/toggle` | Inhalt, der sich ein- und ausklappen lässt |
| Code | `/code` | Syntaxhervorhebung für über 240 Sprachen (wie in VS Code), Vorschau für HTML, SVG, Markdown, Mermaid, LaTeX und Typst |
| Tabelle | `/table` | Einfache Tabelle im Text |
| Bild oder Datei | `/bild`, `/datei` | Upload oder Auswahl aus der Mediathek |
| Mermaid-Diagramm | `/mermaid` | Ablauf-, Sequenz-, Klassendiagramme als Text |
| draw.io-Diagramm | `/drawio` | Diagramme zeichnen mit dem Editor von draw.io |
| Formel, Inline-Formel | `/math`, `/inlinemath` | LaTeX, dargestellt mit KaTeX |
| Seite, Eintrag oder Person erwähnen | `/mention` oder `@` | Verweis auf Seite, Datenbank-Eintrag oder Person |
| Whiteboard | `/board` | Whiteboard im Dokument einbetten |
| Zeichnen | `/zeichnen`, `/draw`, `/handschrift` | Handschrift und Skizzen mit Stift oder Finger ([Handschrift in Dokumenten](/notebooks#handschrift-in-dokumenten)) |
| Verknüpfte Datenbank | `/db` | Ansicht einer vorhandenen Datenbank |
| Zwei Spalten | `/spalten` | Inhalte nebeneinander |
| Einbetten | `/embed` | Player für YouTube, Vimeo, Loom, Spotify, Figma, CodePen; sonst Linkkarte |
| Spoiler | `/spoiler` | Verdeckter Text, per Klick sichtbar |
| Sprachnotiz | `/sprachnotiz` | Aufnehmen (bis zu zwei Stunden) und als Audio, auf Wunsch auch als Transkript einfügen |
| Synchronisierter Block | `/sync` | Inhalt, der auf mehreren Seiten gleich bleibt |
| Synchronisierten Block einfügen | `/sync` | Einen bestehenden synchronisierten Block zeigen |
| Trennlinie | `/hr` | Horizontale Linie |
| Seitenumbruch | `/seitenumbruch`, `/pagebreak` | Beim Drucken, im PDF und in Word geht es auf einer neuen Seite weiter ([Seitenumbruch](/print-and-pdf#seitenumbruch)) |
| KI | `/ki`, `/ai` | Text mit der [KI](/ai-writing#schreibassistent) schreiben lassen (wenn eingeschaltet) |
| Fußnote | `/fußnote`, `/footnote` | Nummerierte Anmerkung am Seitenende ([Fußnoten](/academic-writing#fussnoten)) |
| Literaturzitat | `/zitat`, `/cite` | Quelle zitieren – DOI, BibTeX oder Zotero ([Zitate](/academic-writing#zitate-und-literaturverzeichnis)) |
| Literaturverzeichnis | `/literatur`, `/bibliography` | Alle zitierten Werke als Liste |
**Tabellen:** Tabellen sind kompakt – niedrige Zeilen, linksbündige Kopfzeile, so breit wie ihr Inhalt (gezogene Spaltenbreiten bleiben). Zeigst du auf eine Spaltengrenze, erscheint eine blaue Linie; zieh sie, um die Spalte breiter oder schmaler zu machen. Zeigst du auf eine Zelle, erscheinen zwei Griffe ⋮⋮: links am Rand ihrer Zeile und oben am Rand ihrer Spalte. Ein Klick wählt die Zeile oder Spalte aus (blau umrandet) und öffnet ihr Menü: Suchfeld, **Farbe** (Text oder Hintergrund), **Zeile darüber/darunter einfügen** bzw. **Spalte links/rechts einfügen**, **Duplizieren** (++⌘ D++), **Inhalt löschen**, **Zeile/Spalte löschen**, **Kopfzeile** bzw. **Kopfspalte**, **Beschriftung** und **In Datenbank umwandeln**. Ziehst du einen Griff, verschiebst du die Zeile oder Spalte – eine Linie zeigt, wo sie landet; die Kopfzeile bleibt dabei die erste Zeile. Mit ausgewählter Zeile verschiebt ++⌘ ⇧ ↑/↓++ sie (++⌘ ⇧ ←/→++ eine Spalte). Die **+**-Leisten unter der Tabelle und an ihrem rechten Rand fügen eine Zeile bzw. Spalte am Ende an. Ziehst du über mehrere Zellen, bekommt die Auswahl oben rechts einen Knopf mit **Farbe**, **Inhalt löschen**, **Zellen verbinden** und **Zelle teilen**. Zeilen über verbundene Zellen hinweg und Spalten in Tabellen mit verbundenen Zellen lassen sich nicht verschieben. Auf Smartphone und Tablet erscheinen Griffe und **+**-Leisten an der Zelle, in die du tippst; das Menü öffnet sich als Blatt von unten. Zellfarben bleiben im Markdown-Export erhalten (als Kommentar vor der Tabelle, den andere Programme ignorieren) und werden beim Import wieder zu Farben. Tab springt zur nächsten Zelle und legt in der letzten Zelle eine neue Zeile an.
**Tabelle in Datenbank umwandeln:** Wird aus einer Tabelle mehr, wählst du im Menü eines Zeilen- oder Spaltengriffs **In Datenbank umwandeln**. Flowplan legt daraus eine [Datenbank](/databases) unter dem Dokument an und setzt an die Stelle der Tabelle eine eingebettete Ansicht davon. Die erste Zeile liefert die Spaltennamen, die erste Spalte wird zum Titel der Einträge. Die übrigen Spalten bekommen ihren Typ aus den ausgefüllten Zellen: Zahl (mit deutschem oder englischem Trennzeichen), Datum (`2026-11-04` oder `04.11.2026`), Checkbox (✓, x, ja/nein, yes/no, true/false), URL, sonst Text. Benannt wird die Datenbank nach der Beschriftung der Tabelle, sonst nach der nächsten Überschrift darüber, sonst „Tabelle“. Mit ++⌘/Strg Z++ kommt die Tabelle zurück. Grenzen wie beim CSV-Import: bis 80 Spalten und 5.000 Zeilen. In verschlüsselten Bereichen gibt es den Punkt nicht; in einem Datenbankeintrag landet die neue Datenbank oben im Bereich.
**Tastatur ausblenden (Handy):** Beim Schreiben sitzt die Formatierungsleiste über der Bildschirmtastatur. Der letzte Knopf rechts, **Tastatur ausblenden**, schließt die Tastatur, damit du mehr vom Dokument siehst; Text und Cursorposition bleiben. Ein Tipp in den Text holt sie zurück. Im Inhalt eines Datenbank-Eintrags sitzt die Leiste beim Schreiben genauso über der Tastatur. Bei allen anderen Textfeldern – Titel von Seiten, Datenbanken und Einträgen, Tags, Eigenschaften, der Name im Dialog **Neue Seite**, Suchfelder, Kommentare – erscheint derselbe Knopf als runder Knopf rechts direkt über der Tastatur. Das gilt im Browser und in den Apps.
## Aufklappbare Blöcke
Ein **aufklappbarer Block** hat einen Titel und darunter Inhalt, der sich ein- und ausklappen lässt. Du legst ihn mit `/toggle` an oder tippst am Anfang einer leeren Zeile `>` und ein Leerzeichen. Der Cursor steht dann im leeren Titel (grau „Aufklappbarer Block“); Text, der schon hinter `>` steht, wird zum Titel.
- **Ein- und ausklappen:** Klick (oder Tipp) auf den Pfeil vor dem Titel. Mit der Tastatur: ++⌘ ⌥ Enter++ (Windows/Linux: ++Strg Alt Enter++) im Inhalt klappt ein und setzt den Cursor in den Titel, dort klappen dieselben Tasten wieder auf.
- **Titel bearbeiten:** Ein Klick in den Titel setzt den Cursor hinein. Bei einem aufgeklappten Block springen Enter oder ↓ in den Inhalt, ↑ am Anfang des Inhalts zurück in den Titel. Bei einem eingeklappten Block klappt ↓ ihn auf und springt in den Inhalt.
- **Liste aus aufklappbaren Blöcken:** Enter am Ende des Titels eines **eingeklappten** Blocks legt direkt darunter einen neuen, eingeklappten Block an, der Cursor steht in seinem Titel – praktisch für häufige Fragen. Enter in einem **leeren** Titel beendet die Liste: Der Block wird ein normaler Absatz, sein Inhalt bleibt darunter stehen.
- **Aus vorhandenem Text:** Im Blockmenü macht **Umwandeln in … → Aufklappbarer Block** aus einem Absatz einen aufklappbaren Block mit dem Text als Titel. Aus einem Listenpunkt wird ein Block mit dem Text des Punkts als Titel, seine eingerückten Unterpunkte kommen in den Inhalt. Ein Mal **Rückgängig** macht das wieder rückgängig.
- **Aufklappbare Überschrift:** **Umwandeln in … → Aufklappbare Überschrift 1–4** zeigt den Titel als Überschrift. In Markdown steht er dann als Überschrift in `` (`Titel `), wie GitHub es darstellt.
- **Zurück zu Text:** **Umwandeln in** macht aus einem aufklappbaren Block wieder Text, eine Überschrift, eine Liste, ein Zitat, einen Hinweis oder Code: Der Titel wird der Block, der Inhalt folgt darunter. ⌫ am Anfang des Titels macht ihn ebenso zu normalem Text.
- **Hineinschieben mit Tab:** Tab am Anfang eines Blocks direkt unter einem aufklappbaren Block schiebt ihn hinein, als letzten Block des Inhalts. Das geht mit Absätzen, Überschriften, Zitaten, Hinweisen, weiteren aufklappbaren Blöcken und den ersten Punkten einer Liste; ein eingeklappter Block klappt dabei auf. Was eingerückt ist, gehört also dazu und verschwindet beim Einklappen mit. ++⇧ Tab++ schiebt einen Block wieder heraus, direkt unter den aufklappbaren Block; die Blöcke darunter bleiben drin. Ein Mal **Rückgängig** nimmt jeden Schritt zurück.
- **Verschachteln:** Tab im Titel schiebt den ganzen aufklappbaren Block in den aufklappbaren Block darüber (oder unter den letzten Punkt einer Liste darüber), ++⇧ Tab++ holt ihn wieder heraus. Der Cursor bleibt im Titel, und Tab verlässt von dort nie das Dokument. Zum Rückgängigmachen erst Esc drücken – im Titel nimmt ++⌘/Strg Z++ nur das Tippen im Titel zurück.
- **Was dazugehört:** Fährst du mit der Maus über den Pfeil oder den Griff ⋮⋮ eines aufklappbaren Blocks, wird der ganze Block (Titel und Inhalt) leicht hinterlegt. Der Inhalt ist genau um eine Tab-Stufe eingerückt.
- **Nichts geht verloren:** Kommt der Cursor in einen eingeklappten Block (Pfeiltasten, Rückgängig) oder springt **Auf der Seite suchen** zu einem Treffer darin, klappt er auf. Klappst du ein, während der Cursor darin steht, wandert der Cursor vor den Block.
- **Nur für dich:** Wie bei [eingeklappten Abschnitten](/reading-and-presenting#abschnitte-einklappen) ändert das Einklappen das Dokument nicht – andere, die gleichzeitig bearbeiten, sehen ihren eigenen Zustand. Was du eingeklappt hast, merkt sich dein Browser bzw. die App auf diesem Gerät für dein Konto: Beim nächsten Öffnen der Seite ist es wieder eingeklappt. Auf einem anderen Gerät sind die Blöcke aufgeklappt. Gespeichert, exportiert (Markdown ``, HTML) und veröffentlicht wird ein Block immer aufgeklappt; Lesende klappen dort selbst ein. Auch bei importierten oder per API erstellten Seiten merkt sich Flowplan, was du eingeklappt hast. Ein Block ohne Titel wird in Markdown mit leerem ` ` exportiert und kommt beim Import genauso zurück.
- Im **Lesemodus** klappt ein Klick auf die ganze Titelzeile ein und aus.
## Synchronisierte Blöcke
Ein synchronisierter Block (`/sync` → **Synchronisierter Block**) ist Inhalt, der an mehreren Stellen derselbe ist – etwa Kontaktdaten, eine Checkliste oder ein Statushinweis. **Synchronisierten Block einfügen** zeigt ihn auf einer weiteren Seite. Bearbeiten geht überall; die Änderung erscheint auf allen Seiten, bei geöffneten Seiten live.
- Der orange Rahmen kennzeichnet den Block, oben stehen die Zahl der Seiten und die Seite, auf der er entstanden ist.
- Der Papierkorb im Rahmen entfernt den Block nur an dieser Stelle; an den anderen bleibt er.
- Die Rechte kommen von der Seite, auf der der Block entstanden ist: Wer dort nicht lesen darf, sieht statt des Inhalts einen Hinweis.
- Die Suche findet den Text auf der Ursprungsseite. Auf veröffentlichten Seiten erscheint der Block nicht.
## Weitere Blöcke
- **Inhaltsverzeichnis**: listet die Überschriften der Seite und springt per Klick dorthin.
- **Zwei Spalten**: Blöcke nebeneinander; auf dem Smartphone untereinander.
- **Verknüpfte Datenbank**: eine Ansicht einer vorhandenen Datenbank mit eigenen Filtern und Sortierungen; Änderungen an Einträgen landen in der Quelle. Siehe [Ansichten](/views#verknuepfte-datenbanken).
- **Whiteboard**: ein Whiteboard direkt im Dokument; der Knopf oben rechts öffnet es groß.
- **Zeichnen** (`/zeichnen`): ein Block für Handschrift über die ganze Breite, leer, liniert oder kariert, in der Höhe ziehbar; mehrere Personen zeichnen gleichzeitig, ohne sich zu überschreiben. Siehe [Handschrift in Dokumenten](/notebooks#handschrift-in-dokumenten).
---
# Blöcke bearbeiten
Jeder Block hat links einen Griff: Daran ziehst du ihn an eine andere Stelle, ein Klick öffnet das Blockmenü zum Umwandeln, Färben, Duplizieren und Verschieben. Mehrere Blöcke wählst du mit der Maus oder der Tastatur auf einmal aus.
**Mehr zum Thema:** [Dokumente und Editor](/documents) · [Formatieren, Hinweise und Beschriftungen](/formatting) · [Tastenkürzel](/keyboard-shortcuts#im-dokument)
## Griff und Ziehen
Links neben einem Block erscheinen **+** und ein Griff (`⋮⋮`) – damit die Seite ruhig bleibt, nur am Block unter dem Mauszeiger (irgendwo in seiner Zeile, auch im Rand links davon); beim Tippen verschwinden sie, bis du die Maus wieder bewegst. Der Griff steht dort, wo der Text des Blocks beginnt, bei einem eingerückten Absatz also direkt neben dem Text. Auch Blöcke in aufklappbaren Blöcken, Hinweisen und Zitaten haben einen eigenen Griff; der Kasten selbst behält seinen. Ein [Besprechungsblock](/meetings) hat einen Griff in seiner Titelzeile für den ganzen Block; die Blöcke in seiner Zusammenfassung behalten ihre. Blöcke in einem zugeklappten Block haben keinen Griff, bis er aufgeklappt ist. Mit der Tastatur erreichst du die Griffe weiterhin (Tab außerhalb des Textes); ein Griff mit Tastaturfokus ist immer sichtbar und umrandet. Auf Touch-Geräten hat nur der Block mit dem Cursor einen Griff, groß genug zum Antippen – tippe also zuerst in den Block. Leere Absätze haben keinen Griff, solange der Cursor nicht darin steht. Wer alle Griffe sehen möchte, schaltet **Einstellungen → Darstellung & Sprache → Editor → Griffe immer anzeigen** ein (auf diesem Gerät). Im Lesemodus und auf gesperrten Seiten gibt es keine Griffe.
- **+** fügt darunter einen leeren Block ein und öffnet gleich das [Blockmenü mit /](/documents#das-blockmenue-mit); mit gedrückter ⌥ /Alt darüber. Das geht unter jedem Block, auch unter Tabellen, Bildern, Einbettungen und Spalten. Blöcke in Spalten haben kein eigenes **+** – dort gehen Enter und `/`.
- **Ziehen** am Griff zeigt eine Einfügelinie – auch in Hinweise, Zitate oder Spalten hinein. Wie weit links oder rechts du ziehst, bestimmt die Ebene: Nach rechts über einem Listenpunkt wird der Block sein Unterpunkt (die Linie rückt ein), nach links landet er eine Ebene höher – so verschachtelst du Listen und ziehst Blöcke in aufklappbare Blöcke hinein oder heraus. Der Block, der das Abgelegte aufnimmt – Listenpunkt, Liste, aufklappbarer Block, Hinweis, Zitat oder Spalte –, ist beim Ziehen leicht hinterlegt. Am linken oder rechten Rand eines Blocks entstehen Spalten. Mit gedrückter ⌥ /Alt beim Loslassen wird eine **Kopie** eingefügt, das Original bleibt.
Listenpunkte und Aufgaben bleiben beim Verschieben, was sie sind: Außerhalb ihrer Liste bilden sie eine eigene Liste derselben Art, ein nummerierter Punkt behält seine Nummer. Direkt neben einer passenden Liste werden sie Teil davon; in einer anderen Listenart passen sie sich an. In eine Liste abgelegte Blöcke landen auf der Ebene der Einfügelinie, ohne leere Punkte: Absätze werden Listenpunkte, andere Blöcke wie Tabellen gehören zum Punkt davor.
++⌘ ⇧ ↑/↓++ verschiebt den aktuellen Block unter seinen Nachbarn. Jede Blockaktion lässt sich einzeln rückgängig machen.
**Zwischen zwei Blöcken ohne Text** (etwa einer Tabelle und einem Bild) genügt ein Klick in den Zwischenraum oder an die Kante. Mit der Tastatur gehst du mit den Pfeiltasten bis zur blinkenden Linie und tippst los oder drückst Enter . Enter auf einem ausgewählten Bild fügt darunter einen Absatz ein. Das **+** der [Werkzeugleiste](/formatting#text-formatieren) über dem Text fügt den gewählten Block unter dem aktuellen ein – nur in einem leeren Absatz ersetzt es ihn. Umwandeln kannst du einen Block mit **Umwandeln in …** im Blockmenü.
## Blockmenü
Ein Klick auf den Griff wählt den Block aus und öffnet das **Blockmenü** (am Handy von unten). Esc schließt das Menü, der Block bleibt [ausgewählt](#mehrere-bloecke-auswaehlen). Mit der Maus öffnet es sich links vom Griff, damit der Block sichtbar bleibt; nur wenn links kein Platz ist, rechts davon. Oben steht, was für ein Block es ist. Oben steht ein **Suchfeld**: Tippen filtert alle Aktionen und Blocktypen, Enter führt den ersten Treffer aus. Mit der Maus öffnen sich Untermenüs seitlich – weiter links oder, wenn dort kein Platz ist, über dem Menü, nie über dem Block; am Handy an Ort und Stelle. Neben den Einträgen stehen ihre Tastenkürzel.
- **Umwandeln in …** – Text, Überschrift 1–4, Aufzählung, nummerierte Liste, Aufgabenliste, [aufklappbarer Block](/documents#aufklappbare-bloecke), aufklappbare Überschrift 1–4, Zitat, Hinweis, Code, Formel, **Seite** (der Block wird eine Unterseite, ein Link darauf bleibt stehen) oder **2 bzw. 3 Spalten**; Listenpunkte werden zum aufklappbaren Block mit ihren Unterpunkten als Inhalt, Zitate und Hinweise lassen sich auflösen
- **Farbe** – Text- oder Hintergrundfarbe für den ganzen Block (siehe [Blockfarben](/formatting#blockfarben))
- **Block darunter einfügen** und **Block darüber einfügen** – ein leerer Block mit dem Blockmenü mit /, auch auf Touch-Geräten
- **Kopieren** (++⌘ C++), **Ausschneiden** (++⌘ X++), **Duplizieren** (++⌘ D++), **Verschieben** (nach oben, nach unten, unter eine Überschrift der Seite, an den Anfang oder ans Ende), **Kommentieren**, **KI fragen**, **Link zum Block kopieren** und **Löschen**
- **Hinweistyp**, **Symbol** und **Farbe** (Hinweise), **Breite** (Videos und Einbettungen) und **Textrichtung**, wo sie passen
- **Mehrere auswählen** – der Auswahlmodus auf Touch-Geräten
## Mehrere Blöcke auswählen
Mit der Maus ziehst du aus dem Rand oder einer freien Stelle ein **Rechteck** auf: Jeder Block, den es berührt, wird ausgewählt und hellblau hinterlegt. Esc in einem Block oder ein Klick auf seinen Griff wählt ihn aus (nach dem Klick schließt Esc zuerst das Blockmenü, die Auswahl bleibt). ++↑++/++↓++ wählen den Block davor oder danach, ++⇧ ↑++/++⇧ ↓++ oder ++⇧++-Klick auf einen Griff erweitern die Auswahl, ++⌘ A++ (++Strg A++) wählt alle Blöcke. Im Text wählt das erste ++⌘ A++ den Text des Blocks, das zweite alle Blöcke. Für die Auswahl gelten Entf , ++⌘ D++ (duplizieren), ++⌘ ⇧ ↑/↓++ (verschieben), Tab /++⇧ Tab++ (einrücken), ++⌘ C++/++⌘ X++/++⌘ V++ (Blöcke kopieren, ausschneiden, dahinter einfügen) und `/` (Blockmenü für alle); Ziehen an einem ihrer Griffe verschiebt alle. Kopierte oder ausgeschnittene Blöcke kommen beim Einfügen wieder als Blöcke an, auch in einer anderen Seite; andere Apps erhalten den Text. Ein Klick in den Text oder Esc beendet die Auswahl.
Auf Touch-Geräten startet **Mehrere auswählen** im Blockmenü den **Auswahlmodus**: Kreise stehen statt der Griffe, ein Tipp wählt einen Block aus, ein weiterer erweitert die Auswahl bis dorthin; sind alle Punkte einer Liste gewählt, gilt die ganze Liste. Die Leiste unten verschiebt, kopiert, dupliziert, verschiebt unter eine Überschrift oder löscht die Auswahl, **⋯** hat den Rest des Blockmenüs, darunter **Ausschneiden**. **Fertig** oder Esc beendet den Modus.
## Einrücken
- Tab am Anfang eines Absatzes oder einer Überschrift rückt ein (bis zu acht Stufen), ++⇧ Tab++ rückt zurück. Steht direkt darüber ein [aufklappbarer Block](/documents#aufklappbare-bloecke), schiebt Tab den Block stattdessen hinein und ++⇧ Tab++ wieder heraus. Früher eingerückte Zeilen bleiben, wie sie sind.
- Backspace am Anfang einer eingerückten Zeile nimmt zuerst eine Stufe weg.
- In Listen verschachtelt Tab den Eintrag unter den vorigen; geht das nicht, passiert nichts – Tab verlässt den Text nie. Enter in einem leeren Listenpunkt rückt nur diesen Punkt eine Ebene höher, eine Ebene pro Enter ; auf der obersten Ebene wird er ein normaler Absatz. Enter am Ende eines Punkts mit Unterpunkten beginnt einen neuen ersten Unterpunkt. In Codeblöcken fügt Tab zwei Leerzeichen ein, in Tabellen springt es zur nächsten Zelle. Über die [Blockauswahl](#mehrere-bloecke-auswaehlen) schiebt Tab auch Codeblöcke und Tabellen in einen aufklappbaren Block.
## Tabs
Mit dem Block **Tabs** legst du Inhalte in Reitern übereinander – etwa Anleitungen für verschiedene Systeme oder Varianten eines Textes. Tippe `/tabs`, um ihn einzufügen. Jeder Tab hat einen Titel und kann beliebige Blöcke enthalten: Absätze, Listen, Tabellen, Bilder, aufklappbare Blöcke und sogar weitere Tabs.
- **Hinzufügen:** **+** rechts in der Tableiste – den Namen tippst du gleich ein.
- **Umbenennen:** Doppelklick auf den Tab oder F2 .
- **Verschieben:** den Tab mit der Maus ziehen oder ++⌘ ⇧ ←++/++⌘ ⇧ →++ (Windows/Linux: Strg +Umschalt +← /→ ).
- **Löschen:** Entf auf dem Tab; **Rückgängig** holt ihn zurück. Der letzte Tab bleibt – den ganzen Block löschst du über sein Blockmenü.
- **Am Handy:** Die Tableiste lässt sich wischen, alle Aktionen stehen im Menü **⋯**.
- **Tastatur:** ← /→ , Pos1 und Ende wechseln den Tab, Enter springt in seinen Inhalt.
Welchen Tab du siehst, merkt sich Flowplan für dich auf diesem Gerät. Andere sehen ihren eigenen Tab, und durchs Umschalten entsteht keine neue Version. Ihr könnt gleichzeitig in verschiedenen Tabs schreiben.
**Umwandeln in → Tabs** macht aus markierten Blöcken Tabs: Jede Überschrift beginnt einen neuen Tab. **Umwandeln in → Überschriften mit Inhalt** macht daraus wieder normalen Text.
Beim Drucken, als PDF, in E-Books, im HTML-Export und auf veröffentlichten Seiten stehen alle Tabs untereinander, jeweils mit ihrem Titel als Überschrift; Word, Confluence und Jira bekommen ebenso eine Überschrift pro Tab.
**Markdown:** Flowplan schreibt und liest das Format des Obsidian-Plugins „Tabs“:
````markdown
```tabs
tab: Windows
Lade das Installationsprogramm herunter.
tab: Linux
Installiere das Paket mit deinem Paketmanager.
```
````
Enthält ein Tab selbst Codeblöcke, wird der äußere Zaun länger (`` ````tabs ``) – oder du nimmst `~~~tabs`. Eine Optionszeile des Plugins wie `top, multi` wird beim Import ignoriert.
## Textrichtung
Absätze, Überschriften, Listen, Zitate, Hinweise und Tabellenzellen in Arabisch, Hebräisch oder Persisch laufen **automatisch von rechts nach links**: Die Richtung folgt dem ersten Buchstaben des Blocks. Aufzählungszeichen, Kästchen, Zitatbalken, Hinweissymbole und Blockgriffe stehen dann rechts.
Im Blockmenü (Klick auf den Griff `⋮⋮`) → **Textrichtung** legst du für einen Block und alles darin **Automatisch**, **Links nach rechts** oder **Rechts nach links** fest. Die Richtung bleibt im HTML-Export erhalten; Markdown kennt sie nicht.
---
# Markdown im Editor
Der Editor versteht Markdown: Kürzel beim Tippen, ganze Seiten als Markdown-Text bearbeiten und Antworten aus ChatGPT, die beim Einfügen formatiert ankommen.
## Markdown-Kürzel
Beim Tippen wandelt der Editor um:
| Tippen | Ergebnis |
| --- | --- |
| `#`, `##`, `###` + Leerzeichen | Überschrift 1–3 |
| `-` oder `*` + Leerzeichen | Aufzählung |
| `1.` + Leerzeichen | Nummerierte Liste |
| `[]` + Leerzeichen | Aufgabe |
| `>` + Leerzeichen | [Aufklappbarer Block](/documents#aufklappbare-bloecke) (oder Zitat, siehe unten) |
| `"` + Leerzeichen | Zitat (auch mit „ “ ”) |
| ` ``` ` | Codeblock |
| `---` | Trennlinie |
| `**fett**`, `*kursiv*`, `` `code` ``, `~~durch~~` | Formatierung im Text |
**`>` als Zitat:** Wer `>` wie in Markdown für Zitate gewohnt ist, stellt unter **Einstellungen → Darstellung & Sprache → Editor → „>“ erzeugt** auf **Zitat** um. Die Einstellung gilt für dein Konto auf allen Geräten. Sie betrifft nur das Tippen: In importierten Markdown-Dateien und in eingefügten Antworten aus ChatGPT & Co. wird `> Text` wie bisher ein Zitat, und der Markdown-Export schreibt Zitate weiter als `> Text`.
Codeblöcke tragen ihre Sprache im Zaun: ` ```python `, ` ```typescript `, ` ```terraform `. Der Export schreibt die Kennungen von VS Code bzw. Shiki; der Import versteht auch Kürzel und ältere Namen (`js`, `ts`, `py`, `sh`, `yml`, `cpp`, `csharp`, `plaintext` …) und speichert sie mit der vollen Kennung (` ```js ` wird zu JavaScript, beim nächsten Export ` ```javascript `). Unbekannte Sprachen bleiben erhalten und erscheinen im Block als „(importiert)“, ohne Hervorhebung.
Zeilennummern, hervorgehobene Zeilen, Ansicht und Einklappen stehen hinter der Sprache im Zaun, in der üblichen Schreibweise: ` ```ts {3-5} showLineNumbers startLine=10 `, dazu `view=preview`/`view=split`/`view=code`, `collapsed` und `collapsedLines=15`. Der Import versteht auch `showLineNumbers{10}` (rehype-pretty-code), `showLineNumbers=10` und `hl_lines="3 4"`/`linenums="10"` (MkDocs). Die Nummern in `{…}` zählen ab der ersten Zeile des Blocks, unabhängig von der Startnummer. ` ```mermaid `-Zäune werden zu Codeblöcken, die das Diagramm zeigen.
## Als Markdown bearbeiten
**Seitenmenü … → Als Markdown bearbeiten** zeigt die ganze Seite als Markdown-Text mit Zeilennummern – praktisch für große Umbauten, Suchen und Ersetzen oder wenn du lieber in Markdown schreibst.
- **Übernehmen** (++⌘ Enter++) speichert vorher eine Version und ersetzt den Inhalt in einem Schritt; **Rückgängig** nimmt die Änderung zurück.
- Blöcke ohne Markdown-Form – Einbettungen, Whiteboards, verknüpfte Datenbanken, synchronisierte Blöcke, Spalten, Tabellen mit verbundenen Zellen oder Breiten, Bilder mit Größe, Funktionsgraphen, Kennzahlen und Literaturverzeichnisse – stehen als Markierung `` im Text. Du kannst sie verschieben oder löschen, aber nicht ändern; sie kommen unverändert zurück. Wird eine gelöscht, fragt Flowplan vor dem Übernehmen nach.
- Formatierungen ohne Markdown-Form (Farben, Hochstellen, Spoiler, Erwähnungen, Zitate) bleiben als HTML im Text erhalten.
- **Ausrichtung, Einzug, Textrichtung und Reaktionen** gehen beim Übernehmen verloren; die Ansicht nennt vorher, was betroffen ist.
- Ändert jemand die Seite, während du im Markdown schreibst, erscheint ein Hinweis; **Trotzdem übernehmen** überschreibt dann deren Änderungen.
- Wer nur lesen darf – auch bei gesperrten Seiten und im Lesemodus –, sieht **Als Markdown anzeigen** ohne Übernehmen.
## Antworten aus ChatGPT einfügen
Text, den du aus ChatGPT oder einem anderen Assistenten kopierst, wird beim Einfügen formatiert: Formeln in LaTeX (`\[ … \]`, `\( … \)`, `$$ … $$`) werden zu Formelblöcken und Formeln im Satz, Markdown (Überschriften, **fett**, Listen, Tabellen) wird umgesetzt, Zeilen mit Tabulatoren werden zur Tabelle, `☐` zur Aufgabenliste, und jede Zeile wird ein eigener Absatz. Aus der Webseite kopierte, bereits gerenderte Formeln bleiben als Formel erhalten. Das gilt auch für das Kopieren direkt aus der ChatGPT-Webseite. Stehen Formeln schon als Text im Dokument (etwa `\[ A(3;2;1) \]`), markiere sie – oder alles mit ++⌘/Strg A++ – und wähle im Textmenü **In Formeln umwandeln**. Gewöhnlicher Text wird wie bisher eingefügt.
---
# Formatieren, Hinweise und Beschriftungen
Text formatieren, Hinweise in fünf Arten und mit eigenem Symbol, Bilder und Tabellen beschriften und nummerieren.
## Text formatieren
Die **Werkzeugleiste** über dem Text hat alle Formatierungen und Blöcke: Fett, Kursiv, Unterstrichen, Durchgestrichen, Markieren, Farbe und Hintergrundfarbe, Hoch- und Tiefgestellt, **Verdecken (Spoiler)**, Link, Überschrift, Aufgabe, Ausrichtung, Listen, Inline-Formel und weitere Blöcke. Text markieren – oder ein Rechtsklick hinein – öffnet das **Textmenü** mit den schnellen Aktionen direkt am Text: Reaktionen für den Absatz, **Fett**, *Kursiv*, Link, Code, **Kommentieren**, **Fußnote** und **Kopieren**, bei markierten Rechnungen die Ergebnisse, in Aufgaben auch **Fälligkeit**. Das Textmenü erscheint über der Markierung – direkt unter der Werkzeugleiste darunter, damit es sie nicht verdeckt. Unterstrichen, Durchgestrichen und Markieren erreichst du über die Werkzeugleiste oder die Tastenkürzel (++Strg/⌘ U++, ++Strg/⌘ ⇧ S++, ++Strg/⌘ ⇧ H++); wo keine Werkzeugleiste zu sehen ist (etwa im Fokusmodus), bietet das Textmenü sie zusätzlich an.
- **Menü bei Textauswahl**: Unter **Einstellungen → Darstellung & Sprache → Editor → Menü bei Textauswahl** legst du fest, wann das Textmenü beim Markieren erscheint – **Immer**, **Nur am Computer** (Standard) oder **Nie**. „Nur am Computer“ richtet sich danach, womit du markierst: mit Maus, Trackpad oder Tastatur (⇧ + Pfeiltasten) erscheint das Menü, mit dem Finger auf Smartphone oder Tablet nicht – dort übernehmen das Auswahlmenü des Systems (Ausschneiden, Kopieren, Einfügen) und die Werkzeugleiste über der Tastatur mit Formatierung und **Kommentieren**. Auf einem iPad mit Trackpad erscheint es also beim Markieren mit dem Trackpad, nicht beim Markieren mit dem Finger. Ein **Rechtsklick** öffnet das Textmenü in jeder Einstellung, auch bei „Nie“. Die Einstellung gilt für dein Konto auf allen Geräten.
- **Formatierungsleiste**: Unter **Einstellungen → Darstellung & Sprache → Editor → Formatierungsleiste** blendest du die feste Leiste über dem Text von Seiten und Einträgen aus (**Anzeigen** ist Standard, **Ausblenden**). Ausgeblendet bietet das Textmenü über markiertem Text alle Formatierungen, wie im Fokusmodus: vorne **Umwandeln in** mit dem aktuellen Blocktyp („Text ⌄“ – Text, Überschrift 1–3, Aufzählung, nummerierte Liste, Aufgabenliste, aufklappbarer Block, Zitat, Hinweis, Code, Formel), dann **Fett**, *Kursiv*, Unterstrichen, Durchgestrichen, Code, Markieren, **Farbe** (Text und Hintergrund), Link, **Inline-Formel** und **Formatierung entfernen** (Links und Kommentare bleiben). Unter **…** liegen Hoch- und Tiefgestellt, Verdecken (Spoiler), Ausrichtung, Block nach oben/unten, Vorschlagen, Autoren anzeigen und das Inhaltsverzeichnis. Kommentieren, KI, Fußnote und Kopieren bleiben wie gewohnt; Rückgängig und Wiederholen gehen mit ++⌘ Z++ und ++⌘ ⇧ Z++. Auf dem Handy bleibt die Leiste über der Tastatur – dort ist sie die Formatierungsreihe der Tastatur. Die Einstellung gilt für dein Konto auf allen Geräten.
- **Auf dem Smartphone**: **Kommentieren** steht in der Werkzeugleiste über der Tastatur (und als **Text kommentieren** unter dem Dokument), **Fußnote** im **+**-Menü bzw. mit `/fußnote`. Reaktionen erreichst du über das Textmenü – mit **Immer** beim Markieren, auf Android auch per langem Druck, wenn der Browser ihn als Rechtsklick meldet.
- Formatierungen gelten nur für die aktuelle Zeile. Nach Enter beginnt die neue Zeile als normaler Text – nur Listen und Aufgaben setzen sich mit einem neuen Eintrag fort, nach einer Überschrift folgt ein Absatz.
- **Umwandeln in**: Im Textmenü (auch per Rechtsklick in eine Zeile; bei ausgeblendeter Formatierungsleiste oder im Fokusmodus vorne als Liste „Text ⌄“) wechselt eine Zeile ihren Typ, ohne dass der Text verloren geht – Text, Überschrift 1–3, Aufzählung, nummerierte Liste, Aufgabe, Zitat oder Codeblock. Der aktuelle Typ ist hervorgehoben.
- **Verschachtelte Listen** wechseln je Ebene ihre Zeichen: nummeriert 1. → a. → i., Aufzählungen • → ◦ → ▪, ab der vierten Ebene wieder von vorn. Die Ebene zählt über Listenarten hinweg – eine nummerierte Liste unter einer Aufzählung oder Aufgabe beginnt mit a. So sieht es auch auf veröffentlichten Seiten, im Druck, im PDF und in Word aus; der Markdown-Export schreibt weiter `1.`.
- **Code und Markieren**: Inline-Code erscheint in einer Akzentfarbe auf grauem Grund und lässt sich mit Fett, Kursiv, Durchgestrichen und Links kombinieren (auch beim Markdown-Import von `**`code`**`). Eine Markierung ohne Farbe ist gelb, im dunklen Modus durchscheinend.
### Spoiler
Verdeckter Text bleibt auch beim Schreiben verdeckt. Ein Klick auf die Fläche deckt ihn auf, ein weiterer verdeckt ihn wieder. ++⌘ ⌥ H++ verdeckt die Auswahl. Auch auf Whiteboards lassen sich Zettel und Texte verdecken.
### Blockfarben
Im [Blockmenü](/blocks#blockmenue) gibt **Farbe** einem ganzen Block (Absatz, Überschrift, Listenpunkt, Zitat, aufklappbarer Block) eine **Textfarbe** oder eine **Hintergrundfarbe** – dieselben neun Farben wie beim Text, **Standard** nimmt sie wieder weg. Mehrere [ausgewählte Blöcke](/blocks#mehrere-bloecke-auswaehlen) färbst du auf einmal. Die Farben passen sich dem hellen und dunklen Design an.
Beim Markdown-Export steht die Farbe als Kommentar vor dem Block, bei Listenpunkten am Ende der Zeile; andere Programme zeigen ihn nicht, der Import liest ihn wieder:
```markdown
Wichtiger Absatz
```
## Hinweise
Hinweise gibt es in fünf Arten, wie bei GitHub, Forgejo und Obsidian: **Hinweis** (blau), **Tipp** (grün), **Wichtig** (lila), **Warnung** (gelb) und **Achtung** (rot). Jede Art hat ihr Symbol und ihren Titel in der Sprache der Lesenden. Steht der Cursor in einem Hinweis, ändert `/tipp`, `/warnung` usw. seine Art; ebenso das Blockmenü (Klick auf den Griff `⋮⋮`) → **Hinweistyp**.
### Eigenes Symbol und eigene Farbe
Damit ein Hinweis auch für anderes taugt – eine Idee 💡, ein Termin 📅, ein Merksatz ★ –, bekommt er im Blockmenü ein eigenes Symbol und eine eigene Farbe:
- **Symbol** → **Emoji oder Zeichen wählen …** öffnet die Emoji-Auswahl (dieselbe wie für Seitensymbole, mit Suche, Kategorien und Hautton). Unter **Oder ein eigenes Zeichen** tippst du auch ein Zeichen wie ★, → oder ✓ ein – erlaubt ist genau ein Emoji oder Symbolzeichen, keine Buchstaben, Ziffern, Satzzeichen oder Leerzeichen. **Symbol entfernen** stellt das Symbol der Art wieder her.
- **Farbe** bietet die neun Textfarben (Grau, Braun, Orange, Gelb, Grün, Blau, Lila, Pink, Rot); **Standard** nimmt wieder die Farbe der Art. Die Farben sind im hellen und im dunklen Design gut lesbar.
Die Art bleibt dabei erhalten: Sie gibt den Titel („Tipp“, „Warnung“ …) und gilt beim Markdown-Export. Symbol und Farbe bleiben beim Kopieren, Duplizieren, in Vorlagen, Versionen, veröffentlichten Seiten, beim Drucken sowie im PDF-, EPUB- und Word-Export erhalten. In [verschlüsselten Bereichen](/encrypted-spaces) gibt es keine Hinweise.
### Hinweise in Markdown
Beim Markdown-Export werden Hinweise zu GitHub-Hinweisen (`> [!WARNING]`). Ein eigenes Symbol steht am Anfang des Textes, eine eigene Farbe als Kommentar am Ende, den GitHub nicht anzeigt:
```markdown
> [!TIP]
>
> 💡 Mit / geht es schneller.
>
>
```
Beim Import (Markdown, ZIP, Notion) werden `> [!NOTE]` bis `> [!CAUTION]` wieder zu Hinweisen der passenden Art; die weiteren Arten von Obsidian landen bei der nächstliegenden (etwa `danger` → Achtung, `hint` → Tipp), ein eigener Titel (`> [!WARNING] Vorher lesen`) wird zur fetten ersten Zeile. Steht am Anfang des Textes ein einzelnes Emoji oder Symbol mit Leerzeichen dahinter, wird es zum Symbol des Hinweises; der Farbkommentar stellt die Farbe wieder her. Hinweise aus Notions Markdown-Export (``) werden zu Hinweisen mit ihrem Emoji.
## Beschriftungen
Bilder, Tabellen und Codeblöcke können eine kurze **Beschriftung** bekommen – eine Zeile, die beschreibt, was der Block zeigt. Sie steht klein und gedämpft unter dem Block.
- **Hinzufügen**: bei Bildern über **Beschriftung** in der [Bildleiste](/media-and-files#bilder-dateien-und-einbettungen) oben rechts, bei Tabellen über **Beschriftung** im Menü eines Zeilen- oder Spaltengriffs, bei Codeblöcken über **Beschriftung hinzufügen** unten in der Ecke des Blocks (beim Zeigen oder mit dem Cursor darin). Alternativ im Blockmenü (Griff `⋮⋮`) → **Beschriftung hinzufügen**.
- **Tippen**: Die Beschriftung ist reiner Text in einer Zeile (bis 500 Zeichen). Enter oder ↓ gehen unter dem Block weiter, Esc oder ↑ zurück in den Block. Andere sehen die Beschriftung beim gemeinsamen Bearbeiten sofort; ++⌘ Z++ im Dokument macht Änderungen rückgängig.
- **Entfernen**: Text löschen und das Feld verlassen (oder ⌫ im leeren Feld), oder Blockmenü → **Beschriftung entfernen**.
- **Bilder**: Die Beschriftung ersetzt nicht den Alternativtext für Screenreader. Hat ein Bild eine Beschriftung, bietet das Blockmenü **Beschriftung als Alternativtext** an.
- Beschriftungen bleiben beim Kopieren und Einfügen, Verschieben, Duplizieren, in Vorlagen, Versionen, auf veröffentlichten Seiten, beim Drucken und in allen Exporten erhalten, und die Suche findet sie. Aus HTML (etwa beim Einfügen von Webseiten oder dem Notion-HTML-Export) werden `` mit `` und Tabellen mit `` zu Beschriftungen.
### Beschriftungen nummerieren
**Seitenaktionen (…) → Beschriftungen nummerieren** stellt den Beschriftungen einer Seite eine Nummer voran: „Abbildung 1“, „Tabelle 1“, „Listing 1“ (für Code). Gezählt wird je Art in der Reihenfolge des Dokuments, und nur Blöcke, die eine Beschriftung haben. Die Bezeichnung folgt der Sprache, in der Flowplan angezeigt wird (Deutsch: Abbildung/Tabelle/Listing, Englisch: Figure/Table/Listing, Französisch: Figure/Tableau/Listing). Der Schalter gilt für die ganze Seite und für alle, die sie lesen – auch auf veröffentlichten Seiten, beim Drucken und in den Exporten. Kopien der Seite übernehmen ihn. In Eintragsdokumenten von Datenbanken gibt es ihn nicht.
---
# Aufgaben in Dokumenten
Aufgaben mitten im Text: abhaken, einer Person zuweisen, mit Fälligkeitsdatum versehen und mit fünf Status wie in Obsidian.
## Aufgaben mit Person und Datum
Eine Aufgabe (`/todo` oder `[]` + Leerzeichen) mit einer Erwähnung wie `@Anna` ist Anna zugewiesen: Sie bekommt eine Benachrichtigung und findet die Aufgabe unter **Meine Aufgaben** in der Seitenleiste. Ein Datum setzt du, während der Cursor in der Aufgabe steht, mit dem Kalender-Knopf in der Werkzeugleiste oder über das Textmenü (Text markieren oder Rechtsklick → **Fälligkeit**). Das Datum erscheint als Chip rechts in der Zeile (heute hervorgehoben, überfällig rot); ein Klick darauf ändert es oder entfernt es mit **Datum entfernen**. Eine neue Aufgabe per Enter beginnt ohne Datum.
**Meine Aufgaben** sammelt alle Aufgaben, die dir gegeben wurden, deine eigenen Aufgaben mit Datum und alle Aufgaben aus deinen Journalen (auch ohne @Name und ohne Datum) – gruppiert nach Überfällig, Heute, Nächste 7 Tage, Später und Ohne Datum. Darunter folgen unter **Aus anderen Arbeitsbereichen** deine Aufgaben aus den übrigen Arbeitsbereichen, je Arbeitsbereich; ein Klick auf die Seite wechselt dorthin. Abhaken und Datum ändern wirkt direkt im Dokument, auch bei anderen, die es gerade geöffnet haben. Am Fälligkeitstag kommt morgens eine Erinnerung; die Zahl neben „Meine Aufgaben“ zeigt, wie viele heute fällig oder überfällig sind.
**Eigene Aufgaben ohne Dokument:** Oben in **Meine Aufgaben** steht das Feld **Aufgabe hinzufügen …** – Text eingeben, Enter , fertig. Die Aufgabe landet auf deiner eigenen Seite **Aufgaben**, die Flowplan beim ersten Mal in deinem privaten Bereich des Arbeitsbereichs anlegt (hast du noch keinen, entsteht ein privater Bereich „Privat“). Die Kurzschreibweise der Schnellerfassung gilt auch hier: „Steuer abgeben morgen“ oder „Zahnarzt anrufen Freitag“ setzen das Datum. `@Name` vergibt die Aufgabe nur an jemanden, der die Seite öffnen kann – deine Seite ist privat, deshalb bleibt der Name sonst im Text und ein Hinweis sagt warum; Aufgaben für andere schreibst du in ein Dokument, das ihr beide seht. Die Seite ist eine ganz normale Seite: Du findest sie in der Seitenleiste, kannst sie umbenennen oder verschieben, und ihre Aufgaben können alles, was Aufgaben können (Status, ++Strg/⌘ L++, Erinnerung am Fälligkeitstag, Widgets, Siri und Spotlight). Löschst du sie, legt die nächste Aufgabe eine neue an. Gäste und Mitglieder mit Leserechten sehen das Feld nicht.
**Filter:** **Alle / Aus Dokumenten & Datenbanken / Eigene** schränkt die Liste ein – **Eigene** zeigt nur die Aufgaben deiner Seite „Aufgaben“. Die Wahl merkt sich das Gerät. **Seite „Aufgaben“ öffnen** springt zur Seite.
**Neue Aufgaben:** Gibt dir jemand eine Aufgabe, steht neben „Meine Aufgaben“ in der Seitenleiste eine blaue Zahl (auf dem Handy auf **Navigation**), bis du „Meine Aufgaben“ öffnest; dort tragen die neuen Aufgaben ein kleines **Neu**, solange die Ansicht offen ist. Die helle Zahl daneben zählt wie bisher, was heute fällig oder überfällig ist.
## Status einer Aufgabe
Eine Aufgabe hat einen von fünf Status, wie in Obsidian: **Offen** `[ ]`, **In Arbeit** `[/]` (halb gefülltes Kästchen), **Erledigt** `[x]`, **Abgebrochen** `[-]` (graues Kästchen mit ×, durchgestrichen) und **Verschoben** `[>]` (Kästchen mit →).
- Ein Klick auf das Kästchen hakt die Aufgabe wie bisher ab oder öffnet sie wieder; eine Aufgabe **in Arbeit** wird mit einem Klick erledigt.
- **Rechtsklick** auf das Kästchen (auf Tablet und Handy: **lange drücken**) öffnet ein kleines Menü mit allen fünf Status.
- ++⌘/Strg L++ macht aus der Zeile mit dem Cursor eine Aufgabe; auf einer Aufgabe wechselt es den Status: offen → in Arbeit → erledigt → offen. Abgebrochene und verschobene Aufgaben werden wieder offen. Sind mehrere Zeilen markiert, bekommen alle den nächsten Status der ersten. In einer Aufzählung oder nummerierten Liste wird nur die Zeile zur Aufgabe; die Liste wird dort geteilt.
- **In Arbeit** und **Verschoben** zählen als offen: Sie stehen unter **Meine Aufgaben** (mit ihrem Status), in den Widgets der App, bekommen die Erinnerung am Fälligkeitstag und ziehen im Journal auf den nächsten Tag um. **Abgebrochen** zählt als abgeschlossen, aber nicht als erledigt: Die Aufgabe verschwindet aus „Meine Aufgaben“, zieht nicht um und erscheint im Rückblick des Journals nicht bei den erledigten Aufgaben.
- Abhaken unter **Meine Aufgaben** oder in einem Widget macht eine Aufgabe in Arbeit zu einer erledigten.
- Ältere Apps und Desktop-Versionen zeigen die Status als abgehakt (erledigt, abgebrochen) oder offen (alle anderen).
---
# Bilder, Dateien und Sprachnotizen
Bilder, Dateien, PDFs und Einbettungen in Dokumenten – hochladen, anmerken, wieder löschen – und Sprachnotizen, die Flowplan auf Wunsch abschreibt.
## Bilder, Dateien und Einbettungen
- **Einfügen aus der Zwischenablage** (++⌘ V++) oder Hineinziehen lädt Bilder und Dateien hoch. Bilder lassen sich an den Rändern in der Größe ändern.
- **Bildleiste**: Zeigst du auf ein Bild (auf dem Handy: antippen), erscheint oben rechts eine kleine Leiste: **Kommentieren**, **Beschriftung**, **Bild ersetzen** (Platz, Breite, Beschriftung und Ausrichtung bleiben), **Herunterladen**, **Vollbild** und **…** mit Ausrichtung (links, Mitte, rechts), **Bild markieren**, **Bild kopieren**, **Link zum Block kopieren** und **Löschen**.
- **Fotos werden vor dem Hochladen verkleinert**: höchstens 2560 px an der längeren Seite, gespeichert als WebP. Die Kameradrehung bleibt erhalten, Metadaten wie der Aufnahmeort werden entfernt. GIFs, SVGs und Dateien, die kaum kleiner würden, bleiben unverändert. Anhänge in Dateien-Eigenschaften und Formularen werden im Original gespeichert.
- **PDFs** erscheinen als Karte mit einer Vorschau der ersten Seite. Ein Klick öffnet den PDF-Viewer mit allen Seiten, Zoom und **Herunterladen**. Mit zwei Fingern zoomst du stufenlos an der Stelle zwischen den Fingern und verschiebst die Seiten – wie in [Notizbüchern](/notebooks), auch beim bloßen Lesen; auf dem Trackpad mit der Pinch-Geste oder Strg + Scrollen. Die Knöpfe und ⌘ + /− ändern den Zoom in Schritten von 25 %. Esc schließt den Viewer. Dasselbe gilt für PDFs in den Medien, in Dateien-Eigenschaften von Datenbanken und auf veröffentlichten Seiten. In bearbeitbarem Text öffnet ein Link auf ein PDF den Viewer mit ⌘ -Klick. Im Viewer lässt sich auf dem PDF schreiben – siehe [PDFs anmerken](#pdfs-anmerken).
- **Bilder markieren**: Doppelklick auf ein Bild (oder den Stift in der Werkzeugleiste, solange das Bild ausgewählt ist, oder **… → Bild markieren** in der Bildleiste) öffnet es zum Bearbeiten – mit **Stift**, **Textmarker**, **Pfeil**, **Rechteck**, **Kreis** und **Text**, sieben Farben und drei Strichstärken, Rückgängig mit ++⌘ Z++. **Speichern** legt ein neues Bild mit den Markierungen an; das Original und die Markierungen bleiben am Bild, sodass sie sich später ändern oder ganz entfernen lassen.
- Die **Medien** in der Seitenleiste sammeln alle Uploads des Arbeitsbereichs zum Wiederverwenden.
### Medien löschen
In den **Medien** wählst du Dateien über ihr Kästchen aus und legst sie mit **In den Papierkorb** (oder dem Papierkorb-Symbol an der Datei) in den Papierkorb. Das geht ohne Rückfrage, weil es sich rückgängig machen lässt. Löschen darf, wer die Seite der Datei bearbeiten darf; Leser und Gäste können es nicht.
- **Nicht verwendet**: Dateien, die in keiner Seite, keinem Eintrag, Whiteboard oder Kommentar des Arbeitsbereichs mehr vorkommen, tragen dieses Kennzeichen. Der Filter **Nicht verwendet** zeigt nur sie, **Alle unbenutzten löschen** legt sie nach einer Rückfrage gesammelt in den Papierkorb. Ältere Versionen im Versionsverlauf zählen nicht als Verwendung und können solche Dateien noch zeigen.
- Ein Bild aus einem Dokument zu entfernen, löscht die Datei nicht – sie gilt danach nur als nicht verwendet.
- Solange eine Datei im Papierkorb liegt, ist sie nirgends mehr abrufbar, auch nicht über Freigaben und Veröffentlichungen. Seiten, die sie noch zeigen, haben an ihrer Stelle einen Platzhalter **Datei fehlt**. Beim Wiederherstellen kommt sie unverändert zurück.
- Endgültig gelöscht wird sie – auch im Ordner `uploads` und in [Objektspeicher](/storage-and-backups) wie S3 – erst beim Leeren des Papierkorbs, mit **Endgültig löschen** oder nach Ablauf der Frist, siehe [Papierkorb](/pages-and-spaces#papierkorb). Bis dahin zählt sie zum Speicherplatz.
- **Einbetten** (`/embed`) nimmt eine Adresse entgegen: YouTube, Vimeo, Loom, Spotify, Figma und CodePen erscheinen als Player mit wählbarer Breite, andere Seiten als Linkkarte mit Titel und Vorschaubild.
- Links auf Seiten und Erwähnungen von Personen zeigen beim Überfahren eine Vorschau.
- Die maximale Dateigröße legt die Administration fest (Standard 10 MB).
### PDFs anmerken
Wer die Seite bearbeiten darf, zu der ein PDF gehört, findet im PDF-Viewer **Anmerken** (nicht in [verschlüsselten Bereichen](/encrypted-spaces) und auf gesperrten Seiten). Darunter erscheint eine Werkzeugleiste: **Stift** (mit dem Apple Pencil oder einem anderen Tablet-Stift folgt die Strichstärke dem Druck), **Textmarker** (durchscheinend, liegt unter der Schrift und der Tinte), **Radierer** (**Ganze Striche** oder **Teilweise** – dann verschwindet nur, was unter dem Radierer liegt), **Lasso**, **Text** und **Laserpointer** (zeigt etwas, ohne zu bleiben). Dazu Farben, drei Breiten, Rückgängig und Wiederholen (++⌘ Z++, ++⇧ ⌘ Z++).

- **Lieblingsstifte**: Die drei Stifte neben den Werkzeugen merken sich Farbe und Breite; änderst du sie, während einer gewählt ist, ändert sich der Lieblingsstift mit. Sie gelten auf diesem Gerät.
- **Formen**: Halte den Stift am Ende eines Strichs kurz still – aus einer gezeichneten Linie wird eine gerade, aus einem Rechteck, Kreis, Dreieck oder einer Raute die saubere Form. Abschalten lässt sich das in den **Stifteinstellungen** (Zahnrad).
- **Lasso**: Umkreise Striche und Text, um sie zu verschieben, am Griff unten rechts zu vergrößern oder zu verkleinern, umzufärben, zu kopieren (++⌘ C++, Einfügen mit ++⌘ V++ – auch auf einer anderen Seite), zu duplizieren oder zu löschen.
- **Text** setzt du mit einem Tipp auf die Seite; ein Tipp auf vorhandenen Text ändert ihn. Mit Scribble schreibst du auf dem iPad mit dem Stift hinein.
- **Nur mit dem Stift zeichnen**: Sobald du auf einem Gerät mit dem Stift geschrieben hast, schreibt nur noch der Stift – Finger blättern und zoomen, eine aufliegende Hand hinterlässt keine Spuren. Die Einstellung teilen sich PDFs, Whiteboards und Bilder; abschalten lässt sie sich in den **Stifteinstellungen**, dann schreibt auch ein Finger, und zwei Finger blättern und zoomen.
- **Apple Pencil**: Das Radierer-Ende eines Stifts radiert. In der iPad-App wechselt Doppeltippen oder Drücken zum Radierer und zurück – wie in den iPad-Einstellungen festgelegt, oder in den **Stifteinstellungen** fest auf Radierer, letztes Werkzeug oder nichts.
Die Anmerkungen gehören zur Seite des PDFs, nicht zum Bildschirm: Sie bleiben bei jedem Zoom an ihrer Stelle und gelten für alle, die das PDF öffnen – wer nur lesen darf, sieht sie, kann sie aber nicht ändern. Das PDF selbst bleibt unverändert. **Fertig** (oder ++⌘ S++) speichert; jedes Speichern ist eine Version, die du über das Uhr-Symbol wieder laden kannst. Hat jemand anderes die Anmerkungen inzwischen gespeichert, gewinnt deine Fassung, und ein Hinweis nennt, wer; die andere bleibt als Version erhalten. Text, den du auf ein PDF schreibst, findet die Suche – in der App für iPhone und iPad auch die Handschrift selbst, und **In Text umwandeln** macht aus ausgewählter Handschrift getippten Text (siehe [Handschrift erkennen](/notebooks#handschrift-erkennen-iphone-und-ipad)).
Soll ein PDF zum Heft werden, in dem du Seite für Seite schreibst und Blätter ergänzt, öffne es als [Notizbuch](/notebooks#notizbuch-anlegen): Jede PDF-Seite wird ein Blatt.
**Herunterladen** lädt weiterhin das Original. **Mit Anmerkungen herunterladen** (daneben, sobald es Anmerkungen gibt) erzeugt ein neues PDF mit denselben Seiten, auf denen die Anmerkungen als Vektorgrafik liegen – sie bleiben beim Vergrößern scharf. Geschützte (verschlüsselte) PDFs lassen sich nur ohne Anmerkungen herunterladen; Text erscheint in Helvetica, Zeichen außerhalb des westeuropäischen Zeichensatzes als „?“.
## Sprachnotizen und Besprechungen
`/sprachnotiz` öffnet die Aufnahme: Mikrofon antippen, sprechen, **Aufnahme beenden** – bis zu **zwei Stunden**, genug für eine Besprechung. Die Aufnahme lässt sich anhören oder verwerfen; **Einfügen** legt sie als Audio in die Seite (im Rahmen der Upload-Grenze der Instanz). Ist die Spracherkennung eingerichtet, folgt darunter das Gesprochene als Text; sonst bietet der Dialog nur das Audio an.
- **Lange Aufnahmen** gehen in Teilen an den Server, der sie zusammensetzt und an die Spracherkennung schickt. Die Größe begrenzt `WHISPER_MAX_MB` (Standard 200).
- **Transkript mit Zeitmarken:** Liefert die Spracherkennung Abschnitte mit Zeiten (OpenAI-kompatibles `verbose_json`, etwa faster-whisper-server, speaches oder whisper.cpp), erscheint ein aufklappbarer Block **Transkript · Dauer** mit einem Absatz je Passage und ihrer Zeitmarke (`00:04`, `1:02:05`).
- **Sprecher:** Nur wenn der Dienst selbst Sprecher trennt (Diarisierung, einzuschalten mit `WHISPER_DIARIZE=on` bei Servern, die `diarize` kennen) und je Abschnitt einen Sprecher zurückgibt, steht vor jeder Passage **Sprecher 1**, **Sprecher 2** … Flowplan rät keine Sprecher aus Pausen. Kennt der Dienst nur einfaches JSON, wird der Text wie bisher als Absätze eingefügt.
- **Danach mit KI zusammenfassen** fasst das Transkript zusammen ([Zusammenfassungen](/ai-writing#zusammenfassungen)).
- **In den Apps** für iPhone, iPad und Android nimmt die App auf; iPhone und iPad machen auf dem Gerät Text daraus, ohne Spracherkennung auf dem Server ([Sprachnotizen in Seiten](/mobile-capture#sprachnotizen-in-seiten)).
- **Aufgaben und Zusammenfassung erzeugen** (wenn [KI-Aktionen](/ai-actions#ki-aktionen) für dich eingeschaltet sind): Die KI schlägt eine Zusammenfassung mit Beschlüssen und eine Aufgabenliste mit verantwortlichen Personen und Terminen vor – als Vorschau mit Kästchen; erst **Ausführen** fügt sie in die Seite ein.
---
# Links, Erwähnungen und Graph
Seiten, Einträge und Personen mit @ verlinken, auf einzelne Blöcke zeigen und im Graph sehen, wie alles zusammenhängt.
## Seitenlinks und Erwähnungen
`@` sucht Seiten, Einträge aus Datenbanken und Personen – einfach weitertippen, um die Liste zu filtern. Die Pfeiltasten wandern durch die Treffer, Enter fügt den markierten ein. `@` öffnet die Liste am Zeilenanfang, nach einem Leerzeichen oder nach einer öffnenden Klammer oder einem Anführungszeichen; mitten im Wort – etwa in einer E-Mail-Adresse wie `ada@example.org` – wird `@` einfach geschrieben. Esc (oder Enter ohne Treffer) schließt die Liste und schreibt `@` und den gesuchten Text in den Text. Journaltage stehen hinter den übrigen Seiten. `@heute`, `@gestern` oder ein Datum wie `@2026-10-27` bieten unter **Journal** einen Link auf diesen Tag des [Journals](/journal#tage-in-listen-suche-graph-und-export) an. Einträge erscheinen mit ihrer Datenbank, etwa „Heizung – Wartung · Notizen“; angeboten werden nur Einträge, die du lesen darfst. Eine Erwähnung einer Person benachrichtigt sie im Posteingang.
Links auf Seiten und Einträge bleiben gültig, auch wenn sie umbenannt oder verschoben werden. Steht im Link der alte Titel, wird er beim Umbenennen durch den neuen ersetzt – in allen Dokumenten und Einträgen, die du bearbeiten darfst; ein Link mit eigenem Text behält ihn. Das Ziel zeigt alle Links darauf unter **Verlinkt von** (Seiten) bzw. **Verknüpft von** (Einträge). Dort stehen auch Einträge, in deren Text der Link steht. Wer einen verlinkenden Eintrag oder seine Seite nicht lesen darf, sieht ihn dort nicht.
Ein Link auf eine Seite oder einen Eintrag zeigt vor dem Text das Icon des Ziels: sein Emoji, sein Symbol oder sein eigenes Bild – ohne eigenes Icon das Zeichen seiner Art (Dokument, Datenbank, Whiteboard, Eintrag). Ändert jemand das Icon, ändert es sich in allen Links mit, wie der Titel beim Umbenennen. Das gilt auch im Lesemodus, in Kommentaren, auf veröffentlichten Seiten, in der Vorschau beim Darüberfahren, in der `@`-Liste, unter **Verlinkt von**, bei **Verwandte Seiten** und in der Suche. Ein Link auf einen Block behält sein Absatzzeichen, solange die Seite kein eigenes Icon hat. Für Seiten und Einträge, die du nicht lesen darfst, zeigt der Link nur das allgemeine Link-Zeichen. Beim Drucken erscheinen die Icons mit; Markdown-Exporte enthalten nur den Linktext.
Links ins Web sind unterstrichen und tragen hinter dem Text einen kleinen Pfeil nach außen. Wer den Pfeil nicht sehen möchte, schaltet unter **Einstellungen → Darstellung & Sprache → Symbol bei externen Links** aus – die Links bleiben dann farbig und unterstrichen, nur der Pfeil fehlt, in Dokumenten, Einträgen, Kommentaren und im Lesemodus. Die Einstellung gilt für dein Konto auf allen Geräten und nur für deine Ansicht: Veröffentlichte Seiten zeigen ihren Besuchern den Pfeil weiter. Gedruckt wird der Pfeil nie; beim Drucken steht hinter einem Link seine Adresse.
### Automatische Links
Hat ein Eigentümer [automatische Links](/workspace-appearance#automatische-links) eingerichtet, wird passender Text zum Link, sobald du danach ein Leerzeichen, ein Satzzeichen oder Enter tippst, und ebenso beim Einfügen – in Seiten, in Dokumenten von Datenbankeinträgen und in Kommentaren. Es ist ein gewöhnlicher Link: Er bleibt beim Zusammenarbeiten, offline und in den Apps erhalten und lässt sich wie jeder andere bearbeiten oder entfernen. ++⌘ Z++ (++Strg Z++) direkt danach nimmt nur den Link zurück, der Text bleibt. Text, der schon dasteht, ändert sich nicht; in Code, vorhandenen Links, Formeln, Titeln und Tabellenzellen von Datenbanken wird nichts verlinkt.
## Links auf Blöcke
Jeder Block lässt sich verlinken: ein Absatz, eine Überschrift, ein Listenpunkt, eine Tabelle, ein Bild, ein Diagramm … Der Link ist die Adresse der Seite mit dem Block, etwa `https://flowplan.example.org/#page=…&block=k3x9a2b1` (bei Einträgen mit `&row=…`), und funktioniert überall im selben Arbeitsbereich.
**Link kopieren**
- im Blockmenü (Griff ⠿ links neben dem Block, auf dem Handy antippen): **Link zum Block kopieren**,
- bei Überschriften über das Link-Symbol, das beim Darüberfahren hinter der Überschrift erscheint,
- im [Inhaltsverzeichnis](/reading-and-presenting#inhaltsverzeichnis) über das Link-Symbol neben jeder Überschrift (auf dem Handy immer sichtbar),
- mit ++⌘ ⇧ L++ (Windows/Linux: ++Strg Umschalt L++) für den Block, in dem der Cursor steht.
Kopiert wird die Adresse; in andere Programme eingefügt (Mail, Chat, Word) erscheint sie als Link mit dem Text „Seite › Anfang des Blocks“.
**Link einfügen**
Einen kopierten Blocklink einfach in ein Dokument oder einen Eintrag desselben Arbeitsbereichs einfügen (++⌘ V++): Er wird zu einem Link wie ein Seitenlink, mit dem Text „Seite › Anfang des Blocks“. Ist vorher Text markiert, wird dieser Text zum Link. Über `@` lassen sich auch Überschriften und Blöcke anderer Seiten suchen: `@Projekt › Ziele` (oder `@Projekt#Ziele`) zeigt die Überschriften der Seite „Projekt“, die „Ziele“ enthalten; ein Suchwort allein findet auch Absätze mit diesem Text. Überschriften der eigenen Seite stehen als „Diese Seite › …“ dabei.
Wird die verlinkte Seite (oder der Eintrag) umbenannt, ändert sich der Seitentitel im Linktext mit; der Teil hinter „›“ bleibt, wie er ist. Beim Darüberfahren zeigt die Vorschau den aktuellen Text des Blocks.
**Link öffnen**
Ein Klick öffnet die Seite (bei einem Eintrag den Eintrag im Dialog), scrollt zum Block und hebt ihn kurz hervor. Ein Block in einem eingeklappten Abschnitt wird dabei aufgeklappt. Gibt es den Block nicht mehr, öffnet sich die Seite mit dem Hinweis „Diesen Block gibt es nicht mehr – die Seite ist geöffnet.“
**Gut zu wissen**
- Ein Block behält seinen Link beim Bearbeiten, Verschieben (auch Ausschneiden und Einfügen) und Umwandeln. Kopien – **Duplizieren** oder Kopieren und Einfügen im selben Dokument – bekommen einen eigenen Link. Wird ein Block mit Enter geteilt, bleibt der Link beim ersten Teil.
- Vorschau und Linktext zeigen nur, was du lesen darfst: Für eine Seite ohne Leserecht erscheint nur „Verlinkter Block“, ohne Text.
- In [verschlüsselten Bereichen](/encrypted-spaces) funktionieren Blocklinks innerhalb des Bereichs ebenso; der Server kennt den Text dort nicht, deshalb gibt es keine Textvorschau.
- Auch wer eine Seite nur lesen darf, kann Links auf ihre Blöcke kopieren.
- Für **Text links ausrichten** gibt es kein Tastenkürzel mehr (++⌘ ⇧ L++ kopiert jetzt den Blocklink); links ist die Standardausrichtung, die Werkzeugleiste bietet sie weiter an.
## Graph der Verlinkungen
Das Netz-Symbol unten in der Seitenleiste (oder `> graph` in der Schnellsuche) zeigt alle Seiten als Punkte und ihre Links als Linien. Datenbank-Einträge erscheinen als eigene Punkte, sobald sie verlinken oder verlinkt sind; ein Klick öffnet den Eintrag. Große Punkte haben viele Verbindungen; Farben unterscheiden Dokumente, Datenbanken, Einträge, Whiteboards und Journale.
- Ziehen verschiebt, Mausrad oder zwei Finger zoomen, ein Klick öffnet die Seite.
- Überfahren hebt eine Seite und ihre Nachbarn hervor; **Hervorheben** markiert Seiten nach Titel.
- **Unterseiten verbinden** zeigt zusätzlich die Seitenhierarchie (gestrichelt), **Seiten ohne Verbindung** blendet einzelne Seiten ein oder aus.
- **Journaltage** steuert die Tage von [Journalen](/journal): **ausblenden**, **je Monat ein Punkt** (Standard; der Punkt sammelt die Links aller Tage des Monats, ein Klick öffnet das Journal) oder **einzeln zeigen**. Die Zeile oben nennt Seiten und Journaltage getrennt.
- Als Verbindung zählen Links auf Seiten und Einträge (auch aus dem Text eines Eintrags), eingebettete Whiteboards, verknüpfte Datenbanken und synchronisierte Blöcke. Der Graph zeigt nur, was du sehen darfst.
## Nicht verlinkte Erwähnungen
Unter **Verlinkt von** am Seitenende listet **Nicht verlinkte Erwähnungen** Dokumente und Einträge, in denen der Titel dieser Seite vorkommt, ohne dass er verlinkt ist (Titel ab vier Zeichen), oder einer ihrer [Aliasse](/page-tags#aliasse) als ganzes Wort (ab zwei Zeichen); der gefundene Alias steht grau neben dem Treffer. **Verlinken** macht die erste Erwähnung dort zu einem Link auf diese Seite, zuerst über den Titel, sonst über einen Alias – der Text bleibt, wie er dasteht. Ein geöffneter Eintrag zeigt dasselbe für seinen Titel und seine Aliasse unter seinen Eigenschaften.
---
# Formeln, Diagramme, Code und Rechnen
LaTeX-Formeln, Mermaid-Diagramme und Codeblöcke mit Hervorhebung, Rechnen direkt im Text und Kennzahlen aus Datenbanken.
## Formeln, Diagramme und Code
- **Formeln** in LaTeX: Block mit `/math`, im Text mit `/inlinemath`. Die Vorschau erscheint beim Tippen. Über dem Eingabefeld stehen Bausteine wie Bruch, Wurzel, Hoch- und Tiefstellung, Vektor, Kreuzprodukt, ±, π und Summe.
- **Brüche** fügt `/Bruch` als Formel im Satz ein.
- **Mermaid-Diagramme**: Klick oder Enter öffnet Quelltext und Vorschau. Bis 20.000 Zeichen und 500 Kanten. Im dunklen Modus werden Mermaid-Diagramme dunkel gezeichnet, beim Wechsel des Modus neu; Downloads (SVG/PNG) und Ausdrucke bleiben hell.
- **draw.io-Diagramme** (`/drawio`): öffnen den Editor von draw.io in einem großen Fenster; **Speichern** übernimmt das Diagramm als einen Schritt, den du rückgängig machen kannst. Doppelklick, Enter oder der Stift am Block öffnen es wieder. Gespeichert werden die Zeichnung und ein Bild davon: Beim Ansehen – auch auf geteilten Seiten, in Präsentationen und offline – lädt Flowplan draw.io gar nicht, es zeigt nur das Bild (bereinigt, ohne Skripte und ohne Inhalte von außen). Zeichnung und Bild dürfen je bis 800 kB groß sein.
- **Maximieren:** Der Knopf mit den Pfeilen oben rechts im Fenster (neben dem Schließen-Knopf) vergrößert draw.io auf das ganze Browserfenster, derselbe Knopf (**Verkleinern**) holt das Fenster zurück. Er lässt sich auch per Tastatur bedienen. Das Diagramm bleibt dabei offen, ungespeicherte Änderungen gehen nicht verloren; Esc und **Schließen** fragen wie gewohnt, bevor sie Änderungen verwerfen. Die Wahl merkt sich das Gerät: Das nächste Diagramm öffnet so, wie du das letzte verlassen hast. Auf dem Telefon füllt draw.io den Bildschirm ohnehin (Notch und Home-Leiste bleiben frei), dort gibt es den Knopf nicht.
- **Eine Seite für ein Diagramm:** Die Vorlage **Diagramm-Seite** (unter [Vorlagen](/templates#startervorlagen), Kategorie *Wissen & Dokumentation*) legt eine Seite in voller Breite mit einem leeren draw.io-Diagramm an und öffnet draw.io gleich. Auf einer Seite in voller Breite nutzt das gespeicherte Bild die ganze Breite, und ein leeres Diagramm ist eine große Fläche statt eines schmalen Streifens. Eine eigene Seitenart wie beim Whiteboard gibt es dafür nicht – die Diagramm-Seite ist ein Dokument, du kannst also Text, weitere Diagramme oder andere Blöcke dazuschreiben.
- **Wo draw.io läuft:** Ohne Einstellung nutzt Flowplan `embed.diagrams.net`. Während du zeichnest, geht der Inhalt des Diagramms an diesen Dienst; das Fenster weist darauf hin. Mit `DRAWIO_URL` zeigt die Instanz auf ein eigenes draw.io (etwa den Container `jgraph/drawio`), dann bleibt alles bei dir (siehe [Konfiguration](/configuration-storage#rechtliches-und-oberflaeche)).
- **Aussehen:** unter **Einstellungen → Darstellung → Editor**: **draw.io-Design** *Automatisch* (folgt Flowplan), *Hell* oder *Dunkel* und **draw.io-Oberfläche** *Standard*, *Minimal* oder *Skizze*. Die Wahl gilt für dieses Gerät.
- **Export:** Im ZIP-Export wird jedes Diagramm eine Datei `.drawio.svg`, die draw.io wieder öffnen kann; in einer einzelnen Markdown-Datei und im Git-Export steht es als Block ` ```drawio ` mit der Zeichnung, den der Import wieder zum Diagramm macht (das Bild entsteht beim nächsten Speichern). PDF und EPUB zeigen das Bild.
- **Codeblöcke**: Die Sprache steht im Kopf des Blocks mit ihrem vollen Namen („JavaScript“, „C++“, „Angular TypeScript“, „Klartext“). Ein Klick öffnet eine Liste mit Suche – sie findet Namen, Kürzel und Dateiendungen (`ts`, `py`, `yml`, `tf`, `.rs` …). Oben stehen die Sprachen, die du zuletzt gewählt hast (in diesem Browser gemerkt). Zur Auswahl stehen über 240 Sprachen mit denselben Grammatiken wie in VS Code – darunter Svelte, Vue, Astro, JSX/TSX, Terraform, TOML, Typst, Zig, Prisma, GDScript, Nushell, Systemd-Units, SSH-Konfiguration, Git-Commit-Nachrichten, Logdateien, CSV/TSV und .env-Dateien. **Zeilenumbruch** und **Kopieren** stehen bereit. Tab rückt um zwei Leerzeichen ein.
- **Sprache erkennen**: Fügst du Code in einen Block ohne Sprache (Klartext) ein, schlägt Flowplan eine Sprache vor, wenn sie eindeutig erkennbar ist – „Sieht aus wie Python – übernehmen?“. Ein Klick übernimmt sie, das × blendet den Vorschlag aus. Von selbst ändert Flowplan die Sprache nie.
- **Vorschau**: Codeblöcke in HTML, SVG (Sprache XML mit ``), Markdown, Mermaid, LaTeX und Typst zeigen im Kopf den Schalter **Code / Vorschau / Geteilt**. *Geteilt* stellt Code und Vorschau nebeneinander, auf dem Telefon untereinander. Die Ansicht wird im Block gespeichert; wer eine Seite nur liest (Leserechte, veröffentlichte Seiten, Präsentationen), sieht ohne eigene Einstellung des Blocks die Vorschau und kann für sich umschalten, ohne etwas zu ändern. Fehler (etwa ein Tippfehler im Diagramm oder in Typst, mit Zeilennummer) erscheinen an Stelle der Vorschau.
- **HTML** läuft in einem abgeschotteten Rahmen: keine Skripte, keine Formulare, kein Zugriff auf Flowplan oder das Netz. Bilder aus dem Netz bleiben leer, eingebettete Bilder (`data:`) und Stile funktionieren. Die Höhe passt sich dem Inhalt an.
- **SVG**, **Mermaid** und **Typst** erscheinen als Bild – ohne Skripte und Links.
- **Markdown** wird wie beim Import umgesetzt, **LaTeX** zeigt Formeln mit KaTeX (durch Leerzeilen getrennt, mit oder ohne `$$ … $$`; ganze LaTeX-Dokumente mit `\documentclass` nicht).
- **Typst** wird beim ersten Mal nachgeladen (einige MB, vom eigenen Server, nicht aus dem Netz); Typst-Pakete (`@preview/…`) und Dateien stehen nicht zur Verfügung.
- Neue Mermaid-Codeblöcke (` ```mermaid ` oder Sprache *Mermaid* gewählt) zeigen gleich das Diagramm, leere Blöcke Code und Diagramm nebeneinander. Den eigenständigen Mermaid-Block (`/mermaid`) gibt es weiterhin.
- **Zeilennummern**: Das Menü **…** im Kopf eines Codeblocks schaltet **Zeilennummern** für diesen Block ein oder aus, legt die **erste Zeilennummer** fest (etwa 10 für einen Ausschnitt) und **hebt Zeilen hervor** – z. B. `3-5, 8`, gezählt wie angezeigt. Die Nummern lassen sich nicht markieren und werden nicht mitkopiert; bei Zeilenumbruch stehen sie an der ersten Zeile eines umbrochenen Zeilenstücks. Für Blöcke ohne eigene Einstellung gilt **Einstellungen → Darstellung & Sprache → Editor → Zeilennummern standardmäßig anzeigen** (auf diesem Gerät).
- **Einklappen**: Codeblöcke mit mehr als 25 Zeilen erscheinen eingeklappt – 10 Zeilen hoch, darin scrollbar, unten ausgeblendet. **Alle N Zeilen anzeigen** klappt sie auf, **Einklappen** wieder zu (beides per Tastatur erreichbar). Wer bearbeiten darf, speichert den Zustand im Block; Lesende klappen nur für sich auf. Im Menü **…** lassen sich **Eingeklappt** und die **Höhe eingeklappt** (5, 10, 15, 20 oder 30 Zeilen) einstellen. Drucken und alle Exporte zeigen immer den ganzen Code.
- Die Hervorhebung einer Sprache wird beim ersten Codeblock dieser Sprache nachgeladen; bis dahin steht der Code kurz ohne Farben da. Sehr lange Codeblöcke (über 50 000 Zeichen) bleiben ohne Hervorhebung.

## Rechnen im Text
Flowplan rechnet nur, wenn du es möchtest – exakt mit Brüchen, in deutscher Schreibweise (`2,5`, `2.400`, `3 : 4`, `×`, `²`, `√`, `€`):
- **Hinweis nach „=“**: Tippst du eine Rechnung und dann `=`, etwa `12 × 2.400 € =` oder `3/4 + 1/6 =`, erscheint das Ergebnis grau dahinter. Tab übernimmt es, Esc oder Weiterschreiben verwirft es.
- **Markierter Text**: Markiere eine Rechnung, einen Term oder eine Gleichung; das Textmenü (auch per Rechtsklick) zeigt unter **Rechnen**, was möglich ist, und fügt das Ergebnis per Klick dahinter ein:
- **Ergebnis** und **Kürzen** als exakter Bruch, dazu **Als Dezimalzahl** – `12/18 = 2/3`
- **Ausmultiplizieren**, auch die binomischen Formeln – `(a + b)² = a² + 2ab + b²`
- **Faktorisieren** – `x² − 9 = (x − 3)(x + 3)`, `4x² − 12x + 9 = (2x − 3)²`, `6x² + 9x = 3x(2x + 3)`, auch mit mehreren Variablen: `a³ − b³ = (a − b)(a² + ab + b²)`, `x² + 2xy + y² − 1 = (x + y − 1)(x + y + 1)`, durch Ausklammern in Gruppen `ax + ay + bx + by = (x + y)(a + b)`; **Faktorisieren mit Wurzeln** zerlegt weiter in reelle Faktoren: `x² − 2 = (x − √2)(x + √2)`
- **Vereinfachen** von Bruchtermen – `(x² − 1)/(x − 1) = x + 1`, `1/x + 1/(x + 1) = (2x + 1)/(x(x + 1))`
- **Nach x auflösen** – lineare und quadratische Gleichungen exakt (`x² + 2x − 4 = 0 ⇒ x = −1 ± √5`), höhere Grade exakt, wo es geht (`x³ = 2 ⇒ x = ∛2`, `x⁴ − 5x² + 6 = 0 ⇒ x = ±√2, ±√3`), sonst als gerundete Dezimalzahlen (`x³ + x − 1 = 0 ⇒ x ≈ 0,682328`); bei mehreren Variablen nach jeder, die linear vorkommt. Gleichungen mit x im Nenner werden mit dem Hauptnenner gelöst; Werte, für die ein Nenner 0 wäre, entfallen und werden genannt (`x/(x − 1) = 1/(x − 1) ⇒ keine Lösung (x = 1 entfällt)`).
- **Ergebnis kopieren**: Der Knopf am Ende jeder Ergebniszeile kopiert das Ergebnis so, wie es angezeigt wird (etwa `y² − 16y + 64`), als Text in die Zwischenablage – zum Einfügen in andere Apps. Ein Klick auf die Zeile selbst fügt es weiterhin hinter der Auswahl ein.
- **Funktionsgraph**: Markiere einen Term mit x, etwa `x² − 2` oder `f(x) = 2x + 1`, und wähle im Textmenü **Graph zeichnen** – darunter erscheint ein Graph mit Achsen, Gitter und markierten Nullstellen. Auch `/Funktionsgraph` fügt einen ein. Unter dem Graphen stehen die Funktionen zum Bearbeiten: Der Graph ändert sich beim Tippen, **+ Funktion** fügt bis zu sechs Funktionen in eigenen Farben hinzu (`sin(x)`, `cos`, `tan`, `exp`, `ln`, `abs`, `√` und `π` sind möglich). Ziehen verschiebt den Ausschnitt, **+**/**−** oder ⌘ /Strg + Scrollen zoomen, **⟲** stellt die Ansicht zurück. Auf veröffentlichten Seiten lässt sich der Graph verschieben und zoomen, aber nicht ändern.
- **Vektoren**: Schreibe Vektoren als `(1 | 2 | 3)`, `(1; 2; 3)` oder `(1, 2, 3)` – in deutscher Schreibweise ist ein Komma zwischen Ziffern sonst ein Dezimalkomma, `(1,5; 2)` ist also (1,5 | 2). Flowplan rechnet Summen und Vielfache (`2 · (1; −2) − (3; 1) = (−1; −5)`), das **Skalarprodukt** mit `·` samt **Winkel** (`(1; 0) · (0; 1) = 0 ⇒ ∠ = 90°`), das **Kreuzprodukt** mit `×` (`(1|0|0) × (0|1|0) = (0 | 0 | 1)`) und den **Betrag** mit `|…|` (`|(1; 1)| = √2`). Ein markierter Vektor allein zeigt seinen Betrag und den **Einheitsvektor** (`(3; 4) ⇒ v⁰ = (3/5; 4/5)`). **Vektoren zeichnen** im Textmenü stellt Vektoren der Ebene als Pfeile im Koordinatensystem dar – bei `(1; 2) + (3; 1)` beide Vektoren und ihre Summe. Im Graphen lassen sich weitere Vektoren wie `(3; 2)` neben Funktionen eintragen. **Vektoren im Raum** wie `(1 | 2 | 3)` – auch Kreuzprodukte – zeichnet Flowplan in einem 3D-Koordinatensystem mit x-, y- und z-Achse, Bodenraster und gestrichelten Hilfslinien zum Boden; **Ziehen dreht die Ansicht**, die Drehung wird mit der Seite gespeichert. Im Formel-Editor gibt es die Bausteine **Vektor** (Spaltenvektor), **Vektorpfeil** und **Kreuzprodukt**; Spaltenvektoren in Formeln werden genauso berechnet.
- **In Formeln**: Der Formel-Editor zeigt dieselben Möglichkeiten unter **Rechnen** und hängt das Ergebnis in LaTeX an, etwa `\frac{3}{4} + \frac{1}{6} = \frac{11}{12}`.
## Dashboards und Kennzahlen
**/Kennzahl** fügt eine Karte mit einer Zahl aus einer Datenbank ein, **/Dashboard** gleich drei nebeneinander. Über das Zahnrad wählst du:
- die **Datenbank** (alle Datenbanken des Arbeitsbereichs, die du lesen darfst),
- optional eine **Ansicht** – dann zählen nur die Einträge, die ihre Filter zeigen, etwa „Offene Tickets“,
- die **Berechnung**: Anzahl Einträge, Summe, Durchschnitt, Minimum oder Maximum einer Zahl-, Formel- oder Rollup-Eigenschaft,
- eine **Beschriftung**.
Die Zahl rechnet der Server für die Person aus, die die Seite ansieht, und aktualisiert sie jede Minute; private Einträge zählen nur für die, die sie sehen dürfen. Auf veröffentlichten Seiten sehen Besucher ohne Zugriff einen Strich. Diagramme kommen dazu, indem du unter den Kennzahlen eine **verknüpfte Datenbank** einfügst und dort eine Diagramm-Ansicht wählst – so entsteht ein Dashboard aus mehreren Datenbanken.
---
# Fußnoten, Zitate und Literatur
Für Haus-, Abschluss- und Forschungsarbeiten: Fußnoten, Quellen im Text zitieren und ein Literaturverzeichnis, das sich selbst schreibt.
## Fußnoten
`/fußnote`, ++⌘ ⌥ F++ (++Strg Alt F++) oder **Fußnote** im Textmenü fügt an der Schreibmarke eine Fußnote ein und öffnet ihren Text.
- Die Anmerkungen stehen nummeriert unter **Fußnoten** am Ende der Seite. Die Nummern folgen der Reihenfolge im Text und passen sich beim Verschieben, Kopieren und Löschen von selbst an.
- Ein Klick auf die Nummer springt zur Anmerkung, ↩ wieder zurück. Doppelklick auf die Nummer (oder ++⌘ ⌥ F++ bei ausgewählter Fußnote) bearbeitet oder entfernt sie.
- Anmerkungen sind reiner Text; Webadressen darin werden zu Links.
- Fußnoten erscheinen auch auf geteilten und veröffentlichten Seiten, beim Drucken und im HTML-Export, und die Suche findet ihren Text.
- Im Markdown-Export werden sie zu `[^1]` mit `[^1]: Text` am Ende; der Import liest das wieder ein – auch Obsidians Kurzform `^[Text]`.
## Zitate und Literaturverzeichnis
Für Haus-, Abschluss- und Forschungsarbeiten zitierst du Quellen direkt im Text:
::: steps
1. `/zitat` (oder `/cite`) öffnet die **Literaturliste** des Arbeitsbereichs.
2. Einen Titel suchen, eine **DOI** einfügen (z. B. `10.1000/xyz123` – Flowplan holt Autoren, Titel und Jahr bei Crossref und anderen DOI-Diensten) oder über **BibTeX oder CSL-JSON importieren (Zotero) …** eine ganze Literaturliste übernehmen.
3. Optional eine Seite angeben und einfügen.
:::
Im Text steht dann „(Müller 2021)“, „(Müller & Schmidt 2021, S. 12)“ oder „(Müller et al. 2021)“; beim Überfahren zeigt Flowplan die vollständige Angabe. `/literatur` fügt ein **Literaturverzeichnis** ein: alle auf der Seite zitierten Werke in einem APA-ähnlichen Stil, das sich beim Zitieren selbst aktualisiert – auch auf geteilten und veröffentlichten Seiten.
- Die Literaturliste gehört zum Arbeitsbereich; Gäste sehen sie nicht. Jedes Zitat trägt seine Angaben mit, sodass Kopien, Exporte und geteilte Seiten auch ohne die Liste vollständig sind.
- **Zotero:** In Zotero eine Sammlung als *BibTeX* oder *CSL JSON* exportieren und im Dialog importieren.
- Im **Markdown-Export** werden Zitate zu Pandoc-Zitaten (`[@schlüssel]`, `[@schlüssel, p. 12]`) und das Verzeichnis zu einem eigenen Abschnitt – so lässt sich ein Text mit Pandoc weiterverarbeiten.
---
# Lesen, Präsentieren und Überblick
Inhaltsverzeichnis, einklappbare Abschnitte, Lese- und Fokusmodus, Autoren anzeigen – und ein Dokument als Folien präsentieren.
## Inhaltsverzeichnis
Das Listen-Symbol oben rechts im Dokument öffnet das **Inhaltsverzeichnis** neben dem Text – in allen Dokumenten, auch in Journal-Tagen und Einträgen einer Datenbank. Es entsteht aus den Überschriften und wächst beim Schreiben mit, markiert den Abschnitt, in dem du gerade liest, und springt per Klick zur Überschrift. Der Kopf des Inhaltsverzeichnisses mit dem Schließen-Knopf bleibt oben stehen, auch wenn du in einer langen Liste nach unten scrollst; mit Esc schließt du die Liste. Ob es offen ist, merkt sich Flowplan in diesem Browser für alle Dokumente. Auf dem Handy öffnet es ein runder Knopf unten rechts.
## Abschnitte einklappen
Jede Überschrift lässt sich **einklappen**: Der kleine Pfeil links neben der Überschrift (erscheint beim Darüberfahren; auf Touch-Geräten und bei eingeklappten Überschriften immer) blendet alles darunter aus – bis zur nächsten Überschrift derselben oder einer höheren Ebene. Eine eingeklappte Überschrift zeigt dahinter, wie viel verborgen ist (**… 3 Blöcke**); ein zweiter Klick klappt wieder aus. Steht der Cursor in der Überschrift, geht das auch mit ++⌘ ⌥ Enter++. Auf dem Handy sitzt der Pfeil am Ende der Überschrift, in Texten von rechts nach links auf der anderen Seite.
- **Alle Abschnitte einklappen / ausklappen:** im Seitenmenü `⋯` eines Dokuments, oben im [Inhaltsverzeichnis](#inhaltsverzeichnis), in der Schnellsuche (`> abschnitte`) oder mit ++⌘ ⌥ X++ bzw. ++⌘ ⌥ O++ ([änderbar](/keyboard-shortcuts#eigene-tastenkuerzel)). Ist ein Datenbank-Eintrag offen, gilt es für seinen Text.
- **Nur für dich:** Was eingeklappt ist, merkt sich dieses Gerät (pro Seite bzw. Eintrag) – es ändert das Dokument nicht, andere sehen alles wie bisher. Neu geöffnete Dokumente sind ausgeklappt.
- **Nichts geht verloren:** Kommt der Cursor in einen eingeklappten Teil (Pfeiltasten, Rückgängig, ein Klick im Inhaltsverzeichnis), klappt er auf. Ebenso, wenn **Auf der Seite suchen** (++⌘ F++) einen Treffer darin anspringt oder ein Suchtreffer, Rückverweis oder eine Benachrichtigung dorthin führt. In der eingeklappten Überschrift selbst kannst du weiterschreiben, sie bleibt eingeklappt.
- **Verschieben:** Ziehst du eine eingeklappte Überschrift am Griff `⋮⋮` (oder verschiebst sie mit ++⌘ ⇧ ↑/↓++), wandert ihr ganzer Abschnitt mit.
- **Drucken und PDF** zeigen immer alles; ebenso Export, Präsentation und veröffentlichte Seiten.
- Einklappen lassen sich Überschriften direkt im Dokument – auch im Lesemodus und in [verschlüsselten Bereichen](/encrypted-spaces). Überschriften in Hinweisen, Toggles, Tabellen, Spalten oder Listen haben keinen Pfeil; solche Blöcke gehören einfach zum Abschnitt, in dem sie stehen.
## Lesemodus
Das Buch-Symbol oben in der Leiste (auf dem Telefon **Lesemodus** im Menü `⋯`, oder ++⌘ ⌥ E++, Schnellsuche → `> lesemodus`) öffnet ein Dokument **nur zum Lesen**: Nichts lässt sich versehentlich ändern, Griffe und Blockmenü verschwinden – praktisch auf dem Handy und beim Vorlesen oder Präsentieren. Der Stift wechselt zurück zum Bearbeiten. Das Gerät merkt sich den Modus pro Seite; die Rechte ändern sich dadurch nicht, und andere sehen weiter ihren eigenen Modus. Datenbank-Einträge haben dasselbe Buch-Symbol oben im Eintrag (siehe [Datenbanken](/databases)).
Der Lesemodus gilt auch für alles, was in der Seite eingebettet ist: In **verknüpften Datenbanken** lassen sich keine Zellen bearbeiten, keine Einträge anlegen, löschen oder verschieben und keine Ansichten ändern; ein von dort geöffneter Eintrag ist ebenfalls nur lesbar. Änderungen anderer erscheinen weiter live. Synchronisierte Blöcke, Zeichnungen, Kennzahlen, Funktionsgraphen und Erweiterungsblöcke sind im Lesemodus ebenfalls gesperrt.
## Fokusmodus
**Fokusmodus** (Schnellsuche → `> fokus`) blendet Seitenleiste, Werkzeugleiste und Seitenrand aus; die obere Leiste erscheint erst beim Darüberfahren. Unten zählt eine Leiste die Wörter der Seite und die in dieser Sitzung hinzugekommenen. Mit einem **Ziel** (z. B. 500 Wörter) zeigt ein Balken den Fortschritt; das Ziel merkt sich das Gerät pro Seite. Esc beendet den Modus.
## Präsentieren
**Präsentieren** im Menü `…` oben rechts (oder ++⌘ ⌥ P++, Schnellsuche → `> präsentieren`) zeigt ein Dokument als Folien im Vollbild – ohne es umzubauen:
- Jede **Überschrift 1** beginnt eine neue Folie. Hat das Dokument keine, beginnt jede **Überschrift 2** eine. Eine **Trennlinie** (`---`) beginnt immer eine neue Folie.
- Was vor der ersten Überschrift steht, wird zur Titelfolie mit dem Seitentitel.
- Bilder, Tabellen, Code, Formeln und Diagramme werden so verkleinert, dass die Folie ganz auf den Bildschirm passt.
| Taste | Wirkung |
| --- | --- |
| → , ↓ , Leertaste , Bild ↓ | Nächste Folie |
| ← , ↑ , Bild ↑ | Vorherige Folie |
| Pos1 / Ende | Erste / letzte Folie |
| Esc | Präsentation beenden |
Ein Klick ins rechte Zwei-Drittel der Folie blättert weiter, ins linke Drittel zurück. Unten zeigen ein Zähler und ein Balken, wo du bist; die Leiste mit den Knöpfen blendet sich aus, solange die Maus ruht. Dort wechselst du auch zwischen **hellen und dunklen Folien**. Wer im System „Bewegung reduzieren“ eingestellt hat, sieht die Folien ohne Überblendung.
### Sprechernotizen und Referentenansicht
Ein **Hinweis** (`/hinweis`, Art „Hinweis“) als letzter Block einer Folie enthält die **Sprechernotizen**: Auf der Folie erscheint er nicht. **Referentenansicht** (Notizblock-Symbol in der Leiste) öffnet ein zweites Fenster mit der aktuellen und der nächsten Folie, den Notizen und der verstrichenen Zeit – praktisch auf dem Laptop, während der Beamer die Folien zeigt. Beide Fenster bleiben im Gleichschritt: Blättern geht in jedem von beiden.
### Folien als PDF
Das Drucker-Symbol in der Leiste druckt die Folien – jede auf eine eigene Seite im **Querformat**. Im Druckdialog **Als PDF sichern** wählen, um die Folien weiterzugeben.
## Autoren anzeigen
**Autoren anzeigen** (in der Symbolleiste oder im Seitenmenü **…**) färbt den Text nach der Person, die ihn geschrieben hat – jede Person immer in derselben Farbe. Eine Legende zeigt Namen und Anteile; **Autoren ausblenden** schaltet die Färbung wieder ab.
- Am Inhalt ändert sich nichts; die Färbung ist nur eine Ansicht.
- Aufgezeichnet wird, seit es die Funktion gibt: Älterer, importierter oder aus einer Version wiederhergestellter Text erscheint als „früher“, ebenso Text von Gästen über Links mit eigenen Berechtigungen.
- Bilder, Erwähnungen und andere eingebettete Objekte werden nicht eingefärbt.
- Namen sehen nur Personen, die die Seite lesen dürfen.
---
# Whiteboards
Eine unendliche Fläche für Brainstorming, Abläufe und Workshops: Notizzettel, Formen, Verbindungen, Stift, Rahmen und Tabellen – gemeinsam und live.

**Mehr zum Thema:** [Diagramme, Mindmaps und Prototypen](/whiteboard-diagrams) · [Whiteboards: gemeinsam, mit KI und präsentieren](/whiteboard-collaboration) · [Racks und Verkabelung](/whiteboard-racks)
## Werkzeuge
| Werkzeug | Taste | Wofür |
| --- | --- | --- |
| Auswählen | V | Elemente markieren, verschieben, skalieren, drehen; Rahmen aufziehen für Mehrfachauswahl |
| Verschieben | H | Fläche bewegen (auch mit Leertaste + Ziehen oder zwei Fingern) |
| Notizzettel | N | Farbige Zettel mit Text |
| Text | T | Freier Text |
| Form | R | Rechteck, abgerundet, Ellipse, Raute, Dreieck, Sechseck, Stern, Pfeil, Wolke |
| Verbindungslinie | L | Gerade, geschwungen oder gewinkelt; haftet an Elementen und folgt ihnen |
| Stift | P | Freihand zeichnen |
| Radierer | X | Gezeichnete Striche löschen: einfach darüberfahren |
| Rahmen | F | Bereiche gruppieren – und Folien für die Präsentation |
| Tabelle | G | Einfache Tabelle auf der Fläche |
| Kommentar | C | Kommentar an eine Stelle heften |
| Stempel | E | Schnelle Reaktion (👍 ❤️ ⭐ ✅ ❓ 🔥 💡 🎉) auf ein Element; noch einmal nimmt sie zurück |
| Laserpointer | K | Zeigen, ohne etwas zu verändern: alle sehen eine kurz nachleuchtende rote Spur |
### So ist die Leiste aufgebaut
- **Links** stehen die Werkzeuge zum Erstellen: Auswählen, Verschieben, Notizzettel, Text, Form, Verbindungslinie, **Zeichnen**, Rahmen, Tabelle und Kommentar. **Zeichnen** fasst Stift, Radierer und Laserpointer zusammen: Der Knopf zeigt das zuletzt benutzte, oben im Optionsfenster schaltest du um. Die Tasten aus der Tabelle gelten weiter für alle Werkzeuge.
- **+** (**Einfügen und mehr**) öffnet ein Fenster mit Suche – tippen filtert, Enter nimmt den ersten Treffer:
- **Einfügen:** Bild, Bilder und Symbole, Emoji, Stempel, Seite verknüpfen (Karte mit Link auf eine Flowplan-Seite), Einbetten (Video, Webseite oder PDF, siehe [unten](#videos-webseiten-und-pdfs-einbetten)), Zeitleiste und Importieren (Excalidraw, draw.io, Mermaid, PlantUML)
- **Vorlagen & Bibliothek:** [Vorlagen](/whiteboard-collaboration#vorlagen), Formenbibliothek und Racks (siehe [Racks und Verkabelung](/whiteboard-racks))
- **KI**, wenn sie für dich eingeschaltet ist
- **Moderation** oben rechts: Abstimmung, Timer, Privater Modus, Schätzen, Alle zu mir holen und Folge mir (siehe [Gemeinsam arbeiten](/whiteboard-collaboration#gemeinsam-arbeiten)). Ein Punkt am Knopf zeigt, dass gerade etwas läuft.
- **Unten links** eine Leiste mit Rückgängig und Wiederholen, Zoom, den Pfeilen zum vorigen und nächsten Rahmen, **Präsentieren** (beides, sobald es Rahmen gibt) und **…** (**Ansicht und Aktionen**: Raster, Einpassen, Vollbild, Kommentare, Rahmen-Übersicht, Minikarte, Suche, Prototyp und Export).
- **Auf dem Handy** steht die Leiste unten: Auswählen, Verschieben, Notizzettel, Text, Form, Zeichnen und **Weitere Werkzeuge** – darin dasselbe wie unter **+**, ebenfalls mit Suche. **Moderation** ist das Symbol oben rechts.
Wer nur lesen darf, sieht Auswählen, Verschieben, den Laserpointer und die Leiste unten.
## Elemente gestalten
Ausgewählte Elemente zeigen eine Leiste mit Farbe, Schriftgröße, Fett, Ausrichtung, Linienstärke und -verlauf, **Nach vorne**/**Nach hinten**, **Duplizieren** (++⌘ D++) und **Löschen** (Entf ). Zettel und Texte lassen sich auch **verdecken** – wie ein Spoiler im Dokument, per Klick aufdecken.
Doppelklick bearbeitet den Text eines Elements. Kopieren und Einfügen funktioniert innerhalb und zwischen Whiteboards. **Kursiv** und **Unterstrichen** gelten wie **Fett** für den ganzen Text eines Elements.
## Gruppieren
Mehrere Elemente auswählen und ++⌘ G++ drücken (oder **Gruppieren** in der Leiste): Die Elemente verhalten sich danach wie eines. Ein Klick wählt die ganze Gruppe, und sie wird gemeinsam verschoben, an den Ecken skaliert, dupliziert, kopiert, gesperrt und gelöscht. Gruppen lassen sich wieder zu größeren Gruppen zusammenfassen.
- **Doppelklick** auf ein gruppiertes Element betritt die Gruppe: Eine gestrichelte Linie zeigt sie, und Klicks wählen nun einzelne Elemente darin (bei verschachtelten Gruppen die nächste Ebene). Esc oder ein Klick daneben verlässt die Gruppe.
- ++⇧ ⌘ G++ oder **Gruppierung aufheben** löst die äußerste Gruppe der Auswahl auf.
- Kopien einer Gruppe sind eine eigene, neue Gruppe. Wie jede Änderung wird das Gruppieren live geteilt und lässt sich mit ++⌘ Z++ zurücknehmen.
## Listen, Links und Schlagwörter
In Zetteln, Formen und Texten gibt es einfache Formatierungen im Text selbst:
| Schreibweise | Ergebnis |
| --- | --- |
| `- Punkt` | Aufzählung (die Knöpfe **Aufzählung** und **Nummerierte Liste** in der Leiste setzen sie für die markierten Zeilen) |
| `1. Punkt` | Nummerierte Liste; Enter setzt die Liste fort, eine leere Zeile beendet sie |
| `**fett**`, `*kursiv*`, `__unterstrichen__` | Einzelne Wörter hervorheben – beim Schreiben mit ++⌘ B++, ++⌘ I++, ++⌘ U++ |
| `[Text](https://…)` | Link – **Link in den Text einfügen** in der Leiste fügt ihn um die Markierung ein |
Links dürfen nur auf `https://`, `http://` und `mailto:` zeigen oder auf ein Element desselben Boards (siehe unten); andere Adressen bleiben einfacher Text. Web-Links öffnen sich in einem neuen Tab. Daneben kann jedes Element einen eigenen **Link** tragen (Kettensymbol in der Leiste); ein kleines Symbol an der Ecke führt dorthin.
**Schlagwörter** an Zetteln erscheinen als farbige Chips an der Unterkante – jedes Schlagwort hat immer dieselbe Farbe. In der Board-Suche hebt **Nur Zettel mit Schlagwort** alle Zettel mit diesem Schlagwort hervor und blendet den Rest ab.
## Links zu Rahmen und Elementen
**Link zu diesem Element kopieren** (in der Leiste eines ausgewählten Elements oder in der Rahmen-Übersicht) kopiert eine Adresse wie `…/#page=…&item=…`. Wer sie öffnet, sieht das Board, auf das Element gezoomt und ausgewählt – sofern sie das Board lesen darf.
Innerhalb des Boards führen Links auf Elemente per Kamerafahrt dorthin: im Link-Feld eines Elements oder im Text als `[Zum Ziel](#item=…)`. Fehlt das Element inzwischen, sagt ein Hinweis das.
## Ausrichten, stapeln und sortieren
- Beim Verschieben rasten Kanten und Mitten an anderen Elementen ein; orange **Hilfslinien** zeigen, woran. ⌥ beim Ziehen schaltet das Einrasten ab.
- **Am Raster ausrichten** (Rasterknopf unten) lässt Elemente ohne Nachbarn am 24-Punkte-Raster einrasten.
- Mehrere Elemente auswählen → **Anordnen**: links, mittig, rechts, oben, mittig oder unten ausrichten, gleichmäßig verteilen oder als Zeile bzw. Spalte stapeln.
- Für Workshops: **Nach Farbe gruppieren**, **Nach Person gruppieren** (mit Überschriften), **Nach Stimmen sortieren** oder **Als Raster anordnen**.
## Stift und Formerkennung
Mit einem Tablet-Stift (etwa Apple Pencil) folgt die Strichstärke dem Druck. Im Stiftmenü wählst du die Farbe; mit **Formen erkennen** werden gezeichnete Linien, Rechtecke, Kreise, Dreiecke und Rauten zu sauberen Formen (⌥ beim Loslassen behält den Strich).
Sobald du auf einem Gerät mit dem Stift gezeichnet hast, zeichnet nur noch der Stift: Finger verschieben und zoomen die Fläche, eine aufliegende Hand hinterlässt keine Striche. Liegt die Hand auf, während der Stift zeichnet, unterbricht oder verschiebt sie den Strich nicht. **Nur mit dem Stift zeichnen** im Stiftmenü schaltet das ab – dann zeichnen auch Finger, nur nicht die Hand, die den Stift hält: Eine Berührung, während der Stift zeichnet oder schwebt oder kurz nachdem er abgesetzt wurde, verschiebt stattdessen die Fläche. Setzt der Stift leicht auf, beginnt der Strich nicht dick, und die Breite folgt dem Druck gleichmäßig. Mit Scribble darfst du über den Rand eines offenen Textes auf der Fläche hinausschreiben; der Text bleibt offen. Ein schwebender Apple Pencil (iPad Pro, iPad Air ab M2) zeigt, wo der Strich beginnt; das Radierer-Ende eines Stifts löscht wie der **Radierer**. In der [iPad-App](/mobile-apps) wechselt Doppeltippen oder Drücken des Apple Pencil je nach iPad-Einstellung zum Radierer und zurück, zum vorigen Werkzeug oder zum Stift. Dasselbe gilt beim Markieren von Bildern in Dokumenten.
## Bilder, Symbole und Einträge
- **Bilder und Symbole** (unter **+**) sucht frei lizenzierte Bilder bei Openverse; ausgewählte Bilder werden auf den Server geladen, der Bildnachweis steht als Tooltip am Bild. Außerdem gibt es die Symbolbibliothek in zehn Farben.
- **Zuschneiden** (in der Leiste eines Bildes): Ausschnitt mit Maus, Finger oder Pfeiltasten wählen (⇧ ändert die Größe). Das Bild selbst bleibt unverändert – **Ganzes Bild zeigen** macht den Zuschnitt jederzeit rückgängig, und auch Exporte zeigen den Ausschnitt.
- **GIFs**: Hat die Instanz einen Schlüssel für GIPHY oder Tenor (siehe [Konfiguration](/configuration-integrations#integrationen)), gibt es in **Bilder und Symbole** einen Reiter **GIFs**. Die Suche läuft über den Server; ein gewähltes GIF wird wie die Openverse-Bilder auf den Server geladen (bis 8 MB), danach lädt das Board nichts mehr vom Anbieter. Ohne Schlüssel fehlt der Reiter.
- **Seite verknüpfen → Eintrag aus „…“** legt einen Datenbankeintrag als Karte ab. Die Karte zeigt Titel und bis zu drei Eigenschaften und bleibt aktuell, wenn sich der Eintrag ändert; ein Doppelklick öffnet ihn.
Karten verknüpfter Dokumente zeigen, wenn sie hoch genug sind, die ersten Zeilen der Seite als kleine Vorschau.
## Videos, Webseiten und PDFs einbetten
**Einbetten** unter **+** (am Handy unter **Weitere Werkzeuge**) nimmt einen Link auf:
- **Videos und Webseiten** von YouTube, Vimeo, Loom, Spotify, Figma und CodePen – dieselbe Liste wie für Einbettungen in Dokumenten. Andere Adressen werden abgelehnt. Das Board zeigt zuerst nur eine Vorschau mit dem Anbieter; der Inhalt lädt erst nach einem Klick auf **Laden**, in einem abgeschotteten Rahmen (Sandbox), und **Einbettung schließen** entlädt ihn wieder. YouTube läuft über `youtube-nocookie.com`.
- **PDFs**: **PDF hochladen …** oder eine PDF-Datei aufs Board ziehen. Die Datei wird in der Seite gespeichert und zählt zum Speicherkontingent; das Board zeigt eine Seite als Vorschau, mit Pfeilen zum Blättern. Ein Doppelklick öffnet den PDF-Betrachter.
Exporte zeigen statt des Players eine Karte mit Anbieter und Link.
## Navigieren
- Zoomen mit ⌘ + Mausrad, Trackpad-Geste oder den Knöpfen in der Leiste unten links.
- **Alles anzeigen** (++⇧ 1++) passt die Ansicht an alle Elemente an, ++⇧ 2++ an die Auswahl – mit einer weichen Kamerafahrt, die jede Eingabe sofort beendet.
- Rückgängig ++⌘ Z++, Wiederholen ++⇧ ⌘ Z++.
- **Minikarte** (im Menü **…** der Leiste unten, **Ansicht und Aktionen**): eine kleine Übersicht aller Elemente mit dem sichtbaren Ausschnitt. Klicken oder Ziehen springt dorthin; mit dem Fokus auf der Minikarte verschieben die Pfeiltasten die Ansicht. Ob sie offen ist, merkt sich der Browser.
- **Auf dem Board suchen** (++⌘ F++ auf dem Board, oder im Menü **…** unten): durchsucht Zettel, Formen, Texte, Tabellen, Rahmen, Kommentare, Einbettungen sowie Seiten- und Eintragskarten. Enter und ++⇧ Enter++ (oder die Pfeile) springen zum nächsten bzw. vorigen Treffer, der hervorgehoben wird; Esc schließt die Suche.
## Einbetten und exportieren
- Mit `/board` im Dokument wird ein Whiteboard Teil einer Seite; der Knopf oben rechts öffnet es groß.
- **Als PNG exportieren** oder **Als SVG exportieren** speichert das Whiteboard als Bild.
- **Exportieren … (PNG, SVG, PDF)** öffnet den Export-Dialog: Was (**Ganzes Board**, **Auswahl** oder ein einzelner Rahmen), Format und bei PNG die **Auflösung** 1×, 2× oder 4×. Als **PDF** kommt das Board **Alles auf einer Seite** oder mit **Eine Seite pro Rahmen** in der Reihenfolge der Präsentation (ausgeblendete Rahmen fehlen). Der Export entsteht im Browser; der Server sieht davon nichts.
- Im [Markdown-Export](/export) kommt jedes Whiteboard automatisch als SVG mit.
- Die Texte auf dem Board sind durchsuchbar und erscheinen in Exporten.
- **Als Mermaid kopieren** übernimmt Formen und Verbindungen als Mermaid-Flussdiagramm (siehe oben).
---
# Diagramme, Mindmaps und Prototypen
Auf dem Whiteboard: Mindmaps per Tab, Formenbibliotheken für Flussdiagramme und Netzwerke, Mermaid, PlantUML, Excalidraw und draw.io, Wireframes und Roadmaps.
## Mindmaps
Einen Zettel, eine Form oder einen Text auswählen und Tab drücken: Rechts entsteht ein verbundener Zweig, der sofort beschriftet werden kann. Tab am neuen Zweig verzweigt weiter, ++⌥ Enter++ legt ein Geschwister an. Die Mindmap ordnet sich dabei selbst: Zweige stehen rechts neben ihrem Elternteil, gleichmäßig verteilt und mittig ausgerichtet. **Mindmap anordnen** in der Leiste eines Elements ordnet den ganzen Baum neu. Tippen auf einem ausgewählten Zettel beginnt direkt mit dem Schreiben.
## Diagramme: Formenbibliotheken
**Formenbibliothek** unter **+** (oder **Weitere Formen …** im Formmenü) öffnet ein durchsuchbares Seitenfeld, auf dem Telefon als Blatt von unten. Ein Klick oder Enter legt die Form in die Mitte der Ansicht, oder du ziehst sie an die gewünschte Stelle; Pfeiltasten wandern durch die Formen. Gesucht wird auf Deutsch und Englisch („Raute“, „decision“, „Gateway“ …).
| Bibliothek | Formen |
| --- | --- |
| Flussdiagramm | Prozess, Entscheidung, Start/Ende, Daten, Dokument(e), vordefinierter Prozess, manuelle Eingabe und Operation, Datenbank, Vorbereitung, Verzögerung, Anzeige, Verbindungsstelle, Seitenverbinder, interner Speicher, Zusammenführung, Schleifengrenze, Anmerkung |
| BPMN | Start-, Zwischen-, End-, Zeit- und Nachrichtenereignis, Aufgabe, Teilprozess, Benutzer- und Serviceaufgabe, exklusives, paralleles und inklusives Gateway, Datenobjekt, Datenspeicher, Pool, Lane, Gruppe |
| UML | Klasse (mit Abschnitten), Schnittstelle, Aufzählung, Akteur, Anwendungsfall, Komponente, Paket, Notiz, Lebenslinien, Aktivierung, Start- und Endknoten, Zustand, Verzweigung, Gabelung, Knoten, kombiniertes Fragment |
| ER-Diagramm | Entität mit Attributzeilen, schwache Entität, Beziehung, (Schlüssel-, mehrwertiges) Attribut |
| Organigramm | Person, Team, offene Stelle |
| Netzwerk | Server, Datenbankserver, Internet, Firewall, Router, Switch, Laptop, Arbeitsplatz, Smartphone, Tablet, Benutzer, WLAN, Drucker, Web |
| Cloud-Architektur | Rechenleistung, Objektspeicher, verwaltete Datenbank, Warteschlange, Funktion, CDN, Lastverteiler, Container, API-Gateway, Cache, Überwachung, Geheimnisse, virtuelles Netzwerk, Ereignisse |
| Wireframes | Browser-, Smartphone- und Tablet-Rahmen, Dialog, Schaltflächen, Eingabe- und Suchfeld, Kontrollkästchen, Optionsfeld, Schalter, Auswahlliste, Reiter, Navigationsleiste, Karte, Liste, Bild- und Symbolplatzhalter, Avatar, Text, Schieberegler, Fortschrittsbalken |
Alle Formen sind Vektorgrafiken, übernehmen Füllung, Linienfarbe und -stärke aus der Leiste, lassen sich verbinden und erscheinen genauso im SVG-, PNG- und Markdown-Export. Doppelklick bearbeitet den Text; bei Klassen und Entitäten trennt eine Zeile `--` die Abschnitte (Name, Attribute, Methoden). Die Cloud-Symbole sind neutrale, eigens für Flowplan gezeichnete Symbole – keine Logos oder Symbolsätze von AWS, Azure oder Google Cloud.
**Linienenden**: Bei ausgewählten Verbindungslinien wählst du Anfang und Ende getrennt: Pfeil, offener Pfeil, Dreieck (Vererbung), Raute (Aggregation), gefüllte Raute (Komposition), Kreis, Punkt, Kreuz und die Krähenfuß-Enden für ER-Diagramme (eins, genau eins, null oder eins, viele, eins oder viele, null oder viele).
## Automatisch anordnen
Mehrere verbundene Formen auswählen → **Automatisch anordnen** → **Von oben nach unten** oder **Von links nach rechts**. Flowplan ordnet das Diagramm in Ebenen an (mit möglichst wenig Kreuzungen), die linke obere Ecke bleibt, wo sie war, und die Verbindungslinien bleiben angeheftet. Ein ++⌘ Z++ macht alles auf einmal rückgängig. Gesperrte Elemente bleiben stehen.
## Mermaid und PlantUML importieren
Füge Mermaid- oder PlantUML-Text einfach auf dem Board ein (++⌘ V++), zieh eine `.mmd`- oder `.puml`-Datei darauf oder wähle **Mermaid/PlantUML importieren …** unter **+**. Daraus werden bearbeitbare Formen und Verbindungslinien, automatisch angeordnet:
- **Mermaid**: `flowchart`/`graph` (mit Formen, Beschriftungen, Untergraphen als Rahmen), `sequenceDiagram`, `classDiagram`, `erDiagram` (mit Krähenfüßen), `stateDiagram`, `mindmap`.
- **PlantUML**: Aktivitätsdiagramme (`start`, `:Aktion;`, `if`/`else`, `while`, `fork` …), Sequenz-, Klassen-, Anwendungsfall- und Komponentendiagramme sowie `@startmindmap`.
Alles wird auf deinem Gerät gelesen – kein PlantUML-Server, kein Java. Der Dialog zeigt vorab, was erkannt wurde. Zeilen, die Flowplan nicht versteht, werden übersprungen und mit Zeilennummer aufgelistet; reine Gestaltung (`style`, `skinparam`, Themes) wird stillschweigend ignoriert. Grenzen: 100.000 Zeichen, 400 Formen, 800 Verbindungen, 40 Teilnehmer im Sequenzdiagramm, Dateien bis 200 KB.
**Als Mermaid kopieren** (im Exportmenü) kopiert die ausgewählten Formen samt Verbindungen – oder das ganze Board – als Mermaid-Flussdiagramm in die Zwischenablage, etwa für ein Mermaid-Diagramm in einem Dokument.
## Excalidraw und draw.io importieren
Über **Importieren …** unter **+** – oder indem du die Datei aufs Board ziehst – übernimmst du Zeichnungen aus:
- **Excalidraw** (`.excalidraw`),
- **draw.io / diagrams.net** (`.drawio`, `.xml`, auch komprimiert und mit mehreren Seiten) sowie **SVG-Exporte von draw.io** mit eingebettetem Diagramm.
Formen, Texte, Pfeile mit ihren Verbindungen und Beschriftungen, Freihandstriche, Rahmen, Farben, Linienstärken, Strichelungen und Drehungen werden zu Whiteboard-Elementen. Mehrere draw.io-Seiten landen nebeneinander, jede in einem eigenen Rahmen. Was Flowplan nicht kennt (Schablonen, Einbettungen, externe Bilder), wird zu einer Notiz mit seinem Text. Eingebettete Bilder (PNG, JPEG, GIF, WebP) werden als Dateien der Seite gespeichert und zählen zum Speicherkontingent.
- Ziehst du eine solche Datei in ein **Dokument**, entsteht darunter ein neues Whiteboard, das gleich eingebettet wird.
- Im **ZIP-Import** (siehe [Importieren](/import-export-versions#importieren)) werden `.excalidraw`- und `.drawio`-Dateien zu Whiteboard-Seiten.
- Grenzen: 20 MB je Datei (30 MB entpackt), 3.000 Elemente, 50 Seiten. Flowplan lädt beim Import nichts aus dem Internet; Texte werden als reiner Text übernommen.
## Wireframes und klickbare Prototypen
Mit den Wireframe-Formen skizzierst du Bildschirme, am besten je Bildschirm einen **Rahmen** (z. B. mit dem Smartphone-Rahmen darin). Wähle ein Element aus – eine Schaltfläche, eine Form, einen Zettel – und stelle in der Leiste **Bei Klick → Rahmen** ein, oder **Bei Klick → zurück**. Ein kleines Pfeilsymbol am Element zeigt die Verknüpfung.
**Prototyp abspielen** (erscheint, sobald es Rahmen gibt) zeigt den ausgewählten Rahmen – oder den ersten – bildschirmfüllend. Klicks auf verknüpfte Elemente wechseln den Bildschirm; ein Klick daneben oder der Knopf **Klickbare Stellen zeigen** hebt kurz alle klickbaren Stellen hervor. **Zurück** (← ), **Neu starten** (Pos1 ) und Esc zum Beenden. Verknüpfte Elemente sind auch per Tastatur erreichbar (Tab , Enter ).
Beim Kopieren, Duplizieren und Einfügen zeigen Verknüpfungen auf die mitkopierten Rahmen; Archive und Exporte behalten sie.
## Zeitleisten (Roadmaps)
**Zeitleiste** unter **+** (oder in der Formenbibliothek unter „Planung“) legt eine Roadmap mit Zeitskala, Spuren und Balken an. Ist die Zeitleiste ausgewählt, verschiebst du Balken direkt auf dem Board – auch in eine andere Spur – und ziehst an ihren Enden, um Beginn oder Ende zu ändern. Eine rote Linie markiert heute.
Doppelklick oder **Zeitleiste bearbeiten** öffnet die Einstellungen: Titel, Skala (**Wochen**, **Monate**, **Quartale**), Zeitraum (bis etwa drei Jahre), Heute-Markierung, Spuren und Balken mit Titel, Spur, Daten und Farbe (bis 40 Spuren und 400 Balken).
Als **Quelle** kannst du statt eigener Balken eine **Datenbank** wählen: Die Einträge mit Datum werden zu Balken (Beginn, optional Ende), eine Auswahl-Eigenschaft liefert die Spuren. Die Zeitleiste ist live: Sie zeigt den aktuellen Stand, und wer die Einträge bearbeiten darf, verschiebt mit einem Balken die Daten des Eintrags (eine Uhrzeit bleibt erhalten). Jede Person sieht nur die Einträge, die sie in der Datenbank lesen darf; die Einträge werden nicht im Board gespeichert und erscheinen deshalb nicht in Exporten oder der Suche des Boards.
---
# Whiteboards: gemeinsam, mit KI und präsentieren
Live mit anderen auf einem Board, Zettel als Datenbankeinträge, KI für Ideen und Gruppen, Rahmen als Folien präsentieren und mit Vorlagen starten.
## Gemeinsam arbeiten
- **Live-Cursor**: Du siehst die Mauszeiger der anderen mit Namen in Echtzeit, wie in Miro. Wer außerhalb deines Ausschnitts arbeitet, erscheint als Markierung am Rand; ein Klick darauf springt hin.
- Änderungen erscheinen bei allen innerhalb von Sekunden, auch nach einer Unterbrechung ohne Verbindung.
- **Timer** für Workshop-Phasen, sichtbar für alle. Auf Wunsch läuft dazu **Hintergrundmusik** (Ruhig, Fokus oder Lo-fi): im Timer-Fenster unter **Musik während des Timers** wählen. Sie startet und endet mit dem Timer für alle; Lautstärke und Stumm stellt jede Person für sich über das Lautsprecher-Symbol im Timer ein. Blockiert der Browser den Ton, weil auf der Seite noch nichts angeklickt wurde, erscheint **Ton an**. Die Musik entsteht im Browser, ohne Audiodateien und ohne externe Dienste.
- **Abstimmung**: Stimmen pro Person festlegen, starten; alle vergeben Punkte auf Elemente, das **Ergebnis** zeigt die Reihenfolge. **Verdeckt abstimmen** zeigt jeder Person nur die eigenen Stimmen, bis die Abstimmung endet – so beeinflusst niemand die anderen.
- **Folge mir** (unter **Moderation**): Alle anderen sehen deinen Ausschnitt und folgen dir beim Verschieben und Zoomen. Wer selbst schiebt oder zoomt, hört auf zu folgen und kann mit **Folgen** zurück. **Beenden** hebt es für alle auf.
- **Kommentare** an Stellen der Fläche, mit Antworten und Erwähnungen.
- **Privater Modus** (Auge-durchgestrichen-Symbol) für stilles Brainstorming: Wer das Whiteboard bearbeiten darf, startet ihn für das ganze Whiteboard oder nur für einen **Rahmen**. Solange er läuft, sieht jede Person nur ihre eigenen neuen Zettel und Elemente in diesem Bereich (gestrichelt markiert, „nur für dich“); von den anderen erscheint nur die **Anzahl** als verdeckte Platzhalter – ohne Text und ohne Namen. **Aufdecken** zeigt alle Beiträge gleichzeitig allen und beendet den Modus; das kann jede Person mit Bearbeitungsrecht, auch wenn die Moderation den Raum verlassen hat. Private Inhalte bleiben auf dem Server getrennt gespeichert und erreichen bis zum Aufdecken weder die Browser der anderen noch Suche, Exporte, Vorschauen, API oder KI-Funktionen. Neu laden, ein zweiter Tab oder später Dazukommende sind kein Problem; Änderungen ohne Verbindung werden nachgereicht.
- **Schätzen (Planning Poker)**: Zettel oder Datensatzkarten auswählen – oder einen Rahmen, dann alle darin – und **Schätzen** wählen. Als Kartensatz gibt es Fibonacci (1, 2, 3, 5, 8, 13, 21, ?, ☕), T-Shirt-Größen (XS–XL) oder eigene Werte. Alle wählen verdeckt eine Karte; zu sehen ist nur, wer schon geschätzt hat. **Karten aufdecken** zeigt die Verteilung, Durchschnitt, Median und ob es einen **Konsens** gibt. **Ergebnis übernehmen** schreibt den Wert als Etikett an den Zettel – bei Datensatzkarten in eine Zahl-, Auswahl- oder Text-Eigenschaft des Eintrags (mit den üblichen Rechten). Danach **Nächstes Element** oder **Neu schätzen**.
- **Alle zu mir holen**: Alle anderen springen einmal zu deinem aktuellen Ausschnitt – anders als bei „Folge mir“ bewegen sie sich danach wieder frei. Mit einem ausgewählten Rahmen holt das Magnet-Symbol alle **zu diesem Rahmen**. Die anderen sehen einen Hinweis („Mara hat alle hierher geholt“) und kommen mit **Zurück** an ihre vorige Stelle.
## Zettel als Datenbankeinträge
Aus einem Brainstorming wird ein Backlog: Zettel auswählen → in der Leiste **Als Einträge in Datenbank …** (Datenbank-Symbol). Ohne Auswahl nimmt der Dialog die Zettel im sichtbaren Bereich, mit einem ausgewählten Rahmen dessen Zettel. Das funktioniert auch ganz ohne KI.
::: steps
1. **Ziel-Datenbank** wählen – angeboten werden Datenbanken, in die du Einträge schreiben darfst.
2. **Zuordnung:** Die erste Zeile des Zettels wird zum **Titel**, weitere Zeilen zum Inhalt des Eintrags. Optional wird die **Farbe** zu einer Auswahl-Eigenschaft (für jede Zettelfarbe eine Option; gleichnamige Optionen wie „Gelb“ oder „Rot“ sind vorbelegt) und der **Autor** des Zettels zu einer Personen-Eigenschaft.
3. **Durch Karten ersetzen** tauscht die Zettel gegen Eintragskarten an derselben Stelle – Verbindungslinien hängen danach an der Karte. **Behalten und verknüpfen** lässt die Zettel stehen und legt die Karten daneben, mit einer gestrichelten Linie verbunden.
:::
Die Karten sind live: Ändert jemand den Eintrag in der Datenbank, zeigt das Board es sofort. Andere sehen die neuen Karten wie jede Änderung; ein ++⌘ Z++ nimmt die Änderung am Board in einem Schritt zurück (die Einträge bleiben in der Datenbank).
- Höchstens 500 Zettel auf einmal; der Server legt sie in Paketen zu 100 an, ein Fortschritt zeigt den Stand, **Abbrechen** hält an – was schon angelegt ist, kommt aufs Board.
- Ein zweiter Versuch nach einem Fehler legt nichts doppelt an.
- Werte werden geprüft wie jede Bearbeitung: gesperrte Eigenschaften, vorhandene Optionen, nur Mitglieder als Personen.
- **Mit KI aufteilen** (wenn KI für dich verfügbar ist): Die KI liest den Text der Zettel und füllt weitere Eigenschaften – etwa Verantwortlich, Fälligkeit oder Priorität. Erst eine **Vorschau** zeigt die Werte je Zettel, Unpassendes steht mit Grund daneben; angelegt wird erst danach.
- Über die [API](/api-and-webhooks) heißt der Befehl `whiteboard.toRecords`.
## KI auf dem Whiteboard
Ist [KI](/ai) für dich eingeschaltet, öffnet **KI** unter **+** (am Handy unter **Weitere Werkzeuge**) diese Funktionen. Ohne KI fehlt der Knopf, alles andere funktioniert wie gewohnt; auf Boards, die die KI nicht lesen darf, sind die Einträge ausgegraut mit dem Grund.
- **Nach Thema gruppieren (KI)** – auch im Menü **Anordnen**, sobald zwei Zettel ausgewählt sind: Die KI findet Themen in den ausgewählten Zetteln (ohne Auswahl: im sichtbaren Bereich) und ordnet sie in beschrifteten Spalten an, wie **Nach Farbe gruppieren**. Zettel ohne Text und solche, die nirgends passen, landen unter „Sonstiges“.
- **Zusammenfassen als Seite** – liest das Board (oder die Auswahl bzw. den ausgewählten Rahmen) und legt daneben eine Seite an: Zusammenfassung, Themen, **Entscheidungen**, **Offene Fragen** und **Aufgaben**, mit einem Link zurück zum Board. Mit **Aufgaben übernehmen** werden die Aufgaben echte Aufgaben mit Person und Termin, wenn das Board sie nennt – sie erscheinen in **Meine Aufgaben**. Rahmen werden zu Abschnitten; große Boards liest die KI in Teilen, und die Seite nennt, was über die Grenze von 2.000 Elementen hinaus weggelassen wurde.
- **Mit KI erzeugen …** – eine **Mindmap** oder ein **Flussdiagramm** aus einer Beschreibung, etwa „Ablauf einer Urlaubsanfrage mit Genehmigung“. Es entsteht in der Mitte des sichtbaren Bereichs (oder rechts daneben, wenn dort schon etwas liegt) aus normalen Formen und Verbindungslinien; die Mindmap nutzt das Layout von **Mindmap anordnen**. Höchstens 60 bzw. 40 Knoten.
Jede Aktion zeigt ihren Fortschritt und lässt sich **abbrechen**; ein Fehler steht mit **Erneut versuchen** im Dialog. Das Ergebnis ist eine gewöhnliche Änderung am Board: Alle sehen sie live, und **ein** ++⌘ Z++ nimmt sie ganz zurück. Verdeckte Zettel bleiben vor der KI verborgen, verknüpfte Seiten und Einträge liest sie nur, wenn sie sie lesen darf.
## Rahmen-Übersicht
**Rahmenübersicht** (im Menü **…** der Leiste unten, **Ansicht und Aktionen**) listet alle Rahmen mit kleiner Vorschau – auf dem Handy als Blatt von unten.
- Ein Klick auf die Vorschau fährt zum Rahmen; der Name lässt sich direkt umbenennen.
- **Ziehen** am Griff (oder ⌥ + Pfeiltasten) ändert die Reihenfolge – sie ist die Reihenfolge der Präsentation und wird mit dem Board gespeichert. Solange niemand sortiert, gilt die Leserichtung (von oben nach unten, links nach rechts).
- **In der Präsentation ausblenden** (Augensymbol) lässt einen Rahmen beim Präsentieren aus, ohne ihn zu löschen.
- **Sprechernotizen** je Rahmen, sichtbar nur in der Präsentation.
- Außerdem: **Link zu diesem Element kopieren**, **Rahmen exportieren** und **Ab hier präsentieren**.
## Präsentieren
Sobald es Rahmen gibt, erscheint **Präsentieren** in der Leiste unten links; die Pfeile daneben fahren auch ohne Präsentation zum vorigen bzw. nächsten Rahmen. Die Rahmen werden in der Reihenfolge der Rahmen-Übersicht nacheinander bildschirmfüllend gezeigt, ausgeblendete Rahmen fehlen; alles außerhalb des aktuellen Rahmens tritt zurück. Pfeiltasten oder die Knöpfe blättern, **Präsentation beenden** oder Esc schließt.
- **Sprechernotizen** blendet die Notizen des Rahmens ein.
- **Referentenansicht** öffnet dieselbe zweite Ansicht wie bei [Dokumenten](/reading-and-presenting#sprechernotizen-und-referentenansicht): aktuelle und nächste Folie, die Notizen und die verstrichene Zeit. Beide Fenster bleiben im Gleichschritt – Blättern geht in jedem von beiden.
## Vorlagen
**Vorlagen** öffnet eine durchsuchbare Galerie mit Vorschau, nach Kategorien sortiert:
| Kategorie | Vorlagen |
| --- | --- |
| Retrospektiven | Retrospektive, 4L-Retrospektive, Seestern-Retrospektive |
| Planung | Kanban, User Story Map, Sprint-Planung, Projektzeitplan, Eisenhower-Matrix, Aufwand-Nutzen-Matrix |
| Strategie | OKR, SWOT-Analyse, Lean Canvas, Business Model Canvas, Customer Journey |
| Ideen | Empathy Map, Brainstorming, Mindmap |
| Diagramme | Flussdiagramm, Entscheidungsbaum, Organigramm |
| Besprechungen | Besprechungsagenda, Eisbrecher |
Eine Vorlage landet in der Mitte der Ansicht und ist danach normaler Inhalt des Boards.
**Eigene Vorlagen**: Unter **Als Vorlage speichern** wird das ganze Board oder die Auswahl zur Vorlage – **Für den Arbeitsbereich** oder **Nur für mich**. Kommentare, Stimmen und Stempel bleiben draußen, Bilder und PDFs bleiben Dateien des Arbeitsbereichs. Eigene Vorlagen stehen im Reiter **Eigene Vorlagen**; löschen können sie die Person, die sie gespeichert hat, und Besitzer. Höchstens 500 Vorlagen je Arbeitsbereich.
Mehr Whiteboard-Vorlagen aus der Community findest du im [Flowplan Marketplace](https://marketplace.flowplan.org).
---
# Racks und Verkabelung
Auf einem Whiteboard planst du Server-Racks: Racks mit ihren Höheneinheiten (HE), Geräte darin, Ports an den Geräten und Kabel von Port zu Port. Racks und Geräte sind Elemente wie Zettel und Formen – du kombinierst sie frei mit Notizen, Text, Rahmen und Netzwerkdiagrammen aus der [Formenbibliothek](/whiteboard-diagrams#diagramme-formenbibliotheken). Gemeinsames Arbeiten, Rückgängig, Kommentare, Präsentieren und der Export als SVG, PNG oder PDF funktionieren wie bei allen anderen Elementen.
## Racks anlegen
**Racks** unter **+** öffnet die Gerätebibliothek (auf dem Smartphone unter **Weitere Werkzeuge** als Blatt). Oben legst du ein **Rack 42 HE**, **Rack 24 HE** oder einen **Wandschrank 12 HE** an – per Klick neben das letzte Rack oder per Ziehen an eine Stelle. Mehrere Racks stehen so nebeneinander.
Ein ausgewähltes Rack zeigt rechts seine **Details**: Name, Standort, Höhe in HE (1–60), Breite (10″, 19″ oder 23″), **Ansicht** Vorder- oder Rückseite, **Max. Leistung** (W) und **Max. Gewicht** (kg), dazu die belegten HE, die Summe aus Leistung und Gewicht und die Liste der Geräte. Die Höhe änderst du auch mit den Griffen oben und unten am Rack. **Vorne/Hinten** in der Leiste über dem Rack dreht es um.
## Geräte einbauen
Die Bibliothek enthält Server (1, 2 und 4 HE), Speicher/NAS, Switches (24 und 48 Ports, 24 × SFP+, jeweils mit SFP-Uplinks und Konsole), Patchfelder (24 und 48 Ports, LWL mit 24 × LC), Router, Firewall, USV, PDU (1 HE und senkrecht als 0 HE), Blindplatten, Kabelführung und Fachböden – jeweils mit Höhe, Ports, Leistung und Gewicht.
- **Ziehen** legt ein Gerät an eine Stelle: über einem Rack rastet es an ganzen HE ein, daneben liegt es frei auf dem Board.
- **Klicken** (oder Enter im Suchfeld) setzt es in das ausgewählte Rack – oder in das Rack in der Mitte der Ansicht – an den obersten freien Platz. Ist das Rack voll, liegt das Gerät daneben.
- Eingebaute Geräte verschiebst du mit der Maus in andere HE oder in ein anderes Rack; mit ↑ /↓ um eine HE (⇧ : fünf HE), mit ++⌥ ↑/↓++ änderst du die Höhe. Die Griffe oben und unten ändern die Höhe ebenfalls in ganzen HE.
- **Duplizieren** (++⌘ D++) setzt die Kopie an den nächsten freien Platz desselben Racks. Wird ein Rack gelöscht, gehen seine Geräte mit.
- Überschneiden sich zwei Geräte oder ragt eines aus dem Rack, werden beide rot schraffiert und mit **!** markiert; das Rack zählt sie in seinen Details.
Geräte können **halbe Tiefe** haben (vorne oder hinten eingebaut): Ein vorderes und ein hinteres Gerät teilen sich dann dieselben HE. In der anderen Ansicht erscheinen sie nur als gestrichelter Umriss. Senkrechte PDUs baust du als **0 HE links/rechts** in den seitlichen Kanal.
Die **Details** eines Geräts: Name, Art, **Rollen**, Hersteller, Modell, Seriennummer, **Hostname**, **IP-Adressen**, **MAC-Adresse**, Höhe, Position (unterste HE), Einbau, Tiefe, Farbe, Leistung (W), Gewicht (kg), Notizen – bei PDU und USV auch **Belastbar bis** (W) mit der aktuellen Last. **Aus dem Rack nehmen** legt es neben das Rack.
- **Rollen** sind freie Schlagwörter mit Vorschlägen wie Docker-Host, Hypervisor, Bare-Metal, NAS, Router oder Firewall.
- **IP-Adressen** nimmt eine oder mehrere IPv4- oder IPv6-Adressen (auch mit `/24`), getrennt durch Komma, Leerzeichen oder Zeilenumbruch. Ungültige Einträge werden nicht gespeichert und beim Verlassen des Felds angezeigt. Die **MAC-Adresse** wird einheitlich als `aa:bb:cc:dd:ee:ff` gespeichert, egal ob mit `-`, `.` oder ohne Trennzeichen eingegeben.
- Netzwerk-Ports (RJ45, SFP/QSFP) haben zusätzlich eine eigene MAC- und IP-Adresse – jede Netzwerkkarte hat ihre eigene.
- Fährt die Maus kurz über ein Gerät, zeigt eine **Visitenkarte** alles auf einen Blick: Name, Art, Rollen, Hostname, IP- und MAC-Adressen (je mit Knopf zum Kopieren), Hersteller und Modell, Höhe und Position, Leistung, belegte Ports und den Anfang der Notizen. Auf dem Telefon oder Tablet öffnet langes Drücken die Karte, mit der Tastatur I für das ausgewählte Gerät; Esc schließt sie.
- Suche, Markdown- und CSV-Export und der [NetBox-Import](/whiteboard-racks) übernehmen Hostname, Adressen und Rollen (aus NetBox: primäre IP mit DNS-Name, MAC und IP der Schnittstellen, Rolle und Tags). **Als eigenes Gerät speichern** lässt Hostname und Adressen weg.
**Als eigenes Gerät speichern** legt das Gerät mit seinen Ports und Werten in der Bibliothek des Arbeitsbereichs ab (Abschnitt **Eigene Geräte**). Löschen dürfen es die Person, die es gespeichert hat, und Besitzer des Arbeitsbereichs.
## Ports
Jedes Gerät hat Ports mit Name, Typ (RJ45, SFP, SFP+, SFP28, QSFP+, QSFP28, LC, SC, MPO, Konsole, USB, C13, C14, C19, C20, Schuko, DC), Seite (vorne oder hinten), Bezeichnung und VLAN. Gezeichnet werden die Ports der Seite, die das Rack zeigt; verbundene Ports tragen die Farbe ihres Kabels, ein Tooltip nennt Name, Typ und Bezeichnung. In den Details änderst oder entfernst du Ports und fügst mit **Ports hinzufügen** mehrere auf einmal hinzu (Anzahl, Typ, Seite, Präfix wie `Gi1/0/`). Ein Klick auf einen Port auf dem Board zeigt ihn in den Details.
## Kabel
Kabel sind Verbindungslinien, deren Enden auf Ports sitzen: Mit dem **Verbindungswerkzeug** (L ) ziehst du von einem Port zu einem anderen – auch zwischen zwei Racks. Eine Linie, die auf einem Port beginnt oder endet, wird zum Kabel; der Typ richtet sich nach den Ports (Strom, Konsole, Glasfaser, DAC oder Cat6a). Ohne Zeichnen geht es in den Details eines Geräts: **Verbinden …** am Port, dann Gerät und freien Port wählen.
Kabel laufen wie in einem aufgeräumten Rack: vom Port zur Kante des Geräts, durch den seitlichen Kanal und zwischen Racks über die Racks hinweg; jedes Kabel hat seine eigene Spur. Liegen sich zwei Ports direkt gegenüber – an der Unterkante des oberen und der Oberkante des unteren Geräts, oder an derselben Kante eines Geräts – und steht kein anderes Gerät dazwischen, läuft das Kabel gerade hinüber statt durch den Kanal. Farbe und Strich richten sich nach dem Typ (z. B. OM3 türkis, OM4 violett, OS2 gelb, Strom dick, DAC gestrichelt), eine eigene Farbe hat Vorrang. Fährst du über ein Kabel oder wählst es aus, leuchten beide Enden auf. **Kabel zeigen** im Menü der Ansicht blendet alle Kabel aus und wieder ein (die Wahl gilt in diesem Browser).
Die **Details** eines Kabels: die beiden Enden (ein Klick springt zum Gerät und Port), Kabeltyp (Cat5e, Cat6, Cat6a, Cat7, Cat8, OM3, OM4, OM5, OS2, DAC, AOC, Strom, Konsole, Sonstiges), Farbe, Beschriftung, Länge in Metern, VLAN und Notizen. Steckt auf einem Port mehr als ein Kabel, weisen die Details darauf hin.
## Strom und Gewicht
Leistung und Gewicht der Geräte ergeben die Summen je Rack (im Rack-Kopf und in den Details). Stromkabel von einer PDU oder USV zu einem Gerät ergeben die Last der PDU: Ein Gerät mit zwei Netzteilen an zwei PDUs verteilt seine Leistung auf beide, eine PDU an einer USV gibt ihre ganze Last an die USV weiter. Überschreitet ein Rack seine **Max. Leistung** oder sein **Max. Gewicht** oder eine PDU/USV ihre Belastbarkeit, erscheint eine Warnung im Rack-Kopf, am Gerät und in den Details.
## Ports und Kabel im Überblick
**Ports und Kabel** (im Menü der Ansicht und in der Gerätebibliothek) zeigt alle Ports des Boards als Tabelle – Rack, Gerät, Port, Typ, verbunden mit, Kabel, VLAN – und alle Kabel mit Beschriftung, Typ, Enden, Länge und VLAN. Filtern nach Text, Kategorie (Netzwerk, Glasfaser, Strom) und Belegung (verbunden, frei), Sortieren per Klick auf die Spaltenköpfe; ein Klick auf eine Zeile zeigt das Gerät oder Kabel auf dem Board. **Als CSV exportieren** lädt die gefilterte Liste herunter, **Etiketten drucken** druckt für jedes Kabel ein Etikett je Ende (Beschriftung, dieses Ende, das andere Ende, Typ, Länge, VLAN).
## Importieren und exportieren
- **JSON exportieren** (Gerätebibliothek) speichert die Racks mit Geräten, Ports und Kabeln – die ausgewählten oder alle – als Datei; **JSON importieren** legt sie auf ein Board. So übernimmst du Racks in andere Boards und Arbeitsbereiche.
- **Aus NetBox …** holt Racks aus [NetBox](https://netboxlabs.com/): NetBox-Adresse, ein API-Token (Lesen genügt) und optional Standort (Slug) und Racknamen eingeben. Flowplan fragt Racks, Geräte, Gerätetypen (Höhe, Tiefe, Gewicht), Schnittstellen, Front- und Rear-Ports, Konsole, Strom-Ports und Kabel einmal ab und legt sie auf das Board (bis 20 Racks). Adresse und Token werden nur für diese Abfrage verwendet und nicht auf dem Server gespeichert; **Adresse und Token in diesem Browser merken** speichert sie nur in deinem Browser. NetBox muss über eine öffentliche HTTPS-Adresse erreichbar sein – für ein NetBox im internen Netz siehe `NETBOX_ALLOW_PRIVATE` in der [Konfiguration](/configuration-integrations#integrationen).
- Der **SVG-, PNG- und PDF-Export** des Boards zeigt die Racks, wie sie auf dem Board stehen. Der **Markdown-Export** enthält zum SVG-Bild des Boards einen Abschnitt **Racks und Verkabelung** mit den Geräten je Rack, der Portbelegung und der Kabelliste als Tabellen.
Die KI und [MCP](/mcp) (`read_page`) lesen die Racks, Geräte, Ports und Kabel eines Boards als Text mit. Auf dem Smartphone siehst du Racks und bearbeitest sie: Tippen wählt ein Gerät, **Details** in der Leiste öffnet die Details als Blatt, die Gerätebibliothek liegt unter **Weitere Werkzeuge**.
---
# Dashboards
Eine Seite aus Kacheln: Kennzahlen, Diagramme und Ansichten deiner Datenbanken, fällige Aufgaben, deine Journal-Serie und Notizen – auf einen Blick und für jede Person mit genau den Daten, die sie sehen darf.
## Dashboard anlegen
**Neue Seite → Dashboard** (oder `> Neues Dashboard` in der Schnellsuche). Ein neues Dashboard ist leer; **Erste Kachel hinzufügen** öffnet die Einstellungen der ersten Kachel.
## Kacheln
| Kachel | Zeigt |
| --- | --- |
| **Datenbankansicht** | Eine Ansicht einer Datenbank, wie sie die verknüpfte Datenbank im Dokument zeigt. Mit **Einträge hier bearbeitbar** lassen sich Einträge direkt im Dashboard ändern, sonst nur lesen. |
| **Kennzahl** | Die Anzahl der Einträge einer Ansicht (mit ihren Filtern) oder Summe, Mittelwert, Minimum bzw. Maximum einer Zahl-Eigenschaft. Mit einem **Ziel** erscheint ein Fortschrittsbalken. |
| **Diagramm** | Säulen, Balken, Linie oder Donut über eine Eigenschaft – gezeichnet wie die Diagrammansicht; ein Klick auf einen Eintrag öffnet ihn. |
| **Journal-Serie** | Wie viele Tage in Folge du in einem Journal geschrieben hast, dazu der heutige Eintrag oder **Heute schreiben**. |
| **Meine fälligen Aufgaben** | Deine Aufgaben aus **Meine Aufgaben**, die heute fällig oder überfällig sind. |
| **Zuletzt geändert** | Die zuletzt geänderten Seiten und die Zahl ungelesener Benachrichtigungen im [Posteingang](/notifications#posteingang). |
| **Text** | Freier Text in Markdown – für Überschriften, Hinweise oder Links. |
## Anordnen und Größe
**Bearbeiten** oben rechts schaltet in den Bearbeitungsmodus:
- **Kachel hinzufügen** legt eine neue Kachel an.
- Kacheln **ziehen**, um die Reihenfolge zu ändern – oder im Kachel-Menü (**…**) **Nach vorne**/**Nach hinten**.
- Im Kachel-Menü die **Größe** wählen: Klein (ein Viertel), Mittel (die Hälfte), Groß (zwei Drittel) oder Volle Breite. Auf dem Telefon stehen alle Kacheln untereinander.
- **Einstellen …** ändert Quelle, Titel und Werte; **Entfernen** löscht die Kachel.
Kacheln unterschiedlicher Höhe lassen keine Lücken: Die erste Reihe folgt der Reihenfolge von links nach rechts, danach rückt jede Kachel nach oben in die Spalte, in der darüber am wenigsten steht. Breite Kacheln stehen unter der niedrigsten Stelle der Spalten, die sie überdecken. Im Bearbeitungsmodus siehst du dieselbe Anordnung.
**Fertig** beendet den Bearbeitungsmodus. Jede Änderung wird sofort gespeichert.
## Rechte
- Kacheln anlegen und ändern dürfen Personen mit Bearbeitungsrechten an der Seite; Leserinnen und Leser sehen das Dashboard nur an.
- Jede Kachel rechnet mit den Rechten der Person, die das Dashboard ansieht: Private Einträge zählen nur für die, die sie sehen dürfen. Eine Kachel über eine Datenbank oder ein Journal, das jemand nicht lesen darf (oder das per PIN gesperrt ist), zeigt dieser Person nur **Nicht verfügbar** – ohne Titel oder Werte.
- Quellen müssen im selben Arbeitsbereich liegen.
## Kopieren, Export und Papierkorb
- **Duplizieren** kopiert das Dashboard mit allen Kacheln; wird eine Datenbank mitkopiert, zeigt die Kachel in der Kopie auf die Kopie.
- Der Markdown-Export enthält eine Textübersicht der Kacheln (Titel, Art, Quelle, Texte), PDF, Word und EPUB ebenso. Die Werte selbst hängen davon ab, wer schaut, und werden deshalb nicht exportiert.
- Gelöschte Dashboards liegen wie jede Seite im Papierkorb und lassen sich mit allen Kacheln wiederherstellen.
- Über die [API](/api-and-webhooks) speichert die Aktion `dashboard.save` die Kacheln einer Dashboard-Seite.
---
# Notizbücher und Handschrift
Ein **Notizbuch** ist eine Seite aus Blättern zum Beschreiben – mit dem Apple Pencil, einem anderen Tablet-Stift, der Maus oder dem Finger, wie in einem Papierheft. Die Blätter stehen untereinander, du scrollst durch sie hindurch. Jedes Blatt hat sein Papier (liniert, kariert, gepunktet, Cornell, Notenlinien …) oder eine Seite aus einem PDF als Hintergrund. Dazu gibt es **Handschrift in Dokumenten**: einen Zeichenblock mitten im Text.

## Notizbuch anlegen
**Neue Seite** → **Notizbuch** (oder in der Befehlspalette **Neues Notizbuch**). Ein neues Notizbuch beginnt mit einem Blatt in liniertem A4-Papier.
**Aus einem PDF:** Im selben Dialog unter **PDF als Notizbuch öffnen** eine Datei wählen. Jede Seite des PDFs wird ein Blatt mit dieser Seite als Hintergrund – Vorlesungsfolien, Arbeitsblätter oder Formulare beschreibst du dann wie gedruckt. In ein bestehendes Notizbuch holt **⋯ → PDF importieren …** weitere PDF-Seiten hinter das aktuelle Blatt. Bis zu 500 Seiten je Import, bis zu 1000 Blätter je Notizbuch.
**Aus GoodNotes und anderen Notiz-Apps:** Notizbücher als PDF exportieren und unter **Einstellungen → Import & Export → Import** mit der Quelle **GoodNotes** importieren – mehrere auf einmal oder als ZIP, jedes PDF wird ein Notizbuch. Schritt für Schritt: [Umzug von GoodNotes](/migrate-notes#von-goodnotes).
## Papier
| Vorlage | Aussehen |
| --- | --- |
| Leer | ohne Linien |
| Liniert (eng) | Linien im Abstand 7,1 mm (College Ruled) mit Randlinie |
| Liniert (weit) | Linien im Abstand 8,7 mm (Wide Ruled) mit Randlinie |
| Kariert (5 mm) | Rechenkaros |
| Gepunktet | Punktraster in 5 mm |
| Cornell-Notizen | Titelzeile, Stichwortspalte links, Zusammenfassung unten |
| Notenpapier | 12 Notensysteme (im Querformat 8) |
Dazu **A4** oder **Letter**, **Hochformat** oder **Querformat** und **Hell** oder **Dunkel**. Auf dunklem Papier erscheint schwarze Tinte hell, der Textmarker leuchtet.
Das Rollen-Symbol in der Leiste (oder **Papier ändern …** im Menü eines Blatts) öffnet die Auswahl. **Anwenden auf**:
- **Dieses Blatt** – nur das aktuelle Blatt bekommt eigenes Papier;
- **Standard des Notizbuchs** – gilt für alle Blätter ohne eigenes Papier und für neue Blätter;
- **Alle Blätter** – setzt den Standard und nimmt allen Blättern ihr eigenes Papier.
Blätter aus einem PDF behalten ihre PDF-Seite und deren Format.
## Schreiben
Wer die Seite bearbeiten darf, schreibt sofort – es gibt kein „Anmerken“ wie beim PDF-Viewer. Oben steht die Werkzeugleiste: **Stift** (mit Druckstärke), **Textmarker**, **Radierer** (ganze Striche oder teilweise), **Lasso** (verschieben, Größe ändern, umfärben, kopieren, duplizieren, löschen), **Text** und **Laserpointer**, drei Lieblingsstifte, Farben, Breiten und die Stifteinstellungen. Sie arbeiten wie beim [Anmerken von PDFs](/media-and-files#pdfs-anmerken): Nur der Stift schreibt, sobald du einmal mit ihm geschrieben hast, Finger blättern und zoomen, die aufliegende Hand hinterlässt keine Spuren; kurz stillhalten am Ende eines Strichs begradigt ihn zu Linie, Rechteck, Ellipse …
Alles wird beim Schreiben gespeichert (rechts in der Leiste: *Gespeichert*). Jede Änderung eines Blatts ist eine Version. Schreiben zwei Personen gleichzeitig auf dasselbe Blatt, bleiben die Striche beider erhalten; ein Hinweis sagt, dass jemand mitgeschrieben hat. Was andere schreiben, erscheint nach wenigen Sekunden.
Wer die Seite nur lesen darf, sieht alle Blätter, Zoom und Export, aber keine Werkzeuge.
Neben den festen Breiten stellt der Regler-Knopf die Strichstärke frei ein, mit Vorschau. Das **+** hinter den Farben öffnet eine eigene Farbe (Farbfeld, Farbton, Hex-Wert); zuletzt benutzte eigene Farben merkt sich das Gerät. Beim **Text** wählst du dort die Größe (8–96 pt) und die Schrift: Standard, Instrument Sans, Instrument Serif, JetBrains Mono, Caveat oder Patrick Hand. Im PDF-Export erscheinen Caveat und Patrick Hand als Helvetica, Instrument Serif als Times und JetBrains Mono als Courier.
Über ‚PDF einfügen …' (im Plus-Menü oder unter ‚Weitere Aktionen') fügst du ein PDF in ein bestehendes Notizbuch ein – vor dem ersten Blatt, nach einem beliebigen Blatt oder am Ende; in der Seitenübersicht geht das auch direkt über ‚PDF davor/danach einfügen …' im Menü eines Blatts. Jede PDF-Seite wird ein eigenes Blatt mit der Seite als Hintergrund, auf dem du wie gewohnt schreibst (höchstens 500 Seiten pro PDF, 1000 Blätter pro Notizbuch). Mit zwei Fingern zoomst du stufenlos an der Stelle zwischen den Fingern und verschiebst die Blätter; auf dem Trackpad zoomst du mit der Pinch-Geste oder Strg + Scrollen, mit dem Apple Pencil schreibst du dabei ungestört weiter.
Alle Werkzeuge im Einzelnen – Tastenkürzel, Lieblingsstifte, Formen und Lineal, Lasso, Handschrift in Text, Bilder und Sticker, Audio – stehen unter [Werkzeuge im Notizbuch](/notebook-tools).
## Seitenübersicht
**Übersicht, Inhalt und Präsentieren.** Über „Alle Blätter und Inhalt“ öffnest du alle Blätter als Raster. Tippe auf das Lesezeichen eines Blatts und filtere mit „Nur Lesezeichen“. Die Suche findet Titel, getippten Text und erkannte Handschrift und markiert die Treffer. Zum Umsortieren ziehst du ein Blatt mit der Maus, hältst es mit Finger oder Stift kurz und ziehst es, oder du verschiebst es mit Alt + Pfeiltasten. Unter „Auswählen“ (Shift für einen Bereich) duplizierst, verschiebst oder kopierst du mehrere Blätter in ein anderes Notizbuch, änderst ihr Papier, exportierst sie als PDF oder löschst sie. Gelöschte Blätter lassen sich sofort rückgängig machen und 30 Tage lang unter „Gelöschte Blätter …“ wiederherstellen. Im Tab „Inhalt“ stehen deine Kapitel (Menü eines Blatts → „Seite als Kapitel markieren“, ein- und ausrückbar, umbenennbar) und deine Lesezeichen. Ein Tipp springt hin. Mit „Link einfügen …“ verlinkst du ein anderes Blatt oder eine Seite. „Präsentieren“ zeigt das Notizbuch im Vollbild, Blatt für Blatt (Pfeiltasten, Bild↑/Bild↓, Wischen), mit Laserpointer und einem Marker, der nach ein paar Sekunden verblasst. Wer das Notizbuch gerade offen hat, auch nur lesend, sieht „Folgen“ und dann dein Blatt und deinen Zeiger live. Markierst du mit dem Lasso getippten Text, macht ‚Als Überschrift ins Inhaltsverzeichnis‘ daraus einen Eintrag im Inhalt, der an diese Stelle springt. Wählst du in der Übersicht mehrere Blätter aus, ändert ‚Papier …‘ das Papier aller ausgewählten Blätter auf einmal.
Das Seitenleisten-Symbol links in der Leiste zeigt alle Blätter als Vorschau; ein Tipp springt zum Blatt. Über **⋯** an einer Vorschau: **Neues Blatt danach**, **Duplizieren** (mit allem, was darauf steht), **Papier ändern …**, **Nach oben**, **Nach unten** und **Löschen**. Die Reihenfolge änderst du auch durch Ziehen einer Vorschau oder mit ++⌥ ↑/↓++ auf der ausgewählten Vorschau. **+** in der Leiste fügt ein Blatt **nach dem aktuellen** oder **am Ende** ein, **Blatt hinzufügen** unter dem letzten Blatt ebenso.
## Als PDF exportieren
**⋯ → Als PDF exportieren** lädt das Notizbuch als PDF: eine Seite je Blatt im Format des Blatts, das Papier und die Handschrift als Vektorgrafik (bleibt beim Vergrößern scharf), PDF-Blätter mit ihrer Originalseite samt deren Text. Der Markdown-Export legt das Notizbuch ebenfalls als PDF ins ZIP und schreibt eine kurze Markdown-Datei mit einem Link darauf und dem erkannten Text. Die PDF-, Word- und EPUB-Exporte zeigen die Blätter als Bilder (Word: nur ihren Text). Veröffentlichte und geteilte Notizbücher sind nur lesbar.
## Handschrift in Dokumenten
In einem Dokument `/zeichnen` tippen (auch `/draw`, `/dessin`, `/Handschrift` oder `/sketch`): Es entsteht ein **Zeichenblock** über die ganze Breite. Mit dem Stift schreibst du sofort darauf; mit Maus oder Finger erst nach einem Tipp in den Block (oder auf **Zeichnen**) – so blättert ein Finger weiter durchs Dokument. Dann erscheint die Werkzeugleiste mit dem **Papier** des Blocks (**Leer**, **Liniert**, **Kariert**) und **Fertig**. Am unteren Rand ziehst du die **Höhe** größer oder kleiner (oder mit den Pfeiltasten auf dem Griff).

Die Handschrift gehört zum Block und wird beim Zeichnen gespeichert. Für gemeinsames Bearbeiten heißt das: Zeichnen mehrere Personen zugleich im selben Block, werden ihre Striche zusammengeführt statt überschrieben; Text drumherum bearbeitet ihr wie immer gleichzeitig. Kopierte oder duplizierte Blöcke (auch in ein anderes Dokument) nehmen ihre Zeichnung mit und sind danach unabhängig. Rechte, Sperren und Papierkorb gelten wie für das Dokument; auf veröffentlichten Seiten, in geteilten Links und in den Exporten erscheint der Block als Bild.
## Handschrift erkennen (iPhone und iPad)
In der Flowplan-App für iPhone und iPad erkennt das Gerät selbst, was du schreibst – die Striche verlassen das Gerät dafür nicht:
- **Suche:** Kurz nach dem Speichern wird die Handschrift eines Blatts, eines Zeichenblocks oder einer PDF-Seite erkannt und ihr Text mit gespeichert. Die Suche findet Notizbücher, Dokumente und PDFs dann auch über das Handgeschriebene.
- **In Text umwandeln:** Mit dem **Lasso** Handschrift auswählen und in der Leiste der Auswahl **In Text umwandeln** (das Symbol *Aa*) wählen. Im Notizbuch und auf PDFs ersetzt getippter Text die Striche an ihrer Stelle; in einem Zeichenblock wird der Text ein Absatz unter dem Block. Rückgängig holt die Striche zurück.
Im Browser und in der Desktop-App gibt es keine Erkennung; **In Text umwandeln** erscheint dort nicht. Getippter Text auf Blättern, in Zeichenblöcken und auf PDFs ist überall durchsuchbar.
## Grenzen
- In [verschlüsselten Bereichen](/encrypted-spaces) gibt es keine Notizbücher und keine Zeichenblöcke.
- Gesperrte Seiten zeigen die Handschrift, ändern lässt sie sich erst nach dem Entsperren.
- Die Seiten-Versionen eines Notizbuchs halten nur sein Aussehen; jedes Blatt hat seine eigenen Versionen der Handschrift.
- Zeichenblöcke gibt es in Dokumenten und Journal-Tagen, nicht in den Dokumenten von Datenbank-Einträgen.
---
# Werkzeuge im Notizbuch
Stifte, Radierer, Formen, Lasso, Bilder und Audio im Notizbuch – und die Tastenkürzel, mit denen du zwischen ihnen wechselst.

## Tastenkürzel
| Taste | Wirkung |
| --- | --- |
| ++P H E L T K++ | Stift, Textmarker, Radierer, Lasso, Text, Laserpointer |
| ++⌘ Z++ / ++⇧ ⌘ Z++ | Rückgängig / Wiederholen |
| ++⌘ C++, ++⌘ V++, ++⌘ D++, Entf | Auswahl kopieren, einfügen, duplizieren, löschen |
| ⌘ + / ++⌘ −++ / ++⌘ 0++ | Vergrößern, verkleinern, an die Breite anpassen |
| ++⇧ ⌘ ↵++ | Neues Blatt nach dem aktuellen |
| ++⌥ ↓++ / ++⌥ ↑++ | Nächstes / voriges Blatt |
| ++⌘ S++ | Sofort speichern |
Unter Windows und Linux Strg statt ⌘ und Alt statt ⌥ . Auf dem iPad mit Tastatur gelten dieselben Kürzel.
## Werkzeuge, Lieblingsstifte und Radierer
Tippe auf das gewählte Werkzeug noch einmal (oder aufs Zahnrad), um seine Einstellungen zu öffnen: Strichstärke mit Vorgaben und Schieberegler, Farbe mit eigener Farbe (Farbfeld, Hex-Wert, Pipette wo der Browser sie kann), beim Text Größe und Schrift. Mit + speicherst du die aktuelle Einstellung als Lieblingsstift (bis zu 8, auch Text); sie stehen in der Werkzeugleiste und lassen sich über den Stift neben den Lieblingsstiften umsortieren oder entfernen. Lieblingsstifte gelten pro Gerät. Der Radierer kennt drei Arten: ganze Striche, nur Teile (Striche werden geteilt, Größe einstellbar) und nur Textmarker – die Schrift darunter bleibt. „Seite leeren“ löscht nach Rückfrage alles auf dem Blatt; Rückgängig holt es zurück.
**Text nachträglich gestalten.** Mit dem Text-Werkzeug ein vorhandenes Textfeld antippen: Es öffnet sich zum Bearbeiten, darüber eine Leiste mit Schrift, Größe (Voreinstellungen, Regler oder Zahl, 8–96 pt), **Fett**, *Kursiv*, Unterstrichen, Ausrichtung (links, Mitte, rechts) mit Zeilenabstand und Farbe; ++⌘ B++, ++⌘ I++ und ++⌘ U++ gehen beim Tippen. Mehrere Textfelder auf einmal: mit dem Lasso auswählen – die Auswahlleiste zeigt dann eine zweite Zeile mit denselben Einstellungen, die für alle ausgewählten Textfelder gelten; wo sie sich unterscheiden, steht „—“. Jede Änderung lässt sich einzeln rückgängig machen. „Text bearbeiten“ in der Auswahlleiste öffnet ein einzelnes Textfeld zum Tippen. Im Panel des Text-Werkzeugs legst du fest, wie neuer Text aussieht. Im PDF-Export werden Fett und Kursiv mit den Standardschriften Helvetica, Times und Courier gesetzt; die Handschrift-Schriften erscheinen dort als Helvetica. Ältere App-Versionen zeigen solchen Text ohne diese Gestaltung an; speichern sie die Seite, bleibt der Text erhalten, die Gestaltung geht verloren.
## Formen und Lineal
Halte den Stift am Ende eines Strichs kurz still: Linie, Pfeil, Rechteck, Kreis, Dreieck, Raute, Vieleck oder Stern werden begradigt – Quadrate und Kreise werden exakt, Linien rasten in 15°-Schritten ein, Enden docken an Ecken anderer Formen an. Ziehst du weiter, ohne abzusetzen, änderst du die Größe; „Rückgängig“ holt den Freihandstrich zurück. Mit dem Werkzeug **Formen** (Taste S) zeichnest du Formen direkt oder lässt sie beim Absetzen erkennen, auf Wunsch halbtransparent gefüllt oder gestrichelt; die Strichart wählst du im Panel des Werkzeugs an ihrem Linienmuster (der Name steht im Tooltip). Tippe eine Form mit dem Lasso an, um Ecken zu verschieben, zu drehen, die Größe zu ändern oder Farbe, Füllung, Strichart und Pfeilspitzen zu wechseln. Das **Lineal** in der Werkzeugleiste liegt im echten Maßstab auf dem Blatt (cm oder Zoll): mit einem Finger verschieben, mit zwei drehen (rastet bei 0/15/30/45/60/90° ein); Striche entlang der Kante werden gerade und zeigen ihre Länge. Das **Geodreieck** misst Winkel zwischen Linien, der **Zirkel** zeichnet Kreise und Bögen mit eingestelltem Radius.
## Auswählen mit dem Lasso
Mit dem Lasso (Taste ++L++) tippst du einen Strich oder Text an, um genau ihn auszuwählen, oder ziehst eine Schlinge um mehrere. Die Auswahl verschiebst du, indem du sie ziehst; die vier Ecken ändern die Größe (mit Umschalt oder dem Finger bleiben die Proportionen), der runde Griff darüber dreht sie (rastet in 15°-Schritten ein). Mit zwei Fingern auf der Auswahl skalierst und drehst du sie auf dem iPad. Die Leiste über der Auswahl ändert Farbe (auch eigene Farben) und Strichstärke, schneidet aus, kopiert, dupliziert, legt nach vorne oder hinten und löscht. Ausgeschnittenes fügst du auf einem anderen Blatt ein: Blatt antippen, dann ++⌘ V++ oder „Einfügen“. Kopiertes landet auch als Bild in der Zwischenablage für andere Apps. Jede Aktion lässt sich einzeln rückgängig machen.
## Handschrift in Text umwandeln
Ist KI auf deiner Instanz eingerichtet und für die Seite freigegeben, wandelt „In Text umwandeln“ die markierte Handschrift mit dem KI-Modell der Instanz um (es muss Bilder verstehen, z. B. ein Vision-Modell in Ollama). Der markierte Ausschnitt geht dabei als Bild an das Modell. Den erkannten Text kannst du bearbeiten und dann anstelle der Handschrift oder daneben einfügen oder kopieren. In Journalen mit PIN und auf für die KI gesperrten Seiten gibt es die Funktion nicht.
## Bilder, Sticker und eigene Papiervorlagen
**Bilder und Sticker.** Über **Einfügen** (Bildsymbol) kommen Bilder aus einer Datei, direkt von der Kamera, aus den Bildern der Seite oder als Sticker aufs Blatt; Bilder lassen sich auch einfügen (++⌘ V++) oder aufs Blatt ziehen. Ein Bild erscheint in einem Rahmen: ziehen zum Verschieben, an den Ecken zum Vergrößern (Umschalt: frei), am Griff oben zum Drehen. Der Rahmen bietet Zuschneiden, Nach vorne/Nach hinten (über oder unter die Handschrift), Deckkraft, Duplizieren, Löschen und „Als Sticker speichern“. Mit dem Lasso tippst du ein Bild an, um es wieder zu bearbeiten. Bilder sind Anhänge der Seite, in der Suche enthalten und im PDF-Export dabei. Eigene Sticker (aus Bildern oder Lasso-Auswahlen) siehst nur du, in allen Notizbüchern des Arbeitsbereichs.
**Eigene Papiervorlagen.** Im Papier-Dialog unter **Eigene › Vorlage hinzufügen …** wird ein Bild oder eine PDF-Seite (z. B. eine Planerseite) zu Papier, gestreckt oder gekachelt. Vorlagen gehören dem Arbeitsbereich; wer sie anlegt (oder ein Besitzer), kann sie umbenennen oder löschen. Blätter behalten ihr Papier, auch wenn die Vorlage gelöscht wird.
## Audio aufnehmen
Tippe in der Leiste des Notizbuchs auf das Mikrofon und wähle **Aufnahme starten**. Während die Aufnahme läuft (bis zu drei Stunden), merkt sich Flowplan zu allem, was du schreibst, den Moment in der Aufnahme. Die Leiste zeigt Zeit und Pegel; du kannst pausieren und beenden. Beim Beenden wird die Aufnahme hochgeladen und dem Notizbuch angehängt; sie zählt zum Speicher. Lädt die Seite neu oder bricht die Verbindung ab, bleibt die Aufnahme auf dem Gerät und Flowplan bietet beim nächsten Öffnen an, sie zu speichern.
Zum Abspielen wähle die Aufnahme in der Liste. Was zu dieser Aufnahme geschrieben wurde, ist zunächst blass und erscheint, sobald die Aufnahme die Stelle erreicht. Mit **Ab hier abspielen** (Hand-Symbol) oder langem Drücken mit dem Finger springst du zu dem Moment, in dem etwas geschrieben wurde. Geschwindigkeit: 1×, 1,5×, 2×. Aufnahmen lassen sich umbenennen, herunterladen und löschen (sie kommen in den Papierkorb); sie gehen mit Kopien und Exporten des Notizbuchs mit. In der App muss Flowplan das Mikrofon nutzen dürfen (Einstellungen › Flowplan › Mikrofon).
---
# Journal
Ein Journal ist eine Seite mit einer Unterseite pro Tag. Morgens liegt die heutige Seite bereit, offene Aufgaben von gestern stehen schon darauf.

## Journal anlegen
**Neue Seite → Journal**. Die Seite zeigt oben **Heute** und darunter die vergangenen Tage mit relativen Angaben wie „Gestern“. Die Tagesseiten heißen automatisch nach dem Datum, etwa „Samstag, 26. September 2026“.
## Wie ein Tag entsteht
- Beim ersten Öffnen eines neuen Tages legt Flowplan dessen Seite an. Der Tag beginnt um Mitternacht in deiner Zeitzone.
- **Offene Aufgaben** vom letzten Tag ziehen um – samt verschachtelter Unteraufgaben. Dazu zählen auch Aufgaben **in Arbeit** `[/]`, **verschobene** `[>]` und solche mit einem anderen Obsidian-Symbol wie `[?]`; erledigte und **abgebrochene** `[-]` bleiben auf ihrem Tag, ebenso leere Aufgaben ohne Text. Ein kleines ↻ an der Ecke des Kästchens zeigt, dass eine Aufgabe von einem früheren Tag übernommen wurde.
- Erledigte Aufgaben und der übrige Text bleiben auf ihrem Tag.
- **Leere Tage verschwinden**: Hat ein Tag außer übernommenen Aufgaben nichts Eigenes bekommen, wird er beim nächsten Tag wieder entfernt. Das Journal enthält so nur Tage, an denen etwas passiert ist.
### Seite des Tages anlegen: automatisch oder beim ersten Schreiben
Unter **Journal einrichten → Tage** legst du fest, wann die heutige Seite entsteht:
- **Automatisch** (Standard): wie oben beschrieben, sobald der Tag beginnt und das Journal oder die App geöffnet wird.
- **Beim ersten Schreiben**: **Heute** zeigt zuerst einen **Entwurf** mit der Vorlage und den Aufgaben, die vom letzten Tag übernommen würden. Gespeichert ist noch nichts – oben steht „Entwurf – wird beim ersten Schreiben angelegt“. Erst der erste Tastendruck, eine abgehakte Aufgabe, ein Tracker-Wert, ein Ort oder eine Datei legt die Seite an. Bis dahin bleiben übernommene Aufgaben auf ihrem Tag, und der Entwurf erscheint weder in der Seitenleiste noch in Suche, Graph oder Export.
Der Entwurf ist auf allen Geräten derselbe: Beginnen zwei Geräte gleichzeitig zu schreiben, entsteht trotzdem genau eine Seite, und beide Texte landen darin. Hat sich inzwischen geändert, womit der Tag beginnt (etwa weil gestern auf einem anderen Gerät eine Aufgabe abgehakt wurde), öffnet Flowplan die gespeicherte Seite und sagt das. Offline Getipptes bleibt auf dem Gerät und legt die Seite an, sobald die Verbindung wieder da ist.
Jeder Tag merkt sich, aus welcher Fassung der Vorlage er entstanden ist. Ein Tag, auf dem nur diese Vorlage steht, gilt auch dann als leer, wenn die Vorlage später geändert wurde.
### Leere Tage entfernen
**Journal einrichten → Tage → Leere Tage suchen** listet alte Tage, an denen nichts geschrieben wurde: nur die Vorlage, keine eigenen offenen Aufgaben, keine Tracker-Werte oder Orte, keine Dateien, Kommentare, Unterseiten, Favoriten, Freigaben oder Links von anderen Seiten, Titel und Symbol unverändert (Groß- und Kleinschreibung oder Leerzeichen zählen nicht als Änderung). Heute bleibt immer. Du wählst ab, was bleiben soll, und verschiebst den Rest mit **… Tage in den Papierkorb** – von dort lassen sich Tage wiederherstellen. Flowplan entfernt oder fasst alte Tage nie von sich aus zusammen.
## Tagesvorlage
**Journal einrichten** (Zahnrad auf der Journalseite) → **Vorlage**: Jeder neue Tag beginnt mit diesem Inhalt, etwa „Dankbar für“, „Fokus heute“ und „Rückblick am Abend“. Zur Wahl stehen fertige Vorlagen (Dankbarkeit & Fokus, 5-Minuten-Journal, Arbeitslog, Tagesrückblick); **Heutigen Tag übernehmen** macht den aktuellen Tag zur Vorlage. Aufgaben aus der Vorlage kommen jeden Tag neu und werden nicht zusätzlich übernommen. Ein Tag, auf dem nur die Vorlage steht, gilt als leer und verschwindet wie jeder leere Tag.
**Übernommene Aufgaben** (ebenfalls unter **Vorlage**) legt fest, wo die offenen Aufgaben des Vortags in einem neuen Tag stehen: **Oben** (Voreinstellung, vor der Vorlage), **Nach der Vorlage** oder **Unter der Überschrift …** – zur Wahl stehen die Überschriften der Vorlage. Mit einer Überschrift kommt die Aufgabenliste direkt darunter, vor das, was die Vorlage dort vorsieht. Fehlt die Überschrift später in der Vorlage, stehen die Aufgaben nach der Vorlage. Das gilt für Tage, die automatisch entstehen, genauso wie für den Entwurf bei **Beim ersten Schreiben**.
## Tracker, Ort und Termine
Über jedem Tag steht eine Leiste:
- **Tracker**: Stimmung (😞 bis 😄), Skalen von 1 bis 5, Zahlen mit Einheit (z. B. Schlaf in Stunden) oder Ja/Nein (z. B. Sport). Welche es gibt, legst du unter **Journal einrichten → Tracker** fest.
- **Ort**: frei eintragen; **Standort** speichert zusätzlich die Koordinaten des Geräts mit einem Link zur Karte.
- **Termine**: Einträge aller Datenbanken mit Datum, die du sehen darfst, samt Wiederholungen. Unter **Journal einrichten → Kalender** lässt sich zusätzlich ein Kalender per iCal-Link einbinden (Google, Apple, Outlook, Nextcloud …).
### An diesem Tag erledigt
Unter jedem Tag steht **An diesem Tag erledigt**: die Einträge aus Datenbanken, die an diesem Tag erledigt wurden, und die Aufgaben, die an diesem Tag in einem Dokument abgehakt wurden – auch die deiner Seite „Aufgaben“ aus **Meine Aufgaben** – jeweils mit Uhrzeit, Link und Name der Datenbank bzw. Seite. Aufgaben tragen ein kleines Aufgaben-Symbol. Die Liste wird bei jedem Öffnen neu berechnet und nicht in den Tag kopiert; hakst du einen Eintrag anderswo ab (auch in einem anderen Tab), steht er beim Zurückkommen darin.
- Ein Eintrag zählt an dem Tag, an dem er zuletzt erledigt wurde, und nur, solange er nach der Erledigt-Regel seiner Datenbank noch erledigt ist – wird er wieder geöffnet, verschwindet er aus der Liste. Der Tag richtet sich nach deiner Zeitzone.
- **Alle / Nur meine** oben in der Liste: **Nur meine** (Voreinstellung) zeigt die Einträge, die du selbst erledigt hast, und die, die dir über eine Personen-Eigenschaft zugewiesen sind – egal, wer sie abgehakt hat. Erledigt eine Automation einen Eintrag, zählt er für die Person, die die Automation eingerichtet hat. Die Wahl gilt für dich in diesem Journal, auf allen Geräten.
- Es erscheinen nur Einträge, die du sehen darfst – keine privaten Einträge anderer, nichts aus gesperrten Journalen oder verschlüsselten Bereichen. Ist an einem Tag nichts erledigt worden, fehlt die Liste; mehr als 100 Einträge kürzt sie mit „und … weitere“.
- Ausschalten lässt sie sich für das ganze Journal unter **Journal einrichten → Tagesleiste → An diesem Tag erledigt** (voreingestellt an). Dort lassen sich auch Ort und Termine abschalten.
- Eine Aufgabe zählt an dem Tag, an dem sie zuletzt abgehakt wurde, und nur, solange sie erledigt ist – wieder geöffnet oder **Abgebrochen** verschwindet sie. Aufgaben des Tages selbst stehen schon im Tag und erscheinen hier nicht. Bei **Nur meine** zählen die Aufgaben, die du abgehakt hast oder die dir gegeben sind.
- Änderst du den Text einer erledigten Aufgabe, bleibt sie in der Liste – mit dem neuen Text.
### Besprechungsnotizen
Neben jedem Termin steht **Besprechungsnotiz anlegen**. Flowplan legt eine Seite unter dem Journal an – mit Titel und Datum des Termins, den **Teilnehmenden**, einer **Agenda**, **Notizen** und **Aufgaben** – und öffnet sie. Danach steht neben dem Termin **Notiz öffnen**.
- **Teilnehmende**: aus dem verbundenen Google- oder Outlook-Kalender, aus dem iCal-Link und aus Personen-Eigenschaften des Eintrags. Wer mit seiner E-Mail-Adresse Mitglied des Arbeitsbereichs ist, wird erwähnt; andere stehen mit Name und Adresse da.
- **Aufgaben** mit @Person erscheinen bei dieser Person sofort unter **Meine Aufgaben**.
- Bei Einträgen aus einer Datenbank verlinkt die Notiz den Eintrag. Eine PIN-Sperre des Journals gilt auch für seine Besprechungsnotizen.
- Dieselbe Gliederung gibt es als Vorlage **Besprechungsnotiz** unter **Vorlagen → Meetings**.
## In der Seitenleiste
Auch nach Jahren mit Tausenden Tagen bleibt das Journal in der Seitenleiste kurz. Unter dem Journal stehen:
- **Heute** – auch wenn die Seite für heute noch nicht angelegt ist; ein Klick öffnet den Tag,
- die **letzten 7 Tage**,
- **Alle Tage …** mit der Zahl aller Tage: öffnet die Journalseite bei der Liste bzw. dem Kalender.
Andere Unterseiten des Journals (etwa Besprechungsnotizen oder Monatszusammenfassungen) stehen darunter wie gewohnt.
Unter **Journal einrichten → Tage** legst du für jedes Journal fest, welche **Tage in der Seitenleiste** stehen:
- **Keine**
- **Letzte 7 Tage** (Voreinstellung)
- **Nach Jahr und Monat gruppiert**: wie oben, ältere Tage zusätzlich in Ordnern nach Jahr und Monat, etwa „Oktober 2026 · 18“. Die Ordner gibt es nur in der Seitenleiste, es sind keine Seiten – man kann nichts hineinziehen.
- **Alle**: jeder Tag einzeln, wie früher.
Ist ein Tag geöffnet, zeigt die Seitenleiste ihn immer an – auch wenn er älter als 7 Tage ist; in der gruppierten Ansicht klappen sein Jahr und sein Monat auf. Tage lassen sich weiter ziehen, und die Pfeiltasten funktionieren auch in den Ordnern (→ öffnet, ← schließt oder springt zum Ordner darüber).
## Von Tag zu Tag
Über jeder Tagesseite steht eine Leiste:
- **← Vorheriger Tag** und **Nächster Tag →** springen zum vorigen bzw. nächsten Tag mit Eintrag – Lücken werden übersprungen.
- **Heute** öffnet den heutigen Tag.
- Der **Monat** (etwa „Oktober 2026“) öffnet einen kleinen Kalender: Tage mit Eintrag sind hervorgehoben und lassen sich öffnen. Mit den Pfeiltasten wanderst du um einen Tag oder eine Woche, mit Bild ↑ /Bild ↓ um einen Monat; Esc schließt ihn.
Von überall geht es mit ++⌘ ⌥ Y++ (Windows/Linux: ++Strg Alt Y++) oder dem Befehl **Journal: Heute** in der Schnellsuche (++⌘ K++) zum heutigen Tag – des zuletzt benutzten Journals. Bei mehreren Journalen bietet die Schnellsuche einen Eintrag pro Journal an. Das Kürzel lässt sich ändern (siehe [Tastenkürzel](/keyboard-shortcuts#eigene-tastenkuerzel)).
Serie, Heatmap und Verlauf der Tracker auf der Journalseite und den Rückblick auf eine Woche oder einen Monat beschreibt [Überblick und Rückblick im Journal](/journal-review).
## PIN-Sperre
Unter **Journal einrichten → PIN-Sperre** schützt eine PIN aus 6 bis 8 Ziffern das Journal (früher gesetzte kürzere PINs gelten weiter): Tage, Suche, Vorschauen und Bilder bleiben verborgen, bis die PIN eingegeben ist. Nach 15 Minuten oder mit dem Schloss-Knopf sperrt es sich wieder. Nach fünf falschen Versuchen folgt eine Pause von fünf Minuten, nach zwanzig an einem Tag ist bis zum nächsten Tag Schluss – auch über einen Neustart des Servers hinweg. Gibt eine andere Person fünfmal eine falsche PIN ein, bekommt die Person, die das Journal angelegt hat, eine Benachrichtigung. Eine PIN setzen oder ändern dürfen nur die Person, die das Journal angelegt hat, und die Eigentümer des Arbeitsbereichs. Ändern oder Entfernen verlangt die bisherige PIN – eine falsche zählt wie beim Entsperren gegen dieselben Grenzen, und bei fünf falschen bekommt die Person, die das Journal angelegt hat, ebenso eine Benachrichtigung. Ist die PIN vergessen, können Eigentümer sie auf dem Sperrbildschirm mit **PIN zurücksetzen** entfernen. Das bestätigen sie wie andere wichtige Schritte noch einmal – mit ihrem Passwort, einem Code aus der Authenticator-App oder einem Passkey, ohne all das mit einer Anmeldung, die höchstens zehn Minuten zurückliegt. Das Zurücksetzen steht im Aktivitätsprotokoll, und die Person, die das Journal angelegt hat, wird benachrichtigt. Die Sperre gilt auch für Unterseiten der Tage, für Datenbanken unter dem Journal (ihre Datensätze, Relationen, Kalender-Abos und CalDAV) sowie für Export, Inhaltsarchiv, Kommentare und das Duplizieren – dafür vorher entsperren. Sie schützt vor Blicken, ist aber keine Verschlüsselung: Wer Zugriff auf Sicherungen des Servers hat, sieht die Inhalte.
Ein Journal mit PIN bleibt privat: Wer die PIN setzt, widerruft damit alle Links zum Teilen und Veröffentlichungen des Journals und der Seiten darunter, schaltet öffentliche Formulare seiner Datenbanken ab und nimmt das Journal aus Links und Veröffentlichungen übergeordneter Seiten heraus. Die Meldung nach dem Sperren sagt, wie viele das waren; das Sicherheitsprotokoll hält es fest. Neue Links, Veröffentlichungen und öffentliche Formulare lassen sich für ein Journal mit PIN nicht anlegen – auch nicht, wenn es gerade entsperrt ist. Wer eine übergeordnete Seite samt Unterseiten teilt oder veröffentlicht, teilt das Journal nicht mit. Formulare nur für Mitglieder bleiben.
## Wenn die heutige Seite gelöscht wurde
Liegt die heutige Seite im Papierkorb, sagt das Journal das und bietet **Neu anlegen** (eine frische Seite für heute; bei **Beim ersten Schreiben** ein neuer Entwurf) oder **Aus dem Papierkorb holen** an.
## Tage in Listen, Suche, Graph und Export
Ein Journal hat schnell Hunderte Tage. Damit sie andere Seiten nicht verdrängen:
- **Suche und @-Erwähnung**: Tage stehen hinter allen anderen Treffern. Der Filter **Ohne Journaltage** in der Schnellsuche lässt sie ganz weg (er bleibt für die nächste Suche eingeschaltet).
- **@heute**, **@gestern** und **@2026-10-27** (auch `@today`, `@yesterday`) setzen beim Schreiben einen Link auf diesen Tag des Journals – des Journals im Bereich der Seite, sonst des zuletzt beschriebenen. Für heute gilt dasselbe wie beim Öffnen: Die Seite wird angelegt oder, bei **Beim ersten Schreiben**, auf den Entwurf verlinkt. Tage ohne Eintrag lassen sich nicht verlinken.
- **Graph**: Unter **Journaltage** zeigt der Graph die Tage gar nicht, **je Monat ein Punkt** (Standard) oder **einzeln**.
- **Zählen**: Startseite, Bereichsverwaltung und Administration zählen Tage getrennt, etwa „120 Seiten · 340 Journaltage“.
- **Export**: Im Markdown-ZIP, im geplanten Export und in Git liegen die Tage sortierbar im Ordner ihres Journals unter `2026/10/2026-10-27.md` – siehe [Import, Export und Versionen](/import-export-versions).
Journale hinter einer PIN, die du nicht eingegeben hast, tauchen in keinem davon auf – auch nicht in den Zahlen.
## Tipps
- Mit `/todo` oder `[]` + Leerzeichen entstehen Aufgaben, die mitwandern.
- Tagesseiten sind normale Dokumente: Überschriften, Tabellen, Bilder, Erwähnungen – alles geht.
- Journale lassen sich wie jede Seite teilen. Wer nur lesen darf, sieht die Tage, legt aber keine an.
- Die Schnellsuche findet Einträge über alle Tage hinweg; **Ohne Journaltage** blendet sie aus.
## Workflows
Der Workflow-Auslöser **Neuer Journaltag** startet einen [Workflow](/workflows), wenn die Seite eines Tages angelegt wird – also beim ersten Öffnen oder Schreiben des Tages (oder automatisch, wenn das Journal Tage selbst anlegt), nicht um Mitternacht. Für feste Uhrzeiten gibt es den Auslöser **Zeitplan**. Journale mit PIN sind für Workflows gesperrt.
Mit dem Schritt **An Journaltag anhängen** schreibt ein Workflow in einen Tag: heute, gestern oder ein bestimmtes Datum, am Ende des Tages oder unter einer Überschrift. Fehlt der Tag, legt der Workflow ihn so an, wie das Öffnen es täte – mit Vorlage und übernommenen Aufgaben. Mehr unter [Workflow-Knoten](/workflow-nodes#seiten).
---
# Überblick und Rückblick im Journal
Serie, Heatmap und Tracker-Verlauf auf der Journalseite, dazu der Rückblick auf eine Woche oder einen Monat – als Zahlen, als Seite oder mit KI zusammengefasst.
## Überblick auf der Journalseite
- **Serie**: wie viele Tage in Folge du geschrieben hast, dazu die längste Serie, Einträge und Wörter.
- **Heatmap**: das letzte Jahr als Kästchen, je dunkler, desto mehr geschrieben. Ein Klick öffnet den Tag.
- **An diesem Tag**: Einträge von vor einer Woche, einem Monat, einem halben Jahr und vor ganzen Jahren.
- **Letzte 30 Tage**: der Verlauf jedes Trackers.
- **Liste oder Kalender**: Die Liste zeigt Auszug, Ort, Stimmung und das erste Foto jedes Tages; der Kalender einen Monat mit Fotos als Hintergrund.
## Rückblick
**Rückblick** fasst eine Woche oder einen Monat zusammen: Tage, Wörter, erledigte und noch offene Aufgaben, Durchschnitte der Tracker, Orte und Fotos. **Als Markdown kopieren** übernimmt die Zusammenfassung, etwa in einen Wochenbericht.
### Mit KI zusammenfassen
**Mit KI zusammenfassen** im Rückblick lässt die [KI](/ai-writing#zusammenfassungen) die gezeigte Woche oder den gezeigten Monat zusammenfassen: Höhepunkte und Erreichtes, ein chronologischer Überblick und was noch offen ist bzw. nachzuverfolgen bleibt – in der Sprache der Oberfläche. Grundlage sind der Text jedes Tages, die erledigten und noch offenen Aufgaben, die Tracker und Orte.
- Das Ergebnis erscheint zuerst als **Vorschau**; gespeichert wird nichts. **Kopieren**, **Erneut** und **Verwerfen** stehen darunter.
- **Als Seite speichern** legt eine Unterseite des Journals an, etwa „KI-Zusammenfassung Oktober 2026“, mit dem Hinweis, dass sie mit KI erstellt wurde. Je Journal und Zeitraum gibt es eine solche Seite: Fragst du für denselben Zeitraum noch einmal, bietet der Rückblick **Öffnen** oder **Neu erstellen und ersetzen** an. Ersetzt wird der Inhalt der Seite; der vorige Stand bleibt im Versionsverlauf.
- Ein Journal mit [PIN](/journal#pin-sperre) ist für die KI gesperrt, auch während es entsperrt ist. Tage, die für die KI gesperrt sind ([Seiten für die KI sperren](/ai#seiten-und-bereiche-fuer-die-ki-sperren)), bleiben mit allem, was zu ihnen gehört, draußen.
- Den Knopf gibt es nur, wenn Zusammenfassungen für dich freigegeben sind und die KI das Journal lesen darf; sonst ist er ausgegraut oder fehlt. Lange Zeiträume liest die KI in Teilen.
### Monatszusammenfassung
Im Rückblick eines Monats legt **Monatszusammenfassung erstellen** eine normale Unterseite des Journals an – keinen Tag – und öffnet sie, etwa „Monatszusammenfassung Oktober 2026“. Darauf stehen:
- Tage, Wörter, erledigte und noch offene Aufgaben in Zahlen,
- **Höhepunkte**: Durchschnitte der Tracker, Orte, Fotos und die erledigten Aufgaben mit Link zu ihrem Tag,
- **Noch offen**: Aufgaben aus diesem Monat, die bis heute offen sind, mit Link zum Tag, auf dem sie jetzt stehen,
- **Tage**: jeder Tag als Link mit dem Anfang seines Textes.
Die Seite entsteht allein aus deinen Einträgen, ohne KI, und lässt sich danach frei bearbeiten. Gibt es für den Monat schon eine Zusammenfassung, bietet der Rückblick **Monatszusammenfassung öffnen** an; **Trotzdem neu erstellen** legt bewusst eine weitere an.
---
# Datenbanken
Eine Datenbank ist eine Sammlung von Einträgen mit Eigenschaften. Dieselben Einträge lassen sich als Tabelle, Board, Kalender, Timeline, Galerie, Liste, Feed, Diagramm oder Formular zeigen.

**Mehr zum Thema:** [Eigenschaften von Datenbanken](/database-properties)
## Datenbank anlegen
**Neue Seite → Datenbank** zeigt gleich darunter die **Art** als eine Zeile zum Wählen, darunter die Eigenschaften der gewählten:
| Art | Eigenschaften | Erste Ansicht |
| --- | --- | --- |
| **Aufgaben** | Aufgabe, Status, Priorität, Fällig am, Verantwortlich, Tags | Tabelle „Alle Aufgaben“, dazu Board, Kalender, Timeline … |
| **Dokumente** | Titel, Tags, Erstellt, Bearbeitet | Liste „Alle Dokumente“ (zuletzt bearbeitet oben), Galerie, Tabelle; Einträge öffnen als ganze Seite, leere Eigenschaften sind ausgeblendet |
| **Kontakte** | Name, Vorname, Nachname, Firma, Position, E-Mail, Telefon, Mobil, Straße, PLZ, Ort, Land, Geburtstag, Tags | Liste „Alle Kontakte“ (nach Nachname), Tabelle, Kalender „Geburtstage“, Galerie; Einträge öffnen als Profilseite mit Kontaktkarte – siehe [Kontakte](/contacts) |
| **Leer** | nur ein Titel | Tabelle |
Darunter stehen **Deine Vorlagen**: gespeicherte Datenbank-Vorlagen, etwa eine eigene „Notizen (PARA)“-Datenbank mit Relationen und Ansichten. Die letzte Wahl merkt sich das Gerät. Alternativ eine [Vorlage](/templates) verwenden, etwa „Aufgaben“ oder „Projekte“, oder eine CSV-Datei importieren (siehe [Import, Export und Versionen](/import-export-versions)).
## Einträge
- **Neu** unten in der Tabelle oder oben rechts legt einen Eintrag an und öffnet ihn mit markiertem Titel – einfach lostippen, Enter speichert.
- **Bearbeiten:** In der Tabelle speichert Enter auch Zahlen; ein Doppelklick auf eine Mehrfachauswahl öffnet sie nur, ohne eine Option anzuhaken. Esc schließt einen geöffneten Eintrag – was du in Titel oder Eigenschaften getippt hast, bleibt gespeichert.
- Ein Klick auf den Titel öffnet den Eintrag als Seite: oben der Titel zum direkten Bearbeiten, darunter die Eigenschaften, darunter ein vollständiges Dokument mit demselben Editor wie jede andere Seite – samt Kommentaren, Versionsverlauf und gemeinsamer Bearbeitung.
- **Einträge öffnen als** (Regler oben im Eintrag → Layout, für alle Einträge der Datenbank; eine Ansicht kann es unter **Ansicht konfigurieren** anders festlegen): **Seitenleiste** rechts neben der Ansicht, **Mittig** als Dialog über der Ansicht (die Voreinstellung) oder **Ganze Seite** – dann füllt der Eintrag den Inhaltsbereich neben der Seitenleiste wie jede Seite, ohne Datenbank dahinter.
- **Als Seite öffnen** (Pfeile oben im Eintrag) zeigt einen Eintrag einmalig als ganze Seite, mit ++⌘/Strg++-Klick oder mittlerer Maustaste in einem neuen Tab. Zurück geht es über den Pfad in der Kopfzeile, die Zurück-Taste oder die Pfeile oben im Eintrag (zurück zur Seitenleiste oder zum Dialog).
- Oben rechts im Eintrag außerdem: der Stern für die Favoriten (in der Seitenleiste öffnet ein Favorit den Eintrag als ganze Seite), **Link kopieren** für die Adresse des Eintrags, **Teilen** für Links und die Veröffentlichung nur dieses Eintrags ([Einzelne Einträge teilen](/sharing#einzelne-eintraege-teilen)), das Schloss für die Rechte des Eintrags und die Regler für das Layout aller Einträge. **Symbol** und **Cover** erscheinen, wenn der Mauszeiger über dem Titel steht.
- **Lesemodus** (Buch-Symbol oben im Eintrag oder ++⌘ ⌥ E++) öffnet den Text eines Eintrags nur zum Lesen, wie bei Seiten; das Gerät merkt es sich pro Eintrag. Als ganze Seite geöffnet, nutzt **Volle Breite** den ganzen Bildschirm – die Eigenschaften bleiben lesbar schmal, der Text bekommt die Breite.
- Ein geöffneter Eintrag hat seine eigene Adresse (`/#page=&row=`, als ganze Seite mit `&full=1`). Sie lässt sich teilen, als Lesezeichen speichern oder per `@` in Texten verlinken; Zurück und Vorwärts im Browser führen zwischen Datenbank, Dialog und ganzer Seite hin und her. Unter den Eigenschaften zeigt **Verknüpft von**, welche Einträge per Relation und welche Seiten und Einträge per Link im Text auf ihn verweisen.
- **Datensatzvorlagen** geben neuen Einträgen Eigenschaften und Inhalt vor. Eine Vorlage kann Standard für neue Einträge sein.
- Mehrere Einträge auswählen (Kästchen links) und gemeinsam bearbeiten, duplizieren oder löschen – bis zu 500 auf einmal. Vorher sichert Flowplan einen Stand, der sich über den Versionsverlauf wiederherstellen lässt.
- Gelöschte Einträge liegen im Papierkorb der Datenbank und lassen sich zurückholen – mit ihren Versionen, den Kommentaren von Besuchern über einen Freigabelink und den Reaktionen auf Kommentare. Wurde ein beidseitig verknüpfter Eintrag inzwischen gelöscht, klappt das trotzdem; nur diese Verknüpfung fällt weg. Gleich nach dem Löschen geht das schneller: **Rückgängig** im Hinweis unten (oder ++⌘ Z++, solange er sichtbar ist). Ebenso lassen sich eine gemeinsame Bearbeitung mehrerer Einträge, ein in eine andere Spalte gezogener Eintrag, ein entferntes Datum und eine gelöschte Eigenschaft zurücknehmen.
### Unterseiten eines Eintrags
Ein Eintrag kann eigene Seiten enthalten – etwa Gesprächsnotizen, eine Spezifikation und Flussdiagramme unter einer Anforderung:
- **Unterseite hinzufügen** unter dem Dokument des Eintrags (im Dialog und als ganze Seite) legt eine Seite unter dem Eintrag an und öffnet sie. Darüber stehen seine **Unterseiten**.
- Vorhandene Seiten kommen per **Seitenaktionen → Verschieben** dorthin (Datenbank als übergeordnete Seite, dann **Unter Eintrag** wählen) oder per Drag and Drop auf die Unterseiten des Eintrags oder auf den Eintrag in der Seitenleiste. Mehrere ausgewählte Seiten lassen sich auf einen Eintrag verschieben, der schon Unterseiten hat.
- In der **Seitenleiste** erscheinen unter der aufgeklappten Datenbank die Einträge, die Unterseiten haben, mit ihren Unterseiten; die übrigen Einträge bleiben in der Datenbank. Der Pfad in der Kopfzeile zeigt Datenbank → Eintrag → Unterseite.
- Unterseiten folgen den **Rechten des Eintrags**: Wer einen privaten Eintrag nicht sieht, sieht auch seine Unterseiten nicht; ein schreibgeschützter Eintrag macht sie für Bearbeitende schreibgeschützt. Anlegen und Hineinverschieben braucht Bearbeitungsrechte am Eintrag.
- **Löschen** des Eintrags verschiebt seine Unterseiten mit in den Papierkorb; **Wiederherstellen** holt sie zurück, endgültiges Löschen entfernt sie. **Verschieben nach …** in eine andere Datenbank nimmt sie mit; **In Seite umwandeln** macht sie zu Unterseiten der neuen Seite. **Duplizieren** und **Kopieren nach …** kopieren nur den Eintrag selbst; eine Kopie der ganzen Datenbank enthält die Unterseiten.
- Ersatzseiten aus einer früheren Notion-Übernahme (eine gleichnamige Seite mit den Unterseiten) löst du auf, indem du ihre Unterseiten unter den Eintrag verschiebst und die leere Seite löschst.
### Seite in eine Datenbank verschieben
**Seitenaktionen → In Datenbank verschieben …** macht aus einer Dokumentseite einen Eintrag einer Datenbank, in die du schreiben darfst – etwa um gewachsene Dokumentation in eine Notizen-Datenbank zu holen:
- Titel, Symbol und Cover werden zu Titel, Symbol und Cover des Eintrags, der Inhalt zu seinem Dokument; Dateien und Bilder bleiben dieselben (sie gehören dann zur Datenbank).
- Die Tags der Seite kommen in die (erste) Mehrfachauswahl der Datenbank mit den [Tags des Arbeitsbereichs](/database-properties#mehrfachauswahl-mit-den-tags-des-arbeitsbereichs), sofern es eine gibt und du sie ändern darfst.
- Kommentare, Textkommentare, Aufgaben und Versionen ziehen mit; Favoriten werden Eintrags-Favoriten.
- Links auf die Seite in allen Seiten und Einträgen des Arbeitsbereichs zeigen danach auf den Eintrag.
- Unterseiten bleiben Seiten und werden [Unterseiten des Eintrags](#unterseiten-eines-eintrags); liegt die Datenbank in einem anderen Bereich, rücken sie eine Ebene nach oben. Rechte für Personen, die auf der Seite gesetzt waren, gelten für sie weiter.
- Freigaben nur dieser Seite (Rechte für Personen, Freigabelinks, Veröffentlichung) enden – der Dialog nennt sie vorher; der Eintrag folgt den Rechten der Datenbank. Die Standardvorlage der Datenbank wird übernommen.
- Die Seite selbst kommt in den Papierkorb.
### Eintrag in eine Seite umwandeln
Umgekehrt macht **In Seite umwandeln …** aus einem Eintrag wieder eine Dokumentseite – im Menü **…** oben im geöffneten Eintrag oder per Rechtsklick auf den Eintrag. Dafür brauchst du Bearbeitungsrechte am Eintrag und Schreibrechte am Zielort:
- Titel, Symbol und Cover werden zu Titel, Symbol und Cover der Seite, das Dokument des Eintrags zu ihrem Inhalt; Dateien und Bilder bleiben dieselben (sie gehören dann zur Seite).
- Die Eigenschaften bleiben als kurze Liste „Eigenschaft: Wert“ oben auf der Seite stehen (auch im Markdown-Export lesbar); im Dialog lassen sie sich stattdessen weglassen.
- Die Tags aus Mehrfachauswahlen mit den [Tags des Arbeitsbereichs](/database-properties#mehrfachauswahl-mit-den-tags-des-arbeitsbereichs) werden zu Tags der Seite.
- Kommentare, Textkommentare, Aufgaben und Versionen ziehen mit; Eintrags-Favoriten werden Seiten-Favoriten.
- Links auf den Eintrag in allen Seiten und Einträgen des Arbeitsbereichs zeigen danach auf die Seite – @-Links und Rückverweise funktionieren weiter.
- Die Seite landet dort, wo die Datenbank liegt, oder an einem anderen Ort deiner Wahl, und folgt dessen Rechten. Eigene Rechte des Eintrags und Relationen anderer Einträge auf ihn enden – der Dialog nennt sie vorher.
- Der Eintrag selbst kommt in den Papierkorb der Datenbank und lässt sich zurückholen.
### Einträge kopieren und verschieben
Ein **Rechtsklick** auf einen Eintrag – in Tabelle, Board, Liste, Galerie, Kalender oder Zeitleiste – öffnet sein Menü: **Öffnen**, **Duplizieren**, **Kopieren nach …**, **Verschieben nach …**, **In Seite umwandeln …** und **Löschen**. Sind mehrere Einträge ausgewählt, gilt das Menü für alle; in der Leiste der Auswahl steht dafür auch **Verschieben / kopieren nach …**.
**Einträge kopieren:** Sind in der Tabellenansicht Einträge ausgewählt, kopiert **Kopieren** in der Leiste der Auswahl (oder ++⌘/Strg C++, solange kein Text markiert ist) sie in die Zwischenablage – mit den sichtbaren Spalten der Ansicht als Kopfzeile, in der Reihenfolge der Tabelle. In Excel, Numbers oder Google Sheets eingefügt, landet jeder Wert in einer eigenen Zelle; in einem Dokument entsteht eine Tabelle. Werte stehen so drin, wie die Tabelle sie zeigt: Zahlen im Format der Spalte, Auswahl- und Personenspalten mit Namen, Verknüpfungen mit dem Titel des Eintrags, Checkboxen als Ja/Nein.
Im Dialog wählst du die Ziel-Datenbank desselben Arbeitsbereichs:
- **Kopieren** legt neue Einträge an – mit Eigenschaften, Inhalt, Symbol und Cover. Dateien und Bilder der Quell-Datenbank werden mitkopiert, die Kopie hängt also nicht an der Quelle. Kopiert werden nur Dateien, die zur Quell-Datenbank gehören, die du sehen darfst und die nicht im Papierkorb liegen; ein Verweis auf eine andere Datei bleibt ein Verweis und behält deren Berechtigungen.
- **Verschieben** nimmt den Eintrag selbst mit: Inhalt, Kommentare, Versionsverlauf, erfasste Zeiten und Git-Verknüpfungen bleiben erhalten. In der neuen Datenbank bekommt er die nächste Nummer (Ticket-ID).
- Eigenschaften werden **nach Namen** zugeordnet, der Titel immer zum Titel. Passende Typen werden umgewandelt (Text ↔ E-Mail, Auswahl ↔ Mehrfachauswahl, Zahl → Text …); fehlende Auswahloptionen kommen im Ziel dazu. **Fehlende Eigenschaften im Ziel anlegen** erstellt Eigenschaften, die das Ziel noch nicht hat.
- Berechnete Werte (Formeln, Rollups, Fortschritt, Erstellt/Geändert) entstehen im Ziel neu.
Schneller geht es per Ziehen: Einträge am Griff (mit der Maus auch an der Karte) **in eine Datenbank der Seitenleiste ziehen** verschiebt sie dorthin – die Zieldatenbank wird hervorgehoben –, mit gedrückter Alt -Taste beim Loslassen werden sie kopiert. Vorher sichert Flowplan einen Stand der Quelle.
## Große Datenbanken
Tabellen, Listen und Galerien zeigen zuerst 100 Einträge; beim Scrollen folgen die nächsten 100, Gruppen und Board-Spalten haben **Weitere anzeigen**. Suche, Filter, Sortierung und Spaltenberechnungen gelten trotzdem immer für alle Einträge. So öffnen sich auch Datenbanken mit Tausenden Einträgen in Sekundenbruchteilen.
## Filtern, sortieren, gruppieren
Jede Ansicht hat eigene Einstellungen:
- **Filter** mit UND/ODER-Gruppen, für Datumsfelder auch relative Zeiträume („diese Woche“, „letzte 30 Tage“), die sich täglich selbst aktualisieren.
- **Datum und Zeitzone:** Bei **Erstellt am**, **Bearbeitet am** und Datumsfeldern mit Uhrzeit zählen *ist*, *ist nicht*, *vor*, *nach*, *am oder vor*, *am oder nach* und *liegt zwischen* den Tag, auf den der Zeitpunkt in der Zeitzone des Filters fällt – ein Eintrag von 23:30 Uhr gehört also zu diesem Tag, nicht zum nächsten. Voreingestellt ist die Zeitzone deines Browsers; sie steht im Filter und lässt sich dort ändern wie bei relativen Zeiträumen. Datumswerte ohne Uhrzeit bleiben Kalendertage. Ältere Filter rechnen weiter mit dem Tag in UTC, bis du sie bearbeitest. Dasselbe gilt für Bedingungen in Automationen.
- **Sortierung** nach mehreren Eigenschaften. Personen, **Erstellt von**, **Bearbeitet von** und Sprints sortieren nach dem Namen, Relationen nach dem Titel des verknüpften Eintrags – so, wie die Tabelle sie zeigt.
- **Gruppierung** nach fast jeder Eigenschaft (außer Dateien und Checklisten), mit bis zu fünf Ebenen in Tabellen und Listen; Boards zeigen die zweite Ebene als Zeilen (Swimlanes).
- **Suche** innerhalb der Datenbank, auch im Text der Eintragsdokumente.
- **Spaltenberechnungen** unter Tabellenspalten: Summe, Durchschnitt, Median, Minimum, Maximum, Anteile, früheste und späteste Daten und mehr.
## Wiederkehrende Einträge
Datumsfelder lassen sich täglich, wöchentlich, monatlich oder jährlich wiederholen. Kalender und Timeline zeigen die Wiederholungen; es bleibt ein einziger Eintrag. Eine einzelne Wiederholung lässt sich bei Bedarf als eigener Eintrag lösen.
### Wiederkehrende Aufgaben
Für Aufgaben, die jedes Mal einzeln abgehakt werden („Monatsabschluss“, „Server-Updates“), stellst du im Eintrag unter **Wiederkehrende Aufgabe** einen Rhythmus ein: täglich, wöchentlich (wahlweise an bestimmten Wochentagen, z. B. Mo, Mi, Fr), monatlich oder jährlich, jeweils alle N Tage, Wochen, Monate oder Jahre. Gibt es mehrere Datumsfelder, wählst du, welches weiterrückt.
Sobald der Eintrag erledigt ist (Status oder Häkchen, siehe [Wann ist ein Eintrag erledigt?](/projects-and-tickets#wann-ist-ein-eintrag-erledigt)), legt Flowplan den nächsten Eintrag an: eine Kopie mit dem Status von vorher, das gewählte Datum auf dem nächsten Termin und alle anderen Datumsfelder um gleich viele Tage verschoben. Der Rhythmus wandert zum neuen Eintrag; wird der alte noch einmal geöffnet und erledigt, entsteht kein weiterer.
- Monatsenden werden gekappt, der Tag bleibt erhalten: 31. Januar → 28. Februar → 31. März.
- Der 29. Februar wird in Nicht-Schaltjahren zum 28. und in Schaltjahren wieder zum 29.
Neue Einträge zu festen Zeiten – unabhängig davon, ob der letzte erledigt ist – legen [geplante Automationen](/projects-and-tickets#geplante-automationen) an.
## Datums-Erinnerungen
Im Eintrag kann jede Person für jedes gefüllte Datumsfeld eine persönliche Erinnerung setzen – bei Uhrzeiten zum Termin oder 5 Minuten bis 1 Woche vorher, bei ganztägigen Daten am Tag oder 1, 2 bzw. 7 Tage vorher um 09:00. Erinnerungen erscheinen im Posteingang und als Push-Nachricht und ändern den Eintrag nicht.
## Rechte pro Eintrag
Über das Rechte-Symbol oben im Eintrag lässt sich ein Eintrag über die Rechte der Datenbank hinaus einschränken:
- **Rechte wie Datenbank**: Standard.
- **Schreibgeschützter Eintrag**: nur die Verwaltenden (Seiteneigentümer und die Person, die den Eintrag angelegt hat) und ausdrücklich Freigegebene ändern ihn.
- **Privater Eintrag**: nur Verwaltende und Freigegebene sehen ihn – samt seinen Kommentaren, Aufgaben und Dateien (in Dateiliste, Suche, Mediathek, Kopien, Vorlagen und Sicherungen).
Freigaben an Personen oder Gruppen gehen nie über die Rolle an der Datenbankseite hinaus.
## Automationen und Workflows
Wiederkehrende Handgriffe einer Datenbank – Datum setzen, benachrichtigen, Vorlage anwenden – erledigen [Automationen](/projects-and-tickets#automationen) unter **… → Automationen**. Für längere Abläufe mit Verzweigungen, Warten, Freigaben, KI, E-Mails oder anderen Diensten gibt es [Workflows](/workflows); jede Regel lässt sich dorthin mit **Im Canvas öffnen** erweitern.
---
# Eigenschaften von Datenbanken
Die Eigenschaftstypen einer Datenbank im Überblick, Farben für Auswahl-Optionen, formatierter Text in Feldern und Mehrfachauswahlen mit den Tags des Arbeitsbereichs.
## Eigenschaften
| Typ | Inhalt |
| --- | --- |
| Text | Formatierter Text: fett, kursiv, durchgestrichen, Code, Links, Zeilenumbrüche (siehe unten) |
| Zahl | Zahlen mit Format: Währung, Prozent, Dezimalstellen, Tausendertrennzeichen |
| Datum | Mit oder ohne Uhrzeit und Enddatum, Zeitzone, persönliche Erinnerungen, Wiederholung |
| Auswahl, Mehrfachauswahl | Optionen mit eigener Farbe ([siehe unten](#farben-der-optionen)), z. B. für Status oder Schlagworte |
| Checkbox, Checkliste | Abhaken; Checklisten mit mehreren Punkten und Fortschritt |
| URL, E-Mail, Telefon | Anklickbar |
| Person | Mitglieder des Arbeitsbereichs; Zuweisung benachrichtigt |
| Dateien | Anhänge und Bilder direkt am Eintrag |
| Relation, Rollup | Verknüpfung mit Einträgen einer anderen Datenbank und Berechnungen darüber |
| Formel | Berechneter Wert aus anderen Eigenschaften |
| Erstellt am/von, Bearbeitet am/von | Werden automatisch gepflegt |
Relationen, Rollups und Formeln sind unter [Eigenschaften, Formeln und Rollups](/properties-and-formulas) beschrieben.
### Eigenschaften im Eintrag einklappen
Unter dem Titel eines Eintrags klappt der Pfeil **Eigenschaften** die Eigenschaften zu einer Zeile zusammen: die zwei bis drei wichtigsten Werte als kleine Chips (zuerst der Status, dann Auswahl, Datum und Person) und „+4 Eigenschaften“. Ein Tipp auf die Zeile klappt sie wieder auf. Der Inhalt des Eintrags rückt so nach oben – gerade auf dem Telefon.
- Die Wahl gilt für **alle Einträge der Datenbank** und wird in deinem Konto gespeichert, **getrennt für Telefon und Computer**: Wer auf dem Telefon einklappt, sieht am Computer weiter alles.
- Ohne eigene Wahl sind die Eigenschaften am Computer aufgeklappt, auf dem Telefon eingeklappt, sobald der Eintrag mehr als vier Eigenschaften zeigt. Ein gerade angelegter Eintrag öffnet immer aufgeklappt, damit du ihn ausfüllen kannst.
- Einklappen ändert keine Werte und keine Rechte und gilt nur für dich. Drucken und Exporte zeigen immer alle Eigenschaften – außer du schaltest sie in den [Druckoptionen](/print-and-pdf#drucken-und-pdf) ab.
- Für normale Seiten gibt es dasselbe in der [Leiste mit Tags und Eigenschaften](/page-tags#leiste-einklappen).
### Farben der Optionen
Jede Option einer Auswahl oder Mehrfachauswahl kann ihre eigene Farbe haben – Grau, Blau, Grün, Rot, Gelb, Orange, Lila, Rosa oder Türkis, dieselben Farben wie bei den [Tags](/page-tags). Die Farbe zeigt sich überall, wo der Wert steht: Tabelle, Board-Spalten, Liste, Galerie, Feed, Gruppen, Filter, im Eintrag, bei Mehrfachauswahlen in Formularen und auf veröffentlichten Seiten.
- **Ändern:** In den Einstellungen der Eigenschaft (Klick auf die Spaltenüberschrift) steht unter den Optionen jede Option als Chip – ein Klick darauf öffnet die Farben. Schneller geht es am Wert selbst: Rechtsklick auf einen Chip in der Tabelle oder auf die Überschrift einer Board-Spalte, Farbe wählen. Das wird sofort gespeichert; **Rückgängig** im Hinweis stellt die alte Farbe wieder her.
- **Neue Optionen** bekommen von selbst die nächste Farbe der Reihe – ob du sie in den Einstellungen tippst, auf dem Board eine Spalte anlegst oder sie per Import, API oder KI dazukommen. Eine umbenannte Option behält ihre Farbe.
- **Farben automatisch vergeben** färbt alle Optionen der Eigenschaft auf einmal der Reihe nach (vorhandene Farben werden ersetzt). **Rückgängig** daneben oder Schließen ohne Speichern verwirft das, **Speichern** übernimmt es.
- **Bestehende Datenbanken** sehen aus wie vorher, bis du Farben setzt: Optionen ohne Farbe sind grau, nur einige feste Wörter wie „Erledigt“ oder „Hoch“ sind farbig.
- **Import:** Der HTML-Export von Notion bringt die Farben der Optionen mit (Notions Braun wird Orange, „Standard“ Grau), ebenso AFFiNE; CSV, Markdown, Jira und Trello bekommen Farben der Reihe nach. Beim Verschieben oder Kopieren von Einträgen in eine andere Datenbank nehmen neue Optionen ihre Farbe mit. Der CSV-Export enthält keine Farben.
- **API und MCP:** `database.update` nimmt und liefert `optionColors`, z. B. `{"Offen": "blue"}`. Ohne `optionColors` bleiben die gespeicherten Farben, `{}` entfernt sie.
- Eine Mehrfachauswahl mit den Tags des Arbeitsbereichs ([unten](#mehrfachauswahl-mit-den-tags-des-arbeitsbereichs)) zeigt die Farben der Tags.
### Formatierter Text
Text-Eigenschaften – alle außer dem Titel – können **fett**, *kursiv*, ~~durchgestrichen~~, `Code`, Links und Zeilenumbrüche enthalten. Es sind nur Auszeichnungen im Text, keine Blöcke: Überschriften, Listen, Zitate oder Tabellen gibt es darin nicht (dafür ist der Text des Eintrags da). Unterstreichen gibt es nicht.
- **Bearbeiten:** In der Tabelle die Zelle anklicken, im Eintrag ins Feld klicken. Ist Text markiert, erscheint darüber eine kleine Leiste mit Fett, Kursiv, Durchgestrichen, Code und Link.
- **Tastenkürzel:** ++⌘ B++ fett, ++⌘ I++ kursiv, ++⌘ ⇧ X++ durchgestrichen, ++⌘ E++ Code, ++⌘ K++ verlinkt den markierten Text (ohne Markierung öffnet ++⌘ K++ wie überall die Schnellsuche). Links gehen nur auf `http`, `https` und `mailto`; aus `example.com` wird `https://example.com`, aus einer E-Mail-Adresse ein `mailto:`-Link. Ein leeres Feld entfernt den Link.
- **Zeilenumbruch:** ++⇧ Enter++. In einer Tabellenzelle beendet Enter die Bearbeitung und speichert, Esc verwirft sie. Im Eintrag, im Feed und beim Bearbeiten über einen Freigabelink macht auch Enter einen Zeilenumbruch; gespeichert wird beim Verlassen des Felds.
- **Anzeige:** formatiert in Tabelle, Board, Galerie, Liste, Feed, im Eintrag, auf veröffentlichten Seiten und in eingebetteten Ansichten. In Tabellenzellen und auf Karten steht ein Zeilenumbruch als Leerzeichen (die Zeile bleibt eine Zeile), im Eintrag und im Feed mit Umbruch. Links öffnen in einem neuen Tab; auf Karten, die selbst ein Link sind, bleiben sie Text.
- **Als reiner Text** zählt der Wert bei Suche, Filtern (*enthält* …), Sortierung, Gruppierung, Formeln (`prop("Notiz")` liefert den Text ohne Formatierung), beim Kopieren in die Zwischenablage, im CSV-Export, in den Widgets der Apps und in Platzhaltern von Vorlagen und Automationen.
- **Einfügen** aus Word, Google Docs oder Webseiten behält Fett, Kursiv, Durchgestrichen, Code und Links; Überschriften werden fett, Absätze und Listenpunkte zu Zeilenumbrüchen, Bilder und Tabellen fallen weg.
- **Import und Export:** CSV (auch Notion-Exporte), Jira und Trello, vCards, LDAP und Formularantworten sind reiner Text – Sternchen und Unterstriche bleiben, wie sie geschrieben sind. Tabellen aus AFFiNE und Tabellen aus Dokumenten (**In Datenbank umwandeln**) behalten ihre Formatierung. Der Markdown-Export schreibt die Formatierung als Markdown, der CSV-Export reinen Text. Ältere Inhaltsarchive kommen als reiner Text herein.
- **Bestehende Werte** aus der Zeit vor dieser Funktion sehen aus wie vorher: `*Sternchen*` bleibt mit Sternchen.
- **Typ ändern:** Wird eine andere Eigenschaft zu Text, bleiben ihre Werte, wie sie geschrieben sind; wird Text zu einem anderen Typ, zählt der Text ohne Formatierung.
- **API und MCP:** Der Wert ist ein String mit Inline-Markdown: `**fett**`, `_kursiv_` (auch `*kursiv*`), `~~durchgestrichen~~`, `` `Code` ``, `[Text](https://…)` und `\n` für einen Zeilenumbruch. Ein Backslash hält `` \ * _ ~ ` [ ] `` als Zeichen fest – reinen Text also maskiert senden. Links mit anderen Schemata (etwa `javascript:`) zeigen nur ihren Text; `# ` oder `- ` am Anfang bleiben Text. Der Titel ist reiner Text.
### Mehrfachauswahl mit den Tags des Arbeitsbereichs
Eine Mehrfachauswahl kann statt einer eigenen Liste die **Tags des Arbeitsbereichs** als Optionen haben – dieselben Tags, die auch Seiten tragen. In den Einstellungen der Eigenschaft (Klick auf die Spaltenüberschrift) unter **Optionen** zwischen **Eigene Liste** und **Tags des Arbeitsbereichs** wählen.
- Die Eigenschaft bietet die Tags an, die im Bereich der Datenbank gelten – die des ganzen Arbeitsbereichs und die des Bereichs (siehe [Geltungsbereich](/page-tags#geltungsbereich-arbeitsbereich-oder-bereich)) –, mit ihren Farben und in ihrer Reihenfolge; ein neuer Tag aus einem Eintrag gehört zum Bereich der Datenbank; Zellen, Board-Spalten und Karten zeigen die Tag-Farben. Im Eintrag wählst du mit **+ Tag** wie auf Seiten: Tippen schlägt passende Tags vor, Enter übernimmt.
- Gibt es einen eingegebenen Wert noch nicht, legt er den Tag an – wie auf Seiten dürfen das Mitglieder mit Bearbeitungsrecht. Leser, Gäste und Lese-Tokens wählen nur vorhandene Tags. Auf dem Board legt **+ Gruppe** bei so einer Eigenschaft einen neuen Tag an.
- Es bleibt eine Mehrfachauswahl: Filter, Sortierung, Gruppierung, Board-Spalten, Formeln, Automationen, Import und Export (Markdown, CSV, Git), API und MCP funktionieren wie gewohnt. Gespeichert werden die Tag-Namen.
- **Umbenennen, Zusammenführen und Löschen** eines Tags (Einstellungen → Tags & Eigenschaften) ändert alle Einträge mit diesem Tag gleich mit: Ein umbenannter Tag erscheint unter seinem neuen Namen, beim Zusammenführen wird aus dem einen Tag der andere (ohne Doppel), ein gelöschter Tag verschwindet aus den Einträgen. Filter und Board-Spalten der Ansichten folgen; vorher sichert Flowplan einen Stand jeder betroffenen Datenbank im Versionsverlauf.
- Einträge mit Tags erscheinen in der [Tag-Ansicht](/page-tags#tag-ansicht) neben den Seiten und werden mit `#Tag` / `-#Tag` in der Suche gefunden.
- **Umstellen** einer vorhandenen Mehrfachauswahl auf die Tags: Ihre Optionen werden den Tags zugeordnet (ohne Rücksicht auf Groß-/Kleinschreibung), fehlende Tags werden angelegt; die Werte der Einträge bleiben und tragen danach den genauen Namen des Tags. **Zurück auf „Eigene Liste“** werden die Tags zu eigenen Optionen – die verwendeten zuerst, höchstens 100; die Werte bleiben. Die Optionen behalten dabei die Farben der Tags.
- Gäste sehen als Optionen nur die Tags, die in den für sie freigegebenen Einträgen vorkommen, und legen keine an. Über Freigabelinks bietet ein Eintrag nur seine eigenen Tags an.
- In [verschlüsselten Bereichen](/encrypted-spaces) gibt es diese Option nicht (wie Tags auf Seiten).
---
# Ansichten
Eine Datenbank kann beliebig viele Ansichten haben. Jede Ansicht zeigt dieselben Einträge mit eigener Darstellung, eigenen Filtern, Sortierungen und Gruppen.

Neue Ansicht: **+** neben den Ansichtsreitern, dann eine der zehn Darstellungen wählen. **Ansicht und Eigenschaften** steuert, welche Eigenschaften sichtbar sind und in welcher Reihenfolge.
Ein **Rechtsklick auf einen Ansichtsreiter** öffnet sein Menü: **Umbenennen**, **Duplizieren**, **Einstellungen …**, **Als Standardansicht festlegen**, **Nach links**, **Nach rechts** und **Ansicht löschen** (die Einträge bleiben dabei erhalten; die letzte Ansicht lässt sich nicht löschen). Reiter lassen sich mit der Maus auch **per Ziehen neu anordnen**, ein Doppelklick benennt sie um. Auf Touchscreens scrollen die Reiter beim Wischen; langes Drücken öffnet das Menü mit **Nach links** und **Nach rechts**.
**Standardansicht:** Die Ansicht, die beim Öffnen der Datenbank zuerst erscheint – etwa das Board statt der Tabelle. Ohne Einstellung ist es die erste Ansicht. Ein kleiner Stern im Reiter markiert sie; einstellbar auch in den Einstellungen der Ansicht (praktisch auf dem Handy).
## Einträge per Ziehen ordnen
In Tabelle, Liste, Feed, Board und Galerie lassen sich Einträge am **Griff** (⋮⋮) an eine andere Stelle ziehen; Karten im Board und in der Galerie auch mit der Maus an der ganzen Karte.
- **Maus:** Erst nach ein paar Pixeln Bewegung beginnt das Ziehen – ein einfacher Klick öffnet weiterhin den Eintrag bzw. am Griff den Dialog **Eintrag verschieben**. Während des Ziehens zeigt der Mauszeiger die geschlossene Hand, eine leicht angehobene Kopie folgt dem Zeiger, und eine blaue Linie zeigt, wo der Eintrag landet. Über einer Gruppenüberschrift landet er am Ende dieser Gruppe (und wechselt die Gruppe).
- **Am Rand scrollen:** Nahe am Rand der Tabelle, des Boards oder des Fensters scrollt die Ansicht mit, waagrecht wie senkrecht.
- **Abbrechen:** Esc während des Ziehens legt alles zurück, nichts wird geändert.
- **Touchscreens:** Den Griff kurz halten (etwa 0,3 Sekunden), bis sich der Eintrag abhebt, dann ziehen. Ein schnelles Wischen über den Griff scrollt wie gewohnt; ein kurzes Tippen öffnet **Eintrag verschieben**. Im Board ziehen Griff und Spaltengriff sofort.
- **Tastatur:** Den Griff fokussieren, Leertaste hebt den Eintrag an, ↑ /↓ verschieben ihn (im Board ← /→ in die Nachbarspalte, Pos1 /Ende an den Anfang oder das Ende), Leertaste oder Enter legt ab, Esc bricht ab. Screenreader hören jede Position. ++Alt ↑/↓++ verschiebt weiterhin sofort um eine Stelle.
- Ein Eintrag lässt sich so auch auf eine **Datenbank in der Seitenleiste** ziehen (siehe [Einträge kopieren und verschieben](/databases#eintraege-kopieren-und-verschieben)).
## Tabelle
- Zellen direkt bearbeiten, Einträge über den Titel als Seite öffnen.
- Spalten an ihrer Überschrift auf eine andere Spalte ziehen – sie landen davor (blaue Linie) –, an den Rändern in der Breite ändern. Auf Touchscreens die Überschrift erst kurz halten.
- Unter jeder Spalte eine Berechnung wählen.
- Gruppierte Tabellen klappen Gruppen ein und zeigen Zusammenfassungen je Gruppe.
- Beim seitlichen Scrollen bleibt die Titelspalte stehen. Auf dem Smartphone nimmt sie höchstens etwa 60 % der Tabellenbreite ein, und längere Titel werden mit „…“ gekürzt. Die Spalte mit Auswahlfeld und Ziehgriff scrollt dort mit. So lässt sich die Tabelle überall seitlich wischen, auch auf der Titelspalte.
## Board
Die Kanban-Ansicht gruppiert Karten in Spalten, etwa nach Status, Auswahl, Person oder Relation.
- Karten per Drag and Drop zwischen und innerhalb von Spalten verschieben: Die Karte hebt sich ab, die Zielspalte öffnet eine Lücke, beim Loslassen setzt sich die Karte hinein. Das ändert die gruppierende Eigenschaft.
- **Neu** am Fuß einer Spalte legt einen Eintrag direkt in dieser Gruppe an.
- Spalten umsortieren, ausblenden oder einklappen; „Ohne Gruppe“ sammelt Einträge ohne Wert.
- **Gruppe hinzufügen** rechts neben den Spalten legt einen eigenen Status an, etwa „Warten auf Kunde“: Er wird als neue Option der gruppierenden Auswahl-Eigenschaft gespeichert und erscheint sofort als eigene Spalte.
- Untergruppen teilen das Board zusätzlich in Zeilen (Swimlanes).
- Karten zeigen jede unter **Ansicht → Eigenschaften und Spalten** angehakte Eigenschaft, die einen Wert hat, in dieser Reihenfolge; leere Eigenschaften fallen weg, das Datum steht unten auf der Karte. Mit mehr Eigenschaften wird die Karte höher.
- Bei Mehrfachauswahl und Relationen kann eine Karte in mehreren Spalten erscheinen; Verschieben ersetzt nur die jeweilige Zuordnung.
- Auf Touchgeräten Karten am Griff ziehen (die Karte selbst scrollt beim Wischen), Spalten am Griff ⋮⋮ in ihrer Überschrift; mit der Maus Spalten an der Überschrift. Esc bricht ab, die Karte kehrt an ihren Platz zurück.
## Kalender
Monats-, Wochen- und Tagesansicht nach einem Datumsfeld.
- Woche und Tag zeigen ein Stundenraster mit Ganztagszeile und nebeneinander angeordneten Überschneidungen.
- Termine in 15-Minuten-Schritten verschieben, an den Rändern verlängern oder verkürzen.
- Ganztägige Einträge (Monatsansicht und Ganztagszeile) mit der Maus auf einen anderen Tag ziehen, auf Touchgeräten am Griff ⋮⋮; der Zieltag ist gestrichelt umrandet, Esc bricht ab. Mit der Tastatur verschiebt ++Alt ←/→++ einen fokussierten Eintrag um einen Tag, ++Alt ↑/↓++ in der Monatsansicht um eine Woche.
- Klick auf eine Stunde legt einen Termin an, **Ganztägig +** einen Ganztagseintrag.
- Jede Ansicht hat eine eigene Zeitzone; ohne Einstellung gilt die des Browsers.
- **Wochenbeginn** (Montag oder Sonntag) lässt sich pro Ansicht festlegen; ohne Einstellung folgt er der Sprache der Person, die den Kalender ansieht – Sonntag in [English (US)](/languages), sonst Montag.
- Tastatur: ++Alt ↑/↓++ verschiebt um 15 Minuten, ++Alt ←/→++ um einen Tag.
### Kalender abonnieren
**Abonnieren** in der Kalenderansicht erzeugt deinen persönlichen Link für Apple Kalender, Google Kalender oder Outlook. Er zeigt die Einträge dieser Ansicht mit ihren Filtern – nur, was du sehen darfst – und Wiederholungen als Serien. Der Link ist geheim und nur einmal sichtbar; **Neuen Link erzeugen** macht den alten ungültig, **Abo beenden** schaltet ihn ab. Verlierst du den Zugriff auf die Datenbank, liefert der Link nichts mehr.
### In beide Richtungen synchronisieren (CalDAV)
Im selben Dialog richtet **Zugang einrichten** eine Synchronisation für Apple Kalender, Thunderbird oder DAVx⁵ (Android) ein. Dort angelegte, verschobene, umbenannte oder gelöschte Termine landen in der Datenbank.
- **Zugangsdaten**: Du bekommst Server, Benutzername und ein Passwort, das nur einmal angezeigt wird.
- **Apple**: **In Apple Kalender einrichten** (in der App, in Safari oder auf dem Mac) lädt ein Konfigurationsprofil mit dem Account – installieren unter Einstellungen → **Profil geladen**. Mehrere Kalender auf einmal: **Einstellungen → Kalender & Issues → Kalender auf iPhone, iPad und Mac**. Von Hand: Account hinzufügen → Andere → CalDAV-Account, Typ „Manuell“.
- **Thunderbird und DAVx⁵**: Sie nehmen die Kalender-Adresse direkt.
- **Mehrere Geräte**: Jedes Profil bekommt einen eigenen Zugang, ein auf dem Mac eingerichteter Kalender läuft also weiter, wenn du das Profil auf dem iPhone installierst. **Zugang beenden** oder **Neues Passwort erzeugen** beendet alle Zugänge zu diesem Kalender, auch die der Profile.
- **Rechte**: Es gelten deine Rechte – wer die Datenbank nur lesen darf, kann im Kalender nichts ändern. Workflow und Automationen gelten wie bei jeder Änderung.
Google Kalender unterstützt keine CalDAV-Konten; dafür gibt es den Kalender-Sync unten.
### Kontakte als Adressbuch (CardDAV)
Kontakte-Datenbanken lassen sich wie Kalender abonnieren – als Adressbuch in Apple Kontakte, Thunderbird oder DAVx⁵, nur lesend, mit denselben Zugängen (Passwort nur einmal sichtbar) und einem Konfigurationsprofil für iPhone, iPad und Mac. Siehe [Als Adressbuch abonnieren](/contacts#als-adressbuch-abonnieren-carddav).
### Mit Google Kalender oder Outlook synchronisieren
Mit dem **Kalender-Sync** hältst du eine Ansicht mit Datum und einen Kalender in Google Kalender oder Microsoft Outlook / 365 in beide Richtungen gleich – persönlich, mit deinem eigenen Konto.
::: steps
1. **Einstellungen → Kalender & Issues → Kalender verbinden** → **Mit Google Calendar verbinden** bzw. **Mit Microsoft Outlook / 365 verbinden**. Du meldest dich beim Anbieter an und erlaubst den Zugriff auf deine Kalender.
2. In der Datenbank das Kalendersymbol neben **…** (**Kalender-Sync**) öffnen, die Ansicht, das Konto und den Kalender wählen und **Verbinden**.
:::
Was synchronisiert wird:
- **Titel** ↔ Titel des Termins.
- **Datum** ↔ Beginn und Ende: Datum ohne Uhrzeit wird ein ganztägiger Termin, Datum mit Uhrzeit ein Termin mit Uhrzeit. Die Ansicht bestimmt, welche Datumseigenschaften Beginn und Ende sind; die Zeitzone der Kalenderansicht gilt für Termine ohne eigene Zeitzone.
- **Dokument des Eintrags** ↔ Beschreibung, als reiner Text. Am Ende der Beschreibung steht ein Link zurück zum Eintrag.
- **Neu, geändert, gelöscht** – in beide Richtungen. Im Kalender gelöschte Termine landen als Einträge im Papierkorb der Datenbank.
Gut zu wissen:
- Flowplan gleicht **alle zehn Minuten** ab und holt dabei nur Änderungen; **Jetzt synchronisieren** im Dialog sofort.
- **Konflikte**: Ändern beide Seiten denselben Termin, gewinnt die spätere Änderung. Das Protokoll hält jeden Konflikt fest.
- **Rechte**: Nur Einträge, die du sehen und bearbeiten darfst, gehen in den Kalender und werden vom Kalender geändert. Workflow und Automationen gelten wie bei jeder Änderung.
- **Zeitraum**: Termine von 90 Tagen zurück bis ein Jahr voraus. Wiederholte Termine aus dem Kalender kommen als einzelne Einträge an; ein wiederholter Eintrag geht mit seinem ersten Termin in den Kalender.
- **Trennen** unter **Einstellungen → Kalender & Issues** beendet alle Synchronisierungen dieser Verbindung. Den Zugriff kannst du zusätzlich in deinem Google- oder Microsoft-Konto widerrufen.
- Die Administration muss die Anbieter einmal einrichten, siehe [Konfiguration](/configuration-integrations#kalender-sync).
## Sprints
Backlog, Sprints mit Ziel und Zeitraum, Burndown und Velocity – siehe [Projekte, Tickets und Sprints](/projects-and-tickets#sprints).
## Timeline
Balken von einem Beginn- bis zu einem End-Datumsfeld, im Maßstab Woche, Monat, Quartal oder Jahr.
- Balken verschieben oder an den Rändern ziehen. Auf Touchgeräten einen Balken erst kurz halten, dann ziehen; ein schnelles Wischen scrollt die Timeline. Die Griffe an den Rändern ziehen sofort. Esc bricht ein laufendes Ziehen ab. Das Kalendersymbol öffnet einen Datumsdialog, auch für ungeplante Einträge.
- **Heute** springt zum aktuellen Datum; Wochenenden lassen sich markieren.
- Tastatur: ++Alt ←/→++ verschiebt um einen Tag, mit ⇧ ändert es das Ende, mit Strg den Beginn.
### Abhängigkeiten (Gantt)
Einträge können aufeinander warten – etwa „Druck“ erst nach „Korrektur“:
- In der Leiste der Timeline unter **Abhängigkeiten** eine Relation der Datenbank auf sich selbst wählen – oder **Abhängigkeiten einrichten** legt die Eigenschaft „Abhängigkeiten“ an.
- **Verknüpfen per Ziehen:** Vom runden Griff am Ende eines Balkens auf einen anderen Balken ziehen – dieser wartet dann auf den ersten. Verknüpfungen, die einen Kreis ergäben, lehnt Flowplan ab.
- **Pfeile** verbinden die Balken; beginnt ein Eintrag, bevor sein Vorgänger endet, ist der Pfeil rot. Schon beim Ziehen warnt die Timeline, welcher Eintrag zu früh läge.
- **Nachfolger mitverschieben:** Verschiebst du einen Eintrag, rücken alle Einträge, die direkt oder indirekt auf ihn warten, um dieselben Tage mit – in einem Schritt. Maßgeblich ist die Seite, an der die Verknüpfung hängt: bei „Ende → Anfang“ und „Ende → Ende“ das Ende des Eintrags, bei „Anfang → Anfang“ und „Anfang → Ende“ sein Anfang.
- **Alle Konflikte nachziehen** schiebt jeden zu frühen Eintrag hinter seinen Vorgänger.
- **Kritischen Pfad hervorheben** markiert die Einträge und Pfeile ohne Puffer: Verzögert sich einer davon, verschiebt sich das Ende des ganzen Plans.
In eingebetteten Ansichten (verknüpfte Datenbanken) sind Verknüpfen per Ziehen und **Alle Konflikte nachziehen** nicht verfügbar – dafür die Datenbank selbst öffnen.
## Galerie
Karten mit Vorschaubild und allen angehakten Eigenschaften, die einen Wert haben (wie im Board). Das Bild kommt wahlweise aus dem Inhalt des Eintrags, seinem Cover oder einer Dateien-Eigenschaft, füllend oder eingepasst.
## Liste
Kompakte Zeilen mit Titel und bis zu drei ausgefüllten Eigenschaften, gut für lange Sammlungen.
## Feed
Einträge samt Dokumentinhalt untereinander, wie ein Blog oder ein Protokoll. Titel, **Eintrag öffnen** oder die Kommentaranzahl öffnen den vollständigen Eintrag. Weitere Einträge laden in Schritten von 20.
## Diagramm
**Diagramm konfigurieren** wählt Säulen, Balken, Linie oder Donut, die Gruppierung und die Berechnung – Anzahl, Summe, Mittelwert, Minimum, Maximum. Datumswerte lassen sich nach Tag, Woche, Monat oder Jahr zusammenfassen. Ein Klick auf einen Datenpunkt zeigt die zugehörigen Einträge; **Auswertung als CSV** exportiert alle Werte.
- **Datenreihen** teilen jede Gruppe nach einer weiteren Eigenschaft auf, nebeneinander oder gestapelt.
- **Weitere Werte** stellen bis zu vier zusätzliche Berechnungen neben den Hauptwert, etwa „Summe von Kosten“ neben „Summe von Umsatz“ je Monat. Jeder Wert wird eine eigene Reihe mit Legende; beides zusammen – Datenreihen und weitere Werte – geht nicht.
## Formular
Sammelt Einträge über ein Formular, auch von Personen ohne Konto. Siehe [Formulare](/forms).
## Verknüpfte Datenbanken
In einem Dokument zeigt `/db` eine Ansicht einer vorhandenen Datenbank. Die Einbettung hat eigene Ansichten, Filter und Sortierungen; Einträge und ihre Änderungen gehören weiter zur Quelle. Der Quellname im Kopf öffnet die vollständige Datenbank.
Zum Lesen braucht man Zugriff auf Dokument und Quelle. Die Einbettung erteilt keine zusätzlichen Rechte, **Entfernen** löscht nur den Block.
---
# Eigenschaften, Formeln und Rollups
Relationen verbinden Datenbanken, Rollups rechnen über verknüpfte Einträge, Formeln berechnen Werte aus Eigenschaften desselben Eintrags.
> [!NOTE]
> Hier geht es um die Eigenschaften von Datenbank-Einträgen. Die [Eigenschaften von Seiten](/page-tags#tags-und-eigenschaften) (unter dem Seitentitel) gelten im ganzen Arbeitsbereich oder nur in einem Bereich, siehe [Geltungsbereich](/page-tags#geltungsbereich-arbeitsbereich-oder-bereich).
## Eigenschaften bearbeiten
Ein Klick auf den Spaltenkopf oder **Ansicht und Eigenschaften** öffnet den Eigenschaftsdialog: Name, Typ (einer von 24 Eigenschaftstypen), Optionen und Format. Typwechsel übernehmen vorhandene Werte, soweit sie passen. Formate für Zahlen umfassen Währungen, Prozent, Dezimalstellen und Tausendertrennzeichen und gelten auch für Formeln mit Zahlenergebnis; Datumsfelder zeigen kurz, lang oder ISO und optional Uhrzeiten; **Datum entfernen** unter dem Feld leert es wieder.
**URL, E-Mail und Telefon** erscheinen in Tabelle, Liste, Board, Galerie und im Eintrag als Link: Webadressen öffnen sich in einem neuen Tab (gekürzt auf Host und Pfad, die volle Adresse steht im Tooltip), E-Mail-Adressen im Mailprogramm, Telefonnummern in der Telefon-App. Zum Ändern klickst du auf den Stift neben dem Link (am Computer beim Überfahren oder mit der Tab-Taste, am Handy immer sichtbar) oder auf die freie Fläche der Zelle; Enter speichert, Esc verwirft. Nur `http://`- und `https://`-Adressen, E-Mail-Adressen und Telefonnummern werden zu Links – alles andere bleibt einfacher Text.
### Optionen umbenennen und zusammenführen
Einträge speichern bei Auswahl und Mehrfachauswahl den Namen der Option. Benennst du im Eigenschaftsdialog eine Option um, listet der Dialog vor dem Speichern, was sich mitändert, etwa *„Offen“ in „Zu erledigen“ umbenennen (12 Einträge).*
- **Einträge anpassen** nimmt den neuen Namen überall mit: in die Einträge (auch Datensatzvorlagen, Papierkorb und Formularentwürfe), in Filter, Gruppen und Board-Spalten der Ansichten, in [verknüpfte Ansichten](/views#verknuepfte-datenbanken) der Datenbank auf anderen Seiten und in die Regeln der Datenbank – Erledigt-Regel, Workflow, Automationen, Bedingungen in Formularen und die Status-Zuordnung der Issue-Synchronisierung. Die Einträge behalten ihren Wert unter dem neuen Namen; Workflow-Prüfungen und Automationen lösen dabei nicht aus. Vorher sichert Flowplan einen Stand im Versionsverlauf.
- **Zusammenführen:** Schreibst du den Namen einer anderen Option an die Stelle einer Option, werden die beiden zusammengeführt (*„Erledigt“ mit „Fertig“ zusammenführen*). Die Einträge bekommen die verbliebene Option, die ihre eigenen Regeln behält; die Einstellungen der zusammengeführten Option unter **Statusregeln und Erledigt** fallen weg – der Dialog weist darauf hin.
- **Nur Optionen speichern** speichert nur die Liste; Einträge, Filter und Regeln bleiben bei den alten Namen, wie früher.
- **Formeln** werden nicht umgeschrieben: Vergleicht eine Formel mit dem Namen einer Option (etwa `prop("Status") == "Offen"`), passe sie selbst an.
Umbenennen darf, wer die Eigenschaft bearbeiten darf. Für die [Tags des Arbeitsbereichs](/database-properties#mehrfachauswahl-mit-den-tags-des-arbeitsbereichs) gilt das Umbenennen unter **Einstellungen → Tags & Eigenschaften**.
## Aliasse
Der Eigenschaftstyp **Aliasse (andere Namen)** hält weitere Namen eines Eintrags, etwa „PAC“ und „Pompe à chaleur“ für den Eintrag „Chauffage“. Eine Datenbank hat höchstens eine solche Eigenschaft. Im Eintrag trägst du die Namen durch Kommas getrennt ein; es zählen bis zu 10 Aliasse mit je bis zu 100 Zeichen, Leerzeichen am Rand und doppelte Namen (Groß- und Kleinschreibung egal) fallen weg.
Aliasse wirken wie der Titel:
- **@-Erwähnungen** und die [Schnellsuche](/search-and-notifications#schnellsuche) finden den Eintrag auch über einen Alias und zeigen dann den echten Titel mit dem Alias in Grau: „Chauffage · PAC“. Aliasse zählen in der Suche so viel wie der Titel.
- **Nicht verlinkte Erwähnungen** suchen auch nach jedem Alias – als ganzes Wort, ab zwei Zeichen, ohne Rücksicht auf Groß- und Kleinschreibung. **Verlinken** lässt den Text, wie er dasteht: Aus „PAC“ wird ein Link auf „Chauffage“ mit der Beschriftung „PAC“.
- Der **Markdown-Export** schreibt sie als `aliases:` ins Frontmatter, der Markdown-Import liest `aliases:` und `alias:` zurück ([Frontmatter](/import-export-versions#frontmatter-eintraege-als-markdown-dateien)).
Filter („enthält“, „ist“), Sortierung, Formeln (als Liste wie Mehrfachauswahl), CSV und die übrigen Exporte behandeln Aliasse wie eine Liste von Texten. Ein Alias darf bei mehreren Einträgen vorkommen; dann erscheinen beide. Aliasse findet nur, wer den Eintrag ohnehin lesen darf.
Seiten haben ihre Aliasse unter **… → Aliasse …** – siehe [Seiten und Bereiche](/page-tags#aliasse).
## Sichtbarkeit von Eigenschaften
Einzelne Eigenschaften wie „Gehalt“ oder „Interne Notiz“ lassen sich auf bestimmte Personen beschränken. Im Eigenschaftsdialog legt der Abschnitt **Sichtbarkeit** fest, wer die Eigenschaft **sieht** und wer sie **bearbeitet**:
| Auswahl | Sehen | Bearbeiten |
| --- | --- | --- |
| **Alle mit Zugriff** (Standard beim Sehen) | Alle, die die Datenbank lesen dürfen | – |
| **Bearbeiter und Besitzer** (Standard beim Bearbeiten) | Rollen Bearbeiten und Eigentümer | Rollen Bearbeiten und Eigentümer |
| **Nur Besitzer** | Eigentümer der Datenbank | Eigentümer der Datenbank |
| **Ausgewählte Gruppen** | Mitglieder dieser [Gruppen](/workspaces-and-permissions#gruppen) | Mitglieder dieser Gruppen mit Bearbeitungsrecht |
- Nur **Eigentümer der Datenbank** ändern die Sichtbarkeit; sie sehen und bearbeiten selbst immer alles.
- Eingeschränkte Eigenschaften tragen im Spaltenkopf ein **Schloss**. Wer eine Eigenschaft nicht sehen darf, bekommt die Spalte gar nicht; Zellen, die jemand nur sehen darf, sind schreibgeschützt und nennen beim Überfahren, wer sie bearbeiten darf („Nur für … bearbeitbar“).
- Die Regeln engen Seiten- und Eintragsrechte nur ein: Wer die Datenbank nur ansehen darf, bearbeitet auch eine Eigenschaft für „ausgewählte Gruppen“ nicht.
- Die **Titeleigenschaft** (die erste) sehen immer alle mit Zugriff.
- Der Server setzt die Regeln überall durch: in der Datenbank selbst, in verknüpften Ansichten, Dashboards, Whiteboard-Karten, Exporten (Markdown, CSV, JSON, Word, EPUB, Druck), Versionen, über die API und den [MCP-Server](/mcp), für die [KI](/ai) und in Kalender-Abos. Änderungen an Eigenschaften, die jemand nicht bearbeiten darf – im Eintrag, per Mehrfachbearbeitung, Import, API, KI oder CalDAV –, lehnt er mit einer Meldung ab.
- **Öffentlich** sind eingeschränkte Eigenschaften nie: Veröffentlichungen, Links mit eigenen Berechtigungen, Formulare, das Kundenportal und Webhooks lassen sie weg, auch wenn ein Link Bearbeiten erlaubt.
- Die **Volltextsuche** und die semantische Suche der KI nehmen eingeschränkte Eigenschaften nicht auf, für niemanden.
- **Formeln, Rollups, KI-Eigenschaften, Fortschritt und Zeit**, die eine verborgene Eigenschaft lesen, gelten für diese Person ebenfalls als verborgen – ihr Ergebnis würde den Wert sonst verraten. Eine Formel mit berechnetem `prop()`-Namen hängt von allen Eigenschaften ab. Ein Rollup ist verborgen, wenn die Person die Eigenschaft in der Zieldatenbank nicht sehen darf.
- Wer eine Eigenschaft nicht sieht, kann sie beim Ändern des Schemas weder verlieren noch löschen. Versionen einer Datenbank mit eingeschränkten Eigenschaften stellen nur Eigentümer wieder her, und Einträge mit verborgenen Eigenschaften lassen sich nicht in eine Seite umwandeln oder in eine andere Datenbank verschieben (Kopieren lässt die verborgenen Werte weg).
Filter und Sortierungen einer Ansicht, die eine verborgene Eigenschaft nutzen, wirken für diese Person wie auf leere Werte; die Bedingung selbst (etwa der Vergleichswert) bleibt in der Ansicht gespeichert.
## Relationen
::: steps
1. **Eigenschaft hinzufügen → Relation** und die Zieldatenbank wählen.
2. Optional **in beide Richtungen**: Die Zieldatenbank erhält eine Gegen-Eigenschaft, Änderungen werden auf beiden Seiten gepflegt.
3. In der Zelle Einträge suchen und verknüpfen; mehrere Verknüpfungen lassen sich einzeln entfernen oder gemeinsam leeren.
:::
Relationen erscheinen im Eintrag als Links. Die Datenbanksuche findet Einträge auch über die Namen verknüpfter Einträge, Relationsfilter bieten diese Namen direkt an.
Verknüpfte Einträge zeigen ihr Symbol, in der Zelle wie in der Auswahl. Ein Klick auf einen verknüpften Eintrag öffnet ihn als Fenster über der aktuellen Tabelle – du bleibst in deiner Datenbank und kehrst mit **Schließen** dorthin zurück. **In Datenbank öffnen** wechselt in die Datenbank des Eintrags.
## Rollups
::: steps
1. Zuerst eine Relation anlegen.
2. **Eigenschaft hinzufügen → Rollup**, dann Relation und Eigenschaft der Zieldatenbank wählen.
3. Berechnung wählen – 22 stehen zur Verfügung, passend zum Typ: Originalwerte, eindeutige Werte, Anzahl, leer/gefüllt (auch als Anteil), Summe, Mittelwert, Median, Minimum, Maximum, Spannweite, abgehakt/nicht abgehakt, frühestes und spätestes Datum, Zeitraum.
:::
Frühestes und spätestes Datum über **Erstellt am** oder **Bearbeitet am** ergeben einen Zeitpunkt in UTC, angezeigt in deiner Zeitzone. Zahlen-Rollups erscheinen als Zahl, Fortschrittsbalken, Fortschrittsring oder Bewertung, mit einstellbarem Zielwert. Werte aus Datenbanken, die jemand nicht lesen darf, werden für diese Person nicht geladen.
## KI-Eigenschaften
Ist die [KI](/ai) eingeschaltet, kann eine Eigenschaft ihren Wert aus einem Auftrag an die KI beziehen – etwa eine Zusammenfassung oder eine Kategorie aus anderen Eigenschaften. Alles dazu unter [KI in Datenbanken](/ai-actions#ki-in-datenbanken).
## Formeln
Im Eigenschaftsdialog den Typ **Formel** wählen. Der Editor bietet 58 Funktionen mit Suche, Kategorien, Signaturen und Beispielen, Vorschläge beim Tippen und eine Live-Vorschau an einem wählbaren Eintrag.
```
round(prop("Aufwand") * prop("Stundensatz"), 2)
```
```
if(prop("Erledigt"), "✓", concat(format(dateBetween(prop("Fällig"), today(), "days")), " Tage"))
```
- Bezüge mit `prop("Name")` bleiben beim Umbenennen der Eigenschaft gültig.
- Syntaxfehler zeigen ihre Position und verhindern das Speichern.
- Zahlenergebnisse stehen in Filtern, Sortierungen, Diagrammen und Spaltenberechnungen zur Verfügung.
- Datumsfunktionen rechnen ohne ausdrückliche Zone in UTC; `now()` und `today()` aktualisieren sich minütlich.
- Ist ein Datum leer, liefern Datumsfunktionen ein leeres Ergebnis statt `#ERROR`. Bei Vergleichen zählt ein leerer Wert als 0 – `dateBetween(prop("Fällig"), today()) < 3` trifft also auch Einträge ohne Datum; dagegen hilft `!empty(prop("Fällig")) && dateBetween(prop("Fällig"), today()) < 3`.
- **Erstellt am** und **Bearbeitet am** lesen Formeln als Zeitpunkt in UTC (etwa `2026-11-05T17:39:02Z`), sodass alle Datumsfunktionen damit rechnen, z. B. `formatDate(prop("Erstellt am"), "DD.MM.", "Europe/Berlin")`.
- Formeln führen kein JavaScript aus; Länge, Verschachtelung und Ergebnisgröße sind begrenzt.
### Funktionsgruppen
| Gruppe | Beispiele |
| --- | --- |
| Logik | `if`, `ifs`, `coalesce`, `and`, `or`, `not`, `empty` |
| Zahlen | `sum`, `average`, `min`, `max`, `round`, `ceil`, `floor`, `abs`, `mod`, `pow`, `sqrt` |
| Text | `concat`, `length`, `contains`, `replace`, `replaceAll`, `trim`, `slice`, `lower`, `upper`, `format`, `toNumber` |
| Datum | `now`, `today`, `parseDate`, `formatDate`, `dateAdd`, `dateSubtract`, `dateBetween`, `year`, `month`, `day`, `hour`, `timestamp` |
| Listen | `list`, `count`, `at`, `first`, `last`, `join`, `split`, `unique`, `sort`, `reverse` |
Die vollständige Liste zeigt der Formeleditor.
---
# Formulare
Eine Formularansicht sammelt Antworten direkt als Einträge in der Datenbank – von Mitgliedern oder, wenn freigegeben, von jeder Person mit dem Link.
## Formular gestalten
::: steps
1. In der Datenbank eine Ansicht vom Typ **Formular** anlegen.
2. **Formular gestalten** öffnet den Editor:
- Titel, Beschreibung und Beschriftung des Absenden-Knopfs,
- Fragen: Reihenfolge, ausblenden, **Pflichtfeld**, Hilfetext je Frage,
- Frageart: kurzer oder **langer Text**, **Auswahlknöpfe** statt Liste, **Lineare Skala 1–10** für Zahlen,
- **Nur zeigen, wenn …** je Frage (siehe [Bedingungen und Seiten](#bedingungen-und-seiten)),
- **Textblock davor**, **Textblock am Ende** und **Neue Seite ab hier** für Erklärungen und mehrere Seiten,
- **Titel nach dem Absenden** und **Bestätigungstext**,
- was **nach dem Absenden** passiert (siehe [Einstellungen](#einstellungen)).
3. **Formular speichern**.
:::
Pflichtfelder und Eingabetypen prüft Flowplan im Browser und auf dem Server. Dateien-Eigenschaften erlauben Uploads im Formular.
### Bedingungen und Seiten
Jede Frage, jeder Textblock und jeder Seitenumbruch kann **Nur zeigen, wenn …** eine frühere Antwort passt – etwa „Art **ist** Fehler“, „Themen **enthält** Abrechnung“, „Betreff **enthält den Text** Rechnung“, „Wichtigkeit **ist größer als** 7“ oder „E-Mail **ist beantwortet**“. Ein ausgeblendeter Seitenumbruch blendet die ganze Seite aus.
- Ausgeblendete Fragen sind nicht Pflicht, und ihre Antworten werden nicht gespeichert – auch nicht, wenn sie trotzdem mitgeschickt werden. Der Server prüft dieselben Regeln wie der Browser.
- Hängt eine Frage an einer ausgeblendeten Frage, bleibt sie ebenfalls ausgeblendet.
- Bei mehreren Seiten zeigt ein **Fortschrittsbalken** den Stand (abschaltbar); **Zurück** und **Weiter** wechseln die Seite, Pflichtfragen werden je Seite geprüft.
### Einstellungen
Unter **Nach dem Absenden**, **Bestätigung per E-Mail** und **Team benachrichtigen** – im Formular-Editor wie in den Einstellungen einer Umfrage:
- **Danach weiterleiten zu**: eine Adresse mit `https://`, zu der die Dankeschön-Seite nach einigen Sekunden (0–60, Standard 3) weiterleitet.
- **Platzhalter**: `{Name der Frage}` setzt die Antwort auf diese Frage ein – im Titel und Text nach dem Absenden, in der Weiterleitung (dort nur nach dem Domainnamen, z. B. `https://example.com/danke?name={Name}`) und in der E-Mail. Unbekannte Namen bleiben stehen; Personen, Relationen und Dateien werden nicht eingesetzt.
- **Bestätigung per E-Mail an die Antwortenden**: Betreff und Text sind frei wählbar. Die E-Mail enthält den Text und die beantworteten Fragen als Liste – ohne ausgeblendete und interne Eigenschaften – und, mit [Kundenportal](#kundenportal), den Link zur Anfrage (dann kommt nur diese eine E-Mail). Sie geht an die erste beantwortete E-Mail-Frage; in Formularen, die nicht anonym sind, sonst an die Adresse des angemeldeten Kontos. Anonyme Formulare schreiben nur, wenn die Person ihre Adresse selbst eingibt. Voraussetzung ist eingerichtetes E-Mail ([Konfiguration](/configuration)); je Adresse gehen höchstens 5 E-Mails pro Stunde, je Absender 10 und je Formular 300.
- **Team benachrichtigen**: Die gewählten Mitglieder bekommen bei jeder neuen Antwort eine Benachrichtigung der Art „Gastkommentare und Gasteinträge“ – sofern sie den Eintrag sehen dürfen.
### Später weitermachen
In Formularen und Umfragen, die nicht anonym sind, speichert **Speichern und später weitermachen** die bisherigen Antworten als Entwurf für dich (ohne Dateien). Öffnest du den Link wieder, geht es auf derselben Seite weiter; nach dem Absenden ist der Entwurf weg. Entwürfe, die ein halbes Jahr nicht geändert wurden, werden gelöscht.
## Formular teilen
Unter **Formular teilen** das Formular einschalten und den Link kopieren.
- **Nur Mitglieder**: Antworten erfordern eine Anmeldung; die Antwort trägt den Namen der Person.
- **Anonym**: Jede Person mit dem Link kann antworten, ohne Konto und ohne Namen. Dateien aus anonymen Antworten zählen gegen ein Tagesbudget: 200 MB je Formular und `FLOWPLAN_ANONYMOUS_UPLOAD_MB` für die ganze Instanz ([Konfiguration](/configuration)); je Formular werden außerdem höchstens 1000 Antworten pro Stunde angenommen.
Personen- und Relationsfragen gibt es nur in Formularen für Mitglieder, weil sie Mitglieder und Einträge sichtbar machen würden.
> [!NOTE]
> Kopierte oder importierte Formulare starten ausgeschaltet und nur für Mitglieder. In der Demo lassen sich Formulare gestalten, aber nicht öffentlich schalten, und Bestätigungen per E-Mail lassen sich nicht einschalten.
## Antworten
Jede Antwort ist ein normaler Eintrag: Er erscheint in allen Ansichten und lässt sich filtern, zuweisen und kommentieren.
## Umfragen
Ein Formular wird mit **Als Umfrage gestalten** zur Umfrage – oder du legst eine neue Seite aus der Vorlage **Umfrage** an. Der Builder hat fünf Reiter: **Fragen**, **Vorschau**, **Einstellungen**, **Teilen** und **Ergebnisse**.
Links steht der Ablauf mit nummerierten Fragen, Textblöcken und Seitenumbrüchen, rechts bearbeitest du das gewählte Element. **Frage hinzufügen** zeigt die Fragetypen nach Auswahl, Bewertung sowie Text und Angaben geordnet. Alles wird **automatisch gespeichert**, kurz nachdem du aufhörst zu tippen – der Punkt oben rechts zeigt den Stand. Fehlt noch etwas (eine Frage ohne Text, eine leere Antwort, eine Weiterleitung ohne `https://`), wartet das Speichern und nennt den Grund.
### Fragetypen
Umfragen kennen 19 Fragetypen:
- **Text**: kurze Antwort, langer Text, E-Mail, Telefon, Website, Zahl, Datum, Uhrzeit
- **Auswahl**: Einfachauswahl, Mehrfachauswahl, Dropdown, Ja / Nein – wahlweise mit „Andere“ samt Textfeld, zufälliger Reihenfolge und Mindest- oder Höchstzahl
- **Bewertung**: Sterne (3 bis 10), Weiterempfehlung (NPS, 0–10), Skala mit Beschriftung an beiden Enden, Schieberegler
- **Matrix (Likert)**: mehrere Aussagen mit denselben Antworten
- **Rangfolge**: Einträge in eine Reihenfolge bringen
- **Datei-Upload**
- Außerdem **Textblöcke** für Erklärungen und **Seitenumbrüche** für mehrere Seiten.
Mehrere Zeilen in ein Antwortfeld einfügen legt mehrere Antworten auf einmal an.
### Bedingungen
Jede Frage, jeder Textblock und jeder Seitenumbruch kann **Nur zeigen, wenn …** eine frühere Antwort passt – mit denselben Vergleichen wie in [Formularen](#bedingungen-und-seiten). Beispiel: „Was sollten wir besser machen?“ erscheint nur bei einer Weiterempfehlung bis 6. Ausgeblendete Fragen sind nicht Pflicht, und ihre Antworten werden nicht gespeichert.
### Umfrage-Einstellungen
- Begrüßungsseite, Fortschrittsbalken bei mehreren Seiten, Dankeschön-Text mit Platzhaltern
- Weiterleitung, Bestätigung per E-Mail und Team-Benachrichtigung wie bei [Formularen](#einstellungen)
- **Schließt am** und **Höchstens so viele Antworten** – danach nimmt die Umfrage nichts mehr an
- **Nur eine Antwort pro Person** – angemeldete Personen über ihr Konto, anonyme über ihre Verbindung
- eine Akzentfarbe
### Teilen und Auswerten
**Teilen** öffnet die Umfrage. Sie kann öffentlich sein, also für jede Person mit dem Link, und anonym, also ohne Anmeldung und ohne Namen.
Jede Antwort ist ein Eintrag in der Datenbank. Jede Frage ist eine Eigenschaft, eine Matrix eine Eigenschaft je Zeile. So kannst du Antworten filtern, sortieren, als CSV exportieren und mit Automationen weiterverarbeiten.
**Ergebnisse** zeigt:
- die Zahl der Antworten pro Tag,
- je Frage Anzahl und Anteil jeder Antwort,
- Durchschnitt, Minimum und Maximum,
- den NPS-Wert mit Promotoren, Passiven und Kritikern,
- Matrix-Tabellen, durchschnittliche Plätze der Rangfolge (Optionen, die noch niemand eingeordnet hat, stehen mit „–“ am Ende) und die neuesten Textantworten.
> [!NOTE]
> Benennst du eine Frage um, behält sie ihre Antworten. Wechselst du den Typ so, dass sich die gespeicherte Art ändert (z. B. von Text zu Zahl), entsteht eine neue Eigenschaft – die bisherigen Antworten bleiben in der alten.
## Kundenportal
Mit dem Kundenportal wird ein Formular zum Service-Desk: Wer es absendet, kann seine Anfrage danach verfolgen.
::: steps
1. Unter **Formular teilen** das **Kundenportal** einschalten.
2. Auswählen, welche Eigenschaften im Portal sichtbar sind – etwa **Status** oder ein Fälligkeitsdatum. Eine Auswahl-Eigenschaft namens „Status“ ist beim Einschalten schon vorgewählt. Personen, Relationen und Dateien bleiben immer intern.
:::
Nach dem Absenden sieht die Person einen privaten Link zu ihrer Anfrage. Hat sie eine E-Mail-Frage beantwortet und ist E-Mail eingerichtet, kommt der Link auch per E-Mail – in ihrer Sprache; mit eingeschalteter Bestätigung per E-Mail steht er in dieser einen E-Mail. Auf der Seite stehen der Stand, ihre Angaben und eine Unterhaltung mit dem Team.
Das Team antwortet im Eintrag unter **Kundenanfrage**. Antworten gehen per E-Mail an die Person; schreibt sie zurück, bekommen die Personen im Eintrag, alle, die schon geantwortet haben, und wer die Datenbank angelegt hat, eine Benachrichtigung. **Kundenlink kopieren** gibt den Link weiter, wenn keine E-Mail-Adresse vorliegt.
> [!NOTE]
> Der Link ist der Schlüssel: Wer ihn hat, sieht die Anfrage und kann antworten. Schaltest du das Kundenportal oder das Formular aus, funktionieren alle Links nicht mehr; eingeschaltet gehen sie wieder.
## Formularantworten weiterverarbeiten
Der Workflow-Auslöser **Formularantwort** startet einen [Workflow](/workflows) für jede Antwort – etwa mit der Vorlage **Formular → KI-Kategorie → Zuweisung**: die KI ordnet die Antwort einer Kategorie zu, die zuständige Person wird eingetragen und benachrichtigt.
---
# Kontakte
Eine Kontakte-Datenbank ist ein Adressbuch für Personen: Jeder Eintrag hat eine Profilseite mit Kontaktkarte, darunter Platz für Notizen. Kontakte lassen sich aus einem LDAP-Verzeichnis übernehmen und abgleichen, als vCard importieren und exportieren und als Adressbuch (CardDAV) auf dem Telefon abonnieren.
## Kontakte-Datenbank anlegen
**Neue Seite → Datenbank → Kontakte**. Die Datenbank bringt mit:
| Eigenschaft | Art |
| --- | --- |
| Name | Text – der Anzeigename „Vorname Nachname“ |
| Vorname, Nachname | Text |
| Firma, Position | Text |
| E-Mail | E-Mail |
| Telefon, Mobil | Telefon |
| Straße, PLZ, Ort, Land | Text |
| Geburtstag | Datum |
| Tags | Mehrfachauswahl |
Dazu die Ansichten **Alle Kontakte** (Liste, nach Nachname sortiert), **Tabelle**, **Geburtstage** (Kalender) und **Galerie**. Einträge öffnen als ganze Seite.
- **Name**: Ein neuer Eintrag heißt „Neuer Kontakt“. Tippst du einen vollständigen Namen in den Titel („Anna Maria Schmidt“), füllt Flowplan Vor- und Nachname (das letzte Wort ist der Nachname). Änderst du Vor- oder Nachname, folgt der Titel – bis du ihn selbst anders schreibst, etwa „Dr. A. Schmidt“.
- **Geburtstage** wiederholen sich jährlich: Der Kalender „Geburtstage“ zeigt sie jedes Jahr, mit Alter auf der Kontaktkarte.
- **Für KI gesperrt**: Kontakte sind personenbezogene Daten. Neue Kontakte-Datenbanken sind deshalb [für die KI gesperrt](/ai#seiten-und-bereiche-fuer-die-ki-sperren); wer die Seite verwaltet, kann das aufheben. Wer die Kontakte sieht, bestimmen wie immer die Rechte von Bereich und Seite (und, falls gesetzt, [Rechte pro Eintrag](/databases#rechte-pro-eintrag)).
## Die Profilseite
Oben steht die **Kontaktkarte**: Foto (oder Initialen), Position und Firma, anklickbare Knöpfe für E-Mail (`mailto:`), Telefon und Mobil (`tel:`), die Adresse mit Link zur Karte (OpenStreetMap) und der Geburtstag. Rechts lädt ⤓ den Kontakt als vCard herunter. Darunter folgen die Eigenschaften zum Bearbeiten und das Dokument für Notizen – mit allem, was der Editor kann.
Das Foto ist das Symbol des Eintrags: **Symbol ändern → Bild** setzt eines, beim vCard- oder LDAP-Import kommt es mit.
Die Kontaktkarte ist eine Einstellung des Layouts: **Layout anpassen** (Regler im Eintrag) → **Kontaktkarte oben**. So bekommt auch eine bestehende Datenbank eine Kontaktkarte, wenn sie Eigenschaften mit den Kennungen `firstName`, `lastName`, `company`, `email` … hat.
## Kontakte erwähnen
Mit **@** im Text findest du Kontakte wie jeden anderen Eintrag. Fährst du über die Erwähnung (oder tippst sie an), zeigt eine Karte Name, Position, Firma, E-Mail und Telefon – E-Mail und Telefon sind direkt anklickbar – und **Profil öffnen**. Die Karte zeigt nur, was du lesen darfst.
## vCard importieren und exportieren
Das Adressbuch-Symbol in der Werkzeugleiste der Datenbank öffnet das Menü **Kontakte**:
- **vCard importieren (.vcf)**: Dateien aus Apple Kontakte, Google Kontakte, Outlook oder Thunderbird, vCard 2.1, 3.0 und 4.0, beliebig viele Kontakte je Datei (bis 5 MB). Name, Firma, Position, erste E-Mail, Telefon und Mobil, (geschäftliche) Adresse, Geburtstag, Kategorien als Tags, die Notiz als Text des Eintrags und eingebettete Fotos (JPEG/PNG bis 256 KB) werden übernommen. Fotos über einen Link lädt Flowplan nie nach. Eine Karte, die aus dieser Datenbank exportiert wurde, aktualisiert ihren Eintrag statt einen neuen anzulegen.
- **Alle als vCard exportieren** oder – bei ausgewählten Einträgen – **Auswahl als vCard exportieren**: eine `.vcf`-Datei (vCard 3.0) mit Notiz und Foto. Einzelne Kontakte über ⤓ auf der Kontaktkarte. Exporte enthalten nur Einträge und Eigenschaften, die du lesen darfst, und erscheinen im Sicherheitsprotokoll.
## Als Adressbuch abonnieren (CardDAV)
**Kontakte → Als Adressbuch abonnieren (CardDAV)** macht die Datenbank zu einem Adressbuch in Apple Kontakte, Thunderbird oder DAVx⁵ (Android) – **nur lesend**: Änderungen machst du in Flowplan.
- **Zugang einrichten** zeigt Server, Benutzername und ein Passwort, das nur einmal angezeigt wird, dazu die Adresse des Adressbuchs. **Neues Passwort erzeugen** oder **Zugang beenden** beendet den alten Zugang.
- **Auf iPhone, iPad oder Mac einrichten** lädt ein Konfigurationsprofil mit dem CardDAV-Account (in der App über Safari; am Computer als QR-Code). Der Link gilt einmal und zehn Minuten.
- Von Hand in Apple: **Einstellungen → Kontakte → Accounts → Account hinzufügen → Andere → CardDAV-Account** mit Server, Benutzername und Passwort. Die Erkennung läuft über `/.well-known/carddav`.
- **Rechte**: Jede Abfrage prüft deine Rechte neu. Du siehst nur Einträge und Eigenschaften, die du in Flowplan lesen darfst; verlierst du den Zugriff auf die Datenbank, liefert das Adressbuch nichts mehr.
## Kontakte aus dem LDAP-Verzeichnis
Ist ein LDAP-Verzeichnis eingerichtet (siehe [Kontakte aus LDAP](/scim-and-ldap#kontakte-aus-ldap)), übernehmen Bearbeiter einer Kontakte-Datenbank Personen daraus.
Das Verzeichnis ist nur für Leute aus der Organisation da: Administratoren der Instanz, Konten, die sich mit LDAP anmelden, und Vollmitglieder (keine Gäste) mindestens eines Arbeitsbereichs, den jemand anderes angelegt hat. Gäste des Arbeitsbereichs der Kontakte-Datenbank können es nie durchsuchen oder importieren, und mit einem API-Token geht es auch nicht. Wer keinen Zugriff hat, sieht **Aus LDAP importieren** ausgegraut mit dem Grund.
::: steps
1. **Kontakte → Aus LDAP importieren** öffnet den Baum der Organisationseinheiten (OU) unter dem Basis-DN; Unter-OUs laden beim Aufklappen.
2. Eine OU wählen: rechts stehen die Personen darin (Suche: in der OU und allen darunter). Bereits übernommene sind markiert.
3. Personen ankreuzen und **übernehmen** – oder **Ganze OU übernehmen (auch künftige)**: alle Personen der OU und ihrer Unter-OUs, neue kommen beim Abgleich dazu.
4. **Zuordnung der Attribute** (aufklappbar) legt fest, welches LDAP-Attribut welche Eigenschaft füllt; das erste Attribut mit Wert gilt. Standard:
:::
| Eigenschaft | LDAP-Attribute |
| --- | --- |
| Name | `displayName`, `cn` |
| Vorname / Nachname | `givenName` / `sn` |
| Firma | `company`, `o` |
| Position | `title` |
| E-Mail | `mail` |
| Telefon / Mobil | `telephoneNumber` / `mobile` |
| Straße | `street`, `streetAddress` |
| PLZ / Ort / Land | `postalCode` / `l` / `co`, `c` |
| Geburtstag | `birthDate`, `dateOfBirth` (falls vorhanden) |
| Foto | `thumbnailPhoto`, `jpegPhoto` (JPEG/PNG bis 256 KB) |
Zuordnen lassen sich nur freigegebene Attribute: die der Standardzuordnung und die, die die Administration zusätzlich freigibt (`LDAP_CONTACTS_ATTRIBUTES` oder **Weitere Attribute**, siehe [Kontakte aus LDAP](/scim-and-ldap#kontakte-aus-ldap)). Der Dialog nennt die erlaubten Attribute; eine Zuordnung mit einem anderen wird abgelehnt. Nimmt die Administration ein Attribut wieder von der Liste, liest auch der Abgleich es nicht mehr.
**Abgleich** – nur Verzeichnis → Flowplan:
- Flowplan gleicht stündlich ab (einstellbar) und auf **Kontakte → Jetzt abgleichen**; das Menü zeigt das letzte Ergebnis.
- Eigenschaften aus dem Verzeichnis sind in Flowplan **schreibgeschützt** und mit **LDAP** markiert, die Kontaktkarte zeigt **aus LDAP**. Notizen, Tags und eigene Eigenschaften bleiben frei.
- Verschwindet ein Eintrag aus dem Verzeichnis, bleibt der Kontakt und bekommt den Tag **Nicht mehr im Verzeichnis**; taucht er wieder auf, verschwindet der Tag. Würde ein Lauf mehr als die Hälfte der Kontakte (mindestens fünf) als verschwunden markieren, bricht er ab – das ist eher eine falsche Konfiguration.
- Kontakte werden über `entryUUID` (OpenLDAP), `objectGUID` (Active Directory) oder `nsUniqueId` (389 DS) wiedergefunden, sonst über den DN – umbenannte oder verschobene Einträge behalten ihren Kontakt.
- Einer OU nicht mehr folgen: im Import-Dialog **Nicht mehr folgen**; die Kontakte bleiben.
- Importe stehen im Sicherheitsprotokoll der Administration.
---
# Projekte, Tickets und Sprints
Werkzeuge für Teams, die mit Tickets arbeiten – alle optional: Eine Datenbank verhält sich wie bisher, bis du eines davon einrichtest.
Die meisten findest du im Menü **…** rechts in der Werkzeugleiste einer Datenbank: Datensatzvorlagen, **Automationen**, **Statusregeln und Erledigt**, **Zeiten auswerten** und **Git-Anbindung**.
**Mehr zum Thema:** [Git und Issues](/git-and-issues)
## Ticketnummern
Eine Eigenschaft vom Typ **ID (Ticketnummer)** zeigt für jeden Eintrag eine fortlaufende Nummer wie `WEB-123`.
- Das **Präfix** wählst du beim Anlegen; es ist im Arbeitsbereich eindeutig. Eine kopierte Datenbank, eine aus einer Vorlage angelegte und eine wiederhergestellte, deren Präfix inzwischen vergeben ist, bekommen das nächste freie (`WEB2`, `WEB3`, …).
- Nummern werden nie doppelt vergeben, auch nicht nach dem Löschen. Ein wiederhergestellter Eintrag behält seine Nummer.
- **Im Text** wird `WEB-123` in jedem Dokument hervorgehoben: Beim Darüberfahren siehst du Titel und Status, ⌘ /Strg -Klick öffnet den Eintrag. Das klappt auch für Text, der vor der ID-Eigenschaft geschrieben wurde.
- Die **Suche** findet Einträge über ihre Nummer, und **Git-Commits** können darauf verweisen (siehe unten).
## Unteraufgaben und Epics
Der Typ **Übergeordneter Eintrag (Unteraufgaben)** lässt Einträge unter einem anderen Eintrag derselben Datenbank stehen – etwa Epic → Story → Aufgabe. Schleifen lehnt Flowplan ab.
- **Im Eintrag** listet der Abschnitt **Unteraufgaben** alle darunterliegenden Einträge mit ihrem Stand; neue legst du dort direkt an.
- **In Tabellen** zeigt **Ansicht → Unteraufgaben als Baum zeigen** die Einträge eingerückt und auf- und zuklappbar.
- **Fortschritt der Unteraufgaben** ist eine eigene Eigenschaft: Sie zeigt den erledigten Anteil über alle Ebenen als Balken.
- **Auf Boards** entstehen Epic-Swimlanes mit **Swimlanes nach** und der Eigenschaft für den übergeordneten Eintrag.
## Wann ist ein Eintrag erledigt?
Sprints, Fortschritt, überfällige Einträge und „Meine Aufgaben“ müssen wissen, wann ein Eintrag erledigt ist. Flowplan erkennt das selbst:
- an einer Status-Auswahl mit einer Option wie „Erledigt“, „Done“, „Terminé“, „Fermé“, „Completato“, „Hecho“ oder „已完成“,
- sonst an einer Checkbox „Erledigt“ (oder „Done“, „Terminé“ …).
Unter **… → Statusregeln und Erledigt** legst du es fest, wenn es anders sein soll. Status wie „Abgelaufen“, „Expiré“ oder „Utilisé“ zählen nicht von selbst als erledigt – sollen sie das, hakst du sie dort an.
## Wann ist ein Eintrag fällig?
„Meine Aufgaben“, die Erinnerungen an fällige Einträge (auch die tägliche Übersicht für Chat-Apps und Webhooks), die Widgets der App und die Schnellerfassung nehmen das Fälligkeitsdatum einer Datenbank. Unter **… → Statusregeln und Erledigt → Fälligkeitsdatum** wählst du:
- **Automatisch** (Standard): eine Datums-Eigenschaft, die wie ein Fälligkeitsdatum heißt – etwa „Fällig“, „Deadline“, „Frist“, „Échéance“, „Date limite“, „Scadenza“, „Vencimiento“ oder „截止日期“, danach Namen wie „Termin“, „Gültig bis“ oder „Fin de validité“ –, sonst die erste Datums-Eigenschaft. Die Auswahl zeigt, welche das gerade ist.
- **Eine bestimmte Datums-Eigenschaft**, z. B. „Fin de validité“ statt „Date d'achat“.
- **Kein Fälligkeitsdatum**: Einträge erscheinen ohne Datum in „Meine Aufgaben“ und in den Widgets und lösen keine Erinnerungen an Fälligkeiten aus.
Wird die gewählte Eigenschaft gelöscht, gilt wieder **Automatisch**.
## Statusregeln
Im selben Dialog schaltest du **Erlaubte Wechsel und Pflichtfelder festlegen** ein:
- **Erlaubte Wechsel**: In der Tabelle „von (Zeile) nach (Spalte)“ nimmst du Haken weg, etwa „Offen → Erledigt“. Dann muss ein Eintrag erst „In Arbeit“ gewesen sein.
- **Pflichtfelder**: Ein Status braucht bestimmte Eigenschaften – z. B. „Erledigt nur mit Lösung“.
- **Nur Verantwortliche**: Manche Status setzen nur Personen mit der Rolle *Verantwortlich* der Datenbank.
Die Regeln gelten überall: in Tabelle und Board, bei Sammeländerungen, für Gäste und für die Git-Anbindung. Ein Wechsel, der nicht passt, wird mit einer Erklärung abgelehnt.
## Automationen
**… → Automationen** erledigt wiederkehrende Handgriffe nach dem Muster *Wenn … nur wenn … dann …*:
- **Wenn**: ein Eintrag erstellt wird, ein Eintrag über ein Formular kommt, sich eine Eigenschaft ändert (wahlweise auf einen bestimmten Wert), ein Datum überschritten ist oder es nach Zeitplan so weit ist (siehe [Geplante Automationen](#geplante-automationen)).
- **Nur wenn** (optional): Bedingungen wie „Priorität ist Hoch“ oder „Zuständig ist leer“.
- **Dann**: Eigenschaften setzen, benachrichtigen oder eine **Vorlage anwenden**.
- Werte für Eigenschaften können fest sein oder *heute*, *jetzt*, *die auslösende Person* oder *der Ersteller* lauten.
- Benachrichtigt werden können die Person in einer Personen-Eigenschaft, der Ersteller, die auslösende Person oder ein bestimmtes Mitglied.
- **Vorlage anwenden** setzt eine [Datensatzvorlage](/templates#datensatzvorlagen) auf den auslösenden Eintrag – mit ausgefüllten [Platzhaltern](/templates#platzhalter). Wahlweise **nur wenn der Inhalt leer ist** (vorhandener Text bleibt dann unberührt) oder **unten anhängen**. Leere Eigenschaften erhalten die Werte der Vorlage. Jede Regel wendet eine Vorlage pro Eintrag nur einmal an – auch wenn der Status später hin- und herwechselt.
Vorschläge legen die üblichen Regeln mit einem Klick an:
- „Wenn Status → Erledigt, Datum setzen“,
- „Wenn die Fälligkeit überschritten ist, benachrichtigen“,
- „Neue Formular-Einträge zuweisen“,
- „Wenn Status → Genehmigt, Vorlage anwenden“ (wenn die Datenbank Datensatzvorlagen hat).
Beispiel: *Wenn* Status sich auf „Genehmigt“ ändert, *nur wenn* Firma nicht leer ist, *dann* Vorlage „Kickoff“ anwenden. Jeder genehmigte Eintrag bekommt so seine Kickoff-Seite mit Firmenname und Termin. Angewendete Vorlagen stehen im [Aktivitätsprotokoll](/administration#aktivitaetsprotokoll) (`row.template.applied`).
Regeln lassen sich einzeln ausschalten.
### Im Canvas öffnen: aus einer Regel wird ein Workflow
Reicht eine Regel nicht mehr – mehrere Schritte, Warten, Freigaben, KI, E-Mails oder andere Dienste –, öffnet das Symbol **Im Canvas öffnen** neben der Regel sie als [Workflow](/workflows): eine Workflow-Seite neben der Datenbank mit der Regel als Entwurf. Die Regel läuft weiter, bis du den Workflow aktivierst; dann wird sie in derselben Änderung durch einen Verweis ersetzt („Erweitert als Workflow“). So läuft nie beides und nie keins von beiden.
Der Unterschied: Eine Regel handelt für die Datenbank, ein Workflow läuft als die Person, die ihn aktiviert – der Aktivieren-Dialog sagt das.
> [!NOTE]
> Regeln laufen auf dem Server, egal wie ein Eintrag sich ändert. Was eine Regel ändert, löst keine weiteren Regeln aus – so entstehen keine Schleifen. Überfällige Einträge prüft Flowplan alle paar Minuten; jede Regel meldet sich einmal je Eintrag und Datum. Benachrichtigungen erscheinen als „Automationen in Datenbanken“ und lassen sich in den Einstellungen abstellen.
### Geplante Automationen
Mit dem Auslöser **es so weit ist (Zeitplan)** legt eine Regel regelmäßig einen neuen Eintrag an, etwa für Wochenberichte, Monatsabschlüsse oder Wartungen:
- **Wann**: täglich bzw. alle N Tage, wöchentlich bzw. alle N Wochen an einem Wochentag oder monatlich bzw. alle N Monate an einem Tag (der 31. wird in kürzeren Monaten zum letzten Tag), jeweils zu einer Uhrzeit in deiner Zeitzone. Beispiele: „Jeden Montag 09:00“, „Monatlich am 1.“, „Alle 3 Tage“.
- **Dann**: **Datensatz anlegen** aus einer Datensatzvorlage (Eigenschaften und Text) oder leer. Datumsfelder lassen sich relativ zum Termin setzen, z. B. „Fällig: +3 Tage“; 0 heißt am Tag selbst.
Der Vorschlag „Jeden Montag 09:00 einen Datensatz anlegen“ richtet das mit der Standardvorlage ein.
> [!NOTE]
> Eine geplante Regel läuft einmal je Termin – auch nach einem Neustart – und erst ab dem Zeitpunkt, an dem sie gespeichert wurde. Termine, an denen der Server nicht lief, werden nicht einzeln nachgeholt; der letzte verpasste läuft einmal. Die Einträge legt die Regel im Namen der Person an, die sie zuletzt geändert hat; hat diese kein Bearbeitungsrecht mehr oder ist die Datenbank gesperrt, ruht die Regel. Ein- und Ausschalten ändert die Person nicht.
Wiederkehrende Aufgaben, deren nächster Eintrag erst entsteht, wenn der vorige erledigt ist, stellst du im Eintrag ein, siehe [Wiederkehrende Aufgaben](/databases#wiederkehrende-aufgaben).
## WIP-Limits
In einem Board legst du unter **Ansicht → WIP-Limits** eine Höchstzahl je Spalte fest, z. B. „In Arbeit: 3“.
- Der Spaltenkopf zeigt dann `2/3`.
- Wird es mehr, ist die Spalte markiert.
- Mit **sperren** nimmt die Spalte keine weiteren Einträge an – egal, von wo sie kommen.
## Sprints
Eine Ansicht vom Typ **Sprints (Backlog und Planung)** plant Arbeit in Zeitabschnitten. **Sprints einrichten** legt beim ersten Mal die Eigenschaft „Sprint“ und den ersten Sprint an.
- **Planen**: Einträge aus dem **Backlog** in einen Sprint ziehen – mit der Maus am Eintrag, auf Touchgeräten den Griff ⋮⋮ kurz halten und ziehen –, oder über **Verschieben nach**, auch am Handy. Mit der Tastatur: Griff fokussieren, Leertaste , mit ↑ /↓ den Abschnitt wählen, Leertaste oder Enter legt ab, Esc bricht ab.
- **Sprint**: Name, Start, Ende und Ziel; **+ Sprint** schließt den nächsten an.
- **Starten** und **Abschließen**: Beim Abschluss wählst du, wohin Offenes geht – in den nächsten Sprint oder zurück ins Backlog.
- **Umfang messen in**: Anzahl Einträge oder eine Zahl-Eigenschaft wie Story Points.
- **Burndown**: Der laufende Sprint zeigt die verbleibende Arbeit pro Tag gegen die ideale Linie.
- **Velocity**: Abgeschlossene Sprints zeigen, was geplant und was erledigt wurde.
## Zeiterfassung
Eine Eigenschaft vom Typ **Zeiterfassung** summiert die Zeit, die an einem Eintrag gearbeitet wurde. Optional zeigt sie daneben eine Schätzung aus einer Zahl-Eigenschaft in Stunden.
- **Im Eintrag**: **Start** und **Stopp** – jede Person hat höchstens einen laufenden Timer, ein neuer stoppt den alten.
- **Nachtragen**: Dauer als `45`, `1:30` oder `1,5h`, mit Datum und Notiz.
- **Korrigieren**: Eigene Einträge löschst du selbst; Verantwortliche können alle korrigieren.
- **… → Zeiten auswerten**: der Zeitbericht dieser Datenbank, umschaltbar auf den ganzen Arbeitsbereich (siehe [Zeitberichte und Abrechnung](#zeitberichte-und-abrechnung)). Den Bericht über alle Datenbanken findest du auch unter **Einstellungen → Zeiten**; dort stehen die Filter mit Beschriftung über der Auswertung, auf dem Handy zwei nebeneinander.
### Zeitberichte und Abrechnung
Der Zeitbericht fasst die Zeiteinträge einer Datenbank oder des ganzen Arbeitsbereichs zusammen.
- **Zeitraum**: Diese Woche (ab Montag), Dieser Monat, Letzter Monat oder ein eigener Zeitraum mit Start- und Enddatum (höchstens drei Jahre). Es gilt die Zeitzone des Servers.
- **Filter**: Person, Datenbank (im Arbeitsbereich), Projekt, Abrechnungsstatus und abrechenbar ja/nein. **Projekt** ist der Eintrag, auf den die erste Relation eines Eintrags zeigt (nicht die Eltern-Relation von Unteraufgaben) – etwa das Projekt einer Aufgabe. Einträge ohne Relation stehen unter **Ohne Projekt**.
- **Gruppieren** nach Person, Projekt, Eintrag, Datenbank, Tag oder Woche. Oben stehen die Summen (gesamt, offen, abgerechnet, nicht abrechenbar und – mit Stundensätzen – der Betrag), darunter ein Balkendiagramm und eine Tabelle je Gruppe. Ein Klick auf einen Balken filtert auf diese Person, dieses Projekt oder diese Datenbank.
- **Zeiteinträge**: die einzelnen Einträge mit Datum, Person, Eintrag, Projekt, Notiz, Dauer und Abrechnungsstatus (die ersten 1000; der Export enthält alle).
- **Export**: **CSV** (Komma, Dezimalpunkt) für Tabellenprogramme und Skripte, **CSV für Excel** mit Semikolon, Dezimalkomma und BOM, wie es ein deutsches Excel per Doppelklick richtig öffnet. Zellen, die eine Tabellenkalkulation als Formel ausführen würde, beginnen mit einem Apostroph.
- **Drucken** gibt Summen, Diagramm und Tabelle aus (auch als PDF speichern); aufgeklappte Zeiteinträge kommen mit.
**Wer was sieht**: Jede Person sieht ihre eigenen Zeiteinträge und die Einträge anderer an Datensätzen, die sie lesen darf. Ist die Zeiterfassungs-Eigenschaft durch die Rechte der Eigenschaft (wer sie lesen darf, siehe [Sichtbarkeit von Eigenschaften](/properties-and-formulas#sichtbarkeit-von-eigenschaften)) für jemanden verborgen, sieht er dort nur seine eigenen Zeiten. Eigene Zeiten an einem Datensatz, der inzwischen privat ist, erscheinen ohne Titel als „Eintrag ohne Zugriff“.
**Abrechnungsstatus**: Jeder Zeiteintrag ist **offen**, **abgerechnet** oder **nicht abrechenbar**. Den Status ändert, wer den Datensatz und die Zeiterfassungs-Eigenschaft bearbeiten darf – einzeln in der Liste der Zeiteinträge oder mit **Als abgerechnet markieren** für alle offenen Einträge der aktuellen Auswahl. Nicht abrechenbare Einträge bleiben dabei unverändert, laufende Timer ebenfalls. Jede Änderung steht im Aktivitätsprotokoll (`time.billing`).
**Stundensätze** (optional): Eigentümer des Arbeitsbereichs legen unter **Stundensätze** einen Satz je Person und/oder je Projekt fest, dazu die Währung (z. B. EUR, CHF). Ein Projektsatz geht dem Satz der Person vor. Beträge sehen Mitglieder mit Bearbeitungsrechten im Arbeitsbereich; Leserinnen, Leser und Gäste sehen nur Stunden.
> Über die API: `GET /api/time-reports` mit `page` oder `workspace` und denselben Filtern (`format=csv` bzw. `format=excel` für die Dateien), `POST /api/time-reports` mit `{ "action": "billing", "status": "billed", "filter": { … } }`.
## Einträge aus allen Datenbanken
**Meine Aufgaben → Einträge aus Datenbanken** zeigt Einträge aus allen Datenbanken des Arbeitsbereichs in einer Liste. Standardmäßig sind das die offenen, die dir zugewiesen sind – über irgendeine Personen-Eigenschaft.
- Filtern kannst du nach Fälligkeit, Datenbank und Text.
- Welches Datum als Fälligkeit gilt, legt jede Datenbank fest – siehe [Wann ist ein Eintrag fällig?](#wann-ist-ein-eintrag-faellig)
- **Als Ansicht speichern** macht daraus eine eigene, persönliche Ansicht, z. B. „Alle meine offenen Tickets in allen Projekten“.
## Import aus Jira und Trello
**Einstellungen → Import & Export → Import → Jira oder Trello** nimmt einen Jira-CSV-Export (alle Felder) oder einen Trello-JSON-Export.
Daraus entsteht eine neue Datenbank mit Tabelle und Board. Übernommen werden:
- Status bzw. Liste, Priorität, Typ, Labels, Termine und Story Points,
- Zuständige – als Personen-Eigenschaft, wenn alle Mitglieder sind,
- Checklisten und übergeordnete Vorgänge als Unteraufgaben,
- Beschreibungen als Inhalt und Kommentare als Kommentare,
- Anhänge als Links (die Dateien bleiben bei Jira bzw. Trello).
---
# Git und Issues
Datenbanken mit GitHub, GitLab und Forgejo verbinden: Branches, Commits und Pull Requests am Eintrag, Issues in beide Richtungen synchronisiert.
## Git-Anbindung
**… → Git-Anbindung** verbindet die Datenbank mit GitHub, GitLab oder Gitea/Forgejo:
::: steps
1. **Git-Anbindung einrichten** erzeugt eine Webhook-Adresse und ein Secret.
2. **Im Repository** einen Webhook mit beiden anlegen:
- Content type JSON,
- Ereignisse für Pushes und Pull bzw. Merge Requests.
Die genauen Schritte stehen im Dialog.
3. **Commits und Pull Requests**, die eine Ticketnummer dieser Datenbank wie `WEB-123` nennen, erscheinen im Eintrag unter **Entwicklung**. Nummern anderer Datenbanken bleiben unberührt – dort gibt es eine eigene Anbindung.
4. **„closes WEB-123“** (auch *fixes*, *resolves*, *schließt*, *behebt*) setzt den Eintrag auf erledigt. Das geschieht, sobald der Commit im Hauptbranch ist oder der Pull Request zusammengeführt wurde – über den Workflow und die Automationen der Datenbank.
:::
Jede Anfrage wird gegen das Secret geprüft. Adresse und Secret sehen nur Personen, die die Datenbank bearbeiten dürfen. **Neue Adresse und neues Secret** macht die alten ungültig.
Pull Requests zeigen ihren Stand als Abzeichen: **Offen**, **Zusammengeführt** oder **Geschlossen**.
### Rückverweis im Pull Request
Wie bei Notion kann Flowplan im Pull bzw. Merge Request selbst auf den Eintrag verweisen. Dafür im Dialog unter **Rückverweis im Pull Request → Zugangstoken hinterlegen** Anbieter, Server (leer für github.com bzw. gitlab.com, Pflicht für Gitea/Forgejo) und ein Zugangstoken eintragen:
- **GitHub**: Fine-grained Token mit Zugriff auf das Repository und *Pull requests: Read and write* (oder *Issues: Read and write*).
- **GitLab**: Projekt- oder persönliches Zugangstoken mit dem Scope `api` (Rolle mindestens Reporter).
- **Gitea / Forgejo**: Token mit `write:issue` (bei privaten Repositorys zusätzlich `read:repository`).
Nennt ein Pull/Merge Request Ticketnummern dieser Datenbank, schreibt Flowplan **einen** Kommentar, z. B. `Linked in Flowplan: [WEB-123 Login-Formular](…)` – eine Zeile je Eintrag, mit Link zum Eintrag. Spätere Ereignisse (geänderter Titel, zusammengeführt, geschlossen) **aktualisieren denselben Kommentar**, statt neue zu schreiben; fallen alle Nummern weg, steht dort „No longer linked in Flowplan.“
- Der Kommentar zeigt Ticketnummer und Titel. Bei **privaten Einträgen** und Datenbanken hinter einer Journal-PIN steht nur die Ticketnummer; für Datenbanken im Papierkorb oder in verschlüsselten Bereichen wird nichts geschrieben.
- Das Token wird verschlüsselt gespeichert, nie wieder angezeigt und nur an den Server geschickt, für den es eingetragen wurde. Ein Webhook von einem anderen Anbieter oder Server bekommt es nicht. Eigene Server gibt die Administration wie bei der Issue-Synchronisierung mit [`ISSUE_SYNC_ALLOWED_HOSTS`](/configuration-integrations#integrationen) frei; interne Adressen sind gesperrt.
- Der Kommentar entsteht im Hintergrund – der Webhook antwortet sofort, auch wenn der Git-Server langsam ist. Fehler (z. B. `403` bei fehlender Berechtigung) stehen im Dialog unter **Letzter Rückverweis fehlgeschlagen**. Je Anbindung schreibt Flowplan höchstens 30 Kommentare pro Minute.
- Ohne Token bleibt alles wie bisher: Flowplan schreibt nichts in das Repository. **Token entfernen** schaltet den Rückverweis ab.
## GitHub-, GitLab- und Forgejo-Issues synchronisieren
Eine Datenbank kann sich mit den Issues eines GitHub-, GitLab- oder Forgejo/Gitea-Repositorys abgleichen – in beide Richtungen oder nur in eine. Anders als die [Git-Anbindung](#git-anbindung), die Commits und Pull Requests nur verlinkt, werden hier Einträge und Issues gegenseitig angelegt und aktualisiert.
**Verbindung einrichten** (Eigentümer des Arbeitsbereichs und Administratoren):
::: steps
1. **Einstellungen → Kalender & Issues → GitHub, GitLab oder Forgejo verbinden**.
2. Anbieter wählen, bei eigenem Server dessen Adresse eintragen (leer für github.com bzw. gitlab.com), Repository (`besitzer/name`) bzw. Projekt (`gruppe/projekt`) und ein Zugangstoken, das Issues lesen und schreiben darf – bei GitHub ein Fine-grained Token mit *Issues: Read and write*, bei GitLab ein Token mit dem Scope `api`. Bei **Forgejo / Gitea** ist die Serveradresse Pflicht (z. B. `https://codeberg.org`); das Token entsteht dort unter **Einstellungen → Anwendungen → Token generieren** mit `write:issue` und `read:repository` (`read:organization` optional, damit auch Labels der Organisation gefunden werden).
3. **Verbindung testen** macht einen Aufruf mit dem Token; **Speichern** legt das Token verschlüsselt ab. Angezeigt wird es danach nie wieder.
4. Optional **Personen**: je Zeile `login = e-mail` eines Mitglieds. Darüber werden Zuständige (Assignees) zugeordnet.
5. Für sofortige Übernahme die angezeigte **Webhook-Adresse** mit dem **Secret** im Repository eintragen – bei GitHub mit Content type JSON und den Ereignissen *Issues* und *Issue comments*, bei GitLab als *Secret token* mit *Issues events* und *Comments*, bei Forgejo/Gitea unter **Einstellungen → Webhooks → Webhook hinzufügen → Forgejo** (bzw. Gitea) mit POST, Content type `application/json`, dem Secret und den eigenen Ereignissen *Issues* und *Issue-Kommentare*. Ohne Webhook gleicht Flowplan alle 10 Minuten ab.
:::
Die Synchronisierung handelt als die Person, die die Verbindung eingerichtet hat: Sie braucht Bearbeitungsrechte an der Datenbank, und Einträge, die sie nicht lesen darf, werden übersprungen. Ist sie nicht mehr Eigentümer des Arbeitsbereichs, pausiert die Verbindung, bis jemand das Token neu speichert.
**Datenbank zuordnen**: **… → Issues synchronisieren** in der Datenbank. Dort wählst du Verbindung, Repository und Richtung (*beide*, *nur Issues → Datenbank*, *nur Datenbank → Issues*) und ordnest Eigenschaften zu:
| Issue | Eigenschaft |
| --- | --- |
| Titel | Titel |
| Beschreibung (Markdown) | eine Text-Eigenschaft oder das Dokument des Eintrags |
| offen/geschlossen und Labels | eine Auswahl – je Option „offen" oder „geschlossen", optional mit einem Label (z. B. *In Arbeit* → offen + `in progress`) |
| Labels | eine Mehrfachauswahl (nur Labels, die es als Option gibt) |
| Assignee | eine Person (über die Personen-Liste der Verbindung) |
| Fälligkeit des Meilensteins | ein Datum (gesetzt wird ein vorhandener Meilenstein mit diesem Datum) |
| Nummer und Adresse | Zahl/Text bzw. URL – nur lesen |
Dazu kommen zwei Schalter für **Kommentare**: Issue-Kommentare erscheinen als Kommentare am Eintrag (mit Name und Link), und Kommentare am Eintrag gehen als Issue-Kommentare hinaus. **Auch bestehende Issues übernehmen** holt beim ersten Lauf alle vorhandenen Issues; sonst nur, was sich nach dem Speichern ändert. Neue Einträge werden zu Issues, sobald die Zuordnung gespeichert ist – ältere Einträge bleiben, wie sie sind.
**Konflikte**: Wurden Eintrag und Issue seit dem letzten Abgleich beide geändert, gewinnt die spätere Änderung. Die Entscheidung steht im Prüfprotokoll. Jeder Eintrag ist höchstens mit einem Issue verknüpft; der Eintrag zeigt dann einen Chip wie **GitHub #123** mit Link.
**Status**: Der Dialog zeigt den letzten Abruf und die letzte Übertragung, Konflikte, übersprungene Einträge und Fehler; **Jetzt synchronisieren** startet einen Lauf sofort. Meldet der Anbieter ein Ratenlimit, wartet Flowplan die angegebene Zeit ab. Ein Repository lässt sich nur mit einer Datenbank verbinden. **Trennen** beendet den Abgleich; Einträge und Issues bleiben.
Pull Requests übernimmt der Abgleich nicht. Eigene Server (GitHub Enterprise, selbst betriebenes GitLab, eigenes Forgejo oder Gitea) gibt die Administration mit [`ISSUE_SYNC_ALLOWED_HOSTS`](/configuration-integrations#integrationen) frei.
---
# Workflows
Ein Workflow ist ein Ablauf aus Knoten auf einer Fläche: ein **Auslöser** (eine neue Seite, ein geänderter Eintrag, ein Zeitplan, eine E-Mail …), dann **Logik** und **Aktionen** – Einträge und Seiten ändern, Personen benachrichtigen, KI fragen, andere Dienste aufrufen. Ganz ohne Code.
Workflows sind ein eigener Seitentyp. Sie laufen im Hintergrund auf dem Server, Schritt für Schritt, überstehen Neustarts, wiederholen sich bei Fehlern und warten auch Tage auf ein Datum oder eine Freigabe. Ein Workflow kann nie mehr als die Person, die ihn aktiviert hat.
## Erste Schritte: die Vorlage aus dem Issue
So verlinkst du jede neue Unterseite einer Übersichtsseite automatisch dort – mit einem Satz Beschreibung:
::: steps
1. In der Seitenleiste **+ → Workflow** wählen und einen Titel geben.
2. Auf der leeren Fläche die Vorlage **Unterseiten auf der Übersicht verlinken** wählen.
3. Der kurze Assistent fragt nach der **Übersichtsseite** und ob eine **Kurzbeschreibung mit KI** dazukommt. **Als Entwurf anlegen**.
4. **Probelauf** (nichts wird verändert) oder **Testlauf** (echt, als du) – das Ergebnis steht an jedem Knoten.
5. **Aktivieren**. Ab jetzt landet jede neue Unterseite als „• Link – Kurztext“ auf der Übersicht, nie doppelt.
:::
## Wie ein Workflow beginnt
Eine neue Workflow-Seite zeigt vier Wege:
- **Leer beginnen** – du wählst den Auslöser und baust selbst.
- **Vorlagen** – sechs fertige Abläufe mit Lücken, die ein Assistent abfragt (Seite, Datenbank, Eigenschaft, Person, Chat-Webhook, E-Mail-Adresse):
| Vorlage | Was sie tut |
| --- | --- |
| Unterseiten auf der Übersicht verlinken | Neue Seite direkt unter X → optional KI-Kurzbeschreibung → „• Link – Kurztext“ an X anhängen, nie doppelt |
| Erinnerung vor Fälligkeit | Zwei Tage vor dem Datum um 9:00 → nur wenn nicht erledigt → Verantwortliche per Push erinnern |
| Formular → KI-Kategorie → Zuweisung | Formularantwort → KI ordnet einer Kategorie zu → je Kategorie zuständig machen und benachrichtigen; unklar → Teamleitung |
| Wochenbericht | Freitags 15:00 → diese Woche erledigte Einträge finden → KI fasst zusammen → Berichtsseite anlegen → optional im Chat posten |
| Eingehende Mail → Ticket | E-Mail an die Adresse des Workflows → KI liest Titel, Beschreibung, Dringlichkeit → Eintrag anlegen → Absender bestätigen |
| Webhook → Eintrag | Ein anderer Dienst ruft die Adresse des Workflows auf → Eintrag anlegen |
- **Mit KI entwerfen** – ein Satz genügt, siehe [KI-Builder](#ki-builder).
- **Aus Datei importieren** – eine exportierte Workflow-Datei, siehe [Export und Import](#export-und-import).
Was du wählst, landet als **Entwurf** auf der Fläche – mit **Rückgängig** wieder weg. Aktiv wird ein Workflow nie von selbst.
Weitere Workflows findest du im [Marketplace](/marketplace). Einen eigenen Workflow teilst du über das Marketplace-Symbol im Kopf der Workflow-Seite – ohne Zugangsdaten, Läufe, Webhook-Adressen und Namen von Personen. Übernommene Workflows kommen immer pausiert als Entwurf an; Angaben, die zu deinem Arbeitsbereich gehören (Seite, Datenbank, Person …), legst du danach im Editor fest.
## Die Fläche
- **Knotenliste** links: Auslöser, Logik, Einträge, Seiten, Benachrichtigen, KI, HTTP – mit Suche. Ziehen oder anklicken (hängt hinter dem gewählten Knoten an).
- **Knoten** zeigen Symbol, Bezeichnung und eine Zeile Zusammenfassung; ein Punkt markiert Fehler oder Warnungen der Prüfung. Das ⚡ heißt: läuft sofort beim Speichern des Eintrags (der „Sofortteil“).
- **Seitenpanel** rechts: die Einstellungen des gewählten Knotens, „Bei Fehler“, Notiz und Ein-/Ausgabe des letzten Tests.
- **Liste** zeigt denselben Ablauf als Gliederung – voll per Tastatur bedienbar. **Aufräumen** ordnet die Knoten von links nach rechts.
- Mehrere Personen bearbeiten denselben Entwurf gleichzeitig; was läuft, ändert sich erst mit **Aktivieren**.
## Platzhalter und Filter
In jedem Textfeld fügt **{}** (oder `{{` tippen) Werte früherer Knoten ein, etwa `{{Neue Seite.Titel}}` oder `{{Auslöser.Eintrag.Felder.Status}}`. Filter hängen mit `|` an:
| Filter | Beispiel | Ergebnis |
| --- | --- | --- |
| `truncate` / `kürzen` | `{{KI.summary \| kürzen: 140}}` | höchstens 140 Zeichen |
| `date` / `datum` | `{{$heute \| datum: "dd.MM.yyyy"}}` | Datum in eigener Form |
| `add_days` / `plus_tage` | `{{$heute \| plus_tage: 3}}` | drei Tage später |
| `default` / `standard` | `{{Webhook.body.titel \| standard: "Ohne Titel"}}` | Ersatz für leere Werte |
| `required` / `pflicht` | `{{Webhook.body.titel \| pflicht}}` | Fehler, wenn leer |
| `join`, `first`, `last`, `count` | `{{Finden.records \| verbinden: ", "}}` | Listen zu Text |
| `upper`, `lower`, `trim`, `replace`, `number`, `plain`, `json` | | Text umformen |
Eingebaute Werte: `$heute`, `$jetzt`, `$lauf`, `$workflow`, `$ausführende`, in „Für jedes“ `$element` und `$index`. Platzhalterwerte werden immer als Text eingefügt, nie als HTML.
## Testen
- **Probelauf**: Schreibende Knoten berichten nur, was sie täten („würde Eintrag anlegen …“); E-Mail, Chat und Push gehen nicht raus, Warten wird übersprungen, Freigaben gelten als genehmigt oder abgelehnt (wählbar). KI-Knoten laufen und kosten Tokens.
- **Testlauf**: führt echt aus – als **du**, nicht als die ausführende Person.
- Daten des Auslösers: **Beispiel**, **letztes echtes Ereignis**, ein **Eintrag** oder eine **Seite** zum Auswählen oder **eigene Werte**.
Tests nutzen immer den Entwurf. Das Ergebnis steht als Statusring an jedem Knoten; ein Klick zeigt Ein- und Ausgabe.
## Aktivieren, pausieren, „läuft als“
**Aktivieren** prüft den Entwurf (fehlende Angaben, gelöschte Datenbanken, Seiten ohne Zugriff …) und zeigt, was der Workflow tun wird und **als wer** er läuft: als die Person, die aktiviert. Er sieht und ändert nur, was diese Person darf. Verliert sie ihre Rechte, pausiert der Workflow und meldet sich.
**Pausieren** hält offene Läufe an (wahlweise brechen sie ab); nach dem Aktivieren laufen sie auf ihrer Version weiter. Nach zehn Fehlschlägen in Folge oder wenn die Hälfte der letzten Läufe scheitert, pausiert ein Workflow von selbst.
## Läufe und Versionen
Der Reiter **Läufe** listet jeden Lauf mit Status, Dauer und Version; filtern nach fehlgeschlagen, wartend, offen und Tests, suchen nach Fehlern. Ein Lauf öffnet die Fläche in seiner Version mit der Zeitleiste der Schritte (Versuche, Wartezeiten, Fehler). **Wiederholen ab fehlgeschlagenem Knoten** und **Abbrechen** stehen dort.
Ein- und Ausgaben eines Laufs sieht nur die Person, als die er lief; Kolleginnen sehen Status und Fehler und debuggen mit einem eigenen Testlauf.
**Versionen** zeigt aktivierte Versionen und Entwurfsstände in einer Zeitleiste, vergleicht zwei Stände und stellt einen als Entwurf wieder her.
## KI-Builder
**Mit KI entwerfen** (auf der leeren Fläche oder oben in der Leiste) baut aus einem Satz einen Entwurf – zum Beispiel: *„Wenn im Wiki unter Docker eine Seite entsteht, trage sie mit einem Satz Beschreibung auf der Übersicht ein.“*
- Die KI sieht nur **Namen** von Datenbanken, Eigenschaften, Optionen, Bereichen und Seiten, die du sehen darfst und die für die KI freigegeben sind – keine Inhalte.
- Was sie vorschlägt, wird gegen den Knotenkatalog geprüft: Unbekannte Knoten fallen weg, unbekannte Seiten oder Eigenschaften bleiben leer und sind markiert.
- Du siehst den Vorschlag zuerst; **In den Entwurf übernehmen** fügt ihn als eine Änderung ein. Aktivieren musst du selbst.
- Es zählt dein persönliches KI-Kontingent, nicht das Budget des Workflows. Siehe [KI](/ai-actions#ki-in-workflows).
## Workflow-Knopf auf Seiten
Mit **/Workflow-Knopf** kommt ein Knopf in ein Dokument, der einen Workflow mit dem Auslöser **Manuell starten** startet. Hat der Auslöser Eingabefelder, zeigt der Knopf ein kleines Formular. Nach dem Klick steht dort **Gestartet** – Bearbeitende des Workflows sehen den Weg zu den Läufen.
Wer drücken darf, legt der Auslöser fest: standardmäßig die **Bearbeitenden des Workflows**, umschaltbar auf **alle Mitglieder**, die die Seite mit dem Knopf sehen. Gäste und Freigabelinks sehen den Knopf nie. Der Lauf läuft immer als die ausführende Person; die klickende Person steht als „Gestartet von“ im Lauf.
## Export und Import
**Als JSON exportieren** (Pfeil oben rechts) speichert den Ablauf als `.flowplan-workflow.json`: Bearbeitende bekommen den Entwurf, Lesende die aktive Version. Die Datei nennt die verwendeten Seiten, Datenbanken (mit Eigenschaften) und Personen mit Titel. **Zugangsdaten, Webhook-Adressen und Läufe sind nie enthalten** – Zugangsdaten nur mit Name, Art und Host, damit du sie neu verknüpfen kannst.
**Aus Datei importieren** ordnet Verweise im Arbeitsbereich zu: gleiche ID, sonst gleicher Titel (Seiten, Datenbanken), gleicher Name (Personen, Eigenschaften). Was offen bleibt, fragt der Assistent ab oder bleibt leer. Importiert wird immer als Entwurf.
Fertige Workflows anderer zum Übernehmen findest du im [Flowplan Marketplace](https://marketplace.flowplan.org).
Inhaltsarchive und der [Instanzumzug](/move-instance) nehmen Workflows mit Entwurf und Versionen mit, ohne Läufe und Geheimnisse. Aktive Workflows kommen **pausiert** an, damit auf der neuen Instanz nichts unbeabsichtigt loslegt.
## Telefon und Tablet
- **Telefon**: Status mit Ein/Aus-Schalter, der Ablauf als Liste, Läufe und Freigaben. Bearbeitet wird auf Tablet oder Computer.
- **Freigaben**: Die Benachrichtigung öffnet die Workflow-Seite mit dem Reiter **Freigaben** – Nachricht, Kommentar, **Ablehnen** oder **Genehmigen**.
- **Freigaben in der App**: In der iPhone- und Android-App trägt die Mitteilung die Knöpfe **Genehmigen** und **Ablehnen**, sofern Mitteilungen auf dem Sperrbildschirm ihren Text zeigen. **Genehmigen** fragt vorher Face ID, Touch ID oder den Fingerabdruck ab – ohne Biometrie öffnet sich stattdessen der Reiter **Freigaben**. **Ablehnen** geht ohne Biometrie, das Telefon muss aber entsperrt sein. Das Gerät muss angemeldet und in den letzten 14 Tagen aktiv gewesen sein; auf Android öffnet das allererste Genehmigen einmal den Reiter, weil dabei der Schlüssel angelegt wird.
- **Tablet**: der volle Editor; Verbinden auch per Tippen auf einen Ausgang und dann das Ziel.
## Tastatur
| Taste | Wirkung |
| --- | --- |
| Tab / ++Umschalt Tab++ | zwischen Knoten |
| Pfeiltasten (mit Umschalt weiter) | gewählten Knoten verschieben |
| Enter / Esc | Panel öffnen / schließen |
| A | Knoten anhängen |
| C | verbinden mit … |
| Entf | löschen |
| ++Strg Z++ / ++Strg Y++ | rückgängig / wiederholen |
| ++Strg D++ | duplizieren |
| L | Liste ↔ Fläche |
| F | Ansicht einpassen |
## Grenzen
| Grenze | Standard |
| --- | --- |
| Läufe je Minute und Workflow | 60 |
| Läufe je Minute und Arbeitsbereich | 600 |
| Schritte je Lauf | 200 |
| Gegenseitige Auslösung (Kaskade) | 5 Ebenen |
| Elemente je „Für jedes“ | 100 |
| KI-Tokens je Workflow und Tag | 100 000 |
| E-Mails je Workflow und Tag | 100 |
| Aufbewahrung der Läufe | 30 Tage |
| Aktive Workflows je Arbeitsbereich | 100 |
> [!ADMIN]
> Admins ändern die Werte in der [Administration](/administration#workflows) oder per [Umgebungsvariable](/configuration-integrations#workflows). Bearbeitende können je Workflow niedrigere Werte setzen.
## API, MCP und SDKs
Workflows lassen sich per [REST-API](/api-and-webhooks#workflows) anlegen, prüfen, testen, **aktivieren** (mit Schreib-Token) und starten; die SDKs bringen fertige Methoden mit. Über [MCP](/mcp#workflows) liest ein KI-Assistent Workflows und Läufe, speichert Entwürfe, testet und startet – aktivieren und Freigaben entscheiden kann er nicht.
## Häufige Fragen
**Ersetzen Workflows die Automationen der Datenbanken?** Nein. Die einfachen Regeln bleiben im Formular unter **… → Automationen** und laufen über dieselbe Engine. Jede Regel lässt sich mit **Im Canvas öffnen** zu einem Workflow erweitern, siehe [Automationen](/projects-and-tickets#automationen).
**Warum sehe ich eine Workflow-Seite nicht?** Gäste sehen keine Workflow-Seiten. Sonst gelten die normalen Seitenrechte.
**Gibt es Workflows in verschlüsselten Bereichen?** Nein – der Server müsste die Inhalte lesen.
Alle Knoten im Einzelnen: [Knoten-Referenz](/workflow-nodes).
---
# Vorlagen
Vorlagen sind gespeicherte Seiten – Dokumente, Datenbanken oder ganze Seitenbäume –, aus denen neue Seiten entstehen. Dazu kommen Datensatzvorlagen innerhalb einer Datenbank.
Mehr Vorlagen – aus der Community und offizielle von Flowplan, auch für Workflows, Whiteboards, Erscheinungsbilder und automatische Links – findest du im [Flowplan Marketplace](https://marketplace.flowplan.org).
## Startervorlagen
**Vorlagen** in der Seitenleiste – oder **Aus Vorlage** im Dialog **Neue Seite** – zeigt 27 eingebaute Vorlagen in sechs Kategorien, jeweils mit Beispieleinträgen und passenden Ansichten:
| Kategorie | Vorlagen |
| --- | --- |
| Projekte | Projektplanung, Produkt-Roadmap, Sprint-Board, Projektsteckbrief |
| Meetings | Meeting-Notizen, Besprechungsnotiz, 1:1-Gespräch, Retrospektive, Besprechungsprotokolle |
| Wissen & Dokumentation | Team-Wiki, Anleitung, Diagramm-Seite, Entscheidungsprotokoll, FAQ |
| Planung & Ziele | OKR-Ziele, Quartalsplanung, Content-Kalender, Budgetplanung |
| Persönlich | Aufgabenliste, Leseliste, Gewohnheiten-Tracker, Reiseplanung |
| Sonstiges | Kontakte & Kunden, Bewerbungen, Inventar, Eventplanung |
Ein Klick öffnet den Dialog **Neue Seite** mit der gewählten Vorlage. Hast du dort schon einen Namen eingegeben, bleibt er stehen; sonst steht der Name der Vorlage im Feld – markiert, sodass du ihn einfach überschreibst. **Enter** legt die Seite an. Datumswerte der Beispiele werden relativ zum heutigen Tag gesetzt.
Die **Diagramm-Seite** ist eine Seite in voller Breite mit einem leeren [draw.io-Diagramm](/math-and-code#formeln-diagramme-und-code); draw.io öffnet sich, sobald die Seite angelegt ist (wenn die Instanz draw.io nutzt).
Sobald es [eigene Vorlagen](#eigene-vorlagen) gibt, steht gleich nach **Alle** die Kategorie **Eigene Vorlagen**: Sie zeigt nur die gespeicherten Vorlagen – deine eigenen („Nur für mich“), die des Arbeitsbereichs und die für alle Arbeitsbereiche – ohne die eingebauten.
Öffnest du die Galerie aus dem Dialog **Neue Seite**, landet die Seite dort, wo du sie anlegen wolltest – im gewählten Bereich und unter der gewählten Seite –, auch mit einer eigenen Vorlage. Schließt du die Galerie, bist du wieder im Dialog.
Das gilt genauso für eigene Vorlagen: **Verwenden** führt in den Dialog **Neue Seite**, wo du der Seite einen eigenen Namen gibst, bevor sie entsteht. Der Name der Vorlage ist nur der Vorschlag.
## Eigene Vorlagen
::: steps
1. Auf einer Seite **Seitenaktionen → Als Vorlage speichern**.
2. Name, Kategorie und Sichtbarkeit wählen:
- **Nur für mich**,
- **Arbeitsbereich**: alle Mitglieder dieses Arbeitsbereichs,
- **Alle Arbeitsbereiche** der Instanz,
- **Öffentliche Galerie** (nur Admins): auch ohne Konto sichtbar.
:::
### Vorlagen eines Bereichs oder des ganzen Arbeitsbereichs
Wie [Tags und Eigenschaften](/page-tags#geltungsbereich-arbeitsbereich-oder-bereich) gehört eine eigene Vorlage **zu einem Bereich** oder **zum ganzen Arbeitsbereich**. Beim Speichern ist **Nur in diesem Bereich** (dem Bereich der Seite) voreingestellt; **Im ganzen Arbeitsbereich** speichern nur Eigentümer (private Vorlagen jeder). Was es vor dieser Unterscheidung gab, gilt im ganzen Arbeitsbereich.
- **Die Galerie** zeigt zuerst die Vorlagen des Bereichs, in dem die neue Seite entsteht, und die des Arbeitsbereichs; **Alle Bereiche** zeigt auch die anderer Bereiche. Ein Etikett nennt den Bereich oder „Arbeitsbereich“. Vorlagen eines Bereichs sehen nur, wer ihn öffnen darf.
- **Vorlagen für den ganzen Arbeitsbereich** verwenden nur Tags und Eigenschaften des ganzen Arbeitsbereichs. Trägt die Seite Tags oder Eigenschaften ihres Bereichs, nennt Flowplan sie; **Speichern** nimmt sie dann aus der Vorlage (oder du machst sie vorher arbeitsbereichsweit).
- **Eine Vorlage aus einem anderen Bereich verwenden:** Bringt sie Tags oder Eigenschaften ihres Bereichs mit, fragt ein Zwischenschritt für jede: **zuordnen** (zu einem gleichnamigen oder anderen Tag bzw. einer Eigenschaft gleichen Typs im Zielbereich), **kopieren** (in den Zielbereich, Voreinstellung ohne gleichnamigen) oder **entfernen**.
- **Kopieren** legt eine Kopie der Vorlage für einen anderen Bereich (oder den Arbeitsbereich) an – mit demselben Zwischenschritt; kopierte Tags und Eigenschaften entstehen dabei gleich im Zielbereich. **Bearbeiten → Gilt** verschiebt die Vorlage selbst dorthin.
Vorlagen speichern eigene Kopien der Dateien und bleiben verwendbar, auch wenn die Quellseite gelöscht wird. Auch die [Tags und Eigenschaftswerte](/page-tags#tags-und-eigenschaften) der Seite kommen mit; neue Seiten aus der Vorlage bekommen sie (fehlende Tags werden angelegt). Datenbank-Vorlagen enthalten Ansichten, Einträge samt Inhalten, Datensatzvorlagen und die Formulargestaltung. Vorlagen lassen sich umbenennen, privat oder geteilt schalten und in den Papierkorb legen. Im **Vorlagen-Papierkorb** holt **Wiederherstellen** eine Vorlage zurück, **Endgültig löschen** löscht sie samt ihren Dateien, und **Vorlagen-Papierkorb leeren** löscht alle, die du verwalten darfst (deine eigenen; als Eigentümer alle des Arbeitsbereichs; Vorlagen für alle Arbeitsbereiche nur Admins). Bereits erstellte Seiten bleiben erhalten. Nach der [Papierkorb-Frist](/pages-and-spaces#papierkorb) (Standard 30 Tage) werden Vorlagen im Papierkorb automatisch gelöscht.
Eigene Dokument- und Datenbankvorlagen kannst du im [Marketplace](/marketplace) veröffentlichen (**Im Marketplace veröffentlichen …** in der Zeile der Vorlage). Vorlagen aus dem Marketplace übernimmst du mit **In Flowplan öffnen** dort oder als `.flowplan-template`-Datei über **Vorlage importieren**.
## Datensatzvorlagen
In einer Datenbank öffnet **Datensatzvorlagen** die Vorlagen für Einträge: Eigenschaftswerte und Inhalt werden bei jedem neuen Eintrag übernommen. Eine Vorlage kann Standard sein, sodass **Neu** sie automatisch nutzt.
Eine Vorlage entsteht aus einem Eintrag: Inhalt schreiben, dann **Als Vorlage speichern**. Zum Ändern wählst du in **Datensatzvorlagen** bei der Vorlage **Bearbeiten** – ein Entwurf öffnet sich als Eintrag; speichere ihn mit **Als Vorlage speichern** und unter **Speichern als** mit **„…“ ersetzen**. Die Vorlage behält dabei ihre Rolle als Standardvorlage und in Automationen. Den Entwurfseintrag kannst du danach löschen.
### Platzhalter
Text in doppelten geschweiften Klammern wird beim Anwenden durch die Werte des Eintrags ersetzt – im Titel, in Überschriften, im Text, in Tabellen und Hinweisen sowie in Text-Eigenschaften der Vorlage. Beispiel: *„Kickoff {{Firma}} am {{Termin}}“*.
- **`{{Eigenschaft}}`** – der Wert einer Eigenschaft der Datenbank. Groß- und Kleinschreibung spielen keine Rolle.
- **`{{Titel}}`**, **`{{Heute}}`** (auch `{{Datum}}`), **`{{Jetzt}}`**, **`{{Ersteller}}`**, **`{{Ich}}`** (wer die Vorlage anwendet) und **`{{Datenbank}}`** sind eingebaut. Die englischen Namen (`{{Title}}`, `{{Today}}`, `{{Date}}`, `{{Now}}`, `{{Creator}}`, `{{Me}}`, `{{Database}}`) funktionieren ebenso. Heißt eine Eigenschaft genauso (etwa „Datum“), gilt die Eigenschaft.
- Das Symbol **{ }** neben **Inhalt** eines Eintrags (**Platzhalter einfügen**) setzt Platzhalter an der Schreibmarke ein und listet alle Eigenschaften der Datenbank.
Werte erscheinen wie in der Tabelle: Datumsangaben in deiner Sprache und im Datumsformat der Eigenschaft, Mehrfachauswahl durch Kommas getrennt, Verknüpfungen als Titel der verknüpften Einträge, Personen mit Namen, Kontrollkästchen als ✓ oder ✗. Leere Eigenschaften ergeben leeren Text; unbekannte Platzhalter bleiben stehen. Werte werden immer als reiner Text eingesetzt, nie als Formatierung oder HTML. Eigenschaften, die nur bestimmte Personen sehen dürfen, bleiben leer – der Text ist für alle sichtbar, die den Eintrag sehen.
Eigenschaften umbenennen ist kein Problem: Vorlagen merken sich die Eigenschaft, nicht nur ihren Namen. Im Entwurf einer Vorlage bleiben die Platzhalter stehen.
### Vorlage auf einen bestehenden Eintrag anwenden
Im Menü **…** eines geöffneten Eintrags oder per Rechtsklick auf eine Zeile wählst du **Vorlage anwenden …**, dann die Vorlage und was mit dem vorhandenen Inhalt geschieht:
- **Nur anwenden, wenn der Inhalt leer ist** – hat der Eintrag schon Text, sagt Flowplan das und ändert nichts.
- **Unten anhängen** – der Text der Vorlage kommt unter den vorhandenen Text.
Vorhandener Text wird nie überschrieben, ausgefüllte Eigenschaften bleiben; nur leere Eigenschaften erhalten die Werte der Vorlage. Der vorherige Inhalt bleibt als Version erhalten, und **Rückgängig** im Hinweis stellt ihn wieder her. Dafür braucht es Bearbeitungsrechte am Eintrag; Workflow-Regeln der Datenbank gelten auch hier. Automatisch geht das mit einer [Automation](/projects-and-tickets#automationen).
## Öffentliche Vorlagengalerie
Unter `/templates` stehen die eingebauten Vorlagen und alle Vorlagen mit der Sichtbarkeit **Öffentliche Galerie** auch ohne Konto bereit, nach Kategorien gefiltert, jeweils mit Vorschau. **In meinem Arbeitsbereich verwenden** öffnet nach der Anmeldung den Dialog **Neue Seite** mit der Vorlage – Name prüfen oder überschreiben, dann **Seite erstellen**. Nur Admins können eigene Vorlagen in die Galerie geben.
## Whiteboard-Vorlagen
Im Whiteboard fügt **Vorlagen** eine Retrospektive, ein Kanban, eine Mindmap, eine SWOT-Analyse oder ein Flussdiagramm an der aktuellen Stelle ein.
Eigene Whiteboard-Vorlagen lassen sich unter **Eigene Vorlagen** über das Marketplace-Symbol im [Marketplace](/marketplace) veröffentlichen; hochgeladene Bilder und Datensatzkarten bleiben dabei im Arbeitsbereich.
## Workflow-Vorlagen
Eine neue Workflow-Seite bietet sechs Vorlagen – von „Unterseiten auf der Übersicht verlinken“ bis „Webhook → Eintrag“. Ein kurzer Assistent fragt die Lücken ab (Seite, Datenbank, Eigenschaft, Person …) und legt den Entwurf an. Siehe [Workflows](/workflows#wie-ein-workflow-beginnt).
---
# Marketplace
Im **Flowplan Marketplace** (marketplace.flowplan.org) teilen Menschen, was sie in Flowplan gebaut haben: Dokument- und Datenbankvorlagen, Workflows, Whiteboard-Vorlagen, Erscheinungsbilder und Regeln für automatische Links. Du kannst dort stöbern und Vorlagen mit einem Klick in deine Instanz übernehmen – oder eigene Vorlagen veröffentlichen. Die Vorlagen, die mit Flowplan kommen, stehen dort ebenfalls (gemeinfrei, CC0).
Zum Stöbern und Übernehmen brauchst du kein Konto beim Marketplace. Zum Veröffentlichen meldest du dich dort mit GitHub oder einem E-Mail-Link an. Jede Einreichung wird geprüft, bevor sie öffentlich wird.
## Was sich teilen lässt
| Art | Wo in Flowplan | Wer veröffentlichen darf | Was beim Übernehmen entsteht |
| --- | --- | --- | --- |
| Dokument- und Datenbankvorlagen | Vorlagengalerie → **Deine Vorlagen** | wer die Vorlage angelegt hat, Eigentümer | eine Vorlage in der Galerie (für den Arbeitsbereich, einen Bereich oder nur dich) |
| Workflows | Kopf der Workflow-Seite (Symbol **Marketplace**) | wer den Workflow bearbeiten darf | eine neue Workflow-Seite – **pausiert, als Entwurf** |
| Whiteboard-Vorlagen | Whiteboard → **Vorlagen → Eigene Vorlagen** | wer die Vorlage angelegt hat, Eigentümer | eine eigene Whiteboard-Vorlage des Arbeitsbereichs |
| Erscheinungsbild | Einstellungen → **Erscheinungsbild** | Eigentümer | ersetzt das Erscheinungsbild des Arbeitsbereichs (mit den Schriften) |
| Automatische Links | Einstellungen → **Automatische Links** | Eigentümer | die Regeln kommen zu den vorhandenen dazu |
Gäste veröffentlichen nie etwas.
## Veröffentlichen
::: steps
1. Bei der Vorlage, dem Workflow oder in den Einstellungen **Im Marketplace veröffentlichen …** wählen.
2. Im Dialog Titel, Kurzbeschreibung (Deutsch und Englisch), Kategorie, Schlagwörter und Sprache prüfen und bis zu **vier Vorschaubilder** hinzufügen (PNG, JPEG oder WebP, je höchstens 1 MB). Für Dokumente und Datenbanken lohnt sich ein Bildschirmfoto – Flowplan erstellt selbst keins.
3. **Im Marketplace öffnen**: Flowplan erstellt die Datei, öffnet die Einreichungsseite des Marketplace in einem neuen Fenster und übergibt sie dort. Du meldest dich an, wählst die **Lizenz** (Standard CC BY 4.0, außerdem CC0 und MIT), bestätigst, dass du die Rechte am Inhalt hast, und reichst ein.
4. Alternativ **Als Datei herunterladen**: Die `.flowplan-template`-Datei lädst du dann auf der Einreichungsseite selbst hoch.
:::
Was nie mitkommt: Zugangsdaten, Läufe und Webhook-Adressen eines Workflows, die Adresse deiner Instanz, Namen von Personen, hochgeladene Bilder eines Whiteboards (nur Bilder mit https-Adresse) und Datensatzkarten. Verweise eines Workflows auf Seiten, Datenbanken und Personen werden beim Übernehmen über den Namen neu zugeordnet oder bleiben leer. Bei Erscheinungsbildern mit eigenen Schriften: Veröffentliche nur Schriften, deren Lizenz das Weitergeben erlaubt.
## Übernehmen
::: steps
1. Auf der Seite einer Vorlage im Marketplace **In Flowplan öffnen** wählen. Ohne gespeicherte Instanz steht dort **In app.flowplan.org öffnen** – für das gehostete Flowplan reicht ein Klick. Für deine eigene Instanz wählst du **Eigene Instanz verwenden …** und gibst einmal ihre Adresse an (zum Beispiel `https://flowplan.example.org`); danach heißt die Schaltfläche **In flowplan.example.org öffnen**, **Instanz ändern** bringt das Feld zurück. Die Adresse bleibt nur in deinem Browser.
2. Flowplan öffnet sich in einem neuen Fenster und bekommt die Vorlage. Bist du nicht angemeldet, meldest du dich zuerst an – die Vorlage wartet so lange in deinem Browser (bis zu 24 Stunden).
3. Eine Vorschau zeigt Titel, Art, Autorin oder Autor, Lizenz und **was entsteht**. Bei Workflows siehst du alle Knoten, die externen Dienste, die er anspricht, ob er KI-Schritte nutzt oder E-Mails verschickt – und was du nach dem Import im Editor festlegen musst.
4. Arbeitsbereich und Bereich (bei Workflows auch die übergeordnete Seite) wählen und **Übernehmen**.
:::
Kommst du aus Flowplan in den Marketplace – über **Mehr Vorlagen im Marketplace** in der Vorlagen-Galerie, **Marketplace öffnen** unter **Einstellungen → Import & Export** oder beim Veröffentlichen –, merkt sich der Marketplace deine Instanz von selbst und zeigt einmal kurz **Instanz übernommen: · ändern**. Du musst die Adresse dann gar nicht eintippen.
Workflows kommen immer **pausiert, als Entwurf** an. Prüfe sie, ergänze fehlende Angaben und aktiviere sie selbst.
Eine heruntergeladene `.flowplan-template`-Datei übernimmst du unter **Einstellungen → Import & Export → Vorlage aus dem Marketplace** oder in der Vorlagengalerie über **Vorlage importieren**.
Flowplan prüft jede Datei selbst noch einmal: Größe (höchstens 25 MB), Aufbau der Datei, Pfade, Kompression und den Inhalt jeder Art – genau wie beim Import aus einer anderen Instanz.
## Import prüfen
Bevor eine Einreichung öffentlich wird, prüft das Team des Marketplace sie in flowplan-admin auf zwei Arten: Eine **Sicherheitsprüfung** sucht im Paket nach riskanten Inhalten – etwa ausführbaren Dateien, Skripten in Dokumenten oder Anhängen, Zugangsdaten, persönlichen Daten oder Workflow-Schritten, die interne Adressen ansprechen –, und ein **Import-Test** spielt den Import in einem eigenen Test-Arbeitsbereich einer Flowplan-Instanz durch. Ein Paket mit einem blockierenden Fund wird nur veröffentlicht, wenn das Team das ausdrücklich begründet.
Den Import-Test kannst du auch selbst machen: Ob sich ein Paket in deiner Instanz importieren ließe, beantwortet `POST /api/marketplace/check`.
1. Flowplan liest das Paket genau wie beim Import: Größe (höchstens 25 MB), ZIP-Sicherheit, `template.json`, das Format der Art.
2. Dann folgt ein **Probelauf** im Arbeitsbereich: Der Import der Art läuft in einer Datenbank-Transaktion, die immer zurückgenommen wird – die Vorlage und eine Seite daraus mit Eigenschaften, Ansichten, Einträgen und Anhängen, die Whiteboard-Vorlage, das Erscheinungsbild mit seinen Schriften, die Linkregeln. So fallen auch Fehler auf, die erst beim Anlegen entstehen (doppelte Kennungen in einer Datenbank, Speicherplatz). Workflows werden gelesen, mit dem Arbeitsbereich abgeglichen und geprüft, aber nicht angelegt.
Es bleibt nichts zurück: keine Seite, keine Datei, kein Protokolleintrag, keine Webhooks oder Benachrichtigungen.
```bash
curl -X POST https://flowplan.example.com/api/marketplace/check \
-H "Authorization: Bearer fp_…" \
-F file=@vorlage.flowplan-template -F workspaceId=
```
- `workspaceId` (optional): der Arbeitsbereich des Probelaufs – du musst Mitglied sein (nicht Gast); Vorlagen brauchen Bearbeitungsrechte, Erscheinungsbild und Linkregeln Besitzerrechte. Ohne die Angabe nimmt Flowplan einen Arbeitsbereich, der dir gehört, sonst einen, in dem du bearbeiten darfst.
- `dryRun=0`: nur lesen, kein Probelauf.
- Die Antwort ist 200, auch wenn sich das Paket nicht importieren ließe, mit `ok: true|false`, `kind`, `creates` (was angelegt würde: `templates`, `pages`, `fields`, `views`, `records`, `files`, `nodes`, `items`, `fonts`, `rules`, `theme`), `errors` und `warnings` (jeweils `code`, `de`, `en`, ggf. `at`) und `dryRun` (`ran`, `rolledBack`, `ms`).
- Grenzen: 25 MB pro Paket, 30 Prüfungen in 10 Minuten pro Person. Ist der Marketplace ausgeschaltet, antwortet der Endpunkt mit 404.
- API-Tokens brauchen die Berechtigung **Marketplace-Prüfung** (siehe [API und Webhooks](/api-and-webhooks#api-tokens)).
**Für flowplan-admin:** Lege in einem eigenen Konto einen Test-Arbeitsbereich an, darin ein Token **Nur lesen** mit **Marketplace-Prüfung**, und trage Adresse, Token und Arbeitsbereichs-ID in flowplan-admin als `MARKETPLACE_IMPORT_CHECK_URL`, `MARKETPLACE_IMPORT_CHECK_TOKEN` und `MARKETPLACE_IMPORT_CHECK_WORKSPACE` ein.
## Datenschutz
- **Deine Instanz verbindet sich nie mit dem Marketplace.** Die Übergabe läuft in deinem Browser zwischen den beiden Fenstern; Flowplan schickt nur an die eingestellte Marketplace-Adresse und nimmt nur von dort etwas an.
- Der Marketplace-Server erfährt die Adresse deiner Instanz nicht. Flowplan hängt sie an seine Marketplace-Links nur als Teil hinter dem `#` an, den Browser nie an einen Server schicken; der Marketplace speichert sie in deinem Browser und entfernt sie sofort aus der Adresszeile. Er zählt nur anonym, wie oft eine Vorlage heruntergeladen oder in Flowplan geöffnet wurde – ohne IP-Adressen und ohne Cookies für Besucher.
- Beim Veröffentlichen geht nur die Datei an den Marketplace, die du im Dialog gesehen hast.
## Ausschalten
> [!ADMIN]
> Administratoren schalten den Marketplace unter **Administration → Erweiterungen & Domains → Marketplace** für die ganze Instanz aus. Dann zeigt Flowplan keine Marketplace-Schaltflächen und nimmt keine Vorlagen mehr an.
Über die Umgebung geht es auch: `FLOWPLAN_MARKETPLACE_URL=off` schaltet den Marketplace ab, eine andere Adresse (etwa ein eigener Marketplace) ersetzt `https://marketplace.flowplan.org`.
---
# Zusammenarbeit und Kommentare
Mehrere Personen schreiben gleichzeitig in derselben Seite, ohne sich zu überschreiben. Kommentare, Erwähnungen und der Posteingang halten Gespräche beim Inhalt.
## Gleichzeitig bearbeiten
- Dokumente und Eintragsinhalte werden über Yjs (CRDT) zusammengeführt: Jede Änderung bleibt erhalten, auch wenn zwei Personen im selben Absatz tippen.
- Änderungen erscheinen bei den anderen nach Sekundenbruchteilen: Der Server schiebt jede gespeicherte Änderung sofort an alle, die dasselbe Dokument offen haben (Server-Sent Events). Übertragen wird nur das Geänderte, nicht das ganze Dokument.
- **Farbige Cursor und Auswahlen** mit Namen zeigen, wo andere gerade schreiben; Bewegungen kommen ebenfalls sofort an.
- Ohne Verbindung arbeitest du weiter; die Änderungen werden abgeglichen, sobald das Netz zurück ist.
- Datenbank-Änderungen werden auf Versionskonflikte geprüft: Hat jemand denselben Eintrag inzwischen geändert, wird deine Änderung nicht stillschweigend darübergeschrieben, sondern abgelehnt, und du siehst den neuen Stand.
- Gäste mit Bearbeitungslink arbeiten ebenfalls live mit und sehen die Cursor der Mitglieder; Mitglieder sehen die Gäste als „Gast · “.
- Auf Whiteboards gibt es zusätzlich [Live-Cursor](/whiteboard-collaboration#gemeinsam-arbeiten) wie in Miro.
## Änderungen vorschlagen
Der Stift-Knopf **Vorschlagen** in der Werkzeugleiste schaltet den Vorschlagsmodus ein. Dann ändert Tippen den Text nicht direkt:
- **Eingefügter Text** erscheint grün unterstrichen, **gelöschter Text** bleibt rot durchgestrichen stehen. Überschreiben einer Markierung erzeugt beides.
- Wer den eigenen Vorschlag wieder löscht, entfernt ihn ganz.
- Über dem Text zeigt eine Leiste die Zahl der offenen Vorschläge. Aufgeklappt listet sie jeden mit Person und Text; ein Klick springt zur Stelle. **✓** nimmt einen Vorschlag an (Einfügung bleibt, Gelöschtes verschwindet), **✗** lehnt ihn ab. **Alle annehmen** und **Alle ablehnen** erledigen alles auf einmal.
- Vorschläge sind Teil des Dokuments: Sie erscheinen bei allen sofort und bleiben gespeichert, bis jemand sie annimmt oder ablehnt. Annehmen und ablehnen kann jeder, der die Seite bearbeiten darf.
- Formatierungen, Absatzwechsel und verschobene Blöcke werden auch im Vorschlagsmodus direkt übernommen; Änderungen anderer Personen werden nie zu deinen Vorschlägen.
- Auch in **Codeblöcken** werden Änderungen als Vorschläge markiert. Wird ein Absatz oder Listenpunkt durch Annehmen oder Ablehnen ganz leer (ein vorgeschlagener neuer Absatz abgelehnt, ein ganz gelöschter angenommen), verschwindet er mit.
- **Vorschläge der KI:** In [KI fragen](/ask-ai) setzt **Als Änderungsvorschlag einfügen** die Antwort genauso als Vorschläge in die Seite – mit deinem Namen und „(KI)“.
## Reaktionen
- **Kommentare**: Unter jedem Seiten- und Eintragskommentar fügt das Smiley eine Reaktion hinzu (👍 ❤️ 🎉 😄 👀 ✅ 🙏 🔥). Ein Klick auf eine vorhandene Reaktion schließt sich an oder nimmt die eigene zurück; der Tooltip zeigt, wer reagiert hat. Reagieren kann jeder, der die Seite sehen darf.
- **Absätze und Überschriften**: Text markieren oder mit der rechten Maustaste in den Text klicken öffnet das Textmenü. Oben stehen die Reaktionen für den Absatz, darunter Formatierung (fett, kursiv, unterstrichen, durchgestrichen, markieren, Code, Link), **Kommentieren** und **Kopieren**, in Aufgaben auch **Fälligkeit**. Die Reaktionen stehen als kleine Pillen am Block, werden im Dokument gespeichert und erscheinen bei allen sofort; ein Klick auf die eigene nimmt sie zurück. Das geht für alle, die die Seite bearbeiten dürfen. Mit Umschalt + Rechtsklick kommt das Menü des Browsers.
- Textkommentare haben ihre eigenen Reaktionen im Thread.
## Seiten folgen
Die Glocke oben auf einer Seite (auf dem Telefon **Folgen** oben im Menü `⋯`) schaltet **Folgen** ein oder aus. Wer einer Seite folgt, bekommt eine Benachrichtigung, sobald jemand anderes sie ändert – eine pro Seite, bis du sie wieder angesehen hast – und bei jedem neuen Kommentar darauf (bei einer Datenbank: auch zu ihren Einträgen). Mit E-Mail-Versand landet sie in der E-Mail-Zusammenfassung. Wer eine Seite anlegt, folgt ihr automatisch. Unter **Einstellungen → Benachrichtigungen** lässt sich die Art „Änderungen an Seiten, denen du folgst“ für Posteingang, Push und E-Mail einzeln abschalten.
## Wer hat die Seite gesehen?
Das Auge neben der Glocke zeigt, wer die Seite geöffnet hat und wann. Ein Haken bedeutet, dass die Person den neuesten Stand gesehen hat; „älter“, dass sich die Seite seitdem geändert hat. Angezeigt werden nur Personen, die die Seite noch sehen dürfen.
## Änderungen seit deinem letzten Besuch
Hat jemand anderes eine Seite geändert, seit du sie zuletzt geöffnet hast, erscheint oben ein Hinweis mit den Namen. Bei Dokumenten zeigt **Änderungen zeigen** die Textänderungen seit deinem letzten Besuch (eingefügt und gelöscht, wie im Versionsverlauf). Bei Datenbanken nennt der Hinweis die Zahl der bearbeiteten Einträge.
Die Startseite listet unter **Zuletzt angesehen** die Seiten, die du zuletzt geöffnet hast; die [Schnellsuche](/search-and-notifications#reihenfolge-pfad-und-zuletzt-angesehen) zeigt ohne Suchtext auch Einträge, nach Tagen gruppiert.
## Seitenkommentare
Das Sprechblasen-Symbol in der Kopfzeile öffnet die Kommentare der Seite (auf dem Telefon steht es dort nur bei offenen Kommentaren, mit ihrer Anzahl, sonst **Kommentare** im Menü `⋯`); Kommentare an Datenbankeinträgen stehen unter dem Eintrag. ++⌘ Enter++ sendet. Seiten- und Eintragskommentare sind reiner Text. `@` mit dem vollen Namen oder der E-Mail-Adresse eines Mitglieds – etwa `@Anna Berg` – erwähnt die Person: Sie bekommt eine Benachrichtigung, sofern sie die Seite und den Eintrag sehen darf.
## Textkommentare
Text markieren und **Text kommentieren** wählen oder ++⌘ ⌥ M++ drücken.
- Der kommentierte Text wird markiert; Klick darauf öffnet den Thread.
- Antworten, Emoji-Reaktionen, **Erledigen** und **Wieder öffnen**.
- Beiträge können formatiert sein (Listen, Links, Zitate, Code); `@` öffnet die Personensuche.
- Eigene Beiträge lassen sich bearbeiten und löschen. Wer beim Bearbeiten neu erwähnt wird, bekommt eine Benachrichtigung; bereits Erwähnte nicht noch einmal.
- Wird der Text später gelöscht, bleibt das Zitat im Thread erhalten.
- Entwürfe bleiben gespeichert, bis du sie sendest oder verwirfst.
Textkommentare gibt es in Dokumenten und in den Inhalten von Datenbankeinträgen, auch in Exporten und Inhaltsarchiven.
## Erwähnungen
- `@Name` in Text oder Kommentar benachrichtigt die Person. Die Personensuche zeigt nur Mitglieder, die die Seite lesen dürfen.
- Benachrichtigt wird nur, wer die Seite und – bei einem Eintrag – den Eintrag sehen darf; die verfassende Person selbst nie. Wer ohnehin vom Kommentar erfährt, bekommt nur eine Benachrichtigung, die Erwähnung. Liegt die Seite in einem [Journal mit PIN](/journal), zeigt die Benachrichtigung nur „Dieses Journal ist gesperrt.“, bis die PIN eingegeben ist.
- Gäste sehen keine anderen Mitglieder; ihre Erwähnungen benachrichtigen niemanden.
## Posteingang
Der **Posteingang** in der Seitenleiste sammelt Erwähnungen, Kommentare und Antworten, die dich betreffen ([wer von Kommentaren erfährt](/notifications#wer-von-kommentaren-erfaehrt)), Datums-Erinnerungen sowie Kommentare und Einträge von Gästen. Ungelesenes ist markiert; ein Klick springt zur Stelle – bei Textkommentaren direkt in den Thread. Welche Ereignisse als Push-Nachricht kommen, stellst du unter **Einstellungen → Benachrichtigungen** ein (siehe [Suche, Posteingang und Push](/search-and-notifications)).
---
# Teilen und Veröffentlichen
**Teilen** oben rechts auf jeder Seite (auf dem Telefon oben im Menü `⋯`) öffnet **Seite teilen**. Eine Zeile oben fasst zusammen, wie die Seite gerade geteilt ist – Bereich, Personen, Links und ob sie veröffentlicht ist. Darunter regeln drei Reiter je eine Sache: **Personen** (wer im Arbeitsbereich zugreifen darf), **Links** (benannte Links für Außenstehende; nur für alle, die mehr als lesen dürfen) und **Web** (die Veröffentlichung). Längere Erklärungen stehen hinter dem kleinen **(i)**. Unten kopiert **Link zur Seite kopieren** die Adresse der Seite für alle mit Zugriff, **Fertig** schließt den Dialog.
## Zugriff im Arbeitsbereich
Seiten erben die Rechte ihres Bereichs und ihrer übergeordneten Seiten; der Reiter **Personen** nennt unter der Liste, wer über den Bereich dazukommt (etwa „Dazu alle 8 Mitglieder des Bereichs Team“, mit **Bereich verwalten** für alle, die das dürfen). Zusätzlich lassen sich einzelnen Personen oder Gruppen Rechte geben:
| Rolle | Darf |
| --- | --- |
| **Ansehen** | Lesen und kommentieren |
| **Bearbeiten** | Inhalte, Einträge und Ansichten ändern |
Private Bereiche und Seiten sind nur für Freigegebene sichtbar. Gäste sehen ausschließlich, was ihnen ausdrücklich freigegeben wurde (siehe [Arbeitsbereiche, Mitglieder und Rechte](/workspaces-and-permissions)).
### Eine Seite mit einer Person teilen
Eine Seite oder Datenbank lässt sich mit einer Person teilen, die nicht im Arbeitsbereich ist – ohne sie in den ganzen Arbeitsbereich aufzunehmen. **Teilen → Personen**: E-Mail-Adresse eingeben (Mitglieder werden vorgeschlagen), **Ansehen** oder **Bearbeiten** wählen, **Hinzufügen**.
- **Die Person hat schon ein Konto auf dieser Instanz** (mit bestätigter Adresse)**:** Sie hat sofort Zugriff auf die Seite samt Unterseiten und bekommt eine Benachrichtigung im Posteingang („… hat „Seite“ mit dir geteilt“) und – wenn die Instanz E-Mails verschickt – sofort eine E-Mail mit Link zur Seite. Unter **Einstellungen → Benachrichtigungen → Mit dir geteilte Seiten** lässt sich die E-Mail abschalten. Ist sie noch nicht im Arbeitsbereich, kommt sie als **Gast** dazu und sieht nur, was mit ihr geteilt ist.
- **Noch kein Konto:** Sie bekommt eine Einladung per E-Mail (wenn eingerichtet) und steht als „Eingeladen“ in der Liste. Legt sie mit dieser Adresse ein Konto an, ist die Seite sofort da. Das gilt auch für ein Konto, dessen Adresse noch nicht bestätigt ist – dann öffnet erst der Einladungslink (**Einstellungen → Mitglieder → Ausstehende Einladungen → Link kopieren**) die Seite.
- Gäste sehen die Liste der Personen mit Zugriff nicht; E-Mail-Adressen sehen nur, wer teilen darf. Pro Person gehen höchstens einige Dutzend Einladungen pro Stunde hinaus und an jede Adresse wenige E-Mails.
- In der Liste lassen sich Rollen ändern und Personen wieder **Entfernen**. Hat ein Gast danach keine geteilte Seite mehr, ist er auch nicht mehr im Arbeitsbereich.
- Teilen dürfen Eigentümer des Arbeitsbereichs und Eigentümer des Bereichs, in dem die Seite liegt. Alle anderen sehen die Liste nur.
## Links mit eigenen Berechtigungen
Im Reiter **Links** entstehen mit **+ Neuer Link** beliebig viele benannte Links, z. B. „Feedback vom Kunden“: Name und Berechtigung wählen, auf Wunsch Unterseiten, Passwort und Ablaufdatum, dann **Link erstellen**. Jeder Link in der Liste hat einen Knopf zum Kopieren und ein Menü **⋯**.
| Linkberechtigung | Besucher dürfen |
| --- | --- |
| **Lesen** | die Seite ansehen |
| **Lesen und kommentieren** | zusätzlich kommentieren; Kommentare tragen einen Gastvermerk |
| **Lesen, kommentieren und bearbeiten** | zusätzlich Titel, Text und sichtbare Eigenschaften bestehender Einträge ändern |
- Links funktionieren ohne Konto und lassen sich einzeln widerrufen (**⋯ → Widerrufen**).
- Mit **Bearbeiten**-Links schreiben Gäste live mit: Änderungen von Mitgliedern und anderen Gästen erscheinen sofort, und die Cursor sind gegenseitig sichtbar – Gäste erscheinen als „Gast · “.
- Optional gelten sie auch für die aktuell vorhandenen Unterseiten; neue Unterseiten kommen nicht automatisch dazu.
- Über Bearbeitungslinks lassen sich keine Rechte, Mitglieder, privaten Relationen oder Dateien-Eigenschaften ändern. Vor jeder Gastbearbeitung sichert Flowplan den bisherigen Inhalt.
- Ein [Journal mit PIN](/journal) lässt sich weder per Link teilen noch veröffentlichen; wer die PIN setzt, widerruft vorhandene Links und Veröffentlichungen. Beim Teilen einer übergeordneten Seite samt Unterseiten bleibt es draußen.
### Passwort und Ablaufdatum
Links mit eigenen Berechtigungen und [Veröffentlichungen](#im-web-veroeffentlichen) können ein **Passwort** und ein **Ablaufdatum** haben – beim Erstellen oder später: bei Links über **⋯ → Passwort und Ablaufdatum**, bei der Veröffentlichung im Reiter **Web** unter **Passwort** und **Läuft ab**. Die Liste zeigt „Passwort“ bzw. „läuft ab am …“.
- Besucher geben das Passwort einmal pro Gerät ein. Es gilt bis zu 12 Stunden und nur für diesen Link; ein neues Passwort meldet alle Besucher ab.
- Zehn falsche Versuche in 15 Minuten sperren die Adresse für diesen Link.
- Bearbeiten-Links haben Tagesbudgets: Gäste laden je Link höchstens 200 MB Dateien pro Tag hoch (20 Dateien je 10 Minuten) und senden höchstens 100 MB Änderungen pro Tag; ein Dokument wächst über einen Link nicht über 3 MB Text hinaus. Für die ganze Instanz gilt zusätzlich `FLOWPLAN_ANONYMOUS_UPLOAD_MB` ([Konfiguration](/configuration)).
- Nach dem Ablaufdatum zeigt der Link nur noch „abgelaufen“ – keine Inhalte, keine Dateien, keine Live-Updates.
- Passwort entfernen oder Ablauf verlängern geht jederzeit.
- Passwortgeschützte Veröffentlichungen lassen sich nicht in andere Arbeitsbereiche kopieren.
- Das Passwort wird nur als Hash gespeichert und nie wieder angezeigt.
## Im Web veröffentlichen
Im Reiter **Web** macht der Schalter **Im Web veröffentlichen** die Seite für alle mit dem Link lesbar. Darauf folgen der öffentliche Link (**Kopieren** oder öffnen) und die Optionen:
- **Aktuell vorhandene Unterseiten mit veröffentlichen**; später angelegte holt **Auswahl um neue Unterseiten ergänzen** dazu.
- **Neue Unterseiten automatisch veröffentlichen** (nur zusammen mit den Unterseiten): Seiten, die später unter der veröffentlichten Seite angelegt, dorthin verschoben, dort dupliziert oder dorthin wiederhergestellt werden – auch von anderen und in jeder Tiefe –, sind ohne weiteren Schritt öffentlich, mit Passwort, Ablauf, Kopier-Einstellung und Aussehen dieser Veröffentlichung. Wird eine solche Seite wieder herausverschoben, ist sie nicht mehr veröffentlicht. Nie automatisch öffentlich werden Seiten, die du selbst nicht veröffentlichen dürftest (ohne deine Schreibrechte), Journale mit PIN, Workflow-Seiten und Seiten verschlüsselter Bereiche. Schaltest du die Option aus, bleiben die bis dahin hinzugekommenen Unterseiten veröffentlicht; neue kommen nicht mehr dazu.
- **Besucher dürfen eine Kopie in ihren Arbeitsbereich übernehmen** – nur das, was die Veröffentlichung zeigt.
- Datenbanken erscheinen mit ihren Ansichten – Tabelle, Board, Galerie, Liste, Feed, Kalender, Timeline und Diagramm (auch mit Datenreihen und weiteren Werten) –, Einträgen und Eintragsdokumenten. Eine Ansicht wird nur veröffentlicht, wenn alle Eigenschaften, die sie braucht, öffentlich sind. Personen-Eigenschaften, Relationen, Formeln, Rollups und interne Kommentare bleiben privat.
- Dateien, die in veröffentlichten Seiten verlinkt sind, sind öffentlich; andere Uploads nicht.
- Ausschalten, Löschen oder Verschieben aus dem veröffentlichten Baum entzieht den Zugriff sofort, auch auf Dateien.
- Hat eine Seite Überschriften, blenden Besucher über das Listen-Symbol rechts neben dem Text die **Gliederung** ein (auf dem Smartphone der runde Knopf unten rechts). Sie zeigt, wo man gerade liest, und springt per Klick zur Überschrift. Ob sie offen ist, merkt sich der Browser – wie im Editor.
### Aussehen
Im Reiter **Web** klappt unter den Optionen **Aussehen** auf. Dort legst du das Aussehen der Veröffentlichung fest: **Logo** und **Favicon** (HTTPS-Adresse oder eine hochgeladene Datei, die die Veröffentlichung zeigt), **Akzentfarbe**, **Text in der Fußzeile** und **„Mit Flowplan veröffentlicht“ ausblenden** – übernommen mit **Aussehen speichern**.
### Eigene Domain
Ist es in der Administration eingeschaltet (**Eigene Domains für Veröffentlichungen**), zeigt eine Veröffentlichung sich auch unter deiner Domain, etwa `docs.example.org`:
::: steps
1. Im Reiter **Web** **Eigene Domain** aufklappen, die Domain eintragen und **Domain hinzufügen**.
2. Beim DNS-Anbieter den angezeigten TXT-Eintrag anlegen: Name `_flowplan-verify.docs.example.org`, Wert `flowplan-verify-…`. Nur dieser TXT-Eintrag bestätigt die Domain.
3. Die Domain per CNAME (oder A/AAAA) auf die Flowplan-Instanz zeigen lassen.
4. **Jetzt prüfen** wählen. Das HTTPS-Zertifikat besorgt der Reverse Proxy – siehe [Eigene Domains für Veröffentlichungen](/coolify-and-proxy#eigene-domains-fuer-veroeffentlichungen).
:::
Eine bestätigte Domain bleibt bestätigt, bis du sie entfernst – auch Domains, die früher auf anderem Weg bestätigt wurden. Eine Domain, die nach 7 Tagen noch nicht bestätigt ist, wird wieder freigegeben; danach kann jemand anderes sie eintragen.
Unter der Domain gibt es kurze Adressen (`/` für die Startseite, `/` für Unterseiten), eine eigene `sitemap.xml` und `robots.txt`, und Suchmaschinen dürfen die Seiten aufnehmen; der `/share/…`-Link nennt sie als kanonische Adresse. Die Domain zeigt nur diese Veröffentlichung: keine Anmeldung, keine App, keine API außer den Lesezugriffen der Veröffentlichung, keine Cookies, und die Seiten lassen sich nicht in fremde Seiten einbetten.
Veröffentlichungen mit Passwort lassen sich nicht unter einer eigenen Domain zeigen. Endet die Veröffentlichung, antwortet die Domain mit 404.
> [!WARNING]
> Eingebettete Videos und externe Bilder laden beim Ansehen Inhalte vom jeweiligen Anbieter. Das gilt auch für veröffentlichte Seiten.
## Einzelne Einträge teilen
Ein Eintrag einer Datenbank lässt sich teilen, ohne die Datenbank zu öffnen: **Teilen** oben im Eintrag (im Dialog das Teilen-Symbol, als ganze Seite der Knopf **Teilen**) öffnet **Eintrag teilen**. Teilen darf, wer den Eintrag bearbeiten darf.
- **Links**: wie bei Seiten – Name, Berechtigung (Lesen, Kommentieren, Bearbeiten), auf Wunsch [Passwort und Ablaufdatum](#passwort-und-ablaufdatum); jeder Link lässt sich einzeln widerrufen.
- **Web**: **Im Web veröffentlichen** macht den Eintrag für alle mit dem Link lesbar, wieder mit Passwort und Ablaufdatum. Gastkommentare bleiben bei den Links; Suchmaschinen nehmen ihn nicht auf.
- **Eigenschaften**: welche Eigenschaften Besucher sehen – für alle Links und die Veröffentlichung dieses Eintrags. Voreingestellt sind alle, die auch eine Veröffentlichung zeigt, dazu die Dateien des Eintrags; leere werden nicht angezeigt. **Relationen** (zeigen die Titel verknüpfter Einträge, ohne Link) und **Personen** (zeigen Namen) erscheinen nur, wenn du sie anhakst. Eigenschaften mit Leserechten und Rollups bleiben immer privat.
- **Unterseiten einbeziehen** (beim Anlegen eines Links; bei der Veröffentlichung als Schalter): Besucher öffnen auch die [Unterseiten des Eintrags](/databases#unterseiten-eines-eintrags) und was darunter liegt – auch später hinzugekommene, solange sie unter dem Eintrag liegen. Unterseiten anderer Einträge, die Datenbank und ihre übrigen Seiten bleiben verborgen.
Besucher sehen Titel, Symbol, Cover, die gewählten Eigenschaften und das Dokument des Eintrags – keine anderen Einträge, keine Ansichten, nicht die Datenbank; der Pfad beginnt beim Eintrag (auf einer Unterseite: Eintrag / Unterseite). Links im Dokument auf andere Seiten oder Einträge sind für sie entfernt, Dateien nur sichtbar, wenn der Eintrag sie selbst verwendet. Mit **Bearbeiten** ändern Gäste das Dokument (live) und die sichtbaren Eigenschaften, aber keine Relationen.
- Mitglieder erreichen den Eintrag wie bisher über die Datenbank und die [Rechte des Eintrags](/databases#rechte-pro-eintrag); Gäste einzelner Einträge gibt es nicht – dafür ist der Link da.
- **Private** Einträge lassen sich nicht teilen; wird ein geteilter Eintrag privat, gelöscht, in eine andere Datenbank verschoben oder die Datenbank gelöscht, enden seine Links und seine Veröffentlichung sofort.
- Deine Links erscheinen unter **Einstellungen → Sicherheit**, alle unter **Administration → Sicherheit**.
## Formulare
Formulare haben einen eigenen Link, siehe [Formulare](/forms#formular-teilen).
---
# Schnellsuche und Sammlungen
Die Schnellsuche findet Inhalte bis in Dateianhänge hinein. Posteingang und Push-Nachrichten sagen dir, wenn jemand dich braucht.
**Mehr zum Thema:** [Posteingang und Benachrichtigungen](/notifications)
## Schnellsuche
++⌘ K++ (Windows/Linux ++Strg K++) oder **Suchen** in der Seitenleiste.
Durchsucht werden:
- Seitentitel und [Aliasse](/page-tags#aliasse) sowie Dokumenttexte,
- [Tags und Eigenschaftswerte](/page-tags#tags-und-eigenschaften) von Seiten,
- Datenbankeinträge und ihre Inhalte,
- Kommentare,
- Dateinamen,
- der Text von PDF-Anhängen (bis 50 MB, die ersten 100.000 Zeichen),
- gescannte PDFs und Bilder per Texterkennung (Deutsch und Englisch, auf Wunsch Französisch oder Chinesisch (Kurzzeichen) über `FLOWPLAN_OCR_LANGS`),
- Word-, Excel-, PowerPoint- und OpenDocument-Dateien.
Treffer lassen sich nach Typ und Bereich filtern. [Journaltage](/journal#tage-in-listen-suche-graph-und-export) stehen hinter allen anderen Treffern; **Ohne Journaltage** lässt sie ganz weg und bleibt für die nächste Suche eingeschaltet. Dateitexte werden im Hintergrund erfasst und sind nach wenigen Sekunden auffindbar. Die Suche zeigt nur, was du lesen darfst. Enter öffnet den ersten Treffer.
Aliasse von Seiten und Einträgen zählen so viel wie der Titel. Passt die Suche nur zu einem Alias, zeigt der Treffer den echten Titel mit dem Alias in Grau, etwa „Chauffage · PAC“. Dasselbe gilt im Dialog der @-Erwähnung.
### Reihenfolge, Pfad und zuletzt angesehen
Ganz oben stehen Treffer, deren Titel genau deiner Suche entspricht, dann Titel, die mit ihr (oder einem Wort darin) beginnen, dann die übrigen Titeltreffer und zuletzt Treffer nur im Text. Innerhalb davon rücken Seiten und Einträge nach oben, die **du** oft und zuletzt geöffnet hast; etwas Gewicht haben auch Seiten, die du kürzlich bearbeitet hast, und deine Favoriten. Unter jedem Treffer steht sein Pfad (Bereich / … / übergeordnete Seite, bei Einträgen mit der Datenbank) und wann er zuletzt bearbeitet wurde. Über der Liste stehen die Zahl der Treffer und die Sortierung: **Beste Treffer**, **Zuletzt bearbeitet** oder **Zuletzt erstellt**.
Ohne Suchtext zeigt die Schnellsuche die Seiten und Einträge, die du zuletzt geöffnet hast (bis zu 20, neueste zuerst), nach Tagen gruppiert: Heute, Gestern, dann das Datum.
Dafür merkt sich Flowplan pro Seite und Eintrag die Zeitpunkte deiner letzten zehn Besuche (minutengenau). Dieser Verlauf gehört nur dir: Er beeinflusst nur deine eigene Suche, andere sehen ihn nicht, auch Administratoren nicht in der Oberfläche. Besuche älter als 180 Tage werden gelöscht, höchstens 500 Seiten und Einträge pro Person bleiben gespeichert; beim Verlassen eines Arbeitsbereichs und beim Löschen deines Kontos verschwindet er. Zugriffe über API-Tokens zählen nicht.
### Nach Tags und Eigenschaften filtern
Diese Wörter wirken in der Suche als Filter:
| Eingabe | Findet |
| --- | --- |
| `#Kunde` | Seiten mit dem Tag „Kunde“ (Groß-/Kleinschreibung egal) und Datenbank-Einträge, die ihn in einer Mehrfachauswahl mit den Tags des Arbeitsbereichs tragen; Tags mit Leerzeichen als `#"Neue Idee"` |
| `-#Intern` | lässt Seiten und Einträge mit dem Tag weg |
| `Status:Offen` | Eigenschaft „Status“ mit dem Wert „Offen“ (Auswahl und Mehrfachauswahl: genau diese Option; Text, Webadresse, E-Mail, Telefon: enthält) |
| `Budget:>1000`, `Budget:<=50`, `Budget:10..20` | Zahlen vergleichen |
| `Fällig:2026-12`, `Fällig:>2026-11-01`, `Fällig:2026-11-01..2026-11-30` | Datum: Tag, Monat oder Jahr; nach, zwischen (auch `<`, `>=`, `<=`) |
| `Abgerechnet:ja` / `Abgerechnet:nein` | Kontrollkästchen |
| `Verantwortlich:Emil`, `Verantwortlich:ich` | Person nach Namen; `ich` (auch `me`) bist du |
| `Status:*` / `Status:-` | Eigenschaft gesetzt / leer |
Namen mit Leerzeichen stehen in Anführungszeichen: `"Nächster Schritt":Angebot`. Mehrere Filter gelten zusammen; der übrige Text wird wie gewohnt gesucht. Nur Filter ohne Text listen alle passenden Seiten, die zuletzt geänderte zuerst. Einträge zählen dabei mit ihren eigenen Tags und denen ihrer Datenbank-Seite. Wörter, die keinen Tag und keine Eigenschaft nennen (etwa `#123`), bleiben normale Suchwörter.
Tags und Eigenschaften können [nur in einem Bereich gelten](/page-tags#geltungsbereich-arbeitsbereich-oder-bereich), und zwei Bereiche dürfen gleichnamige haben. `#Dringend` ist ein Name: Es findet die Seiten mit jedem Tag dieses Namens, den du sehen darfst – in jedem Bereich den dort geltenden. Die Auswahl **Tag …** neben dem Suchfeld zeigt mit gewähltem Bereich nur dessen Tags und die des Arbeitsbereichs, für alle Bereiche alle mit dem Bereichsnamen als Hinweis. Die [Tag-Ansicht](/page-tags#tag-ansicht) zeigt dagegen genau einen Tag (gleichnamige anderer Bereiche auf Wunsch dazu).
Erkannte Filter erscheinen als Chips unter dem Suchfeld; ✕ nimmt einen wieder heraus. Die Auswahl **Tag …** neben dem Bereich fügt einen Tag-Filter ein. Sammlungen behalten die Filter. Tag-Namen und Werte sind außerdem gewöhnliche Suchwörter der Seite: „Kunde“ findet auch Seiten mit dem Tag „Kunde“.
### Verknüpfen: UND, ODER, NICHT
Bedingungen lassen sich frei kombinieren. Das geht in der Suche und in [Sammlungen](#sammlungen):
| Eingabe | Bedeutung |
| --- | --- |
| `#Kunde #Offen` | beide (UND; ein `AND` dazwischen ist erlaubt) |
| `#Offen OR #Wartet`, `#Offen \| #Wartet` | eines von beiden |
| `-#Intern`, `NOT #Intern`, `-entwurf` | ohne; `-` bzw. `NOT` geht vor jeder Bedingung und vor einer Klammer |
| `(#Offen OR #Wartet) -#Intern` | Klammern gruppieren |
| `created_by:Anna`, `creator:me` | erstellt von (Name oder `me` für dich) |
| `updated_by:Emil`, `editor:me` | zuletzt geändert von |
| `created:-7d`, `updated:this-week` | erstellt bzw. geändert in den letzten 7 Tagen, in dieser Woche |
| `created:2026-03`, `updated:>2026-01-01`, `created:2026-01-01..2026-01-31` | Jahr, Monat oder Tag; danach (`>`, `>=`), davor (`<`, `<=`), Zeitraum |
| `type:document`, `type:database\|whiteboard`, `type:record` | nur Dokumente, Datenbanken, Whiteboards oder Datenbank-Einträge (auch `notebook`, `journal`) |
| `in:"Team Marketing"` | nur in diesem Bereich |
| `title:Angebot` | nur der Titel enthält das Wort |
**Relative Zeiträume:** `-7d`, `-2w`, `-3m` und `-1y` meinen die letzten 7 Tage, 2 Wochen, 3 Monate oder ein Jahr, heute eingeschlossen. Dazu kommen `today`, `yesterday`, `this-week`, `last-week`, `this-month`, `last-month`, `this-year` und `last-year`. Wochen beginnen am Montag. „Heute“ ist der Tag in deiner Zeitzone. Diese Angaben gehen auch bei Datums-Eigenschaften: `Fällig:this-week`.
**Vorrang:** `NOT`/`-` bindet am stärksten, dann UND, dann ODER. `#A #B OR #C` heißt also `(#A #B) OR #C`. Im Zweifel setzt du Klammern. `OR`, `AND` und `NOT` gelten nur in Großbuchstaben. Kleingeschriebenes „or“ bleibt ein Suchwort.
**Wörter:** Wörter direkt hintereinander werden wie bisher als zusammenhängender Ausdruck gesucht. Mit `AND` dazwischen (`Rechnung AND offen`) dürfen sie irgendwo stehen.
**Schlüsselwörter:** `created_by`, `creator`, `updated_by`, `editor`, `created`, `updated`, `type`, `in` und `title` sind englisch. Groß- und Kleinschreibung zählt nicht. Heißt eine Eigenschaft genauso, setzt du ihren Namen in Anführungszeichen: `"Type":Buch`. Bei Datenbank-Einträgen prüft `Eigenschaft:Wert` zuerst die gleichnamige Eigenschaft des Eintrags (z. B. `Priorität:Hoch`), sonst die der Datenbankseite.
Alle bisherigen Suchen funktionieren unverändert. Suchen mit den neuen Bedingungen listen die passenden Seiten und Einträge ohne Textausschnitt, zuletzt geänderte zuerst. Ende-zu-Ende-verschlüsselte Bereiche durchsucht der Server nicht.
### Befehle
Dieselbe Schnellsuche führt auch Befehle aus: Beginnt die Eingabe mit `>`, erscheinen nur Befehle, etwa `> neue datenbank`, `> aufgaben`, `> dunkel` oder `> fokus`; Enter führt den ersten aus. Passende Befehle erscheinen auch ohne `>` über den Suchtreffern. Mit geöffneter Seite gibt es zusätzlich Seitenbefehle: Favorit, Folgen, Kommentare, Export, Drucken/PDF, Versionsverlauf, Teilen und Fokusmodus.
### Sammlungen
Eine **Sammlung** ist eine gespeicherte Suche mit eigenem Platz in der Seitenleiste. Öffnest du sie, sucht Flowplan jedes Mal neu. Neue und geänderte Seiten und Einträge, die passen, erscheinen von selbst.
- **Anlegen:** In der Schnellsuche **Als Sammlung speichern** (Art und Bereich der Suche werden zu `type:` und `in:`) oder in der Seitenleiste bei **Sammlungen** auf **+**.
- **Filter oder Text:** Im Editor stellst du die Abfrage unter **Filter** zusammen. Gruppen verlangen **alle Bedingungen (UND)** oder **mindestens eine (ODER)**. Jede Bedingung und jede Gruppe lässt sich ausschließen (NICHT). Zur Wahl stehen Tag, Erstellt von, Zuletzt geändert von, Eigenschaft (je nach Typ: Auswahl, Mehrfachauswahl, Text, Zahl, Datum, Kontrollkästchen, Person), Erstellt am, Geändert am (relativ oder fest), Art, Bereich, Titel enthält und Text enthält. Unter **Text** steht dieselbe Abfrage in der Suchsprache. Beide Ansichten bleiben gleich: Was du im Text änderst, zeigen die Filter wieder an. Lässt sich ein Text nicht als Filter darstellen (etwa wegen einer fehlenden Klammer), bleibt der Editor bei Text und sagt das. Darunter siehst du sofort, wie viele Treffer es gibt.
- **Ergebnisse:** Als **Liste** oder **Tabelle** mit Titel, Art, Bereich, Tags, Geändert und Erstellt von. Zuletzt geänderte stehen zuerst; ein Klick auf die Spaltenüberschrift sortiert die geladenen Treffer. Zuerst siehst du 500 Treffer. Passen mehr, steht am Ende „500 von N Treffern“ mit **Mehr laden** – jeder Klick hängt die nächsten 500 an, bis alle da sind. Ändert sich währenddessen etwas im Arbeitsbereich, bleiben alle geladenen Treffer stehen.
- **Verwalten:** Im Menü **…** neben einer Sammlung findest du Bearbeiten (Name, Emoji, Filter, Teilen), Duplizieren, Nach oben/Nach unten und Löschen. Sammlungen lassen sich auch per Ziehen ordnen; die Reihenfolge gilt für dich. Nach dem Löschen bietet **Rückgängig** die Sammlung wieder an.
- **Teilen:** Neue Sammlungen sind privat. Mit **Mit dem Arbeitsbereich teilen** sehen alle Mitglieder sie unter **Geteilt**, Gäste nicht. Ändern und löschen dürfen sie nur du und die Eigentümer des Arbeitsbereichs. Teilen oder das Teilen beenden kannst nur du. Die anderen können **Als meine Sammlung duplizieren**.
- **Rechte:** Jede Person sieht in einer Sammlung nur, was sie selbst lesen darf. Das gilt auch für geteilte Sammlungen: keine privaten Bereiche, keine privaten Einträge anderer, keine verborgenen Eigenschaften, keine Journale hinter einer PIN, nichts aus dem Papierkorb. Ende-zu-Ende-verschlüsselte Bereiche bleiben außen vor; die Sammlung weist darauf hin.
- **Grenzen:** 100 Sammlungen je Person und Arbeitsbereich, 100 geteilte je Arbeitsbereich.
Gespeicherte Suchen aus früheren Versionen sind beim Update zu privaten Sammlungen geworden. Suchen nach Kommentaren oder Dateien behalten ihre Wörter, aber nicht die Art.
---
# Posteingang und Benachrichtigungen
Was im Posteingang landet und wie du davon erfährst: per E-Mail, als Push auf Telefon und Desktop oder in Telegram, Gotify, ntfy und Matrix.
## Posteingang
Der **Posteingang** sammelt:
- Erwähnungen,
- Kommentare, die dich betreffen (siehe [unten](#wer-von-kommentaren-erfaehrt)), und Antworten in Textkommentaren, an denen du beteiligt bist,
- Datums-Erinnerungen,
- Kommentare und Einträge von Gästen über Freigabelinks,
- mit dir geteilte Seiten und Arbeitsbereiche,
- Änderungen an Seiten, denen du folgst (eigene Seiten folgst du beim Anlegen automatisch; die Glocke oben rechts schaltet das Folgen um, auf dem Telefon **Folgen** im Menü `⋯`),
- Meldungen aus Automationen.
### Wer von Kommentaren erfährt
Ein neuer Kommentar – auf einer Seite, an einem Datenbankeintrag oder als neuer Textkommentar – benachrichtigt nicht den ganzen Arbeitsbereich, sondern nur:
- wer der Seite folgt (wer eine Seite anlegt, folgt ihr automatisch; bei einem Eintrag: wer der Datenbank folgt),
- die Besitzerin oder den Besitzer der Seite,
- bei einem Eintrag: wer ihn angelegt hat und die Personen in seinen Personen-Eigenschaften (etwa **Zugewiesen**),
- wer auf derselben Seite bzw. demselben Eintrag schon kommentiert hat,
- wer im Kommentar mit `@` erwähnt wird – bei Seiten- und Eintragskommentaren mit vollem Namen oder E-Mail-Adresse (`@Anna Berg`). Wer erwähnt wird und ohnehin dazugehört, bekommt nur eine Benachrichtigung, die Erwähnung.
Antworten in einem Textkommentar erreichen alle, die in diesem Thread schon geschrieben haben, und die darin Erwähnten. Nie benachrichtigt werden die verfassende Person selbst und wer die Seite oder den Eintrag nicht sehen darf. Wer bei einer Seite mitlesen will, folgt ihr über die Glocke.
**Standardmäßig** kommt, was dich direkt betrifft – Erwähnungen, geteilte Seiten, Kommentare, Erinnerungen –, im Posteingang, als Push, per E-Mail und in verbundenen [Chat-Apps](#chat-apps). Gastkommentare kommen ohne E-Mail und ohne Chat-App. **Änderungen an Seiten, denen du folgst, und Automationen landen nur im Posteingang**, damit nicht jede kleine Bearbeitung eine Mitteilung oder Mail auslöst. Unter **Einstellungen → Benachrichtigungen** lässt sich das je Art und Kanal ändern; **Auf Standard zurücksetzen** stellt den Ausgangszustand wieder her.
**Aufbewahrung:** Gelesene Benachrichtigungen werden nach 90 Tagen gelöscht, ungelesene nach einem Jahr; je Person bleiben höchstens die neuesten 1.000. Der Posteingang zeigt die neuesten 100.
**Für Administratoren: Sicherheitsvorfälle der Instanz.** Admins sehen bei den Benachrichtigungsarten eine eigene Zeile **Sicherheitsvorfälle der Instanz**: was die [Erkennungsregeln](/security-monitoring#sicherheit) auf der ganzen Instanz finden (Passwort-Raten, neue Adminrechte, Abtasten …). Jeder Admin stellt selbst ein, wie die Vorfälle ankommen – Posteingang, Push, E-Mail und Chat-Apps sind standardmäßig an – und welche: **Alle Vorfälle** (Standard) oder **Nur kritische**. Die Auswahl gilt für alle Kanäle dieser Art; unter **Administration → Angriffe & Vorfälle** erscheint jeder Vorfall trotzdem. Ein Klick oder Tipp auf die Mitteilung öffnet die Seite des Vorfalls. Die Zeile **Sicherheitshinweise** betrifft nur das eigene Konto (neue Anmeldung, falsche Journal-PIN, abgeschaltete Chat-App); wer dort vor dem Update Kanäle ausgeschaltet hatte, hat sie für Sicherheitsvorfälle ebenfalls aus. Andere Personen sehen die Zeile nicht.
Ungelesenes ist markiert und lässt sich filtern. Ein Klick öffnet die Stelle, bei Textkommentaren direkt den Thread. Mitteilungen ohne Seite führen an ihren Ort in der App: ein Sicherheitsvorfall auf seine Seite unter **Administration → Angriffe & Vorfälle**, eine neue Anmeldung zu den angemeldeten Geräten, eine abgeschaltete Chat-App zu ihren Verbindungen – auch beim Tipp auf die Push-Mitteilung und über den Link in E-Mail und Chat-App.
### Benachrichtigungen von Workflows
[Workflows](/workflows) melden sich über zwei eigene Arten, die du unter **Einstellungen → Benachrichtigungen** je Kanal abschalten kannst: **Nachrichten von Workflows** (was ein Workflow verschickt) und **Fehler, Pausen und Freigaben von Workflows** – so verpasst du keine Freigabe, wenn du die Nachrichten stummschaltest. Eine Freigabe-Benachrichtigung öffnet die Workflow-Seite mit dem Reiter **Freigaben**.
## E-Mail
Ist auf der Instanz ein Mailserver eingerichtet, kommen ungelesene Benachrichtigungen nach zehn Minuten als Zusammenfassung per E-Mail – eine Mail für alles, was sich angesammelt hat, jede Benachrichtigung höchstens einmal. Unter **Einstellungen → Benachrichtigungen** lässt sich die Spalte **E-Mail** je Art ein- und ausschalten. Einladungen in einen Arbeitsbereich und mit dir geteilte Seiten kommen sofort per E-Mail.
### Wöchentliche Zusammenfassung
Unter **Einstellungen → Benachrichtigungen → Wöchentliche Zusammenfassung** bestellst du eine E-Mail, die jeden **Montag um 7 Uhr** in deiner Zeitzone kommt (gespeichert wird die Zeitzone deines Browsers beim Einschalten):
- **Geändert in Seiten, denen du folgst** – mit Arbeitsbereich und wer geändert hat (Änderungen der letzten sieben Tage, nur von anderen),
- **Überfällige Aufgaben** und **Offene Aufgaben** – wie in **Meine Aufgaben**, über alle Arbeitsbereiche.
**Mit kurzer KI-Zusammenfassung der Änderungen** (nur sichtbar, wenn [KI](/ai) für dich eingeschaltet ist) stellt der Liste ein paar Stichpunkte voran. Die KI liest dafür nur Seiten, die sie für dich lesen darf, mit deinem KI-Anbieter. Ist KI aus oder schlägt die Anfrage fehl, kommt die E-Mail als einfache Liste. Gibt es in einer Woche nichts zu berichten, kommt keine E-Mail. Die Zusammenfassung braucht einen eingerichteten Mailserver.
## Push-Benachrichtigungen
Unter **Einstellungen → Benachrichtigungen**:
::: steps
1. **Push aktivieren** – der Browser fragt nach der Erlaubnis. Das gilt pro Gerät.
2. In der Karte **Benachrichtigungsarten** je Art die Schalter **Posteingang**, **Push** und **E-Mail** setzen – jede Änderung wird sofort gespeichert. Auf dem Handy steht jede Art als eigene Karte mit drei beschrifteten Schaltern.
3. Mit **Testbenachrichtigung senden** prüfen, ob alles ankommt (siehe [unten](#testbenachrichtigung)).
:::
Push-Nachrichten öffnen die betroffene Seite. Auf dem Sperrbildschirm erscheinen keine Dokumentinhalte.
> [!NOTE]
> **iPhone und iPad** (ab iOS 16.4): Flowplan in Safari über HTTPS öffnen, **Zum Home-Bildschirm** hinzufügen und aus diesem Symbol starten. Erst dort lässt sich Push aktivieren.
Abmelden, Sitzungsende oder eine Kontosperre beenden das Push-Abonnement; nach dem nächsten Anmelden bei Bedarf wieder aktivieren.
In den [Apps für iPhone, iPad und Android](/mobile-apps) kommen Mitteilungen über die App: Sie fragt nach dem ersten Anmelden nach der Erlaubnis, die Zahl der ungelesenen steht am App-Symbol. **Benachrichtigungsarten** gelten dort genauso. Diese Mitteilungen sind Ende-zu-Ende-verschlüsselt und zeigen deshalb ihren Text – Relay, Apple und Google lesen ihn nicht mit, siehe [Push-Relay](/configuration-ai-push#push-relay-und-ende-zu-ende-verschluesselung).
### Testbenachrichtigung
**Einstellungen → Benachrichtigungen → Testbenachrichtigung senden** schickt sofort eine Mitteilung „Testbenachrichtigung – alles funktioniert.“ an alle deine Push-Ziele: jeden Browser mit aktiviertem Push und jede [App](/mobile-apps) mit erlaubten Mitteilungen. Sie geht denselben Weg wie jede Benachrichtigung – Web-Push, [Push-Relay](/configuration-ai-push#push-relay-und-ende-zu-ende-verschluesselung) oder Expo –, legt aber nichts im Posteingang ab. Ein Tipp darauf öffnet diese Einstellungen.
Nach höchstens zehn Sekunden steht darunter je Gerät, über welchen Kanal es ging (**Relay · Ende-zu-Ende-verschlüsselt**, **Expo** oder **Web Push**) und was passiert ist:
- **Zugestellt** – an Apple, Google oder den Push-Dienst des Browsers übergeben. Kommt trotzdem nichts an, liegt es am Gerät: Mitteilungen für Flowplan erlaubt? Ist ein Fokus aktiv, steht das dabei.
- **Registrierung abgelaufen** – die App einmal öffnen, sie meldet sich neu an. Beim abgelaufenen Abonnement eines Browsers dort Push erneut aktivieren.
- **Benachrichtigungen ausgeschaltet** – in der App bzw. den Systemeinstellungen des Geräts erlauben.
- **Push-Relay nicht eingerichtet, nicht erreichbar oder Instanz nicht verifiziert** – das betrifft die Instanz, nicht dein Gerät; die Meldung nennt den Grund (z. B. `PUSH_RELAY=off`, `APP_URL` ohne HTTPS, `/.well-known/flowplan-push` nicht erreichbar). Siehe [Konfiguration](/configuration-ai-push#push-relay-und-ende-zu-ende-verschluesselung).
- **Keine Geräte registriert** – Push oben aktivieren oder die App öffnen und Mitteilungen erlauben.
Der Test geht nur an deine eigenen Geräte, ungeachtet der **Benachrichtigungsarten** und eines Fokus-Filters – Erlaubnis und Fokus des Geräts selbst gelten weiter. Höchstens fünf Tests in zehn Minuten. Tokens oder Schlüssel zeigt das Ergebnis nie; Administratoren sehen zusätzlich eine Diagnosezeile mit Relay-Adresse, ob `/.well-known/flowplan-push` aktiv ist, und der Adresse der Instanz (`APP_URL`).
> [!DESKTOP]
> In der [Desktop-App](/desktop-app#mitteilungen-in-der-desktop-app) gibt es kein Web-Push. Die App fragt selbst nach neuen Benachrichtigungen und zeigt sie als Mitteilungen des Systems, die Zahl der ungelesenen steht am App-Symbol. **Einstellungen → Benachrichtigungen** zeigt dort statt **Push aktivieren** einen Schalter für die Mitteilungen der App; **Nicht stören** und **Alle Profile** stehen im Menü **Mitteilungen** der App. **Benachrichtigungsarten** gelten auch hier: Mitteilungen gibt es nur für Arten mit Push.
## Chat-Apps
Statt (oder neben) Push und E-Mail kommen Benachrichtigungen sofort in einer Chat-App an: **Telegram**, **Gotify**, **ntfy** oder **Matrix**. Unter **Einstellungen → Benachrichtigungen → Chat-Apps** verbindest du je Dienst ein Ziel; welche Arten dort ankommen, stellst du in der Karte **Benachrichtigungsarten** in der Spalte **Chat-Apps** ein. Standardmäßig sind das Erwähnungen, geteilte Seiten, Kommentare, Erinnerungen und Sicherheitshinweise – Gastkommentare, Änderungen an Seiten, denen du folgst, und Automationen nicht. Was im Posteingang ausgeschaltet ist, kommt auch nicht in der Chat-App an.
| Dienst | Was du angibst |
| --- | --- |
| **Telegram – Bot der Instanz** | Nichts: **Verbindungslink erzeugen**, den Link auf dem Gerät mit Telegram öffnen und **Starten** tippen (oder dem Bot `/start ` schicken). Der Code gilt 15 Minuten und nur einmal. Nur verfügbar, wenn die Administration einen Bot eingerichtet hat. |
| **Telegram – eigener Bot** | Bot-Token (von @BotFather), deine Chat-ID (z. B. von @userinfobot) oder `@kanalname`, optional eine eigene API-Adresse – für einen selbst betriebenen Bot-API-Server oder ein Relay/Proxy. Schreib deinem Bot einmal, damit er dir antworten darf. |
| **Gotify** | Server-Adresse und App-Token (in Gotify unter *Apps* anlegen). Ein Tipp auf die Mitteilung öffnet Flowplan. |
| **ntfy** | Server (leer: `https://ntfy.sh`), Thema, optional ein Zugriffstoken oder Benutzer und Passwort. Auf ntfy.sh ist jedes Thema öffentlich – wähle einen schwer zu ratenden Namen oder einen eigenen Server mit Anmeldung. |
| **Matrix** | Homeserver, Raum-ID (`!abc:example.org`, in Element unter *Raumeinstellungen → Erweitert*) und das Zugriffstoken eines Kontos, das im Raum ist – am besten eines eigenen Bot-Kontos. |
**Testnachricht senden** schickt sofort eine Nachricht und zeigt das Ergebnis: angekommen, *Zugangsdaten abgelehnt (HTTP 401)*, *Nicht gefunden (HTTP 404)* (Adresse, Thema, Raum oder Chat-ID), *Server nicht erreichbar* oder *Interne Adressen sind gesperrt*. **Ändern** übernimmt neue Angaben; ein leeres Token-Feld behält das gespeicherte Token. **Trennen** löscht die Verbindung mit ihren Zugangsdaten.
**Was in der Nachricht steht:** wie bei Push die Art, ein kurzer Auszug der Benachrichtigung und ein Link zur Stelle. Mit **Text mitschicken** aus kommt nur „Neue Benachrichtigung in Flowplan“ mit dem Link. Benachrichtigungen aus [Ende-zu-Ende-verschlüsselten Bereichen](/encrypted-spaces) kommen **immer** ohne Inhalt. Tokens oder andere Geheimnisse stehen nie in einer Nachricht.
**Zugangsdaten** (Bot-, App- und Zugriffstokens, Passwörter) speichert Flowplan nur verschlüsselt wie andere [gespeicherte Geheimnisse](/configuration-storage#gespeicherte-geheimnisse) und zeigt sie nie wieder an – nur „Token gesetzt (…abcd)“. Verbinden und Trennen erscheinen unter **Einstellungen → Sicherheitscheck → Anmeldungen & Änderungen**.
**Zustellung:** Nachrichten gehen über eine Warteschlange wie Push und E-Mail. Antwortet der Dienst nicht, versucht Flowplan es mit wachsenden Pausen erneut und gibt nach sechs Versuchen auf; bremst der Dienst (HTTP 429), wartet Flowplan so lange wie verlangt. Pro Ziel gehen höchstens 20 Nachrichten pro Minute hinaus. Was du in der App schon gelesen hast, wird nicht mehr geschickt. Lehnt der Dienst ein Ziel dreimal hintereinander ab (401/403/404 oder eine gesperrte interne Adresse), **schaltet Flowplan es aus** und sagt dir im Posteingang Bescheid; **Wieder einschalten** nimmt es nach der Korrektur wieder in Betrieb.
**Für Administratoren:** Der Schalter **Betriebswarnungen** schickt fehlgeschlagene Backups, vollen Speicher, Fehler von Hintergrunddiensten und viele fehlgeschlagene Anmeldungen (höchstens einmal am Tag je Warnung) an deine Chat-Apps – auch ohne Webhook unter [Überwachung](/administration#ueberwachung). Sicherheitsvorfälle kommen über die Zeile **Sicherheitsvorfälle der Instanz** der Benachrichtigungsarten, nicht doppelt.
Welche Dienste und Server erlaubt sind, bestimmt die Administration ([Administration → Chat-Apps](/administration#chat-apps)).
---
# Offline und Web-App
Flowplan läuft im Browser, lässt sich als App installieren und funktioniert auch ohne Verbindung weiter.
**Mehr zum Thema:** [Desktop-App für macOS, Windows und Linux](/desktop-app) · [Apps für iPhone, iPad und Android](/mobile-apps) · [Widgets und Mitteilungen in den Apps](/mobile-widgets) · [Erfassen, Teilen und Scannen in den Apps](/mobile-capture)
## Ohne Verbindung arbeiten
Dokumente speichert Flowplan immer zuerst lokal im Browser (IndexedDB) und gleicht sie mit dem Server ab, sobald er erreichbar ist. Bricht die Verbindung ab, schreibst du einfach weiter; Änderungen anderer werden beim Wiederverbinden zusammengeführt.
### Offline-Nutzung einschalten
Unter **Einstellungen → Offline & Geräte** speichert das Gerät zusätzlich die App, den Arbeitsbereich, alle lesbaren Seiten und später geöffnete Einträge und Dateien. Dann lassen sich auch ohne Verbindung Seiten öffnen, Dokumente und Datenbanken lesen und Text bearbeiten.
- Online kommt immer der aktuelle Stand vom Server; die Kopie dient nur ohne Verbindung.
- Ist die Anmeldung abgelaufen, zeigt Flowplan online die Anmeldeseite – ohne Verbindung öffnet die gespeicherte Kopie trotzdem.
- Die Kopien enthalten private Inhalte. Sie werden beim Abmelden, beim Ausschalten und bei der Anmeldung einer anderen Person entfernt.
#### Die ganze App auf dem Gerät
Zur Kopie gehört die ganze App – nicht nur die Teile, die du online schon geöffnet hast. Auch Editor, Kalender-, Zeitleisten- und Galerieansichten, Dashboards, Diagramme, Whiteboards, Notizbücher, Formeln, Mermaid-Diagramme und der PDF-Viewer laden dann ohne Verbindung.
- **Speicherbedarf:** etwa 18 MB auf dem Gerät (rund 5 MB Download), einmal je Version. Flowplan speichert die App-Dateien nur, wenn das Gerät genug Platz hat.
- **Neue Version:** Nach einem Update lädt Flowplan beim nächsten Abgleich die Dateien der neuen Version; was sich nicht geändert hat, wird übernommen statt neu geladen. Sobald die neue Version vollständig gespeichert ist, entfernt es die alte.
- Unter **Einstellungen → Offline & Geräte** steht dazu eine Zeile wie „Die App ist für die Offline-Nutzung gespeichert (Version 0.7.0) · 18 MB“ – oder wie viele Dateien noch fehlen.
- Fehlt ohne Verbindung doch einmal ein Teil, zeigt Flowplan an seiner Stelle „Nicht offline verfügbar – versuche es wieder, wenn du online bist“ mit **Erneut versuchen**; der Rest der App bleibt bedienbar, und sobald die Verbindung zurück ist, lädt der Teil von selbst. Ein Eintrag, dessen Inhalt nicht in der Kopie liegt, zeigt „Dieser Eintrag ist offline nicht verfügbar.“
#### Die Kopie bleibt aktuell
Solange Flowplan geöffnet ist, gleicht es die Kopie selbst ab: beim Start, wenn die Verbindung zurückkommt, wenn du die App wieder in den Vordergrund holst, und alle 6 Stunden. Dabei lädt es nur, was sich seit dem letzten Abgleich geändert hat – meist zwei kleine Anfragen.
- **Neue Seiten** kommen dazu, **geänderte** Seiten, Einträge und Dokumente werden neu geladen.
- **Gelöschte Seiten** und Seiten, die du nicht mehr lesen darfst (auch ein Journal hinter einer PIN), verschwinden samt ihren Einträgen und Dateien aus der Kopie.
- Läuft ein Abgleich länger, steht unten links kurz **Offline-Kopie wird aktualisiert …**.
- Ist die Anmeldung abgelaufen, gleicht Flowplan nicht ab – die vorhandene Kopie bleibt unverändert.
Unter **Einstellungen → Offline & Geräte** steht der Stand, etwa „Offline-Kopie aktualisiert vor 2 Std. · 312 Seiten · 85 MB“. **Jetzt aktualisieren** lädt alle Seiten neu.
**Auch Eintragsinhalte und Dateien speichern** legt zusätzlich die Dokumente aller Datenbank-Einträge und die Dateien der Seiten ab, auch wenn du sie noch nie geöffnet hast – höchstens 200 MB und nur, solange das Gerät genug Platz hat. Ohne Haken bleiben nur Einträge und Dateien, die du schon einmal geöffnet hast. Ausschalten entfernt die zusätzlich gespeicherten Einträge und Dateien.
Ohne Verbindung zeigt Flowplan unter dem Offline-Hinweis das Datum der Kopie, wenn sie älter als 7 Tage ist („Offline-Kopie vom 12. Okt.“).
> [!NOTE]
> Als App installiert (Chrome, Edge, Android), gleicht Flowplan die Kopie auf Wunsch des Browsers auch im Hintergrund ab, wenn die App geschlossen ist (Periodic Background Sync). Ob und wie oft, entscheidet der Browser – meist nur bei häufig genutzten Apps. Einträge und Dateien, die noch nie geöffnet wurden, lädt erst die geöffnete App.
### Datenbank-Einträge offline
Änderungen an Einträgen ohne Verbindung erscheinen sofort in den Ansichten und werden auf dem Gerät gesammelt. Sobald die Verbindung zurück ist, gehen sie der Reihe nach an den Server. Ist der Server dabei kurz nicht erreichbar – etwa während eines Neustarts hinter dem Proxy (Antworten 502, 503, 504, 429 oder 408) –, bleiben die Änderungen in der Warteschlange und gehen beim nächsten Versuch hinaus, statt verworfen zu werden. Hat jemand denselben Eintrag inzwischen geändert, führt Flowplan die Änderungen Feld für Feld zusammen; wurde dasselbe Feld auf beiden Seiten geändert oder der Eintrag gelöscht, entscheidest du im Konfliktdialog.
> [!NOTE]
> Das Schema einer Datenbank – Eigenschaften und Ansichten – lässt sich nur mit Verbindung ändern.
### Offline in der App für iPhone und iPad
Die App für iPhone und iPad hält die Offline-Kopie selbst – für jede Instanz, auch eine selbst gehostete. (iOS erlaubt Apps keinen Service Worker für frei gewählte Adressen; in Safari und in der Android-App arbeitet Flowplan offline wie im Browser.)
- **Einschalten** wie überall unter **Einstellungen → Offline & Geräte** – je Profil der App. Dort steht zusätzlich „In der Flowplan-App gespeichert“; Stand, Größe, Version, **Jetzt aktualisieren**, **Auch Eintragsinhalte und Dateien speichern** und **Offline-Kopien entfernen** funktionieren wie im Browser.
- **Ohne Verbindung** – beim Start oder wenn die Instanz nicht erreichbar ist – öffnet die App die gespeicherte Kopie: dieselbe Seite, auf der du warst, mit dem Hinweis „Offline – du siehst den zuletzt gespeicherten Stand“. Seiten, Datenbanken, Einträge, Kalender, Dashboards und der Editor laufen aus der Kopie. Den Bildschirm „Keine Verbindung“ zeigt die App nur noch, wenn es für das Profil keine Kopie gibt.
- **Offline ändern:** Text in Dokumenten und Änderungen an Einträgen werden wie im Browser auf dem Gerät gesammelt und abgeglichen, sobald die Instanz wieder antwortet. Danach wechselt die App von selbst zur aktuellen Seite – erst, wenn du gerade nicht tippst.
- **Aktuell halten:** wie im Browser, solange die App offen ist, und zusätzlich jedes Mal, wenn sie in den Vordergrund kommt; nur Geändertes wird geladen.
- **Speicherort:** im Container der App, verschlüsselt bis zum ersten Entsperren nach einem Neustart und nicht in Backups. Die Kopie gehört zum Profil: **Abmelden** in Flowplan und **Abmelden und Profil entfernen** in den Einstellungen der App löschen sie; ein anderes Profil sieht sie nie.
- **Grenzen:** Dateien über 25 MB, der PDF-Viewer und die Texterkennung (OCR) brauchen in der App eine Verbindung; pro Profil höchstens 2 GB, und die App lässt immer 300 MB frei. Die Kopie braucht einen Flowplan-Server mit dieser Offline-Unterstützung (ab 0.7.0); mit älteren Servern zeigt die App ohne Verbindung ihren Bildschirm „Keine Verbindung“ wie bisher.
## Als App installieren
::: tabs
== Browser am Computer
- **Chrome, Edge**: Installieren-Symbol in der Adressleiste.
- **Safari auf dem Mac**: **Ablage → Zum Dock hinzufügen**.
== iPhone und iPad
Teilen → **Zum Home-Bildschirm**. Nur so sind dort Push-Nachrichten möglich.
== Android
Menü → **App installieren**.
:::
Die installierte App öffnet in einem eigenen Fenster ohne Browserleisten.
### Teilen an Flowplan
Ist Flowplan auf Android (Chrome) als App installiert, erscheint es im **Teilen**-Menü anderer Apps. Geteilte Texte und Links landen in einer Vorschau; **Als Seite speichern** legt daraus eine Seite im gewählten Bereich an. Ohne Anmeldung geht es erst zur Anmeldung und danach zurück zur Vorschau. iOS bietet Web-Apps dieses Menü nicht an.
Die Vorschau fragt, ob gespeichert wird **als Seite**, **als Eintrag** in einer Datenbank oder – bei Links – **als Lesezeichen**. Als Eintrag kommen Titel, Text und Link (bzw. der Artikeltext) in den Eintrag; der Link landet in der ersten URL-Eigenschaft der Datenbank, sonst im Text, und die Standardvorlage der Datenbank wird übernommen. Gibt es eine Standard-Datenbank zum Erfassen (siehe unten), ist **als Eintrag** mit ihr vorgewählt. **Artikeltext übernehmen** lädt die Webseite auf dem Server und übernimmt ihren Haupttext ohne Navigation, Werbung und Skripte (nur öffentliche Adressen).
### Web-Clipper im Browser
Unter **Einstellungen → Web-Clipper** liegt der Knopf **In Flowplan speichern**. In die Lesezeichenleiste gezogen, öffnet er auf jeder Webseite ein kleines Fenster mit Titel, Adresse und dem markierten Text – dieselbe Vorschau wie beim Teilen. Nach dem Speichern schließt sich das Fenster.
### Erfassen in eine Datenbank
Für einen Eingang („Inbox“), etwa nach PARA: **Schnell erfassen** auf der Startseite, ++⌘ ⌥ N++, `> erfassen` in der Schnellsuche oder – bei der installierten App – ein langer Druck auf das App-Symbol → **Erfassen** öffnen ein kleines Fenster mit Titel und Text. Gespeichert wird als Eintrag in der gewählten Datenbank; ohne Verbindung wartet er auf dem Gerät und wird angelegt, sobald die Verbindung zurück ist.
**Text verbessern** (mit dem KI-Symbol) unter den Feldern lässt den [Schreibassistenten](/ai-writing#schreibassistent) Rechtschreibung und Grammatik von Titel und Text verbessern. Das Ergebnis erscheint als Vorschau: **Übernehmen** setzt es in die Felder, **Original behalten** lässt alles, wie es war – gespeichert wird erst mit **Erfassen**. Kürzel wie `#tag`, `@Person`, `!hoch` oder „morgen“ und Links soll die KI unverändert lassen; hat sie eines davon verändert oder entfernt, nennt die Vorschau es, bevor du übernimmst. Den Knopf gibt es nur mit Verbindung und wenn der Schreibassistent für dich und die gewählte Datenbank erlaubt ist; er läuft wie im Editor über den Server oder [auf dem Gerät](/ai#ki-auf-dem-geraet-apple). Das Erfassen-Fenster der Desktop-App bekommt denselben Knopf mit der nächsten Version (siehe [Schnell erfassen (Desktop)](/desktop-capture#ki-vorschlag-optional)).
**Als Standard zum Erfassen verwenden** (im Fenster) oder **Einstellungen → Web-Clipper → Erfassen** legt die Datenbank fest, die Teilen, Web-Clipper und Schnell erfassen vorwählen – je Person und Arbeitsbereich. Die Standardvorlage der Datenbank wird übernommen, so landen neue Einträge zum Beispiel direkt in der Ansicht „Eingang“.
### Lesezeichen
Lesezeichen landen in der Datenbank **Lesezeichen** des gewählten Bereichs; sie entsteht beim ersten Mal von selbst, mit Link, Website, Ordner, Notiz, Datum und „Gelesen“ sowie den Ansichten Alle, Karten und Ungelesen. Der mitgenommene Artikeltext steht im Eintrag. **Lesezeichen-Datei wählen** importiert die HTML-Datei, die Chrome, Edge, Firefox und Safari beim Exportieren der Lesezeichen erzeugen – samt Ordnern und Datum; Links, die schon da sind, werden übersprungen.
## Hell und dunkel
Flowplan folgt von sich aus dem Hell- oder Dunkelmodus deines Geräts – auch wenn er sich ändert, während Flowplan offen ist (etwa abends automatisch). Unter **Einstellungen → Darstellung & Sprache → Erscheinungsbild** wählst du stattdessen fest **Hell** oder **Dunkel**; **Automatisch** folgt wieder dem Gerät. Die Wahl gilt pro Gerät. Anmeldung, öffentliche Seiten und Formulare, die Webseite und diese Dokumentation folgen ebenfalls dem Gerät, die Apps auch mit ihren eigenen Bildschirmen und Widgets.
**Animationen** legt fest, wie viel sich in Flowplan bewegt. *Normal*: Menüs und Dialoge blenden kurz ein und wachsen dabei leicht aus ihrem Ausgangspunkt, Seitenleisten und Blätter gleiten vom Rand herein; beim Öffnen einer Seite blendet nur der Inhaltsbereich kurz über, der Titel steht sofort an seinem Platz. *Reduziert*: nur kurzes Einblenden, nichts gleitet oder wächst. *Aus*: nichts bewegt sich. Aufklappen, Ziehen und Ablegen und Seitenleisten funktionieren in jeder Stufe gleich. Ist auf deinem Gerät „Bewegung reduzieren“ eingeschaltet, bleiben Animationen immer aus. Die Einstellung gilt für dein Konto auf allen Geräten, auch in der Desktop-App und auf dem Handy.
Unter **Editor** zeigt **Griffe immer anzeigen** den Griff `⋮⋮` wieder neben jedem Block statt nur am Block unter dem Mauszeiger und am Block mit dem Cursor (siehe [Blöcke bearbeiten](/blocks)), und **Zeilennummern standardmäßig anzeigen** schaltet die Zeilennummern für alle Codeblöcke ohne eigene Einstellung ein – beides nur auf diesem Gerät, wie das Erscheinungsbild. **Formatierungsleiste** blendet die feste Leiste über dem Text aus oder ein; ausgeblendet trägt das Textmenü alle Formatierungen (siehe [Text formatieren](/formatting#text-formatieren)). **Seiten in voller Breite anzeigen** lässt alle Seiten und als Seite geöffneten Einträge die ganze Breite des Fensters nutzen, als hätte jede [Volle Breite](/pages-and-spaces#seitenaktionen). Das betrifft nur deine Ansicht: Die Einstellung **Volle Breite** der einzelnen Seite (Menü `…`) bleibt unverändert und gilt weiter für alle anderen. Solange sie an ist, zeigt das Menü `…` **Volle Breite** als eingeschaltet mit dem Hinweis „Deine Einstellung“. Diese beiden Einstellungen gelten für dein Konto auf allen Geräten.
Unter Seiten und Einträgen zeigt Flowplan **Verwandte Seiten**, **Verlinkt von** bzw. **Verknüpft von** und **Nicht verlinkte Erwähnungen**. Wer sie nicht braucht, schaltet **Einstellungen → Darstellung & Sprache → Verwandte Seiten und Rückverweise anzeigen** aus – auch das nur auf diesem Gerät. Dann erscheinen die Bereiche weder unter Seiten noch im Eintrag.
**Einstellungen → Darstellung & Sprache → Seitensymbol** legt fest, wo das Symbol einer Seite steht: **Über dem Titel** (Standard) zeigt es groß über dem Titel, **Neben dem Titel** klein links neben dem Titel in seiner ersten Zeile – wie in einem klassischen Dokument und mit weniger Platz über dem Text. Das gilt für Dokumente, Datenbanken, Whiteboards, Journal-Tage und alle anderen Seiten; ein Cover bleibt darüber. Die Wahl gilt für dein Konto auf allen Geräten und ändert nur deine Ansicht: Titel und Symbol der Seite bleiben, wie sie sind, andere sehen weiter ihre eigene Einstellung und veröffentlichte Seiten zeigen das Symbol über dem Titel.
**Einstellungen → Darstellung & Sprache → Neuigkeiten nach Updates** legt fest, ob nach einem Update von Flowplan einmal **Neu in Flowplan** erscheint: **Alle anzeigen** (Standard) zeigt die Hinweise aller übersprungenen Versionen, **Nur Breaking Changes** erscheint nur, wenn eine davon Änderungen enthält, auf die du dich einstellen musst, und zeigt nur diese, **Nie** zeigt den Dialog nicht. Die Wahl gilt für dein Konto auf allen Geräten, auch in den Apps für iPhone, iPad und Android. Unabhängig davon öffnet **Was ist neu** die Hinweise der letzten Versionen jederzeit: im Kontomenü ⋯ unten in der Seitenleiste (auf dem Telefon unter **Mehr**), mit ++⌘/Strg K++ → „Was ist neu“, unter **Einstellungen → Darstellung & Sprache** und unter **Über Flowplan**. Veröffentlichte Seiten zeigen den Dialog nie.
Nach dem Neuladen öffnet Flowplan den Arbeitsbereich, der zuletzt auf diesem Gerät offen war. Dafür merkt sich der Browser im Cookie `flowplan-workspace` nur die Kennung des Arbeitsbereichs; eine Einladung oder ein Link auf eine Seite in einem anderen Arbeitsbereich gehen vor. Die Breite der Seitenleiste sowie Breite und Anheften der Leiste **KI fragen** merkt sich das Cookie `flowplan-layout` – ein funktionales Cookie mit nur drei Zahlen, gültig für ein Jahr.
## Workflows auf dem Telefon
Auf dem Telefon zeigt eine [Workflow-Seite](/workflows#telefon-und-tablet) Status, den Ein/Aus-Schalter, den Ablauf als Liste, die Läufe und die Freigaben; bearbeitet wird auf Tablet oder Computer. Eine Freigabe-Benachrichtigung öffnet die Seite direkt beim Reiter **Freigaben**. Workflow-Seiten sind nicht offline verfügbar.
---
# Desktop-App für macOS, Windows und Linux
Eine schlanke Desktop-App umschließt deine Flowplan-Instanz. Beim ersten Start fragt sie nach der Adresse und schlägt `https://app.flowplan.org` vor – für die eigene Instanz einfach deren Adresse eintragen (z. B. `https://flowplan.example.com`). Weitere Instanzen legst du als [Profile](#mehrere-instanzen-profile) an.
- Alle Daten bleiben auf dem Server.
- Die App merkt sich Fenstergröße und -position, bietet deutsche Menüs und öffnet externe Links im Standardbrowser. Rechtsklick-Menü mit Rechtschreibvorschlägen, [Schnell erfassen von überall](/desktop-capture), Symbol in Menüleiste oder Infobereich, Seiten in eigenen Fenstern und mehr: siehe [Mehr aus der Desktop-App](#mehr-aus-der-desktop-app).
- Die Offline-Nutzung funktioniert auch in der Desktop-App: **Einstellungen → Offline & Geräte** in der App einschalten – die App hat eigene Offline-Kopien, getrennt von Browser oder installierter Web-App. Ohne Verbindung öffnet sie dann die gespeicherte Kopie; ihre eigene Offline-Seite (**Erneut versuchen**, **Profile**) erscheint nur, wenn auf dem Gerät keine Kopie liegt.
- **Mitteilungen:** Die App zeigt neue Benachrichtigungen aus dem Posteingang als Mitteilungen des Systems und die Zahl der ungelesenen am App-Symbol – auch bei minimiertem oder ausgeblendetem Fenster. Mehr unter [Mitteilungen in der Desktop-App](#mitteilungen-in-der-desktop-app).
- Sie akzeptiert nur echte Flowplan-Instanzen – eine Adresse, hinter der etwas anderes läuft oder die auf eine andere Seite weiterleitet, wird abgelehnt.
- **Handoff (Mac):** Die Seite im Fenster erscheint auf deinem iPad und iPhone (gleicher Apple Account, Handoff an) und öffnet sich dort in der Flowplan-App – ohne App im Browser. Eine Seite, die in der iPad- oder iPhone-App offen ist, erscheint im Dock des Mac und öffnet sich in der Desktop-App, im Profil ihrer Instanz. Siehe [iPad: Fenster, Tastatur und Handoff](/mobile-capture#ipad-fenster-tastatur-und-handoff).
- **Mit Passkey anmelden** und **Mit SSO anmelden** öffnen die Anmeldung im Standardbrowser, wo Passkeys (iCloud-Schlüsselbund, Windows Hello, Passwortmanager) zur Verfügung stehen. Nach **In der App anmelden** übernimmt die App die Anmeldung; E-Mail und Passwort gehen direkt in der App (**Mit E-Mail und Passwort** öffnet das Formular). Das braucht Flowplan 0.3.3 oder neuer. Füllt dein Passwort-Manager in der App nichts aus, meldet dich **Im Browser anmelden** unter dem Formular ebenfalls über den Browser an (ab Flowplan 0.8.8).
- **Windows:** Mit einer aktuellen Desktop-App und Flowplan nach 0.8.13 meldet **Mit Passkey anmelden** direkt im App-Fenster mit Windows Hello an (Gesicht, Fingerabdruck, PIN oder Sicherheitsschlüssel). Klappt das nicht oder brichst du ab, führt **Im Browser anmelden** darunter über den Browser wie bisher. SSO läuft weiter über den Browser, ebenso Passkeys unter macOS und Linux.
Die Apps für macOS, Windows und Linux gibt es unter [flowplan.org/download](https://flowplan.org/download) – die Seite erkennt dein System. Updates installieren sich von selbst (macOS, Windows-Installer, Linux-AppImage). Die Mac-App ist signiert und notarisiert; wer noch 1.0.5 oder älter hat, lädt einmal die aktuelle Version herunter, danach aktualisiert sie sich selbst. Windows zeigt SmartScreen. Mehr unter [Betrieb und Fehlersuche](/operations#desktop-apps).
> [!NOTE]
> Die Umgebungsvariable `FLOWPLAN_UPDATE_URL` gibt es zweimal: Auf dem Rechner mit der Desktop-App nennt sie eine andere Quelle für App-Updates (siehe [Updates](/operations#updates)); auf dem Server nennt die gleichnamige Variable den Spiegel für den Release-Check der Instanz (siehe [Konfiguration](/configuration#betrieb)). Beide meinen verschiedene Dinge und gehören an verschiedene Orte.
## Mehrere Instanzen (Profile)
Arbeitest du mit mehr als einer Flowplan-Instanz, etwa **Arbeit – flowplan.firma.de** und **Privat – notizen.example**, speichert die Desktop-App jede als eigenes Profil:
- **Hinzufügen:** Menü **Profile → Profil hinzufügen …**, Adresse eintragen und optional einen Namen (ohne Namen zeigt die App die Adresse). Die Adresse wird geprüft wie beim ersten Start.
- **Wechseln:** im Menü **Profile** (macOS: im Menü *Flowplan*, Windows und Linux: im Menü *Datei*), mit **Nächstes Profil** (++⌘ ⇧ P++ bzw. ++Strg Umschalt P++), auf dem Mac über das Dock-Symbol und unter Windows über die Sprungliste in der Taskleiste.
- **Umbenennen und entfernen:** **Profile → Profile verwalten …** (auch von der Offline-Seite aus). Entfernen fragt nach, meldet das Profil ab und löscht, was es auf diesem Computer gespeichert hat. Deine Daten bleiben auf dem Server.
Jedes Profil hat seine eigene Anmeldung, seine eigene Offline-Kopie und eigene Cookies – auch zwei Profile auf derselben Instanz, etwa für zwei Konten. Im Fenster öffnet sich nur die Instanz des aktiven Profils; Links auf eine andere Instanz gehen in den Browser. Bei mehr als einem Profil steht der Profilname im Fenstertitel.
Wer bisher eine Adresse eingerichtet hatte, findet sie nach dem Update als erstes Profil wieder – angemeldet und mit der bisherigen Offline-Kopie.
## Mitteilungen in der Desktop-App
Browser bekommen Benachrichtigungen per Web-Push – das gibt es in der Desktop-App nicht. Sie fragt deshalb selbst bei deiner Instanz nach, etwa einmal pro Minute, solange sie läuft:
- **Was erscheint:** jede neue ungelesene Benachrichtigung einmal, mit der Zeile aus dem Posteingang als Titel und dem Eintrag darunter (bei mehreren Profilen auch der Profilname). Es gelten deine **Benachrichtigungsarten** unter **Einstellungen → Benachrichtigungen**: Mitteilungen gibt es nur für Arten, bei denen **Push** eingeschaltet ist. Kommen mehr als drei auf einmal, fasst die App sie zu einer Mitteilung zusammen, die den Posteingang öffnet.
- **Klick:** holt das Fenster nach vorn, wechselt bei Bedarf ins richtige Profil und öffnet die Seite.
- **Zahl am Symbol:** die ungelesenen Benachrichtigungen – im Dock (macOS), im Starter (Linux, wenn der Desktop Zahlen anzeigt) und als roter Punkt an der Taskleisten-Schaltfläche (Windows).
- **Einstellungen:** im Menü **Mitteilungen** (macOS: im Menü *Flowplan*, Windows und Linux: im Menü *Datei*): **Mitteilungen anzeigen**, **Nicht stören** für eine Stunde oder bis morgen früh und **Alle Profile** (sonst nur das aktive Profil). In der App zeigt **Einstellungen → Benachrichtigungen** statt Web-Push denselben Schalter.
Für das Fenster im Vordergrund erscheinen keine Mitteilungen – dort siehst du den Posteingang ohnehin. Was beim ersten Start schon da war, zeigt die App nicht noch einmal, auch nicht nach einem Neustart.
Auf dem Mac läuft die App nach dem Schließen des Fensters im Dock weiter und meldet sich weiter. Unter Windows und Linux beendet das Schließen des Fensters die App; Mitteilungen kommen, solange sie läuft (minimiert reicht) – oder mit dem [Symbol im Infobereich](#mehr-aus-der-desktop-app) auch ohne Fenster.
Das braucht einen Flowplan-Server ab 0.7.0 und die Desktop-App 1.0.7 oder neuer. Die App fragt nur die eigene Instanz des Profils, mit dessen Anmeldung; auf dem Server wird dafür nichts hinterlegt.
## Selbstsignierte Zertifikate
Die Desktop-App verbindet sich wie Chrome mit deinem Server: Sie vertraut allen Zertifikaten, denen dein System vertraut. Nutzt dein Server eine eigene Zertifizierungsstelle (CA), installiere sie einmal in der Zertifikatsverwaltung deines Systems – dann funktioniert alles ohne Rückfrage:
- **macOS:** Doppelklicke die CA-Datei (`.crt`/`.pem`), füge sie in der Schlüsselbundverwaltung zum Schlüsselbund „System“ hinzu, öffne sie dort und stelle unter „Vertrauen“ „Immer vertrauen“ ein.
- **Windows:** Doppelklicke die CA-Datei → „Zertifikat installieren“ → „Aktueller Benutzer“ → „Alle Zertifikate in folgendem Speicher speichern“ → „Vertrauenswürdige Stammzertifizierungsstellen“.
- **Linux:** `certutil -d sql:$HOME/.pki/nssdb -A -t "C,," -n "Meine CA" -i ca.crt` (Paket `libnss3-tools` bzw. `nss-tools`), danach Flowplan neu starten.
Vertraut dein System dem Zertifikat nicht – zum Beispiel einem selbstsignierten –, zeigt dir die App beim Hinzufügen des Servers das Zertifikat: Server, ausgestellt für, ausgestellt von, Gültigkeit und SHA-256-Fingerabdruck. Vergleiche den Fingerabdruck mit dem auf deinem Server (`openssl x509 -in cert.pem -noout -fingerprint -sha256`) und wähle **Diesem Zertifikat vertrauen**. Flowplan vertraut dann genau diesem Zertifikat für genau diesen Server in diesem Profil. Abgelaufene oder widerrufene Zertifikate werden nie akzeptiert.
Zeigt der Server später ein anderes Zertifikat, lädt die App nichts und warnt dich mit dem alten und dem neuen Fingerabdruck. Vertraue dem neuen nur, wenn du weißt, dass das Zertifikat erneuert wurde. Unter **Profile verwalten …** siehst du, welchem Zertifikat ein Profil vertraut, und entfernst es mit **Zertifikat nicht mehr vertrauen** (Flowplan startet dafür neu). Ab Version 1.3.9.
## Mehr aus der Desktop-App
Seit der Desktop-App 1.1.0 kommt rund um das Fenster einiges dazu. Die Schalter dafür stehen unter **Einstellungen …** (macOS: im Menü *Flowplan*, Windows und Linux: im Menü *Datei*).
- **Rechtsklick und Rechtschreibung:** Ein Rechtsklick in Feldern, auf Links und Bildern zeigt ein Menü des Systems – Vorschläge für ein falsch geschriebenes Wort, **Zum Wörterbuch hinzufügen**, Ausschneiden, Kopieren, Einsetzen, **Als reinen Text einsetzen**, Link im Browser oder in neuem Fenster öffnen, Bild kopieren oder sichern, auf dem Mac **Nachschlagen**. Im Editor bleibt das Textmenü von Flowplan; dort stehen die Vorschläge der App oben in diesem Menü (braucht einen Flowplan-Server ab 0.7.0). Die Sprachen der Prüfung – Deutsch, Englisch, Französisch – wählst du unter **Rechtschreibung** im Rechtsklick-Menü, im Menü *Bearbeiten* oder in den Einstellungen. Die Prüfung umfasst nur Deutsch, Englisch und Französisch; für Chinesisch hat Chromium, auf dem die Desktop-App aufbaut, kein Wörterbuch.
- **Schnell erfassen von überall:** ++Strg Umschalt Leertaste++ (Mac: ++⇧ ⌘ Leertaste++) öffnet über jeder App ein kleines Fenster – in den Eingang, eine Datenbank, den heutigen Journal-Eintrag oder an eine Seite, mit Kürzeln wie `morgen 15 Uhr #kunde @anna !hoch`, Links aus der Zwischenablage, Dateien, Bildschirmausschnitten und Sprachnotizen, **Rückgängig** und **Zuletzt erfasst**, Schnellaktionen mit eigenen Tastenkürzeln und einem optionalen KI-Vorschlag. Ohne Verbindung wartet die Erfassung verschlüsselt in einer Warteschlange und wird später gesendet, ohne doppelt anzukommen. Alles dazu: [Schnell erfassen (Desktop)](/desktop-capture).
- **Symbol in der Menüleiste (Mac) bzw. im Infobereich (Windows, Linux):** **Schnell erfassen**, die heute fälligen und überfälligen Aufgaben aus **Meine Aufgaben**, die ungelesenen Benachrichtigungen, Flowplan öffnen, die Profile und Beenden. Auf dem Mac standardmäßig an, unter Windows und Linux in den Einstellungen einzuschalten; dann läuft die App nach dem Schließen des Fensters im Infobereich weiter.
- **Seiten aus Links öffnen:** Links der Form `flowplan://open?instance=…&page=…` öffnen die Seite in der App, im Profil ihrer Instanz. Im Browser auf dem Computer steht dafür in den **Seitenaktionen** (**…** oben rechts) **In Desktop-App öffnen**. Für eine Instanz ohne Profil fragt die App erst, ob sie sie hinzufügen soll.
- **Seiten in eigenen Fenstern:** **Seite in neuem Fenster öffnen** (++⌘ ⇧ N++ bzw. ++Strg Umschalt N++), ein Klick mit Umschalt oder der mittleren Maustaste auf einen Link, oder **In neuem Fenster öffnen** im Menü einer Seite. Die App merkt sich diese Fenster mit Größe und Platz und öffnet sie beim nächsten Start wieder.
- **Zurück und vorwärts:** Menü *Navigation* → **Zurück** / **Vorwärts** (++⌘ [++ / ++⌘ ]++, Windows und Linux: ++Alt ←++ / ++Alt →++), die Seitentasten der Maus und auf dem Mac das Streichen mit drei Fingern gehen dieselben Schritte wie die [Pfeile oben links](/first-steps#zurueck-und-vorwaerts); die Menüpunkte sind ausgegraut, wenn es in der Richtung nichts gibt. Für das Streichen unter **Systemeinstellungen → Trackpad → Weitere Gesten → Zwischen Seiten streichen** die Einstellung **Mit zwei oder drei Fingern streichen** wählen.
- **Dateien hineinziehen:** PDFs, Bilder, Markdown- und Textdateien auf das Dock-Symbol ziehen, mit **Öffnen mit → Flowplan** öffnen oder ins Fenster ziehen, wo Flowplan sie nicht selbst annimmt. Die App fragt, wohin: **In den Eingang** (ein Eintrag je Datei) oder **Als neue Seiten** (Markdown wird eine echte Seite). Bilder und PDFs bis 50 MB, Text bis 5 MB, höchstens 10 Dateien auf einmal.
- **Beim Anmelden öffnen:** in den Einstellungen, auf Wunsch **Ohne Fenster starten**.
- **Drucken und PDF:** **Drucken …** zeigt eine Vorschau und druckt über den Dialog des Systems, **Als PDF sichern …** speichert die Seite als PDF – beides ohne Seitenleiste und Werkzeuge, wie beim Drucken im Browser.
- **Updates ohne Unterbrechung:** Ein neues Update lädt im Hintergrund; ein kleiner Hinweis unten im Fenster zeigt Fortschritt, Größe und Geschwindigkeit, der Fortschritt erscheint auch am App-Symbol. Ist es fertig, bietet der Hinweis (und das Menü) **Neu starten**; sonst wird es beim Beenden installiert. Kein Dialog unterbricht das Tippen. **Was ist neu?** im Hinweis klappt die Versionshinweise aller Versionen zwischen der installierten und der neuen auf, Breaking Changes hervorgehoben (ab Desktop-App 1.3.8). Die Hinweise kommen mit dem Update aus den GitHub-Releases, die die App ohnehin abfragt – keine zusätzliche Anfrage. Ob und was der Knopf zeigt, stellst du in den **Einstellungen** der App unter **Updates → Neuigkeiten nach Updates** ein: **Alle anzeigen**, **Nur Breaking Changes** oder **Nie**. Neuigkeiten von Flowplan selbst zeigt die Instanz nach ihrem Update ([Neuigkeiten nach Updates](/offline-and-apps#hell-und-dunkel)).
---
# Apps für iPhone, iPad und Android
Die Apps für iPhone, iPad und Android: installieren und aktualisieren, mit der eigenen Instanz verbinden, mehrere Instanzen als Profile.

::: tabs
== iPhone und iPad
**Die App für iPhone und iPad gibt es im App Store:** [Flowplan im App Store](https://apps.apple.com/app/id6825801344) – den Link auf dem iPhone oder iPad öffnen und die App laden oder im App Store nach „Flowplan“ suchen. Neue Versionen kommen wie bei jeder App über den App Store.
== Android
**Die Android-App gibt es direkt von uns, ohne Play Store:** [flowplan.org/download/android.apk](https://flowplan.org/download/android.apk) bzw. auf [flowplan.org/download](https://flowplan.org/download). Siehe [Android-App installieren und aktualisieren](#android-app-installieren-und-aktualisieren).
:::
## Android-App installieren und aktualisieren
::: steps
1. Auf dem Android-Gerät [flowplan.org/download](https://flowplan.org/download) öffnen und **App herunterladen** tippen.
2. Die heruntergeladene Datei öffnen (Mitteilung des Browsers oder *Downloads*).
3. Beim ersten Mal fragt Android, ob der Browser Apps installieren darf: **Einstellungen** → **Aus dieser Quelle zulassen**, dann zurück und **Installieren**.
4. Warnt Google Play Protect vor einer unbekannten App: **Weitere Details** → **Trotzdem installieren**. Die App ist mit unserem Schlüssel signiert, nur eben nicht über Google Play verteilt.
:::
**Updates:** Einmal am Tag schaut die App nach, ob es eine neue Version gibt, und fragt dann: **Herunterladen** lädt sie im Browser, die Datei öffnen und **Aktualisieren** installiert sie über die alte – Anmeldung, Profile und Einstellungen bleiben. **Später** fragt für diese Version erst nach einer Woche wieder. Neue Funktionen von Flowplan selbst kommen ohnehin über den Server, dafür braucht es kein App-Update.
Die Android-App lässt sich auch weiterhin weglassen: Flowplan lässt sich auf Android wie oben beschrieben als Web-App installieren.
**Voraussetzungen:** iPhone und iPad mit iOS/iPadOS 16.4 oder neuer (das Teilen-Fenster und die einstellbaren Widgets ab iOS 17), Android 8.0 oder neuer.
Wie die Desktop-App zeigen die mobilen Apps deine Flowplan-Instanz; alle Daten bleiben auf dem Server, neue Funktionen kommen ohne App-Update. Dazu kommt, was nur eine App kann:
- **Mitteilungen:** Erwähnungen, Kommentare, Aufgaben und Erinnerungen kommen als Mitteilung, die Zahl der ungelesenen steht am App-Symbol. Die App fragt nach dem ersten Anmelden einmal nach der Erlaubnis; ein Tipp öffnet die betroffene Seite. Welche Arten kommen, regelst du wie im Browser unter **Einstellungen → Benachrichtigungen**; dort prüft **Testbenachrichtigung senden**, ob Mitteilungen auf allen deinen Geräten ankommen, und sagt sonst, woran es liegt ([mehr](/notifications#testbenachrichtigung)). [Knöpfe](/mobile-widgets#knoepfe-an-mitteilungen) haken eine Aufgabe ab, schieben sie auf morgen, beantworten einen Kommentar oder markieren ihn als gelesen – ohne die App zu öffnen.
- **[Widgets](/mobile-widgets#widgets)** für den Home-Bildschirm (auf dem iPhone auch für den Sperrbildschirm), jedes mit eigenen Einstellungen – Aufgaben zum Abhaken, Termine, Zähler, Zeiterfassung und mehr; dazu [Widgets für Administratoren](/mobile-widgets#widgets-fuer-administratoren).
- **[Live-Aktivitäten](/mobile-widgets#live-aktivitaeten-und-laufende-mitteilungen):** Zeiterfassung, Fokus, Besprechung, Import/Export und Sprachnotiz auf dem Sperrbildschirm und in der Dynamic Island bzw. als laufende Mitteilung.
- **[Erfassen, Siri, Kontrollzentrum](/mobile-capture#erfassen-siri-kontrollzentrum):** Notizen, Aufgaben, Sprachnotizen und Fotos aus Widgets, Siri, Kontrollzentrum, App-Symbol und Android-Kacheln; Siri fragen, was fällig ist, eine Seite öffnen oder suchen.
- **[Fokus-Filter](/mobile-widgets#fokus-filter)** (iPhone, iPad): ein Profil oder Arbeitsbereich je Fokus, auf Wunsch ohne Mitteilungen der anderen.
- **[Teilen aus anderen Apps](/mobile-capture#teilen-aus-anderen-apps):** Texte, Links, Fotos und PDFs aus jeder App direkt in den Eingang, eine Datenbank oder auf eine Seite.
- **[Scanner und Spotlight](/mobile-capture#dokumente-scannen-und-spotlight-iphone-und-ipad)** (iPhone, iPad): Dokumente als durchsuchbare PDFs scannen, deine Seiten und Aufgaben in der Suche des Telefons.
- **[Sprachnotizen](/mobile-capture#sprachnotizen-in-seiten)** in Seiten nimmt die App auf; auf iPhone und iPad werden sie auf dem Gerät selbst zu Text.
- **[KI auf dem Gerät](/mobile-capture#ki-auf-dem-geraet-und-schreibtools-iphone-und-ipad)** (iPhone, iPad, optional): Schreibassistent und Zusammenfassungen mit Apple Intelligence, ohne dass der Text das Gerät verlässt; Apples Schreibtools im Editor.
- **[Kalender in Apple Kalender](/mobile-capture#kalender-in-apple-kalender)** mit einem Konfigurationsprofil, statt CalDAV-Zugangsdaten abzutippen.
- **Angemeldet bleiben und App-Sperre:** Die App bleibt angemeldet, solange du sie oder ihre Widgets nutzt (Standard: 90 Tage ohne Nutzung, siehe [Angemeldet bleiben](/sessions)). Auf Wunsch entsperrt sich Flowplan nur mit Face ID, Touch ID, Fingerabdruck oder dem Gerätecode – auf iPhone, iPad und Android, nach mehr als einer Minute im Hintergrund erneut.
- **Zurück:** Wischen vom linken Rand (iOS) bzw. die Zurück-Geste oder -Taste (Android) schließt zuerst, was gerade offen ist (Menü, Dialog, Seitenleiste), und geht dann eine Ebene nach oben: von einem Abschnitt der Einstellungen zur Übersicht, von einem Eintrag zur Datenbank, von einer Seite zur vorherigen Seite.
- **Exporte und Downloads** gehen in das Teilen-Menü des Systems (z. B. „In Dateien sichern“).
- **Ohne Verbindung:** Die App öffnet die Offline-Kopie des Profils, auch auf iPhone und iPad – siehe [Offline in der App für iPhone und iPad](/offline-and-apps#offline-in-der-app-fuer-iphone-und-ipad).
- **iPad und Tablets:** alle Ausrichtungen, Split View, Slide Over und Stage Manager, mehrere Fenster, Hardware-Tastatur mit den Tastenkürzeln, die erscheinen, wenn du ⌘ hältst, Trackpad und Handoff zum Mac – siehe [iPad: Fenster, Tastatur und Handoff](/mobile-capture#ipad-fenster-tastatur-und-handoff). Mit dem **Apple Pencil** schreibst du in [Notizbücher](/notebooks) und Zeichenblöcke, zeichnest auf Whiteboards und schreibst auf PDFs (siehe [PDFs anmerken](/media-and-files#pdfs-anmerken)) mit Druckstärke, während Finger die Fläche bewegen und eine aufliegende Hand keine Spuren hinterlässt; Doppeltippen und Drücken wechseln das Werkzeug, Scribble schreibt in jedes Textfeld (siehe [Whiteboards](/whiteboards#stift-und-formerkennung)). Die App erkennt deine Handschrift auf dem Gerät: Die Suche findet sie, und **In Text umwandeln** macht aus ausgewählten Strichen Text (siehe [Handschrift erkennen](/notebooks#handschrift-erkennen-iphone-und-ipad)).
- **iPhone Duo:** Auf- und Zuklappen während der Arbeit – die Seite bleibt, wie sie ist (kein Neuladen, dieselbe Stelle, der Text, den du gerade tippst) und ordnet sich neu: Telefon-Layout mit der unteren Leiste auf dem zugeklappten Display und auf dem aufgeklappten im Hochformat, die Seitenleiste auf dem aufgeklappten Display im Querformat. Inhalte bleiben frei von Statusleiste und Kamera am Rand des zugeklappten Displays. Auf dem aufgeklappten Display gibt es **mehrere Fenster** wie auf dem iPad (siehe [unten](/mobile-capture#ipad-fenster-tastatur-und-handoff)); das zugeklappte hat eines. Den ganzen Bildschirm nutzt auf dem iPhone Duo eine App, die für iOS 27.1 oder neuer gebaut ist.
Außerdem:
- Beim ersten Start fragen sie nach der Adresse und schlagen `https://app.flowplan.org` vor. Sie akzeptieren nur echte Flowplan-Instanzen, die nicht auf eine andere Seite weiterleiten. Weitere Instanzen speicherst du als [Profile](#profile-in-den-mobilen-apps). **Abmelden und Profil entfernen** in den **App-Einstellungen** (über **Einstellungen → Benachrichtigungen → App-Einstellungen öffnen**) meldet die App bei der Instanz des aktiven Profils ab und entfernt sie dort.
- **Verwaltete Geräte (MDM/EMM):** Über die verwaltete App-Konfiguration (iOS Managed App Configuration bzw. Android App Restrictions) gibt der Schlüssel `server` die Adresse der eigenen Instanz vor; die App schlägt sie beim ersten Start vor.
- **Mit Passkey anmelden** und **Mit SSO anmelden** öffnen das Anmeldefenster des Systems (iOS) bzw. einen Browser-Tab (Android); nach **In der App anmelden** übernimmt die App die Anmeldung. E-Mail und Passwort gehen direkt in der App: **Mit E-Mail und Passwort** öffnet das Formular.
- **Passwort-Manager füllt nichts aus?** Dann tippe zuerst auf **Mit E-Mail und Passwort** und unter dem Formular (oder beim Zwei-Faktor-Code) auf **Im Browser anmelden**. Die Anmeldung öffnet sich im selben Fenster wie bei Passkey und SSO; dort erkennt dein Passwort-Manager die Adresse deiner Instanz und füllt Passwort und Code aus. In der App selbst ordnet iOS gespeicherte Passwörter nur Adressen zu, die fest in der App eingetragen sind – bei selbst gehosteten Instanzen geht das nicht. Das braucht Flowplan 0.8.8 oder neuer; die App muss dafür nicht aktualisiert werden.
- Die Anmeldung über den Browser sowie Mitteilungen und Widgets (die App-Schnittstelle) brauchen Flowplan 0.4.0 oder neuer.
- Links zu anderen Seiten öffnen im Browser; ohne Verbindung zeigt die App eine eigene Seite und verbindet sich von selbst wieder.
- Flowplan erscheint im **Teilen**-Menü anderer Apps – auf iPhone und iPad als **Flowplan**, auf Android als **In Flowplan speichern**, siehe [Teilen aus anderen Apps](/mobile-capture#teilen-aus-anderen-apps).
## Instanz im eigenen Netz ohne HTTPS
Beim ersten Start (oder unter **Profil hinzufügen**) gibst du die Adresse deiner Instanz ein. Ohne `http://` davor nimmt die App immer HTTPS an. Eine reine `http://`-Adresse nimmt sie nur an, wenn die Instanz **im lokalen Netz** läuft – öffentliche Domains und Adressen brauchen immer HTTPS.
| Funktioniert mit `http://` | iPhone und iPad | Android |
| --- | --- | --- |
| Private IP-Adressen: `192.168.x.x`, `10.x.x.x`, `172.16.x.x`–`172.31.x.x` | ja | ja |
| Tailscale- und CGNAT-Adressen `100.64.x.x`–`100.127.x.x`, Link-local `169.254.x.x` | ja | ja |
| IPv6 im lokalen Netz (`fd…`, `fe80…`), `localhost` | ja | ja |
| Namen ohne Punkt, z. B. `http://nas:3000` | ja | ja |
| `.local`-Namen, z. B. `http://flowplan.local:3000` | ja | ja |
| `.lan`, `.home.arpa`, `.internal`, z. B. `http://flowplan.lan` | **nein** | ja |
| Öffentliche Domains und IPs, auch Tailscale-Namen `*.ts.net` | nein (nur HTTPS) | nein (nur HTTPS) |
Auf iPhone und iPad erlaubt iOS unverschlüsselte Verbindungen nur zu IP-Adressen, Namen ohne Punkt und `.local`-Namen. Für eine Instanz unter `flowplan.lan` gibst du dort die IP-Adresse ein (`http://192.168.1.20:3000`) – oder richtest HTTPS ein. Die App sagt das beim Verbinden, statt eine leere Seite zu zeigen. Beim ersten Verbinden fragt iOS außerdem, ob Flowplan auf Geräte im lokalen Netz zugreifen darf: **Erlauben** tippen.
Sobald eine `http://`-Adresse im Feld steht, warnt die App vor dem Verbinden:
- **Passwörter und alle Inhalte gehen unverschlüsselt durchs Netz.** Das ist nur in einem Netz in Ordnung, dem du vertraust.
- **Ohne HTTPS fehlen** Passkeys, verschlüsselte Bereiche, Sprachnotizen in Seiten und auf Android die Offline-Kopie (auf iPhone und iPad hält die App die Offline-Kopie selbst, sie funktioniert auch so).
- **Mitteilungen** kommen von einer Instanz, die nur im lokalen Netz erreichbar ist, meist nicht an: Das [Push-Relay](/configuration-ai-push#push-relay-und-ende-zu-ende-verschluesselung) muss die Instanz aus dem Internet erreichen.
Für den echten Betrieb richte HTTPS ein, siehe [Ohne HTTPS](/installation#ohne-https). Mit einem Tailscale-Namen (`*.ts.net`) bekommst du HTTPS auch ohne öffentliche Domain.
## Eigene Zertifikate
Nutzt deine Instanz ein selbstsigniertes Zertifikat oder eine eigene Zertifizierungsstelle (CA), installierst du das CA-Zertifikat am besten auf dem Gerät:
- **iPhone/iPad:** Lade es (z. B. in Safari oder per AirDrop), installiere es unter **Einstellungen → Allgemein → VPN und Geräteverwaltung** und schalte unter **Einstellungen → Allgemein → Info → Zertifikatsvertrauenseinstellungen** das volle Vertrauen ein. iOS verlangt den Servernamen im Feld „Alternativer Name“ (subjectAltName) und höchstens 825 Tage Gültigkeit.
- **Android:** **Einstellungen → Sicherheit → Verschlüsselung und Anmeldedaten → Zertifikat installieren → CA-Zertifikat**. Die App vertraut Zertifizierungsstellen, die du selbst installiert hast.
Ohne installiertes Zertifikat zeigt die App beim Verbinden Aussteller, Gültigkeit und SHA-256-Fingerabdruck. Auf **Android** kannst du dann **Diesem Zertifikat vertrauen** wählen: Die App vertraut genau diesem Zertifikat, nur für diese Instanz. Ändert es sich, lädt die App nichts und fragt erneut; entfernen kannst du es in den App-Einstellungen. Die Offline-Kopie funktioniert auf Android nur mit installierter Zertifizierungsstelle, nicht mit einem so bestätigten Zertifikat. Auf **iPhone und iPad** erklärt die App, wie du das Zertifikat installierst. Ab App-Version 1.0.12.
## Profile in den mobilen Apps
Auch die Apps für iPhone, iPad und Android merken sich mehrere Instanzen als Profile:
- **Wechseln:** in den **App-Einstellungen** unter **Profile** auf ein Profil tippen, oder langes Drücken auf das App-Symbol → **Profil wechseln** (auf dem iPhone, solange du abgemeldet bist). Dieselbe Liste erscheint auf der Offline-Seite.
- **Vor der Anmeldung:** unten auf der Anmelde- und Registrierungsseite (auch bei „Passwort vergessen“, beim Zwei-Faktor-Code und beim neuen Passwort) steht **Anderer Server? Profil wechseln**. *Abbrechen* (auf Android auch die Zurück-Taste) bringt dich zurück auf die Seite.
- **Falsche Adresse:** Ein Profil, das noch nie angemeldet war, kannst du im Profil-Bildschirm mit **Adresse ändern** korrigieren oder mit **Profil entfernen** löschen. Antwortet unter der Adresse kein Flowplan, zeigt die App ihre eigene Seite mit **Erneut versuchen** und **Profil wechseln**.
- **Hinzufügen:** **App-Einstellungen → Profil hinzufügen**, Adresse und optional einen Namen eintragen. Ist für die Adresse schon ein Profil gespeichert, wechselt die App einfach dorthin – je Instanz gibt es ein Profil.
- **Umbenennen:** in den App-Einstellungen bei einem Profil auf **Umbenennen** tippen.
- **Entfernen:** **Abmelden und Profil entfernen** gilt für das aktive Profil; danach wird das nächste Profil aktiv.
Mitteilungen, Widgets, Live-Aktivitäten, die Zahl am App-Symbol und die laufende Zeiterfassung gehören immer zum **aktiven** Profil. Beim Wechsel meldet die App das Gerät bei der bisherigen Instanz für Mitteilungen ab; die Anmeldung dort bleibt erhalten, sodass du beim Zurückwechseln weiterhin angemeldet bist. Was die App für ein Profil speichert (das Geräte-Token für Widgets, die letzte Übersicht), liegt getrennt im Schlüsselbund bzw. Keystore und geht nie an eine andere Instanz. Eine bisher eingerichtete Adresse wird nach dem Update zum ersten Profil.
## Was die App auf der Instanz hinterlegt
Nach dem Anmelden meldet sich die App bei der Instanz an: Der Eintrag gehört zu dieser Anmeldung; meldest du dich auf dem Gerät neu an, geht er auf die neue Sitzung über. Er verschwindet mit dem Abmelden, dem Entfernen unter *Angemeldete Geräte* oder dem Löschen des Kontos. Mit dem Geräte-Token lesen Widgets, Live-Aktivitäten und Kurzbefehle im Hintergrund nur, was du auch in Flowplan sehen darfst – in kleinen Antworten von höchstens zehn Einträgen je Widget – und führen ihre Knöpfe aus (Aufgabe oder Gewohnheit abhaken, Timer starten/stoppen, als gelesen markieren, Erfasstes sichern) – ebenso die Knöpfe an Mitteilungen, die nur die Mitteilung nennen: worauf sie wirken, weiß die Instanz. Auch das Teilen-Fenster und der Scanner sichern damit, und Spotlight liest damit Seitentitel und offene Aufgaben. Für Mitteilungen hinterlegt die App ein Token des [Push-Relays](/configuration-ai-push#push-relay-und-ende-zu-ende-verschluesselung) (die Instanz speichert es nur verschlüsselt) und einen öffentlichen Schlüssel; den privaten behält sie im Schlüsselbund bzw. Keystore. Mitteilungen kommen damit Ende-zu-Ende-verschlüsselt: Relay, Apple und Google sehen ihren Inhalt nicht, erst die App entschlüsselt ihn. Ältere App-Versionen bekommen sie über den Push-Dienst von Expo – dort steht wie bei Web-Push nur, dass etwas Neues im Posteingang liegt. Betreiber können Mitteilungen abschalten oder ihren Text auch über Expo mitschicken, siehe [Konfiguration](/configuration-ai-push#push-benachrichtigungen). Ein [Fokus-Filter](/mobile-widgets#fokus-filter), der Mitteilungen ausblendet, hinterlegt dort eine Regel für dieses Gerät: welcher Arbeitsbereich ihm noch Mitteilungen schicken darf, höchstens für einen Tag.
---
# Widgets und Mitteilungen in den Apps
Auf iPhone, iPad und Android: Widgets für den Startbildschirm, Knöpfe an Mitteilungen, Live-Aktivitäten und Fokus-Filter.
## Widgets
Jedes Widget zeigt **eine Sache** und hat **eigene Einstellungen**. Ein neu hinzugefügtes Widget funktioniert sofort mit sinnvollen Vorgaben; kleine Größen zeigen weniger. Ein Tipp öffnet die Aufgabe bzw. Seite in der App.
**Einstellungen ändern:**
::: tabs
== iPhone und iPad
Widget lange drücken → *Widget bearbeiten* (iOS 17 oder neuer).
== Android
Widget lange drücken → *Einstellungen* (beim Hinzufügen kann man den Schritt überspringen).
:::
Die Auswahllisten (Datenbanken, Ansichten, Eigenschaften, Kalender, Formulare …) kommen direkt von deiner Flowplan-Instanz.
| Widget | Was es zeigt | Einstellungen |
| --- | --- | --- |
| **Schnellerfassung** | Knöpfe für Notiz, Aufgabe, Sprachnotiz, Foto | Ziel (Standard: dein Erfassungs-Eingang), welche Knöpfe |
| **Aufgaben** | Offene Aufgaben – **direkt im Widget abhaken** | Meine Aufgaben, Einträge einer Datenbank (mit Ansicht) oder To-dos einer Seite; alle offenen, heute fällig oder überfällig; Anzahl |
| **Heute** | Termine und fällige Aufgaben | Kalender, Zeitraum (heute, 3 Tage, Woche), fällige Aufgaben ein/aus |
| **Seite und Favoriten** | Deine Favoriten oder eine Seite / Datenbank-Ansicht | Seite, Ansicht, bis zu zwei Eigenschaften |
| **Datenbank-Zähler** | Eine Zahl (Anzahl, Summe, Durchschnitt) mit Verlauf der letzten 14 Tage | Datenbank, Ansicht, Wert, Gruppe, Verlauf |
| **Tagebuch und Gewohnheiten** | Ob heute geschrieben ist, Serie; Gewohnheiten **zum Abhaken** | Journal, Gewohnheiten-Datenbank |
| **Zeit diese Woche** | Stunden der Woche und von heute; **Timer starten/stoppen** | welcher Timer „Starten“ startet |
| **Erwähnungen** | Wer dich erwähnt oder dir eine Aufgabe gegeben hat; **als gelesen markieren** | Erwähnungen und/oder neue Aufgaben, nur ungelesene |
| **Formular-Eingänge** | Neue Antworten eines Formulars | Formular |
| **Flowplan** | Fällige Aufgaben im Überblick | mit oder ohne Posteingang, laufende Zeiterfassung ein/aus |
| **Flowplan Posteingang** | Zahl der ungelesenen Mitteilungen | – |
| **Flowplan Instanz, Live, Speicher** | Nur für [Administratoren](#widgets-fuer-administratoren): Zustand, eine Live-Zahl, Speicher | was es zeigt bzw. welche Kennzahl |
„Meine Aufgaben“ zeigt neben den Aufgaben aus Dokumenten auch offene Einträge aus Datenbanken, in denen du in einer Personen-Eigenschaft (z. B. „Verantwortlich“) stehst – mit Datenbank und Fälligkeit (dem [Fälligkeitsdatum der Datenbank](/projects-and-tickets#wann-ist-ein-eintrag-faellig)), direkt abhakbar, wenn du den Eintrag bearbeiten darfst. Nach denselben Regeln erscheinen diese Einträge auch im Widget **Flowplan** (samt der Zahl am App-Symbol und den Erinnerungen ohne Push), mit ihrem Fälligkeitsdatum im Widget **Heute** und damit bei Siri „Was steht heute in Flowplan an“ sowie in Spotlight auf iPhone und iPad. Private Einträge anderer, Datenbanken hinter einer Journal-PIN, Ende-zu-Ende-verschlüsselte Bereiche und für dich ausgeblendete Eigenschaften bleiben überall draußen; einen Eintrag, den eine gewählte Kalender-Ansicht im Widget **Heute** schon zeigt, gibt es dort nur einmal.
Gut zu wissen:
- **Verlauf des Zählers:** Flowplan merkt sich den Wert jeden Tag. Tage, bevor das Widget eingerichtet war, werden geschätzt und heller/gestrichelt gezeichnet.
- **Datenschutz:** Widgets zeigen nur, was du auch in Flowplan sehen darfst. Seiten hinter einer Journal-PIN oder mit Ende-zu-Ende-Verschlüsselung zeigen im Widget nur ihren Zustand, nie Inhalte.
- **Abgemeldet?** Endet deine Sitzung (z. B. bei kurzer SSO-Sitzung), zeigen alle Widgets *Flowplan öffnen und anmelden*. Ihre Einstellungen bleiben; nach dem Anmelden füllen sie sich sofort wieder.
- **Profile:** Widgets gehören zum aktiven Profil. Beim Wechsel verschwinden die Inhalte des vorigen Profils; auf Android behält jedes Widget seine Einstellungen pro Profil.
- **Farben auf Android:** Ab Android 12 übernehmen alle Widgets die Systemfarben (Material You, aus dem Hintergrundbild oder dem gewählten Design), hell und dunkel. Rot, Gelb und Grün behalten ihre Bedeutung. Nach einem neuen Hintergrundbild passen sich die Widgets mit der nächsten Aktualisierung an.
- **Heutige Aufgaben abhaken:** Widget **Aufgaben** hinzufügen und in seinen Einstellungen *Heute fällig* wählen.
- **Aktualisierung:** wenn du in Flowplan etwas änderst, wenn die App in den Vordergrund kommt, im Hintergrund etwa alle 30 Minuten (iOS entscheidet selbst, wie oft).
- **Voraussetzung:** Die einstellbaren Widgets, Live-Aktivitäten außer der Zeiterfassung sowie Siri und Kurzbefehle brauchen einen Flowplan-Server ab 0.7.0. *Flowplan*, *Flowplan Posteingang* und die laufende Zeiterfassung gehen ab 0.4.0.
## Widgets für Administratoren
Wer die Instanz administriert (Mitglied der Admin-Gruppe, `OIDC_ADMIN_GROUP`, Standard `flowplan-admins`), bekommt in der App für iPhone, iPad und Android drei weitere Widgets. Jedes zeigt eine Sache groß; welche, wählst du auf dem iPhone in den Einstellungen des Widgets.
| Widget | Größen (iOS) | Einstellung (Standard zuerst) | Tippen öffnet |
| --- | --- | --- | --- |
| **Flowplan Instanz** | klein, mittel, Sperrbildschirm | *Zeigen:* Zustand (*Alles in Ordnung*, Hinweise oder Störungen mit der wichtigsten), letzte Sicherung oder Version mit verfügbarem Update | Administration (bei Hinweisen/Störungen die Überwachung) |
| **Flowplan Live** | klein, mittel, groß, Sperrbildschirm | *Kennzahl:* gerade aktiv, Anfragen/Min., Fehlerrate (1 Std.) oder Anmeldungen heute; ab mittel die übrigen Zahlen klein und die Anfragen der letzten 24 Stunden als Kurve | Administration → Überwachung |
| **Flowplan Speicher** | klein, mittel, Sperrbildschirm (Ring) | *Kennzahl:* Festplatte belegt, Datenbank und Dateien oder vollster Arbeitsbereich (Kontingent) | Administration → Speicher |
- Alle anderen sehen in diesen Widgets *Nur für Administratoren*; ohne Anmeldung steht dort *Flowplan öffnen und anmelden*.
- Die Daten kommen wie bei den anderen Widgets mit dem Geräte-Token der App (`GET /api/mobile/admin-summary`). Die Instanz prüft bei jedem Abruf, ob die Person der Sitzung, an die das Gerät gebunden ist, gerade Administrator ist – wer aus der Admin-Gruppe fällt, sich abmeldet oder das Gerät unter *Angemeldete Geräte* entfernt, bekommt nichts mehr. API-Tokens bekommen diese Daten nie.
- Übertragen werden nur Zahlen und Zustände – keine Namen, E-Mail-Adressen oder Namen von Arbeitsbereichen.
- Ist die Statistik ausgeschaltet (`FLOWPLAN_METRICS=off` oder in der Administration unter *Überwachung → Statistik*), zeigt *Flowplan Live* „Statistik ausgeschaltet“; Zustand und Speicher bleiben.
- Ältere Instanzen ohne diesen Endpunkt zeigen *Nur für Administratoren*.
## Knöpfe an Mitteilungen
Eine Mitteilung lange drücken (oder herunterziehen) zeigt ihre Knöpfe. Sie erledigen ihre Arbeit im Hintergrund; die App öffnet sich nicht.
| Mitteilung | Knöpfe |
| --- | --- |
| **Eine Aufgabe ist fällig** (eine dir gegebene Aufgabe ist heute fällig, eine [Datums-Erinnerung](/databases#datums-erinnerungen) eines Eintrags) | **Erledigt** hakt sie ab; **Morgen** setzt ihr Datum auf morgen – die Uhrzeit bleibt, ein späteres Datum rückt einen Tag weiter |
| **Kommentar, Antwort, Erwähnung in einem Kommentar** | **Antworten** – die Antwort direkt in der Mitteilung tippen; sie landet in deinem Namen im Thread (bzw. als Kommentar an der Seite). **Als gelesen markieren** |
| **Alles andere** | **Als gelesen markieren** |
- Jeder Knopf markiert die Mitteilung auch als gelesen; die Zahl am App-Symbol folgt.
- **Erledigt**, **Morgen** und **Antworten** brauchen ein entsperrtes Telefon; **Als gelesen markieren** geht auf dem Sperrbildschirm.
- **Erledigt** bei einem Eintrag nutzt den „Erledigt“-Zustand der Datenbank (eine Status-Option wie *Erledigt* oder ein Kontrollkästchen *Erledigt*); Datenbanken ohne bieten nur **Als gelesen markieren**. Hat sich die Aufgabe inzwischen geändert, wird nichts abgehakt – eine Mitteilung sagt das, ein Tipp öffnet die Seite.
- Es gelten deine Rechte wie im Browser, und die Änderung erscheint in Aktivität, Versionen und Automationen wie jede andere.
- **Erledigt**, **Morgen** und **Antworten** erscheinen nur, wenn die Mitteilung ihren Text mitbringt – ohne ihn wüsste niemand, auf welche Aufgabe ein Knopf wirkt. Über das [Push-Relay](/configuration-ai-push#push-relay-und-ende-zu-ende-verschluesselung) ist das der Standard, weil der Text Ende-zu-Ende-verschlüsselt ist (Betreiber können es mit `MOBILE_PUSH_CONTENT=off` abschalten); ältere App-Versionen über Expo bekommen ihn nur mit `MOBILE_PUSH_CONTENT=on`. Sonst gibt es nur **Als gelesen markieren**.
**Erinnerungen ohne Push:** Schickt deine Instanz keine Mitteilungen an die App (von den Betreibern abgeschaltet oder eine Testversion ohne Push), erinnert die App selbst an deine Aufgaben – um 9:00 Uhr am Tag, an dem eine Aufgabe fällig ist, sofern Mitteilungen für Flowplan erlaubt sind. Sie nimmt die Aufgaben, die die App aus ihrer Übersicht kennt (die nächsten acht).
## Live-Aktivitäten und laufende Mitteilungen
Auf dem iPhone erscheinen laufende Vorgänge auf dem Sperrbildschirm und in der Dynamic Island, auf Android als Mitteilung (auf Android 16 als Live-Update):
| Vorgang | Zeigt | Knopf |
| --- | --- | --- |
| **Zeiterfassung** | laufende Uhr | – |
| **Fokus** | z. B. 25 Minuten Fokus, dann die Pause | *Beenden* |
| **Laufende Besprechung** | Restzeit | *Notizen öffnen* – legt die Besprechungsnotiz im Journal an, falls es sie noch nicht gibt |
| **Import und Export** | Fortschritt | – |
| **Sprachnotiz** | Aufnahme läuft | *Aufnahme beenden* |
| **Störung der Instanz** | nur für Administratoren, nur solange sie besteht | – |
Besprechungen, Import/Export und Störungen lassen sich in den App-Einstellungen unter *Live-Aktivitäten* ausschalten; Zeiterfassung, Fokus und Sprachnotizen erscheinen immer, solange sie laufen.
Startest oder stoppst du Zeiterfassung oder Fokus anderswo – im Browser, auf einem anderen Gerät – oder geht der Fokus in die Pause über, aktualisiert die Instanz die Live-Aktivität auf dem iPhone per Push über das [Push-Relay](/configuration-ai-push#push-relay-und-ende-zu-ende-verschluesselung), auch wenn die App nicht offen ist. Dieser Push enthält standardmäßig nur Zeiten und die Phase; Titel und Link kennt die Live-Aktivität schon vom Start auf dem Gerät.
## Fokus-Filter
Auf iPhone und iPad kann ein Fokus (Einstellungen → Fokus → z. B. *Arbeiten* → **Filter hinzufügen** → **Flowplan**) festlegen:
- **Profil oder Arbeitsbereich:** ein Profil („Alle Arbeitsbereiche“) oder einen Arbeitsbereich eines Profils. Beginnt der Fokus, wechselt die App in dieses Profil und öffnet den Arbeitsbereich; endet er, geht sie zurück zum Profil von vorher – außer du hast inzwischen selbst gewechselt.
- **Mitteilungen anderer Arbeitsbereiche ausblenden:** Solange der Fokus läuft, schickt deine Instanz diesem Gerät keine Push-Mitteilungen aus anderen Arbeitsbereichen – oder gar keine, wenn der Fokus zu einem anderen Profil gehört. Im Posteingang kommen sie trotzdem an. Wird der Fokus nie beendet, endet die Regel nach einem Tag von selbst.
Arbeitsbereiche erscheinen in der Liste, sobald die App in diesem Profil angemeldet war; fehlt einer, öffne die App einmal in dem Profil.
---
# Erfassen, Teilen und Scannen in den Apps
Notizen, Aufgaben und Sprachnotizen schnell erfassen, aus anderen Apps teilen, Dokumente scannen – und was die Apps auf iPhone und iPad zusätzlich können.
## Erfassen, Siri, Kontrollzentrum
Alle Wege führen in das Erfassen der App: Notiz oder Aufgabe tippen, Sprachnotiz aufnehmen (läuft auch bei gesperrtem Bildschirm weiter; wird transkribiert, wenn deine Instanz das kann) oder Foto aufnehmen/auswählen.
| Weg | Was es bietet |
| --- | --- |
| **Widget Schnellerfassung** | Notiz, Aufgabe, Sprachnotiz, Foto – in das im Widget gewählte Ziel |
| **Siri und Kurzbefehle** (Deutsch, Englisch, Französisch) | „Notiz zu Flowplan hinzufügen“ (in deinen Erfassungs-Eingang), „Aufgabe zu Flowplan hinzufügen“, „Was steht heute in Flowplan an“, „Was ist heute in Flowplan fällig“, „Seite in Flowplan öffnen“, „In Flowplan suchen“, „Timer in Flowplan starten“, „Timer in Flowplan stoppen“, „Sprachnotiz in Flowplan aufnehmen“, „Fokus in Flowplan starten“ |
| **Kontrollzentrum und Aktionstaste** (iOS 18) | Neue Notiz, Schnellerfassung, Heutige Aufgaben (zeigt, wie viele fällig sind), Sprachnotiz, Fokus starten, Timer (Schalter) |
| **App-Symbol lange drücken** (iPhone, iPad) | Posteingang, Meine Aufgaben, Suchen, Neue Notiz, Profil wechseln. Das iPhone zeigt davon die ersten vier, abgemeldet *Profil wechseln*. |
| **App-Symbol lange drücken** (Android) | *Neue Notiz* und *Schnell erfassen* (immer da, auch vor dem ersten Anmelden), dann die **zuletzt geöffneten Seiten**, Posteingang, Meine Aufgaben, Suchen, Sprachnotiz und Profil wechseln. Die meisten Launcher zeigen vier davon; jede Verknüpfung lässt sich auf den Home-Bildschirm ziehen. Verknüpfungen zu Seiten eines anderen Profils sind ausgegraut, bis das Profil wieder aktiv ist. |
| **Android-Schnelleinstellungen** | Kacheln „Neue Notiz“ und „Schnell erfassen“ (auch vom Sperrbildschirm). Ab Android 13 fügt **App-Einstellungen → Widgets → „Schnell erfassen“ zu den Schnelleinstellungen hinzufügen** die Kachel mit einem Tipp hinzu; sonst über das Stift-Symbol der Schnelleinstellungen. |
**Schnell erfassen** (Kachel und Verknüpfung auf Android) öffnet ein kompaktes Fenster: Ziel wählen – den **Eingang** (deine Standard-Datenbank zum Erfassen, siehe [Erfassen in eine Datenbank](/offline-and-apps#erfassen-in-eine-datenbank)) oder eine andere Seite oder Datenbank, mit Suche –, Titel und Text tippen, auf Wunsch Fotos aufnehmen oder auswählen, **Sichern**.
Was Siri erledigt, ohne die App zu öffnen:
- **Aufgabe hinzufügen:** Siri fragt nach der Aufgabe; in der Kurzbefehle-App legst du zusätzlich ein **Fälligkeitsdatum** und die **Liste oder Datenbank** fest (sonst dein Erfassungs-Ziel). In einer Datenbank landet das Datum in ihrer ersten Datums-Eigenschaft.
- **Was ist heute fällig:** Siri sagt, wie viele Aufgaben heute fällig und überfällig sind, nennt die ersten drei und zeigt die Liste.
- **In Flowplan suchen:** durchsucht Seiten, Einträge und Kommentare in allen deinen Arbeitsbereichen und zeigt die besten Treffer; in einem Kurzbefehl lassen sie sich weitergeben (etwa an *Seite öffnen*). Die Aktion *In der App suchen* öffnet stattdessen die Suche von Flowplan mit dem Text.
- **Seite öffnen:** Siri fragt nach der Seite – nenne einen Teil des Titels – und öffnet sie in der App. In Kurzbefehlen wählst du die Seite aus einer Liste.
Siri, Kurzbefehle und Steuerelemente nutzen das **aktive** Profil. Seiten aus Ende-zu-Ende-verschlüsselten Bereichen erscheinen nicht (auch nicht ihre Titel). Aufgaben hinzufügen, Fälliges, Seiten öffnen, Suchen, die neuen Steuerelemente und Fokus-Filter brauchen einen Flowplan-Server ab 0.7.0.
## Teilen aus anderen Apps
In jeder App, die etwas teilen kann (Browser, Fotos bzw. Galerie, Dateien, Mail, Scanner …), öffnet **Teilen → Flowplan** (iPhone, iPad) bzw. **Teilen → In Flowplan speichern** (Android) ein kleines Fenster mit Titel, Text, Link und Dateien.
- **Was geht:** Text, Links, Fotos und PDFs – auch mehrere Dateien auf einmal (höchstens 10). Andere Dateitypen werden nicht übernommen.
- **Wohin:** vorgewählt ist der **Eingang**, deine Standard-Datenbank zum Erfassen (im Browser mit **Als Standard zum Erfassen verwenden** festgelegt, siehe [Erfassen in eine Datenbank](/offline-and-apps#erfassen-in-eine-datenbank)). **Sichern in** (iPhone, iPad) bzw. **Ändern** (Android) zeigt alle Seiten und Datenbanken, in die du schreiben darfst, mit Suche.
- **Was entsteht:** In einer Datenbank (auch dem Eingang) ein **Eintrag** – der Link in der ersten URL-Eigenschaft (falls vorhanden), die Dateien in der ersten Datei-Eigenschaft und im Eintrag selbst. Auf einer Seite eine **Unterseite** mit Text, Link, Fotos und PDFs.
**Auf iPhone und iPad** bleibst du in der App, aus der du teilst. Flowplan merkt sich die letzte Wahl des Ziels je Profil. Das Fenster nutzt die Anmeldung der App: Öffne Flowplan einmal und melde dich an, sonst weist es darauf hin. Fotos im HEIC-Format werden zu JPEG.
**Auf Android** nennt das Fenster unter *Nicht übernommen*, was es nicht übernehmen kann (andere Dateitypen, mehr als 10 Dateien). PDFs bekommen im Eintrag eine Vorschau der ersten Seite. Den Titel kannst du ändern; leer bleibt er die erste Zeile des Texts, die Adresse des Links oder der erste Dateiname. Nach **Sichern** führt **Zurück zur App** in die App, aus der du geteilt hast; **Öffnen** zeigt das Ergebnis in Flowplan. Noch nicht angemeldet? Texte und Links gehen dann wie im Browser zur Vorschau der Instanz und nach dem Anmelden weiter.
Das Teilen-Fenster auf iPhone und iPad sowie Fotos und PDFs auf Android brauchen einen Flowplan-Server ab 0.7.0. Bis 0.6.0 nimmt Android nur Text und Links an, über die Vorschau der Instanz.
## Dokumente scannen und Spotlight (iPhone und iPad)
**Dokumente scannen.** Tippe in einer Seite `/` und wähle **Dokument scannen** (nur in der App für iPhone und iPad). Die Kamera findet die Ränder und richtet jede Seite gerade aus; nimm so viele Seiten auf, wie du möchtest. Flowplan erkennt den Text auf dem Gerät (Deutsch, Englisch, Französisch) und fügt ein PDF am Ende der Seite ein – oder des Eintrags, in dem du gerade bist. Das PDF trägt den Text unsichtbar mit, sodass du ihn in jedem PDF-Programm markieren und durchsuchen kannst, und **die Suche in Flowplan findet den Scan sofort über seinen Text**. Der Link `flowplan://scan` (z. B. in einem Kurzbefehl) öffnet den Scanner mit der Wahl zwischen Eingang, Seite und Datenbank. Nach dem Sichern bleibt das PDF nicht auf dem Telefon.
**Spotlight.** Die App legt die Titel deiner zuletzt geänderten Seiten (bis zu 500, mit Ort und einer Zeile Inhalt) und deine offenen Aufgaben – auch Datenbank-Einträge, die dir zugewiesen sind, die mit Fälligkeit zuerst – in die Suche des Telefons. Ein Tipp auf einen Treffer öffnet ihn in Flowplan. Nichts aus Ende-zu-Ende-verschlüsselten Bereichen, hinter einer Journal-PIN oder aus Journaltagen landet dort; Abmelden oder ein Profilwechsel leert die Suche. Der Index bleibt auf dem Telefon.
Scanner und Spotlight brauchen einen Flowplan-Server ab 0.7.0.
## Sprachnotizen in Seiten
In der App nimmt **Sprachnotiz** (`/sprachnotiz`) in einem Dokument mit dem Mikrofon des Telefons auf – bis zu 30 Minuten, auch bei gesperrtem Bildschirm. **Einfügen** legt die Aufnahme als Audio in die Seite:
- **Als Text einfügen** (iPhone und iPad): Das Gesprochene wird auf dem Gerät mit der Spracherkennung von Apple zu Text – die Aufnahme verlässt dafür das Telefon nicht. Der Text folgt unter dem Audio als **Transkript** mit Zeitmarken. Die App fragt einmal nach der Erlaubnis für die Spracherkennung. Das geht für die Sprachen, die das Gerät selbst erkennt (nach der Sprache des Geräts; die meisten großen Sprachen, je nach iOS-Version).
- Wo das Gerät es nicht kann (Android, andere Sprachen), macht die Spracherkennung deiner Instanz daraus Text, wenn sie eingerichtet ist ([Sprachnotizen](/media-and-files#sprachnotizen-und-besprechungen)); sonst bleibt das Audio allein.
- **Danach mit KI zusammenfassen** setzt eine Zusammenfassung unter den Text, wenn dir die [KI](/ai-writing#zusammenfassungen) zur Verfügung steht.
Das braucht einen Flowplan-Server ab 0.7.0. Im Browser nimmt `/sprachnotiz` wie bisher auf.
## KI auf dem Gerät und Schreibtools (iPhone und iPad)
**Optional:** Auf einem iPhone oder iPad mit **iOS/iPadOS 26** oder neuer, das Apple Intelligence unterstützt, und mit **eingeschaltetem Apple Intelligence** (Einstellungen → Apple Intelligence & Siri) laufen der Schreibassistent und die Zusammenfassung offener Seiten mit dem Sprachmodell von Apple **auf dem Gerät**. Der Text verlässt das Gerät nicht, auch nicht in verschlüsselten Bereichen; die Instanz braucht dafür keinen KI-Anbieter. Ergebnisse tragen das Kennzeichen **Auf diesem Gerät**. Das braucht einen Flowplan-Server neuer als 0.7.0 (derzeit das Beta-Image).
- **Abschalten:** **Einstellungen → KI → Auf diesem Gerät (Apple) → Aus** – dann fragt Flowplan das Gerät nie. Dort steht auch, ob Apple Intelligence auf diesem Gerät verfügbar, in den Einstellungen ausgeschaltet oder nicht unterstützt ist. Die Administration kann es für die ganze Instanz abschalten.
- **Server-KI bleibt:** Fragen an den Arbeitsbereich, KI in Datenbanken und KI-Aktionen laufen weiter über die Instanz, wenn sie eingerichtet ist; zu lange Texte übernimmt sie ebenfalls.
- **Ältere Geräte und iOS-Versionen** (ab iOS 16.4) nutzen die App wie bisher, nur ohne diesen Weg.
- **Schreibtools:** Apples Schreibtools (Korrekturlesen, Umschreiben, Zusammenfassen) funktionieren direkt im Editor – Text markieren und im Textmenü **Schreibtools** wählen (ab iOS 18 mit Apple Intelligence).
Mehr: [KI auf dem Gerät](/ai#ki-auf-dem-geraet-apple).
## Kalender in Apple Kalender
**Einstellungen → Kalender & Issues → Kalender auf iPhone, iPad und Mac**: Kalenderansichten wählen und **In Apple Kalender einrichten** tippen. Die App öffnet ein Konfigurationsprofil in Safari; den Download bestätigen und es dann unter **Einstellungen → Profil geladen** installieren (auf dem Mac: Systemeinstellungen → Profile). Jede Ansicht wird ein CalDAV-Account in Apple Kalender, in beide Richtungen – siehe [In beide Richtungen synchronisieren](/views#in-beide-richtungen-synchronisieren-caldav). Am Computer zeigt die Seite stattdessen einen QR-Code; ihn mit der Kamera des iPhones scannen. Der Link gilt einmal und zehn Minuten lang.
## iPad: Fenster, Tastatur und Handoff
- **Mehrere Fenster:** Im Menü einer Seite (Rechtsklick oder lange drücken in der Seitenleiste) gibt **In neuem Fenster öffnen** der Seite ein eigenes Fenster – nebeneinander in Split View, in Slide Over oder im Stage Manager. Auf dem iPhone Duo geht das auf dem aufgeklappten Display; auf dem zugeklappten fehlt der Menüpunkt. Links, die einen neuen Tab öffnen würden, tun dasselbe. App-Symbol lange drücken → **Alle Fenster einblenden** listet sie. Das erste Fenster hat die App-Einstellungen, Mitteilungen und Widgets; die anderen zeigen eine Seite und kommen nach einem Neustart mit ihr zurück. Alle Fenster nutzen das aktive Profil und die App-Sperre.
- **Hardware-Tastatur:** Halte ⌘ , und das iPad listet die Tastenkürzel von Flowplan – Suche ++⌘ K++, neue Seite ++⌘ N++, schnell erfassen ++⌘ ⌥ N++, die Übersicht ++⌘ /++ und die anderen mit ⌘ , ⌃ oder ⌥ , auch [deine eigenen](/keyboard-shortcuts#eigene-tastenkuerzel). Ein Kürzel wirkt im Fenster im Vordergrund. Die Kürzel des Editors (Fett, Rückgängig …) wirken wie im Browser.
- **Trackpad und Maus:** Der Zeiger reagiert auf Knöpfe und Links wie in Safari.
- **Handoff:** Die Seite im Vordergrund wird deinem Mac und deinen anderen Geräten angeboten (gleicher Apple Account, Handoff an unter Einstellungen → Allgemein → AirPlay & Kontinuität). Auf dem Mac öffnet sie sich in der [Desktop-App](/desktop-app), ohne sie im Browser. Seiten vom Mac oder einem anderen Gerät öffnen sich in der App im Profil ihrer Instanz; Seiten einer Instanz ohne Profil öffnen sich in Safari. Solange die App-Sperre sperrt, wird nichts angeboten.
---
# Schnell erfassen (Desktop)
Ein Tastenkürzel öffnet über jeder App ein kleines Fenster: Gedanke, Aufgabe, Link, Datei, Bildschirmausschnitt oder Sprachnotiz – in den Eingang, eine Datenbank, den heutigen Journal-Eintrag oder an eine Seite. Auch ohne Verbindung.
Schnell erfassen gehört zur [Desktop-App für macOS, Windows und Linux](/desktop-app). Es speichert mit der Anmeldung des aktiven Profils direkt auf deiner Instanz; nichts geht an Dritte.
## Auf einen Blick
| Taste | Was passiert |
| --- | --- |
| ++Strg Umschalt Leertaste++ (Mac: ++⇧ ⌘ Leertaste++) | öffnet das Fenster über jeder App – auch wenn Flowplan minimiert, ausgeblendet oder (Mac, Symbol im Infobereich) geschlossen ist |
| Enter | speichert |
| ++Umschalt Enter++ | neue Zeile |
| Tab | Ziel wählen: tippen filtert, ++↑ ↓++ wählt, Enter übernimmt |
| ++Alt ↑++ / ↓ | voriges / nächstes Ziel, ohne die Liste zu öffnen |
| ++⌘/Strg Umschalt V++ | Zwischenablage einfügen – ein Link bekommt seinen Titel |
| ++⌘/Strg Umschalt R++ gedrückt halten | Sprachnotiz aufnehmen, loslassen beendet |
| ↓ im leeren Feld | **Zuletzt erfasst** |
| Esc | schließt die offene Liste, sonst das Fenster – der Text bleibt als Entwurf |
Die Knöpfe im Fenster machen dasselbe: **Einfügen**, **Anhängen …**, **Ausschnitt**, **Halten zum Sprechen**, **Vorschlag** und **Als Aufgabe für heute**. Die erste Zeile wird zum Titel, der Rest zum Text.
## Wohin: Ziele
Oben rechts steht, wohin gespeichert wird. Zur Wahl stehen:
| Ziel | Was entsteht |
| --- | --- |
| **Eingang** (Standard) | ein Eintrag in deiner Datenbank zum Erfassen – die unter **Erfassen** als Standard festgelegte (siehe [Erfassen in eine Datenbank](/offline-and-apps#erfassen-in-eine-datenbank)) |
| eine **Datenbank** | ein neuer Eintrag; ihre Standardvorlage gilt, Kürzel füllen ihre Eigenschaften |
| ein **Journal** | angehängt an den **heutigen Eintrag** – fehlt der Tag noch, legt Flowplan ihn an |
| eine **Seite** | unten an die Seite angehängt, als neuer Absatz (oder als Aufgabe) |
Die Liste zeigt nur, wo du schreiben darfst. Zuletzt benutzte Ziele stehen oben; die App merkt sich das je Profil und startet beim nächsten Mal mit dem zuletzt gewählten Ziel.
> [!NOTE]
> **Ende-zu-Ende-verschlüsselte Bereiche fehlen in der Liste.** In sie kann der Server nicht schreiben, und das Erfassen-Fenster hat – anders als das Flowplan-Fenster – keine Schlüssel. Die Liste sagt, wie viele Seiten deshalb fehlen. Für verschlüsselte Bereiche erfasse direkt im Flowplan-Fenster. Journale hinter einer PIN fehlen ebenfalls.
**Als Aufgabe für heute** macht aus der ersten Zeile eine offene Aufgabe – fällig heute oder am Tag aus dem Text, zugewiesen dir oder der Person aus dem Text. Sie erscheint sofort unter **Meine Aufgaben** und im Symbol der App.
## Kürzel im Text
Was du tippst, liest Flowplan beim Tippen mit und zeigt es als **Chips** unter dem Text, etwa für „Angebot schreiben morgen 15 Uhr #kunde @anna !hoch“:
`Fällig: Di., 27. Okt., 15:00` · `Tags: Kunde` · `Zuständig: Anna Schmidt` · `Priorität: Hoch`
Was ein Chip übernimmt, verschwindet aus dem Titel. Ein **×** am Chip lässt den Text so stehen, wie du ihn getippt hast. Kürzel füllen nur Eigenschaften, die das Ziel hat – sonst bleibt der Text, der Chip sagt dann „bleibt Text“.
| Kürzel | Beispiele (Deutsch · Englisch · Französisch) | Wird zu |
| --- | --- | --- |
| Tage | `heute`, `morgen`, `übermorgen` · `today`, `tomorrow`, `day after tomorrow` · `aujourd'hui`, `demain`, `après-demain` | Fälligkeitsdatum |
| Wochentage | `Freitag`, `am Fr.`, `nächsten Montag` · `friday`, `next monday` · `vendredi`, `lundi prochain` | der nächste solche Tag |
| Abstände | `in 3 Tagen`, `nächste Woche` · `in two weeks`, `next week` · `dans une semaine`, `la semaine prochaine` | Tag (nächste Woche: deren Montag) |
| Daten | `24.12.`, `24.12.2026`, `2026-12-24`, `24. Dezember` · `12/24`, `Dec 24th` · `24/12`, `le 5 novembre` | dieser Tag (ohne Jahr: der nächste) |
| Uhrzeit | `15 Uhr`, `um 15:30` · `3pm`, `at 3:30 pm` · `15h`, `à 9h30` | Uhrzeit zum Datum (allein: heute) |
| Schlagwort | `#kunde` | Option einer Mehrfachauswahl (zuerst „Tags“), wenn es sie gibt |
| Person | `@anna` | Personen-Eigenschaft (zuerst „Zuständig“) – Vorname, Name ohne Leerzeichen oder E-Mail-Name, wenn genau eine Person passt |
| Priorität | `!hoch`, `!dringend`, `!niedrig` · `!high`, `!urgent`, `!low` · `!haute`, `!basse` · `!1`–`!4`, `!!!`, `!!` | Option einer Auswahl „Priorität“ (oder mit Prioritäts-Optionen) |
- Fällig wird die erste Datums-Eigenschaft (zuerst eine namens „Fällig“, „Due“, „Échéance“ …). Eine Uhrzeit gilt in der Zeitzone deines Computers, auch wenn der Eintrag erst später aus der Warteschlange gesendet wird.
- `#27` ist eine Nummer, kein Schlagwort; `name@example.org` bleibt eine E-Mail-Adresse; ein Ausrufezeichen am Satzende bleibt eines.
- Ohne Verbindung zeigt das Fenster keine Chips; die Kürzel werden beim Senden ausgewertet – mit dem Tag und der Zeitzone des Erfassens.
- Die Kürzel liest der Server (eine Stelle für alle Apps). Ältere Server ohne diese Funktion nehmen nur Text in den Eingang – das Fenster sagt das.
## Zwischenablage und Links
++⌘/Strg Umschalt V++ oder **Einfügen** setzt den Text der Zwischenablage ein. Ist es ein Link (`https://…`), erscheint er als Link-Chip mit Titel und Anbieter – die **Vorschau holt deine Instanz** (wie die Link-Karten im Editor, mit Schutz vor internen Adressen), nie die App selbst. Gespeichert wird er in die Link-Eigenschaft der Datenbank (sonst in den Text) und als Link-Karte; ist der Text leer, wird der Titel der Seite zum Titel. Ohne Verbindung wird der Link ohne Titel gespeichert.
## Dateien, Bildschirmausschnitt und Sprachnotiz
- **Dateien:** Bilder (PNG, JPEG, GIF, WebP, AVIF, HEIC), PDFs, Markdown- und Textdateien ins Fenster ziehen oder mit **Anhängen …** wählen. Geprüft wird wie beim [Hineinziehen ins Hauptfenster](/desktop-app#mehr-aus-der-desktop-app): Endung **und** Inhalt, Bilder und PDFs bis 50 MB, Text bis 5 MB (die Instanz kann weniger erlauben), höchstens 10 Anhänge. Die Liste unter dem Text zeigt sie, **×** entfernt einen. Bilder und PDFs landen in der Datei-Eigenschaft der Datenbank und im Text; Markdown und Text werden zu Text.
- **Bildschirmausschnitt:** **Ausschnitt** – das Fenster tritt zur Seite, du ziehst einen Bereich auf; er wird als PNG angehängt. Auf dem Mac nimmt das die Bildschirmaufnahme des Systems auf (Leertaste wählt ein Fenster, Esc bricht ab); unter Windows und Linux zeigt Flowplan den Bildschirm unter dem Mauszeiger, du ziehst den Bereich, Enter nimmt den ganzen Bildschirm, Esc bricht ab. Zwischendateien liegen nur kurz im Datenordner der App und werden sofort gelöscht.
- **Sprachnotiz:** **Halten zum Sprechen** gedrückt halten (oder ++⌘/Strg Umschalt R++), loslassen beendet. Hat deine Instanz eine Transkription (Whisper, siehe [Konfiguration](/configuration)), wird die Aufnahme dort zu Text und erscheint im Feld – zum Prüfen vor dem Speichern. Ohne Transkription, ohne Verbindung oder wenn sie scheitert, wird die Aufnahme angehängt; die Instanz versucht es beim Speichern noch einmal.
### Berechtigungen je System
| System | Bildschirmausschnitt | Mikrofon |
| --- | --- | --- |
| **macOS** | **Systemeinstellungen → Datenschutz & Sicherheit → Bildschirm- & Systemaudioaufnahme** → Flowplan einschalten, dann Flowplan neu starten. Fehlt sie, sagt das Fenster es und öffnet die Seite mit **Systemeinstellungen öffnen**. | Beim ersten Mal fragt macOS („Flowplan verwendet das Mikrofon für Sprachnotizen.“). Abgelehnt: **Systemeinstellungen → Datenschutz & Sicherheit → Mikrofon**. |
| **Windows** | keine Freigabe nötig | **Einstellungen → Datenschutz & Sicherheit → Mikrofon** muss Desktop-Apps erlauben |
| **Linux** | X11: keine Freigabe. Wayland: der Desktop fragt (Portal) und bietet oft Bildschirm oder Fenster an – Flowplan nimmt, was er übergibt. | je nach Desktop (PipeWire/PulseAudio) |
Die Kamera nutzt Flowplan nie, und das Erfassen-Fenster darf nur das Mikrofon – und das nur, solange du die Taste hältst.
## Ohne Verbindung: die Warteschlange
Ist die Instanz nicht erreichbar, landet die Erfassung in einer **Warteschlange** – mit Text, Ziel, Kürzeln, Link und Anhängen. Das Fenster sagt „Ohne Verbindung … – in der Warteschlange, wird automatisch gesendet“, oben steht „1 in der Warteschlange“, das Symbol im Infobereich und die Einstellungen zeigen die Zahl ebenfalls.
- **Gesendet wird von selbst:** sobald die Verbindung zurück ist, der Computer aufwacht oder entsperrt wird, sonst mit wachsenden Pausen (5 s, 15 s, 30 s … höchstens alle 15 Minuten). **Jetzt senden** (Fenster, Symbol, Einstellungen) versucht es sofort.
- **Nichts doppelt:** Jede Erfassung hat vom ersten Moment an einen eigenen Schlüssel (`Idempotency-Key`), und jeder Versuch schickt genau dieselbe Anfrage. Geht eine Antwort unterwegs verloren, nachdem die Instanz schon gespeichert hat, bekommt der nächste Versuch die gespeicherte Antwort statt eines zweiten Eintrags.
- **Nichts geht verloren:** Lehnt die Instanz etwas endgültig ab (Ziel gelöscht, Datei zu groß), bleibt es in der Warteschlange und das Fenster zeigt es mit **Kopieren** (zurück ins Feld) und **Verwerfen**. Abgemeldet wartet die Erfassung, bis du wieder angemeldet bist.
- **Verschlüsselt gespeichert:** Warteschlange und „Zuletzt erfasst“ liegen je Profil im Datenordner der App (`capture/`), verschlüsselt mit dem Schlüsselbund des Systems (macOS-Schlüsselbund, Windows DPAPI, unter Linux Secret Service/KWallet). Gibt es unter Linux keinen Schlüsselbund, liegen sie unverschlüsselt, nur für dein Benutzerkonto lesbar – die Einstellungen sagen, was gilt. Beim Entfernen eines Profils werden sie gelöscht.
## Rückgängig und „Zuletzt erfasst“
Nach dem Speichern zeigt das Fenster „✓ Gespeichert in …“ mit **Öffnen** (der Eintrag oder die Seite im Flowplan-Fenster) und **Rückgängig** – zehn Sekunden lang. Danach geht das Fenster, wenn du nichts Neues begonnen hast.
- **Rückgängig** legt einen erfassten Eintrag in den Papierkorb der Datenbank (von dort wiederherstellbar) und entfernt Angehängtes von einer Seite oder aus dem Journal wieder – solange es unverändert am Ende steht. Hat jemand inzwischen weitergeschrieben, bleibt es, und das Fenster sagt das. Eine Erfassung aus der Warteschlange wird einfach nicht gesendet.
- **Zuletzt erfasst:** ↓ im leeren Feld zeigt die letzten 20 Erfassungen des Profils mit Ziel und Uhrzeit, Enter oder **Öffnen** öffnet sie. Dieselbe Liste (die letzten 8) steht im Symbol in Menüleiste oder Infobereich unter **Zuletzt erfasst**; wartende sind mit ⏳ markiert.
## Schnellaktionen
Unter **Einstellungen → Schnellaktionen** legst du weitere Tastenkürzel an, die das Fenster passend vorbereitet öffnen:
| Schnellaktion | Öffnet das Fenster … |
| --- | --- |
| **Aufgabe** | mit **Als Aufgabe für heute** und dem gewählten Ziel |
| **Journal-Eintrag** | mit dem gewählten Journal – angehängt an den heutigen Eintrag |
| **Lesezeichen** | mit dem Link aus der Zwischenablage samt Titel |
| **Besprechungsnotiz** | mit einer gewählten Datenbank und einer ihrer Vorlagen (Standard oder z. B. „Besprechung“), Text beginnt mit „Besprechung: “ |
| **Notiz** | mit einem festen Ziel, auf Wunsch als Aufgabe |
Jede hat Name, Ziel, Tastenkürzel (**Ändern**, **Aus**), **Ausprobieren** und **Entfernen**. Ohne Tastenkürzel ist keine aktiv – nach dem Update ist nur das Haupt-Tastenkürzel an. Ist ein Kürzel schon von einer anderen App belegt, steht das an der Aktion; ein Kürzel gehört immer nur einer Aktion und nie zugleich dem Haupt-Kürzel. Höchstens acht Schnellaktionen.
## KI-Vorschlag (optional)
**Vorschlag** fragt eine KI, wohin der Text gehört: Datenbank, kurzer Titel und Eigenschaften, die der Text eindeutig nennt. Das Ergebnis erscheint als Chips mit **✓** (übernehmen) und **×** (ignorieren) – **nichts wird von selbst übernommen**. Geprüft wird jeder Vorschlag auf dem Server: nur Datenbanken, in die du schreiben darfst, nur vorhandene Optionen, nur echte Personen und Tage.
- **Wo die KI läuft:** über die KI deiner Instanz (Funktion **KI-Aktionen**, siehe [KI](/ai)) – oder auf einem Mac mit macOS 26 und eingeschalteter Apple Intelligence **auf dem Mac selbst** ([KI auf dem Gerät](/ai#ki-auf-dem-geraet-apple)): Dann baut die Instanz nur die Frage, der Mac beantwortet sie, und der Text geht an keine KI des Servers. Was bevorzugt wird, folgt deiner Einstellung zur KI auf dem Gerät.
- **Was die KI sieht:** den Text im Fenster und die Namen der Datenbanken, ihrer Eigenschaften und Optionen – keinen Inhalt. Für die KI gesperrte Datenbanken fehlen.
- **Aus:** Der Knopf fehlt, wenn die Administration oder du KI (oder KI-Aktionen) ausgeschaltet habt.
**Text verbessern** kommt mit der nächsten Version der Desktop-App: Wie beim [Erfassen im Browser](/offline-and-apps#erfassen-in-eine-datenbank) korrigiert die KI Rechtschreibung und Grammatik, du entscheidest in einer Vorschau. Die Kürzel (`#tag`, `@Person`, `!Priorität`, Datumsangaben) und Links bleiben stehen; hat die KI eines davon verändert oder weggelassen, warnt das Fenster, bevor du den Text übernimmst. Nur mit Verbindung und wenn der Schreibassistent für dich erlaubt ist.
## Einrichtung und einmaliger Hinweis
Nach der ersten Anmeldung zeigt die App noch einen Schritt: **So soll Flowplan auf diesem Computer laufen** – **Schnell erfassen aktivieren** (mit dem Kürzel, **Ändern**, **Jetzt ausprobieren**; ein belegtes Kürzel wird gemeldet), **Symbol in der Menüleiste / im Infobereich**, **Beim Anmelden am Computer starten** und **Minimiert / im Hintergrund starten** (nur zusammen mit dem Start beim Anmelden). Die Schalter beginnen mit den Voreinstellungen deines Systems (Symbol: Mac an, Windows und Linux aus), alles lässt sich überspringen und später unter **Einstellungen** ändern – es sind dieselben Einstellungen.
Wer die App schon vorher hatte und noch nie erfasst hat, sieht einmal unten links im Fenster „Neu: Schnell erfassen mit …“ mit **Ausprobieren** und **Einstellungen**. Nach dem Schließen, einem Klick oder der ersten Erfassung kommt der Hinweis nie wieder.
## Datenschutz
- Gespeichert wird nur auf deiner Instanz, mit der Anmeldung des Profils und ihrer Herkunftsprüfung. Link-Vorschau, Transkription und KI laufen über die Instanz (oder auf dem Mac); die App selbst ruft keine fremden Adressen ab.
- Auf dem Computer bleiben nur die Warteschlange und „Zuletzt erfasst“ (verschlüsselt, siehe oben), die zuletzt benutzten Ziele (nur Kennungen) und kurzzeitig Bildschirmausschnitte. Das Fenster hat eine eigene Sitzung ohne Cookies und ohne Speicher.
- Ende-zu-Ende-verschlüsselte Bereiche sind nie Ziel.
## Voraussetzungen
Die Desktop-App nach 1.2.0 und ein Flowplan-Server neuer als 0.7.0. Mit einem älteren Server nimmt das Fenster Text (und **Als Aufgabe für heute**) in den Eingang und sagt, dass Ziele, Kürzel, Links und Anhänge ein Update des Servers brauchen. Sprachnotizen als Text brauchen eine Transkription auf dem Server, der KI-Vorschlag eingeschaltete KI-Aktionen oder Apple Intelligence auf dem Mac.
---
# Browser-Erweiterung
Mit der Browser-Erweiterung speicherst du Webseiten mit einem Klick in Flowplan: den ganzen Artikel, nur die Auswahl, ein Lesezeichen oder einzelne Markierungen. Sie läuft in Chrome, Edge, Brave, Opera und Firefox.
## Einrichten
::: steps
1. Lege in Flowplan unter **Einstellungen → API & KI-Assistenten** (oder **Einstellungen → Web-Clipper → Token anlegen**) ein [persönliches API-Token](/api-and-webhooks) an und wähle als Recht **Nur Browser-Erweiterung**. Ein solches Token kann nichts anderes: Es öffnet weder die API noch MCP und kann nichts lesen außer der Liste deiner Ziele.
2. Installiere die Erweiterung (siehe unten) und klicke auf ihr Symbol.
3. Trage die Adresse deiner Instanz ein, zum Beispiel `https://flowplan.example.com`, und das Token. Der Browser fragt jetzt einmal nach dem Zugriff auf genau diese Adresse – auf andere Seiten greift die Erweiterung nie zu.
:::
**Abmelden** im Fenster der Erweiterung löscht das Token aus dem Browser und gibt den Zugriff auf die Instanz wieder ab. Widerrufen kannst du das Token jederzeit in den Einstellungen.
## Speichern
Klicke auf das Symbol der Erweiterung oder drücke **Alt+Umschalt+F**. Wähle das Ziel – die Erweiterung merkt es sich – und optional Tags:
- **Ganze Seite:** Die Erweiterung sucht den eigentlichen Artikel und lässt Navigation, Werbung, Cookie-Hinweise, Kommentare und Seitenleisten weg. Links und Bilder zeigen weiter auf die Originalseite. Oben auf der neuen Seite steht der Link zur Quelle.
- **Auswahl:** Nur der markierte Teil der Seite, mit Formatierung und Links.
- **Nur Lesezeichen:** Titel, Adresse, Beschreibung und Favicon landen in der Datenbank **Lesezeichen** des Bereichs (siehe [Web-Clipper](/import-export-versions)). Doppelte Links werden abgelehnt.
Je nach Ziel entsteht:
| Ziel | Ganze Seite / Auswahl | Lesezeichen |
| --- | --- | --- |
| Ein Bereich | eine neue Seite im Bereich | ein Eintrag in seiner Lesezeichen-Datenbank |
| Eine Seite | eine neue Unterseite | ein Eintrag in der Lesezeichen-Datenbank ihres Bereichs |
| Eine Datenbank | ein neuer Eintrag mit dem Text als Dokument; der Link kommt in die erste Link-Eigenschaft | wie bei der Seite |
**Tags** landen in einer Eigenschaft namens *Tags* (oder *Schlagwörter*, *Labels*), wenn die Datenbank eine hat; neue Tags werden als Optionen ergänzt. In der Lesezeichen-Datenbank legt die Erweiterung die Eigenschaft *Tags* beim ersten Mal an. Auf Seiten stehen die Tags als `#tag` unter dem Quell-Link.
Der Inhalt wird auf dem Server noch einmal bereinigt: Skripte, Formulare, eingebettete Fremdseiten und Ereignis-Attribute fallen weg, so wie beim Einfügen in den Editor.
## Markierungen
Markiere Text auf einer Webseite und wähle im Kontextmenü **In Flowplan markieren** (oder drücke **Alt+Umschalt+H**). Die Stelle wird als Zitat mit einem Link zur Quelle angehängt:
- Ist das Ziel eine **Seite**, landen alle Markierungen untereinander auf dieser Seite.
- Ist das Ziel ein **Bereich**, legt die erste Markierung einer Webseite eine neue Seite für diese Quelle an; weitere Markierungen derselben Webseite kommen auf dieselbe Seite.
- Ist das Ziel eine **Datenbank**, wird jede Markierung ein Eintrag.
Ein grünes Häkchen am Symbol bestätigt das Speichern, ein rotes Ausrufezeichen meldet einen Fehler (etwa ein abgelaufenes Token).
Die Tastenkürzel änderst du in Chrome unter `chrome://extensions/shortcuts`, in Firefox unter **Add-ons → Zahnrad → Tastenkombinationen für Erweiterungen verwalten**.
## Installieren
Die Erweiterung liegt im Quellcode unter `extensions/browser/` und braucht keinen Build-Schritt.
- **Chrome, Edge, Brave:** `chrome://extensions` öffnen, **Entwicklermodus** einschalten, **Entpackte Erweiterung laden** und den Ordner `extensions/browser` wählen.
- **Firefox:** `about:debugging#/runtime/this-firefox` öffnen und **Temporäres Add-on laden** → `extensions/browser/manifest.json`. Für eine dauerhafte Installation die ZIP-Datei bei addons.mozilla.org signieren lassen.
- **Paket bauen:** `npm run extension:zip` schreibt `extensions/browser/dist/flowplan-.zip` – diese Datei lädst du im Chrome Web Store, bei Edge Add-ons oder addons.mozilla.org hoch.
## Datenschutz und Rechte
- Die Erweiterung liest eine Seite nur, wenn du sie aufrufst (Symbol, Kontextmenü oder Tastenkürzel) – sie läuft nicht im Hintergrund auf jeder Seite mit.
- Rechte: `activeTab` (die aktuelle Seite, nur nach deinem Klick), `scripting` (um sie dann zu lesen), `contextMenus`, `storage` (Adresse, Token, zuletzt gewähltes Ziel) und der Zugriff auf genau deine Flowplan-Adresse, erst beim Verbinden erfragt.
- Sie sendet nur an deine Instanz. Cookies werden nicht mitgeschickt; die Anmeldung ist allein das Token.
- Ende-zu-Ende-verschlüsselte Bereiche erscheinen nicht als Ziel: Der Server schreibt nie Klartext hinein.
- Der Server erlaubt Anfragen von Browser-Erweiterungen (CORS) nur für die beiden Clipper-Adressen `/api/clipper/targets` und `/api/clipper/save` und nur mit Token – siehe [API und Webhooks](/api-and-webhooks).
---
# Tastenkürzel
Alle Kürzel auf einen Blick. Auf Windows und Linux steht Strg für ⌘ und Alt für ⌥ .
## Überall
| Kürzel | Wirkung |
| --- | --- |
| ⌘ K | Schnellsuche |
| ⌘ F | Auf der Seite suchen: markiert alle Treffer, Enter bzw. ⇧ Enter springt zum nächsten bzw. vorigen, Esc schließt. Ausgewählter Text wird zum Suchbegriff. Geht auch in der Desktop-App und den Apps; auf einem Whiteboard sucht es im Board. |
| ⌘ N | Neue Seite |
| ⌘ ⌥ N | Schnell erfassen (Eintrag in der Datenbank zum Erfassen) |
| ⇧ ⌘ Leertaste / Strg Umschalt Leertaste | Desktop-App: Schnell erfassen aus jeder App ([Schnell erfassen (Desktop)](/desktop-capture)) |
| ? oder ⌘ / | Übersicht der Tastenkürzel |
| ⌘ ⌥ E | Dokument lesen oder bearbeiten |
| ⌘ ⌥ B | Seitenleiste ein- oder ausblenden |
| ⌘ ⌥ Z | Fokusmodus ein oder aus |
| ⌘ ⌥ K | Kommentare ein- oder ausblenden |
| ⌘ ⌥ A | [KI fragen](/ask-ai) öffnen oder schließen (ist die Leiste offen, springt der Fokus hinein; von dort schließt das Kürzel sie) |
| ⌘ ⌥ S | [Geteilte Ansicht](/pages-and-spaces#geteilte-ansicht) öffnen oder schließen |
| ⌘ ⌥ P | Dokument [präsentieren](/reading-and-presenting#praesentieren) |
| ⌘ P | Bei geöffneter Seite: [Druckoptionen](/print-and-pdf#drucken-und-pdf), dann drucken (Enter ); sonst der Druck des Browsers |
| ⌘ ⌥ Y | [Journal](/journal#von-tag-zu-tag): heutigen Tag öffnen (des zuletzt benutzten Journals) |
| ⌘ ⌥ X | Alle [Abschnitte einklappen](/reading-and-presenting#abschnitte-einklappen) (im offenen Dokument oder Eintrag) |
| ⌘ ⌥ O | Alle Abschnitte ausklappen |
| ⌘ [ oder ⌥ ← | [Zurück](/first-steps#zurueck-und-vorwaerts) zur zuvor geöffneten Seite (⌥ ← nicht beim Schreiben – dort springt es wortweise) |
| ⌘ ] oder ⌥ → | Vorwärts zur nächsten Seite |
| – | Helles oder dunkles Design (ohne Vorgabe, eigenes Kürzel möglich) |
| Esc | Dialog, Menü oder Suche schließen |
| ⌘ Z | Löschen, Verschieben oder eine Massenänderung zurücknehmen, solange der Hinweis mit **Rückgängig** sichtbar ist (außerhalb von Textfeldern; im Editor nimmt es die letzte Eingabe zurück) |
Alle Kürzel dieser Tabelle außer Esc und ⌘ Z lassen sich ändern, siehe [Eigene Tastenkürzel](#eigene-tastenkuerzel).
> [!DESKTOP]
> In der Desktop-App wechselt ⌘ ⇧ P bzw. Strg Umschalt P zum nächsten [Profil](/desktop-app#mehrere-instanzen-profile), sobald mehr als eines gespeichert ist.
## Eigene Tastenkürzel
? (außerhalb von Textfeldern), ⌘ / , das ? unten in der Seitenleiste oder **Tastenkürzel anzeigen** unter **Einstellungen → Darstellung & Sprache** öffnen die Übersicht. Unter **Überall** hat jede Aktion den Knopf **Ändern**: Danach die neue Kombination drücken – Esc bricht ab. Die Kombination gilt sofort und für dein Konto auf allen Geräten und Browsern.
Das Suchfeld oben in der Übersicht filtert beim Tippen nach dem Namen einer Aktion oder nach Tasten – Strg , Ctrl , Cmd und ⌘ gelten dabei als dieselbe Taste, ebenso Shift /⇧ und Alt /Option /⌥ , „strg l“ findet also ⌘ L ; Esc leert das Feld zuerst, ein zweites Esc schließt die Übersicht.
- **Konflikte** zeigt die Übersicht an: Gehört die Kombination schon zu einer anderen Aktion, fragt sie nach (**Trotzdem verwenden** nimmt sie der anderen Aktion weg). Kollidiert sie mit einem Kürzel des Editors (etwa ⌘ B für Fett) oder behält der Browser sie meist für sich (etwa ⌘ W ), steht ein Hinweis darunter.
- Der Pfeil setzt eine Aktion auf ihre Vorgabe zurück, **×** entfernt ihr Kürzel ganz, **Alle zurücksetzen** stellt alle Vorgaben wieder her. Eigene Kürzel sind mit **Eigene** markiert.
- Kombinationen ohne ⌘ , Strg oder ⌥ (wie ? ) wirken nur außerhalb von Textfeldern und dem Editor.
- Die Kürzel des Editors, des Seitenbaums, der Präsentation und der geteilten Ansicht sind fest; die Übersicht listet sie zum Nachschlagen.
In der [iPad-App](/mobile-capture#ipad-fenster-tastatur-und-handoff) mit Hardware-Tastatur listet das iPad die Kürzel mit ⌘ , ⌃ oder ⌥ – auch deine eigenen –, wenn du ⌘ hältst.
Die Übersicht zeigt die Tasten so, wie sie auf deinem Gerät heißen: auf dem Mac ⌘ und ⌥ , sonst Ctrl und Alt . Über die API speichert der Befehl `shortcuts.save` dieselben Einstellungen (siehe [API und Webhooks](/api-and-webhooks)).
## Im Dokument
| Kürzel | Wirkung |
| --- | --- |
| / | Blockmenü |
| @ | Seite oder Person erwähnen (Pfeiltasten wählen, Enter fügt ein, Esc schließt) |
| ⌘ B / I / U | Fett, kursiv, unterstrichen |
| ⌘ ⇧ S | Durchgestrichen |
| ⌘ E | Code im Text |
| ⌘ ⇧ H | Markieren |
| ⌘ ⌥ H | Verdecken (Spoiler) |
| ⌘ ⌥ M | Text kommentieren |
| ⌘ ⌥ 1 –4 | Überschrift 1–4 |
| ⌘ ⌥ 0 | Zurück zu normalem Text |
| ⌘ ⇧ E | Text zentrieren |
| ⌘ ⇧ L | [Link zum Block](/links-and-mentions#links-auf-bloecke) mit dem Cursor kopieren |
| ⌘ L | Zeile zur [Aufgabe](/tasks-in-documents#status-einer-aufgabe) machen, dann ihren Status wechseln: offen → in Arbeit → erledigt → offen (wie in Obsidian; mehrere markierte Zeilen wechseln gemeinsam) |
| ⌘ . / ⌘ , | Hochgestellt / tiefgestellt |
| ⌘ ⇧ 8 / 7 / 9 | Aufzählung, nummerierte Liste, Aufgabenliste |
| ⌘ ⇧ B | Zitat |
| ⌘ ⌥ C | Codeblock |
| Tab / ⇧ Tab | [Einrücken](/blocks#einruecken) / zurückrücken; direkt unter einem [aufklappbaren Block](/documents#aufklappbare-bloecke): hineinschieben / herausholen (auch im Titel) |
| ⌘ ⇧ ↑ / ↓ | Block nach oben / unten (eine eingeklappte Überschrift mit ihrem Abschnitt); bei ausgewählter Tabellenzeile: Zeile nach oben / unten |
| ⌘ ⇧ ← / → | Bei ausgewählter Tabellenspalte: Spalte nach links / rechts |
| ⌘ D | Block duplizieren, auch ausgewählte Blöcke oder eine ausgewählte Tabellenzeile oder -spalte |
| Esc | Block mit dem Cursor auswählen ([mehrere Blöcke auswählen](/blocks#mehrere-bloecke-auswaehlen)); bei offenem Blockmenü: Menü schließen, der Block bleibt ausgewählt; bei ausgewählten Blöcken: Auswahl beenden |
| ⌘ A | Im Text: zuerst den Text des Blocks, beim zweiten Mal alle Blöcke auswählen; bei ausgewählten Blöcken: gleich alle Blöcke |
| ⌘ C / ⌘ X | Bei ausgewählten Blöcken: Blöcke kopieren / ausschneiden – ⌘ V fügt sie wieder als Blöcke ein, auch in einer anderen Seite |
| ⌘ ⌥ Enter | In einer Überschrift: ihren [Abschnitt ein- oder ausklappen](/reading-and-presenting#abschnitte-einklappen); in einem [aufklappbaren Block](/documents#aufklappbare-bloecke): ihn ein- oder ausklappen |
| ⇧ Enter | Zeilenumbruch im selben Block |
| ⌘ Z / ⌘ ⇧ Z | Rückgängig / Wiederholen |
| ⌘ Enter | Kommentar senden; in **Als Markdown bearbeiten**: Übernehmen |
| ⌘ J | [Schreibassistent](/ai-writing#schreibassistent) für Markierung oder Zeile (wenn KI eingeschaltet ist) |
| ⌘ ⌥ F | Fußnote einfügen (bei ausgewählter Fußnote: bearbeiten) |
Markdown-Kürzel wie `##`, `-`, `[]` oder ` ``` ` stehen unter [Markdown im Editor](/markdown-editor#markdown-kuerzel).
## Seitenbaum
| Kürzel | Wirkung |
| --- | --- |
| ↑ / ↓ | Zwischen Seiten bewegen |
| → / ← | Unterseiten öffnen oder schließen – auch die Jahres- und Monatsordner eines [Journals](/journal#in-der-seitenleiste) |
| Enter | Seite öffnen |
| ⇧ -Klick | Mehrere Seiten auswählen |
| ⌘ -Klick | In der [geteilten Ansicht](#geteilte-ansicht) öffnen |
## Präsentation
| Kürzel | Wirkung |
| --- | --- |
| → ↓ Leertaste Bild ↓ | Nächste Folie |
| ← ↑ Bild ↑ | Vorherige Folie |
| Pos1 / Ende | Erste / letzte Folie |
| Esc | Präsentation beenden |
## Geteilte Ansicht
| Kürzel | Wirkung |
| --- | --- |
| ⌘ -Klick | Seite im Seitenbaum oder Seitenlink rechts daneben öffnen |
| ← / → (Trennlinie fokussiert) | Breite ändern, mit ⇧ in großen Schritten |
| Enter (Trennlinie fokussiert) | Halbe-halbe |
## Whiteboard
| Kürzel | Wirkung |
| --- | --- |
| V H N T R L P X F G C E K | Auswählen, Verschieben, Notizzettel, Text, Form, Linie, Stift, Radierer, Rahmen, Tabelle, Kommentar, Stempel, Laserpointer |
| ⌘ + / ⌘ − | Hinein- / herauszoomen |
| Pfeiltasten | Auswahl um 1 Punkt verschieben, mit ⇧ um 10 |
| ⇧ 1 | Alles anzeigen |
| ⇧ 2 | Auf die Auswahl zoomen |
| ⌘ G / ⇧ ⌘ G | Gruppieren / Gruppierung aufheben |
| ⌘ F | Auf dem Board suchen |
| ⌘ D | Duplizieren |
| Entf | Löschen |
| ⌘ Z / ⇧ ⌘ Z | Rückgängig / Wiederholen |
| ↑ / ↓ | Ausgewähltes Gerät im Rack um eine HE verschieben (mit ⇧ um fünf) |
| ⌥ ↑ / ↓ | Höhe des ausgewählten Geräts um eine HE ändern |
| Enter | Bei Rack, Gerät oder Kabel: die Details öffnen |
## Datenbanken
Auf dem Griff ⋮⋮ eines Eintrags (Tabelle, Liste, Feed, Board, Galerie, Sprints):
| Kürzel | Wirkung |
| --- | --- |
| Leertaste | Eintrag anheben; danach legt Leertaste oder Enter ihn ab |
| ↑ / ↓ | Angehobenen Eintrag eine Stelle nach oben/unten (Sprints: Abschnitt wählen) |
| ← / → | Board: angehobene Karte in die Nachbarspalte |
| Pos1 / Ende | Angehobenen Eintrag an den Anfang/das Ende |
| Esc | Anheben oder Ziehen abbrechen, nichts wird geändert |
| ⌥ ↑ / ↓ | Eintrag sofort eine Stelle nach oben/unten |
| Enter | (nicht angehoben) Dialog **Eintrag verschieben** öffnen |
### In formatierten Text-Eigenschaften
In einer Text-Eigenschaft (Tabellenzelle, Eintrag; siehe [Formatierter Text](/database-properties#formatierter-text)):
| Kürzel | Wirkung |
| --- | --- |
| ⌘ B / I | Fett / kursiv |
| ⌘ ⇧ X | Durchgestrichen |
| ⌘ E | Code |
| ⌘ K | Markierten Text verlinken (ohne Markierung: Schnellsuche) |
| ⇧ Enter | Zeilenumbruch |
| Enter | Tabellenzelle: speichern und beenden; im Eintrag: Zeilenumbruch |
| Esc | Tabellenzelle: Bearbeitung verwerfen |
## Kalender und Timeline
| Kürzel | Wirkung |
| --- | --- |
| ⌥ ↑ / ↓ | Termin um 15 Minuten verschieben (mit ⇧ : Ende ändern) |
| ⌥ ← / → | Um einen Tag verschieben |
| ⌥ ⇧ ← / → | Timeline: Ende ändern |
| ⌥ Strg ← / → | Timeline: Beginn ändern |
| ⌥ ↑ / ↓ | Monatsansicht: ganztägigen Eintrag um eine Woche verschieben |
| Esc | Laufendes Ziehen abbrechen |
## Workflows
Auf der Fläche eines [Workflows](/workflows): Tab zwischen Knoten, Pfeiltasten verschieben, Enter öffnet das Panel, A hängt einen Knoten an, C verbindet, Entf löscht, Strg +D dupliziert, L wechselt zur Liste, F passt die Ansicht ein. Die Übersicht steht unter [Workflows → Tastatur](/workflows#tastatur).
## In dieser Dokumentation
/ springt in die Suche, Pfeiltasten wählen einen Treffer, Enter öffnet ihn.
---
# Befehle im Blockmenü
Jeder Eintrag des Blockmenüs mit `/` – was du eintippst, um ihn zu finden, und was er einfügt.
Am Zeilenanfang oder nach einem Leerzeichen öffnet `/` das Menü; wie es sich bedienen lässt, steht unter [Das Blockmenü mit /](/documents#das-blockmenue-mit). Weitertippen filtert nach Name, Kürzel und Beschreibung, der beste Treffer steht oben: Statt der Kürzel in der Tabelle geht also auch der Name, auf Deutsch wie auf Englisch. Ohne Eingabe stehen die fünf zuletzt benutzten Blöcke zuoberst. Blöcke von [Block-Erweiterungen](/plugins) erscheinen unter **Erweiterungen** mit ihrem eigenen Namen.
Die Liste wird aus dem Editor von Flowplan erzeugt. Das Feld über den Tabellen filtert sie.
## KI
| Block | Eintippen | Was er macht |
| --- | --- | --- |
| KI-Assistent | `/ki`, `/ai`, `/assistent`, `/assistant` | Text von der KI schreiben lassen *(Wenn KI zum Schreiben eingeschaltet ist)* |
## Text
| Block | Eintippen | Was er macht |
| --- | --- | --- |
| Text | `/text`, `/p`, `/absatz`, `/paragraph` | Einfach losschreiben |
| Überschrift 1 | `/h1`, `/titel`, `/heading1`, `/#` | Große Überschrift |
| Überschrift 2 | `/h2`, `/heading2`, `/##` | Mittlere Überschrift |
| Überschrift 3 | `/h3`, `/heading3`, `/###` | Kleine Überschrift |
| Überschrift 4 | `/h4`, `/heading4`, `/####` | Kleinste Überschrift |
| Zitat | `/quote`, `/>` | Einen Gedanken hervorheben |
| Spoiler | `/verdecken`, `/versteckt`, `/hide`, `/geheim` | Text verdecken, bis jemand darauf klickt |
| Trennlinie | `/hr`, `/divider`, `/linie`, `/---` | Inhalte voneinander trennen |
| Seitenumbruch | `/seitenumbruch`, `/pagebreak`, `/umbruch`, `/newpage` | Beim Drucken und im PDF auf einer neuen Seite weiter |
## Listen
| Block | Eintippen | Was er macht |
| --- | --- | --- |
| Aufgabenliste | `/todo`, `/aufgabe`, `/task`, `/checkbox` | Schritt für Schritt abhaken |
| Aufzählung | `/ul`, `/liste`, `/bullet`, `/punkte` | Eine Liste mit Punkten |
| Nummerierte Liste | `/ol`, `/nummer`, `/numbered`, `/1.` | Eine geordnete Liste |
## Blöcke
| Block | Eintippen | Was er macht |
| --- | --- | --- |
| Literaturzitat | `/zitat`, `/cite`, `/citation`, `/doi` | Quelle zitieren: DOI, BibTeX oder Zotero |
| Literaturverzeichnis | `/bibliography`, `/literatur`, `/references`, `/quellen` | Alle zitierten Werke als Liste |
| Callout | `/callout`, `/hinweis`, `/note`, `/info` | Hervorgehobener Kasten: Hinweis, Tipp, Wichtig, Warnung oder Achtung |
| Callout: Nützliche Information | `/info`, `/note`, `/hinweis` | Nützliche Information |
| Callout: Hilfreicher Rat | `/tip`, `/tipp`, `/hint` | Hilfreicher Rat |
| Callout: Das Wichtigste auf einen Blick | `/important`, `/wichtig` | Das Wichtigste auf einen Blick |
| Callout: Braucht Aufmerksamkeit | `/warning`, `/warnung` | Braucht Aufmerksamkeit |
| Callout: Risiko oder unerwünschte Folge | `/caution`, `/danger`, `/achtung`, `/gefahr` | Risiko oder unerwünschte Folge |
| Aufklappbarer Block | `/toggle`, `/details`, `/aufklappen` | Details ein- und ausblenden |
| Code | `/codeblock`, `` /``` `` | Codeblock einfügen |
| Tabelle | `/table` | Zeilen und Spalten |
| Fußnote | `/fussnote`, `/footnote`, `/fn`, `/anmerkung` | Nummerierte Anmerkung am Seitenende |
| Zwei Spalten | `/spalten`, `/columns`, `/cols` | Inhalte nebeneinander |
| Tabs | `/tabs`, `/reiter`, `/registerkarten` | Inhalte in Tabs umschalten |
## Medien
| Block | Eintippen | Was er macht |
| --- | --- | --- |
| Bild oder Datei | `/bild`, `/image`, `/img`, `/datei` | Datei vom Gerät hochladen |
| Mermaid-Diagramm | `/mermaid`, `/diagramm`, `/flowchart`, `/chart` | Abläufe, Sequenzen und Beziehungen |
| draw.io-Diagramm | `/drawio`, `/draw.io`, `/diagrams.net`, `/diagramm` | Diagramme zeichnen mit draw.io *(Wenn die Instanz draw.io anbietet)* |
| Zeichnen | `/zeichnen`, `/draw`, `/dessin`, `/dessiner` | Handschrift und Skizzen mit Stift oder Finger *(Nicht in Einträgen einer Datenbank)* |
| Whiteboard | `/board`, `/canvas` | Board anzeigen oder neu anlegen |
| Besprechung | `/meet`, `/besprechung`, `/meeting`, `/protokoll` | Aufnehmen, transkribieren und automatisch zusammenfassen |
| Sprachnotiz | `/audio`, `/aufnahme`, `/mikrofon`, `/diktat` | Aufnehmen und als Text einfügen |
| Einbetten | `/embed`, `/youtube`, `/video`, `/figma` | YouTube, Vimeo, Loom, Spotify, Figma oder CodePen |
| Dokument scannen | `/scan`, `/scanner`, `/kamera`, `/camera` | Mit der Kamera, als durchsuchbares PDF *(In den Apps für iPhone, iPad und Android)* |
## Mathematik
| Block | Eintippen | Was er macht |
| --- | --- | --- |
| Formel | `/math`, `/latex`, `/katex`, `/tex` | Mathematischer Ausdruck |
| Inline-Formel | `/inlinemath` | Mathematik direkt im Satz |
| Funktionsgraph | `/graph`, `/plot`, `/funktion`, `/function` | Funktionen von x zeichnen, live bearbeitbar |
| Bruch | `/fraction`, `/bruch`, `/frac`, `/geteilt` | Zähler über Nenner, im Satz |
## Datenbank & Einbettungen
| Block | Eintippen | Was er macht |
| --- | --- | --- |
| Kennzahl | `/metric`, `/kpi`, `/zahl`, `/anzahl` | Eine Zahl aus einer Datenbank, aktuell gehalten |
| Dashboard | `/dashboard`, `/kennzahlen`, `/metrics`, `/kpi` | Drei Kennzahlen nebeneinander, darunter Diagramme einbinden |
| Seite, Eintrag oder Person erwähnen | `/mention`, `/link`, `/seite`, `/person` | Mit @ Wissen verknüpfen |
| Verknüpfte Datenbank | `/datenbank`, `/db`, `/database`, `/linked` | Bestehende Einträge mit eigener Ansicht |
## Weitere
| Block | Eintippen | Was er macht |
| --- | --- | --- |
| Synchronisierter Block | `/sync`, `/synced`, `/synchron`, `/wiederverwenden` | Inhalt, der auf mehreren Seiten gleich bleibt |
| Workflow-Knopf | `/workflow`, `/knopf`, `/button`, `/automation` | Startet einen Workflow mit manuellem Auslöser |
| Synchronisierten Block einfügen | `/sync`, `/synced`, `/einfuegen`, `/kopie` | Einen bestehenden synchronisierten Block zeigen |
---
# Workflow-Knoten
Alle Knoten, die ein [Workflow](/workflows) kennt – mit Typ (so steht er im JSON und in der API), Ausgängen und den Ausgaben, die spätere Knoten als Platzhalter nutzen.
Diese Liste wird aus dem Knotenkatalog von Flowplan erzeugt; die Einstellungen jedes Knotens als JSON Schema liefert `GET /api/workflows/catalog`.
## Auslöser
| Knoten | Typ | Was er tut | Ausgänge | Ausgaben |
| --- | --- | --- | --- | --- |
| Neuer Eintrag ⚡ | `trigger.record.created` | Ein Eintrag wird in einer Datenbank angelegt. | out | `record`, `actor`, `via` |
| Eintrag geändert ⚡ | `trigger.record.changed` | Eigenschaften eines Eintrags ändern sich. | out | `record`, `before`, `changed`, `actor` |
| Eintrag erledigt ⚡ | `trigger.record.done` | Ein Eintrag wird erledigt. | out | `record`, `actor` |
| Datum erreicht | `trigger.record.date` | Ein Datum eines Eintrags ist erreicht oder überfällig. | out | `record`, `date` |
| Formularantwort ⚡ | `trigger.form.submitted` | Jemand schickt das Formular einer Datenbank ab. | out | `record`, `answers`, `respondent` |
| Zeitplan | `trigger.schedule` | Täglich, wöchentlich oder monatlich zu einer Uhrzeit. | out | `slot` |
| Neue Seite | `trigger.page.created` | Eine Seite wird angelegt. | out | `page`, `actor` |
| Seite geändert | `trigger.page.changed` | Titel oder Inhalt einer Seite ändert sich (2 Minuten nach der letzten Änderung). | out | `page`, `actor`, `changes` |
| Seite verschoben | `trigger.page.moved` | Eine Seite bekommt eine neue Elternseite oder einen neuen Bereich. | out | `page`, `from`, `to`, `actor` |
| Tag hinzugefügt | `trigger.page.tagged` | Eine Seite bekommt einen Tag. | out | `page`, `tag`, `actor` |
| Neuer Kommentar | `trigger.comment.created` | Jemand kommentiert eine Seite oder einen Eintrag. | out | `comment`, `page`, `record`, `actor` |
| Erwähnung | `trigger.mention` | Jemand wird in einer Seite, einem Eintrag oder Kommentar erwähnt. | out | `page`, `record`, `mentioned`, `actor` |
| Manuell starten | `trigger.manual` | Startet über „Ausführen“, die API oder einen Knopf. | out | `inputs`, `startedBy`, `source` |
| Eingehender Webhook | `trigger.webhook` | Ein anderer Dienst ruft die Adresse des Workflows auf. | out | `body`, `query`, `headers`, `receivedAt` |
| E-Mail empfangen | `trigger.mail.received` | Eine E-Mail kommt an einer Adresse an, die an diesen Workflow geht. | out | `mail`, `authenticated` |
| Neuer Journaltag | `trigger.journal.day` | Die Seite eines Tages wird im Journal angelegt. | out | `day`, `date`, `journal` |
## Logik
| Knoten | Typ | Was er tut | Ausgänge | Ausgaben |
| --- | --- | --- | --- | --- |
| Wenn ⚡ | `logic.if` | Verzweigt nach Bedingungen. | true, false | `matched` |
| Werte setzen ⚡ | `logic.set` | Benannte Werte für spätere Knoten. | out | – |
| Beenden ⚡ | `logic.stop` | Beendet den Lauf erfolgreich oder als Fehler. | – | – |
| Unterscheiden ⚡ | `logic.switch` | Verzweigt nach dem ersten passenden Fall. | case:…, default | `case` |
| Für jedes | `logic.foreach` | Führt die folgenden Knoten für jedes Element einer Liste aus. | item, done | `count`, `results` |
| Warten | `logic.wait` | Wartet eine Dauer, bis zu einem Zeitpunkt oder bis zur nächsten Uhrzeit. | out | `waitedUntil` |
| Freigabe | `logic.approval` | Wartet, bis eine Person genehmigt oder ablehnt. | approved, rejected, timeout | `decidedBy`, `comment`, `decidedAt` |
## Einträge
| Knoten | Typ | Was er tut | Ausgänge | Ausgaben |
| --- | --- | --- | --- | --- |
| Eintrag anlegen | `action.record.create` | Legt einen Eintrag in einer Datenbank an. | out | `record` |
| Eintrag ändern ⚡ | `action.record.update` | Ändert Eigenschaften eines Eintrags. | out | `record`, `before` |
| Einträge finden | `action.record.find` | Sucht Einträge nach Bedingungen. | out | `records`, `first`, `count` |
| Vorlage anwenden ⚡ | `action.record.template` | Wendet eine Eintragsvorlage auf einen Eintrag an. | out | `record` |
## Seiten
| Knoten | Typ | Was er tut | Ausgänge | Ausgaben |
| --- | --- | --- | --- | --- |
| Seite anlegen | `action.page.create` | Legt eine Seite unter einer Elternseite an, auf Wunsch aus einer Seitenvorlage. Der Titel (mit Platzhaltern) gilt auch dann; der Name der Vorlage nur, wenn er leer bleibt. | out | `page` |
| An Seite anhängen | `action.page.append` | Fügt Blöcke am Ende, am Anfang oder unter einer Überschrift ein. | out | `page`, `appended` |
| Seite taggen | `action.page.tag` | Fügt einer Seite Tags hinzu oder entfernt sie. | out | `page` |
| Seite verschieben | `action.page.move` | Verschiebt eine Seite unter eine neue Elternseite. | out | `page` |
| Aufgabe erstellen | `action.task.create` | Schreibt eine Aufgabe in eine Seite, auf Wunsch mit Person und Fälligkeit. | out | `page`, `task` |
| An Journaltag anhängen | `action.journal.append` | Schreibt Markdown mit Platzhaltern in den heutigen, gestrigen oder einen bestimmten Tag eines Journals – am Ende oder unter einer Überschrift. Fehlt der Tag, wird er wie beim Öffnen angelegt. | out | `day`, `date`, `journal`, `created`, `completed` |
| Journaltag lesen | `action.journal.read` | Liest den heutigen, gestrigen oder einen bestimmten Tag eines Journals – seinen Text und was „An diesem Tag erledigt“ wurde – zum Beispiel für einen KI-Schritt. Ändert nichts. | out | `content`, `completed`, `day`, `date`, `journal`, `found` |
**Aufgabe erstellen** schreibt eine Aufgabe in eine gewählte Seite (oder eine aus einem Platzhalter) oder in die eigene Aufgabenseite der Person, als die der Workflow läuft (die Seite „Aufgaben“ aus **Meine Aufgaben**, beim ersten Mal angelegt). Text und Fälligkeit dürfen Platzhalter enthalten; als Person geht eine einzelne – die ausführende Person, wer den Workflow ausgelöst hat, eine Personen-Eigenschaft des Eintrags oder ein Mitglied. Mit **Unter der Überschrift** kommt die Aufgabe ans Ende des Abschnitts unter dieser Überschrift (fehlt sie, wird sie am Ende angelegt); aufeinanderfolgende Aufgaben landen in derselben Liste. Der Knoten handelt mit den Rechten der ausführenden Person: Die Person muss die Zielseite öffnen können, die eigene Aufgabenseite ist privat und nur für die ausführende Person selbst; gesperrte Seiten, Journale mit PIN und verschlüsselte Bereiche lehnt er ab. Ein Probelauf zeigt, was geschrieben würde, und ändert nichts.
**An Journaltag anhängen** schreibt in einen Tag eines Journals. **Tag**: **Heute** oder **Gestern** – in der Zeitzone des Workflows (Workflow-Einstellungen), wie `$today` – oder **Ein bestimmtes Datum** aus einem Datum oder einem Platzhalter (etwa ein Datumsfeld des Eintrags; bei einem Zeitpunkt zählt dessen Tag in dieser Zeitzone). Künftige Tage lehnt der Schritt ab. **Inhalt** ist Markdown – Überschriften, Listen, Aufgaben `- [ ]`, **fett**, Links – mit Platzhaltern. Die Werte der Platzhalter kommen als Text hinein, nie als Formatierung: Ein Wert mit `**` oder `` bleibt genau so stehen, Seiten-Werte werden Links auf die Seite, Zeilenumbrüche im Wert bleiben Zeilenumbrüche. **Stelle**: **Am Ende des Tages** oder **Unter einer Überschrift** – dann ans Ende des Abschnitts unter der Überschrift mit genau diesem Text, sodass spätere Läufe der Reihe nach darunter landen; fehlt sie, ans Ende des Tages. Leere Zeilen am Ende (aus der Vorlage) bleiben unter dem neuen Text. Gibt es den Tag noch nicht, legt der Schritt ihn an: den neuesten Tag so, wie das Öffnen es täte – mit der Vorlage und den offenen Aufgaben des Vortags an der Stelle, die [Übernommene Aufgaben](/journal#tagesvorlage) vorgibt (auch bei „Beim ersten Schreiben“); einen Tag vor einem späteren nur mit der Vorlage, denn dessen Aufgaben sind schon weitergezogen. Ein Tag im Papierkorb bleibt dort, der Schritt schlägt dann fehl. Der Schritt handelt mit den Rechten der ausführenden Person: Sie muss das Journal bearbeiten dürfen; Journale mit PIN, gesperrte Seiten und verschlüsselte Bereiche lehnt er ab. Ausgaben: `day` (die Tagesseite, für Links in späteren Schritten), `date`, `journal` und `created` (ob der Tag gerade angelegt wurde). Ein Probelauf zeigt Tag, Datum und Stelle und ändert nichts – er legt auch keinen Tag an.
**Journaltag lesen** gibt einen Journaltag an die folgenden Schritte weiter – praktisch, wenn dein Workflow manuell oder per Zeitplan startet und ein KI-Schritt den Tag kennen soll. Journal und Tag wählst du wie bei **An Journaltag anhängen**. Setz `{{…content}}` in die Anweisung, dann bekommt die KI den Text des Tages und die Liste „An diesem Tag erledigt“, so wie du sie unter dem Tag siehst (Nur meine/Alle). `completed` enthält nur die Liste, `found` ist `false`, wenn es den Tag noch nicht gibt (die Liste zählt trotzdem). Der Schritt liest mit den Rechten der ausführenden Person; Journale mit PIN und verschlüsselte Bereiche lehnt er ab. **Neuer Journaltag** und **An Journaltag anhängen** liefern die Liste ebenfalls als `completed`, etwa `{{trigger.completed | join: "\n"}}`.
## Benachrichtigen
| Knoten | Typ | Was er tut | Ausgänge | Ausgaben |
| --- | --- | --- | --- | --- |
| Person benachrichtigen ⚡ | `notify.person` | Benachrichtigung in der App, per Push, E-Mail oder Chat-App. | out | `notified` |
| E-Mail senden | `notify.email` | Schickt eine E-Mail an Personen oder Adressen. | out | `sent` |
| Chat-Nachricht | `notify.chat` | Postet in einen Chat-Webhook des Arbeitsbereichs (Slack, Matrix, Teams, Discord). | out | `sent` |
## KI
| Knoten | Typ | Was er tut | Ausgänge | Ausgaben |
| --- | --- | --- | --- | --- |
| KI: Zusammenfassen | `ai.summarize` | Fasst einen Text zusammen. | out | `summary` |
| KI: Einordnen | `ai.classify` | Ordnet einen Text einer der Kategorien zu. | out, unclear | `category`, `categories`, `confidence` |
| KI: Felder auslesen | `ai.extract` | Liest benannte Werte aus einem Text. | out | `fields`, `missing` |
| KI: Eigene Anweisung | `ai.prompt` | Eine eigene Anweisung, Antwort als Text oder JSON. | out | `text`, `json` |
## HTTP
| Knoten | Typ | Was er tut | Ausgänge | Ausgaben |
| --- | --- | --- | --- | --- |
| HTTP-Anfrage | `http.request` | Ruft eine HTTPS-Adresse auf (fester Host). | out | `status`, `headers`, `body`, `json` |
⚡ – kann im Sofortteil laufen: direkt beim Speichern eines Eintrags, in derselben Änderung.
Jeder Knoten kann **Bei Fehler** wiederholen (bis 5-mal), den Lauf beenden, über den Ausgang `error` weitergehen oder den Fehler übergehen.
---
# KI einrichten
Optionale KI für Texte, Zusammenfassungen, Fragen an den Arbeitsbereich und Datenbanken – standardmäßig aus, auf Wunsch komplett lokal mit Ollama oder mit einem Schlüssel für OpenAI, Anthropic, Gemini oder jeden OpenAI-kompatiblen Dienst. In den Apps für iPhone, iPad und Mac auf Wunsch auch [direkt auf dem Gerät mit Apple Intelligence](#ki-auf-dem-geraet-apple).
> [!NOTE]
> **KI ist in Flowplan immer optional.** Nach der Installation ist sie aus. Die Administration entscheidet, ob es sie gibt, welcher Anbieter verwendet wird, wer sie nutzen darf und welche Funktionen erlaubt sind. Jede Person kann sie für sich wieder ausschalten und festlegen, welche Seiten die KI lesen darf. Mit [Ollama](#ollama-komplett-lokal) verlassen deine Texte den Server nicht. Einzige Ausnahme vom „standardmäßig aus“: [KI auf dem Gerät (Apple)](#ki-auf-dem-geraet-apple) ist erlaubt, weil dabei nichts das Gerät verlässt – Administration und jede Person können auch sie ausschalten.
**Mehr zum Thema:** [Schreibassistent und Zusammenfassungen](/ai-writing) · [Fragen an den Arbeitsbereich](/ask-ai) · [KI-Aktionen, Datenbanken und Workflows](/ai-actions) · [Besprechungen](/meetings)
## Grundsätze
- **Aus, bis jemand sie einschaltet** – auf der Instanz und für jede Person. Einzige Ausnahme ist die [KI auf dem Gerät (Apple)](#ki-auf-dem-geraet-apple): Sie ist erlaubt, weil nichts das Gerät verlässt, und lässt sich ebenso abschalten.
- **Jede Funktion einzeln:** Schreibassistent, Zusammenfassungen, Fragen an den Arbeitsbereich, KI in Datenbanken, KI-Aktionen und KI auf Whiteboards lassen sich von der Administration und von jeder Person getrennt erlauben oder ausschalten.
- **Nur mit deinen Rechten:** Die KI liest nie mehr, als du selbst sehen darfst – und nur, was du ihr erlaubst ([Worauf die KI zugreifen darf](#worauf-die-ki-zugreifen-darf)).
- **Du siehst, wohin deine Texte gehen:** Jede KI-Funktion nennt den Anbieter und ob die Daten den Server verlassen.
- **Schlüssel bleiben geheim:** API-Schlüssel werden verschlüsselt gespeichert und nie wieder angezeigt ([Sicherheit der Schlüssel](#sicherheit-der-schluessel)).
## Anbieter
| Anbieter | Daten verlassen den Server | Typische Adresse |
| --- | --- | --- |
| **Ollama** | nein (wenn Ollama auf dem eigenen Server oder im eigenen Netz läuft) | `http://ollama:11434` |
| **OpenAI-kompatibel** | ja, an den gewählten Dienst – außer bei lokalen Servern wie LM Studio, vLLM oder LocalAI | `https://api.openai.com/v1`, `https://api.mistral.ai/v1`, `https://openrouter.ai/api/v1` |
| **Anthropic** (Claude) | ja, an Anthropic | `https://api.anthropic.com` |
| **Google Gemini** | ja, an Google | `https://generativelanguage.googleapis.com` |
Das Modell trägst du frei ein – jede Modell-ID, die der Anbieter kennt. **Verbindung testen** prüft Adresse, Schlüssel und Modell mit einer kurzen Anfrage.
### Ollama: komplett lokal
[Ollama](https://ollama.com) führt offene Modelle auf deinem eigenen Server aus. Die `compose.yaml` von Flowplan bringt einen passenden Dienst mit, der nur auf Wunsch startet:
```bash
docker compose --profile ai up -d
```
In der `.env`:
```env
OLLAMA_URL=http://ollama:11434
```
Danach unter **Administration → KI** den Anbieter **Ollama** wählen. **Installierte Modelle laden** zeigt, was schon da ist; unter **Modell herunterladen** lädt Flowplan weitere Modelle mit Fortschrittsanzeige, etwa `llama3.1`, `qwen2.5` oder `mistral`. Für die [Suche nach Bedeutung](/ask-ai) zusätzlich ein Embedding-Modell wie `nomic-embed-text` laden und unter **Modell für Embeddings** eintragen.
> [!TIP]
> Wie gut und schnell lokale Modelle antworten, hängt vom Server ab. Kleine Modelle (3–8 Milliarden Parameter) laufen auf aktuellen CPUs; mit einer Grafikkarte werden sie deutlich schneller. Läuft Ollama auf einem anderen Rechner im Netz, trage dessen Adresse ein – Adressen im eigenen Netz sind für den Anbieter der Instanz erlaubt.
## KI auf dem Gerät (Apple)
> [!NOTE]
> **Optional und jederzeit abschaltbar.** In den Flowplan-Apps für iPhone, iPad und Mac kann Flowplan **Apple Intelligence direkt auf dem Gerät** nutzen. **Der Text verlässt das Gerät dabei nicht** – er geht weder an den Flowplan-Server noch an einen KI-Anbieter. Die KI über den Server bleibt davon unberührt und weiter verfügbar.
**Was du brauchst:**
::: tabs
== iPhone und iPad
Die Flowplan-App für iPhone oder iPad mit **iOS/iPadOS 26** oder neuer, auf einem Gerät, das Apple Intelligence unterstützt (etwa iPhone 15 Pro oder neuer, iPad mit M-Chip).
== Mac (Desktop-App)
Die Desktop-App ab 1.2.0 auf einem Mac mit M-Chip und **macOS 26** oder neuer.
:::
Auf beiden muss **Apple Intelligence eingeschaltet** sein (Einstellungen → Apple Intelligence & Siri). Im Browser und auf anderen Geräten gibt es diesen Weg nicht. Auf dem Server braucht es eine Flowplan-Version neuer als 0.7.0 (derzeit das Beta-Image).
**Was auf dem Gerät läuft** – die leichten Aktionen auf einer geöffneten Seite:
- der [Schreibassistent](/ai-writing#schreibassistent) für markierten Text (Verbessern, Umformulieren, Kürzen, Erweitern, Einfacher erklären, Ton ändern, Übersetzen, Als Liste/Tabelle, eigene Anweisung) und das freie Schreiben an der Schreibmarke,
- die [Zusammenfassung](/ai-writing#zusammenfassungen) der geöffneten Seite, eines Eintrags oder einer Sprachnotiz – mit Kernpunkten und **offenen Aufgaben**, die das Modell strukturiert herausliest.
**Was auf dem Server bleibt:** Fragen an den Arbeitsbereich, KI in Datenbanken, KI-Aktionen und Zusammenfassungen von Datenbank-Ansichten. Sie brauchen weiter einen Anbieter der Instanz.
Ergebnisse vom Gerät tragen das Kennzeichen **Auf diesem Gerät**, unten steht „Apple Intelligence · nur auf diesem Gerät“. Die Antwort erscheint wie gewohnt Stück für Stück, **Stopp** bricht auch auf dem Gerät ab.
**Grenzen:** Das Modell auf dem Gerät ist klein und hat wenig Platz (etwa 4000 Token für Anweisung, Text und Antwort zusammen). Für den Schreibassistenten reicht das für einige Absätze; längere Seiten fasst es in Teilen zusammen. Was zu lang ist, übernimmt der Server, wenn du dort KI nutzen darfst – sonst sagt Flowplan, dass der Text zu lang ist, bzw. fasst nur den Anfang zusammen. Lehnt das Modell eine Anfrage nach Apples Sicherheitsregeln ab, geht sie nicht stattdessen an den Server.
**Ein- und ausschalten:**
- **Jede Person** unter **Einstellungen → KI → Auf diesem Gerät (Apple)**: **Wenn möglich (Standard)** – auf dem Gerät, wenn es kann, sonst auf dem Server; **Nur ohne KI auf dem Server** – das Gerät nur, wenn der Server keine KI anbietet; **Aus** – Flowplan fragt das Gerät nie. Dort steht auch, ob Apple Intelligence auf diesem Gerät **verfügbar**, **in den Einstellungen ausgeschaltet** oder **nicht unterstützt** ist. **KI-Funktionen verwenden** aus schaltet auch die KI auf dem Gerät ab.
- **Die Administration** unter **Administration → KI → KI auf dem Gerät (Apple)** für die ganze Instanz (oder mit `FLOWPLAN_AI_DEVICE=off`, [Konfiguration](/configuration-ai-push#ki)). Der Hauptschalter **KI einschalten** gilt für die KI über den Server; die KI auf dem Gerät hat ihren eigenen Schalter und ist standardmäßig erlaubt – auch ohne Anbieter.
- **Auf dem Mac** zusätzlich in der Desktop-App unter **Einstellungen … → Apple Intelligence (optional) → Apple Intelligence auf diesem Mac nutzen** – standardmäßig an, wo es verfügbar ist. Aus startet die App das Modell nie, und die Instanz erreicht es nicht. Dieser Schalter gilt nur für diesen Mac.
- **Für KI gesperrte Seiten und Bereiche** bleiben gesperrt, ebenso deine eigenen Regeln, die Schalter der einzelnen Funktionen, **Ausgewählte Personen** und **Auch Gäste**.
**Verschlüsselte Bereiche:** In [Ende-zu-Ende-verschlüsselten Bereichen](/encrypted-spaces) gibt es sonst keine KI, weil der Server den Text nicht kennt. Auf dem Gerät schon: Schreibassistent (KI-Knopf in der Werkzeugleiste) und Zusammenfassung arbeiten mit dem entschlüsselten Text auf dem Gerät – an den Server geht dabei nichts, auch nicht ersatzweise.
> [!TIP]
> Apples **Schreibtools** (Korrekturlesen, Umschreiben, Zusammenfassen im Textmenü) funktionieren in der App für iPhone und iPad ebenfalls direkt im Editor. Sie gehören zum System und laufen unabhängig von diesen Einstellungen.
## Für Admins
Unter **Administration → KI**:
::: steps
1. **KI einschalten.**
2. **Anbieter der Instanz** wählen (oder **Kein Anbieter**, siehe unten), Adresse, Modell und – falls nötig – den **API-Schlüssel** eintragen. **Verbindung testen.**
3. **Wer KI nutzen darf:**
- **Alle** oder **Ausgewählte Personen** – Letztere schaltest du unter **Administration → Benutzer** pro Person frei: die Person anklicken, dann **Weitere → KI-Funktionen**.
- **Auch Gäste** – ausgeschaltet haben Gäste keine KI-Funktionen.
- **Nutzer dürfen eigene Anbieter/Schlüssel hinterlegen** – dann richtet jede Person in ihren Einstellungen einen eigenen Anbieter mit eigenem Schlüssel ein. Das geht auch ganz ohne Anbieter der Instanz: So nutzen Personen KI mit ihrem eigenen Konto bei einem Anbieter, ohne dass die Instanz dafür bezahlt.
4. **Funktionen:** jede einzeln erlauben oder verbieten. Optional die [Suche nach Bedeutung](/ask-ai#suche-nach-bedeutung-optional) einschalten.
5. **KI auf dem Gerät (Apple):** standardmäßig erlaubt, unabhängig vom Schalter in Schritt 1 ([KI auf dem Gerät](#ki-auf-dem-geraet-apple)). Ausschalten, wenn es auf der Instanz gar keine KI geben soll.
6. **Speichern.**
:::
So lassen sich drei typische Varianten einrichten:
| Variante | Einstellung |
| --- | --- |
| Alle nutzen dieselbe KI | Anbieter der Instanz, **Alle** |
| Nur bestimmte Personen | Anbieter der Instanz, **Ausgewählte Personen**, unter Benutzer freischalten |
| Jede Person mit eigener Lösung | **Kein Anbieter** (oder zusätzlich einer), **Nutzer dürfen eigene Anbieter/Schlüssel hinterlegen** |
Alle Einstellungen lassen sich auch über [Umgebungsvariablen](/configuration-ai-push#ki) vorbelegen, etwa für automatisierte Installationen. Sie gelten, bis jemand in der Administration speichert.
### Seiten und Bereiche für die KI sperren
Eigentümer eines Arbeitsbereichs oder eines Bereichs können eine **Seite** (unter **Teilen → Personen**) oder einen **Bereich** (in den Bereichseinstellungen) **für KI sperren**. Das gilt für alle Personen und für alles darunter – Unterseiten und Datenbankeinträge. Keine KI-Funktion liest dann diese Inhalte, auch wenn eine Person sie in ihren eigenen Regeln erlaubt hat.
Neue [Kontakte-Datenbanken](/contacts) sind von Anfang an für die KI gesperrt; wer die Seite verwaltet, kann sie öffnen.
## Für Nutzer
Unter **Einstellungen → KI**:
- **Verwendeter Anbieter:** welcher Anbieter für dich arbeitet und ob deine Texte den Server verlassen („Deine Texte werden auf diesem Server verarbeitet und verlassen ihn nicht.“ bei Ollama).
- **KI-Funktionen verwenden:** KI für dich ganz ausschalten – oder einzelne Funktionen.
- **Auf diesem Gerät (Apple):** ob Apple Intelligence hier verfügbar ist und ob Flowplan es nutzen soll – **Wenn möglich (Standard)**, **Nur ohne KI auf dem Server** oder **Aus** ([KI auf dem Gerät](#ki-auf-dem-geraet-apple)).
- **Eigenen Anbieter einrichten** (wenn die Administration es erlaubt): Anbieter, Adresse, Modell und dein Schlüssel. Eigene Anbieter müssen öffentliche `https`-Adressen haben. Gibt es auch einen Anbieter der Instanz, wählst du unter **Welchen Anbieter verwenden** zwischen **Den der Instanz** und **Meinen eigenen**.
### Worauf die KI zugreifen darf
Du bestimmst, welche Inhalte die KI lesen darf:
- **Alles, was ich sehen darf** (Standard) – mit Ausnahmen, die du ausschließt.
- **Nur ausgewählte** – nur Arbeitsbereiche, Bereiche, Seiten und Datenbanken, die du erlaubst.
Mit **Regel hinzufügen** wählst du einen Arbeitsbereich, Bereich, eine Seite oder Datenbank und **erlauben** oder **ausschließen**. Regeln gelten für Unterseiten und Einträge mit; die nächstgelegene Regel gewinnt. So lässt sich etwa ein ganzer Arbeitsbereich erlauben und darin eine Seite mit Gehaltsdaten ausschließen.
**Nie** liest die KI:
- Seiten und Einträge, die du nicht sehen darfst,
- private Einträge anderer Personen,
- den Papierkorb,
- Journale mit PIN-Sperre (auch entsperrt),
- Seiten und Bereiche, die für KI gesperrt sind.
Auf einer Seite, die die KI nicht lesen darf, sind KI-Funktionen ausgegraut, mit dem Hinweis, warum.
Fragst du die KI zu einem Journaltag (**Diese Seite**, Schreibassistent, Zusammenfassung), bekommt sie auch die Liste „An diesem Tag erledigt“ mit – so, wie du sie siehst, und nur, was sie lesen darf. In Workflows gibst du einen Tag mit dem Schritt [Journaltag lesen](/workflow-nodes) an die KI weiter.
## Sicherheit der Schlüssel
- **Verschlüsselt gespeichert:** API-Schlüssel – der Instanz und jeder Person – liegen nur verschlüsselt in der Datenbank (AES-256-GCM, an ihren Besitzer gebunden; ein kopierter Wert lässt sich an anderer Stelle nicht entschlüsseln). Der Schlüssel dafür kommt aus `FLOWPLAN_ENCRYPTION_KEY`, `FLOWPLAN_SECRETS_KEY` oder der Datei `secrets.key` im Datenordner ([Gespeicherte Geheimnisse](/configuration-storage#gespeicherte-geheimnisse)).
- **Nur schreibbar:** Ein gespeicherter Schlüssel wird nie wieder angezeigt – weder in der Oberfläche noch über die API, in Exporten, Sicherungen oder Protokollen. Sichtbar ist nur „gespeichert · endet auf …abcd“ mit **Ersetzen** und **Entfernen**.
- **An die Adresse gebunden:** Ändert sich Anbieter oder Adresse, wird der gespeicherte Schlüssel gelöscht. Ein Schlüssel geht also nie an einen anderen Server als den, für den er eingegeben wurde. Schlüssel stehen nur in Kopfzeilen, nie in Adressen; Weiterleitungen werden nicht befolgt.
- **Keine internen Adressen für eigene Anbieter:** Eigene Anbieter von Personen erreichen nur öffentliche `https`-Adressen – keine Adressen im internen Netz oder des Servers selbst.
- **Aus Umgebungsvariablen:** Ein Schlüssel aus `FLOWPLAN_AI_API_KEY` wird nie in der Datenbank gespeichert und nur für den Anbieter aus den Variablen verwendet.
- **Fehlermeldungen** von Anbietern werden von Schlüsseln bereinigt, bevor sie angezeigt oder protokolliert werden.
- **Kein Zugriff über API-Tokens und Demo:** API-Tokens können KI-Einstellungen weder lesen noch ändern und keine KI-Funktionen nutzen; in der Demo ist KI über den Server aus (KI auf dem Gerät gibt es dort mit den Standardeinstellungen).
- **Grenzen:** höchstens 30 Anfragen pro Minute, 300 pro Stunde (`FLOWPLAN_AI_REQUESTS_PER_HOUR`) und 3 gleichzeitig pro Person.
- **Sicherungen:** `secrets.key` ist nicht Teil der Instanzsicherung. Nach einer Wiederherstellung auf einem anderen Server ohne diese Datei zeigt Flowplan „gespeichert, aber nicht lesbar – bitte ersetzen“, und die Schlüssel werden neu eingegeben.
## Häufige Fragen
**Muss ich KI nutzen?** Nein. KI über den Server ist aus, bis die Administration sie einschaltet, und jede Person kann sie für sich ausschalten. Die KI auf Apple-Geräten ist erlaubt, weil der Text das Gerät nicht verlässt, und ebenso optional: **Einstellungen → KI → Auf diesem Gerät (Apple) → Aus**.
**Geht bei der KI auf dem Gerät etwas an den Server?** Nein. Der Text wird auf dem iPhone, iPad oder Mac verarbeitet; der Server erfährt nur, dass du die Einstellung gewählt hast.
**Geht es ganz ohne Cloud?** Ja, mit Ollama auf dem eigenen Server. Dann verlässt kein Text den Server.
**Trainiert der Anbieter mit meinen Daten?** Das regeln die Bedingungen des jeweiligen Anbieters. Flowplan schickt nur, was für eine Anfrage nötig ist, und nur Inhalte, die die KI lesen darf. Wer sicher gehen will, nutzt Ollama.
**Werden Gespräche gespeichert?** Flowplan speichert Anfragen und Antworten nicht dauerhaft; was in Seiten eingefügt wird, ist normaler Inhalt mit Versionsverlauf.
**Kann die KI selbst etwas ändern?** Nein. KI-Aktionen sind Vorschläge; erst wenn du sie auswählst und **Ausführen** drückst, werden sie mit deinen Rechten angelegt.
**Was ist mit dem MCP-Server?** Der [MCP-Server](/mcp) ist ein anderer Weg: Dort arbeitet ein externer Assistent wie Claude Desktop mit deinem Flowplan. Er ist unabhängig von den Einstellungen hier.
---
# Schreibassistent und Zusammenfassungen
Die KI schreibt, kürzt, übersetzt und verbessert Text an der Schreibmarke und fasst Seiten, Besprechungen und Kommentare zusammen.
## Schreibassistent
Der Schreibassistent bearbeitet markierten Text oder schreibt neuen Text an der Schreibmarke. Er steht Personen zur Verfügung, die die Seite bearbeiten dürfen – wenn die Administration KI und den Schreibassistenten erlaubt hat und du ihn unter **Einstellungen → KI** nicht ausgeschaltet hast.
So öffnest du ihn:
- Text markieren → im Textmenü **KI**.
- ++⌘ J++ (++Strg J++): wirkt auf die Markierung, ohne Markierung auf die aktuelle Zeile; in einer leeren Zeile öffnet sich ein freies Eingabefeld.
- `/ki` oder `/ai` im Blockmenü: freies Eingabefeld an der Schreibmarke.
| Aktion | Was passiert |
| --- | --- |
| **Verbessern** | Korrigiert Rechtschreibung, Grammatik und Zeichensetzung und ändert so wenig wie möglich. |
| **Umformulieren** | Gleicher Inhalt, andere Worte. |
| **Kürzen** | Etwa auf die Hälfte; das Wesentliche bleibt. |
| **Erweitern** | Mehr Erklärung und Beispiele, ohne Fakten zu erfinden. |
| **Einfacher erklären** | Kurze Sätze, einfache Wörter. |
| **Ton ändern** | Sachlich, freundlich oder locker. |
| **Übersetzen** | In eine wählbare Sprache – voreingestellt deutscher Text nach Englisch, anderer Text nach Deutsch. |
| **Als Liste** / **Als Tabelle** | Gliedert den Text um. |
| **Was soll die KI tun?** | Eine eigene Anweisung, z. B. „Mach daraus eine E-Mail“. |
**Freies Schreiben** (`/ki`, ++⌘ J++ in einer leeren Zeile): Beschreibe, was entstehen soll – etwa „Schreib eine Einleitung über …“. Mit **Seite als Kontext** (voreingestellt an) geht der Inhalt der Seite mit an die KI.
Die KI antwortet in der Sprache des Textes, beim freien Schreiben in der Sprache deiner Anweisung. Die Antwort erscheint zuerst in einer **Vorschau** unter dem Text, nicht direkt im Dokument; ein pulsierender Cursor zeigt, dass noch Text folgt, **Stopp** bricht ab. Danach:
- **Ersetzen** (beim freien Schreiben **Einfügen**) – die Antwort ersetzt die Markierung bzw. die leere Zeile.
- **Darunter einfügen** – unter dem Absatz bzw. der Liste.
- **Erneut** – dieselbe Anfrage noch einmal; **Andere Aktion** – zurück zur Auswahl; **Verwerfen** – nichts ändert sich.
Überschriften, Listen, Aufgaben, Tabellen, Code und Hinweise werden als echte Blöcke eingefügt. Das Einfügen ist ein einziger Schritt, den ++⌘ Z++ zurücknimmt, und funktioniert beim gemeinsamen Bearbeiten wie jede andere Änderung. Eingefügte Blöcke leuchten kurz in der Akzentfarbe auf – nur als Anzeige, nicht gespeichert und für andere unsichtbar.
> [!NOTE]
> Bilder aus Antworten werden nicht übernommen (nur ihr Alternativtext), Links nur, wenn sie auf `http(s)`, E-Mail oder Flowplan selbst zeigen. So kann ein manipulierter Text keine Inhalte über Bildadressen nach außen schicken.
### Bestehende Seiten verlinken
Mit **Mit bestehenden Seiten verlinken** (im Schreibassistenten, voreingestellt an; deine Wahl merkt sich der Browser) sucht Flowplan zu deiner Anweisung und dem markierten Text bis zu acht passende Seiten des Arbeitsbereichs – mit derselben Suche wie [Fragen an den Arbeitsbereich](/ask-ai) – und gibt der KI deren Titel und einen kurzen Auszug mit. Wo eine Seite wirklich passt, verlinkt die KI sie im Text. Das gilt für alle Aktionen, das freie Schreiben und die Zusammenfassung einer Sprachnotiz.
- Die Links sind schon in der **Vorschau** zu sehen; darunter steht **Verlinkt: …** mit den verlinkten Seiten. Eingefügt werden sie als echte Seitenlinks – wie mit `[[` im Editor: Sie erscheinen in den Rückverweisen, folgen einer Umbenennung und bleiben im Markdown-Export erhalten.
- Angeboten werden nur Seiten, die die KI für dich lesen darf (siehe [Worauf die KI zugreifen darf](/ai#worauf-die-ki-zugreifen-darf)) – nie die Seite, an der du schreibst, und nie gesperrte, private, gelöschte oder PIN-geschützte Inhalte. Die KI kennt die Seiten nur unter Nummern; Flowplan setzt die Links selbst. Adressen, die sich die KI ausdenkt, werden nie zu Links.
- **Listen von Seiten:** Bittest du um eine Liste („Liste alle Docker-Compose-Seiten mit Links auf“), bekommt die KI zusätzlich die Titel weiterer passender Seiten (höchstens 120, bei lokaler KI 30) – ohne Auszug. Ist die Antwort fertig, verlinkt Flowplan jeden Listeneintrag, der genau den Titel einer Seite nennt (auch am Anfang, etwa „**Gitea** – Git-Server“). Groß- und Kleinschreibung, Emojis, Bindestriche und Leerzeichen spielen dabei keine Rolle („it-tools“ findet „🛠️ IT-Tools“). Verlinkt wird nur, wenn genau **eine** Seite, die die KI für dich lesen darf, diesen Titel hat – bei zwei Seiten namens „Notizen“ bleibt der Eintrag Text, Flowplan rät nie.
- Einleitungen und Schlusssätze wie „Sicher! Hier ist die Liste:“ oder „Ich hoffe, das hilft!“ landen nicht im Dokument – auch nicht als eigener Listenpunkt.
- Mit der **KI auf dem Gerät** und in Ende-zu-Ende-verschlüsselten Bereichen wird nicht verlinkt: Dafür müsste der Text auf dem Server durchsucht werden.
- Die Administration kann die Funktion **Seiten verlinken** ausschalten, du selbst unter **Einstellungen → KI**.
## Zusammenfassungen
Die KI liefert eine kurze **Zusammenfassung**, die **Kernpunkte** und die **offenen Aufgaben** – in der Sprache des Inhalts.
- **Seite:** Seitenmenü **…** → **Mit KI zusammenfassen**. Das Ergebnis erscheint in einer Seitenleiste mit **Als Callout oben einfügen** (Zusammenfassung und Kernpunkte als Hinweis am Seitenanfang), **Aufgaben als Checkliste einfügen** (unter der Schreibmarke), **Kopieren** und **Erneut**.
- **Datenbank:** Der KI-Knopf in der Werkzeugleiste fasst die Einträge der **aktuellen Ansicht** zusammen – mit ihren Filtern, ihrer Suche und Sortierung, höchstens 300 Einträge. Die Leiste nennt, wie viele es waren („120 von 340 Einträgen“).
- **Eintrag:** KI-Knopf im Kopf des Eintrags; Callout und Checkliste landen im Dokument des Eintrags.
- **Sprachnotiz:** Wandelt der Server Sprachnotizen in Text um ([Sprachnotizen](/media-and-files#sprachnotizen-und-besprechungen)), fasst **Danach mit KI zusammenfassen** das Transkript zusammen; **Darunter einfügen** setzt die Zusammenfassung unter das Transkript.
Lange Seiten werden abschnittsweise gelesen: Jeder Teil wird zusammengefasst, dann werden die Teile zusammengeführt (bei lokaler KI in kleineren Teilen). Sehr lange Inhalte werden nach zwölf Teilen abgeschnitten; die Leiste weist darauf hin. Einträge, die du nicht sehen darfst oder die für die KI gesperrt sind, bleiben außen vor.
### Wohin die Daten gehen
Jedes KI-Fenster nennt unten den Anbieter, etwa „Ollama · llama3.1 · lokal“ oder „… · Daten gehen an api.openai.com“. Bei lokaler KI bleibt der Text auf deinem Server; sonst gehen der markierte Text, deine Anweisung und – bei **Seite als Kontext** und Zusammenfassungen – der Seiteninhalt an diesen Anbieter. Flowplan lädt Seiten- und Datenbankinhalte selbst auf dem Server und prüft vorher, ob die KI sie lesen darf.
Auf Seiten, die die KI nicht lesen darf, sind alle KI-Einträge ausgegraut mit dem Hinweis „KI hat keinen Zugriff auf diese Seite“ – auch für markierten Text. Der Server lehnt solche Anfragen ebenfalls ab.
---
# Fragen an den Arbeitsbereich
**KI fragen** (Seitenleiste, ++⌘ ⌥ A++ bzw. ++Strg Alt A++, ++⌘ K++ → „KI fragen …“ oder der Knopf in der Suche) beantwortet Fragen zu deinen Seiten und Datenbanken – etwa „Wann ist die nächste Wartung der Heizung fällig?“ oder „Was haben wir zum Thema Onboarding beschlossen?“.

**Als Leiste am rechten Rand:** Auf dem Computer und dem iPad öffnet sich **KI fragen** als Leiste rechts neben der Seite; die Seite wird schmaler, nichts wird verdeckt. Du kannst weiterschreiben, scrollen und andere Seiten öffnen, während die Antwort entsteht – sie läuft weiter, und das Gespräch bleibt beim Seitenwechsel erhalten. Ein Klick auf eine Quelle öffnet die Seite daneben, die Leiste bleibt offen. Die Leiste ist anfangs etwa 420 px breit und höchstens 45 % des Fensters; die Breite änderst du am linken Rand (ziehen oder mit den Pfeiltasten, Doppelklick setzt zurück), dieser Browser merkt sie sich. Die Seite daneben ordnet sich nach dem Platz, der ihr bleibt: Wird es eng, zeigt sie ihre schmale Ansicht, und das **Inhaltsverzeichnis** klappt zu einem Knopf zusammen, der die Gliederung als Liste öffnet. In schmalen Fenstern (unter etwa 1100 px) liegt die Leiste über der Seite, statt sie zusammenzudrücken; **Anheften** stellt sie wieder daneben, **Lösen** legt sie wieder darüber – auch das merkt sich der Browser. Esc in der Leiste, das × oder derselbe Kurzbefehl schließen sie wieder. **KI fragen** und die **Kommentare** teilen sich den rechten Rand: Öffnest du das eine, schließt sich das andere. Im Fokusmodus ist die Leiste ausgeblendet. Auf dem Handy erscheint **KI fragen** als Blatt über der unteren Leiste; nach unten wischen (oder der Pfeil oben) verkleinert es zu einem Knopf „KI antwortet …“ – die Antwort läuft weiter.
- **Diese Seite:** Ist eine Seite geöffnet, steht über dem Eingabefeld der Schalter **Diese Seite** – voreingestellt an. Dann geht die ganze Seite mit der Frage an die KI: Text, Überschriften, Listen, Tabellen und Codeblöcke als Markdown. So beantwortet die KI Fragen wie „Was macht dieser Codeblock?“ oder „Fass diese Seite zusammen“ aus der Seite selbst; sie erscheint als Quelle [1] mit dem Hinweis **Diese Seite**, die Suche im gewählten Bereich läuft zusätzlich. Ist die Seite zu lang für das Modell, geht nur ihr Anfang mit (etwa 60.000 Zeichen, bei lokaler KI 12.000), und unter der Antwort steht ein Hinweis. Der Server prüft vorher, ob du die Seite lesen darfst und die KI sie lesen darf; für gesperrte Seiten und in Ende-zu-Ende-verschlüsselten Bereichen gibt es den Schalter nicht. Ein Klick schaltet ihn für diese Seite aus; beim nächsten Seitenwechsel ist er wieder an.
- **Als Änderungsvorschlag einfügen:** Unter einer Antwort mit **Diese Seite** übernimmt dieser Knopf die Antwort als [Änderungsvorschläge](/collaboration#aenderungen-vorschlagen) in die Seite – etwa nach „Stell den Stack auf Postgres 16 um“ oder „Korrigiere die Rechtschreibung im zweiten Abschnitt“. Nichts wird überschrieben: Entfernte Wörter erscheinen durchgestrichen, neue markiert, jede Änderung als eigener Vorschlag mit deinem Namen und „(KI)“, den du in der Leiste **Vorschläge** einzeln annimmst oder ablehnst (oder alle auf einmal). In einem **Codeblock** wird Zeile für Zeile verglichen – nur die geänderten Zeilen werden vorgeschlagen. Neue Absätze, Listenpunkte oder Codeblöcke kommen an die passende Stelle; lehnst du sie ab, verschwinden sie wieder ganz. Hat sich eine Stelle inzwischen geändert oder findet Flowplan sie nicht eindeutig wieder, wird sie nicht angewendet – die Leiste sagt, wie viele Vorschläge eingefügt wurden und wie viele nicht. Den Knopf gibt es nur, wenn du die Seite bearbeiten darfst (und sie nicht gesperrt ist); wer nur lesen darf, bekommt die Antwort. Das funktioniert mit jedem Anbieter, auch lokal.
- Die Antwort nennt ihre **Quellen** als nummerierte Verweise [1], [2] …; ein Klick öffnet die Seite oder den Eintrag. Die Verweise stammen aus der Suche, nie aus dem Text der KI. Unter der Antwort stehen die Quellen, die sie wirklich zitiert; weitere gefundene Quellen liegen hinter **n weitere Quellen** und klappen auf Klick auf (zitiert eine Antwort nichts, stehen die ersten drei da).
- Findet die KI nichts Passendes, antwortet sie „Dazu habe ich nichts gefunden.“ statt etwas zu erfinden.
- **Wo gesucht wird:** ganzer Arbeitsbereich, die geöffnete Seite mit ihren Unterseiten oder ein Bereich – in der Auswahl oben links. Mit **Alle meine Arbeitsbereiche** (letzter Eintrag dort) sucht die Frage in allen Arbeitsbereichen, in denen du Mitglied bist – in jedem nur, wenn KI dort für dich nutzbar ist (etwa nicht als Gast, wenn Gäste keine KI haben), und mit deinen Regeln für jeden Arbeitsbereich. Quellen aus anderen Arbeitsbereichen tragen dessen Namen; ein Klick wechselt dorthin.
- **Fragen zu Flowplan selbst:** Die Flowplan-Hilfe – diese Dokumentation, auf Deutsch und Englisch – ist in die App eingebaut und wird bei **Ganzer Arbeitsbereich** und **Alle meine Arbeitsbereiche** mit durchsucht. Fragen wie „Wie richte ich die Zwei-Faktor-Anmeldung ein?“ oder „Wo stelle ich den KI-Anbieter ein?“ beantwortet die KI also aus der Hilfe; solche Quellen tragen den Hinweis **Flowplan-Hilfe** und öffnen den passenden Abschnitt auf docs.flowplan.org. **Nur Flowplan-Hilfe** in der Auswahl fragt ausschließlich dort. Die Hilfe liegt in der App selbst – für sie geht keine Anfrage nach außen, und sie passt zur installierten Version.
- **Journal und Datum:** Tage eines Journals gehen mit ihrem Datum an die KI, ebenso das heutige Datum. Fragen wie „Was war das Letzte mit Batu?“ oder „Was habe ich zuletzt …“ nehmen den jüngsten passenden Tag. Ein Name oder ein seltenes Wort findet seine Seiten auch dann, wenn ein häufiges Wort der Frage viele andere Seiten trifft.
- **Darstellung:** Antworten erscheinen formatiert – fett, kursiv, Listen (auch verschachtelt), Code und Links; die Quellen-Nummern bleiben anklickbar.
- **Kopieren:** **Kopieren** unter den Quellen übernimmt die ganze Antwort. Jeder Codeblock hat zusätzlich oben rechts einen eigenen Knopf **Code kopieren** – praktisch, wenn die KI einen Befehl, ein Snippet oder einen fertigen Text (etwa eine Fehlermeldung für ein Issue) in einen Codeblock schreibt. Das gilt überall, wo KI-Antworten formatiert erscheinen.
- **Aktionen vorschlagen:** Unter einer Antwort schlägt die KI auf Wunsch vor, was sich daraus anlegen lässt – siehe [KI-Aktionen](/ai-actions#ki-aktionen).
- **Gespräch:** Rückfragen beziehen die letzten Fragen und Antworten ein; **Neues Gespräch** beginnt von vorn. Das Gespräch bleibt nur in diesem Browser-Tab und wird nicht auf dem Server gespeichert.
- Gesucht wird über den Volltextindex; die passendsten Absätze gehen mit deiner Frage an den Anbieter, der oben in der Leiste steht. Die KI liest dabei nur, was du lesen darfst und was für die KI freigegeben ist ([Worauf die KI zugreifen darf](/ai#worauf-die-ki-zugreifen-darf)). [Tags und Eigenschaftswerte](/page-tags#tags-und-eigenschaften) einer Seite gehören zu ihrem Text.
- Während die Antwort entsteht, zeigen ein Schimmer und ein Schreibcursor den Fortschritt; die Quellen erscheinen nacheinander.
Fragen nach dem Letzten oder Neuesten („Was war zuletzt mit …?“) berücksichtigen immer die jüngsten Journaltage, die zur Frage passen. Die KI liest auch Handschrift in Zeichenblöcken und Notizbüchern (getippter Text und auf dem iPhone/iPad erkannter Text) sowie den Text von PDFs, Office-Dateien und Bildern einer Seite – mit denselben Rechten wie die Seite; Journale mit PIN bleiben für die KI gesperrt.
## Suche nach Bedeutung (optional)
Fragen auf Chinesisch, Japanisch, Koreanisch oder Thai zerlegt Flowplan in Wörter, obwohl diese Sprachen keine Leerzeichen nutzen. „浦东新区的发票在哪里“ sucht also nach 浦东新区 und 发票, kleine Füllwörter wie 的 bleiben außen vor.
Zusätzlich zum Volltext kann Flowplan Inhalte als Vektoren („Embeddings“) speichern. Dann findet **KI fragen** passende Stellen auch ohne gleiche Wörter – „Reise“ findet „Betriebsausflug“.
::: steps
1. Beim Anbieter der Instanz ein **Modell für Embeddings** eintragen:
- **Ollama:** `nomic-embed-text` herunterladen (unter **Administration → KI → Modell herunterladen** oder `ollama pull nomic-embed-text`) und eintragen.
- **OpenAI-kompatibel:** z. B. `text-embedding-3-small`; **Gemini:** `text-embedding-004`. Anthropic bietet keine Embeddings.
2. **Suche nach Bedeutung einschalten** und speichern. Alternativ per Umgebung: `FLOWPLAN_AI_SEMANTIC_SEARCH=on` und `FLOWPLAN_AI_EMBEDDING_MODEL=nomic-embed-text`.
:::
- Ein Hintergrundauftrag bettet geänderte Seiten und Einträge abschnittsweise ein; unveränderte Abschnitte werden nicht erneut eingebettet. Höchstens `FLOWPLAN_AI_EMBED_PER_HOUR` Abschnitte pro Stunde (Standard 5.000).
- **Nie eingebettet** werden Journale mit PIN, für die KI gesperrte Seiten und Bereiche und der Papierkorb. Rechte und persönliche KI-Regeln gelten bei jeder Frage.
- Die Suche nach Bedeutung nutzt immer den Anbieter der Instanz. Wer einen eigenen Anbieter verwendet, sucht nur im Volltext.
- **Speicherbedarf:** 4 Byte je Dimension und Abschnitt (bis etwa 900 Zeichen) – mit `nomic-embed-text` (768 Dimensionen) rund 3 KB je Abschnitt, etwa das Drei- bis Vierfache des Textes; mit 1.536 Dimensionen rund 6 KB. Gespeichert wird nur ein Prüfwert jedes Abschnitts, nicht sein Text. Die Administration zeigt Anzahl und Größe.
- **Ausschalten** löscht alle Vektoren; ein **Modellwechsel** baut sie neu auf.
- Für sehr große Instanzen (Hunderttausende Abschnitte) gibt es noch keinen Vektorindex; die Suche bleibt dann korrekt, wird aber langsamer.
## Verwandte Seiten
Unter einer Seite und im Eintrag einer Datenbank zeigt **Verwandte Seiten** bis zu acht Seiten und Einträge, die dazugehören. Das funktioniert auch ohne KI:
- **Ohne Suche nach Bedeutung** zählen Links von der Seite, Links auf die Seite, Seiten mit denselben Verweisen, bei Einträgen gleiche Tags (Mehrfachauswahl) und ähnliche Titel im Volltextindex.
- **Mit Suche nach Bedeutung** kommen Seiten mit ähnlichem Inhalt dazu („nach Bedeutung“). Dafür werden nur die schon gespeicherten Vektoren verglichen – es geht keine Anfrage an den Anbieter, kein Text verlässt den Server. Die geöffnete Seite muss für die KI lesbar sein; jeder Treffer durchläuft dieselben Regeln wie bei **KI fragen**.
Angezeigt wird nur, was du lesen darfst – keine privaten Bereiche anderer, keine verborgenen Einträge, nichts aus dem Papierkorb oder gesperrten Journalen.
---
# KI-Aktionen, Datenbanken und Workflows
Aus einer Antwort der KI werden Aufgaben, Einträge und Seiten; dazu KI-Eigenschaften in Datenbanken, KI auf Whiteboards und KI-Knoten in Workflows.
## KI-Aktionen
Aus einer Antwort von **KI fragen**, aus dem Schreibassistenten (**Aktionen vorschlagen** unter der Antwort) oder aus dem Transkript einer [Besprechung](/media-and-files#sprachnotizen-und-besprechungen) schlägt die KI Aktionen vor:
| Aktion | Was passiert |
| --- | --- |
| **Seite anlegen** | Neue Seite mit Titel und Inhalt in einem Bereich, in dem du Seiten anlegen darfst. |
| **Aufgaben anlegen** | Aufgaben am Ende eines Dokuments, auf Wunsch mit verantwortlicher Person (@Erwähnung) und Fälligkeitsdatum – sie erscheinen in **Meine Aufgaben** wie selbst geschriebene. |
| **Text anfügen** | Etwa eine Zusammenfassung am Ende eines Dokuments. |
| **Eintrag anlegen** / **Eintrag ändern** | In einer Datenbank, nur in Eigenschaften, die du ändern darfst, und nur mit gültigen Werten (vorhandene Auswahloptionen, Mitglieder, Datumsangaben). |
**Nichts geschieht ohne dich:** Die Vorschläge erscheinen als **Vorschau mit Kästchen**. Was nicht möglich ist – etwa ein Bereich ohne Schreibrecht, eine gesperrte Eigenschaft oder eine für die KI gesperrte Datenbank –, steht ausgegraut mit dem Grund daneben. Erst **Ausführen** legt die gewählten Aktionen an.
- Ausgeführt wird **in deinem Namen und mit deinen Rechten**; der Server prüft jede Aktion beim Ausführen noch einmal. Versionsverlauf, Benachrichtigungen, Automationen und Webhooks laufen wie bei einer eigenen Änderung, das Protokoll vermerkt `ai.action`.
- **Rückgängig:** Angelegte Seiten und Einträge lassen sich direkt im Ergebnis zurücknehmen (sie landen im Papierkorb); angefügter Text und geänderte Einträge stehen im Versionsverlauf.
- Die KI sieht nur einen Katalog der Bereiche, Datenbanken, Eigenschaften und Mitglieder, in die du schreiben darfst und die die KI lesen darf – keine Inhalte darüber hinaus. Die Antwort der KI ist reines JSON und wird nie direkt ausgeführt.
- Die Funktion **KI-Aktionen** lässt sich wie alle anderen von der Administration und unter **Einstellungen → KI** ausschalten.
### Daten aus Datenbanken verwenden
Wenn du eine Datenbank in deinem Auftrag nennst, liest die KI ihre Einträge und arbeitet mit den echten Werten statt mit einer Vorlage voller Platzhalter. Beispiel: „Erstelle eine Dokumentation aus der Tabelle Server“ ergibt eine Tabelle mit deinen Servern, ihren IP-Adressen und URLs.
Die KI liest eine Datenbank, wenn
- du ihren Titel im Auftrag nennst (Groß- und Kleinschreibung egal, gern in Anführungszeichen, z. B. „Server“),
- du sie im Auftrag oder im Text verlinkst (Seitenlink mit `[[`),
- sie im geöffneten Dokument verlinkt oder als Ansicht eingebettet ist und dein Auftrag von einer Tabelle oder Datenbank spricht („Fasse die verlinkte Tabelle zusammen“) – im Schreibassistenten nur mit „Seite als Kontext“,
- bei „KI fragen“ die Frage auf die geöffnete Datenbank beschränkt ist, oder eine gefundene Quelle die Datenbank selbst ist.
Das gilt für KI-Aktionen, den Schreibassistenten (freier Auftrag mit `/ki` und eigene Anweisung zu einer Auswahl) und „KI fragen“. Unter der Antwort bzw. über den vorgeschlagenen Aktionen steht, welche Daten gelesen wurden, z. B. „Daten aus: Server (12 Einträge)“. Bei „KI fragen“ erscheint die Datenbank als Quelle.
Was die KI sieht:
- nur Einträge, die du sehen darfst und die die KI lesen darf – keine privaten Einträge anderer, nichts aus Journalen mit PIN, aus Seiten und Bereichen, die [für KI gesperrt](/ai#seiten-und-bereiche-fuer-die-ki-sperren) sind, aus Ende-zu-Ende-verschlüsselten Bereichen, aus dem Papierkorb oder aus Bereichen, die du in deinen KI-Einstellungen ausgeschlossen hast,
- nur Eigenschaften, die für dich sichtbar sind (Lese-Rechte pro Eigenschaft gelten); Verknüpfungen, Formeln, Rollups, Dateien, Fortschritt, Zeit und Sprints werden nicht mitgeschickt, ebenso wenig der Text in den Eintragsdokumenten,
- die Einträge in der Reihenfolge der Datenbank.
Grenzen: höchstens 3 Datenbanken und 200 Einträge pro Anfrage und etwa 40 000 Zeichen (mit einem Modell auf dem eigenen Server im Schreibassistenten etwa 8 000). Passt nicht alles hinein, steht das in den Daten („… und 57 weitere Einträge“), und die KI weist darauf hin. Die Apple-KI auf dem Gerät liest keine Datenbanken.
## KI auf Whiteboards
Auf [Whiteboards](/whiteboard-collaboration#ki-auf-dem-whiteboard) öffnet **KI** in der Werkzeugleiste drei Funktionen:
- **Nach Thema gruppieren (KI):** ausgewählte Zettel – oder alle im sichtbaren Bereich – nach Themen in beschrifteten Spalten ordnen.
- **Zusammenfassen als Seite:** eine neue Seite neben dem Board mit Zusammenfassung, Themen, Entscheidungen, offenen Fragen und Aufgaben (auf Wunsch als echte Aufgaben mit Person und Termin), mit Link zurück.
- **Mit KI erzeugen …:** eine Mindmap oder ein Flussdiagramm aus einer Beschreibung.
Dazu kommt beim Anlegen von [Datenbankeinträgen aus Zetteln](/whiteboard-collaboration#zettel-als-datenbankeintraege) **Mit KI aufteilen**: Die KI füllt aus dem Zetteltext weitere Eigenschaften, mit Vorschau vor dem Anlegen. Das Anlegen selbst braucht keine KI.
- Nutzen können es Personen, die das Board bearbeiten dürfen. Die Antwort der KI wird streng geprüft (nur bekannte Zettel, Formen und Eigenschaften, Höchstgrenzen) und dann wie eine eigene Änderung angewendet – live für alle, mit einem Schritt rückgängig zu machen.
- An den Anbieter gehen nur die Texte der betroffenen Elemente – ohne verdeckte Zettel und ohne verknüpfte Seiten oder Einträge, die die KI nicht lesen darf. Beim Erzeugen geht nur deine Beschreibung hin, nichts vom Board. Das Protokoll vermerkt `ai.whiteboard`.
- Die Funktion **KI auf Whiteboards** lässt sich wie alle anderen von der Administration und unter **Einstellungen → KI** ausschalten; sie ist an, sobald KI an ist.
## KI in Datenbanken
### KI-Eigenschaft
Beim Hinzufügen einer Eigenschaft **KI-Eigenschaft** wählen und einen Auftrag schreiben, der andere Eigenschaften in geschweiften Klammern nennt:
- `Fasse {Beschreibung} in einem Satz zusammen`
- `Kategorie aus {Titel}: eine von Roman, Sachbuch, Krimi`
- `{Inhalt}` steht für den Seiteninhalt des Eintrags.
Die **Ausgabe** ist Text, Auswahl, Mehrfachauswahl (nur vorhandene Optionen – erfundene werden verworfen) oder Zahl. Da eine KI-Eigenschaft eine normale Eigenschaft ist, funktionieren Filter, Sortierung, Gruppierung, Formulare und Exporte wie gewohnt.
- **Für alle ausfüllen** im Eigenschaftsdialog berechnet alle Einträge im Hintergrund; eine Anzeige nennt, wie viele Werte noch berechnet werden.
- Im Eintrag berechnet **Neu berechnen** einen Wert sofort und zeigt, wann und mit welchem Modell er entstand.
- **Automatisch neu berechnen, wenn sich verwendete Eigenschaften ändern:** Werte folgen Änderungen mit kurzer Verzögerung und im Rahmen der KI-Grenzen. Das läuft im Namen der Person, die es eingeschaltet oder den Auftrag zuletzt geändert hat. Verliert sie den Zugriff, stoppt es; ist KI auf der Instanz aus, pausiert es.
- Werte entstehen wie Bearbeitungen: mit Versionsverlauf, Automationen und Webhooks. Frisch berechnete Zellen leuchten kurz auf.
- Leser, Gäste und API-Tokens können keine KI-Werte schreiben. Private Einträge und für die KI gesperrte Datenbanken werden übersprungen.
### Felder mit KI ausfüllen
Einträge in der Tabelle auswählen → **Mit KI ausfüllen** → eine Eigenschaft wählen (etwa Tags). Die KI füllt nur **leere** Felder – aus Titel, übrigen Eigenschaften und Inhalt; bei Auswahlen nur mit vorhandenen Optionen.
### Datenbank mit KI erstellen
Neue Seite → Datenbank → **Mit KI erstellen** und beschreiben, z. B. „Leseliste mit Autor, Genre, Status, Bewertung“. Die KI schlägt Eigenschaften mit Typen, Auswahloptionen und ein paar Beispieleinträge vor. Du benennst um, entfernst Eigenschaften oder lässt die Beispiele weg – erst **Seite erstellen** legt die Datenbank an. Der Vorschlag wird streng geprüft (erlaubte Typen, höchstens 25 Eigenschaften und 30 Optionen, passende Beispielwerte); aus der Antwort der KI wird nichts ausgeführt.
## KI in Workflows
[Workflows](/workflows) haben vier KI-Knoten: **Zusammenfassen**, **Einordnen** (in Kategorien oder die Optionen einer Auswahl, mit Ausgang „unklar“), **Felder auslesen** und **Eigene Anweisung** (Text oder JSON). Sie nutzen die KI-Funktion **KI in Workflows** – Admins schalten sie unter Administration → KI ab, jede Person für sich in den eigenen KI-Einstellungen.
- **Budget**: höchstens 100 000 Tokens je Workflow und Tag (`FLOWPLAN_WORKFLOW_AI_TOKENS_PER_DAY`); ist es aufgebraucht, scheitert der Knoten mit einer Meldung.
- **Was die KI liest**: nur Seiten und Einträge, die die ausführende Person sehen darf und die für die KI freigegeben sind; gesperrte Seiten und Journale mit PIN bleiben draußen.
- **Prompt-Injection**: Fremder Text (E-Mails, Webhooks, Seiteninhalte) steht im Prompt markiert als Daten. Die KI liefert nur Daten, nie Aktionen – was sie antwortet, wird geprüft (Kategorien aus der Liste, typisierte Felder). Bestimmt eine KI-Ausgabe Empfänger, eine Adresse oder ein Ziel, warnt die Prüfung vor dem Aktivieren.
- **KI-Builder**: „Mit KI entwerfen“ baut aus einem Satz einen Entwurf; die KI sieht dabei nur Namen von Datenbanken, Eigenschaften und Seiten, keine Inhalte, und es zählt dein persönliches KI-Kontingent.
---
# Besprechungen
Tippe **/meet** (oder **/besprechung**) in einem Dokument oder im Dokument eines Datensatzes. Der Block nimmt eine Besprechung auf, schreibt das Transkript mit und fasst sie danach automatisch zusammen.
**Kopf des Blocks**
- **Termin ▾**: Ein kleines Menü am Kalendersymbol zeigt die Termine des Tages aus deinen Kalendern – Kalender-Datenbanken (mit Kalenderansicht, auch aus Google oder Microsoft 365 synchronisierte) und Kalender-Abos –, nach Kalender gruppiert, mit der Uhrzeit vorn. Datierte Einträge anderer Datenbanken (etwa ein Sync-Protokoll oder Aufgaben) stehen nur unter **Weitere Einträge dieses Tages**. Ein Termin übernimmt Titel, Datum und Teilnehmende.
- **Titel** (Standard „Neue Besprechung“), **Datum** als Datums-Erwähnung, **Teilnehmende** (+): Das Plus öffnet eine Suche – tippe einen Namen oder eine E-Mail-Adresse, wähle mit ↑ ↓ und Enter. Mitglieder werden zu Erwähnungen; passt niemand, fügt die letzte Zeile **Gast „…“ hinzufügen** die Person mit ihrem Namen hinzu.
- **Ganze Seite** vergrößert den Block. **Einstellungen** (Zahnrad) öffnet ein Menü – auf dem Handy von unten:
- **Weiter aufnehmen** (roter Punkt), **Zusammenfassung neu erstellen**, **Erneut transkribieren** (solange das Audio aufbewahrt wird),
- **Sprache** der Besprechung (für Transkription und Zusammenfassung; *Automatisch* = Sprache der Oberfläche), **Anweisungen** (Vorlagen oder *Eigene Anweisung …* mit eigenem Text), **Einwilligung** (vor der Aufnahme bestätigen, Hinweistext, Hinweis abspielen – gilt für den ganzen Arbeitsbereich), **Aufnahme hochladen …**, **Eine gemeinsame Tonspur** (wenn der Ton der Besprechung mit aufgenommen wird),
- **Link zur Besprechung kopieren**,
- **Audio jetzt löschen …** und **Transkript löschen …** (rot, mit Rückfrage; das Transkript lässt sich mit ++⌘ Z++ / ++Strg Z++ zurückholen).
Menüs und Auswahllisten liegen über dem Inhalt; der Block verschiebt sich nicht. Escape schließt sie, der Fokus kehrt zum Knopf zurück.
**Drei Reiter**
- **Zusammenfassung**: immer in derselben Reihenfolge – zuerst die **Aufgaben** als „Person: Aufgabe“: echte Aufgaben zum Abhaken, mit Fälligkeit nur, wenn ein Datum genannt wurde. Zuständig ist, wer in der Besprechung oder in den Notizen ausdrücklich genannt wird – oder wer die Aufgabe selbst übernimmt („Ich kümmere mich darum“, „Ich schicke das Angebot“): Dann wird die sprechende Person eingetragen. Sonst bleibt die Aufgabe ohne Zuständige; Flowplan rät nie. Ist die zuständige Person Mitglied und darf die Seite lesen, wird sie erwähnt; die Aufgabe erscheint dann in ihren **Meinen Aufgaben** (mit Benachrichtigung). Danach die **Entscheidungen** (mit Begründung darunter, wenn eine genannt wurde), die **offenen Fragen** (mit ihrem Zusammenhang) und zuletzt die **Zusammenfassung nach Themen**.
- **Notizen** (früher „Agenda“): deine eigenen Notizen – vor, während und nach der Besprechung, jederzeit bearbeitbar. Die Zusammenfassung bezieht sie ein.
- **Transkript**: jede Passage mit Uhrzeit und Sprecher. Es ist **gesperrt**, damit Lesen, Markieren und Kopieren nichts verändert. **Transkript bearbeiten** (Schloss) schaltet es frei: Korrigierte Passagen bekommen ein ✎, und Flowplan merkt sich, dass du sie korrigiert hast. Freigeschaltet gibt es **Suchen und ersetzen** über das ganze Transkript (z. B. „Mayr“ → „Maier“), mit **Ins Glossar aufnehmen**, damit die Spracherkennung den Namen künftig richtig schreibt (nur Eigentümer). Zeilen, die die Spracherkennung in Stille oder Rauschen erfindet („Untertitel im Auftrag des ZDF“, „Thanks for watching“, „Sous-titres réalisés par …“, ein allein stehendes „Vielen Dank.“, dieselbe Zeile viele Male hintereinander), werden als *keine Sprache* markiert, ausgeblendet und nicht zusammengefasst – gelöscht wird nichts: **N ausgeblendete Zeilen anzeigen** zeigt sie.
**Quellen**: Jeder Punkt der Zusammenfassung endet mit bis zu drei Quellen – kleinen Zeitmarken wie `08:17`, die zeigen, wo die Stelle im Transkript beginnt (ab einer Stunde `1:02:05`). Fährst du mit der Maus darüber, siehst du die Stelle; ein Klick öffnet das Transkript dort und spielt die Aufnahme ab dieser Stelle ab, wenn sie aufbewahrt wird. Exporte, veröffentlichte Seiten und der Druck zeigen dieselben Zeiten.
**Aufnehmen**
- **Aufnahme starten**, **Pause**, **Fortsetzen**, **Beenden** (fragt einmal „Besprechung beenden?“ – danach wird transkribiert und zusammengefasst). Während der Aufnahme zeigt je Quelle (Mikrofon, Systemton) eine kleine **Pegelanzeige**, ob Ton ankommt; bleibt eine Quelle über 30 Sekunden still, während die andere Ton hat (stummes oder falsches Mikrofon, Tab ohne geteilten Ton), weist der Block darauf hin. **Weiter aufnehmen** (im Menü) setzt eine Besprechung später fort – das Transkript wird fortgeschrieben. Endete eine Aufnahme unerwartet (Fenster geschlossen, Verbindung weg), bietet der Block **Fortsetzen** an.
Welcher Ton aufgenommen wird, hängt davon ab, wo du aufnimmst:
::: tabs
== Desktop-App
In der **Desktop-App** (Windows 10+, macOS 13+) werden Mikrofon und **Systemton** als zwei getrennte Spuren aufgenommen: Das Mikrofon bist du (dein Name), der Systemton sind die anderen („Andere“). Mit `WHISPER_DIARIZE=on` und einem Dienst, der Sprecher trennt, werden die anderen weiter unterschieden („Andere 1“, „Andere 2“). macOS fragt einmal nach der Berechtigung „Bildschirm- & Systemaudioaufnahme“; fehlt sie, nimmt Flowplan nur das Mikrofon auf und sagt, wo sie sich einschalten lässt.
== Browser
Im **Browser** nimmt **Aufnahme starten** das Mikrofon auf (alle im Raum auf einer Spur); in Chrome und Edge weist der Block vorher darauf hin. In **Chrome und Edge** nimmt **Alle Teilnehmenden aufnehmen** zusätzlich den Ton eines Tabs oder des Bildschirms auf: Im Freigabedialog den Tab der Videokonferenz (oder den Bildschirm) wählen und den Haken zum Teilen des Tons setzen (bei einem Tab „Tab-Audio teilen“); das Bild verwirft Flowplan sofort. Firefox und Safari geben dabei keinen Ton weiter – dort (und für den Ton anderer Programme) die Desktop-App nutzen.
== Mobile Apps
Die Apps für iPhone, iPad und Android nehmen nur das Mikrofon auf.
:::
- **Kopfhörer** sind am besten. Mit Lautsprechern hört das Mikrofon die anderen mit; Flowplan entfernt solche doppelten Passagen aus der Mikrofonspur (gleiche Zeit, nahezu gleicher Text).
- **Eine gemeinsame Tonspur** (Menü): Mikrofon und Ton der Besprechung werden zu einer Spur gemischt statt getrennt aufgenommen. Sprecher unterscheidet dann nur noch der Whisper-Dienst (`WHISPER_DIARIZE=on`); Standard bleiben getrennte Spuren.
- Die Aufnahme geht in 30-Sekunden-Stücken an den Server; bricht die Verbindung ab, bleiben die Stücke im Browser und werden nachgereicht. Bis zu 3 Stunden pro Besprechung. Der Server transkribiert die Stücke schon **während der Aufnahme** – nach dem Beenden bleiben nur das letzte Stück und die Zusammenfassung, das Ergebnis ist also viel schneller da. Klappt das nicht (anderes Format, Dienst kurz weg), wird die ganze Aufnahme am Ende transkribiert; das Audio geht dabei nie verloren.
- **Aufnahme hochladen …** (Menü): M4A, MP3, WAV, AAC oder WebM – eine Datei mit allen oder zwei Dateien (zuerst das Mikrofon, dann der Ton der Besprechung).
**Nach der Aufnahme**: Der Block wird ruhig – kein großer Knopf mehr, nur eine Zeile wie „41:21 aufgenommen · transkribiert · zusammengefasst“. Schlägt die Verarbeitung fehl, steht dort die Fehlermeldung mit **Erneut verarbeiten**; das verarbeitet nur, was fehlt – eine Spur, die schon transkribiert war, wird nicht noch einmal geschickt. Admins der Instanz sehen darunter die genaue Ursache (etwa „no answer within 504 s“, „ECONNREFUSED“ oder die Antwort des Whisper-Dienstes). **Erneut transkribieren** (Menü, nur solange das Audio aufbewahrt wird) schickt die Aufnahme noch einmal an die Spracherkennung, etwa nach einer Ergänzung des Glossars oder einer Änderung am Whisper-Dienst, und schreibt danach die Zusammenfassung neu; die vorige bleibt im Versionsverlauf der Seite. Gibt es korrigierte Passagen, fragt Flowplan, ob sie **behalten** (Standard) oder **ersetzt** werden.
**Zusammenfassung**: entsteht nach dem Beenden in der Sprache der Besprechung, mit dem KI-Anbieter deiner Instanz. Sie braucht mindestens eine Minute Aufnahme und liest Transkript **und Notizen** – auch Notizen, die du nach der Besprechung ergänzt: **Zusammenfassung neu erstellen** nimmt immer den aktuellen Stand. **Anweisungen**: Automatisch, Statusmeeting, 1:1-Gespräch, Workshop, Kundengespräch oder eine eigene Anweisung. **Zusammenfassung neu erstellen** nutzt andere Anweisungen, ohne erneut zu transkribieren. **Frag diese Besprechung** beantwortet Fragen nur aus Transkript und Notizen dieses Blocks, mit Quellen-Chips.
**In einer Datenbank**: Liegt der Block im Dokument eines Datensatzes (z. B. einer Datenbank „Besprechungen“), füllt Flowplan nach der Verarbeitung vorhandene Eigenschaften: Datum, Teilnehmende (Person), Dauer (Zahl, in Minuten) und Status (eine Auswahl wie „Erledigt“).
**Aus dem Journal**: Die Besprechungsnotiz zu einem Termin eines Journaltags enthält am Ende einen Besprechungsblock mit Titel, Datum und Teilnehmenden des Termins.
**Einstellungen → Arbeitsbereich → Besprechungen** (Eigentümer):
- **Anweisungen**: Standard für neue Blöcke.
- **Vokabular → Glossar**: Namen, Abkürzungen und Fachbegriffe, die die Spracherkennung richtig schreiben soll – einer pro Zeile oder durch Kommas getrennt. Flowplan gibt sie zusammen mit dem `WHISPER_PROMPT` der Instanz als Hinweis an Whisper weiter; Whisper liest davon nur rund 224 Token (etwa 550 Zeichen), der Rest wird nach dem letzten ganzen Begriff abgeschnitten.
- **Audio aufbewahren**: *Nach dem Transkript löschen* (Standard), *Nach einigen Tagen löschen* oder *Behalten*. Aufbewahrtes Audio zählt zum Speicher.
- **Einwilligung erforderlich** mit eigenem **Hinweistext**: Vor der Aufnahme erscheint der Hinweis mit „Alle, die transkribiert werden, haben zugestimmt“; **Einwilligungshinweis abspielen** liest ihn vor. Wer zugestimmt hat, wird gespeichert.
**Wer was darf**: Wer die Seite lesen darf, sieht den Block – Gäste also nur auf mit ihnen geteilten Seiten. Aufnehmen und Verarbeiten braucht Bearbeitungsrechte. Gesperrte Seiten, Journale mit PIN (gesperrt) und Ende-zu-Ende-verschlüsselte Bereiche: keine Aufnahme (der Server würde das Audio hören). Transkription braucht `WHISPER_URL`, die Zusammenfassung die KI der Instanz; beides verlässt nie deinen Server bzw. deinen konfigurierten Anbieter.
## API und MCP
Für API-Tokens gibt es die Berechtigung **„KI und Transkription“** (Einstellungen → API & KI-Assistenten, beim Erstellen eines Tokens; standardmäßig aus). Nur Tokens mit dieser Berechtigung erreichen KI-Funktionen (`/api/ai/run`, `ask`, `write`, `summarize`), die Transkription (`/api/transcribe`) und Besprechungen. Die Administration kann die Berechtigung für die ganze Instanz abschalten (Administration → KI → „API-Tokens mit ‚KI und Transkription‘“). Anfragen zählen gegen dieselben KI-Grenzen wie die Oberfläche.
```bash
curl -X POST https://flowplan.example/api/meetings \
-H "Authorization: Bearer fp_…" \
-F pageId= \ # oder databaseId=
-F title="Kick-off" -F date=2026-11-11 \
-F attendees='["Ben","anna@example.org"]' \
-F instructions=status \
-F me=@mikrofon.webm -F others=@systemton.webm # oder -F audio=@alle.m4a
```
Antwort `202 { id, pageId, rowId, status: "transcribing", statusUrl }`. `GET /api/meetings/{id}?content=1` liefert Status, Zusammenfassung (Markdown), `agenda` (im Block „Notizen“) und Transkript. Statt Audio geht auch `transcript` als Text (eine Passage pro Zeile, optional `Name: Text`). Verlangt der Arbeitsbereich eine Einwilligung, braucht es `consent=true`. Weitere Endpunkte: `POST /api/meetings/{id}/summarize` (neu zusammenfassen), `POST /api/meetings/{id}/retranscribe` (aufbewahrtes Audio erneut transkribieren; `{"dryRun": true}` zählt nur die korrigierten Passagen, `{"force": true}` ersetzt auch sie), `POST /api/meetings/{id}/ask`. Im Transkript (`content=1`) tragen Passagen `hallucination` (keine Sprache) und `edited` (korrigiert); `errorDetail` sehen nur Admins der Instanz.
MCP: **`create_meeting_note`** (Audio als Base64 in `audio` oder `me` + `others`, oder `transcript`; Ziel `pageId` oder `databaseId`) und **`get_meeting_note`** – nur mit einem Schreib-Token mit „KI und Transkription“.
Umgebung: `FLOWPLAN_AI_TOKENS=off` schaltet diese Berechtigung für Tokens standardmäßig ab (bis ein Admin die KI-Einstellungen speichert).
---
# API und Webhooks
Mit persönlichen API-Tokens greifen Skripte, n8n oder Home Assistant auf Flowplan zu; Webhooks melden neue Einträge, Formularantworten und Seiten an andere Dienste.
**Mehr zum Thema:** [OpenAPI und SDKs](/openapi) · [E-Mail-Eingang](/inbound-email) · [Chat-Benachrichtigungen](/chat-notifications)
## API-Tokens
Unter **Einstellungen → API & KI-Assistenten** legst du Tokens an: mit Namen, **Nur lesen**, **Lesen und schreiben** oder **Nur Browser-Erweiterung**. Das Token erscheint nur einmal – danach sieht man nur seinen Anfang. Ein Token **Nur lesen** wird bei jeder schreibenden Anfrage abgewiesen, auch bei Backup-Wiederherstellung und Datei-Uploads.
- **Nur Browser-Erweiterung:** für die [Browser-Erweiterung](/browser-extension). Das Token erreicht nur /api/clipper/targets und /api/clipper/save; überall sonst gilt es als kein Token.
- **Marketplace-Prüfung:** ein Häkchen beim Anlegen, standardmäßig aus (nicht bei Tokens **Nur Browser-Erweiterung**). Damit erreicht das Token die [Import-Prüfung](/marketplace#import-pruefen) für Marketplace-Pakete (`POST /api/marketplace/check`) – auch als Token **Nur lesen**, denn die Prüfung behält nichts. Einen echten Import erlaubt die Berechtigung nie; dafür braucht es wie bisher ein Token **Lesen und schreiben**. Ohne die Berechtigung antwortet `/api/marketplace/check` mit 403.
Jede Anfrage mit dem Token handelt mit deinen Rechten:
```bash
curl -H "Authorization: Bearer fp_…" https://flowplan.example.com/api/bootstrap
```
- **Lesen**: alle `GET`-Endpunkte, etwa `/api/bootstrap` (Arbeitsbereich, Seiten), `/api/pages/` (Dokument oder Datenbank mit Einträgen).
In der Antwort einer Datenbank stehen die Einträge unter `rows` (mit `preview` statt des vollständigen Dokuments); `related` enthält verknüpfte Datenbanken, die eigenen Einträge nur unter `rows`.
- **Schreiben**: `POST /api/command` mit derselben Aktion wie die Oberfläche, z. B. einen Eintrag anlegen:
```bash
curl -X POST https://flowplan.example.com/api/command \
-H "Authorization: Bearer fp_…" -H "Content-Type: application/json" \
-d '{"action":"row.create","pageId":"","cells":{"title":"Aus Home Assistant"}}'
```
**Markdown-Export** geht auch mit einem Lese-Token, denn er liest nur – etwa für einen Cron-Job, der den Export in ein Git-Repository überträgt (oder Flowplan erledigt das selbst, siehe [Markdown-Export und Git](/markdown-git-export)):
```bash
curl -sf -X POST https://flowplan.example.com/api/markdown-export \
-H "Authorization: Bearer fp_…" -H "Content-Type: application/json" \
-d '{"pageId":"","format":"zip","includeSubpages":true,"history":true}' -o export.zip
```
Statt `pageId` exportiert `spaceId` einen ganzen [Bereich](/export#einen-ganzen-bereich-exportieren) in ein ZIP: `{"spaceId":"","format":"zip","history":true}`.
**Blocklinks:** `GET /api/pages/{pageId}/blocks/{blockId}` liefert Titel und Textanfang eines Blocks (mit `?row=` für Einträge), `GET /api/blocks?workspace=…&q=…` sucht Überschriften und Blöcke, und die Aktion `block.ids` gibt den Blöcken eines älteren Dokuments ihre Kennungen.
Tokens bekommen nie Administratorrechte und können keine weiteren Tokens anlegen. Widerrufen geht jederzeit in derselben Liste; gesperrte Konten verlieren ihre Tokens automatisch.
Um Claude, ChatGPT oder andere KI-Assistenten anzubinden, nutzt du den [MCP-Server](/mcp) mit einem solchen Token.
## Idempotency-Key: Wiederholen ohne Doppelte
Eine Anfrage kann ohne Antwort scheitern – die Verbindung bricht ab, ein Proxy läuft in sein Zeitlimit –, obwohl Flowplan sie schon ausgeführt hat. Damit ein Skript einfach noch einmal senden kann, nimmt jede ändernde Anfrage den Header `Idempotency-Key`: ein Schlüssel pro Vorgang (z. B. eine UUID v4, 8–128 Zeichen aus `A–Z a–z 0–9 _ -`), bei jeder Wiederholung dieses Vorgangs **unverändert** mitgeschickt.
```bash
KEY=$(uuidgen)
curl -X POST https://flowplan.example.com/api/command \
-H "Authorization: Bearer fp_…" -H "Content-Type: application/json" \
-H "Idempotency-Key: $KEY" \
-d '{"action":"comment.create","pageId":"","body":"Ausgerollt"}'
# Dieselbe Anfrage mit demselben Schlüssel noch einmal: kein zweiter Kommentar.
```
- **Erste Anfrage:** wird ausgeführt; der Schlüssel wird mit der Antwort gespeichert. Bei `POST /api/command` geschieht das in derselben Transaktion wie die Änderung – beides oder keins.
- **Gleicher Schlüssel, gleiche Anfrage** (Methode, Pfad und Inhalt): die gespeicherte Antwort mit demselben Status, gekennzeichnet mit `Idempotent-Replayed: true`. Nichts wird erneut ausgeführt.
- **Gleicher Schlüssel, andere Anfrage:** `422` (`code: idempotency_key_reused`).
- **Erste Anfrage läuft noch:** `409` mit `Retry-After` (`code: idempotency_in_progress`) – kurz warten und mit demselben Schlüssel erneut senden.
- **Antworten mit Geheimnissen** (ein neues API-Token, eine Abo-Adresse, ein Zugangspasswort) und Antworten über 64 KB werden nicht gespeichert: Eine Wiederholung bekommt `409` (`code: idempotency_already_applied`) statt das Geheimnis ein zweites Mal.
- Ein ungültiger Schlüssel ergibt `400` (`code: idempotency_key_invalid`). Eine gescheiterte Anfrage (4xx, 5xx) hinterlässt keinen Schlüssel – nach Behebung der Ursache geht sie mit demselben Schlüssel erneut.
Schlüssel gehören dem, der sie sendet: der Person in der Web-App, dem API-Token oder der App-Installation (Widgets, Kurzbefehle, Teilen-Menü). Derselbe Schlüssel eines anderen Tokens oder einer anderen Person ist ein anderer Schlüssel. Schlüssel verfallen nach 24 Stunden. Anfragen ohne den Header funktionieren wie bisher.
Den Header nehmen `POST /api/command`, Uploads (`/api/upload`), Importe, Webhooks, Zeitberichte, die Issue-Synchronisierung, `/api/clipper/save` der Browser-Erweiterung und die Aktionen der Mobil-Apps; das [OpenAPI-Dokument](/openapi) kennzeichnet diese Operationen (`x-idempotent`). Die Web-App, die Mobil-Apps (Widgets, Kurzbefehle, Teilen-Menü, Mitteilungs-Buttons, offline vorgemerkte Änderungen) und die erzeugten SDKs schicken bei jeder Änderung von sich aus einen Schlüssel und behalten ihn, wenn sie wiederholen – ein Doppelklick, ein Tippen bei schwachem Empfang oder ein Wiederverbinden führt eine Änderung nie zweimal aus.
## Webhooks
Webhooks haben einen eigenen Abschnitt: **Einstellungen → Webhooks** (Gruppe „Verbindungen“, nur für Eigentümer). Eigentümer eines Arbeitsbereichs legen dort mit **Webhook anlegen** Webhooks an: Adresse, Ereignisse und optional eine einzelne Datenbank. Die Liste zeigt jeden Webhook mit Format, letzter Zustellung und Ereignissen. Jeder Webhook hat eine eigene Seite (`/#settings/webhooks/`) mit den Karten **Ziel** (Format, Adresse, Datenbank, Zugangsdaten für Slack/Matrix), **Ereignisse** (ein Schalter je Ereignis), **Nachricht** (nur Chat-Formate), **Vorschau** und – bei bestehenden Webhooks – **Zustellung** mit **Testnachricht senden**; gespeichert wird mit **Änderungen speichern**, gelöscht in der **Gefahrenzone** mit **Webhook löschen …**. Der geheime Schlüssel erscheint nach dem Anlegen einmal über der Liste.
Gespeicherte Zugangsdaten (das Token für Slack oder Matrix) gehen nie an eine neue Adresse: Wer die Adresse eines Webhooks mit Token oder sein Format ändert, gibt das Token erneut ein, sonst wird nicht gespeichert.
Ein Webhook handelt mit den Rechten der Person, die ihn angelegt hat: Er meldet nur Seiten, Datensätze und Kommentare, die sie lesen darf – Inhalte aus privaten Bereichen anderer bleiben draußen, verborgene Eigenschaften ebenso. Wird diese Person deaktiviert oder verlässt sie den Arbeitsbereich, stellt der Webhook nichts mehr zu. Adresse und geheimer Schlüssel werden verschlüsselt gespeichert.
| Ereignis | Wann |
| --- | --- |
| `row.created` | Neuer Eintrag in einer Datenbank, auch aus einem Formular |
| `row.updated` | Eintrag geändert (`changed` nennt die Eigenschaften) |
| `row.done` | Ein Eintrag wurde erledigt (Status „Erledigt“ o. Ä. oder die eingestellte Erledigt-Regel der Datenbank) |
| `form.submitted` | Formularantwort |
| `page.created` | Neue Seite |
| `comment.created` | Neuer Kommentar an einer Seite oder einem Eintrag (`text`) |
| `mention` | Jemand wurde in einer Seite oder einem Eintrag erwähnt (`userId`, `text` = Name) |
| `digest.due` | Einmal am Tag zur eingestellten Uhrzeit: offene Einträge, die heute fällig oder überfällig sind (`items`) |
Flowplan sendet ein JSON per `POST`:
```json
{
"event": "row.created",
"id": "…",
"createdAt": "2026-09-27T10:00:00.000Z",
"workspaceId": "…",
"data": { "pageId": "…", "rowId": "…", "cells": { "title": "Neu" } }
}
```
Die Testnachricht aus den Einstellungen kommt mit dem Ereignis `test`.
### Signatur prüfen
Die Kopfzeile `X-Flowplan-Signature: sha256=` ist die HMAC-SHA256-Signatur des Inhalts mit dem geheimen Schlüssel, der beim Anlegen einmal angezeigt wird:
```js
import { createHmac, timingSafeEqual } from "node:crypto";
const expected = "sha256=" + createHmac("sha256", secret).update(rawBody).digest("hex");
const valid = timingSafeEqual(Buffer.from(expected), Buffer.from(req.headers["x-flowplan-signature"]));
```
### Zustellung
- Antworten mit Status 2xx gelten als zugestellt; sonst wiederholt Flowplan bis zu sechs Mal mit wachsendem Abstand.
- Die Liste unter **Einstellungen → Webhooks** zeigt je Webhook Format, letzte Zustellung oder letzten Fehler und die Ereignisse.
- Nur öffentliche HTTPS-Adressen sind erlaubt. Für Dienste im selben Netz (Home Assistant, n8n) setzt die Administration `FLOWPLAN_WEBHOOK_ALLOW_PRIVATE=true`.
- **Testnachricht senden** in der Liste oder auf der Seite des Webhooks (Karte **Zustellung**) schickt sofort eine Beispielnachricht und zeigt das Ergebnis; sie wird nicht wiederholt. Unter der letzten Zustellung steht außerdem der letzte Fehler mit Zeitpunkt.
### Webhooks per API anlegen
Mit einem **Schreib-Token** eines Eigentümers lassen sich Webhooks auch per API anlegen, ändern und entfernen (`POST /api/webhooks`, `POST /api/webhooks/update`, Testnachricht mit `POST /api/webhooks/test`; Entfernen über `POST /api/command` mit `{"action": "webhook.delete", …}`), etwa von Automatisierungsdiensten. Lese-Tokens dürfen das nicht.
## Workflows
[Workflows](/workflows) lassen sich vollständig per API steuern (alle Routen im OpenAPI-Dokument unter *Workflows*):
| Route | Zweck |
| --- | --- |
| `GET /api/workflows?workspaceId=` | Liste mit Status, „läuft als“ und letztem Lauf |
| `GET /api/workflows/catalog` | Knotenkatalog mit Einstellungen als JSON Schema |
| `GET /api/workflows/{id}` | Status, aktive Version, Entwurf mit Prüfergebnis (Bearbeitende) |
| `POST /api/workflows/{id}/draft` | Entwurf durch ein Graph-JSON ersetzen |
| `POST /api/workflows/{id}/test` | Probe- oder Testlauf des Entwurfs |
| `POST /api/workflows/{id}/activate` | aktivieren – du wirst die ausführende Person (Schreib-Token) |
| `POST /api/workflows/{id}/pause` | pausieren, optional offene Läufe abbrechen |
| `POST /api/workflows/{id}/run` | Workflow mit manuellem Auslöser starten |
| `GET /api/workflows/{id}/runs`, `GET /api/workflow-runs/{runId}` | Läufe und Schritte |
| `POST /api/workflow-runs/{runId}/retry` / `cancel` | wiederholen ab dem fehlgeschlagenen Knoten / abbrechen |
| `GET /api/workflows/{id}/export`, `POST /api/workflows/import` | JSON-Export (ohne Geheimnisse) und Import als Entwurf |
Lese-Tokens lesen nur. Freigaben entscheidet nur eine angemeldete Person, nie ein Token. `activate`, `run` und `import` nehmen einen `Idempotency-Key`. Die SDKs haben dafür eigene Methoden (`saveWorkflowDraft`, `testWorkflow`, `activateWorkflow`, `runWorkflow` …).
### Eingehender Workflow-Webhook
Der Auslöser **Eingehender Webhook** hat eine eigene Adresse `POST /api/workflow-hooks/` (im Knoten zu sehen, rotierbar). Standard ist **signiert**: `X-Flowplan-Timestamp` (Unix-Sekunden, höchstens 5 Minuten alt) und `X-Flowplan-Signature: sha256=`. Jede Signatur zählt einmal. Die Antwort ist sofort `202` mit der Lauf-ID.
```bash
body='{"title":"Server down","description":"web-1 antwortet nicht"}'
ts=$(date +%s)
sig=$(printf '%s.%s' "$ts" "$body" | openssl dgst -sha256 -hmac "$SECRET" | cut -d' ' -f2)
curl -X POST "$URL" -H "Content-Type: application/json" -H "X-Flowplan-Timestamp: $ts" -H "X-Flowplan-Signature: sha256=$sig" -d "$body"
```
```js
const ts = Math.floor(Date.now() / 1000).toString();
const sig = crypto.createHmac("sha256", secret).update(`${ts}.${body}`).digest("hex");
await fetch(url, { method: "POST", headers: { "Content-Type": "application/json", "X-Flowplan-Timestamp": ts, "X-Flowplan-Signature": `sha256=${sig}` }, body });
```
```python
ts = str(int(time.time()))
sig = hmac.new(secret.encode(), f"{ts}.{body}".encode(), hashlib.sha256).hexdigest()
urllib.request.urlopen(urllib.request.Request(url, body.encode(), {"Content-Type": "application/json", "X-Flowplan-Timestamp": ts, "X-Flowplan-Signature": "sha256=" + sig}))
```
Für Dienste, die nicht signieren können, gibt es bewusst gewählt **Nur Token** (höchstens 10 Aufrufe je Minute). Der HTTP-Knoten eines Workflows schickt ausgehend einen `Idempotency-Key: ::`, damit Wiederholungen beim Empfänger nicht doppelt wirken.
## n8n
Für [n8n](https://n8n.io) gibt es den Community-Knoten **`n8n-nodes-flowplan`** (Quellcode unter [`integrations/n8n`](https://github.com/yannicschuller/flowplan/tree/main/integrations/n8n)).
::: steps
1. In n8n unter **Settings → Community Nodes** das Paket `n8n-nodes-flowplan` installieren.
2. Zugangsdaten **Flowplan API** anlegen: Adresse deiner Instanz und ein [API-Token](#api-tokens).
3. Knoten verwenden:
- **Flowplan** liest Arbeitsbereiche und Seiten, legt Seiten an (optional mit Markdown-Inhalt), liest, erstellt und ändert Datenbankeinträge (Eigenschaften nach Namen) und sucht.
- **Flowplan Trigger** startet Workflows bei neuen oder geänderten Einträgen, Formularantworten und neuen Seiten. Er legt seinen Webhook beim Aktivieren selbst an (dafür ein Schreib-Token eines Eigentümers), entfernt ihn beim Deaktivieren und weist Zustellungen mit falscher Signatur ab.
:::
Läuft n8n im eigenen Netz, `FLOWPLAN_WEBHOOK_ALLOW_PRIVATE=true` setzen ([Konfiguration](/configuration-integrations#integrationen)).
## Kalender-Abos
Kalenderansichten lassen sich als iCalendar-Link abonnieren, siehe [Ansichten](/views#kalender-abonnieren).
---
# OpenAPI und SDKs
Jede Instanz beschreibt ihre API selbst, als [OpenAPI 3.1](https://spec.openapis.org/oas/v3.1.0)-Dokument:
- `GET /api/openapi.json` – das Dokument. Der Eintrag `servers` trägt die Adresse der Instanz (`APP_URL`).
- `/api/docs` – dieselbe Beschreibung zum Lesen: alle Pfade nach Bereichen, Parameter, Anfragen, Antworten und Schemas.
Beides ist nur für Angemeldete und mit einem API-Token (`Authorization: Bearer fp_…`, jede Berechtigung) erreichbar; ohne Anmeldung antwortet `/api/openapi.json` mit `401`, und `/api/docs` bittet um die Anmeldung. Instanzen, die die Beschreibung öffentlich zeigen wollen, setzen `FLOWPLAN_PUBLIC_API_DOCS=true`; Besucher sehen dann unter `info.version` nur die Hauptversion (`0.x`), Angemeldete die genaue.
```sh
curl -H "Authorization: Bearer fp_…" https://flowplan.example.com/api/openapi.json > openapi.json
```
Darin stehen alle Endpunkte, die ein API-Token aufrufen darf: Arbeitsbereich und Seiten, Suche, Dateien, Importe und Exporte, Webhooks, der MCP-Server und `POST /api/command` mit einem Schema je häufig genutzter Aktion (`page.create`, `row.create`, `row.update`, `webhook.delete` …) sowie der Liste aller übrigen Aktionen. Zu jedem Endpunkt sind die Fehlercodes (400, 401, 403, 404, 409, 413, 429) und die Ratenbegrenzungen vermerkt; Kalender-Abos und CalDAV sind als externe Zugänge mit eigenem Link genannt.
Hochgeladene Bilder haben einen Platzhalter: Die Antwort von `POST /api/upload` nennt unter `placeholder` die Größe, in der das Bild erscheint (`w`, `h`), und einen [ThumbHash](https://evanw.github.io/thumbhash/) (`hash`, Base64) – eine unscharfe Vorschau in rund 25 Bytes. `GET /api/files/placeholders?ids=…` liefert dasselbe für bis zu 100 Dateien und Profilbilder (`avatar:`), aber nur für Dateien, die du auch herunterladen darfst; alles andere fehlt in der Antwort. Für ältere Dateien wird der Platzhalter bei der ersten Anfrage berechnet. Dateien verschlüsselter Bereiche haben nie einen – der Server sieht ihren Inhalt nicht.
Das Dokument entsteht aus dem Code: Wo der Server Eingaben mit `zod` prüft (Eigenschaften und Ansichten einer Datenbank, die Aktionen, Export-Optionen), werden dieselben Schemas übernommen; der Rest ist in `lib/openapi.ts` aus den Routen beschrieben. Ein Test hält beides zusammen – jede Route unter `app/api`, jede Aktion von `command()` und die SDKs.
## Clients
Aus dem Dokument entstehen zwei schlanke Clients ohne Abhängigkeiten, im Quellcode unter [`sdk/`](https://github.com/yannicschuller/flowplan/tree/main/sdk):
- **TypeScript** (`sdk/typescript/flowplan.ts`): eine Datei, ESM, auf `fetch` aufgebaut, mit Typen für alle Antworten und Aktionen. Die Datei ins Projekt kopieren, fertig:
```ts
import { FlowplanClient } from "./flowplan.js";
const client = new FlowplanClient({ baseUrl: "https://flowplan.example.com", token: "fp_…" });
const { workspace, pages } = await client.bootstrap();
const { id } = await client.command({ action: "row.create", pageId: "", cells: { title: "Aus dem SDK" } });
```
- **Python** (`sdk/python/flowplan_client.py`): nur Standardbibliothek (`urllib`), Python 3.11 oder neuer, `TypedDict`s für die Antworten:
```python
from flowplan_client import FlowplanClient
client = FlowplanClient("https://flowplan.example.com", token="fp_…")
shell = client.bootstrap()
created = client.command({"action": "row.create", "pageId": "", "cells": {"title": "Aus dem SDK"}})
```
Die Methoden heißen wie die `operationId` des Dokuments (`getPage` / `get_page`, `search`, `uploadFile` / `upload_file`, `markdownExport` / `markdown_export` …). Antworten außerhalb von 2xx werfen `FlowplanError` mit Status, Meldung des Servers und bei 429 der Wartezeit. Jedes SDK bringt eine README und ein Beispielskript mit.
Beide Clients schicken bei jeder Änderung von selbst einen [`Idempotency-Key`](/api-and-webhooks#idempotency-key-wiederholen-ohne-doppelte) mit und wiederholen selbst – GET-Anfragen und Änderungen nach einem Netzwerkfehler, `429`, `502`, `503`, `504` oder `409`, solange der erste Versuch noch läuft, standardmäßig zweimal (`retries`, `0` schaltet es ab). Änderungen gehen mit demselben Schlüssel erneut und wirken so nur einmal. Um eine Aktion später zu wiederholen, gib einen eigenen Schlüssel mit: `idempotencyKey` (TypeScript, in den Optionen eines Aufrufs) oder `idempotency_key=` (Python).
Wer Flowplan selbst baut, erzeugt die Clients mit `npm run sdk` neu; der Test `tests/openapi.test.ts` schlägt fehl, wenn die eingecheckten Dateien nicht mehr zum Dokument passen.
## Tags und Eigenschaften per API
- `GET /api/tags?workspace=` – Tags (`id`, `name`, `color`, `position`, `pages`, `records`: Zahl der lesbaren Datenbank-Einträge mit dem Tag) und Eigenschaften (`id`, `name`, `type`, `options`) des Arbeitsbereichs. `GET /api/tags/?workspace=` liefert zusätzlich die lesbaren Seiten (`pages`) und Einträge (`records`: `page_id`, `row_id`, `title`, `database`, `space_id`, `updated_at`, `tags`) mit diesem Tag.
- `GET /api/pages/` enthält `properties`: `tags` (Tag-IDs), `values` (nach Eigenschafts-ID) und `info` (erstellt/geändert am/von).
- `POST /api/command` mit `page.properties`: `{ "action": "page.properties", "pageId": "…", "addTags": ["Kunde"], "values": { "Status": "Offen", "Budget": 1200 } }`. Tags und Eigenschaften gehen über ID oder Namen; `tags` ersetzt alle Tags, `addTags`/`removeTags` ändern sie, `null` entfernt einen Wert.
- `POST /api/command` mit `page.collapseProperties`: `{ "action": "page.collapseProperties", "pageId": "…", "collapsed": true }` klappt die Leiste mit Tags und Eigenschaften für dich ein (`false` auf, `null` zurück zur Voreinstellung). Gilt nur für dich, auf allen Geräten; Leserecht auf der Seite genügt.
- `pages.tag` vergibt oder entfernt Tags auf bis zu 500 Seiten auf einmal.
- Eigentümer (für Tags und Eigenschaften eines Bereichs auch dessen Eigentümer): `tag.save`, `tag.delete`, `tag.merge`, `tag.reorder`, `property.save`, `property.delete`, `property.reorder`. Neue Tags (`tag.save` ohne `tagId`) mit `spaceId` dürfen auch Mitglieder anlegen, die in dem Bereich schreiben dürfen; ohne `spaceId` (oder `null`) gilt ein neuer Tag bzw. eine neue Eigenschaft im ganzen Arbeitsbereich (nur Eigentümer).
- Geltungsbereiche ([mehr](/page-tags#geltungsbereich-arbeitsbereich-oder-bereich)): Tags und Eigenschaften in `GET /api/tags` tragen `spaceId` (`null`: ganzer Arbeitsbereich); `GET /api/tags/?sameName=1` nimmt gleichnamige Tags anderer Bereiche dazu. `tag.scope`/`property.scope` (`{ workspaceId, tagId | propertyId, spaceId, resolve?: "block" | "copy" | "remove", mergeSameName? }`, nur Eigentümer) ändern den Geltungsbereich, `meta.usage` (`{ workspaceId, kind, id, spaceId }`) zeigt vorher die Verwendung außerhalb des Ziels.
- Verschieben: `page.moveCheck` (wie `page.move`) listet die Tags und Eigenschaften des bisherigen Bereichs, die das Ziel nicht hat (`foreign`, mit `sameName` und `candidates`). `page.move` und `pages.bulk` nehmen dafür `meta`: `{ "tags": { "": { "action": "map", "to": "" } }, "properties": { "": { "action": "copy" } } }` oder kurz `"auto"` (gleichnamige zuordnen, sonst kopieren), `"copy"`, `"remove"`. Fehlt die Wahl, antwortet `page.move` mit 409 statt Werte zu verwerfen.
- Vorlagen: `template.save` gehört ohne `spaceId` zum Bereich der Seite, mit `spaceId: null` zum ganzen Arbeitsbereich (Eigentümer; Tags des Bereichs: 409 oder `spaceMeta: "remove"`). `template.dependencies` (`{ workspaceId, templateId, spaceId }`) listet, was eine Vorlage eines anderen Bereichs mitbringt (Schlüssel `tag:`, `property:`); `page.create`, `template.apply` und `template.copy` (`{ workspaceId, templateId, spaceId, meta? }`) nehmen die Wahl als `meta`, `template.update` ändert mit `spaceId` den Geltungsbereich einer Vorlage. `GET /api/templates` liefert `space_id` und `space_name`.
- Text-Eigenschaften (außer dem Titel) enthalten Inline-Markdown – in `row.create`, `row.update`, `rows.bulk`, `rows.import`, beim Lesen und in Webhooks: `**fett**`, `_kursiv_`, `~~durchgestrichen~~`, `` `Code` ``, `[Text](https://…)` (nur http, https, mailto), `\n` für einen Zeilenumbruch. Reiner Text wird maskiert gesendet: ein Backslash vor `` \ * _ ~ ` [ ] ``. Siehe [Formatierter Text](/database-properties#formatierter-text).
- Datenbank-Eigenschaften mit den Tags als Optionen: in `database.update` eine `multiselect`-Eigenschaft mit `"tagOptions": true` (ihre `options` setzt der Server). Zellen enthalten Tag-Namen; ein neuer Name in `row.create`, `row.update` oder `rows.bulk` legt den Tag an (Mitglieder mit Bearbeitungsrecht, sonst 403); `rows.import` lässt Namen weg, die kein Tag werden dürfen. MCP nennt solche Eigenschaften in `get_database` mit `tagOptions: true`.
- In `GET /api/search` wirken `#tag`, `-#tag`, `name:wert`, `OR`, `NOT`, Klammern, `created_by:`, `created:`, `type:`, `in:` und `title:` als Filter (Parameter `tz`: Zeitzone für `today` usw.) (siehe [Suche](/search-and-notifications#nach-tags-und-eigenschaften-filtern)). MCP-Clients bekommen Tags und Werte mit `read_page` als Frontmatter.
## Datensatz-Versionen
`row.update` trägt die `version` des Datensatzes, die du gelesen hast. Hat sich der Datensatz seitdem geändert, antwortet der Server mit `409` – außer du schickst zusätzlich `base` mit: die Werte der geänderten Eigenschaften, so wie du sie gelesen hast. Dann wird die Änderung übernommen, solange niemand diese Eigenschaften inzwischen geändert hat; nur ein echter Konflikt (jemand hat dieselbe Eigenschaft geändert) bekommt die `409`. Die Antworten auf `row.update` und die anderen Änderungen eines Datensatzes (`row.move`, `row.schedule` …) enthalten seine neue `rowVersion`; die schickst du mit der nächsten Änderung.
## Sammlungen per API
- `GET /api/collections?workspace=` – deine und die mit dem Arbeitsbereich geteilten Sammlungen in deiner Reihenfolge: `id`, `name`, `icon`, `query`, `shared`, `mine`, `canEdit`, `ownerName`.
- `GET /api/collections/?tz=Europe/Berlin&offset=0&limit=500` – führt eine Sammlung aus. Du bekommst `collection`, `items` (`pageId`, `rowId`, `type`, `title`, `icon`, `spaceId`, `database`, `tags`, `createdAt`, `updatedAt`, `createdBy`, `creatorName`; zuletzt geänderte zuerst, je Seite `limit` Treffer, Standard 500, höchstens 5000), `total`, `offset`, `nextOffset` (der `offset` der nächsten Seite, `null` auf der letzten), `truncated` (weitere Seiten folgen) und `encryptedLeftOut`. Die Treffer folgen immer den Rechten des Tokens bzw. der Person.
- `GET /api/collections/preview?workspace=&q=` – die ersten 50 Treffer einer nicht gespeicherten Abfrage und ihre Normalform (`query`).
- `POST /api/command`:
- `collection.create` `{ workspaceId, name, query, icon?, shared? }`
- `collection.update` `{ collectionId, name?, query?, icon?, shared? }`
- `collection.delete` / `collection.restore` `{ collectionId }`
- `collection.duplicate` `{ collectionId, name? }`
- `collection.reorder` `{ workspaceId, order: [ids] }`
Die Abfrage wird in ihrer Normalform gespeichert und mit `query` zurückgegeben. `search.save` und `search.delete` funktionieren weiter und legen bzw. löschen Sammlungen.
- MCP: `list_collections`, `run_collection` (lesen), `save_collection`, `delete_collection` (schreiben).
---
# E-Mail-Eingang
Eigentümer eines Arbeitsbereichs legen unter **Einstellungen → Allgemein → E-Mail-Eingang** mit **Adresse anlegen** Adressen an, die eingehende E-Mails in Flowplan ablegen:
- **Ziel Seite**: Jede E-Mail wird eine neue Unterseite. Der Betreff ist der Titel, der Text (bereinigtes HTML oder reiner Text) der Inhalt, darüber Absender und Datum. Anhänge werden Dateien der neuen Seite; eingebettete Bilder (`cid:`) erscheinen an ihrer Stelle, alle übrigen Anhänge als Liste darunter.
- **Ziel Datenbank**: Jede E-Mail wird ein Eintrag. Der Betreff ist der Titel, der Text der Inhalt des Eintrags, die Absenderadresse kommt in die erste E-Mail-Eigenschaft (falls vorhanden), das Datum der E-Mail ist das Erstelldatum, Anhänge kommen in die erste Datei-Eigenschaft (sonst als Liste in den Inhalt).
- **Erlaubte Absender**: Adressen (`ada@example.org`) oder Domains (`example.org`, nur genau diese Domain). E-Mails anderer Absender werden nicht gespeichert, sondern im Prüfprotokoll vermerkt.
- **Signaturschlüssel** (optional): siehe unten.
Die Adresse handelt mit den Rechten der Person, die sie angelegt hat. Verliert sie die Schreibrechte auf das Ziel oder wird das Ziel gesperrt, nimmt die Adresse nichts mehr an (die Liste zeigt den Fehler).
Sicherheit und Grenzen:
- Jede Adresse hat ein zufälliges Token aus 32 Zeichen. **Neues Token erzeugen** macht die bisherige Adresse sofort ungültig.
- HTML aus E-Mails wird wie Gastinhalte bereinigt: keine Skripte, Formulare, Stile oder Frames; externe Bilder (z. B. Zählpixel) werden entfernt, Links bleiben.
- Anhänge: höchstens 20 je E-Mail, 10 MB je Datei, 25 MB zusammen; größere werden mit Namen im Text vermerkt. Der Dateityp wird am Inhalt geprüft, Fotos verlieren ihren Standort; im Browser geöffnet werden nur Bilder und PDFs, alles andere wird heruntergeladen. Anhänge zählen zum Speicherkontingent des Arbeitsbereichs und zum Tagesbudget für anonyme Uploads (200 MB je Adresse und Tag, dazu `FLOWPLAN_ANONYMOUS_UPLOAD_MB` für die ganze Instanz).
- Höchstens 60 E-Mails pro Adresse und Stunde (auch abgelehnte zählen); darüber antwortet Flowplan mit 429, und der Anbieter versucht es später erneut.
- Dieselbe `Message-ID` wird je Adresse nur einmal gespeichert. Ohne `Message-ID` zählen Absender, Betreff, Datum und Text.
- Die Absenderadresse einer E-Mail lässt sich fälschen. Die Absenderliste ist eine Vorauswahl; geheim bleiben muss vor allem das Token. Für Webhooks bietet der Signaturschlüssel zusätzlichen Schutz.
## Per Webhook (Mailgun, Postmark, SendGrid, Cloudflare)
Ohne weitere Einrichtung nimmt Flowplan E-Mails per `POST` an der Webhook-Adresse aus der Liste an:
```
https://flowplan.example.com/api/inbound-mail/
```
Flowplan erkennt das Format am Inhalt:
| Anbieter | Einrichtung |
| --- | --- |
| **Mailgun** | *Receiving → Create Route*: Ausdruck z. B. `match_recipient("flowplan@mg.example.com")`, Aktion *Forward* an die Webhook-Adresse. Als Signaturschlüssel den *HTTP webhook signing key* von Mailgun eintragen; Flowplan prüft dann `timestamp`, `token` und `signature` (höchstens 15 Minuten alt). |
| **Postmark** | Server → *Inbound* Stream → *Webhook URL* = Webhook-Adresse. Postmark schickt JSON mit `FromFull`, `TextBody`, `HtmlBody` und `Attachments`. |
| **SendGrid** | *Settings → Inbound Parse → Add Host & URL*: Domain und Webhook-Adresse. Mit *POST the raw, full MIME message* kommt die ganze E-Mail (`email`), sonst die Felder `from`, `subject`, `text`, `html`, `attachment-info` und `attachment1…`. |
| **Cloudflare Email Routing** | Eine Email-Worker-Regel, die die rohe E-Mail weitergibt (Beispiel unten). |
| **Eigene Skripte** | JSON oder `multipart/form-data` mit `from`, `to`, `subject`, `text`, `html`, `messageId`, `date` und `attachments` (JSON: `[{ "filename", "contentType", "content" (base64), "contentId" }]`, Multipart: Dateifelder) – oder die ganze E-Mail als `raw` (Text) bzw. `rawBase64`, oder als Inhalt mit `Content-Type: message/rfc822`. |
Cloudflare Email Worker:
```js
export default {
async email(message, env) {
const raw = await new Response(message.raw).arrayBuffer();
const body = new Uint8Array(raw);
const key = await crypto.subtle.importKey("raw", new TextEncoder().encode(env.FLOWPLAN_KEY), { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
const sig = [...new Uint8Array(await crypto.subtle.sign("HMAC", key, body))].map((b) => b.toString(16).padStart(2, "0")).join("");
const res = await fetch(env.FLOWPLAN_URL, {
method: "POST",
headers: { "Content-Type": "message/rfc822", "X-Flowplan-Signature": `sha256=${sig}` },
body,
});
if (!res.ok) message.setReject(`Flowplan: ${res.status}`);
},
};
```
**Signaturschlüssel**: Ist für eine Adresse einer gesetzt, braucht jede Zustellung entweder die Kopfzeile `X-Flowplan-Signature: sha256=` (HMAC-SHA256 des unveränderten Inhalts mit dem Schlüssel, wie bei Flowplans eigenen Webhooks) oder Mailguns Signaturfelder. Sonst antwortet Flowplan mit 401.
Antworten: `200` mit `{"status": "stored" | "duplicate" | "rejected"}` – auch abgelehnte und doppelte E-Mails bekommen 200, damit der Anbieter nicht wiederholt. `401` Signatur ungültig, `404` unbekanntes Token, `409` Ziel nicht beschreibbar, `413` zu groß oder Tagesbudget erreicht, `415` unbekanntes Format, `429` Stundenlimit.
## Per IMAP-Postfach
Statt eines Anbieters kann Flowplan ein eigenes Postfach abfragen (alle zwei Minuten, ungelesene E-Mails). Die Administration setzt dafür `INBOUND_IMAP_HOST`, `INBOUND_IMAP_USER`, `INBOUND_IMAP_PASSWORD` und `INBOUND_MAIL_DOMAIN` ([Konfiguration](/configuration-integrations#e-mail-eingang-imap)). Jede Adresse in der Liste lautet dann
```
inbox+@mail.example.com
```
(Plus-Adressierung: der Teil vor `+` ist der Benutzername des Postfachs). Flowplan sucht das Token in `To`, `Cc`, `Delivered-To` und `X-Original-To`. Verarbeitete, doppelte, abgelehnte und nicht zuordenbare E-Mails werden als gelesen markiert; ist das Stundenlimit oder Tagesbudget erreicht, bleiben sie ungelesen und kommen in der nächsten Runde dran.
## Per API
Mit einem **Schreib-Token** eines Eigentümers: `GET /api/inbound-mail?workspace=` listet die Adressen, `POST /api/command` mit `inbound.save` (anlegen oder ändern: `pageId`, `senders`, optional `label`, `secret`, `id`), `inbound.rotate` und `inbound.delete` verwaltet sie.
---
# Chat-Benachrichtigungen
Statt JSON kann ein Webhook eine fertige Nachricht in einen Chat schicken. Auf der Seite des Webhooks unter **Einstellungen → Webhooks** wählst du in der Karte **Ziel** das **Format**:
| Format | Ziel | Was ankommt |
| --- | --- | --- |
| JSON | n8n, Home Assistant, eigene Dienste | Das signierte JSON oben |
| Slack | Incoming Webhook oder eine Slack-App | Block Kit: Überschrift, Text mit dem Eintrag als Link, Felder für geänderte Eigenschaften, Zeile mit Person und Zeit |
| Matrix | Raum-Webhook (z. B. hookshot) oder die Matrix-Client-API | HTML-Nachricht (`formatted_body`) mit reinem Text als `body` |
| Microsoft Teams | Incoming Webhook bzw. Workflow „Bei Empfang einer Webhook-Anforderung posten“ | Adaptive Card mit Faktenliste und Schaltfläche **In Flowplan öffnen** |
| Discord | Kanal-Webhook | Embed mit Titel, Link, Feldern und Zeitstempel |
Neben dem Formular zeigt eine **Vorschau** die Nachricht für ein Beispielereignis, darunter den Inhalt, der tatsächlich gesendet wird.
## Einrichten
**Slack**
- *Nur Nachrichten:* In Slack eine App anlegen (api.slack.com/apps), **Incoming Webhooks** einschalten, einen Kanal wählen und die Adresse `https://hooks.slack.com/services/…` in Flowplan eintragen.
- *Mit Antworten im Thread:* Der App unter **OAuth & Permissions** das Recht `chat:write` geben, installieren und den **Bot User OAuth Token** (`xoxb-…`) sowie die **Kanal-ID** (in Slack: Kanaldetails, ganz unten) eintragen; den Bot in den Kanal einladen (`/invite @App`). Für Antworten zusätzlich das **Signing Secret** (Basic Information) eintragen. Nach dem Speichern zeigt die Seite des Webhooks (Karte **Zustellung**) eine **Request URL** (`…/api/webhooks/slack/`): In der App unter **Event Subscriptions** einschalten, diese Adresse eintragen und das Bot-Ereignis `message.channels` (bei privaten Kanälen `message.groups`) abonnieren. Antworten im Thread einer Flowplan-Nachricht erscheinen dann als Kommentar am Eintrag – geschrieben im Namen der Person, die den Webhook eingerichtet hat, mit dem Präfix „Slack:“. Threads werden 30 Tage lang zugeordnet.
**Matrix**
- *Raum-Webhook:* Mit einer Brücke wie hookshot einen „generic webhook“ im Raum anlegen und dessen Adresse eintragen. Flowplan sendet `text` und `html` (plus die Felder einer Matrix-Nachricht).
- *Client-API:* Für ein Bot-Konto ein Zugriffstoken erzeugen, das Konto in den Raum einladen und in Flowplan die **Adresse des Homeservers** (z. B. `https://matrix.example.org`), das **Zugriffstoken** und den **Raum** (`!id:server` oder `#alias:server`) eintragen. Flowplan sendet mit `PUT /_matrix/client/v3/rooms/{raum}/send/m.room.message/{txn}`; Wiederholungen derselben Zustellung erzeugen keine doppelten Nachrichten.
**Microsoft Teams**
- In Teams beim Kanal einen Workflow mit der Vorlage „Bei Empfang einer Webhook-Anforderung in einem Kanal posten“ anlegen (oder einen klassischen Incoming Webhook) und die angezeigte Adresse eintragen.
**Discord**
- In den Kanaleinstellungen unter **Integrationen → Webhooks** einen Webhook anlegen und die Adresse `https://discord.com/api/webhooks/…` eintragen. Erwähnungen (@everyone usw.) werden nie ausgelöst.
Zugriffstoken, Bot-Token und Signing Secret werden verschlüsselt gespeichert und nie wieder angezeigt; beim Bearbeiten bleibt ein leeres Feld beim gespeicherten Wert, **Gespeicherte Zugangsdaten entfernen** löscht sie. Auch für Chat-Adressen gilt: nur öffentliches HTTPS, jede Zustellung prüft die Adresse erneut.
## Vorlagen
Für jedes Ereignis gibt es einen Standardtext, den du im Formular ändern kannst (Auswahl **Vorlage für Ereignis**). Die Schaltflächen fügen Platzhalter ein:
| Platzhalter | Inhalt |
| --- | --- |
| `{title}` | Titel des Eintrags oder der Seite |
| `{actor}` | Wer es ausgelöst hat |
| `{page}` | Datenbank bzw. übergeordnete Seite |
| `{changes}` | Geänderte Eigenschaften als Liste (in der Übersicht: die fälligen Einträge) |
| `{url}` | Link in Flowplan |
| `{text}` | Kommentartext bzw. Name der erwähnten Person |
| `{date}` | Datum und Uhrzeit (in der Übersicht: der Tag) |
| `{count}` | Anzahl der Änderungen bzw. fälligen Einträge |
Erlaubt ist ein kleines Markdown: `**fett**`, `_kursiv_`, `` `Code` ``, `[Text](Adresse)`, Zeilen mit `- ` als Liste und `> ` als Zitat. Flowplan übersetzt das in die Auszeichnung der Plattform (Slack mrkdwn, Matrix-HTML, Teams-Markdown, Discord-Markdown). Werte aus Flowplan werden nie als Auszeichnung gelesen – ein `*` im Titel bleibt ein `*`. Steht `{changes}` nicht in der Vorlage, zeigen Slack, Teams und Discord die Änderungen als eigene Felder, Matrix als Liste darunter. Lange Werte werden gekürzt (Titel 200 Zeichen, Kommentar 1.000, höchstens 10 Änderungen und 25 fällige Einträge), damit die Grenzen der Plattformen eingehalten werden. Die **Sprache der Nachrichten** (Standardtexte, Datumsformat) ist je Webhook einstellbar.
Beispiel:
```text
{actor} hat [{title}]({url}) in **{page}** geändert:
{changes}
```
## Tägliche Übersicht
Mit dem Ereignis **Heute fällig** (`digest.due`, „täglich um …“) kommt einmal am Tag zur gewählten Uhrzeit (Zeitzone des Browsers beim Anlegen) eine Liste der offenen Einträge, die heute fällig oder überfällig sind – aus allen Datenbanken des Arbeitsbereichs oder nur der gewählten. Als Fälligkeit zählt die Datumseigenschaft mit „Fällig“, „Due“, „Deadline“ o. Ä. im Namen, sonst die erste Datumseigenschaft; als erledigt gilt, was die Erledigt-Regel der Datenbank sagt. Private Einträge stehen nie in der Übersicht. Ist nichts fällig, wird nichts gesendet.
---
# MCP: KI-Assistenten
Verbinde Claude, ChatGPT und andere KI-Assistenten über das Model Context Protocol (MCP) mit deinem Flowplan. Sie suchen, lesen und schreiben mit genau deinen Rechten und nicht mehr.
Suchst du stattdessen diese Doku in deinem Assistenten? Das steht unter [Flowplan-Doku in deiner KI](/docs-in-your-ai).
Neben der optionalen [eingebauten KI](/ai) kannst du über MCP den Assistenten anbinden, den *du* wählst. Er arbeitet mit deinen Seiten, Datenbanken und Aufgaben. Er sieht nur, was du in Flowplan sehen kannst.
## Einrichten
::: steps
1. Lege unter **Einstellungen → API & KI-Assistenten** ein [persönliches API-Token](/api-and-webhooks) für den Assistenten an. Wähle **Nur lesen**, wenn der Assistent nur suchen und lesen soll. Wähle **Lesen und schreiben**, wenn er auch Seiten und Datensätze anlegen soll.
2. Kopiere die Adresse unter **KI-Assistenten (MCP)**. Sie besteht aus deiner Flowplan-Adresse und `/api/mcp`, zum Beispiel `https://flowplan.example.com/api/mcp`.
3. Trage beides in deinen Client ein (Beispiele unten). Die Einstellungsseite zeigt für jeden Client eine fertige Konfiguration und setzt ein gerade erstelltes Token gleich ein.
:::
Nimm für jeden Assistenten ein eigenes Token. So siehst du, wann welcher zuletzt zugegriffen hat, und kannst einen widerrufen, ohne die anderen zu treffen.
### Claude Code
```bash
claude mcp add --transport http flowplan https://flowplan.example.com/api/mcp \
--header "Authorization: Bearer fp_…"
```
Mit `--scope user` steht die Verbindung in all deinen Projekten bereit. In Claude Code zeigt `/mcp` die Verbindung und ihre Werkzeuge.
### Claude Desktop
Claude Desktop verbindet sich mit entfernten MCP-Servern, die ein Token verwenden, über die kleine Brücke `mcp-remote`, die Node.js benötigt. Öffne **Einstellungen → Entwickler → Konfiguration bearbeiten**, trage Folgendes in `claude_desktop_config.json` ein und starte Claude neu:
```json
{
"mcpServers": {
"flowplan": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://flowplan.example.com/api/mcp", "--header", "Authorization:${FLOWPLAN_AUTH}"],
"env": { "FLOWPLAN_AUTH": "Bearer fp_…" }
}
}
}
```
Das Token steht in `env` und nicht in `args`: So taucht es nicht in der Prozessliste auf.
### ChatGPT
In ChatGPT gibt es eigene MCP-Konnektoren im **Entwicklermodus**, je nach Tarif und Workspace-Einstellungen. Lege unter **Einstellungen → Apps & Konnektoren** einen neuen Konnektor mit der Adresse `https://flowplan.example.com/api/mcp` an. Bietet ChatGPT eine Anmeldung per Token oder API-Schlüssel an, trage dort `fp_…` ein.
Bietet deine ChatGPT-Version nur OAuth oder „Keine Authentifizierung“ an, kann sich ChatGPT noch nicht mit Flowplan verbinden. Flowplan meldet derzeit nur mit persönlichen Tokens an (siehe [Was unterstützt wird](#was-unterstuetzt-wird)). Schreibe das Token nie als Umweg in die Adresse: Adressen landen in Protokollen.
### Cursor, VS Code, Windsurf und andere
Clients, die Streamable HTTP sprechen und eigene Kopfzeilen erlauben, nutzen diese Konfiguration (die genaue Datei hängt vom Client ab, z. B. `.cursor/mcp.json` oder `.vscode/mcp.json`):
```json
{
"mcpServers": {
"flowplan": {
"type": "http",
"url": "https://flowplan.example.com/api/mcp",
"headers": { "Authorization": "Bearer fp_…" }
}
}
}
```
## Werkzeuge
| Werkzeug | Was es tut | Token |
| --- | --- | --- |
| `list_workspaces` | Deine Arbeitsbereiche mit deiner Rolle und den Bereichen, die du siehst | Lesen |
| `list_pages` | Seiten eines Arbeitsbereichs, optional in einem Bereich oder unter einer Seite | Lesen |
| `search` | Volltextsuche über Seiten, Datensätze, Kommentare und Dateiinhalte; versteht auch #Tag, OR, NOT, created_by:, created:, type:, in:, title: | Lesen |
| `list_collections` | Sammlungen eines Arbeitsbereichs (eigene und geteilte) mit ihrer Abfrage | Lesen |
| `run_collection` | Die Seiten und Datensätze, die jetzt zu einer Sammlung passen, mit deinen Rechten | Lesen |
| `read_page` | Eine Seite als Markdown; Datenbanken mit ihren Datensätzen, Whiteboards mit ihren Racks, Geräten, Ports und Kabeln | Lesen |
| `query_database` | Datensätze mit Eigenschaften nach Namen, Eigenschaftsdefinitionen, Ansichten; Textfilter, eine gespeicherte Ansicht, Blättern | Lesen |
| `get_record` | Ein Datensatz mit allen Eigenschaften und seinem Datensatzdokument | Lesen |
| `my_tasks` | Deine Aufgaben aus Dokumenten und Datensätzen, mit Fälligkeit | Lesen |
| `create_page` | Neues Dokument, neue Datenbank oder neues Whiteboard; Dokumente können mit Markdown-Inhalt beginnen | Schreiben |
| `append_to_page` | Hängt Markdown ans Ende eines Dokuments an | Schreiben |
| `create_record` | Neuer Datensatz; Eigenschaften nach Namen, optional mit Datensatzdokument (`document`, Markdown) | Schreiben |
| `update_record` | Ändert einzelne Eigenschaften und/oder das Datensatzdokument eines Datensatzes | Schreiben |
| `save_collection` | Neue Sammlung anlegen oder Name, Abfrage, Emoji und Teilen ändern | Schreiben |
| `delete_collection` | Sammlung in den Papierkorb legen | Schreiben |
Eigenschaften werden mit ihrem Namen (oder ihrer ID) angegeben. Datumswerte schreibst du als `JJJJ-MM-TT`, Auswahlen mit ihrem Namen, Personen mit E-Mail-Adresse oder Namen und Relationen als Liste von Datensatz-IDs. Text-Eigenschaften (außer dem Titel) sind formatierter Text: `get_database` kennzeichnet sie mit `markdown: true`, gelesen und geschrieben werden sie als Inline-Markdown (`**fett**`, `_kursiv_`, `~~durchgestrichen~~`, `` `Code` ``, `[Text](https://…)`, `\n`; siehe [Formatierter Text](/database-properties#formatierter-text)). `update_record` nimmt die `version` aus `get_record` entgegen: Hat jemand den Datensatz inzwischen geändert, wird die Änderung abgelehnt und nicht überschrieben.
Das Datensatzdokument schreibst du mit `document` als Markdown – beim Anlegen mit `create_record`, später mit `update_record`. `update_record` ersetzt das Dokument; mit `documentMode: "append"` wird der Text am Ende angefügt. Der vorherige Stand bleibt als Version erhalten, und offene Editoren sehen die Änderung sofort.
Außerdem ist jede Seite als **Ressource** `flowplan://page/` abrufbar (deine Favoriten sind aufgelistet). Es gibt zwei **Prompts**: *Seite zusammenfassen* und *Meinen Tag planen*.
### Workflows
Für [Workflows](/workflows) gibt es `list_workflows`, `get_workflow`, `get_workflow_catalog`, `list_workflow_runs`, `get_workflow_run` (lesen) und mit einem Schreib-Token `save_workflow_draft` (Graph-JSON in den Entwurf, auch als neue Workflow-Seite – mit Prüfergebnis), `test_workflow` (Probe- oder Testlauf) und `run_workflow` (nur Workflows mit manuellem Auslöser). **Aktivieren und Freigaben entscheiden gibt es über MCP nicht** – das sind Entscheidungen einer Person über Rechte. Ein Assistent baut also Entwürfe, du prüfst und aktivierst sie in Flowplan.
## Rechte
- Jeder Aufruf handelt als die Person, der das Token gehört, mit **genau ihren Rechten**. Es gelten dieselben Prüfungen wie im Browser: Mitgliedschaft im Arbeitsbereich und Gastzugang, private Bereiche, Seiten- und Gruppenrechte, private Datensätze und mit PIN gesperrte Journale.
- **Lese-Tokens** bieten nur Lese-Werkzeuge an. Ein Schreibaufruf mit einem Lese-Token wird abgelehnt.
- **Schreib-Werkzeuge** führen dieselben Aktionen aus wie die Oberfläche. Automatische Versionen, Erwähnungen und Aufgaben-Benachrichtigungen, Follower, das Aktivitätsprotokoll und [Webhooks](/api-and-webhooks#webhooks) funktionieren also wie gewohnt. Gesperrte Seiten bleiben gesperrt.
- Tokens haben nie Administratorrechte und können keine Tokens anlegen oder widerrufen.
- Die öffentliche Demo hat keinen MCP-Zugang: Demo-Konten können keine Tokens anlegen, und `/api/mcp` nimmt keine Browser-Sitzungen an.
## Sicherheitshinweise
- Behandle das Token wie ein Passwort. Wer es hat, kann alles lesen (und mit einem Schreib-Token ändern), was du kannst. Widerrufe ein Token unter **Einstellungen → API & KI-Assistenten**, wenn du es nicht mehr brauchst oder es in falsche Hände geraten sein könnte; die Verbindung endet sofort.
- KI-Assistenten lassen sich durch Inhalte, die sie lesen, in die Irre führen (Prompt Injection), etwa durch Text auf einer mit dir geteilten Seite. Gib einem Assistenten ein **Lese-Token**, wenn er nicht schreiben muss. Nutze bei einem Schreib-Token die Bestätigungsabfragen des Clients für Werkzeugaufrufe.
- Antworten können alles enthalten, was du in Flowplan lesen kannst. Diese Inhalte gehen an den Anbieter deines Assistenten, prüfe also vorher dessen Datenschutzbedingungen.
- `/api/mcp` nimmt nur Tokens an, nicht das Anmelde-Cookie. Eine fremde Website kann deine Browser-Sitzung deshalb nicht benutzen. Anfragen mit fremdem `Origin` werden abgelehnt.
- Grenzen: 120 Anfragen pro Minute und Person, 2 MB pro Anfrage, und Antworten werden nach 200.000 Zeichen gekürzt. Für Schreib-Werkzeuge gelten dieselben Größengrenzen wie in der Oberfläche.
## Was unterstützt wird
- Transport: **Streamable HTTP** (`POST /api/mcp`, JSON-Antworten, ohne Sitzung). Protokollversionen 2025-06-18, 2025-03-26 und 2024-11-05.
- Anmeldung: persönliche API-Tokens als `Authorization: Bearer fp_…`. Eine Anmeldung per **OAuth** (für Clients, die nur OAuth können) gibt es noch nicht.
- Nicht enthalten: Inhalte löschen, Verwaltung, Dateien und Uploads, Whiteboard-Inhalte.
## Beispiele
- „Such in Flowplan nach dem Angebot für Müller und fasse die offenen Punkte zusammen.“
- „Lies die Seite *Teammeeting* und ergänze einen Abschnitt *Entscheidungen* mit den Ergebnissen von heute.“
- „Zeig meine überfälligen Aufgaben und mach mir einen Plan für heute.“
- „Leg in der Datenbank *Bugs* einen Eintrag an: Titel *Login auf dem iPad hängt*, Status *Offen*, zugewiesen an anna@example.com.“
---
# Flowplan-Doku in deiner KI
Frag Claude, ChatGPT oder deinen Code-Assistenten direkt nach Flowplan: Die Dokumentation gibt es als öffentlichen MCP-Server, als Knopf auf jeder Seite und als Markdown für Sprachmodelle.
Hier geht es um diese **Dokumentation**. Willst du deinem Assistenten Zugriff auf deine eigenen Seiten und Datenbanken in Flowplan geben, lies [MCP: KI-Assistenten](/mcp).
## MCP-Server der Doku
Die Doku ist ein MCP-Server (Model Context Protocol) unter dieser Adresse:
```text
https://docs.flowplan.org/mcp
```
Er ist öffentlich, braucht kein Konto und keinen Schlüssel und kann nur lesen. Dein Assistent sucht damit selbst in der Doku und liest die passenden Seiten, statt aus dem Gedächtnis zu antworten. Er hat drei Werkzeuge:
| Werkzeug | Was es tut |
| --- | --- |
| `search_docs` | Durchsucht alle Seiten – mit derselben Suche wie das Suchfeld hier – und liefert Seiten und Abschnitte mit Adresse und Ausschnitt |
| `get_page` | Liefert eine Seite als Markdown, über ihren Namen (`installation`) oder ihre Adresse |
| `list_pages` | Listet alle Seiten mit Titel, Beschreibung und Bereich |
Jede Seite gibt es auf Englisch und Deutsch. Englisch ist voreingestellt; schreibst du deutsch, nimmt der Assistent meist von selbst die deutschen Seiten.
### Claude
In Claude (im Browser und in der Desktop-App) fügst du den Server als eigenen Connector hinzu:
::: steps
1. Öffne **Einstellungen → Connectors** und wähle **Benutzerdefinierten Connector hinzufügen** (*Add custom connector*).
2. Gib einen Namen ein, zum Beispiel *Flowplan-Doku*, und die Adresse `https://docs.flowplan.org/mcp`.
3. Speichere. Eine Anmeldung ist nicht nötig.
:::
Ob und wie viele eigene Connectors du anlegen kannst, hängt von deinem Plan und bei Teams von den Einstellungen der Organisation ab.
### Claude Code
```bash
claude mcp add --transport http flowplan-docs https://docs.flowplan.org/mcp
```
Mit `--scope user` steht die Doku in all deinen Projekten bereit. `/mcp` zeigt die Verbindung und ihre Werkzeuge.
### Cursor
In `.cursor/mcp.json` im Projekt (oder `~/.cursor/mcp.json` für alle Projekte):
```json
{
"mcpServers": {
"flowplan-docs": {
"url": "https://docs.flowplan.org/mcp"
}
}
}
```
### VS Code
In `.vscode/mcp.json` im Projekt:
```json
{
"servers": {
"flowplan-docs": {
"type": "http",
"url": "https://docs.flowplan.org/mcp"
}
}
}
```
### ChatGPT und andere
In ChatGPT gibt es eigene MCP-Connectors im **Entwicklermodus**, je nach Plan und Einstellungen des Arbeitsbereichs. Lege dort einen neuen Connector mit der Adresse `https://docs.flowplan.org/mcp` an und wähle als Authentifizierung **Keine**. Wo genau das steht, ändert sich gelegentlich; sieh im Zweifel in der Hilfe von ChatGPT nach.
Andere Clients brauchen nur die Adresse: Der Server spricht **Streamable HTTP** und antwortet mit JSON, ohne Sitzung und ohne Anmeldung.
## Knöpfe auf jeder Seite
Unter dem Titel jeder Seite stehen vier Knöpfe:
- **In Claude fragen** und **In ChatGPT fragen** öffnen den Assistenten mit einer fertigen Frage: Er soll die Seite als Markdown lesen und dann deine Fragen dazu beantworten. Die Frage steht in der Adresse des Links – du siehst sie, bevor du sie abschickst.
- **Als Markdown kopieren** legt die ganze Seite als Markdown in die Zwischenablage, zum Einfügen in jeden Chat.
- **Markdown öffnen** zeigt die Seite als Markdown-Text.
Die Knöpfe sind gewöhnliche Links. Die Doku lädt dafür kein Skript von Anthropic oder OpenAI und zählt nicht, wer sie benutzt.
## llms.txt und Markdown
Für Sprachmodelle und eigene Werkzeuge liegt die Doku auch als Text bereit:
| Adresse | Inhalt |
| --- | --- |
| [/de/llms.txt](/de/llms.txt) | Verzeichnis aller Seiten mit Beschreibung und Markdown-Adresse ([llmstxt.org](https://llmstxt.org)) |
| [/de/llms-full.txt](/de/llms-full.txt) | Alle Seiten in einer Datei |
| `/de/installation.md` | Eine Seite als Markdown: Seitenadresse mit `.md` am Ende |
Ohne `/de` sind `llms.txt` und `llms-full.txt` englisch, ebenso `/en/….md`.
## Datenschutz
- Der MCP-Server braucht kein Konto, keinen Schlüssel und keine Cookies.
- Suchanfragen werden beantwortet und nicht gespeichert oder protokolliert.
- Gegen Missbrauch gibt es ein Limit pro Minute. Dafür zählt der Server Anfragen unter einem Prüfwert der IP-Adresse, der sich täglich ändert und nur im Arbeitsspeicher liegt; die IP-Adresse selbst wird nicht gespeichert.
- Was du deinen Assistenten fragst, geht an dessen Anbieter. Dafür gelten dessen Datenschutzbestimmungen.
> [!NOTE]
> Der Server liefert nur, was auch hier steht. Antwortet dein Assistent etwas, das du auf den Seiten nicht findest, frag nach der Quelle – die Werkzeuge geben zu jedem Treffer die Adresse mit.
---
# Block-Erweiterungen
Block-Erweiterungen bringen eigene Blocktypen in den Editor: eine Umfrage, ein Zähler, ein Diagramm aus einer Datenbank, ein Widget eures Teams. Eine Erweiterung ist eine statische Webseite mit einem Manifest. Flowplan zeigt sie abgeschottet in einem Rahmen und spricht nur über Nachrichten mit ihr.
## Für Eigentümer: eine Erweiterung registrieren
::: steps
1. Die Administration gibt die Adresse frei: entweder über `PLUGIN_ALLOWED_ORIGINS` ([Konfiguration](/configuration-integrations#integrationen)) oder mit dem Schalter **Block-Erweiterungen von jeder HTTPS-Adresse** unter **Administration → Erweiterungen & Domains**.
2. Unter **Einstellungen → Block-Erweiterungen** bei **Adresse der Erweiterung** die Adresse eintragen, z. B. `https://plugins.example.org/umfrage/`, und **Registrieren** wählen. Flowplan lädt `flowplan-plugin.json` von dort, prüft es und zeigt die Erweiterung als eigene Karte: welche Blöcke sie bringt und was sie darf, darunter die Schalter **Aktiv** und **Auch auf veröffentlichten Seiten zeigen**. Entfernt wird sie mit dem Papierkorb-Symbol oben in ihrer Karte.
3. Im Editor erscheinen ihre Blöcke im `/`-Menü unter **Erweiterungen**.
:::
Je Erweiterung gibt es:
- **Aktiv** – ausgeschaltet zeigen ihre Blöcke nur noch ihren Text.
- **Auch auf veröffentlichten Seiten zeigen** – ohne diesen Schalter erscheinen ihre Blöcke auf [veröffentlichten Seiten](/sharing#im-web-veroeffentlichen) nur als Text.
- **Datenbanken, die sie lesen darf** – nur wenn sie Datenbankzugriff anfragt.
- **Einstellungen** – so, wie das Manifest sie beschreibt. Alle, die den Block sehen, sehen auch die Einstellungen: keine Passwörter eintragen.
Erneut registrieren lädt das Manifest neu (neue Version, neue Blocktypen). Entfernen lässt die Blöcke in den Dokumenten stehen; sie zeigen dann ihren Text.
## Was eine Erweiterung darf – und was nicht
Der Rahmen hat `sandbox="allow-scripts"` und nie `allow-same-origin`. Die Erweiterung läuft also in einem eigenen, anonymen Ursprung:
- Sie liest weder Cookies noch Speicher von Flowplan und kann die Seite drumherum nicht verändern.
- Sie kennt weder Namen noch E-Mail-Adresse der lesenden Person.
- Formulare, Pop-ups und das Umleiten der ganzen Seite sind blockiert.
- Alle Nachrichten werden geprüft: Absender (genau dieser Rahmen), Form (zod-Schema), Nonce aus dem Handschlag. Mehr als 60 Nachrichten pro Sekunde werden verworfen.
- Höhe: Die Erweiterung wünscht sich eine Höhe; Flowplan hält sie zwischen 40 px und dem `maxHeight` des Manifests (höchstens 2000 px).
Berechtigungen, die ein Manifest anfragen kann:
| Berechtigung | Bedeutung |
| --- | --- |
| `read:page` | Titel der Seite, auf der der Block steht. |
| `read:selection` | Der im Editor markierte Text. |
| `write:block` | Eigene Daten im Block speichern (JSON, höchstens 64 KB) – nur für Personen mit Bearbeitungsrechten. |
| `read:database:` | Einträge genau dieser Datenbank lesen (ID der Datenbankseite). |
| `read:database` | Einträge der Datenbanken lesen, die ein Eigentümer beim Registrieren auswählt. |
Datenbankabfragen laufen immer mit den Rechten der lesenden Person: private Einträge und Eigenschaften mit Leseregel bleiben verborgen. Auf veröffentlichten Seiten gibt es keine Datenbankabfragen, und Blöcke sind dort immer nur lesbar.
Der Text, den eine Erweiterung mit ihren Daten übergibt, landet in der Suche und im Markdown-Export. Im Export steht statt des Rahmens ein Link auf die Erweiterung.
## Für Entwickler: eine Erweiterung bauen
Eine Erweiterung besteht aus statischen Dateien über HTTPS. Ein vollständiges Beispiel (Zähler und Umfrage) liegt im Repository unter `examples/plugin-hello/`.
### Das Manifest
`flowplan-plugin.json` neben der Einstiegsseite:
```json
{
"name": "Hello Flowplan",
"version": "1.0.0",
"description": "A counter and a small poll",
"entry": "index.html",
"blocks": [
{ "type": "counter", "label": "Zähler", "icon": "🔢", "description": "A number to count up" },
{ "type": "poll", "label": "Umfrage", "icon": "📊", "entry": "poll.html" }
],
"permissions": ["read:page", "write:block"],
"size": { "height": 160, "maxHeight": 600 },
"settings": {
"step": { "type": "number", "label": "Counter step", "default": 1 }
}
}
```
| Feld | Regel |
| --- | --- |
| `name` | 1–60 Zeichen. |
| `version` | `1.2.3`, optional mit Zusatz (`1.2.3-beta.1`). |
| `entry` | Relativer Pfad zur Seite im Rahmen (Standard `index.html`); kein `..`, keine andere Adresse. |
| `blocks` | 1–20 Blocktypen: `type` aus Kleinbuchstaben, Ziffern und `-`; `label`; optional `icon` (Emoji), `description` und ein eigenes `entry`. |
| `permissions` | Siehe oben. |
| `size` | Starthöhe `height` und `maxHeight` in Pixeln (40–2000). |
| `settings` | Bis zu 20 Einstellungen: `string`, `number` oder `boolean` mit `label` und `default`. |
Das Manifest darf nicht auf eine andere Adresse umleiten und höchstens 64 KB groß sein.
### Sicherheitskopfzeilen
Liefere die Seite mit einer strengen Content Security Policy aus, zum Beispiel:
```
Content-Security-Policy: default-src 'none'; script-src 'self'; style-src 'self'; img-src 'self' data:; connect-src 'none'
```
`connect-src 'none'` stellt sicher, dass Blockdaten den Rahmen nicht verlassen. Braucht die Erweiterung einen eigenen Server, nenne ihn dort ausdrücklich.
### Das Nachrichtenprotokoll
Alle Nachrichten sind Objekte mit `protocol: "flowplan-plugin/1"`. Flowplan sendet nach dem Laden:
```js
{ protocol: "flowplan-plugin/1", type: "init", nonce, blockType, readOnly, permissions, settings }
```
Ab dann trägt jede Nachricht der Erweiterung diese `nonce`. Antworte zuerst mit `ready`; Flowplan schickt dann die gespeicherten Daten als `data`.
| Von der Erweiterung | Felder | Antwort |
| --- | --- | --- |
| `ready` | – | `data` mit den gespeicherten Daten |
| `resize` | `height` | – (Höhe wird begrenzt) |
| `getData` | `id` | `response` mit `result` = Daten |
| `setData` | `id`, `data`, optional `text` (Suchtext, bis 2000 Zeichen) | `response`; Fehler `read-only`, `permission:write:block` oder `too-large` |
| `getContext` | `id` | `response` mit `theme`, `locale`, `readOnly`, `blockType`, `page.title` (mit `read:page`), `selection` (mit `read:selection`) |
| `query` | `id`, `databaseId`, optional `limit` (1–200) | `response` mit `fields` und `rows`; Fehler `public` oder `permission:read:database:` |
Antworten haben die Form `{ protocol, nonce, type: "response", id, ok: true, result }` oder `{ …, ok: false, error }`. Ändern andere die Daten (gleichzeitige Bearbeitung, Rückgängig), kommt erneut `data`.
Ein Minimalbeispiel:
```js
const PROTOCOL = "flowplan-plugin/1";
let nonce = null;
const send = (message) => parent.postMessage({ protocol: PROTOCOL, nonce, ...message }, "*");
addEventListener("message", (event) => {
if (event.source !== parent || event.data?.protocol !== PROTOCOL) return;
const message = event.data;
if (message.type === "init" && !nonce) {
nonce = message.nonce;
send({ type: "ready" });
} else if (message.nonce === nonce && message.type === "data") {
document.body.textContent = JSON.stringify(message.data);
send({ type: "resize", height: document.documentElement.scrollHeight });
}
});
```
Nachrichten an Flowplan gehen mit dem Ziel `"*"` hinaus: Der Rahmen hat keinen eigenen Ursprung, den Flowplan nennen könnte. Flowplan erkennt die Absender am Rahmen und an der Nonce.
### Ausprobieren
::: steps
1. `examples/plugin-hello/` über HTTPS ausliefern (etwa hinter dem Reverse Proxy).
2. `PLUGIN_ALLOWED_ORIGINS=https://plugins.example.org` setzen und Flowplan neu starten.
3. Als Eigentümer `https://plugins.example.org/plugin-hello/` registrieren und im Editor `/zähler` tippen.
:::
---
# Installation mit Docker
Flowplan läuft als ein einziger Container mit SQLite und einem Datenverzeichnis. Postgres, Redis oder ein separater Suchdienst werden nicht gebraucht – PostgreSQL und mehrere Instanzen sind möglich, aber optional.
[](/screenshots/architecture-de-light.webp)
**Mehr zum Thema:** [Mit einem Klick bereitstellen](/one-click-deploy)
## Voraussetzungen
- Ein Server mit Docker und einem dauerhaften Volume. Die Texterkennung gescannter PDFs braucht beim Hochladen kurzzeitig spürbar CPU.
- Schon eine Instanz auf einem anderen Server? Dann nach der Installation [umziehen](/move-instance) statt neu anfangen.
- Eine Domain mit HTTPS über einen Reverse Proxy (Traefik, Caddy, nginx, Coolify, Pangolin …). Zum reinen Ausprobieren geht es auch ohne, siehe [Ohne HTTPS](#ohne-https).
- Optional ein OpenID-Connect-Anbieter für Single Sign-on. Ohne ihn melden sich Personen mit E-Mail und Passwort oder Passkey an, siehe [Anmeldung](/sign-in).
- Optional: ein S3-kompatibler Speicher für Dateien und die laufende Datenbanksicherung, siehe [Speicher, S3 und Sicherung](/storage-and-backups).
- Optional: eine PostgreSQL-Datenbank statt SQLite, siehe [PostgreSQL](/postgresql). Wie viel Hardware du für wie viele Personen brauchst, steht unter [Dimensionierung](/sizing).
## Mit Docker Compose
Flowplan ist Open Source (AGPL-3.0). Das fertige Image liegt in der GitHub Container Registry, für `linux/amd64` und `linux/arm64`:
| Tag | Inhalt |
| --- | --- |
| `ghcr.io/yannicschuller/flowplan:latest` | Neueste Version (Release) |
| `ghcr.io/yannicschuller/flowplan:0.7.0` | Feste Version (derzeit 0.7.0), auch als `:0.7` und `:0` |
| `ghcr.io/yannicschuller/flowplan:beta` | Letzter manuell gestarteter Entwicklungsstand oder ein neueres Release – zum Ausprobieren, nicht für den Betrieb |
::: steps
1. Compose-Datei und Beispielkonfiguration herunterladen:
```bash
mkdir flowplan && cd flowplan
curl -O https://raw.githubusercontent.com/yannicschuller/flowplan/main/compose.yaml
curl -o .env https://raw.githubusercontent.com/yannicschuller/flowplan/main/.env.example
```
2. In `.env` mindestens die öffentliche Adresse setzen:
```dotenv
APP_URL=https://flowplan.example.com
# Empfohlen, sobald die Adresse aus dem Internet erreichbar ist: openssl rand -hex 24
FLOWPLAN_SETUP_TOKEN=
```
Mit `FLOWPLAN_SETUP_TOKEN` legst du das erste Konto über `https://flowplan.example.com/register?setup=` an; ohne den Link bietet die neue Instanz weder Registrierung noch Wiederherstellen an. Fehlt der Token und ist `APP_URL` keine lokale Adresse, warnt Flowplan beim Start im Log und auf dem Einrichtungsbildschirm.
Für Single Sign-on zusätzlich `OIDC_ISSUER`, `OIDC_CLIENT_ID`, `OIDC_CLIENT_SECRET` und `OIDC_ADMIN_GROUP` (siehe [Anmeldung](/sign-in)); für E-Mails (Einladungen, Passwort vergessen) die `SMTP_*`-Werte aus der [Konfiguration](/configuration-integrations#e-mail-smtp).
3. Starten:
```bash
docker compose up -d
```
:::
Der Container lauscht auf Port `3000` (in der Compose-Datei nur an `127.0.0.1` gebunden, damit der Proxy davor sitzt). Das Volume `flowplan-data` auf `/app/data` hält alle Inhalte unabhängig vom Container. Eine feste Version wählst du mit `FLOWPLAN_VERSION=0.7.0` in der `.env`.
> [!NOTE]
> Eine Instanz öffnet direkt mit der Anmeldung. Die Webseite [flowplan.org](https://flowplan.org) und diese Dokumentation sind eigene Projekte; die gehostete Instanz läuft unter [app.flowplan.org](https://app.flowplan.org).
## Image selbst bauen
Aus dem Quellcode ([github.com/yannicschuller/flowplan](https://github.com/yannicschuller/flowplan)):
```bash
git clone https://github.com/yannicschuller/flowplan.git && cd flowplan
cp .env.example .env
docker compose up -d --build
```
Oder ohne Compose:
```bash
docker build -t flowplan:latest .
docker run -d --name flowplan \
-p 127.0.0.1:3000:3000 \
-v flowplan-data:/app/data \
--env-file .env \
flowplan:latest
```
Build-Argumente: `PG_CLIENT_MAJOR` (Standard `18`) wählt die Version von `pg_dump`, `pg_restore` und `psql` im Image – mindestens die Hauptversion deines PostgreSQL-Servers ([PostgreSQL](/postgresql)). `FLOWPLAN_SKIP_TYPECHECK=1` ist nur für die Entwicklung gedacht: Es überspringt die TypeScript-Prüfung beim Build, wenn sie wie in unserem CI schon gelaufen ist.
Das Image enthält Node, Litestream für die S3-Sicherung und `curl` für den Healthcheck. Flowplan läuft darin als UID 1000 (Benutzer `node`) oder als der Benutzer aus `PUID`/`PGID` – nie als root ([Volume-Rechte](/coolify-and-proxy#volume-rechte)).
## Erster Start
::: steps
1. `https://flowplan.example.com/api/health` aufrufen – die Antwort ist `200` mit `"status":"ok"`.
2. Die Adresse im Browser öffnen: Eine neue Instanz bietet **Konto erstellen** an. Dieses erste Konto verwaltet die Instanz. Ist die Adresse aus dem Internet erreichbar, setze vorher `FLOWPLAN_SETUP_TOKEN` und lege das Konto über `/register?setup=` an – sonst könnte dir jemand zuvorkommen ([Anmeldung](/sign-in#e-mail-und-passwort)). (Mit Single Sign-on: **Mit SSO anmelden**; Admin ist, wer in der Gruppe aus `OIDC_ADMIN_GROUP` ist.)
3. In der Seitenleiste unter **Administration** Instanzname, Upload-Grenze, Registrierung und die [weiteren Einstellungen](/administration) setzen.
:::
**Umzug oder Neuinstallation?** Statt des ersten Kontos bietet der Einrichtungsbildschirm **Aus Sicherung wiederherstellen**: eine Sicherungsdatei hochladen oder die neueste Sicherung aus S3 oder per SFTP holen, verschlüsselte mit dem Schlüssel der alten Instanz. Danach meldest du dich mit den Konten der Sicherung an ([Beim Einrichten wiederherstellen](/storage-and-backups#beim-einrichten-wiederherstellen)). Für einen Umzug von einer laufenden Instanz gibt es außerdem [Instanz umziehen](/move-instance).
> [!WARNING]
> Mit SQLite läuft **genau eine Instanz**. Mehrere Replikate würden dieselbe SQLite-Datei beschreiben. Nicht einfach horizontal skalieren; bei Updates den alten Container vor dem neuen stoppen. Mehrere Instanzen gehen nur im [Cluster-Modus](/cluster) mit PostgreSQL, Redis und S3.
## Ohne HTTPS
Nur zum Ausprobieren: Flowplan läuft auch unter einer reinen `http://`-Adresse, etwa `APP_URL=http://192.168.1.20:3000` im eigenen Netz. `APP_URL` muss dann genau diese Adresse sein – mit `http://` und Port.
Die Anmeldeseite und **Administration → Instanz** zeigen dann den Hinweis „Diese Instanz läuft ohne HTTPS“. Für einen Test ist das in Ordnung, für den echten Betrieb nicht:
- **Passwörter gehen unverschlüsselt durchs Netz** – jeder im selben Netz kann sie mitlesen.
- **Passkeys, die Offline-Kopie, Push sowie Kamera, Mikrofon und Zwischenablage** gibt es im Browser nur über HTTPS. Flowplan blendet sie dann aus oder sagt, warum sie fehlen.
- **Die Apps für iPhone, iPad und Android** verbinden sich ohne HTTPS nur mit einer Instanz im lokalen Netz (z. B. `http://192.168.1.20:3000`, `http://nas` oder `http://nas.local`) und warnen vorher. Auf iPhone und iPad gehen `.lan`- oder `.home.arpa`-Namen nicht – dort die IP-Adresse eintragen. Siehe [Instanz im eigenen Netz ohne HTTPS](/mobile-apps#instanz-im-eigenen-netz-ohne-https).
- Cookies tragen kein `Secure`-Kennzeichen, und der Browser stuft Anfragen nicht auf HTTPS hoch.
Unter `http://localhost` oder `http://127.0.0.1` auf dem eigenen Rechner erscheint kein Hinweis: Browser behandeln diese Adressen wie eine sichere Verbindung.
Für den echten Betrieb einen Reverse Proxy mit Zertifikat davorsetzen (siehe [Coolify und Reverse Proxy](/coolify-and-proxy)) und `APP_URL` auf die `https://`-Adresse umstellen. Mit Caddy reichen zwei Zeilen; Caddy holt das Zertifikat selbst.
> [!NOTE]
> Bis 0.8.0 verlangte Flowplan HTTPS stillschweigend: Unter einer `http://`-Adresse fehlten Gestaltung und Skripte, und das Registrierungsformular blieb einfach stehen. Das ist behoben – Formulare mit Passwort senden außerdem nie mehr Zugangsdaten in der Adresszeile.
## Aktualisieren
Gibt es ein neueres Release, zeigt die **Administration** einen Hinweis mit der neuen Versionsnummer und einem Link zu den Änderungen (abschaltbar mit `FLOWPLAN_UPDATE_CHECK=false`, siehe [Konfiguration](/configuration)). Mit dem Image-Tag `:latest` genügt dann:
```bash
docker compose pull
docker compose up -d
```
Beim selbst gebauten Image stattdessen `git pull` und `docker compose up -d --build`.
Beim Start migriert Flowplan die Datenbank selbst. Vorher eine Sicherung anlegen (siehe [Speicher, S3 und Sicherung](/storage-and-backups)); ein Zurückgehen auf eine ältere Version nach einer Migration ist nicht vorgesehen.
Nach dem Update sieht jede Person beim nächsten Öffnen von Flowplan einmal **Neu in Flowplan**: die Versionshinweise aller Versionen seit der, die sie zuletzt gesehen hat – die neueste aufgeklappt, ältere zugeklappt, gegliedert in **Breaking Changes**, **Sicherheit**, **Neu**, **Verbessert** und **Fehlerbehebungen**; Breaking Changes stehen hervorgehoben oben. **Schließen** (oder Esc) und **Einstellungen** blenden den Dialog für diese Version aus. Die Hinweise sind Teil des Images: Flowplan fragt dafür nicht im Internet nach. Neue Konten beginnen bei der laufenden Version und sehen keine älteren Hinweise; Konten aus der Zeit vor 0.9.4 sehen nach dem Update auf 0.9.4 nur dessen Hinweise. Beta-Images (`:beta`) zeigen die Hinweise bis zu der Version, die sie melden – die Hinweise des kommenden Release erst mit diesem. Was jemand zu sehen bekommt, stellt er unter **Einstellungen → Darstellung & Sprache → Neuigkeiten nach Updates** ein ([Hell und dunkel](/offline-and-apps#hell-und-dunkel)), den Standard für neue Konten legen Admins unter **Administration → Instanz** fest ([Instanz](/administration#instanz)). Die vollständige Liste aller Änderungen steht im [Changelog auf GitHub](https://github.com/yannicschuller/flowplan/blob/main/CHANGELOG.md).
### Auf 0.7.0 aktualisieren
Von Hand ist nichts zu tun; die neuen Tabellen (etwa für Idempotenz-Schlüssel und den Push-Relay) legt Flowplan beim Start an. Was sich für den Betrieb ändert:
- **API-Beschreibung nur noch mit Anmeldung:** `/api/openapi.json` und `/api/docs` brauchen eine Anmeldung oder ein API-Token. Öffentlich wie bisher mit `FLOWPLAN_PUBLIC_API_DOCS=true` (siehe [OpenAPI und SDKs](/openapi)).
- **Gesundheitsprüfung knapper:** `/api/health` antwortet ohne Token nur noch mit `{"service":"flowplan","status":"ok"}`; Details gibt es mit `FLOWPLAN_METRICS_TOKEN` (siehe [Healthcheck](/operations#healthcheck)).
- **Push an die Apps über den Push-Relay:** Benachrichtigungen an die Apps laufen Ende-zu-Ende-verschlüsselt über `push.flowplan.org`. Dafür muss `APP_URL` die öffentliche HTTPS-Adresse sein und ausgehendes HTTPS zum Relay möglich – siehe [Push-Relay](/configuration-ai-push#push-relay-und-ende-zu-ende-verschluesselung).
- **Nutzungsstatistik:** Die Überwachung zählt Anfragen, aktive Personen und Speicher – nur Zahlen. Abschalten mit `FLOWPLAN_METRICS=off` oder in der Administration (siehe [Statistik](/monitoring#statistik)).
## Kubernetes (Helm)
Das Chart liegt im Repository unter [`deploy/helm/flowplan`](https://github.com/yannicschuller/flowplan/tree/main/deploy/helm/flowplan). Flowplan läuft dort als **genau ein Pod** (SQLite) mit einem Volume für `/app/data`; Updates ersetzen den Pod mit kurzer Unterbrechung (Strategie `Recreate`). Das Chart (Version 0.1.0) installiert Flowplan 0.7.0 (`appVersion`); eine andere Version wählst du mit `--set image.tag=…`.
```bash
kubectl create namespace flowplan
kubectl -n flowplan create secret generic flowplan-env \
--from-literal=FLOWPLAN_ENCRYPTION_KEY="$(openssl rand -base64 32)"
helm install flowplan deploy/helm/flowplan -n flowplan \
--set appUrl=https://flowplan.example.org \
--set existingSecret=flowplan-env \
--set ingress.enabled=true \
--set ingress.hosts[0].host=flowplan.example.org
```
- OIDC, SMTP und S3 setzt du über `oidc.*`, `smtp.*` und `s3.*`; Geheimnisse besser im `existingSecret` (Schlüssel = Namen der [Umgebungsvariablen](/configuration)). Weitere Variablen über `env`.
- `appUrl` ist Pflicht (oder kommt aus dem ersten Ingress-Host).
- Das Chart erzeugt einen zufälligen `FLOWPLAN_SETUP_TOKEN` (bleibt bei Upgrades erhalten; eigener Wert mit `setupToken` oder im `existingSecret`). Das erste Konto legst du über den Einrichtungslink an, den `helm install` am Ende ausgibt: `https://flowplan.example.org/register?setup=`, den Token liest `kubectl -n flowplan get secret flowplan -o jsonpath='{.data.FLOWPLAN_SETUP_TOKEN}' | base64 -d`.
- Ein Block- oder lokales Volume verwenden, kein NFS (SQLite).
- Health-Checks laufen über `/api/health`; der Pod läuft als Nutzer 1000 ohne zusätzliche Rechte. `helm test flowplan` prüft die Erreichbarkeit.
- Das Volume bleibt beim Deinstallieren erhalten.
- Aktualisieren: im Repository `git pull`, dann `helm upgrade flowplan deploy/helm/flowplan -n flowplan --reuse-values`.
Alle Werte erklärt das README des Charts. Mehrere Pods mit PostgreSQL, Redis und S3 (`cluster.enabled=true`): siehe [Cluster-Modus](/cluster#kubernetes-helm). Die Datenbankrolle in `DATABASE_URL` sollte dabei die Datenbank besitzen, aber kein Superuser sein ([Rolle ohne Superuser-Rechte](/postgresql#rolle-ohne-superuser-rechte)).
## Ohne Docker
Node.js 22.13 oder neuer (Node 24 LTS empfohlen):
```bash
npm ci
npm run build
FLOWPLAN_DATA_DIR=/var/lib/flowplan npm start
```
Für die lokale Entwicklung reicht `npm run dev`. Der Entwicklungsmodus bietet zusätzlich **Lokalen Arbeitsbereich öffnen** an, ein gemeinsames Beispielkonto; im Produktionsmodus gibt es diesen Zugang nicht.
## Weiter
- [Konfiguration](/configuration): alle Umgebungsvariablen.
- [Coolify und Reverse Proxy](/coolify-and-proxy): Betrieb hinter Traefik, Coolify oder Pangolin.
- [Instanz umziehen](/move-instance): auf einen anderen Server, mit Beispiel für Hetzner Cloud.
- [PostgreSQL](/postgresql) und [Cluster-Modus](/cluster): für größere Teams.
---
# Mit einem Klick bereitstellen
Noch kein eigener Server? Drei Wege zu einer laufenden Instanz, ohne Docker von Hand einzurichten. Alle nutzen dasselbe Image wie die Compose-Datei weiter unten.
| Weg | Daten | HTTPS und Adresse |
| --- | --- | --- |
| [Render](#render) | SQLite auf einer dauerhaften Disk | Automatisch, `https://.onrender.com` oder deine Domain |
| [DigitalOcean App Platform](#digitalocean-app-platform) | PostgreSQL (Dev-Datenbank), Dateien in einem Spaces-Bucket | Automatisch, `https://.ondigitalocean.app` oder deine Domain |
| [Jeder Server](#jeder-server-cloud-init-oder-installationsskript) (Hetzner, Netcup, IONOS …) | SQLite in einem Docker-Volume auf dem Server | Caddy mit einem Let's-Encrypt-Zertifikat für deine Domain |
## Render
**[Bei Render bereitstellen →](https://render.com/deploy?repo=https://github.com/yannicschuller/flowplan)**
Der Button liest den Blueprint [`render.yaml`](https://github.com/yannicschuller/flowplan/blob/main/render.yaml) aus dem Repository: ein Webdienst aus dem Image `ghcr.io/yannicschuller/flowplan:latest` in Frankfurt, eine 5-GB-Disk auf `/app/data` und der Health Check auf `/api/health`.
::: steps
1. Button anklicken, bei Render anmelden und den Blueprint bestätigen. Die SMTP-Felder dürfen leer bleiben (siehe [E-Mail](/configuration-integrations#e-mail-smtp)).
2. Render erzeugt `FLOWPLAN_SETUP_TOKEN`. Ist der Deploy fertig, kopierst du ihn im Tab **Environment** des Dienstes und öffnest `https://.onrender.com/register?setup=` – dieses erste Konto verwaltet die Instanz.
:::
**Kosten:** Dauerhafte Disks gibt es nur mit einer bezahlten Instanz – der Blueprint nimmt **Starter**, die kleinste mit Disk; die Disk wird zusätzlich pro GB abgerechnet (siehe Preise bei Render). Für mehr als eine Handvoll Personen wähl eine größere Instanz ([Dimensionierung](/sizing)). Auf der kostenlosen Instanz gingen die Daten bei jedem Neustart verloren.
**Adresse:** Ohne `APP_URL` nimmt Flowplan Renders eigene Adresse (`RENDER_EXTERNAL_URL`, ersatzweise `https://` mit `RENDER_EXTERNAL_HOSTNAME`). Für deine Domain trägst du sie unter **Settings → Custom Domains** ein und setzt unter **Environment** `APP_URL=https://flowplan.example.com` – am besten vor dem ersten Konto, denn Passkeys sind an die Adresse gebunden.
**Daten und Updates:** Alles liegt auf der Disk – einen Dienst mit Disk betreibt Render als genau eine Instanz und hält ihn bei jedem Deploy kurz an. Render hebt Snapshots der Disk auf; für Sicherungen außerhalb von Render kommt S3 dazu ([Speicher, S3 und Sicherung](/storage-and-backups)). Zum Aktualisieren startest du einen **Manual Deploy**: Render holt das Image `:latest` neu.
## DigitalOcean App Platform
**[Bei DigitalOcean bereitstellen →](https://cloud.digitalocean.com/apps/new?repo=https://github.com/yannicschuller/flowplan/tree/main)**
Der Button liest [`.do/deploy.template.yaml`](https://github.com/yannicschuller/flowplan/blob/main/.do/deploy.template.yaml): ein Dienst aus dem Image, eine PostgreSQL-16-Dev-Datenbank und der Health Check auf `/api/health`, in Frankfurt (`fra`).
App Platform hat **keine dauerhaften Volumes**: Die Disk des Containers wird bei jedem Deploy und Neustart zurückgesetzt. Deshalb nutzt die Vorlage PostgreSQL statt SQLite (`DATABASE_URL` zeigt auf die Datenbank) und erwartet einen Bucket für Dateien:
- **Uploads:** Leg einen Spaces-Bucket und einen Spaces-Zugangsschlüssel an und trag `S3_BUCKET`, `S3_ACCESS_KEY_ID` und `S3_SECRET_ACCESS_KEY` ein (`S3_ENDPOINT` ist für Frankfurt vorbelegt, `https://fra1.digitaloceanspaces.com`). Flowplan legt dann jede Datei in den Bucket und holt fehlende nach einem Deploy von dort zurück. **Ohne Bucket gehen hochgeladene Dateien beim nächsten Deploy verloren.**
- **`FLOWPLAN_SETUP_TOKEN`** (erzeugen mit `openssl rand -hex 24`): das erste Konto nur über `/register?setup=`.
- **`FLOWPLAN_ENCRYPTION_KEY`** (erzeugen mit `openssl rand -base64 32`): verschlüsselt die Dateien im Bucket und schützt gespeicherte Geheimnisse wie API-Schlüssel. Er muss hier gesetzt sein, weil eine `secrets.key` auf der Disk des Containers bei jedem Deploy neu entstünde. Bewahr eine Kopie im Passwortmanager auf.
- Optional `WEB_PUSH_PUBLIC_KEY` und `WEB_PUSH_PRIVATE_KEY` (`npx web-push generate-vapid-keys`): Ohne sie entstehen bei jedem Deploy neue Schlüssel, und Push im Browser schweigt, bis man ihn wieder einschaltet. Push an die Apps ist davon nicht betroffen.
App Platform kann keine Geheimnisse selbst erzeugen, deshalb trägst du diese Werte beim Anlegen der App ein (oder später in den **Settings → Environment Variables** der Komponente). `APP_URL` ist App Platforms `${APP_URL}`: die Adresse unter `ondigitalocean.app` oder deine Domain, sobald du sie unter **Settings → Domains** eingetragen hast – danach einmal neu deployen.
**Datenbank:** Eine Dev-Datenbank hat **keine Sicherungen** und ist zum Ausprobieren gedacht. Für den Betrieb rüstest du sie zu einem verwalteten Datenbank-Cluster auf oder hängst einen vorhandenen mit PostgreSQL 16 oder neuer an ([PostgreSQL](/postgresql)). Das Image bringt `pg_dump` und `pg_restore` mit, Flowplans eigene geplante Sicherungen laufen also auch mit PostgreSQL – mit Bucket landen sie dort ([Speicher, S3 und Sicherung](/storage-and-backups)). Die Verbindung ist verschlüsselt; `uselibpqcompat=true` in `DATABASE_URL` akzeptiert DigitalOceans eigene Zertifizierungsstelle, so wie `psql` mit `sslmode=require`. Meldet das Log `permission denied for schema public`, darf die Rolle der Dev-Datenbank keine Tabellen anlegen – dann einen verwalteten Datenbank-Cluster nehmen, dort darf es der Eigentümer der Datenbank ([Rolle ohne Superuser-Rechte](/postgresql#rolle-ohne-superuser-rechte)).
**Updates:** Starte einen neuen Deploy (**Actions → Force Rebuild and Deploy**); App Platform holt das Image `:latest` neu.
## Jeder Server: cloud-init oder Installationsskript
Für einen virtuellen Server (VPS) mit **Ubuntu 24.04 oder Debian 12** bei einem beliebigen Anbieter. Die meisten – Hetzner Cloud, Netcup, IONOS, DigitalOcean Droplets, Vultr, Scaleway, OVHcloud – nehmen beim Anlegen des Servers eine cloud-init-Datei als **„User Data“** oder **„Cloud Config“** an.
::: steps
1. Den DNS-Eintrag deiner Domain (A, für IPv6 auch AAAA) auf den Server zeigen lassen – bei einem neuen Server, sobald du seine Adresse kennst.
2. [`deploy/cloud-init.yaml`](https://github.com/yannicschuller/flowplan/blob/main/deploy/cloud-init.yaml) kopieren, die eine Zeile `FLOWPLAN_DOMAIN=flowplan.example.com` setzen und beim Anlegen des Servers als User Data einfügen.
3. Nach ein paar Minuten per SSH anmelden und `/root/flowplan-README.txt` lesen: Dort stehen die Adresse und der Link für das erste Konto. Den Fortschritt protokolliert `/var/log/flowplan-install.log`.
:::
Auf einem Server, der schon läuft, erledigt das Installationsskript dasselbe:
```bash
curl -fsSL https://raw.githubusercontent.com/yannicschuller/flowplan/main/deploy/install.sh | sudo bash -s -- flowplan.example.com
```
Was das Skript einrichtet:
- **Docker** mit dem Compose-Plugin aus Dockers eigenem Paket-Repository (übersprungen, wenn es schon da ist).
- **`/opt/flowplan`** mit `compose.yaml` (Flowplan und [Caddy](https://caddyserver.com), das sich das HTTPS-Zertifikat selbst holt und erneuert), dem `Caddyfile` und einer `.env`, die nur root lesen darf. Ihre Geheimnisse erzeugt `openssl` auf dem Server: `FLOWPLAN_SETUP_TOKEN` und `FLOWPLAN_ENCRYPTION_KEY` – bewahr eine Kopie des Schlüssels im Passwortmanager auf, verschlüsselte Sicherungen lassen sich ohne ihn nicht lesen.
- **Die Daten** im Docker-Volume `flowplan-data`. Sie überstehen Updates und Neustarts; für Sicherungen außerhalb des Servers kommt S3 oder SFTP dazu ([Speicher, S3 und Sicherung](/storage-and-backups)).
- **Firewall** (ufw): Nur SSH, 80 und 443 bleiben offen. Auf einem Server mit eigener Firewall startest du das Skript mit `FLOWPLAN_FIREWALL=off`. Die Ports 80 und 443 müssen frei sein – belegt sie schon ein anderer Webserver, stell Flowplan stattdessen hinter ihn ([Coolify und Reverse Proxys](/coolify-and-proxy)).
- **Automatische Sicherheitsupdates** des Systems (unattended-upgrades).
- **Image-Updates sind anfangs aus:** Du aktualisierst, wann es dir passt, mit `cd /opt/flowplan && docker compose pull && docker compose up -d` – die Administration meldet neue Releases. Für ein automatisches Update jede Woche (Sonntagnacht) setzt du `FLOWPLAN_AUTO_UPDATE=weekly` in der cloud-init-Datei (oder vor `bash` im Befehl) oder später `systemctl enable --now flowplan-update.timer`.
**Ohne Domain** (`FLOWPLAN_DOMAIN=` leer gelassen oder das Skript ohne Argument) startet Flowplan unter `http://` ohne Zertifikat – gut für einen Test, siehe [Ohne HTTPS](/installation#ohne-https). Für eine Domain später den DNS-Eintrag auf den Server zeigen lassen und das Skript mit der Domain erneut ausführen: Es setzt `APP_URL` und das `Caddyfile` und behält Daten und Geheimnisse. Am besten vor dem ersten Konto, denn Passkeys sind an die Adresse gebunden.
Weitere Einstellungen (E-Mail, Single Sign-on, S3) gehören in `/opt/flowplan/.env`, danach `docker compose up -d` in `/opt/flowplan` – siehe [Konfiguration](/configuration).
---
# Coolify und Reverse Proxy
Flowplan braucht vor sich nur einen HTTPS-Proxy. WebSockets sind nicht nötig: Zusammenarbeit läuft über normale HTTP-Anfragen und Server-Sent Events.
## Coolify
::: steps
1. **Neue Ressource → Docker Image** (oder **Dockerfile** aus dem Git-Repository) wählen.
2. **Ports Exposes**: `3000`.
3. Domain eintragen, z. B. `https://flowplan.example.com`. Coolify holt das Zertifikat über Traefik.
4. **Persistent Storage**: Volume, Ziel `/app/data`.
5. Umgebungsvariablen aus der [Konfiguration](/configuration) setzen.
6. Bereitstellen. Nach etwa 20 Sekunden meldet der Healthcheck den Container als gesund.
:::
### Healthcheck
Das Image bringt einen eigenen Healthcheck mit. Wird er in Coolify eingestellt:
| Feld | Wert |
| --- | --- |
| Check type | HTTP request |
| Method / Scheme / Host | `GET` / `HTTP` / `localhost` |
| Port | `3000` – leer bedeutet 80, dort lauscht nichts |
| Path | `/api/health` |
| Expected code | `200` |
| Start period | `30` Sekunden (mit S3 stellt Litestream beim ersten Start die Datenbank her) |
Flowplan sendet keinen `X-Powered-By`-Header. Der Healthcheck braucht nur den Statuscode; seine Details sind ohne Token nicht öffentlich (siehe [Healthcheck](/operations#healthcheck)).
### Volume-Rechte
Flowplan läuft standardmäßig als UID 1000 (Benutzer `node`). Ein neues Docker-Volume bekommt die Rechte automatisch. Für einen eingebundenen Host-Ordner, der jemand anderem gehört, setzt du `PUID` und `PGID` – wie bei den Images von linuxserver.io, ohne `user:`:
```yaml
services:
flowplan:
image: ghcr.io/yannicschuller/flowplan:latest
environment:
PUID: "1001"
PGID: "1001"
volumes:
- /pfad/zu/flowplan-data:/app/data
```
Beim Start gibt Flowplan als Erstes den Datenordner `PUID:PGID` und startet die App dann als dieser Benutzer – nie als root. `chown` läuft nur, wenn der Ordner oder etwas direkt darin noch jemand anderem gehört – also einmal, nicht bei jedem Start. `PGID` ist ohne Angabe gleich `PUID`; beide müssen Zahlen größer als 0 sein (`0` wird abgelehnt). Ohne `PUID`/`PGID` läuft Flowplan als UID 1000 und übergibt den Ordner genauso an sie.
**Alternativ Dockers eigenes `user:`** – Flowplan läuft dann von Anfang an als dieser Benutzer und ändert keine Besitzer; der Ordner muss ihm schon gehören. Jede UID/GID geht, auch eine ohne Eintrag in `/etc/passwd` des Images. So arbeitet auch Kubernetes (`runAsUser`, das [Helm-Chart](/installation#kubernetes-helm)).
```yaml
services:
flowplan:
image: ghcr.io/yannicschuller/flowplan:latest
user: "1001:1001" # oder "${UID}:${GID}", mit UID und GID in der .env
volumes:
- /pfad/zu/flowplan-data:/app/data
```
Mit `user:` wirken `PUID`/`PGID` nicht; Flowplan meldet das beim Start mit einer Zeile. Oder du gibst den Ordner UID 1000: `sudo chown -R 1000:1000 /pfad/zu/flowplan-data`. Passt nichts davon, bricht der Start mit „Flowplan cannot write to its data folder …“ ab.
**Befehle im Container** (`docker exec`, `docker compose exec`/`run`, `docker run … node …`) laufen ohne `user:` als root. Flowplans eigene Werkzeuge – `/app/move.mjs`, `/app/decrypt.mjs`, `/app/scripts/db-*.mjs` – wechseln selbst zu `PUID:PGID` (Standard 1000:1000), bevor sie etwas schreiben. Bei anderen Befehlen, die in den Datenordner schreiben, den Benutzer angeben: `docker compose exec -u 1001:1001 flowplan …` (ohne `PUID` `-u 1000:1000`). Was ein Befehl als root direkt im Datenordner hinterlässt, übergibt Flowplan beim nächsten Start.
### Automatisch ausrollen
Coolify beobachtet die Registry nicht selbst. Die Image-Workflows der Repositories lösen deshalb nach dem Hochladen eines neuen Images ein Deployment über die Coolify-API aus (`POST /api/v1/deploy?uuid=…` mit einem API-Token). Der eingebaute GitHub-Webhook von Coolify passt dafür nicht: Er baut aus dem Quellcode und kommt beim Push, bevor das Image fertig ist.
::: steps
1. In Coolify unter **Settings** den API-Zugriff einschalten (und ggf. die Adresse des CI-Runners erlauben).
2. Unter **Keys & Tokens → API tokens** ein Token mit dem Recht *deploy* anlegen.
3. In der Ressource unter **Webhooks** die *Deploy Webhook*-Adresse kopieren, z. B. `https://coolify.example.com/api/v1/deploy?uuid=…&force=false`.
4. Im GitHub-Repository unter **Settings → Secrets and variables → Actions** zwei Secrets anlegen: `COOLIFY_WEBHOOK` (die Adresse) und `COOLIFY_TOKEN` (das Token).
:::
| Repository | Image in Coolify | Ausgerollt bei |
| --- | --- | --- |
| flowplan | `ghcr.io/yannicschuller/flowplan:beta` (oder `:latest` ohne Automatik) | jedem manuellen Build (**Actions → Docker image → Run workflow**) und jedem Release, das neuer ist als die aktuelle Beta |
| flowplan-website | `ghcr.io/yannicschuller/flowplan-website:latest` | jedem Push auf `main` |
| flowplan-docs | `ghcr.io/yannicschuller/flowplan-docs:latest` | jedem Push auf `main` |
Pull Requests und Dependabot lösen nie ein Deployment aus; ohne die Secrets (etwa in Forks) wird der Schritt übersprungen. Holt Coolify beim Deployment nicht das neue Image, in der Compose-Datei `pull_policy: always` setzen.
> [!WARNING]
> In Coolify die Anzahl der Instanzen bei 1 lassen. Mehrere Container würden dieselbe SQLite-Datei beschreiben.
## Pangolin, Traefik und andere Proxys
- `APP_URL` muss exakt der Adresse entsprechen, unter der Flowplan im Browser erscheint.
- Endet TLS am vorderen Proxy (etwa Pangolin) und reicht er an Traefik weiter, dort **TLS zum Ziel ausschalten** und einen **eigenen Host-Header** mit der Flowplan-Domain setzen – sonst findet Traefik keine Route und antwortet mit 404.
- Großes Hochladen: Inhaltsarchive können bis zu 2 GB groß sein, [AFFiNE-Arbeitsbereichsdateien](/migrate-affine) so groß wie die Import-Grenze (größte Datei beim Hochladen, mindestens 100 MB, oder `FLOWPLAN_IMPORT_MAX_MB`). Traefik begrenzt die Anfragegröße von sich aus nicht – nur eine eigene `buffering`-Middleware mit `maxRequestBodyBytes`; die muss dann mindestens so groß sein. nginx braucht `client_max_body_size` (das Beispiel unten erlaubt 2 GB, Standard ist nur 1 MB), Caddy begrenzt nur mit `request_body { max_size … }`. Cloudflare (Proxy an) lässt im Free- und Pro-Tarif höchstens 100 MB je Anfrage durch – größere AFFiNE-Dateien dann über einen Weg ohne Cloudflare-Proxy importieren. Flowplan nimmt große Importe als Datenstrom an und schreibt sie auf die Platte; die Anfrage muss ihre Größe (`Content-Length`) nennen, was Browser immer tun.
- Zeitlimits: Export und Import großer Archive können Minuten dauern; Proxy-Timeouts ggf. erhöhen.
- Server-Sent Events (Live-Bearbeitung in Dokumenten, Live-Cursor auf Whiteboards) dürfen nicht gepuffert werden; nginx: `proxy_buffering off` (siehe Beispiel unten). Flowplan sendet dafür zusätzlich `X-Accel-Buffering: no`.
- Client-Adresse: Der Proxy muss `X-Forwarded-For` setzen (Traefik und Caddy tun das von selbst, nginx braucht die Zeile aus dem Beispiel). Nur dann begrenzt Flowplan Anmeldeversuche, Demo-Starts und anonyme Formularantworten je Adresse. Fehlt der Header, gelten nur die Limits je Konto und je Link, und das Protokoll zeigt beim ersten Aufruf einen Hinweis. `FLOWPLAN_TRUSTED_PROXIES` nennt die Zahl der Proxys ([Konfiguration](/configuration)).
### nginx
```nginx
server {
server_name flowplan.example.com;
client_max_body_size 2g;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_buffering off;
proxy_read_timeout 600s;
}
}
```
### Caddy
```
flowplan.example.com {
reverse_proxy 127.0.0.1:3000
}
```
Den internen Port `3000` nie zusätzlich öffentlich freigeben.
## Eigene Domains für Veröffentlichungen
Mit **Eigene Domains für Veröffentlichungen** unter **Administration → Erweiterungen & Domains** zeigen Eigentümer veröffentlichte Seiten unter ihrer Domain ([Teilen und Veröffentlichen](/sharing#eigene-domain)). Flowplan erkennt die Domain am `Host`-Header und liefert nur die Veröffentlichung aus. Das Zertifikat bleibt Sache des Reverse Proxy; er muss Anfragen für beliebige Hosts an Flowplan weiterreichen und den `Host` unverändert lassen.
Flowplan beantwortet `GET /api/domains/allowed?domain=` mit 200 für bestätigte Domains aktiver Veröffentlichungen und sonst mit 404 – genau die Frage, die Caddy vor einem neuen Zertifikat stellt.
### Caddy mit On-Demand-TLS
```
{
on_demand_tls {
ask http://127.0.0.1:3000/api/domains/allowed
}
}
flowplan.example.com {
reverse_proxy 127.0.0.1:3000
}
# Alle anderen Hosts: nur mit Zertifikat, wenn Flowplan die Domain kennt.
https:// {
tls {
on_demand
}
reverse_proxy 127.0.0.1:3000
}
```
Caddy holt das Zertifikat beim ersten Aufruf der Domain. Domains, die Flowplan nicht bestätigt hat, bekommen keines – so kann niemand Zertifikate für fremde Namen anstoßen.
### Traefik
Traefik kennt keine Rückfrage vor dem Zertifikat. Lege je Domain einen Router an (Datei-Provider oder Labels) – nachdem die Domain in Flowplan bestätigt ist:
```yaml
http:
routers:
flowplan-docs-example:
rule: Host(`docs.example.org`)
service: flowplan
tls:
certResolver: letsencrypt
services:
flowplan:
loadBalancer:
servers:
- url: http://flowplan:3000
```
Die Bestätigung hängt nicht am Router: Flowplan prüft nur den TXT-Eintrag `_flowplan-verify.`.
### Coolify
In Coolify die zusätzliche Domain im Feld **Domains** der Flowplan-Ressource ergänzen (durch Komma getrennt, z. B. `https://flowplan.example.com,https://docs.example.org`) und neu ausrollen. Coolify legt Router und Zertifikat für Traefik an. `APP_URL` bleibt die Adresse der App.
### Sicherheit
- Unter einer eigenen Domain antwortet Flowplan nur auf Lesezugriffe der Veröffentlichung, ihre Dateien und die statischen Dateien der Oberfläche. Anmeldung, App und API antworten mit 404 – auch wenn jemand den `Host`-Header fälscht.
- Cookies und `Authorization`-Kopfzeilen werden dort verworfen, und Flowplan setzt nie ein Cookie.
- Die Seiten tragen `frame-ancestors 'none'` und `X-Frame-Options: DENY`.
- Ein Eintrag für die Instanz-Adresse selbst ist nicht möglich.
- Bestätigt wird eine Domain nur per DNS-TXT-Eintrag `_flowplan-verify.` – dass die Domain schon auf die Instanz zeigt, reicht nicht. Unbestätigte Einträge verfallen nach 7 Tagen, damit niemand eine fremde Domain auf Dauer blockiert.
---
# Instanz umziehen
So bringst du eine ganze Flowplan-Instanz auf einen anderen Server – etwa vom Heimserver auf einen gemieteten Server –, mit allen Konten, Arbeitsbereichen, Dateien und Schlüsseln und meist nur wenigen Minuten Ausfallzeit.
Eine Flowplan-Instanz besteht aus genau vier Dingen:
| Teil | Was | Zieht mit um |
| --- | --- | --- |
| Container | das Image `ghcr.io/yannicschuller/flowplan` (für `linux/amd64` und `linux/arm64`) | neu installieren, dieselbe oder eine neuere Version |
| Datenordner `/app/data` | `flowplan.sqlite` (+ `-wal`, `-shm`), `uploads/`, `web-push-keys.json`, `secrets.key`; `ocr/` und `tmp/` entstehen neu | ja – das ist der eigentliche Umzug |
| Umgebungsvariablen | `APP_URL`, Schlüssel, `OIDC_*`, `S3_*`, `SMTP_*` … | von Hand übernehmen, **vor allem die Schlüssel** |
| Domain und Reverse Proxy | DNS-Eintrag, HTTPS-Zertifikat | DNS umstellen, Proxy neu einrichten |
Das gilt für jede Art des Betriebs: `docker run`, Docker Compose, Kubernetes mit dem [Helm-Chart](/installation#kubernetes-helm), ohne Docker oder in einem Verwaltungs-Panel. Nutzt du ein Panel, legst du dort denselben Container mit demselben Volume und denselben Variablen neu an.
**Mehr zum Thema:** [Umzug mit dem Umzugswerkzeug](/move-instance-tool)
## Vorbereiten
::: steps
1. **Umgebungsvariablen aufschreiben.** Alle, die die alte Instanz bekommt – je nach Betrieb aus der `.env`, mit `docker inspect ` (Abschnitt `Env`), `docker compose config` oder `helm get values flowplan`. Die vollständige Liste steht unter [Konfiguration](/configuration).
2. **Die Schlüssel sichern**, getrennt von den Daten (Passwortmanager):
- `FLOWPLAN_ENCRYPTION_KEY` (oder die Datei aus `FLOWPLAN_ENCRYPTION_KEY_FILE`) und `FLOWPLAN_ENCRYPTION_KEY_PREVIOUS`: Ohne sie sind verschlüsselte Sicherungen, die verschlüsselten Dateien im Bucket und die damit verschlüsselten gespeicherten Geheimnisse unlesbar.
- `FLOWPLAN_SECRETS_KEY` (oder `…_FILE`), falls gesetzt. Ist keiner der beiden gesetzt, liegt der Schlüssel für gespeicherte Geheimnisse als `secrets.key` im Datenordner – das eingebaute Umzugswerkzeug nimmt ihn mit, bei den anderen Wegen kopierst du ihn selbst.
- Was davon abhängt: KI-Schlüssel, Kalenderverbindungen (Google, Microsoft 365), Chat-App-Tokens, Git-Export-Tokens und die Zwei-Faktor-Geheimnisse der Konten. Fehlt der Schlüssel, kommen Konten mit Zwei-Faktor-Anmeldung nur noch mit Wiederherstellungscodes hinein.
3. **Die Domain behalten.** Gleiche `APP_URL` heißt: Passkeys, die OIDC-Weiterleitung, CalDAV- und CardDAV-Konten, die Apps, eingehende Webhooks (Git, Tickets, E-Mail-Eingang) und Freigabelinks funktionieren nach dem DNS-Wechsel einfach weiter. Mit einer neuen Domain muss all das neu eingerichtet werden (siehe [Andere Domain](#andere-domain)).
4. **Die TTL des DNS-Eintrags senken**, mindestens so lange vorher, wie die bisherige TTL beträgt (oft 1 bis 24 Stunden), z. B. auf 300 Sekunden. Dann greift die Umstellung später in Minuten.
5. **Den neuen Server einrichten** (Beispiel: [Hetzner Cloud](#beispiel-hetzner-cloud)) mit **derselben oder einer neueren** Flowplan-Version – eine ältere kann eine neuere Datenbank nicht öffnen – und mit denselben Umgebungsvariablen. Ein eigenes S3-Bucket für die neue Instanz ist am einfachsten; mit demselben Bucket siehe [Weg C](#weg-c-s3-und-litestream).
6. **Eine Sicherung anlegen**: **Administration → Speicher & Sicherung → Gesamte Instanz → Herunterladen**. Sie schadet nie.
7. **Die Nutzer vorwarnen**: **Administration → Wartung & Hinweise** zeigt allen ein Wartungsfenster an.
:::
## Drei Wege
| Weg | Wann | Ausfallzeit |
| --- | --- | --- |
| **A: Umzugswerkzeug** (empfohlen) | immer, wenn der neue Server den alten erreicht | Minuten (nur der letzte Abgleich) |
| **B: Sicherung herunterladen und hochladen** | kleine Instanzen, kein Netzweg zwischen den Servern | von der Sicherung bis zum Start der neuen Instanz |
| **C: S3 und Litestream** | die alte Instanz läuft schon mit S3 und Litestream | Stoppen der alten bis Start der neuen Instanz |
### Weg B: Sicherung herunterladen und hochladen
::: steps
1. Auf der alten Instanz [Wartung ankündigen](/administration#wartung-hinweise) – Änderungen nach dem Herunterladen gehen verloren.
2. **Administration → Speicher & Sicherung → Gesamte Instanz → Herunterladen**. Mit `FLOWPLAN_ENCRYPTION_KEY` ist die Datei verschlüsselt (`.zip.enc`) – die neue Instanz braucht dann denselben Schlüssel.
3. Die Instanzsicherung enthält Datenbank und Dateien, aber **nicht** `secrets.key` und `web-push-keys.json`. Beide von Hand kopieren (oder die Schlüssel als Variablen setzen):
```bash
# alt
docker compose cp flowplan:/app/data/secrets.key .
docker compose cp flowplan:/app/data/web-push-keys.json .
# neu
docker compose cp secrets.key flowplan:/app/data/
docker compose cp web-push-keys.json flowplan:/app/data/
docker compose exec -u root flowplan chown 1000:1000 /app/data/secrets.key /app/data/web-push-keys.json
# mit PUID/PGID oder user: deren Benutzer und Gruppe statt 1000:1000
```
4. Auf der neuen Instanz **Aus Sicherung wiederherstellen → Sicherung auswählen**. Der Proxy davor muss so große Uploads durchlassen (Caddy von sich aus, nginx mit `client_max_body_size`, Cloudflare höchstens 100 MB); sonst die Datei per `scp` auf den Server bringen und dort hochladen. Höchstens 50 GB.
5. Neu starten; der vorherige Stand bleibt als `pre-restore-…`. Dann DNS umstellen.
:::
### Weg C: S3 und Litestream
Läuft die alte Instanz mit S3 (Dateien im Bucket) und Litestream (laufende Kopie der Datenbank unter `/db/`), kann die neue Instanz direkt aus dem Bucket starten:
::: steps
1. Die alte Instanz **stoppen** – Litestream beider Instanzen dürfen nie gleichzeitig in denselben Ordner schreiben.
2. Die neue Instanz mit **denselben** `S3_*`-Variablen, demselben `FLOWPLAN_ENCRYPTION_KEY` und einem **leeren** Datenordner starten. Litestream stellt die Datenbank wieder her, die Dateien holt Flowplan beim ersten Abruf sofort und alle übrigen im Hintergrund.
3. `secrets.key` und `web-push-keys.json` wie in Weg B kopieren, falls die Schlüssel nicht als Variablen gesetzt sind.
4. DNS umstellen.
:::
Mit `FLOWPLAN_LITESTREAM=off` gibt es keine laufende Kopie: dann die neueste geplante Sicherung aus `/backups/` verwenden (siehe [Wiederherstellen](/storage-and-backups#wiederherstellen)). Die Vorabprüfung von Weg A erkennt eine Litestream-Kopie im Bucket und weist auf diesen Weg hin.
> [!NOTE]
> Aktive [Workflows](/workflows) kommen auf der neuen Instanz **pausiert** an – mit Entwurf, Versionen und angehaltenen Läufen. So startet nichts doppelt, solange die alte Instanz noch läuft. Prüfe sie danach und aktiviere sie wieder.
## DNS umstellen
::: steps
1. Nach dem letzten Abgleich (Weg A) bzw. dem Start der neuen Instanz den **A-Eintrag** (IPv4) und den **AAAA-Eintrag** (IPv6) der Domain auf den neuen Server ändern. Am alten Standort eine Portweiterleitung oder einen Tunnel entfernen.
2. Der Proxy des neuen Servers holt das Zertifikat, sobald die Domain auf ihn zeigt (bei Let's Encrypt über Port 80) – eine Minute Geduld.
3. Mit `dig +short flowplan.example.org` (oder `nslookup`) prüfen, was die Welt sieht. Wer die alte Adresse noch im Cache hat, landet bis zum Ablauf der TTL auf der alten Instanz – dort steht dann der Hinweis auf die neue.
4. Danach die TTL wieder anheben.
:::
## Danach prüfen
- **Anmelden**: mit Passwort, Passkey und SSO. Bestehende Sitzungen gelten weiter.
- **Administration → Überwachung**: alles grün? **Administration → Verschlüsselung** zeigt dieselbe Schlüssel-ID wie vorher.
- **Administration → Speicher & Sicherung**: S3 verbunden, Warteschlange läuft leer (mit S3 lädt Flowplan nach einer Übernahme alle Dateien einmal hoch), **Jetzt sichern** gelingt.
- **Administration → E-Mail → Test-E-Mail senden** und **Administration → Push-Benachrichtigungen → Testbenachrichtigung senden**.
- Ein paar Seiten, Bilder und Anhänge öffnen; eine Datei hochladen.
- KI, Kalenderverbindungen, Chat-Apps: funktionieren sie ohne neue Anmeldung, sind die gespeicherten Geheimnisse lesbar.
- CalDAV/CardDAV in einer App aktualisieren, die Desktop- und Mobil-Apps öffnen, eingehende Webhooks (Git, Tickets) einmal auslösen.
## Aufräumen
- Auf der neuen Instanz `FLOWPLAN_MOVE_ALLOW_PRIVATE` wieder entfernen.
- `pre-move-…` (bzw. `pre-restore-…`) im Datenordner nach ein paar Tagen löschen, z. B. `docker compose exec flowplan sh -c 'rm -rf /app/data/pre-move-*'`.
- Die alte Instanz noch einige Tage mit dem Hinweis laufen lassen, dann stoppen, das Volume sicher löschen und ihre S3-Zugangsdaten (falls eigene) widerrufen. Das Umzugstoken ist schon verbraucht.
- Eine geplante Sicherung auf der neuen Instanz einschalten bzw. prüfen ([Sicherungen](/storage-and-backups#sicherungen)).
## Zurück, falls etwas schiefgeht
Bis zum DNS-Wechsel ist nichts verloren: Auf der alten Instanz **Administration → Speicher & Sicherung → Instanz umziehen → Schreibschutz aufheben**, und alles läuft weiter wie vorher. Nach dem Wechsel: DNS zurückstellen und den Schreibschutz aufheben – was auf der neuen Instanz inzwischen geändert wurde, kommt nur mit einem Umzug in die Gegenrichtung zurück. Die neue Instanz selbst kehrt zu ihrem vorherigen Stand zurück, indem du bei gestopptem Container `flowplan.sqlite*` und `uploads/` durch den Inhalt von `pre-move-…` ersetzt.
## Andere Domain
Bekommt die Instanz eine neue Adresse, setze `APP_URL` auf die neue und richte danach neu ein:
- **Passkeys** sind an die Domain gebunden: Alle melden sich mit Passwort oder SSO an und legen sie neu an.
- **OIDC**: die Weiterleitungsadresse beim Anbieter auf `/api/auth/callback` ändern.
- **CalDAV und CardDAV**: Konten in den Kalender- und Kontakte-Apps neu einrichten.
- **Eingehende Webhooks** (Git, Ticket-Sync, E-Mail-Eingang) und **Freigabelinks** zeigen auf die alte Adresse.
- **Desktop- und Mobil-Apps** speichern die Adresse des Servers. Sie verbinden sich weiter mit der alten Instanz; dort sehen alle den Hinweis „Diese Instanz ist umgezogen nach …“, und Änderungen werden mit einer Meldung abgelehnt, die die neue Adresse nennt. In der App abmelden und die neue Adresse eintragen (Desktop: **Profile → Profil hinzufügen …**). **Weboberfläche weiterleiten** dabei ausgeschaltet lassen: Die Apps nehmen keine Adresse an, die auf eine andere Seite weiterleitet.
## Beispiel: Hetzner Cloud
Ein konkreter Weg vom Heimserver auf einen Server bei Hetzner, mit Docker Compose und Caddy. Namen und Preise der Tarife ändern sich – maßgeblich ist die Hetzner Console.
### Server
| Einstellung | Empfehlung |
| --- | --- |
| Typ | **CAX21** (Arm64, 4 vCPU, 8 GB RAM) oder **CX32** (x86, 4 vCPU, 8 GB RAM) bzw. der aktuelle Nachfolger. 4 GB reichen für kleine Teams; die Texterkennung gescannter PDFs braucht kurzzeitig CPU, lokale KI (Ollama) deutlich mehr. Das Image gibt es für `linux/arm64` und `linux/amd64`, beide Typen passen. |
| Standort | **Falkenstein** (`fsn1`) oder **Nürnberg** (`nbg1`) – dort gibt es auch Object Storage. |
| Image | **Ubuntu 24.04** |
| Netzwerk | Öffentliche IPv4 und IPv6. Eine IPv4-Adresse behalten: Nicht jede Registry und jeder Mailserver ist über IPv6 erreichbar. |
| SSH-Key | Eigenen öffentlichen Schlüssel hinterlegen; Anmeldung mit Passwort gar nicht erst nutzen. |
| Firewall | Eine **Hetzner Cloud Firewall** anlegen und zuweisen: eingehend TCP **22** nur von deiner Adresse (oder deinem VPN), TCP **80** und **443** sowie UDP **443** (HTTP/3) von überall. Docker umgeht `ufw` auf dem Server; die Cloud Firewall davor greift trotzdem. |
| Backups | **Backups** des Servers einschalten (Aufpreis auf den Serverpreis): tägliche Abbilder der ganzen Platte, zusätzlich zu Flowplans eigenen Sicherungen. |
### Object Storage als S3
::: steps
1. In der Hetzner Console **Object Storage → Bucket erstellen**, Standort wie der Server (z. B. Falkenstein), Sichtbarkeit **privat**. Der Name muss eindeutig sein, z. B. `flowplan-`.
2. **Sicherheit → S3-Zugangsdaten → Zugangsdaten erstellen**. Das Secret wird nur einmal angezeigt.
3. In die `.env`:
:::
```dotenv
S3_BUCKET=flowplan-beispiel
S3_ENDPOINT=https://fsn1.your-objectstorage.com
S3_REGION=fsn1
S3_ACCESS_KEY_ID=
S3_SECRET_ACCESS_KEY=
S3_PREFIX=flowplan
```
Endpoint und Region folgen dem Standort: `https://.your-objectstorage.com` mit `fsn1` (Falkenstein), `nbg1` (Nürnberg) oder `hel1` (Helsinki) als `S3_REGION`. Mit `FLOWPLAN_ENCRYPTION_KEY` liegen Dateien und Sicherungen dort verschlüsselt; die Litestream-Kopie nicht (siehe [Litestream und Verschlüsselung](/storage-encryption#litestream-und-verschluesselung)). Object Storage wird monatlich abgerechnet, mit einem Grundpreis, der ein Kontingent enthält – die aktuellen Preise stehen bei Hetzner.
### Docker, Flowplan und Caddy
Docker nach der offiziellen Anleitung für Ubuntu installieren ([docs.docker.com/engine/install/ubuntu](https://docs.docker.com/engine/install/ubuntu/)), dann:
```bash
mkdir -p /opt/flowplan && cd /opt/flowplan
curl -o .env https://raw.githubusercontent.com/yannicschuller/flowplan/main/.env.example
# compose.yaml und Caddyfile von unten anlegen, .env ausfüllen
docker compose up -d
```
`compose.yaml`:
```yaml
# Flowplan mit Caddy davor (HTTPS von Let's Encrypt). Genau eine Instanz (SQLite).
services:
flowplan:
image: ghcr.io/yannicschuller/flowplan:${FLOWPLAN_VERSION:-latest}
env_file: .env
environment:
FLOWPLAN_DATA_DIR: /app/data
# Caddy ist der eine Proxy davor und setzt X-Forwarded-For.
FLOWPLAN_TRUSTED_PROXIES: "1"
volumes:
- flowplan-data:/app/data
restart: unless-stopped
healthcheck:
test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:3000/api/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"]
interval: 30s
timeout: 5s
start_period: 20s
retries: 3
caddy:
image: caddy:2
ports:
- "80:80"
- "443:443"
- "443:443/udp"
environment:
FLOWPLAN_DOMAIN: ${FLOWPLAN_DOMAIN}
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy-data:/data
- caddy-config:/config
depends_on:
- flowplan
restart: unless-stopped
volumes:
flowplan-data:
caddy-data:
caddy-config:
```
`Caddyfile`:
```caddyfile
{$FLOWPLAN_DOMAIN} {
encode zstd gzip
reverse_proxy flowplan:3000
}
```
In der `.env` zusätzlich zu den Werten der alten Instanz:
```dotenv
FLOWPLAN_DOMAIN=flowplan.example.org
APP_URL=https://flowplan.example.org
# SMTP: Hetzner sperrt für neue Konten ausgehend Port 25 und 465 – 587 mit STARTTLS nehmen.
SMTP_PORT=587
SMTP_SECURE=false
# Nur für den Umzug, wenn der Heimserver nur im LAN/VPN erreichbar ist:
# FLOWPLAN_MOVE_ALLOW_PRIVATE=true
```
Für eine [vorübergehende Adresse](/move-instance-tool#weg-a-das-umzugswerkzeug) während des Umzugs `FLOWPLAN_DOMAIN=neu.flowplan.example.org` und die passende `APP_URL` setzen; nach **Übernehmen** beide auf die endgültige Domain ändern und mit `docker compose up -d` neu starten – derselbe Neustart übernimmt den Umzug. Caddy kann auch beide Namen bedienen: `{$FLOWPLAN_DOMAIN}, neu.flowplan.example.org { … }`.
Lieber Kubernetes? Das [Helm-Chart](/installation#kubernetes-helm) aus dem Repository läuft auch auf einem einzelnen Server (etwa mit k3s); der Umzug geht dann über die Oberfläche oder `kubectl exec … node /app/move.mjs` (oben).
### Ablauf mit dem Heimserver
::: steps
1. Einen Tag vorher die TTL des DNS-Eintrags auf 300 Sekunden senken.
2. Den Hetzner-Server wie oben einrichten, mit denselben Variablen wie zu Hause (Schlüssel!), und mit `docker compose up -d` starten; das erste Konto anlegen.
3. Zu Hause **Umzug vorbereiten**, auf dem Hetzner-Server **Von anderer Instanz übernehmen** mit der öffentlichen Adresse des Heimservers (oder seiner VPN-Adresse mit `FLOWPLAN_MOVE_ALLOW_PRIVATE=true`).
4. Vorabprüfung, bis keine Fehler bleiben. **Quelle schreibschützen und letzten Stand holen**, **Übernehmen**, `docker compose restart flowplan`.
5. A- und AAAA-Eintrag auf die Adressen des Hetzner-Servers stellen, Portweiterleitung am Router entfernen.
6. [Danach prüfen](#danach-pruefen), nach ein paar Tagen [aufräumen](#aufraeumen).
:::
---
# Umzug mit dem Umzugswerkzeug
Das Umzugswerkzeug holt die neue Instanz alles von der alten – Datenbank, Dateien, Schlüssel – mit kurzer Ausfallzeit; dazu die Fehlersuche beim Umzug.
## Weg A: Das Umzugswerkzeug
Unter **Administration → Speicher & Sicherung** (nur für Admins) holt die neue Instanz alles direkt von der alten: von Server zu Server, fortsetzbar und mit Prüfsummen.
**Auf der alten Instanz – „Umzug vorbereiten“**
::: steps
1. **Instanz umziehen → Umzug vorbereiten**. Zur Sicherheit fragt Flowplan nach deinem Passwort; bei Anmeldung über SSO muss die Anmeldung höchstens 15 Minuten alt sein (sonst einmal ab- und wieder anmelden).
2. Flowplan zeigt die **Übertragungsadresse** und das **Umzugstoken** (`fpmove_…`) – **nur dieses eine Mal**. Das Token gilt 24 Stunden und nur für den Umzug: Es darf die Instanz lesen, sie für den letzten Abgleich schreibschützen und den Umzug abschließen, sonst nichts. Gespeichert wird nur ein Hash; **Widerrufen** macht es sofort ungültig, ein neues Token ersetzt das alte. Das Erstellen, Widerrufen und jeder Schritt des Umzugs stehen im Aktivitätsprotokoll und als Sicherheitsereignis unter **Administration → Sicherheit**. Zehn falsche Token-Versuche von einer Adresse sperren sie für 15 Minuten.
:::
**Auf der neuen Instanz – „Von anderer Instanz übernehmen“**
Die neue Instanz ist frisch: nur das erste Admin-Konto, das du beim ersten Start anlegst. Hat sie schon Inhalte, verlangt Flowplan eine ausdrückliche Bestätigung, denn alles wird ersetzt.
> [!TIP]
> **Gleiche Domain, aber DNS zeigt noch auf den alten Server?** Dann erreichst du die neue Instanz unter ihrer endgültigen Adresse noch nicht, und der Proxy bekommt dafür noch kein Zertifikat. Zwei Möglichkeiten:
> - **Vorübergehende Adresse:** einen zweiten Namen auf den neuen Server zeigen lassen (etwa `neu.flowplan.example.org`), die neue Instanz zuerst mit `APP_URL=https://neu.flowplan.example.org` starten und den Umzug dort durchführen. Die Vorabprüfung warnt dann bei `APP_URL` – das ist erwartet. Vor dem Neustart in Schritt 6 `APP_URL` auf die endgültige Adresse setzen (der Proxy darf beide Namen bedienen).
> - **Ohne Oberfläche:** die [Kommandozeile](#ohne-oberflaeche-kommandozeile) auf dem neuen Server.
::: steps
1. **Instanz umziehen → Von anderer Instanz übernehmen**: die **Adresse der alten Instanz** (ihre `APP_URL`) und das **Umzugstoken** eintragen, **Übernahme starten**.
- Steht der alte Server nur im eigenen Netz (LAN, VPN wie WireGuard oder Tailscale, z. B. `http://192.168.1.10:3000`), auf der **neuen** Instanz vorübergehend `FLOWPLAN_MOVE_ALLOW_PRIVATE=true` setzen. Ohne diese Variable sind wie bei allen Abrufen des Servers nur öffentliche `https://`-Adressen erlaubt.
2. **Erste Kopie**: ein konsistenter Datenbankstand, alle Dateien aus `uploads/` einzeln mit SHA-256-Prüfsumme, `web-push-keys.json` und `secrets.key`. Die Seite zeigt Bytes, Dateien und die geschätzte Restzeit. Die alte Instanz läuft währenddessen normal weiter. Bricht die Verbindung ab oder startet ein Server neu, geht es mit **Fortsetzen** an derselben Stelle weiter – bereits geprüfte Dateien werden nicht noch einmal geholt, eine halbe Datei wird ab ihrem letzten Byte fortgesetzt.
3. **Vorabprüfung → Prüfen**. Flowplan vergleicht die Einstellungen beider Instanzen – nur Namen und Prüfwerte (HMAC mit dem Umzugstoken), nie die Werte selbst – und prüft, ob die neue Instanz S3, SMTP und den OIDC-Anbieter erreicht. Das Ergebnis ist eine Liste mit **OK**, **Warnung** und **Fehler**:
| Prüfung | Bedeutung |
| --- | --- |
| Version | Fehler, wenn die neue Instanz älter ist als die alte: zuerst aktualisieren. |
| `FLOWPLAN_ENCRYPTION_KEY` | Fehler, wenn er fehlt oder ein anderer ist: Verschlüsselte Sicherungen, die verschlüsselten Dateien im Bucket, gespeicherte Tokens und Kalenderverbindungen wären unlesbar. Den alten Schlüssel setzen (ein neuer höchstens zusätzlich, der alte dann in `…_PREVIOUS`). |
| Gespeicherte Geheimnisse | Fehler, wenn der Schlüssel dafür fehlt (`FLOWPLAN_SECRETS_KEY` bzw. `FLOWPLAN_ENCRYPTION_KEY`). Ein erzeugtes `secrets.key` kommt automatisch mit. |
| `APP_URL` | Warnung bei einer anderen Adresse, mit allem, was dann neu einzurichten ist. |
| OIDC, S3, SMTP, Push, KI, weitere | Variablen, die hier fehlen, einen anderen Wert haben oder nur hier gesetzt sind. Fehlende `OIDC_ISSUER`/`OIDC_CLIENT_ID` sind ein Fehler – sonst kommt niemand per SSO hinein. |
| Gleicher Bucket | Warnung: Beide Instanzen schreiben sonst in denselben Ordner (siehe [Weg C](/move-instance#weg-c-s3-und-litestream)). |
| S3, SMTP, OIDC erreichbar | Fehler mit der Meldung des Dienstes. Ports 25 und 465 sperren viele Anbieter ausgehend – dann Port 587. |
Ändere die Variablen der neuen Instanz und starte sie neu, bis keine Fehler mehr bleiben; der Umzug geht nach dem Neustart weiter.
4. **Quelle schreibschützen und letzten Stand holen**: Ab hier beginnt die Ausfallzeit. Die alte Instanz nimmt keine Änderungen mehr an – alle sehen „Umzug läuft: Diese Instanz ist schreibgeschützt“, Lesen und Anmelden gehen weiter, Änderungen (auch über API, CalDAV, Webhooks, eingehende E-Mails) werden mit einer klaren Meldung abgelehnt. Die neue Instanz holt einen frischen Datenbankstand und nur die Dateien, die seit der ersten Kopie neu sind oder sich geändert haben; entfernte fallen weg. Das dauert meist Minuten.
5. **Beim Neustart übernehmen → Übernehmen**: Flowplan prüft die Datenbank und legt alles für den nächsten Start bereit – genau wie **Aus Sicherung wiederherstellen**. Die alte Instanz bekommt Bescheid: Sie zeigt jetzt „Diese Instanz ist umgezogen nach …“, bleibt schreibgeschützt, und ihr Umzugstoken ist verbraucht.
6. **Die neue Instanz neu starten** (den Container, den Pod bzw. den Dienst). Beim Start ersetzt Flowplan Datenbank, Dateien und Schlüssel; der vorherige Stand der neuen Instanz bleibt als `pre-move-` im Datenordner. Im Protokoll steht `Instanz wiederhergestellt; vorheriger Stand in …/pre-move-…`.
7. **DNS umstellen** (unten) und [danach prüfen](/move-instance#danach-pruefen).
:::
Anmelden kannst du dich auf der neuen Instanz jetzt mit den Konten der alten; das erste Admin-Konto der neuen ist ersetzt. Bestehende Anmeldungen (Browser, Apps) gelten weiter, solange die Domain gleich bleibt.
Auf der alten Instanz lässt sich unter **Instanz umziehen** noch **Weboberfläche weiterleiten** einschalten: Wer sie im Browser öffnet, landet direkt auf der neuen Adresse. **Schreibschutz aufheben** macht sie wieder beschreibbar – nur, wenn der Umzug abgebrochen wird.
Solange die alte Instanz schreibgeschützt ist, pausieren ihre Hintergrunddienste: E-Mail-Eingang (das IMAP-Postfach bleibt ungelesen für die neue Instanz), Kalender- und Issue-Synchronisierung, Workflows, Erinnerungen, Zustellungen von E-Mails, Push, Webhooks und Messengern sowie geplante Sicherungen. Auch die App kann dort nichts mehr ändern.
### Ohne Oberfläche (Kommandozeile)
Dasselbe ohne Weboberfläche auf der neuen Instanz – etwa bevor dort überhaupt ein Konto existiert, oder über SSH, solange das DNS noch auf den alten Server zeigt. Das Werkzeug liegt im Image unter `/app/move.mjs` und im Quellcode unter `scripts/move.mjs` (`npm run move`). Es holt die erste Kopie, schaltet die alte Instanz schreibgeschützt, holt den letzten Stand, legt alles für den nächsten Start bereit und meldet der alten Instanz die neue Adresse (`--target-url`, sonst `APP_URL`). Abgebrochen? Denselben Befehl noch einmal ausführen – er macht an derselben Stelle weiter.
```bash
# Docker Compose (im Ordner der neuen Instanz; gleiche .env, gleiches Volume)
docker compose run --rm flowplan node /app/move.mjs \
--from https://flowplan.example.org --token fpmove_…
docker compose up -d # startet und übernimmt die Kopie
# docker run
docker run --rm -v flowplan-data:/app/data -e APP_URL=https://flowplan.example.org \
ghcr.io/yannicschuller/flowplan node /app/move.mjs --from https://flowplan.example.org --token fpmove_…
# (schreibt als UID 1000; mit PUID/PGID -e PUID=… -e PGID=… ergänzen, mit user: --user UID:GID)
# Kubernetes (Helm-Chart)
kubectl -n flowplan exec deploy/flowplan -- node /app/move.mjs --from https://flowplan.example.org --token fpmove_…
kubectl -n flowplan rollout restart deploy/flowplan
# ohne Docker
npm run move -- --from https://flowplan.example.org --token fpmove_… --data /var/lib/flowplan
```
| Option | Bedeutung |
| --- | --- |
| `--from ` | Adresse der alten Instanz. Auf der Kommandozeile sind auch interne Adressen und `http://` erlaubt – du entscheidest, wohin sie sich verbindet. |
| `--token ` | Das Umzugstoken (oder `FLOWPLAN_MOVE_TOKEN` in der Umgebung, damit es nicht in der Shell-History landet). |
| `--data ` | Datenordner, Standard `FLOWPLAN_DATA_DIR` bzw. `./data`. |
| `--target-url ` | Adresse der neuen Instanz für den Hinweis auf der alten (Standard `APP_URL`). |
| `--copy-only` | Nur die erste Kopie; die alte Instanz bleibt beschreibbar. Später ohne die Option noch einmal für den letzten Abgleich. |
| `--yes` | Einen Datenordner ersetzen, der schon Inhalte hat (der bisherige Stand bleibt als `pre-move-…`). |
Die Vorabprüfung gibt es nur in der Oberfläche; auf der Kommandozeile vergleichst du die Variablen selbst (Liste oben).
## Fehlersuche
| Meldung oder Zustand | Ursache und Lösung |
| --- | --- |
| „Interne Adressen sind nur mit FLOWPLAN_MOVE_ALLOW_PRIVATE=true erlaubt“ | Die alte Instanz hat eine private Adresse (LAN, VPN, `localhost`) oder nur `http://`. Auf der neuen Instanz `FLOWPLAN_MOVE_ALLOW_PRIVATE=true` setzen, neu starten, nach dem Umzug wieder entfernen. |
| „Ungültiges oder abgelaufenes Umzugstoken“ | Falsch kopiert, älter als 24 Stunden, widerrufen, durch ein neues ersetzt oder durch einen abgeschlossenen Umzug verbraucht. Auf der alten Instanz ein neues erzeugen. |
| „Zu viele ungültige Umzugsanfragen“ | Zehn falsche Tokens von einer Adresse: 15 Minuten warten. |
| Übertragung bricht ab | **Fortsetzen** (bzw. den Befehl noch einmal ausführen). Fertige Dateien bleiben, halbe werden fortgesetzt. |
| „Prüfsumme stimmt nicht“ | Die Datei kam beschädigt an und wird automatisch neu geladen; bleibt es dabei, die Verbindung (Proxy, VPN) prüfen. |
| „Dieser Datenbankstand ist nicht mehr vorhanden“ | Die alte Instanz hat inzwischen einen neuen Stand erzeugt (neues Token, Neustart). **Fortsetzen** holt ihn. |
| Zeitüberschreitung beim Start (502/504) | Beim ersten Mal berechnet die alte Instanz die Prüfsummen aller Dateien. Ein Proxy mit kurzem Zeitlimit davor (nginx: `proxy_read_timeout` 60 s, Cloudflare 100 s) bricht ab. Zeitlimit erhöhen oder die Adresse ohne Proxy verwenden (mit `FLOWPLAN_MOVE_ALLOW_PRIVATE`). |
| Vorabprüfung: Fehler bei `FLOWPLAN_ENCRYPTION_KEY` oder gespeicherten Geheimnissen | Den Schlüssel der alten Instanz auf der neuen setzen und neu starten. Erst dann umschalten. |
| SMTP nicht erreichbar | Viele Anbieter sperren ausgehend Port 25 und 465. `SMTP_PORT=587` mit STARTTLS verwenden. |
| Nach **Übernehmen** passiert nichts | Die Übernahme braucht einen Neustart der neuen Instanz. Im Protokoll muss `Instanz wiederhergestellt` stehen. |
| Die Seite der alten Instanz zeigt „schreibgeschützt“, obwohl der Umzug abgebrochen wurde | **Instanz umziehen → Schreibschutz aufheben**. |
---
# Administration der Instanz
Wer die Instanz verwaltet, sieht **Administration** in der Seitenleiste: das erste Konto der Instanz und alle, denen es das Admin-Recht gibt – bei Single Sign-on zusätzlich die Mitglieder der Gruppe aus `OIDC_ADMIN_GROUP`.
**Mehr zum Thema:** [Benutzer verwalten](/user-management)
## Übersicht
Die Administration öffnet mit einer Übersicht. Oben steht der Zustand der Instanz: Störungen und Hinweise (mit Link zum betroffenen Bereich), sechs Live-Zahlen – gerade aktive Personen, heute aktive Personen (verschiedene Personen seit Mitternacht), Anfragen pro Minute, Fehlerquote der letzten Stunde, Anmeldungen heute und die Antwortzeit (p95: so lange brauchten die langsamsten 5 % der Anfragen der letzten Stunde) – und die Anfragen der letzten 24 Stunden als Diagramm. Die Zahlen aktualisieren sich alle 15 Sekunden, solange die Seite sichtbar ist („Live“). Darunter je Bereich eine Kachel mit seinem Zustand und, wo es passt, einer Zahl mit Verlauf: aktive Personen (Benutzer), das vollste Kontingent (Arbeitsbereiche), der Speicher der letzten 30 Tage, KI-Tokens heute, Änderungen im Aktivitätsprotokoll, Anfragen bzw. Fehler (Überwachung). Fehler sind rot markiert, Hinweise gelb. Auf dem Telefon sind die Kacheln eine Liste mit einem kleinen Verlauf rechts.
Die Bereiche sind gruppiert in **Personen** (Benutzer, Anmeldung & SSO, Arbeitsbereiche), **Daten** (Speicher & Sicherung, Grenzen & Aufbewahrung, Markdown- & Git-Export), **Dienste** (E-Mail, Push-Benachrichtigungen, KI, Erweiterungen & Domains), **Sicherheit** (Angriffe & Vorfälle, Verschlüsselung, Aktivitätsprotokoll – siehe [Sicherheit](/security-monitoring#sicherheit)) und **Betrieb** (Überwachung, Wartung & Hinweise, Instanz). Jeder Bereich beginnt oben mit einer **Zustandszeile** – etwa „Geplante Sicherung aus“ mit dem Link zum Schalter oder „S3 aus“ mit dem Link zur Anleitung. Jede Einstellung hat genau einen Ort. Schalter und Auswahlfelder speichern sofort, daneben steht „Speichert …“ bzw. „Gespeichert“; einzelne Textfelder zeigen **Speichern**, sobald du sie geändert hast. Jeder Bereich hat eine eigene Adresse, z. B. `/#admin/storage` oder `/#admin/monitoring`.
## Arbeitsbereiche
Alle Arbeitsbereiche mit Mitgliedern, Seiten, Belegung (Balken bei einem Kontingent) und **Eigenes Kontingent** – gespeichert, sobald du das Feld verlässt. Leer = Standard, 0 = unbegrenzt. Den Standard stellst du unter [Grenzen & Aufbewahrung](#grenzen-aufbewahrung) ein.
## Speicher & Sicherung
Der eine Ort für Sicherungen:
- **Sicherungen**: **S3-Spiegel** und **Litestream** mit ihrem Zustand, die geplante **Tägliche Datenbanksicherung** – eine konsistente Kopie der Datenbank pro Tag, mit S3 in den Bucket unter `backups/`, sonst in den Datenordner –, **Stündlich statt täglich** (gedacht für verschlüsselte Sicherungen anstelle von Litestream, siehe [Verschlüsselung](/storage-encryption#verschluesselung); dann mehr Kopien aufbewahren, etwa 72 für drei Tage), **Aufbewahrte Sicherungen**, die letzte Sicherung und **Jetzt sichern**. Der Markdown-Export läuft weiterhin einmal am Tag.
- **Belegung**: was lokal und was im Bucket liegt, nach Art, und die Aufteilung der Datenbank.
- **Gesamte Instanz → Herunterladen** erzeugt im laufenden Betrieb eine geprüfte Kopie von Datenbank und Dateien. Mit `FLOWPLAN_ENCRYPTION_KEY` ist die Datei verschlüsselt (`.zip.enc`).
- **Inhalte**: wie viele Arbeitsbereiche, Seiten, Datenbanken, Einträge, Dateien, Konten und Kommentare es gibt.
- **Instanz umziehen**: auf der alten Instanz **Umzug vorbereiten** (ein Umzugstoken, einmal sichtbar, 24 Stunden gültig, widerrufbar; Bestätigung mit Passwort bzw. frischer Anmeldung), danach Schreibschutz, „umgezogen nach …“ und **Weboberfläche weiterleiten**. Auf der neuen Instanz, ebenfalls in Rot, **Von anderer Instanz übernehmen**: erste Kopie mit Fortschritt, **Vorabprüfung** der Einstellungen (nur Namen und Prüfwerte), **Quelle schreibschützen und letzten Stand holen** und **Übernehmen** beim nächsten Neustart (vorheriger Stand als `pre-move-…`). Anleitung: [Instanz umziehen](/move-instance).
- Ganz unten, in Rot: **Aus Sicherung wiederherstellen**. Eine hochgeladene Sicherung wird geprüft und beim nächsten Neustart übernommen; der vorherige Stand bleibt als `pre-restore-…` im Datenverzeichnis. Eine verschlüsselte Sicherung wird mit dem aktuellen oder einem früheren Schlüssel entschlüsselt. Mit [PostgreSQL](/postgresql#wiederherstellen) nimmt die Stelle auch eine geplante Sicherung (`flowplan-….dump`) an – dann wird nur die Datenbank ersetzt, die Dateien bleiben.
Details: [Speicher und Sicherungen](/storage-and-backups).
## Grenzen & Aufbewahrung
| Einstellung | Wirkung |
| --- | --- |
| Speicher je Arbeitsbereich | Für Arbeitsbereiche ohne eigenes Kontingent. |
| Speicher je Person | Für Personen ohne eigene Grenze; alles, was sie hochladen oder kopieren. |
| Eigene Arbeitsbereiche je Person | Wie viele Arbeitsbereiche eine Person besitzen darf. |
| Größte Datei beim Hochladen | Grenze je Datei in MB. Gilt auch für den [Import einer AFFiNE-Arbeitsbereichsdatei](/migrate-affine) (mindestens 100 MB; `FLOWPLAN_IMPORT_MAX_MB` hat Vorrang). |
| Versionen aufbewahren | Tage, nach denen automatische Versionen gelöscht werden. |
| Papierkorb leeren nach | Tage, nach denen gelöschte Seiten, Bereiche, Datenbankeinträge und Vorlagen samt Dateien endgültig gelöscht werden (1–3650, Standard 30, 0 = nie automatisch). Siehe [Papierkorb](/pages-and-spaces#papierkorb). |
Leere Felder fallen auf die [Umgebungsvariablen](/configuration) zurück. Jede Person sieht ihre Grenzen und den belegten Speicher unter **Einstellungen → Konto & Sicherheit → Deine Grenzen**.
### Workflows
Unter **Grenzen & Aufbewahrung → Workflows** stehen die Grenzen für [Workflows](/workflows): Läufe je Minute (je Workflow und Arbeitsbereich), Schritte je Lauf, Kaskadentiefe, Elemente je „Für jedes“, KI-Tokens und E-Mails je Workflow und Tag, Aufbewahrung der Läufe, längstes Warten, aktive Workflows je Arbeitsbereich, HTTP-Knoten (an/aus, nur bestimmte Hosts, interne Adressen) und E-Mails an Adressen außerhalb der Mitglieder. Leer gelassen gilt der Wert aus der [Umgebung](/configuration-integrations#workflows). Daneben zeigt die Überwachung die Auslastung: aktive Workflows, Läufe je Minute, wartende und laufende Schritte, die älteste fällige Aufgabe, Fehlerquote und KI-Tokens von heute.
## Markdown- & Git-Export
Seiten und Datenbanken für den Markdown-Export wählen, den Git-Export der Bereiche einschalten und das (veraltete) Git-Repository der Instanz – siehe [Markdown-Export und Git](/markdown-git-export).
## E-Mail
**E-Mail-Versand** zeigt den eingerichteten Server, den Absender, die Warteschlange und den letzten Fehler; ohne SMTP einen Hinweis mit den Variablen ([E-Mail (SMTP)](/configuration-integrations#e-mail-smtp)). **Test-E-Mail** prüft die Verbindung sofort.
## Push-Benachrichtigungen
Ob Mitteilungen an die Apps ankommen können und über welchen Dienst (`/#admin/push`). Die Kachel der Übersicht zeigt das Relay mit einem grünen, gelben oder roten Hinweis – etwa „Erreichbar (85 ms)“ – und die Zustellungen der letzten 24 Stunden; dieselbe Kachel steht unter **Überwachung → Zustand**.
- **Push-Relay**: die verwendete Adresse – das offizielle `https://push.flowplan.org` oder ein eigenes aus `PUSH_RELAY_URL` (Zugangsdaten in der Adresse werden nie angezeigt) –, ob es an ist und sonst genau warum (`PUSH_RELAY=off`, `APP_URL` keine HTTPS-Adresse, `PUSH_RELAY_URL` ungültig), die `APP_URL`, unter der das Relay die Instanz kennt, und ob `/.well-known/flowplan-push` veröffentlicht ist.
- **Erreichbarkeit**: Die Instanz ruft `GET /healthz` ab – höchstens 5 Sekunden, nur HTTPS, ohne Weiterleitungen zu folgen – und zeigt „Erreichbar“ mit der Antwortzeit (und der Version des Relays, falls es eine nennt) oder den Grund: Zeitüberschreitung, Verbindung abgelehnt, DNS, TLS, Weiterleitung, HTTP-Status. Außerdem ruft sie ihr eigenes `/.well-known/flowplan-push` unter `APP_URL` ab, wie das Relay es tut, und prüft, dass der aktuelle Signaturschlüssel darin steht. Klappt das von innen nicht, ist das nur ein Hinweis: Hinter NAT oder einem Proxy, der die eigene Adresse intern nicht auflöst, ist das normal – entscheidend ist, dass das Relay sie von außen erreicht ([Testbenachrichtigung](/notifications#testbenachrichtigung)). Das Ergebnis gilt eine Minute; **Erreichbarkeit prüfen** prüft sofort neu.
- **Signaturschlüssel**: Schlüssel-IDs mit Status (signiert, wartet, auslaufend) und Daten. **Schlüssel wechseln …** fragt nach und wechselt wie in [Push-Relay und Ende-zu-Ende-Verschlüsselung](/configuration-ai-push#push-relay-und-ende-zu-ende-verschluesselung) beschrieben, wahlweise sofort.
- **Zustellungen der letzten 24 Stunden** je Kanal (Relay, Expo, Web Push) und Ergebnis (zugestellt, abgemeldet, abgewiesen, ungültig, gedrosselt, Fehler), die letzte Zustellung über das Relay, der letzte Fehler als Code (etwa `signature HTTP 401` oder `unreachable`), die Warteschlange und die registrierten Geräte je Kanal. Gezählt wird nur mit eingeschalteter Statistik (siehe [Überwachung](#ueberwachung)).
- **Expo und Web Push**: `MOBILE_PUSH` an oder aus, was `MOBILE_PUSH_CONTENT` mitschickt, woher die VAPID-Schlüssel kommen und ob `WEB_PUSH_SUBJECT` gesetzt ist.
Die Antworten enthalten nie Tokens, Schlüssel oder Push-Adressen. `/api/admin/push` ist nur für angemeldete Administratoren, nicht für API-Tokens.
## Chat-Apps
**Administration → Chat-Apps** regelt die [Benachrichtigungen an Chat-Apps](/notifications#chat-apps). Oben stehen erlaubte Dienste, der Bot der Instanz, aktive und nach Fehlern ausgeschaltete Verbindungen und die Zustellungen der letzten 24 Stunden.
- **Erlaubte Dienste:** Telegram, Gotify, ntfy und Matrix lassen sich einzeln ausschalten (Vorgabe: `FLOWPLAN_MESSENGERS`). Ausgeschaltete Dienste bekommen keine Nachrichten mehr; die Verbindungen der Personen bleiben gespeichert und laufen wieder, wenn der Dienst eingeschaltet wird.
- **Telegram-Bot der Instanz:** Bot-Token von @BotFather und optional eine eigene API-Adresse (Bot-API-Server oder Relay/Proxy, auch im eigenen Netz). **Prüfen und speichern** fragt Telegram mit `getMe` nach dem Bot und speichert den Token nur, wenn er angenommen wird – verschlüsselt, angezeigt wird nur „…abcd“. **Bot entfernen** löscht ihn (ein Token aus `FLOWPLAN_TELEGRAM_BOT_TOKEN` gilt dann wieder). Ein Konflikt mit einem Webhook oder einem anderen Programm, das den Bot abfragt, steht unter **Letzter Fehler**.
- **Server-Adressen:** leer erlaubt jeden öffentlichen Server; sonst nur die eingetragenen Hosts, einer pro Zeile (`*.example.org` für Subdomains). `api.telegram.org` und `ntfy.sh` gehen immer. Interne Adressen erlaubt nur `FLOWPLAN_MESSENGER_ALLOW_PRIVATE=true`.
Das Ändern des Bots wird als Sicherheitsereignis „Telegram-Bot der Instanz geändert“ festgehalten, das Ändern der Dienste und Hosts als „Sicherheitsrelevante Einstellung geändert“ – beides auch im [Aktivitätsprotokoll](#aktivitaetsprotokoll).
## KI
Optional und standardmäßig aus: Anbieter (Ollama, OpenAI-kompatibel, Anthropic, Gemini), wer KI nutzen darf, einzelne Funktionen und eigene Schlüssel der Nutzer. Eigener Schalter: **KI auf dem Gerät (Apple)** – standardmäßig erlaubt, weil nichts das Gerät verlässt. Alles dazu unter [KI](/ai#fuer-admins).
## Erweiterungen & Domains
**Block-Erweiterungen von jeder HTTPS-Adresse** (aus: nur aus `PLUGIN_ALLOWED_ORIGINS`) und **Eigene Domains für Veröffentlichungen** – siehe [Block-Erweiterungen](/plugins) und [Coolify und Reverse Proxy](/coolify-and-proxy#eigene-domains-fuer-veroeffentlichungen).
**Marketplace**: Veröffentlichen im und Übernehmen aus dem [Flowplan Marketplace](/marketplace) für die ganze Instanz ein- oder ausschalten.
## Verschlüsselung
Die Schlüssel-ID, frühere Schlüssel, wie viele Dateien im Bucket noch nicht mit diesem Schlüssel verschlüsselt sind (**Bestehende verschlüsseln** holt das nach), und was trotzdem unverschlüsselt den Server verlässt (Litestream, Git-Export). Siehe [Verschlüsselung](/storage-encryption#verschluesselung).
## Aktivitätsprotokoll
Die letzten Änderungen mit Person, Aktion und betroffener Ressource – etwa Freigaben, Rollenwechsel, Löschungen, Einstellungen und Abrechnungsstatus von Zeiten –, durchsuchbar und nach Person und Art gefiltert, auf dem Telefon als Liste. Unter **Exportieren** wählst du optional ein Von- und Bis-Datum (UTC, wie gespeichert) und lädst das Protokoll als **CSV** (Semikolon, mit BOM, für Excel) oder als **JSON** herunter. Werte, die eine Tabellenkalkulation als Formel ausführen würde, beginnen im CSV mit einem Apostroph. Der Export ist nur angemeldeten Admins zugänglich, nie API-Tokens.
## Überwachung
Zustand, Nutzung und Ereignisse der Instanz – live: oben fünf Kennzahlen (**Aktiv 24 Std.**, **Speicher**, **Zustellungen 7 Tage**, **KI-Tokens 14 Tage**, **Fehler 24 Std.**) mit Verlauf und, wo es passt, dem Vergleich zum Zeitraum davor, darunter Karten in zwei Spalten mit Diagrammen, Warteschlangen, Hintergrunddiensten, abgewiesenen Anfragen, Warnungen per Webhook und der Nutzungsstatistik. Details unter [Betrieb und Fehlersuche](/monitoring#administration-ueberwachung).
## Wartung & Hinweise
**Hinweis für alle Personen** – ein Banner für alle, bis du ihn leerst – der **Wartungshinweis** mit Beginn und Ende, der nach dem Ende von selbst verschwindet, und **Banner zum Wegklicken**, die jede Person einmal sieht, bis sie sie schließt – etwa für die Apps oder euren Discord-Server ([Wartung & Hinweise](/monitoring#wartung-hinweise)).
## Instanz
| Einstellung | Wirkung |
| --- | --- |
| Name der Instanz | Erscheint bei der Anmeldung, in der Seitenleiste und im Browser-Tab. |
| Öffentliche Demo | Besucher probieren Flowplan ohne Konto aus, siehe [Demo](#demo). |
| Version | Laufende **Version**, **Commit** (verlinkt auf GitHub) und Build-Datum. Docker-Images aus unserem Workflow kennen ihren Commit; bei Coolify kommt er aus `SOURCE_COMMIT`. Bei einem eigenen Build `--build-arg GIT_COMMIT=$(git rev-parse HEAD)` mitgeben, sonst steht dort „Commit unbekannt“. Ist eine neuere Version da, steht dort ein Hinweis mit **So aktualisierst du**. |
| Admin-Gruppe | Die SSO- oder LDAP-Gruppe aus `OIDC_ADMIN_GROUP`. |
| Neuigkeiten nach Updates für neue Konten | Womit neue Konten bei **Neuigkeiten nach Updates** beginnen: **Alle anzeigen** (Standard), **Nur Breaking Changes** oder **Nie**. Gilt nur für Konten, die danach angelegt werden; bestehende Konten behalten ihre Einstellung, und jede Person kann sie unter **Darstellung & Sprache** ändern. |
Version, Lizenz und Quellcode sehen alle Personen unter **Einstellungen → Über Flowplan**; dort steht bei unseren Images auch, ob es eine Beta oder ein Release ist (eigene Builds: `--build-arg FLOWPLAN_CHANNEL=beta` oder `release`). Wer veränderten Code betreibt, nennt dessen Quellcode mit `FLOWPLAN_SOURCE_URL`; den Link zu GitHub Sponsors blendet `FLOWPLAN_HIDE_SPONSOR=true` aus ([Konfiguration](/configuration-storage#rechtliches-und-oberflaeche)).
Darunter führt **Weitere Einstellungen der Instanz** zu den Bereichen, in die frühere Einstellungen der Instanz umgezogen sind.
## Demo
Die Demo ist auf jeder Instanz ausgeschaltet, bis ein Admin sie unter **Administration → Instanz → Öffentliche Demo** einschaltet.
Dann startet die Adresse `/demo` deiner Instanz eine Demo (auf flowplan.org verlinkt der Knopf **Demo ausprobieren** dorthin). Sie legt ohne Konto einen Demo-Gast mit eigenem Beispiel-Arbeitsbereich an. Jede Demo bekommt frische Beispielseiten, die alle Funktionen zeigen: eine Willkommensseite, einen Editor-Rundgang mit allen Blöcken, eine Projektdatenbank mit Beziehung, Rollup, Formel, Wiederholung und allen Ansichten (Tabelle, Board, Kalender, Zeitleiste, Galerie, Liste, Feed, Diagramm, Formular), ein Whiteboard, ein Journal und ein kleines Wiki.
- Die Demo endet mit **Demo beenden**, beim Abmelden, nach 45 Minuten ohne Aktivität, spätestens nach drei Stunden. Dann werden Konto, Arbeitsbereich, Seiten und Dateien vollständig gelöscht.
- Demo-Gäste können nichts nach außen tragen: nicht veröffentlichen, keine Freigabelinks, keine Einladungen, keine weiteren Arbeitsbereiche, keine öffentlichen Formulare, keine Administration.
- Jeder Demo-Arbeitsbereich hat 25 MB Speicher. Neue Demos sind auf fünf pro Stunde und Adresse sowie 40 gleichzeitig begrenzt.
- Laufende und insgesamt gestartete Demos zeigt **Administration → Überwachung → Instanz in Zahlen**.
---
# Benutzer verwalten
Konten anlegen, sperren, zusammenführen und löschen, Admin-Rechte vergeben und festlegen, wer sich wie anmelden darf.
## Benutzer
Alle Konten als durchsuchbare Tabelle (auf dem Telefon als Karten untereinander) mit ihrem Zustand: **Aktiv**, **Inaktiv** (30 Tage oder länger ohne Anmeldung), **Deaktiviert** (gesperrt), dazu **Admin** (lokale Konten mit Admin-Recht und alle, die zuletzt mit der Admin-Gruppe angemeldet waren, auch per SSO oder LDAP) und **E-Mail unbestätigt**, in wie vielen Arbeitsbereichen die Person Mitglied ist (wie viele davon ihr gehören, zeigt der Tooltip), der belegte Speicher gegen ihre Grenze, wann sie zuletzt da war und wann das Konto erstellt wurde. Ein Klick auf eine Spaltenüberschrift – **Person**, **Status**, **Arbeitsbereiche**, **Speicher**, **Zuletzt aktiv**, **Erstellt** – sortiert danach, ein zweiter dreht die Reihenfolge um; anfangs stehen die zuletzt Aktiven oben. Auf dem Telefon wählst du die Reihenfolge unter **Sortieren nach**. Unten blättert die Tabelle in Seiten zu 25, 50 oder 100 Konten („1–25 von 112“). Die Filter-Knöpfe über der Tabelle (mit der Anzahl) zeigen nur Aktive, Inaktive, Deaktivierte, Admins oder wer **gerade da** ist. Mehrere Konten auf einmal: Häkchen setzen, dann **Sitzungen beenden**, **Sperren** oder **Entsperren**. Damit die Tabelle Platz hat, stehen auf dieser Seite **Anmeldung & SSO** und **Arbeitsbereiche** als Reiter über der Überschrift statt daneben.
**Wer gerade da ist** steht in der Spalte **Zuletzt aktiv** und aktualisiert sich alle 30 Sekunden: ein grüner Punkt für **Jetzt aktiv** (Flowplan ist offen und wurde in den letzten Minuten benutzt), ein gelber für **Geöffnet · inaktiv seit …** (offen, aber seit dieser Zeit nicht berührt – auch ein Tab im Hintergrund), ein grauer mit der Zeit des letzten Besuchs, wenn Flowplan geschlossen ist, und ein leerer Kreis für Konten, die noch nie da waren. Dafür meldet die geöffnete App einmal pro Minute nur, dass sie offen ist und wie lange die letzte Eingabe her ist (Tippen, Klicken, Scrollen, Tippen auf dem Bildschirm) – nicht, was jemand tut oder welche Seite offen ist.
Ein Klick auf die Zeile oder den Namen öffnet das Konto in einem Seitenfenster (auf dem Telefon von unten). Schneller geht es über **⋯** am Ende der Zeile: **Details und Einstellungen**, **Überall abmelden** und **Sperren …** bzw. **Entsperren**. Das Seitenfenster zeigt oben die Arbeitsbereiche der Person (mit Namen, davon eigene), wann sie zuletzt aktiv war, wann das Konto erstellt wurde und wie sie sich anmeldet (z. B. „E-Mail + Passwort · SSO · Passkey“), darunter den belegten **Speicher** mit Balken – alles, was sie hochlädt oder kopiert, über alle Arbeitsbereiche – und:
- **Rolle**: bei Konten mit E-Mail und Passwort **Mitglied** oder **Admin** (eine Person verwaltet die Instanz immer); bei SSO-Konten kommt sie aus der Gruppe der Anmeldung.
- **Speicherlimit** für diese Person.
- **Sitzungen**: auf wie vielen Geräten die Person angemeldet ist; **Abmelden** beendet alle Sitzungen.
- **Passwort** (Konten mit E-Mail und Passwort): **Link erstellen** erzeugt einen zwei Stunden gültigen Link zum Zurücksetzen – zum Weitergeben, wenn die Instanz keine E-Mails verschickt.
- **E-Mail-Adresse**: **Als bestätigt markieren** für Konten, die den Link aus der Bestätigungs-E-Mail noch nicht geöffnet haben.
- Eingeklappt unter **Weitere: …** (die Zeile nennt, was darin steht):
- **Eigene Arbeitsbereiche** und **Größte Datei** als weitere Grenzen. Leer = Standard der Instanz, 0 = unbegrenzt; für Admins gelten keine Grenzen. Sobald du eine dieser Grenzen oder das Speicherlimit änderst, erscheint unten die Leiste **Grenzen speichern**.
- **KI-Funktionen**: Steht unter [Administration → KI](/ai#fuer-admins) „Ausgewählte Personen“, schaltest du hier die KI pro Person frei oder ab.
- **Zwei-Faktor-Anmeldung** (bei Konten mit Authenticator-App): **Zurücksetzen** (etwa bei verlorenem Telefon) schaltet die Authenticator-App des Kontos aus; das steht im Aktivitätsprotokoll, und die Person bekommt eine E-Mail, wenn die Instanz E-Mails versendet.
- **Anmeldemethoden**: ob das Konto ein Passwort hat (oder es entfernt wurde), ob es sich über LDAP anmeldet und welche SSO-Konten verbunden sind – mit Issuer, Adresse, wann verbunden und wann zuletzt benutzt. Verbinden und trennen kann die Person selbst unter **Einstellungen → Konto & Sicherheit**.
- **Konten zusammenführen**: **Zusammenführen …** legt das Konto mit einem zweiten derselben Person zusammen (siehe [Konten zusammenführen](#konten-zusammenfuehren)).
- Am Ende: **Sperren** sperrt das Konto sofort und beendet alle Sitzungen; **Entsperren** gibt es wieder frei. **Konto löschen** (**Löschen …**) geht erst, sobald ein Konto gesperrt ist. Der Dialog nennt vorher, was passiert: Name, E-Mail, Passwort, Passkeys, Sitzungen und persönliche Einstellungen werden gelöscht, ebenso Arbeitsbereiche, in denen nur diese Person Mitglied war, und ihre privaten Bereiche. Gemeinsame Arbeitsbereiche bekommen bei Bedarf ein anderes Mitglied als Eigentümer; Beiträge darin bleiben und erscheinen als „Gelöschtes Konto“. Auch wenn das Konto dafür als leerer Platzhalter bleibt, verschwinden die persönlichen Daten: Kalender-Verbindungen und ihre Abgleiche, CalDAV- und CardDAV-Verknüpfungen, Gast-Zugänge, eigene Schlüssel für verschlüsselte Bereiche, Rechte an einzelnen Einträgen, Geräte, Entwürfe, Einstellungen von Widgets und Seitenleiste, der Besuchsverlauf der Schnellsuche, Sticker und Reaktionen. Es bleiben Inhalte, Versionsverlauf und Urheberschaft sowie erfasste Zeiten (ein laufender Timer stoppt); Freigabelinks, die die Person erstellt hat, funktionieren weiter. Das eigene Konto und das letzte Admin-Konto lassen sich nicht löschen.
Konten mit E-Mail und Passwort entstehen über **Konto erstellen** (siehe [Anmeldung](/sign-in)); SSO-Konten beim ersten Anmelden über OIDC, ihr Admin-Recht kommt aus der Gruppe beim Anbieter. Ob sich Personen selbst registrieren dürfen, stellst du unter [Anmeldung & SSO](#anmeldung-sso) ein.
### Konten zusammenführen
Hat eine Person zwei Konten – etwa ein lokales und eines, das bei der ersten SSO-Anmeldung entstanden ist –, führst du sie im Seitenfenster ihres Kontos unter **Weitere** mit **Zusammenführen …** zusammen. Du wählst das andere Konto (Konten mit derselben E-Mail-Adresse stehen oben) und mit dem Pfeil, welches bestehen bleibt. Die Vorschau nennt, was wechselt, bevor etwas passiert.
Alles des übernommenen Kontos geht auf das bleibende über: eigene Seiten und Bereiche, Mitgliedschaften in Arbeitsbereichen und Bereichen samt Freigaben (die **höhere Rolle** bleibt; Gast nur, wenn die Person überall Gast war), Gruppen, Kommentare und Reaktionen, Erwähnungen in Kommentaren und Dokumenten, Zuweisungen und Personen-Eigenschaften in Datenbanken, Favoriten, Sammlungen, Seitenleiste, Journal, Benachrichtigungen und ihre Einstellungen, Webhooks, Kalender- und Kontakt-Verbindungen, Zeiterfassung, Passkeys, SSO-Konten, das LDAP- und SCIM-Konto und der Verlauf im Aktivitäts- und Sicherheitsprotokoll. Wo beide Konten dasselbe haben (etwa einen Favoriten oder die Seitenleiste eines Arbeitsbereichs), gilt das des bleibenden Kontos.
- **Sitzungen** des übernommenen Kontos enden; **API-Tokens** werden widerrufen (Skripte brauchen ein neues Token des bleibenden Kontos – so liest kein Token plötzlich die Daten eines anderen Kontos).
- **Passwort**: Hat das bleibende Konto keins, übernimmt es das des anderen; sonst bleibt sein eigenes. Ein Admin-Recht eines lokalen Kontos geht mit.
- **Authenticator-App**: wird übernommen, wenn das bleibende Konto keine hat; Wiederherstellungscodes müssen dann neu erzeugt werden.
- **Ende-zu-Ende-Verschlüsselung**: Hat nur das übernommene Konto Schlüssel, gehen sie mit. Haben beide welche, bleiben die des bleibenden Kontos; verschlüsselte Bereiche, die nur das andere Konto hatte, müssen neu freigegeben werden.
- Ältere Versionen von Dokumenten behalten ihre Erwähnungen, wie sie waren.
Das Zusammenführen läuft in einem Schritt – ganz oder gar nicht –, steht im Aktivitätsprotokoll und als „Konten zusammengeführt“ im Sicherheitsprotokoll. Das übernommene Konto wird danach gelöscht. Das eigene Konto kann nur das bleibende sein.
## Anmeldung & SSO
- **Registrierung & Zugang**: **Registrierung mit E-Mail und Passwort** (jede Person darf ein Konto anlegen; ohne diese Einstellung nur eingeladene Adressen und das erste Konto der Instanz), **Alle dürfen Arbeitsbereiche anlegen** und **Inaktive Konten sperren** nach einer Zahl von Tagen ohne Anmeldung. Gesperrte Konten verlieren ihre Sitzungen, ihre API-Tokens funktionieren nicht mehr; die Sperre steht im Aktivitätsprotokoll und lässt sich unter **Benutzer** aufheben. **Inaktive Konten löschen** geht einen Schritt weiter: Nach einer Zahl von Tagen ohne jede Nutzung (mindestens 60 und mehr als beim Sperren) wird ein Konto gelöscht – wie beim Löschen durch einen Admin: persönliche Daten, Arbeitsbereiche und private Bereiche, die nur dieser Person gehören, verschwinden, Beiträge in gemeinsamen Arbeitsbereichen bleiben unter „Gelöschtes Konto“. 14 und 3 Tage vorher bekommt die Person eine E-Mail mit dem Datum; meldet sie sich vorher an, bleibt das Konto. Ist es schon gesperrt, bittet die E-Mail, sich an die Administration zu wenden – schaltest du es unter **Benutzer** wieder frei, ist die Löschung abgesagt. Ohne eingerichteten E-Mail-Versand, für Admin-Konten und für Konten ohne E-Mail-Adresse wird nie gelöscht. Unter **Benutzer** zeigt „Wird am … gelöscht“, wo eine Löschung ansteht; jede Löschung steht im Aktivitätsprotokoll.
- **Zwei-Faktor-Anmeldung**: **Zwei-Faktor-Anmeldung verlangen** – nicht verlangen, nur für Admins oder für alle lokalen Konten –, dazu wie viele lokale Konten schon einen zweiten Faktor haben. Konten ohne Authenticator-App und ohne Passkey richten direkt nach der Anmeldung einen zweiten Faktor ein ([Zwei-Faktor-Anmeldung](/sign-in#zwei-faktor-anmeldung)). SSO-Konten sind nicht betroffen.
- **Sitzungen**: wie lange man angemeldet bleibt – **Browser ohne „Angemeldet bleiben“** (Stunden nach der Anmeldung, Standard 8), **„Angemeldet bleiben“ im Browser anbieten** (Standard aus), **Browser mit „Angemeldet bleiben“** (7, 30, 90 oder 365 Tage ohne Nutzung, Standard 7), **Desktop- und Mobil-Apps** (Standard: angemeldet bleiben; oder wie im Browser ohne „Angemeldet bleiben“) und **Apps: Ende ohne Nutzung** (30, 90 oder 365 Tage, Standard 90). **Standard** folgt den Umgebungsvariablen `SESSION_*` ([Konfiguration](/configuration)); ein hier gewählter Wert hat Vorrang. Die Laufzeit der Apps gilt nur für Anmeldungen, die die App belegt – die Übergabe über den Browser oder das Passwort mit dem Geräteschlüssel der App; der User-Agent allein zählt nicht, und ältere App-Versionen melden sich mit Passwort wie ein Browser an. Siehe [Angemeldet bleiben](/sessions).
- **Single Sign-on (OIDC)**: ob ein Anbieter eingerichtet ist, die Admin-Gruppe und **SSO-Gruppen zentral zuordnen** – Gruppen des Anbieters bekommen Rollen und Gruppen in jedem Arbeitsbereich ([SSO-Gruppen](/sso-oidc#sso-gruppen-arbeitsbereichen-zuordnen)).
- **SCIM-Token** und **LDAP-Verzeichnis** mit ihrem Zustand ([Benutzer bereitstellen mit SCIM](/scim-and-ldap#benutzer-bereitstellen-mit-scim), [Anmeldung mit LDAP](/scim-and-ldap#anmeldung-mit-ldap)).
- **Kontakte aus LDAP**: Basis-DN, Personenfilter, Abgleich und **Weitere Attribute** (welche LDAP-Attribute über die Standardzuordnung hinaus zugeordnet werden dürfen, zusätzlich zu `LDAP_CONTACTS_ATTRIBUTES`) für [Kontakte-Datenbanken](/contacts#kontakte-aus-dem-ldap-verzeichnis); Änderungen werden als Sicherheitsereignis protokolliert. Siehe [Kontakte aus LDAP](/scim-and-ldap#kontakte-aus-ldap).
---
# Anmeldung: Passwort, Passkeys und Zwei-Faktor
Flowplan meldet Personen mit E-Mail und Passwort an, auf Wunsch mit Passkeys. Zusätzlich – oder stattdessen – geht die Anmeldung über einen OpenID-Connect-Anbieter (Single Sign-on), dessen Gruppen bestimmen, wer die Instanz verwaltet.
Die Anmeldeseite zeigt den schnellsten Weg zuerst: einen großen Knopf für den Weg, mit dem du dich auf diesem Gerät zuletzt angemeldet hast (darunter „Zuletzt verwendet“), die übrigen Wege als Knöpfe darunter. **Mit E-Mail und Passwort** öffnet das Formular an Ort und Stelle; **Konto erstellen** steht – wenn die Registrierung offen ist – in der Zeile darunter. Beim ersten Besuch steht Single Sign-on vorn, wenn die Instanz es anbietet, sonst der Passkey, sonst das Formular; Wege, die die Instanz abgeschaltet hat, erscheinen gar nicht, und eine Instanz nur mit Passwort zeigt gleich das Formular. Auf dem Telefon stehen oben das App-Symbol und „Willkommen zurück.“, die Knöpfe unten in Reichweite des Daumens. Ab 960 px Breite ist die Seite geteilt: links eine Fläche in den Farben von Flowplan mit Logo, rechts die Anmeldung. Registrierung, Passwort zurücksetzen, die Einrichtung des zweiten Faktors und das Verbinden von Konten haben denselben Rahmen.
**Mehr zum Thema:** [Angemeldet bleiben](/sessions) · [Single Sign-on mit OIDC](/sso-oidc) · [Benutzer aus dem Verzeichnis: SCIM und LDAP](/scim-and-ldap)
## E-Mail und Passwort
Ohne weitere Einrichtung meldest du dich mit E-Mail und Passwort an – über **Mit E-Mail und Passwort** – oder mit einem Passkey, sobald du einen angelegt hast.
- **Das erste Konto** einer neuen Instanz verwaltet sie: Die Anmeldeseite bietet dann direkt **Konto erstellen** an. Dieses Konto sieht die **Administration**.
- **Instanzen, die aus dem Internet erreichbar sind:** Solange es noch kein Konto gibt, könnte jede Person, die die Adresse öffnet, das erste Konto anlegen und die Instanz verwalten. Setze `FLOWPLAN_SETUP_TOKEN` auf einen zufälligen Wert (z. B. `openssl rand -hex 24`): Das erste Konto lässt sich dann nur über den Einrichtungslink `https://flowplan.example.com/register?setup=` anlegen, ohne ihn bietet die Seite keine Registrierung an. Der Token schützt auch **Aus Sicherung wiederherstellen** auf dem Einrichtungsbildschirm. Sobald das erste Konto existiert, wirkt der Token nicht mehr. Ohne Token und mit einer `APP_URL`, die nicht auf diesen Rechner zeigt, warnt Flowplan beim Start im Log und mit einem Hinweis auf dem Einrichtungsbildschirm. Das Helm-Chart erzeugt den Token selbst. Melden sich zwei Personen gleichzeitig als Erste an, wird nur eine davon Admin; die andere bekommt einen Hinweis. Mit Single Sign-on kannst du den Link auch nie benutzen – Admins kommen dann über die Gruppe aus `OIDC_ADMIN_GROUP`, alle anderen per Einladung.
- **Weitere Konten** entstehen, wenn die Administration unter **Instanz → Registrierung mit E-Mail und Passwort erlauben** die Registrierung öffnet – oder für Adressen mit einer [Einladung](/workspaces-and-permissions): Der Einladungslink öffnet das Formular mit der eingeladenen Adresse und legt nur für sie ein Konto an; ohne E-Mail-Versand geht es nur über den Link. Eingeladene Arbeitsbereiche erscheinen, sobald die Adresse per E-Mail-Link bestätigt ist.
- **E-Mail bestätigen:** Verschickt die Instanz E-Mails (`SMTP_*` gesetzt), meldet sich ein neues Konto erst an, nachdem die Adresse über den Link in der E-Mail bestätigt ist – der Link meldet direkt an. Wer es vorher versucht, bekommt einen Hinweis und den Link erneut (höchstens alle fünf Minuten); **Link erneut senden** geht auch nach der Registrierung. Ohne E-Mail-Versand gilt jedes Konto sofort als bestätigt, ebenso das erste Konto der Instanz. Admins können eine Adresse unter **Administration → Benutzer** im Seitenfenster des Kontos mit **Als bestätigt markieren** von Hand bestätigen; ein Passwort-Zurücksetzen per Link bestätigt sie ebenfalls. Gibt es für die Adresse schon ein Konto, zeigt die Registrierung dasselbe wie bei einer neuen Adresse, und die Inhaberin bzw. der Inhaber bekommt stattdessen einen Hinweis per E-Mail – so verrät die Seite nicht, welche Adressen ein Konto haben.
Öffnest du den Bestätigungslink in einem anderen Browser als dem, in dem du dich registriert hast, legst du dort ein neues Passwort fest – das bei der Registrierung gewählte gilt dann nicht mehr. So kann niemand ein Konto für eine fremde Adresse vorab anlegen und behalten.
- **Passwörter** haben mindestens 10 Zeichen und werden mit scrypt gespeichert. Nach 8 Fehlversuchen für ein Konto von derselben IP-Adresse (oder 30 Fehlversuchen von einer IP-Adresse insgesamt) ist dort für 15 Minuten Pause. Wer deine Adresse kennt, kann dich so nicht aussperren: Von anderen IP-Adressen meldest du dich weiter an. Gegen Versuche von vielen IP-Adressen zugleich wartet jede Anmeldung bei einem Konto mit mehr als 10 Fehlversuchen in 15 Minuten etwas länger (bis zu 5 Sekunden), und nach 100 ist das Konto für den Rest der 15 Minuten gesperrt. Ohne bekannte Client-Adresse (siehe `FLOWPLAN_TRUSTED_PROXIES`) gilt die Grenze von 8 für das Konto selbst. Dasselbe gilt für die Anmeldung mit LDAP. Diese Grenzen – wie die für Codes, Passkeys, Bestätigungen wichtiger Schritte und Passwörter geteilter Links – halten auch bei vielen gleichzeitigen Anfragen: Jeder Versuch zählt, bevor das Passwort geprüft wird.
- **Passwort vergessen**: Mit eingerichtetem [E-Mail-Versand](/configuration-integrations#e-mail-smtp) schickt die Anmeldeseite über **Vergessen?** neben dem Passwortfeld einen Link, der zwei Stunden gilt. Ohne E-Mail erzeugt die Administration unter **Benutzer** im Seitenfenster des Kontos mit **Passwort → Link erstellen** einen Link zum Weitergeben. Nach dem Zurücksetzen sind alle bisherigen Sitzungen beendet.
- **Admin-Recht**: Unter **Benutzer** gibt die Administration es weiter (**Zum Admin machen**) oder entzieht es; eine Person muss die Instanz immer verwalten.
- Name und Passwort ändert jede Person unter **Einstellungen → Konto & Sicherheit** (Karte **Profil** bzw. **Passwort ändern …** in **Anmeldung & Sicherheit**). Der Name wird gespeichert, sobald du das Feld verlässt. Nach einer Passwortänderung, dem Einschalten der Authenticator-App und dem Entfernen eines Passkeys sind alle anderen Sitzungen beendet; die aktuelle bleibt angemeldet. Wer angemeldet eine Demo startet, ist mit dem bisherigen Konto abgemeldet. Ein falsches bisheriges Passwort beim Ändern zählt wie ein falscher Code: Zu viele Fehlversuche sperren für 15 Minuten.
- Registrierung und „Passwort vergessen“ sind pro Adresse bzw. Netzwerkadresse begrenzt (höchstens eine Reset-Mail alle fünf Minuten pro Konto).
`FLOWPLAN_LOCAL_LOGIN=false` schaltet E-Mail, Passwort und Passkeys ab – dann gibt es nur Single Sign-on.
Unter **Einstellungen → Konto & Sicherheit** zeigt die Karte **Anmeldemethoden**, womit du dich anmeldest: E-Mail und Passwort, das Verzeichnis (LDAP) und verbundene SSO-Konten mit Anbieter, Adresse, Datum der Verbindung und letzter Nutzung. Dort verbindest und trennst du SSO-Konten und entfernst oder setzt das Passwort – siehe [Bestehendes Konto mit SSO verbinden](/sso-oidc#bestehendes-konto-mit-sso-verbinden).
## Passkeys
Mit einem Passkey meldest du dich per Fingerabdruck, Gesichtserkennung oder Geräte-PIN an, ohne Passwort. Angelegt werden Passkeys unter **Einstellungen → Konto & Sicherheit → Passkey hinzufügen**; danach genügt auf der Anmeldeseite **Mit Passkey anmelden**.
Unter **Einstellungen → Konto & Sicherheit** stehen in der Karte **Anmeldung & Sicherheit** Passwort, Zwei-Faktor-Anmeldung, Passkeys und die angemeldeten Geräte untereinander, jeweils mit ihrem Zustand („Aus“, „An · 8 Codes übrig“, „2 Passkeys“). **Konto löschen** steht ganz unten in der **Gefahrenzone**. Direkt öffnen lassen sich die Karten mit Adressen wie `/#settings/account/passkeys` oder `/#settings/account/two-factor`.
- Passkeys gibt es für Konten mit E-Mail und Passwort. SSO-Konten melden sich beim Anbieter an, der seinerseits Passkeys anbieten kann.
- Passkeys gehören zur Domain aus `APP_URL`. Sie brauchen HTTPS (oder `http://localhost` beim Entwickeln); eine reine IP-Adresse funktioniert nicht. Wer die Domain wechselt, legt die Passkeys neu an.
- Ein Passkey lässt sich in den Einstellungen jederzeit wieder entfernen.
- In der Desktop-App öffnen **Mit Passkey anmelden** und **Mit SSO anmelden** die Anmeldung im Standardbrowser und geben sie danach an die App zurück ([Desktop-Apps](/operations#desktop-apps)).
## Zwei-Faktor-Anmeldung
Konten mit E-Mail und Passwort können zusätzlich eine Authenticator-App nutzen (Zwei-Faktor-Authentifizierung, 2FA), etwa Aegis, 2FAS, Google Authenticator oder 1Password.
::: steps
1. **Einstellungen → Konto & Sicherheit → Zwei-Faktor-Anmeldung → Authenticator-App einrichten.**
2. Den QR-Code mit der App scannen – oder den angezeigten Schlüssel abtippen.
3. Mit dem aktuellen sechsstelligen Code bestätigen.
4. Die zehn **Wiederherstellungscodes** sicher aufbewahren. Sie werden nur einmal angezeigt, jeder funktioniert genau einmal.
:::
Bei der Anmeldung fragt Flowplan nach dem Passwort nach dem Code aus der App (oder einem Wiederherstellungscode).
- Ein Code gilt nur einmal; Codes aus dem vorigen und nächsten 30-Sekunden-Fenster werden angenommen, damit eine leicht falsch gehende Uhr nicht stört.
- Zu viele falsche Codes sperren für 15 Minuten.
- **Passkeys** reichen allein: Wer sich mit einem Passkey anmeldet, braucht keinen Code – auch wenn die App eingeschaltet ist. Wer zusätzlich einen Code möchte, schaltet unter **Einstellungen → Konto & Sicherheit → Zwei-Faktor-Anmeldung → Verwalten** die Option **Auch nach dem Passkey einen Code verlangen** ein. Ausschalten verlangt das Passwort oder einen aktuellen Code.
- **SSO-Konten** regeln den zweiten Faktor beim Anbieter; **API-Tokens** sind nicht betroffen.
- **Ausschalten** und **neue Wiederherstellungscodes** verlangen das Passwort oder einen aktuellen Code.
- Auch nach **Passwort vergessen** bleibt der zweite Schritt bestehen.
- Telefon verloren und keine Codes mehr? Die Administration kann die Zwei-Faktor-Anmeldung zurücksetzen ([Administration → Benutzer](/user-management#benutzer)).
> [!ADMIN]
> Admins können die Zwei-Faktor-Anmeldung für alle lokalen Konten oder nur für Admins verlangen ([Administration → Anmeldung & SSO](/user-management#anmeldung-sso)). Konten ohne App und ohne Passkey richten dann direkt nach der Anmeldung einen zweiten Faktor ein, bevor sie Flowplan nutzen; Konten mit Passkey, aber ohne App melden sich mit dem Passkey an.
> [!IMPORTANT]
> Die Schlüssel der Apps werden verschlüsselt gespeichert – mit `FLOWPLAN_ENCRYPTION_KEY`, sonst `FLOWPLAN_SECRETS_KEY`, sonst mit der automatisch angelegten Datei `secrets.key` im Datenordner ([Konfiguration](/configuration-storage#gespeicherte-geheimnisse)). Diese Datei oder den Schlüssel unbedingt mitsichern: Die Instanzsicherung enthält sie bewusst nicht. Ohne sie funktionieren nach einer Wiederherstellung nur noch die Wiederherstellungscodes.
## Sicherheitscheck
**Einstellungen → Sicherheitscheck** (`/#settings/security`) zeigt jeder Person, wie gut ihr Konto geschützt ist – zugeschnitten auf die Art der Anmeldung:
- **Der Check:** zweiter Faktor, Passkey und übrige Wiederherstellungscodes (bei E-Mail-Konten), bestätigte E-Mail-Adresse, Geräte, die seit über einem Monat ungenutzt sind, API-Tokens ohne Ablauf oder seit drei Monaten ungenutzt, Links zum Bearbeiten ohne Passwort und Ablaufdatum, ob Sicherheitshinweise per Push oder E-Mail ankommen, und fehlgeschlagene Anmeldungen am eigenen Konto. Offene Punkte stehen oben, jeweils mit dem Weg zur Lösung. Bei SSO und LDAP verweist er auf den Anbieter bzw. das Verzeichnis.
- **Was du geteilt hast:** eigene Freigabelinks (mit Recht und Schutz), öffentliche Seiten, die du angelegt hast, und Personen oder offene Einladungen mit eigenem Zugriff auf deine Seiten – jeweils direkt zu löschen, zu beenden oder zu entziehen.
- **Anmeldungen & Änderungen** der letzten 30 Tage mit Gerät und Netz, auch fehlgeschlagene Versuche mit deiner Adresse.
- **Tipps**, passend zum Konto.
Meldet sich jemand mit einem Gerät an, das 90 Tage nicht dabei war, kommt außerdem ein Sicherheitshinweis.
## Sicherheit
Bei OIDC prüft Flowplan Discovery, Issuer, Audience, Signatur, PKCE, State und Nonce. Sitzungen sind zufällige Tokens, gehasht in SQLite gespeichert; Cookies sind `HttpOnly`, `SameSite=Lax` und bei HTTPS `Secure`. Gruppen oder Rollen werden nie aus Browserdaten übernommen.
- Ein in der Administration **deaktiviertes Konto** verliert sofort alle Sitzungen; offene Live-Verbindungen werden spätestens nach 15 Sekunden geschlossen, ebenso wenn Leserechte entzogen werden.
- Jede Seite trägt eine **Content-Security-Policy**: Skripte laufen nur mit einer pro Anfrage neuen Nonce, Frames nur von den unterstützten Playern (YouTube, Vimeo, Loom, Spotify, Figma, CodePen). HSTS setzt der Reverse Proxy (bei Traefik/Coolify in der Regel aktiv).
- Sitzungen lassen sich in der Administration gezielt widerrufen.
- Einladungen an eine E-Mail-Adresse werden erst nach einer Anmeldung mit `email_verified=true` zugeordnet.
## Häufige Fehler
| Symptom | Ursache |
| --- | --- |
| Fehler zur Redirect-URI | Beim Anbieter eingetragene URI passt nicht exakt zu `APP_URL` + `/api/auth/callback`. |
| Keine Administration sichtbar | Gruppe fehlt im Token: Scope, `OIDC_GROUPS_CLAIM` und exakten Gruppennamen prüfen, danach neu anmelden. |
| „Ungültiger Anfrageursprung“ | `APP_URL` weicht von der aufgerufenen Adresse ab (z. B. `http` statt `https`). |
| Anmeldung abgelehnt | `OIDC_ALLOWED_GROUP` gesetzt und die Person ist nicht Mitglied. |
| „Konto erstellen“ fehlt | Die Registrierung ist geschlossen: in der Administration öffnen oder die Person einladen. |
| Passkey lässt sich nicht anlegen | `APP_URL` ist keine HTTPS-Domain (IP-Adresse oder `http://` außer `localhost`). |
---
# Angemeldet bleiben
Wie lange eine Sitzung dauert, legt die Administration unter **Administration → Anmeldung & SSO → Sitzungen** fest ([Administration](/user-management#anmeldung-sso)); ohne Einstellung dort gelten die Umgebungsvariablen und ihre Standards.
| Wo | Wie lange (Standard) | Einstellung · Variable |
| --- | --- | --- |
| Browser ohne **Angemeldet bleiben** | 8 Stunden nach der Anmeldung – auch wenn Flowplan offen ist | **Browser ohne „Angemeldet bleiben“** · `SESSION_HOURS` (1–24) |
| Browser mit **Angemeldet bleiben** | 7 Tage nach der letzten Nutzung, höchstens 30 Tage nach der Anmeldung | **„Angemeldet bleiben“ im Browser anbieten** · `SESSION_REMEMBER` (Standard aus), **Browser mit „Angemeldet bleiben“** · `SESSION_IDLE_HOURS` |
| Desktop- und Handy-App | 90 Tage nach der letzten Nutzung der App oder ihrer Widgets, höchstens 365 Tage nach der Anmeldung | **Desktop- und Mobil-Apps** · `SESSION_APP_REMEMBER` (Standard an), **Apps: Ende ohne Nutzung** · `SESSION_APP_DAYS` |
- **Im Browser** zeigt die Anmeldeseite das Kästchen **Angemeldet bleiben**, sobald die Administration es anbietet – für Passwort, Passkey und SSO (auch über den Umweg „Konto verbinden“). Gedacht ist es für eigene Geräte: Mit Haken lebt die Sitzung weiter, solange Flowplan genutzt wird. Die längste Dauer (`SESSION_MAX_DAYS`, Standard 30 Tage, nie kürzer als die Zeit ohne Nutzung) begrenzt, wie lange ein gestohlenes Cookie taugt.
- **Die Apps** laufen auf persönlichen Geräten und bleiben immer angemeldet – egal ob mit Passwort in der App oder mit Passkey bzw. SSO über den Browser angemeldet. Die Widgets halten die Sitzung ebenfalls am Leben. Die App muss die Anmeldung als ihre belegen; dass ihr Name im User-Agent steht, reicht nicht, denn den kann jeder Browser senden:
- **Passkey, SSO oder „Im Browser anmelden“**: Die Übergabe zurück an die App ist der Beleg – einlösen kann sie nur die App, die die Anmeldung gestartet hat. Das funktioniert mit jeder App-Version.
- **Passwort in der App**: Neuere Apps (iPhone, iPad und Android nach 1.0.5, Desktop nach 1.3.0) erzeugen beim ersten Start pro Server einen zufälligen Geräteschlüssel, bewahren ihn im Schlüsselspeicher des Systems auf (Schlüsselbund, Android Keystore, Schlüsselspeicher des Computers) und senden ihn mit dem Passwort. Die erste Anmeldung eines Kontos auf dem Gerät registriert den Schlüssel, spätere Anmeldungen brauchen denselben. Der Server speichert nur einen Hash.
- **Ältere App-Versionen** (etwa 1.0.5) haben keinen Geräteschlüssel: Nach einer Anmeldung mit Passwort bleiben sie so lange angemeldet wie ein Browser – 8 Stunden oder mit **Angemeldet bleiben**, wo die Instanz es anbietet (das Kästchen erscheint dann auch in der App). Anmeldungen mit Passkey oder SSO behalten die Laufzeit der App, ebenso App-Sitzungen, die schon vorher bestanden. Wer das für die Instanz nicht will, stellt **Desktop- und Mobil-Apps** auf **Wie im Browser ohne „Angemeldet bleiben“** (`SESSION_APP_REMEMBER=false`). Zusätzlichen Schutz auf dem Handy gibt die **App-Sperre** in den Einstellungen der App (Face ID, Touch ID, Fingerabdruck oder Gerätecode, auf iPhone, iPad und Android).
- SSO-Sitzungen verlängern sich genauso. Gruppenänderungen beim Anbieter wirken über SCIM, den LDAP-Abgleich oder die nächste Anmeldung. Nur wenn `SESSION_GROUPS_HOURS` gesetzt ist, endet eine SSO-Sitzung, die angemeldet bleibt, schon nach so vielen Stunden: Die neue Anmeldung beim Anbieter holt die aktuellen Gruppen, so wirken `OIDC_ALLOWED_GROUP` und `OIDC_ADMIN_GROUP` auch ohne SCIM spätestens dann.
- Ein deaktiviertes Konto verliert den Zugriff sofort, wie bisher.
- Meldet sich dieselbe Person auf einem Gerät neu an (etwa weil die Sitzung abgelaufen ist), bleibt die Registrierung der App erhalten – Mitteilungen, Widgets, Live Activities und Kurzbefehle gehen auf die neue Sitzung über. Erst ausdrückliches **Abmelden** (in der App oder unter **Angemeldete Geräte**) entfernt sie.
- Kürzere Zeiten gelten ab der nächsten Anmeldung; längere verlängern Sitzungen, die angemeldet bleiben, bei ihrer nächsten Nutzung. Wer „Angemeldet bleiben“ oder das Angemeldet-Bleiben der Apps ausschaltet, beendet das Verlängern; laufende Sitzungen enden dann zu ihrem nächsten Ablauf.
**Einstellungen → Konto & Sicherheit → Angemeldete Geräte** listet alle eigenen Sitzungen mit Gerät, letzter Nutzung und Ende; **Abmelden** beendet eine einzelne, **Alle anderen Geräte abmelden** alle bis auf die aktuelle.
---
# Single Sign-on mit OIDC
Anmeldung über den eigenen Identitätsanbieter – Keycloak, Authentik, Entra ID, Google, Okta oder jeden OpenID-Connect-Dienst –, mit Gruppen für Admins und Arbeitsbereiche.
Optional. Mit gesetztem `OIDC_ISSUER` zeigt die Anmeldeseite **Mit SSO anmelden**; neue Personen entstehen beim ersten Anmelden. E-Mail-Konten und SSO-Konten können nebeneinander bestehen.
## Client beim Anbieter anlegen
Einen **vertraulichen Web-Client** registrieren – oder einen **öffentlichen Client**: Ist `OIDC_CLIENT_SECRET` leer, meldet sich Flowplan ohne Secret an und verlässt sich allein auf PKCE. Das passt zu Anbietern, die viele Instanzen mit einem Client bedienen. Anbieter, die ID-Tokens nur mit dem Client-Secret signieren (HS256), brauchen einen vertraulichen Client.
| Einstellung | Wert |
| --- | --- |
| Redirect-URI | `https://flowplan.example.com/api/auth/callback` |
| Flow | Authorization Code mit PKCE (S256) |
| Scopes | `openid profile email` und der Scope für Gruppen (oft `groups`) |
| Gruppen | müssen im signierten ID-Token oder in der UserInfo-Antwort stehen |
Die Redirect-URI ist immer `APP_URL` plus `/api/auth/callback`.
## Variablen
```dotenv
APP_URL=https://flowplan.example.com
OIDC_ISSUER=https://id.example.com/realms/company
OIDC_CLIENT_ID=flowplan
OIDC_CLIENT_SECRET=geheim
OIDC_SCOPES=openid profile email groups
OIDC_GROUPS_CLAIM=groups
OIDC_ADMIN_GROUP=flowplan-admins
SESSION_HOURS=8
```
| Variable | Bedeutung |
| --- | --- |
| `OIDC_ISSUER` | Issuer-URL; Flowplan liest daraus die Discovery (`/.well-known/openid-configuration`). |
| `OIDC_GROUPS_CLAIM` | Claim mit den Gruppen, auch als Pfad wie `realm_access.roles`. |
| `OIDC_ADMIN_GROUP` | Mitglieder dieser Gruppe sehen die **Administration**. Der Name wird exakt verglichen. |
| `OIDC_ALLOWED_GROUP` | Wenn gesetzt, dürfen sich nur Mitglieder dieser Gruppe anmelden. |
| `OIDC_LINKED_SSO_ONLY` | `true`: Konten, die mit SSO verbunden sind, melden sich nur noch über SSO an (Standard aus). Anmelden mit Passwort oder Passkey wird mit einem Hinweis abgelehnt; Passkeys und die Authenticator-App bleiben zum Bestätigen wichtiger Schritte. Siehe [Bestehendes Konto mit SSO verbinden](#bestehendes-konto-mit-sso-verbinden). |
| `OIDC_NEW_ACCOUNTS` | `false`: Die SSO-Anmeldung legt keine neuen Konten an (Standard an) – nur bestehende, verbundene oder per SCIM bereitgestellte Konten melden sich an. Bei der ersten SSO-Anmeldung mit bekannter Adresse fehlt dann „Stattdessen ein eigenes Konto anlegen“. |
| `OIDC_PROMPT_CREATE` | `true`: **Registrieren** öffnet direkt die Registrierung des Anbieters (`prompt=create`). |
| `OIDC_PICTURE` | Profilbild aus dem Claim `picture` übernehmen (Standard an, `off` schaltet ab). Das Bild muss unter einer öffentlichen HTTPS-Adresse liegen; interne Adressen werden – auch über Weiterleitungen – nicht abgerufen. |
| `SESSION_HOURS` | Gültigkeit einer Browser-Sitzung in Stunden, solange „Angemeldet bleiben“ nicht genutzt wird; die Apps bleiben angemeldet (siehe [Angemeldet bleiben](/sessions)). |
## Gruppennamen bei verbreiteten Anbietern
- **Keycloak**: Mapper „Group Membership“ zum Client hinzufügen, Token Claim Name `groups`, „Full group path“ ausschalten – sonst heißt die Gruppe `/flowplan-admins`. Für Realm-Rollen stattdessen `OIDC_GROUPS_CLAIM=realm_access.roles`.
- **Authentik**: Der Scope `profile` liefert `groups` bereits mit den Gruppennamen – ein Scope `groups` ist nicht nötig. Der Issuer ist die Adresse des Providers mit Schrägstrich am Ende, z. B. `https://auth.example.org/application/o/flowplan/`. Ohne **Signaturschlüssel** (Signing Key) am Provider signiert Authentik das ID-Token mit dem Client-Secret (HS256); Flowplan akzeptiert das ab Version 0.8.3. Mit Signaturschlüssel (RS256) prüft Flowplan die Signatur zusätzlich gegen die veröffentlichten Schlüssel des Providers. Wird der OAuth2-Provider über die API angelegt, setze `grant_types` ausdrücklich auf `["authorization_code"]` (dazu `"refresh_token"`, wenn Tokens erneuert werden sollen): Ohne diese Angabe bekommt er in Authentik 2026.8 eine leere Liste, und jede Anmeldung scheitert mit `invalid_request` („The request is otherwise malformed“), ohne dass die Meldung auf die Ursache zeigt.
- **Zitadel**: Rollen stehen unter `urn:zitadel:iam:org:project:roles`; einen eigenen Claim per Action anlegen oder den Pfad eintragen.
- **Entra ID**: Gruppen-Claim im Token konfigurieren. Entra liefert standardmäßig Objekt-IDs; dann die ID der Admin-Gruppe als `OIDC_ADMIN_GROUP` eintragen.
## Wenn die SSO-Anmeldung fehlschlägt
Das Server-Log nennt den Grund: eine Zeile `OIDC sign-in failed:` mit der Art des Fehlers, seinem Code und – wenn der Provider mit einem Fehler geantwortet hat – dessen `error` und `error_description` (nie Tokens oder Secrets). Häufige Ursachen:
- **Redirect-URI**: Der Provider muss genau `/api/auth/callback` erlauben. `APP_URL` muss die Adresse im Browser sein – sonst lehnt der Provider die Weiterleitung ab oder das Anmelde-Cookie fehlt („Anmeldung abgelaufen“).
- **Issuer**: `OIDC_ISSUER` muss Zeichen für Zeichen dem `issuer` in der Discovery des Providers entsprechen, einschließlich Schrägstrich am Ende.
- **Client-Secret** falsch, oder ein Secret gesetzt für einen Client, den der Anbieter als öffentlich führt (bzw. keines für einen vertraulichen): Der Token-Endpunkt antwortet mit `invalid_client`.
- **`unexpected JWT "alg"`**: Der Provider signiert ID-Tokens mit einem anderen Verfahren, als er in seiner Discovery angibt.
## Bestehendes Konto mit SSO verbinden
Ein Konto kann sich auf mehreren Wegen anmelden: mit E-Mail und Passwort, über LDAP und über ein oder mehrere SSO-Konten (OIDC). Wer zuerst ein lokales Konto angelegt hat und später SSO bekommt, verbindet beides – statt ein zweites Profil zu bekommen.
**Aus den Einstellungen:** Unter **Einstellungen → Konto & Sicherheit → Anmeldemethoden** wählst du **SSO verbinden …**, bestätigst mit deinem Passwort, einem Code aus der Authenticator-App oder einem Passkey und meldest dich danach beim Anbieter an. Das SSO-Konto (Anbieter und Kennung) gehört ab dann zu deinem Konto; du meldest dich mit beidem an. Der Vorgang gilt nur für dein Konto und die Sitzung, in der du ihn gestartet hast, zehn Minuten lang.
- Gehört das SSO-Konto schon zu einem anderen Flowplan-Konto, wird nichts verbunden. Bitte dann die Administration, die beiden Konten [zusammenzuführen](/user-management#konten-zusammenfuehren).
- **Trennen** (Papierkorb neben dem SSO-Konto) geht nur, solange eine andere Anmeldemethode bleibt: ein Passwort, LDAP oder ein weiteres SSO-Konto.
- **Passwort entfernen …** gibt es, sobald ein SSO-Konto verbunden ist: Danach meldest du dich nur noch über SSO an. Passkeys und die Authenticator-App bleiben, um wichtige Schritte zu bestätigen. **Passwort festlegen …** gibt dem Konto jederzeit wieder ein Passwort.
- Verbinden, Trennen und das Passwort entfernen oder festlegen bestätigst du jedes Mal neu – mit dem Passwort, einem Code aus der App oder einem Passkey. Ein Konto ohne all das (nur SSO) bestätigt mit einer Anmeldung, die höchstens zehn Minuten zurückliegt.
**Bei der ersten SSO-Anmeldung:** Meldet sich ein SSO-Konto zum ersten Mal an, dessen E-Mail-Adresse der Anbieter **bestätigt** hat (`email_verified`), und gibt es genau ein Flowplan-Konto mit dieser Adresse, das sich mit Passwort, LDAP oder Passkey anmeldet, legt Flowplan kein neues Konto an. Stattdessen fragt eine Seite: „Es gibt schon ein Konto mit dieser E-Mail-Adresse – verbinden?“ Du bestätigst das bestehende Konto mit seinem Passwort (und dem Code aus der App, wenn sie eingeschaltet ist) oder seinem Passkey; danach sind beide verbunden und du bist angemeldet. **Stattdessen ein eigenes Konto anlegen** gibt es nur, wenn die Instanz neue SSO-Konten zulässt (siehe `OIDC_NEW_ACCOUNTS` unter [Konfiguration](/configuration#anmeldung)). Ohne Nachweis wird nie verbunden; falsche Passwörter und Codes zählen wie bei der normalen Anmeldung gegen die Sperre nach zu vielen Versuchen.
Gut zu wissen:
- Ein verbundenes Konto mit E-Mail und Passwort behält seinen Namen, sein Bild und sein Admin-Recht; SSO-Gruppenzuordnungen ändern seine Mitgliedschaften wie bisher nicht.
- Mit `OIDC_LINKED_SSO_ONLY=true` melden sich verbundene Konten nur noch über SSO an – mit Passwort oder Passkey kommt dann ein klarer Hinweis, „Mit SSO anmelden“ zu wählen. Passkeys und die App bleiben zum Bestätigen.
- Verbinden, Trennen, abgelehnte Verbindungen, das Entfernen des Passworts und Zusammenführungen stehen im Sicherheitsprotokoll (**Administration → Sicherheit**).
- LDAP-Konten bleiben über ihren DN verknüpft; sie können SSO genauso verbinden (Nachweis mit dem Verzeichnispasswort). Das LDAP-Konto selbst lässt sich nicht trennen.
- Beim Verbinden fragt Flowplan den Anbieter mit `prompt=login`, damit nicht versehentlich ein anderes, dort noch angemeldetes Konto verbunden wird.
- Mit `OIDC_ALLOWED_GROUP` lassen sich nur SSO-Konten dieser Gruppe verbinden – wie bei der Anmeldung.
## SSO-Gruppen Arbeitsbereichen zuordnen
Gruppen aus dem Identitätsanbieter (der Claim aus `OIDC_GROUPS_CLAIM`) können Mitgliedschaft und Gruppen in Arbeitsbereichen geben – so verwaltet ihr den Zugang zentral im Anbieter.
- **Admins** ordnen Gruppen zu – für jeden Arbeitsbereich zentral unter **Administration → Anmeldung & SSO → SSO-Gruppen zentral zuordnen** oder, wenn sie dort Eigentümer sind, unter **Einstellungen → Gruppen & Rechte → SSO-Gruppen**.
- **Eigentümer**, die keine Admins sind, sehen dort die Zuordnungen ihres Arbeitsbereichs, ändern sie aber nicht. Eine Zuordnung holt Personen der ganzen Instanz in einen Arbeitsbereich und zeigt dort ihre Adressen – das entscheidet die Administration.
- Eine Zuordnung gibt eine **Rolle** (Ansehen, Bearbeiten, Eigentümer), eine **Gruppe des Arbeitsbereichs** (für [Seitenrechte](/workspaces-and-permissions#gruppen)) oder beides.
Bei jeder SSO-Anmeldung gleicht Flowplan ab:
- Passende Personen kommen hinzu; bei mehreren passenden Gruppen gilt die höchste Rolle. Gäste bleiben höchstens bei „Bearbeiten“.
- Wer die SSO-Gruppe nicht mehr hat, verliert, was die Zuordnung gegeben hat.
- **Die Zuordnung hat immer Vorrang.** Passt eine Zuordnung auf eine Person, setzt Flowplan Rolle und Gruppen so, wie die Zuordnung sagt – auch wenn das Mitglied von Hand hinzugefügt oder geändert wurde. Ab dann wird die Mitgliedschaft über SSO verwaltet.
- Mitglieder und Gruppenmitgliedschaften, auf die keine Zuordnung passt und die nie aus SSO kamen, bleiben unberührt.
- Der letzte Eigentümer eines Arbeitsbereichs bleibt immer.
- Geänderte Zuordnungen gelten sofort für alle mit einer aktiven SSO-Sitzung, sonst bei der nächsten Anmeldung (mit „Angemeldet bleiben“ und gesetztem `SESSION_GROUPS_HOURS` spätestens danach).
- Konten mit E-Mail und Passwort sind nicht betroffen.
> **Hinweis: Änderungen von Hand bei aktivem SSO.** Ändert ein Eigentümer die Rolle oder eine Gruppe eines Mitglieds, das über eine SSO-Gruppe kommt (in der Mitgliederliste mit „über SSO-Gruppe …“ markiert), gilt die Änderung nur bis zur nächsten SSO-Anmeldung dieser Person oder bis zur nächsten Änderung der Zuordnungen. Danach setzt die Zuordnung Rolle und Gruppen wieder. Flowplan zeigt das direkt nach der Änderung an. Soll eine Rolle dauerhaft anders sein, ändert die Administration die Zuordnung – oder die Gruppen der Person im Identitätsanbieter.
In der Mitgliederliste und im Gruppendialog steht bei solchen Mitgliedern „über SSO-Gruppe „X““.
---
# Benutzer aus dem Verzeichnis: SCIM und LDAP
Konten aus dem Identitätsanbieter per SCIM anlegen und entfernen lassen oder die Anmeldung gegen ein LDAP-Verzeichnis wie Active Directory prüfen.
## Benutzer bereitstellen mit SCIM
Mit SCIM 2.0 legt der Identitätsanbieter Konten in Flowplan an, hält Name und Adresse aktuell und deaktiviert Konten, sobald jemand das Unternehmen verlässt – ohne dass sich die Person vorher anmelden muss. Flowplan spricht SCIM 2.0 nach RFC 7643/7644 (Benutzer und Gruppen, Filter, PATCH).
**Einrichten**
::: steps
1. **Administration → Anmeldung & SSO → SCIM-Token**: **Token erstellen**. Der Token beginnt mit `fpscim_` und wird nur einmal angezeigt; gespeichert ist nur sein Hash. Widerrufen geht jederzeit.
2. Beim Anbieter die **SCIM-Basis-URL** `/api/scim/v2` und den Token als **Bearer-Token** eintragen.
3. Im Anbieter Personen und Gruppen der App zuweisen bzw. „Push Groups“ einschalten.
:::
**Was Flowplan daraus macht**
- **Konten**: Ein neues SCIM-Konto ist ein SSO-Konto. Gibt es schon ein Konto mit derselben E-Mail-Adresse, wird es verknüpft statt verdoppelt. Bei der ersten OIDC-Anmeldung übernimmt die Person das vorbereitete Konto – über die `externalId` (= `sub` des Anbieters) oder eine bestätigte E-Mail-Adresse.
- **Deaktivieren**: `active: false` deaktiviert das Konto wie **Sperren** in der Administration – alle Sitzungen enden sofort, API-Tokens hören auf zu funktionieren. `active: true` aktiviert es wieder. **Löschen** (DELETE) deaktiviert und trennt die Verknüpfung; Inhalte und das Konto selbst bleiben, endgültig löscht weiterhin die Administration. Das letzte Admin-Konto mit Passwort lässt sich über SCIM nicht deaktivieren.
- **Gruppen**: SCIM-Gruppen legen keine Gruppen in Flowplan an. Ihr **Anzeigename** zählt wie eine SSO-Gruppe aus dem Token: Die [SSO-Zuordnungen](/sso-oidc#sso-gruppen-arbeitsbereichen-zuordnen) geben Rolle und Arbeitsbereichsgruppen, und alle Regeln von dort gelten (die Zuordnung hat Vorrang, der letzte Eigentümer bleibt). Änderungen an Mitgliedschaften wirken sofort, nicht erst bei der nächsten Anmeldung. OIDC-Gruppen und SCIM-Gruppen einer Person werden zusammengezählt.
- Konten mit E-Mail und Passwort können verknüpft und deaktiviert werden; Zuordnungen ändern ihre Mitgliedschaften aber nicht.
- Die **letzten SCIM-Anfragen** mit Status stehen in der Administration – hilfreich, wenn der Anbieter Fehler meldet.
Nicht unterstützt: Bulk, Sortierung, `/Me` und Passwortänderungen (Flowplan speichert für SCIM-Konten kein Passwort).
### SCIM bei verbreiteten Anbietern
- **Okta**: App-Integration (SAML oder OIDC) → **Provisioning** → „SCIM connector base URL“ = `/api/scim/v2`, „Unique identifier field for users“ = `userName`, Authentication Mode **HTTP Header** mit dem Token. Unter „To App“ *Create Users*, *Update User Attributes* und *Deactivate Users* einschalten; Gruppen unter **Push Groups** hinzufügen.
- **Microsoft Entra ID**: Unternehmensanwendung → **Bereitstellung** → Modus *Automatisch*, „Mandanten-URL“ = `/api/scim/v2`, „Geheimes Token“ = der Token, **Verbindung testen**. In den Attributzuordnungen `userPrincipalName` → `userName` und `objectId` → `externalId` belassen; Bereich auf „Nur zugewiesene Benutzer und Gruppen“. Entra arbeitet in Zyklen von etwa 40 Minuten.
- **Authentik**: **Anwendungen → Provider → SCIM-Provider anlegen**, URL `/api/scim/v2`, Token eintragen; den Provider als **Backchannel-Provider** an die Flowplan-Anwendung hängen. Gruppen werden mit ihrem Namen übertragen.
- **Keycloak**: Keycloak bringt kein SCIM-Client mit; dafür eine SCIM-Erweiterung (z. B. „keycloak-scim“) installieren oder LDAP bzw. OIDC-Gruppen nutzen.
## Anmeldung mit LDAP
Ist `LDAP_URL` gesetzt, prüft das Passwortfeld der Anmeldeseite Namen gegen ein LDAP-Verzeichnis (OpenLDAP, 389 DS, Active Directory, …). Das Feld heißt dann **E-Mail-Adresse oder Benutzername**.
- **Konten mit E-Mail und Passwort** melden sich weiter mit ihrem Flowplan-Passwort an. Alle anderen Namen sucht Flowplan mit dem Suchkonto (`LDAP_BIND_DN`) und `LDAP_USER_FILTER` unter `LDAP_BASE_DN` und prüft das Passwort mit einem Bind als diese Person. Leere Passwörter werden nie gesendet; der Name wird nach RFC 4515 maskiert, `*` oder `)` im Namen ändern den Filter also nicht.
- Ein LDAP-Konto ist ein Verzeichniskonto wie ein SSO-Konto: Beim ersten Mal wird es über den DN angelegt oder mit einem vorhandenen SSO-/SCIM-Konto derselben Adresse verknüpft. Ein Konto mit E-Mail und Passwort derselben Adresse wird nie übernommen.
- **Gruppen** kommen aus `LDAP_GROUP_ATTRIBUTE` (Standard `memberOf`): Flowplan nimmt den Gruppennamen (das erste RDN, meist der CN, z. B. `flowplan-admins`) **und** den vollständigen DN. Beides kann in den [SSO-Zuordnungen](/sso-oidc#sso-gruppen-arbeitsbereichen-zuordnen) und als `OIDC_ADMIN_GROUP` stehen.
- **Stündlicher Abgleich**: Flowplan liest alle LDAP-Konten neu – Gruppen, Name, Adresse. Wer im Verzeichnis fehlt oder dort gesperrt ist (Active Directory `userAccountControl`, 389 DS `nsAccountLock`, OpenLDAP-ppolicy `pwdAccountLockedTime`), wird deaktiviert; ist die Person wieder da, wird sie wieder aktiviert. Von Admins deaktivierte Konten bleiben deaktiviert. Würde ein Lauf mehr als die Hälfte (mindestens fünf) der Konten deaktivieren, bricht er ab – das ist eher eine falsche Konfiguration.
- Die **Zwei-Faktor-Anmeldung** gilt wie bei Passwörtern: LDAP-Konten können eine Authenticator-App einrichten, und die Vorgabe der Instanz („Admins“ oder „alle“) gilt auch für sie.
- **Administration → Anmeldung & SSO → LDAP-Verzeichnis** zeigt den Status, **Verbindung testen** und **Jetzt abgleichen** mit dem letzten Ergebnis.
| Variable | Standard | Bedeutung |
| --- | --- | --- |
| `LDAP_URL` | *leer* | `ldap://host:389` oder `ldaps://host:636`. Ohne sie kein LDAP. |
| `LDAP_BIND_DN` / `LDAP_BIND_PASSWORD` | *leer* | Suchkonto. Ohne es wird anonym gesucht. |
| `LDAP_BASE_DN` | – | Wo Personen gesucht werden, z. B. `ou=people,dc=example,dc=org`. |
| `LDAP_USER_FILTER` | `(\|(uid={user})(mail={user}))` | `{user}` wird durch den maskierten Namen ersetzt. Active Directory: `(\|(sAMAccountName={user})(userPrincipalName={user})(mail={user}))`. |
| `LDAP_GROUP_ATTRIBUTE` | `memberOf` | Attribut mit den Gruppen der Person. |
| `LDAP_TLS_CA` | *leer* | CA-Zertifikat für `ldaps://` oder StartTLS (Dateipfad oder PEM-Text). Zertifikate werden immer geprüft. |
| `LDAP_STARTTLS` | `false` | `true`: `ldap://` mit StartTLS verschlüsseln. |
| `LDAP_TIMEOUT_MS` | `8000` | Zeitlimit je LDAP-Operation. |
### Beispiele
**OpenLDAP** (mit `memberof`-Overlay):
LDAP_URL=ldaps://ldap.example.org
LDAP_BIND_DN=cn=flowplan,ou=services,dc=example,dc=org
LDAP_BIND_PASSWORD=…
LDAP_BASE_DN=ou=people,dc=example,dc=org
**Active Directory**:
LDAP_URL=ldaps://dc1.corp.example.com
LDAP_BIND_DN=CN=svc-flowplan,OU=Service,DC=corp,DC=example,DC=com
LDAP_BASE_DN=OU=Staff,DC=corp,DC=example,DC=com
LDAP_USER_FILTER=(&(objectCategory=person)(|(sAMAccountName={user})(userPrincipalName={user})(mail={user})))
**Keycloak** als Quelle: Keycloak ist selbst kein LDAP-Server – verbindet Flowplan mit demselben Verzeichnis, an das Keycloak per „User Federation“ angebunden ist, oder nutzt OIDC.
**Authentik**: LDAP-Outpost anlegen (Provider „LDAP“, Base DN z. B. `dc=ldap,dc=goauthentik,dc=io`), ein Dienstkonto mit „Search full LDAP directory“ als `LDAP_BIND_DN` (`cn=,ou=users, `), `LDAP_USER_FILTER=(|(cn={user})(mail={user}))`. Gruppen stehen in `memberOf`.
### Kontakte aus LDAP
[Kontakte-Datenbanken](/contacts#kontakte-aus-dem-ldap-verzeichnis) übernehmen Personen aus dem Verzeichnis und gleichen sie ab (nur Verzeichnis → Flowplan). Dafür nutzt Flowplan den Server, das Suchkonto und TLS der LDAP-Anmeldung (`LDAP_URL`, `LDAP_BIND_DN`/`LDAP_BIND_PASSWORD`, `LDAP_TLS_CA`, `LDAP_STARTTLS`, `LDAP_TIMEOUT_MS`). Basis und Filter können eigene sein:
| Variable | Standard | Bedeutung |
| --- | --- | --- |
| `LDAP_CONTACTS_BASE_DN` | `LDAP_BASE_DN` | Wo Kontakte gesucht werden; der OU-Baum im Import-Dialog beginnt hier. Einträge außerhalb sind nicht erreichbar. |
| `LDAP_CONTACTS_FILTER` | `(&(\|(objectClass=inetOrgPerson)(objectClass=user)(objectClass=contact))(!(objectClass=computer)))` | Welche Einträge Personen sind. |
| `LDAP_CONTACTS_SYNC_MINUTES` | `60` | Abstand des Abgleichs (15–1440). |
| `LDAP_CONTACTS_ATTRIBUTES` | – | Weitere Attribute, die Zuordnungen nutzen dürfen (durch Komma oder Leerzeichen getrennt). Ohne sie sind nur die Attribute der Standardzuordnung erlaubt. |
| `LDAP_CONTACTS` | an | `off` schaltet Kontakte aus dem Verzeichnis ab. |
Für Kontakte allein reicht `LDAP_URL` mit `LDAP_CONTACTS_BASE_DN`; ohne `LDAP_BASE_DN` bleibt die Anmeldung mit LDAP aus.
**Administration → Anmeldung & SSO → Kontakte aus LDAP** zeigt, woher Basis und Filter kommen, und überschreibt sie: Basis-DN, Filter, Abgleich alle … Minuten, **Weitere Attribute** (zusätzlich zu `LDAP_CONTACTS_ATTRIBUTES` freigegebene Attribute, durch Kommas getrennt) und **Erlaubt** (aus: niemand kann importieren, der Abgleich ruht). Gespeicherte Werte gehen der Umgebung vor; leere Felder nehmen wieder den Wert aus der Umgebung. **Verbindung testen** prüft Bind und Basis. Das Passwort des Suchkontos bleibt in der Umgebung und wird nie gespeichert. Änderungen und Importe stehen als Sicherheitsereignis „Sicherheitsrelevante Einstellung geändert“ im Protokoll.
Wer das Verzeichnis nutzen darf: Administratoren der Instanz, Konten mit LDAP-Anmeldung und Vollmitglieder (keine Gäste) mindestens eines Arbeitsbereichs, den jemand anderes angelegt hat – nie Gäste des Arbeitsbereichs der Kontakte-Datenbank und nie ein API-Token. Wer nur eigene Arbeitsbereiche hat, kommt also nicht ans Verzeichnis, auch wenn jeder Arbeitsbereiche anlegen darf. Siehe [Kontakte aus dem LDAP-Verzeichnis](/contacts#kontakte-aus-dem-ldap-verzeichnis).
Grenzen: höchstens 500 Personen je Liste im Dialog (dann suchen), 2000 verknüpfte Kontakte und 20 OUs je Datenbank; jede Operation hat das Zeitlimit `LDAP_TIMEOUT_MS`.
---
# Konfiguration
Alle Umgebungsvariablen auf einen Blick. Viele Werte lassen sich zusätzlich in der Oberfläche der **Administration** setzen (siehe [In der Oberfläche](#in-der-oberflaeche)); dort gesetzte Werte haben Vorrang.
**Mehr zum Thema:** [Konfiguration: Speicher, Datenbank und Sicherheit](/configuration-storage) · [Konfiguration: E-Mail, Integrationen und Workflows](/configuration-integrations) · [Konfiguration: KI, Sprachnotizen und Push](/configuration-ai-push)
## Pflicht
| Variable | Beispiel | Bedeutung |
| --- | --- | --- |
| `APP_URL` | `https://flowplan.example.com` | Öffentliche Adresse genau so, wie sie im Browser steht – Schema, Host, ggf. Port, ohne Schrägstrich am Ende. Grundlage für Login-Weiterleitung, Cookies, Passkeys, Links in E-Mails und Push-Nachrichten und die Origin-Prüfung. |
## Anmeldung
| Variable | Standard | Bedeutung |
| --- | --- | --- |
| `FLOWPLAN_LOCAL_LOGIN` | an | `false` schaltet E-Mail, Passwort und Passkeys ab; dann bleibt nur Single Sign-on. |
| `FLOWPLAN_SETUP_TOKEN` | *leer* (Helm: zufällig erzeugt) | Empfohlen für Instanzen, die aus dem Internet erreichbar sind: Das erste Konto und das Wiederherstellen beim Einrichten gehen nur über `/register?setup=`. Danach ohne Wirkung. Fehlt er und ist `APP_URL` keine lokale Adresse, warnt Flowplan beim Start im Log und auf dem Einrichtungsbildschirm. Siehe [Anmeldung](/sign-in#e-mail-und-passwort). |
| `OIDC_ISSUER` | *leer* | Login-Anbieter für Single Sign-on. Ohne ihn gibt es nur E-Mail, Passwort und Passkeys. |
| `OIDC_CLIENT_ID` | – | Client-ID. |
| `OIDC_CLIENT_SECRET` | – | Client-Secret. Nie ins Image oder ins Git. Leer: öffentlicher Client, nur mit PKCE. |
| `OIDC_LINKED_SSO_ONLY` | aus | `true`: Konten, die mit SSO verbunden sind, melden sich nur noch über SSO an. Anmelden mit Passwort oder Passkey wird mit einem Hinweis abgelehnt; Passkeys und die Authenticator-App bleiben zum Bestätigen wichtiger Schritte. Siehe [Bestehendes Konto mit SSO verbinden](/sso-oidc#bestehendes-konto-mit-sso-verbinden). |
| `OIDC_NEW_ACCOUNTS` | an | `false`: Die SSO-Anmeldung legt keine neuen Konten an – nur bestehende, verbundene oder per SCIM bereitgestellte Konten melden sich an. Bei der ersten SSO-Anmeldung mit bekannter Adresse fehlt dann „Stattdessen ein eigenes Konto anlegen“. |
| `SESSION_HOURS` | `8` | Browser-Sitzung ohne „Angemeldet bleiben“: endet so viele Stunden nach der Anmeldung (1–24). Auch unter **Administration → Anmeldung & SSO → Sitzungen**; ein dort gespeicherter Wert hat Vorrang (gilt für alle `SESSION_*` außer `SESSION_MAX_DAYS` und `SESSION_GROUPS_HOURS`). |
| `SESSION_REMEMBER` | aus | `true` bietet im Browser beim Anmelden **Angemeldet bleiben** an – siehe [Anmeldung](/sessions). Die Apps bleiben unabhängig davon angemeldet. |
| `SESSION_IDLE_HOURS` | `168` | Mit „angemeldet bleiben“ im Browser: Sitzung endet so viele Stunden nach der letzten Nutzung (1–8760). |
| `SESSION_APP_REMEMBER` | an | Desktop- und Handy-Apps bleiben angemeldet, solange sie (oder ihre Widgets) genutzt werden – bei Anmeldungen, die die App belegt (Übergabe über den Browser oder Passwort mit dem Geräteschlüssel der App; siehe [Anmeldung](/sessions)). `false`: Ihre Sitzungen enden wie eine Browser-Sitzung ohne „Angemeldet bleiben“. |
| `SESSION_APP_DAYS` | `90` | App-Sitzung endet nach so vielen Tagen ohne Nutzung (1–365). |
| `SESSION_MAX_DAYS` | `30` / `365` | Sitzungen, die angemeldet bleiben, enden spätestens so viele Tage nach der Anmeldung (1–365; Standard 30 im Browser, 365 in den Apps; nie kürzer als die Zeit ohne Nutzung) – mit SSO genauso wie mit Passwort und Passkey. |
| `SESSION_GROUPS_HOURS` | *leer* | Nur wenn gesetzt: SSO-Sitzungen mit „angemeldet bleiben“ enden schon nach so vielen Stunden, damit Gruppenänderungen beim Anbieter mit der neuen Anmeldung wirken. Ohne die Variable wirken sie über SCIM, den LDAP-Abgleich oder die nächste Anmeldung. |
| `LDAP_URL` | *leer* | Anmeldung mit einem LDAP-Verzeichnis (`ldap://` oder `ldaps://`) – siehe [Anmeldung mit LDAP](/scim-and-ldap#anmeldung-mit-ldap). |
| `LDAP_BIND_DN` / `LDAP_BIND_PASSWORD` | *leer* | Suchkonto für LDAP; ohne es anonyme Suche. |
| `LDAP_BASE_DN` | – | Wo LDAP-Konten gesucht werden. |
| `LDAP_USER_FILTER` | `(\|(uid={user})(mail={user}))` | Suchfilter; `{user}` ist der maskierte Anmeldename. |
| `LDAP_GROUP_ATTRIBUTE` | `memberOf` | Gruppen für SSO-Zuordnungen und Admin-Gruppe, stündlich abgeglichen. |
| `LDAP_TLS_CA` | *leer* | CA für `ldaps://`/StartTLS (Pfad oder PEM). |
| `LDAP_STARTTLS` | `false` | `ldap://` mit StartTLS. |
| `LDAP_TIMEOUT_MS` | `8000` | Zeitlimit je LDAP-Operation. |
| `LDAP_CONTACTS_BASE_DN` | `LDAP_BASE_DN` | Basis für [Kontakte aus LDAP](/scim-and-ldap#kontakte-aus-ldap); der OU-Baum beginnt hier. |
| `LDAP_CONTACTS_FILTER` | Personen ohne Computer | Welche Einträge als Kontakte gelten. |
| `LDAP_CONTACTS_SYNC_MINUTES` | `60` | Abgleich der Kontakte aus dem Verzeichnis (15–1440 Minuten). |
| `LDAP_CONTACTS_ATTRIBUTES` | – | Weitere LDAP-Attribute, die Kontakte-Datenbanken zuordnen dürfen (durch Komma oder Leerzeichen getrennt), zusätzlich zu denen der Standardzuordnung. |
| `LDAP_CONTACTS` | an | `off` schaltet Kontakte aus LDAP ab. |
Die übrigen OIDC-Variablen und alles zu Passwörtern und Passkeys stehen unter [Anmeldung](/sign-in).
## Betrieb
| Variable | Standard | Bedeutung |
| --- | --- | --- |
| `FLOWPLAN_DATA_DIR` | `/app/data` im Image, sonst `./data` | Datenverzeichnis für SQLite, Uploads, Push-Schlüssel und Texterkennungsdaten. |
| `PUID` / `PGID` | `1000` / wie `PUID` | Nur im Image, ohne `user:` (wie bei linuxserver.io): Flowplan gibt den Datenordner beim Start diesem Benutzer und dieser Gruppe und läuft als sie, nie als root; `0` wird abgelehnt. Mit `user: "UID:GID"` läuft Flowplan stattdessen gleich als dieser Benutzer – siehe [Volume-Rechte](/coolify-and-proxy#volume-rechte). |
| `FLOWPLAN_WORKSPACE_QUOTA_MB` | unbegrenzt | Standard-Speicherkontingent je Arbeitsbereich in MB (`0` = unbegrenzt). |
| `FLOWPLAN_IMPORT_MAX_MB` | *leer* | Größte Datei für [Importe aus AFFiNE](/migrate-affine) und anderen Werkzeugen in MB, für alle Personen. Ohne die Variable gilt die **größte Datei beim Hochladen** (Administration → Grenzen & Aufbewahrung bzw. die Grenze der Person), mindestens 100 MB. Größer als 100 MB darf nur die AFFiNE-Arbeitsbereichsdatei (`.affine`) sein; ZIP-Exporte bleiben bei 100 MB. Ein Proxy davor muss so große Anfragen durchlassen. |
| `FLOWPLAN_MAX_DOCUMENT_MB` | `16` | Größe eines gemeinsam bearbeiteten Dokuments (Seite oder Datensatz-Dokument) in MB. Änderungen, die ein Dokument darüber hinaus wachsen lassen, werden abgelehnt („Das Dokument ist zu groß …“); größere Inhalte auf mehrere Seiten verteilen. Schützt den Server davor, dass jede Bearbeitung eines riesigen Dokuments ihn ausbremst. |
| `FLOWPLAN_IMPORT_MAX_DOCS` | `10000` | Höchstzahl der Seiten je [Import](/migrate) aus AFFiNE, Confluence, Evernote, Google Docs, Obsidian und Notion/Markdown: Dokumente, Ordner, Datenbanken, Whiteboards und Sammlungen; beim Import als neue Datenbank die Zahl der Einträge. Darüber zeigt die Vorschau die Anzahl und der Import wird abgelehnt (die Meldung nennt die Variable). Dokumente werden einzeln umgewandelt; ein höherer Wert kostet Zeit, kaum Speicher. |
| `FLOWPLAN_IMPORT_MAX_FILES` | `20000` | Höchstzahl der Dateien (Bilder, Anhänge) je Import aus einem AFFiNE-Arbeitsbereich oder -Snapshot; weitere werden ausgelassen, die Vorschau nennt ihre Zahl und die Variable. ZIP-Exporte dürfen so viele Einträge haben wie Seiten und Dateien zusammen (mindestens 12.000). |
| `FLOWPLAN_SNAPSHOT_RETENTION_DAYS` | `180` | Aufbewahrung automatischer Versionen in Tagen (`0` = unbegrenzt). |
| `FLOWPLAN_OCR` | an | `0` schaltet die Texterkennung für gescannte PDFs und Bilder ab. |
| `FLOWPLAN_OCR_LANGS` | `deu,eng` | Sprachen der Texterkennung, z. B. `fra,eng`; die erste ist die Hauptsprache. Mitgeliefert sind `deu`, `eng`, `fra` und `chi_sim` (Chinesisch, Kurzzeichen, z. B. `chi_sim,eng`). Jede weitere Sprache kostet Speicher und Zeit pro Seite; Chinesisch am meisten (rund 100 MB mehr Arbeitsspeicher, etwa anderthalbmal so lange pro Seite). |
| `FLOWPLAN_METRICS` | an | `off` schaltet die Nutzungsstatistik der [Überwachung](/monitoring#statistik) aus: Anfragen, Fehler und Antwortzeiten je Minute, aktive Personen je Stunde, Speicherverlauf und KI-Tokens. Erfasst werden nur Zahlen – keine IP-Adressen, Pfade oder Namen; Minuten bleiben 48 Stunden, Stunden 35 Tage, Tage 400 Tage. Mit `off` wird nichts erfasst, und der Schalter **Nutzungsstatistik erfassen** unter **Administration → Überwachung → Statistik** ist gesperrt. `/api/metrics` hängt davon nicht ab. |
| `FLOWPLAN_METRICS_TOKEN` | *leer* | Mindestens 16 Zeichen; aktiviert `/api/metrics` im Prometheus-Format. Als `Authorization: Bearer …` mitgeschickt, liefert `/api/health` damit auch die Details (siehe [Healthcheck](/operations#healthcheck)). |
| `FLOWPLAN_PUBLIC_API_DOCS` | `false` | `true` macht `/api/openapi.json` und `/api/docs` ohne Anmeldung lesbar; Besucher sehen darin nur die Hauptversion (`0.x`). Sonst nur für Angemeldete und API-Tokens. |
| `FLOWPLAN_UPDATE_CHECK` | an | `false` schaltet die Suche nach neuen Versionen ab (für Instanzen ohne Internet). Sonst fragt der Server höchstens alle 12 Stunden bei GitHub nach dem neuesten Release und zeigt Admins in der Administration einen Hinweis. |
| `FLOWPLAN_MARKETPLACE_URL` | `https://marketplace.flowplan.org` | Adresse des Flowplan Marketplace (Standard `https://marketplace.flowplan.org`); `off` schaltet ihn ab. Die Instanz verbindet sich nie selbst damit – die Adresse legt nur fest, mit welchem Fenster der Browser Vorlagen austauscht. Siehe [Marketplace](/marketplace). |
| `FLOWPLAN_UPDATE_URL` | GitHub-API | Andere Adresse für das neueste Release (gleiches Format wie `api.github.com/repos/yannicschuller/flowplan/releases/latest`), etwa ein interner Spiegel. Nicht zu verwechseln mit der gleichnamigen Variable der [Desktop-App](/desktop-app), die auf dem Rechner der App deren Update-Quelle nennt. |
| `FLOWPLAN_TRUSTED_PROXIES` | `1` | Anzahl der Proxys vor Flowplan (Traefik allein: `1`, Pangolin vor Traefik: `2`, `0` = keinem Header vertrauen). Bestimmt, welcher Eintrag in `X-Forwarded-For` die echte Adresse ist – für die Begrenzung von Anmeldeversuchen, Demo-Starts und anonymen Formularantworten. Frei erfundene Einträge des Browsers werden so ignoriert. Kommt gar keine Adresse an (der Proxy setzt den Header nicht), gelten nur die Limits je Konto und je Link, und das Protokoll zeigt einmalig einen Hinweis. |
| `FLOWPLAN_SECURITY_LOG` | `on` | Sicherheitsereignisse als JSON-Zeile auf stdout: `on` (mit Adresse, für fail2ban/CrowdSec), `anonymous`, `off` ([Sicherheit](/security-monitoring#sicherheit)). |
| `FLOWPLAN_SECURITY_RETENTION_DAYS` | `90` | Wie lange Sicherheitsereignisse in der Datenbank bleiben (mindestens 7). |
| `FLOWPLAN_COUNTRY_HEADER` | *leer* | Header des Proxys mit dem Land der Anfrage (z. B. `CF-IPCountry`); schaltet die Regel „zwei Länder kurz nacheinander“ ein. |
| `OTEL_EXPORTER_OTLP_ENDPOINT` | *leer* | OTLP-Collector (HTTP); Sicherheitsereignisse gehen als OpenTelemetry-Logs dorthin. Dazu `OTEL_EXPORTER_OTLP_HEADERS` und `OTEL_SERVICE_NAME`. |
| `FLOWPLAN_ANONYMOUS_UPLOAD_MB` | `1024` | Wie viele MB Besucher ohne Konto pro Tag auf der ganzen Instanz hochladen dürfen – über anonyme Formulare und Bearbeiten-Links (`0` = unbegrenzt). Je Formular bzw. Link gelten zusätzlich 200 MB pro Tag, unabhängig vom Speicherkontingent des Arbeitsbereichs. |
Die Typst-Vorschau lädt Compiler und Schriften (WebAssembly, etwa 11 MB komprimiert) beim ersten Gebrauch von `/typst/…` des eigenen Servers; es gibt keine Verbindung zu einem CDN.
## Nicht setzen
`NODE_ENV`, `PORT`, `HOSTNAME` und `NEXT_TELEMETRY_DISABLED` setzt das Image selbst, ebenso `FLOWPLAN_DROP_ROOT=1` (Flowplans Werkzeuge im Container geben root ab und laufen als `PUID:PGID`). `FLOWPLAN_LITESTREAM_SSE_C` setzt der Start des Containers, wenn `LITESTREAM_SSE_C_KEY` gesetzt ist; die Administration zeigt daran, ob die Litestream-Kopie verschlüsselt ist. `FLOWPLAN_DIST_DIR` ist nur für parallele Entwicklungsserver gedacht, `OIDC_ALLOW_LOCAL_HTTP` nur für Tests mit einem Anbieter auf `http://localhost`, `FLOWPLAN_GIT_ALLOW_HTTP` nur für Tests des Git-Exports mit einem `http://`-Server (in Produktion wirkungslos). Version und Commit (`FLOWPLAN_VERSION`, `GIT_COMMIT`, `SOURCE_COMMIT`) kommen aus dem Build; `FLOWPLAN_VERSION` in der `.env` wählt nur das Image-Tag in `compose.yaml`.
## In der Oberfläche
In der **Administration** stellen Admins ein (siehe [Administration der Instanz](/administration)):
- **Instanz**: Name der Instanz und ob die Instanz eine öffentliche **Demo** anbietet (laufende und insgesamt gestartete Demos zeigt **Administration → Überwachung → Instanz in Zahlen**),
- **Anmeldung & SSO**: ob sich jede Person mit E-Mail und Passwort registrieren darf, ob alle Personen eigene Arbeitsbereiche anlegen dürfen, nach wie vielen Tagen ohne Anmeldung Konten gesperrt werden, Zwei-Faktor-Pflicht,
- **Grenzen & Aufbewahrung**: Standard-Speicherkontingent, Speicher und eigene Arbeitsbereiche je Person, maximale Uploadgröße, Aufbewahrung von Versionen,
- **Speicher & Sicherung**: tägliche oder stündliche Datenbanksicherung und wie viele Kopien bleiben,
- **Wartung & Hinweise**: ein Hinweisbanner für alle und der Wartungshinweis,
- **Erweiterungen & Domains**: **Eigene Domains für Veröffentlichungen** (aus) und **Block-Erweiterungen von jeder HTTPS-Adresse** (aus) – siehe [Coolify und Reverse Proxy](/coolify-and-proxy#eigene-domains-fuer-veroeffentlichungen) und [Block-Erweiterungen](/plugins),
- **Überwachung → Statistik**: ob die Nutzungsstatistik erfasst wird (gesperrt mit `FLOWPLAN_METRICS=off`).
Leere Felder fallen auf die Umgebungsvariablen zurück.
---
# Konfiguration: Speicher, Datenbank und Sicherheit
Die Umgebungsvariablen für S3 und Datenbanksicherung, PostgreSQL und Cluster, Verschlüsselung, gespeicherte Geheimnisse, Instanzumzug und Rechtliches.
## S3 und Datenbanksicherung
| Variable | Standard | Bedeutung |
| --- | --- | --- |
| `S3_BUCKET` | *leer* | Schaltet S3 ein. Ohne diese Variable bleibt alles lokal. |
| `S3_ENDPOINT` | AWS | API-Adresse des Speichers, z. B. `http://minio:9000`. |
| `S3_ACCESS_KEY_ID` / `S3_SECRET_ACCESS_KEY` | – | Zugangsschlüssel mit Lese- und Schreibrecht auf den Bucket. |
| `S3_REGION` | `us-east-1` | Region. Garage verlangt seinen eigenen Wert (oft `garage`). |
| `S3_PREFIX` | `flowplan` | Ordner im Bucket; Dateien unter `/uploads/`, Datenbank unter `/db/`. |
| `FLOWPLAN_LITESTREAM` | an | `off`: nur Dateien spiegeln, Datenbank nicht sichern. |
| `LITESTREAM_SSE_C_KEY` | *leer* | Optional: der Speicheranbieter verschlüsselt die Litestream-Kopie (SSE-C, 32 Bytes base64, nur über https und bei Anbietern, die SSE-C können). |
Details: [Speicher, S3 und Sicherung](/storage-and-backups).
## Datenbank und Cluster
Ohne diese Variablen nutzt Flowplan SQLite in einem Container. Kommentiert stehen sie auch in der [`.env.example`](https://github.com/yannicschuller/flowplan/blob/main/.env.example). Alle Werte mit Standard und Erklärung stehen unter [PostgreSQL](/postgresql#variablen) und [Cluster-Modus](/cluster#weitere-variablen).
| Variable | Standard | Bedeutung |
| --- | --- | --- |
| `DATABASE_URL` | *leer* | `postgres://…` schaltet auf PostgreSQL um. Die Rolle darin sollte die Datenbank besitzen, aber kein Superuser sein ([PostgreSQL](/postgresql#rolle-ohne-superuser-rechte)). |
| `FLOWPLAN_PG_SCHEMA`, `FLOWPLAN_PG_POOL`, `FLOWPLAN_PG_*_TIMEOUT` | `public`, `10`, … | Schema, Verbindungen je Instanz und Zeitlimits. |
| `FLOWPLAN_PG_PREPARE` | an | `off`: Abfragen ohne Namen statt benannter Prepared Statements – für PgBouncer im Modus `transaction` ohne `max_prepared_statements`. |
| `DATABASE_SESSION_URL` | `DATABASE_URL` | Direkte Verbindung (oder Pool im Modus `session`) für Benachrichtigungen, die Leitung im Cluster und `pg_dump`/`pg_restore`, wenn `DATABASE_URL` auf PgBouncer im Modus `transaction` zeigt. |
| `FLOWPLAN_BACKUP_FORMAT` | `pg_dump` | `sqlite`: geplante Sicherungen auf PostgreSQL im portablen SQLite-Format. |
| `FLOWPLAN_CLUSTER` | *leer* | `1`: mehrere Instanzen; verlangt `DATABASE_URL`, `REDIS_URL`, `S3_BUCKET`, `FLOWPLAN_ENCRYPTION_KEY` (oder `FLOWPLAN_SECRETS_KEY`) und `WEB_PUSH_PUBLIC_KEY`/`WEB_PUSH_PRIVATE_KEY`. |
| `REDIS_URL` | *leer* | Redis für den Cluster-Modus, `redis://…` oder `rediss://…`. |
| `FLOWPLAN_READY_REQUIRE` | alle | Welche Prüfungen über `/api/health/ready` entscheiden. |
## Verschlüsselung
| Variable | Standard | Bedeutung |
| --- | --- | --- |
| `FLOWPLAN_ENCRYPTION_KEY` | *leer* | 32 Bytes, base64 (`openssl rand -base64 32`). Verschlüsselt Dateien im Bucket, geplante Sicherungen, Markdown-Exporte und die Instanzsicherung. Ohne Schlüssel ändert sich nichts. |
| `FLOWPLAN_ENCRYPTION_KEY_FILE` | *leer* | Statt der Variablen: Pfad zu einer Datei mit dem Schlüssel (Docker-Secret). |
| `FLOWPLAN_ENCRYPTION_KEY_PREVIOUS` | *leer* | Frühere Schlüssel, durch Komma getrennt – nur zum Lesen nach einem Schlüsselwechsel. |
Details: [Verschlüsselung](/storage-encryption#verschluesselung).
## Gespeicherte Geheimnisse
Schlüssel von KI-Anbietern, die Schlüssel der Authenticator-Apps ([Zwei-Faktor-Anmeldung](/sign-in#zwei-faktor-anmeldung)) die Zugangstokens des [Git-Exports der Bereiche](/markdown-git-export#git-export-eines-bereichs) und die Tokens der [Chat-Apps](/notifications#chat-apps) speichert Flowplan nur verschlüsselt (AES-256-GCM, an ihren Platz gebunden). Der Schlüssel dafür kommt, in dieser Reihenfolge, aus:
| Quelle | Bedeutung |
| --- | --- |
| `FLOWPLAN_ENCRYPTION_KEY` | Wenn gesetzt, verschlüsselt er auch die gespeicherten Geheimnisse. |
| `FLOWPLAN_SECRETS_KEY` / `FLOWPLAN_SECRETS_KEY_FILE` | Ein eigener Schlüssel nur dafür: 32 Bytes, base64 oder hex (`openssl rand -base64 32`), oder Pfad zu einer Datei (Docker-Secret). |
| `secrets.key` im Datenordner | Ohne die beiden Variablen legt Flowplan diese Datei beim ersten Bedarf selbst an (nur für den Besitzer lesbar). |
> [!IMPORTANT]
> Die Instanzsicherung enthält `secrets.key` bewusst nicht – sie gehört nicht neben die Daten, die sie schützt. Sichere die Datei getrennt oder setze den Schlüssel als Variable. Fehlt er nach einer Wiederherstellung, geben Admins und Nutzer ihre KI-Schlüssel und Chat-App-Tokens neu ein, und für die Zwei-Faktor-Anmeldung helfen Wiederherstellungscodes oder ein Zurücksetzen durch die Administration.
> Das [Umzugswerkzeug](/move-instance) nimmt `secrets.key` dagegen mit, denn es zieht die ganze Instanz um.
## Instanzumzug
| Variable | Standard | Bedeutung |
| --- | --- | --- |
| `FLOWPLAN_MOVE_ALLOW_PRIVATE` | *leer* | Auf der **neuen** Instanz: `true` erlaubt, eine Instanz unter einer internen Adresse (LAN, VPN, `localhost`) und über `http://` zu übernehmen – etwa einen Heimserver. Ohne diese Variable nur öffentliche HTTPS-Adressen. Nach dem Umzug wieder entfernen. |
Details: [Instanz umziehen](/move-instance).
## Rechtliches und Oberfläche
| Variable | Standard | Bedeutung |
| --- | --- | --- |
| `IMPRINT_URL` | *leer* | Link zum Impressum, z. B. `https://example.com/impressum`. Erscheint auf der Anmeldeseite, unter geteilten Seiten und Formularen und im Kontomenü (auf dem Telefon unter **Mehr** in der Seitenleiste) – nur, wenn gesetzt. |
| `PRIVACY_URL` | *leer* | Link zur Datenschutzerklärung, an denselben Stellen und ebenfalls nur, wenn gesetzt. |
| `FLOWPLAN_SOURCE_URL` | GitHub-Repository von Flowplan | Adresse des Quellcodes, der auf dieser Instanz läuft (http oder https). Die AGPL-3.0 verlangt: Wer eine **veränderte** Fassung für andere betreibt, bietet ihnen deren Quellcode an (§ 13). Gesetzt, verlinken **Einstellungen → Über Flowplan** und die Anmeldeseite (Fußzeile „Quellcode“) diese Adresse statt `github.com/yannicschuller/flowplan`; der Commit ist dann nicht mehr auf GitHub verlinkt. |
| `DRAWIO_URL` | `https://embed.diagrams.net` | Adresse des draw.io-Editors für den Block `/drawio`, z. B. ein eigener Container `jgraph/drawio`. Nur https (http nur für `localhost`); ein ungültiger Wert schaltet draw.io aus. Beim Ansehen wird draw.io nie geladen. |
| `FLOWPLAN_HIDE_SPONSOR` | `false` | `true` blendet unter **Einstellungen → Über Flowplan** nur den Teil **Flowplan unterstützen ♥** (Link zu GitHub Sponsors) aus. Lizenz und Quellcode bleiben immer sichtbar. In den Apps für iPhone, iPad und Android ist der Link unabhängig davon nie zu sehen; in Browsern und der Desktop-App schon. |
---
# Konfiguration: E-Mail, Integrationen und Workflows
Die Umgebungsvariablen für Mailversand und E-Mail-Eingang, Integrationen wie GitHub und Kalender, Chat-Apps und Workflows.
## E-Mail (SMTP)
| Variable | Standard | Bedeutung |
| --- | --- | --- |
| `SMTP_HOST` | *leer* | Schaltet den E-Mail-Versand ein: Einladungen und Zusammenfassungen ungelesener Benachrichtigungen. |
| `SMTP_PORT` | `587` | Port. Bei `465` spricht Flowplan direkt TLS, sonst STARTTLS. |
| `SMTP_SECURE` | nach Port | `true`/`false` erzwingt TLS ab Verbindungsbeginn. |
| `SMTP_USER` / `SMTP_PASSWORD` | *leer* | Anmeldung am Mailserver. |
| `SMTP_FROM` | `Flowplan ` | Absender, z. B. `Flowplan `. |
Den Versand prüfst du unter **Administration → E-Mail → Test-E-Mail senden**.
## E-Mail-Eingang (IMAP)
Für den [E-Mail-Eingang](/inbound-email) per Webhook (Mailgun, Postmark, SendGrid, Cloudflare) ist nichts zu setzen. Ein eigenes Postfach fragt Flowplan alle zwei Minuten per IMAP ab:
| Variable | Standard | Bedeutung |
| --- | --- | --- |
| `INBOUND_MAIL_DOMAIN` | *leer* | Domain der Eingangsadressen, z. B. `mail.example.com`. Die Einstellungen zeigen dann je Adresse `inbox+@mail.example.com`. |
| `INBOUND_IMAP_HOST` | *leer* | Schaltet die IMAP-Abfrage ein (zusammen mit `INBOUND_IMAP_USER`). |
| `INBOUND_IMAP_PORT` | `993` | Port (`143`, wenn `INBOUND_IMAP_TLS=false`). |
| `INBOUND_IMAP_USER` / `INBOUND_IMAP_PASSWORD` | *leer* | Anmeldung am Postfach. Der Teil vor `@` ist auch der Teil vor `+` in den Adressen. |
| `INBOUND_IMAP_FOLDER` | `INBOX` | Ordner, der abgefragt wird. |
| `INBOUND_IMAP_TLS` | `true` | `false` nur für einen Mailserver auf demselben Rechner oder im selben Netz (ohne Verschlüsselung). |
| `INBOUND_MAIL_AUTHSERV_ID` | *leer* | Kennung (authserv-id) des eigenen empfangenden Mailservers oder Anbieters, mit der sein `Authentication-Results`-Header beginnt, z. B. `mx.example.com`. Gilt auch für den Eingang per Webhook. |
Der Mailserver muss Plus-Adressierung unterstützen (`inbox+irgendwas@…` landet in `inbox@…`); das tun z. B. Dovecot, Postfix, Gmail/Google Workspace und Microsoft 365 (dort einschalten). Flowplan markiert verarbeitete E-Mails als gelesen und löscht nichts.
**Absenderprüfung:** Ob ein Absender als geprüft gilt (SPF/DKIM/DMARC zur From-Domain bestanden), liest Flowplan aus dem `Authentication-Results`-Header. Den kann auch der Absender selbst mitschicken – deshalb zählt nur der oberste Header mit der Kennung aus `INBOUND_MAIL_AUTHSERV_ID`. Ohne die Variable gilt kein Absender als geprüft: Workflows mit **Nur geprüfte Absender** starten dann nie, die Standardeinstellung (alle außer durchgefallenen) läuft weiter. Die Kennung steht am Anfang des Headers, den dein Server in empfangene E-Mails schreibt (`Authentication-Results: mx.example.com; spf=pass …`).
## Integrationen
| Variable | Standard | Bedeutung |
| --- | --- | --- |
| `FLOWPLAN_WEBHOOK_ALLOW_PRIVATE` | *leer* | `true` erlaubt Webhooks an interne Adressen und `http://` – etwa Home Assistant oder n8n im selben Netz. Ohne diese Variable sind nur öffentliche HTTPS-Adressen erlaubt. |
| `SPACE_GIT_EXPORT` | *leer* | `true` schaltet den [Git-Export der Bereiche](/markdown-git-export#git-export-eines-bereichs) ein: Bereichseigentümer übertragen ihren Bereich täglich oder wöchentlich in ein eigenes Repository. |
| `SPACE_GIT_ALLOWED_HOSTS` | *leer* | Erlaubte Git-Server dafür, durch Komma getrennt (z. B. `git.example.org`). Ohne die Variable ist jeder öffentliche `https://`-Server erlaubt; interne Adressen nie. |
| `SPACE_GIT_ALLOW_PRIVATE` | *leer* | `true` erlaubt den in `SPACE_GIT_ALLOWED_HOSTS` genannten Servern auch interne Adressen – etwa ein Forgejo auf demselben Host, den der Container über `--add-host git.example.org:host-gateway` erreicht. Wirkt nur zusammen mit der Liste; alle anderen Server bleiben auf öffentliche Adressen beschränkt. |
| `ISSUE_SYNC_ALLOWED_HOSTS` | *leer* | Eigene Server für die [Synchronisierung von GitHub-, GitLab- und Forgejo-Issues](/git-and-issues#github-gitlab-und-forgejo-issues-synchronisieren), durch Komma getrennt (z. B. `gitlab.example.org`). github.com, gitlab.com und codeberg.org sind immer erlaubt; andere Server nur, wenn sie hier stehen. |
| `ISSUE_SYNC_ALLOW_PRIVATE` | *leer* | `true` erlaubt den in `ISSUE_SYNC_ALLOWED_HOSTS` genannten Servern auch interne Adressen – etwa ein GitLab im selben Netz. Wirkt nur zusammen mit der Liste. |
| `NETBOX_ALLOW_PRIVATE` | *leer* | `true` erlaubt den [NetBox-Import auf Whiteboards](/whiteboard-racks#importieren-und-exportieren) auch interne Adressen und `http://` – etwa ein NetBox im selben Netz. Ohne diese Variable nur öffentliche HTTPS-Adressen. Adresse und Token werden nie auf dem Server gespeichert. |
| `PLUGIN_ALLOWED_ORIGINS` | *leer* | HTTPS-Ursprünge, von denen Eigentümer [Block-Erweiterungen](/plugins) registrieren dürfen, durch Komma getrennt (z. B. `https://plugins.example.org`). Ohne die Variable nur, wenn die Administration **Block-Erweiterungen von jeder HTTPS-Adresse** einschaltet. Die Ursprünge werden auch in die `frame-src` der Content Security Policy aufgenommen. |
| `GIPHY_API_KEY` / `TENOR_API_KEY` | *leer* | Schlüssel für die [GIF-Suche auf Whiteboards](/whiteboards#bilder-symbole-und-eintraege) bei GIPHY bzw. Tenor (ist beides gesetzt, gilt GIPHY). Ohne Schlüssel fehlt der Reiter **GIFs**. Gesucht wird über den Server; gewählte GIFs werden bis 8 MB auf dem Server gespeichert. |
| `EXPORT_GIT_*` | *leer* | Veraltet: der Git-Export der ganzen Instanz, siehe [In ein Git-Repository übertragen](/markdown-git-export#in-ein-git-repository-uebertragen). Läuft weiter; besser ist der Git-Export der Bereiche. |
## Kalender-Sync
Zwei-Wege-Synchronisierung von Datenbankansichten mit [Google Kalender und Microsoft Outlook / 365](/views#mit-google-kalender-oder-outlook-synchronisieren). Jede Person verbindet ihr eigenes Konto; ohne Client-ID bleibt der jeweilige Anbieter ausgeblendet. Flowplan fragt alle zehn Minuten nach Änderungen (Push-Benachrichtigungen der Anbieter werden nicht genutzt – sie bräuchten eine öffentlich erreichbare, beim Anbieter bestätigte HTTPS-Adresse).
| Variable | Standard | Bedeutung |
| --- | --- | --- |
| `GOOGLE_CALENDAR_CLIENT_ID` / `GOOGLE_CALENDAR_CLIENT_SECRET` | *leer* | OAuth-Client (Typ „Webanwendung“) aus der Google Cloud Console, mit aktivierter Google Calendar API und dem Bereich `…/auth/calendar`. Weiterleitungs-URI: `/api/calendar-sync/callback/google`. |
| `MS_CALENDAR_CLIENT_ID` / `MS_CALENDAR_CLIENT_SECRET` | *leer* | App-Registrierung in Microsoft Entra ID (Web-Plattform) mit den delegierten Berechtigungen `Calendars.ReadWrite` und `offline_access`. Weiterleitungs-URI: `/api/calendar-sync/callback/microsoft`. |
| `MS_CALENDAR_TENANT` | `common` | `common` (Geschäfts- und private Konten), `organizations` oder die ID eines Mandanten. |
Die Aktualisierungs-Tokens der Personen liegen versiegelt in der Datenbank (wie alle [gespeicherten Geheimnisse](/configuration-storage#gespeicherte-geheimnisse)).
## Chat-Apps
Benachrichtigungen an [Telegram, Gotify, ntfy und Matrix](/notifications#chat-apps). Alles lässt sich auch unter **Administration → Chat-Apps** einstellen; dort gespeicherte Werte haben Vorrang.
| Variable | Standard | Bedeutung |
| --- | --- | --- |
| `FLOWPLAN_MESSENGERS` | *alle* | Dienste, die Personen verbinden dürfen, durch Komma getrennt: `telegram`, `gotify`, `ntfy`, `matrix`; `off` für keinen. |
| `FLOWPLAN_TELEGRAM_BOT_TOKEN` | *leer* | Token des Telegram-Bots der Instanz (von @BotFather). Damit verbinden Personen Telegram über einen Link mit Einmal-Code, ohne eigenen Bot. |
| `FLOWPLAN_TELEGRAM_API_URL` | `https://api.telegram.org` | Adresse der Bot-API für den Bot der Instanz – ein selbst betriebener [Telegram-Bot-API-Server](https://github.com/tdlib/telegram-bot-api) oder ein Relay/Proxy. Darf im eigenen Netz liegen und `http://` sein. |
| `FLOWPLAN_MESSENGER_ALLOW_PRIVATE` | wie `FLOWPLAN_WEBHOOK_ALLOW_PRIVATE` | `true`: Personen dürfen Server im eigenen Netz angeben (interne Adressen, `http://`) – etwa Gotify oder ntfy im Heimnetz. Sonst sind interne Adressen gesperrt, auch wenn ein Name später auf eine umgestellt wird. |
**Bot der Instanz ohne öffentliche Adresse:** Flowplan nutzt keinen Webhook, sondern fragt die Nachrichten des Bots mit `getUpdates` ab – nur solange ein Verbindungscode wartet (höchstens 15 Minuten). Ausgehendes HTTPS zur Bot-API genügt. Der Bot darf deshalb nicht gleichzeitig einen Webhook haben oder von einem anderen Programm abgefragt werden (Telegram meldet dann einen Konflikt, die Administration zeigt ihn an) – nimm einen eigenen Bot nur für Flowplan.
**Ausgehende Verbindungen:** zu `api.telegram.org` (oder der eigenen API-Adresse), `ntfy.sh` und den Servern, die Personen angeben. Sie laufen über dieselbe Prüfung wie Link-Vorschauen und Webhooks: Adresse auflösen, interne Adressen abweisen, genau die geprüfte Adresse verwenden, keine Weiterleitungen. Abgewiesene Versuche erscheinen als Sicherheitsereignis „Interne Adresse abgewiesen (SSRF)“.
Die Tokens der Personen und des Bots speichert Flowplan verschlüsselt wie andere [gespeicherte Geheimnisse](/configuration-storage#gespeicherte-geheimnisse). Fehlt der Schlüssel nach einer Wiederherstellung, muss die Administration den Bot-Token neu eingeben; Verbindungen mit eigenem Token werden nach drei Fehlversuchen ausgeschaltet, und ihre Besitzer erfahren es im Posteingang.
## Workflows
Standards für [Workflows](/workflows); die [Administration](/administration#workflows) kann sie überschreiben.
| Variable | Standard | Bedeutung |
| --- | --- | --- |
| `FLOWPLAN_WORKFLOWS` | `on` | Hauptschalter; `off`: keine neuen Workflow-Seiten, alle pausiert |
| `FLOWPLAN_WORKFLOW_RUNS_PER_MINUTE` | 60 | Läufe je Minute und Workflow |
| `FLOWPLAN_WORKFLOW_WORKSPACE_RUNS_PER_MINUTE` | 600 | Läufe je Minute und Arbeitsbereich |
| `FLOWPLAN_WORKFLOW_STEPS_PER_RUN` | 200 | Schritte je Lauf |
| `FLOWPLAN_WORKFLOW_CASCADE_DEPTH` | 5 | Tiefe gegenseitiger Auslösung |
| `FLOWPLAN_WORKFLOW_FOREACH_MAX` | 100 | Elemente je „Für jedes“ |
| `FLOWPLAN_WORKFLOW_AI_TOKENS_PER_DAY` | 100000 | KI-Tokens je Workflow und Tag (0 = KI-Knoten aus) |
| `FLOWPLAN_WORKFLOW_MAILS_PER_DAY` | 100 | E-Mails je Workflow und Tag |
| `FLOWPLAN_WORKFLOW_RUN_DAYS` | 30 | Aufbewahrung der Läufe in Tagen |
| `FLOWPLAN_WORKFLOW_MAX_WAIT_DAYS` | 365 | längstes Warten bzw. Freigabefrist |
| `FLOWPLAN_WORKFLOW_ACTIVE_PER_WORKSPACE` | 100 | aktive Workflows je Arbeitsbereich |
| `FLOWPLAN_WORKFLOW_WORKERS` | 4 | gleichzeitige Schritte je Instanz |
| `FLOWPLAN_WORKFLOW_HTTP` | `on` | HTTP-Knoten erlaubt |
| `FLOWPLAN_WORKFLOW_HTTP_HOSTS` | leer | nur diese Hosts (kommagetrennt) |
| `FLOWPLAN_WORKFLOW_HTTP_ALLOW_PRIVATE` | `false` | interne Adressen erlauben (Heimnetz, n8n) |
| `FLOWPLAN_WORKFLOW_EXTERNAL_MAIL` | `on` | E-Mails an Adressen außerhalb der Mitglieder |
| `FLOWPLAN_WORKFLOW_TEST_RUNS_PER_MINUTE` | 10 | Test- und Probeläufe je Person und Minute |
| `FLOWPLAN_WORKFLOW_PARALLEL_RUNS` | 10 | gleichzeitig laufende Läufe je Workflow (1–100); weitere warten in der Warteschlange |
| `FLOWPLAN_WORKFLOW_RUNS_KEPT` | 10000 | höchstens so viele Läufe je Workflow aufbewahren (100–1.000.000); ältere abgeschlossene werden täglich gelöscht, offene nie |
> [!NOTE]
> **Nur für Entwicklung und Tests:** `FLOWPLAN_WORKFLOW_LEASE_MS` (Standard 120000, die [Lease](/cluster#workflows-im-cluster) eines Schritts), `FLOWPLAN_WORKFLOW_POLL_MS` (5000, wie oft jede Instanz nach fälligen Schritten sieht) und `FLOWPLAN_WORKFLOW_SWEEP_MS` (60000, wie oft abgelaufene Leases zurück in die Warteschlange kommen) verkürzen die Zeiten der Warteschlange in Millisekunden. Im Betrieb nicht setzen.
---
# Konfiguration: KI, Sprachnotizen und Push
Die Umgebungsvariablen für KI-Anbieter, die Transkription von Sprachnotizen mit Whisper und Push-Benachrichtigungen bis zum eigenen Push-Relay.
## Sprachnotizen (Whisper)
Sprachnotizen im Editor werden immer als Audio gespeichert. Mit einem Whisper-Dienst im eigenen Netz macht Flowplan daraus zusätzlich Text; die Aufnahme verlässt dabei deinen Server nicht.
| Variable | Standard | Bedeutung |
| --- | --- | --- |
| `WHISPER_URL` | *leer* | Adresse eines OpenAI-kompatiblen Whisper-Servers (`POST /v1/audio/transcriptions`), z. B. `http://whisper:8000`. Schaltet die Transkription ein. |
| `WHISPER_MODEL` | `Systran/faster-whisper-small` | Modellname, wie ihn der Dienst erwartet. |
| `WHISPER_LANGUAGE` | `de` | Sprache der Aufnahmen. |
| `WHISPER_API_KEY` | *leer* | Nur falls der Dienst einen Schlüssel verlangt. |
| `WHISPER_MAX_MB` | `200` | Größte Aufnahme in MB. |
| `WHISPER_RESPONSE_FORMAT` | `verbose_json` | Antwortformat der Spracherkennung; bei Fehler einmal `json`. |
| `WHISPER_DIARIZE` | *leer* | `on`: Sprechertrennung anfragen (`diarize=true`), nur bei Diensten, die es können. |
| `WHISPER_TIMEOUT_SECONDS` | *leer* | Wie lange eine Transkription dauern darf, in Sekunden. Ohne Angabe eine Minute pro MB Audio, mindestens 3 Minuten, höchstens 2 Stunden. Für langsame CPUs höher setzen. |
| `WHISPER_PROMPT` | *leer* | Vokabular für alle Arbeitsbereiche (Namen, Abkürzungen, durch Kommas getrennt), geht als `prompt` an Whisper – vor dem Glossar des Arbeitsbereichs, zusammen höchstens etwa 550 Zeichen. |
| `WHISPER_VAD` | *leer* | `on`: Stille vorher überspringen (`vad_filter=true`, faster-whisper/speaches) – weniger erfundene Zeilen. |
| `MEETING_LIVE_TRANSCRIPTION` | `on` | `off`: Besprechungen erst nach dem Beenden transkribieren statt schon während der Aufnahme. |
Beispiel mit [speaches](https://github.com/speaches-ai/speaches) (früher faster-whisper-server) im selben Compose-Projekt:
```yaml
whisper:
image: ghcr.io/speaches-ai/speaches:latest-cpu
volumes:
- whisper-models:/home/ubuntu/.cache/huggingface/hub
restart: unless-stopped
```
Bei Flowplan dann `WHISPER_URL=http://whisper:8000` setzen. Neuere speaches-Versionen laden Modelle nicht selbst; einmalig herunterladen, etwa aus dem Flowplan-Container:
```sh
node -e "fetch('http://whisper:8000/v1/models/Systran/faster-whisper-small',{method:'POST'}).then(r=>console.log(r.status))"
```
`small` braucht rund 1 GB Arbeitsspeicher und transkribiert auf einer normalen CPU etwa in Echtzeit; `base` ist schneller und ungenauer, `medium` genauer und deutlich langsamer. Den Whisper-Dienst nicht öffentlich erreichbar machen – nur Flowplan spricht mit ihm.
**whisper.cpp** als Whisper-Dienst (schnell auf Apple Silicon oder mit GPU): `whisper-server` mit dem OpenAI-Pfad, mit Umwandlung der Aufnahmen (braucht ffmpeg auf dem Rechner des Dienstes, für WebM) und mit Stilleerkennung starten:
```sh
whisper-server -m models/ggml-large-v3-turbo.bin --host 0.0.0.0 --port 8080 \
--inference-path /v1/audio/transcriptions --convert \
--vad -vm models/ggml-silero-v5.1.2.bin -mc 0 -ml 400 -sow
```
`--vad -vm …` überspringt Stille (das Silero-Modell lädt das Skript `models/download-vad-model.sh` von whisper.cpp herunter), `-mc 0` verhindert, dass sich Whisper an einer erfundenen Zeile festbeißt und sie wiederholt, `-ml 400 -sow` begrenzt die Länge der Segmente und trennt an Wortgrenzen – das gibt genauere Quellen-Chips. Bei Flowplan dann `WHISPER_URL=http://whisper:8080` setzen. Bei **faster-whisper/speaches** erreichst du dasselbe mit `WHISPER_VAD=on`.
Lange Aufnahmen: whisper.cpp mit large-v3-turbo brauchte auf einem M2 rund 380 Sekunden für 8,4 MB; auf einer CPU dauert es deutlich länger. Flowplan wartet eine Minute pro MB; reicht das nicht, `WHISPER_TIMEOUT_SECONDS` erhöhen. Bricht eine Transkription ab, sehen Admins im Besprechungsblock die Ursache.
## KI
Alles optional; die Werte gelten, bis ein Admin unter **Administration → KI** speichert. Details: [KI](/ai).
| Variable | Standard | Bedeutung |
| --- | --- | --- |
| `FLOWPLAN_AI` | *aus* | `on` schaltet KI ein. |
| `FLOWPLAN_AI_PROVIDER` | *leer* | `ollama`, `openai` (OpenAI-kompatibel), `anthropic` oder `gemini`. Ist nur `OLLAMA_URL` gesetzt, gilt Ollama. |
| `OLLAMA_URL` | *leer* | Adresse von Ollama, z. B. `http://ollama:11434` mit dem Compose-Dienst. |
| `FLOWPLAN_AI_BASE_URL` | *je Anbieter* | Adresse des Anbieters, z. B. `https://api.mistral.ai/v1` für einen OpenAI-kompatiblen Dienst. |
| `FLOWPLAN_AI_MODEL` | *leer* | Modell, z. B. `llama3.1` oder `gpt-4o-mini`. |
| `FLOWPLAN_AI_EMBEDDING_MODEL` | *leer* | Modell für die Suche nach Bedeutung, z. B. `nomic-embed-text` (Ollama). Ohne: nur Volltextsuche. |
| `FLOWPLAN_AI_API_KEY` / `FLOWPLAN_AI_API_KEY_FILE` | *leer* | Schlüssel des Anbieters. Wird nie in der Datenbank gespeichert und nur für den Anbieter aus den Variablen verwendet. |
| `FLOWPLAN_AI_ACCESS` | `everyone` | `selected`: nur freigeschaltete Personen. |
| `FLOWPLAN_AI_GUESTS` | *aus* | `on`: auch Gäste dürfen KI nutzen. |
| `FLOWPLAN_AI_USER_PROVIDERS` | *aus* | `on`: Personen dürfen eigene Anbieter und Schlüssel hinterlegen. |
| `FLOWPLAN_AI_FEATURES` | *alle* | Erlaubte Funktionen, durch Komma getrennt: `write`, `summarize`, `ask`, `database`, `actions`, `whiteboard`. |
| `FLOWPLAN_AI_DEVICE` | *an* | `off`: keine [KI auf dem Gerät](/ai#ki-auf-dem-geraet-apple) in den Apps für iPhone, iPad und Mac. Unabhängig von `FLOWPLAN_AI`. |
| `FLOWPLAN_AI_SEMANTIC_SEARCH` | *aus* | `on`: [Suche nach Bedeutung](/ask-ai#suche-nach-bedeutung-optional) mit dem Embedding-Modell. |
| `FLOWPLAN_AI_EMBED_PER_HOUR` | `5000` | Höchstzahl eingebetteter Abschnitte pro Stunde für die Suche nach Bedeutung. |
| `FLOWPLAN_AI_REQUESTS_PER_HOUR` | `300` | Höchstzahl an KI-Anfragen pro Person und Stunde (zusätzlich 30 pro Minute, 3 gleichzeitig). |
## Push-Benachrichtigungen
| Variable | Bedeutung |
| --- | --- |
| `WEB_PUSH_SUBJECT` | Kontakt für die Push-Dienste, z. B. `mailto:admin@example.com`. |
| `WEB_PUSH_PUBLIC_KEY` / `WEB_PUSH_PRIVATE_KEY` | VAPID-Schlüsselpaar. Ohne Angabe erzeugt Flowplan eines unter `FLOWPLAN_DATA_DIR/web-push-keys.json`. Im [Cluster-Modus](/cluster#voraussetzungen) Pflicht. |
| `MOBILE_PUSH` | Mitteilungen an die Apps für iPhone, iPad und Android. Nichts einzurichten; `off` schaltet sie ganz ab. Standard: `on`. |
| `PUSH_RELAY_URL` | Das [Push-Relay](#push-relay-und-ende-zu-ende-verschluesselung), über das Mitteilungen an die Apps gehen. Nur ein HTTPS-Origin (`http` nur für `localhost`), ohne Pfad. Standard: `https://push.flowplan.org`. |
| `PUSH_RELAY` | `off`: kein Relay. Apps bekommen Mitteilungen dann nur noch, wenn sie ein Expo-Token haben (ältere App-Versionen), über den Push-Dienst von Expo. Standard: `on`. |
| `MOBILE_PUSH_CONTENT` | Ob der Text der Benachrichtigung mitkommt – und damit die Knöpfe **Erledigt** und **Morgen** an fälligen Aufgaben und **Antworten** an Kommentaren ([Knöpfe an Mitteilungen](/mobile-widgets#knoepfe-an-mitteilungen)); **Als gelesen markieren** gibt es immer. *Leer* (Standard): nur, wo er Ende-zu-Ende-verschlüsselt ist, also über das Relay; über Expo (ältere Apps) wie bei Web-Push nur „Neues im Posteingang“, Live-Aktivitäten nur mit Zeiten, ohne Titel. `on`: auch über Expo und mit Titeln in Live-Aktivitäten – lesbar für Expo, Apple und Google. `off`: nie, auch nicht über das Relay. |
Die VAPID-Schlüssel dürfen sich nicht ändern, sonst verlieren alle Browser ihr Abonnement. Ausgehendes HTTPS zu den Push-Diensten von Apple, Google und Mozilla (Web-Push) und zum Push-Relay muss möglich sein.
### Push-Relay und Ende-zu-Ende-Verschlüsselung
Mitteilungen an die Apps gehen über das Flowplan-Push-Relay (`push.flowplan.org`). Nur das Relay hat die Zugangsdaten für Apple (APNs) und Google (Firebase); deine Instanz braucht keine eigenen – auch selbst gehostete Instanzen schicken so an die Apps aus dem App Store und Google Play.
- **Ende-zu-Ende-verschlüsselt:** Jede App-Installation erzeugt pro Instanz ein Schlüsselpaar (X25519) und gibt der Instanz nur den öffentlichen Schlüssel. Die Instanz verschlüsselt jede Mitteilung damit (HKDF-SHA256, AES-256-GCM, ein neuer Einmalschlüssel je Mitteilung); erst die App auf dem Gerät entschlüsselt sie. Relay, Apple und Google sehen nur Chiffretext – dazu die Art der Mitteilung, welche Knöpfe sie hat, die Zahl am App-Symbol und wann sie geschickt wurde. Lässt sich eine Mitteilung nicht entschlüsseln, zeigt die App „Neue Mitteilung“.
- **Signiert:** Die Instanz hat ein eigenes Signaturschlüsselpaar (Ed25519), das beim ersten Gebrauch entsteht. Der private Schlüssel liegt nur verschlüsselt in der Datenbank (wie gespeicherte Geheimnisse, siehe oben); den öffentlichen veröffentlicht die Instanz unter `/.well-known/flowplan-push`. Das Relay nimmt nur signierte Anfragen an und nur für Geräte, die sich für genau diese Instanz angemeldet haben. Dafür muss `APP_URL` die öffentliche HTTPS-Adresse sein, und `/.well-known/flowplan-push` muss von außen erreichbar sein.
- **Was gespeichert wird:** Pro App-Installation das Relay-Token (nur verschlüsselt) und der öffentliche Schlüssel. Beides verschwindet mit dem Abmelden, dem Entfernen unter *Angemeldete Geräte* oder wenn das Relay meldet, dass das Gerät nicht mehr erreichbar ist. Protokolliert werden weder Tokens noch Schlüssel noch Inhalte.
- **Live-Aktivitäten** (iPhone) für Zeiterfassung und Fokus aktualisiert die Instanz ebenfalls über das Relay, wenn sich der Zustand ändert. Ihren Inhalt zeichnet iOS selbst – er lässt sich nicht verschlüsseln. Deshalb enthält er standardmäßig nur Zeiten und die Phase, keine Titel (`MOBILE_PUSH_CONTENT=on` schickt den Titel mit).
- **Ältere App-Versionen** ohne Relay bekommen Mitteilungen weiter über den Push-Dienst von Expo (`exp.host`), standardmäßig ohne Text.
- **Signaturschlüssel wechseln:** `node --import tsx scripts/push-relay-key.mjs rotate` im Repository bzw. als Administrator `POST /api/admin/operations` mit `{"action":"pushRelay.rotate"}`. Der neue Schlüssel wird sofort veröffentlicht und signiert nach gut einer Stunde; der alte bleibt 7 Tage gelistet (`--grace-days` bzw. `graceDays`). Bei einem womöglich bekannt gewordenen Schlüssel `--immediate` bzw. `"immediate": true`: der neue signiert sofort, alle alten verschwinden. `{"action":"pushRelay.keys"}` listet die Schlüssel (nur IDs und Daten). Oder unter **Administration → Push-Benachrichtigungen → Schlüssel wechseln …**.
- **Eigenes Relay:** nur zusammen mit einer eigenen App-Version – siehe [Eigenes Push-Relay betreiben](#eigenes-push-relay-betreiben).
- **Prüfen:** **Einstellungen → Benachrichtigungen → Testbenachrichtigung senden** schickt sofort über Relay, Expo und Web-Push an die eigenen Geräte und zeigt je Gerät das Ergebnis – etwa dass das Relay die Instanz nicht verifizieren konnte (`/.well-known/flowplan-push` nicht erreichbar) oder nicht erreichbar ist. Administratoren sehen dazu Relay-Adresse, ob `/.well-known/flowplan-push` aktiv ist, und die verwendete `APP_URL`. Siehe [Testbenachrichtigung](/notifications#testbenachrichtigung).
- **Zustand in der Administration:** **Administration → Push-Benachrichtigungen** zeigt das verwendete Relay (offiziell oder eigenes), ob es an ist und sonst warum, ob es gerade erreichbar ist (`/healthz`, mit Antwortzeit), ob die Instanz ihr `/.well-known/flowplan-push` unter `APP_URL` selbst abrufen kann, die Signaturschlüssel mit **Schlüssel wechseln …**, die Zustellungen der letzten 24 Stunden je Kanal und den letzten Fehler. Siehe [Administration → Push-Benachrichtigungen](/administration#push-benachrichtigungen).
**Für die Datenschutzerklärung** einer Instanz etwa: „Push-Mitteilungen an die Flowplan-Apps werden Ende-zu-Ende-verschlüsselt über den Push-Dienst von Flowplan (push.flowplan.org) und die Dienste von Apple (APNs) bzw. Google (Firebase Cloud Messaging) zugestellt. Diese Dienste erhalten ein Geräte-Token, die Adresse dieser Instanz, den Zeitpunkt und die Art der Mitteilung, nicht aber ihren Inhalt.“ – mit `MOBILE_PUSH_CONTENT=on` oder Mitteilungen über Expo entsprechend ergänzen.
### Eigenes Push-Relay betreiben
Das Relay ist Open Source ([github.com/yannicschuller/flowplan-push](https://github.com/yannicschuller/flowplan-push)) und lässt sich selbst betreiben. **Für die offiziellen Flowplan-Apps (iPhone und iPad aus dem [App Store](https://apps.apple.com/app/id6825801344), Android von [flowplan.org/download](https://flowplan.org/download)) brauchst du das nicht** – sie nehmen nur Mitteilungen über `push.flowplan.org` an, denn Apple und Google stellen an diese Apps nur mit Flowplans Schlüsseln zu. Ein eigenes Relay ist sinnvoll, wenn du **eine eigene App-Version** baust (eigene Bundle-ID, eigenes Apple-Team) oder Instanzen im internen Netz erreichen willst.
::: steps
1. **Relay starten** – als Docker-Image `ghcr.io/yannicschuller/flowplan-push:latest` (oder selbst aus dem Repository gebaut), z. B. in Coolify unter `https://push.example.com`, Port `8080`, ein Volume auf `/data`. Umgebungsvariablen:
| Variable | Wert |
| --- | --- |
| `RELAY_STORAGE_KEY` | `openssl rand -base64 32` – verschlüsselt die gespeicherten Geräte-Tokens |
| `RELAY_PUBLIC_URL` | die öffentliche Adresse des Relays ohne Pfad, z. B. `https://push.example.com` (sonst gilt `https://push.flowplan.org`) |
| `APNS_KEY_ID`, `APNS_TEAM_ID`, `APNS_KEY` | APNs-Schlüssel (`.p8`) deines Apple-Teams: Key ID, Team ID und Inhalt der Datei (auch als Base64) |
| `ALLOWED_BUNDLE_IDS` | die Bundle-ID deiner App, z. B. `com.example.notes` |
| `FCM_SERVICE_ACCOUNT` | optional, Dienstkonto-JSON deines Firebase-Projekts für Android |
| `TRUST_PROXY` | `1` hinter Coolify/Traefik |
| `ALLOW_PRIVATE_INSTANCES` | `true`, wenn Instanzen im internen Netz (private Adressen, `http://localhost`) Mitteilungen schicken sollen – laut README des Relays nur für Entwicklung und geschlossene Netze gedacht |
`https://push.example.com/healthz` antwortet mit `{"status":"ok"}`; im Log steht beim Start, ob APNs und FCM eingerichtet sind.
2. **App bauen** – mit deiner Bundle-ID und deinem Apple-Team sowie `PUSH_RELAY_URL=https://push.example.com` (Build-Variable der App) und für Android deiner `google-services.json`. Die App meldet sich nur bei dem Relay an, mit dem sie gebaut wurde.
3. **Instanz einstellen** – `PUSH_RELAY_URL=https://push.example.com`. `APP_URL` muss die HTTPS-Adresse der Instanz sein und `/.well-known/flowplan-push` für das Relay erreichbar. Eine Instanz kann nur ein Relay nutzen: Zeigt sie auf dein Relay, bekommen die Store-Apps von ihr keine Mitteilungen mehr über das Relay.
4. **Prüfen** – mit der [Testbenachrichtigung](/notifications#testbenachrichtigung).
:::
Betrieb, Schlüsselwechsel, Sperren missbräuchlicher Instanzen (`node dist/src/cli.js block ` im Container) und Sicherungen beschreibt die README des Relays.
---
# Alle Umgebungsvariablen
Jede Umgebungsvariable von Flowplan in einer Tabelle, von A bis Z – mit Standardwert, der Bedeutung in einem Satz und dem Abschnitt, der sie genau beschreibt.
Die Variablen werden beim Start des Containers gelesen, etwa aus der `.env`-Datei neben der `compose.yaml` oder den Umgebungsvariablen in Coolify ([Installation](/installation)). Viele Werte lassen sich auch in der **Administration** setzen; was dort gespeichert ist, hat Vorrang ([In der Oberfläche](/configuration#in-der-oberflaeche)).
Die Liste wird aus den Seiten dieser Dokumentation zusammengestellt; ein Test prüft gegen den Code von Flowplan, dass keine Variable fehlt. Das Feld über der Tabelle filtert sie, auch nach Teilen wie `S3_` oder `OIDC`.
| Variable | Standard | Bedeutung | Beschrieben in |
| --- | --- | --- | --- |
| `APP_URL` | – | Öffentliche Adresse genau so, wie sie im Browser steht – Schema, Host, ggf. Port, ohne Schrägstrich am Ende. | [Konfiguration › Pflicht](/configuration#pflicht) |
| `DATABASE_SESSION_URL` | `DATABASE_URL` | Direkte Verbindung (oder Pool im Modus `session`) für Benachrichtigungen, die Leitung im Cluster und `pg_dump`/`pg_restore`, wenn `DATABASE_URL` auf PgBouncer im Modus `transaction` zeigt. | [Konfiguration: Speicher, Datenbank und Sicherheit › Datenbank und Cluster](/configuration-storage#datenbank-und-cluster) |
| `DATABASE_URL` | *leer* | `postgres://…` schaltet auf PostgreSQL um. | [Konfiguration: Speicher, Datenbank und Sicherheit › Datenbank und Cluster](/configuration-storage#datenbank-und-cluster) |
| `DRAWIO_URL` | `https://embed.diagrams.net` | Adresse des draw.io-Editors für den Block `/drawio`, z. B. ein eigener Container `jgraph/drawio`. | [Konfiguration: Speicher, Datenbank und Sicherheit › Rechtliches und Oberfläche](/configuration-storage#rechtliches-und-oberflaeche) |
| `EXPORT_GIT_AUTHOR` | – | Autor der Commits. | [Markdown-Export und Git › In ein Git-Repository übertragen](/markdown-git-export#in-ein-git-repository-uebertragen) |
| `EXPORT_GIT_BRANCH` | – | Zweig, Standard `main`. | [Markdown-Export und Git › In ein Git-Repository übertragen](/markdown-git-export#in-ein-git-repository-uebertragen) |
| `EXPORT_GIT_EMAIL` | – | Autor der Commits. | [Markdown-Export und Git › In ein Git-Repository übertragen](/markdown-git-export#in-ein-git-repository-uebertragen) |
| `EXPORT_GIT_IMPORT` | – | `true`: Änderungen, die seit dem letzten Lauf im Repository gemacht wurden, übernimmt Flowplan vor dem Export. | [Markdown-Export und Git › In ein Git-Repository übertragen](/markdown-git-export#in-ein-git-repository-uebertragen) |
| `EXPORT_GIT_TOKEN` | – | Token mit Schreibrecht auf dieses Repository. | [Markdown-Export und Git › In ein Git-Repository übertragen](/markdown-git-export#in-ein-git-repository-uebertragen) |
| `EXPORT_GIT_URL` | – | `https://`-Adresse des Repositorys, ohne Zugangsdaten. | [Markdown-Export und Git › In ein Git-Repository übertragen](/markdown-git-export#in-ein-git-repository-uebertragen) |
| `EXPORT_GIT_USERNAME` | – | Benutzername zum Token (Standard `flowplan`; GitLab: `oauth2`). | [Markdown-Export und Git › In ein Git-Repository übertragen](/markdown-git-export#in-ein-git-repository-uebertragen) |
| `FLOWPLAN_AI` | *aus* | `on` schaltet KI ein. | [Konfiguration: KI, Sprachnotizen und Push › KI](/configuration-ai-push#ki) |
| `FLOWPLAN_AI_ACCESS` | `everyone` | `selected`: nur freigeschaltete Personen. | [Konfiguration: KI, Sprachnotizen und Push › KI](/configuration-ai-push#ki) |
| `FLOWPLAN_AI_API_KEY` | *leer* | Schlüssel des Anbieters. | [Konfiguration: KI, Sprachnotizen und Push › KI](/configuration-ai-push#ki) |
| `FLOWPLAN_AI_API_KEY_FILE` | *leer* | Schlüssel des Anbieters. | [Konfiguration: KI, Sprachnotizen und Push › KI](/configuration-ai-push#ki) |
| `FLOWPLAN_AI_BASE_URL` | *je Anbieter* | Adresse des Anbieters, z. B. `https://api.mistral.ai/v1` für einen OpenAI-kompatiblen Dienst. | [Konfiguration: KI, Sprachnotizen und Push › KI](/configuration-ai-push#ki) |
| `FLOWPLAN_AI_DEVICE` | *an* | `off`: keine [KI auf dem Gerät](/ai#ki-auf-dem-geraet-apple) in den Apps für iPhone, iPad und Mac. | [Konfiguration: KI, Sprachnotizen und Push › KI](/configuration-ai-push#ki) |
| `FLOWPLAN_AI_EMBED_PER_HOUR` | `5000` | Höchstzahl eingebetteter Abschnitte pro Stunde für die Suche nach Bedeutung. | [Konfiguration: KI, Sprachnotizen und Push › KI](/configuration-ai-push#ki) |
| `FLOWPLAN_AI_EMBEDDING_MODEL` | *leer* | Modell für die Suche nach Bedeutung, z. B. `nomic-embed-text` (Ollama). | [Konfiguration: KI, Sprachnotizen und Push › KI](/configuration-ai-push#ki) |
| `FLOWPLAN_AI_FEATURES` | *alle* | Erlaubte Funktionen, durch Komma getrennt: `write`, `summarize`, `ask`, `database`, `actions`, `whiteboard`. | [Konfiguration: KI, Sprachnotizen und Push › KI](/configuration-ai-push#ki) |
| `FLOWPLAN_AI_GUESTS` | *aus* | `on`: auch Gäste dürfen KI nutzen. | [Konfiguration: KI, Sprachnotizen und Push › KI](/configuration-ai-push#ki) |
| `FLOWPLAN_AI_MODEL` | *leer* | Modell, z. B. `llama3.1` oder `gpt-4o-mini`. | [Konfiguration: KI, Sprachnotizen und Push › KI](/configuration-ai-push#ki) |
| `FLOWPLAN_AI_PROVIDER` | *leer* | `ollama`, `openai` (OpenAI-kompatibel), `anthropic` oder `gemini`. | [Konfiguration: KI, Sprachnotizen und Push › KI](/configuration-ai-push#ki) |
| `FLOWPLAN_AI_REQUESTS_PER_HOUR` | `300` | Höchstzahl an KI-Anfragen pro Person und Stunde (zusätzlich 30 pro Minute, 3 gleichzeitig). | [Konfiguration: KI, Sprachnotizen und Push › KI](/configuration-ai-push#ki) |
| `FLOWPLAN_AI_SEMANTIC_SEARCH` | *aus* | `on`: [Suche nach Bedeutung](/ask-ai#suche-nach-bedeutung-optional) mit dem Embedding-Modell. | [Konfiguration: KI, Sprachnotizen und Push › KI](/configuration-ai-push#ki) |
| `FLOWPLAN_AI_TOKENS` | – | Umgebung: `FLOWPLAN_AI_TOKENS=off` schaltet diese Berechtigung für Tokens standardmäßig ab (bis ein Admin die KI-Einstellungen speichert). | [Besprechungen › API und MCP](/meetings#api-und-mcp) |
| `FLOWPLAN_AI_USER_PROVIDERS` | *aus* | `on`: Personen dürfen eigene Anbieter und Schlüssel hinterlegen. | [Konfiguration: KI, Sprachnotizen und Push › KI](/configuration-ai-push#ki) |
| `FLOWPLAN_ANONYMOUS_UPLOAD_MB` | `1024` | Wie viele MB Besucher ohne Konto pro Tag auf der ganzen Instanz hochladen dürfen – über anonyme Formulare und Bearbeiten-Links (`0` = unbegrenzt). | [Konfiguration › Betrieb](/configuration#betrieb) |
| `FLOWPLAN_BACKUP_FORMAT` | `pg_dump` | `sqlite`: geplante Sicherungen auf PostgreSQL im portablen SQLite-Format. | [Konfiguration: Speicher, Datenbank und Sicherheit › Datenbank und Cluster](/configuration-storage#datenbank-und-cluster) |
| `FLOWPLAN_CLUSTER` | *leer* | `1`: mehrere Instanzen; verlangt `DATABASE_URL`, `REDIS_URL`, `S3_BUCKET`, `FLOWPLAN_ENCRYPTION_KEY` (oder `FLOWPLAN_SECRETS_KEY`) und `WEB_PUSH_PUBLIC_KEY`/`WEB_PUSH_PRIVATE_KEY`. | [Konfiguration: Speicher, Datenbank und Sicherheit › Datenbank und Cluster](/configuration-storage#datenbank-und-cluster) |
| `FLOWPLAN_COUNTRY_HEADER` | *leer* | Header des Proxys mit dem Land der Anfrage (z. B. `CF-IPCountry`); schaltet die Regel „zwei Länder kurz nacheinander“ ein. | [Konfiguration › Betrieb](/configuration#betrieb) |
| `FLOWPLAN_DATA_DIR` | `/app/data` im Image, sonst `./data` | Datenverzeichnis für SQLite, Uploads, Push-Schlüssel und Texterkennungsdaten. | [Konfiguration › Betrieb](/configuration#betrieb) |
| `FLOWPLAN_DIST_DIR` | – | `FLOWPLAN_DIST_DIR` ist nur für parallele Entwicklungsserver gedacht, `OIDC_ALLOW_LOCAL_HTTP` nur für Tests mit einem Anbieter auf `http://localhost`, `FLOWPLAN_GIT_ALLOW_HTTP` nur für Tests des Git-Exports mit einem `http://`-Server (in Produktion wirkungslos). | [Konfiguration › Nicht setzen](/configuration#nicht-setzen) |
| `FLOWPLAN_DROP_ROOT` | – | `NODE_ENV`, `PORT`, `HOSTNAME` und `NEXT_TELEMETRY_DISABLED` setzt das Image selbst, ebenso `FLOWPLAN_DROP_ROOT=1` (Flowplans Werkzeuge im Container geben root ab und laufen als `PUID:PGID`). | [Konfiguration › Nicht setzen](/configuration#nicht-setzen) |
| `FLOWPLAN_ENCRYPTION_KEY` | *leer* | 32 Bytes, base64 (`openssl rand -base64 32`). | [Konfiguration: Speicher, Datenbank und Sicherheit › Verschlüsselung](/configuration-storage#verschluesselung) |
| `FLOWPLAN_ENCRYPTION_KEY_FILE` | *leer* | Statt der Variablen: Pfad zu einer Datei mit dem Schlüssel (Docker-Secret). | [Konfiguration: Speicher, Datenbank und Sicherheit › Verschlüsselung](/configuration-storage#verschluesselung) |
| `FLOWPLAN_ENCRYPTION_KEY_PREVIOUS` | *leer* | Frühere Schlüssel, durch Komma getrennt – nur zum Lesen nach einem Schlüsselwechsel. | [Konfiguration: Speicher, Datenbank und Sicherheit › Verschlüsselung](/configuration-storage#verschluesselung) |
| `FLOWPLAN_GIT_ALLOW_HTTP` | – | `FLOWPLAN_DIST_DIR` ist nur für parallele Entwicklungsserver gedacht, `OIDC_ALLOW_LOCAL_HTTP` nur für Tests mit einem Anbieter auf `http://localhost`, `FLOWPLAN_GIT_ALLOW_HTTP` nur für Tests des Git-Exports mit einem `http://`-Server (in Produktion wirkungslos). | [Konfiguration › Nicht setzen](/configuration#nicht-setzen) |
| `FLOWPLAN_HIDE_SPONSOR` | `false` | `true` blendet unter **Einstellungen → Über Flowplan** nur den Teil **Flowplan unterstützen ♥** (Link zu GitHub Sponsors) aus. | [Konfiguration: Speicher, Datenbank und Sicherheit › Rechtliches und Oberfläche](/configuration-storage#rechtliches-und-oberflaeche) |
| `FLOWPLAN_IMPORT_MAX_DOCS` | `10000` | Höchstzahl der Seiten je [Import](/migrate) aus AFFiNE, Confluence, Evernote, Google Docs, Obsidian und Notion/Markdown: Dokumente, Ordner, Datenbanken, Whiteboards und Sammlungen; beim Import als neue Datenbank die Zahl der Einträge. | [Konfiguration › Betrieb](/configuration#betrieb) |
| `FLOWPLAN_IMPORT_MAX_FILES` | `20000` | Höchstzahl der Dateien (Bilder, Anhänge) je Import aus einem AFFiNE-Arbeitsbereich oder -Snapshot; weitere werden ausgelassen, die Vorschau nennt ihre Zahl und die Variable. | [Konfiguration › Betrieb](/configuration#betrieb) |
| `FLOWPLAN_IMPORT_MAX_MB` | *leer* | Größte Datei für [Importe aus AFFiNE](/migrate-affine) und anderen Werkzeugen in MB, für alle Personen. | [Konfiguration › Betrieb](/configuration#betrieb) |
| `FLOWPLAN_INSTANCE_ID` | Hostname + Zufall | Name der Instanz in der Übersicht und in `application_name` der Datenbankverbindungen. | [Cluster-Modus › Weitere Variablen](/cluster#weitere-variablen) |
| `FLOWPLAN_LEADER_INTERVAL` | `5000` | Wie oft (ms) die Instanzen die Leitung prüfen; bestimmt, wie schnell eine ausgefallene leitende Instanz ersetzt wird. | [Cluster-Modus › Weitere Variablen](/cluster#weitere-variablen) |
| `FLOWPLAN_LITESTREAM` | an | `off`: nur Dateien spiegeln, Datenbank nicht sichern. | [Konfiguration: Speicher, Datenbank und Sicherheit › S3 und Datenbanksicherung](/configuration-storage#s3-und-datenbanksicherung) |
| `FLOWPLAN_LITESTREAM_SSE_C` | – | `FLOWPLAN_LITESTREAM_SSE_C` setzt der Start des Containers, wenn `LITESTREAM_SSE_C_KEY` gesetzt ist; die Administration zeigt daran, ob die Litestream-Kopie verschlüsselt ist. | [Konfiguration › Nicht setzen](/configuration#nicht-setzen) |
| `FLOWPLAN_LOCAL_LOGIN` | an | `false` schaltet E-Mail, Passwort und Passkeys ab; dann bleibt nur Single Sign-on. | [Konfiguration › Anmeldung](/configuration#anmeldung) |
| `FLOWPLAN_MARKETPLACE_URL` | `https://marketplace.flowplan.org` | Adresse des Flowplan Marketplace (Standard `https://marketplace.flowplan.org`); `off` schaltet ihn ab. | [Konfiguration › Betrieb](/configuration#betrieb) |
| `FLOWPLAN_MAX_DOCUMENT_MB` | `16` | Größe eines gemeinsam bearbeiteten Dokuments (Seite oder Datensatz-Dokument) in MB. | [Konfiguration › Betrieb](/configuration#betrieb) |
| `FLOWPLAN_MESSENGER_ALLOW_PRIVATE` | wie `FLOWPLAN_WEBHOOK_ALLOW_PRIVATE` | `true`: Personen dürfen Server im eigenen Netz angeben (interne Adressen, `http://`) – etwa Gotify oder ntfy im Heimnetz. | [Konfiguration: E-Mail, Integrationen und Workflows › Chat-Apps](/configuration-integrations#chat-apps) |
| `FLOWPLAN_MESSENGERS` | *alle* | Dienste, die Personen verbinden dürfen, durch Komma getrennt: `telegram`, `gotify`, `ntfy`, `matrix`; `off` für keinen. | [Konfiguration: E-Mail, Integrationen und Workflows › Chat-Apps](/configuration-integrations#chat-apps) |
| `FLOWPLAN_METRICS` | an | `off` schaltet die Nutzungsstatistik der [Überwachung](/monitoring#statistik) aus: Anfragen, Fehler und Antwortzeiten je Minute, aktive Personen je Stunde, Speicherverlauf und KI-Tokens. | [Konfiguration › Betrieb](/configuration#betrieb) |
| `FLOWPLAN_METRICS_LOOP` | – | > **Für Lasttests:** `FLOWPLAN_METRICS_LOOP=1` misst zusätzlich die Verzögerung und Auslastung der Node-Event-Loop und die Zeit in SQLite und hängt sie an `/api/metrics` an. | [Überwachung und Wartung › Prometheus](/monitoring#prometheus) |
| `FLOWPLAN_METRICS_TOKEN` | *leer* | Mindestens 16 Zeichen; aktiviert `/api/metrics` im Prometheus-Format. | [Konfiguration › Betrieb](/configuration#betrieb) |
| `FLOWPLAN_MODE` | – | Gleichwertig: `FLOWPLAN_MODE=cluster`. | [Cluster-Modus › Weitere Variablen](/cluster#weitere-variablen) |
| `FLOWPLAN_MOVE_ALLOW_PRIVATE` | *leer* | Auf der **neuen** Instanz: `true` erlaubt, eine Instanz unter einer internen Adresse (LAN, VPN, `localhost`) und über `http://` zu übernehmen – etwa einen Heimserver. | [Konfiguration: Speicher, Datenbank und Sicherheit › Instanzumzug](/configuration-storage#instanzumzug) |
| `FLOWPLAN_OCR` | an | `0` schaltet die Texterkennung für gescannte PDFs und Bilder ab. | [Konfiguration › Betrieb](/configuration#betrieb) |
| `FLOWPLAN_OCR_LANGS` | `deu,eng` | Sprachen der Texterkennung, z. B. `fra,eng`; die erste ist die Hauptsprache. | [Konfiguration › Betrieb](/configuration#betrieb) |
| `FLOWPLAN_PG_BIN` | *leer* | Ordner mit `pg_dump`, `pg_restore` und `psql`, wenn sie nicht im `PATH` liegen. | [PostgreSQL › Variablen](/postgresql#variablen) |
| `FLOWPLAN_PG_CONNECT_TIMEOUT` | `30000` | So lange wartet eine Anfrage auf eine freie Verbindung aus dem Pool (ms). | [PostgreSQL › Variablen](/postgresql#variablen) |
| `FLOWPLAN_PG_IDLE_TX_TIMEOUT` | `60000` | Eine Transaktion, die so lange nichts tut, wird beendet (ms). | [PostgreSQL › Variablen](/postgresql#variablen) |
| `FLOWPLAN_PG_LOCK_TIMEOUT` | `10000` | So lange wartet eine Abfrage höchstens auf eine Sperre (ms). | [PostgreSQL › Variablen](/postgresql#variablen) |
| `FLOWPLAN_PG_POOL` | `public`, `10`, … | Schema, Verbindungen je Instanz und Zeitlimits. | [Konfiguration: Speicher, Datenbank und Sicherheit › Datenbank und Cluster](/configuration-storage#datenbank-und-cluster) |
| `FLOWPLAN_PG_PREPARE` | an | `off`: Abfragen ohne Namen statt benannter Prepared Statements – für PgBouncer im Modus `transaction` ohne `max_prepared_statements`. | [Konfiguration: Speicher, Datenbank und Sicherheit › Datenbank und Cluster](/configuration-storage#datenbank-und-cluster) |
| `FLOWPLAN_PG_SCHEMA` | `public`, `10`, … | Schema, Verbindungen je Instanz und Zeitlimits. | [Konfiguration: Speicher, Datenbank und Sicherheit › Datenbank und Cluster](/configuration-storage#datenbank-und-cluster) |
| `FLOWPLAN_PG_SCHEMA_AUTO` | an | `off`: Die Instanz legt das Schema nicht selbst an oder aktualisiert es – das übernimmt ein eigener Schritt (`node /app/scripts/db-schema.mjs`, siehe [Cluster-Modus](/cluster#schema-vor-dem-start)). | [PostgreSQL › Variablen](/postgresql#variablen) |
| `FLOWPLAN_PG_STATEMENT_TIMEOUT` | `120000` | Höchstdauer einer Abfrage in Millisekunden; `0` = kein Limit. | [PostgreSQL › Variablen](/postgresql#variablen) |
| `FLOWPLAN_PGVECTOR` | an | `off` nutzt `pgvector` nicht, auch wenn es installiert ist. | [PostgreSQL › Variablen](/postgresql#variablen) |
| `FLOWPLAN_PUBLIC_API_DOCS` | `false` | `true` macht `/api/openapi.json` und `/api/docs` ohne Anmeldung lesbar; Besucher sehen darin nur die Hauptversion (`0.x`). | [Konfiguration › Betrieb](/configuration#betrieb) |
| `FLOWPLAN_READY_REQUIRE` | alle | Welche Prüfungen über `/api/health/ready` entscheiden. | [Konfiguration: Speicher, Datenbank und Sicherheit › Datenbank und Cluster](/configuration-storage#datenbank-und-cluster) |
| `FLOWPLAN_REDIS_PREFIX` | `flowplan:` | Präfix für Schlüssel und Kanäle, wenn sich mehrere Installationen ein Redis teilen. | [Cluster-Modus › Weitere Variablen](/cluster#weitere-variablen) |
| `FLOWPLAN_SECRETS_KEY` | – | Ein eigener Schlüssel nur dafür: 32 Bytes, base64 oder hex (`openssl rand -base64 32`), oder Pfad zu einer Datei (Docker-Secret). | [Konfiguration: Speicher, Datenbank und Sicherheit › Gespeicherte Geheimnisse](/configuration-storage#gespeicherte-geheimnisse) |
| `FLOWPLAN_SECRETS_KEY_FILE` | – | Ein eigener Schlüssel nur dafür: 32 Bytes, base64 oder hex (`openssl rand -base64 32`), oder Pfad zu einer Datei (Docker-Secret). | [Konfiguration: Speicher, Datenbank und Sicherheit › Gespeicherte Geheimnisse](/configuration-storage#gespeicherte-geheimnisse) |
| `FLOWPLAN_SECURITY_LOG` | `on` | Sicherheitsereignisse als JSON-Zeile auf stdout: `on` (mit Adresse, für fail2ban/CrowdSec), `anonymous`, `off` ([Sicherheit](/security-monitoring#sicherheit)). | [Konfiguration › Betrieb](/configuration#betrieb) |
| `FLOWPLAN_SECURITY_RETENTION_DAYS` | `90` | Wie lange Sicherheitsereignisse in der Datenbank bleiben (mindestens 7). | [Konfiguration › Betrieb](/configuration#betrieb) |
| `FLOWPLAN_SETUP_TOKEN` | *leer* (Helm: zufällig erzeugt) | Empfohlen für Instanzen, die aus dem Internet erreichbar sind: Das erste Konto und das Wiederherstellen beim Einrichten gehen nur über `/register?setup=`. | [Konfiguration › Anmeldung](/configuration#anmeldung) |
| `FLOWPLAN_SKIP_TYPECHECK` | – | `FLOWPLAN_SKIP_TYPECHECK=1` ist nur für die Entwicklung gedacht: Es überspringt die TypeScript-Prüfung beim Build, wenn sie wie in unserem CI schon gelaufen ist. | [Installation mit Docker › Image selbst bauen](/installation#image-selbst-bauen) |
| `FLOWPLAN_SNAPSHOT_RETENTION_DAYS` | `180` | Aufbewahrung automatischer Versionen in Tagen (`0` = unbegrenzt). | [Konfiguration › Betrieb](/configuration#betrieb) |
| `FLOWPLAN_SOURCE_URL` | GitHub-Repository von Flowplan | Adresse des Quellcodes, der auf dieser Instanz läuft (http oder https). | [Konfiguration: Speicher, Datenbank und Sicherheit › Rechtliches und Oberfläche](/configuration-storage#rechtliches-und-oberflaeche) |
| `FLOWPLAN_TELEGRAM_API_URL` | `https://api.telegram.org` | Adresse der Bot-API für den Bot der Instanz – ein selbst betriebener [Telegram-Bot-API-Server](https://github.com/tdlib/telegram-bot-api) oder ein Relay/Proxy. | [Konfiguration: E-Mail, Integrationen und Workflows › Chat-Apps](/configuration-integrations#chat-apps) |
| `FLOWPLAN_TELEGRAM_BOT_TOKEN` | *leer* | Token des Telegram-Bots der Instanz (von @BotFather). | [Konfiguration: E-Mail, Integrationen und Workflows › Chat-Apps](/configuration-integrations#chat-apps) |
| `FLOWPLAN_TRUSTED_PROXIES` | `1` | Anzahl der Proxys vor Flowplan (Traefik allein: `1`, Pangolin vor Traefik: `2`, `0` = keinem Header vertrauen). | [Konfiguration › Betrieb](/configuration#betrieb) |
| `FLOWPLAN_UPDATE_CHECK` | an | `false` schaltet die Suche nach neuen Versionen ab (für Instanzen ohne Internet). | [Konfiguration › Betrieb](/configuration#betrieb) |
| `FLOWPLAN_UPDATE_URL` | GitHub-API | Andere Adresse für das neueste Release (gleiches Format wie `api.github.com/repos/yannicschuller/flowplan/releases/latest`), etwa ein interner Spiegel. | [Konfiguration › Betrieb](/configuration#betrieb) |
| `FLOWPLAN_VERSION` | – | Eine feste Version wählst du mit `FLOWPLAN_VERSION=0.7.0` in der `.env`. | [Installation mit Docker › Mit Docker Compose](/installation#mit-docker-compose) |
| `FLOWPLAN_WEBHOOK_ALLOW_PRIVATE` | *leer* | `true` erlaubt Webhooks an interne Adressen und `http://` – etwa Home Assistant oder n8n im selben Netz. | [Konfiguration: E-Mail, Integrationen und Workflows › Integrationen](/configuration-integrations#integrationen) |
| `FLOWPLAN_WORKFLOW_ACTIVE_PER_WORKSPACE` | 100 | aktive Workflows je Arbeitsbereich | [Konfiguration: E-Mail, Integrationen und Workflows › Workflows](/configuration-integrations#workflows) |
| `FLOWPLAN_WORKFLOW_AI_TOKENS_PER_DAY` | 100000 | KI-Tokens je Workflow und Tag (0 = KI-Knoten aus) | [Konfiguration: E-Mail, Integrationen und Workflows › Workflows](/configuration-integrations#workflows) |
| `FLOWPLAN_WORKFLOW_CASCADE_DEPTH` | 5 | Tiefe gegenseitiger Auslösung | [Konfiguration: E-Mail, Integrationen und Workflows › Workflows](/configuration-integrations#workflows) |
| `FLOWPLAN_WORKFLOW_EXTERNAL_MAIL` | `on` | E-Mails an Adressen außerhalb der Mitglieder | [Konfiguration: E-Mail, Integrationen und Workflows › Workflows](/configuration-integrations#workflows) |
| `FLOWPLAN_WORKFLOW_FOREACH_MAX` | 100 | Elemente je „Für jedes“ | [Konfiguration: E-Mail, Integrationen und Workflows › Workflows](/configuration-integrations#workflows) |
| `FLOWPLAN_WORKFLOW_HTTP` | `on` | HTTP-Knoten erlaubt | [Konfiguration: E-Mail, Integrationen und Workflows › Workflows](/configuration-integrations#workflows) |
| `FLOWPLAN_WORKFLOW_HTTP_ALLOW_PRIVATE` | `false` | interne Adressen erlauben (Heimnetz, n8n) | [Konfiguration: E-Mail, Integrationen und Workflows › Workflows](/configuration-integrations#workflows) |
| `FLOWPLAN_WORKFLOW_HTTP_HOSTS` | leer | nur diese Hosts (kommagetrennt) | [Konfiguration: E-Mail, Integrationen und Workflows › Workflows](/configuration-integrations#workflows) |
| `FLOWPLAN_WORKFLOW_LEASE_MS` | – | > **Nur für Entwicklung und Tests:** `FLOWPLAN_WORKFLOW_LEASE_MS` (Standard 120000, die [Lease](/cluster#workflows-im-cluster) eines Schritts), `FLOWPLAN_WORKFLOW_POLL_MS` (5000, wie oft jede Instanz nach fälligen Schritten sieht) und `FLOWPLAN_WORKFLOW_SWEEP_MS` (60000, wie oft abgelaufene Leases … | [Konfiguration: E-Mail, Integrationen und Workflows › Workflows](/configuration-integrations#workflows) |
| `FLOWPLAN_WORKFLOW_MAILS_PER_DAY` | 100 | E-Mails je Workflow und Tag | [Konfiguration: E-Mail, Integrationen und Workflows › Workflows](/configuration-integrations#workflows) |
| `FLOWPLAN_WORKFLOW_MAX_WAIT_DAYS` | 365 | längstes Warten bzw. Freigabefrist | [Konfiguration: E-Mail, Integrationen und Workflows › Workflows](/configuration-integrations#workflows) |
| `FLOWPLAN_WORKFLOW_PARALLEL_RUNS` | 10 | gleichzeitig laufende Läufe je Workflow (1–100); weitere warten in der Warteschlange | [Konfiguration: E-Mail, Integrationen und Workflows › Workflows](/configuration-integrations#workflows) |
| `FLOWPLAN_WORKFLOW_POLL_MS` | – | > **Nur für Entwicklung und Tests:** `FLOWPLAN_WORKFLOW_LEASE_MS` (Standard 120000, die [Lease](/cluster#workflows-im-cluster) eines Schritts), `FLOWPLAN_WORKFLOW_POLL_MS` (5000, wie oft jede Instanz nach fälligen Schritten sieht) und `FLOWPLAN_WORKFLOW_SWEEP_MS` (60000, wie oft abgelaufene Leases … | [Konfiguration: E-Mail, Integrationen und Workflows › Workflows](/configuration-integrations#workflows) |
| `FLOWPLAN_WORKFLOW_RUN_DAYS` | 30 | Aufbewahrung der Läufe in Tagen | [Konfiguration: E-Mail, Integrationen und Workflows › Workflows](/configuration-integrations#workflows) |
| `FLOWPLAN_WORKFLOW_RUNS_KEPT` | 10000 | höchstens so viele Läufe je Workflow aufbewahren (100–1.000.000); ältere abgeschlossene werden täglich gelöscht, offene nie | [Konfiguration: E-Mail, Integrationen und Workflows › Workflows](/configuration-integrations#workflows) |
| `FLOWPLAN_WORKFLOW_RUNS_PER_MINUTE` | 60 | Läufe je Minute und Workflow | [Konfiguration: E-Mail, Integrationen und Workflows › Workflows](/configuration-integrations#workflows) |
| `FLOWPLAN_WORKFLOW_STEPS_PER_RUN` | 200 | Schritte je Lauf | [Konfiguration: E-Mail, Integrationen und Workflows › Workflows](/configuration-integrations#workflows) |
| `FLOWPLAN_WORKFLOW_SWEEP_MS` | – | > **Nur für Entwicklung und Tests:** `FLOWPLAN_WORKFLOW_LEASE_MS` (Standard 120000, die [Lease](/cluster#workflows-im-cluster) eines Schritts), `FLOWPLAN_WORKFLOW_POLL_MS` (5000, wie oft jede Instanz nach fälligen Schritten sieht) und `FLOWPLAN_WORKFLOW_SWEEP_MS` (60000, wie oft abgelaufene Leases … | [Konfiguration: E-Mail, Integrationen und Workflows › Workflows](/configuration-integrations#workflows) |
| `FLOWPLAN_WORKFLOW_TEST_RUNS_PER_MINUTE` | 10 | Test- und Probeläufe je Person und Minute | [Konfiguration: E-Mail, Integrationen und Workflows › Workflows](/configuration-integrations#workflows) |
| `FLOWPLAN_WORKFLOW_WORKERS` | 4 | gleichzeitige Schritte je Instanz | [Konfiguration: E-Mail, Integrationen und Workflows › Workflows](/configuration-integrations#workflows) |
| `FLOWPLAN_WORKFLOW_WORKSPACE_RUNS_PER_MINUTE` | 600 | Läufe je Minute und Arbeitsbereich | [Konfiguration: E-Mail, Integrationen und Workflows › Workflows](/configuration-integrations#workflows) |
| `FLOWPLAN_WORKFLOWS` | `on` | Hauptschalter; `off`: keine neuen Workflow-Seiten, alle pausiert | [Konfiguration: E-Mail, Integrationen und Workflows › Workflows](/configuration-integrations#workflows) |
| `FLOWPLAN_WORKSPACE_QUOTA_MB` | unbegrenzt | Standard-Speicherkontingent je Arbeitsbereich in MB (`0` = unbegrenzt). | [Konfiguration › Betrieb](/configuration#betrieb) |
| `GIPHY_API_KEY` | *leer* | Schlüssel für die [GIF-Suche auf Whiteboards](/whiteboards#bilder-symbole-und-eintraege) bei GIPHY bzw. Tenor (ist beides gesetzt, gilt GIPHY). | [Konfiguration: E-Mail, Integrationen und Workflows › Integrationen](/configuration-integrations#integrationen) |
| `GIT_COMMIT` | – | Version und Commit (`FLOWPLAN_VERSION`, `GIT_COMMIT`, `SOURCE_COMMIT`) kommen aus dem Build; `FLOWPLAN_VERSION` in der `.env` wählt nur das Image-Tag in `compose.yaml`. | [Konfiguration › Nicht setzen](/configuration#nicht-setzen) |
| `GOOGLE_CALENDAR_CLIENT_ID` | *leer* | OAuth-Client (Typ „Webanwendung“) aus der Google Cloud Console, mit aktivierter Google Calendar API und dem Bereich `…/auth/calendar`. | [Konfiguration: E-Mail, Integrationen und Workflows › Kalender-Sync](/configuration-integrations#kalender-sync) |
| `GOOGLE_CALENDAR_CLIENT_SECRET` | *leer* | OAuth-Client (Typ „Webanwendung“) aus der Google Cloud Console, mit aktivierter Google Calendar API und dem Bereich `…/auth/calendar`. | [Konfiguration: E-Mail, Integrationen und Workflows › Kalender-Sync](/configuration-integrations#kalender-sync) |
| `IMPRINT_URL` | *leer* | Link zum Impressum, z. B. `https://example.com/impressum`. | [Konfiguration: Speicher, Datenbank und Sicherheit › Rechtliches und Oberfläche](/configuration-storage#rechtliches-und-oberflaeche) |
| `INBOUND_IMAP_FOLDER` | `INBOX` | Ordner, der abgefragt wird. | [Konfiguration: E-Mail, Integrationen und Workflows › E-Mail-Eingang (IMAP)](/configuration-integrations#e-mail-eingang-imap) |
| `INBOUND_IMAP_HOST` | *leer* | Schaltet die IMAP-Abfrage ein (zusammen mit `INBOUND_IMAP_USER`). | [Konfiguration: E-Mail, Integrationen und Workflows › E-Mail-Eingang (IMAP)](/configuration-integrations#e-mail-eingang-imap) |
| `INBOUND_IMAP_PASSWORD` | *leer* | Anmeldung am Postfach. | [Konfiguration: E-Mail, Integrationen und Workflows › E-Mail-Eingang (IMAP)](/configuration-integrations#e-mail-eingang-imap) |
| `INBOUND_IMAP_PORT` | `993` | Port (`143`, wenn `INBOUND_IMAP_TLS=false`). | [Konfiguration: E-Mail, Integrationen und Workflows › E-Mail-Eingang (IMAP)](/configuration-integrations#e-mail-eingang-imap) |
| `INBOUND_IMAP_TLS` | `true` | `false` nur für einen Mailserver auf demselben Rechner oder im selben Netz (ohne Verschlüsselung). | [Konfiguration: E-Mail, Integrationen und Workflows › E-Mail-Eingang (IMAP)](/configuration-integrations#e-mail-eingang-imap) |
| `INBOUND_IMAP_USER` | *leer* | Anmeldung am Postfach. | [Konfiguration: E-Mail, Integrationen und Workflows › E-Mail-Eingang (IMAP)](/configuration-integrations#e-mail-eingang-imap) |
| `INBOUND_MAIL_AUTHSERV_ID` | *leer* | Kennung (authserv-id) des eigenen empfangenden Mailservers oder Anbieters, mit der sein `Authentication-Results`-Header beginnt, z. B. `mx.example.com`. | [Konfiguration: E-Mail, Integrationen und Workflows › E-Mail-Eingang (IMAP)](/configuration-integrations#e-mail-eingang-imap) |
| `INBOUND_MAIL_DOMAIN` | *leer* | Domain der Eingangsadressen, z. B. `mail.example.com`. | [Konfiguration: E-Mail, Integrationen und Workflows › E-Mail-Eingang (IMAP)](/configuration-integrations#e-mail-eingang-imap) |
| `ISSUE_SYNC_ALLOW_PRIVATE` | *leer* | `true` erlaubt den in `ISSUE_SYNC_ALLOWED_HOSTS` genannten Servern auch interne Adressen – etwa ein GitLab im selben Netz. | [Konfiguration: E-Mail, Integrationen und Workflows › Integrationen](/configuration-integrations#integrationen) |
| `ISSUE_SYNC_ALLOWED_HOSTS` | *leer* | Eigene Server für die [Synchronisierung von GitHub-, GitLab- und Forgejo-Issues](/git-and-issues#github-gitlab-und-forgejo-issues-synchronisieren), durch Komma getrennt (z. B. `gitlab.example.org`). github.com, gitlab.com und codeberg.org sind immer erlaubt; andere Server nur, wenn sie hier stehen. | [Konfiguration: E-Mail, Integrationen und Workflows › Integrationen](/configuration-integrations#integrationen) |
| `LDAP_BASE_DN` | – | Wo Personen gesucht werden, z. B. `ou=people,dc=example,dc=org`. | [Benutzer aus dem Verzeichnis: SCIM und LDAP › Anmeldung mit LDAP](/scim-and-ldap#anmeldung-mit-ldap) |
| `LDAP_BIND_DN` | *leer* | Suchkonto. | [Benutzer aus dem Verzeichnis: SCIM und LDAP › Anmeldung mit LDAP](/scim-and-ldap#anmeldung-mit-ldap) |
| `LDAP_BIND_PASSWORD` | *leer* | Suchkonto. | [Benutzer aus dem Verzeichnis: SCIM und LDAP › Anmeldung mit LDAP](/scim-and-ldap#anmeldung-mit-ldap) |
| `LDAP_CONTACTS` | an | `off` schaltet Kontakte aus dem Verzeichnis ab. | [Benutzer aus dem Verzeichnis: SCIM und LDAP › Kontakte aus LDAP](/scim-and-ldap#kontakte-aus-ldap) |
| `LDAP_CONTACTS_ATTRIBUTES` | – | Weitere Attribute, die Zuordnungen nutzen dürfen (durch Komma oder Leerzeichen getrennt). | [Benutzer aus dem Verzeichnis: SCIM und LDAP › Kontakte aus LDAP](/scim-and-ldap#kontakte-aus-ldap) |
| `LDAP_CONTACTS_BASE_DN` | `LDAP_BASE_DN` | Wo Kontakte gesucht werden; der OU-Baum im Import-Dialog beginnt hier. | [Benutzer aus dem Verzeichnis: SCIM und LDAP › Kontakte aus LDAP](/scim-and-ldap#kontakte-aus-ldap) |
| `LDAP_CONTACTS_FILTER` | `(&(\|(objectClass=inetOrgPerson)(objectClass=user)(objectClass=contact))(!(objectClass=computer)))` | Welche Einträge Personen sind. | [Benutzer aus dem Verzeichnis: SCIM und LDAP › Kontakte aus LDAP](/scim-and-ldap#kontakte-aus-ldap) |
| `LDAP_CONTACTS_SYNC_MINUTES` | `60` | Abstand des Abgleichs (15–1440). | [Benutzer aus dem Verzeichnis: SCIM und LDAP › Kontakte aus LDAP](/scim-and-ldap#kontakte-aus-ldap) |
| `LDAP_GROUP_ATTRIBUTE` | `memberOf` | Attribut mit den Gruppen der Person. | [Benutzer aus dem Verzeichnis: SCIM und LDAP › Anmeldung mit LDAP](/scim-and-ldap#anmeldung-mit-ldap) |
| `LDAP_STARTTLS` | `false` | `true`: `ldap://` mit StartTLS verschlüsseln. | [Benutzer aus dem Verzeichnis: SCIM und LDAP › Anmeldung mit LDAP](/scim-and-ldap#anmeldung-mit-ldap) |
| `LDAP_TIMEOUT_MS` | `8000` | Zeitlimit je LDAP-Operation. | [Benutzer aus dem Verzeichnis: SCIM und LDAP › Anmeldung mit LDAP](/scim-and-ldap#anmeldung-mit-ldap) |
| `LDAP_TLS_CA` | *leer* | CA-Zertifikat für `ldaps://` oder StartTLS (Dateipfad oder PEM-Text). | [Benutzer aus dem Verzeichnis: SCIM und LDAP › Anmeldung mit LDAP](/scim-and-ldap#anmeldung-mit-ldap) |
| `LDAP_URL` | *leer* | `ldap://host:389` oder `ldaps://host:636`. | [Benutzer aus dem Verzeichnis: SCIM und LDAP › Anmeldung mit LDAP](/scim-and-ldap#anmeldung-mit-ldap) |
| `LDAP_USER_FILTER` | `(\|(uid={user})(mail={user}))` | `{user}` wird durch den maskierten Namen ersetzt. | [Benutzer aus dem Verzeichnis: SCIM und LDAP › Anmeldung mit LDAP](/scim-and-ldap#anmeldung-mit-ldap) |
| `LITESTREAM_SSE_C_KEY` | *leer* | Optional: der Speicheranbieter verschlüsselt die Litestream-Kopie (SSE-C, 32 Bytes base64, nur über https und bei Anbietern, die SSE-C können). | [Konfiguration: Speicher, Datenbank und Sicherheit › S3 und Datenbanksicherung](/configuration-storage#s3-und-datenbanksicherung) |
| `MEETING_LIVE_TRANSCRIPTION` | `on` | `off`: Besprechungen erst nach dem Beenden transkribieren statt schon während der Aufnahme. | [Konfiguration: KI, Sprachnotizen und Push › Sprachnotizen (Whisper)](/configuration-ai-push#sprachnotizen-whisper) |
| `MOBILE_PUSH` | – | Mitteilungen an die Apps für iPhone, iPad und Android. | [Konfiguration: KI, Sprachnotizen und Push › Push-Benachrichtigungen](/configuration-ai-push#push-benachrichtigungen) |
| `MOBILE_PUSH_CONTENT` | – | Ob der Text der Benachrichtigung mitkommt – und damit die Knöpfe **Erledigt** und **Morgen** an fälligen Aufgaben und **Antworten** an Kommentaren ([Knöpfe an Mitteilungen](/mobile-widgets#knoepfe-an-mitteilungen)); **Als gelesen markieren** gibt es immer. | [Konfiguration: KI, Sprachnotizen und Push › Push-Benachrichtigungen](/configuration-ai-push#push-benachrichtigungen) |
| `MS_CALENDAR_CLIENT_ID` | *leer* | App-Registrierung in Microsoft Entra ID (Web-Plattform) mit den delegierten Berechtigungen `Calendars.ReadWrite` und `offline_access`. | [Konfiguration: E-Mail, Integrationen und Workflows › Kalender-Sync](/configuration-integrations#kalender-sync) |
| `MS_CALENDAR_CLIENT_SECRET` | *leer* | App-Registrierung in Microsoft Entra ID (Web-Plattform) mit den delegierten Berechtigungen `Calendars.ReadWrite` und `offline_access`. | [Konfiguration: E-Mail, Integrationen und Workflows › Kalender-Sync](/configuration-integrations#kalender-sync) |
| `MS_CALENDAR_TENANT` | `common` | `common` (Geschäfts- und private Konten), `organizations` oder die ID eines Mandanten. | [Konfiguration: E-Mail, Integrationen und Workflows › Kalender-Sync](/configuration-integrations#kalender-sync) |
| `NETBOX_ALLOW_PRIVATE` | *leer* | `true` erlaubt den [NetBox-Import auf Whiteboards](/whiteboard-racks#importieren-und-exportieren) auch interne Adressen und `http://` – etwa ein NetBox im selben Netz. | [Konfiguration: E-Mail, Integrationen und Workflows › Integrationen](/configuration-integrations#integrationen) |
| `NEXT_TELEMETRY_DISABLED` | – | `NODE_ENV`, `PORT`, `HOSTNAME` und `NEXT_TELEMETRY_DISABLED` setzt das Image selbst, ebenso `FLOWPLAN_DROP_ROOT=1` (Flowplans Werkzeuge im Container geben root ab und laufen als `PUID:PGID`). | [Konfiguration › Nicht setzen](/configuration#nicht-setzen) |
| `OIDC_ADMIN_GROUP` | – | Mitglieder dieser Gruppe sehen die **Administration**. | [Single Sign-on mit OIDC › Variablen](/sso-oidc#variablen) |
| `OIDC_ALLOW_LOCAL_HTTP` | – | `FLOWPLAN_DIST_DIR` ist nur für parallele Entwicklungsserver gedacht, `OIDC_ALLOW_LOCAL_HTTP` nur für Tests mit einem Anbieter auf `http://localhost`, `FLOWPLAN_GIT_ALLOW_HTTP` nur für Tests des Git-Exports mit einem `http://`-Server (in Produktion wirkungslos). | [Konfiguration › Nicht setzen](/configuration#nicht-setzen) |
| `OIDC_ALLOWED_GROUP` | – | Wenn gesetzt, dürfen sich nur Mitglieder dieser Gruppe anmelden. | [Single Sign-on mit OIDC › Variablen](/sso-oidc#variablen) |
| `OIDC_CLIENT_ID` | – | Client-ID. | [Konfiguration › Anmeldung](/configuration#anmeldung) |
| `OIDC_CLIENT_SECRET` | – | Client-Secret. | [Konfiguration › Anmeldung](/configuration#anmeldung) |
| `OIDC_GROUPS_CLAIM` | – | Claim mit den Gruppen, auch als Pfad wie `realm_access.roles`. | [Single Sign-on mit OIDC › Variablen](/sso-oidc#variablen) |
| `OIDC_ISSUER` | – | Issuer-URL; Flowplan liest daraus die Discovery (`/.well-known/openid-configuration`). | [Single Sign-on mit OIDC › Variablen](/sso-oidc#variablen) |
| `OIDC_LINKED_SSO_ONLY` | – | `true`: Konten, die mit SSO verbunden sind, melden sich nur noch über SSO an (Standard aus). | [Single Sign-on mit OIDC › Variablen](/sso-oidc#variablen) |
| `OIDC_NEW_ACCOUNTS` | – | `false`: Die SSO-Anmeldung legt keine neuen Konten an (Standard an) – nur bestehende, verbundene oder per SCIM bereitgestellte Konten melden sich an. | [Single Sign-on mit OIDC › Variablen](/sso-oidc#variablen) |
| `OIDC_PICTURE` | – | Profilbild aus dem Claim `picture` übernehmen (Standard an, `off` schaltet ab). | [Single Sign-on mit OIDC › Variablen](/sso-oidc#variablen) |
| `OIDC_PROMPT_CREATE` | – | `true`: **Registrieren** öffnet direkt die Registrierung des Anbieters (`prompt=create`). | [Single Sign-on mit OIDC › Variablen](/sso-oidc#variablen) |
| `OIDC_SCOPES` | – | Bei SSO fehlt die Gruppe im Token: `OIDC_SCOPES`, `OIDC_GROUPS_CLAIM`, `OIDC_ADMIN_GROUP` prüfen und neu anmelden. | [Betrieb und Fehlersuche › Fehlersuche](/operations#fehlersuche) |
| `OLLAMA_URL` | *leer* | Adresse von Ollama, z. B. `http://ollama:11434` mit dem Compose-Dienst. | [Konfiguration: KI, Sprachnotizen und Push › KI](/configuration-ai-push#ki) |
| `OTEL_EXPORTER_OTLP_ENDPOINT` | *leer* | OTLP-Collector (HTTP); Sicherheitsereignisse gehen als OpenTelemetry-Logs dorthin. | [Konfiguration › Betrieb](/configuration#betrieb) |
| `OTEL_EXPORTER_OTLP_HEADERS` | – | Dazu `OTEL_EXPORTER_OTLP_HEADERS` und `OTEL_SERVICE_NAME`. | [Konfiguration › Betrieb](/configuration#betrieb) |
| `OTEL_EXPORTER_OTLP_LOGS_ENDPOINT` | – | Mit `OTEL_EXPORTER_OTLP_ENDPOINT` (oder `OTEL_EXPORTER_OTLP_LOGS_ENDPOINT`) schickt Flowplan die Ereignisse als OTLP-Logs (HTTP/JSON, `/v1/logs`) an deinen Collector, etwa Grafana Alloy, den OpenTelemetry Collector, Grafana Cloud, Honeycomb oder Datadog. | [Sicherheit und Angriffserkennung › OpenTelemetry](/security-monitoring#opentelemetry) |
| `OTEL_EXPORTER_OTLP_LOGS_HEADERS` | `OTEL_EXPORTER_OTLP_HEADERS` | Header für den Collector, nur für die Logs: `api-key=abc,x-scope=flowplan` (kommagetrennt, Werte URL-kodiert). | [Sicherheit und Angriffserkennung › Weitere Variablen](/security-monitoring#weitere-variablen) |
| `OTEL_SERVICE_NAME` | – | Dazu `OTEL_EXPORTER_OTLP_HEADERS` und `OTEL_SERVICE_NAME`. | [Konfiguration › Betrieb](/configuration#betrieb) |
| `PG_CLIENT_MAJOR` | – | Build-Argumente: `PG_CLIENT_MAJOR` (Standard `18`) wählt die Version von `pg_dump`, `pg_restore` und `psql` im Image – mindestens die Hauptversion deines PostgreSQL-Servers ([PostgreSQL](/postgresql)). | [Installation mit Docker › Image selbst bauen](/installation#image-selbst-bauen) |
| `PGCONNECT_TIMEOUT` | `15` | So viele Sekunden warten `pg_dump`, `pg_restore` und `psql` höchstens auf die Verbindung zum Server (die Variable von libpq). | [PostgreSQL › Variablen](/postgresql#variablen) |
| `PGID` | `1000` / wie `PUID` | Nur im Image, ohne `user:` (wie bei linuxserver.io): Flowplan gibt den Datenordner beim Start diesem Benutzer und dieser Gruppe und läuft als sie, nie als root; `0` wird abgelehnt. | [Konfiguration › Betrieb](/configuration#betrieb) |
| `PLUGIN_ALLOWED_ORIGINS` | *leer* | HTTPS-Ursprünge, von denen Eigentümer [Block-Erweiterungen](/plugins) registrieren dürfen, durch Komma getrennt (z. B. `https://plugins.example.org`). | [Konfiguration: E-Mail, Integrationen und Workflows › Integrationen](/configuration-integrations#integrationen) |
| `PRIVACY_URL` | *leer* | Link zur Datenschutzerklärung, an denselben Stellen und ebenfalls nur, wenn gesetzt. | [Konfiguration: Speicher, Datenbank und Sicherheit › Rechtliches und Oberfläche](/configuration-storage#rechtliches-und-oberflaeche) |
| `PUID` | `1000` / wie `PUID` | Nur im Image, ohne `user:` (wie bei linuxserver.io): Flowplan gibt den Datenordner beim Start diesem Benutzer und dieser Gruppe und läuft als sie, nie als root; `0` wird abgelehnt. | [Konfiguration › Betrieb](/configuration#betrieb) |
| `PUSH_RELAY` | – | `off`: kein Relay. | [Konfiguration: KI, Sprachnotizen und Push › Push-Benachrichtigungen](/configuration-ai-push#push-benachrichtigungen) |
| `PUSH_RELAY_URL` | – | Das [Push-Relay](/configuration-ai-push#push-relay-und-ende-zu-ende-verschluesselung), über das Mitteilungen an die Apps gehen. | [Konfiguration: KI, Sprachnotizen und Push › Push-Benachrichtigungen](/configuration-ai-push#push-benachrichtigungen) |
| `REDIS_URL` | *leer* | Redis für den Cluster-Modus, `redis://…` oder `rediss://…`. | [Konfiguration: Speicher, Datenbank und Sicherheit › Datenbank und Cluster](/configuration-storage#datenbank-und-cluster) |
| `RENDER_EXTERNAL_HOSTNAME` | – | **Adresse:** Ohne `APP_URL` nimmt Flowplan Renders eigene Adresse (`RENDER_EXTERNAL_URL`, ersatzweise `https://` mit `RENDER_EXTERNAL_HOSTNAME`). | [Mit einem Klick bereitstellen › Render](/one-click-deploy#render) |
| `RENDER_EXTERNAL_URL` | – | **Adresse:** Ohne `APP_URL` nimmt Flowplan Renders eigene Adresse (`RENDER_EXTERNAL_URL`, ersatzweise `https://` mit `RENDER_EXTERNAL_HOSTNAME`). | [Mit einem Klick bereitstellen › Render](/one-click-deploy#render) |
| `S3_ACCESS_KEY_ID` | – | Zugangsschlüssel mit Lese- und Schreibrecht auf den Bucket. | [Konfiguration: Speicher, Datenbank und Sicherheit › S3 und Datenbanksicherung](/configuration-storage#s3-und-datenbanksicherung) |
| `S3_BUCKET` | *leer* | Schaltet S3 ein. | [Konfiguration: Speicher, Datenbank und Sicherheit › S3 und Datenbanksicherung](/configuration-storage#s3-und-datenbanksicherung) |
| `S3_ENDPOINT` | AWS | API-Adresse des Speichers, z. B. `http://minio:9000`. | [Konfiguration: Speicher, Datenbank und Sicherheit › S3 und Datenbanksicherung](/configuration-storage#s3-und-datenbanksicherung) |
| `S3_PREFIX` | `flowplan` | Ordner im Bucket; Dateien unter `/uploads/`, Datenbank unter `/db/`. | [Konfiguration: Speicher, Datenbank und Sicherheit › S3 und Datenbanksicherung](/configuration-storage#s3-und-datenbanksicherung) |
| `S3_REGION` | `us-east-1` | Region. | [Konfiguration: Speicher, Datenbank und Sicherheit › S3 und Datenbanksicherung](/configuration-storage#s3-und-datenbanksicherung) |
| `S3_SECRET_ACCESS_KEY` | – | Zugangsschlüssel mit Lese- und Schreibrecht auf den Bucket. | [Konfiguration: Speicher, Datenbank und Sicherheit › S3 und Datenbanksicherung](/configuration-storage#s3-und-datenbanksicherung) |
| `SESSION_APP_DAYS` | `90` | App-Sitzung endet nach so vielen Tagen ohne Nutzung (1–365). | [Konfiguration › Anmeldung](/configuration#anmeldung) |
| `SESSION_APP_REMEMBER` | an | Desktop- und Handy-Apps bleiben angemeldet, solange sie (oder ihre Widgets) genutzt werden – bei Anmeldungen, die die App belegt (Übergabe über den Browser oder Passwort mit dem Geräteschlüssel der App; siehe [Anmeldung](/sessions)). | [Konfiguration › Anmeldung](/configuration#anmeldung) |
| `SESSION_GROUPS_HOURS` | *leer* | Nur wenn gesetzt: SSO-Sitzungen mit „angemeldet bleiben“ enden schon nach so vielen Stunden, damit Gruppenänderungen beim Anbieter mit der neuen Anmeldung wirken. | [Konfiguration › Anmeldung](/configuration#anmeldung) |
| `SESSION_HOURS` | – | Gültigkeit einer Browser-Sitzung in Stunden, solange „Angemeldet bleiben“ nicht genutzt wird; die Apps bleiben angemeldet (siehe [Angemeldet bleiben](/sessions)). | [Single Sign-on mit OIDC › Variablen](/sso-oidc#variablen) |
| `SESSION_IDLE_HOURS` | `168` | Mit „angemeldet bleiben“ im Browser: Sitzung endet so viele Stunden nach der letzten Nutzung (1–8760). | [Konfiguration › Anmeldung](/configuration#anmeldung) |
| `SESSION_MAX_DAYS` | `30` / `365` | Sitzungen, die angemeldet bleiben, enden spätestens so viele Tage nach der Anmeldung (1–365; Standard 30 im Browser, 365 in den Apps; nie kürzer als die Zeit ohne Nutzung) – mit SSO genauso wie mit Passwort und Passkey. | [Konfiguration › Anmeldung](/configuration#anmeldung) |
| `SESSION_REMEMBER` | aus | `true` bietet im Browser beim Anmelden **Angemeldet bleiben** an – siehe [Anmeldung](/sessions). | [Konfiguration › Anmeldung](/configuration#anmeldung) |
| `SMTP_FROM` | `Flowplan ` | Absender, z. B. `Flowplan `. | [Konfiguration: E-Mail, Integrationen und Workflows › E-Mail (SMTP)](/configuration-integrations#e-mail-smtp) |
| `SMTP_HOST` | *leer* | Schaltet den E-Mail-Versand ein: Einladungen und Zusammenfassungen ungelesener Benachrichtigungen. | [Konfiguration: E-Mail, Integrationen und Workflows › E-Mail (SMTP)](/configuration-integrations#e-mail-smtp) |
| `SMTP_PASSWORD` | *leer* | Anmeldung am Mailserver. | [Konfiguration: E-Mail, Integrationen und Workflows › E-Mail (SMTP)](/configuration-integrations#e-mail-smtp) |
| `SMTP_PORT` | `587` | Port. | [Konfiguration: E-Mail, Integrationen und Workflows › E-Mail (SMTP)](/configuration-integrations#e-mail-smtp) |
| `SMTP_SECURE` | nach Port | `true`/`false` erzwingt TLS ab Verbindungsbeginn. | [Konfiguration: E-Mail, Integrationen und Workflows › E-Mail (SMTP)](/configuration-integrations#e-mail-smtp) |
| `SMTP_USER` | *leer* | Anmeldung am Mailserver. | [Konfiguration: E-Mail, Integrationen und Workflows › E-Mail (SMTP)](/configuration-integrations#e-mail-smtp) |
| `SOURCE_COMMIT` | – | Docker-Images aus unserem Workflow kennen ihren Commit; bei Coolify kommt er aus `SOURCE_COMMIT`. | [Administration der Instanz › Instanz](/administration#instanz) |
| `SPACE_GIT_ALLOW_PRIVATE` | *leer* | `true` erlaubt den in `SPACE_GIT_ALLOWED_HOSTS` genannten Servern auch interne Adressen – etwa ein Forgejo auf demselben Host, den der Container über `--add-host git.example.org:host-gateway` erreicht. | [Konfiguration: E-Mail, Integrationen und Workflows › Integrationen](/configuration-integrations#integrationen) |
| `SPACE_GIT_ALLOWED_HOSTS` | *leer* | Erlaubte Git-Server dafür, durch Komma getrennt (z. B. `git.example.org`). | [Konfiguration: E-Mail, Integrationen und Workflows › Integrationen](/configuration-integrations#integrationen) |
| `SPACE_GIT_EXPORT` | *leer* | `true` schaltet den [Git-Export der Bereiche](/markdown-git-export#git-export-eines-bereichs) ein: Bereichseigentümer übertragen ihren Bereich täglich oder wöchentlich in ein eigenes Repository. | [Konfiguration: E-Mail, Integrationen und Workflows › Integrationen](/configuration-integrations#integrationen) |
| `TENOR_API_KEY` | *leer* | Schlüssel für die [GIF-Suche auf Whiteboards](/whiteboards#bilder-symbole-und-eintraege) bei GIPHY bzw. Tenor (ist beides gesetzt, gilt GIPHY). | [Konfiguration: E-Mail, Integrationen und Workflows › Integrationen](/configuration-integrations#integrationen) |
| `WEB_PUSH_PRIVATE_KEY` | – | VAPID-Schlüsselpaar. | [Konfiguration: KI, Sprachnotizen und Push › Push-Benachrichtigungen](/configuration-ai-push#push-benachrichtigungen) |
| `WEB_PUSH_PUBLIC_KEY` | – | VAPID-Schlüsselpaar. | [Konfiguration: KI, Sprachnotizen und Push › Push-Benachrichtigungen](/configuration-ai-push#push-benachrichtigungen) |
| `WEB_PUSH_SUBJECT` | – | Kontakt für die Push-Dienste, z. B. `mailto:admin@example.com`. | [Konfiguration: KI, Sprachnotizen und Push › Push-Benachrichtigungen](/configuration-ai-push#push-benachrichtigungen) |
| `WHISPER_API_KEY` | *leer* | Nur falls der Dienst einen Schlüssel verlangt. | [Konfiguration: KI, Sprachnotizen und Push › Sprachnotizen (Whisper)](/configuration-ai-push#sprachnotizen-whisper) |
| `WHISPER_DIARIZE` | *leer* | `on`: Sprechertrennung anfragen (`diarize=true`), nur bei Diensten, die es können. | [Konfiguration: KI, Sprachnotizen und Push › Sprachnotizen (Whisper)](/configuration-ai-push#sprachnotizen-whisper) |
| `WHISPER_LANGUAGE` | `de` | Sprache der Aufnahmen. | [Konfiguration: KI, Sprachnotizen und Push › Sprachnotizen (Whisper)](/configuration-ai-push#sprachnotizen-whisper) |
| `WHISPER_MAX_MB` | `200` | Größte Aufnahme in MB. | [Konfiguration: KI, Sprachnotizen und Push › Sprachnotizen (Whisper)](/configuration-ai-push#sprachnotizen-whisper) |
| `WHISPER_MODEL` | `Systran/faster-whisper-small` | Modellname, wie ihn der Dienst erwartet. | [Konfiguration: KI, Sprachnotizen und Push › Sprachnotizen (Whisper)](/configuration-ai-push#sprachnotizen-whisper) |
| `WHISPER_PROMPT` | *leer* | Vokabular für alle Arbeitsbereiche (Namen, Abkürzungen, durch Kommas getrennt), geht als `prompt` an Whisper – vor dem Glossar des Arbeitsbereichs, zusammen höchstens etwa 550 Zeichen. | [Konfiguration: KI, Sprachnotizen und Push › Sprachnotizen (Whisper)](/configuration-ai-push#sprachnotizen-whisper) |
| `WHISPER_RESPONSE_FORMAT` | `verbose_json` | Antwortformat der Spracherkennung; bei Fehler einmal `json`. | [Konfiguration: KI, Sprachnotizen und Push › Sprachnotizen (Whisper)](/configuration-ai-push#sprachnotizen-whisper) |
| `WHISPER_TIMEOUT_SECONDS` | *leer* | Wie lange eine Transkription dauern darf, in Sekunden. | [Konfiguration: KI, Sprachnotizen und Push › Sprachnotizen (Whisper)](/configuration-ai-push#sprachnotizen-whisper) |
| `WHISPER_URL` | *leer* | Adresse eines OpenAI-kompatiblen Whisper-Servers (`POST /v1/audio/transcriptions`), z. B. `http://whisper:8000`. | [Konfiguration: KI, Sprachnotizen und Push › Sprachnotizen (Whisper)](/configuration-ai-push#sprachnotizen-whisper) |
| `WHISPER_VAD` | *leer* | `on`: Stille vorher überspringen (`vad_filter=true`, faster-whisper/speaches) – weniger erfundene Zeilen. | [Konfiguration: KI, Sprachnotizen und Push › Sprachnotizen (Whisper)](/configuration-ai-push#sprachnotizen-whisper) |
---
# Speicher, S3 und Sicherung
Alle Daten liegen in einem Verzeichnis. Mit einem S3-Speicher werden Dateien gespiegelt und die Datenbank laufend gesichert – der Container hält dann nichts Unersetzliches mehr.
**Mehr zum Thema:** [Verschlüsselung von Dateien und Sicherungen](/storage-encryption) · [Markdown-Export und Git](/markdown-git-export)
## Was wo liegt
| Pfad in `/app/data` | Inhalt |
| --- | --- |
| `flowplan.sqlite` (+ `-wal`, `-shm`) | Alle Inhalte, Konten, Sitzungen, Einstellungen |
| `uploads/` | Hochgeladene Dateien |
| `web-push-keys.json` | Push-Schlüssel, falls nicht per Umgebung gesetzt |
| `secrets.key` | Schlüssel für gespeicherte Geheimnisse, nur ohne `FLOWPLAN_ENCRYPTION_KEY` und `FLOWPLAN_SECRETS_KEY` ([Konfiguration](/configuration-storage#gespeicherte-geheimnisse)) |
| `pre-restore-…`, `pre-move-…` | Vorheriger Stand nach einer Wiederherstellung bzw. einem [Umzug](/move-instance); nach ein paar Tagen löschen |
| `ocr/` | Sprachdaten der Texterkennung, werden bei Bedarf neu angelegt |
## S3-Speicher einschalten
Mit `S3_BUCKET` und Zugangsdaten (siehe [Konfiguration](/configuration-storage#s3-und-datenbanksicherung)):
- **Dateien**: Jede hochgeladene Datei geht direkt nach dem Speichern in den Bucket, gelöschte Dateien wandern dort nach `/.deleted/uploads/` und werden erst entfernt, wenn keine aufbewahrte geplante Sicherung im Bucket sie mehr braucht, frühestens nach einem Tag ([verzögertes Löschen](#verzoegertes-loeschen)). `uploads/` bleibt Arbeitskopie. Fehlt dort eine Datei – neuer Host, verlorenes Volume –, holt Flowplan sie aus dem Bucket: beim Abruf sofort, alle übrigen im Hintergrund.
- **Datenbank**: [Litestream](https://litestream.io) überträgt Änderungen der SQLite-Datei etwa im Sekundentakt nach `/db`. Startet der Container ohne Datenbank, stellt Litestream sie zuerst aus dem Bucket wieder her.
Beim ersten Start mit S3 lädt Flowplan alle vorhandenen Dateien hoch. Den Fortschritt zeigen **Administration → Speicher & Sicherung** (Karten **Sicherungen** und **Belegung**, dazu die Verbindung und die Verteilung lokal/S3) und – mit `FLOWPLAN_METRICS_TOKEN` oder als Admin angemeldet – `/api/health` unter `objectStorage.pending`.
Geeignet sind MinIO, Garage, SeaweedFS, AWS S3 und andere S3-kompatible Dienste.
### Garage
Garage legt weder Bucket noch Schlüssel selbst an:
```bash
garage status # Knoten-ID ablesen
garage layout assign -z dc1 -c 10G
garage layout apply --version 1
garage bucket create flowplan
garage key create flowplan
garage bucket allow --read --write --owner flowplan --key flowplan
garage key info flowplan --show-secret # Key-ID und Secret
```
`S3_REGION` muss dem Wert `s3_region` aus der `garage.toml` entsprechen.
### SeaweedFS
Den S3-Dienst so starten, dass er auf allen Schnittstellen lauscht (`-ip.bind=0.0.0.0`), sonst ist er aus anderen Containern nicht erreichbar. Endpoint ist der S3-Port, standardmäßig `8333`.
> [!NOTE]
> Warum standardmäßig kein Postgres und kein Redis? Flowplan arbeitet in einem Prozess direkt auf SQLite – für eine Instanz pro Organisation schneller und einfacher. Sitzungen, Präsenz und Live-Abgleich laufen über die Datenbank und den Prozess selbst; Redis hätte nichts zu tun. Für größere Teams gibt es [PostgreSQL](/postgresql) und den [Cluster-Modus](/cluster) mit Redis.
## Sicherungen
1. **Instanzsicherung in Flowplan** (empfohlen): **Administration → Speicher & Sicherung → Gesamte Instanz → Herunterladen** lädt Datenbank und Dateien konsistent im laufenden Betrieb herunter.
2. **S3 mit Litestream**: laufende Sicherung; ein früherer Zeitpunkt lässt sich wiederherstellen (unten).
3. **Geplante Sicherung**: täglich oder stündlich eine konsistente Kopie der Datenbank, mit S3 in den Bucket unter `backups/`, sonst in den Datenordner – mit Schlüssel verschlüsselt ([Verschlüsselung](/storage-encryption#verschluesselung)). Zusätzlich auf einen eigenen Server per [SFTP](#sicherung-per-sftp), auf Wunsch mit allen Dateien, oder über eine [SMB- oder NFS-Freigabe](#smb-oder-nfs-freigabe). Vor dem ersten Konto entsteht keine geplante Sicherung (Demo-Konten und das Entwicklungskonto zählen nicht) – so legt eine neue Instanz keine leere Kopie neben die Sicherungen einer alten.
4. **Volume-Backup** des Hosts oder in Coolify. Für eine konsistente Kopie den Container vorher stoppen.
5. **Von Hand** im laufenden Betrieb:
```bash
sqlite3 /app/data/flowplan.sqlite "VACUUM INTO '/backup/flowplan.sqlite'"
```
Dazu `uploads/` und `web-push-keys.json` mitsichern.
Mit **PostgreSQL** werden die geplanten Sicherungen und **Jetzt sichern** zu `pg_dump`-Archiven (`flowplan-….dump`), Litestream entfällt; Ziele, Verschlüsselung und Aufbewahrung bleiben gleich. Siehe [Sicherungen mit pg_dump](/postgresql#sicherungen-mit-pg-dump).
Das Inhaltsarchiv unter **Einstellungen → Import & Export → Export → Arbeitsbereich als ZIP** sichert einen Arbeitsbereich, ersetzt aber keine Instanzsicherung mit Konten und Rechten.
## Sicherung per SFTP
Die geplante Sicherung kann zusätzlich auf einen eigenen Server gehen – ein NAS, einen Backup-Server oder einen gemieteten Speicher mit SSH-Zugang. Einrichten unter **Administration → Speicher & Sicherung → SFTP-Ziel**:
- **Server**, **Port** (22) und **Benutzer**, Anmeldung mit **Passwort** oder **privatem Schlüssel** (OpenSSH oder PEM, optional mit Passphrase). Passwort, Schlüssel und Passphrase speichert Flowplan nur verschlüsselt ([gespeicherte Geheimnisse](/configuration-storage#gespeicherte-geheimnisse)); die Oberfläche zeigt danach nur noch, dass eines gespeichert ist.
- **Ordner auf dem Server**: relativ zum Anmeldeordner oder absolut (`/srv/backups/flowplan`); `..` ist nicht erlaubt. Fehlt er, legt Flowplan ihn an.
- **Aufbewahren**: so viele Sicherungen bleiben im Ordner, ältere werden entfernt.
- **Dateien mitsichern**: spiegelt die hochgeladenen Dateien nach `uploads/` im Ordner. Neue Dateien kommen bei jeder Sicherung dazu; Dateien, die in Flowplan endgültig gelöscht sind, wandern nach `.deleted/uploads/` ([verzögertes Löschen](#verzoegertes-loeschen)). Dateien, die die Datenbank noch verzeichnet, werden dort nie weggeräumt. Fehlt der Ordner `uploads/` oder ist er leer, obwohl die Datenbank Dateien verzeichnet (etwa ein nicht eingehängtes Volume), lässt die Sicherung das Spiegeln mit einem Fehler aus; die Datenbank wird trotzdem übertragen.
- Mit `FLOWPLAN_ENCRYPTION_KEY` ist alles auf dem Server verschlüsselt – die Datenbank wie in S3 und im Datenordner (`flowplan-….sqlite.enc`), jede Datei einzeln ([Verschlüsselung](/storage-encryption#verschluesselung)).
**Hostschlüssel:** Beim ersten **Verbindung testen** zeigt Flowplan den Fingerabdruck des Servers (`SHA256:…`), noch bevor es Zugangsdaten sendet. Vergleiche ihn auf dem Server mit `ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub` und bestätige ihn mit **Schlüssel vertrauen**. Meldet sich der Server später mit einem anderen Schlüssel (Neuinstallation – oder jemand schaltet sich dazwischen), stoppt jede Übertragung, und die Administration zeigt alten und neuen Fingerabdruck; erst nach **Neuen Schlüssel annehmen** geht es weiter. Ein anderer Server oder Port braucht immer eine neue Bestätigung.
Die SFTP-Sicherung läuft mit jeder geplanten Sicherung (täglich oder stündlich, **Geplante Datenbanksicherung** muss an sein); **Jetzt sichern** im SFTP-Ziel überträgt sofort. Letzte Übertragung und letzter Fehler stehen darunter und in der Statuszeile oben.
Auf dem Server reicht ein eingeschränkter Zugang, etwa mit OpenSSH:
```text
Match User flowplan
ChrootDirectory /srv/sftp/flowplan
ForceCommand internal-sftp
AllowTcpForwarding no
```
### Verzögertes Löschen
Eine aufbewahrte Sicherung soll sich immer vollständig wiederherstellen lassen – auch mit den Dateien, die seitdem gelöscht wurden. Deshalb entfernt Flowplan gelöschte Dateien auf dem SFTP-Server (mit **Dateien mitsichern**) und im S3-Bucket nicht sofort:
- Sie wandern nach `.deleted/uploads/` (SFTP: im Ordner, S3: unter `/`). Der Name bekommt den Zeitpunkt des Verschiebens angehängt (`.`), damit er auch nach dem Kopieren des Ordners oder auf einer anderen Instanz erhalten bleibt.
- Endgültig entfernt werden sie bei einer späteren Sicherung, sobald sie vor der ältesten noch aufbewahrten Sicherung verschoben wurden – dann braucht sie keine mehr. Im Bucket zusätzlich frühestens nach einem Tag, so weit reicht der Verlauf von Litestream zurück. Mehr **Aufbewahren** heißt also auch: gelöschte Dateien bleiben länger.
- Taucht eine gelöschte Datei wieder auf (etwa nach einer Wiederherstellung), holt die SFTP-Sicherung sie aus `.deleted/uploads/` zurück, statt sie neu zu übertragen.
- Beim [Wiederherstellen](#beim-einrichten-wiederherstellen) sucht Flowplan eine Datei, die in `uploads/` fehlt, in `.deleted/uploads/`.
Ohne geplante Sicherung (**Geplante Datenbanksicherung** aus) löscht Flowplan im Bucket sofort – es gäbe keine Sicherung, die die Datei braucht.
### SMB- oder NFS-Freigabe
SMB und NFS spricht Flowplan nicht selbst – dafür bräuchte der Container Mount-Rechte. Stattdessen hängt Docker die Freigabe als Volume ein, und die geplante Sicherung schreibt in den Ordner `backups/` des Datenordners (das lokale Ziel, also ohne `S3_BUCKET`):
```yaml
services:
flowplan:
volumes:
- flowplan-data:/app/data
# Die Freigabe über den Ordner der Sicherungen legen.
- nas-backups:/app/data/backups
volumes:
flowplan-data:
# SMB/CIFS (auf dem Docker-Host wird cifs-utils gebraucht)
nas-backups:
driver: local
driver_opts:
type: cifs
device: "//nas.example.lan/flowplan"
o: "username=flowplan,password=${NAS_PASSWORD},uid=1000,gid=1000,file_mode=0600,dir_mode=0700,vers=3.0"
```
Für NFS stattdessen:
```yaml
nas-backups:
driver: local
driver_opts:
type: nfs
o: "addr=nas.example.lan,nfsvers=4,rw"
device: ":/export/flowplan"
```
`uid=1000` ist der Benutzer `node`, unter dem Flowplan läuft; bei NFS muss der Export für diese UID beschreibbar sein. Das Passwort kommt aus einer `.env`-Datei neben der `compose.yaml`. In Panels wie 1Panel oder Portainer heißt das „Volume mit Treiber local und Optionen“ bzw. „CIFS/NFS-Volume“.
> [!WARNING]
> Nur den Ordner `backups/` auf die Freigabe legen, nie den ganzen Datenordner: SQLite braucht zuverlässige Dateisperren, die SMB und NFS nicht garantieren. Die Freigabe erhält nur die Datenbank – für die Dateien die [Instanzsicherung](#sicherungen) herunterladen oder das SFTP-Ziel mit **Dateien mitsichern** nutzen.
## Wiederherstellen
- **Aus einer Instanzsicherung**: unter **Administration → Speicher & Sicherung → Aus Sicherung wiederherstellen** (ganz unten) hochladen. Flowplan prüft sie und übernimmt sie beim nächsten Neustart; der vorherige Stand bleibt unter `pre-restore-…` im Datenverzeichnis.
- **Aus einer geplanten Sicherung** bei gestoppter App: eine verschlüsselte erst [entschlüsseln](/storage-encryption#notfall-ohne-laufende-instanz-entschluesseln), dann die bestehende `flowplan.sqlite` samt `-wal` und `-shm` beiseitelegen und die Sicherung als `/app/data/flowplan.sqlite` einsetzen. Mit S3 kommen die Dateien aus dem Bucket nach.
- **Auf einem neuen Host mit S3**: neue Installation mit **denselben** `S3_*`-Variablen und leerem Volume starten. Litestream stellt die Datenbank her, die Dateien folgen im Hintergrund. Die alte Instanz vorher stoppen; `secrets.key` und `web-push-keys.json` liegen nicht im Bucket (siehe [Instanz umziehen, Weg C](/move-instance#weg-c-s3-und-litestream)).
- **Auf einen anderen Server umziehen**: siehe [Instanz umziehen](/move-instance) – das eingebaute Umzugswerkzeug holt Datenbank, Dateien und Schlüssel direkt von der alten Instanz, mit wenigen Minuten Ausfallzeit.
- **Aus einer geplanten Sicherung einer Instanz mit PostgreSQL** (`flowplan-….dump`, `.dump.enc`): ebenfalls unter **Aus Sicherung wiederherstellen** hochladen oder auf dem Einrichtungsbildschirm einer neuen Instanz mit PostgreSQL. Nur die Datenbank wird ersetzt, die Dateien bleiben. Eingespielt werden nur die Daten der Tabellen von Flowplan; ein Archiv mit eigenen Funktionen, Views oder Triggern im Schema von Flowplan lehnt Flowplan ab – siehe [PostgreSQL, Wiederherstellen](/postgresql#wiederherstellen).
- **Einen früheren Zeitpunkt** bei gestoppter App:
```bash
litestream restore -config /etc/litestream.yml \
-timestamp 2026-09-26T12:00:00Z -o /app/data/flowplan.sqlite
```
Vorher die bestehende `flowplan.sqlite` samt `-wal` und `-shm` beiseitelegen.
### Beim Einrichten wiederherstellen
Eine neue, noch leere Instanz übernimmt eine Sicherung direkt auf dem Einrichtungsbildschirm: unter **Konto erstellen** auf **Aus Sicherung wiederherstellen** klicken ([Installation, Erster Start](/installation#erster-start)). Möglich sind
- **Datei**: eine geplante Sicherung (`flowplan-….sqlite`, `.sqlite.enc`) oder die Sicherung der gesamten Instanz (`flowplan-instanz-….zip`, `.zip.enc`), bis 50 GB. Der Upload wird direkt auf die Festplatte geschrieben und zeigt seinen Fortschritt. Fehlen danach Anhänge, die weder in der Sicherung noch im Dateispeicher der Instanz liegen, nennt die Seite ihre Zahl – lagen die Dateien der alten Instanz in S3 oder auf einem SFTP-Server, stelle von dort wieder her.
- **S3**: die neueste geplante Sicherung aus `/backups/` eines Buckets, dazu die Dateien aus `/uploads/` – fehlt dort eine, aus `/.deleted/uploads/`.
- **SFTP**: die neueste Sicherung aus dem Ordner, dazu die Dateien aus `uploads/` (wenn **Dateien mitsichern** an war) – fehlt dort eine, aus `.deleted/uploads/`. Zuerst zeigt Flowplan den Hostschlüssel; erst wenn du **Der Fingerabdruck stimmt** bestätigst, meldet es sich an.
Ist die Sicherung verschlüsselt, frag die Seite nach dem Schlüssel der alten Instanz (`FLOWPLAN_ENCRYPTION_KEY`) – oder er ist auf der neuen schon gesetzt. Flowplan prüft die Datenbank (unbeschädigt, eine Flowplan-Datenbank, nicht aus einer neueren Version – ältere werden beim Öffnen wie bei einem Update aktualisiert), legt den leeren Anfangsstand als `pre-restore-…` beiseite und übernimmt die Sicherung sofort. Danach meldest du dich mit einem Konto aus der Sicherung an. Läuft Litestream (S3 ohne `FLOWPLAN_LITESTREAM=off`), wird die Sicherung erst beim nächsten Neustart des Containers übernommen – die Seite sagt das.
Die Möglichkeit gibt es nur, solange die Instanz kein Konto hat, und mit gesetztem `FLOWPLAN_SETUP_TOKEN` nur über den Einrichtungslink. Sobald ein Konto existiert, lehnt der Server jede Anfrage dazu ab; dann bleibt **Administration → Speicher & Sicherung → Aus Sicherung wiederherstellen**.
> [!NOTE]
> Gespeicherte Geheimnisse (Authenticator-Apps, KI- und Messenger-Schlüssel, das SFTP-Passwort) lassen sich nur mit demselben `FLOWPLAN_ENCRYPTION_KEY` oder `FLOWPLAN_SECRETS_KEY` wie auf der alten Instanz lesen; ohne beide liegt der Schlüssel in `secrets.key` im Datenordner, der in keiner Sicherung steckt. Hast du beim Wiederherstellen einen Schlüssel eingegeben, trage ihn danach als `FLOWPLAN_ENCRYPTION_KEY` ein.
## Kontingente
`FLOWPLAN_WORKSPACE_QUOTA_MB` oder **Administration → Grenzen & Aufbewahrung** legt ein Standard-Kontingent je Arbeitsbereich fest; unter **Administration → Arbeitsbereiche** lässt es sich je Arbeitsbereich überschreiben. Uploads, Kopien, Vorlagen und Importe über dem Kontingent werden abgelehnt.
---
# Verschlüsselung von Dateien und Sicherungen
Mit einem eigenen Schlüssel verschlüsselt Flowplan alles, was den Server verlässt – Dateien im Bucket, Sicherungen und die Datenbank-Kopie –, auch für bestehende Daten.
## Verschlüsselung
Auf Wunsch verschlüsselt Flowplan alles, was es aus dem Server hinausgibt, mit einem Schlüssel, den nur der Server kennt (AES-256-GCM). Wer an den Bucket oder an eine Sicherung kommt – der Speicheranbieter, jemand mit geleakten Zugangsdaten, ein versehentlich öffentlicher Bucket –, sieht nur unlesbare Daten.
| Was | Verschlüsselt |
| --- | --- |
| Dateien im Bucket (`/uploads/`) | ja |
| Geplante Sicherungen (`flowplan-….sqlite.enc`) | ja, im Bucket und im Datenordner |
| Markdown-Exporte (`….zip.enc`) | ja, im Bucket und im Datenordner |
| Heruntergeladene Instanzsicherung (`….zip.enc`) | ja |
| Litestream-Kopie der Datenbank (`/db/`) | nein – siehe [Litestream](#litestream-und-verschluesselung) |
| Git-Export | nein – dort soll lesbares Markdown liegen |
| Datenordner auf dem Server (`flowplan.sqlite`, `uploads/`) | nein – dafür die Festplattenverschlüsselung des Hosts |
### Einschalten
Einen Schlüssel erzeugen und als Umgebungsvariable setzen, dann neu starten:
```bash
openssl rand -base64 32
# oder ohne openssl:
docker run --rm ghcr.io/yannicschuller/flowplan node /app/decrypt.mjs --new-key
```
```env
FLOWPLAN_ENCRYPTION_KEY=<32 Bytes, base64>
# oder als Docker-Secret:
FLOWPLAN_ENCRYPTION_KEY_FILE=/run/secrets/flowplan-key
```
**Administration → Verschlüsselung** zeigt danach „Verschlüsselung an“ mit der Schlüssel-ID (die ersten Bytes eines Hashes, nicht der Schlüssel selbst). Ein falsch geformter Schlüssel erscheint dort als Fehler; Sicherungen schlagen dann fehl, statt unverschlüsselt zu landen.
> [!CAUTION]
> Ohne den Schlüssel sind verschlüsselte Sicherungen und Dateien verloren – auch für dich. Bewahre ihn getrennt von den Sicherungen auf (Passwortmanager, Tresor), nicht im selben Bucket und nicht nur auf demselben Server.
### Bestehende Daten
Es gibt keinen Migrationsschritt, und beim Start wird nichts umgeschrieben. Flowplan erkennt verschlüsselte Daten an den ersten Bytes, unverschlüsselte und verschlüsselte liegen problemlos nebeneinander:
- **Ab dem Einschalten** werden neue Dateien, jede neue Sicherung und jeder neue Export verschlüsselt.
- **Dateien, die schon im Bucket liegen**, bleiben lesbar und zunächst unverschlüsselt. Die Administration zählt sie; **Bestehende verschlüsseln** lädt sie im Hintergrund noch einmal hoch, diesmal verschlüsselt, und ersetzt dabei das alte Objekt. Die App läuft währenddessen normal weiter.
- **Ältere Sicherungen und Exporte** werden nicht umgeschrieben. Sie fallen mit der Zeit aus der Aufbewahrung (**Aufbewahrte Sicherungen**) heraus oder lassen sich von Hand löschen.
- **Wiederherstellen** geht mit beiden: Eine unverschlüsselte Instanzsicherung lässt sich weiter hochladen, eine verschlüsselte wird vorher entschlüsselt.
- Hat der Bucket **Versionierung**, bleiben ältere, unverschlüsselte Versionen der Objekte erhalten. Diese per Lebenszyklus-Regel oder von Hand entfernen.
**Ausschalten** geht auch: Verschiebe den Schlüssel nach `FLOWPLAN_ENCRYPTION_KEY_PREVIOUS`. Dann wird nichts mehr verschlüsselt, das bereits Verschlüsselte bleibt aber lesbar.
### Schlüssel wechseln
::: steps
1. Den neuen Schlüssel als `FLOWPLAN_ENCRYPTION_KEY` setzen und den alten nach `FLOWPLAN_ENCRYPTION_KEY_PREVIOUS` verschieben (mehrere durch Komma getrennt), dann neu starten.
2. Unter **Administration → Verschlüsselung** **Bestehende verschlüsseln** wählen. Alle Dateien im Bucket werden mit dem neuen Schlüssel neu verschlüsselt.
3. Den alten Schlüssel aufheben, bis die letzte damit verschlüsselte Sicherung aus der Aufbewahrung gefallen ist.
:::
Jede verschlüsselte Datei nennt die ID ihres Schlüssels. Fehlt dieser Schlüssel, sagt Flowplan genau das, statt still kaputte Daten zu liefern.
### Litestream und Verschlüsselung
Litestream (0.5) kann die Datenbank-Kopie selbst nicht verschlüsseln. Mit eingeschaltetem Schlüssel warnt die Administration deshalb, dass unter `/db/` eine unverschlüsselte Kopie liegt. Zwei Wege:
1. **Nur verschlüsselte Sicherungen** (empfohlen bei einem Bucket, dem du nicht traust): `FLOWPLAN_LITESTREAM=off` setzen und unter **Administration → Speicher & Sicherung → Sicherungen** die Option **Stündlich statt täglich** einschalten, dazu mehr Kopien aufbewahren (z. B. 72). Danach den Ordner `/db/` im Bucket löschen. Der Preis: Im schlimmsten Fall geht die letzte Stunde verloren statt der letzten Sekunden, und auf einem neuen Host stellst du die Datenbank aus der neuesten Sicherung her (unten).
2. **Serverseitige Verschlüsselung beim Anbieter (SSE-C)**: `LITESTREAM_SSE_C_KEY` auf einen eigenen Schlüssel setzen (32 Bytes, base64). Der Anbieter verschlüsselt die Kopie und bekommt den Schlüssel dafür bei jeder Anfrage mit. Das schützt also vor geleakten Datenträgern oder Buckets, nicht vor dem Anbieter selbst. Das funktioniert nur über https und nur bei Anbietern, die SSE-C unterstützen (vorher prüfen). Vor dem Einschalten den Ordner `/db/` leeren, denn eine Kopie aus unverschlüsselten und SSE-C-Teilen lässt sich nicht wiederherstellen.
### Notfall: ohne laufende Instanz entschlüsseln
`decrypt.mjs` braucht nur Node.js, keine Datenbank und keinen laufenden Server. Es liegt im Docker-Image unter `/app/decrypt.mjs` und im Quellcode unter `scripts/decrypt.mjs`:
```bash
# im Ordner mit der Sicherung
docker run --rm --user "$(id -u)" -v "$PWD:/work" -w /work -e FLOWPLAN_ENCRYPTION_KEY='' \
ghcr.io/yannicschuller/flowplan node /app/decrypt.mjs flowplan-2026-10-19-03-00.sqlite.enc
# → flowplan-2026-10-19-03-00.sqlite
```
Das funktioniert genauso für Markdown-Exporte (`.zip.enc` wird zu `.zip`), für die Instanzsicherung und für einzelne Objekte aus `uploads/` im Bucket (Ausgabe `.decrypted`). Frühere Schlüssel kommen über `FLOWPLAN_ENCRYPTION_KEY_PREVIOUS` dazu; mit `--key-file ` wird der Schlüssel aus einer Datei gelesen. Die Ausgabe entsteht erst, wenn die Prüfsumme stimmt.
Das Format ist offen dokumentiert: `FPE1` (4 Bytes) · Schlüssel-ID (8 Bytes) · IV (12 Bytes) · Daten · GCM-Tag (16 Bytes). Die ersten 12 Bytes sind mit authentifiziert.
### Mehr Schutz
Die Verschlüsselung betrifft das, was den Server verlässt. Auf dem Server selbst liegen Datenbank und Dateien unverschlüsselt, denn Flowplan muss sie lesen, um sie anzuzeigen. Wer auch das abdecken will:
- **Festplattenverschlüsselung** des Hosts (LUKS, verschlüsseltes Volume beim Anbieter). Das lässt sich jederzeit nachrüsten und ist unabhängig von Flowplan.
- Das Format trägt eine Version (`FPE1`) und eine Schlüssel-ID. Ein späterer Wechsel auf ein anderes Verfahren oder einen anderen Schlüssel läuft deshalb über denselben Weg wie oben, ohne dass alte Sicherungen unlesbar werden.
- Eine Verschlüsselung der laufenden Datenbank (SQLCipher) gehört bewusst nicht dazu, siehe die Begründung in [Issue #32](https://github.com/yannicschuller/flowplan/issues/32).
- Für einzelne vertrauliche Inhalte gibt es **[verschlüsselte Bereiche](/encrypted-spaces)**: Sie werden schon im Browser verschlüsselt, sodass auch Datenbank, Uploads-Ordner und Sicherungen auf dem Server nur Chiffretext enthalten – unabhängig von `FLOWPLAN_ENCRYPTION_KEY`.
---
# Markdown-Export und Git
Eine lesbare Kopie außerhalb von Flowplan – für den Notfall, wenn die Instanz nicht läuft, oder als Archiv in einem Git-Repository. **Administration → Markdown- & Git-Export** wählt Seiten und Datenbanken; mit jeder geplanten Sicherung (und mit **Jetzt sichern**) wird jede davon samt Unterseiten, Kommentaren und früheren Versionen zu einem Markdown-ZIP:
- mit S3 im Bucket unter `/exports/`, sonst im Datenordner unter `exports/`; es bleiben so viele wie Sicherungen (**Aufbewahrte Sicherungen**). Mit `FLOWPLAN_ENCRYPTION_KEY` sind die ZIPs verschlüsselt (`.zip.enc`), die Übertragung nach Git nicht;
- exportiert wird mit den Leserechten der Person, die die Auswahl gespeichert hat – private Einträge und Journale mit PIN bleiben draußen;
- Dateinamen und Pfade im ZIP enthalten Kennungen, damit sie zwischen zwei Läufen gleich bleiben (sauberer Git-Diff). Einträge beginnen mit YAML-Frontmatter, Kommentare stehen in `.comments.md`, frühere Versionen unter `.versions/`.
## In ein Git-Repository übertragen
> [!IMPORTANT]
> Der Git-Export der Instanz (`EXPORT_GIT_*`) ist veraltet. Er läuft weiter, wird aber durch den [Git-Export eines Bereichs](#git-export-eines-bereichs) ersetzt, den Bereichseigentümer selbst einrichten; die Administration zeigt dazu einen Hinweis. Der geplante Markdown-Export nach S3 oder in den Datenordner bleibt unverändert.
Mit diesen Variablen überträgt Flowplan jeden Export selbst in ein Repository (Forgejo, Gitea, GitHub, GitLab) – jede Seite in einem eigenen Ordner, ein Commit pro Lauf mit Änderungen:
| Variable | Bedeutung |
| --- | --- |
| `EXPORT_GIT_URL` | `https://`-Adresse des Repositorys, ohne Zugangsdaten. |
| `EXPORT_GIT_TOKEN` | Token mit Schreibrecht auf dieses Repository. Steht nur in der Umgebung, nie in der Datenbank oder einer Sicherung. |
| `EXPORT_GIT_USERNAME` | Benutzername zum Token (Standard `flowplan`; GitLab: `oauth2`). |
| `EXPORT_GIT_BRANCH` | Zweig, Standard `main`. Ein leeres Repository bekommt ihn beim ersten Lauf. |
| `EXPORT_GIT_AUTHOR`, `EXPORT_GIT_EMAIL` | Autor der Commits. |
| `EXPORT_GIT_IMPORT` | `true`: Änderungen, die seit dem letzten Lauf im Repository gemacht wurden, übernimmt Flowplan vor dem Export. |
Mit `EXPORT_GIT_IMPORT=true` gilt für geänderte Dateien:
- **Einträge** (`records//…md`) werden über `flowplan.id` im Frontmatter aktualisiert; neue Dateien werden neue Einträge.
- **Dokumentseiten** (`index.md`, `pages/…-.md`) bekommen den Text der Datei; der vorige Stand bleibt als Version erhalten.
- **Journaltage** (`/2026/10/2026-10-27.md`) werden über ihr Journal (den Ordner) und das Datum gefunden; `flowplan.id` im Frontmatter zählt nur, wenn sie einen Tag desselben Journals nennt. Repositorys aus älteren Versionen, in denen Tage noch als `pages/-.md` lagen, funktionieren weiter: Änderungen an diesen Dateien werden vor dem Export noch übernommen, danach schreibt der Export die Tage an die neuen Pfade und entfernt die alten Dateien. Dabei entsteht kein Tag doppelt; ein umbenanntes Journal behält seine Tage, weil der Ordner über die Kennung zugeordnet wird.
- Datenbanktabellen, Kommentare und Versionen sind Kopien und werden nicht zurückgelesen.
Markdown kennt nicht alle Blöcke von Flowplan (etwa Spalten). Whiteboards liegen als SVG-Bild im Repository; ein eingebettetes Board trägt eine unsichtbare Markierung (``), mit der es beim Übernehmen aus Git wieder eingebettet wird – Bild und Link darunter bitte stehen lassen. Wer in Git Seiten mit anderen solchen Blöcken bearbeitet, findet den vorigen Stand im Versionsverlauf. Den Stand der letzten Übertragung (Commit, übernommene Änderungen, Fehler) zeigt die Administration.
## Git-Export eines Bereichs
Statt eines Repositorys für die ganze Instanz richtet die Eigentümerin oder der Eigentümer eines Bereichs selbst ein Repository für diesen Bereich ein: **Bereich verwalten → Git-Export** (über `…` neben dem Bereich oder **Einstellungen → Bereiche**). Die Administration schaltet die Funktion nur ein:
| Variable | Standard | Bedeutung |
| --- | --- | --- |
| `SPACE_GIT_EXPORT` | *leer* | `true` schaltet den Git-Export der Bereiche ein. Ohne die Variable sehen Bereichseigentümer ihn nicht, und eingerichtete Exporte laufen nicht. |
| `SPACE_GIT_ALLOWED_HOSTS` | *leer* | Git-Server, durch Komma getrennt, z. B. `git.example.org,codeberg.org`. Gesetzt sind nur diese erlaubt; ohne die Variable jeder öffentliche `https://`-Server. |
| `SPACE_GIT_ALLOW_PRIVATE` | *leer* | `true` erlaubt den in `SPACE_GIT_ALLOWED_HOSTS` genannten Servern auch interne Adressen – etwa ein Forgejo auf demselben Host, den der Container über `--add-host git.example.org:host-gateway` erreicht. Wirkt nur zusammen mit der Liste; alle anderen Server bleiben auf öffentliche Adressen beschränkt. |
Im Bereich trägt die Eigentümerin oder der Eigentümer ein:
- **Repository-Adresse** (`https://`, ohne Zugangsdaten), **Branch** (Standard `main`), **Benutzername** und ein **Zugangstoken mit Schreibrechten** (GitLab: Benutzername `oauth2`);
- **Häufigkeit**: täglich oder wöchentlich, dazu **Jetzt ausführen**;
- auf Wunsch **Kommentare und frühere Versionen** (`.comments.md`, `.versions/`).
Was dabei passiert:
- Ins Repository kommt der [Markdown-Export des Bereichs](/import-export-versions) – jede Seite der obersten Ebene in einem eigenen Ordner (`-/`), dazu `index.md` und `README.txt`. Andere Dateien im Repository (etwa `LICENSE` oder CI-Dateien) bleiben unberührt.
- Ein Commit je Lauf, und nur, wenn sich etwas geändert hat; Seiten, die nicht mehr im Bereich sind, werden im selben Commit gelöscht.
- Anhänge über 10 MB gehen mit, wie im Markdown-Export.
- Exportiert wird mit den Leserechten der Eigentümerin oder des Eigentümers: private Einträge anderer und Journale mit PIN bleiben draußen.
- Nur Export: Änderungen im Repository übernimmt Flowplan nicht.
- Die Einstellungen zeigen den letzten Lauf (Commit, geänderte Dateien, Fehler) und ab wann der nächste fällig ist. Ein fehlgeschlagener Lauf wird nach einer Stunde wiederholt.
Sicherheit:
- Das Token speichert Flowplan nur verschlüsselt (wie die anderen [gespeicherten Geheimnisse](/configuration-storage#gespeicherte-geheimnisse), an den Bereich gebunden). Nach dem Speichern zeigt die Oberfläche nur noch, ob eines gespeichert ist; in Exporten steht es nicht, in der Instanzsicherung nur verschlüsselt. Eine neue Repository-Adresse braucht das Token erneut.
- Jede Adresse wird aufgelöst und geprüft: Interne Adressen (localhost, private Netze) sind nicht erreichbar, Weiterleitungen werden nicht verfolgt. Einzige Ausnahme: Server, die die Administration in `SPACE_GIT_ALLOWED_HOSTS` nennt, wenn zusätzlich `SPACE_GIT_ALLOW_PRIVATE=true` gesetzt ist – etwa ein Git-Server auf demselben Host. Auch dann bleibt es bei HTTPS, festgelegter Adresse und ohne Weiterleitungen.
- Der Export endet, und Token und Arbeitskopie (`git-export/spaces//` im Datenordner) werden gelöscht, wenn die Eigentümerin oder der Eigentümer ihn ausschaltet, den Arbeitsbereich verlässt, Gast wird oder das Konto löscht – oder wenn der Bereich eine neue Eigentümerin oder einen neuen Eigentümer bekommt oder in den Papierkorb wandert.
**Administration → Markdown- & Git-Export** zeigt, wie viele Bereiche den Git-Export nutzen, und ihre letzten Fehler – ohne Adressen und Inhalte.
---
# Betrieb und Fehlersuche
Healthcheck, Kennzahlen, Speicherübersicht und die häufigsten Ursachen, wenn etwas nicht läuft.
**Mehr zum Thema:** [Überwachung und Wartung](/monitoring) · [Sicherheit und Angriffserkennung](/security-monitoring)
## Healthcheck
`GET /api/health` antwortet ohne Anmeldung mit `200` oder bei Problemen mit `503` und verrät dabei nichts über die Instanz:
```json
{"service":"flowplan","status":"ok"}
```
Bei `503` steht `"status":"error"` darin. Für Docker-/Podman-Healthchecks, Kubernetes-Probes, Coolify, Gatus und Uptime-Monitore reicht der Statuscode; die Desktop- und Mobil-Apps erkennen eine Flowplan-Instanz an `"service":"flowplan"`.
Die Details gibt es nur mit dem Token aus `FLOWPLAN_METRICS_TOKEN` (`Authorization: Bearer `, wie für `/api/metrics`) oder für angemeldete Instanz-Admins:
- `checks.database`: Datenbank erreichbar und beschreibbar,
- `checks.storage`: Upload-Verzeichnis beschreibbar,
- `searchBacklog`: Rückstand des Suchindex,
- `failedPushDeliveries`: fehlgeschlagene Push-Zustellungen,
- `objectStorage`: mit S3 `pending` (noch hochzuladende Dateien) und `retrying`, sonst `"off"`,
- `uptimeSeconds`: Laufzeit des Servers.
- `version`, `commit`, `builtAt`: welche Version aus welchem Commit hier läuft (leer, wenn das Image sie nicht mitbringt) – etwa um zu prüfen, ob ein Deployment aktuell ist.
```sh
curl -H "Authorization: Bearer $FLOWPLAN_METRICS_TOKEN" https://flowplan.example.com/api/health
```
Persönliche API-Tokens schalten die Details nicht frei.
Für Kubernetes und Load Balancer gibt es zusätzlich `/api/health/live` (der Prozess antwortet) und `/api/health/ready` (Datenbank und im Cluster Redis und Bucket erreichbar; `503` beim Herunterfahren), siehe [Cluster-Modus](/cluster#gesundheit-bereitschaft-und-herunterfahren).
## Nach dem ersten Start prüfen
- `/api/health` liefert `200`.
- Die Anmeldung funktioniert und landet wieder in Flowplan.
- Das erste Konto (bei SSO: ein Mitglied der Admin-Gruppe) sieht **Administration**.
- Eine Datei hochladen, den Container neu starten, die Datei wieder öffnen – dann ist das Volume richtig eingebunden.
- Mit S3: `objectStorage.pending` sinkt auf `0`; im Bucket liegen `flowplan/uploads/` und `flowplan/db/`; das Log zeigt beim Start Zeilen von `litestream`.
## Workflows
[Workflows](/workflows) laufen im Server-Prozess. Ein Neustart verliert nichts: laufende Schritte ohne gültige Lease kommen nach spätestens zwei Minuten zurück in die Warteschlange, wartende Läufe (Warten, Freigabe) laufen zu ihrem Zeitpunkt weiter, Zeitpläne holen den letzten verpassten Termin einmal nach. Unter **Administration → Grenzen & Aufbewahrung → Workflows** zeigt die Überwachung wartende Schritte, die älteste fällige Aufgabe, nicht verteilte Ereignisse und die Fehlerquote. Läufe werden nach 30 Tagen gelöscht (`FLOWPLAN_WORKFLOW_RUN_DAYS`), wartende nie.
## Fehlersuche
| Symptom | Ursache und Lösung |
| --- | --- |
| Login endet mit Fehler zur Redirect-URI | URI beim Anbieter ≠ `APP_URL` + `/api/auth/callback`. |
| „Ungültiger Anfrageursprung“ beim Speichern | `APP_URL` weicht von der aufgerufenen Adresse ab. |
| Keine Administration sichtbar | Bei SSO fehlt die Gruppe im Token: `OIDC_SCOPES`, `OIDC_GROUPS_CLAIM`, `OIDC_ADMIN_GROUP` prüfen und neu anmelden. Bei E-Mail-Konten gibt ein Admin das Recht unter **Benutzer**. |
| Nach Neustart ist alles leer | Volume ist nicht auf `/app/data` eingehängt. |
| `SQLITE_READONLY`, `EACCES` oder `unable to open database file` im Log, im Datenordner entsteht nichts | Der eingebundene Host-Ordner gehört nicht dem Benutzer, als der Flowplan läuft (meist mit `user:` gestartet): `PUID`/`PGID` statt `user:` setzen (Flowplan übernimmt den Ordner dann selbst), Flowplan mit `user: "UID:GID"` als Besitzer starten, `sudo chown -R 1000:1000 /pfad/zu/flowplan-data` oder ein benanntes Docker-Volume nehmen ([Volume-Rechte](/coolify-and-proxy#volume-rechte)). Neuere Images melden das beim Start und beenden sich. |
| Container „degraded“ in Coolify | Healthcheck-Port leer (= 80); `3000` eintragen. |
| 404 über den vorderen Proxy | Keine Route beim inneren Proxy: Host-Header setzen, TLS zum Ziel ausschalten, Container muss gesund sein. |
| `objectStorage.retrying: true` | Bucket nicht erreichbar oder Schlüssel falsch. Uploads werden mit wachsendem Abstand wiederholt, lokal geht nichts verloren. Endpoint vom Container aus prüfen (Tippfehler, Dienst nur an interne IP gebunden). |
| Container startet nicht, Log zeigt `litestream` | Endpoint, Bucket oder Schlüssel für die Datenbanksicherung falsch; zum Eingrenzen `FLOWPLAN_LITESTREAM=off`. |
| Push kommt nicht an | `WEB_PUSH_SUBJECT` fehlt, Schlüssel haben sich geändert oder ausgehendes HTTPS ist gesperrt. |
| Hohe CPU-Last nach Uploads | Texterkennung gescannter PDFs; bei Bedarf `FLOWPLAN_OCR=0`. |
| Änderungen anderer oder Live-Cursor kommen nur verzögert an | Proxy puffert Server-Sent Events (`/api/documents/live`, `/api/whiteboards/…/cursors`); Pufferung abschalten. Ohne den Kanal gleicht Flowplan weiter im Abstand von Sekunden ab. |
## Desktop-Apps
Die Desktop-App für macOS, Windows und Linux ist ein schlankes Fenster um eine Flowplan-Instanz. Alle Daten bleiben auf dem Server; neue Flowplan-Funktionen kommen mit dem Server und brauchen kein App-Update. Die App hat ein eigenes Repository: [flowplan-desktop](https://github.com/yannicschuller/flowplan-desktop).
**Offline-Nutzung:** funktioniert in der Desktop-App wie im Browser, auch im AppImage unter Linux. Sie wird in der App selbst unter **Einstellungen → Offline & Geräte** eingeschaltet, denn App, Browser und installierte Web-App speichern getrennt. Ohne Verbindung öffnet die App die Kopie aus dem Service Worker der Instanz, auch wenn eine andere Seite der Instanz nicht lädt; die eigene Offline-Seite der App erscheint nur ohne Kopie. Fehlt die Option, ist die Adresse kein HTTPS mit gültigem Zertifikat (der Service Worker braucht eine sichere Verbindung; `http://localhost` geht für Tests). Siehe [Offline arbeiten](/offline-and-apps#offline-nutzung-einschalten).
### Herunterladen
[flowplan.org/download](https://flowplan.org/download) erkennt das System und lädt die neueste Version; darunter stehen alle Dateien. Dieselben Dateien liegen im [neuesten Release](https://github.com/yannicschuller/flowplan-desktop/releases/latest):
| System | Datei | Architektur |
| --- | --- | --- |
| macOS 12 oder neuer | `Flowplan--mac.dmg` | Apple Silicon und Intel in einer App |
| Windows 10 oder neuer | `Flowplan--windows-setup.exe`, ohne Installation die `.zip` | x64 und ARM in einem Installer |
| Linux | `Flowplan--linux-.AppImage`, oder die `.tar.gz` | x64 und ARM |
Beim ersten Start fragt die App immer nach der Adresse der Instanz und schlägt `https://app.flowplan.org` vor (HTTPS, für lokale Tests auch `http://localhost`); weitere Instanzen kommen als Profile dazu (siehe unten). Für verteilte Installationen schlägt `--server=` oder die Umgebungsvariable `FLOWPLAN_SERVER` stattdessen die eigene Adresse vor – bestätigt wird sie beim ersten Start trotzdem. Die App prüft, ob dort wirklich Flowplan läuft (`/api/health` antwortet mit `"service": "flowplan"`), und lehnt Adressen ab, die auf eine andere Seite weiterleiten.
**Anmeldung mit Passkey und SSO:** Passkeys und Anbieter, die einen Passkey verlangen, funktionieren nur in einem echten Browser. Die App öffnet die Anmeldung deshalb im Standardbrowser: Sie erzeugt ein zufälliges Geheimnis, öffnet `/api/auth/desktop` mit dessen Hash, nach der Anmeldung bestätigt man **In der App anmelden**, und der Browser gibt über `flowplan://sign-in` einen Einmalcode an die App zurück. Der Code gilt eine Minute, nur einmal und nur zusammen mit dem Geheimnis, das die App nie verlässt. Fragt der Browser, ob er Flowplan öffnen darf, ist das dieser Schritt.
Die Mac-App ist ab Version 1.0.6 mit einer Developer ID signiert und von Apple notarisiert; macOS öffnet sie ohne Rückfrage. Nur Versionen bis 1.0.5 waren unsigniert: Dort blockiert macOS den ersten Start (ab macOS 15 unter **Systemeinstellungen → Datenschutz & Sicherheit → Dennoch öffnen** freigeben, bis macOS 14 Rechtsklick → **Öffnen**; meldet macOS „beschädigt“, hilft `xattr -dr com.apple.quarantine /Applications/Flowplan.app`). Selbst gebaute Apps ohne Zertifikat verhalten sich genauso, siehe [flowplan-desktop → Signing](https://github.com/yannicschuller/flowplan-desktop#signing). Windows zeigt SmartScreen (**Weitere Informationen → Trotzdem ausführen**), und ein AppImage muss vorher ausführbar sein (`chmod +x`).
### Profile
Die Desktop-App kann mehrere Instanzen als Profile speichern (Bedienung: [Mehrere Instanzen](/desktop-app#mehrere-instanzen-profile)). Technisch:
- Jedes Profil hat eine eigene Electron-Sitzung (`persist:profile-`): Cookies, Service Worker, Offline-Kopie, IndexedDB und Cache sind getrennt, auch für zwei Profile auf derselben Instanz. Berechtigungen (Mitteilungen, Mikrofon) bekommt nur die Instanz des aktiven Profils, eine im Browser begonnene Anmeldung verfällt beim Wechsel.
- Die Profile stehen in `config.json` im Benutzerordner der App (`profiles`, `activeProfile`). Eine Adresse aus Version 1.0.4 oder älter wird beim ersten Start automatisch zum ersten Profil und behält die bisherige Sitzung; `server` spiegelt weiterhin das aktive Profil, damit eine ältere Version nach einem Downgrade eine Adresse findet.
- `--profile=` startet die App mit einem gespeicherten Profil oder wechselt in einer laufenden App dorthin, etwa aus einem Starter unter Linux. Neue Adressen nimmt die App so nicht an; die schlägt weiterhin nur `--server=` bzw. `FLOWPLAN_SERVER` beim ersten Start vor.
- Ein Profil entfernen meldet es bei der Instanz ab und leert seine Sitzung auf diesem Rechner.
### Updates
Die App prüft 15 Sekunden nach dem Start, danach alle sechs Stunden und über **Nach Updates suchen …** im Menü, ob es ein neueres Release gibt:
| Installiert als | Was passiert |
| --- | --- |
| Windows-Installer | Lädt im Hintergrund, mit Fortschritt in einem kleinen Hinweis im Fenster und am Taskleisten-Symbol; dann bieten Hinweis, Menü und Infobereich **Neu starten**, sonst wird beim Beenden installiert. |
| Linux-AppImage | Genauso – das AppImage ersetzt sich selbst. |
| macOS (ab 1.0.6, signiert) | Genauso. |
| macOS bis 1.0.5 (unsigniert), Windows-ZIP, Linux-`.tar.gz` | Ein Hinweis im Fenster nennt die neue Version und führt zur Download-Seite (bis 1.0.8 war das ein Dialog). macOS lässt nur signierte Apps sich selbst ersetzen – von 1.0.5 oder älter also einmal 1.0.6 herunterladen, danach aktualisiert sich die App selbst. |
Ab der Version nach 1.0.8 unterbricht kein Dialog mehr: Auch die Antwort auf **Nach Updates suchen …** erscheint als Hinweis im Fenster. Ohne Verbindung bleibt die Prüfung still und versucht es später erneut. Mit `FLOWPLAN_UPDATE_URL` auf dem Rechner der App holt sie Updates aus einer anderen Quelle – einem Ordner mit denselben Dateien (`latest*.yml` und die Installer), etwa einem Spiegel im Firmennetz. Nicht zu verwechseln mit der gleichnamigen Variable des Servers, die den Spiegel für den Release-Check der Instanz nennt (siehe [Konfiguration](/configuration#betrieb)). Ein Spiegel kann Versionshinweise im Feld releaseNotes seiner latest*.yml mitgeben (Markdown oder HTML); die App zeigt sie unter **Was ist neu?** als reinen Text.
### Einstellungen, Links und Autostart
- Die Einstellungen der App (Symbol im Infobereich, Beim Anmelden öffnen, Tastenkürzel für Schnell erfassen, Sprachen der Rechtschreibprüfung) stehen in `config.json` unter `settings`, die Seiten in eigenen Fenstern je Profil unter `pageWindows`. Die App prüft beides beim Lesen; Unbekanntes fällt weg.
- `flowplan://open?instance=&page=` öffnet eine Seite (siehe [flowplan-desktop → Links](https://github.com/yannicschuller/flowplan-desktop#links-to-pages-flowplan)). Eine Instanz ohne Profil wird erst nach Rückfrage und derselben Prüfung wie beim Einrichten hinzugefügt. Unter Linux braucht das, wie die Anmeldung über den Browser, die registrierte Desktop-Datei.
- **Beim Anmelden öffnen** trägt die App unter macOS und Windows als Anmeldeobjekt ein, unter Linux schreibt sie `~/.config/autostart/flowplan.desktop` (bzw. unter `$XDG_CONFIG_HOME`).
- Schnell erfassen und Dateien gehen mit der Anmeldung des Profils an dessen eigene Instanz, über dieselben Endpunkte wie die Web-App (`capture.record`, `/api/upload`, Markdown-Import, `/api/import/source`); auf dem Server wird dafür nichts eingerichtet.
### Signieren und neue Versionen
Neue Versionen entstehen im Repository flowplan-desktop über **Actions → Release → Run workflow**: Die Version steigt, die Apps werden für alle drei Systeme gebaut und angehängt, und erst wenn alles da ist, wird das Release veröffentlicht. Installierte Apps finden es innerhalb von sechs Stunden.
Signiert werden die Apps, sobald dort die Secrets `CSC_LINK`/`CSC_KEY_PASSWORD` (macOS, für die Notarisierung zusätzlich `APPLE_ID`, `APPLE_APP_SPECIFIC_PASSWORD`, `APPLE_TEAM_ID`) bzw. `WIN_CSC_LINK`/`WIN_CSC_KEY_PASSWORD` (Windows) hinterlegt sind; eine signierte Mac-App aktualisiert sich dann wie unter Windows selbst. Selbst bauen: im Repository `npm run dist:mac`, `dist:win` oder `dist:linux`.
---
# Überwachung und Wartung
Die Instanz live beobachten: Kennzahlen, Statistik, Warnungen per Webhook, Wartungshinweise und Prometheus.
## Administration → Überwachung
**Administration → Überwachung** zeigt die Instanz live – alle 15 Sekunden aktualisiert, pausiert, solange der Tab im Hintergrund liegt:
- **Zustand**: Datenbank, Dateispeicher (mit Belegung des Datenträgers), S3-Spiegel, Sicherung, E-Mail, KI-Anbieter (erreichbar und Antwortzeit, höchstens alle fünf Minuten geprüft), Push-Relay (erreichbar, höchstens jede Minute geprüft, siehe [Push-Benachrichtigungen](/administration#push-benachrichtigungen)), Hintergrunddienste und Aktualisierung. Jede Kachel führt zum zuständigen Bereich.
- **Kennzahlen**: fünf Kacheln in einer Reihe, jede mit Wert und kleinem Verlauf; Speicher, KI-Tokens und Fehler vergleichen mit dem Zeitraum davor, sobald er erfasst ist: **Aktiv 24 Std.** (dazu gerade aktiv und seit Mitternacht), **Speicher** (Veränderung in 7 Tagen, mit Belegung des Datenträgers), **Zustellungen 7 Tage** (dazu aufgegebene), **KI-Tokens 14 Tage** (zur Vorwoche) und **Fehler 24 Std.** (5xx, zum Vortag, mit Fehlerquote). Jede Kachel springt zu ihrer Karte.
- **Diagramme**: über die volle Breite **Anfragen & Fehler** (5xx) – 1 Stunde, 24 Stunden oder 7 Tage, mit Anfragen pro Minute und p95-Antwortzeit –, darunter die Karten in zwei Spalten (auf schmalen Bildschirmen in einer): **Aktive Personen** je Stunde (7 Tage), **Anmeldungen** erfolgreich und fehlgeschlagen je Tag (14 Tage), **Abgewiesene Anfragen**, **Speicher** nach Art und die größten Arbeitsbereiche, **Zustellungen** (Webhooks, Push, E-Mail) je Tag und **KI-Nutzung** (Tokens je Tag und je Funktion). Jedes Diagramm zeigt beim Zeigen, Tippen oder mit den Pfeiltasten die Werte und hat **Als Tabelle**.
- **Warteschlangen**: was gerade auf Bearbeitung wartet – Suchindex, E-Mail-Warteschlange, Push-Zustellung, KI-Felder und KI-Suchindex, S3-Upload, Webhooks in Wiederholung.
- **Ereignisse**: Fehler, Warnungen und Hinweise der letzten 14 Tage, filterbar.
- **Schnellzugriff**: **Jetzt sichern**, **KI-Anbieter prüfen**, **Warnungen prüfen**, **Testwarnung**, der Weg zu Wartung & Hinweise und das Aktivitätsprotokoll als CSV.
- Darunter **Hintergrunddienste**, **Instanz in Zahlen** (Größe von Datenbank und Uploads, Versionen, Laufzeit, Demos …), **Warnungen per Webhook** und **Statistik**.
Im Einzelnen:
- **Abgewiesene Anfragen**: fehlgeschlagene Anmeldungen, Anfragen, die ein Limit mit 429 abgewiesen hat (Anmeldeversuche, Einladungen, KI, MCP, Formulare …), und anonyme Uploads über dem Tagesbudget (Formulare, Freigabelinks) – je Tag der letzten 14 Tage. Ein Anstieg deutet auf Angriffe oder zu knappe Grenzen. Die Zähler werden 35 Tage aufbewahrt und täglich aufgeräumt.
- **Hintergrunddienste**: letzter Lauf und letzter Fehler von Sicherung, Markdown-Export, KI-Hintergrundarbeit, Kalender- und Issue-Synchronisierung und LDAP-Abgleich; „aus“ heißt nicht eingerichtet.
- **Speicher**: Belegung nach Art und die größten Arbeitsbereiche mit Balken gegen das Kontingent (ab 80 % gelb, ab 95 % rot). Kontingente stellst du unter **Administration → Arbeitsbereiche** und **Administration → Grenzen & Aufbewahrung** ein.
- **Zustellungen**: zugestellte Webhooks, Push-Nachrichten und E-Mails je Tag; Wartendes, Aufgegebenes und die letzten Fehler stehen unter **Warteschlangen**. Von Webhook-Adressen erscheint nur der Host, nie Pfad oder Token.
### Statistik
Für die Diagramme zählt Flowplan Anfragen, Fehler und Antwortzeiten je Minute, aktive Personen je Stunde, Speicher je Tag und KI-Tokens je Funktion – nur Zahlen, ohne IP-Adressen, Pfade, Browserkennungen oder Namen. Wer aktiv war, steht nur für die laufende Stunde im Arbeitsspeicher, damit jede Person einmal zählt. Erfolgreiche Anmeldungen werden mit Zeitpunkt (ohne Person) gezählt. KI-Tokens stammen vom Anbieter, wo er sie meldet, sonst sind sie geschätzt (vier Zeichen je Token).
| Auflösung | Aufbewahrung |
| --- | --- |
| Minuten | 48 Stunden |
| Stunden | 35 Tage |
| Tage (Speicher, KI-Tokens) | 400 Tage |
Ausschalten lässt sich die Statistik unter **Administration → Überwachung → Statistik** (**Nutzungsstatistik erfassen**) oder für die ganze Instanz mit `FLOWPLAN_METRICS=off` (siehe [Konfiguration](/configuration#betrieb)); dann ist der Schalter gesperrt. **Statistik löschen** entfernt alle gezählten Anfragen, aktiven Personen, Speicherstände, KI-Tokens und erfolgreichen Anmeldungen; die Zähler der abgewiesenen Anfragen bleiben.
### Warnungen per Webhook
Unter **Administration → Überwachung → Warnungen per Webhook** trägst du eine `https://`-Adresse ein (mit `FLOWPLAN_WEBHOOK_ALLOW_PRIVATE=true` auch `http://` und interne Adressen) und wählst die Ereignisse:
| Ereignis | Wann |
| --- | --- |
| Backup fehlgeschlagen | Die letzte geplante Sicherung endete mit einem Fehler. |
| Speicher > 90 % | Ein Arbeitsbereich mit Kontingent ist zu mehr als 90 % belegt. |
| Worker-Fehler | Ein eingerichteter Hintergrunddienst meldete in den letzten 24 Stunden einen Fehler. |
| Viele fehlgeschlagene Anmeldungen | 50 oder mehr fehlgeschlagene Anmeldungen in einer Stunde. |
| Sicherheitsvorfälle | Sofort bei jedem neuen Vorfall der [Erkennungsregeln](/security-monitoring#erkennungsregeln) (`ops.security`, mit `rule` und `severity`). |
Flowplan prüft alle zehn Minuten und sendet je Ereignis höchstens **eine Nachricht pro Tag** als `POST` mit JSON:
```json
{ "event": "ops.storage_high", "title": "Speicher > 90 %", "detail": "Agentur: 93 %", "instance": "Flowplan", "url": "https://flowplan.example.org", "at": "2026-10-22T08:10:00.000Z" }
```
Die Kopfzeile `X-Flowplan-Signature: sha256=` ist mit dem angezeigten **Signaturschlüssel** gebildet, `X-Flowplan-Event` nennt das Ereignis. **Test senden** schickt sofort `ops.test`, **Jetzt prüfen** prüft außer der Reihe, **Neuer Schlüssel** erzeugt einen neuen Signaturschlüssel. Die letzten gesendeten Warnungen stehen mit Antwortcode darunter. Eine leere Adresse schaltet die Warnungen aus.
### Wartung & Hinweise
Unter **Administration → Wartung & Hinweise** stehen zwei Banner und die Banner zum Wegklicken. Der **Hinweis für alle Personen** – etwa „Ab Montag gilt die neue Ablage“ – bleibt, bis du das Feld leerst. Ein **Wartungshinweis** mit Text, Beginn und Ende erscheint ab dem Speichern allen angemeldeten Personen als Banner oben im Fenster – vor dem Beginn als „Geplante Wartung“, währenddessen als „Wartung läuft“, in Zeitzone und Sprache der jeweiligen Person. Nach dem Ende verschwindet er von selbst, auch in schon geöffneten Fenstern (sie fragen alle fünf Minuten nach). Jede Person kann den Hinweis für sich ausblenden. **Hinweis entfernen** nimmt ihn sofort zurück. Speichern und Entfernen stehen im Aktivitätsprotokoll.
#### Banner zum Wegklicken
Für Neuigkeiten, die jede Person nur einmal sehen soll – etwa „Flowplan gibt es jetzt als App“ oder euer Discord-Server –, legt **Neuer Banner** einen Banner an, den jede Person sieht, bis sie ihn schließt oder seinem Link folgt. Danach erscheint er für sie nie wieder, auf keinem Gerät; wer Flowplan das nächste Mal öffnet, sieht ihn oben im Fenster.
- **Inhalt:** optionale **Überschrift** (fett), **Text** (höchstens 300 Zeichen) und ein optionaler **Link** mit eigener Beschriftung – eine `https://`-Adresse (öffnet in einem neuen Tab) oder eine Seite dieser Instanz (`#…` oder `/…`). Die **Vorschau** zeigt ihn beim Schreiben.
- **Farbe:** Hinweis (blau), Werbung (Akzent), Neuigkeit (grün) oder Wichtig (gelb).
- **Wer und wo:** alle Personen oder nur Administratoren; überall oder **nur im Browser** – dann nicht in der Desktop-App und den Apps, etwa wenn er für die Apps wirbt.
- **Zeitraum:** optional **Ab** und **Bis**; ohne Angaben gilt er sofort und bis du ihn beendest.
- **Vorlagen** füllen das Formular für die Apps (Link zu flowplan.org/download, nur im Browser) oder für Discord vor.
Die Liste zeigt jeden Banner mit Zustand (wird angezeigt, geplant, pausiert, beendet) und wie viele ihn geschlossen haben und wie viele dem Link gefolgt sind. **Pausieren** blendet ihn aus, ohne die Zahlen zu verlieren; **Wieder anzeigen** zeigt ihn allen noch einmal, auch denen, die ihn schon geschlossen haben; **Löschen** entfernt ihn samt Zahlen sofort für alle. Höchstens drei Banner erscheinen gleichzeitig, die neuesten zuerst. Anlegen, Ändern und Löschen stehen im Aktivitätsprotokoll.
### Speicherübersicht
**Administration → Speicher & Sicherung** zeigt in den Karten **Sicherungen**, **Belegung** und **Inhalte**:
- ob der S3-Speicher erreichbar ist, wie lange die Prüfung dauerte und wie viele Dateien noch warten,
- was lokal und was im Bucket liegt: Dateien nach Art (Bilder, Videos, Dokumente …) und die Aufteilung der Datenbank,
- wie viele Arbeitsbereiche, Seiten, Datenbanken, Einträge, Whiteboards, Dateien, Konten und Kommentare es gibt.
## Prometheus
Mit `FLOWPLAN_METRICS_TOKEN` (mindestens 16 Zeichen) liefert `/api/metrics` Kennzahlen: Größen, Warteschlangen, Suchrückstand, Speicher und Kontingent je Arbeitsbereich, `flowplan_object_storage_pending` und `flowplan_build_info` mit Version und Commit.
```yaml
scrape_configs:
- job_name: flowplan
metrics_path: /api/metrics
authorization:
credentials:
static_configs:
- targets: ["flowplan:3000"]
```
Ohne gesetztes Token ist der Endpunkt abgeschaltet. Dasselbe Token schaltet die Details von `/api/health` frei (siehe oben).
> [!NOTE]
> **Für Lasttests:** `FLOWPLAN_METRICS_LOOP=1` misst zusätzlich die Verzögerung und Auslastung der Node-Event-Loop und die Zeit in SQLite und hängt sie an `/api/metrics` an. Die Werte gelten jeweils seit der letzten Abfrage – gedacht für einen einzelnen Abrufer wie das Lasttest-Skript, nicht für einen gemeinsam genutzten Prometheus. Standardmäßig aus.
---
# Sicherheit und Angriffserkennung
Welche sicherheitsrelevanten Ereignisse Flowplan festhält, wie es Angriffe erkennt und wie du sie in Logs, OpenTelemetry, fail2ban oder CrowdSec weitergibst.
## Sicherheit
Flowplan hält sicherheitsrelevante Ereignisse fest, erkennt typische Angriffe daran und gibt beides an deine eigenen Werkzeuge weiter. Alles läuft ohne Einrichtung; die Variablen unten sind nur für die Anbindung nach außen.
### Was festgehalten wird
- **Anmeldung:** erfolgreich, fehlgeschlagen, abgewiesen (Limit oder Sperre), von einem neuen Gerät
- **Konto:** Passwort geändert oder zurückgesetzt, Passkey hinzugefügt oder entfernt, Zwei-Faktor an oder aus, API-Token erstellt oder widerrufen, Sitzungen beendet, Konto gelöscht
- **Rechte:** Adminrechte vergeben oder entzogen (auch über SSO- oder LDAP-Gruppen bei der Anmeldung), Rollen, Einladungen, Konten durch Admins gesperrt oder zurückgesetzt
- **Freigaben und Daten:** Freigabelinks, veröffentlichte Seiten, alle Exporte und Sicherungen
- **Abgewehrtes:** Anfragen von fremder Herkunft, interne Adressen (SSRF), Skripte in eingereichten Inhalten, viele abgewiesene API-Anfragen einer Adresse
- **Administration:** LDAP, SCIM, Wiederherstellung, Erweiterungen, Domains, KI-Anbieter, Warnungen und weitere sicherheitsrelevante Einstellungen
**Datenschutz:** In der Datenbank steht von einer Adresse nur ihr Netz (IPv4 `/24`, IPv6 `/48`) und ein Hash mit einem Schlüssel der Instanz – genug zum Gruppieren und Sperren, nicht die Adresse selbst. Konten fehlgeschlagener Anmeldungen stehen nur maskiert da (`ma***@example.com`). Nach 90 Tagen werden die Ereignisse gelöscht (`FLOWPLAN_SECURITY_RETENTION_DAYS`).
### Administration → Angriffe & Vorfälle
Die Seite `/#admin/threats` (Gruppe **Sicherheit**) fasst zusammen und aktualisiert sich alle 30 Sekunden:
- **Zustand:** offene Vorfälle (kritische rot), Hinweise auf fehlende Anbindung, Kennzahlen der letzten 24 Stunden und die Anmeldungen je Stunde
- **Vorfälle** der Erkennungsregeln, mit Aktionen direkt daneben: erledigt, Adresse oder Netz 24 Stunden sperren, alle Sitzungen der Person beenden, Konto sperren. **Details & nächste Schritte** öffnet die eigene Seite eines Vorfalls (`/#admin/threats/incident/`): links, was passiert ist – warum die Regel angeschlagen hat (mit ihren Schwellen), Zeitraum, Herkunft und ob sie schon gesperrt ist, die probierten Konten, erfolgreiche Anmeldungen im selben Zeitraum (rot, wenn danach ein Konto übernommen sein könnte), Netze, Länder, Geräte und der Verlauf aller zugehörigen Ereignisse; beim Abtasten zusätzlich die abgefragten Pfade mit Antwort und Anzahl (IDs und Tokens ersetzt durch `:id`, `:n` und `:token`). Rechts steht, was der Vorfall bedeutet, wann er harmlos ist und was du Schritt für Schritt tun solltest – mit der passenden Aktion (Adresse sperren, Sitzungen beenden, Konto sperren, erledigt) oder dem Link dorthin direkt am Schritt.
- **Adressen mit Fehlversuchen**, **Ereignisse** mit Filtern (Schwere, Art) und Export als CSV oder JSON
- **Angemeldete Personen** (Admins zuerst), **offene Zugänge** (API-Tokens, Freigabelinks, öffentliche Seiten der ganzen Instanz) zum Widerrufen
- **Sperren** von Adressen und Netzen, befristet oder unbefristet. Gesperrte Adressen bekommen nur noch `403` – auch angemeldete Personen darin. Die eigene Adresse und das eigene Netz lassen sich nicht sperren.
Neue Vorfälle gehen an alle Instanz-Admins als Mitteilung der Art **Sicherheitsvorfälle der Instanz**. Wie, stellt jeder Admin selbst unter **Einstellungen → Benachrichtigungen** ein: die Kanäle (standardmäßig Posteingang, Push, E-Mail und Chat-Apps) und ob **alle Vorfälle** oder **nur kritische** ankommen; die Mitteilung führt direkt zur Seite des Vorfalls, und oben in der Liste der Vorfälle steht, wie du gerade benachrichtigt wirst. Ist unter **Überwachung → Warnungen per Webhook** ein Webhook eingerichtet, geht jeder Vorfall außerdem sofort dorthin (Ereignis `ops.security` mit `rule` und `severity`). Höchstens 30 Meldungen pro Stunde, damit ein Angriff niemanden flutet.
Wer sich mit einem Gerät anmeldet, das 90 Tage nicht dabei war, bekommt selbst einen Sicherheitshinweis – so fällt die Übernahme eines Kontos oft dem Konto selbst zuerst auf.
### Erkennungsregeln
| Regel | Auslöser | Schwere |
| --- | --- | --- |
| Passwort-Raten bei einem Konto | 10 Fehlversuche bei einem Konto in 15 Minuten | Warnung |
| Viele Fehlversuche von einer Adresse | 20 Fehlversuche von einer Adresse in 15 Minuten | Warnung |
| Viele Konten von einer Adresse | 5 verschiedene Konten von einer Adresse in 15 Minuten (Credential Stuffing) | kritisch |
| Anmeldung nach vielen Fehlversuchen | erfolgreiche Anmeldung nach 5 Fehlversuchen beim selben Konto | kritisch |
| Admin von neuem Gerät | ein Admin meldet sich mit einem Gerät an, das 90 Tage nicht dabei war | Warnung |
| Zwei Länder kurz nacheinander | Anmeldungen aus zwei Ländern innerhalb von 2 Stunden (braucht `FLOWPLAN_COUNTRY_HEADER`) | kritisch |
| Rechte geändert | Adminrechte, LDAP/SCIM, Wiederherstellung, Erweiterungen, Domains | kritisch |
| Verschlüsselungsschlüssel zurückgesetzt | ein Konto setzt seinen Schlüssel für [verschlüsselte Bereiche](/encrypted-spaces) zurück (Passphrase und Wiederherstellungsschlüssel verloren) – betrifft nur den eigenen Zugang zu diesen Bereichen | Warnung |
| Mehrere Schlüssel zurückgesetzt | 3 Konten setzen ihren Verschlüsselungsschlüssel innerhalb einer Stunde zurück | kritisch |
| Viele Exporte | mehr als 20 Exporte einer Person in einer Stunde (und weit über ihrem Üblichen) | Warnung |
| Abtasten | 60 abgewiesene API-Anfragen (401/403/404) einer Adresse in 10 Minuten | Warnung |
| Angriffe über Inhalte | 5 abgewehrte Skripte oder interne Adressen in einer Stunde | Warnung |
Gleiches innerhalb eines Tages zählt beim offenen Vorfall weiter, statt einen neuen zu öffnen.
### Logs (stdout, JSON)
Jedes Ereignis ist eine JSON-Zeile auf stdout – Docker, Loki, Elastic, Graylog oder Datadog sammeln sie ohne weiteres ein:
```json
{"ts":"2026-10-30T19:11:27.536Z","level":"warn","logger":"flowplan.security","event":"login.failure","severity":"warn","ip":"203.0.113.7","network":"203.0.113.0/24","subject":"ma***@example.com","device":"Chrome · macOS","detail":"password"}
```
Weitere Felder je nach Ereignis: `user` (Konto-ID), `country`. Die volle Adresse (`ip`) steht nur in dieser Zeile – für fail2ban und CrowdSec. `FLOWPLAN_SECURITY_LOG=anonymous` lässt sie weg, `=off` schreibt keine Zeilen.
### OpenTelemetry
Mit `OTEL_EXPORTER_OTLP_ENDPOINT` (oder `OTEL_EXPORTER_OTLP_LOGS_ENDPOINT`) schickt Flowplan die Ereignisse als OTLP-Logs (HTTP/JSON, `/v1/logs`) an deinen Collector, etwa Grafana Alloy, den OpenTelemetry Collector, Grafana Cloud, Honeycomb oder Datadog. Zugangsdaten in `OTEL_EXPORTER_OTLP_HEADERS` (`api-key=…,x-scope-orgid=…`), der Dienstname in `OTEL_SERVICE_NAME` (Standard `flowplan`). Die Felder der Log-Zeile kommen als Attribute `flowplan.*`.
### Prometheus
`/api/metrics` enthält dazu `flowplan_security_events_total{event,severity}`, `flowplan_security_incidents_open{rule,severity}` und `flowplan_security_blocks`. Eine Warnung in Prometheus oder Grafana:
```yaml
- alert: FlowplanSecurityIncident
expr: sum(flowplan_security_incidents_open{severity="critical"}) > 0
for: 1m
```
### fail2ban
Mit dem Logging-Treiber `journald` (`logging: { driver: journald }` im Compose-Service) liest fail2ban die Zeilen direkt:
```ini
# /etc/fail2ban/filter.d/flowplan.conf
[Definition]
failregex = "logger":"flowplan\.security","event":"login\.(failure|refused)","severity":"[a-z]+","ip":""
"logger":"flowplan\.security","event":"request\.probing","severity":"[a-z]+","ip":""
# /etc/fail2ban/jail.d/flowplan.conf
[flowplan]
enabled = true
backend = systemd
journalmatch = CONTAINER_NAME=flowplan
filter = flowplan
maxretry = 10
findtime = 10m
bantime = 1h
```
Sperrt fail2ban per Firewall vor dem Reverse-Proxy, kommt die Anfrage gar nicht erst an. Die Sperren in Flowplan selbst wirken auch hinter Cloudflare oder einem Proxy, den fail2ban nicht steuert.
### CrowdSec
Ein Parser für die Log-Zeilen und ein Szenario für Passwort-Raten (Beispiel; die Erfassung mit `labels: { type: flowplan }`):
```yaml
# parsers/s01-parse/flowplan.yaml
name: flowplan/flowplan-logs
description: "Flowplan security events"
filter: "evt.Line.Labels.type == 'flowplan'"
onsuccess: next_stage
nodes:
- filter: "UnmarshalJSON(evt.Line.Raw, evt.Unmarshaled, 'flowplan') in ['', nil] && evt.Unmarshaled.flowplan.logger == 'flowplan.security'"
statics:
- meta: log_type
expression: "'flowplan_' + replace(evt.Unmarshaled.flowplan.event, '.', '_')"
- meta: source_ip
expression: evt.Unmarshaled.flowplan.ip
# scenarios/flowplan-bf.yaml
type: leaky
name: flowplan/login-bf
description: "Flowplan password guessing"
filter: "evt.Meta.log_type in ['flowplan_login_failure', 'flowplan_login_refused']"
groupby: evt.Meta.source_ip
capacity: 10
leakspeed: 30s
blackhole: 5m
labels:
remediation: true
```
### Weitere Variablen
| Variable | Standard | Wirkung |
| --- | --- | --- |
| `FLOWPLAN_SECURITY_LOG` | `on` | `on` (mit Adresse), `anonymous` (ohne), `off` (keine Log-Zeilen) |
| `FLOWPLAN_SECURITY_RETENTION_DAYS` | `90` | Wie lange die Ereignisse in der Datenbank bleiben (mindestens 7) |
| `FLOWPLAN_COUNTRY_HEADER` | *leer* | Header des Proxys mit dem Land der Anfrage, z. B. `CF-IPCountry` hinter Cloudflare – schaltet die Regel „zwei Länder“ ein. Nur setzen, wenn der Proxy den Header selbst setzt. |
| `OTEL_EXPORTER_OTLP_ENDPOINT` | *leer* | OTLP-Collector für die Ereignisse (siehe oben) |
| `OTEL_EXPORTER_OTLP_LOGS_HEADERS` | `OTEL_EXPORTER_OTLP_HEADERS` | Header für den Collector, nur für die Logs: `api-key=abc,x-scope=flowplan` (kommagetrennt, Werte URL-kodiert). Ohne die Variable gilt `OTEL_EXPORTER_OTLP_HEADERS`. |
Voraussetzung für alles mit Adressen: Der Reverse-Proxy setzt `X-Forwarded-For` und `FLOWPLAN_TRUSTED_PROXIES` stimmt ([Konfiguration](/configuration)). Kommt keine Adresse an, zeigt die Seite einen Hinweis.
---
# PostgreSQL
Statt SQLite kann Flowplan eine PostgreSQL-Datenbank nutzen – wenn du ohnehin einen gepflegten Datenbankserver betreibst, mehr Personen gleichzeitig arbeiten oder du mehrere Instanzen im [Cluster-Modus](/cluster) laufen lassen willst.
## SQLite oder PostgreSQL?
**SQLite bleibt der Standard** und für die meisten Instanzen die beste Wahl: ein Container, ein Datenordner, nichts weiter zu betreiben. Eine einzelne Abfrage ist auf SQLite sogar schneller, weil sie im selben Prozess läuft.
PostgreSQL lohnt sich, wenn
- du einen Datenbankserver schon betreibst oder mietest (mit eigener Überwachung, Replikation und Point-in-Time-Recovery) und Flowplan dort einordnen willst,
- regelmäßig mehr als etwa 20 Personen **gleichzeitig** in Flowplan arbeiten (siehe [Dimensionierung](/sizing)),
- du mehrere Flowplan-Instanzen hinter einem Load Balancer betreiben willst – der [Cluster-Modus](/cluster) setzt PostgreSQL voraus.
Funktional gibt es keinen Unterschied: Alle Funktionen, die Suche und die Sicherungen arbeiten mit beiden Datenbanken. Wechseln kannst du jederzeit in beide Richtungen, siehe [Datenbank wechseln](/database-migration).
Auch mit PostgreSQL braucht Flowplan seinen Datenordner (`/app/data`): Dort liegen die hochgeladenen Dateien (ohne S3), `secrets.key`, die Push-Schlüssel und Zwischendateien von Sicherungen. Nur die Datenbank wandert nach PostgreSQL.
## Voraussetzungen
- **PostgreSQL 16 oder neuer**, eine leere Datenbank (oder ein leeres Schema) und eine Rolle, der sie gehört. Superuser-Rechte braucht Flowplan nicht – und sollte sie auch nicht haben, siehe [Rolle ohne Superuser-Rechte](#rolle-ohne-superuser-rechte).
- **Locale mit UTF-8**, etwa `en_US.utf8` oder `de_DE.utf8` – so ist es im offiziellen `postgres`-Image und bei den meisten verwalteten Diensten. Mit der Locale `C` findet die Suche chinesischen und japanischen Text zwar weiterhin richtig, aber deutlich langsamer.
- **Erweiterung `pg_trgm`** für die Volltextsuche. Sie gehört zu jedem normalen PostgreSQL und ist „trusted“: Flowplan installiert sie selbst in ein eigenes Schema `flowplan_ext`, wenn die Rolle in der Datenbank Objekte anlegen darf (`CREATE`-Recht, als Eigentümerin der Datenbank gegeben). Sonst einmal als Administrator: `CREATE EXTENSION pg_trgm;`. Ohne `pg_trgm` funktioniert die Suche weiter, durchsucht aber jedes Mal alle Einträge (das Log sagt das).
- **Optional `pgvector`** für die [semantische KI-Suche](/ai). Ab pgvector 0.8 installiert Flowplan sie selbst wie `pg_trgm`. **Vor 0.8** ist die Erweiterung nicht „trusted“ – dann führt ein Administrator in der Datenbank von Flowplan einmal `CREATE EXTENSION vector;` aus, und Flowplan nutzt sie ab dem nächsten Start. Ohne `pgvector` rechnet Flowplan die semantische Suche selbst, wie auf SQLite; abschalten lässt sie sich mit `FLOWPLAN_PGVECTOR=off`.
- **Für die Sicherungen** `pg_dump` und `pg_restore` mindestens in der Hauptversion des Servers. Das Docker-Image bringt die Werkzeuge von PostgreSQL 18 mit; sie sichern und spielen auf Servern von Version 16 bis 18 ein. Wer das [Image selbst baut](/installation#image-selbst-bauen), wählt die Version mit `--build-arg PG_CLIENT_MAJOR=18`. Ohne Docker das Paket `postgresql-client` passend installieren oder mit `FLOWPLAN_PG_BIN` auf den Ordner mit den Programmen zeigen.
```sql
-- als Administrator (Superuser) auf dem PostgreSQL-Server
CREATE ROLE flowplan LOGIN NOSUPERUSER NOCREATEDB NOCREATEROLE PASSWORD '';
CREATE DATABASE flowplan OWNER flowplan;
-- in der neuen Datenbank die Erweiterungen in ein eigenes Schema:
\c flowplan
CREATE SCHEMA IF NOT EXISTS flowplan_ext AUTHORIZATION flowplan;
CREATE EXTENSION IF NOT EXISTS pg_trgm SCHEMA flowplan_ext;
-- optional, für die semantische Suche (vor pgvector 0.8 nur so):
CREATE EXTENSION IF NOT EXISTS vector SCHEMA flowplan_ext;
```
### Rolle ohne Superuser-Rechte
Lass Flowplan mit einer Rolle verbinden, der die Datenbank gehört, die aber **kein Superuser** ist. Flowplan legt in seiner Datenbank Tabellen, Funktionen und Trigger an und ändert sie – dafür reicht die Eigentümerschaft. Ein Superuser dagegen kann Dateien auf dem Datenbankserver lesen und dort Programme starten (`COPY … TO PROGRAM`); eine Lücke in Flowplan oder ein Administrator, der sie ausnutzt, käme damit bis auf den Host.
Viele Images und Charts machen den eingestellten Benutzer zum Superuser – das offizielle `postgres`-Image etwa `POSTGRES_USER`. Lege dann wie oben eine eigene Rolle an. Die Erweiterungen installiert der Administrator am besten gleich mit, in das Schema `flowplan_ext`: Flowplan nutzt eine installierte Erweiterung dort, wo sie liegt, und legt `pg_trgm` (und `pgvector` ab 0.8) sonst selbst in `flowplan_ext` an. `pgvector` vor 0.8 kann nur ein Administrator installieren; ohne läuft die semantische Suche langsamer.
Eine bestehende Rolle, die Superuser ist, stuft ein anderer Superuser zurück:
```sql
-- einmalig, solange flowplan noch Superuser ist (als flowplan):
CREATE ROLE admin LOGIN SUPERUSER PASSWORD '';
-- dann als admin:
ALTER ROLE flowplan NOSUPERUSER NOCREATEROLE NOCREATEDB;
```
Datenbank und Tabellen gehören weiter `flowplan`, und die bisher installierten Erweiterungen bleiben nutzbar. Den Zugang `admin` hebst du für die Verwaltung auf; Flowplan braucht ihn nicht.
## Einrichten
PostgreSQL wählst du mit `DATABASE_URL`. Beginnt der Wert mit `postgres://` oder `postgresql://`, nutzt Flowplan PostgreSQL; fehlt er, bleibt es bei SQLite.
```dotenv
DATABASE_URL=postgres://flowplan:@db.example.internal:5432/flowplan
# mit TLS zum Datenbankserver:
# DATABASE_URL=postgres://flowplan:@db.example.internal:5432/flowplan?sslmode=require
```
Sonderzeichen im Passwort (`@`, `:`, `/`, `#` …) müssen in der Adresse prozentkodiert sein, z. B. `%40` für `@`.
Beim **ersten Start** legt Flowplan alle Tabellen, Indizes und Trigger selbst an. Bei jedem Update ergänzt es, was die neue Version braucht – es löscht nie etwas, und mehrere Instanzen stimmen sich dabei über eine Sperre ab. Ein Update geht also wie gewohnt: neues Image holen, Container neu starten.
### Mit Docker Compose
Ein Beispiel für einen einzelnen Container mit PostgreSQL daneben. Für `pgvector` statt `postgres:16` das Image `pgvector/pgvector:0.8.0-pg16` nehmen.
```yaml
services:
flowplan:
image: ghcr.io/yannicschuller/flowplan:latest
env_file: .env
environment:
FLOWPLAN_DATA_DIR: /app/data
DATABASE_URL: postgres://flowplan:${POSTGRES_PASSWORD}@postgres:5432/flowplan
ports:
- "127.0.0.1:3000:3000"
volumes:
- flowplan-data:/app/data
depends_on:
postgres:
condition: service_healthy
restart: unless-stopped
postgres:
image: postgres:16
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: ${POSTGRES_ADMIN_PASSWORD}
FLOWPLAN_DB_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- postgres-data:/var/lib/postgresql/data
- ./postgres-init.sh:/docker-entrypoint-initdb.d/10-flowplan.sh:ro
healthcheck:
test: ["CMD-SHELL", "pg_isready -h 127.0.0.1 -U flowplan -d flowplan"]
interval: 5s
retries: 20
restart: unless-stopped
volumes:
flowplan-data:
postgres-data:
```
`POSTGRES_PASSWORD` (das Passwort der Rolle `flowplan`) und `POSTGRES_ADMIN_PASSWORD` (das des Superusers `postgres` aus dem Image, nur für die Verwaltung) stehen in der `.env` neben der `compose.yaml` (je `openssl rand -hex 24`). Das Skript [`postgres-init.sh`](https://github.com/yannicschuller/flowplan/blob/main/deploy/compose/cluster/postgres-init.sh) aus dem Cluster-Beispiel legt beim ersten Start der Datenbank die Rolle `flowplan` ohne Superuser-Rechte an, gibt ihr die Datenbank `flowplan` und installiert die Erweiterungen in `flowplan_ext` – leg es neben die `compose.yaml`. Ein Volume aus einer älteren Fassung dieses Beispiels (`POSTGRES_USER: flowplan`) behält seine Rollen: Dort ist `flowplan` der Superuser, bis du ihn [zurückstufst](#rolle-ohne-superuser-rechte).
### Variablen
| Variable | Standard | Bedeutung |
| --- | --- | --- |
| `DATABASE_URL` | *leer* (SQLite) | Adresse der PostgreSQL-Datenbank, `postgres://…` oder `postgresql://…`. |
| `DATABASE_SESSION_URL` | `DATABASE_URL` | Eigene Verbindung für Benachrichtigungen, die Leitung im Cluster und `pg_dump`/`pg_restore`/`psql` – nur nötig, wenn `DATABASE_URL` auf PgBouncer im Modus `transaction` zeigt ([unten](#pgbouncer)). |
| `FLOWPLAN_PG_SCHEMA` | `public` | Schema innerhalb der Datenbank, falls Flowplan sich die Datenbank mit anderem teilt. Wird angelegt, wenn es fehlt. |
| `FLOWPLAN_PG_POOL` | `10` | Verbindungen je Instanz (1–500). |
| `FLOWPLAN_PG_STATEMENT_TIMEOUT` | `120000` | Höchstdauer einer Abfrage in Millisekunden; `0` = kein Limit. |
| `FLOWPLAN_PG_LOCK_TIMEOUT` | `10000` | So lange wartet eine Abfrage höchstens auf eine Sperre (ms). |
| `FLOWPLAN_PG_IDLE_TX_TIMEOUT` | `60000` | Eine Transaktion, die so lange nichts tut, wird beendet (ms). |
| `FLOWPLAN_PG_CONNECT_TIMEOUT` | `30000` | So lange wartet eine Anfrage auf eine freie Verbindung aus dem Pool (ms). |
| `FLOWPLAN_PG_PREPARE` | an | `off` schickt jede Abfrage ohne Namen statt als benanntes Prepared Statement – für PgBouncer im Modus `transaction` vor 1.21 oder ohne `max_prepared_statements`. |
| `FLOWPLAN_PG_SCHEMA_AUTO` | an | `off`: Die Instanz legt das Schema nicht selbst an oder aktualisiert es – das übernimmt ein eigener Schritt (`node /app/scripts/db-schema.mjs`, siehe [Cluster-Modus](/cluster#schema-vor-dem-start)). |
| `FLOWPLAN_PGVECTOR` | an | `off` nutzt `pgvector` nicht, auch wenn es installiert ist. |
| `FLOWPLAN_BACKUP_FORMAT` | `pg_dump` | `sqlite`: geplante Sicherungen im portablen SQLite-Format statt mit `pg_dump` (unten). |
| `FLOWPLAN_PG_BIN` | *leer* | Ordner mit `pg_dump`, `pg_restore` und `psql`, wenn sie nicht im `PATH` liegen. |
| `PGCONNECT_TIMEOUT` | `15` | So viele Sekunden warten `pg_dump`, `pg_restore` und `psql` höchstens auf die Verbindung zum Server (die Variable von libpq). |
Alle Variablen stehen auch kommentiert in der [`.env.example`](https://github.com/yannicschuller/flowplan/blob/main/.env.example) des Repositorys.
Lange Arbeiten wie Sicherungen, Wiederherstellungen und Schema-Änderungen heben die Zeitlimits für sich selbst auf.
**Verbindungen:** Jede Instanz öffnet bis zu `FLOWPLAN_PG_POOL` Verbindungen und bis zu zwei eigene (Benachrichtigungen, im Cluster die Wahl der leitenden Instanz). `max_connections` des Servers muss also mindestens `Instanzen × (FLOWPLAN_PG_POOL + 2)` plus Reserve für Sicherungen und Administration betragen. Der PostgreSQL-Standard von 100 reicht für eine Instanz mit dem Standardpool bequem.
## Suche auf PostgreSQL
Die Suche liefert auf PostgreSQL dieselben Treffer in derselben Reihenfolge wie auf SQLite: Teile von Wörtern („plan“ in „Projektplanung“), chinesischer und japanischer Text ohne Leerzeichen, Umlaute und Akzente, Titel vor Text, dieselben Ausschnitte. Technisch arbeitet sie mit Trigramm-Indizes aus `pg_trgm`.
> [!NOTE]
> **Erster Start nach dem Update oder Wechsel:** Flowplan baut die beiden Suchindizes beim Öffnen der Datenbank. Auf großen Instanzen kann das einige Minuten dauern; so lange antwortet die Instanz noch nicht. Gib Healthchecks entsprechend Zeit (`start_period`, `startupProbe`). Danach füllt sich der Index im Hintergrund – die Suche funktioniert schon und findet mit der Zeit mehr.
Den Suchindex komplett neu aufbauen, etwa nach dem Einspielen von `pg_trgm` oder wenn Treffer fehlen:
```bash
docker compose exec flowplan node /app/scripts/db-search-rebuild.mjs
```
Das Skript liest `DATABASE_URL` und `FLOWPLAN_PG_SCHEMA` aus der Umgebung des Containers; die laufende Instanz indexiert danach alles neu (Seiten, Einträge, Kommentare, Nachrichten und Dateien). Auf SQLite funktioniert derselbe Befehl.
## Sicherungen mit pg_dump
Auf PostgreSQL schreiben die **geplante Sicherung** und **Jetzt sichern** (Administration → Speicher & Sicherung) ein Archiv von `pg_dump` im Custom-Format: `flowplan-2026-11-07-03-00.dump`, mit `FLOWPLAN_ENCRYPTION_KEY` verschlüsselt als `.dump.enc`. Sonst bleibt alles wie bei SQLite:
- Ziele: S3 unter `/backups/`, [SFTP](/storage-and-backups#sicherung-per-sftp) oder der Datenordner – mit derselben Aufbewahrung und demselben [verzögerten Löschen](/storage-and-backups#verzoegertes-loeschen) der Dateien.
- [Verschlüsselung](/storage-encryption#verschluesselung) wie gehabt; `decrypt.mjs` entschlüsselt auch `.dump.enc`.
- Das Archiv enthält nur das Schema von Flowplan, ohne Suchindex und `pgvector`-Tabelle – beide baut Flowplan nach dem Einspielen neu auf. Es ist dadurch kleiner und lässt sich auch auf einem Server ohne `pg_trgm` oder `pgvector` einspielen.
- `pg_dump` läuft außerhalb von Flowplan und belastet die Instanz kaum.
**Ausweichen auf SQLite:** Fehlt ein passendes `pg_dump` (zu alt oder nicht installiert), schreibt die geplante Sicherung stattdessen eine portable SQLite-Datei (`flowplan-….sqlite`) und vermerkt das im Log. Mit `FLOWPLAN_BACKUP_FORMAT=sqlite` ist das immer so. Eine solche Datei lässt sich auf SQLite **und** PostgreSQL einspielen.
Die **Instanzsicherung** (Administration → Speicher & Sicherung → Gesamte Instanz → Herunterladen) enthält die Datenbank immer im portablen SQLite-Format und lässt sich deshalb auf beiden Datenbanken wiederherstellen. Litestream läuft mit PostgreSQL nicht – für eine laufende Sicherung mit beliebigem Zeitpunkt nutze die Mittel deines Datenbankservers (WAL-Archivierung, Point-in-Time-Recovery des Anbieters).
### Wiederherstellen
- **Ein `pg_dump`-Archiv auf einer laufenden Instanz** (`flowplan-….dump`, `.dump.enc`): unter **Administration → Speicher & Sicherung → Aus Sicherung wiederherstellen** hochladen. Flowplan prüft es sofort und spielt es beim nächsten Neustart ein – im Cluster-Modus die leitende Instanz, siehe [Grenzen](/cluster#grenzen). Nur die Datenbank wird ersetzt; die Dateien bleiben, wie sie sind.
- **Auf einer neuen Instanz** mit PostgreSQL geht dasselbe auf dem Einrichtungsbildschirm: hochladen oder aus S3 bzw. per SFTP holen, wie unter [Beim Einrichten wiederherstellen](/storage-and-backups#beim-einrichten-wiederherstellen).
- Eine Instanz mit SQLite lehnt solche Archive ab – dafür gibt es die Instanzsicherung oder den [Wechsel der Datenbank](/database-migration).
- Flowplan prüft das Archiv vorher (eine Flowplan-Datenbank, nicht aus einer neueren Version), ersetzt dann das ganze Schema in einer Transaktion und baut den Suchindex neu. Aus dem Archiv kommen dabei nur die Daten der Tabellen von Flowplan; Tabellen, Funktionen und Trigger legt die laufende Version selbst an. Ältere Archive passen so in die aktuellen Tabellen.
- Enthält das Archiv Objekte, die Flowplan nicht selbst anlegt – eigene Funktionen, Views, Trigger oder Regeln im Schema von Flowplan –, lehnt Flowplan es ab: „Die Sicherung enthält Datenbankobjekte, die Flowplan nicht selbst anlegt (etwa Funktionen oder Trigger), und wird deshalb nicht wiederhergestellt.“ Eigene Objekte gehören in ein anderes Schema; das sichert `pg_dump` von Flowplan nicht mit. Der vorherige Stand bleibt als `pre-restore-/flowplan.dump` im Datenordner – plane dafür Platz für ein weiteres Archiv ein. Schlägt das Einspielen fehl, kommt der vorherige Stand zurück.
- Ein Archiv aus einem anderen Schema (`FLOWPLAN_PG_SCHEMA`) lässt sich ebenfalls einspielen.
- **Die Instanzsicherung** (ZIP) stellst du wie bisher an derselben Stelle wieder her; sie passt auf beide Datenbanken.
## PgBouncer
Flowplan hält seine Verbindungen selbst im Pool; eine direkte Verbindung zum Server ist der einfachste Weg. PgBouncer davor sollte so funktionieren – mit einem echten PgBouncer getestet ist es bisher nicht:
- **Benannte Prepared Statements:** Flowplan nutzt sie standardmäßig. Im Modus `transaction` braucht PgBouncer dafür Version 1.21 oder neuer mit `max_prepared_statements` größer als `0`. Sonst `FLOWPLAN_PG_PREPARE=off` setzen: Flowplan schickt dann jede Abfrage ohne Namen (kostet rund ein Drittel des Durchsatzes).
- **Eine eigene Sitzung für Benachrichtigungen, Leitung und Sicherungen:** `LISTEN`, die Sperre der leitenden Instanz im Cluster und `pg_dump`, `pg_restore` und `psql` brauchen eine Verbindung, die ihnen allein gehört. Sie nutzen `DATABASE_SESSION_URL` – zeig damit direkt auf den Server oder auf einen Pool im Modus `session`. Ohne die Variable nehmen sie `DATABASE_URL`.
- **Startparameter `options`:** Flowplan übergibt Schema (`search_path`) und Zeitlimits beim Verbindungsaufbau als `options`. Lehnt PgBouncer das ab, hilft `ignore_startup_parameters = options` – dann muss das Schema `public` sein, und die Zeitlimits setzt du an der Rolle (`ALTER ROLE flowplan SET statement_timeout = '120s'` usw.).
```dotenv
# Pool über PgBouncer im Modus transaction, eigene Sitzungen direkt zum Server
DATABASE_URL=postgres://flowplan:@pgbouncer:6432/flowplan
DATABASE_SESSION_URL=postgres://flowplan:@postgres:5432/flowplan
# nur ohne max_prepared_statements bzw. vor PgBouncer 1.21:
# FLOWPLAN_PG_PREPARE=off
```
## Weiter
- [Datenbank wechseln](/database-migration): von SQLite zu PostgreSQL und zurück.
- [Cluster-Modus](/cluster): mehrere Instanzen mit Redis und S3.
- [Dimensionierung](/sizing): wie viele Personen eine Instanz trägt.
---
# Datenbank wechseln: SQLite und PostgreSQL
Mit dem mitgelieferten Werkzeug ziehst du eine Instanz von SQLite nach PostgreSQL um – oder zurück. Die Ausfallzeit ist das Kopieren selbst, meist wenige Minuten; jede Tabelle wird danach Zeile für Zeile verglichen.
## Wie es abläuft
Das Werkzeug `db-migrate.mjs` liegt im Docker-Image unter `/app/scripts/` (im Quellcode unter `scripts/`). Es kopiert alle Tabellen von der Quelle in ein leeres Ziel und vergleicht danach jede Tabelle anhand der Zeilenzahl und einer Prüfsumme über alle Werte. Die Quelle bleibt dabei unverändert – darum ist der Weg zurück jederzeit möglich, solange niemand im Ziel weitergearbeitet hat.
Nicht kopiert, sondern beim ersten Start neu aufgebaut werden der Suchindex und die `pgvector`-Tabelle. Die KI-Embeddings selbst werden kopiert; die semantische Suche braucht danach also keine neuen Aufrufe beim KI-Anbieter.
Die **Dateien** zieht das Werkzeug nicht um, sie bleiben, wo sie sind: im Ordner `uploads/` des Datenordners oder im S3-Bucket. Behalte deshalb denselben Datenordner (dasselbe Volume) bzw. dieselben `S3_*`-Werte. Auch `secrets.key` und `web-push-keys.json` bleiben im Datenordner und werden weiter gebraucht.
Grob dauert das Kopieren eine Sekunde je einige zehntausend Zeilen; Dokumente und Embeddings machen den größten Teil aus. Dazu kommt der erste Start mit dem Aufbau des Suchindex (siehe [Suche auf PostgreSQL](/postgresql#suche-auf-postgresql)).
## Von SQLite zu PostgreSQL
Die Befehle gehen von der Installation mit Docker Compose aus (Dienst `flowplan`, Volume auf `/app/data`) und von einem PostgreSQL, das der Container unter dem Namen `postgres` erreicht. Ersetze `` und die Adresse durch deine Werte.
::: steps
1. **Gleiche Version.** Aktualisiere Flowplan auf die Version, die danach laufen soll, und starte es einmal. Das Werkzeug lehnt eine Datenbank aus einer anderen Version ab.
2. **Ziel vorbereiten:** eine leere Datenbank auf PostgreSQL 16 oder neuer und eine Rolle, der sie gehört – siehe [Voraussetzungen](/postgresql#voraussetzungen), dort auch zu `pg_trgm` und `pgvector`.
3. **Sichern:** **Administration → Speicher & Sicherung → Gesamte Instanz → Herunterladen**. Bewahre die Datei auf, bis die neue Instanz läuft.
4. **Flowplan stoppen** – das Werkzeug liest nur dann einen stimmigen Stand, wenn niemand schreibt:
```bash
docker compose stop flowplan
```
5. **Kopieren und prüfen:**
```bash
docker compose run --rm --no-deps --entrypoint node flowplan \
/app/scripts/db-migrate.mjs \
--from sqlite:/app/data/flowplan.sqlite \
--to postgres://flowplan:@postgres:5432/flowplan
```
Die Ausgabe zeigt den Fortschritt je Tabelle und am Ende eine Tabelle mit Zeilenzahl und den Prüfsummen von Quelle und Ziel. Die letzte Zeile lautet `verified: every table has the same rows` (Exit-Code 0). Bei `DIFFERENCES found` (Exit-Code 1) sind die betroffenen Tabellen mit `DIFFERENT` markiert; noch nutzt niemand das Ziel – Ursache beheben, Zieldatenbank leeren und neu starten.
6. **Umstellen:** In der `.env` `DATABASE_URL=postgres://flowplan:@postgres:5432/flowplan` setzen (und `FLOWPLAN_PG_SCHEMA`, falls nicht `public`). Datenordner und `S3_*`-Werte bleiben, wie sie sind.
7. **Starten und prüfen:**
```bash
docker compose up -d
```
Anmelden, eine Seite öffnen, etwas suchen (der Index füllt sich in Sekunden bis Minuten) und unter **Administration → Überwachung → System** nachsehen, dass dort **PostgreSQL** steht.
8. **Aufräumen, aber nicht sofort:** Die alte `flowplan.sqlite` bleibt im Datenordner liegen und wird ignoriert, solange `DATABASE_URL` gesetzt ist. Lösche sie erst, wenn die erste geplante Sicherung der neuen Instanz gelaufen ist.
:::
Mit S3: Litestream läuft mit PostgreSQL nicht mehr; die geplanten Sicherungen werden zu `pg_dump`-Archiven ([Sicherungen mit pg_dump](/postgresql#sicherungen-mit-pg-dump)). Die alte Litestream-Kopie unter `/db/` im Bucket kannst du später löschen.
Ohne Docker Compose geht dasselbe mit `docker run` – Volume und Netzwerk des Containers mitgeben:
```bash
docker run --rm --network -v flowplan-data:/app/data --entrypoint node \
ghcr.io/yannicschuller/flowplan:latest /app/scripts/db-migrate.mjs \
--from sqlite:/app/data/flowplan.sqlite \
--to postgres://flowplan:@postgres:5432/flowplan
```
## Von PostgreSQL zu SQLite
Derselbe Weg in der anderen Richtung. Die Zieldatei darf noch nicht existieren – liegt im Datenordner noch eine `flowplan.sqlite` aus der Zeit vor PostgreSQL, schiebe sie zuerst beiseite.
::: steps
1. Gleiche Version auf beiden Seiten, Instanzsicherung herunterladen (wie oben).
2. Flowplan stoppen: `docker compose stop flowplan`.
3. Eine alte SQLite-Datei beiseitelegen:
```bash
docker compose run --rm --no-deps --entrypoint sh flowplan -c \
'mkdir -p /app/data/sqlite-old && for f in /app/data/flowplan.sqlite*; do [ -e "$f" ] && mv "$f" /app/data/sqlite-old/; done; true'
```
4. Kopieren und prüfen:
```bash
docker compose run --rm --no-deps --entrypoint node flowplan \
/app/scripts/db-migrate.mjs \
--from postgres://flowplan:@postgres:5432/flowplan \
--to sqlite:/app/data/flowplan.sqlite
```
5. `DATABASE_URL` (und `FLOWPLAN_PG_SCHEMA`) aus der `.env` entfernen, dann `docker compose up -d` und prüfen wie oben.
6. Mit S3: Litestream sichert die neue Datei ab dem Start wieder laufend. Liegt im Bucket unter `/db/` noch eine Kopie aus der Zeit vor PostgreSQL, lösche oder verschiebe sie vor dem Start – sonst könnte ein späteres Wiederherstellen aus dem Bucket bei diesem alten Stand landen.
:::
Die PostgreSQL-Datenbank bleibt unverändert; behalte sie, bis die erste geplante Sicherung der SQLite-Instanz gelaufen ist.
## Optionen des Werkzeugs
| Option | Bedeutung |
| --- | --- |
| `--from`, `--to` | Quelle und Ziel: `sqlite:` auf der einen, `postgres://…` auf der anderen Seite. |
| `--schema ` | Schema in PostgreSQL (Standard `public`; wird angelegt, wenn es fehlt). Gehört zu `FLOWPLAN_PG_SCHEMA`. |
| `--verify-only` | Nichts kopieren, nur Zeilenzahlen und Prüfsummen beider Seiten vergleichen. |
| `--batch ` | Zeilen je Lesevorgang (Standard 1000). |
| `--quiet` | Keine Fortschrittszeilen. |
Was das Werkzeug ablehnt: eine Quelle aus einer anderen Flowplan-Version, eine Zieltabelle, die schon Zeilen enthält, eine Zieldatei, die schon existiert, und Werte, die nicht in die PostgreSQL-Spalte passen (SQLite nimmt in jeder Spalte alles an) – dann mit der betroffenen Zeile.
## Nachprüfen
Solange noch niemand in der neuen Instanz gearbeitet hat, kannst du den Vergleich jederzeit wiederholen:
```bash
docker compose run --rm --no-deps --entrypoint node flowplan \
/app/scripts/db-migrate.mjs --verify-only \
--from sqlite:/app/data/flowplan.sqlite \
--to postgres://flowplan:@postgres:5432/flowplan
```
Je Tabelle stehen Zeilenzahl und die Prüfsummen von Quelle und Ziel nebeneinander. Die Prüfsumme hängt nicht von der Reihenfolge ab und vergleicht die Werte so, wie beide Datenbanken sie speichern.
## Zurück, falls etwas schiefgeht
- **Vor dem ersten Arbeiten in der neuen Instanz:** Flowplan stoppen, die Einstellung zurücknehmen (`DATABASE_URL` entfernen bzw. wieder setzen) und starten. Die Quelle ist unverändert.
- **Wenn schon gearbeitet wurde:** in die Gegenrichtung umziehen (Abschnitt oben), damit nichts verloren geht.
- **Notfalls:** die heruntergeladene Instanzsicherung unter **Administration → Speicher & Sicherung → Aus Sicherung wiederherstellen** oder auf dem Einrichtungsbildschirm einspielen – sie passt auf beide Datenbanken.
Ist ein Kopiervorgang abgebrochen, setzt das Werkzeug nicht fort: Zieldatenbank leeren (bzw. die angefangene Datei löschen) und neu beginnen.
## Suchindex neu aufbauen
Nach dem Wechsel baut Flowplan den Suchindex beim ersten Start von selbst neu auf. Von Hand geht es so:
```bash
docker compose exec flowplan node /app/scripts/db-search-rebuild.mjs
```
Mit `DATABASE_URL` in der Umgebung betrifft es PostgreSQL, sonst die SQLite-Datei im Datenordner (`--sqlite ` für eine andere).
## Andere Wege
- Die **Instanzsicherung** (ZIP) und das [Umzugswerkzeug](/move-instance) übertragen die Datenbank im portablen SQLite-Format und lassen sich auf SQLite wie auf PostgreSQL einspielen. Für einen Umzug auf einen anderen Server samt Wechsel der Datenbank ist das oft der bequemere Weg.
- Für den [Cluster-Modus](/cluster) müssen die Dateien vorher im S3-Bucket liegen – siehe dort.
---
# Cluster-Modus
Im Cluster-Modus bedienen mehrere Flowplan-Instanzen eine Installation: eine PostgreSQL-Datenbank, ein Redis, ein S3-Bucket und beliebig viele Instanzen hinter einem Load Balancer – für mehr gleichzeitig aktive Personen und Updates ohne Unterbrechung.
## Brauchst du ihn?
Für die meisten Teams nicht: Ein einzelner Container trägt mit SQLite etwa 20, mit PostgreSQL etwa 30 gleichzeitig aktive Personen (siehe [Dimensionierung](/sizing)). Der Cluster-Modus lohnt sich, wenn regelmäßig mehr Personen gleichzeitig arbeiten oder wenn Flowplan bei Updates und beim Ausfall eines Servers weiterlaufen soll. Er bringt dafür drei Dienste mit, die du betreiben (oder mieten) und sichern musst.
## Voraussetzungen
Eingeschaltet wird er mit `FLOWPLAN_CLUSTER=1`. Dann sind Pflicht:
| Was | Variable | Wofür |
| --- | --- | --- |
| **PostgreSQL** 16+ | `DATABASE_URL=postgres://…` | Alle Daten. SQLite ist eine Datei auf einem Host und geht nicht. Siehe [PostgreSQL](/postgresql). |
| **Redis** (getestet mit 7) | `REDIS_URL=redis://…` oder `rediss://…` (TLS) | Live-Bearbeitung, Präsenz und Rate-Limits zwischen den Instanzen. Nichts davon muss Redis dauerhaft speichern. |
| **S3-Speicher** | `S3_BUCKET`, `S3_ENDPOINT`, `S3_ACCESS_KEY_ID`, `S3_SECRET_ACCESS_KEY` | Alle Dateien; der lokale Ordner `uploads/` ist nur noch ein Zwischenspeicher. Siehe [Speicher, S3 und Sicherung](/storage-and-backups). |
Fehlt eines davon, startet eine Instanz nicht und nennt im Log alle Probleme auf einmal. `REDIS_URL` ohne Cluster-Modus wird mit einer Warnung ignoriert.
Ebenfalls Pflicht – auch hier startet eine Instanz ohne sie nicht: **Schlüssel, die auf allen Instanzen gleich sind.** Ein einzelner Container legt manche Schlüssel selbst im Datenordner an – im Cluster hat jede Instanz ihren eigenen Ordner, und jede würde andere erzeugen. Setze deshalb überall dieselben Werte:
- `FLOWPLAN_ENCRYPTION_KEY` oder `FLOWPLAN_SECRETS_KEY` (oder ihre Varianten `…_FILE`, etwa für Docker-Secrets) – sonst kann eine Instanz gespeicherte Geheimnisse und Signaturen der anderen nicht lesen (Zwei-Faktor-Anmeldung, KI-Schlüssel, entsperrte Freigabelinks). Siehe [Gespeicherte Geheimnisse](/configuration-storage#gespeicherte-geheimnisse).
- `WEB_PUSH_PUBLIC_KEY` und `WEB_PUSH_PRIVATE_KEY` (ein VAPID-Schlüsselpaar, z. B. aus `npx web-push generate-vapid-keys`) – sonst passen Push-Abos nur zu einer Instanz. Siehe [Push-Benachrichtigungen](/configuration-ai-push#push-benachrichtigungen).
Kommst du von einem einzelnen Container ohne diese Variablen, übernimm die Werte aus seinem Datenordner, damit gespeicherte Geheimnisse und Push-Abos gültig bleiben: den Inhalt von `secrets.key` als `FLOWPLAN_SECRETS_KEY` (zusätzlich zu einem `FLOWPLAN_ENCRYPTION_KEY`, beide werden gelesen) und `publicKey`/`privateKey` aus `web-push-keys.json` als `WEB_PUSH_PUBLIC_KEY`/`WEB_PUSH_PRIVATE_KEY`.
## Was die Instanzen teilen
- **Live-Bearbeitung und Präsenz:** Änderungen an Dokumenten, Datensätzen und Whiteboards, Cursor und „wer ist gerade hier“ gehen über Redis an alle Instanzen. Zwei Personen auf verschiedenen Instanzen arbeiten also gemeinsam wie auf einer. Die Daten selbst stehen in PostgreSQL; geht eine Nachricht verloren, holt der Browser den Stand beim nächsten Abgleich nach. **Sticky Sessions braucht es nicht.**
- **Rate-Limits:** Grenzen etwa für KI-Anfragen zählen über alle Instanzen (über Redis). Grenzen, die schon in der Datenbank stehen (fehlgeschlagene Anmeldungen, Demos, MCP), galten ohnehin für alle.
- **Aufgaben der leitenden Instanz:** Genau eine Instanz ist jeweils die leitende (bestimmt über eine Sperre in PostgreSQL). Nur sie erledigt die zeitgesteuerten Aufgaben: Erinnerungen, Automationen, Seitenprüfungen, Suchindex, Texterkennung von Dateien, Aufräumen und Aufbewahrung, Zusammenfassungen, geplante Sicherungen und Markdown-Exporte, LDAP-, Kalender- und Issue-Abgleich, E-Mail-Eingang, Telegram, KI-Hintergrundarbeit und die Warnungen der Überwachung. Fällt sie aus, übernimmt innerhalb weniger Sekunden eine andere.
- **Warteschlangen:** E-Mails, Push, Webhooks und Chat-Apps verschickt jede Instanz; jede Nachricht wird genau einmal von einer Instanz übernommen.
- **Dateien:** Eine hochgeladene Datei landet zuerst im Zwischenspeicher der Instanz, die sie angenommen hat, und diese lädt sie sofort in den Bucket (meist in deutlich unter einer Sekunde). Andere Instanzen holen sie bei Bedarf aus dem Bucket und warten dafür bis zu 5 Sekunden.
## Gesundheit, Bereitschaft und Herunterfahren
| Adresse | Antwortet | Gedacht für |
| --- | --- | --- |
| `/api/health/live` | `200`, solange der Prozess antwortet – ohne Datenbank-Prüfung, denn ein Neustart behebt keinen Datenbankausfall | Liveness-Probe |
| `/api/health/ready` | `200`, wenn Datenbank, Redis und Bucket erreichbar sind; sonst `503`, ebenso beim Herunterfahren | Readiness-Probe, Load Balancer |
| `/api/health` | wie bisher, siehe [Healthcheck](/operations#healthcheck) | Docker-Healthcheck, Apps |
Ohne Token antwortet `/api/health/ready` nur mit `ok`/`error` je Prüfung; mit `FLOWPLAN_METRICS_TOKEN` als Bearer-Token kommen Antwortzeiten und Fehlermeldungen dazu.
Welche Prüfungen über die Bereitschaft entscheiden, legt `FLOWPLAN_READY_REQUIRE` fest – eine Liste aus `database`, `redis` und `objectStorage`, Standard: alle drei. Die Datenbank zählt immer. Fällt Redis aus, werden mit dem Standard alle Instanzen zugleich „nicht bereit“, und der Load Balancer hat nichts mehr. Mit `FLOWPLAN_READY_REQUIRE=database,objectStorage` bleiben sie bereit: Bearbeiten und Speichern funktionieren weiter, nur Live-Änderungen zwischen den Instanzen kommen erst beim nächsten Abgleich an, und Rate-Limits zählt jede Instanz für sich.
**Herunterfahren:** Auf `SIGTERM` meldet die Instanz sofort `503` auf `/api/health/ready`, schließt die Live-Verbindungen (die Browser verbinden sich über den Load Balancer mit einer anderen Instanz), beantwortet offene Anfragen, gibt die Leitung ab und meldet sich bei den anderen ab. Gib ihr dafür 30 Sekunden (`stop_grace_period`, `terminationGracePeriodSeconds`).
## Schema vor dem Start
Jede Instanz bringt das Datenbankschema beim Start selbst auf ihren Stand (unter einer Sperre, sie warten aufeinander). Sauberer ist ein eigener Schritt vor dem Start der Instanzen, der bei einem Fehler laut abbricht:
```bash
DATABASE_URL=postgres://… node /app/scripts/db-schema.mjs
```
Dann `FLOWPLAN_PG_SCHEMA_AUTO=off` für die Instanzen setzen. Das Docker-Compose-Beispiel und das Helm-Chart machen es so. Das Schema wird nur ergänzt, nie verkleinert: Während eines Rolling Updates laufen alte und neue Instanzen nebeneinander.
## Docker Compose
Ein vollständiges Beispiel liegt unter [`deploy/compose/cluster`](https://github.com/yannicschuller/flowplan/tree/main/deploy/compose/cluster): PostgreSQL 16, Redis 7 mit Passwort und ohne Speicherung, MinIO als S3 samt Bucket-Anlage, der Schema-Schritt, zwei Flowplan-Instanzen und Caddy als Load Balancer. Es ist zum Ausprobieren auf einem Host gedacht und ein Ausgangspunkt; für den Betrieb gehören Datenbank, Redis und Speicher auf eigene, gesicherte Dienste.
```bash
git clone https://github.com/yannicschuller/flowplan.git
cd flowplan/deploy/compose/cluster
cp .env.example .env # jeden Wert „change-me“ ersetzen
docker compose up -d
```
Darin:
- `.env` enthält `APP_URL`, `FLOWPLAN_SETUP_TOKEN` und die Passwörter für PostgreSQL (`POSTGRES_PASSWORD` und `POSTGRES_ADMIN_PASSWORD`), Redis und MinIO – nur Platzhalter, die du ersetzt. Pflicht sind außerdem `FLOWPLAN_ENCRYPTION_KEY`, `WEB_PUSH_PUBLIC_KEY` und `WEB_PUSH_PRIVATE_KEY` – in der `.env.example` leer; ohne sie bricht `docker compose up` mit einem Hinweis ab (siehe [Voraussetzungen](#voraussetzungen)).
- Der Dienst `schema` läuft einmal vor den Instanzen (`node /app/scripts/db-schema.mjs`); die Instanzen haben `FLOWPLAN_PG_SCHEMA_AUTO=off`.
- `flowplan-1` und `flowplan-2` haben je ein eigenes Volume als Zwischenspeicher, `FLOWPLAN_PG_POOL=20` und einen Healthcheck auf `/api/health/ready`. Mehr Instanzen: den Dienst `flowplan-2` kopieren und im `Caddyfile` ergänzen.
- Caddy verteilt reihum auf bereite Instanzen (Health-Check auf `/api/health/ready`) und reicht Live-Verbindungen ungepuffert durch (`flush_interval -1`). Für HTTPS `:8080` im `Caddyfile` durch deinen Hostnamen ersetzen.
- PostgreSQL läuft mit `max_connections=200`. Flowplan verbindet sich als Rolle `flowplan`, der die Datenbank gehört, die aber kein Superuser ist: `POSTGRES_PASSWORD` ist ihr Passwort, `POSTGRES_ADMIN_PASSWORD` das des Superusers `postgres` aus dem Image, nur für die Verwaltung. Beim ersten Start der Datenbank legt `postgres-init.sh` die Rolle an und installiert `pg_trgm` (und `pgvector`, wenn das Image es hat) in `flowplan_ext`. Ein Volume aus einer älteren Fassung des Beispiels behält seine Rollen – dort ist `flowplan` noch Superuser, bis du ihn [zurückstufst](/postgresql#rolle-ohne-superuser-rechte).
Ein anderer Load Balancer (nginx, Traefik, HAProxy) braucht dasselbe: Health-Check auf `/api/health/ready`, keine Pufferung für Server-Sent Events (`/api/documents/live` und die Cursor-Kanäle), lange Lese-Timeouts, Uploads bis 110 MB und `FLOWPLAN_TRUSTED_PROXIES` passend zur Zahl der Proxys.
## Kubernetes (Helm)
Das Chart unter [`deploy/helm/flowplan`](https://github.com/yannicschuller/flowplan/tree/main/deploy/helm/flowplan) hat den Cluster-Modus eingebaut (`cluster.enabled=true`). PostgreSQL, Redis und S3 legt es nicht an – nimm verwaltete Dienste oder eigene Charts. Die Verbindungsadressen stehen nur in Secrets, die du selbst anlegst:
```bash
kubectl create namespace flowplan
kubectl -n flowplan create secret generic flowplan-cluster \
--from-literal=DATABASE_URL='postgres://flowplan:@postgres:5432/flowplan' \
--from-literal=REDIS_URL='redis://:@redis-master:6379/0'
kubectl -n flowplan create secret generic flowplan-env \
--from-literal=S3_ACCESS_KEY_ID='' \
--from-literal=S3_SECRET_ACCESS_KEY=''
# die Schlüssel, die alle Pods teilen (Push-Schlüssel: npx web-push generate-vapid-keys)
kubectl -n flowplan create secret generic flowplan-keys \
--from-literal=FLOWPLAN_ENCRYPTION_KEY="$(openssl rand -base64 32)" \
--from-literal=WEB_PUSH_PUBLIC_KEY='<öffentlicher VAPID-Schlüssel>' \
--from-literal=WEB_PUSH_PRIVATE_KEY=''
helm install flowplan deploy/helm/flowplan -n flowplan \
--set appUrl=https://flowplan.example.org \
--set existingSecret=flowplan-env \
--set cluster.enabled=true \
--set cluster.replicas=3 \
--set cluster.database.existingSecret=flowplan-cluster \
--set cluster.redis.existingSecret=flowplan-cluster \
--set cluster.keys.existingSecret=flowplan-keys \
--set s3.bucket=flowplan --set s3.endpoint=https://s3.example.org
```
Was das Chart im Cluster-Modus tut:
- **Schema-Job** als `pre-install`/`pre-upgrade`-Hook (`node /app/scripts/db-schema.mjs`), bevor Pods einer neuen Version starten. Ohne ihn (`cluster.migration.enabled=false`) erledigen die Pods das beim Start.
- **Rolling Updates** ohne Unterbrechung (`maxUnavailable: 0`), ein **PodDisruptionBudget** (`cluster.podDisruptionBudget.minAvailable`, Standard 1) und Pods möglichst auf verschiedenen Knoten.
- **Probes:** Liveness auf `/api/health/live`, Readiness auf `/api/health/ready`; vor dem Stoppen wartet ein Pod `cluster.preStopSeconds` (5), damit der Load Balancer ihn herausnimmt.
- **Kein Volume:** `/app/data` ist ein `emptyDir` je Pod (`cluster.cacheSizeLimit`, 5 Gi); Dateien liegen im Bucket, Sicherungen macht PostgreSQL (`pg_dump`).
- **Datenbankrolle:** Die Rolle in `DATABASE_URL` sollte die Datenbank besitzen, aber kein Superuser sein. Viele PostgreSQL-Charts machen ihren Benutzer zum Superuser – lege dann eine eigene Rolle an, siehe [Rolle ohne Superuser-Rechte](/postgresql#rolle-ohne-superuser-rechte).
- **Verbindungen:** `cluster.poolSize` (10) je Pod plus zwei eigene; `replicas × (poolSize + 2)` muss unter `max_connections` des Servers bleiben.
- **Gemeinsame Schlüssel:** Aus dem Secret in `cluster.keys.existingSecret` bekommt jeder Pod `FLOWPLAN_ENCRYPTION_KEY`, `WEB_PUSH_PUBLIC_KEY` und `WEB_PUSH_PRIVATE_KEY`. Heißen die Schlüssel im Secret anders, nennst du sie mit `cluster.keys.encryptionKey`, `cluster.keys.webPushPublicKey` und `cluster.keys.webPushPrivateKey`. Bewahre eine Kopie des Verschlüsselungsschlüssels getrennt von den Sicherungen auf.
- Das Chart verweigert die Installation, wenn Datenbank, Redis, Bucket oder `cluster.keys.existingSecret` fehlen.
Mit ingress-nginx für die Live-Verbindungen die Annotationen `nginx.ingress.kubernetes.io/proxy-buffering: "off"` und `nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"` setzen, für Uploads `nginx.ingress.kubernetes.io/proxy-body-size: 110m`. Alle Werte erklärt das README des Charts.
## Administration → Überwachung → System
Der Abschnitt **System** unter **Administration → Überwachung** zeigt, wie die Installation läuft:
- **Betriebsart** (einzelner Container oder Cluster mit Zahl der Instanzen), **Datenbank** mit Version und Erreichbarkeit,
- **Verbindungen dieser Instanz** (offen, frei, wartend) und die **Zeitlimits**,
- **Redis** mit Version und gesendeten, empfangenen und fehlgeschlagenen Nachrichten, **Objektspeicher** mit Bucket und Erreichbarkeit,
- die **leitende Instanz** und seit wann sie leitet,
- die **gemeinsamen Warteschlangen** (Dateien, E-Mail, Push, Webhooks, Chat-Apps),
- im Cluster eine Tabelle aller **Instanzen** mit Status (leitend, bereit, fährt herunter), belegten und wartenden Verbindungen, Arbeitsspeicher und letzter Meldung. Eine Instanz, die sich 30 Sekunden nicht meldet, verschwindet aus der Liste.
„Wartend“ bei den Verbindungen heißt: Anfragen warten auf eine freie Datenbankverbindung – mehr `FLOWPLAN_PG_POOL` oder mehr Instanzen.
## Weitere Variablen
| Variable | Standard | Bedeutung |
| --- | --- | --- |
| `FLOWPLAN_CLUSTER` | *leer* | `1` (oder `true`, `on`) schaltet den Cluster-Modus ein. Gleichwertig: `FLOWPLAN_MODE=cluster`. |
| `REDIS_URL` | *leer* | `redis://:@host:6379/0`, mit TLS `rediss://…`. Benutzer, Passwort und Datenbanknummer stehen in der Adresse. |
| `FLOWPLAN_READY_REQUIRE` | `database,redis,objectStorage` | Prüfungen, die über `/api/health/ready` entscheiden (oben). |
| `FLOWPLAN_INSTANCE_ID` | Hostname + Zufall | Name der Instanz in der Übersicht und in `application_name` der Datenbankverbindungen. Das Helm-Chart nimmt den Pod-Namen. |
| `FLOWPLAN_REDIS_PREFIX` | `flowplan:` | Präfix für Schlüssel und Kanäle, wenn sich mehrere Installationen ein Redis teilen. |
| `FLOWPLAN_LEADER_INTERVAL` | `5000` | Wie oft (ms) die Instanzen die Leitung prüfen; bestimmt, wie schnell eine ausgefallene leitende Instanz ersetzt wird. |
## Workflows im Cluster
Die Schritte von [Workflows](/workflows) stehen in einer Warteschlange in der Datenbank. Jede Instanz holt sich fällige Schritte mit einer **Lease** (2 Minuten); ein Fencing-Token sorgt dafür, dass eine Instanz, deren Lease abgelaufen ist, nichts mehr festschreibt. Fällt eine Instanz aus, übernimmt eine andere ihre Schritte nach Ablauf der Lease. Neue Schritte wecken die anderen Instanzen über Redis; ohne Bus prüfen sie im Takt. Zeitpläne und Datums-Auslöser laufen nur auf der Leader-Instanz und genau einmal je Termin. `FLOWPLAN_WORKFLOW_WORKERS` legt fest, wie viele Schritte eine Instanz gleichzeitig ausführt.
## Grenzen
- **Dateien lädt die Instanz hoch, die sie angenommen hat.** Bis dahin – normalerweise deutlich unter einer Sekunde – warten andere Instanzen bis zu 5 Sekunden. Einige Wege lesen den lokalen Ordner direkt (Exporte und Archive, manche Importe, Kopien beim Veröffentlichen) und können eine gerade auf einer anderen Instanz hochgeladene Datei noch verpassen. Fällt eine Instanz aus, bevor sie hochgeladen hat, ist die Datei verloren.
- **Wiederherstellen und Instanzumzug mit einer Instanz.** Eine hochgeladene Sicherung liegt im Zwischenspeicher der Instanz, die sie angenommen hat, und wird erst eingespielt, wenn diese leitet. Das Einspielen ersetzt alle Tabellen in einer Transaktion; Anfragen anderer Instanzen warten so lange und schlagen nach `FLOWPLAN_PG_LOCK_TIMEOUT` fehl. Im Kubernetes geht ein `emptyDir` beim Neustart verloren. Daher: vorher auf **eine Instanz** herunterskalieren (`cluster.replicas=1` bzw. nur `flowplan-1`), wiederherstellen, dann wieder hochskalieren. Dasselbe gilt für das [Umzugswerkzeug](/move-instance).
- **Redis ist ein Single Point:** Fällt es aus, funktionieren Bearbeiten und Speichern weiter, aber Live-Änderungen zwischen den Instanzen kommen erst beim nächsten Abgleich an, Rate-Limits zählt jede Instanz für sich, und mit dem Standard von `FLOWPLAN_READY_REQUIRE` werden alle Instanzen „nicht bereit“ (oben).
- **Kein Redis Sentinel und kein Redis Cluster:** Flowplan spricht mit genau einer Redis-Adresse. Ein verwalteter Redis mit fester Adresse funktioniert.
- **Pro Instanz** bleiben die Fortschrittsanzeigen von Wiederherstellen und Umzug sowie die Rückstandszahlen des Suchindex.
## Weiter
- [Dimensionierung](/sizing): wie viele Instanzen und welche Hardware.
- [Datenbank wechseln](/database-migration): eine bestehende Instanz nach PostgreSQL bringen. Für den Cluster vorher S3 im einzelnen Container einschalten und warten, bis alle Dateien im Bucket sind (**Administration → Speicher & Sicherung**, oder `objectStorage.pending` auf `0` unter [`/api/health`](/operations#healthcheck)).
---
# Dimensionierung
Wie viele Personen eine Flowplan-Instanz trägt, was zuerst knapp wird und welche Hardware du für kleine, mittlere und große Teams einplanen solltest – auf Grundlage der Lasttests.
## Aktive Personen statt Konten
Entscheidend ist nicht, wie viele Konten eine Instanz hat, sondern wie viele Personen **im selben Moment** arbeiten: Seiten öffnen, tippen, suchen, Einträge ändern. Ein Konto, das gerade nichts tut, kostet den Server nichts.
Die Zahlen unten zählen **aktive Personen** so, wie der Lasttest sie nachstellt: Jede schickt im Schnitt alle 1,5 Sekunden eine Anfrage oder tippt ununterbrochen in einem gemeinsam bearbeiteten Dokument. Echte Menschen lesen, denken nach und wechseln die Anwendung – sie erzeugen deutlich weniger Last. Die Zahlen sind deshalb eine vorsichtige Grenze: Eine Instanz, die 20 solche Personen trägt, kommt mit spürbar mehr echten gleichzeitig angemeldeten Personen zurecht.
Wie viele bei dir gleichzeitig aktiv sind, zeigt die Administration: **gerade aktiv** in der Übersicht und das Diagramm **Aktive Personen** je Stunde unter **Administration → Überwachung** (siehe [Betrieb](/monitoring#administration-ueberwachung)). Nimm die Spitzen, nicht den Durchschnitt.
## Was eine Instanz trägt
Gemessen wurde bis zur ersten Laststufe, ab der es langsamer wird: 95 % der lesenden Anfragen über 500 ms, der schreibenden über 1 s oder mehr als 1 % Fehler. „Trägt“ ist die Stufe davor.
| Aufbau | Trägt etwa | Hinweis |
| --- | ---: | --- |
| Einzelner Container mit SQLite | 20 aktive Personen | Ein Prozess, keine weiteren Dienste |
| PostgreSQL, 1 Instanz mit einem eigenen Kern | 30 aktive Personen | Darüber steigen die Lesezeiten steil an |
| PostgreSQL, 2 Instanzen mit je einem Kern (Cluster) | 40–50 aktive Personen | Bei 60 noch ohne Fehler, aber langsam |
Die **Faustregel** für die Planung: **25–30 aktive Personen je Instanz mit einem eigenen CPU-Kern.** Für mehr Personen weitere Instanzen im [Cluster-Modus](/cluster) – das wächst etwa linear, solange PostgreSQL Luft hat. Eine Instanz nutzt für die eigentliche Arbeit im Wesentlichen einen Kern (Node.js); mehr Kerne pro Instanz helfen vor allem bei Nebenarbeiten wie der Texterkennung, mehr Instanzen bei mehr Personen.
Gemessen auf 4 vCPU (Intel Xeon, 2,1 GHz) mit 16 GB RAM, PostgreSQL 16 und Redis 7 auf demselben Rechner. Auf einem Server, auf dem nichts anderes läuft, und mit schnelleren Kernen sind die Zahlen höher.
## Was zuerst knapp wird
- **Die CPU der Instanz** – und zwar beim Lesen: das Laden der Seitenleiste mit der Rechteprüfung Seite für Seite, das Öffnen großer Datenbanken (alle Einträge) und die Suche. Diese Anfragen werden zuerst langsam.
- **Schreiben und Live-Bearbeitung bleiben lange schnell.** Bei 60 aktiven Personen auf zwei Instanzen kamen Änderungen am Dokument (95 %) in 182 ms durch, und die Änderung einer Person erreichte die Mitbearbeitenden auf der anderen Instanz über Redis in 195 ms.
- **PostgreSQL** war im Test nicht der Engpass: Schreibende Anfragen blieben überall unter 500 ms.
Woran du es im Betrieb merkst: Unter **Administration → Überwachung** steigt die Antwortzeit (p95), ein Kern der Instanz läuft dauerhaft voll, und im Abschnitt **System** stehen bei den Verbindungen Anfragen auf „wartend“.
## Empfehlungen
Richtwerte für gleichzeitig aktive Personen in der Spitze. Plane Arbeitsspeicher für Importe, Exporte und die Texterkennung gescannter PDFs großzügig ein.
| | Klein | Mittel | Groß |
| --- | --- | --- | --- |
| Gleichzeitig aktiv | bis etwa 20 | etwa 20–60 | mehr als 60 |
| Aufbau | ein Container mit SQLite | [PostgreSQL](/postgresql), ein Container – ab etwa 30 aktiven Personen oder für Updates ohne Unterbrechung als [Cluster](/cluster) mit 2–3 Instanzen | Cluster mit einer Instanz je 25 aktiven Personen, plus eine Reserve |
| Flowplan | 2 vCPU, 2–4 GB RAM | je Instanz 1–2 vCPU, 2 GB RAM | je Instanz 1–2 vCPU, 2 GB RAM |
| Datenbank | SQLite auf lokaler SSD (kein NFS) | PostgreSQL mit 2 vCPU, 4 GB RAM, SSD | PostgreSQL mit 4+ vCPU, 8+ GB RAM, SSD, eigener Server oder verwalteter Dienst |
| Weitere Dienste | optional S3 | im Cluster: Redis (klein, ohne Speicherung), S3 | Redis, S3 |
**Datenbankverbindungen:** `FLOWPLAN_PG_POOL` je Instanz auf 10–20 setzen und `max_connections` von PostgreSQL auf mindestens `Instanzen × (FLOWPLAN_PG_POOL + 2)` plus Reserve. Beispiel: 4 Instanzen mit Pool 20 brauchen 88 Verbindungen; mit Reserve passen `max_connections=150`.
**Reserve einplanen:** Im Cluster mindestens eine Instanz mehr, als die Last braucht – bei einem Update oder dem Ausfall eines Knotens tragen die übrigen weiter.
## Selbst messen
Die Lasttests liegen im Quellcode unter [`scripts/loadtest`](https://github.com/yannicschuller/flowplan/blob/main/scripts/loadtest/README.md): für einen einzelnen Container und für den Cluster-Modus (`scripts/load-test-cluster.mjs`, 1, 2 … Instanzen gegen PostgreSQL und Redis). Am aussagekräftigsten ist eine Messung auf der Hardware, auf der Flowplan laufen soll.
> [!WARNING]
> Nie gegen eine Instanz messen, die Menschen nutzen: Der Test legt Hunderte Konten, Seiten und Tausende Einträge an und bremst die Instanz für alle aus. Eine frische, eigene Instanz nehmen und danach löschen.