Files
ink-notes/README.de.md
T
haraldandClaude Opus 5.5 1643303b47 feat: view-only mode (Issue #35)
A 👁 button below the notebooks hides the tools. Pen, finger and mouse
then only scroll and zoom (the pen glides on like a finger), editing
shortcuts are ignored, Page Down no longer appends pages, and selection,
text box and ruler are closed when entering the mode.

The toolbar size estimate now includes the measured frame overhead and
can shrink buttons to 26 px, so the extra button still fits at 768 px.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 09:20:34 +02:00

255 lines
18 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<p align="center">
<img src="assets/ink-notes-banner.svg" alt="ink-notes Banner" width="100%">
</p>
<p align="center">
<strong>Eine moderne Notizbuch-App fĂŒr Linux zum Schreiben mit Stift, Touch und Maus</strong><br>
Geschrieben in <strong>Rust</strong> mit <strong>wgpu</strong>, <strong>winit</strong> und <strong>egui</strong>.
</p>
<p align="center"><a href="README.md">English</a> · <strong>Deutsch</strong></p>
---
ink-notes speichert Handschrift als Vektoren, erkennt auf Wunsch Formen, kann PDFs zum Beschriften importieren, Bilder und Textfelder einfĂŒgen und alles wieder als PDF, PNG oder SVG exportieren. Gespeichert wird automatisch im Hintergrund.
Getestet wird vor allem unter Zorin OS 18 / Ubuntu 24.04 (Wayland und X11).
Die OberflĂ€che gibt es auf Deutsch und Englisch; ink-notes folgt der Systemsprache, umstellen lĂ€sst sie sich im ☰-MenĂŒ unter „Sprache / Language“.
---
## Funktionen
### Schreiben und Zeichnen
- **Vier Stifte** in der Werkzeugleiste, jeder mit eigener Farbe und StĂ€rke (0,15–5 mm, mit DruckstĂ€rke). Ändert man Farbe oder StĂ€rke, merkt sich der gewĂ€hlte Stift das – auch ĂŒber einen Neustart hinweg. **Textmarker** (halbtransparent, 4–8 mm) in vier Farben; innerhalb eines Strichs wird er nicht dunkler, erst ein neuer Strich deckt stĂ€rker.
- **Eigene Farben:** Jede Farbe in der Werkzeugleiste (Stifte, Textmarker, Text) lĂ€sst sich anpassen – gewĂ€hlte Farbe erneut antippen, eine Vorgabe oder mit 🎹 einen freien Farbton wĂ€hlen. Die Leiste merkt sich die Farben. Am Bildschirm erscheinen sie genauso wie im PDF- und Bildexport.
- **GlĂ€ttung in zwei Stufen:** WĂ€hrend des Schreibens glĂ€ttet ein 1€-Filter das Zittern, die Linie erscheint sofort. Beim Absetzen wird der Strich nachbearbeitet: Ecken (Knicke ĂŒber 65°) bleiben erhalten und werden rund verbunden, der Druckverlauf wird geglĂ€ttet, ĂŒberflĂŒssige Punkte entfallen, die Enden werden rund.
- **Druckkurve** im ☰-MenĂŒ an den eigenen Stift anpassen (weicher/hĂ€rter, Schwelle gegen Grundrauschen).
- **Tasten am Stift** im ☰-MenĂŒ belegen: Radieren (Standard), AuswĂ€hlen, Textmarker, Stift oder nichts – gilt, solange die Taste gedrĂŒckt ist. Jede Taste erscheint dort nach dem ersten DrĂŒcken.
- **Radierer** in drei Modi: ganze Striche, nur den ĂŒberstrichenen Teil (Teilstrich) oder nur Textmarker. Die StiftrĂŒckseite radiert ebenfalls.
- **Virtuelles Lineal** (`L`): verschieben, am Griff drehen (rastet bei 15° ein); Striche entlang einer Kante werden gerade.
- **Nur ansehen** (👁 in der Werkzeugleiste): Stift, Finger und Maus scrollen und zoomen nur; die Werkzeuge verschwinden, nichts lĂ€sst sich versehentlich Ă€ndern. Erneut 👁 tippen, um zu schreiben.
- **Platz schaffen** (↕ in der Werkzeugleiste): aufs Blatt tippen und nach unten ziehen – alles darunter rutscht mit, auch auf den folgenden Seiten. Was ĂŒber ein Seitenende rutschen wĂŒrde, beginnt auf der nĂ€chsten Seite; fehlende Seiten werden angehĂ€ngt. Nach oben ziehen schließt leeren Platz. Ein Schritt fĂŒr RĂŒckgĂ€ngig.
### Formerkennung
- **Formen-Werkzeug** (`S`/`F`) oder **Halten** am Strichende (ĂŒber 400 ms stillhalten): Die Skizze wird durch eine saubere Form in der Breite des gewĂ€hlten Stifts bzw. Textmarkers ersetzt.
- Erkannt werden Linien, Pfeile, Kreise, Ellipsen, Rechtecke, Dreiecke, Rauten, Vielecke, Koordinatensysteme (L-Form), Achsenkreuze (ein „+“ in einem Zug oder zwei gekreuzte Geraden, Pfeilspitzen an allen vier Enden) und Oktaeder (Skizze als 3D-Körper).
- Die Erkennung arbeitet rein geometrisch (BogenlĂ€nge, Douglas-Peucker, Kreis-Fit), ohne Machine Learning. Nicht alles wird erkannt – was nicht passt, bleibt Handschrift.
### AuswÀhlen und Bearbeiten
- **Auswahlwerkzeug** (`V`): antippen oder Rahmen aufziehen, dann verschieben, an den Ecken skalieren, am Griff drehen oder mit `R` um 90° drehen. Funktioniert mit Maus, Finger und Stift.
- Auswahl ĂŒber die Palette **umfĂ€rben**, **kopieren/einfĂŒgen** (`Strg + C/V`), **löschen** (`Entf`).
- `Strg + C` legt die Auswahl zusĂ€tzlich als Bild in die Zwischenablage, z. B. fĂŒr Chat oder Mail.
- **RĂŒckgĂ€ngig/Wiederholen** (`Strg + Z/Y`) fĂŒr alle Änderungen, je Seite.
### Text, Bilder und PDFs
- **Text-Werkzeug** (`T`): ins Blatt tippen und schreiben – normale oder Code-Schrift (feste Zeichenbreite, Tab rĂŒckt ein), 8–36 pt, Zeilenumbruch am Feldrand. Vorhandenen Text antippen zum Ändern, `Esc` beendet. Textfelder lassen sich wie Bilder verschieben, drehen und skalieren. In anderen Programmen kopierter Text wird mit `Strg + V` zum Textfeld.
- **Bilder** (PNG, JPEG, GIF, WebP, BMP) ĂŒber `Strg + I`, aus der Zwischenablage oder per Ziehen ins Fenster einfĂŒgen.
- **EinfĂŒgen per Finger:** Lange (œ s) mit dem Finger aufs Blatt drĂŒcken öffnet ein MenĂŒ „EinfĂŒgen“ – Screenshot, kopierter Text oder kopierte Objekte landen genau an dieser Stelle.
- **PDF importieren** (☰-MenĂŒ): Jede PDF-Seite wird eine Notizbuchseite mit der PDF-Seite als Hintergrund. Hochformat-Seiten werden DIN A4, Querformat-Seiten (z. B. Folien) bekommen eine Querformat-Seite ohne leeren Streifen darunter. Beim Hineinzoomen werden PDF-Seiten schĂ€rfer nachgerendert.
### Seiten und Ansicht
- **HintergrĂŒnde:** blanko, kariert (5 mm), liniert (7,5 mm), Punktraster (5 mm). Die **Farbe von Karos, Linien und Punkten** ist wĂ€hlbar (hell, mittel, krĂ€ftig, blau, grĂŒn) und gilt auch im Export.
- **Papierfarbe** der Anzeige: weiß, creme, dunkelgrau, schwarz; auf dunklem Papier werden dunkle Stiftfarben auf Wunsch aufgehellt. Gespeichert und exportiert wird immer auf weißem Papier.
- **Durchgehendes Scrollen, endlose FlĂ€che oder feste Seiten, je Notizbuch:** Beim Anlegen wĂ€hlbar (Vorgabe: durchgehend; oder endlos), im ☰-MenĂŒ umschaltbar – dort auch auf feste Seiten (Seite fĂŒr Seite blĂ€ttern mit Pfeilen in der Werkzeugleiste). Durchgehend hĂ€ngen die Seiten lĂŒckenlos untereinander, eine dunkle Linie markiert die Grenze; schnelles Wischen gleitet nach, und mit der Bildlaufleiste am Rand gegenĂŒber der Werkzeugleiste springt man samt Seitenzahl durch lange PDFs; wer im unteren FĂŒnftel der letzten Seite schreibt, bekommt automatisch eine neue Seite. Endlos ist eine einzige FlĂ€che ohne Rand, auf der man in alle Richtungen schreibt; der PDF-Export enthĂ€lt nur den beschriebenen Bereich.
- **Seiten einfĂŒgen und löschen:** ➕ in der Werkzeugleiste fĂŒgt nach der aktuellen Seite eine leere Seite ein. Löschen im ☰-MenĂŒ (mit RĂŒckfrage); die zuletzt gelöschte Seite lĂ€sst sich dort wiederherstellen, solange die App lĂ€uft.
- **Zoom** von 25 % bis 1000 % (`Strg + Mausrad`, zwei Finger, `Strg + +/-/0`), Verschieben mit mittlerer Maustaste, `Leertaste + Ziehen` oder einem Finger.
- **Seiten** anhĂ€ngen oder direkt nach der aktuellen Seite einfĂŒgen, **Seitentitel** vergeben; die SeitenĂŒbersicht zeigt Vorschaubilder oder ein Inhaltsverzeichnis. Seitentitel werden im PDF zu Lesezeichen.
- **Werkzeugleiste** links oder rechts andocken (fĂŒr Links- und RechtshĂ€nder).
### NotizbĂŒcher und Speichern
- Mehrere **NotizbĂŒcher** anlegen, umbenennen, wechseln und löschen (gelöschte landen zunĂ€chst im Papierkorb und lassen sich wiederherstellen).
- **Ordner** fĂŒr NotizbĂŒcher, beliebig verschachtelt (z. B. 3. Semester â€ș Mathe): anlegen, umbenennen, löschen (der Inhalt rĂŒckt eine Ebene nach oben) und NotizbĂŒcher wie Ordner (samt Inhalt) mit 📂 verschieben. Neue NotizbĂŒcher landen im gerade geöffneten Ordner.
- **Automatisches Speichern** im Hintergrund: 1,5 Sekunden nach der letzten Änderung, bei ununterbrochenem Schreiben spĂ€testens alle 10 Sekunden. Zeichnen wird dabei nicht unterbrochen.
- Jede Datei wird erst vollstĂ€ndig in eine temporĂ€re Datei geschrieben und dann ersetzt – ein Absturz beim Speichern hinterlĂ€sst keine halbe Datei.
- **Beim Schließen** (Fenster oder `Strg + Q`) und beim Wechsel des Notizbuchs wird alles Ausstehende geschrieben, bevor es weitergeht. SchlĂ€gt das fehl, bleibt die App offen und bietet Wiederholen oder eine Notfall-Sicherung an.
- `Strg + S` speichert sofort. Der Punkt am ☰-Knopf zeigt den Stand: grĂŒn = gespeichert, orange = Änderungen warten, gelb = speichert gerade, rot = Fehler.
### Export
- **PDF** (`Strg + E`) nach `~/Documents/<Titel>.pdf`: Striche und Formen als Vektoren, Textfelder als echter, durchsuchbarer Text, importierte PDF-Seiten als Vektor-Unterlage, Seitentitel als Lesezeichen.
- **Einzelne Seite** als PNG (mit oder ohne Hintergrund) oder SVG ĂŒber das ☰-MenĂŒ.
### EingabegerÀte
- Stifte ĂŒber das Tablet-Protokoll von Wayland bzw. X11 (Druck, StiftrĂŒckseite, Seitentaste).
- Solange der Stift aufliegt oder in der NĂ€he ist, werden BerĂŒhrungen mit der Hand ignoriert.
- Finger: standardmĂ€ĂŸig scrollen und zoomen; Zeichnen mit dem Finger lĂ€sst sich im ☰-MenĂŒ einschalten.
### Updates
- Die App prĂŒft auf neue Versionen auf Gitea und installiert sie auf Wunsch. Installiert wird nur, wenn die Minisign-Signatur und die SHA-256-PrĂŒfsumme stimmen (Details unten).
- Als Flatpak sucht ink-notes nicht selbst nach Updates; die kommen dann ĂŒber die Software-Verwaltung (`flatpak update`).
---
## Installation
Pakete gibt es unter [Releases](https://gitea.pansi.eu/harald/ink-notes/releases) als `.deb` und `.AppImage` (x86_64). `<version>` steht fĂŒr die Versionsnummer, z. B. `0.11.0`.
```bash
# Debian-Paket (Zorin OS 18 / Ubuntu 24.04)
sudo apt install ./ink-notes_<version>_amd64.deb
# oder AppImage
chmod +x ink-notes_<version>_x86_64.AppImage
./ink-notes_<version>_x86_64.AppImage
```
Hinweise:
- Benötigt `glibc >= 2.39` (Ubuntu 24.04, Zorin OS 18) und einen Grafiktreiber mit Vulkan oder OpenGL.
- Meldet das AppImage einen Fehler zu `libfuse.so.2`, entweder `sudo apt install libfuse2t64` installieren oder mit `--appimage-extract-and-run` starten.
---
## TastenkĂŒrzel
| Aktion | Taste / Geste |
| :--- | :--- |
| Zeichnen | Stiftspitze, linke Maustaste (Finger, wenn eingeschaltet) |
| Radieren | `E` umschalten, rechte Maustaste, StiftrĂŒckseite oder Seitentaste |
| Stift in Schwarz / Blau / Rot | `B` / `U` / `R` |
| Formen-Werkzeug | `S` oder `F` |
| Auswahlwerkzeug | `V` |
| Text-Werkzeug | `T`, dann ins Blatt klicken; `Esc` beendet die Eingabe |
| Lineal ein/aus | `L` |
| Hintergrund wechseln | `G` |
| Auswahl um 90° drehen | `R` (bei Auswahl) |
| Kopieren / EinfĂŒgen | `Strg + C` / `Strg + V` |
| Auswahl löschen | `Entf` oder `RĂŒcktaste` |
| RĂŒckgĂ€ngig / Wiederholen | `Strg + Z` / `Strg + Y` oder `Strg + Umschalt + Z` |
| Bild einfĂŒgen | `Strg + I` |
| Scrollen | Mausrad (`Umschalt` = waagerecht), ein Finger |
| Zoomen | `Strg + Mausrad`, zwei Finger, `Strg + +` / `Strg + -` |
| Zoom zurĂŒcksetzen | `Strg + 0` |
| Verschieben | mittlere Maustaste oder `Leertaste + Ziehen` |
| NĂ€chste / vorherige Seite | `Bild ab` oder `N` / `Bild auf` |
| Erste / letzte Seite | `Pos 1` / `Ende` |
| Jetzt speichern | `Strg + S` |
| PDF exportieren | `Strg + E` |
| MenĂŒs schließen, Auswahl aufheben | `Esc` |
| Beenden (speichert vorher) | `Strg + Q` oder Fenster schließen |
---
## Entwicklung
### Voraussetzungen
- Rust 1.92 oder neuer (`rustup update stable`)
- Vulkan- oder OpenGL-Treiber (z. B. `mesa-vulkan-drivers`)
- X11-/Wayland-Bibliotheken: `libx11-dev`, `libxcursor-dev`, `libxrandr-dev`, `libxi-dev`, `libxkbcommon-dev`
### Bauen, starten, testen
```bash
git clone https://gitea.pansi.eu/harald/ink-notes.git
cd ink-notes
cargo run --release # oder ./run.sh
cargo test # Unit- und Integrationstests
```
Die CI prĂŒft zusĂ€tzlich `cargo fmt --check` und `cargo clippy --all-targets -- -D warnings`.
### Projektstruktur
```text
src/
├── main.rs # Event-Loop (winit), Eingaben von Maus, Touch und Stift, Ablaufsteuerung
├── lib.rs # Bibliotheks-Exporte (fĂŒr Tests)
├── canvas.rs # wgpu-Rendering: Papier, Muster, Bilder, Tinte, Nachbarseiten
├── shader.wgsl # Vertex- und Fragment-Shader
├── viewport.rs # Kamera (Zoom, Verschieben), Seitenstapel der durchgehenden Ansicht
├── filter.rs # 1€-Filter gegen Zittern
├── spline.rs # Catmull-Rom-Splines, Ecken-Erhaltung, Dreiecksstreifen
├── geometry.rs # Formerkennung (Douglas-Peucker, Kreis-Fit, 
)
├── selection.rs # Auswahl, Griffe, Verschieben/Drehen/Skalieren
├── ruler.rs # Virtuelles Lineal
├── text.rs # Textfelder: Satz, Zeilenumbruch, Rasterung
├── background.rs # Papierfarben, Musterfarben, Karo/Linien/Punkte
├── image_layer.rs # Texturen fĂŒr Bilder, PDF-Seiten und Text
├── assets.rs # Bilder und PDFs im Notizbuchordner
├── pdf_doc.rs # PDF lesen und rendern (hayro)
├── pdf_merge.rs # Importierte PDF-Seiten beim Export unterlegen
├── document.rs # Datenmodell: Notizbuch, Seiten, Striche, SeitengrĂ¶ĂŸen
├── history.rs # RĂŒckgĂ€ngig/Wiederholen
├── storage.rs # Laden/Speichern (atomar), NotizbĂŒcher, Papierkorb
├── library.rs # Ordner der NotizbĂŒcher (library.json)
├── autosave.rs # Speichern im Hintergrund
├── export.rs # PDF-Export (printpdf)
├── page_export.rs # Seite als PNG/SVG, Auswahl als Bild
├── file_picker.rs # Eingebaute Dateiauswahl
├── settings.rs # Einstellungen (~/.config/ink-notes/ui.json)
├── platform.rs # Wayland/X11-Erkennung
├── updater.rs # Updates von Gitea (Signatur- und PrĂŒfsummenprĂŒfung)
└── ui.rs # OberflĂ€che (egui): Werkzeugleiste, MenĂŒs, Dialoge
```
Mehr dazu in [`docs/ARCHITECTURE.de.md`](docs/ARCHITECTURE.de.md), das Speicherformat steht in [`docs/FILE_FORMAT.de.md`](docs/FILE_FORMAT.de.md).
---
## Releases bauen und veröffentlichen
```bash
./scripts/build-release.sh # .deb, .AppImage und SHA256SUMS.txt in target/
```
Veröffentlicht wird ĂŒber Gitea Actions ([`.gitea/workflows/release.yaml`](.gitea/workflows/release.yaml)), sobald ein Tag `vX.Y.Z` gepusht wird: Tests, Pakete bauen, signieren, Release anlegen. Manuell geht es mit `GITEA_TOKEN=
 ./scripts/publish-gitea-release.sh`.
### Flatpak
Das Manifest liegt in [`packaging/flatpak/`](packaging/flatpak/) (Runtime `org.freedesktop.Platform` 26.08, Rust aus der SDK-Erweiterung `rust-stable`). Lokal bauen und installieren:
```bash
flatpak-builder --user --install --force-clean target/flatpak-build packaging/flatpak/eu.pansi.ink-notes.yml
flatpak run eu.pansi.ink-notes
```
Nach jeder Änderung an `Cargo.lock` muss `packaging/flatpak/cargo-sources.json` mit dem [flatpak-cargo-generator](https://github.com/flatpak/flatpak-builder-tools/tree/master/cargo) neu erzeugt werden (`python3 flatpak-cargo-generator.py Cargo.lock -o packaging/flatpak/cargo-sources.json`). In der Sandbox darf ink-notes Bilder, Downloads und Schreibtisch lesen und in den Dokumente-Ordner exportieren; die NotizbĂŒcher liegen unter `~/.var/app/eu.pansi.ink-notes/`.
### Release-Signatur einrichten (einmalig)
Updates werden in der App nur mit gĂŒltiger Minisign-Signatur installiert. Signiert wird mit [rsign2](https://crates.io/crates/rsign2) (`cargo install rsign2 --locked`). SchlĂŒsselpaar ohne Passwort erzeugen (es wird nur als CI-Secret verwendet):
```bash
rsign generate -W -p ink-notes.pub -s ink-notes.key
```
1. Die zweite Zeile von `ink-notes.pub` (beginnt mit `RW`) in `src/updater.rs` als `UPDATE_SIGNING_PUBLIC_KEY` eintragen.
2. Den Inhalt von `ink-notes.key` in Gitea unter *Repository → Einstellungen → Actions → Secrets* als `MINISIGN_SECRET_KEY` hinterlegen.
3. `ink-notes.key` offline aufbewahren. Geht er verloren, können bestehende Installationen keine Updates mehr prĂŒfen.
`rsign generate -W` verschlĂŒsselt den SchlĂŒssel mit leerem Passwort; das `minisign`-Programm (z. B. Ubuntu-Paket 0.11) kann ihn ohne Terminal nicht lesen, deshalb signieren Skript und CI mit `rsign`. In der CI ist die Signatur Pflicht (`INK_NOTES_REQUIRE_SIGNATURE=1`), und das Skript prĂŒft, dass der geheime SchlĂŒssel zum eingebauten öffentlichen passt.
### CI-Runner (act_runner)
Der Workflow lÀuft auf dem Label `ubuntu-latest`. Im `config.yaml` des Runners muss es zugeordnet sein, z. B.:
```yaml
runner:
labels:
- "ubuntu-latest:docker://catthehacker/ubuntu:act-latest"
```
Bleibt ein Job auf „Waiting to run“ stehen: Ist der Runner online (*Einstellungen → Aktionen → Runner*) und stimmt das Label mit `runs-on` ĂŒberein? `sudo` verwendet der Workflow nur, wenn der Runner nicht als `root` lĂ€uft.
---
## Sicherheit der Updates
1. **Signatur:** Jedes Release enthĂ€lt `SHA256SUMS.txt.minisig`. Die App lĂ€dt `SHA256SUMS.txt` und die Signatur vor dem Paket und prĂŒft sie gegen den eingebauten öffentlichen SchlĂŒssel (`minisign-verify`). Ohne gĂŒltige Signatur wird nicht installiert.
2. **PrĂŒfsumme:** Der SHA-256-Wert des heruntergeladenen Pakets muss zum Eintrag in der signierten Liste passen, sonst wird die Datei gelöscht.
3. **Nur HTTPS:** Auch Download-Links und Weiterleitungen mĂŒssen HTTPS sein. Bei Weiterleitungen auf einen anderen Server wird der `Authorization`-Header nicht mitgeschickt.
4. **Eigener Download-Ordner:** `~/.cache/ink-notes/updates` (Rechte `0700`); Dateinamen mit Pfadtrennern, `..` oder Steuerzeichen werden abgelehnt.
5. **AppImage-Austausch:** Die neue Datei wird neben der alten angelegt, die alte als `.bak` gesichert und dann per `rename` ersetzt – die laufende Datei wird nie ĂŒberschrieben.
---
## Mitmachen
Fehlermeldungen, Ideen und BeitrĂ€ge sind willkommen – am liebsten als [Issue auf Gitea](https://gitea.pansi.eu/harald/ink-notes/issues); [GitHub](https://github.com/haraldpansi-gif/ink-notes) ist ein Spiegel. Details in [CONTRIBUTING.de.md](CONTRIBUTING.de.md), SicherheitslĂŒcken bitte vertraulich wie in [SECURITY.de.md](SECURITY.de.md) beschrieben. Es gilt der [Code of Conduct](CODE_OF_CONDUCT.md).
---
## Lizenz
[MIT](LICENSE), Copyright © 2026 Harald Pansi.