DaoYoung49 downloadsA native dashboard for focus, tasks, learning, review, and news.
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.
ItemView dashboard — single view, no Dataview dependency,
opens automatically on startup.plans/知识点.md.#news anywhere in the vault, sorted by mtime./fetch) and as
the AI proxy fallback; token auto-discovered from
~/.config/obsidian-worktable/server.json.src/styles/*.css files are concatenated by
scripts/build-styles.mjs; theme-friendly, no PostCSS step.Settings → BRAT → Add a beta plugin.https://github.com/DaoYoung/obsidian-worktable.gitBRAT 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.
obsidian-worktable.zip from
Releases.vault/.obsidian/plugins/obsidian-worktable/
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.
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.
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:
launchd user agent (auto-start
on login, restart on crash).serviceToken and writes it to
~/.config/obsidian-worktable/server.json.After install, click Test connection in the same settings card to verify. A green "✓ Local service reachable" line means you're done.
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.
~/.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 to 0.0.0.0; the plugin
talks to the service over loopback only.port — defaults to 8765. Change if you have a port conflict.serviceToken — required header X-Worktable-Token for every
request. Leave empty to disable auth (fine for single-user, no-trust
local).aiAuthToken — Anthropic-compatible key (also accepts
anthropicApiKey). Env vars ANTHROPIC_AUTH_TOKEN /
ANTHROPIC_API_KEY / ~/.claude/settings.json override 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
The plugin reads the service token in this order:
~/.config/obsidian-worktable/server.json serviceToken./etc/obsidian-worktable/server.json serviceToken._check_auth allows the request.After running install-macos.sh, step 2 is set automatically and you do
not need to touch 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.
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).
| 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.
Settings → About).main.js, manifest.json, styles.css are all present.Ctrl/Cmd + P → "Show debug console", reload, look for red
errors mentioning worktable.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.
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.
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).
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 — single ItemView, grid layout,
widget descriptor registrysrc/widgets/<name>Widget.ts and src/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 by
scripts/build-styles.mjs to root styles.cssserver/ — Python Cloakfetch service (FastAPI / uvicorn)tests/ — Vitest specs + server/tests/ for the Python sideplans/知识点.md for knowledge points)..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.json is in .gitignore — no secrets reach the repo.MIT