Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions .github/workflows/docs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# Builds the MkDocs user-documentation site and deploys it to GitHub Pages.
#
# Trigger is manual (workflow_dispatch) so nothing publishes before the first
# public release. The build job runs anywhere as a validity check; the deploy
# job runs only on the public mirror, so the internal repo never serves Pages.
# Enable Pages (Settings > Pages > Source: GitHub Actions) on the public repo,
# then run this workflow from the Actions tab.
name: Docs site

on:
workflow_dispatch:

permissions:
contents: read
pages: write
id-token: write

concurrency:
group: pages
cancel-in-progress: false

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- run: pip install "mkdocs-material>=9.5,<10"
- run: mkdocs build --strict
- uses: actions/upload-pages-artifact@v3
with:
path: site

deploy:
# Publish only from the public mirror. The internal repo never serves Pages.
if: github.repository == 'paramount-engineering/rokdock'
needs: build
runs-on: ubuntu-latest
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- id: deployment
uses: actions/deploy-pages@v4
1 change: 1 addition & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
name: Release
run-name: Release ${{ github.ref_name }}

# Builds RokDock installers for every desktop platform on native GitHub runners
# and attaches them, plus the electron-updater manifests (latest-mac.yml,
Expand Down
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ resources/icons/icon-*.png
docs/superpowers/
docs/BACKLOG.md
docs/adding-a-tool-window.md
docs/release-to-public.md
.claude/
openspec/
tasks/
Expand All @@ -74,4 +75,6 @@ keys/
*.key
*.cer
*.mobileprovision
demo-video/

# MkDocs build output
/site/
42 changes: 29 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
<img alt="Claude" src="https://img.shields.io/badge/Claude-D97757?logo=anthropic&logoColor=white" />
<img alt="Gemini" src="https://img.shields.io/badge/Gemini-8E75B2?logo=googlegemini&logoColor=white" />
<img alt="OpenAI" src="https://img.shields.io/badge/OpenAI-412991?logo=openai&logoColor=white" />
<img alt="Codex" src="https://img.shields.io/badge/Codex-1A1A1A?logo=openai&logoColor=white" />
<img alt="GitHub Copilot" src="https://img.shields.io/badge/Copilot-000000?logo=githubcopilot&logoColor=white" />
<img alt="Ollama" src="https://img.shields.io/badge/Ollama-000000?logo=ollama&logoColor=white" />
</p>
<p align="center">
Expand All @@ -42,7 +44,7 @@ It is for Roku channel developers who are tired of juggling a telnet client, the
RokDock is one tool for all of it.

<p align="center">
<img src="docs/user/images/workspace-overview.webp" alt="The RokDock workspace: the device panel, AI Chat panel, and HDMI capture preview on the left, a BrightScript debug terminal in the center, and the Remote / Scripts / Deeplinks rail on the right" width="860" />
<img src="docs/user/images/dock-hero.png" alt="The RokDock workspace: the device panel, roBot panel, and HDMI capture preview on the left, a BrightScript debug terminal in the center, and the Remote / Scripts / Deeplinks rail on the right" width="860" />
</p>

