diff --git a/.claude/context.md b/.claude/context.md deleted file mode 100644 index 0ded434..0000000 --- a/.claude/context.md +++ /dev/null @@ -1,17 +0,0 @@ -## Status (2026-06-14) -**Branch:** feat/m2-capture-pipeline (off main; remote main = github.com/istefox/obsidian-bookmarker, public) -**Last commit:** 51f838e — feat(preview): candidate extraction, Microlink screenshot, cover picker (NOT pushed yet) -**Done:** M1/M2/M2.5 + hardening; EX1 extension; M3 (classifier + review modal + link-embed card); -prompt tuning; Note name field; preview images (extraction chain → Microlink synchronous screenshot -→ wsrv.nl proxy → cover picker in modal with candidate thumbnails + None + custom Cover URL). -Verified in TEST: Amazon now shows a real Microlink screenshot, proxied via wsrv.nl. -**Direction:** make it Raindrop-like. ADR-001 = thin extension + obsidian://bookmark, no backend. -**Roadmap (user-approved, queued):** 1) grid/cover dashboard view (ItemView with cover cards + filters -by tag/folder/domain/type) — the big "Raindrop feeling" item; 2) duplicate-URL detection (normalize URL, -warn if already saved); 3) type detection (article/video/image/doc) + favorites flag; 4) broken-link -checker (on-demand command) + import from Pocket/Raindrop HTML/CSV. -**Out of scope (needs backend):** full-text content search, web archive, AI search, collaboration/public/RSS. -**Open decisions:** confirm plugin id `obsidian-bookmarker` + minAppVersion 1.5.0 (brief §14). -**Notes:** card preview needs obsidian-link-embed installed (Settings → Preview has install button). -Settings: useImageProxy + enableScreenshotFallback (both default ON, new keys). Reload plugin after each -build copy into TEST. /humanize-en required on all commit messages (public repo). diff --git a/.claude/test-cmd b/.claude/test-cmd deleted file mode 100644 index 4cf218f..0000000 --- a/.claude/test-cmd +++ /dev/null @@ -1 +0,0 @@ -npx tsc -noEmit -skipLibCheck diff --git a/.gitignore b/.gitignore index eee9dc9..08fb099 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,6 @@ data.json # OS .DS_Store + +# Claude Code session/tooling files +.claude/ diff --git a/CLAUDE.md b/CLAUDE.md index adf610b..0d99013 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,9 +1,9 @@ # CLAUDE.md ## What is this project -Obsidian Bookmarker — a custom Obsidian plugin that captures web URLs as Markdown +Obsidian Bookmarker is a custom Obsidian plugin that captures web URLs as Markdown bookmarks in the vault, with og:image preview, AI-proposed tags, and AI-proposed -destination subfolder. Personal-first, structured to be community-release-ready later. +destination subfolder. ## Stack TypeScript, Obsidian Plugin API, esbuild (standard `obsidian-sample-plugin` scaffold). @@ -23,7 +23,7 @@ image download/fallback → classify → review modal → write note into chosen - Free service layers, all default-on, all degrade gracefully: Microlink (image fallback), favicon fallback, Wayback archive snapshot. - Root folder `_bookmarks`; categories = subfolders; assets in `_bookmarks/_assets/`. -- Settings via `PluginSettingTab` + `loadData`/`saveData` (see brief §8 for schema). +- Settings via `PluginSettingTab` + `loadData`/`saveData`. ## Gotchas - Mobile + desktop both supported (`isDesktopOnly: false`). Every constraint below exists @@ -33,6 +33,5 @@ image download/fallback → classify → review modal → write note into chosen - HTML parsing: `new DOMParser()`. No cheerio/jsdom. - File I/O: Obsidian vault API only (`vault.create`, `createBinary`, `createFolder`). No Node-only modules anywhere (`fs`, `path`, `child_process`, `electron`, `puppeteer`). -- Never log the API key or full request bodies. Key lives plaintext in `data.json` — - settings UI must warn about `.obsidian` sync. -- Source-of-truth spec: `~/Downloads/20260613_ObsidianBookmarker_Brief_v1.md` (build brief v1). +- Never log the API key or full request bodies. Key lives plaintext in `data.json`; + the settings UI must warn about `.obsidian` sync. diff --git a/README.md b/README.md index 602e905..f3e13a9 100644 --- a/README.md +++ b/README.md @@ -64,11 +64,13 @@ The fallback link at the bottom works even without a preview plugin installed. ## Install -Bookmarker is not in the community plugin directory yet, so install it manually: +From inside Obsidian: open Settings, go to Community plugins, Browse, search for "Bookmarker", and install. Then enable it. -1. Build the plugin (`npm install && npm run build`) or grab `main.js`, `manifest.json`, and `styles.css` from a release. -2. Copy those three files into `/.obsidian/plugins/bookmarker/`. -3. Enable **Bookmarker** in Obsidian's Community Plugins settings, then reload. +To install manually instead: + +1. Download `main.js`, `manifest.json`, and `styles.css` from a [release](https://github.com/istefox/obsidian-bookmarker/releases). +2. Copy them into `/.obsidian/plugins/bookmarker/`. +3. Enable Bookmarker in Community plugins, then reload. ### Browser extension (desktop one-click) diff --git a/extension/README.md b/extension/README.md index 32c6d51..997c9da 100644 --- a/extension/README.md +++ b/extension/README.md @@ -68,10 +68,6 @@ cd icons for s in 16 32 48 128; do rsvg-convert -w $s -h $s icon.svg -o icon-$s.png; done ``` -## Publishing - -See `SUBMISSION.md` for the Chrome Web Store submission steps (packaging, listing, privacy form). - ## Not included yet Firefox build, passing selected text/title. diff --git a/extension/SUBMISSION.md b/extension/SUBMISSION.md deleted file mode 100644 index b3cd094..0000000 --- a/extension/SUBMISSION.md +++ /dev/null @@ -1,81 +0,0 @@ -# Chrome Web Store submission: Bookmarker for Obsidian - -A step-by-step guide to publish this extension on the Chrome Web Store. It assumes you already have a paid Chrome Web Store developer account. - -This extension is an unofficial, third-party companion to Obsidian. Say so in the listing so reviewers and users are not misled about an affiliation that does not exist. - -## What is already done - -- Manifest V3, `activeTab` permission only, no host permissions. -- Icons at 16, 32, 48, and 128 px in `icons/`, wired into both `action.default_icon` and the top-level `icons` field. The 128 px icon doubles as the store icon. - -## What you still need to provide - -These are image assets this repo cannot generate for you: - -1. **At least one screenshot**, 1280×800 or 640×400, PNG or 24-bit JPG (no alpha). Up to five. A good first shot: the toolbar button on a normal web page next to a saved note in Obsidian. -2. **Small promo tile** (optional but recommended), 440×280 PNG or JPG. - -## Step 1: Package the extension - -The Web Store wants a zip whose root contains `manifest.json` directly, not a nested folder. From the repo root: - -```bash -cd extension -zip -r ../bookmarker-extension.zip manifest.json background.js icons/icon-16.png icons/icon-32.png icons/icon-48.png icons/icon-128.png -``` - -`icon.svg`, `README.md`, and `SUBMISSION.md` stay out of the package. They are source and docs, not runtime files. - -Verify the zip has `manifest.json` at the top level: - -```bash -unzip -l ../bookmarker-extension.zip -``` - -## Step 2: Create the listing - -In the [developer dashboard](https://chrome.google.com/webstore/devconsole), choose "Add new item" and upload the zip. Then fill in the store listing: - -- **Name:** Bookmarker for Obsidian -- **Summary** (132 chars max): One-click save of the current page into your Obsidian vault, with AI tags and a preview, via the Bookmarker plugin. -- **Category:** Productivity -- **Language:** English -- **Detailed description:** see the block below. - -### Detailed description (paste this) - -Bookmarker for Obsidian saves the page you are on into your Obsidian vault with one click. - -The extension stays small on purpose. It reads the current tab's URL when you click the toolbar button and hands it to the Bookmarker Obsidian plugin through the `obsidian://bookmark` link. The plugin does the real work: fetch the page, pull its title and preview image, propose tags and a destination folder, and write a Markdown note into your vault. - -Requirements: -- The Bookmarker plugin installed and enabled in Obsidian. -- Obsidian running or launchable, since it registers the `obsidian://bookmark` handler. - -Privacy: the extension asks for `activeTab` only. It reads the active tab's URL when you click and nothing else. No host permissions, no tracking, no data sent to any server we run. - -This is an unofficial, third-party extension and is not affiliated with or endorsed by Obsidian. - -## Step 3: Privacy practices tab - -This is where most first submissions get held up. Fill every field. - -- **Single purpose:** Save the current browser tab to an Obsidian vault by handing its URL to the Bookmarker Obsidian plugin. -- **`activeTab` justification:** The extension reads the active tab's URL only when the user clicks the toolbar button, to pass it to Obsidian. It uses no host permissions and accesses no other tabs. -- **Data usage:** the extension collects nothing. Check every "I do not sell or transfer…" and "I do not use or transfer for purposes unrelated…" box, then certify compliance. -- **Privacy policy URL:** Chrome requires one even when you collect no data. The policy lives in `extension/PRIVACY.md`. Once it is on `main`, paste this URL into the form: - - `https://github.com/istefox/obsidian-bookmarker/blob/main/extension/PRIVACY.md` - -## Step 4: Submit and wait - -Submit for review. Review usually takes a few days; a first submission from a new account can take longer. You get an email on approval or rejection. Rejections name the policy and the fix, so read them and resubmit. - -## Step 5: Updates after approval - -To ship a new version, raise `version` in `manifest.json`, re-zip with the Step 1 command, and upload the new package in the dashboard. Installed users update automatically. - -## Known review risk - -A reviewer who tests the extension without Obsidian installed sees the toolbar button flash a red badge and do nothing, because no `obsidian://bookmark` handler is registered. That is expected behavior, but it can read as "broken." The detailed description and the requirements line above exist to set that expectation. If a rejection cites this, reply that the extension is a documented companion to an Obsidian plugin and behaves correctly when that plugin is present.