Keep attachments in your own S3, Cloudflare R2 or Backblaze B2 bucket. Paste, drop or move files and get links that work on every device.
Keep your attachments in your own S3, Cloudflare R2, Backblaze B2, DigitalOcean Spaces or MinIO bucket, on desktop and mobile. Notes stay small and keep syncing the way they do now; files live in your bucket and every link is a plain https:// URL, so notes work without the plugin too.
![[a.png|300]] becomes ), and the local copies go to the trash. Links in front matter, code and canvases are left alone, and their files stay. Every move can be undone.{short} codes that never replace another file, and destinations moved over with a transfer code.Or choose Add manually and enter the endpoint, bucket, public URL and keys.
On a Mac or PC with Aktar, Settings > Aktar > Aktar app > Connect pairs the plugin with the app instead (Aktar for Mac 0.19 or Windows 0.12 and later; with older versions, paste the token from Aktar's Settings > Integrations, or use the CLI's aktar login). Its destinations show up in the plugin; on a phone, add the same destination's keys with a transfer code and it's the same destination there.
Destinations are kept in the plugin's data.json, which syncs with the vault. Keys never go there. They're stored in Obsidian's secret storage on each device, and secret storage doesn't sync. A device that has a destination but not its keys says so and asks for a transfer code.
The default path is obsidian/{vault}/{year}/{month}/{short}.{ext}, so each vault has a folder of its own in the bucket, and files that no note uses can be found there. Variables: {vault} {note} {noteFolder} {year} {month} {day} {date} {time} {short} {filename} {ext} {uuid} {random} {sha256}.
Moved attachments get keys that only depend on the file, so two synced devices moving the same file write the same object and the same links.
The plugin connects only to the storage endpoints and public URLs of the destinations you add, and on desktop to the Aktar app on 127.0.0.1 when you pair with it. It collects no data and sends no telemetry.
The release files are built by GitHub Actions from the tagged commit and signed with an artifact attestation: gh attestation verify main.js -R getaktar/obsidian.
pnpm install
pnpm dev # watch build into main.js
pnpm check # typecheck, production build, tests, shared-code check
To try it, copy or symlink main.js, manifest.json and styles.css into <vault>/.obsidian/plugins/aktar/ of a test vault. The S3 tests start a throwaway MinIO server when the minio binary is installed, and are skipped otherwise.
Some code (src/s3/sigv4.ts, xml.ts, endpoint.ts, and parts of src/core) is shared with the other Aktar apps and has to stay the same as theirs. pnpm check:ported compares it with their source when it's available, and is skipped otherwise. test/transferVectors.ts holds the transfer test vectors shared by all the apps.
Releases: pnpm version <x.y.z> updates manifest.json and versions.json, then pushing the tag builds and publishes a GitHub release with main.js, manifest.json and styles.css.
See ROADMAP.md for what comes next.