No description
Find a file
Charles Kelsoe 9cfc3ecaae docs: disclose scanned capabilities with facts in README and privacy
The Obsidian preview scan flags three real capabilities: filesystem access
(outside-vault media download), vault file enumeration (dedup + folder
auto-complete), and clipboard (copy debug log, write only). All are legitimate
and necessary or opt-in. Document each plainly in a README Permissions section
and reconcile PRIVACY.md (add device-access detail, fix the enumeration nuance,
drop the BRAT reference, bump the date) rather than removing the functionality.
2026-06-15 19:25:20 -04:00
.github CI: suppress js-yaml dev-only OSV advisory GHSA-h67p-54hq-rp68 2026-06-15 18:35:07 -04:00
__tests__ Add endless scroll, select-all, item counts, and custom-domain Substack detection 2026-06-15 17:34:02 -04:00
scripts Scaffold from standard plugin template 2026-06-14 13:57:19 -04:00
.editorconfig Scaffold from standard plugin template 2026-06-14 13:57:19 -04:00
.gitignore Wave A: leaf modules (logger, pacer, paywall, dismiss, index, note-writer) 2026-06-14 14:11:12 -04:00
.npmrc Scaffold from standard plugin template 2026-06-14 13:57:19 -04:00
add-feed-modal.ts Fix add-feed Save button doing nothing 2026-06-14 16:16:47 -04:00
CHANGELOG.md Release 1.0.0: first stable release 2026-06-15 18:30:22 -04:00
cleanup.ts Feature: per-feed deterministic cleanup (link-host + trim rules) 2026-06-14 17:34:05 -04:00
CONTRIBUTING.md Scaffold from standard plugin template 2026-06-14 13:57:19 -04:00
debug-logger.ts Wave A: leaf modules (logger, pacer, paywall, dismiss, index, note-writer) 2026-06-14 14:11:12 -04:00
dismiss-store.ts Wave A: leaf modules (logger, pacer, paywall, dismiss, index, note-writer) 2026-06-14 14:11:12 -04:00
duplicate-prompt-modal.ts Phase 5: apply adversarial-review fixes 2026-06-14 15:26:45 -04:00
esbuild.config.mjs Scaffold from standard plugin template 2026-06-14 13:57:19 -04:00
eslint.config.mts Scaffold from standard plugin template 2026-06-14 13:57:19 -04:00
feed-picker-modal.ts Phase 5: apply adversarial-review fixes 2026-06-14 15:26:45 -04:00
feed-resolver.ts Add endless scroll, select-all, item counts, and custom-domain Substack detection 2026-06-15 17:34:02 -04:00
feed-source.ts Feature: Substack archive backfill (load older than the RSS window) 2026-06-14 17:18:56 -04:00
feed-xml.ts Wave B: XML parser, HTML-to-Markdown converter, feed resolver 2026-06-14 14:32:39 -04:00
fetch-pacer.ts Wave A: leaf modules (logger, pacer, paywall, dismiss, index, note-writer) 2026-06-14 14:11:12 -04:00
folder-suggest.ts Wave D: import services and UI shell 2026-06-14 15:01:59 -04:00
html-converter.ts Converter: strip Substack app-install / subscribe / CTA clutter 2026-06-14 16:27:53 -04:00
image-downloader.ts Phase 5: apply adversarial-review fixes 2026-06-14 15:26:45 -04:00
import-modal.ts Add endless scroll, select-all, item counts, and custom-domain Substack detection 2026-06-15 17:34:02 -04:00
import-runner.ts Feature: per-feed deterministic cleanup (link-host + trim rules) 2026-06-14 17:34:05 -04:00
jest.config.cjs Add jest test harness: obsidian mock + moduleNameMapper wiring 2026-06-14 14:03:11 -04:00
LICENSE Scaffold from standard plugin template 2026-06-14 13:57:19 -04:00
main.ts Feature: per-feed deterministic cleanup (link-host + trim rules) 2026-06-14 17:34:05 -04:00
manifest.json Release 1.0.0: first stable release 2026-06-15 18:30:22 -04:00
media-downloader.ts Feature: per-feed media (audio/video) download 2026-06-14 16:59:44 -04:00
note-writer.ts Feature: per-feed media (audio/video) download 2026-06-14 16:59:44 -04:00
osv-scanner.toml CI: suppress js-yaml dev-only OSV advisory GHSA-h67p-54hq-rp68 2026-06-15 18:35:07 -04:00
package-lock.json Release 1.0.0: first stable release 2026-06-15 18:30:22 -04:00
package.json Release 1.0.0: first stable release 2026-06-15 18:30:22 -04:00
paywall-detector.ts Wave A: leaf modules (logger, pacer, paywall, dismiss, index, note-writer) 2026-06-14 14:11:12 -04:00
PRIVACY.md docs: disclose scanned capabilities with facts in README and privacy 2026-06-15 19:25:20 -04:00
README.md docs: disclose scanned capabilities with facts in README and privacy 2026-06-15 19:25:20 -04:00
SECURITY.md Docs: MVP-accurate README, PRIVACY, SECURITY 2026-06-14 14:40:39 -04:00
settings-tab.ts Add endless scroll, select-all, item counts, and custom-domain Substack detection 2026-06-15 17:34:02 -04:00
settings.ts Feature: per-feed deterministic cleanup (link-host + trim rules) 2026-06-14 17:34:05 -04:00
source-common.ts Feature: Substack archive backfill (load older than the RSS window) 2026-06-14 17:18:56 -04:00
source-generic.ts Feature: Substack archive backfill (load older than the RSS window) 2026-06-14 17:18:56 -04:00
source-substack.ts Feature: Substack archive backfill (load older than the RSS window) 2026-06-14 17:18:56 -04:00
styles.css Add endless scroll, select-all, item counts, and custom-domain Substack detection 2026-06-15 17:34:02 -04:00
tsconfig.json Scaffold from standard plugin template 2026-06-14 13:57:19 -04:00
turndown-plugin-gfm.d.ts Wave B: XML parser, HTML-to-Markdown converter, feed resolver 2026-06-14 14:32:39 -04:00
types.d.ts Scaffold from standard plugin template 2026-06-14 13:57:19 -04:00
ui-helpers.ts Wave D: import services and UI shell 2026-06-14 15:01:59 -04:00
vault-index.ts Wave A: leaf modules (logger, pacer, paywall, dismiss, index, note-writer) 2026-06-14 14:11:12 -04:00
version-bump.mjs Scaffold from standard plugin template 2026-06-14 13:57:19 -04:00
versions.json Release 1.0.0: first stable release 2026-06-15 18:30:22 -04:00

