![]() |
VOOZH | about |
dotnet add package Nodsoft.MoltenObsidian.Vaults.Ftp --version 1.1.15
NuGet\Install-Package Nodsoft.MoltenObsidian.Vaults.Ftp -Version 1.1.15
<PackageReference Include="Nodsoft.MoltenObsidian.Vaults.Ftp" Version="1.1.15" />
<PackageVersion Include="Nodsoft.MoltenObsidian.Vaults.Ftp" Version="1.1.15" />Directory.Packages.props
<PackageReference Include="Nodsoft.MoltenObsidian.Vaults.Ftp" />Project file
paket add Nodsoft.MoltenObsidian.Vaults.Ftp --version 1.1.15
#r "nuget: Nodsoft.MoltenObsidian.Vaults.Ftp, 1.1.15"
#:package Nodsoft.MoltenObsidian.Vaults.Ftp@1.1.15
#addin nuget:?package=Nodsoft.MoltenObsidian.Vaults.Ftp&version=1.1.15Install as a Cake Addin
#tool nuget:?package=Nodsoft.MoltenObsidian.Vaults.Ftp&version=1.1.15Install as a Cake Tool
Molten Obsidian is designed with data source modularity in mind. As such, you'll find a plethora of Vault implementations, matching your needs.
Nodsoft.MoltenObsidian.Vaults.FileSystemThis provider supports the classic way of loading an Obsidian vault, which is through the filesystem. By targeting a directory, you can serve a Molten Obsidian vault from it, independently of that vault being initialized through Obsidian first, or not.
Declare a Filesystem vault in Dependency Injection:
using Microsoft.Extensions.DependencyInjection;
public void ConfigureServices(IServiceCollection services)
{
// Declare a FileSystem vault from path:
services.AddMoltenObsidianFileSystemVault(new DirectoryInfo("/path/to/vault"));
// Alternatively you can declare from an IServiceProvider delegate, returning a path.
services.AddMoltenObsidianFileSystemVault(s => s.GetRequiredService<IMyService>().GetVaultDirectory());
}
Alternatively you can instantiate your own Filesystem vault like so:
using Nodsoft.MoltenObsidian.Vaults.FileSystem;
IVault vault = FileSystemVault.FromDirectory("/path/to/vault");
If any of those features are considered a necessity in your use case, feel free to voice your need by raising an issue.
Nodsoft.MoltenObsidian.Vaults.HttpThis provider supports serving a MoltenObsidian vault hosted on a remote Web server, through HTTP. By targeting a Vault manifest file (generated by the ), you can serve a Molten Obsidian over the wire, which is considered out of bounds of the reference Obsidian implementation.
Applications for this provider vary greatly, as you can now host your Molten Obsidian repository on several platforms :
Relying on the Vault Manifest allows for the vault elements to only be downloaded/streamed on a need basis, instead of prematurely transferring a vault of potentially significant size over the wire. This comes at a cost of immutability, until the manifest is updated.
Declare an HTTP vault in Dependency Injection:
using Microsoft.Extensions.DependencyInjection;
public void ConfigureServices(IServiceCollection services)
{
// Declare a HTTP vault from Web root path.
// This will internally declare and use its own HttpClient. You'll usually avoid this in production-grade scenarions.
services.AddMoltenObsidianHttpVault(new DirectoryInfo("https://path.to/vault"));
// Alternatively you can declare from an IServiceProvider delegate, returning a HttpClient.
// This use case is usually coupled with the use of an IHttpClientFactory to manage the lifetime of the client.
services.AddHttpClient("MoltenObsidian", client => client.BaseAddress = new("https://path.to/vault"));
services.AddMoltenObsidianHttpVault(s => s.GetRequiredService<IHttpClientFactory>().CreateClient("MoltenObsidian"));
}
Alternatively you can instantiate your own HTTP vault like so:
using Nodsoft.MoltenObsidian.Vaults.Http;
// Instantiate the HttpClient.
// Please note that the client's lifetime must follow that of the Vault itself,
// as it will be reused for retrieving the vault's contents on-demand.
HttpClient httpClient = new() { BaseAddress = new("https://path.to/vault") };
// Get the vault manifest from the server.
RemoteVaultManifest manifest = await httpClient.GetFromJsonAsync<RemoteVaultManifest>("moltenobsidian.manifest.json")
?? throw new InvalidOperationException("Failed to retrieve the vault manifest from the server.");
// Instantiate the vault.
IVault vault = HttpRemoteVault.FromManifest(manifest, httpClient);
Please note that the example path used in the above examples reflect the HTTP path preceding the Manifest's moltenobsidian.manifest.json. This means the actual manifest link would be https://path.to/vault/moltenobsidian.manifest.json.
If any of those features are considered a necessity in your use case, feel free to voice your need by raising an issue.
Nodsoft.MoltenObsidian.Vaults.FtpThis provider supports serving a MoltenObsidian vault hosted on a remote FTP server. By targeting a Vault manifest file (generated by the ), you can serve a Molten Obsidian over the wire, which is considered out of bounds of the reference Obsidian implementation.
Declare an FTP vault in Dependency Injection:
using Microsoft.Extensions.DependencyInjection;
public void ConfigureServices(IServiceCollection services)
{
// Add an FTP Client pointing to your remote host, along with credentials if needed,
// Then add an FTP vault that uses that client.
services.AddSingleton(new AsyncFtpClient("ftp.example.com", "user", "password", 21));
services.AddMoltenObsidianFtpVault(s => s.GetRequiredService<AsyncFtpClient>());
}
Alternatively you can instantiate your own FTP vault like so:
using Nodsoft.MoltenObsidian.Vaults.Ftp;
// Instantiate the FtpClient.
// Please note that the client's lifetime must follow that of the Vault itself,
// as it will be reused for retrieving the vault's contents on-demand.
AsyncFtpClient ftpClient = new("ftp.example.com", "user", "password", 21);
// Get the vault manifest from the server.
byte[] bytes = await ftpClient.DownloadBytes("moltenobsidian.manifest.json", CancellationToken.None)
?? throw new InvalidOperationException("Could not download manifest.");
// Instantiate the vault.
IVault vault = FtpRemoteVault.FromManifest(manifest, ftpClient);
Please note that the example path used in the above examples reflect the FTP path preceding the Manifest's moltenobsidian.manifest.json. This means the actual manifest link would be ftp://user:password@path.to/vault/moltenobsidian.manifest.json.
If any of those features are considered a necessity in your use case, feel free to voice your need by raising an issue.
Nodsoft.MoltenObsidian.Vaults.InMemoryThis provider supports creating and managing an Obsidian vault entirely in memory. Unlike other providers that read from external sources, the In-Memory vault is writable and stores all data in memory, making it ideal for testing, temporary vaults, or runtime-generated content.
The In-Memory vault implements IWritableVault, allowing you to create, modify, and delete folders, files, and notes programmatically.
Declare an In-Memory vault in Dependency Injection:
using Microsoft.Extensions.DependencyInjection;
public void ConfigureServices(IServiceCollection services)
{
// Declare an In-Memory vault with a name:
services.AddMoltenObsidianInMemoryVault("MyVault");
}
Alternatively you can instantiate your own In-Memory vault like so:
using Nodsoft.MoltenObsidian.Vaults.InMemory;
// Create a new in-memory vault
IVault vault = new InMemoryVault("MyVault");
// Populate the vault with content
await vault.WriteNoteAsync("Notes/Welcome.md",
new MemoryStream(Encoding.UTF8.GetBytes("# Welcome\nThis is a note in memory.")));
await vault.WriteFileAsync("Assets/image.png", imageStream);
The In-Memory vault supports a "setup mode" which can be enabled to prevent vault update events from being raised during bulk operations:
// Create vault in setup mode
var vault = new InMemoryVault("MyVault", setup: true);
// Populate the vault without triggering events
await vault.WriteNoteAsync("Note1.md", contentStream1);
await vault.WriteNoteAsync("Note2.md", contentStream2);
// Disable setup mode to start receiving events
vault.Setup = false;
If any of those features are considered a necessity in your use case, feel free to voice your need by raising an issue.
Implementing your own vault provider is easy, provided you're familiar with the basics of file tree resolution. Indeed, depending on your data source, you'll have a different experiences implementing a provider, with the vault tree building aspect being the most daunting to all but seasoned devs.
We recommend you follow in the footsteps of the reference provider implementations, so to get a grasp of the concepts involved.
For most cases, here are a few guidelines:
IVault, as this is the root of any entity connected to a vault. You'll have an easier time working your way top-to-bottom.IVaultEntity base/abstract implementation in cases where folders and files are physically represented. In remote sources, this will rarely be the case.IVaultFile implementation. This will allow you to conditionally return a IVaultNote during construction, in case the resolved file turns out to be a Markdown file.| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 net8.0 is compatible. net8.0-android net8.0-android was computed. net8.0-browser net8.0-browser was computed. net8.0-ios net8.0-ios was computed. net8.0-maccatalyst net8.0-maccatalyst was computed. net8.0-macos net8.0-macos was computed. net8.0-tvos net8.0-tvos was computed. net8.0-windows net8.0-windows was computed. net9.0 net9.0 was computed. net9.0-android net9.0-android was computed. net9.0-browser net9.0-browser was computed. net9.0-ios net9.0-ios was computed. net9.0-maccatalyst net9.0-maccatalyst was computed. net9.0-macos net9.0-macos was computed. net9.0-tvos net9.0-tvos was computed. net9.0-windows net9.0-windows was computed. net10.0 net10.0 is compatible. net10.0-android net10.0-android was computed. net10.0-browser net10.0-browser was computed. net10.0-ios net10.0-ios was computed. net10.0-maccatalyst net10.0-maccatalyst was computed. net10.0-macos net10.0-macos was computed. net10.0-tvos net10.0-tvos was computed. net10.0-windows net10.0-windows was computed. |
This package is not used by any NuGet packages.
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.1.15 | 126 | 4/8/2026 |
| 1.1.11 | 349 | 11/12/2025 |
| 1.1.8 | 252 | 11/3/2025 |
| 1.1.2 | 228 | 1/18/2025 |
| 1.1.1 | 286 | 8/25/2024 |
| 1.0.9 | 243 | 7/16/2024 |
| 1.0.7 | 250 | 5/11/2024 |
| 1.0.4-beta | 206 | 4/12/2024 |
| 0.6.10 | 266 | 3/25/2024 |
| 0.6.3 | 261 | 3/23/2024 |
| 0.5.73 | 257 | 2/17/2024 |
| 0.5.67 | 259 | 2/16/2024 |
| 0.5.18 | 327 | 8/11/2023 |
| 0.5.13 | 290 | 6/17/2023 |
| 0.5.12 | 293 | 6/17/2023 |
| 0.5.3 | 309 | 6/14/2023 |
| 0.4.23 | 282 | 6/1/2023 |