diff --git a/README.md b/README.md index f4101db295d..894061afdaf 100644 --- a/README.md +++ b/README.md @@ -12,8 +12,10 @@ Docker pulls - +

+ Documentation + · Try it · Contact us for a demo @@ -22,7 +24,10 @@

---- + + +cowork-select + # MINDS-COWORK PLATFORM diff --git a/docs/api.html b/docs/api.html index 4b3a815a5cf..39e4d02b304 100644 --- a/docs/api.html +++ b/docs/api.html @@ -49,14 +49,53 @@ .brand { font-family: var(--font-mono); font-size: 11px; font-weight: 600; letter-spacing: 0.18em; text-transform: uppercase; color: var(--ink-3); display: flex; align-items: center; gap: 8px; } .brand-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--accent); box-shadow: 0 0 8px var(--accent-glow); } .nav-links { display: flex; gap: 24px; margin-left: auto; } + /* ── Mobile nav ── */ + .hamburger { + display: none; + flex-direction: column; justify-content: center; gap: 5px; + width: 36px; height: 36px; + background: none; border: none; cursor: pointer; + padding: 4px; margin-left: auto; flex-shrink: 0; + } + .hamburger span { + display: block; width: 20px; height: 1.5px; + background: var(--ink-3); border-radius: 2px; + transition: transform 200ms, opacity 200ms, width 200ms; + transform-origin: center; + } + nav[data-open] .hamburger span:nth-child(1) { transform: translateY(6.5px) rotate(45deg); } + nav[data-open] .hamburger span:nth-child(2) { opacity: 0; width: 0; } + nav[data-open] .hamburger span:nth-child(3) { transform: translateY(-6.5px) rotate(-45deg); } + @media (max-width: 640px) { + .hamburger { display: flex; } + .nav-links { + display: none; + position: absolute; top: 52px; left: 0; right: 0; + flex-direction: column; gap: 0; + background: rgba(8,13,24,0.97); + backdrop-filter: saturate(160%) blur(16px); + -webkit-backdrop-filter: saturate(160%) blur(16px); + border-bottom: 1px solid var(--line); + padding: 8px 0; + z-index: 39; + } + nav[data-open] .nav-links { display: flex; } + .nav-links a { + padding: 12px 24px; + font-size: 14px; + border-left: 2px solid transparent; + } + .nav-links a.active { border-color: var(--accent); background: var(--accent-bg); } + } + .nav-links a { font-size: 13px; color: var(--ink-3); transition: color 120ms; } .nav-links a:hover { color: var(--ink); opacity: 1; } .nav-links a.active { color: var(--accent); } - .shell { max-width: 1100px; margin: 0 auto; padding: 64px 24px 120px; display: grid; grid-template-columns: 220px 1fr; gap: 0; } + .shell { max-width: 1100px; margin: 0 auto; padding: 64px 24px 120px; display: grid; grid-template-columns: 220px 1fr; gap: 0; align-items: start; } @media (max-width: 768px) { .shell { grid-template-columns: 1fr; } } - .sidebar { padding-right: 40px; padding-top: 4px; } + .sidebar { padding-right: 40px; padding-top: 4px; position: sticky; top: 72px; } @media (max-width: 768px) { .sidebar { display: none; } } .sidebar-label { font-family: var(--font-mono); font-size: 10px; font-weight: 600; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-4); margin-bottom: 12px; } .sidebar ul { list-style: none; display: flex; flex-direction: column; gap: 2px; } @@ -131,6 +170,27 @@ .cm { color: var(--ink-4); } .st { color: #A5F3FC; } + /* ── ERD ── */ + .erd-wrap { background: var(--surface-2); border: 1px solid var(--line); border-radius: var(--r-xl); padding: 24px 20px 14px; margin-bottom: 48px; overflow-x: auto; } + .erd-wrap svg a { cursor: pointer; } + .erd-wrap svg a:hover { filter: brightness(1.25); } + .erd-notes { margin-top: 14px; display: flex; flex-direction: column; gap: 6px; } + .erd-note { font-size: 12px; color: var(--ink-4); font-family: var(--font-mono); line-height: 1.55; padding: 0 2px; } + .erd-note strong { color: var(--ink-3); font-weight: 600; } + + /* ── Params table ── */ + .schema-label { font-family: var(--font-mono); font-size: 9.5px; font-weight: 600; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-4); margin: 16px 0 8px; } + .params-table { width: 100%; border-collapse: collapse; margin-bottom: 14px; } + .params-table tr:not(:last-child) td { border-bottom: 1px solid var(--line); } + .params-table td { padding: 7px 0; vertical-align: top; } + .p-name { font-family: var(--font-mono); color: var(--accent); font-size: 12px; padding-right: 16px; white-space: nowrap; width: 1%; } + .p-type { font-family: var(--font-mono); color: var(--ink-4); font-size: 11px; padding-right: 16px; white-space: nowrap; width: 1%; } + .p-req { font-family: var(--font-mono); font-size: 10px; padding-right: 16px; white-space: nowrap; width: 1%; } + .p-req.req { color: var(--method-post); } + .p-req.opt { color: var(--ink-4); } + .p-desc { font-size: 12.5px; color: var(--ink-3); } + .p-desc code { font-size: 0.9em; } + footer { border-top: 1px solid var(--line); padding: 24px; text-align: center; font-family: var(--font-mono); font-size: 11px; color: var(--ink-4); letter-spacing: 0.06em; } @@ -142,10 +202,13 @@ + @@ -161,20 +224,185 @@
  • Schedules
  • Files
  • Connectors
  • +
  • Memories
  • +
  • Skills
  • +
  • Scratchpads
  • Search
  • API Reference
    -

    REST API

    +

    REST API

    The Cowork server exposes a versioned REST API at /api/v1. - All endpoints return JSON. The interactive docs are available at - /docs when the server is running. + All endpoints return JSON.

    -
    + +
    + + + + + + + + + + + + + + + N + + + + N + + + + N + + + + N + + + + + + 1 + + + + N + 1 + + + + N + + + + N + + + + triggers + + + + + + + 0..N + + + + + + + + Project + central workspace + + + + + + Connector + independent + + + + + + Conversation + + = Task + + + + + + Artifact + + mini app + + + + + + Schedule + + + + + + File + + + + + + Response + + + + + + Scratchpad + ephemeral draft + + + + + + Cell + code · md · output + + + + + + Memory + global or project + + + + + + Skill + global + + + + + usable within + + + + LEGEND + + + + owns 1..N + + + + optional / triggers + + + independent / global + + + usable within / 0..N + +
    + +
    Base URL http://localhost:26866/api/v1
    @@ -184,6 +412,21 @@

    REST API

    Responses

    Stream AI responses from the agent. Compatible with the OpenAI Responses API shape.

    +

    Response object

    +
    +
    json
    +
    {
    +  "id":              "resp_abc123",
    +  "conversation_id": "conv_xyz",
    +  "input":           "Summarise last week's sales data",
    +  "output":          [{ "type": "text", "text": "Here is the summary..." }],
    +  "status":          "completed",  // "in_progress" | "completed" | "failed"
    +  "model":           "claude-opus-4-8",
    +  "usage":           { "input_tokens": 120, "output_tokens": 340 },
    +  "created_at":      "2026-06-11T10:00:00Z"
    +}
    +
    +
    POST @@ -191,12 +434,19 @@

    Responses

    Create a streaming response
    -

    Sends a message and streams back the agent's response as server-sent events.

    +

    Body

    + + + + + + +
    conversation_idstringrequiredID of the conversation to append the response to.
    inputstringrequiredUser message text.
    streambooleanoptionalDefault true. Return server-sent events. Set to false for a single JSON response.
    modelstringoptionalOverride the agent model for this turn. Defaults to the project setting.
    skill_idsstring[]optionalSkill IDs to activate for this turn.
    curl
    curl -X POST http://localhost:26866/api/v1/responses \
       -H "Content-Type: application/json" \
    -  -d '{"conversation_id": "...", "input": "Summarise last week'\''s sales data"}'
    + -d '{"conversation_id":"conv_xyz","input":"Summarise last week'\''s sales data","stream":true}'
    @@ -207,13 +457,25 @@

    Responses

    /responses/in-flight-list List active streams
    +
    +

    Query parameters

    + + +
    conversation_idstringoptionalFilter to a specific conversation.
    +
    GET /responses/in-flight - Check a specific stream + Check a specific in-flight stream +
    +
    +

    Query parameters

    + + +
    conversation_idstringrequiredConversation whose active stream to retrieve.
    @@ -221,7 +483,21 @@

    Responses

    Conversations

    -

    Manage conversation threads. Each conversation holds an ordered list of messages.

    +

    Manage conversation threads. Each conversation holds an ordered list of messages. Conversations and Tasks are the same concept — every task is a conversation with a goal and an assigned agent. The API uses both terms interchangeably.

    + +

    Conversation object

    +
    +
    json
    +
    {
    +  "id":           "conv_abc123",
    +  "project_id":   "proj_xyz",           // null if not project-scoped
    +  "title":        "Q2 analysis",
    +  "goal":         "Analyse Q2 revenue by region",  // task prompt, optional
    +  "status":       "active",             // "active" | "archived"
    +  "created_at":   "2026-06-11T10:00:00Z",
    +  "updated_at":   "2026-06-11T10:04:12Z"
    +}
    +
    @@ -229,7 +505,17 @@

    Conversations

    /conversations List conversations
    +
    +

    Query parameters

    + + + + + +
    project_idstringoptionalFilter to a specific project.
    statusstringoptionalactive or archived. Returns all if omitted.
    limitintegeroptionalMax results to return. Default 50, max 200.
    offsetintegeroptionalPagination offset. Default 0.
    +
    +
    POST @@ -237,40 +523,72 @@

    Conversations

    Create a conversation
    +

    Body

    + + + + +
    project_idstringoptionalAttach to a project.
    titlestringoptionalHuman-readable name. Auto-generated from the first message if omitted.
    goalstringoptionalTask prompt or goal that frames the conversation for the agent.
    curl
    curl -X POST http://localhost:26866/api/v1/conversations \
       -H "Content-Type: application/json" \
    -  -d '{"project_id": "...", "title": "Q2 analysis"}'
    + -d '{"project_id":"proj_xyz","title":"Q2 analysis","goal":"Analyse Q2 revenue by region"}'
    +
    GET /conversations/{id} Get a conversation
    +
    +

    Path parameters

    + + +
    idstringrequiredConversation ID.
    +
    +
    PATCH /conversations/{id} - Update title or metadata + Update title, goal, or status +
    +
    +

    Body

    + + + + +
    titlestringoptionalNew title.
    goalstringoptionalUpdated task goal.
    statusstringoptionalactive or archived.
    +
    GET /conversations/{id}/items Get messages in a conversation
    +
    +

    Returns an ordered array of message items. Each item has role (user or assistant), content, and created_at.

    +

    Query parameters

    + + + +
    limitintegeroptionalDefault 100.
    beforestringoptionalReturn items before this item ID (cursor pagination).
    +
    +
    DELETE /conversations/{id} - Delete a conversation + Delete a conversation and all its messages
    @@ -280,13 +598,35 @@

    Conversations

    Projects

    Projects are workspaces that group conversations, files, and artifacts.

    +

    Project object

    +
    +
    json
    +
    {
    +  "id":             "proj_abc123",
    +  "name":           "Sales Automation",
    +  "description":    "Weekly reporting flows",
    +  "connector_ids":  ["conn_001", "conn_002"],
    +  "skill_ids":      ["skill_abc"],
    +  "created_at":     "2026-06-11T10:00:00Z",
    +  "updated_at":     "2026-06-11T10:00:00Z"
    +}
    +
    +
    GET /projects List all projects
    +
    +

    Query parameters

    + + + +
    limitintegeroptionalDefault 50.
    offsetintegeroptionalDefault 0.
    +
    +
    POST @@ -294,26 +634,44 @@

    Projects

    Create a project
    +

    Body

    + + + + + +
    namestringrequiredDisplay name for the project.
    descriptionstringoptionalShort description shown in the UI.
    connector_idsstring[]optionalData source connections available within this project.
    skill_idsstring[]optionalGlobal skills to activate for all conversations in this project.
    curl
    curl -X POST http://localhost:26866/api/v1/projects \
       -H "Content-Type: application/json" \
    -  -d '{"name": "Sales Automation", "description": "Weekly reporting flows"}'
    + -d '{"name":"Sales Automation","description":"Weekly reporting flows","connector_ids":["conn_001"]}'
    +
    PATCH /projects/{id} Update a project
    +
    +

    Body

    + + + + + +
    namestringoptional
    descriptionstringoptional
    connector_idsstring[]optionalReplaces the current list.
    skill_idsstring[]optionalReplaces the current list.
    +
    +
    DELETE /projects/{id} - Delete a project + Delete a project and all its contents
    @@ -321,34 +679,79 @@

    Projects

    Artifacts

    -

    Artifacts are the outputs the agent creates — apps, reports, dashboards, documents. Each artifact belongs to a project.

    +

    Artifacts are mini apps — web apps, dashboards, reports, and documents generated by the agent and hosted within a project. Each artifact belongs to a project.

    + +

    Artifact object

    +
    +
    json
    +
    {
    +  "id":          "art_abc123",
    +  "project_id":  "proj_xyz",
    +  "title":       "Sales Dashboard",
    +  "type":        "app",      // "app" | "report" | "doc" | "dashboard"
    +  "path":        "sales_dashboard/index.html",  // relative path within project
    +  "created_at":  "2026-06-11T10:00:00Z",
    +  "updated_at":  "2026-06-11T10:00:00Z"
    +}
    +
    GET /artifacts - List artifacts (optionally filter by project) + List artifacts +
    +
    +

    Query parameters

    + + + + +
    project_idstringoptionalFilter to a project.
    typestringoptionalapp, report, doc, or dashboard.
    limitintegeroptionalDefault 50.
    +
    GET /artifacts/preview Preview an artifact by path
    +
    +

    Query parameters

    + + + +
    pathstringrequiredRelative artifact path, e.g. sales_dashboard/index.html.
    project_idstringrequiredProject that owns the artifact.
    +
    +
    POST /artifacts/open Open an artifact in the desktop shell
    +
    +

    Body

    + + +
    artifact_idstringrequiredArtifact to open in the Electron window.
    +
    +
    GET - /artifacts/serve/{project}/{path} - Serve an artifact file + /artifacts/serve/{project_id}/{path} + Serve a raw artifact file +
    +
    +

    Path parameters

    + + + +
    project_idstringrequiredProject ID.
    pathstringrequiredFile path within the artifact, e.g. index.html or assets/chart.js.
    @@ -358,13 +761,38 @@

    Artifacts

    Schedules

    Run tasks on a cron schedule. Schedules belong to a project and trigger a conversation or workflow automatically.

    +

    Schedule object

    +
    +
    json
    +
    {
    +  "id":              "sched_abc123",
    +  "project_id":      "proj_xyz",
    +  "cron":            "0 9 * * 1",       // standard 5-field cron expression
    +  "timezone":        "America/New_York",
    +  "prompt":          "Generate weekly sales digest",
    +  "conversation_id": null,             // null = create new conversation each run
    +  "status":          "active",         // "active" | "paused"
    +  "last_run_at":     "2026-06-09T09:00:00Z",
    +  "next_run_at":     "2026-06-16T09:00:00Z",
    +  "created_at":      "2026-06-01T00:00:00Z"
    +}
    +
    +
    GET /schedules List schedules
    +
    +

    Query parameters

    + + + +
    project_idstringoptionalFilter to a project.
    statusstringoptionalactive or paused.
    +
    +
    POST @@ -372,28 +800,48 @@

    Schedules

    Create a schedule
    +

    Body

    + + + + + + +
    project_idstringrequiredProject this schedule belongs to.
    cronstringrequiredStandard 5-field cron expression, e.g. "0 9 * * 1" = every Monday at 09:00.
    promptstringrequiredTask the agent runs at each scheduled time.
    timezonestringoptionalIANA timezone. Default UTC.
    conversation_idstringoptionalAppend each run to an existing conversation. If omitted, a new conversation is created per run.
    curl
    curl -X POST http://localhost:26866/api/v1/schedules \
       -H "Content-Type: application/json" \
    -  -d '{"project_id": "...", "cron": "0 9 * * 1", "prompt": "Generate weekly sales digest"}'
    + -d '{"project_id":"proj_xyz","cron":"0 9 * * 1","prompt":"Generate weekly sales digest","timezone":"America/New_York"}'
    +
    PATCH /schedules/{id} Update a schedule
    +
    +

    Body

    + + + + + +
    cronstringoptionalNew cron expression.
    promptstringoptionalUpdated task prompt.
    timezonestringoptionalNew timezone.
    statusstringoptionalactive or paused.
    +
    +
    POST - /schedules/{id}/pause - Pause a schedule + /schedules/{id}/run + Trigger a schedule immediately
    +
    DELETE @@ -406,22 +854,60 @@

    Schedules

    Files

    -

    Upload and manage files that the agent can read, search, and reference during conversations.

    +

    Upload and manage files that the agent can read, search, and reference. Files can be attached to a project or to individual conversations.

    + +

    File object

    +
    +
    json
    +
    {
    +  "id":              "file_abc123",
    +  "name":            "Q2-report.pdf",
    +  "mime_type":       "application/pdf",
    +  "size":            204800,           // bytes
    +  "project_id":      "proj_xyz",       // null if conversation-scoped only
    +  "conversation_id": null,             // null if project-scoped only
    +  "created_at":      "2026-06-11T10:00:00Z"
    +}
    +
    GET /files - List uploaded files + List files +
    +
    +

    Query parameters

    + + + +
    project_idstringoptionalFilter to a project.
    conversation_idstringoptionalFilter to a conversation.
    +
    POST /files Upload a file
    +
    +

    Multipart form-data upload.

    +

    Form fields

    + + + + +
    filefilerequiredThe file binary. Accepted: PDF, DOCX, XLSX, CSV, TXT, PNG, JPG, and more.
    project_idstringoptionalAttach to a project.
    conversation_idstringoptionalAttach to a conversation. Can be set alongside project_id.
    +
    +
    curl
    +
    curl -X POST http://localhost:26866/api/v1/files \
    +  -F "file=@Q2-report.pdf" \
    +  -F "project_id=proj_xyz"
    +
    +
    +
    DELETE @@ -434,7 +920,38 @@

    Files

    Connectors

    -

    Integrate external data sources. Connectors are defined by specs and instantiated as connections with encrypted credentials.

    +

    Integrate external data sources. Connectors exist independently of any project but can be referenced inside any project. They are defined by specs (the connector type, e.g. PostgreSQL, Snowflake, Google Sheets) and instantiated as connections with encrypted credentials. Credentials are write-only — never returned after creation.

    + +

    ConnectorSpec object

    +
    +
    json
    +
    {
    +  "id":           "postgres",
    +  "name":         "PostgreSQL",
    +  "description":  "Connect to any PostgreSQL-compatible database.",
    +  "auth_type":    "credentials",  // "credentials" | "oauth2"
    +  "fields": [                       // credential fields required at connection time
    +    { "key": "host",     "label": "Host",     "secret": false },
    +    { "key": "port",     "label": "Port",     "secret": false },
    +    { "key": "database", "label": "Database", "secret": false },
    +    { "key": "user",     "label": "User",     "secret": false },
    +    { "key": "password", "label": "Password", "secret": true  }
    +  ]
    +}
    +
    + +

    Connection object

    +
    +
    json
    +
    {
    +  "id":         "conn_abc123",
    +  "spec_id":    "postgres",       // which ConnectorSpec this uses
    +  "name":       "prod-db",
    +  "status":     "connected",      // "connected" | "error" | "pending"
    +  "created_at": "2026-06-11T10:00:00Z"
    +  // credentials are never returned
    +}
    +
    @@ -442,34 +959,439 @@

    Connectors

    /connectors/specs List available connector specs
    +
    +
    +
    curl
    +
    curl "http://localhost:26866/api/v1/connectors/specs"
    +
    +
    +
    GET /connectors/connections List active connections
    +
    +

    Query parameters

    + + +
    spec_idstringoptionalFilter by connector type (e.g. postgres).
    +
    +
    POST /connectors/connections Create a connection
    +
    +

    Body

    + + + + +
    spec_idstringrequiredThe connector spec to use (e.g. "postgres").
    namestringrequiredHuman-readable label for this connection.
    credentialsobjectrequiredKey-value map of credential fields defined by the spec. Secret fields are encrypted at rest and never returned.
    +
    +
    curl
    +
    curl -X POST "http://localhost:26866/api/v1/connectors/connections" \
    +  -H "Content-Type: application/json" \
    +  -d '{
    +    "spec_id": "postgres",
    +    "name": "prod-db",
    +    "credentials": {
    +      "host": "db.example.com",
    +      "port": 5432,
    +      "database": "analytics",
    +      "user": "reader",
    +      "password": "s3cr3t"
    +    }
    +  }'
    +
    +
    +
    + +
    +
    + DELETE + /connectors/connections/{id} + Remove a connection +
    +
    GET /connectors/oauth/{spec}/start - Start OAuth flow for a connector + Start OAuth 2.0 flow +
    +
    +

    Returns a redirect URL. Send the user's browser there; after authorization the platform receives the callback and stores the token automatically.

    +

    Path parameter

    + + +
    specstringrequiredThe connector spec ID (e.g. google-sheets, notion).
    +
    +
    +
    + + +
    +

    Memories

    +

    Persistent facts and context the agent retains across conversations. Memories can be global (shared across all projects and conversations) or project-scoped — omit project_id to create a global memory. The agent automatically surfaces relevant memories as context at the start of each conversation.

    + +

    Memory object

    +
    +
    json
    +
    {
    +  "id":           "mem_abc123",
    +  "content":      "Prefers executive summaries under 200 words.",
    +  "project_id":   null,            // null = global; string = project-scoped
    +  "source":       "user",          // "user" | "agent" — who created it
    +  "created_at":   "2026-06-11T10:00:00Z",
    +  "updated_at":   "2026-06-11T10:00:00Z"
    +}
    +
    + +
    +
    + GET + /memories + List memories +
    +
    +

    Query parameters

    + + + +
    project_idstringoptionalReturn memories scoped to this project. Omit to return global memories.
    sourcestringoptionalFilter by who created it: user or agent.
    +
    +
    curl
    +
    curl "http://localhost:26866/api/v1/memories"               # global
    +curl "http://localhost:26866/api/v1/memories?project_id=..."  # project-scoped
    +
    +
    +
    + +
    +
    + POST + /memories + Create a memory +
    +
    +

    Body

    + + + +
    contentstringrequiredThe fact or preference to remember. Plain text.
    project_idstringoptionalScope to a project. Omit for a global memory.
    +
    +
    curl
    +
    curl -X POST "http://localhost:26866/api/v1/memories" \
    +  -H "Content-Type: application/json" \
    +  -d '{"content": "Always use Q3 targets as the baseline.", "project_id": "proj_xyz"}'
    +
    +
    +
    + +
    +
    + PATCH + /memories/{id} + Update a memory +
    +
    +

    Body

    + + +
    contentstringoptionalUpdated text for the memory.
    +
    +
    + +
    +
    + DELETE + /memories/{id} + Delete a memory +
    +
    +
    + +
    +

    Skills

    +

    Reusable capabilities available globally across all projects — custom instructions, tools, or prompt templates the agent can invoke. Skills extend what the agent knows how to do without re-explaining it each time. Like Connectors, they exist independently of any single project.

    + +

    Skill object

    +
    +
    json
    +
    {
    +  "id":            "skill_abc123",
    +  "name":          "weekly-report",
    +  "description":   "Generates a weekly performance report from connected data sources.",
    +  "instructions":  "Always include a one-paragraph executive summary first. Use bullet points for metrics...",
    +  "tools": [        // external tool integrations this skill may invoke
    +    "sql_query",
    +    "send_email"
    +  ],
    +  "created_at":    "2026-06-11T10:00:00Z",
    +  "updated_at":    "2026-06-11T10:00:00Z"
    +}
    +
    + +
    +
    + GET + /skills + List all skills +
    +
    +
    +
    curl
    +
    curl "http://localhost:26866/api/v1/skills"
    +
    +
    +
    + +
    +
    + POST + /skills + Register a skill +
    +
    +

    Body

    + + + + + +
    namestringrequiredKebab-case identifier. Used to invoke the skill from a conversation.
    descriptionstringrequiredShort summary of what this skill does. Shown in the UI and used by the agent to decide whether to invoke it.
    instructionsstringoptionalDetailed prompt injected whenever this skill is active. Explains how to carry out the task, preferred format, constraints, etc.
    toolsstring[]optionalList of tool identifiers the agent may call when running this skill (e.g. "sql_query", "send_email").
    +
    +
    curl
    +
    curl -X POST "http://localhost:26866/api/v1/skills" \
    +  -H "Content-Type: application/json" \
    +  -d '{
    +    "name": "weekly-report",
    +    "description": "Generates a weekly performance report.",
    +    "instructions": "Always start with an executive summary. Limit to 3 charts.",
    +    "tools": ["sql_query", "send_email"]
    +  }'
    +
    +
    +
    + +
    +
    + PATCH + /skills/{id} + Update a skill +
    +
    +

    Body

    + + + + + +
    namestringoptionalNew identifier.
    descriptionstringoptionalUpdated summary.
    instructionsstringoptionalRevised prompt instructions.
    toolsstring[]optionalReplace the full list of allowed tools.
    +
    +
    + +
    +
    + DELETE + /skills/{id} + Delete a skill +
    +
    +
    + +
    +

    Scratchpads

    +

    Notebook-style workspaces scoped to a conversation. A scratchpad is made up of ordered cells — the agent writes to cells as it reasons, drafts, and executes code. Each cell has a type (markdown, code, or output) and tracks its own execution state. Scratchpads persist for the lifetime of the conversation and can be promoted to an Artifact.

    + +

    Scratchpad object

    +
    +
    json
    +
    {
    +  "id":              "sp_abc123",
    +  "conversation_id": "conv_xyz",
    +  "title":           "Sales analysis draft",
    +  "cells":           [ /* ordered array of Cell objects */ ],
    +  "saved":           false,     // true once promoted / pinned
    +  "created_at":      "2026-06-11T10:00:00Z",
    +  "updated_at":      "2026-06-11T10:04:12Z"
    +}
    +
    + +

    Cell object

    +
    +
    json
    +
    {
    +  "id":        "cell_001",
    +  "type":      "code",          // "markdown" | "code" | "output"
    +  "content":   "df.describe()",
    +  "language":  "python",        // present when type = "code"
    +  "status":    "success",       // "pending" | "running" | "success" | "error"
    +  "outputs":   [                 // present when type = "output"
    +    {
    +      "mime":    "text/plain",
    +      "data":    "count    12.0\nmean     4.2\n..."
    +    },
    +    {
    +      "mime":    "image/png",
    +      "data":    "data:image/png;base64,..."
    +    }
    +  ],
    +  "error":     null,            // error message when status = "error"
    +  "index":     0                 // display order within the scratchpad
    +}
    +
    +

    + typemarkdown cells are prose written by the agent; code cells are executable snippets; output cells are the results attached to the preceding code cell (stdout, images, tables).
    + status — only relevant on code cells. pending means queued, running means currently executing, success/error are terminal states.
    + outputs — multi-modal: a single code cell can produce several output objects with different MIME types (plain text, HTML, PNG charts, JSON). +

    + +
    +
    + GET + /scratchpads + List scratchpads for a conversation +
    +
    +
    +
    curl
    +
    curl "http://localhost:26866/api/v1/scratchpads?conversation_id=..."
    +
    +
    +
    + +
    +
    + POST + /scratchpads + Create a scratchpad +
    +
    +
    +
    curl
    +
    curl -X POST "http://localhost:26866/api/v1/scratchpads" \
    +  -H "Content-Type: application/json" \
    +  -d '{"conversation_id":"...","title":"Sales analysis draft","cells":[]}'
    +
    +
    +
    + +
    +
    + GET + /scratchpads/{scratchpad_id} + Get a scratchpad with all cells +
    +
    + +
    +
    + PATCH + /scratchpads/{scratchpad_id} + Update title or save state +
    +
    +
    +
    curl
    +
    curl -X PATCH "http://localhost:26866/api/v1/scratchpads/{scratchpad_id}" \
    +  -H "Content-Type: application/json" \
    +  -d '{"title":"Final analysis","saved":true}'
    +
    +
    +
    + +
    +
    + DELETE + /scratchpads/{scratchpad_id} + Delete a scratchpad and all its cells +
    +
    + +

    Cells

    +

    Cells are managed individually so the agent can append, edit, or re-run a single cell without replacing the whole scratchpad.

    + +
    +
    + POST + /scratchpads/{scratchpad_id}/cells + Append a cell +
    +
    +
    +
    curl
    +
    curl -X POST "http://localhost:26866/api/v1/scratchpads/{scratchpad_id}/cells" \
    +  -H "Content-Type: application/json" \
    +  -d '{"type":"code","language":"python","content":"df.head()"}'
    +
    +
    +
    + +
    +
    + PATCH + /scratchpads/{scratchpad_id}/cells/{cell_id} + Edit a cell's content or index +
    +
    +
    +
    curl
    +
    curl -X PATCH "http://localhost:26866/api/v1/scratchpads/{scratchpad_id}/cells/{cell_id}" \
    +  -H "Content-Type: application/json" \
    +  -d '{"content":"df.tail(10)","index":2}'
    +
    +
    +
    + +
    +
    + POST + /scratchpads/{scratchpad_id}/cells/{cell_id}/run + Execute a code cell +
    +
    +

    Runs the cell and streams output back as server-sent events. Each event carries a partial output object. Terminal event has status: "success" or status: "error".

    +
    +
    curl
    +
    curl -X POST "http://localhost:26866/api/v1/scratchpads/{scratchpad_id}/cells/{cell_id}/run"
    +
    +
    +
    + +
    +
    + DELETE + /scratchpads/{scratchpad_id}/cells/{cell_id} + Delete a cell
    - @@ -238,6 +309,7 @@

    Build and automate
    with Minds Cowork

    +
    Guide

    Get Started

    @@ -245,19 +317,21 @@

    Get Started

    Setup guide →
    -
    -
    Reference
    -

    API

    -

    REST endpoints for conversations, projects, artifacts, schedules, connectors, and more.

    - API reference → -
    -
    +
    Examples

    Use Cases

    See what creators, operators, and strategists are building with the platform.

    Explore examples →
    +
    + +
    +
    Reference
    +

    API

    +

    REST endpoints for conversations, projects, artifacts, schedules, connectors, and more.

    + API reference → +
    @@ -265,19 +339,28 @@

    Use Cases

    +
    frontend
    Electron + Vite desktop app. Also ships as a web SPA via make dev-web.
    -
    github.com/mindsdb/cowork
    +
    +
    backend / core_api
    FastAPI server. Conversations, projects, artifacts, schedules, connectors.
    -
    github.com/mindsdb/cowork-server
    +
    +
    backend / core_agent
    Anton — the autonomous coding and reasoning agent powering task execution.
    -
    github.com/mindsdb/anton
    + +
    +
    + +
    query engine optional
    +
    Embeddable query engine for conversational business intelligence across data sources.
    +
    @@ -286,5 +369,16 @@

    Use Cases

    Minds Platform · Open Source · github.com/mindsdb/minds-platform + diff --git a/docs/setup.html b/docs/setup.html index 34502a593ac..7c0f2a3a91f 100644 --- a/docs/setup.html +++ b/docs/setup.html @@ -73,6 +73,45 @@ background: var(--accent); box-shadow: 0 0 8px var(--accent-glow); } .nav-links { display: flex; gap: 24px; margin-left: auto; } + /* ── Mobile nav ── */ + .hamburger { + display: none; + flex-direction: column; justify-content: center; gap: 5px; + width: 36px; height: 36px; + background: none; border: none; cursor: pointer; + padding: 4px; margin-left: auto; flex-shrink: 0; + } + .hamburger span { + display: block; width: 20px; height: 1.5px; + background: var(--ink-3); border-radius: 2px; + transition: transform 200ms, opacity 200ms, width 200ms; + transform-origin: center; + } + nav[data-open] .hamburger span:nth-child(1) { transform: translateY(6.5px) rotate(45deg); } + nav[data-open] .hamburger span:nth-child(2) { opacity: 0; width: 0; } + nav[data-open] .hamburger span:nth-child(3) { transform: translateY(-6.5px) rotate(-45deg); } + @media (max-width: 640px) { + .hamburger { display: flex; } + .nav-links { + display: none; + position: absolute; top: 52px; left: 0; right: 0; + flex-direction: column; gap: 0; + background: rgba(8,13,24,0.97); + backdrop-filter: saturate(160%) blur(16px); + -webkit-backdrop-filter: saturate(160%) blur(16px); + border-bottom: 1px solid var(--line); + padding: 8px 0; + z-index: 39; + } + nav[data-open] .nav-links { display: flex; } + .nav-links a { + padding: 12px 24px; + font-size: 14px; + border-left: 2px solid transparent; + } + .nav-links a.active { border-color: var(--accent); background: var(--accent-bg); } + } + .nav-links a { font-size: 13px; color: var(--ink-3); transition: color 120ms; } .nav-links a:hover { color: var(--ink); opacity: 1; } .nav-links a.active { color: var(--accent); } @@ -83,6 +122,7 @@ padding: 64px 24px 120px; display: grid; gap: 0; grid-template-columns: 220px 1fr; + align-items: start; } @media (max-width: 768px) { .shell { grid-template-columns: 1fr; } } @@ -90,6 +130,8 @@ .sidebar { padding-right: 40px; padding-top: 4px; + position: sticky; + top: 72px; } @media (max-width: 768px) { .sidebar { display: none; } } .sidebar-label { @@ -107,6 +149,9 @@ } .sidebar li a:hover { color: var(--ink); opacity: 1; border-color: var(--line-2); } .sidebar li a.active { color: var(--accent); border-color: var(--accent); } + .sidebar .sub-group { list-style: none; } + .sidebar .sub-group ul { list-style: none; border-left: 1px solid var(--line); margin-left: 10px; padding-left: 0; display: flex; flex-direction: column; gap: 2px; margin-top: 2px; } + .sidebar .sub-group ul li a { font-size: 12.5px; color: var(--ink-4); padding-left: 14px; } /* ── Content ── */ .content { min-width: 0; } @@ -220,6 +265,45 @@ } .make-table tr:hover td { background: var(--surface-2); } + /* ── Download cards ── */ + .download-grid { + display: grid; gap: 12px; grid-template-columns: 1fr; + margin: 16px 0 0; + } + @media (min-width: 600px) { .download-grid { grid-template-columns: repeat(3, 1fr); } } + .download-card { + background: var(--surface); + border: 1px solid var(--line); + border-radius: var(--r-xl); + padding: 18px 20px; + display: flex; align-items: center; gap: 14px; + text-decoration: none; + transition: border-color 150ms, transform 150ms; + color: inherit; + } + .download-card:hover { + border-color: rgba(34,211,238,0.35); + transform: translateY(-2px); + opacity: 1; + } + .dl-icon { font-size: 22px; flex-shrink: 0; line-height: 1; } + .dl-body { flex: 1; } + .dl-name { font-size: 14px; font-weight: 600; color: var(--ink); margin-bottom: 3px; } + .dl-desc { font-size: 12.5px; color: var(--ink-3); line-height: 1.45; } + .dl-arrow { font-size: 16px; color: var(--accent); flex-shrink: 0; } + + /* ── Divider ── */ + .divider { + display: flex; align-items: center; gap: 16px; + margin: 40px 0 40px; + color: var(--ink-4); + font-family: var(--font-mono); font-size: 11px; + letter-spacing: 0.12em; text-transform: uppercase; + } + .divider::before, .divider::after { + content: ''; flex: 1; height: 1px; background: var(--line); + } + /* ── Note ── */ .note { background: var(--surface-2); @@ -247,10 +331,13 @@ +
    @@ -258,23 +345,88 @@
    Setup
    -

    Get running in minutes

    +

    Get Started

    - Minds Cowork ships as a desktop app (Electron) and a web app (Vite SPA + FastAPI). - Both modes share the same codebase — one repo, one setup step. + The simplest way to use Minds Cowork is the pre-built app — available on web and desktop.

    + +
    +

    Desktop or Web App

    +

    Pre-built, packaged and ready — no setup required.

    + +
    + +
    + +
    +

    Build From Source

    +

    Or build from source if you want to hack the code ;)

    +
    +

    01 Prerequisites

    @@ -391,5 +543,36 @@

    All make commands

    Minds Platform · Open Source · github.com/mindsdb/minds-platform + diff --git a/docs/use-cases.html b/docs/use-cases.html index 10faeb26337..001fd90fa83 100644 --- a/docs/use-cases.html +++ b/docs/use-cases.html @@ -43,6 +43,45 @@ .brand { font-family: var(--font-mono); font-size: 11px; font-weight: 600; letter-spacing: 0.18em; text-transform: uppercase; color: var(--ink-3); display: flex; align-items: center; gap: 8px; } .brand-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--accent); box-shadow: 0 0 8px var(--accent-glow); } .nav-links { display: flex; gap: 24px; margin-left: auto; } + /* ── Mobile nav ── */ + .hamburger { + display: none; + flex-direction: column; justify-content: center; gap: 5px; + width: 36px; height: 36px; + background: none; border: none; cursor: pointer; + padding: 4px; margin-left: auto; flex-shrink: 0; + } + .hamburger span { + display: block; width: 20px; height: 1.5px; + background: var(--ink-3); border-radius: 2px; + transition: transform 200ms, opacity 200ms, width 200ms; + transform-origin: center; + } + nav[data-open] .hamburger span:nth-child(1) { transform: translateY(6.5px) rotate(45deg); } + nav[data-open] .hamburger span:nth-child(2) { opacity: 0; width: 0; } + nav[data-open] .hamburger span:nth-child(3) { transform: translateY(-6.5px) rotate(-45deg); } + @media (max-width: 640px) { + .hamburger { display: flex; } + .nav-links { + display: none; + position: absolute; top: 52px; left: 0; right: 0; + flex-direction: column; gap: 0; + background: rgba(8,13,24,0.97); + backdrop-filter: saturate(160%) blur(16px); + -webkit-backdrop-filter: saturate(160%) blur(16px); + border-bottom: 1px solid var(--line); + padding: 8px 0; + z-index: 39; + } + nav[data-open] .nav-links { display: flex; } + .nav-links a { + padding: 12px 24px; + font-size: 14px; + border-left: 2px solid transparent; + } + .nav-links a.active { border-color: var(--accent); background: var(--accent-bg); } + } + .nav-links a { font-size: 13px; color: var(--ink-3); transition: color 120ms; } .nav-links a:hover { color: var(--ink); opacity: 1; } .nav-links a.active { color: var(--accent); } @@ -177,10 +216,13 @@ +
    @@ -333,5 +375,16 @@

    Ready to build?

    Minds Platform · Open Source · github.com/mindsdb/minds-platform +