No description
  • Swift 90.3%
  • Shell 5.7%
  • Python 4%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Matthias Falland 6baad4d5b0 Herkunft je Seite, Verweis je Abschnitt
Beim Bündeln geht die Zuordnung verloren: NotebookLM kennt nur noch den
Dateinamen und kann eine Antwort nicht belegen. Unter jeder Seitenüberschrift
steht deshalb nun ihr Weg im Notizbuch und ihr Stand - direkt am Inhalt, weil
ein Sprachmodell den Text neben der zitierten Stelle mitliest, einem Verweis
aber nicht folgen kann.

Der anklickbare OneNote-Verweis steht einmal je Abschnitt statt je Seite. Er
zielt ohnehin dorthin - Seiten-Kennungen erreichen die Markdown-Ausgabe nicht -,
und ihn zu wiederholen legte dieselbe lange Adresse dutzendfach ab. Gemessen am
Bestand: 8,0 % Mehrtext gegenüber 4,1 %.

Notizbücher ausserhalb des OneNote-Katalogs bekommen keinen Verweis; einer auf
eine Sicherungskopie sähe richtig aus und führte ins Leere.

Ausserdem: make-app.sh behält die einmal vergebene Zählnummer einer Fassung.
Bisher erhöhte ein erneuter Bau sie, worauf der Appcast dieselbe Fassung als
Aktualisierung angeboten hätte - endlos. Die Nummer der ausgelieferten 1.5.0
ist wiederhergestellt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-29 12:15:17 +02:00
app Herkunft je Seite, Verweis je Abschnitt 2026-08-29 12:15:17 +02:00
bin Herkunft je Seite, Verweis je Abschnitt 2026-08-29 12:15:17 +02:00
docs Python-Fassung entfernen 2026-08-27 23:08:14 +02:00
packaging Herkunft je Seite, Verweis je Abschnitt 2026-08-29 12:15:17 +02:00
tools Versionshinweise mit vollständiger Historie 2026-08-29 10:00:40 +02:00
.gitignore Python-Fassung entfernen 2026-08-27 23:08:14 +02:00
CHANGELOG.md Herkunft je Seite, Verweis je Abschnitt 2026-08-29 12:15:17 +02:00
README.md Herkunft je Seite, Verweis je Abschnitt 2026-08-29 12:15:17 +02:00

Programmsymbol

OneNote Export

OneNote-Notizbücher als durchsuchbares Markdown — ohne Tenant-Rechte, ohne App-Registrierung, ohne Cloud-Dienst.

Läuft vollständig lokal auf dem Mac.


Das Problem

OneNote für Mac hat keine Skriptschnittstelle, und der Zugriff über Microsoft Graph setzt eine App-Registrierung im Tenant voraus. Wer beides nicht hat, kommt über die offiziellen Wege nicht an seine eigenen Notizen.

Der Weg drumherum

Ein OneNote-Notizbuch ist in SharePoint nichts weiter als ein Ordner: eine .onetoc2 als Inhaltsverzeichnis und je Abschnitt eine .one. Der OneDrive-Sync legt genau diese Dateien auf die Platte — lesbar mit denselben Rechten, die man auf das Team ohnehin hat.

Damit braucht der Export keine Programmierschnittstelle. Er liest Dateien.

Wie es arbeitet

flowchart TD
    SP["SharePoint / Teams"] -->|"OneDrive-Sync"| ONE["<b>.one</b>-Dateien<br/>auf der Platte"]

    ONE --> DELTA{"Delta-Abgleich<br/><i>Größe + Änderungszeit</i>"}
    DELTA -->|"unverändert"| SKIP["übersprungen<br/><i>kein Download</i>"]
    DELTA -->|"neu oder geändert"| CONV["<b>one2md</b><br/>entpackt die Sektion"]

    CONV --> TEXT["Markdown je Seite"]
    CONV --> IMG["eingebettete Bilder"]

    IMG --> VALID{"Bilddaten<br/>brauchbar?"}
    VALID -->|"nein"| CARVE["Bergung direkt<br/>aus der .one"]
    VALID -->|"ja"| OK["Bild übernommen"]

    CARVE --> ALT
    OK --> ALT{"Trägt OneNote<br/>schon Bildtext?"}
    ALT -->|"ja"| REUSE["Text übernommen<br/><i>kostenlos</i>"]
    ALT -->|"nein"| OCR["Vision-Texterkennung<br/><i>lokal, offline</i>"]

    TEXT --> HEAD["Metadatenkopf<br/>ergänzen"]
    REUSE --> HEAD
    OCR --> HEAD

    TEXT --> ATT{"Anhang<br/>eingebettet?"}
    ATT -->|"PDF, Word,<br/>PowerPoint"| EXTRACT["Text herauslösen"]
    EXTRACT --> HEAD

    HEAD --> DEDUP["Dubletten entfernen"]
    DEDUP --> ARCHIV[("Archiv/")]
    ARCHIV --> LM[("NotebookLM/<br/><i>gebündelt, Text</i>")]
    ARCHIV --> OB[("Obsidian/<br/><i>Wikilinks</i>")]

    style SKIP stroke-dasharray: 4 4
    style ARCHIV stroke-width:3px

