简体中文 | English
AI tag management and governance for Obsidian vaults.
AI Tag Curator is not a generic "generate tags for this note" plugin. It helps you keep an existing Obsidian tag taxonomy coherent by reusing known tags, explaining recommendations, and surfacing vault-level tag problems before any risky cleanup work.
Vault tag index

Current note recommendations

Safe folder batch preview

Vault-level tag health report

Settings

edge-small prompt profile with one concurrent folder-batch request.Auto language mode following Obsidian.Choose a Provider preset first, then configure as needed:
Provider type (shown only for the Custom preset)API base URL (read-only for standard presets and editable for Custom)API key (required for remote providers, optional for local providers)ModelJSON modePrompt profileProvider concurrencyExample OpenAI-compatible settings:
| Provider | Type | API base URL | API key | Model example |
|---|---|---|---|---|
| OpenAI | Remote | https://api.openai.com/v1 |
Required | gpt-4o-mini |
| DeepSeek | Remote | https://api.deepseek.com |
Required | deepseek-chat |
| Ollama | Local | http://127.0.0.1:11434/v1 |
Optional | qwen3.8:27b |
| LM Studio | Local | http://127.0.0.1:1234/v1 |
Optional | The locally loaded model name |
| LiteRT-LM CLI | Local | http://127.0.0.1:9379/v1 |
Optional | The model exposed by litert-lm serve |
The API key is stored locally in Obsidian plugin data and is not written into folder-batch snapshots or operation logs. The plugin does not install, start, download, or manage local models. If a local endpoint is not 127.0.0.1 / localhost, settings and folder-scope confirmation warn that content is sent to that address.
Apple Foundation Models, Android Gemini Nano/AICore, Chrome Prompt API, and LiteRT-LM JS are not bundled directly into the Obsidian plugin runtime. This stage only connects through an explicit local OpenAI-compatible endpoint. See the Chinese on-device model support research.
This path was validated on an Apple M2 Pro with 32GB unified memory using Ollama 0.32.15 and the approximately 17GB qwen3.8:27b model. Choose a smaller model on machines with less available memory.
brew install --cask ollama-app
ollama --version
Launch the Ollama app. When you need to run the service manually, use ollama serve.
ollama pull qwen3.8:27b
ollama list
curl -fsS http://127.0.0.1:11434/api/version
curl -fsS http://127.0.0.1:11434/v1/models
curl -fsS http://127.0.0.1:11434/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{"model":"qwen3.8:27b","messages":[{"role":"user","content":"Return exactly {\"ok\":true} as JSON."}],"stream":false}'
Ollamahttp://127.0.0.1:11434/v1 (managed by the preset)qwen3.8:27bedge-small, concurrency 1; JSON mode starts off and can be enabled after a successful compatibility testSwitching providers clears the previous API key and applies safe destination defaults. Local model tests and recommendations may take several minutes. Cancelling discards late UI results, but a request already sent to Ollama may continue inference until it settles.
The plugin currently uses text chat/completions and requires parseable structured JSON. Even when Ollama, LocalAI, or another runtime supports more, the plugin does not currently call vision, image generation, speech, embeddings, tools/agents, streaming, or native Apple/Google on-device SDKs.
lsof -nP -iTCP:11434 -sTCP:LISTEN and /api/version.ollama list and use the exact model name in plugin settings.response_format incompatibility: expand Advanced model settings, turn JSON mode off, and test again.edge-small, confirm the model follows structured-output instructions, or choose a model with stronger instruction following.ollama ps, avoid keeping multiple large models resident, reduce batch concurrency, or use a smaller model.npm install
npm run build
mkdir -p /path/to/your-vault/.obsidian/plugins/ai-tag-curator
cp main.js manifest.json styles.css .hotreload /path/to/your-vault/.obsidian/plugins/ai-tag-curator/
Settings -> Community plugins, and enable AI Tag Curator.Generated plugin files:
main.jsmanifest.jsonstyles.css.hotreload for local development with the Hot Reload pluginFor local development, you can install directly into an Obsidian vault:
OBSIDIAN_VAULT_PATH=/path/to/your-vault npm run local:install
To install a side-by-side development copy without replacing the Marketplace plugin:
OBSIDIAN_VAULT_PATH=/path/to/your-vault npm run local:install-dev
The install script requires an explicit OBSIDIAN_VAULT_PATH so it cannot silently write to the wrong or unregistered Obsidian vault.
Prepare or reset the dedicated synthetic vault used for real Obsidian smoke tests and release screenshots:
OBSIDIAN_RELEASE_VAULT_PATH=/path/to/test-vault npm run release:vault:prepare
OBSIDIAN_RELEASE_VAULT_PATH is required because the command resets the synthetic release notes. It installs the development plugin and disables Obsidian Sync. The default Obsidian appearance is used unless an optional theme-source vault is provided:
OBSIDIAN_RELEASE_VAULT_PATH=/path/to/test-vault \
OBSIDIAN_THEME_SOURCE_VAULT=/path/to/theme-source \
npm run release:vault:prepare
Only the active appearance configuration, its theme directory, and the core-plugin configuration are copied from the optional theme source. Personal notes and credentials are never copied.
Start the deterministic local provider before exercising AI-backed release flows:
npm run release:mock
The mock listens on 127.0.0.1:18765, keeps external APIs and real credentials out of the screenshot workflow, and adds a short response delay so progress and cancellation states can be verified.
After building a release candidate, verify version metadata and print the size and SHA-256 digest of every required release asset:
npm run build
npm run release:verify
Refresh vault tag index.Suggest tags for current note.Generate tag suggestions for folder to confirm a folder scope, generate candidates, and review a whole batch before writing.Undo latest folder batch tag operation to revert the latest applied folder batch as one unit.Analyze tag health to inspect vault-level tag problems.AI-enhanced analysis inside the health report.Undo last tag curator change if you need to revert the latest tag write for the current note.The plugin UI defaults to Auto, which follows the current Obsidian language. In English, the commands are:
Refresh vault tag indexShow tag index summaryAnalyze tag healthSuggest tags for current noteGenerate tag suggestions for folderUndo last tag curator changeUndo latest folder batch tag operationRun tests:
npm test
Build:
npm run build
OpenSpec workflow:
npm run spec:list
npm run spec:status -- --change <change-name>
npm run spec:validate -- <change-name>
For new product work, start with an OpenSpec change proposal before implementation.
tags field. Reviewed inline tags can be copied into frontmatter, but their original body text and position are never rewritten or removed.