worktable
approvedby DaoYoung
A native dashboard for focus, tasks, learning, review, and news. - This plugin has not been manually reviewed by Obsidian staff.
Obsidian Worktable
A native Obsidian dashboard plugin for focus, tasks, learning, review, and
news. Built as a single custom ItemView (no Dataview dependency), six
widgets render in a grid layout and share state through native IndexedDB.
AI features can run either through the bundled local Cloakfetch service or
via direct browser calls to Anthropic / OpenAI / Gemini-compatible
endpoints.
đ¨đŗ įŽäŊ䏿 â README_zh.md
Features
- Native
ItemViewdashboard â single view, no Dataview dependency, opens automatically on startup. - Pomodoro focus timer â circular ring, custom durations, session history, daily focus averages (excluding today).
- Todo board â add, complete, and clear todos with priority levels; data persisted in IndexedDB.
- Inquiry-based learning â look up any concept; the AI expands it with translation, part of speech, and structured Markdown (great for vocabulary, math formulas, science notes).
- Active recall â AI-generates MCQ / cloze / true-false questions
from an article and tracks per-knowledge-point mastery in
plans/įĨč¯įš.md. - End-of-day review â surfaces items you wrote, archived, or marked for review; cross-widget "today" feed.
- News aggregation â surfaces any markdown inside the news folder
or any file tagged
#newsanywhere in the vault, sorted by mtime. - "å°įēĸčą" encouragement widget â completion rewards and an archive of every archived learning record.
- Direct AI providers â Anthropic (Claude), OpenAI (GPT), Google Gemini, DeepSeek, Moonshot (Kimi), Zhipu (GLM), Alibaba Bailian (Qwen), Volcengine (Doubao), MiniMax â switchable in settings without code changes.
- Local Cloakfetch service for article fetching (
/fetch) and as the AI proxy fallback; token auto-discovered from~/.config/obsidian-worktable/server.json. - Plain CSS â
src/styles/*.cssfiles are concatenated byscripts/build-styles.mjs; theme-friendly, no PostCSS step.
Installation
Option A: BRAT (recommended â works without submitting to Community Plugins)
- Install BRAT from Obsidian's Community Plugins.
- Open
Settings â BRAT â Add a beta plugin. - Paste:
https://github.com/DaoYoung/obsidian-worktable.git - Enable Worktable under Community Plugins.
BRAT installs from the latest published GitHub Release's attachments, not from the repo root. Releases must not be Draft, and must attach
main.js,manifest.json,styles.css, andobsidian-worktable.zip.If the repo is private, configure a GitHub token with read access in BRAT's SecretStorage and select that token when adding the plugin.
Option B: Manual install from GitHub Release
- Download the latest
obsidian-worktable.zipfrom Releases. - Unzip into your vault:
vault/.obsidian/plugins/obsidian-worktable/ - Enable Worktable under Community Plugins.
Option C: Build from source
git clone https://github.com/DaoYoung/obsidian-worktable.git
cd obsidian-worktable
npm install
npm run build
Copy main.js, manifest.json, and styles.css from the repo root into
your vault's plugin directory. npm run dev watches for changes during
development.
Once submitted and accepted into Obsidian's Community Plugins, this plugin will appear in
Settings â Community plugins â Browseand can be installed with one click. Until then, BRAT is the supported install channel.
Local service (Cloakfetch)
Article fetching (/fetch) and the AI proxy when Direct AI is not
configured both go through a small Python service bundled in
server/server.py. Token auto-discovery means you usually do not have to
copy anything into the plugin's settings â the installer writes the token
to ~/.config/obsidian-worktable/server.json and the plugin reads it on
first request.
macOS â one-shot install
Settings â Community plugins â Worktable â Options shows a "Setup
local service" card. Click the install command, paste it into Terminal:
git clone https://github.com/DaoYoung/obsidian-worktable.git ~/obsidian-worktable
bash ~/obsidian-worktable/server/install-macos.sh
The script:
- Installs the Python service as a macOS
launchduser agent (auto-start on login, restart on crash). - Generates a random
serviceTokenand writes it to~/.config/obsidian-worktable/server.json. - Launches the service immediately.
After install, click Test connection in the same settings card to verify. A green "â Local service reachable" line means you're done.
Linux / Windows
launchd is macOS-only. On Linux and Windows, run the service manually:
git clone https://github.com/DaoYoung/obsidian-worktable.git ~/obsidian-worktable
cd ~/obsidian-worktable/server
pip3 install -r requirements.txt # first time only
python3 server.py
Leave the terminal open, or run under tmux / systemd-user / NSSM.
serviceToken auth works the same way; just put a value into
~/.config/obsidian-worktable/server.json (or set
WORKTABLE_SERVICE_TOKEN) and the plugin picks it up.
Configuration file
~/.config/obsidian-worktable/server.json:
{
"host": "127.0.0.1",
"port": 8765,
"serviceToken": "your-service-token-here",
"aiAuthToken": "sk-ant-api03-xxxxxxxx",
"aiBaseUrl": "https://api.anthropic.com",
"aiModel": "claude-sonnet-4-5",
"aiMaxTokens": 2048,
"aiTimeout": 60,
"upstreamFetchTimeout": 30
}
hostâ listen address. Do not change to0.0.0.0; the plugin talks to the service over loopback only.portâ defaults to8765. Change if you have a port conflict.serviceTokenâ required headerX-Worktable-Tokenfor every request. Leave empty to disable auth (fine for single-user, no-trust local).aiAuthTokenâ Anthropic-compatible key (also acceptsanthropicApiKey). Env varsANTHROPIC_AUTH_TOKEN/ANTHROPIC_API_KEY/~/.claude/settings.jsonoverride the file.aiBaseUrl/aiModelâ defaults follow the model's defaults but can be repointed to any compatible gateway.
Any field can be overridden with WORKTABLE_<FIELD_NAME> env vars
(camelCase â UPPER_SNAKE), which take precedence over the file:
export WORKTABLE_SERVICE_TOKEN="your-token"
export WORKTABLE_AI_BASE_URL="https://your-proxy.example.com"
export WORKTABLE_PORT=9001
Token auto-discovery
The plugin reads the service token in this order:
- The "Service token (advanced override)" field in plugin settings â leave empty unless bypassing the config file.
~/.config/obsidian-worktable/server.jsonserviceToken./etc/obsidian-worktable/server.jsonserviceToken.- Empty string â server's
_check_authallows the request.
After running install-macos.sh, step 2 is set automatically and you do
not need to touch plugin settings.
Plugin settings
Settings â Community plugins â Obsidian Worktable â Options:
| Setting | Default | Notes |
|---|---|---|
| Knowledge file | plans/įĨč¯įš.md | Vault-relative path the learning modules read and write |
| News folder | news | Folder for the news widget; #news-tagged files anywhere also appear |
| Service base URL | http://127.0.0.1:8765 | Local Cloakfetch service endpoint |
| Service token (advanced override) | "" | Leave empty â auto-discovered from ~/.config/obsidian-worktable/server.json |
| Open on startup | â | Auto-open the Worktable view when Obsidian starts |
| Enable fallback proxies | â | CORS proxy fallback when article fetching fails |
| Provider | anthropic | AI provider for Direct AI mode |
| API key | "" | Provider API key |
| Base URL | https://api.anthropic.com | Auto-fills on provider change; supports private gateways |
| Model | claude-sonnet-4-5 | Auto-fills on provider change; manual override allowed |
Settings live in .obsidian/plugins/obsidian-worktable/data.json,
managed by Obsidian.
Direct AI vs local service
When API key + Base URL + Model are all filled, the plugin calls
your provider directly from the browser (works with native CORS-enabled
endpoints: Anthropic, OpenAI, Google Gemini). /fetch still goes
through the local Cloakfetch service.
If any of those three is empty, AI calls fall through to the local
service's /ai/* endpoints (which read the same provider config from
server.json server-side).
AI providers
| Provider | Default Base URL | Default Model |
|---|---|---|
| Anthropic (Claude) | https://api.anthropic.com | claude-sonnet-4-5 |
| OpenAI (GPT) | https://api.openai.com/v1 | gpt-4o-mini |
| Google Gemini | https://generativelanguage.googleapis.com/v1beta | gemini-2.0-flash |
| DeepSeek | https://api.deepseek.com/v1 | deepseek-chat |
| Moonshot (Kimi) | https://api.moonshot.cn/v1 | moonshot-v1-8k |
| Zhipu (GLM) | https://open.bigmodel.cn/api/paas/v4 | glm-4-flash |
| Alibaba Bailian (Qwen) | https://dashscope.aliyuncs.com/compatible-mode/v1 | qwen-plus |
| Volcengine (Doubao) | https://ark.cn-beijing.volces.com/api/v3 | doubao-1-5-pro-32k-250115 |
| MiniMax | https://api.minimaxi.com/anthropic | MiniMax-M3 |
Any OpenAI Chat-Completions-compatible endpoint works: pick openai and
override Base URL. Switching providers auto-fills Base URL and
Model; you can override either afterwards.
Troubleshooting
Plugin fails to enable
- Confirm Obsidian version âĨ 1.5.0 (
Settings â About). - Check
main.js,manifest.json,styles.cssare all present. - Open
Ctrl/Cmd + P â "Show debug console", reload, look for red errors mentioningworktable.
"Local service is not reachable: ECONNREFUSED"
Run the appropriate install step above, then Test connection in the
plugin settings card. If the service is running but the plugin can't
reach it, the Service base URL in plugin settings is probably wrong.
News widget shows nothing
The widget scans the configured folder plus any markdown with the
#news tag. Either create news/ in the vault and add a file, or add
#news to an existing note's frontmatter / inline.
Storage and reset
All widget data lives in IndexedDB under the database home-db and the
localStorage keys documented in src/widgets/*.ts. Use the Obsidian
debug console â "Inspect" to clear them, or uninstall + reinstall the
plugin (Obsidian prompts before deleting storage).
Development
npm install
npm run dev # watch mode (CSS + esbuild)
npm run typecheck # tsc --noEmit
npm test # vitest run
npm run test:server # python3 -m unittest in server/tests
npm run verify # typecheck + tests + build + artifact checks
Source layout:
src/main.tsâ plugin entry, view registrationsrc/view/WorktableView.tsâ singleItemView, grid layout, widget descriptor registrysrc/widgets/<name>Widget.tsandsrc/widgets/<name>.tsâ each widget pair (logic + lazy-load wrapper)src/services/CloakfetchClient.tsâ the only AI transport; routes Direct AI vs local servicesrc/services/ai/{registry,anthropic,openaiCompat,gemini,client}.tsâ provider specssrc/styles/{base,productivity,learning}.cssâ concatenated byscripts/build-styles.mjsto rootstyles.cssserver/â Python Cloakfetch service (FastAPI / uvicorn)tests/â Vitest specs +server/tests/for the Python side
Privacy
- All widget data is stored locally in your vault (IndexedDB + the
file
plans/įĨč¯įš.mdfor knowledge points). - The plugin does not collect telemetry. No analytics calls.
- Tokens and API keys live in
.obsidian/plugins/obsidian-worktable/data.json(managed by Obsidian) or~/.config/obsidian-worktable/server.json, and are sent only to the local service over loopback. server.jsonis in.gitignoreâ no secrets reach the repo.
License
MIT
For plugin developers
Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.