Drei Entscheidungen prägen das Ergebnis:

Der Delta-Abgleich fasst keine Inhalte an. Der Fingerabdruck besteht nur aus Dateigröße und Änderungszeit. Das ist Absicht: OneDrive legt Dateien als Platzhalter ab, die diese Angaben tragen, ohne dass die Bytes lokal liegen. Der Abgleich prüft deshalb den gesamten Bestand in Sekundenbruchteilen und lädt nur herunter, was sich wirklich geändert hat.

Bildtext ist oft schon da — muss aber sichtbar werden. OneNote lässt eingebettete Bilder durch seine eigene Texterkennung laufen und legt das Ergebnis als Alt-Text ab; in einer Stichprobe bei 43 von 47 Bildern. Der Export gibt diesen Text als eigenen Block aus statt ihn im Alt-Attribut zu belassen.

Das ist wesentlich: Eine Seite mit einem Ausdruck besteht ausschliesslich aus Bildern — je eine gedruckte Seite. Bliebe der Text im Alt-Attribut, wäre die exportierte Seite vollständig leer, obwohl sie den ganzen Inhalt enthält.

Dateiendungen werden am Inhalt geprüft. Der Konverter übernimmt die Endung aus den Angaben in der .one-Datei, und die stimmen nicht immer: Seiten eines Ausdrucks erben die Endung des Elterndokuments, und bei unbekanntem Typ vergibt er .bin. Neunzehn Word-Ausdruckseiten erscheinen dann als neunzehn .pdf, von denen sich keine öffnen lässt. Der Export bestimmt den Typ an den Anfangsbytes und benennt entsprechend um — samt der Verweise im Markdown.

Drei Fassungen, ein Export. Das Archiv ist die Wahrheit; NotebookLM- und Obsidian-Fassung entstehen daraus. Das ist wesentlich, weil der teure Teil nicht das Schreiben ist, sondern der Weg dorthin — Konvertierung, Texterkennung, Bildbergung. Die abgeleiteten Fassungen kosten Sekunden und werden bei jedem Lauf vollständig neu erzeugt, damit keine veraltete Fassung liegenbleibt.

Fassung Form Wofür
Archiv/ eine Datei je Seite, Bilder daneben Nachschlagen, Sicherung
NotebookLM/ je Notizbuch gebündelt, reiner Text NotebookLM nimmt begrenzt viele Quellen an
Obsidian/ Wikilinks, Übersichtsnotiz, Bilder verwiesen Durcharbeiten im Tresor

Aus 461 Einzelseiten werden so 12 Quellen — mit Inhaltsverzeichnis vorn und Abschnitten als Gliederung. Bilder entfallen dort, ihr erkannter Text bleibt.

Jede Seite trägt ihre Herkunft. Unter der Seitenüberschrift steht ihr Weg im Notizbuch und ihr Stand. Das Bündeln kostet ja gerade die Zuordnung: Ohne die Angabe weiss ein Sprachmodell nur den Dateinamen und kann eine Antwort nicht belegen. Ein anklickbarer OneNote-Verweis steht einmal je Abschnitt — dorthin zielt er, Seiten lassen sich nicht einzeln adressieren. Zusammen kosten die Angaben rund 4 % des Textes.

Anhänge werden aufgelöst. Ein eingebettetes PDF oder Word-Dokument ist im Markdown nur ein Verweis; der Inhalt bliebe in der Datei. Bei Unterrichtsskripten steckt der Stoff aber praktisch vollständig im Anhang — eine Seite verspräche dann ein Thema und lieferte nichts dazu.

Handschrift wird gelesen — mit Vorbehalt. OneNote speichert sie als Striche; der Export zeichnet sie in ein Bild und lässt die Texterkennung darauf los. Gelesen wird aber nur, wo die Striche wie Schrift aussehen: viele Stützpunkte, schmale Linie. Unterstreichungen und Textmarker liefern sonst Zeichenfolgen wie - - - =-, und die sind im Lernstoff schlimmer als eine Lücke.