## Features
Expand Down Expand Up @@ -81,7 +83,7 @@ RokDock is one tool for all of it.
- **Developer Docs** - an in-app browser for the official Roku documentation, with
full-text search, a What's New change feed, browser-style history, and an offline
cache.
- **AI Chat (Beta)** - an opt-in assistant with swappable providers (Anthropic,
- **roBot (Beta)** - an opt-in assistant with swappable providers (Anthropic,
Gemini, OpenAI-compatible, or a local CLI such as Claude, Copilot, Gemini, or
Codex) and per-prompt redaction of device IPs, names, and serials.

Expand Down Expand Up @@ -136,7 +138,7 @@ Full guides for every screen and feature live in [docs/user/](docs/user/):
- [9-Patch Editor](docs/user/ninepatch-editor.md) - stretchable image assets
- [SVG Converter](docs/user/svg-converter.md) - SVG to quantized PNG
- [Developer Docs](docs/user/developer-docs.md) - the in-app Roku documentation browser
- [AI Chat](docs/user/ai.md) - the AI assistant and provider configuration
- [roBot](docs/user/ai.md) - the AI assistant and provider configuration
- [Settings](docs/user/settings.md) - the full settings reference, tab by tab
- [Keyboard Shortcuts](docs/user/keyboard-shortcuts.md) - the shortcut reference
- [Themes](docs/user/themes.md) - app theme, syntax themes, and fonts
Expand Down Expand Up @@ -205,23 +207,37 @@ npm run dist:linux # Linux (AppImage + deb)

## Screenshots

A connected debug terminal at a BrightScript breakpoint, with tokenized output and
detected links.
The debug terminal, tokenized and themed, with a JSON payload detected and ready to
open in the editor.

![Debug terminal](docs/user/images/terminal-live.png)
![Debug terminal with a highlighted, clickable JSON payload](docs/user/images/terminal-json-highlighted.webp)

The in-app Developer Docs, with the official Roku documentation, search, and a
What's New feed.
The full on-screen remote, plus saved deeplink presets you can fire in a click.

![Developer Docs](docs/user/images/developer-docs.png)
<p align="center">
<img alt="The on-screen Roku remote" src="docs/user/images/control-remote.png" width="300" />
<img alt="Saved deeplink presets" src="docs/user/images/control-deeplinks.png" width="480" />
</p>

Built-in tools: a JSON viewer, a 9-Patch editor, and an SVG recolor/exporter.

<p align="center">
<img alt="9-Patch editor" src="docs/user/images/ninepatch-editor.png" width="430" />
<img alt="SVG converter with recoloring" src="docs/user/images/svg-converter-recolored.png" width="430" />
</p>

The in-app Developer Docs: the official Roku documentation with full-text search and
a What's New feed.

![In-app Developer Docs with search results](docs/user/images/docs-search.png)

The Screenshot Preview, comparing a device frame against a safe-zone overlay.
The Screenshot Viewer, comparing a captured device frame against a safe-zone overlay.

![Screenshot Preview](docs/user/images/screenshot-preview.png)
![Screenshot Viewer with a safe-zone overlay](docs/user/images/capture-viewer-safezone.webp)

The AI Chat panel, grounded in the Roku docs.
The roBot panel, grounded in the Roku docs.

![AI Chat](docs/user/images/ai-chat-panel.png)
![The roBot AI panel](docs/user/images/ai-chat-panel.png)

More figures are in the [user guide](docs/user/).

Expand Down
2 changes: 0 additions & 2 deletions SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,3 @@ Please do not report security vulnerabilities through public GitHub issues.
Use GitHub's private vulnerability reporting instead. Go to the [Security tab](https://github.com/paramount-engineering/rokdock/security) of the repository and select "Report a vulnerability" to open a private Security Advisory. This keeps the details confidential until a fix is available.

Include as much detail as you can: a description of the vulnerability, steps to reproduce, affected versions, and any relevant logs or screenshots. Maintainers will acknowledge the report and work with you on a fix and disclosure timeline.

If the repository owner wants to add a direct contact for security reports, that information can be added here.
91 changes: 59 additions & 32 deletions docs/user/ai.md
Original file line number Diff line number Diff line change
@@ -1,71 +1,98 @@
# AI Chat (Beta)
# AI Assistant for Roku Development (Gemini, Claude, Copilot, and Codex)

RokDock includes an opt-in AI assistant. It is a general-purpose, multi-turn chat that lives in the app alongside the terminal, devices, and tools, so it can answer questions in the context of your Roku development work. AI features are off until you configure a provider, and they are clearly labeled **Beta**.
RokDock includes an opt-in AI assistant named **roBot**. It is a general-purpose, multi-turn chat that lives in the app alongside the terminal, devices, and tools, so it can answer questions in the context of your Roku development work. AI features are off until you configure a provider, and they are clearly labeled **Beta**.

## Enabling AI

AI is disabled until you add at least one provider in **Settings > AI (Beta)**. Once a provider is configured, the AI Chat panel becomes available in the app and the "Explain this" action appears in the terminal.
AI is disabled until you both add (or auto-detect) a provider in **Settings > AI (Beta)** and set one as the **active** provider. roBot always uses the single active provider. The roBot panel and the terminal's "Ask roBot" action appear only once a provider is active. If none is active, neither is shown, even when providers are listed.

Setting the active provider differs by type:

- **HTTP providers** (Anthropic, Gemini, or OpenAI-compatible): adding your first one makes it active automatically.
- **CLI providers** (Claude Code, GitHub Copilot, Gemini CLI, Codex): these are auto-detected and appear in the list, but are never activated for you. You must click **Set active** on the one you want, even though it is already listed.

The active provider carries an **Active** badge in the provider list, and every other row shows a **Set active** button. If AI still seems unavailable after you have configured a provider, confirm that one is marked Active.

See [Settings > AI (Beta)](settings.md#ai-beta) for the full provider configuration reference, including the supported provider types, the redaction toggle, the Local flag, and Test Connection.

### Provider types

You can configure one or more providers and designate one as active:

- **Anthropic (Claude)**, **Gemini**, and **OpenAI-compatible** HTTP providers, each with a model name, an optional base URL, and an API key.
- **CLI providers** (Claude, Copilot, Gemini, Codex), which drive an AI command-line tool already installed on your machine. A CLI provider is keyless and runs locally.
- **HTTP providers** with a native adapter (Anthropic Claude, Google Gemini) or the **OpenAI-compatible** catch-all, each with a model name, an optional base URL, and an API key.
- **CLI providers** (Claude Code, GitHub Copilot, Gemini CLI, Codex), which drive an AI command-line tool already installed on your machine. A CLI provider is keyless and runs locally.

API keys are stored encrypted on your machine via the OS keychain and are never shown again after saving.

### Provider configuration reference
### Privacy and redaction

Each provider has a **Redact sensitive values** toggle, on by default. Redaction removes device IPs, names, and serial numbers from your prompt before it is sent. Mark a provider **Local** when it runs on your own machine (a localhost endpoint or a CLI tool). A local provider needs no key and nothing leaves the machine.

The fields you fill in depend on the provider type. The in-tab placeholders give a hint, and the values below are a fuller reference. Model names change over time, so treat the models as examples and use whatever your account or local install exposes. Confirm base URLs against your provider's own documentation.
If you turn redaction off on a remote provider, RokDock shows a warning and requires you to acknowledge that prompts will be sent unredacted before you can save. The **Test** button on each provider shows a "what was sent (redacted)" preview alongside the result, so you can confirm exactly what leaves your machine.

| Provider type | Base URL | Example model |
|---|---|---|
| Anthropic (Claude) | not needed (native) | `claude-opus-4-8` |
| Gemini | not needed (native) | `gemini-2.5-flash` |
| OpenAI (via OpenAI-compatible) | `https://api.openai.com/v1` | `gpt-4o` |
| OpenRouter (via OpenAI-compatible) | `https://openrouter.ai/api/v1` | a model id from OpenRouter's catalog |
| Gemini via its OpenAI-compatible endpoint | `https://generativelanguage.googleapis.com/v1beta/openai/` | `gemini-2.5-flash` |
| Azure OpenAI (via OpenAI-compatible) | `https://<resource>.openai.azure.com/...` (per your Azure deployment) | your deployment name |
| Ollama (local, via OpenAI-compatible) | `http://localhost:11434/v1` | `llama3.1` |
| LM Studio or another local server (via OpenAI-compatible) | the server's printed URL (often `http://localhost:1234/v1`) | the model the server reports |
## Connecting a provider

Notes:
These are task-shaped views of the provider system above. Model names change over time, so treat them as examples and use whatever your account or local install exposes. Confirm base URLs against your provider's own documentation.

- **Anthropic** and **Gemini** have native adapters: pick the type, enter a model and key, and leave Base URL blank.
- The **OpenAI-compatible** type is the catch-all for any OpenAI-style HTTP endpoint. Set its Base URL and model. Hosted services (OpenAI, OpenRouter, Azure) need a key. Local servers (Ollama, LM Studio) usually do not, so mark the profile **Local**.
- A **local** model (Ollama, LM Studio) reached over its HTTP endpoint is configured as an OpenAI-compatible provider marked Local. This is separate from a recognized **CLI** provider.
- **Recognized CLIs** (Claude Code, GitHub Copilot, Gemini CLI, Codex) are auto-detected when installed on your PATH and appear in the provider list with no setup. You only optionally set a model; RokDock builds the CLI invocation for you. Thin command wrappers like `ollama` or `llm` are not recognized as CLIs. Reach a local model through the OpenAI-compatible endpoint above instead.
### Google Gemini

### Privacy and redaction
RokDock supports Gemini three ways, so you can use whichever you already have:

Each provider has a **Redact sensitive values** toggle, on by default. Redaction removes device IPs, names, and serial numbers from your prompt before it is sent. Mark a provider **Local** when it runs on your own machine (a localhost endpoint or a CLI tool); a local provider needs no key and nothing leaves the machine.
- **Native Gemini adapter.** Add a provider of type Gemini, enter a model (for example `gemini-2.5-flash`) and your API key, and leave Base URL blank.
- **Gemini CLI.** If the Gemini command-line tool is on your PATH, RokDock auto-detects it and lists it with no setup. It runs locally and needs no key.
- **OpenAI-compatible endpoint.** Point an OpenAI-compatible provider at `https://generativelanguage.googleapis.com/v1beta/openai/` with your key and a Gemini model.

If you turn redaction off on a remote provider, RokDock shows a warning and requires you to acknowledge that prompts will be sent unredacted before you can save. The **Test** button on each provider shows a "what was sent (redacted)" preview alongside the result, so you can confirm exactly what leaves your machine.
### Anthropic Claude

- **Native Anthropic adapter.** Add a provider of type Anthropic (Claude), enter a model (for example `claude-opus-4-8`) and your key, and leave Base URL blank.
- **Claude Code CLI.** If Claude Code is on your PATH, it is auto-detected, runs locally, and needs no key.

### OpenAI and Codex

- **OpenAI (HTTP).** Add an OpenAI-compatible provider with Base URL `https://api.openai.com/v1`, your key, and a model such as `gpt-4o`.
- **Codex CLI.** If the Codex command-line tool is installed, RokDock auto-detects it and runs it locally against your account.

### GitHub Copilot

- **Copilot CLI.** If the GitHub Copilot command-line tool is on your PATH, it is auto-detected and keyless, and it uses your existing Copilot subscription.

### Other OpenAI-compatible services

The OpenAI-compatible type is the catch-all for any OpenAI-style HTTP endpoint. Set its Base URL and model, and add a key for hosted services:

- **OpenRouter.** Base URL `https://openrouter.ai/api/v1`, plus a model id from OpenRouter's catalog.
- **Azure OpenAI.** Base URL `https://<resource>.openai.azure.com/...` per your Azure deployment, with your deployment name as the model.

### Local models (Ollama, LM Studio)

Run a model entirely on your own machine and configure it as an OpenAI-compatible provider marked **Local** (no key, and nothing leaves the machine):

- **Ollama.** Base URL `http://localhost:11434/v1`, a model such as `llama3.1`.
- **LM Studio or another local server.** Use the URL the server prints (often `http://localhost:1234/v1`) and the model it reports.

Thin command wrappers like `ollama` or `llm` are not recognized as CLI providers. Reach a local model through the OpenAI-compatible endpoint above instead.

## The AI Chat Panel
## The roBot Panel

![The AI Chat (Beta) panel showing a question ("what is a SceneGraph roSGScreen?") and the assistant's answer, with Roku terms linkified into the docs, plus the move and new-chat controls and an "Ask anything..." input](images/ai-chat-panel.png)
*The AI Chat panel docked in the left column. Roku terms in the answer are linked into the in-app docs.*
![The roBot (Beta) panel: an assistant answer explaining a BrightScript node-field initialization warning, with Roku terms and a pkg: source path highlighted as links into the docs, plus the move, new-chat, and settings controls in the header and an "Ask roBot anything..." input](images/ai-chat-panel.png)
*The roBot panel docked in the left column. Roku terms in the answer are linked into the in-app docs.*

Once a provider is configured, the AI Chat (Beta) panel appears as a collapsible section in the app. Use its header to expand or collapse it.
Once a provider is active, the roBot (Beta) panel appears as a collapsible section in the app. Use its header to expand or collapse it. The gear in the panel header opens **Settings > AI (Beta)** so you can switch the active provider or adjust its settings.

- **Ask a question.** Type in the input box and press `Enter` to send (`Shift+Enter` inserts a newline). Replies stream in live.
- **Stop.** While a reply is streaming, a stop button cancels it.
- **New chat.** The new-chat button clears the conversation and starts fresh.
- **Move the panel.** The panel can be docked on the left, in the middle (as a drawer in the terminal area), or on the right. Use the move button in the panel header to cycle through the positions.
- **Used docs.** When the assistant draws on the Roku developer documentation, the reply shows a "Used docs" list. Click a source to open that page in [Developer Docs](developer-docs.md).

## Explain This (from the Terminal)
## Ask roBot (from the Terminal)

Select text in a terminal tab and choose **Explain this (Beta)** from the selection toolbar. The selected text is sent to the assistant, which opens the AI Chat panel with an explanation. This is handy for decoding a stack trace, an unfamiliar debugger message, or a chunk of BrightScript output.
Select text in a terminal tab and choose **Ask roBot (Beta)** from the selection toolbar. The selected text is sent to the assistant, which opens the roBot panel with an explanation. This is handy for decoding a stack trace, an unfamiliar debugger message, or a chunk of BrightScript output.

See [Terminal](terminal.md) for more on terminal selection and output.

## Related

- [Settings](settings.md#ai-beta) - configure AI providers, redaction, and Test Connection
- [Developer Docs](developer-docs.md) - the documentation the assistant can cite
- [Terminal](terminal.md) - the "Explain this" selection action
- [Terminal](terminal.md) - the "Ask roBot" selection action
Loading