• v0.10.1 9d0af6afe0

    actgadmin released this 2026-07-11 21:03:46 +02:00 | 183 commits to master since this release

    ACTG Sync 0.10.1

    • Neuer Button „Neu anlegen…" (Einstellungen → Vaults, neben „Vault verbinden…"): legt einen neuen Server-Vault an (Name vorbefüllt mit dem lokalen Vault-Namen) und verbindet das aktuelle Vault direkt — der erste Sync lädt den lokalen Bestand hoch.
    • Existiert bereits ein eigener Server-Vault mit dem Namen, wird mit diesem verbunden (find-or-create).
    • Schließt die Lücke aus v0.10.0: Dort konnten neue Server-Vaults nur noch per Server-CLI entstehen.

    Installation

    Ordner obsidian-sync/ aus dem ZIP nach /.obsidian/plugins/ kopieren.

    Server unverändert — kein Deploy nötig.

    Downloads
  • v0.10.0 6cca7fe5ae

    actgadmin released this 2026-07-11 20:32:57 +02:00 | 185 commits to master since this release

    ACTG Sync 0.10.0

    Vault-Verknüpfung per Such-Popup

    • Die Namens-Automatik (Auto-Verbinden über gleichnamigen Server-Vault) ist entfernt — verbunden wird nur noch explizit über die Vault-ID. Der lokale Vault-Name darf beliebig abweichen (lokal „pudding", Server „Shared").
    • Einstellungen → Vaults → „Vault verbinden…" öffnet ein Such-Popup (Quick-Switcher-Stil) — skaliert auf beliebig viele Vaults.
    • Nicht-leeres Vault: Wahl zwischen „Zusammenführen" (Konfliktkopien, nichts geht verloren) und „Server-Stand übernehmen" (Lokales wandert in den Papierkorb .trash, nie hart gelöscht).
    • „Trennen" löst die Verbindung (mit Bestätigung); lokale Dateien bleiben.
    • Desktop-Provisioning („Server-Vault als neues Vault anlegen") nutzt dasselbe Popup, ein Vault pro Aufruf.

    Git-Backup pro Vault

    • Repo-URL, Branch, Username und Token werden in den Plugin-Einstellungen gesetzt; der Server speichert pro Vault ( aults//git.json) und pusht dieses Vault dorthin. Kein Eintrag = kein Backup.
    • Der Token wird nie zurückgegeben oder lokal gespeichert; Ändern erfordert Schreibzugriff aufs Vault.
    • Neue API: GET/PUT/DELETE /api/vaults/:id/git.
    • Bestehende OSYNC_GIT_*-Server-Konfiguration wird beim ersten Start einmalig migriert und läuft nahtlos weiter.

    Installation

    Ordner obsidian-sync/ aus dem ZIP nach /.obsidian/plugins/ kopieren.

    Server-Deploy nötig (neue API + GitBackupManager).

    Downloads
  • v0.9.0 b62e526ccf

    actgadmin released this 2026-07-10 21:00:08 +02:00 | 199 commits to master since this release

    Installation

    obsidian-sync-0.9.0.zip herunterladen, Ordner obsidian-sync/ nach <Vault>/.obsidian/plugins/ entpacken, Obsidian neu laden.

    Vaults nach dem Login auswaehlen

    Nach der Anmeldung zeigen die Einstellungen alle Server-Vaults, die dir freigegeben sind — automatisch, ohne den frueheren 'Vaults laden'-Knopf.

    • Leeres lokales Vault binden (Desktop + Mobil): Ist der aktuelle Vault leer, laedt 'In dieses Vault laden' den gewaehlten Server-Vault in diesen Vault. Der Sync-Zustand wird dabei frisch gesetzt.
    • Neue Vaults anlegen (nur Desktop): Mehrere Server-Vaults markieren und als separate neue Obsidian-Vaults neben dem aktuellen anlegen lassen. Das Plugin erzeugt Ordner, .obsidian, kopiert sich selbst hinein, schreibt data.json und traegt das Vault in Obsidians obsidian.json ein — es erscheint im Vault-Wechsler und laedt sich beim ersten Oeffnen selbst herunter. Das aktuelle Vault wird nie veraendert.

    Robustheit

    Die reine Logik (obsidian.json-Eintrag, Pfade je Betriebssystem, Leer-Pruefung) ist mit 8 Tests abgesichert. Ein vorhandenes, aber unlesbares obsidian.json fuehrt nie zu Datenverlust: statt es zu ueberschreiben, bricht die Registrierung ab und der fertige Vault-Ordner bleibt bestehen (manuell ueber 'Open folder as vault' zu oeffnen). Die Provisioning-Funktion laeuft nur auf dem Desktop (Platform.isDesktopApp); auf Mobil bleibt das Plugin voll funktionsfaehig, nur ohne den Anlegen-Teil.

    Plugin heisst jetzt ACTG Sync.

    Server

    Unveraendert. Kein Deploy noetig.

    Downloads
  • v0.8.0 5a55bcf7d1

    actgadmin released this 2026-07-10 08:07:27 +02:00 | 209 commits to master since this release

    Diese Version erfordert einen Server-Deploy. Das Docker-Image installiert jetzt git. Das Plugin ist funktional unveraendert; die Versionsnummer laeuft nur mit.

    Der Server pusht, nicht das Plugin

    Der Server committet den Vault-Stand und pusht ihn in ein Repository. Er pusht nur und liest nie zurueck — der Server bleibt die einzige Wahrheit, Git ist Historie und Notfallkopie. Damit entsteht keine zweite Konfliktlogik neben dem Drei-Wege-Merge.

    Warum dort und nicht im Plugin: Der Server hat bereits alle Dateien, laeuft auf Node, hat ein echtes Dateisystem und existiert genau einmal. Kein Wettlauf zwischen Geraeten, die denselben Vault pushen; kein Mobil-Problem (auf iOS gibt es weder child_process noch ein git); kein halbes Megabyte isomorphic-git im Plugin-Bundle.

    Zwei Entscheidungen, die den Rest tragen

    Getrenntes --git-dir. Das Repository liegt unter <dataDir>/git/<vaultId>.git, der Arbeitsbaum ist der bestehende Dateibaum des Vaults. Ohne diese Trennung laege ein .git-Verzeichnis mitten zwischen den synchronisierten Dateien — ein Client koennte es ueberschreiben, und der Sync wuerde es verteilen.

    Der Token geht ueber http.extraHeader, nie in die Remote-URL. Eine URL mit eingebettetem Token landet in .git/config, in Fehlermeldungen und in jedem Log. Fehlertexte werden zusaetzlich um einen etwaigen Authorization-Header bereinigt.

    Konfiguration

    Variable Default Bedeutung
    OSYNC_GIT_REMOTE Repo-URL. Leer = Backup aus
    OSYNC_GIT_VAULT_ID Welcher Vault gesichert wird. Leer = Backup aus
    OSYNC_GIT_BRANCH main Ziel-Branch
    OSYNC_GIT_USERNAME Nutzername (Basic-Auth)
    OSYNC_GIT_TOKEN Access-Token
    OSYNC_GIT_DEBOUNCE_MS 15000 Ruhephase vor dem Commit

    Aktiv erst, wenn Remote und Vault-ID gesetzt sind — ein halb konfiguriertes Backup saehe sonst aktiv aus, ohne etwas zu tun. Ein Sync-Lauf schreibt viele Dateien; nach der letzten Aenderung wird DEBOUNCE_MS gewartet, dann entsteht ein Commit. Schlaegt der Push fehl, bleibt der Commit lokal und der naechste Lauf holt ihn nach; der Sync ist davon nie betroffen.

    Es wird genau ein Vault gesichert. Mehrere Vaults in denselben Branch desselben Repos zu pushen wuerde sie gegenseitig ueberschreiben.

    Tests

    12 Tests gegen ein echtes Git-Repository, darunter ein Ende-zu-Ende-Lauf: eine ueber die HTTP-API hochgeladene Datei taucht im Remote auf. Geprueft wird auch, dass kein .git im Arbeitsbaum entsteht, dass ohne Aenderung kein zweiter Commit faellt, dass ein unerreichbares Remote den Server nicht abbricht und dass der Token nirgends in der Repo-Konfiguration steht.

    Downloads
  • v0.7.0 c24b3f6d60

    actgadmin released this 2026-07-10 07:56:17 +02:00 | 211 commits to master since this release

    Installation

    obsidian-sync-0.7.0.zip herunterladen, Ordner obsidian-sync/ nach <Vault>/.obsidian/plugins/ entpacken, Obsidian neu laden.

    Abbruch verwirft die Notiz

    Um eine Notiz aus einer Vorlage zu erzeugen, muss die Datei zuerst existieren — tp.file.rename() und tp.file.move() brauchen etwas, worauf sie wirken. Daraus folgten zwei Aergernisse, beide behoben:

    • Die leere Unbenannt-Notiz wurde hochgeladen, waehrend das Formular noch offen stand. Der Sync fragt jetzt den Runner, ob er an diesem Pfad noch arbeitet, und haelt den Upload zurueck.
    • Ein Abbruch liess die leere Notiz liegen. Vorlagen haben keinen Abbruch-Rueckkanal, deshalb der Vertrag: Rendert eine Vorlage nur Leerraum, war es ein Abbruch — die eben angelegte Notiz wird wieder geloescht. Das gilt ausschliesslich fuer Notizen, die der Runner selbst erzeugt hat; eine eigene leere Notiz fasst niemand an.

    Vorlagen brechen mit einem schlichten return "" in einem <%* ... %>-Block ab. Das funktioniert, weil der Renderer alle Segmente in EINE async Funktion kompiliert — ein Test haelt dieses Verhalten jetzt fest.

    Neuer Name

    Das Plugin heisst jetzt ACTG Sync. Die Plugin-id bleibt obsidian-sync: Sie zu aendern hiesse, auf jedem Geraet den Plugin-Ordner und dessen data.json (Token, Vault-ID) umzuziehen.

    Server

    Unveraendert. Kein Deploy noetig.

    Downloads
  • v0.6.0 5a90a3a833

    actgadmin released this 2026-07-09 23:41:23 +02:00 | 213 commits to master since this release

    Installation

    obsidian-sync-0.6.0.zip herunterladen, Ordner obsidian-sync/ nach <Vault>/.obsidian/plugins/ entpacken, Obsidian neu laden.

    Das Problem

    Zwei Geraete schreiben app.json, core-plugins.json und community-plugins.json zwangslaeufig unabhaengig voneinander — spaetestens beim ersten Sync eines neuen Geraets. Weil .json als Text gilt, versuchte die Engine einen Zeilen-, dann einen Zeichen-Merge; bei {} gegen drei Einstellungen scheitert beides, und es entstand eine Konfliktkopie. Die half niemandem und verteilte sich, da sie selbst in .obsidian liegt, ueber alle Geraete weiter.

    Die Loesung

    Fuer Dateien unterhalb des Config-Ordners gewinnt bei einem echten Konflikt die neuere Fassung; es entsteht keine Kopie. Notizen behalten die Konfliktkopie — dort waere ein verlorener Edit nicht hinnehmbar, bei einer Liste aktivierter Plugins ist er belanglos.

    „Neuer" vergleicht die lokale Aenderungszeit (SyncAdapter.mtime, neu und optional) mit der mtime des Server-Eintrags. Der Server stempelt diese beim Upload — es sind also zwei Uhren. Bei Gleichstand oder unbekannter lokaler Zeit gewinnt die Serverfassung. Der uebrige Sync entscheidet weiterhin ausschliesslich ueber Hashes und Versionen, nie ueber Zeitstempel.

    SyncResult.resolved zaehlt diese Faelle getrennt von conflicts.

    Aufraeumen

    Bereits vorhandene Konfliktkopien im Config-Ordner werden nicht mehr synchronisiert und koennen von Hand geloescht werden. Ausserhalb des Config-Ordners bleiben Konfliktkopien sichtbar — dort sollen sie gesehen und aufgeloest werden.

    Server

    Unveraendert. Kein Deploy noetig.

    Downloads
  • v0.5.0 4ce0e3a1d2

    actgadmin released this 2026-07-09 23:32:27 +02:00 | 215 commits to master since this release

    Installation

    obsidian-sync-0.5.0.zip herunterladen, Ordner obsidian-sync/ nach <Vault>/.obsidian/plugins/ entpacken, Obsidian neu laden. Templater muss deaktiviert sein (siehe v0.4.0).

    Vorlagen direkt im Kontextmenue

    Das Kontextmenue eines Ordners listet die Vorlagen jetzt einzeln — ein Klick legt die Notiz an, ohne Umweg ueber eine Auswahlliste. Die Reihenfolge ist alphabetisch, die Anzahl begrenzt eine neue Einstellung (Eintraege im Menue, Standard 5).

    Erst wenn es mehr Vorlagen als Eintraege gibt, erscheint zusaetzlich Weitere Vorlagen ... und fuehrt zur vollstaendigen Liste. Bei genau der Grenze entfaellt dieser Eintrag, denn die Liste waere leer.

    Diese Entscheidung steckt als reine Funktion planeMenu() in templates/menu-plan.ts und ist mit 6 Tests abgesichert, statt als Abfrage im Menue-Callback zu versauern.

    Server

    Unveraendert. Kein Deploy noetig.

    Downloads
  • v0.4.0 1df99d0ddf

    actgadmin released this 2026-07-09 23:24:26 +02:00 | 217 commits to master since this release

    Wichtig beim Update

    Templater muss deaktiviert werden. Das Plugin bringt jetzt einen eigenen Vorlagen-Motor mit. Bleiben beide aktiv, stuelpt Templaters on_file_creation sein Ordner-Template ueber genau die leere Notiz, die unser Runner anlegt — zwei Vorlagen in einer Notiz. Das Plugin warnt beim Laden, wenn es Templater noch aktiv sieht.

    Ausserdem entfaellt styles.css; sie kann aus dem Plugin-Ordner geloescht werden.

    Installation

    obsidian-sync-0.4.0.zip herunterladen, den Ordner obsidian-sync/ nach <Vault>/.obsidian/plugins/ entpacken, Obsidian neu laden.

    Der eigene Vorlagen-Motor

    Der Vault benutzte von Templater genau acht Funktionen. Sie nachzubauen ist kleiner als die drei Umgehungen, die Templater uns aufgezwungen hat: sein privates files_with_pending_templates auszulesen, seinen create-Handler ueber eine Hilfsendung zu umgehen und seinen hartkodierten Menueeintrag per CSS zu verstecken.

    Unterstuetzte Syntax (Templater-kompatibel): <% ausdruck %>, <%* code %>, <%_, -%>, _%>.

    Verfuegbar in Vorlagen: tp.file.title, tp.file.creation_date, tp.file.cursor, tp.file.rename, tp.file.move, tp.file.create_new, tp.date.now und tp.obsidian (fuer Modal, Setting, Notice).

    Alle Bloecke einer Vorlage teilen sich einen Gueltigkeitsbereich, wie bei Templater: Sie werden zu EINER async Funktion kompiliert, nicht einzeln ausgewertet.

    Sicherheit

    JavaScript laeuft ausschliesslich in Vorlagen aus dem konfigurierten Vorlagen-Ordner. Eine beliebige Notiz, die <%* nur enthaelt, wird nie ausgefuehrt — auch dann nicht, wenn sie ueber den Sync-Server in den Vault gelangt. Templater kennt diese Grenze nicht.

    Der urspruengliche Fehler kann nicht wiederkehren

    Templaters on_file_creation konnte nicht unterscheiden, ob eine neue Datei vom Nutzer oder vom Sync stammt. Unser Runner fragt die Echo-Unterdrueckung des Syncs und wendet auf sync-geschriebene Dateien nie eine Vorlage an.

    Neue Einstellungen

    • Vorlagen-Ordner (Standard _templates) — woher Vorlagen kommen und wo JavaScript laufen darf
    • Vorlage auf neue Notizen anwenden — schaltet Ordner-Vorlagen insgesamt
    • Ordner-Vorlagen — Regeln Ordner -> Vorlage; / trifft jede neue Notiz, laengster Treffer gewinnt

    Server

    Unveraendert. Kein Deploy noetig.

    Downloads
  • v0.3.0 7a0b700856

    actgadmin released this 2026-07-09 23:07:02 +02:00 | 220 commits to master since this release

    Installation

    obsidian-sync-0.3.0.zip herunterladen und den enthaltenen Ordner obsidian-sync/ nach <Vault>/.obsidian/plugins/ entpacken, dann Obsidian neu laden. Neu ab dieser Version: das Archiv enthaelt zusaetzlich styles.css.

    Neuer Eintrag "Neue Seite aus Vorlage"

    Im Kontextmenue eines Ordners (und als gleichnamiger Befehl) erscheint jetzt ein Eintrag, der eine Vorlage auswaehlen laesst und die neue Notiz in genau diesem Ordner anlegt. Die eigentliche Arbeit macht weiterhin Templater ueber create_new_note_from_template() — wir bauen keine zweite Template-Engine, nur eine schoenere Tuer.

    Templaters eigener Eintrag heisst Create new note from template; der Titel steht als Zeichenkette in seinem Code und ist weder uebersetzbar noch abschaltbar. Das Plugin blendet ihn deshalb aus, damit nicht zwei Eintraege dasselbe tun. Dafuer liefert es nun eine styles.css mit — ein CSS-Snippet muss niemand mehr von Hand einschalten.

    Zwei neue Schalter unter Einstellungen -> Vorlagen, beide standardmaessig an:

    • Eintrag "Neue Seite aus Vorlage" — zeigt den eigenen Eintrag. Ohne installiertes Templater erscheint er nicht.
    • Templaters eigenen Menueintrag ausblenden — versteckt das englische Duplikat.

    Beide wirken sofort, ohne Obsidian neu zu laden.

    Server

    Unveraendert. Kein Deploy noetig.

    Downloads
  • v0.2.1 88e50bac2d

    actgadmin released this 2026-07-09 22:14:50 +02:00 | 222 commits to master since this release

    Installation

    obsidian-sync-0.2.1.zip herunterladen und den enthaltenen Ordner obsidian-sync/ nach <Vault>/.obsidian/plugins/ entpacken. Danach Obsidian neu laden.

    Wer den Ordner schon hat, kann stattdessen main.js und manifest.json einzeln ersetzen.

    Behoben: Templater fuehrte Vorlagen auf dem zweiten Geraet erneut aus

    Templaters on_file_creation schiebt den vorhandenen Inhalt jeder neu angelegten Markdown-Datei durch overwrite_file_commands(). Kam eine noch nicht expandierte Vorlage per Sync auf einem zweiten Geraet an, fuehrte Templater sie dort ein zweites Mal aus: ein zweites Prompt-Popup, ein abweichender Dateiname aus tp.file.rename() und gegenseitig ueberschriebene Inhalte.

    Zwei unabhaengige Schichten ersetzen die bisherige Heuristik aus 60-Sekunden-Fenster und <%-Textfund:

    • Zustand statt Zeit. Der Upload fragt Templaters eigene Warteschlange files_with_pending_templates ab und laeuft sofort bei templater:all-templates-executed an. Die spuerbare Sync-Verzoegerung entfaellt. Ist Templater nicht installiert oder aendern sich seine Interna, haelt der Sync nichts mehr zurueck (fail open) — geschuetzt bleibt er trotzdem durch die zweite Schicht. Ein Timeout von 2 Minuten gibt Pfade frei, die ein abgebrochener Prompt haengen laesst.
    • Kein create-Ereignis fuer Sync-Schreibvorgaenge. Jede neu heruntergeladene Markdown-Datei entsteht unter der Hilfsendung .syncing und wird an ihren Platz umbenannt. Templater bricht bei fremder Dateiendung sofort ab und lauscht nicht auf rename, sieht die fertige Datei also nie. Das deckt beide Zugriffspfade ab: overwrite_file_commands() bei nicht leeren Dateien und Ordner-Templates bei leeren.

    Server

    Unveraendert. Kein Deploy noetig.

    Downloads