
Company News
Socket Named Top Sales Organization by RepVue
Socket won two 2026 Reppy Awards from RepVue, ranking in the top 5% of all sales orgs. AE Alexandra Lister shares what it's like to grow a sales career here.
@kunalshetye/otd
Advanced tools
OTD (Opal Tools Debugger) — test and execute Opal tools locally without deploying
A local debugger for Opal tools — test and execute tools from your browser without deploying.
npx @kunalshetye/otd
Or install globally:
npm i -g @kunalshetye/otd
otd -d http://localhost:3000/discovery
The debugger opens at http://localhost:4873. Enter your discovery endpoint URL in the UI and start testing.
npx @kunalshetye/otd \
--discovery-url https://your-opal-tools.example.com/discovery \
--bearer-token YOUR_TOKEN \
--port 4873
| Flag | Description | Default |
|---|---|---|
-d, --discovery-url <url> | Discovery endpoint URL (pre-fills the UI) | — |
-t, --bearer-token <token> | Bearer token for authentication | — |
-p, --port <number> | Port for the debugger server | 4873 |
http_method from discovery. GET/DELETE use query params; POST/PUT/PATCH use JSON body.requestParams, requestUrl, requestMethod, and requestHeaders for full request introspection.{{varName}} in parameters; values are resolved before execution. Environment selector in the header.--discovery-url and --bearer-token via CLI to skip manual entry.| Shortcut | Action |
|---|---|
Cmd/Ctrl + Enter | Execute current tool |
Cmd/Ctrl + K | Focus sidebar search |
Escape | Close open panels |
Cmd/Ctrl + Shift + L | Toggle activity log |
Add a script to your project's package.json so your team can launch the debugger with a single command — no global install needed.
One-off usage without a script — you can run the debugger directly without adding it to
package.json:npx @kunalshetye/otd # npm yarn dlx @kunalshetye/otd # yarn pnpm dlx @kunalshetye/otd # pnpm bunx @kunalshetye/otd # bun
{
"scripts": {
"debugger": "npx @kunalshetye/otd"
}
}
npm run debugger # npm
yarn debugger # yarn
pnpm run debugger # pnpm
bun run debugger # bun
Opens at http://localhost:4873. Enter your discovery URL manually in the UI.
{
"scripts": {
"debugger": "npx @kunalshetye/otd -d http://localhost:3000/discovery"
}
}
npm run debugger # npm
yarn debugger # yarn
pnpm run debugger # pnpm
bun run debugger # bun
The discovery URL is pre-filled in the UI on launch — just click Connect.
{
"scripts": {
"debugger": "npx @kunalshetye/otd -d http://localhost:3000/discovery -t $OPAL_TOKEN"
}
}
Reads the token from an environment variable. You can also hardcode a dev token if it's a non-sensitive local environment:
{
"scripts": {
"debugger": "npx @kunalshetye/otd -d http://localhost:3000/discovery -t dev-token-123"
}
}
npm run debugger # npm
yarn debugger # yarn
pnpm run debugger # pnpm
bun run debugger # bun
{
"scripts": {
"debugger": "npx @kunalshetye/otd -d http://localhost:3000/discovery",
"debugger:staging": "npx @kunalshetye/otd -d https://staging.example.com/discovery -t $STAGING_TOKEN",
"debugger:prod": "npx @kunalshetye/otd -d https://api.example.com/discovery -t $PROD_TOKEN -p 4874"
}
}
# npm
npm run debugger # Local dev
npm run debugger:staging # Staging environment
npm run debugger:prod # Production (read-only) on a different port
# yarn
yarn debugger
yarn debugger:staging
yarn debugger:prod
# pnpm
pnpm run debugger
pnpm run debugger:staging
pnpm run debugger:prod
# bun
bun run debugger
bun run debugger:staging
bun run debugger:prod
{
"scripts": {
"dev": "node server.js",
"debugger": "npx @kunalshetye/otd -d http://localhost:3000/discovery -p 9000"
}
}
Runs the debugger on port 9000 so it doesn't clash with your dev server.
If you use a tool like concurrently:
{
"scripts": {
"dev": "node server.js",
"debugger": "npx @kunalshetye/otd -d http://localhost:3000/discovery",
"dev:debug": "concurrently \"npm run dev\" \"npm run debugger\""
}
}
npm run dev:debug # npm
yarn dev:debug # yarn
pnpm run dev:debug # pnpm
bun run dev:debug # bun
bin/cli.js) starts a lightweight static file server and opens the app with query parameters (?d=...&t=...) for pre-filling.The app is 100% client-side — built with adapter-static, no server-side code. All state (connection, tools, history, theme) lives in the browser's localStorage. Parameter presets use IndexedDB for structured storage.
bun install
bun run dev # Start dev server at http://localhost:5173
bun run build # Production build
bun run preview # Preview production build
bun run check # Type-check
bun run lint # Lint + format check
bun run test # Run unit tests
$state, $derived, $effect)@custom-variant dark)bin/cli.js # CLI entry point (npx executable)
src/
lib/
api/
discovery.ts # Fetch discovery endpoint
executor.ts # Execute tool requests (supports all HTTP methods, timeout, cancel)
components/
ActivityLogEntry.svelte # Single entry in the activity log
ActivityLogPanel.svelte # Collapsible activity log panel
ActivityLogToggle.svelte # Toggle button with error badge for the activity log
BulkExecutor.svelte # Multi-preset sequential execution UI
ConnectionForm.svelte # URL/token form + connection history
Header.svelte # App header with connection switcher, env selector, health indicator
HeadersEditor.svelte # Key-value editor for custom request headers
JsonViewer.svelte # Collapsible JSON tree viewer
PresetBar.svelte # Preset toolbar (save/load/update/delete/export/import)
ResponseDiff.svelte # Side-by-side response comparison with color-coded diff
ResponseViewer.svelte # Response display (status, headers, body, timing, cURL export, replay)
ToolDetailPanel.svelte # Tool detail — form + response side by side
ToolForm.svelte # Parameter form for tool execution
ToolListItem.svelte # Single tool item in sidebar list (with favorite star)
ToolSidebar.svelte # Sidebar with search + tool list + pinned section
db/
presets.ts # IndexedDB access layer for presets
stores/
activity-log.svelte.ts # Activity log state (entries, search, error count)
connection.svelte.ts # Connection state (URL, token, connected, health)
environments.svelte.ts # Named environments with key-value variables
favorites.svelte.ts # Pinned/favorite tools state + persistence
history.svelte.ts # Connection history (recent endpoints)
presets.svelte.ts # Preset state + async IndexedDB persistence
theme.svelte.ts # Dark/light theme state + persistence
tools.svelte.ts # Tools state (functions list)
ui.svelte.ts # UI state (selection, sidebar, execution results)
types.ts # TypeScript interfaces
utils/
curl-export.ts # Generate cURL commands from request metadata
http-status.ts # HTTP status code labels and colors
json-diff.ts # JSON diff algorithm for response comparison
preset-io.ts # Preset export/import (JSON file I/O, deduplication)
preset-merge.ts # Merge preset values with tool parameters
template.ts # {{varName}} template resolution with environment variables
routes/
+layout.svelte # App layout with header + theme init
+layout.ts # SPA config (ssr=false, prerender=false)
+page.svelte # Home — connection form
layout.css # Global styles + Tailwind config
tools/
+page.svelte # Tools page — sidebar + detail panel
MIT
FAQs
OTD (Opal Tools Debugger) — test and execute Opal tools locally without deploying
We found that @kunalshetye/otd demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Company News
Socket won two 2026 Reppy Awards from RepVue, ranking in the top 5% of all sales orgs. AE Alexandra Lister shares what it's like to grow a sales career here.

Security News
NIST will stop enriching most CVEs under a new risk-based model, narrowing the NVD's scope as vulnerability submissions continue to surge.

Company News
/Security News
Socket is an initial recipient of OpenAI's Cybersecurity Grant Program, which commits $10M in API credits to defenders securing open source software.