diff --git a/docs/quick_setup.md b/docs/quick_setup.md index 72fee5fe..f685db48 100644 --- a/docs/quick_setup.md +++ b/docs/quick_setup.md @@ -107,15 +107,30 @@ Use this path when CouchDB is ready but a Setup URI is unavailable. It configure 1. Install and enable Self-hosted LiveSync in the intended Vault. 2. Select the `Welcome to Self-hosted LiveSync` Notice, choose `I am setting this up for the first time`, then confirm that you want to set up a new synchronisation. 3. On `Connection Method`, select `Configure a remote manually`, then select `Proceed with manual configuration`. + + ![Manual remote configuration option during onboarding](../images/couchdb-manual/guide-couchdb-manual-connection-method.png) + 4. On `End-to-End Encryption`, decide how the synchronised data will be protected. - For an ordinary new Vault, enable `End-to-End Encryption` and enter a strong Vault encryption passphrase. - Enable `Obfuscate Properties` if remote document properties should also be concealed. - Store the Vault encryption passphrase securely. It is separate from the passphrase used to protect a Setup URI. + + ![CouchDB Vault encryption settings with the passphrase masked](../images/couchdb-manual/guide-couchdb-manual-encryption.png) + 5. On `Choose a synchronisation remote`, select `CouchDB`, then select `Continue to CouchDB setup`. + + ![CouchDB option in the synchronisation remote choices](../images/couchdb-manual/guide-couchdb-manual-remote-selection.png) + 6. Enter the complete CouchDB URL, username, password, and database name. - Obsidian Mobile requires HTTPS. Plain HTTP is suitable only for a trusted local connection from a desktop device. - Use credentials which are allowed to connect to the selected database and, when configuring the first device, create it if it does not exist. + + ![Manual CouchDB connection fields with the password masked](../images/couchdb-manual/guide-couchdb-manual-connection-details.png) + 7. `Check server requirements` is optional. It sends the displayed credentials to the configured server through Obsidian's internal request API, and some checks require CouchDB administrator access. The initial check is read-only. If it offers a server change, review and confirm that individual change separately. + + ![Successful optional CouchDB server requirements check](../images/couchdb-manual/guide-couchdb-manual-server-requirements.png) + 8. Select `Create or connect to database and continue`. Onboarding requires this connection test to succeed. 9. Review `Setup Complete: Preparing to Initialise Server`, then select `Restart and Initialise Server`. 10. Read the final overwrite warning. Select `I Understand, Overwrite Server` only when this device is intentionally the source of truth and a current backup exists. diff --git a/docs/tips/hidden-file-sync.md b/docs/tips/hidden-file-sync.md index 95094370..e84570d9 100644 --- a/docs/tips/hidden-file-sync.md +++ b/docs/tips/hidden-file-sync.md @@ -47,7 +47,10 @@ A pattern containing only `snippets` does not admit the `.obsidian` parent, so t ![Hidden File Sync initialisation choices](../../images/hidden-file-sync/guide-hidden-file-enable.png) 2. Under `Enable Hidden File Sync`, select the initialisation direction chosen above. -3. Keep Obsidian open while the initial scan and synchronisation finish. +3. Keep Obsidian open while the initial scan and synchronisation finish. A progress Notice appears when preparation begins and remains visible while the initial scan is running. + + ![Hidden File Sync initial scan progress Notice](../../images/hidden-file-sync/guide-hidden-file-initial-scan-progress.png) + 4. Restart Obsidian when the completion Notice recommends it. 5. Confirm that the expected hidden files, and only those files, are present in the remote synchronisation state. diff --git a/images/couchdb-manual/guide-couchdb-manual-connection-details.png b/images/couchdb-manual/guide-couchdb-manual-connection-details.png new file mode 100644 index 00000000..27a3e54e Binary files /dev/null and b/images/couchdb-manual/guide-couchdb-manual-connection-details.png differ diff --git a/images/couchdb-manual/guide-couchdb-manual-connection-method.png b/images/couchdb-manual/guide-couchdb-manual-connection-method.png new file mode 100644 index 00000000..259ca162 Binary files /dev/null and b/images/couchdb-manual/guide-couchdb-manual-connection-method.png differ diff --git a/images/couchdb-manual/guide-couchdb-manual-encryption.png b/images/couchdb-manual/guide-couchdb-manual-encryption.png new file mode 100644 index 00000000..fa0aa27d Binary files /dev/null and b/images/couchdb-manual/guide-couchdb-manual-encryption.png differ diff --git a/images/couchdb-manual/guide-couchdb-manual-remote-selection.png b/images/couchdb-manual/guide-couchdb-manual-remote-selection.png new file mode 100644 index 00000000..21c02829 Binary files /dev/null and b/images/couchdb-manual/guide-couchdb-manual-remote-selection.png differ diff --git a/images/couchdb-manual/guide-couchdb-manual-server-requirements.png b/images/couchdb-manual/guide-couchdb-manual-server-requirements.png new file mode 100644 index 00000000..a08541aa Binary files /dev/null and b/images/couchdb-manual/guide-couchdb-manual-server-requirements.png differ diff --git a/images/hidden-file-sync/guide-hidden-file-initial-scan-progress.png b/images/hidden-file-sync/guide-hidden-file-initial-scan-progress.png new file mode 100644 index 00000000..b9ddff7d Binary files /dev/null and b/images/hidden-file-sync/guide-hidden-file-initial-scan-progress.png differ diff --git a/images/object-storage-setup/guide-object-storage-setup-missing-remote-configuration.png b/images/object-storage-setup/guide-object-storage-setup-missing-remote-configuration.png index 512b3b6a..79f205fc 100644 Binary files a/images/object-storage-setup/guide-object-storage-setup-missing-remote-configuration.png and b/images/object-storage-setup/guide-object-storage-setup-missing-remote-configuration.png differ diff --git a/images/object-storage-setup/guide-object-storage-setup-retrieval-method.png b/images/object-storage-setup/guide-object-storage-setup-retrieval-method.png index e3d331eb..7a48bf73 100644 Binary files a/images/object-storage-setup/guide-object-storage-setup-retrieval-method.png and b/images/object-storage-setup/guide-object-storage-setup-retrieval-method.png differ diff --git a/images/quick-setup/guide-quick-setup-missing-remote-configuration.png b/images/quick-setup/guide-quick-setup-missing-remote-configuration.png index 512b3b6a..79f205fc 100644 Binary files a/images/quick-setup/guide-quick-setup-missing-remote-configuration.png and b/images/quick-setup/guide-quick-setup-missing-remote-configuration.png differ diff --git a/images/quick-setup/guide-quick-setup-retrieval-method.png b/images/quick-setup/guide-quick-setup-retrieval-method.png index e3d331eb..7a48bf73 100644 Binary files a/images/quick-setup/guide-quick-setup-retrieval-method.png and b/images/quick-setup/guide-quick-setup-retrieval-method.png differ diff --git a/test/e2e-obsidian/scripts/p2p-pane.ts b/test/e2e-obsidian/scripts/p2p-pane.ts index 8ea238c5..8baf00e3 100644 --- a/test/e2e-obsidian/scripts/p2p-pane.ts +++ b/test/e2e-obsidian/scripts/p2p-pane.ts @@ -1,4 +1,6 @@ import { assertLocatorWithinViewport, assertNoHorizontalOverflow } from "@vrtmrz/obsidian-test-session"; +import type { ObsidianLiveSyncSettings } from "@vrtmrz/livesync-commonlib/compat/common/models/setting.type"; +import { upsertRemoteConfigurationInPlace } from "@vrtmrz/livesync-commonlib/remote-configurations"; import type { Page } from "playwright"; import { discoverObsidianCli, requireObsidianBinary } from "../runner/environment.ts"; import { @@ -47,6 +49,17 @@ async function verifyP2PStatusPane(filename: string, mobile: boolean): Promise { throw new Error("Transient Obsidian notices did not become quiet before the P2P status screenshot."); } -const basePluginData = createE2eCouchDbPluginData( - { - uri: "http://127.0.0.1:5984", - username: "", - password: "", - dbName: "p2p-pane-ui-only", - }, - { - notifyThresholdOfRemoteStorageSize: -1, - periodicReplication: false, - P2P_Enabled: false, - P2P_AutoStart: false, - syncAfterMerge: false, - syncOnEditorSave: false, - syncOnFileOpen: false, - syncOnSave: false, - syncOnStart: false, - } -); +function createBaseP2PPluginData(): Record { + return createE2eCouchDbPluginData( + { + uri: "http://127.0.0.1:5984", + username: "", + password: "", + dbName: "p2p-pane-ui-only", + }, + { + notifyThresholdOfRemoteStorageSize: -1, + periodicReplication: false, + P2P_Enabled: false, + P2P_AutoStart: false, + syncAfterMerge: false, + syncOnEditorSave: false, + syncOnFileOpen: false, + syncOnSave: false, + syncOnStart: false, + } + ); +} + +function createConfiguredP2PPluginData(): Record { + const pluginData = { + ...createBaseP2PPluginData(), + P2P_roomID: "configured-p2p-room", + P2P_passphrase: "configured-p2p-passphrase", + }; + upsertRemoteConfigurationInPlace(pluginData as ObsidianLiveSyncSettings, "p2p", { + id: "e2e-p2p", + name: "P2P Remote", + activateForP2P: true, + }); + return pluginData; +} async function withP2PSession( binary: string, @@ -170,18 +199,14 @@ async function main(): Promise { throw new Error(`Could not find obsidian-cli. Checked paths: ${cli.checked.join(", ")}`); } - await withP2PSession(binary, cli.binary, basePluginData, async () => { + await withP2PSession(binary, cli.binary, createBaseP2PPluginData(), async () => { await assertP2PUIIsOptIn(); }); await withP2PSession( binary, cli.binary, - { - ...basePluginData, - P2P_roomID: "configured-p2p-room", - P2P_passphrase: "configured-p2p-passphrase", - }, + createConfiguredP2PPluginData(), async () => { await assertConfiguredP2PUIIsAvailable(); const desktopScreenshot = await verifyP2PStatusPane("p2p-status-pane.png", false);