Stiftstriche gehören zusammen. OneNote speichert Handschrift als einzelne Striche, und jeder wird zu einem eigenen SVG. Im Markdown ist das je ein eigener Block — aus einer Skizze würden Dutzende Fragmente untereinander. Da die Striche absolute Seitenkoordinaten tragen, fasst der Export benachbarte zu einer Zeichnung zusammen und begrenzt ihre Darstellungsbreite.

Verworfene Bilder werden geborgen. Markiert die Quelldatei Bild-Nutzdaten als ungültig, liefert der Parser leere Dateien. Bei eingescannten Seiten wäre damit der eigentliche Inhalt verloren, also werden sie anhand ihrer Signaturen direkt aus der .one geschnitten.

Installation

Fertige Fassung: Neueste Veröffentlichung herunterladen, Abbild öffnen, App auf Programme ziehen. Signiert und von Apple notarisiert — keine Warnung, kein Umweg.

Voraussetzungen: macOS 14 oder neuer, Apple Silicon, angemeldetes OneDrive. Weder Python noch Rust noch Xcode werden gebraucht.

Ausführlich: docs/verteilung.md

Aus dem Quellcode:

./bin/setup.sh    # Werkzeuge prüfen, Konverter bauen, OCR übersetzen

Bedienung

Ein Klick auf das Symbol in der Menüleiste öffnet ein Fenster mit den Kennzahlen des Exports — Seiten, Notizbücher, Bilder, erkannter Bildtext —, einem Vergleich der Notizbücher und den wichtigsten Knöpfen. Der Export läuft regelmäßig von selbst; ein separater Systemdienst entfällt.

Alle fünf Minuten prüft die App im Hintergrund, ob etwas zu tun wäre. Das kostet praktisch nichts, weil der Delta-Abgleich nur Metadaten liest — hält die Anzeige aber aktuell.

Einstellungen (im Menüfenster erreichbar):

Bereich Was sich einstellen lässt
Ziel Ausgabeordner
Automatik regelmäßiger Export, Abstand, Start beim Anmelden
Inhalte Texterkennung, Sprachen, Sicherungen einbeziehen
Mitteilungen Benachrichtigung nach einem Lauf
Wartung Endungen berichtigen, Dubletten entfernen, Vollexport
Notizbücher Auswahl, was erfasst wird

Damit das auch nach einem Neustart greift, im Reiter Allgemein Beim Anmelden automatisch starten einschalten. Das setzt voraus, dass die App im Ordner Programme liegt.

Für die Kommandozeile:

onenote-export --dry-run     # anzeigen, was exportiert würde
onenote-export               # Delta-Export
onenote-export --full        # alles neu erzeugen
onenote-export --notebooks   # Übersicht mit Zustand je Notizbuch
onenote-export --diagnose    # Zeitverbrauch je Arbeitsschritt
onenote-export --repair-assets  # Endungen eines bestehenden Exports berichtigen
onenote-export --dedup          # inhaltsgleiche Seiten entfernen
onenote-export --stats          # Kennzahlen des Exports
onenote-export --build-derived  # Fassungen aus dem Archiv neu erzeugen
onenote-export --check          # Voraussetzungen prüfen
onenote-export --setup          # Einrichtung Schritt für Schritt

Notizbücher auswählen

Der Reiter Notizbücher stellt gegenüber, was OneNote kennt und was tatsächlich auf der Platte liegt:

Anzeige Bedeutung
verfügbar Abschnitte liegen lokal, aktueller Stand
nur Sicherung nur eine Kopie der OneNote-App, möglicherweise veraltet
nicht eingebunden OneNote kennt es, lokal liegt nichts

Der einfachste Weg, ein Notizbuch bekannt zu machen: einmal in OneNote öffnen. Die App liest das Verzeichnis mit, das OneNote dabei führt — samt der Kennungen, die OneDrive zum Einbinden braucht.

Alternativ lässt sich ein kopierter OneNote-Verweis einfügen. Details und die Besonderheiten der beiden Verweisformen: docs/notizbuecher-auswaehlen.md · docs/teams-notizbuecher.md

Warum das Ergebnis KI-tauglich ist

Jede Seite trägt einen YAML-Kopf mit Notizbuch, Abschnitt, Quellpfad und Änderungsdatum. Damit bleibt der Kontext erhalten, den der reine Seitentext verliert — eine Auswertung kann filtern, sortieren und zur Quelle zurückverfolgen.

---
titel: "Datenschutz"
notizbuch: "BI_Business-Intelligence"
abschnitt: "05_Betrieb"
geaendert: "2023-12-16T21:15:46Z"
bilder: 2
ocr_ergaenzt: 2
---