RSS Importer

CI Release Downloads Stars Obsidian License: MIT Latest

Import articles and podcasts from RSS, Atom, and Substack feeds into your vault as Markdown notes, organized by source feed and deduplicated by note identity.

It is an importer, not a reader. It writes notes you own and then gets out of the way.

Note

RSS Importer writes (and, with the cleanup command, rewrites) notes in your vault. As with any tool that creates files on your behalf, keep backups and try it on a test vault first. Provided "as is", without warranty, under the MIT License.

Requirements

  • Obsidian v1.13.0 or newer.
  • Desktop only (Windows, macOS, Linux). It is not available on mobile.

Features

  • Multiple sources. Add any RSS, Atom, or podcast feed. Substack publications are first-class: paste an @handle, a subdomain, a custom domain, or a post URL and the plugin resolves it to the right feed.
  • One folder per feed, never re-imports. Each feed imports into its own destination folder, and every note carries a stable identity in its frontmatter, so moving or renaming notes never causes duplicates on the next import. Reorganize into subfolders freely.
  • Add-feed preview. Paste a feed and resolve it to preview the publication title, host, recent item titles, and source type before you commit.
  • Three-state import window. Each item shows as imported, dismissed, or available, with checkboxes, live progress, and a result summary. Dismissing is reversible, and imported items update immediately. A Select all toggle checks every available item at once, and counts show how many items are loaded and how many are selected.
  • Archive backfill with endless scroll. For Substack feeds, older posts load automatically as you scroll the import list, paging back through the publication's archive well beyond the recent RSS window and fetching bodies on demand. A "Load older" button is also there as a fallback and end-of-archive indicator.
  • Re-detect source. A custom-domain Substack is recognized as Substack on add. If one was added before that detection existed, a per-feed Re-detect button upgrades it in place so it gains archive backfill, without removing and re-adding the feed.
  • Clean Markdown. Article HTML is converted to tidy Markdown (headings, lists, tables, code blocks with language, captions, footnotes), with Substack subscribe/app/share widgets stripped.
  • Per-feed cleanup rules. Remove promotional clutter by link target (for example a "buy me a coffee" or subscribe block) or trim a trailing footer, applied on import and re-runnable over existing notes with the Clean up imported notes command. Matching is by link and structure, not wording, so rules keep working when the text changes.
  • Images. Link to the original image URLs, or download images into your vault.
  • Media. Download podcast/audio/video enclosures into a vault subfolder or to a folder outside the vault, per feed.
  • Tidy tags. Feed tags are written to a feed-tags note property by default so they do not flood the global tag pane, or to Obsidian tags if you prefer.
  • Per-feed overrides. Most defaults (destination, note name, images, media, cleanup, tags) can be set globally and overridden per feed.

