Set up Jz Desk
Jz Desk ships without a model account of its own; it uses yours, and talks to OpenAI directly. The quickest way is to sign in with ChatGPT — three steps, no keys, no files to edit.
- Step 1
Download and install
Get the build for your computer from the download page. Everything is inside the app, so there is nothing else to install.
macOS — Open the .dmg, drag Jz Desk into Applications, then open it from Applications.
Windows — Run the installer. It is not code-signed yet, so Windows may say it protected your PC: click More info, then Run anyway. Open Jz Desk from the Start menu when it finishes.
- Step 2
Sign in with ChatGPT
On first launch, Jz Desk asks you to connect an account. Click “Login with your ChatGPT account”: your browser opens OpenAI’s sign-in page, and once you have signed in there, Jz Desk finishes signing in by itself. Usage counts against your ChatGPT plan; there is no API key to create.
- Step 3
Pick a folder and ask
Choose a folder for Jz Desk to work in and give it something to do — a question about what is there is enough. A reply means you are set up.
Use an API key instead
The app’s sign-in screen only offers ChatGPT. To use an OpenAI API key instead, save it to a file once, and Jz Desk skips the sign-in screen from then on. Do this when:
- you go through a relay or proxy that hands out its own key and address, rather than reaching OpenAI directly;
- your network cannot reach OpenAI’s sign-in page;
- you would rather pay per token on an API account than use a ChatGPT plan.
- Step 1
Open Jz Desk once, then quit
Install it as above and open it. When the sign-in screen appears, quit: ⌘Q on macOS; on Windows, right-click the Jz Desk icon in the notification area of the taskbar and choose Quit — closing the window only hides it. That first launch creates the settings folder the next steps write to.
- Step 2
Save your key
Run this with your own key in place of sk-your-key. It replaces the whole sign-in file, ChatGPT sign-in included — use the command rather than adding the key to the file by hand, or Jz Desk keeps using the old ChatGPT sign-in. If it says there is no such folder, your settings date from before the folder was renamed: write .jz-code where the command says .jz-desk, here and in the next step.
macOS — in Terminal:
echo '{"auth_mode": "apikey", "OPENAI_API_KEY": "sk-your-key"}' > ~/.jz-desk/auth.json && chmod 600 ~/.jz-desk/auth.jsonWindows — in PowerShell:
Set-Content -Encoding ascii "$HOME\.jz-desk\auth.json" '{"auth_mode": "apikey", "OPENAI_API_KEY": "sk-your-key"}' - Step 3
Using a relay or proxy? Point Jz Desk at it
Skip this step if your key is an OpenAI key used directly. Otherwise, open the config file. Change the model_provider line at the top to the first excerpt below, and add the second excerpt at the very end of the file, with your relay’s address in base_url. If the file has an openai_base_url line, delete it.
macOS — opens it in TextEdit:
open -e ~/.jz-desk/config.tomlWindows — opens it in Notepad:
notepad "$HOME\.jz-desk\config.toml"model_provider = "relay"
[model_providers.relay] name = "Relay" base_url = "https://your-relay.example.com/v1" wire_api = "responses" requires_openai_auth = true
- Step 4
Open Jz Desk again
It finds the key and goes straight in. Pick a folder and ask something to check it works.
The relay’s address usually ends in /v1, and it must speak the OpenAI Responses API — a relay that only offers chat completions will not work. Use the block above rather than openai_base_url: with openai_base_url, Jz Desk talks to the relay over WebSockets, which many relays accept and then never answer, so every message waits forever.
Switching between ChatGPT and a key
- From ChatGPT to a key: steps 2 to 4 above. There is no need to reinstall.
- From a key back to ChatGPT: quit Jz Desk, delete auth.json, and if you added a relay, set model_provider back to "openai". If the file has a model line, delete it too — the newest models offered to API keys are refused under ChatGPT sign-in. Open Jz Desk and it asks you to sign in again.
- Uninstalling Jz Desk keeps your settings folder, so a reinstall picks up the sign-in and settings you had.
Everything lives in one folder: ~/.jz-desk on macOS, %USERPROFILE%\.jz-desk on Windows. auth.json holds the sign-in, config.toml the settings. A computer that had Jz Desk before the folder was renamed keeps the old one, .jz-code, and Jz Desk goes on using it.
Choosing a model
Pick the model in the app’s model picker; each way of signing in starts on its own default. Signed in with ChatGPT, you get the models OpenAI offers your account in Jz Desk; which ones depends on your ChatGPT plan, and may include only some of the GPT-6 family. With a key, you get the GPT-6 family, starting with GPT-6.1-Sol, and any other model your key or relay serves works by name. Smaller or older models will struggle with longer, multi-step tasks.
Choosing which models the picker lists
Signed in with ChatGPT, the picker shows the models OpenAI offers your account. With a key, it shows the GPT models Jz Desk ships with. To list your own — say, exactly what your relay serves — save a model list like this one as a JSON file. It replaces the whole list, under either sign-in, so include every model you want: slug is the model id your account or relay serves, visibility "list" puts it in the picker, and base_instructions is the standing instruction the model works under.
{
"models": [
{
"slug": "gpt-6.1-sol",
"display_name": "GPT-6.1-Sol",
"description": "Through our relay",
"base_instructions": "You are Jz Desk, an AI assistant working on the user's computer. Be precise and concise.",
"visibility": "list",
"priority": 1,
"supported_in_api": true,
"shell_type": "unified_exec",
"default_reasoning_level": "medium",
"supported_reasoning_levels": [
{ "effort": "low", "description": "Faster" },
{ "effort": "medium", "description": "Balanced" },
{ "effort": "high", "description": "Deeper" }
],
"support_verbosity": true,
"truncation_policy": { "mode": "tokens", "limit": 10000 },
"context_window": 272000,
"experimental_supported_tools": []
}
]
} Then point model_catalog_json in config.toml at the file’s full path — a file on your computer, not a URL — and reopen Jz Desk. Put the line near the top, before any [section]. On Windows, keep the single quotes so the backslashes are read as-is:
model_catalog_json = "/Users/you/.jz-desk/models.json" model_catalog_json = 'C:\Users\you\.jz-desk\models.json'
If it does not work
- The browser sign-in never finishes
- Leave the browser tab open until Jz Desk shows you are signed in — the last step hands the sign-in back to the app on your computer. If OpenAI’s page will not load at all, your network cannot reach it; use an API key through a relay instead (above).
- It waits and never replies
- With a relay, the usual cause is openai_base_url: Jz Desk then tries WebSockets, which many relays accept and never answer. Set the relay up with the block in step 3 instead. Otherwise the address is unreachable — check it, or check your network can reach OpenAI. A config.toml left by an older install is never overwritten, so it may still carry an old setting.
- Model is not supported
- The model is not one your account serves. Under ChatGPT sign-in, pick one from the model picker, or delete the model line from config.toml; with a key, use a model id your key or relay serves. Start a new chat afterwards — an existing one keeps the model it was created with.
- 401 or 403
- With a key: it is mistyped, expired, or the account has no billing set up — save it again with the step 2 command. If the key is right and the error still says invalid, auth.json is still in ChatGPT mode, which happens when the key was added to the file by hand; run the step 2 command. With ChatGPT: the sign-in has lapsed; delete auth.json and open Jz Desk to sign in again.
- The key command fails on Windows
- Run it in PowerShell, not Command Prompt, and after opening Jz Desk once — the folder it writes to does not exist before that.