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
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
- Renamed the "Subscription" connection type to "Claude Subscription" in Profile settings, to distinguish it from the new "ChatGPT Subscription" connection type
- Added support for signing in with a ChatGPT Plus/Pro/Team subscription as a new profile connection type, routing sessions through OpenAI's Codex backend instead of requiring an OpenAI API key; click "Copy sign in link" to copy the sign-in URL, open it in your own browser, then paste the resulting code back to complete sign-in — the plugin never opens a browser or waits on it automatically. Once signed in, "Model Aliases…" is available for this profile and fetches the live list of models available to your account instead of a fixed list; if the fetch fails, the upstream error is shown in the dialog's status line

# 1.2.28 (2026-07-15)

- Fixed a "Warning" dialog showing raw XML content sometimes appearing at IDE startup after using a diff view
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ NetBeans Claude Code GUI is a NetBeans IDE plugin that embeds the Claude Code CL
- **File attachments** — attach files via `@path` tokens with auto-completion popup, drag-and-drop, and clipboard paste support
- **Multiple profiles** — run Claude Code under separate accounts or API keys for different projects, each with an isolated config directory, authentication, proxy, and model settings
- **OpenAI-compatible proxy** — route Claude Code through any OpenAI-compatible provider (OpenAI, Azure OpenAI, Groq, DeepSeek, Ollama, LM Studio, and others) via a built-in translation proxy; no changes to Claude Code CLI required
- **ChatGPT subscription sign-in** — route Claude Code through OpenAI's Codex backend using your ChatGPT Plus/Pro/Team subscription instead of an API key; sign in via a copy-link/paste-code flow, then pick from your account's live model list
- **Session management** — start new sessions, continue the last session, or resume a specific past session; sessions persist across IDE restarts
- **Markdown Preview** — live-rendered markdown tab for plan files and MCP-initiated previews; includes a find bar (Ctrl+F) and font zoom (Alt+Scroll)
- **Auto Plan Preview** — when Claude writes a plan file, a live preview tab opens automatically as soon as you accept the diff
Expand Down
Binary file modified docs/screenshots/profiles-tab.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
36 changes: 32 additions & 4 deletions docs/user-manual.md
Original file line number Diff line number Diff line change
Expand Up @@ -485,16 +485,17 @@ Select the authentication type using the radio buttons:
| Type | Fields to fill in | How to authenticate |
|------|------------------|-------------------|
| **Claude Managed** | None | Claude manages authentication itself. Run `claude` in a terminal once to set it up, or Claude will prompt you on first launch. Use `/login` in the session terminal to re-authenticate. |
| **Subscription** | OAuth token | Obtain the token at [claude.ai](https://claude.ai) (requires Pro, Max, Team, or Enterprise subscription). **Note:** OAuth tokens expire periodically and must be regenerated and re-entered manually. For a smoother experience, prefer **Claude Managed** instead. |
| **Claude Subscription** | OAuth token | Obtain the token at [claude.ai](https://claude.ai) (requires Pro, Max, Team, or Enterprise subscription). **Note:** OAuth tokens expire periodically and must be regenerated and re-entered manually. For a smoother experience, prefer **Claude Managed** instead. |
| **Claude API** | API key | Obtain the key at [console.anthropic.com](https://console.anthropic.com) (requires an Anthropic Console account with API access). |
| **Claude-compatible API** | API key + Base URL | Use the API key and base URL provided by your third-party provider (Anthropic-compatible endpoint). |
| **OpenAI-compatible API** | API key + Base URL | Route Claude Code through any OpenAI-compatible provider. The plugin starts an internal proxy that translates Anthropic API calls to OpenAI Chat Completions format. See [OpenAI-compatible API](#openai-compatible-api) below. |
| **ChatGPT Subscription** | Sign in via browser | Route Claude Code through OpenAI's Codex backend using a ChatGPT Plus/Pro/Team subscription instead of an API key. See [ChatGPT Subscription](#chatgpt-subscription) below. |

> **Note:** Changes to connection parameters (API key, Base URL) take effect only after restarting the session.

### Model aliases (Claude-compatible API only)
### Model aliases (Claude-compatible API, OpenAI-compatible API, and ChatGPT Subscription)

If your provider names models differently from Anthropic's standard names, the plugin cannot match them to the `sonnet`, `opus`, and `haiku` aliases used by Claude Code. In that case, set the alias to the actual model ID used by your provider (for example, with an `anthropic/` prefix).
If your provider names models differently from Anthropic's standard names, the plugin cannot match them to the `sonnet`, `opus`, and `haiku` aliases used by Claude Code. In that case, set the alias to the actual model ID used by your provider (for example, with an `anthropic/` prefix). For **ChatGPT Subscription**, **Model Aliases…** becomes available once you're signed in and fetches the live list of models available to your account instead of a fixed list.

Click **Model Aliases…** to open the Model Aliases dialog.

Expand All @@ -512,7 +513,7 @@ The dialog shows a table with three columns:

| Button | Effect |
|--------|--------|
| **Fetch** | Queries the provider's models endpoint using the configured API key, fills the table with discovered model IDs, and marks each as available (✓) or unavailable (✗) |
| **Fetch** | Queries the provider's models endpoint (using the configured API key, or your signed-in ChatGPT session for **ChatGPT Subscription**), fills the table with discovered model IDs, and marks each as available (✓) or unavailable (✗) |
| **Add** | Opens an input dialog; enter a model ID to append a new row to the table (with blank alias and no availability mark) |
| **Rename** | Opens an input dialog pre-filled with the selected row's ID; confirm to update the model ID in place |
| **↑ / ↓** | Reorder rows — the order determines how models appear in the status bar model selector |
Expand Down Expand Up @@ -592,6 +593,33 @@ Without model aliases, Claude Code will send Anthropic model names (e.g. `claude
- Images in conversations (base64 content) are forwarded in OpenAI vision format; provider must support it.
- Changes to the profile's Base URL or API Key take effect only after restarting the session.

### ChatGPT Subscription

Routes Claude Code through OpenAI's own Codex backend using your ChatGPT Plus/Pro/Team subscription, instead of an OpenAI API key. Like **OpenAI-compatible API**, this works via the plugin's internal proxy — no changes to Claude Code CLI are required.

**How it works:**

The plugin never opens or waits on a browser itself, since the browser you sign in with may be on a different network path (proxy, VPN, remote machine) than the plugin. Instead:

1. Click **Copy sign in link** — the plugin generates a one-time sign-in link and copies it to the clipboard.
2. Paste the link into your own browser and sign in to your ChatGPT account there.
3. After signing in, copy the code shown on the confirmation page and paste it back into the field in the plugin.
4. Click **Complete Sign-in**. The profile now shows **Signed in as `<email>`**.

You can click **Copy sign in link** again at any time to cancel a stuck attempt and generate a fresh link — there is no timeout to wait out.

**Setup:**

1. Create a new profile and select **ChatGPT Subscription** as the connection type.
2. Sign in as described above.
3. Open **Model Aliases…** and click **Fetch** to pull the current list of models available to your account, then assign aliases the same way as for [OpenAI-compatible API](#model-aliases-claude-compatible-api-openai-compatible-api-and-chatgpt-subscription) above.

**Limitations:**

- Only models Codex actually supports for a ChatGPT-subscription login work — arbitrary model IDs will be rejected by OpenAI's backend.
- Usage is subject to your ChatGPT subscription's own rate limits, shared across all Codex/ChatGPT clients on that account.
- Sign-in tokens are refreshed automatically while a session is running; if a refresh fails (e.g. the session was revoked from your OpenAI account), sign in again from the Profiles tab.

### Extra environment variables

Arbitrary `KEY=VALUE` pairs injected into the Claude process environment. Applied last — they override all other profile variables. Use this for provider-specific configuration.
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<groupId>io.github.nbplugins</groupId>
<artifactId>netbeans-plugin-claude-code-gui</artifactId>
<version>1.3.0-SNAPSHOT</version>
<version>1.3.18-SNAPSHOT</version>
<packaging>nbm</packaging>
<name>Netbeans Plugin Claude Code GUI</name>
<description>NetBeans plugin that provides a GUI for Claude Code CLI — run claude code sessions directly inside the IDE.</description>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,14 @@ public void registerOpenAIProxy(String uuid, String baseUrl, String apiKey,
}
}

@Override
public void registerChatgptSubscriptionProxy(String uuid, String profileId, String accessToken,
String accountId, io.github.nbplugins.claudecodegui.settings.ProxyConfiguration proxy) {
if (mcpServer != null) {
mcpServer.registerChatgptSubscriptionProxy(uuid, profileId, accessToken, accountId, proxy);
}
}

@Override
public void deregisterOpenAIProxy(String uuid) {
if (mcpServer != null) {
Expand Down
Loading
Loading