Erkannter Bildtext ist als solcher ausgezeichnet. Das ist wichtig: Er kann Lesefehler enthalten und sollte anders gewichtet werden als getippter Text.

> **[OCR aus Bild: scan.png]** (Erkennungsgüte 97 %, 455 Wörter)
>
> Kanton Zürich
> Baudirektion

Einrichtung

Der Reiter Erste Schritte führt der Reihe nach durch alles Nötige: OneNote öffnen, OneDrive anmelden, Zugriff erlauben, Notizbücher einbinden, Zielordner wählen, exportieren, nach NotebookLM hochladen.

onenote-export --setup

Es ist immer genau ein Schritt an der Reihe, und jeder sagt, wozu er gut ist. Die Prüfung unten sagt, was fehlt — sie setzt aber voraus, dass man den Aufbau aus OneNote, OneDrive und Systemrechten kennt.

Prüfung der Voraussetzungen

Der Reiter Prüfung beantwortet die Frage, ob alles bereitsteht: OneNote, OneDrive, Festplattenvollzugriff, eingebundene Notizbücher, Zielordner, Speicherplatz. Wo die App etwas beheben kann, bietet sie es an; wo nur der Nutzer entscheiden darf — Systemrechte etwa — führt sie an die richtige Stelle.

onenote-export --check

Der Anlass ist ein bestimmter Fehlermodus: Fehlt eine Voraussetzung, läuft der Export trotzdem — er findet nur weniger. Ohne Festplattenvollzugriff werden gesperrte Ordner still übersprungen, ohne eingebundene Bibliothek gibt es schlicht nichts zu tun. Beides sieht nach Erfolg aus. Für Nutzer, die den Aufbau nicht kennen, ist das die schlechteste Art zu scheitern.

Blockiert etwas den Export, weist das Menüfenster darauf hin, statt eine leere Übersicht zu zeigen.

Wenn ein Lauf stehen bleibt

Zugriffe auf Cloud-Ordner können unbegrenzt blockieren — der Dateidienst einer nicht erreichbaren Bibliothek antwortet schlicht nie. Der Export sichert sich auf zwei Ebenen ab: ein kurzer Erreichbarkeitstest je Bibliothek (8 Sekunden) und eine Frist für den vollständigen Durchlauf (45 Sekunden).

Beides ist nötig — eine Bibliothek kann auf oberster Ebene antworten und erst weiter unten hängen bleiben. Übersprungene Bibliotheken werden gemeldet, nicht verschwiegen, und beim nächsten Lauf erneut versucht.

onenote-export --diagnose

Aufbau

Bestandteil Aufgabe
app/Sources/OneNoteExportCore Erkennung, Delta, Texterkennung, Bergung, Export
app/Sources/OneNoteExportApp Menüleiste, Notizbuch-Auswahl, Sparkle-Anbindung
app/Sources/OneNoteExportCLI Kommandozeile für Probeläufe und Diagnose
bin/setup.sh Einrichtung auf einem neuen Rechner
bin/make-app.sh Bauen, signieren, notarisieren
bin/make-dmg.sh Installationsabbild
bin/make-appcast.sh Update-Datei für Sparkle
tools/patch-parser.py Entschärft den Parser gegen fehlende Zeitstempel
tools/make-icon.py Formt ein Bild zum macOS-Programmsymbol

Die beiden Werkzeuge unter tools/ laufen nur beim Bauen. Auf dem Zielrechner wird weder Python noch Rust noch Xcode gebraucht — die App bringt alles mit.

Grenzen

Handschrift und Zeichnungen speichert OneNote als Ink-Vektoren. Sie landen als SVG im Markdown, lassen sich aber nicht in Text wandeln. Betrifft nur handschriftliche Notizen, nicht eingescannte Seiten.

Geborgene Bilder lassen sich keiner Seite zuordnen — die Reihenfolge im Dateikörper folgt der Revisionshistorie, nicht dem Seitenaufbau. Sie landen darum gesammelt in _Bildanhang.md.

Sicherungsdateien der Mac-App sind Momentaufnahmen und können Monate alt sein. Für den laufenden Betrieb sind die per OneDrive gesyncten Dateien die richtige Quelle.

Sehr alte Dateien aus der OneNote-2007-Ära werden nicht unterstützt; der Parser deckt das Format ab OneNote 2010 ab.

Bauen und veröffentlichen

cp packaging/release.conf.example packaging/release.conf   # Zertifikat eintragen
./bin/make-app.sh && ./bin/make-dmg.sh && ./bin/make-appcast.sh

Details, Fallstricke und die Einrichtung von Signatur und Notarisierung: docs/app-paketierung.md