Usage

  1. Open Settings → RSS Importer → Feeds → Add feed. Paste a feed URL or Substack handle, click Resolve to preview, choose a destination folder, optionally add tags and cleanup rules, and save.
  2. Run the Import from a feed command (or the ribbon icon) to open the import window. Tick items (or use Select all) and import; for Substack, scroll the list to load older archived posts automatically. The summary reports what was created, skipped, or failed.
  3. Optionally run Clean up imported notes to re-apply a feed's cleanup rules to notes you already imported.

Permissions and access

RSS Importer is desktop-only, runs entirely on your device, and has no telemetry or maintainer server. Obsidian's plugin scan discloses three capabilities. Here is exactly what each is and why it exists:

  • Filesystem access outside the vault. Used only by the optional save media outside the vault setting. When you turn it on and choose a folder, the plugin writes downloaded podcast, audio, or video files to that folder with Node's fs module, because Obsidian's vault API cannot write outside the vault. It is guarded to desktop only, writes only to the folder you configure, and reads nothing. With the setting off (the default), the plugin never touches the filesystem outside your vault.
  • Vault file enumeration. The plugin lists note paths for two reasons: to find the notes it already imported so it never creates duplicates, and to offer folder auto-complete in settings. It reads the frontmatter of notes in your destination folders to match them, and does not read the contents of unrelated files.
  • Clipboard, write only. The only clipboard use is the copy debug log action, which writes the plugin's own diagnostic log to your clipboard so you can paste it into a bug report. It never reads the clipboard, so it cannot see anything you copied elsewhere.

None of these send data anywhere. Full network and data behavior is in PRIVACY.md.

Installation

In Obsidian, go to Settings → Community plugins → Browse, search for RSS Importer, then install and enable it. This is the recommended way to install and to receive updates.

Manual installation

  1. Download main.js, manifest.json, and styles.css from the latest release.
  2. Create a folder named rss-importer in your vault's .obsidian/plugins/ directory.
  3. Copy the downloaded files into this folder.
  4. Reload Obsidian, then enable RSS Importer in Settings → Community plugins.

Changelog

See CHANGELOG.md for release history.

Contributing

See CONTRIBUTING.md for setup, quality gates, and conventions.

License

MIT. See LICENSE.