Port of mm-diigo/projects/diigo-bak/diigo-dump.mjs as a Cloudflare Worker: one page-number field + button, GET interact_api/load_user_items (sort=updated, count=24) with DIIGO_COOKIE as a Worker secret. GET / is inert; dumps happen only on POST submit. Manual integration testing (local wrangler dev, port 8788, 2026-10-06) shows it works: status 200, total 1674 bookmarks, page-1 items returned. The browser-session-cookie path authenticates; the static API-key path (diigo-ping worker, EmDash plugin) is still rejected by Diigo (401). Also: project checklist (capsite-checklist.md) with step results, and a .gitignore for local artifacts (.dev.vars, node_modules, wrangler state). Generated-by: opencode (GLM)
3.0 KiB
capsite checklist
Goal ladder toward "EmDash site collecting diigo.com bookmarks with the API key held by the host, never inside the plugin" (see capsite-notes.md). Start small; each step must pass before moving down.
- 1. Plain worker ping (
diigo-ping/): a Cloudflare Worker with one ping button that callshttps://www.diigo.com/api/v2/bookmarkswith HTTP Basic auth (username:apiKey) and shows the raw result in a<pre>. Secrets from.dev.varslocally /wrangler secret putdeployed. Win: page showsstatus: 200 okand real bookmark JSON. Result (2026-10-06): worker runs; Diigo returns 401 with the current key/username pair — API-key path not yet authenticated. - 1b. Cookie-path dump worker (
diigo-dump/): port ofmm-diigo/projects/diigo-bak/diigo-dump.mjs— one page-number field + button, GETinteract_api/load_user_items?sort=updated&count=24&page_num=Nwith the browser session cookie (DIIGO_COOKIEsecret). Result (2026-10-06): manual integration test PASSES — status 200,total: 1674, page-1 items returned. GET / is inert; dump only on POST submit. The session-cookie / interact_api path works while the API-key path is rejected. - 2. Real credentials in madmode/.dev.vars: replace the placeholder
DIIGO_API_KEY="dckc-madmode"with a key from https://www.diigo.com/settings/api; confirm the EmDash plugin's "Sync now" returns success (status 200, bookmarks stored). - 3.
/bookmarkspage renders real data after a sync — titles/tags visible athttp://localhost:4321/bookmarks. - 4. Cron sync works locally without errors (
0 */6 * * *task in_emdash_cron_tasks). - 5. Deploy: madmode to Workers
pnpm wrangler deploy, secrets viawrangler secret put; ping page then plugin "Sync now" against prod. - 6. bib sync #195: repeat the pattern for the next read-access need.
Step 1 how-to: diigo-ping
cd diigo-ping
printf 'DIIGO_API_KEY="dckc-madmode"\nDIIGO_USERNAME="6edadc55c0329434"\n' > .dev.vars
npx wrangler dev # → http://localhost:8787
Click the button; expected right now (same credentials as the plugin):
Diigo 401 ... "HTTP Basic: Access denied". If even the standalone worker
can't authenticate, the credentials are wrong, not the plugin wiring.
Note: Diigo 301s secure.diigo.com → www.diigo.com; fetch follows the
redirect, and the Authorization header survives host-to-host here — if Diigo
ever strips it, switch the URL to www.diigo.com explicitly.
Step 1b how-to: diigo-dump (session-cookie path)
cd diigo-dump
# .dev.vars: DIIGO_COOKIE="<paste Cookie header from diigo.com devtools>"
npx wrangler dev --port 8788 # → http://localhost:8788
wrangler restarts pick up .dev.vars edits only at startup
Enter a page number, click dump → status + total + JSON items. GET / is
inert (no accidental fetches); dumps happen only on POST submits.