DSH HUB
HomePlugin StorePlugin PacksCommunityRankingsResourcesPublish Guide
Plugin source
Back to catalog

ramanasai /

ramanasai/dsh-closet-tracker

Verified

Closet Tracker for the DeepSeek Harness sidebar: a native wishlist panel backed by a zero-dependency Bun web app.

★ 0 Stars0 Forks0 IssuesN/A Community rating0 Confirmed installs
View on GitHub
READMESource: main@b547c2c1

Closet Tracker for DeepSeek Harness

Your clothing wishlist, in two shapes from one repo:

  • A zero-dependency Bun web app (app/) — paste a product link and track it: image, name, price, store, brand, category, price history, outfits, gaps, palette, PDF export, PWA. Runs normally in any browser.
  • A native DeepSeek Harness plugin (this package, repo root) — a hanger icon in the Harness left sidebar and a full wishlist panel in the main column, reading the same local data.

Closet Tracker hanger icon

What the plugin gives you

  • The real closet — reads the same app/data/items.json the web app uses, so items added in either place show up in both.
  • Paste a link to add — the app scrapes name, image, price, store, brand and category; the piece appears in the grid immediately.
  • Stats — wishlist value, pieces still wanted, bought count, and price drops since the last check.
  • Filter, search, sort — status tabs (All / Wishlist / Bought), category chips, free-text search, sort by newest, price, name or biggest drop.
  • Per-piece actions — check the price now, flip wishlist ↔ bought, remove (two-step confirm).
  • Sync all — re-scrapes every tracked link and reports the price drops.
  • Native look — theme tokens only, so light and dark follow the Harness; empty/offline states that say what to do; quiet auto-retry every 12 s while the local app is down.

Quick start

1. Run the app (normal browser)

Requires Bun (no bun install needed):

cd app
bun run start          # http://localhost:3003
open http://localhost:3003

2. Install the plugin

Requires DeepSeek Harness (built against 0.2.1-rc.5) with a profile, plus Bun for the app.

git clone https://github.com/ramanasai/dsh-closet-tracker.git

Install the bundle from the clone — the target is the absolute path of the clone (the repo root is the plugin package):

plugin_manager install_bundle target=/absolute/path/to/dsh-closet-tracker

or use the Plugin Manager UI in Harness (install a bundle from a local directory) and pick the same path.

Or install the released package (no clone needed): download dsh-closet-tracker-1.0.0.tgz from Releases and pass the tarball itself as the target — this path is verified to install and activate:

plugin_manager install_bundle target=/absolute/path/to/dsh-closet-tracker-1.0.0.tgz

The sidebar then shows a hanger icon labelled Closet Tracker; the app must be running for the panel to show data. If the Harness page was already open before installing, reload it once.

3. Configuration

The upstream origin lives in cordis.patch.yml:

- insert:
    - id: closet-tracker
      name: dsh-closet-tracker
      config:
        # The local app. localhost reaches IPv4 or IPv6 loopback listeners.
        baseUrl: http://localhost:3003

Run the app on another port (PORT=4000 bun run start) and set baseUrl to match. The default 3003 is the app's own default (process.env.PORT || 3003).

How it is wired

Piece Registration
sidebar.panellist id: closet-tracker, order: 30, hanger icon, localized label thunk
main key: closet-tracker → the wishlist panel
Host route prefix /closet-api on the Harness web server

Why a Host proxy? The app is a separate local process that sends no CORS headers, and Harness plugin guidance forbids embedding pages in an iframe. So the Host half (index.js) registers one same-origin proxy route that the Client half (client.js) calls as /closet-api/api/...:

  • forwards only /closet-api/api/* (nothing else is proxied);
  • keeps the method, request body, upstream status and content type;
  • never sends the Harness session cookie, Authorization, or other request headers upstream — only host, content-type and accept;
  • applies the Harness Connection browser authentication and fails closed (401) when the Connection service is unavailable;
  • pins the origin from config.baseUrl (a request path cannot move it), has a 45 s upstream timeout, and answers a structured 502 JSON when the app is down.

The Client half renders React from the Harness module table, uses only --dsw-alias-* theme tokens, and registers all visible text through the Harness locale service.

Repository layout

package.json          DSH bundle manifest (repo root = the plugin package)
cordis.patch.yml      Loader row inserted into the profile (+ baseUrl)
index.js              Host half: the authenticated /closet-api proxy
client.js             Client half: sidebar entry + wishlist panel
locale/en.json        Plugin Manager title/description
icon.svg              Original hanger artwork
test/proxy.test.mjs   Self-contained proxy tests (stub upstream, no network)
app/                  The standalone Closet Tracker web app (Bun)
  server.js           HTTP server + scraper engine + JSON API (no framework)
  public/             UI: Tailwind CDN + Fraunces / Plus Jakarta Sans, PWA shell
  data/               Personal items/profile/cache (git-ignored)

Testing

npm test                          # node --test: proxy forwarding, allowlist, gate, header hygiene
node --check index.js client.js   # syntax
cd app && bun run start           # run the app itself

The proxy tests start their own stub upstream, so they need neither Bun nor the real app.

Troubleshooting

Symptom Fix
"Closet Tracker is not reachable at http://localhost:3003" Start the app (cd app && bun run start). The panel retries by itself every 12 s, or press Try again.
Sidebar icon missing after install Reload the Harness page once so the new client module generation loads.
Panel shows data for the wrong app baseUrl in cordis.patch.yml must match the app's port.
Port already in use cd app && make stop (frees PORT, default 3003), or start with another PORT and update baseUrl.
Amazon / Ajio links scrape poorly Expected — both block bots. The item is added; fill in details with the app's edit dialog (✏️).
make stop killed something else It kills whatever listens on the app's PORT; check lsof -nP -iTCP:3003 -sTCP:LISTEN.

License

MIT — see LICENSE. The bundled jsPDF copy in app/public/vendor/ is MIT-licensed by its authors.

—/ 5

No ratings yet

Verified DSH bundle

Commit b547c2c11cd3

Community comments

No comments yet. Be the first to write one.

DSH HUB

A community index for DSH plugins. Not an official GitHub or DeepSeek AI product.

CommunityResourcesAPIAbout