Browser extensions

Adding local destinations to a web clipper

Local Web Clipper started as a fork of Obsidian Web Clipper. I wanted to preserve its extraction and template behavior while letting people save the generated Markdown without requiring Obsidian.

The browser constraint

A browser extension cannot silently write to any path on someone’s computer. Direct folder access requires an explicit picker and permission, and the API is not available everywhere.

The boundary I added

I kept the change after Markdown generation and put destination-specific behavior behind one save interface:

extract page data
  → apply template
  → generate Markdown
  → ClipDestination.save()

The local-directory destination stores the chosen handle in IndexedDB and requests permission again when needed. The Downloads destination uses relative browser download paths. Clipboard remains the simplest manual fallback.

What I check

The destinations need separate checks because each one depends on different browser behavior. I build and load the Chromium extension locally, run the existing tests, and confirm folder permission, filename conflicts, Downloads fallback, and Clipboard output independently.

View the repository and architecture notes ↗