# Dropstone Documentation — Complete Reference
# https://docs.dropstone.io
# Generated from source. Do not hand-edit; run scripts/generate-llms.mjs.
==============================================================================
# Welcome to Dropstone
URL: https://docs.dropstone.io/getting-started/welcome
Description: Dropstone is an agentic coding tool that lives in your terminal. It reads your codebase, makes coordinated edits across files, runs commands, and explains its reasoning as it works.
==============================================================================
You describe what you want, and Dropstone reads the relevant code, plans the change, edits files, runs commands, and explains what it did. It works on real projects, not toy snippets, and stays grounded in the code you already have.
This page gives you the shape of the product. The [Quick Start](./quick-start) walks you through installing it and shipping your first change.
## Install in seconds
AGENTS.md at the repo root to teach Dropstone your conventions. Package reusable workflows as skills./effort high./effort xhigh./effort from inside Dropstone to step up when a task needs more depth.
1. add a database table for user profiles2. add an API endpoint to get and update profiles3. build a page where users can edit their information
/effort high for cross-cutting refactors. Step up to Heavy with /effort xhigh for architecture decisions, large migrations, or hard debugging.
/ opens the slash command paletteCtrl+P opens the action paletteEsc interrupts a running turn cleanlyUp arrow recalls a previous promptCtrl+T cycles through reasoning effort levelsEsc at any point to interrupt and steer.{"--continue"}{"--session"}{"--fork"}{"--prompt"}{"--model"}{"--agent"}{"--port"}{"--hostname"}{"--mdns"}{"--mdns-domain"}{"--cors"}{"--path"}{"--description"}{"--mode"}{"--permissions"}{"--model"}{"--dir"}{"--continue"}{"--session"}{"--fork"}{"--password"}{"--username"}{"--provider"}{"--method"}{"--event"}{"--token"}{"--refresh"}{"--verbose"}{"--command"}{"--continue"}{"--session"}{"--fork"}{"--share"}{"--model"}{"--agent"}{"--file"}{"--format"}{"--title"}{"--attach"}{"--password"}{"--username"}{"--dir"}{"--port"}{"--variant"}{"--thinking"}{"--dangerously-skip-permissions"}{"--port"}{"--hostname"}{"--mdns"}{"--mdns-domain"}{"--cors"}{"--max-count"}{"--format"}{"--days"}{"--tools"}{"--models"}{"--project"}{"--sanitize"}{"--port"}{"--hostname"}{"--mdns"}{"--mdns-domain"}{"--cors"}{"--cwd"}{"--port"}{"--hostname"}{"--mdns"}{"--mdns-domain"}{"--cors"}{"--global"}{"--force"}{"--format"}{"--keep-config"}{"--keep-data"}{"--dry-run"}{"--force"}{"--method"}{"--help"}{"--version"}{"--print-logs"}{"--log-level"}{"--pure"}
The picker opens on your current directory:
- **Open this folder** uses the directory you are standing in.
- Choosing any listed subfolder moves into it, so you can walk down a tree.
- **..** goes up a level.
- Type to filter the list, or paste an absolute path — or one starting with `~` — to jump straight there.
Hidden directories are left out, so `.git` and `.config` do not bury what you are looking for. You can still reach one by pasting its path.
Project[] |
| `GET` | `/project/current` | Get the current project | Project |
---
### Path & VCS
| Method | Path | Description | Response |
| ------ | ------- | ------------------------------------ | ------------------------------------------- |
| `GET` | `/path` | Get the current path | Path |
| `GET` | `/vcs` | Get VCS info for the current project | VcsInfo |
---
### Config
| Method | Path | Description | Response |
| ------- | --------- | --------------- | ----------------------------------------- |
| `GET` | `/config` | Get config info | Config |
| `PATCH` | `/config` | Update config | Config |
---
### Sessions
| Method | Path | Description | Notes |
| -------- | ---------------------------------------- | ------------------------------------- | ---------------------------------------------------------------------------------- |
| `GET` | `/session` | List all sessions | Returns Session[] |
| `POST` | `/session` | Create a new session | body: `{ parentID?, title? }`, returns Session |
| `GET` | `/session/status` | Get session status for all sessions | Returns `{ [sessionID: string]: `SessionStatus` }` |
| `GET` | `/session/:id` | Get session details | Returns Session |
| `DELETE` | `/session/:id` | Delete a session and all its data | Returns `boolean` |
| `PATCH` | `/session/:id` | Update session properties | body: `{ title? }`, returns Session |
| `GET` | `/session/:id/children` | Get a session's child sessions | Returns Session[] |
| `GET` | `/session/:id/todo` | Get the todo list for a session | Returns Todo[] |
| `POST` | `/session/:id/init` | Analyze app and create `AGENTS.md` | body: `{ messageID, providerID, modelID }`, returns `boolean` |
| `POST` | `/session/:id/fork` | Fork an existing session at a message | body: `{ messageID? }`, returns Session |
| `POST` | `/session/:id/abort` | Abort a running session | Returns `boolean` |
| `GET` | `/session/:id/diff` | Get the diff for this session | query: `messageID?`, returns FileDiff[] |
| `POST` | `/session/:id/summarize` | Summarize the session | body: `{ providerID, modelID }`, returns `boolean` |
| `POST` | `/session/:id/revert` | Revert a message | body: `{ messageID, partID? }`, returns `boolean` |
| `POST` | `/session/:id/unrevert` | Restore all reverted messages | Returns `boolean` |
| `POST` | `/session/:id/permissions/:permissionID` | Respond to a permission request | body: `{ response, remember? }`, returns `boolean` |
---
### Messages
| Method | Path | Description | Notes |
| ------ | --------------------------------- | --------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `GET` | `/session/:id/message` | List messages in a session | query: `limit?`, returns `{ info: `Message`, parts: `Part[]`}[]` |
| `POST` | `/session/:id/message` | Send a message and wait for response | body: `{ messageID?, model?, agent?, noReply?, system?, tools?, parts }`, returns `{ info: `Message`, parts: `Part[]`}` |
| `GET` | `/session/:id/message/:messageID` | Get message details | Returns `{ info: `Message`, parts: `Part[]`}` |
| `POST` | `/session/:id/prompt_async` | Send a message asynchronously (no wait) | body: same as `/session/:id/message`, returns `204 No Content` |
| `POST` | `/session/:id/command` | Execute a slash command | body: `{ messageID?, agent?, model?, command, arguments }`, returns `{ info: `Message`, parts: `Part[]`}` |
| `POST` | `/session/:id/shell` | Run a shell command | body: `{ agent, model?, command }`, returns `{ info: `Message`, parts: `Part[]`}` |
---
### Commands
| Method | Path | Description | Response |
| ------ | ---------- | ----------------- | --------------------------------------------- |
| `GET` | `/command` | List all commands | Command[] |
---
### Files
| Method | Path | Description | Response |
| ------ | ------------------------ | ---------------------------------- | ------------------------------------------------------------------------------------------- |
| `GET` | `/find?pattern=` | Find files and directories by name | `string[]` (paths) | | `GET` | `/find/symbol?query=` | Find workspace symbols |Symbol[]| | `GET` | `/file?path=` | List files and directories | FileNode[]| | `GET` | `/file/content?path=` | Read a file |
FileContent| | `GET` | `/file/status` | Get status for tracked files |File[]| #### `/find/file` query parameters - `query` (required): search string (fuzzy match) - `type` (optional): limit results to `"file"` or `"directory"` - `directory` (optional): override the project root for the search - `limit` (optional): max results (1–200) - `dirs` (optional): legacy flag (`"false"` returns only files) --- ### LSP, Formatters & MCP | Method | Path | Description | Response | | ------ | ------------ | -------------------------- | -------------------------------------------------------- | | `GET` | `/lsp` | Get LSP server status |LSPStatus[]| | `GET` | `/formatter` | Get formatter status |FormatterStatus[]| | `GET` | `/mcp` | Get MCP server status | `{ [name: string]: `MCPStatus` }` | | `POST` | `/mcp` | Add MCP server dynamically | body: `{ name, config }`, returns MCP status object | --- ### Agents | Method | Path | Description | Response | | ------ | -------- | ------------------------- | ------------------------------------------- | | `GET` | `/agent` | List all available agents |Agent[]| --- ### Logging | Method | Path | Description | Response | | ------ | ------ | ------------------------------------------------------------ | --------- | | `POST` | `/log` | Write log entry. Body: `{ service, level, message, extra? }` | `boolean` | --- ### Auth | Method | Path | Description | Response | | ------ | ----------- | ---------------------------------------------------- | --------- | | `PUT` | `/auth/:id` | Set authentication credentials for the given target. | `boolean` | --- ### Events | Method | Path | Description | Response | | ------ | -------- | ----------------------------------------------------------------------------- | ------------------------- | | `GET` | `/event` | Server-sent events stream. First event is `server.connected`, then bus events | Server-sent events stream | --- ### Docs | Method | Path | Description | Response | | ------ | ------ | ------------------------- | --------------------------- | | `GET` | `/doc` | OpenAPI 3.1 specification | HTML page with OpenAPI spec | ============================================================================== # Dropstone SDK URL: https://docs.dropstone.io/cli/sdk Description: Type-safe JS client for the Dropstone agent runtime. SDK sessions inherit Dropstone's cross-surface memory (Continuity) — one persistent memory shared with the CLI, chat, and SDK. ============================================================================== The Dropstone JS/TS SDK provides a type-safe client for interacting with the **Dropstone agent runtime**. It spawns `dropstone serve` as a subprocess and gives you a typed HTTP client pointed at it. Because it runs the same local agent the CLI uses, every SDK session inherits your account memory — teach it once in the CLI, chat, or SDK and every surface already knows it (see [Memory (Continuity)](#memory-continuity)).For pure programmatic use (CI pipelines, automation, serverless), prefer the [HTTP API](./api) with a `DROPSTONE_API_KEY`. The SDK on this page is intended for embedding the interactive agent in a Node process where the CLI binary is installed alongside. See the [Server](./server) page for how the underlying HTTP API works. --- ## Install Install the SDK from npm: ```bash npm install @blankline/dropstone-sdk ``` --- ## Headless API client For CI pipelines, automation, and serverless you do not need the CLI at all. Use the headless client, which talks directly to the Dropstone HTTP API with an API key: ```typescript import { createDropstoneApi } from "@blankline/dropstone-sdk" // Reads DROPSTONE_API_KEY from the environment automatically. const dropstone = createDropstoneApi() const resp = await dropstone.chat.completions.create({ model: "dropstone-fast", // or "dropstone-pro" / "dropstone-heavy" messages: [{ role: "user", content: "Write a haiku about debugging." }], }) console.log(resp.choices[0].message.content) console.log("Cost: $" + resp.usage?.cost) // billed amount, in USD ``` ### Get an API key 1. Sign in at [dropstone.io/dashboard](https://dropstone.io/dashboard). 2. Open **Settings → API** at [dropstone.io/dashboard/settings](https://dropstone.io/dashboard/settings) and create a key — it looks like `dsk_live_<43 chars>`. 3. Set it as an environment variable (or pass `apiKey` to `createDropstoneApi`): ```bash export DROPSTONE_API_KEY=dsk_live_... ```Treat your API key like a password. Never commit it to git or embed it in a frontend bundle. API-key requests are billed pay-per-use from your prepaid credit balance — plan allowances do not apply. See [Usage & limits](/getting-started/usage). Streaming works the same way, and the client is OpenAI-compatible — you can point the OpenAI SDK at Dropstone's base URL instead: ```typescript const stream = await dropstone.chat.completions.create({ model: "dropstone-fast", stream: true, messages: [{ role: "user", content: "Count to 5." }], }) for await (const chunk of stream) { process.stdout.write(chunk.choices?.[0]?.delta?.content ?? "") } ``` See the [HTTP API](./api) page for the full reference. --- ## Create client Create an instance of dropstone: ```javascript import { createDropstone } from "@blankline/dropstone-sdk" const { client } = await createDropstone() ``` This starts both a server and a client. Every SDK method returns `{ data, request, response }`, so access the payload via `.data`. #### Options | Option | Type | Description | Default | | ---------- | ------------- | ------------------------------ | ----------- | | `hostname` | `string` | Server hostname | `127.0.0.1` | | `port` | `number` | Server port | `4096` | | `signal` | `AbortSignal` | Abort signal for cancellation | `undefined` | | `timeout` | `number` | Timeout in ms for server start | `5000` | | `config` | `Config` | Configuration object | `{}` | --- ## Config You can pass a configuration object to customize behavior. The instance still picks up your `dropstone.json`, but you can override or add configuration inline: ```javascript import { createDropstone } from "@blankline/dropstone-sdk" const dropstone = await createDropstone({ hostname: "127.0.0.1", port: 4096, config: { model: "dropstone/dropstone-pro", }, }) console.log(`Server running at ${dropstone.server.url}`) dropstone.server.close() ``` --- ## Memory (Continuity) Dropstone keeps one persistent memory per account. We call it **Continuity** — a cross-surface memory shared by the CLI, chat, VS Code, and the SDK. Teach it once anywhere and every surface already knows it. Sessions you run through the SDK use the same account memory as the CLI. What you teach the CLI is already known to SDK sessions, and what an SDK session records is available back in the CLI and chat. On every turn, the agent auto-recalls relevant memory before answering, so it does not re-learn what it already knows. The SDK agent can also read and write memory directly, with the same tools as the CLI: | Tool | Purpose | | --- | --- | | `memory_recall` | Recall the most relevant lessons for the current task | | `record_lesson` | Save a durable lesson (a rule or a fact) | | `list_lessons` | Show everything it has learned about you | | `forget_lesson` | Remove a lesson |Memory requires being signed in to Dropstone. The SDK server reads the same `auth.json` as the CLI, so sign in once with `dropstone` and SDK sessions inherit the same account memory. Nothing is stored if you are not signed in. #### Example State a preference from code and it is recorded the same way it would be in the CLI — visible in the CLI and chat afterwards: ```typescript const { client } = await createDropstone() const session = await client.session.create({ body: { title: "Teach memory" } }) await client.session.prompt({ path: { id: session.data.id }, body: { parts: [{ type: "text", text: "Remember this as a standing rule: always use bun, not npm." }], }, }) ``` #### Continuity vs `AGENTS.md` `AGENTS.md` is a project file you commit to Git for team conventions — stable, repo-scoped, and shared with anyone who clones it. Continuity is your private account memory: what you teach in the CLI, chat, or SDK follows your account across surfaces and projects. They solve different problems and work best together — project rules in `AGENTS.md`, personal cross-surface memory in Continuity. See [Rules](./rules) and [Memory](./memory). #### What gets remembered Memory stores only the rules and facts you explicitly teach it — preferences, conventions, and corrections that are worth carrying across sessions. It is distinct from the ephemeral context of a single session, which is not kept after the session ends. See the [Memory](./memory) page for how Dropstone decides what to keep. --- ## Client only If you already have a running instance of dropstone, you can create a client instance to connect to it: ```javascript import { createDropstoneClient } from "@blankline/dropstone-sdk" const client = createDropstoneClient({ baseUrl: "http://localhost:4096", }) ``` #### Options | Option | Type | Description | Default | | --------------- | ---------- | -------------------------------- | ----------------------- | | `baseUrl` | `string` | URL of the server | `http://localhost:4096` | | `fetch` | `function` | Custom fetch implementation | `globalThis.fetch` | | `parseAs` | `string` | Response parsing method | `auto` | | `responseStyle` | `string` | Return style: `data` or `fields` | `fields` | | `throwOnError` | `boolean` | Throw errors instead of return | `false` | --- ## Types The SDK includes TypeScript definitions for all API types. Import them directly: ```typescript import type { Session, Message, Part } from "@blankline/dropstone-sdk" ``` All types are generated from the server's OpenAPI specification, so the names you see in TypeScript map one-to-one to the [server](./server) request and response shapes. --- ## Errors The SDK can throw errors that you can catch and handle: ```typescript try { await client.session.get({ path: { id: "invalid-id" } }) } catch (error) { console.error("Failed to get session:", (error as Error).message) } ``` --- ## Structured Output You can request structured JSON output from the model by specifying an `format` with a JSON schema. The model will use a `StructuredOutput` tool to return validated JSON matching your schema. ### Basic Usage ```typescript const result = await client.session.prompt({ path: { id: sessionId }, body: { parts: [{ type: "text", text: "Research Dropstone and provide company info" }], format: { type: "json_schema", schema: { type: "object", properties: { company: { type: "string", description: "Company name" }, founded: { type: "number", description: "Year founded" }, products: { type: "array", items: { type: "string" }, description: "Main products", }, }, required: ["company", "founded"], }, }, }, }) // Access the structured output console.log(result.data.info.structured_output) // { company: "Dropstone", founded: 2024, products: ["Dropstone CLI"] } ``` ### Output Format Types | Type | Description | | ------------- | ------------------------------------------------------ | | `text` | Default. Standard text response (no structured output) | | `json_schema` | Returns validated JSON matching the provided schema | ### JSON Schema Format When using `type: 'json_schema'`, provide: | Field | Type | Description | | ------------ | --------------- | ---------------------------------------------------------- | | `type` | `'json_schema'` | Required. Specifies JSON schema mode | | `schema` | `object` | Required. JSON Schema object defining the output structure | | `retryCount` | `number` | Optional. Number of validation retries (default: 2) | ### Error Handling If the model fails to produce valid structured output after all retries, the response will include a `StructuredOutputError`: ```typescript if (result.data.info.error?.name === "StructuredOutputError") { console.error("Failed to produce structured output:", result.data.info.error.message) console.error("Attempts:", result.data.info.error.retries) } ``` ### Best Practices 1. **Provide clear descriptions** in your schema properties to help the model understand what data to extract 2. **Use `required`** to specify which fields must be present 3. **Keep schemas focused** - complex nested schemas may be harder for the model to fill correctly 4. **Set appropriate `retryCount`** - increase for complex schemas, decrease for simple ones --- ## APIs The SDK exposes all server APIs through a type-safe client. --- ### Global | Method | Description | Response | | ----------------- | ------------------------------- | ------------------------------------ | | `global.health()` | Check server health and version | `{ healthy: true, version: string }` | --- #### Examples ```javascript const health = await client.global.health() console.log(health.data.version) ``` --- ### App | Method | Description | Response | | -------------- | ------------------------- | ------------------------------------------- | | `app.log()` | Write a log entry | `boolean` | | `app.agents()` | List all available agents |Agent[]| --- #### Examples ```javascript // Write a log entry await client.app.log({ body: { service: "my-app", level: "info", message: "Operation completed", }, }) // List available agents const agents = await client.app.agents() ``` --- ### Project | Method | Description | Response | | ------------------- | ------------------- | --------------------------------------------- | | `project.list()` | List all projects |Project[]| | `project.current()` | Get current project |Project| --- #### Examples ```javascript // List all projects const projects = await client.project.list() // Get current project const currentProject = await client.project.current() ``` --- ### Path | Method | Description | Response | | ------------ | ---------------- | ---------------------------------------- | | `path.get()` | Get current path |Path| --- #### Examples ```javascript // Get current path information const pathInfo = await client.path.get() ``` --- ### Config | Method | Description | Response | | -------------- | --------------- | ------------------- | | `config.get()` | Get config info |Config| --- #### Examples ```javascript const config = await client.config.get() ``` --- ### Sessions | Method | Description | Notes | | ---------------------------------------------------------- | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `session.list()` | List sessions | ReturnsSession[]| | `session.get({ path })` | Get session | ReturnsSession| | `session.children({ path })` | List child sessions | ReturnsSession[]| | `session.create({ body })` | Create session | ReturnsSession| | `session.delete({ path })` | Delete session | Returns `boolean` | | `session.update({ path, body })` | Update session properties | ReturnsSession| | `session.init({ path, body })` | Analyze app and create `AGENTS.md` | Returns `boolean` | | `session.abort({ path })` | Abort a running session | Returns `boolean` | | `session.summarize({ path, body })` | Summarize session | Returns `boolean` | | `session.messages({ path })` | List messages in a session | Returns `{ info: `Message`, parts: `Part[]`}[]` | | `session.message({ path })` | Get message details | Returns `{ info: `Message`, parts: `Part[]`}` | | `session.prompt({ path, body })` | Send prompt message | `body.noReply: true` returns UserMessage (context only). Default returnsAssistantMessagewith AI response. Supports `body.outputFormat` for [structured output](#structured-output) | | `session.command({ path, body })` | Send command to session | Returns `{ info: `AssistantMessage`, parts: `Part[]`}` | | `session.shell({ path, body })` | Run a shell command | ReturnsAssistantMessage| | `session.revert({ path, body })` | Revert a message | ReturnsSession| | `session.unrevert({ path })` | Restore reverted messages | ReturnsSession| | `postSessionByIdPermissionsByPermissionId({ path, body })` | Respond to a permission request | Returns `boolean` | --- #### Examples ```javascript // Create and manage sessions const session = await client.session.create({ body: { title: "My session" }, }) const sessions = await client.session.list() // Send a prompt message const result = await client.session.prompt({ path: { id: session.data.id }, body: { model: { providerID: "dropstone", modelID: "dropstone-pro" }, parts: [{ type: "text", text: "Hello!" }], }, }) // Inject context without triggering AI response (useful for plugins) await client.session.prompt({ path: { id: session.data.id }, body: { noReply: true, parts: [{ type: "text", text: "You are a helpful assistant." }], }, }) ``` --- ### Files | Method | Description | Response | | ------------------------- | ---------------------------------- | ------------------------------------------------------------------------------------------- | | `find.text({ query })` | Search for text in files | Array of match objects with `path`, `lines`, `line_number`, `absolute_offset`, `submatches` | | `find.files({ query })` | Find files and directories by name | `string[]` (paths) | | `find.symbols({ query })` | Find workspace symbols |Symbol[]| | `file.read({ query })` | Read a file | `{ type: "raw" \| "patch", content: string }` | | `file.status({ query? })` | Get status for tracked files |File[]| `find.files` supports a few optional query fields: - `type`: `"file"` or `"directory"` - `directory`: override the project root for the search - `limit`: max results (1–200) --- #### Examples ```javascript // Search and read files const textResults = await client.find.text({ query: { pattern: "function.*dropstone" }, }) const files = await client.find.files({ query: { query: "*.ts", type: "file" }, }) const directories = await client.find.files({ query: { query: "packages", type: "directory", limit: 20 }, }) const content = await client.file.read({ query: { path: "src/index.ts" }, }) ``` --- ### Auth | Method | Description | Response | | ------------------- | ------------------------------ | --------- | | `auth.set({ ... })` | Set authentication credentials | `boolean` | --- #### Examples ```javascript await client.auth.set({ path: { id: "dropstone" }, body: { type: "api", key: "your-dropstone-api-key" }, }) ``` --- ### Events | Method | Description | Response | | ------------------- | ------------------------- | ------------------------- | | `event.subscribe()` | Server-sent events stream | Server-sent events stream | --- #### Examples ```javascript // Listen to real-time events const events = await client.event.subscribe() for await (const event of events.stream) { console.log("Event:", event.type, event.properties) } ``` --- ## v2 API The SDK ships a stable v1 surface (used in the examples above) and a v2 surface that mirrors the newer Effect HttpApi contract. Prefer v2 for new integrations: ```typescript import { createDropstone } from "@blankline/dropstone-sdk/v2" const { client, server } = await createDropstone() // v2 exposes a richer resource hierarchy: workspace, worktree, file, find, etc. const files = await client.file.list({ path: "src" }) ``` The v1 surface is kept for backward compatibility. New endpoints only land on v2. ============================================================================== # HTTP API URL: https://docs.dropstone.io/cli/api Description: Public HTTP API for programmatic access. OpenAI-compatible chat completions, pay-per-use credits, one key for Fast / Pro / Heavy. ============================================================================== The Dropstone HTTP API gives you programmatic access to the same three models the CLI uses — **Dropstone Fast**, **Pro**, and **Heavy** — over an OpenAI-compatible interface. One key, one bill, three model families. Use the API when you want to call Dropstone from your own code: CI pipelines, internal tools, automation, or third-party apps. For interactive coding, use the [CLI](./cli) instead.The public API is in preview. The endpoint shape is stable but pricing and rate limits may change before GA. Pin the surface you depend on. --- ## Base URL ``` https://api.dropstone.io/api/v1 ``` All endpoints are mounted under `/api/v1`. The path is versioned so future breaking changes will land under `/api/v2` without disrupting your code. --- ## Authentication Every request must include an API key in the `Authorization` header: ```http Authorization: Bearer dsk_live_``` ### Generate a key 1. Sign in to [dropstone.io/dashboard](https://dropstone.io/dashboard) 2. Open **Settings → API** 3. Click **Create key**, give it a name (e.g. `Production CI`) 4. Copy the full key — **you will only see it once** Keys look like `dsk_live_<43 chars>`. Store them in a secrets manager or in the `DROPSTONE_API_KEY` environment variable. ### Revoking a key Revoke from the same Settings → API page. Revocation is immediate; in-flight requests with the key continue, new requests get `401`. Treat your API key like a password. Never commit it to git, never paste it in chat or screenshots, never embed it in a frontend bundle. If a key leaks, revoke it immediately and create a new one. --- ## Credits & billing The API is **pay-per-use against a credit balance**. There is no free tier and no subscription on the API surface. - Buy credits at [dropstone.io/dashboard/billing](https://dropstone.io/dashboard/billing). Stripe handles checkout. - Each request deducts its cost from your `creditBalance`. - When `creditBalance` drops to **$0**, the API returns [`402 Insufficient credits`](#error-codes) until you top up. - Subscription credits (Pro/Teams monthly allowance) and free-request quotas **do not apply** to API key requests. ### Pricing Pricing is real inference cost passed through with a **30% markup** (`1.3x`). The full per-request cost is returned in the response `usage.cost` field, so you can verify every charge. | Tier | Approx $/M input | Approx $/M output | |---|---|---| | `dropstone-fast` | $0.35 | $1.43 | | `dropstone-pro` | $0.72 | $2.86 | | `dropstone-heavy` | $0.78 | $3.25 | Cached prompt tokens are billed at the provider's cached rate (typically ~5–10% of the normal input rate), so multi-turn conversations get progressively cheaper. --- ## Models ### `GET /api/v1/models` List the three available tiers.Response: ```json { "object": "list", "data": [ { "id": "dropstone-fast", "object": "model", "display_name": "Dropstone Fast", "owned_by": "dropstone" }, { "id": "dropstone-pro", "object": "model", "display_name": "Dropstone Pro", "owned_by": "dropstone" }, { "id": "dropstone-heavy", "object": "model", "display_name": "Dropstone Heavy", "owned_by": "dropstone" } ] } ``` --- ## Chat completions ### `POST /api/v1/chat/completions` OpenAI-compatible chat completions. If you have used any OpenAI-compatible API, this looks identical. #### Request body | Field | Type | Required | Description | |---|---|---| | `model` | `string` | yes | One of `dropstone-fast`, `dropstone-pro`, `dropstone-heavy` | | `messages` | `array` | yes | List of message objects with `role` and `content` | | `stream` | `boolean` | no | When `true`, returns Server-Sent Events. Default `false` | | `temperature` | `number` | no | Sampling temperature, `0..2`. Default model-specific | | `max_tokens` | `number` | no | Cap on output tokens | | `tools` | `array` | no | Function-calling tool schemas, OpenAI format | | `tool_choice` | `string \| object` | no | `"auto"`, `"none"`, or a specific tool | #### Example: simple chat ```bash curl https://api.dropstone.io/api/v1/models \ -H "Authorization: Bearer $DROPSTONE_API_KEY" ``` ```python import os, httpx r = httpx.get( "https://api.dropstone.io/api/v1/models", headers={"Authorization": f"Bearer {os.environ['DROPSTONE_API_KEY']}"}, ) print(r.json()) ``` ```javascript const res = await fetch("https://api.dropstone.io/api/v1/models", { headers: { Authorization: `Bearer ${process.env.DROPSTONE_API_KEY}` }, }) console.log(await res.json()) ``` #### Response ```json { "id": "gen-1779530142-EfBhlhO1U2frV6tvMgKV", "object": "chat.completion", "created": 1779530142, "model": "dropstone-fast", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "Stack trace at midnight..." }, "finish_reason": "stop" } ], "usage": { "prompt_tokens": 11, "completion_tokens": 23, "total_tokens": 34, "cost": 0.0000098 } } ``` The `usage.cost` field is the **billed amount in USD** — what was deducted from your credit balance for this request (real provider cost × 1.3 markup). --- ## Streaming Set `"stream": true` to get a Server-Sent Events stream of token chunks. The stream ends with a `data: [DONE]` line and a final chunk containing the full `usage` block. ```bash curl https://api.dropstone.io/api/v1/chat/completions \ -H "Authorization: Bearer $DROPSTONE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "dropstone-fast", "messages": [ {"role": "user", "content": "Write a haiku about debugging."} ] }' ``` ```python import os, httpx r = httpx.post( "https://api.dropstone.io/api/v1/chat/completions", headers={ "Authorization": f"Bearer {os.environ['DROPSTONE_API_KEY']}", "Content-Type": "application/json", }, json={ "model": "dropstone-fast", "messages": [{"role": "user", "content": "Write a haiku about debugging."}], }, timeout=60, ) print(r.json()["choices"][0]["message"]["content"]) ``` ```javascript const res = await fetch("https://api.dropstone.io/api/v1/chat/completions", { method: "POST", headers: { Authorization: `Bearer ${process.env.DROPSTONE_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ model: "dropstone-fast", messages: [{ role: "user", content: "Write a haiku about debugging." }], }), }) const data = await res.json() console.log(data.choices[0].message.content) ``` --- ## OpenAI SDK compatibility Because the surface is OpenAI-compatible, you can use the official OpenAI SDK by overriding `base_url`: ```bash curl https://api.dropstone.io/api/v1/chat/completions \ -H "Authorization: Bearer $DROPSTONE_API_KEY" \ -H "Content-Type: application/json" \ -N \ -d '{ "model": "dropstone-fast", "stream": true, "messages": [{"role": "user", "content": "Count to 5."}] }' ``` ```python import os, httpx with httpx.stream( "POST", "https://api.dropstone.io/api/v1/chat/completions", headers={"Authorization": f"Bearer {os.environ['DROPSTONE_API_KEY']}"}, json={ "model": "dropstone-fast", "stream": True, "messages": [{"role": "user", "content": "Count to 5."}], }, timeout=60, ) as r: for line in r.iter_lines(): if line.startswith("data: "): print(line[6:]) ``` ```javascript const res = await fetch("https://api.dropstone.io/api/v1/chat/completions", { method: "POST", headers: { Authorization: `Bearer ${process.env.DROPSTONE_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ model: "dropstone-fast", stream: true, messages: [{ role: "user", content: "Count to 5." }], }), }) const reader = res.body.getReader() const decoder = new TextDecoder() while (true) { const { value, done } = await reader.read() if (done) break process.stdout.write(decoder.decode(value)) } ``` --- ## Error codes | Code | Meaning | Action | |---|---|---| | `400` | Invalid request body (bad `model`, missing `messages`, etc.) | Check the response `error.message` | | `401` | Missing, malformed, or revoked API key | Generate a new key in the dashboard | | `402` | **Insufficient credits.** Balance is `$0` or negative | [Top up at /dashboard/billing](https://dropstone.io/dashboard/billing) | | `403` | Account suspended or banned | Contact support | | `429` | Rate limit (future — not enforced today) | Back off and retry | | `500` | Server error | Retry with exponential backoff | | `502` | Upstream provider error | Retry with exponential backoff | ### 402 response shape ```json { "error": "Insufficient credits", "balance": 0, "message": "Your credit balance is empty. Top up at https://dropstone.io/dashboard/billing to continue.", "topUpUrl": "https://dropstone.io/dashboard/billing" } ``` --- ## Rate limits There are no hard rate limits enforced on the API today. Per-key usage tiers and daily spend caps are planned — when they ship, your existing keys will be auto-tiered based on lifetime spend, similar to OpenAI's tier system. For now, set per-key budgets yourself by tracking the `usage.cost` field in your application. --- ## Recommended practices - **Use environment variables**, never inline keys: `DROPSTONE_API_KEY=dsk_live_...`. - **One key per service**, not one key shared everywhere. Easier to revoke when a service is compromised. - **Watch `usage.cost`** in responses to track spend in real time. - **Handle 402 gracefully** — your app should detect it and surface a top-up CTA rather than retrying. - **Cache responses** for repeated identical requests on your side — we cache at the model level, but you save the full markup by short-circuiting before reaching us. --- ## Differences from the CLI and SDK | Surface | Auth | Pricing model | Models | Use case | |---|---|---|---| | **HTTP API** (this page) | API key | Pay-per-use from credit balance | Fast / Pro / Heavy | CI, automation, integrations | | **CLI** ([docs](./cli)) | Interactive sign-in | Subscription + credit balance | Same three + free open-source models | Day-to-day coding in a terminal | | **JS SDK** ([docs](./sdk)) | Spawns local CLI, inherits its auth | Same as CLI | Same as CLI | Embedding the agent in a Node app | If you want headless programmatic access in CI or a server, the **HTTP API is the right surface**. The SDK is for embedding the interactive agent in a Node process where a human is still in the loop. --- ## Coming soon These are on the roadmap and will land under the same `/api/v1` namespace: - **`POST /api/v1/agent/run`** — agent loop endpoint. Send a task, get a finished diff. Server-side multi-turn loop with built-in tools (file editing, web search, code execution). Flat per-task pricing. - **`POST /api/v1/memory/store`** + **`GET /api/v1/memory/query`** — stateful memory via Qdrant. Agent context that persists across calls. - **MCP tool injection** — include your own MCP server URLs in agent requests, agent calls them as native tools. - **Per-key spend caps** — set a daily $ limit per key from the dashboard. CI safety net. Star [the GitHub repo](https://github.com/blankline-org/dropstone-cli) or watch the [changelog](../getting-started/changelog) to know when they ship. ============================================================================== # Network URL: https://docs.dropstone.io/cli/network Description: Configure proxies and custom certificates. ============================================================================== Dropstone supports standard proxy environment variables and custom certificates for enterprise network environments. --- ## Proxy Dropstone respects standard proxy environment variables. ```bash # HTTPS proxy (recommended) export HTTPS_PROXY=https://proxy.example.com:8080 # HTTP proxy (if HTTPS not available) export HTTP_PROXY=http://proxy.example.com:8080 # Bypass proxy for local server (required) export NO_PROXY=localhost,127.0.0.1 ``` ```python from openai import OpenAI client = OpenAI( base_url="https://api.dropstone.io/api/v1", api_key=os.environ["DROPSTONE_API_KEY"], ) resp = client.chat.completions.create( model="dropstone-fast", messages=[{"role": "user", "content": "Hello"}], ) print(resp.choices[0].message.content) ``` ```javascript import OpenAI from "openai" const client = new OpenAI({ baseURL: "https://api.dropstone.io/api/v1", apiKey: process.env.DROPSTONE_API_KEY, }) const resp = await client.chat.completions.create({ model: "dropstone-fast", messages: [{ role: "user", content: "Hello" }], }) console.log(resp.choices[0].message.content) ``` Dropstone uses a local HTTP loopback during interactive sessions. You must bypass the proxy for `localhost`/`127.0.0.1` to prevent routing loops. You can configure the local bind address using [CLI flags](./cli#run). --- ### Authenticate If your proxy requires basic authentication, include credentials in the URL. ```bash export HTTPS_PROXY=http://username:password@proxy.example.com:8080 ```Avoid hardcoding passwords in shell config. Use environment variables, your OS keyring, or a secrets manager. For proxies that require advanced authentication (NTLM, Kerberos), front Dropstone with a local authenticating proxy (such as [cntlm](https://github.com/Evengard/cntlm)) and point `HTTPS_PROXY` at the local proxy instead. --- ## Custom certificates If your enterprise uses custom CAs for HTTPS connections, configure Dropstone to trust them. ```bash export NODE_EXTRA_CA_CERTS=/path/to/ca-cert.pem ``` This works for both proxy connections and direct API access. ============================================================================== # Windows (WSL) URL: https://docs.dropstone.io/cli/windows-wsl Description: Run Dropstone on Windows using WSL for the best experience. ============================================================================== While Dropstone can run directly on Windows, we recommend using [Windows Subsystem for Linux (WSL)](https://learn.microsoft.com/en-us/windows/wsl/install) for the best experience. WSL provides a Linux environment that works seamlessly with Dropstone's features.WSL offers better file system performance, full terminal support, and compatibility with development tools that Dropstone relies on. --- ## Setup1. **Install WSL** If you haven't already, [install WSL](https://learn.microsoft.com/en-us/windows/wsl/install) using the official Microsoft guide. 2. **Install Dropstone in WSL** Once WSL is set up, open your WSL terminal and install Dropstone using the install script: ```bash curl -fsSL https://dropstone.io/install | bash ``` 3. **Use Dropstone from WSL** Navigate to your project directory (access Windows files via `/mnt/c/`, `/mnt/d/`, etc.) and run Dropstone. ```bash cd /mnt/c/Users/YourName/project dropstone ``` --- ## Web Client + WSL For the best web experience on Windows: 1. **Run `dropstone web` in the WSL terminal** rather than PowerShell: ```bash dropstone web --hostname 0.0.0.0 ``` 2. **Access from your Windows browser** at `http://localhost:` (Dropstone prints the URL) Running `dropstone web` from WSL ensures proper file system access and terminal integration while still being accessible from your Windows browser. --- ## Accessing Windows Files WSL can access all your Windows files through the `/mnt/` directory: - `C:` drive → `/mnt/c/` - `D:` drive → `/mnt/d/` - And so on... Example: ```bash cd /mnt/c/Users/YourName/Documents/project dropstone ``` For the smoothest experience, clone or copy your repo into the WSL filesystem (for example under `~/code/`) and run Dropstone there. WSL's native filesystem is much faster than `/mnt/c/` for large projects. --- ## Tips - Keep Dropstone running in WSL for projects stored on Windows drives - file access is seamless - Use VS Code's [WSL extension](https://code.visualstudio.com/docs/remote/wsl) alongside Dropstone for an integrated development workflow - Your Dropstone config and sessions are stored within the WSL environment at `~/.local/share/dropstone/` ============================================================================== # Enterprise URL: https://docs.dropstone.io/cli/enterprise Description: Using Dropstone securely in your organization. ============================================================================== Dropstone Enterprise is for organizations that want centralized config, SSO, and admin controls across their developers.Dropstone does not store your code or context data. See [Data handling](#data-handling) below for the full posture. To get started with Dropstone Enterprise: 1. Run an internal trial with your team using the standard plan. 2. **Contact us** to discuss pricing and implementation. --- ## Trial Your developers can install Dropstone today and start using it. See the [Quickstart](../getting-started/quick-start) for the install flow. A trial does not require an enterprise contract, and nothing in the default configuration sends code to anyone outside the team. --- ### Data handling **Your prompts, code, and conversation transcripts are never used to train models and are not retained beyond the lifetime of your session.** Dropstone uses session-scoped prompt caching to reduce cost and latency, the same way Anthropic and OpenAI do: cached content is isolated to your own account, expires automatically, and is never reused for any other user or sent to model training. These controls are enforced and reviewed by Blankline, Dropstone's parent company. Blankline's compliance team audits Dropstone's data handling on a recurring basis and retains revocation authority over the production access of any individual or system that breaches the policy. See the [Trust page](https://dropstone.io/trust) for the full posture, including subprocessor disclosures and the runtime security boundary. --- ### Code ownership **You own all code produced by Dropstone.** There are no licensing restrictions or ownership claims. --- ## Pricing Dropstone Enterprise uses a per-seat model with a flat monthly cost per developer. For details and a custom quote based on your organization's needs, **contact us**. --- ## Deployment Once you have completed your trial and are ready to roll Dropstone out across your organization, **contact us** to set up the enterprise contract and the central config. --- ### Central config Dropstone Enterprise organizations get a single central config that is served to every developer's CLI on sign-in. The config can pin: - Default model tier and reasoning effort - Permissions (which tools an agent can run without approval) - Allowed MCP servers - Audit and telemetry destinations Users cannot override managed values locally. See [Managed settings](./config#managed-settings) for the underlying mechanism (also available outside enterprise contracts for self-managed deployments). --- ### SSO integration Dropstone Enterprise integrates with SAML and OIDC identity providers (Okta, Azure AD, Google Workspace, and any standards-compliant IdP). Developers sign in through your existing identity system; revoking access in your IdP immediately revokes Dropstone access for that user. --- ## FAQWhat is Dropstone Enterprise?
Dropstone Enterprise is a per-seat plan that adds SSO sign-in, a central config that admins control, an enterprise data-handling guarantee (no retention, no training, audited by Blankline), and a named point of contact for support.How do I get started?
Run a trial internally first. Dropstone does not store your code or context data by default, so you don't need an enterprise contract to evaluate it. When you are ready to roll it out across the team, **contact us**.How does enterprise pricing work?
Per-seat. For a custom quote based on team size and feature requirements, **contact us**.Is my data secure with Dropstone Enterprise?
Yes. Dropstone does not retain your code, prompts, or conversation transcripts beyond the in-flight inference call, and never uses them to train models. Session-scoped prompt caching is isolated per account and expires automatically. These controls are reviewed by Blankline's compliance team on a recurring basis. See the [Trust page](https://dropstone.io/trust) for the full posture.============================================================================== # Troubleshooting URL: https://docs.dropstone.io/cli/troubleshooting Description: Common issues and how to resolve them. ============================================================================== To debug issues with Dropstone, start by checking the logs and local data it stores on disk. --- ## Logs Log files are written to: - **macOS / Linux**: `~/.local/share/dropstone/log/` - **Windows**: press `WIN+R` and paste `%USERPROFILE%\.local\share\dropstone\log` Log files are named with timestamps (for example `2026-05-23T123456.log`) and the most recent 10 log files are kept. You can set the log level with the `--log-level` command-line option for more detailed debug output: ```bash dropstone --log-level DEBUG ``` `--print-logs` also streams logs to stderr in real time: ```bash dropstone --print-logs ``` --- ## Storage Dropstone stores session data and other application data on disk at: - **macOS / Linux**: `~/.local/share/dropstone/` - **Windows**: press `WIN+R` and paste `%USERPROFILE%\.local\share\dropstone` This directory contains: - `auth.json`: Authentication credentials - `log/`: Application logs - `project/`: Project-specific data like session history - If the project is inside a Git repo, it is stored in `./Can we use our own private NPM registry?
Yes. Dropstone supports private npm registries through standard `.npmrc` file support. If your organization uses a private registry (JFrog Artifactory, Nexus, GitHub Packages, or similar), authenticate developers before running Dropstone. To set up authentication with your private registry: ```bash npm login --registry=https://your-company.jfrog.io/api/npm/npm-virtual/ ``` This creates `~/.npmrc` with authentication details. Dropstone picks it up automatically.Developers must be logged into the private registry before running Dropstone, otherwise package installs from npm-based plugins will fail. Alternatively, configure `~/.npmrc` manually: ```bash title="~/.npmrc" registry=https://your-company.jfrog.io/api/npm/npm-virtual/ //your-company.jfrog.io/api/npm/npm-virtual/:_authToken=${NPM_AUTH_TOKEN} ```/storage/` - Otherwise it is stored in `./global/storage/` --- ## Common issues ### Dropstone won't start 1. Check the logs for an error message. 2. Try running with `--print-logs` to stream logs to stderr. 3. Ensure you are on the latest version: `dropstone update`. --- ### Authentication issues If sign-in or token validation fails: 1. Re-run `dropstone` and sign in again through the browser flow. 2. If you are in a headless environment, set `DROPSTONE_API_KEY` from a token issued at [dropstone.io/account](https://dropstone.io/account). 3. Confirm your network allows outbound HTTPS to `dropstone.io`. If you are behind a corporate proxy, see [Network](./network). --- ### Model not found If you see `ModelNotFoundError`, you are likely referencing a model ID that doesn't exist. Use one of: - `dropstone/dropstone-fast` - `dropstone/dropstone-pro` - `dropstone/dropstone-heavy` Run `dropstone models` to confirm what's available to your account. --- ### Initialisation error If you see an `InitError` on launch, your stored credentials may be invalid or corrupted. 1. Clear your stored data: ```bash rm -rf ~/.local/share/dropstone ``` On Windows: press `WIN+R` and delete `%USERPROFILE%\.local\share\dropstone`. 2. Re-run `dropstone` and sign in again. --- ### API call errors If you see API call errors during a session, the on-disk cache may be stale. 1. Clear the cache: ```bash rm -rf ~/.cache/dropstone ``` On Windows: press `WIN+R` and delete `%USERPROFILE%\.cache\dropstone`. 2. Restart Dropstone. --- ### Copy / paste not working on Linux Linux users need one of the following clipboard utilities installed for copy/paste to work: **X11** ```bash apt install -y xclip # or apt install -y xsel ``` **Wayland** ```bash apt install -y wl-clipboard ``` **Headless** ```bash apt install -y xvfb # then Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 & export DISPLAY=:99.0 ``` Dropstone prefers `wl-clipboard` on Wayland and falls back to `xclip` then `xsel` on X11. --- ### Windows: General performance issues If you are seeing slow performance, file-access problems, or terminal glitches on native Windows, switch to [WSL](./windows-wsl). WSL gives you a Linux environment that runs Dropstone with native filesystem speed and full terminal support. --- ## Getting help - Check the [Common issues](#common-issues) section above - Read the relevant page in the [CLI reference](./cli) or [Configuration](./config) - For bug reports, feature requests, or enterprise inquiries, [contact us](https://dropstone.io/contact) ============================================================================== # Common issues URL: https://docs.dropstone.io/troubleshooting/common_issues Description: Fix common Dropstone CLI install and runtime issues. Step-by-step solutions for failed installs, auth problems, and update errors. ============================================================================== The most common issues Dropstone users hit, with the steps to fix them. For runtime errors and per-feature debugging, see the [CLI troubleshooting](../cli/troubleshooting) page. ## Install fails on macOS ### "Command not found: brew" You need Homebrew first. Install it once: ```bash /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" ``` On Apple Silicon, also add Homebrew to your PATH: ```bash echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile eval "$(/opt/homebrew/bin/brew shellenv)" ``` Then re-run the Dropstone install: ```bash brew tap blankline-org/dropstone-cli brew install dropstone ``` ### "Cannot install: package already exists" Force-overwrite the existing install: ```bash brew uninstall dropstone brew install dropstone ``` ### Homebrew tap fails to refresh Clear the cache and re-tap: ```bash brew untap blankline-org/dropstone-cli brew cleanup brew tap blankline-org/dropstone-cli brew install dropstone ``` ## Install fails on Windows ### "irm is not recognized as an internal or external command" You're in CMD, not PowerShell. Either switch to PowerShell: ```powershell irm https://dropstone.io/install.ps1 | iex ``` Or use the CMD installer: ```bash curl -fsSL https://dropstone.io/install.cmd -o install.cmd && install.cmd ``` ### "The token '&&' is not a valid statement separator" You're in PowerShell trying to run the CMD command. Switch to the PowerShell one above. ### Pending update did not apply If `dropstone update` reported success but `dropstone --version` still shows the old version, restart your terminal. On Windows the new binary swaps in on next launch. If that still doesn't help, force-reinstall: ```powershell irm https://dropstone.io/install.ps1 | iex ``` ## Authentication ### "Failed to sign in" 1. Run `dropstone` again. On first launch it opens [dropstone.io/login](https://dropstone.io/login) for PKCE-based sign-in. 2. If the browser flow fails, paste a token instead. Grab one at [dropstone.io/account](https://dropstone.io/account) and choose "Paste a token" at the sign-in prompt. ### "Session expired" Run `/login` from inside Dropstone to refresh your credentials. ### Stuck on the wrong account To switch accounts, run `/login` from inside Dropstone and pick the right account at the browser prompt. ## Update problems ### `dropstone update` reports "Update Available" but does nothing This usually means the auto-installer doesn't have write access to the binary's directory. Reinstall using your original method: | Platform | Command | | -------- | ------- | | macOS (Homebrew) | `brew upgrade dropstone` | | macOS / Linux (script) | `curl -fsSL https://dropstone.io/install \| bash` | | Windows (PowerShell) | `irm https://dropstone.io/install.ps1 \| iex` | ### Stuck on an old version Check what's installed: ```bash dropstone --version ``` Compare against the latest at [download.dropstone.io/latest.txt](https://download.dropstone.io/latest.txt). If they don't match, reinstall using the platform command above. ## Still having issues? If none of the above resolved your problem, see the more detailed [CLI troubleshooting](../cli/troubleshooting) page, or open an issue at [dropstone.io/contact](https://dropstone.io/contact) with: - Your OS and version - The output of `dropstone --version` - The full error message and the exact command you ran ============================================================================== # Dropstone Troubleshooting Guide - Diagnose & Fix Issues URL: https://docs.dropstone.io/troubleshooting/troubleshooting_guide Description: Comprehensive troubleshooting for Dropstone Desktop. Diagnose authentication, connectivity, performance, and agent issues. Find log files, reset settings, and get support. ============================================================================== This guide provides systematic approaches to diagnosing and resolving common issues with Dropstone.io. Follow these steps to gather the necessary information before reaching out to support. ## Essential Information for Troubleshooting The following information is critical for most troubleshooting scenarios within Dropstone: ### 1. Visual Documentation **Screenshot of Issue** (redact any sensitive information) - Capture the entire application window showing the error - Include any error messages or dialogs - Ensure timestamps are visible if available ### 2. Reproduction Steps Provide detailed steps to reproduce the issue: ``` 1. Action taken (e.g., "Clicked on 'Deploy' button") 2. Expected behavior 3. Actual behavior 4. Frequency (always, sometimes, once) ``` ### 3. System Information Retrieve system information from: **Dropstone** → **Help** → **About** This includes: - Dropstone version - Operating system - Architecture (x64, arm64) - Electron version - Node.js version ### 4. Network Configuration Are you using any of the following? - VPN (Virtual Private Network) - Zscaler or other security proxies - Corporate firewall - Custom DNS settings ### 5. Developer Tools Console Access developer tools to check for JavaScript errors: **Dropstone** → **Help** → **Toggle Developer Tools** Navigate to the **Console** tab and check for: - Red error messages - Warning messages related to your issue - Network request failures Copy any relevant error stack traces. ### 6. Application Logs #### Windows Logs are located at: ``` C:\Users\ \AppData\Roaming\Dropstone\logs ``` Access via Command Palette: 1. Press `Ctrl` + `Shift` + `P` 2. Type and select: **Developer: Open Logs Folder** #### macOS Logs are located at: ``` ~/Library/Application Support/Dropstone/logs ``` Access via Command Palette: 1. Press `Cmd` + `Shift` + `P` 2. Type and select: **Developer: Open Logs Folder** #### Linux Logs are located at: ``` ~/.config/Dropstone/logs ``` #### Viewing Logs in Application Navigate to: **Dropstone** → **Terminal** → **Output** Select from the dropdown: - **Window** - General application logs - **Dropstone Core** - Core functionality logs - **Dropstone Deployment** - Deployment-related logs - **Dropstone Storage** - Storage and database logs - **Dropstone API** - API request/response logs --- ## Common Issues and Solutions ### Connection Issues #### Problem: Unable to Connect to Dropstone Services **Symptoms:** - "Connection timeout" errors - "Unable to reach server" messages - Indefinite loading states **Solutions:** 1. **Check Internet Connection** ```bash # Windows ping dropstone.io # macOS/Linux ping dropstone.io ``` 2. **Verify Firewall Settings** - Ensure Dropstone is allowed through your firewall - Check corporate network policies - Whitelist `*.dropstone.io` domain 3. **Proxy Configuration** Configure proxy settings: **Dropstone** → **Settings** → **Network** → **Proxy Settings** Or set environment variables: ```bash export HTTP_PROXY=http://proxy.example.com:8080 export HTTPS_PROXY=http://proxy.example.com:8080 ``` 4. **DNS Resolution** - Flush DNS cache - Try alternative DNS (8.8.8.8, 1.1.1.1) ### Authentication Issues #### Problem: Login Failures or Token Expiration **Symptoms:** - "Authentication failed" errors - Repeated login prompts - 401 Unauthorized responses **Solutions:** 1. **Clear Authentication Cache** **Dropstone** → **Command Palette** → **Clear Authentication Cache** 2. **Re-authenticate** ``` 1. Sign out from Dropstone 2. Clear browser cookies for dropstone.io 3. Sign in again ``` 3. **Check Token Validity** Navigate to: **Settings** → **Account** → **Session Management** Review active sessions and revoke suspicious ones. 4. **SSO Issues** If using Single Sign-On: - Verify SSO provider is accessible - Check for expired SAML assertions - Contact your identity provider administrator ### Performance Issues #### Problem: Slow Application Response or High CPU Usage **Symptoms:** - Lag when typing or clicking - High CPU/memory usage - Frozen or unresponsive UI **Solutions:** 1. **Check Resource Usage** **Dropstone** → **Help** → **Process Manager** Identify processes consuming excessive resources. 2. **Disable Extensions** Temporarily disable extensions to isolate the issue: **Settings** → **Extensions** → Disable all → Restart 3. **Clear Cache** ``` Dropstone → Settings → Advanced → Clear Cache ``` 4. **Reduce Project Size** - Exclude large files from indexing - Add to `.dpsignore` file: ``` node_modules/ dist/ build/ *.log .git/ ``` 5. **Hardware Acceleration** Toggle GPU acceleration: **Settings** → **System** → **Use Hardware Acceleration** ### Deployment Issues #### Problem: Failed Deployments **Symptoms:** - Build failures - Deployment timeouts - "Unable to push to remote" errors **Solutions:** 1. **Check Build Logs** View detailed build output: **Deployment** → **History** → Select failed deployment → **View Logs** 2. **Verify Environment Variables** ``` Settings → Deployment → Environment Variables ``` Ensure all required variables are set. 3. **Check Deployment Configuration** Validate your `dropstone.config.js`: ```javascript module.exports = { build: { command: 'npm run build', output: 'dist' }, deployment: { region: 'us-east-1', runtime: 'nodejs18.x' } } ``` 4. **Storage Quota** Verify you haven't exceeded storage limits: **Dashboard** → **Usage** → **Storage** 5. **Build Timeout** Increase timeout in configuration: ```javascript deployment: { timeout: 900 // 15 minutes in seconds } ``` ### Storage and Database Issues #### Problem: Data Sync or Storage Errors **Symptoms:** - "Storage quota exceeded" - Sync conflicts - Data not persisting **Solutions:** 1. **Check Storage Usage** **Dashboard** → **Storage** → **Usage Statistics** 2. **Resolve Sync Conflicts** ``` 1. Navigate to conflicted file 2. Dropstone will show conflict markers 3. Resolve manually or select version to keep ``` 3. **Database Connection** Test database connectivity: ```javascript // In Dropstone console await dropstone.db.test() ``` 4. **Clear Local Cache** ``` Settings → Storage → Clear Local Cache ``` Warning: This will remove locally cached data. 5. **Backup and Restore** Create backup before troubleshooting: ``` Dropstone → Tools → Backup → Create Backup ``` --- ## Advanced Troubleshooting ### Safe Mode Start Dropstone in safe mode to disable all extensions: **Windows/Linux:** ```bash dropstone --disable-extensions ``` **macOS:** ```bash /Applications/Dropstone.app/Contents/MacOS/Dropstone --disable-extensions ``` ### Reset to Default Settings To reset all settings to defaults: 1. **Backup Current Settings** ``` Settings → Advanced → Export Settings ``` 2. **Reset** ``` Settings → Advanced → Reset All Settings ``` ### Verbose Logging Enable detailed logging for debugging: 1. Open Command Palette (`Ctrl/Cmd` + `Shift` + `P`) 2. Select: **Developer: Set Log Level** 3. Choose: **Trace** Logs will now include detailed diagnostic information. ### Network Diagnostics Run built-in network diagnostics: ``` Dropstone → Help → Run Network Diagnostics ``` This checks: - DNS resolution - API endpoint accessibility - WebSocket connections - CDN availability --- ## Getting Help ### Before Contacting Support Ensure you have: - [ ] Checked this troubleshooting guide - [ ] Reviewed the [Status Page](https://status.dropstone.io) - [ ] Gathered all essential troubleshooting information ### Contact Support **Email:** support@blankline.org **Include in your message:** 1. Issue summary 2. Steps to reproduce 3. System information 4. Relevant logs (last 100 lines) 5. Screenshots 6. What you've already tried ### Other Resources - **Documentation:** [docs.dropstone.io](https://docs.dropstone.io) - **Status Page:** [status.dropstone.io](https://status.dropstone.io) - **Sales / Enterprise:** [dropstone.io/contact](https://www.dropstone.io/contact) --- ## Useful Commands ### Command Palette Quick Reference | Command | Description | |---------|-------------| | `Ctrl/Cmd` + `Shift` + `P` | Open Command Palette | | `Ctrl/Cmd` + `,` | Open Settings | | `Ctrl/Cmd` + `Shift` + `D` | Open Developer Tools | | `Ctrl/Cmd` + `Shift` + `L` | Open Logs | | `Ctrl/Cmd` + `Shift` + `R` | Reload Window | | `Ctrl/Cmd` + `K` `Ctrl/Cmd` + `T` | Clear Terminal | ### CLI Diagnostics ```bash # Check Dropstone CLI version dropstone --version # Verify installation dropstone doctor # Test API connectivity dropstone ping # View current configuration dropstone config list # Clear local cache dropstone cache clear # Export logs dropstone logs export --output ./dropstone-logs.txt ``` --- ## Appendix ### Log File Locations | Platform | Location | |----------|----------| | Windows | `%APPDATA%\Dropstone\logs` | | macOS | `~/Library/Application Support/Dropstone/logs` | | Linux | `~/.config/Dropstone/logs` | ### Configuration File Locations | Platform | Location | |----------|----------| | Windows | `%APPDATA%\Dropstone\config.json` | | macOS | `~/Library/Application Support/Dropstone/config.json` | | Linux | `~/.config/Dropstone/config.json` | ### Environment Variables | Variable | Purpose | Example | |----------|---------|---------| | `DROPSTONE_API_URL` | Override API endpoint | `https://api.dropstone.io` | | `DROPSTONE_LOG_LEVEL` | Set logging verbosity | `debug`, `info`, `warn`, `error` | | `DROPSTONE_TIMEOUT` | API request timeout (ms) | `30000` | | `DROPSTONE_PROXY` | Proxy server URL | `http://proxy:8080` | | `DROPSTONE_DISABLE_TELEMETRY` | Disable telemetry | `true`, `false` | --- *Last Updated: September 29, 2025* *Version: 1.0.0* ============================================================================== # Installation Guide URL: https://docs.dropstone.io/troubleshooting/downloads Description: Download, install, and configure Dropstone on Windows and Apple Silicon macOS. ============================================================================== ## Overview Dropstone is an **AI-powered platform** for code analysis, debugging & automation. This guide will walk you through downloading, installing, and configuring Dropstone on **Windows** and **Apple Silicon macOS**. --- ## Download Dropstone ### System Requirements | Component | Windows (Minimum / Recommended) | macOS Silicon (Minimum / Recommended) | |-----------|--------------------------------|--------------------------------------| | **OS** | Windows 10 / Latest Windows 11 | macOS 12 Monterey / Latest macOS (Ventura, Sonoma) | | **CPU** | x64, Intel/AMD | Apple Silicon (M1, M2, M3, M4) only | | **RAM** | 8 GB / 16 GB+ | 8 GB / 16 GB+ | | **Disk** | SSD / Fast SSD | SSD / NVMe | | **Permissions** | Install & read/write files (Admin recommended) | Install apps, Full Disk Access recommended | --- ## Download & Installation ### Windows Installation #### Step 1: Get the Installer 1. Open your browser and go to **dropstone.io**. 2. Navigate to the **Downloads** section. 3. Select **Windows** and download the `.exe` file. 4. Save the installer to an accessible location (e.g., **Downloads folder**). #### Step 2: Install Dropstone 1. Double-click the installer file. 2. Accept the **license agreement**. 3. Choose an installation directory (default is recommended). 4. Click **Install** and wait for setup to complete. 5. Launch Dropstone via **Start Menu** or **Desktop shortcut**. --- ### macOS Silicon Installation #### Prerequisites **Homebrew is required** for this installation method. If you don't have Homebrew installed, open **Terminal** and run: ```bash /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" ``` #### For Existing Users If you already have Dropstone installed, upgrade to the latest version: ```bash brew upgrade --cask dropstone ``` #### Installation Steps **1. Add Dropstone Tap** Add the official Dropstone repository to Homebrew: ```bash brew tap blankline-org/dropstone ``` **2. Install Dropstone** Install the Dropstone desktop application: ```bash brew install --cask dropstone ``` **3. Launch Dropstone** Open Dropstone from **Launchpad**, **Applications folder**, or Spotlight. If macOS blocks the app (Gatekeeper), go to **System Settings → Privacy & Security → Open Anyway**.