README file from
GithubRefRaindrop
RefRaindrop is an Obsidian plugin that syncs Raindrop.io bookmarks into your vault and adds AI-oriented bookmark indexes.
It is designed for using bookmarks as a lightweight knowledge base for later AI-assisted thinking. It does not store full page content in your vault. Instead, each note keeps the URL, Raindrop metadata, your local notes, and compact AI index fields.
The name "RefRaindrop" is a wordplay on "reference", "refrain", and "Raindrop". This project is an independent community plugin and is not affiliated with or endorsed by Obsidian or Raindrop.io.
Features
- Sync all bookmarks from the Raindrop API
- Support multiple Raindrop accounts
- Store each account in a separate vault folder
- Always use
{raindrop_id}.mdas the filename - Store files directly under the configured folder, without date-based subfolders
- Update existing notes by
raindrop_idor URL instead of recreating files - Preserve AI fields and
## Local Notes - Clear
last_http_statusonly when Raindrop metadata changes - Track AI processing and failure state with reserved
ai_summaryvalues - Configure Raindrop tokens, folders, AI provider, language, and ignore rules from Obsidian settings
- Configure ignored hosts directly in the Obsidian settings UI
- Provide commands for sync only, AI indexing only, and sync-then-index
Note Format
RefRaindrop uses a readable Markdown structure and updates only the sections and frontmatter fields it owns.
---
title: Example
source: https://example.com/article
type: article
created: 2026-06-27T01:02:03.000Z
lastupdate: 2026-06-27T04:05:06.000Z
id: 123
raindrop_id: 123
raindrop_account: home
tags:
- ai
raindrop_tags:
- ai
ai_summary:
ai_keywords:
ai_concepts:
ai_technologies:
ai_use_cases:
ai_limitations:
ai_writeprotect: false
last_http_status:
---
Reserved AI status values:
ai_summary: __AI_PROCESSING__
ai_summary: __AI_FAILED__
Notes with either reserved value are retried on the next AI indexing run. AI output is stored only in ai_xxx frontmatter fields and is not written to the note body.
Body structure:
# Title
# User Notes
## Raindrop Note
Raindrop note. Updated by sync.
## Local Notes
Your own notes. Preserved by sync.
# Raindrop
## Description
Raindrop excerpt. Updated by sync.
---
## Details
- **Type**: article
- **Domain**: example.com
- **Created**: ...
- **Updated**: ...
- **Tags**: #ai
- **Source**: [Open](https://example.com/article)
Installation
Plugin files live under:
plugin/ref-raindrop/
Manual install:
mkdir -p /path/to/YourVault/.obsidian/plugins/ref-raindrop
cp plugin/ref-raindrop/manifest.json /path/to/YourVault/.obsidian/plugins/ref-raindrop/
cp plugin/ref-raindrop/main.js /path/to/YourVault/.obsidian/plugins/ref-raindrop/
cp plugin/ref-raindrop/styles.css /path/to/YourVault/.obsidian/plugins/ref-raindrop/
cp plugin/ref-raindrop/versions.json /path/to/YourVault/.obsidian/plugins/ref-raindrop/
Then open Obsidian and enable RefRaindrop from Settings -> Community plugins.
Settings
Open Settings -> RefRaindrop.
Raindrop account settings:
Enabled: include this account in syncAccount name: written toraindrop_account, for examplehomeorworkRaindrop test token: Raindrop.io test tokenDestination folder: for exampleBookmarks/Raindrop/home
Multiple account example:
home -> Bookmarks/Raindrop/home
work -> Bookmarks/Raindrop/work
AI settings:
AI provider:Ollama,OpenAI, orGeminiAI model: model for the selected provider. If model listing is not allowed, only the current/default model is shownOllama URL: defaulthttp://localhost:11434OpenAI base URL: defaulthttps://api.openai.com/v1OpenAI API key: stored only in Obsidian plugin settingsGemini API key: stored only in Obsidian plugin settingsOutput language: language for AI summaries and index fields. Default isJapaneseIgnored hosts: hosts that must never be fetched or summarizedBlock private networks: enabled by defaultSync on startup: run one sync after Obsidian startsIndex after startup sync: also run AI indexing after startup syncPage request timeout seconds: default20Ollama timeout seconds: default120; also used for OpenAI/Gemini generationRaindrop timeout seconds: default30Max AI indexes per run: default25; use0for unlimitedDelay between AI indexes milliseconds: default1000; use0for no delay
API keys are stored in Obsidian plugin settings. They are not written to bookmark notes.
OpenAI uses the Responses API (/v1/responses). Gemini uses models/{model}:generateContent. The default Gemini model is gemini-2.5-flash.
For a restricted OpenAI API key, the required permission is Responses (/v1/responses): Write. If List models is not allowed, the model dropdown falls back to gpt-5-nano.
Tokens And API Keys
Raindrop:
- Open https://app.raindrop.io/settings/integrations.
- Create or open an app/integration.
- Generate a test token.
- Paste it into
Raindrop test token.
The plugin uses the token to read your Raindrop bookmarks. It does not write back to Raindrop.
OpenAI:
- Open https://platform.openai.com/api-keys.
- Create a project API key.
- For a Restricted key, grant
Responses (/v1/responses): Write. List modelsis optional. Without it, the model dropdown shows only the current/default model.- Set billing or credits in the OpenAI Platform if API requests return quota errors.
Gemini:
- Open https://aistudio.google.com/apikey.
- Create an API key.
- Paste it into
Gemini API key. - Enable billing or quota as needed if Gemini returns 429 quota errors.
Keep all tokens and API keys out of Git. They belong only in Obsidian plugin settings.
Commands
Run commands from the Command Palette:
RefRaindrop: Sync Raindrop bookmarksRefRaindrop: Sync Raindrop bookmarks, then indexRefRaindrop: Index current bookmarkRefRaindrop: Force index current bookmarkRefRaindrop: Index all synced bookmarksRefRaindrop: Force index all synced bookmarksRefRaindrop: Reload ignored hosts
Start with Sync Raindrop bookmarks and verify the generated Markdown before running AI indexing.
Initial AI indexing is intentionally throttled. By default, RefRaindrop indexes at most 25 bookmarks per run and waits 1000 ms between page fetches. This avoids hitting many bookmarked websites in a burst during the first import.
Ignored Hosts
Hosts that must never be fetched for AI indexing can be listed in Settings → Community plugins → RefRaindrop → Ignored hosts.
Example:
intranet.local
corp.example.com
*.internal.example.com
https://private.example.com/path
Matching rules:
corp.example.commatches bothcorp.example.comand its subdomains*.internal.example.commatches subdomains only- If a URL is written, only its hostname is used
The plugin also blocks localhost, .local, private IPv4 ranges, and link-local IPv4 ranges by default.
Development
Release files:
manifest.json
versions.json
plugin/ref-raindrop/manifest.json
plugin/ref-raindrop/main.js
plugin/ref-raindrop/styles.css
plugin/ref-raindrop/versions.json
Run release checks:
PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s tests
These checks validate plugin metadata, release files, delimiter balance in main.js, and accidental legacy naming. They do not replace manual testing inside Obsidian.
GitHub Actions runs the same release checks.
Release a new version:
- Update
versioninmanifest.jsonandplugin/ref-raindrop/manifest.json. - Add the same version to
versions.jsonandplugin/ref-raindrop/versions.json. - Commit the change.
- Tag the commit, for example
git tag 0.1.0. - Push the tag, for example
git push origin 0.1.0.
The release workflow also accepts v0.1.0 style tags, but Obsidian's sample plugin recommends using the exact manifest version without a v prefix.
The release workflow creates a GitHub Release and attaches:
main.jsmanifest.jsonstyles.css
For Obsidian community plugin submission, keep these files available in the repository root:
README.mdLICENSEmanifest.jsonversions.json
License
MIT License. See LICENSE.