# Why Nimbalyst?

Nimbalyst is an open-source visual workspace for Claude Code and Codex. Learn what it does, who it is for, and how to start working with AI agents.

[Nimbalyst](https://nimbalyst.com/) is the open-source visual workspace for building with Claude Code, Codex, and other coding agents. It runs on your Mac or Windows machine on top of the agents you already have installed, and it gives you visual editors, session management, and task tracking in one app. Use it when you want to direct and review agent work without bouncing between a terminal, an editor, a document app, and a task tracker.

[Download Nimbalyst](https://nimbalyst.com/download/) and open a project folder to get started. Your project files stay in your folders in open formats. Features such as AI requests, sharing, and sync use the services you configure; see [Privacy](/open-safe-private-secure/privacy). The full source is on GitHub at [github.com/nimbalyst](https://github.com/nimbalyst), where you can read the code, file issues, or contribute.

### One integrated, higher-bandwidth workflow

Building with agents is a whole workflow. It moves through plans, source files, mockups, diagrams, data, tasks, sessions, reviews, commits, and pull requests. Nimbalyst keeps that work together so people and agents can move through it as one connected process.

* **Integrated workflow:** Plan the work, run agents, edit the result, track status, review changes, and connect the commit without rebuilding context in another tool.
* **Integrated file types:** Work in purpose-built visual editors for markdown, code, mockups, diagrams, spreadsheets, data models, and more while the same agents stay in context.
* **Less context switching:** Stop bouncing among a terminal, editor, document app, diagram tool, and task tracker, or copying the same context into each one.
* **Higher bandwidth:** Visual interfaces expose more of the work at once, so people understand, direct, and review agent output faster than they can through a text-only workflow.

### Files Mode

Work with Claude Code and Codex in interactive, WYSIWYG markdown docs, Calc Sheets, mermaid diagrams, excalidraw drawings, html mockups, data models, CSV files, in-app browser previews, mind maps, sessions, and code.

Focus on one file:

* Edit the file in the center panel. See red/green diffs from your coding agent, review them, and accept them.
* Work with your agent in the right panel to edit this file, explore other files, or research the web.
* Navigate and manage your files in the left panel file manager.
* Span several folders and repositories in one project with [multi-folder projects](/file-management/multi-folder-projects). Attached folders appear in the explorer, in search, and to your agents, with git status, branches, and commits tracked per repository.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-26b772757b4b548a399f20e90fe64eb48c397cae%2FRed%20Green%20Diffs-1%20(1).gif?alt=media" alt="Files mode with a markdown plan open in the center, red/green diff changes with Keep and Undo controls, and the agent panel on the right"><figcaption><p>Files mode: a markdown plan with the agent's red/green changes ready to review, and the agent working in the right panel.</p></figcaption></figure>

### Agent Mode

* *Session management:* organize, find, and continue your AI conversations. Track the files changed by a session and step through and approve each one.
* *Coding support:* all the power of Claude Code and Codex plus file tracking, diff visualization, code editing, and / command support with GitHub status tracking.
* *Files where you want them:* choose whether Agent mode opens file tabs above the transcript or in the right pane. See [View Files in Agent Mode](/session-management/view-files-in-agent-mode).
* *Model choice:* choose an available model and reasoning level in the session composer. The options depend on the provider and your configuration.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-92abccde7e0857a13018dfea6ec9c7a6562aa96a%2FCoding%20with%20Nimbalyst%20(1).gif?alt=media" alt="Agent mode with the session list on the left, a transcript with red/green edit cards in the center, and the files the agent read and edited on the right"><figcaption><p>Agent mode: the session transcript with red/green edit cards, your sessions on the left, and the files the agent touched on the right.</p></figcaption></figure>

### Task Mode

*Status and item tracking:* you and your agents track and update status, bugs, to-dos, decisions, and ideas directly in markdown associated with the plan and the work.

*Radar:* shared trackers get a since-you-left digest of teammate activity, status moves, bulk sweeps, and stalled work, in the desktop app and the web console. See [Radar](/team-collaboration/trackers#radar-what-happened-since-you-left).

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FGffxCFwhIiqTkxXxChVb%2Fimage.png?alt=media&amp;token=906baed7-431c-4755-82bb-7fe1e2226732" alt="A tracker table with tabs for Plans, Decisions, Bugs, Tasks, Ideas, and more, listing task items with status and priority columns"><figcaption><p>Task mode: a tracker table with a tab per item type and status and priority on each item.</p></figcaption></figure>

### Team Collaboration

Every teammate runs the open-source Nimbalyst app on their own machine with the Codex, Claude Code, or other agents they use locally. After signing in to Nimbalyst Teams, they can promote local files into a shared team workspace and keep working with those agents.

People and their agents can edit shared files together in real time or contribute asynchronously. Shared Trackers work the same way: teammates and their agents update one team board from their own Nimbalyst installations. Only files and Tracker items explicitly shared with the team enter this collaboration flow; everything else stays outside the team workspace.

Shared team data flows through Nimbalyst's Cloudflare sync service. It is encrypted in transit and at rest and isolated per team.

See [Nimbalyst for Teams](https://nimbalyst.com/teams/) for what the shared workspace covers.

Ask questions of your team from inside a shared document: [decision blocks](/team-collaboration/decisions) collect answers next to the options, and [feedback requests](/team-collaboration/feedback-requests) let an agent gather private answers from teammates and resume once a human settles the outcome. Sent questions appear in Feedback with response progress and links back to each one.

Start with the [Team Collaboration Overview](/team-collaboration/overview), then [Set Up Nimbalyst Teams and Organizations](/team-collaboration/setup-teams-and-orgs).

### Project Graph

Look at the graph Nimbalyst builds underneath your project, connecting sessions, trackers, files, and commits. The Atlas, Pulse, and Evidence Trails views show what you worked on, what is connected to what, and the sources behind every link, with saved views and time-range comparison. See [Project Graph](/file-management/project-graph).

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-803658f33e9e58a969629536d30be3aa328e3cf8%2Frelease-project-graph.png?alt=media" alt="The Project Graph Atlas view showing project area tiles with activity bars, record counts, and a detail panel"><figcaption><p>Atlas draws each area of your project as a tile with its records, activity, and connections.</p></figcaption></figure>

### Open Approach

* Open source: the Nimbalyst app itself is open source at [github.com/nimbalyst](https://github.com/nimbalyst).
* Open storage of content and status in markdown, code, and html:
  * Future-proof: your files will be readable in any text editor, forever.
  * Portable: move between different markdown tools without conversion.
  * Version-control friendly: works with Git and other VCS.
  * LLM-friendly: work with Claude Code, Codex, and any AI.
* Open storage of workflow and config in coding agent skills and commands.
* Open storage of your files in your file tree or GitHub.

### Ways to Use Nimbalyst

1. As an AI-integrated, fast, local, WYSIWYG markdown editor
2. To mock up your UI in html, edit it with AI, and provide it as context to your coding agent
3. As a planning tool to create and manage features, plans, to-dos, and ideas
4. To code with Claude Code or Codex
5. As a manager of your coding agent sessions, integrating your plans with your agentic coding
6. To organize your work


# Nimbalyst Tutorial and Demo Videos

Three ways to learn Nimbalyst: watch a demo video, explore the sample tutorial workspace that ships with the app, or have an agent walk you through a 15-minute guided quickstart.

There are three ways to learn Nimbalyst, depending on how you like to learn. Watch a video to see what the app does. Open the tutorial workspace to click around in something already built. Run the guided quickstart when you want an agent to teach you by having you do your own work.

[Download Nimbalyst](https://nimbalyst.com/download/) first if you have not already.

## 1. Demo videos

Start with the overview, then pick the walkthrough that matches your job.

### 1-minute overview

The fastest look at what Nimbalyst is: agents, files, visual editors, and trackers in one workspace.

{% embed url="<https://stravu.wistia.com/medias/5js7e4kk39?embedType=web_component&seo=true&videoWidth=960>" %}

### For product managers: idea to tracked work

An onboarding revamp goes from an idea to an aligned team without anyone writing code. The agent researches the drop-off, drafts the PRD as a live document, and produces the user flow diagram and a clickable mockup beside it. One click turns the plan into tracked work on a shared board, and one more makes the document multiplayer so teammates comment in place. **1:26.**

{% embed url="<https://www.youtube.com/watch?v=jRFIVVJ3N6I>" %}

More in the [product manager playlist](https://www.youtube.com/playlist?list=PLGm3n1OZjA5WN0-JX2Ia9b1d55vU63xKM).

### For developers: research, plan, diff, review

A request for an API usage dashboard runs all the way to an approved pull request in one workspace. The first instruction is deliberately narrow, research and plan only, no code. The plan becomes an editable document with an architecture diagram and mockup inside it, every agent change shows as a diff you accept file by file, and the pull request gets reviewed in the same place. **1:13.**

{% embed url="<https://www.youtube.com/watch?v=5-5pfFnaOR4>" %}

More in the [developer playlist](https://www.youtube.com/playlist?list=PLGm3n1OZjA5XoEiKpcRp5f9M_HVySXDmg). The pull request review queue shown here needs Developer Mode turned on in settings.

### Longer walkthrough: product management use cases

A 15-minute tour through product management workflows end to end.

{% embed url="<https://stravu.wistia.com/medias/e7i2rwtl9e?embedType=web_component&seo=true&videoWidth=960>" %}

## 2. The tutorial workspace

The first time you open Nimbalyst, the welcome screen asks which mode you want and offers **Start tutorial**.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-df3d1caa4889afb6ccad4dd699fd1c3b7fc54413%2Fonboarding-welcome-start-tutorial.png?alt=media" alt="The Welcome to Nimbalyst screen with Standard Mode and Developer Mode cards, role and referral questions, an optional email field, and Get started and Start tutorial buttons"><figcaption><p>Choose Standard or Developer Mode, then take the tutorial workspace or go straight to your own project.</p></figcaption></figure>

* **Standard Mode** is a simplified interface focused on writing, editing, and AI assistance.
* **Developer Mode** adds git worktrees, terminal access, and the rest of the development environment. See [Turn on/off Developer Mode](/developer-features/turn-on-off-developer-mode); you can switch later.
* **Get started…** opens Nimbalyst against a folder you choose. **Start tutorial** creates the tutorial workspace instead.

**Start tutorial** builds a small connected project called **Nimbalyst Tutorial** in your Documents folder. Nothing is set up or configured. Everything in it is a real file you can edit, break, and throw away.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-3fc8b522a4af6d2701a6f5c666e919d2fd94e918%2Ftutorial-workspace.png?alt=media" alt="The Nimbalyst Tutorial workspace, with a README listing things to try, a file tree of planning and design files, a live mockup embedded in the document, and an agent session open on the right"><figcaption><p>The tutorial workspace is a real project. The dashboard in the README is a live embed of a mockup file, not a picture of one.</p></figcaption></figure>

The README lists things to try, and each one is a link into the workspace:

* Type in the document, and try `/`, `#`, and `@`.
* Ask the agent to add a summary at the top of the file, then review its red/green changes.
* Shape an interface in the dashboard mockup, then ask the agent to change it.
* Switch to Agents mode, look at past sessions, and click into the files they touched.
* Explore a revenue spreadsheet, change assumptions in a metrics model, and follow the work into an architecture diagram.
* Read a document with embedded project artifacts, turn a goal into steps with a launch checklist, and see a markdown document become a tracker item.

If you skipped it during onboarding, you can start it later from **Help > Launch Tutorial**, or from **Try the interactive tutorial** on the workspace manager's welcome screen. Nimbalyst reuses the existing tutorial folder rather than making a second one, so the button reads **Open tutorial** once it exists. Delete the `Nimbalyst Tutorial` folder in your Documents folder whenever you are done with it.

## 3. The guided quickstart

Learn Nimbalyst by doing your own real work in about 15 minutes, with an agent as the instructor. Product managers, founders, and designers finish with a working brief and an embedded mockup. Developers finish with a run-and-test guide, an embedded architecture diagram, and two agents running in parallel.

Open a workspace in Nimbalyst, start a new chat, and paste this prompt:

```
Fetch https://raw.githubusercontent.com/nimbalyst/skills/main/skills/getting-started/quickstart.md, save it to nimbalyst-quickstart/quickstart.md in this workspace, then run it as the Nimbalyst quickstart. Wait for me at every exercise.
```

The agent saves the quickstart in your workspace, helps you choose the product or engineering track, and waits for you at each exercise. Everything it creates stays under `nimbalyst-quickstart/`, so you can remove the folder afterward if you do not want to keep the results.

The [Nimbalyst quickstart on GitHub](https://github.com/nimbalyst/skills/blob/main/skills/getting-started/quickstart.md) is the source of truth.

## Setting up a team

Working with other people is its own walkthrough. Sign in, create an organization and invite your team, then work together in shared trackers and shared documents while everyone's coding agents work in the same files. **2:46.**

{% embed url="<https://www.youtube.com/watch?v=Ua-zh-UJh-s>" %}

The same seven steps in writing, with a screenshot for each: [Nimbalyst Teams: Step by Step](/team-collaboration/teams-tutorial).

## Use cases

* [For Product Managers](https://nimbalyst.com/use-cases/product-managers/)
* [For Developers](https://nimbalyst.com/use-cases/developers/)

More workflows, from feature planning to bug analysis to design handoff, are on the [Nimbalyst use cases page](https://nimbalyst.com/use-cases/).


# Quickstart

Set up Nimbalyst in minutes. Open a project, connect a coding agent, and run your first AI session in a visual interface for Claude Code.

This page gets you from download to your first AI session: install the app, open a project folder, connect a coding agent, and learn the three modes you will work in. It takes a few minutes end to end.

Start by downloading the app from the [Nimbalyst download page](https://nimbalyst.com/download/). Mac, Windows, and Linux builds are all there. On Linux, choose between an AppImage and a `.deb` package for Debian and Ubuntu; the `.deb` works on Ubuntu 24.04 and later, where AppArmor's user-namespace restriction blocks the AppImage.

### Open a Project

<div align="left"><figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FPf0U8CK9wIqBhPvWohpG%2Fimage.png?alt=media&amp;token=a65eba65-4e9f-4db8-b22d-e3025b932370" alt="The Project Manager with Open Folder and New Folder buttons and a list of recent project folders on the left" width="563"><figcaption><p>The Project Manager: open any folder as a project, or pick one of your recent projects from the list.</p></figcaption></figure></div>

* A project is a folder opened in Nimbalyst. It keeps its own history, context, and window state, and that state is restored when you reopen the folder.
* If you have git repositories locally, open those; if not, create a folder such as `Nimbalyst Projects` and work there.
* You can have multiple Nimbalyst windows open on different projects at the same time. A consistent color per project helps you tell them apart.
* Return to this screen from **Window > Project Manager** or **Cmd+P** to open another project.
* You can only view and edit files that are inside your project, but your coding agent can read and change files elsewhere on your computer if you give it permission.

### Coding Agents

Nimbalyst includes provider integrations for Claude Agent and OpenAI Codex, so you do not need to install their command-line tools for the standard in-app agents.

1. Open **Settings > Application > AI Providers** and choose a provider.
2. For Claude Agent, sign in with an eligible Claude plan or enter an Anthropic API key. For OpenAI Codex, sign in with an eligible ChatGPT plan or enter an OpenAI API key.
3. Start a session and select the provider from the composer. If it still needs authentication, Nimbalyst will guide you to the relevant settings.

Separate CLI providers are also available for workflows that specifically need an installed command-line agent. See [AI provider setup](/setup-nimbalyst/ai-provider-setup-and-notifications) for the differences and current authentication options.

### Files Mode

Files mode (**Cmd+E**) is where you work on one file at a time with an agent beside you: interactive WYSIWYG markdown docs, mermaid diagrams, excalidraw drawings, html mockups, data models, CSV files, Calc Sheets, in-app browser previews, mind maps, and code.

* Edit the file in the center panel. See red/green diffs from your coding agent, review them, and accept them.
* Work with your agent in the right panel to edit this file, explore other files, or research the web.
* Navigate and manage your files in the left panel file manager.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FwlRCXOFONAHjdMIBmyQh%2F1.png?alt=media&amp;token=dd138168-d92e-4650-832d-3b2969013fbd" alt="Files mode with the file tree on the left, a markdown plan with red/green AI diffs and an embedded mermaid diagram in the center, and the AI assistant panel on the right"><figcaption><p>Files mode: file management on the left, red/green AI diffs to review in the document, and the AI assistant on the right.</p></figcaption></figure>

#### Edit Markdown

* Nimbalyst uses standard Markdown files for documents, while visual editors use their own open or plain-text project files.
* Work in native markdown mode or in the WYSIWYG editor with markdown commands.
* Open a markdown document from your folder and start editing, or create one with the new-document icon or **File > New** (**Cmd+N**).
* Save with **Cmd+S**. Documents are saved as standard markdown files on disk, so you or other AIs can edit them in other applications too.
* **Cmd+Y** opens the file's history so you can review and restore earlier versions.

#### Calc Sheets

* Create a `.calc.md` file when you want spreadsheet-style results in a markdown document.
* Useful for pricing, estimates, budgets, unit conversions, and planning notes with formulas.
* You keep the source as plain text while Nimbalyst renders evaluated values beside it.
* See [Calc Sheets](/visual-editors-powered-by-ai/calc-sheets).

#### Browser

* Open `.html` files or live URLs in a real Chromium view inside Nimbalyst.
* Preview generated pages, inspect mockups, and verify frontend changes without switching apps.
* Ask your agent to navigate, click, type, scroll, evaluate, or screenshot the page.
* See [Browser](/visual-editors-powered-by-ai/browser).

#### Mind Map

* Create a `.mindmap` file when a roadmap, plan, or research topic is easier to understand spatially.
* Mind maps give you an infinite canvas with branches, notes, tags, colors, and AI-assisted expansion.
* The file stays readable and versionable, so agents can edit it like other project files.
* See [Mind Map](/visual-editors-powered-by-ai/mind-map).

#### AI Chat Panel

* Use the AI chat panel to edit your documents or do research.
* Select a provider from the dropdown. See [AI Provider Setup and Notifications](/setup-nimbalyst/ai-provider-setup-and-notifications) to set up Claude Code, Codex, and other providers.
* The agent can see and operate on your current document and your whole project.
* Type `@` to attach a file or folder to the conversation. In markdown documents, putting a supported custom-editor file reference on its own line turns it into an inline embed.
* Use the **Actions** dropdown to insert reusable prompts like reviewing changed files, planning an implementation, drafting release notes, or inspecting the current editor.
* AI edits show up as red/green diffs for your approval.
* Each AI conversation is a session that can be saved and resumed.

#### Edit Mockups

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FSPJYNzOb4qnYSrEffLzO%2F2.png?alt=media&amp;token=33b72743-0c51-4ea7-bac9-6f6e1545bc3b" alt="An html mockup of a bank sign-up form open in the mockup editor, with a red annotation circled on the form and the AI chat panel on the right"><figcaption><p>Draw an annotation on a mockup, then ask the agent to make the change you circled.</p></figcaption></figure>

* Create a mockup by typing `/mockup` in the agent panel, then click to open it in the editor.
* Edit it by modifying the html source, by annotating it (drawing on it), or by selecting a div and asking the agent for changes.
* Embed the mockup into a document by typing `/` in the document.

### Agent Mode

Agent mode (**Cmd+K**) is where you run and manage AI sessions: organize, find, and continue your conversations, track the files each session changed, and step through and approve every diff, with all the power of Claude Code and Codex plus / command support and GitHub status tracking.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FI8CIAeODNM9IBQiJwwKR%2F3.png?alt=media&amp;token=ff5ee5eb-5ebe-4d9c-bb47-4bd409432a76" alt="Agent mode with the session list on the left, a transcript showing red/green CSS edits in the center, and the files the agent edited and read on the right"><figcaption><p>Agent mode: sessions on the left, the transcript with red/green edit cards in the center, and the files the agent touched on the right.</p></figcaption></figure>

* Your conversation with the agent is in the central panel.
* The left panel lists your sessions. Group related sessions into workstreams.
* The right panel lists the files the agent touched in the session or workstream. Click a file to open it in the center; right-click to open it in Files mode.

If you already have a history of sessions in the Claude Code CLI, bring them into Nimbalyst with **File > Import Claude Code Sessions...**. See [Import Claude Code Sessions](/session-management/import-claude-code-sessions).

### Team and Collaboration Setup

To collaborate with other people in a project:

1. Sign in under **Settings > Account > Accounts**.
2. Make sure the project has a git remote named `origin`.
3. Open **Settings > Project > Sharing** and create a team, join an invitation, or add the repository to an organization you already administer.
4. Invite teammates from the organization's member settings.
5. Open **Collaboration** mode to create shared documents, or right-click a supported local file and choose **Share to Team**.
6. Open **Trackers** to work on shared tracker types or promote hybrid items into the team tracker.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-b3694ea2879264e4f754949d3daa4924c95d8ce1%2Fteam-collab-presence.png?alt=media" alt="A shared planning document with teammate presence avatars and a live labeled cursor"><figcaption><p>Once the team is connected, people and their agents can work together in the same shared documents and trackers.</p></figcaption></figure>

See [Set Up Nimbalyst Teams and Organizations](/team-collaboration/setup-teams-and-orgs) for the complete settings flow and [Team Collaboration Overview](/team-collaboration/overview) for how local and shared work fit together. To go further, [Nimbalyst Teams: Step by Step](/team-collaboration/teams-tutorial) walks the whole flow in seven steps with a screenshot for each.

### Mobile App

Manage your AI coding agents on the go with the Nimbalyst mobile app:

* **Session dashboard:** see all active, completed, and paused sessions at a glance.
* **Diff review:** swipe through file changes with red/green diffs optimized for mobile.
* **Resume and reassign:** resume stalled sessions with a voice note or typed instruction from your phone.
* **Push notifications:** get notified when sessions complete, hit errors, or need approval.
* **Desktop sync:** changes approved on mobile appear on desktop right away.
* **All agents:** manage Claude Code and Codex sessions from one app.

See the [mobile app](/mobile/mobile-app) docs for details.

### Shortcuts

Open **Help > Keyboard Shortcuts** or press **Cmd+/** for the full list. A few to start with:

* **Cmd+O**: Unified Quick Open in the Files tab, with tabs for content search, sessions, prompts, projects, and trackers
* **Cmd+K**: Agent mode
* **Cmd+E**: Files mode
* **Cmd+N**: New file or session
* **Cmd+Shift+N**: New AI session from any mode
* **Cmd+Shift+K**: Session kanban board
* **Cmd+\[** / **Cmd+]**: Navigate back and forward
* **Cmd+Shift+V**: Force-paste as plain text

### 15-minute guided quickstart

Learn Nimbalyst by doing real work in about 15 minutes. Product managers, founders, and designers finish with a working brief and an embedded mockup. Developers finish with a run-and-test guide, an embedded architecture diagram, and two agents running in parallel.

Open a workspace in Nimbalyst, start a new chat, and paste this prompt:

```
Fetch https://raw.githubusercontent.com/nimbalyst/skills/main/skills/getting-started/quickstart.md, save it to nimbalyst-quickstart/quickstart.md in this workspace, then run it as the Nimbalyst quickstart. Wait for me at every exercise.
```

The agent saves the quickstart in your workspace, helps you choose the product or engineering track, and waits for you at each exercise. Everything it creates stays under `nimbalyst-quickstart/`, so you can remove the folder afterward if you do not want to keep the results.

The [Nimbalyst quickstart on GitHub](https://github.com/nimbalyst/skills/blob/main/skills/getting-started/quickstart.md) is the source of truth.


# Major Bugs, Outages, Feedback, Discord, Support, Releases

Where to report Nimbalyst bugs, check current outage status, join the Discord community, reach the support team, and follow new releases.

This page is where to go when you need help or want to reach us: current outage status, the community Discord, support email, in-app feedback, GitHub, and release notes.

### Major Bugs and Outages

* All Clear

### Discord

Join our [Discord server](https://discord.gg/FgD9S2MCYB) to find community, hear updates, and discuss use cases.

### Support

Email <support@nimbalyst.com>.

### In-App Feedback

You can file a bug report or feature request without leaving the app. Three entry points open the same dialog:

* The **Send Feedback** button in the navigation gutter
* **Help > Send Feedback...** in the menu bar
* The `/feedback:bug-report` and `/feedback:feature-request` slash commands in any agent session

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FVZy3k6g6zx148J9ATi21%2Fimage.png?alt=media&amp;token=2b388a33-142c-4984-9a4c-c36863e5cae9" alt="The Send Feedback button in the navigation gutter"><figcaption><p>The Send Feedback button in the gutter is one of three entry points to the same dialog.</p></figcaption></figure>

The dialog offers two cards: **Bug report** and **Feature request**. A bug report includes a consent checkbox for gathering logs, on by default. A feature request offers an optional UX mockup, off by default, so the assistant can sketch the idea before writing it up.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FPMzrd8nPvU9zTlzYWZH4%2Fimage.png?alt=media&amp;token=d81a525a-4209-4d94-a43b-534a3665c3b3" alt="The feedback dialog with Bug report and Feature request cards"><figcaption><p>Pick a card and an agent session takes it from there.</p></figcaption></figure>

Choosing either card starts an agent session that:

1. Asks clarifying questions about what happened or what you want
2. Gathers your app version and environment details, plus logs only if you left the consent checkbox on
3. Anonymizes everything it gathered, with a scrubbing pass and an AI redaction pass over file paths, project names, and identifiers
4. Shows you the redacted draft for approval
5. Opens a pre-filled GitHub issue form in your browser

You review the issue and click Submit on github.com yourself. Nothing is posted on your behalf.

{% hint style="info" %}
This flow sends bugs and ideas to the Nimbalyst maintainers. To ask your own teammates for input on your work, see [Ask Your Team for Feedback](/team-collaboration/feedback-requests).
{% endhint %}

### GitHub

Nimbalyst is open source. Browse the code, star the repos, or contribute at [github.com/nimbalyst](https://github.com/nimbalyst).

* Submit feature requests and bug reports at [github.com/Nimbalyst/nimbalyst/issues](https://github.com/Nimbalyst/nimbalyst/issues)
* Pull requests welcome. See the contributing guide in the main repo.

### X, LinkedIn, and YouTube

If you are loving Nimbalyst, please post about it and mention @nimbalyst. Follow us here:

* X: [x.com/nimbalyst](https://x.com/nimbalyst)
* LinkedIn: [linkedin.com/company/nimbalyst](https://www.linkedin.com/company/nimbalyst)
* YouTube: [youtube.com/@nimbalyst](https://www.youtube.com/@nimbalyst)

### Release Notes

Full release notes are on the [GitHub releases page](https://github.com/Nimbalyst/nimbalyst/releases), and every shipped release is listed on the [Nimbalyst changelog](https://nimbalyst.com/changelog/). Past announcement emails are archived in [Release Announcements](/getting-started/release-announcements).


# Release Announcement Archive

Archive of every Nimbalyst release announcement email, newest first, with the screenshots and links that went out to the community.

Want these in your inbox? [Sign up for release updates](https://nimbalyst.com/release-updates/). Full per-release detail lives on the [GitHub releases page](https://github.com/nimbalyst/nimbalyst/releases).

| Version                               | Date         | Headline                                                 |
| ------------------------------------- | ------------ | -------------------------------------------------------- |
| [0.77.2](#v0.77.2-september-7-2026)   | Sep 7, 2026  | Project Graph, document decisions, teammate questions    |
| [0.76.3](#v0.76.3-september-3-2026)   | Sep 3, 2026  | Fable 5.1, menu bar session fleet, multi-folder projects |
| [0.75.5](#v0.75.5-august-28-2026)     | Aug 28, 2026 | Project Canvas, web console trackers, new coding agents  |
| [0.74.4](#v0.74.4-august-22-2026)     | Aug 22, 2026 | Web console editing, feedback requests, faster storage   |
| [0.73.2](#v0.73.2-august-12-2026)     | Aug 12, 2026 | Nimbalyst Teams Beta                                     |
| [0.72.8](#v0.72.8-august-7-2026)      | Aug 7, 2026  | Tracker documents, spreadsheet formulas, MCP fixes       |
| [0.70.5](#v0.70.5-july-23-2026)       | Jul 23, 2026 | Token consumption, PR review sessions, custom trackers   |
| [0.67.3](#v0.67.3-july-9-2026)        | Jul 9, 2026  | Background sub-agents, Calc Sheets, PR linking           |
| [0.66.7](#v0.66.7-july-1-2026)        | Jul 1, 2026  | Major trackers upgrade, voice mode, nim CLI              |
| [0.65.4](#v0.65.4-june-15-2026)       | Jun 15, 2026 | Subscription terminal mode, embeds, actions, browser     |
| [0.63.9](#v0.63.9-june-2-2026)        | Jun 2, 2026  | Opus 4.8, unified Quick Open, performance                |
| [0.60.1](#v0.60.1-may-13-2026)        | May 13, 2026 | Multi-project rail, session rename, Codex parity         |
| [0.58.14](#v0.58.14-april-30-2026)    | Apr 30, 2026 | Open source, extension system, OpenCode                  |
| [0.58.3](#v0.58.3-april-23-2026)      | Apr 23, 2026 | Session resume fix, training video                       |
| [0.56.17](#v0.56.17-march-26-2026)    | Mar 26, 2026 | Windows re-download, image paste, context accuracy       |
| [0.56.6](#v0.56.6-march-19-2026)      | Mar 19, 2026 | Opus/Sonnet 1M, skills, mobile keep-awake                |
| [0.55.31](#v0.55.31-march-13-2026)    | Mar 13, 2026 | Mobile app, Enterprise SSO                               |
| [0.55.25](#v0.55.25-march-7-2026)     | Mar 7, 2026  | GPT-5.4, session mentions, Windows signing               |
| [0.55.9](#v0.55.9-march-3-2026)       | Mar 3, 2026  | Session kanban, trackers, system tray                    |
| [0.54.19](#v0.54.19-february-26-2026) | Feb 26, 2026 | Codex GA, sub-agents, file sharing                       |
| [0.53.13](#v0.53.13-february-19-2026) | Feb 19, 2026 | Sonnet 4.6, Codex beta, shareable links                  |
| [0.52.60](#v0.52.60-february-6-2026)  | Feb 6, 2026  | Claude Opus, agent teams                                 |
| [0.52.40](#v0.52.40-february-5-2026)  | Feb 5, 2026  | Terminal, git, worktrees, workstreams                    |

***

## v0.77.2 - September 7, 2026

**Project Graph, decision blocks and teammate questions in documents, Media Viewer**

Nimbalyst 0.77.2 (covering the 0.77.x releases) brings a bigger Project Graph, decisions and questions you can settle with teammates right inside a document, a Media Viewer for video files, and GPT-6 Astra support.

### Project Graph

Project Graph adds Atlas, Pulse, and Evidence Trails views with broader source coverage, saved views, and linked source exploration, so you can see how the work in your project connects and where the activity is.

### Decisions and Questions in Documents

* Add decision blocks inside documents, with solo or collaborative voting and attributed outcomes preserved in the markdown.
* Send document questions to teammates, collect private answers, and resume the agent after a human settles the outcome.

### Other New Features

* Media Viewer extension: open and play .mp4 files in a tab, including scrubbing through long recordings.
* GPT-6 Astra can be selected for Codex sessions, with its Ultra reasoning level.
* A session that launches another session can request the reasoning effort it runs at.
* Project Memory indexes agent instructions and personal memory as separate sources and can use an optional on-device embedding model.
* Session history marks sessions that launched other sessions, with a launch-count tooltip.

### Fixes

* Provider API keys are now encrypted on disk.
* iPhone and iPad share one adaptive layout that preserves the active session and draft through rotation, with a session sidebar on wide screens.
* Plus fixes for Codex question answers arriving after a turn ends, workstream tab scrolling, orchestrating sessions keeping up with their children, the Codex effort selector, extension tool calls that stopped responding, and SQLite migration timeouts on large document histories.

***

## v0.76.3 - September 3, 2026

**Claude Fable 5.1, menu bar session fleet, multi-folder projects, quick tracker capture**

Nimbalyst 0.76.3 (covering the 0.76.x releases) brings Claude Fable 5.1, your session fleet in the macOS menu bar and on your iPhone, projects that span several folders, and fast tracker capture from anywhere in the app.

### Claude Fable 5.1

Claude Fable 5.1 is now available in the model picker, with Fable 5 kept as a selectable previous-generation option.

### Session Fleet in the Menu Bar and on Your Phone

* The macOS menu bar names a session as it starts, finishes, blocks or fails, flags one that has stopped responding, and quiets to a single mark when nothing is running.
* Your session fleet also reaches the iPhone Lock Screen and Dynamic Island as a Live Activity, ranked by how long each session has been waiting on you.

### Multi-Folder Projects

* A project can span several folders: attach one from the File menu or quick open and it appears in the explorer, in search, and to your agents, with git status, branches and commits tracked per repository.
* The Git panel's Changes tab can show every repository at once, and Commit with AI proposes one commit per repository when your changes span several.

### Trackers and Teams

* Quick Track (Cmd+Shift+I) files a tracker item of any type from anywhere in the app, offering similar existing items before you add a duplicate.
* Radar gives shared trackers a since-you-left digest of teammate activity, status moves, and stalled work, in desktop and the web console.
* Right-click a folder and choose "Share Folder to Team" to publish everything shareable inside it at once.
* Accepting a team invitation now opens your team in the browser and lands you on its documents, and inviting someone asks what they get so a new teammate arrives to real work.

### Other New Features

* /planning:nimbalyst-coach reviews your project and recent sessions and suggests extensions, features you have not tried, and instructions worth adding, changing nothing until you approve.
* A .deb download for Debian and Ubuntu, covering Ubuntu 24.04 and later where the AppImage is blocked.
* Grok Build sessions can answer questions and approve tool use while they run.

### Fixes

Highlights: agent edits to a file open in diff mode can no longer be reverted by an autosave, an API key left in your shell environment is no longer handed to the Codex or Copilot agents, document sync can no longer delete markdown files from your workspace, phone-started sessions run on one desktop instead of duplicating across installs, tracker item bodies survive team metadata syncs and keep their issue keys, tracker Display Settings are remembered per type, a failed compaction can be retried, and background agent commands can run for up to 30 minutes.

***

## v0.75.5 - August 28, 2026

**Project Canvas, trackers in the web console, Grok Build and Cursor Agent, Animations**

Nimbalyst 0.75.5 (covering the 0.75.x releases) brings Project Canvas, full tracker support in the web console, two new coding agents, an animation editor, and mockup pin comments.

### Project Canvas

An infinite canvas where every card is the real editor (markdown, mockup, spreadsheet, drawing, mindmap) live and editable in place. Drag a file or shared document onto the board, add sticky notes, frames, and arrows, and get team comments, presence, and agent activity. Works in the desktop app and the web console, saves as an open .canvas file, and an AI session can build a board for you from a description.

### Trackers in the Web Console

* Work your team's shared trackers from the browser in list, table, board, timeline and tag board views, with search, filtering, inline editing, comments and drag-and-drop, converging live with the desktop app.
* The web console now reads as Nimbalyst rather than a separate admin tool, with the desktop app's header, navigation, themes, and Cmd+K quick open, and a layout that holds up on a phone.
* Invite people to your organization from the web console and manage pending invitations.

### New Coding Agents

* Grok Build and Cursor Agent join as coding agents, each with settings, model picker, edited-file tracking and diff review.
* Gemini is now a built-in coding agent rather than an extension.
* OpenCode sessions gain slash commands, Compact, agent roles, and a live model picker.

### Animations

Author step-based technical animations in .anim.json files, with a live stage, scrubbable timeline, and MP4 or GIF export. Animation and Project Canvas are installable from the Extensions marketplace.

### Other New Features

* Comment on a spot in a shared mockup: pins sync live, keep their place when an AI regenerates the mockup, and agents can read and reply.
* Trackers record what an item is waiting on, with a built-in Ready view listing unblocked work first.
* Browse and triage GitHub issues beside pull requests, keeping notes local until you adopt an issue as a tracker item.
* Commit with AI can stage individual hunks of a file, so parallel sessions editing the same file each commit only their own lines, and it pre-selects the hunks your session actually wrote.
* AI sessions take less disk, and clearing old tool output now prunes existing sessions too.

### Fixes

Highlights: images attached to a Claude Code session reach the model again, Nimbalyst no longer freezes for seconds during startup or while an AI session edits files, offline team-tracker edits reach the team on reconnect, shared trackers connect within moments of launch, and Nimbalyst no longer removes items from your team's tracker when it cannot tell which trackers are shared.

***

## v0.74.4 - August 22, 2026

**Edit shared files in the web console, teammate feedback requests, spreadsheet upgrades, faster storage**

Nimbalyst 0.74.4 (covering the 0.74.x releases) brings web console editing for shared files, structured feedback requests, a big spreadsheet upgrade, Organization mode, and an automatic move to a faster storage engine.

### Edit Shared Files in the Web Console

Shared spreadsheets, mockups, and Excalidraw diagrams now open and edit in the web console, with live presence between the desktop app and the browser.

### Feedback Requests

Ask a teammate for structured feedback: your agent drafts the question, it lands in their inbox with the artifacts it is about, and anyone can answer in a browser.

### Spreadsheets

Spreadsheets gain date-time, time, checkbox, link, and tracker columns, cell styling, accounting and scientific number formats, and date arithmetic in formulas.

### Trackers

* Trackers hide closed work by default, with an Open / All / Closed switch on every view and new Won't Do and Duplicate statuses.
* Tracker items that have not been shared yet get a number of their own, like NIM.12, so you can refer to one before it is published.

### Organization Mode

Your organization's inbox, rooms, and direct messages open in the project window as an Organization mode, with mentions, assigned work, and owed replies as their own rows.

### Faster Storage, Less Disk

* Nimbalyst upgrades its local database to the faster storage engine on its own, and stays on the old one if anything goes wrong.
* Nimbalyst takes far less disk: fewer and now-adjustable database backups, no more storing enormous command output, and an option to discard old tool output.
* Databases are never set aside without confirmation, momentary startup failures retry instead of emptying your sessions, and when the database will not start Nimbalyst lists the backups it holds instead of telling you to delete anything.

### Fixes

Highlights: shared spreadsheets, diagrams, mockups, and data models no longer drop edits when two people work at once, Codex file edits show a red/green diff again with context usage and Compact restored, milestones and releases report their true progress, push notifications reach the phone you walked away from, and a long list of community-contributed fixes landed. Thank you to our contributors.

***

## v0.73.2 - August 12, 2026

**Nimbalyst Teams Beta - Multi-player for Claude Code / Codex**

Nimbalyst Teams Beta release (0.73.2) brings multiplayer for Claude Code and Codex in collaborative trackers, collaborative files (markdown docs, excalidraw, mockups, csv, code, more) and collaborative extensions you make with your agents.

Nimbalyst Enterprise Beta brings Nimbalyst collaboration you can own (run in your own CloudFlare, source for internal use).

### Nimbalyst Teams: Multiplayer Claude Code & Codex

Nimbalyst Teams allows you to work locally in Nimbalyst, then promote a local document or tracker to shared, collaborate on it with your team async or in real-time, and all continue to use your local agents which can see your local and shared docs and trackers and your local sessions.

The benefit for you is less app switching and you don't have to keep all the links and connections between docs, trackers, diagrams, code, sessions in your head. Nimbalyst does that for you. For your agents, the advantage is deep unified context.

**Get Started with Nimbalyst Teams**

* Nimbalyst Teams is free while in Beta but will be $20/user/month
* Try it now by clicking on the profile icon on the bottom left and then Org.
* Invite team-members to your org
* Here is a detailed [video and walkthrough](/team-collaboration/teams-tutorial) of how to set it up and use it
* Here is the [overview](https://nimbalyst.com/teams/) on the website

### Collaborative Documents

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-231f28e3be40262dee393b0051e1dbef863480e4%2Frelease-0732-collab-docs.png?alt=media" alt="Collaborative documents"><figcaption></figcaption></figure>

* Share a document, plan, decision, mockup, diagram, or tracker item to your team and everyone edits the same live copy
* See teammates working with presence icons
* Comment and review comments. Inbox for easy comment tracking
* Agents can read, reply to, and create inline comments
* Embedded mockups and diagrams inside a shared document render live for teammates

### Collaborative Trackers

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-ef5b8bc50f90858cf2e539b4ac4a2526611cbe26%2Frelease-collab-trackers.png?alt=media" alt="Collaborative trackers"><figcaption></figcaption></figure>

* Work with your team and your coding agents in a shared tracker
* Create, update, move trackers or have your agent do the same
* Trackers contain the full collaborative markdown documents in which you can write text, tables and embed diagrams, mockups, csv
* Keep your work organized and together in a system that records status and progress, avoiding cluttered folders

### Collaborative Extensions

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-1bef8e4a6d939f176e77c85af14ba97f58335496%2Frelease-0732-collab-extensions.png?alt=media" alt="Collaborative extensions"><figcaption></figcaption></figure>

* Have your agent build visual editors that are coding agent integrated to extend Nimbalyst
* These extensions can be collaborative / multi-player

### Nimbalyst Web Console for Team Members who do not yet use the Desktop App

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-f6cf8da7a18c14fcc0525ae46ccbb3afb46c254a%2Frelease-0732-web-console.png?alt=media" alt="Nimbalyst web console"><figcaption></figcaption></figure>

* For Nimbalyst users who want to share a plan or mockup or spreadsheet with one or many team members who do not have the Nimbalyst desktop app
* Web console users can edit files and comment on them.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-a0d18fa8f8083676a41dca66c75ce60902e3fb59%2Frelease-0732-teams.png?alt=media" alt="Nimbalyst Teams"><figcaption></figcaption></figure>

### Nimbalyst Enterprise Beta

* Nimbalyst collaboration server in your own Cloudflare account, or managed by us
* Collaboration code source available for your company only use
* Data residency pinned to your jurisdiction
* An engineer embedded with your platform team through onboarding
* We build your first multiplayer extension, a visual editor for an artifact your teams work with today

Learn more [here](https://nimbalyst.com/enterprise/).

### Additional Features, Improvements, and Fixes

* Group the tracker board into lanes by milestone, goal, or any other field - drag a card, use the chip on it, or move several at once - and lay the same grouping out over time in the new Timeline view.
* Git Log shows which AI session produced each commit, with a click-through to open it.
* The editor header shows the last AI session that worked on the open file, with a dropdown to jump to other sessions or start a new one.
* Improved taskbar session state preview
* Agents reading a web page no longer receive what you typed into its form fields.
* Sessions waiting on a question or a permission prompt now show as awaiting your input in the sidebar and on mobile, instead of looking like they are still running.
* Prompts sent from your phone appear in the queue while they are still pending.
* Viewing history diffs no longer freezes a restored session.
* The slash-command palette shows each command and skill's own description again, along with its correct icon and grouping.
* Browser tabs now line up with their tab when the window is zoomed in or out, instead of painting the page in the wrong place and at the wrong size.
* Repositories with more than a page of open pull requests no longer show only the first page, and accented characters in PR titles no longer come through garbled.

***

## v0.72.8 - August 7, 2026

**MCP fixes, Trackers with full doc editing/undo, Spreadsheets with formulas, Tutorial, Stickers, Quote request**

Nimbalyst 0.72.8 release: MCP Fixes/Chip, Trackers with embedded documents, grid view, undo. Spreadsheets with formulas, find/replace. Tutorial playground, Stickers, and Quotes, Git panel.

### MCP Fixes

* OAuth HTTP and SSE servers connect in Claude Code sessions
* Your existing MCP setup is used instead of overridden
* Servers that refuse dynamic registration can be authorized with a client ID you enter
* Optional MCP status chip in the session header showing which servers connected

### Trackers embedded docs, grid view, views

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-2558413903d368c3036291c6efa27b5a670edb03%2Frelease-0728-trackers.jpg?alt=media" alt="Tracker items as full documents"><figcaption></figcaption></figure>

Tracker items open as full documents with editable field chips, keyboard-driven search and filters, and a side-by-side AI chat panel, so the writeup lives in the item instead of as a loose markdown file in a folder. It's much easier to organize work and keep everything together and moving through state.

* Editable grid Table view with favorites, right-click bulk actions, column sorting, and grouping
* Undo/Redo in the tracker table with Cmd+Z and Cmd+Shift+Z, covering cell edits, paste, bulk status and priority changes, and archiving.
* Shareable saved views, unified filter pills with multi-select values, relative dates, and user filters
* Triage inbox showing items waiting on a decision, with a "Leave it" action that clears an item for the whole team
* Release and review workflows, plus expanded nim CLI commands

### Spreadsheets with formulas

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-87b9cb4c50fac824d572b885aefc5564061cf28a%2Frelease-0728-spreadsheets.png?alt=media" alt="Spreadsheets with formulas"><figcaption></figcaption></figure>

* Find and Replace is now supported in spreadsheets
* Formulas can be added by you or your agent
* Freeze columns and rows

### Tutorial Playground

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-a5d82b2c40876dfa1ed3c2a0f129c3c5d3d9d252%2Frelease-0728-tutorial.png?alt=media" alt="Tutorial playground project"><figcaption></figcaption></figure>

You can open a ready-made tutorial project with documents, data, designs, plans, and finished AI sessions to explore. Available any time from the project manager or Help > Launch Tutorial.

### Stickers

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-68caedd8ce616d9ab2a67cb585da72db385cc780%2Frelease-0728-stickers.png?alt=media" alt="Nimbalyst stickers"><figcaption></figcaption></figure>

As a thank you for being a part of Nimbalyst. I'd like to send you a Nimbalyst sticker. It is 3 inches long and 1 inch high. Just put your address into this Google Form and we will mail it to you. The address won't be used for anything else. <https://forms.gle/hkZWZ5MJfVvFF1gs5>

### Public Quotes and Use Cases

I'm looking for quotes and stories I can use publicly on the website and social about your positive view or use of Nimbalyst. Reply to this email or email me at <karl@nimbalyst.com> with:

* A short quote I can use, or a short paragraph on the problem Nimbalyst solved for you or how you use it
* Whatever you are comfortable sharing: Anonymous with Role, First Name, Full Name, or Full Name and Company and Role (the more the better)
* Just say "You have my permission to use this on website, social, or both"
* We can go back and forth and hone it.

### Additional Features, Improvements

* The new-worktree dialog can now search branches, narrowing the local and remote lists as you type.
* Agent sessions can show an MCP status chip listing which servers the session has and which are connected - off by default, under Settings > Agent Features.
* The Git panel's Changes tab is now one compact, collapsible list with no staging step: tick the files you want and commit them, or hand the selection to AI to write the message.

### Additional Fixes

* Claude Agent sessions no longer re-write the prompt cache on most turns, cutting token cost and rate-limit usage on long sessions.
* Claude Code sessions use your existing MCP setup instead of overriding it, so account connectors load again and sessions no longer fail to start on machines with an organization-managed MCP policy (#1051).
* OAuth-authorized HTTP and SSE servers connect, and servers whose provider refuses dynamic client registration can be authorized with a client ID you enter.
* Queued prompts now run on their own: a prompt sent from your phone opens the project and runs it, prompts left over from a quit resume once the project is open again, and a prompt that arrives mid-turn runs when the turn ends (#962).
* Sessions no longer show as running after their work finished, so prompts queued behind an interrupted or background-task session send. Cancelling a Codex session stops it for good, and Codex sessions using parallel sub-agents wait for the lead agent's final response.
* Yes/no questions from the agent show both answers as pickable buttons and wait for you to choose. Answering or cancelling a question closes it for good instead of bringing it back when you switch sessions (#1116, #773).
* Simply opening a tracker item no longer bumps its "Updated" time or adds a phantom edit to its history.
* Tracker items with structured array fields no longer crash when opened (#1104), sidebar type counts no longer read 0 for types that have items, and sorting by a date column orders rows by date instead of alphabetically by month name.
* A session that reports its previous conversation has expired now genuinely starts fresh on the next message (#1098).
* Main windows restore their maximized state after restart instead of reopening at stale bounds (#1077), and dropdown menus no longer open underneath the macOS window controls (#1096).
* Windows builds sign installer and uninstaller (#853).
* A file that repeatedly fails to save now shows a Retry banner instead of autosave looping on it forever.
* Projects with many new, uncommitted folders no longer stall while the file tree and changed-files list refresh.
* Find-in-document highlights matches inside inline code, comments whose anchor text was deleted scroll into view, and the sidebar extension panel reopens where you left it after a reload (#1114).
* Links written as plain relative paths, such as `design/dashboard.mockup.html`, open the file instead of a broken page in your web browser, and embedded mockups and diagrams in shared documents open the shared copy.
* When a session edits the same file several times, the red/green diff shows the whole set of changes again instead of only the last one.
* Tables exported to PDF span the full page width with content-sized columns.
* Web search and web fetch no longer fail in Claude Code CLI sessions running at max effort.
* Changing a project's permission mode now applies to agent sessions that are already running.

***

## v0.70.5 - July 23, 2026

**Reduced Claude token consumption and sessions hanging, start sessions anywhere, customizable trackers, start a PR review session, voice**

Nimbalyst 0.70.5 release: PR review session, start sessions anywhere (Cmd-Shift-N), reduced Claude token consumption and sessions hanging, customizable tracker types and folders, Agent attention list, voice improvements, and persistent git history. Please star us on [GitHub](https://github.com/nimbalyst/nimbalyst). Thanks.

### Reduced Claude Token Consumption and Reduced Claude/Codex Session Pausing

* We reduced the cases where there are Claude Agent cache misses from tag changes, session renames, etc. This fix will result in some users seeing improved Claude token usage.
* We also fixed a set of bugs that resulted in occasional agent sessions pausing such that you had to prompt the session to resume.

### Popup a new AI Session anywhere

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-6a7554922065284705725821260d6cca9ad7ec9a%2Frelease-0705-popup-session.png?alt=media" alt="Popup a new AI session"><figcaption></figcaption></figure>

Launch a new AI session as popup in any window. Very useful in trackers mode and for kicking off something that occurs to you in Files Mode or Agent Mode while keeping your current session in view. Cmd+Shift+N.

### Customizable Tracker Types and Folders

* Customizable tracker types per workspace, organized into ordered folders
* Ask your agent to create the custom fields, custom status, or new tracker types.
* You can now do this for built-in tracker types.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-84d4ab9111bfc8309b721c3243289ffeae5b07da%2Ftracker-type-folders.png?alt=media" alt="Customizable tracker types"><figcaption></figcaption></figure>

### Agent attention icon and list

Agent attention icon with a grouped attention list for sessions awaiting input, running, or unread

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-75b3e376966a731316b9238c7d43706d9907163f%2Fagent-attention-list.png?alt=media" alt="Agent attention list"><figcaption></figcaption></figure>

### Start a PR Review Session

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-f7efe6c2f3051d83e8595e4f7e7d982374c0022f%2Frelease-0705-pr-review.png?alt=media" alt="PR review session"><figcaption></figcaption></figure>

Launch an AI review session from any pull request with the review command prefilled.

Find all the features, improvements, fixes on our [release page](https://github.com/nimbalyst/nimbalyst/releases/tag/v0.70.5).

***

## v0.67.3 - July 9, 2026

**Background sub-agent & automation fixes, Calc Sheets, Memory, PR connect to tracker/sessions and more**

Nimbalyst v0.67.3 was just released with customize the nav gutter, maximize the editor by double-clicking, pull requests connect to trackers and sessions, chat input pills, tools & token cost panel, and Browser, Calc Sheets, GitHub Issues Importer, and Memory Extensions.

It also includes many fixes: background sub-agents keep running to completion, scheduled automations fire on time, slightly reduce per-request tokens, voice-mode improvements, the model picker shows every model again, and a batch of mobile and custom-editor fixes.

Please star us on [GitHub](https://github.com/nimbalyst/nimbalyst). Thanks!

### New Features

* **Customize the navigation gutter.** Right-click the gutter to hide, show, or drag-reorder any icon, with your preferences applied across all projects.
* **Pull Requests connect to trackers and sessions.** Review-status badges and filter chips, one-click jumps between a PR, its tracker item, and its review session, link any tracker item to a PR, and merges update linked tracker items automatically.
* **Tools & Token Cost settings panel.** See every tool group's estimated context-token cost and load policy in one place, linked from the AI panel's token meter.
* **Unread indicators** highlight trackers that have changed since you last viewed them.
* **Maximize the editor.** Double-click an editor tab to expand the editor area in Files and Agent modes, and double-click again to restore.
* **Chat input pills.** Slash commands, @ file references, and @@ session mentions now appear as tinted pills anywhere in a message; slash-command pills stay clickable to show what each command does and open its source.
* **New built-in extensions:** Browser, Calc Sheets, GitHub Issues Importer, and Memory, plus refreshed versions of the existing ones.

### Improvements

* **Trim the session model picker.** Each provider's settings page has checkboxes to hide models you don't use, and the Claude Agent SDK and Claude Code CLI sets can be enabled independently.
* **Slightly reduce per-request token usage.** Agent sessions omit tracker guidance when trackers are off and defer more MCP tool definitions.
* Voice mode replies more briefly and no longer asks you to approve tasks that auto-send after the on-screen countdown.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-a536abd156bfbb47dc296c751a8d0c8ba2d0863c%2Frelease-voice-mode.png?alt=media" alt="Voice mode"><figcaption></figcaption></figure>

### Fixes

* Windows: Claude Code no longer breaks after an app update, and a broken install now shows an honest "repair Nimbalyst" message instead of a misleading libc error.
* Scheduled interval automations now fire on time, and one whose due time passed while the app was closed runs once on next open.
* Background agents launched by a session are no longer killed when the session's turn ends.
* Claude Agent sessions recover a turn whose stream closes mid-response instead of losing the reply, and Claude Code sessions end with an error instead of spinning forever on a stalled stream.
* Corrected issue where some models may be missing from model picker.
* Meta agents and their sub-agents group together on mobile in real time, and iOS session badges correctly label Fable 5 and Sonnet 5 sessions.
* Open custom-editor tabs (Replicad, Excalidraw, and more) refresh when an agent edits the file instead of staying stale.
* Tracker item content no longer renders as raw JSON after closing and reopening, plan items show fresh timestamps, and spurious timestamp churn is stopped.
* Git branch watching no longer crawls the entire workspace, cutting CPU and disk churn in large projects.
* Fewer lost project states on reopen.
* Marketplace extension installs no longer hang mid-extraction.
* Settings navigation reaches the Marketplace in project scope and Privileged Capabilities in all scopes.
* Interactive input prompts stay interactive even if you take more than five minutes to respond.
* Mockup share links render full-size in the browser.
* Clicking a relative file link in a markdown doc opens the file in a tab instead of a blank window.
* Mobile document sync propagates .md deletions across devices and reconnects after you change sync settings.
* The mobile project list no longer drops or wipes projects when the sync snapshot briefly shrinks.

***

## v0.66.7 - July 1, 2026

**A major trackers upgrade, expanded voice mode (still alpha), reduced baseline context usage thru deferred MCP tool schema loading, latest Claude models and a long list of fixes**

Please star us on [GitHub](https://github.com/nimbalyst/nimbalyst). Thanks!

### Trackers Enhancements (Major)

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-ef5b8bc50f90858cf2e539b4ac4a2526611cbe26%2Frelease-collab-trackers.png?alt=media" alt="Trackers upgrade"><figcaption></figcaption></figure>

* Reference a tracker item from any document or AI chat: type # to pick an item and insert a live chip showing its current status and title. The AI links tracker items as clickable chips too.
* Link tracker items to one another with relationship fields, including automatic "Linked from" backlinks.
* New tracker views: a tag board, saved views (filter and group), and kanban columns that follow each type's custom status order.
* Customize or reset a tracker type's schema from Settings, with a drift warning when it diverges.
* Edit and delete your own tracker comments.
* Share individual plans (and other full-document trackers) with your team - the shared copy keeps its status, lifecycle, and body in sync, including changes made offline.
* Control whether AI agents can use your trackers per project with an "AI Agent Access" toggle.
* Optional "Shared" column in the tracker table shows which items are shared with the team. (Note: eventually we will charge for shared team trackers and collaborative files)
* New nim companion CLI for trackers: list, create, update, comment on, archive, and import items from the terminal.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-261cebdaa67f16c8367d6d611a0b6e17e8976bb0%2Frelease-0667-nim-cli.png?alt=media" alt="nim CLI"><figcaption></figcaption></figure>

### Context reduction, improved token usage

Defer MCP tool schema loading to cut baseline context usage.

### Voice Mode (early Alpha)

* Start a new coding session by voice - say "create a new session" on desktop or mobile.
* On mobile, find sessions by topic, switch sessions, summarize a session, answer a session's pending question by voice, and send coding tasks to your desktop.
* The mobile floating mic shows what the voice agent is doing, with clear Pause and Cancel buttons.
* Choose the voice model and reasoning level in Voice Mode settings.
* Requires OpenAI API key in Settings

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-a536abd156bfbb47dc296c751a8d0c8ba2d0863c%2Frelease-voice-mode.png?alt=media" alt="Voice mode settings"><figcaption></figcaption></figure>

### Other New Features

* Claude Sonnet 5 and Claude Fable 5 are now selectable across the Claude chat, Agent, and Code CLI providers.
* Custom completion sounds - pick your own audio file to play when an agent finishes a turn.
* /session-cleanup command tidies your Sessions board with phase corrections and archive suggestions.
* Dart syntax highlighting in the Monaco editor.
* Claude Code CLI sessions store and sync far less redundant data.
* New AI sessions appear immediately instead of waiting for sync to connect.
* Contextual tips now fill empty AI sessions immediately.
* Updating a tracker item no longer links it to the current AI session unless you ask.
* Linked sessions now appear at the top of a tracker item's detail.

### Fixes

**Trackers**

* Linking tracker items now reliably updates both sides and no longer goes stale or drops other links after syncing, including when the AI sets the link.
* Tracker relationship fields no longer get cleared or dropped by concurrent syncs.
* Tracker status changes now work for custom types that rename their workflow status field.
* Tracker reference links (nimbalyst:// chips) in chat no longer render blank.
* Reopened secondary projects now scope the tracker list to the correct project.
* Tracker type counts no longer briefly flash "0" while data is still loading.
* Fixed tracker field corruption on the SQLite backend caused by merging JSON updates.

**AI & sessions**

* Claude Code background sub-agents are no longer killed when the lead agent's turn ends.
* AI session status no longer stays stuck on "running" in the mobile app after a turn finishes on desktop.
* Another session can read an OpenAI Codex session's last reply through the session-summary tools.
* Windows: Claude Code CLI chat sessions now start reliably, including with multi-line system prompts.
* Extension AI tools (such as OpenSCAD and Replicad) no longer revert recent file edits by saving stale content over them.

**Voice**

* Voice mode always speaks in your configured preferred language, including on mobile.
* The iOS voice agent reliably speaks its response after a coding agent finishes a task.
* Voice replies no longer speed up, skip, garble, or overlap near the end of longer responses.

**Other**

* Toggling an extension on/off via an AI agent now actually restarts its backend, and importer crash errors include the real failure reason.
* Git worktrees with branch-style names and a project's own subfolders inherit the parent project's agent permissions instead of re-prompting.
* On Windows, clicking a file link in chat opens the file instead of a blank window.
* Stop prompting to run the Gemini backend at startup; it now starts only when you use Gemini.
* Committing no longer triggers a burst of slow database queries that briefly hitched the app.
* Desktop release builds now bundle the application correctly.

***

## v0.65.4 - June 15, 2026

**New model picker to use Claude's Pro and Max in native Claude terminal integrated with Nimbalyst, embeds, actions, browser**

Nimbalyst v0.65.4 is here with support for a new mode of using Claude's Pro and Max subscription in a native Claude terminal integrated with Nimbalyst, embedding of other file types in markdown, actions, and in-Nimbalyst browser, a built-in PR review monitor, and more.

### Anthropic June 15 Agent Credits and Nimbalyst's new CLI (Subscription Terminal Mode)

Starting June 15, 2026, Anthropic is changing how Claude Agent SDK usage works for Claude subscription plans. SDK usage moves into a separate monthly Agent SDK credit. Anthropic's full writeup, including eligibility, credit amounts, and billing behavior, is here: [Use the Claude Agent SDK with your Claude plan](https://support.claude.com/en/articles/15036540-use-the-claude-agent-sdk-with-your-claude-plan).

In Nimbalyst, now when you pick a Claude model in Nimbalyst, Claude appears under two groups in the picker. Both are Claude Code based and both list the full model range. Your options are:

**Claude Agent (Claude Code Based)**

* What it is: the in-app agent built on Claude Code Agent SDK
* Billing and auth: uses your configured Anthropic API key and Anthropic's Agent SDK billing path.
* Best for: API billing, and Team or Enterprise setups.

**Claude Code CLI (Subscription / Terminal Mode)**

* What it is: Integrated Claude Code in embedded terminal sessions while Nimbalyst layers in session monitoring to support additional Nimbalyst features on top. Uses your local install of Claude Code.
* Billing and auth: uses your Max or Pro subscription login as it is running in Claude's native terminal app
* Best for: Max or Pro subscribers who want subscription-billed Claude Code behavior
* Shortcuts: Ctrl Shift \` will open and close the embedded Claude Code Terminal window

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-77fa4c50ff2a371abe985785d9100948680699b4%2Frelease-0654-model-picker.png?alt=media" alt="Model picker with subscription terminal mode"><figcaption></figcaption></figure>

### Embed other file types in Markdown

Type @ in a markdown document to reference files from your workspace. Mockups, Excalidraw diagrams, data models, CSVs, SQLite files, and other supported editors can render inline as live embeds instead of static screenshots.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-d5df20fb7cd8782126b1ca7563200077fc8a9b07%2Frelease-0654-embed-1.png?alt=media" alt="Embedding files in markdown"><figcaption></figcaption></figure>

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-72bac0e88a910e2ae9b058678fdeee109830d113%2Frelease-0654-embed-2.png?alt=media" alt="Live embed rendering"><figcaption></figcaption></figure>

### Actions

Actions are reusable prompt presets in the AI composer for workflows you run often. Use them for repeatable prompts like review, planning, research, or launching a sibling session with the right model already selected.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-551899325df861b1d4d8ff34d598f812899640c4%2Frelease-0654-actions.png?alt=media" alt="Actions in the AI composer"><figcaption></figcaption></figure>

### In-Nimbalyst Browser

Nimbalyst includes a native Chromium Browser surface for local previews, web apps, and agent-controlled browsing. Agents can navigate, click, type, inspect pages, and take screenshots when a workflow needs the web.

### Other New Features

* Built-in PR review mode (Cmd/Ctrl+U): browse, filter, diff, comment on, and approve/merge PRs using your existing gh login, or open a PR into a worktree with an agent session.
* Browser tabs for HTML preview (Cmd+Shift+B), plus browser tools that agents can drive.
* Auto session mode for Claude Code: safe actions run silently and only uncertain ones prompt, when workspace trust is set to "Allow All" and run AI classifier is enabled.
* Quick Open's Sessions tab can now search session contents.
* More support for clickable file paths in AI transcripts.
* Refresh button in the Files Mode sidebar header.

### Fixes

* Effort selector not always working.
* Voice mode connects again after OpenAI retired the Realtime Beta API (desktop and iOS).
* "Allow All" permission mode auto-approves everything again; the Claude Code safety classifier is now opt-in per project.
* No more Electron crash when a worktree produces a filesystem-event storm.
* Fixed the whole app freezing permanently after closing a terminal that had rendered emoji output.
* Auto-commit retries when another git process briefly holds the index lock, so concurrent sessions commit on the first try.
* In Multi-Project mode, a project's tracker list no longer shows another open project's items.
* Docs a session just created sync to mobile immediately, and their transcript links wait for the doc to sync instead of dead-ending.
* Renaming or moving a project no longer fails and rolls back on sqlite.
* Quick Open remembers your filter selections, and file-mask filters return matching results.
* The chat box no longer leaks keystrokes into a file an agent is editing.
* Session images can be copied; transcript images are zoomable, uncropped, and persist across reloads.
* Local markdown links open correctly, resolving relative paths from the current document.
* HTML preview renders again instead of a blank pane, and in-workspace files on Windows are no longer rejected over drive-letter casing.

***

## v0.63.9 - June 2, 2026

**Claude Opus 4.8, unified Quick Open, Session and Large Project Performance and Bug Fixes, Calc Sheets**

### Claude Opus 4.8 supported

### Unified Quick Open

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-c36a83b564f4033667ea134b6f1f6cfba06cd335%2Frelease-0639-quick-open.png?alt=media" alt="Unified Quick Open"><figcaption></figcaption></figure>

* Files, Sessions, Prompts, Projects, and Trackers now live in one tabbed launcher with better filters
* Cmd-O to open it in Files. Other Commands are listed in the launcher
* Quickly find the session, prompt, etc you were looking for

### Performance Improvements

* AI session performance is better under load. Streaming transcripts, background widgets, search, and long-running sessions put less pressure on the renderer, database, and sync pipeline.
* Startup and large-workspace responsiveness improved. Shared-tracker startup, prompt search, quick open, and other heavy paths do less blocking work.

### Calc Sheets

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-e1145bbc92f4eb25326dc2c313885df4ba27bd58%2Frelease-0639-calc-sheets.png?alt=media" alt="Calc Sheets"><figcaption></figcaption></figure>

New .calc.md documents combine spreadsheet-style results with plain-text editing, units, currency handling, and assertions.

### More Contextual Guidance

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-57187a78304ca86963db4a5883e5b23c82b322c8%2Frelease-0639-contextual-tips.png?alt=media" alt="Contextual tips"><figcaption></figcaption></figure>

Empty AI sessions and core surfaces now surface contextual tips for worktrees, trackers, shortcuts, themes, shared docs, mobile pairing, and more.

### Worktree AI flows are smoother

Worktree sessions now support manual vs smart commit mode, Commit with AI, and easier worktree-specific session search with `#worktree`.

### Fixes and Update

* AI edits to large markdown files with inline base64 images no longer trigger multi-minute beachballs.
* Tool calls no longer get stuck at "running" when multiple AI sessions are open.
* Parent workstream sessions now bubble up correctly when child sessions become active.
* New Worktree no longer stays disabled because of early git-probe races.
* Session history no longer pegs the renderer during heavy AI streaming.
* Theme readability issues were cleaned up across light and dark themes, including Calc Sheets error rows and primary-button label contrast.

***

## v0.60.1 - May 13, 2026

**Multi-project left rail, rename AI sessions, voice-mode, Codex parity, / skills, and tons of fixes**

### Nimbalyst's Mission

We want to make you as effective as possible as you work with coding agents like Claude Code, Codex. So we are building:

* Visual editors and task/session managers where you can work with your agents, see and approve what they are doing.
* Integration across agents, files, editors, trackers, and sessions
* Collaboration for builders working together with each other and agents. If you would like to be a design partner for collaboration, email me at <karl@nimbalyst.com>

### Multi-Project Left Rail

* A new Discord-style vertical rail lets a single Nimbalyst window host several workspaces side-by-side, with instant switching.
* Inactive projects stay warm: AI sessions keep streaming
* Cmd/Ctrl+1..9 activates the Nth project; Cmd/Ctrl+Shift+W closes the active one
* Turn this on in User Settings > Advanced > General

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-17b6f761090a64eb92419e9551e05df83d7e45e0%2Frelease-0601-multi-project-rail.png?alt=media" alt="Multi-project left rail"><figcaption></figcaption></figure>

### Rename AI sessions, Preferred Agent Language

* Sessions can now be renamed (right-click an existing session).
* A new "Preferred Agent Language" setting on the Agent Features panel steers AI-generated session names toward your chosen language for both Claude Code and other providers.

### Codex Parity and / commands

* Codex file\_change tool calls now render as inline red/green edit cards in the transcript, matching how Claude's Edit tool already renders.
* Codex slash command autocomplete and a unified slash-command picker across Claude Code and Codex.
* Skills and commands written for one agent run in the other; workflow discovery is unified across providers.
* Codex reasoning items map into transcript thinking blocks.

### Fixes and Update

Thank you to the Nimbalyst community for all the bugs, ideas, features, and PRs.

All the fixes in 0.60.1 can be found [here](https://github.com/nimbalyst/nimbalyst/releases/tag/v0.60.1). There are a lot.

***

## v0.58.14 - April 30, 2026

**OPEN SOURCE!! + Extensions + Opencode + more**

Nimbalyst v0.58.14 is here and we just open sourced Nimbalyst!!! As well the extension system is live. Try an extension. Build your own. We added OpenCode and Copilot as supported coding agents in Alpha.

### Nimbalyst is Open Source! Star us on GitHub!

* We want to build Nimbalyst with you and for our community.
* Our GitHub is <https://github.com/nimbalyst/nimbalyst>
* Please star the project so more people find it.

Licensing: the Nimbalyst desktop app and iOS app are MIT. See [LICENSING.md](https://github.com/nimbalyst/nimbalyst/blob/main/LICENSING.md) at the repo root for the full picture.

### Nimbalyst on Hacker News and X

* We launched Nimbalyst on Hacker News and X today
* Please like or retweet the X [thread](https://x.com/nimbalyst)

### Support for OpenCode, Codex via ACP, and Copilot

* **OpenCode:** Run OpenCode inside Nimbalyst with your own providers and models from opencode.json, including local LM Studio.
* **Codex (via ACP):** OpenAI's Codex CLI now can optionally run over the Agent Client Protocol.
* **Copilot:** GitHub Copilot CLI plugs into Nimbalyst as a coding agent alongside Claude Code, Codex, and OpenCode.

### Extension System

* The extension system is the core for Nimbalyst. Editors, file handlers, UI panels, and AI-facing features all plug in through the same extension lifecycle instead of being hardcoded into the core app.
* All of our core editors are actually built as extensions, and the marketplace is now open. Settings > Marketplace already includes Astro website editor, Mindmap, Slides, 3D Object editor, Namenym, and more.
* You can build your own visual, agent-native Nimbalyst extensions. Read the docs and ask the agent to help you scaffold one.
* The Extension SDK now declares `nimbalyst.minAppVersion` (0.58.5) so you can see the minimum host version per SDK release, and `@nimbalyst/extension-sdk` ships to npm with provenance on every tag.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-ee4fc87dbaf4118a906d1a7fca4a40b2635abf4f%2Frelease-05814-marketplace-1.png?alt=media" alt="Extension marketplace"><figcaption></figcaption></figure>

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-e5283920efb228a8d94ae81866925050ca245a1a%2Frelease-05814-marketplace-2.png?alt=media" alt="Extension marketplace listing"><figcaption></figcaption></figure>

### Alpha features like Voice Mode

* Alpha features show up in the UI with a (Alpha) next to them for you to enable and use if you want.
* Note they are more buggy. We'd love your feedback and if you are a developer, please help us improve them.
* Some Alpha features include: Voice Mode, Meta Agent, and the new Agents mentioned above

### Guided bug reporting from inside the app

Help > Send Feedback now spawns a Claude Code session that helps you draft a bug report or feature request, anonymizes the result, and files it on GitHub against the public repo.

There is no PostHog feedback survey anymore. If you can't file it on GitHub, email it to <support@nimbalyst.com>.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-81ec50b6bb66011c0fe586bddbc39dc8f6f57324%2Frelease-05814-feedback-widget.png?alt=media" alt="Feedback widget"><figcaption></figcaption></figure>

### Fixes and Update

* **Stable terminal bottom panel across reloads.** Preserves screen state and cursor, avoids destructive scrollback loss and panel hydration races.
* **AI red/green diff stays put on open files.** Two races could clobber the in-flight diff or apply the same tag twice, making green-addition decorations disappear while deletions still rendered red. Both paths now coalesce correctly so the diff in flight wins.
* **@@ session typeahead matches the session list visuals.** Renders the actual provider icon (Claude, OpenAI, Codex, etc.) for each referenced session instead of a generic chat bubble, with a colored phase badge matching the main session list.
* **Referenced/Edited file lists remember their collapsed state.** They used to reset to expanded on every chat remount; now persisted per gutter type to workspace state.
* **Monaco diff gutter glyphs render correctly.** The codicon font was failing to load, so +/- markers showed as tofu boxes on changed lines. Also restyles the diff gutter with faint line numbers, generous spacing, and clearer add/remove markers.
* **History dialog diff preview no longer hangs.** When a snapshot loads as null/empty or its metadata is missing, the spinner now clears instead of hanging indefinitely. The Rich/Raw view toggle is promoted to the top header for markdown files in both Diff and Full modes.
* **"Waiting for input" indicator survives mode switches.** Navigating away from Agent mode and back used to regress the question-mark indicator to a running spinner even when the AI was still blocked on user input.
* **AskUserQuestion drafts persist across unmounts.** Selections, the "Other" toggle, and "Other" text were lost when switching AI sessions or when the transcript's virtual scroller unmounted the widget off-screen. Now held in a per-prompt atom family.
* **@ mention picker shows recent files first.** When the AI input's @ typeahead opens with an empty query, recently viewed files appear instead of the alphabetical top-level listing. Once you type, fuzzy search takes over.
* **MIME types for chat attachments.** `.log`, `.ts`, `.py`, `.yaml`, and \~70 other text-based extensions are now recognized correctly.

***

## v0.58.3 - April 23, 2026

**Sessions Fix, Training Video**

Nimbalyst v0.58.3 is here with fixes for Session Resume and more.

### Fixes over the last week (3 small releases)

* Fixed Claude Code sessions not resuming when used with custom hooks
* Changing the custom Claude Code binary path in Settings now takes effect immediately without restarting the app.
* Put Opus 4.6 back into the app (was taken out when we added 4.7)
* Fixes for Codex not working for some users
* Linux AppImage issues fixed

### Video training on using Nimbalyst

If you are new to Nimbalyst, this 30 minute [YouTube video](https://www.youtube.com/watch?v=rwV5dxuC-Mo) is a good introduction.

***

## v0.56.17 - March 26, 2026

**Windows users redownload. Fixes for large images, Codex API key, Claude context usage count, excalidraw, spellchecker, and more.**

### Windows Users Need to ReDownload to Update!

Auto-updater fixed: Windows auto-update no longer rejects due to certificate mismatch. However, Windows users will need to go to <https://nimbalyst.com> and redownload and re-install Nimbalyst (after this the auto-updater will work). Your data will be preserved.

### Key Bug Fixes

* **Image paste for large files** - Claude Code large image attachments restored
* **Codex API key and subscription fix** - Removing a Codex API key now takes effect immediately; key is respected without breaking CLI auth; clear error messages on test connection
* **Claude context usage accuracy** - Updated claude-agent-sdk to v0.2.81, fixing inflated token usage reporting; context window indicator now correctly shows "1M" instead of "1000k". Fixed an issue where the wrong context size would be shown after subagents are used
* **Excalidraw** - Excalidraw is working again

### Improvements

* **Default to Opus 4.6 (1M context)** - New users start on Opus 4.6 with 1M context window; existing Opus users auto-migrate
* **Project quick open dialog** - Quickly switch between projects; Window menu discoverability improvements
* **Sleep prevention mode selector** - Choose between off, always, or when plugged in
* **Spellchecker toggle** - New setting to disable the spellchecker

### Fixes

* **Worktrees** - New worktrees no longer show a false rebase count
* **Claude Agent settings** - Setting toggles no longer collapse unexpectedly
* **Files panel** - "All Uncommitted Files" mode no longer shows committed session files
* **ExitPlanMode** - Now blocks for user confirmation instead of auto-allowing
* **OS file opens** - Now route to the frontmost workspace window

***

## v0.56.6 - March 19, 2026

**Opus/Sonnet 1M, /skills show up now, mobile app keep awake, planning mode fixes, perf/reliability**

### Improvements

* We now support Opus/Sonnet 1M
* Many of the mobile app issues were because people's desktop was going to sleep. You can now set a mobile app keep awake in the settings that will enable sync to continue.
* Plan mode had some problems. It has been re-implemented to just use what Claude Code and Codex do through the SDK.
* Slash command typeahead now shows all skills (user, plugin, and extension) after first response. \[Think we fixed this this time]
* Force-paste plain text without attachment conversion with Cmd+Shift+V
* Hide or show navigation gutter buttons via context menu
* PromptQuickOpen scrolls the transcript to the selected prompt

### Fixes

* Improved handling of large projects, reducing pauses
* MCP connections stay alive during long tool waits via SSE keepalive pings
* AI sessions with pending questions now resume correctly after app restart
* Sessions no longer get stuck as "running" after a git commit proposal
* AskUserQuestion no longer hangs when routed through the MCP server path
* Duplicate last message no longer appears when loading a session transcript
* Queued prompts now continue correctly after guarded turn completion
* File tree loading spinner no longer spins forever on empty workspaces

***

## v0.55.31 - March 13, 2026

**Mobile App for Nimbalyst!, Fixed skills and project startup, support Enterprise SSO**

We've just shipped Nimbalyst v0.55.31 with Mobile App support to remotely manage Codex and Claude Code sessions. We fixed Slash command typeahead, Claude skills in the slash command, speed of project startup for large directories, and mobile app sync stability. We support Claude Enterprise SSO.

### Need to redownload for Windows

Unfortunately, we missed a step in the migration to an improved signed version of Nimbalyst on Windows. Sorry about that!

If you are on Windows, auto-update won't work. You'll need to download the latest version of Nimbalyst from <https://nimbalyst.com/> and install it again. This is a one time problem and it will install in place, preserving your data and settings. Good news is the Windows install is much easier.

### Mobile App Support

Nimbalyst Mobile for Codex and Claude Code is now available, a companion app for your desktop workspace:

* Session dashboard: see which agents need you and which are still working
* Unblock agents: reply to questions via text or voice, agents resume immediately
* Visual diff review: swipe through changes, tap to approve
* Queue next tasks: keep the pipeline full, don't let agents sit idle
* Push notifications: agents tell you when they need you

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-de206793296bf0e76731f5b969774dee1963657e%2Frelease-05531-mobile.png?alt=media" alt="Nimbalyst mobile app"><figcaption></figcaption></figure>

### Improvements and Fixes

* Slash command typeahead now shows all skills (user, plugin, and extension) after first response
* Claude skills appear consistently in the slash command typeahead
* Improved speed of project startup for large directories
* Mobile app sync stability
* Claude Enterprise SSO is supported

### Fixes

* Deleted files, attachments, assets, and themes now move to system trash instead of permanent deletion
* Improved sessions getting stuck in 'running' state
* Codex MCP transport config conflicts resolved
* Provider/model mismatch in child session creation prevented
* Claude gutter usage indicator improvements
* Reduce duplicate notifications from Desktop and Mobile iPhone Mirroring
* "Keep All" now preserves content correctly when approving multiple diff replacements in sequence
* Diff markers no longer appear incorrectly on list items with bold text
* Dropdowns and popovers position more reliably across the app

***

## v0.55.25 - March 7, 2026

**OpenAI Codex improvements including GPT-5.4 support, @@ session mentions in a chat, and Windows code signing**

I did a 30 minute livestream of how to use Nimbalyst. If you want a tutorial and to know about all the features and shortcuts, watch on [YouTube](https://www.youtube.com/watch?v=0mKtYFbVZTE\&t=6s) or [LinkedIn](https://www.linkedin.com/events/7434634516851302400/).

### OpenAI Codex Improvements

* **GPT-5.4 model support** - full support for OpenAI's latest model
* **Configurable thinking level for Codex** - control thinking depth for Codex sessions
* **Interactive prompts** - AskUserQuestion now works in Codex sessions
* **Per-provider MCP servers** - enable MCP servers independently for Claude and Codex

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-d01d7a70b585d96f804e97a9fc783b02a8b0ab7e%2Frelease-05525-codex.png?alt=media" alt="Codex improvements"><figcaption></figcaption></figure>

### Session Mentions and References

* @@ typeahead in chat input to reference other AI sessions
* Drag-and-drop session mentions onto chat input
* Drag files as @-mentions from the file tree or edited sidebar into AI input

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-5f41bf536e0f368a1ca51c979f689482286cdaf9%2Frelease-05525-session-mentions.png?alt=media" alt="Session mentions"><figcaption></figcaption></figure>

### Workspace and Session Management

* **Worktree auto-archive** - skip confirmation when the branch is clean and merged
* **Session meta widget** - rich display of tag, phase, and name transitions

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-c09d4d9e29ed66e178435049b8207846e85e3302%2Frelease-05525-worktree-session.png?alt=media" alt="Worktree and session management"><figcaption></figcaption></figure>

### Windows

Code signing via DigiCert KeyLocker for Windows builds

### Improvements and Fixes

* Checkbox state changes no longer silently lost in diff mode
* Session provider icon correctly reflects the active provider
* Large session exports no longer freeze the app
* AI session state updates scoped to the owning workspace (no cross-workspace interference)
* AI file edits in gitignored directories now properly detected
* Selected session and workstream persist across app restarts
* Bulk archive correctly archives all selected sessions
* Table resizer crash on stale cell references fixed
* Fixed Monaco background for Monokai theme

***

## v0.55.9 - March 3, 2026

**Kanban for your sessions, Trackers for your Tasks, Fixed @ file, subagents and worktree perf**

We've just shipped Nimbalyst v0.55.9. This release brings Kanban for your sessions, trackers for your tasks, plans, etc (already had this but making it first class), a system tray icon, fixed @ mention files and fully fixed sub-agents.

For those who want to understand the full power of Nimbalyst (or just get more out of it :) I'm going to do a live demo, Thursday, March 5 at 11am Eastern. Follow and chat on [YouTube](https://www.youtube.com/watch?v=0mKtYFbVZTE) or [LinkedIn](https://www.linkedin.com/events/7434634516851302400?viewAsMember=true).

### Agent mode Kanban for Sessions

* Agent Mode now has a kanban board for your Sessions. (Cmd+Shift+K) with keyboard navigation, collapsible columns, and drag-drop between phases.
* Coding agent auto-tags your sessions and moves them through Kanban state
* You can tag them and move them as well

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-6576be71a6edf1cce98380399328458af778d811%2Frelease-0559-kanban.png?alt=media" alt="Kanban board for agent sessions"><figcaption></figcaption></figure>

### Tracker Mode

* We've had this for a while but are starting to integrate it first class. Its moved up to the top left.
* Add tasks and manage them and their state manually or in your agent chat.
* Use your tasks to keep track of your and your agents work.
* Have your agents initiate work based on your tasks

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-ba7f9cd8bc72dfa8869ff3d2b4ec448028ff35ab%2Frelease-0559-tracker.png?alt=media" alt="Tracker mode"><figcaption></figcaption></figure>

### System Tray Icon

System tray menu shows session status with click-to-navigate and dock badge for sessions needing attention.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-41387421706ffa8f618b4c6d1cd9f7d80b24f5a9%2Frelease-0559-tray.png?alt=media" alt="System tray session status"><figcaption></figcaption></figure>

### Major Fixes

* Sub-agent transcript display and tool name rendering fixed. We think this fully finally fixes sub-agents
* @ mentions shows files immediately on typing "@" and supports directory mentions with folder icon
* Performance improvements for worktrees

### Improvements and Fixes

* Unified session context menu across sidebar, kanban, and tabs.
* Project rename uses an atomic operation to prevent data loss.
* Session drag-drop onto a standalone session now creates a Workstream.
* Cmd+Shift+N shortcut to create a new AI session from any mode.
* "Start a new agent session" from documents are pre-populated with an @file reference to the document.
* Maximize button in the chat sidebar to open the current session in full agent mode.
* File count and +/- line stats shown in agent turn summary (e.g., "Finished in 6m 57s - 3 files +45 -12").
* Click/tap-to-copy on inline code blocks in transcripts with visual feedback.
* Rate limit warning and blocked state widgets with clear styling.
* Log rotation on startup to keep log files manageable.
* App update restart is deferred until all active AI sessions finish.
* Disabled AI providers no longer attempt model fetching on startup.
* Clipboard copy no longer fails silently in the editor.
* QuickOpen now supports folders to reveal folders in the file tree instead of failing to open them.

***

## v0.54.19 - February 26, 2026

**Codex GA, Sub-agent improvements, file-sharing improvements**

We've just shipped Nimbalyst v0.54.19. This release brings full Codex support, fixes to sub-agents, shareable sessions and markdown links.

### OpenAI Codex Integration

* Codex (OpenAI's coding agent) is now fully supported
* Codex in Nimbalyst now supports red/green diff
* Download the Codex CLI and login there

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-608c376db278c76be09156dc718b1f8cf90f783f%2Frelease-0541-codex.png?alt=media" alt="Codex provider in Nimbalyst"><figcaption></figcaption></figure>

### Sub-Agent and Teammate Fixes

* Teammates and sub-agents now have full lifecycle management in Nimbalyst
* See the work and track sub-agents and teammates as they go
* Permission approvals now work for tool calls inside teammates
* Improved large transcript performance for sub-agent-heavy sessions (faster load/render, less UI lag).

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-56d41e9662548c8bd632951b8412b605bbfd5be9%2Frelease-subagents.png?alt=media" alt="Sub-agents and teammates"><figcaption></figcaption></figure>

### File and Session Sharing

* Sessions and Markdown files can now be shared through a link
* Anyone with the link can view the file or session
* Data is encrypted by the URL, Nimbalyst can not see your data
* Requires a free Nimbalyst account

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-2c19e64b3c608b396bb0d565fc70fe3c839cd06f%2Frelease-share-links.png?alt=media" alt="Share link to a session or file"><figcaption></figcaption></figure>

### Improvements

* Added new session-context MCP tools so agents can query recent sessions, workstream overviews, session summaries, and workstream-edited files.
* Agent sessions can choose a model for git conflict resolution.
* File-to-tool-call matching is more stable and accurate.
* Session context menus are now consistent between grouped and plain session views.
* Usage indicators stay visible in more cases, including low usage and load-error scenarios.
* Shell-wrapped bash commands are unwrapped for cleaner file tracking and transcript display.

### Fixes

* Auto-commit UI now reports success correctly and avoids false staging errors.
* Failed MCP database queries no longer break later database operations.
* Process spawn EBADF failures no longer cascade into broader session failures.

***

## v0.53.13 - February 19, 2026

**Sonnet 4.6, Codex Beta, shareable links for markdown/sessions, performance improvements**

We've just shipped Nimbalyst v0.53.13. This release brings Claude Sonnet 4.6 support, shareable session and markdown links, multi-agent fixes, Codex support in Beta, and performance improvements.

### Claude Sonnet 4.6 support

### Shareable Session Links

* Share AI sessions and markdown files as links
* Right click on a session or markdown and select share link
* Paste the link into slack, X, email to share
* NOTE: Anyone with the link can see your session or markdown file
* Requires creating a free Nimbalyst account

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-2c19e64b3c608b396bb0d565fc70fe3c839cd06f%2Frelease-share-links.png?alt=media" alt="Shareable session links"><figcaption></figcaption></figure>

### Sub-Agent and Teammate Fixes

* Extension MCP tools now load in worktree sessions
* Teammate/background agent output no longer leaks into main transcript
* Asynchronous sub-agents and teammates now have their lifecycles managed properly

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-56d41e9662548c8bd632951b8412b605bbfd5be9%2Frelease-subagents.png?alt=media" alt="Sub-agent and teammate fixes"><figcaption></figcaption></figure>

### OpenAI Codex Integration (BETA)

* Go to Settings > Beta features and toggle these on if you want to use them
* Full SDK-based Codex provider
* Has most Nimbalyst features
* Does NOT yet support red/green diff, change tracking

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-76af1695c792ef07bf7c6b1932b4dbc2c685d186%2Frelease-0531-codex-beta.png?alt=media" alt="Codex beta features toggle"><figcaption></figcaption></figure>

### New Features

* Auto-approve option for git commit proposals
* Auto-continue AI sessions after restart
* Enhanced quick open dialogs with cross-dialog navigation and file search
* New file creation rendered as syntax-highlighted preview instead of all-green diff
* Elapsed time shown at end of completed agent turns

### Performance

* Virtualized session list for faster startup with many sessions
* Session list items no longer re-render unnecessarily
* Various other performance improvements for long session lists

### Improvements

* File tree moves to the right file better
* Edit tool now shows red/green diffs after agent refactoring
* Drag-and-drop standalone sessions into workstreams
* Git commit widget shows actual commit date instead of render time
* @ mention file search now finds all workspace files
* Transcript scroll-to-bottom button now clickable
* Ctrl+\` terminal shortcut works correctly on macOS
* Frontmatter UI appears immediately after Set Document Type
* Claude Code subprocess now receives full shell environment
* Global-scoped extension tools visible without an active file
* Excalidraw MCP tools always visible to Claude Code agents
* Dark mode variants now apply correctly to descendant elements

### Other Fixes

* Sessions with more than 5000 messages now load fully
* Worktree path used correctly for git commit operations
* CRLF line endings normalized in markdown import (fixes mermaid/code block parsing)
* Database browser cell modal closes on Escape key
* Blocking prompt icon clears after commit and shows correctly in groups
* Prevented bulk sync from clobbering isExecuting and lastReadAt state
* Debounced session data reload during active streaming to prevent flickering
* YAML frontmatter stripped from markdown new-file previews

***

## v0.52.60 - February 6, 2026

**Claude Opus, Agent teams, and bug fixes**

We've just shipped Nimbalyst v0.52.60.

### Major New Features

* Claude Opus 4.6 model support added
* Agent Teams - Claude Code sessions can now spawn teammate agents with distinct progress indicators, enable this in the Claude Agent settings

### New Features

* Effort level selector for Opus 4.6 sessions to control reasoning depth
* Claude Usage indicator with pace tracking to monitor API costs
* Worktree merge now allows uncommitted changes
* OS notifications when AI sessions are blocked waiting for user input
* Smart commit detection for worktree rebase using git cherry

### Improvements

* Large text attachments handled more efficiently in context window
* Worktree rebases use file-level conflict detection
* Diff/Full view toggle in file history dialog
* Pending-review dot indicator replaces the Keep All banner in git repos
* Inline rename for worktrees and sessions
* Deleted and renamed files shown in uncommitted files list

### Fixed

* Transcript search fixed
* Git panel refresh on session completion and visibility
* File rename now updates open tabs correctly
* Keyboard shortcuts no longer interfere with terminal input on macOS
* Worktree merge errors now show a dialog instead of failing silently
* Session cancellation properly stops SDK and rejects pending interactions
* Attachment previews now center on screen
* Terminal no longer crashes when stored CWD points to a deleted directory
* Clicks no longer blocked after Claude Code login
* Tool permission widget renders correctly for compound Bash commands
* Terminal cursor position no longer corrupts when switching tabs

***

## v0.52.40 - February 5, 2026

**Bugs (Context, DB, Plan) + Developer Features (Terminal, Git, Worktrees) + Workstreams, Edit Files in Agent Mode**

We've just shipped Nimbalyst v0.52.40.

For developers, this release brings an embedded ghostty terminal, worktrees, and much better git integration. To enable these, select Developers on the Pop Up.

If you don't see the pop up, go to Settings > Advanced in Nimbalyst.

For everyone, we fixed context size, database errors, plan mode and other bugs and we now support workstreams, editing files in agent mode, Claude on Vertex/Bedrock, and more.

### Key Bug Fixes

* **Excessive context** - Fixed a bug where full file context was being passed on each query for some users
* **Database corruption** - Resolved corruption issues (especially on Windows) and fixed auto-restore from backup
* **Plan mode alignment** - /plan now activates Claude Code's native plan mode
* **Message loss** - Fixed rare issue where sessions would lose messages
* **Cancel button** - Fixed rare issue where ESC key and red X wouldn't appear to cancel a session

### Terminal

* Open up a terminal (or multiple in Nimbalyst) in our dedicated ghostty terminal with its own storage for sessions
* If you are using worktrees, each worktree has quick access to its own terminal
* If you don't see the Terminal at first, refresh the App (Command R)

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-152ad739b79c4d9fc30c846702ab7bb89cf2994b%2Frelease-0524-terminal.png?alt=media" alt="Embedded ghostty terminal"><figcaption></figcaption></figure>

### Git Integration

* Git file status colors for AI changes with auto-grouping of files touched in a session, workstream, worktree
* Interactive, Claude-generated git commit proposals and manual git commits.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-590eb0ef0d9e226624cff4779ab4426a313599ff%2Frelease-0524-git.png?alt=media" alt="Git integration"><figcaption></figcaption></figure>

### Worktrees

* Git worktrees for isolated AI sessions. Work in multiple branches simultaneously
* Worktree rebase with uncommitted changes and auto-stashing support

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-618b8236412d5acc79da72fb6021397bcc0fcfd2%2Frelease-0524-worktrees.png?alt=media" alt="Git worktrees"><figcaption></figcaption></figure>

### Workstreams

* Group sessions working on the same files together.
* Convert your session into a workstream with multiple sessions by clicking + to add a session tab

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-36506b840dec5244dd28fcb4021158ec5f0083df%2Frelease-0524-workstreams.png?alt=media" alt="Workstreams"><figcaption></figcaption></figure>

### Edit Files in Agent Mode

* Open files that the agent has read or edited in a central panel in the context of your session or worktree
* Hide or adjust files panel, open multiple files in tabs, edit the files

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fs5JJaGk7uCFMOPl7V0Bb%2FFiles%20in%20Agent.png?alt=media&amp;token=b3ed9bdb-4d16-4a87-b98c-91a8920d42e4" alt="Editing files in agent mode"><figcaption></figcaption></figure>

### Collapse left & right panel

* Collapsible left panels - Click the icon or use the keyboard shortcut again to toggle the left sidebar for editor space
* Collapsible right panel - Clicking on AI icon or Cmd+Shift+A toggles AI chat panel

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-6ffa666dcd07389fae9bd5420f621e3d8e87df57%2Frelease-0524-collapse-panels.png?alt=media" alt="Collapsible side panels"><figcaption></figcaption></figure>

### Platform and Language Support

* Claude on Vertex AI - Use Claude models through Google Cloud
* Claude on Amazon Bedrock - Use Claude models through AWS
* Apple Intel (x64) architecture now supported
* Windows backslashes in Files sidebar filename display
* Linux node-pty packaging fixed
* Enter key no longer sends message during IME composition (Japanese, Chinese, Korean input)

### Performance

* MCP tool search - Search through available tools in Claude Code sessions
* Performance monitoring interval increased to reduce overhead
* AI Session content search sped up with FTS indexing

### Stability

* Sessions no longer incorrectly show as running after errors
* Prevent infinite render loop and UI freeze on Windows
* Fixed Claude Code resource cleanup on destroy

### Sessions

* Pasted text starting with '#' no longer activates memory mode

### Agent Mode

* Session linked local history - Track changes by each session that made them
* Custom Bash tool widget - Terminal-style display for command execution
* Show AI errors in transcript - Errors now visible instead of silent failures


# Markdown (WYSIWYG)

Nimbalyst is a WYSIWYG AI markdown editor. Write visually while plain .md files stay on disk, with agent editing built into the same document.

The Markdown editor is Nimbalyst's main writing surface. You see formatted text as you type, while the file on disk stays a plain `.md` file that Git, other tools, and your AI agent can all read. Use it for docs, specs, plans, notes, and anything else you write in markdown.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-c78c61d2568f1cc2c9e3a054ace82bb760b96929%2FSlash%20Commands-1%20(3).gif?alt=media" alt=""><figcaption><p>A workspace with the file tree on the left, the document area in the center, and the agent panel with suggested slash commands on the right.</p></figcaption></figure>

### Why Nimbalyst as a Markdown Editor?

* **True markdown files** on disk, edited visually
* **Unified content**: text, tables, code, lists, images, and embedded visual editors in one document
* **AI-integrated**: agents see your documents and can research, write, edit, and code alongside you
* **Fast, minimal interface** built for distraction-free writing

The [markdown editor feature page](https://nimbalyst.com/features/markdown-editor/) has a fuller walkthrough of WYSIWYG editing with agents.

### Important Commands

* **@** references a file in the document or in chat. Supported custom-editor files (mockups, Excalidraw, data models, CSV, and others) embed as live frames when the link is on its own line; see "Embedding Custom-Editor Files" below.
* **/** opens the menu of insertion options: tables, Mermaid diagrams, tracker items, and more.
* **#** creates a tagged tracker item (bug, task, plan, idea) inline.
* Selecting text shows a **toolbar** with quick formatting options.
* Standard **markdown syntax** works as you type.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FwlRCXOFONAHjdMIBmyQh%2F1.png?alt=media&amp;token=dd138168-d92e-4650-832d-3b2969013fbd" alt=""><figcaption><p>An annotated overview: the file tree on the left, a document with a red/green AI diff and its review bar in the center, and the agent chat on the right.</p></figcaption></figure>

### File and Editor View

Open any markdown file from the file tree and edit it as a formatted document.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FTIlVofVukcGZbhBEwHy0%2Fimage.png?alt=media&amp;token=eaf65858-a95d-4101-886f-78e9b3acdd82" alt=""><figcaption><p>A markdown plan document open in WYSIWYG view, with the workspace file tree on the left and other documents in tabs.</p></figcaption></figure>

### WYSIWYG and Raw Markdown

Toggle between the formatted view and raw markdown using the three-dot menu at the top right of the document.

<div align="left"><figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fn8jg6jkfQ9uzuen4EEMc%2Fimage.png?alt=media&amp;token=9bb20874-d7cc-43a3-bd9c-481b08f8baae" alt="" width="227"><figcaption><p>The three-dot menu with Toggle Markdown Mode, View History, and Copy as Markdown.</p></figcaption></figure></div>

### Text

Common markdown shortcuts:

* **Headings:** `#` plus a space for H1, `##` plus a space for H2
* **Lists:** `-` or `*` plus a space; Tab to indent
* **Numbered lists:** `1` plus a space
* **Links:** select text and click the link icon in the toolbar
* **Quotes:** `>` plus a space; nest with `>>`
* **Code blocks:** type `/` and insert
* **Horizontal rule:** type `---`
* Inline formatting like `**bold**` and `*italic*` works as you type

### Tables

![](https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FlLnecLXnnlGvdRL3AUBO%2FTables.png?alt=media\&token=ebf7c164-00e6-47b0-b645-056805b2859e)

Create a table by typing **/** and choosing Table.

<div align="left"><figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FQG20xf52o03PY2cCaAnE%2Fimage.png?alt=media&amp;token=d87f69ba-96ce-4932-b38d-1c3924f6379f" alt="" width="286"><figcaption><p>The slash menu, with plugin items such as Mermaid Diagram and tracker items, and the Tables section below.</p></figcaption></figure></div>

Format a table by clicking the down arrow on a cell.

<div align="left"><figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fe6csTABDtoqAzKj7W5to%2Fimage.png?alt=media&amp;token=8af305ac-6b8e-4a63-8ad6-a6e086201dbb" alt="" width="259"><figcaption><p>The table menu with options to insert or delete columns and rows, delete the table, and remove the row header.</p></figcaption></figure></div>

### Embedding Custom-Editor Files

A markdown document can render other workspace files inline as live frames. Drop a link to a file like `.mockup.html`, `.excalidraw`, `.prisma`, `.csv`, or any other custom-editor file on its own line and Nimbalyst upgrades it into an embedded editor in WYSIWYG view.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-509d43c6f47bd216c1cd61c40a0450cad836aa6f%2FEmbed%20Custom%20Editor%20Files%20Dark.png?alt=media" alt="A markdown spec with a mockup and an Excalidraw diagram embedded inline below their @-references"><figcaption><p>A markdown spec with a mockup and an Excalidraw diagram embedded inline.</p></figcaption></figure>

How it works:

* Type `@` to pick a file. If the file is a supported custom-editor type and the link ends up alone in its own paragraph, it auto-upgrades to an inline embed.
* You can also paste a normal markdown link like `[my mockup](./docs/api.mockup.html)` on its own line.
* The embedded frame is the real editor for that file. Edit it in place and the change saves back to the file on disk.
* Multiple users see embedded edits stream in live when the document is shared.

Switch to raw Markdown view (the three-dot menu at the top right) to see the underlying link. The link round-trips: write a link in raw view, switch to WYSIWYG, and it becomes a live frame.

### AI Editing in Shared Collaborative Documents

When you are editing a shared document in collaboration mode, the right-pane chat sees and edits the active document the same way it does in Files mode. Edits route through Yjs, so other connected users see them stream in live. The familiar accept/reject bar appears for pending AI edits, just like in single-user editing.

You don't need to do anything special to turn this on. Open a shared document, ask the agent to edit it, and the changes flow into the document for everyone in the session.

### Anchor Links to Headings

Clicking a Markdown anchor link like `[Section](#section)` scrolls the document to the matching heading.

### Export to PDF

Markdown documents export to PDF with the document title and an outline generated from your headings. Exported files are bookmarked at each heading and the title shows up in PDF readers.

### Undo and Redo

* **Cmd+Z** to undo
* **Cmd+Shift+Z** to redo


# Find & Replace and ToC

Use Cmd+F find and replace plus the auto-generated table of contents to move around long markdown documents in Nimbalyst without scrolling.

Two tools help you move around a long markdown document: find and replace for locating specific text, and the auto-generated table of contents for jumping between sections.

### Find & Replace

Press **Cmd+F** to open the find bar. It shows a match count, lets you step through matches, and expands to replace one match or all of them.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FLtGzeVHH4lbD7EPwwaMm%2Fimage.png?alt=media&amp;token=86a73503-a887-4b84-aea4-da15a36ec879" alt=""><figcaption><p>The find bar showing a search with its match count, plus a replacement field with Replace and Replace All buttons; matches are highlighted in the document.</p></figcaption></figure>

### Table of Contents

Nimbalyst generates a table of contents from your document's headings. Open it from the outline icon at the top right of the document, then click a heading to jump to that section.

<div align="left"><figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FMRFnzV1zoAyD7DZNKMUZ%2Fimage.png?alt=media&amp;token=3fc89a77-00f5-4b8f-a2bf-52e2446205d9" alt="" width="287"><figcaption><p>The table of contents popover listing the document's headings as a nested, clickable outline.</p></figcaption></figure></div>

More editor features are on the [markdown editor page](https://nimbalyst.com/features/markdown-editor/).


# AI Editing, Red/Green Diff, Approval

How AI editing works in Nimbalyst documents. The agent writes its changes to the file and Nimbalyst shows them as a red and green diff so you can review each one and keep it or revert it.

When an agent edits a document, Nimbalyst shows every change as a red and green diff right in the editor, so you review the work visually instead of in a terminal. This page covers how to request edits, how the diff review works, and what the agent knows about your document.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-26b772757b4b548a399f20e90fe64eb48c397cae%2FRed%20Green%20Diffs-1%20(1).gif?alt=media" alt=""><figcaption><p>An agent editing a markdown plan: the edit tool call and the edited-files list appear in the agent panel on the right while the document updates in the center.</p></figcaption></figure>

### The Agent Panel

The agent panel runs on the right side of your document view.

<div align="left"><figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FABR62Xs1oIr9dxK8hcT9%2Fimage.png?alt=media&amp;token=0559bb76-95f0-4022-bdd5-2271ea76bff9" alt="" width="375"><figcaption><p>An empty agent panel: the mode badge and provider dropdown sit above the message input, with a New button at the top right.</p></figcaption></figure></div>

* Open the panel with the AI icon, or toggle it with **Cmd+Shift+A**
* Select an AI provider from the dropdown and type your message
* Click **+ New** to start a fresh session with fresh context
* Paste attachments or images into the chat

**Chat without editing.** You can converse in the panel without touching your document. Use this to research, explore, and learn.

**Requesting edits.** Ask the agent to modify the document: "Add a section about X", "Rewrite this paragraph."

**Streaming edits.** Changes appear in the document as the agent makes them, highlighted as a visual diff, and a review toolbar appears. The agent writes each change to the file as it makes it; the diff is where you review afterwards. If you want to approve edits before they are written, use a [permission mode](/open-safe-private-secure/permissions-and-safety) that asks first, such as **Ask every time**.

**Plan mode and Agent mode.** Plan mode limits the agent to editing and creating markdown files; Agent mode gives it the full power of its tools. Click the Plan or Agent badge to toggle modes.

### Red/Green Diff

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2F9UDZgNxucSUCdRpStzly%2Fimage.png?alt=media&amp;token=ba590229-c061-4622-b96a-a99321280028" alt=""><figcaption><p>The review bar above a document, showing the change counter and buttons to act on one change or all of them; deletions are highlighted red and additions green in the text below.</p></figcaption></figure>

* Additions show with a green background, deletions with red
* Keep or revert all changes at once, or step through them one by one
* Clicking a change or the arrow buttons selects that change and scrolls to it

#### What Keep and Revert do

The diff is a review surface for changes the agent has already applied, not a hold queue in front of them.

* When the agent edits a document, the change is written to the file on disk right away. Git, pre-commit hooks, and anything else watching the folder see it immediately.
* **Keep** marks the change reviewed and clears the red and green highlighting. The file contents do not change.
* **Revert** restores the previous contents from file history and writes them back to disk, then records a history snapshot of the restored version.
* Leaving the bar alone keeps the change. Closing the document without deciding is the same as keeping it.

Nimbalyst keeps a version history of every AI edit, so a change you revert can still be recovered from the document's history.

#### Tell the agent when you revert

Reverting in the editor is not reported back to the agent session. The tool call already returned success at the moment the write happened, so the agent goes on believing its edit is in the file, and its next edit may be written against text that is no longer there.

If you revert an agent change and plan to keep working in the same session, say so in the chat, for example "I reverted your last edit to notes.md, the file is back to its previous contents." The agent then re-reads the file and works from what is actually on disk.

To reject a change in a way the agent participates in, deny the action when it asks. This requires a [permission mode](/open-safe-private-secure/permissions-and-safety) that prompts before edits.

### Agent Context & Conversations

The agent is passed, and understands, this context:

* **Document context**: the current file's content
* **Workspace context**: the file tree and related files
* **Session context**: the conversation history

When conversing, the agent automatically includes the open document. Reference other files by typing **@**, and include images or code snippets directly in your message. Being specific helps: "Looking at the function in file.ts..." works better than a vague pointer.

#### Context Window

The token indicator (for example, 18k/200k) shows how much of the session's context window is used. As you approach 100%, click **+ New** to start a fresh session.

<div align="left"><figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2F5NT5d8ytkU2fvvy4i1dY%2Fimage.png?alt=media&amp;token=d57e51a0-490e-4a96-bd2e-0ae4a0e84b95" alt=""><figcaption><p>The composer showing the mode badge, the provider dropdown, and the context window indicator reading 18k/200k tokens (9%).</p></figcaption></figure></div>

### AI Tool Calls

The agent can invoke tools to act beyond text generation: file operations (read, write, search), code analysis and execution, web research, and data processing. Tool results appear in the chat with special formatting.

#### Show Tool Calls in Chat

By default, every tool call the agent makes appears as a row in the transcript. To hide them entirely (not just collapse them), turn off **Show Tool Calls in Chat** under **Settings > Application > Agent Features**. Interactive prompts, such as permission requests, plan-mode exits, commit proposals, and questions the agent asks you, still appear so you can always respond.


# Set Document Type

Set Document Type turns a markdown document into a tracked Plan or Decision from the editor's Actions menu, without hand-writing YAML frontmatter.

**Set Document Type** promotes the markdown document you are looking at into a tracked item. Pick a type and Nimbalyst writes the tracker frontmatter for you, the tracker header appears at the top of the document, and the document starts showing up on the kanban board alongside everything else in your tracker.

It is the one-click version of the [YAML frontmatter](/task-management/creating-items) route to creating a tracker item.

### Where to find it

Open the **three-dot Actions menu** at the top right of a markdown document and hover **Set Document Type**. A submenu lists the available types.

The action is available when all of the following are true:

* The file is a markdown file (`.md`)
* You are in WYSIWYG view, not raw Markdown view
* The document is not already owned by a tracker item. In the tracker's own document view the type lives on the record, so the menu item is hidden

The same submenu is on the floating document actions button inside the editor.

### The available types

Two types are offered:

| Type         | Icon           | What it is for                                                                   |
| ------------ | -------------- | -------------------------------------------------------------------------------- |
| **Plan**     | Flag (blue)    | A larger initiative with a status workflow and a progress percentage             |
| **Decision** | Gavel (purple) | An architectural or product decision, with the chosen option recorded as a field |

These are the two built-in types designed to live as a whole document rather than as a row on a board. Bugs, tasks, features, and ideas are usually short enough to belong in the tracker itself, so they are not offered here. See [Creating Items](/task-management/creating-items) for those.

### Other types, and asking the agent

The submenu is limited to Plan and Decision, but the underlying mechanism is not. Any tracker type can own a whole document as long as its definition sets `modes.fullDocument: true`, so you can ask the agent for the ones the menu doesn't list:

> "Make this document a milestone" "Turn this into a customer-feedback item"

The agent writes the `trackerStatus` frontmatter, and the tracker picks the file up on its next scan exactly as if you had used the menu. It can also create the type first — ask it to define a custom tracker type and it writes the YAML into `.nimbalyst/trackers/`. See [Custom Tracker Types](/task-management/custom-tracker-types).

Among the built-ins, **Milestone** and **Release** are full-document types too, so both work when asked for by name even though they are absent from the menu.

{% hint style="warning" %}
Asking for a type that is inline-only (Bug, Task, or Idea) is a quiet no-op. The frontmatter lands in the file and looks right, but the tracker ignores it and the document never appears on the board. The same is true of a custom type whose YAML leaves `fullDocument` at `false`. If you asked for a type and nothing showed up, check `modes.fullDocument` in that type's definition.
{% endhint %}

### What it does to the document

Choosing **Plan** writes a `planStatus` block at the top of the file with the plan's default fields:

```yaml
---
planStatus:
  planId: "plan_1740000000000_a1b2c3"
  title: ""
  status: "draft"
  planType: "feature"
  priority: "medium"
  progress: 0
  owner: ""
  stakeholders: []
  tags: []
  created: "2026-08-24"
  updated: "2026-08-24T00:00:00.000Z"
---
```

Choosing **Decision** writes a `decisionStatus` block with the decision fields (`decisionId`, `status`, `chosen`, `priority`, `owner`, `stakeholders`, `tags`).

Once the frontmatter is there:

* A tracker header appears at the top of the document showing the type's fields. Edit status, priority, owner, and the rest from that header.
* The item appears in the tracker panel and on the kanban board.
* Edits flow both ways. Change the status in the tracker UI and the file updates; change it in the file and the tracker updates.
* The document is marked dirty and autosave writes it to disk.

Switch to raw Markdown view from the same three-dot menu to see the frontmatter block directly.

### Changing or removing the type

Reopen the submenu at any time. The current type carries a checkmark. Picking the other type converts the document.

When a type is set, a **Remove Type** entry appears at the bottom of the submenu. It strips the tracker frontmatter and the document goes back to being an ordinary markdown file, dropping off the board.

{% hint style="warning" %}
Setting a type replaces the document's entire frontmatter block, and **Remove Type** deletes the entire frontmatter block. Any other keys you keep up there (a `description`, tags used by a static site generator, anything an extension reads) are lost. If your document has frontmatter you care about, copy it somewhere first, or edit the `trackerStatus` block by hand in raw Markdown view instead.
{% endhint %}


# Mermaid Diagrams and Images

Insert and edit Mermaid diagrams and images inside Nimbalyst markdown documents, by hand or by asking your AI agent to generate the syntax.

Markdown documents in Nimbalyst can hold rendered Mermaid diagrams and images alongside your text, so a spec or plan carries its own visuals. You can insert either by hand or by asking your agent.

### Mermaid Diagrams

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-077d6b07217d3dc18ffa9adb7c79d0a564da6887%2FMermaid%20in%20Nimbalyst%20(1).gif?alt=media" alt=""><figcaption><p>A markdown document open beside the agent panel, where the agent's edit to the document is applied and reviewed.</p></figcaption></figure>

**Manually**: type **/** in WYSIWYG view and insert a Mermaid Diagram, then click **Edit** on the diagram block to edit the Mermaid syntax.

**With AI**: ask the agent to create a Mermaid diagram in the document, then edit it manually or keep iterating on it in chat.

Diagram types include:

* Flowchart
* Sequence diagram
* Gantt chart
* Class diagram
* State diagram
* Entity relationship

See the [diagrams feature page](https://nimbalyst.com/features/diagrams/) for how teams use Mermaid and Excalidraw together, and [architecture diagrams](https://nimbalyst.com/use-cases/architecture-diagrams/) for a worked example.

### Images

<div align="left"><figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FnXMLAZkpN6LfCCPy25VW%2FImages.png?alt=media&amp;token=ccb13634-d660-4753-8d9c-cc2a5bd9a624" alt="" width="375"><figcaption><p>A document in dark mode with an embedded architecture image rendered under an Images heading, above a feature table.</p></figcaption></figure></div>

Paste or insert an image into a document and resize it in place. Nimbalyst stores the image in an assets folder next to the markdown file and writes a normal markdown link to it, so the document stays portable.


# Mockups

Build HTML mockups in Nimbalyst using your docs, code, and sessions as context, then hand the same mockups to your agent to implement.

A mockup is a visual design for a screen, stored as a real HTML file (`.mockup.html`) in your project. Because your agent builds mockups with your docs, code, and sessions as context, and the result is plain HTML and CSS, the same file works for designing a feature and for implementing it. No copy/paste between a design tool and your codebase.

See the [mockups feature page](https://nimbalyst.com/features/mockups/) for how mockups feed back into implementation, and [UI mockups](https://nimbalyst.com/use-cases/ui-mockups/) for a full example.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-2ca4495fef111b14ae972e1b230a21bc7d3e1ea6%2FCreate%20and%20Edit%20Mockups.gif?alt=media" alt=""><figcaption><p>Creating a mockup from the agent chat with the /mockup command, using the open document as context.</p></figcaption></figure>

### Create a Mockup

1. Select **New > New Mockup**, or type `/mockup` in the chat.
2. In the agent chat, describe the mockup you want created.
3. Reference documents with **@**, and paste images or screenshots into the chat for the agent to work from.

### Edit the Mockup

Click a `.mockup.html` file to open it in the mockup editor.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FSPJYNzOb4qnYSrEffLzO%2F2.png?alt=media&amp;token=33b72743-0c51-4ea7-bac9-6f6e1545bc3b" alt=""><figcaption><p>The mockup editor showing a sign-up form mockup with a hand-drawn red annotation circling two fields, drawing tools in the toolbar, and the agent chat on the right.</p></figcaption></figure>

Edit it in three ways:

* Directly in the HTML
* By selecting an element and asking the AI to modify it
* By drawing annotations on the mockup and then asking the AI to make the change you marked

### Multi-Screen Flows

Put multiple mockup screens on a [Project Canvas](/visual-editors-powered-by-ai/canvas) to design a complete flow: checkout, onboarding, settings, or anything else that spans more than one screen.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-0043861b4b2fd392b0a03d0f76a641ddb670c597%2FMockup%20Projects%20Canvas.png?alt=media" alt=""><figcaption><p>A mockup project canvas holding four screens connected by labelled arrows, with Add Screen and Auto Layout buttons in the toolbar.</p></figcaption></figure>

On the canvas:

* Drag screens around to arrange them spatially
* Draw connections between screens to show navigation flow, and label them (click, hover, navigate)
* Add existing `.mockup.html` files as live file cards
* Ask the agent to create the screens and arrange them for you
* Click into a card to edit the mockup in place

Project boards are stored as `.canvas` files. Older `.mockupproject` files open in a compatibility view that can convert them to the current Canvas format.

### Insert a Mockup into a Markdown Document

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2F3UWY1k5rh9Vo7t3k9XgN%2FInsert%20mockup%20into%20a%20document%20(1).gif?alt=media&amp;token=401af74d-34c8-433a-ac60-6d56fa65645e" alt=""><figcaption><p>A markdown document with a mockup embedded inline, edited alongside the agent chat.</p></figcaption></figure>

Type **/** in a document and insert a mockup. Click the embedded mockup to edit it in place.

### File Type and Storage

Mockups are `.mockup.html` files. By default new mockups are saved under `nimbalyst-local/mockups/` in your project, but you can keep them anywhere.

## Working with the AI

### Tips for Better Results

* **Be specific about layout**: "Two-column layout with 30% sidebar" beats "add a sidebar"
* **Reference known products**: "Style it like the Stripe dashboard" gives the AI a clear design reference
* **Describe interactions**: "When hovering over a row, show a blue highlight and a delete icon on the right"
* **Iterate in small steps**: make one change at a time so you can evaluate each iteration

### What the AI Sees

When you ask the AI to edit a mockup, it:

1. Captures a screenshot of the current rendered mockup
2. Reads the HTML source code
3. Sees any annotations you've drawn
4. Understands which element you've selected (if any)

This multi-modal context means you can say "make the thing I circled bigger" and the AI knows what you mean.

### Design-to-Code Workflow

Mockups are real HTML and CSS, which makes them a useful bridge between design and implementation:

1. **Design in mockups**: iterate on the visual design with AI assistance
2. **Review with stakeholders**: share the rendered mockup for feedback
3. **Extract patterns**: use the mockup's HTML/CSS as a reference when implementing the production UI
4. **Maintain alongside code**: keep mockups updated as the product evolves

## File Format

Mockups use standard HTML with inline CSS. No build tools or frameworks required.

```html
<div style="font-family: system-ui, sans-serif; max-width: 800px; margin: 0 auto;">
  <header style="padding: 16px; border-bottom: 1px solid var(--nim-border);">
    <h1 style="color: var(--nim-text);">Settings</h1>
  </header>
  <main style="display: flex; gap: 24px; padding: 24px;">
    <nav style="width: 200px;">
      <!-- Sidebar content -->
    </nav>
    <section style="flex: 1;">
      <!-- Main content -->
    </section>
  </main>
</div>
```

Using `var(--nim-*)` CSS variables ensures your mockup adapts to light and dark themes automatically.


# Canvas

Project Canvas is an infinite board whose cards are live editors for real files. Lay out a plan, a diagram, and a flow of mockups side by side and edit any of them in place.

Nimbalyst Project Canvas is an infinite board for `.canvas` files. Every card on it mounts a working editor for a file in your project: a mockup card renders the mockup, a diagram card renders the diagram, and a markdown card renders the document. Cards are live, not screenshots or thumbnails.

Use a canvas when the arrangement is the point: the screens of a flow in order, the documents in a workstream, a design review board, or a project overview that mixes several kinds of file at once.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-a4b252966fc44dc86b8a094503e3f34b7f8c3cc3%2Feditor-canvas.png?alt=media" alt="A Project Canvas board showing a markdown plan, an Excalidraw architecture diagram, and three UI mockups laid out as a flow, wired together with labelled arrows and annotated with two sticky notes"><figcaption><p>One board holding a plan, a diagram, three mockups, and the open questions about them. Every card is the live editor for that file.</p></figcaption></figure>

## What Goes on a Board

* **File cards** mount any file type Nimbalyst has an editor for: markdown, mockups, Excalidraw, mind maps, data models, spreadsheets, CSV, code
* **Shared document cards** point at a document your team already shares, so the board works for everyone who has access
* **Sticky notes** for the questions and decisions that belong next to the work rather than inside it
* **Text and image cards** for headings, captions, and reference images
* **Frames** to group a set of cards under a label and move them together
* **Arrows** between cards, with labels, to show the order the screens run in or what depends on what

## Editing in Place

Click into a card and you are editing the file itself. Save from inside the card and the change lands in the file on disk, and every other place that file appears updates with it: the tab you had open, another board pointing at the same path, and any document that embeds it.

Cards mount their editor when the board is zoomed in far enough to read them, and fall back to a lightweight summary when it is not. A board with thirty cards on it stays responsive because only the cards you are actually looking at are running.

**Save view** stores the current position and zoom as the board's starting view, so everyone who opens it lands where you meant them to. Your own scroll position is remembered separately.

## Plain-Text Files

A board is a `.canvas` file in your project, stored as JSON. It is a superset of the [JSON Canvas](https://jsoncanvas.org/) open format: every field from the spec keeps its spec meaning, Nimbalyst's additions live under a namespaced key, and anything a board written by another tool carries is preserved when Nimbalyst saves it.

Boards therefore sit in your repository with everything else, sync like other files, and show up in a pull request as a readable diff.

## Working with AI

Your agent can author and rearrange boards. Because a card points at a workspace path, an agent can also create the underlying files and put them on the board in one pass.

* "Make a canvas of the checkout flow with the three mockups in `design/`."
* "Build a board for this workstream: the plan, the schema, and the two mockups it refers to."
* "Add the confirmation screen to the board after the payment screen."
* "Put a sticky note next to the payment card with the open question about wallets."
* "Draft three homepage variants as mockups and lay them out on a canvas side by side."

## Canvas, Excalidraw, or a Mockup?

| Use                                                        | When                                                                      |
| ---------------------------------------------------------- | ------------------------------------------------------------------------- |
| **Canvas**                                                 | You want several existing files arranged in space and still editable      |
| [**Excalidraw**](/visual-editors-powered-by-ai/excalidraw) | You want to draw: architecture sketches, freeform diagrams, whiteboarding |
| [**Mockups**](/visual-editors-powered-by-ai/mockups)       | You want to design a single screen                                        |


# Animations

Author animated explainer diagrams as .anim.json files. Describe what is true at each step, scrub the timeline, and export to MP4 or GIF, with your agent doing the drawing.

An animation is a diagram that plays. Use one to show how a system, protocol, or process behaves over time: a request moving through a cache, a sync handshake, a pipeline filling stage by stage. Animations live in your project as `.anim.json` files and open in a dedicated editor with a live stage and a scrubbable timeline.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-c5ef14d47533944b3a6c15c27c9ee63d96664555%2Fanimation-editor.png?alt=media" alt="The animation editor showing a cache-aside read path diagram on the stage, with a step-based timeline below and playback controls"><figcaption><p>The stage shows the scene; the timeline below is the list of steps. Drag the playhead to scrub, or drag a step boundary to change how long a beat holds.</p></figcaption></figure>

## Steps, Not Keyframes

An animation is a named scene plus an ordered list of steps. Each step says what is true at that beat: a node becomes active, an edge starts flowing, a label lights up. The editor handles the motion between beats, so there are no keyframes, easing curves, or property tracks to manage.

States are cumulative. A step asserts only what changes, and anything it does not mention keeps whatever the previous step left it in.

The scene is built from five part types: nodes, edges, labels, shapes, and HTML blocks for real product UI the primitives cannot draw. Parts take semantic tones that follow the viewer's theme, so one file reads correctly in light and dark mode. Parts can also show a spinning indicator for a running or loading state.

## Working in the Editor

* **Scrub and retime.** Drag the playhead through the timeline, or drag a step boundary to change a beat's duration.
* **Click a part to talk about it.** Clicking any node, edge, or label puts it in chat context along with its current state and time, so you can ask your agent to change exactly that thing.
* **Plays inline in the transcript.** When an agent creates or edits an animation, it appears in the session transcript as a click-to-activate stage, so you can watch the result without opening a tab.

## Export

Render an animation to a standalone HTML file, an animated GIF, or an MP4. The exports are self-contained, so they drop into a doc, a slide, or a social post as they are.

## Plain-Text Files

An animation is a single `.anim.json` file: plain JSON, no binary format. It sits in your repository with everything else, syncs like any other file, and diffs readably in a pull request. Any agent can author or edit one with ordinary file edits.

## Working with AI

The `/animate` command creates an explainer from a description. You can also just ask:

* "Animate how a request flows through the cache-aside read path."
* "Turn this architecture diagram into an animation that walks through the deploy."
* "Make the retry step hold longer and mark the queue as running while it waits."
* "Export this animation as an MP4."

## Installing

Animation is installable from the Extensions marketplace. See [Extension System & Marketplace](/extensions/extension-system-and-marketplace).


# Data Models

Design database schemas visually in Nimbalyst. Build a Prisma-based data model with AI from your existing code and markdown documentation.

Design a database schema as a visual entity-relationship diagram backed by a real Prisma schema file. You can move between the canvas and Prisma source, so the model stays useful to both people and coding agents.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-f48df06c73f8786e3ba577a3862bb2f50588b06e%2FData%20Model%20Gif.gif?alt=media" alt="Creating and editing a data model in Nimbalyst"><figcaption><p>A Prisma schema rendered as an editable entity-relationship diagram.</p></figcaption></figure>

Data models use the `.prisma` extension. Open one from the file tree to use the visual editor, or switch to source mode to edit the Prisma syntax directly.

More on the visual schema editor is on the [data modeling feature page](https://nimbalyst.com/features/data-modeling/) and the [DataModelLM extension page](https://nimbalyst.com/extensions/datamodellm/).

* **Create with AI**: type `/datamodel` and describe the entities, fields, and relationships you need.
* **Edit visually or in source**: add and arrange entities on the canvas, or edit the underlying Prisma syntax.
* **Work from project context**: ask the agent to derive or revise the schema using existing code and documents.
* **Embed it in markdown**: type **/** in a document and insert the data model so readers can see it with the surrounding plan.
* **Export it**: export SQL DDL, JSON Schema, DBML, or DataModelLM JSON. MongoDB models can also export Mongoose schemas and MongoDB index scripts.
* **Collaborate**: share a data model with your team for live editing and presence.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fmgzi5jnJhGvkXOV1hlCU%2FData%20Model%20Dark.png?alt=media&amp;token=e4c25f19-cc18-4c5d-8cf7-5061c84e4b59" alt="Data model editor in dark mode showing related database entities"><figcaption><p>The visual editor shows entities, fields, and the relationships between them.</p></figcaption></figure>


# CSV

Open CSV and TSV files in the built-in Nimbalyst spreadsheet editor, edit rows and columns visually, and let your AI agent work the same data.

Nimbalyst includes a built-in spreadsheet editor for CSV and TSV files. Open any `.csv` or `.tsv` file and it automatically displays in a familiar spreadsheet interface.

See the [spreadsheets feature page](https://nimbalyst.com/features/spreadsheets/) for how agents work with tabular data in a project.

If you want a calculation-first document instead of a row-and-column data grid, use a [Calc Sheet](/visual-editors-powered-by-ai/calc-sheets) with the `.calc.md` extension.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-836f12a7abc6177b1e16dacf8c6bd7e39bb49125%2FCSV.gif?alt=media" alt=""><figcaption></figcaption></figure>

### CSV Spreadsheet Editor

The editor works like a familiar spreadsheet. You can:

* Edit, add, and delete cells, rows, and columns
* Cut, copy, paste, undo, and redo ranges
* Write formulas with cell references and see results update live
* Find and replace values, sort columns, and filter rows
* Freeze rows and columns
* Set typed columns for numbers, currency, percentages, dates, checkboxes, links, and tracker items
* Format selected cells with text styles, colors, and alignment

Click **View Source** in the toolbar to toggle between the spreadsheet view and raw CSV text.

Formatting, column types, filters, and frozen panes need metadata that CSV itself cannot represent. Depending on the project setting, Nimbalyst stores that metadata in an inline CSV comment or a separate `.csvmeta` sidecar file. The cell values and formulas remain in the CSV or TSV.

### Using Coding Agents with CSV Files

Your coding agent can read and modify your CSV files directly. This is powerful for data tasks that would be tedious to do manually.

**Data Cleaning**

* "Remove all duplicate rows from data.csv"
* "Fix the date format in the 'created\_at' column to YYYY-MM-DD"
* "Trim whitespace from all cells in customers.csv"

**Data Transformation**

* "Add a new column that calculates the total from price and quantity"
* "Split the 'full\_name' column into 'first\_name' and 'last\_name'"
* "Convert all country codes to full country names"

**Analysis & Filtering**

* "Remove all rows where status is 'cancelled'"
* "Sort by revenue descending and keep only the top 100"
* "Find and flag any rows with missing email addresses"

**Bulk Operations**

* "Add 'USD' prefix to all values in the currency column"
* "Replace all instances of 'N/A' with empty cells"
* "Normalize phone numbers to +1-XXX-XXX-XXXX format"

**Generating Data**

* "Create a CSV with 50 sample customer records for testing"
* "Add a header row with appropriate column names"

#### How It Works

When you ask your coding agent to modify a CSV file, it reads the file, makes the changes programmatically, and writes the updated content back. The spreadsheet editor will automatically refresh to show your changes.

#### AI Changes as Red / Green Diff

Agent edits appear as a red/green diff. The grid stays read-only until you accept or reject the pending change, which prevents a manual cell edit from being mixed into the review.


# Browser

Preview HTML files and live URLs in the built-in Chromium browser, right next to your project files and your AI coding agent conversation.

Nimbalyst includes an in-app Browser editor for previewing HTML files and live URLs without leaving your workspace. It opens pages in a real Chromium view, next to your files and agent conversation.

Use it when you want to see a generated page, review an HTML mockup, or check a live URL while Claude Code, Codex, or another agent keeps working in the same project.

The [browser extension page](https://nimbalyst.com/extensions/browser/) covers what an agent can do inside the in-app browser.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-eef90867c69594de170a451af0204435085b424d%2Feditor-browser.png?alt=media" alt="In-app Browser editor showing a rendered page with URL controls, file tree, and agent sidebar"><figcaption></figcaption></figure>

## What the Browser Is Good For

* Previewing `.html` and `.htm` files directly from the file tree
* Opening a live URL beside the code, notes, and agent transcript
* Reviewing frontend changes without switching to a separate browser window
* Checking generated mockups and landing pages as rendered pages
* Letting an agent inspect, click, type, scroll, evaluate, and screenshot a page

## Built-In Capabilities

* Real Chromium rendering, not an iframe
* Back, forward, reload, and URL bar controls
* Source toggle when you want to move between rendered preview and file source
* Workspace-scoped local preview URLs for files
* Fileless browser tabs for live pages
* Agent tools for navigation, page inspection, clicks, typing, scrolling, screenshots, and JavaScript evaluation

## Browser vs Code Editor

Use the **Browser** when you need to inspect the rendered result of an HTML file or URL.

Use the **Code Editor** when you need to edit the source of the HTML, CSS, JavaScript, or TypeScript file.

In practice, you often use both: edit source in one tab, open the Browser in another tab, and ask your agent to revise the page while you review the rendered result.

## Working with AI

Your coding agent can use the Browser to verify UI work in place. Good prompts include:

* "Open this HTML file in the Browser and check whether the CTA button is visible."
* "Change the hero copy, then preview the page in the Browser."
* "Click through the form and tell me what breaks."
* "Take a screenshot of the current page state."
* "Inspect the page and summarize the visible headings and links."


# Calc Sheets

Calc Sheets are markdown spreadsheets (.calc.md) that keep assumptions, formulas, and outputs in one versionable file your AI agent can edit.

Calc Sheets are markdown documents that end in `.calc.md`. They combine spreadsheet-style calculated results with plain-text editing, so you can keep assumptions, formulas, notes, and outputs together in one versionable file.

Unlike a CSV grid, a Calc Sheet reads like a working document. You write inputs and formulas as text on the left, and Nimbalyst renders the evaluated results alongside them.

The [Calc Sheets extension page](https://nimbalyst.com/extensions/calc-sheets/) covers the formula syntax and unit handling in more depth.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-b8ca4a8b15f482aada05baaccf8cdfd405eac3bc%2Feditor-calc.png?alt=media" alt="Calc Sheet editor showing assumptions, formulas, units, and live results beside the source"><figcaption></figcaption></figure>

## What Calc Sheets Are Good For

* Quick estimates, budgets, and pricing models
* Unit-aware calculations inside planning docs
* Financial notes where currency formatting matters
* AI-assisted calculation files that should still stay readable in plain text
* Scenario analysis where the assumptions matter as much as the final result

## Example

```md
# Inputs

price = 100 USD
quantity = 1

# Results

total = price * quantity -> currency(USD, 2)
```

In Nimbalyst, the source stays editable as markdown while the computed values appear beside it in a spreadsheet-like results column.

## Built-In Capabilities

* Text-first calculations in plain `.calc.md` files
* Units and currency-aware formatting
* Live result gutter beside the source
* Assertions so a sheet can catch invalid assumptions early
* Natural fit with Git, diffs, and agent-driven edits
* Source mode that stays readable in any text editor

## Calc Sheets vs CSV

Use **Calc Sheets** when the file is mostly a human-readable calculation document with a few important formulas.

Use **CSV** when the file is primarily tabular data with many rows and columns.

See also [CSV](/visual-editors-powered-by-ai/csv).

## Working with AI

Your coding agent can edit `.calc.md` files the same way it edits markdown or code. Good prompts include:

* "Turn this pricing note into a calc sheet with subtotals and a final total."
* "Add a margin assumption and recompute the quoted price."
* "Convert these hard-coded numbers into named inputs."
* "Add assertions so the total fails if quantity is negative."
* "Adjust the payload assumption and explain which checks changed."


# Mind Map

Mind Map is a spatial editor for .mindmap files. Brainstorm on an infinite canvas while the file stays plain text your AI agent can also edit.

Nimbalyst Mind Map is a spatial editor for `.mindmap` files. It lets you lay out ideas on an infinite canvas while keeping the underlying file readable, versionable, and editable by agents.

Use it for brainstorming, project planning, research organization, decision trees, and any topic where a hierarchy is easier to understand visually than as a long outline.

The [mind map extension page](https://nimbalyst.com/extensions/mindmap/) shows the file format and how agents edit maps.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-765b97a390dd52de1f21117941caecad7b6e6695%2Feditor-mindmap.png?alt=media" alt="Mind Map editor showing a color-coded roadmap on an infinite canvas with file tree and agent sidebar"><figcaption></figcaption></figure>

## What Mind Maps Are Good For

* Breaking a project into themes, branches, and follow-up work
* Organizing research notes by concept or domain
* Capturing meeting ideas spatially while preserving structure
* Mapping product roadmaps, launch plans, and decision trees
* Turning a topic prompt into a structured map your team can revise

## Built-In Capabilities

* Infinite canvas with pan and zoom
* Nodes, branches, notes, tags, status, and color coding
* Keyboard-driven editing for adding children, siblings, and updates quickly
* Auto layout for cleaning up a map
* Outline view when a hierarchy is easier to edit as text
* Search across nodes
* AI-assisted creation and branch expansion

## Plain-Text Files

Mind maps are stored as `.mindmap` files. That means they can live with the rest of your project, sync like other files, and be reviewed in Git.

The visual editor gives you the canvas, but the file remains structured enough for Claude Code, Codex, and other agents to read and update.

## Working with AI

Your coding agent can create, expand, and reorganize mind maps. Good prompts include:

* "Create a mind map for this product launch plan."
* "Expand the Discovery branch with customer research tasks."
* "Reorganize this map into Design, Build, Launch, and Measure."
* "Add notes to each high-risk branch."
* "Turn this outline into a mind map."


# Excalidraw

Draw diagrams, flowcharts, and whiteboard sketches in the built-in Excalidraw editor, and let your AI agent build them from a description.

### Overview

Nimbalyst includes a built-in Excalidraw editor for creating diagrams, flowcharts, and whiteboard sketches. Files open in a visual canvas where you can draw shapes, connect them with arrows, and let AI help build diagrams from descriptions.

The [Excalidraw extension page](https://nimbalyst.com/extensions/excalidraw/) lists what the built-in canvas supports.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-73317d22ab6ae385c7097f2937a2883efd1d56fb%2FExcalidraw%20Architecture.gif?alt=media" alt=""><figcaption></figcaption></figure>

### AI-Assisted Diagramming

Ask the AI to create or modify diagrams directly. The AI can:

* Add shapes with labels and colors
* Connect elements with arrows
* Import Mermaid diagrams
* Align and distribute elements
* Group elements together
* Create rows and columns of shapes

### Human Diagramming

Right-click in the file tree and select **New File > Excalidraw Diagram**, or create any file with the `.excalidraw` extension.

The toolbar provides standard Excalidraw tools:

* **Selection**: Click and drag to select elements
* **Rectangle**: Draw boxes (rounded by default)
* **Diamond**: Draw decision shapes
* **Ellipse**: Draw circles and ovals
* **Arrow**: Connect elements with arrows
* **Line**: Draw freeform lines
* **Text**: Add text labels
* **Frame**: Group related elements with a titled container

#### Example AI Prompts

* "Create a flowchart showing user login flow"
* "Add a blue rectangle labeled 'Database'"
* "Connect 'Frontend' to 'API' with an arrow"
* "Import this mermaid diagram: graph TD; A-->B"
* "Align all the boxes on the left"

### Mermaid Import

Convert Mermaid syntax to visual diagrams:

```
graph TD
    A[Start] --> B{Decision}
    B -->|Yes| C[Action]
    B -->|No| D[End]

```

Ask the AI to import Mermaid, or use the `import_mermaid` tool directly.

### Working with Frames

Frames are titled containers that group related elements. Use them to organize architecture diagrams into sections like "Browser", "Services", or "Database".

Create frames manually or ask the AI: "Add a frame called 'Frontend' around the React components"

### Theme Support

The editor adapts to your Nimbalyst theme. Light themes show a white canvas; dark themes show a dark canvas with adjusted colors.

### Tips

* **Pan canvas**: Hold space and drag, or use two-finger scroll
* **Zoom**: Cmd/Ctrl + scroll, or use the zoom controls
* **Duplicate**: Alt + drag to duplicate elements
* **Snap to grid**: Hold Cmd/Ctrl while dragging for alignment
* **Lock elements**: Prevent accidental edits by locking shapes

### Diagrams on a Board

An Excalidraw file can sit on a [Canvas](/visual-editors-powered-by-ai/canvas) alongside the plan and mockups it explains, and stays editable there.


# PDF Viewer

Open and read PDF documents in Nimbalyst tabs alongside your other project files, with smooth scrolling, zoom controls, and text selection.

Nimbalyst includes a built-in PDF viewer that lets you open and view PDF documents directly in the editor. PDFs open in their own tabs alongside your other files, with support for smooth scrolling, zoom controls, and text selection.

See the [PDF viewer extension page](https://nimbalyst.com/extensions/pdf-viewer/).

### Opening PDFs

Click any `.pdf` file in your file tree to open it. The PDF loads in a dedicated viewer tab with a toolbar at the top.

PDFs are read-only in Nimbalyst. To edit a PDF, use a dedicated PDF editor.

### Viewing Controls

#### Toolbar

The toolbar appears at the top of the PDF viewer and shows:

* **Page count**: Total number of pages (e.g., "10 pages")
* **Zoom controls**: Plus/minus buttons and current zoom percentage
* **Fit button**: Toggle fit-to-width mode

#### Scrolling

Scroll through the PDF using:

* Mouse wheel or trackpad
* Scroll bars
* Page Up / Page Down keys

Pages flow continuously like a modern PDF reader. Large documents (100+ pages) remain smooth thanks to efficient rendering.

### Text Selection

You can select and copy text from PDFs:

1. Click and drag to select text on any page
2. Selected text is highlighted
3. Press **Cmd/Ctrl + C** to copy

Text selection works like any standard PDF reader.

### Theme Support

The PDF viewer adapts to your Nimbalyst theme:

* **Light theme**: Standard white pages with subtle shadows
* **Dark theme**: White pages with enhanced shadows for contrast
* Toolbar and controls match your theme colors


# Code Editor

Nimbalyst includes a Monaco code editor, the same engine VS Code uses, with syntax highlighting and AI edits next to your docs and diagrams.

Nimbalyst includes a full-featured code editor powered by Monaco (the same editor used in VS Code). When you open a code file, it automatically opens in Monaco with syntax highlighting and standard editing features.

Code editing sits next to the rest of the workspace rather than in a separate app. See the [developer tools page](https://nimbalyst.com/features/developer-tools/).

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2F35kHJUvNykZgT45WQglq%2Fimage.png?alt=media&amp;token=302f278d-1249-4c87-b1b6-5e98ec885a1a" alt="Code open in Nimbalyst&#x27;s Monaco editor, with the file tree and agent panel beside it"><figcaption><p>Code uses the same workspace layout as documents and visual editors, so the project and agent conversation stay beside the file.</p></figcaption></figure>

### Reviewing AI Changes

When an agent edits a code file, Nimbalyst opens Monaco's inline diff view. The editor is read-only while the diff is awaiting review:

* Green background: Added content
* Red background: Removed content (with strikethrough)
* **Previous** and **Next** jump between changed regions, and the counter shows your position.
* **Accept All** keeps the agent's version.
* **Reject All** restores the version from before the edit.
* **Go to Session** opens the agent session that made the edit when that session is known.

The diff remains visible until you accept or reject it.

### Supported File Types

The code editor supports a wide range of programming languages:

#### Web Development

* JavaScript: `.js`, `.jsx`, `.mjs`, `.cjs`
* TypeScript: `.ts`, `.tsx`, `.d.ts`
* HTML: `.html`, `.htm`
* CSS: `.css`, `.scss`, `.sass`, `.less`

#### Data Formats

* JSON: `.json`, `.jsonc`
* YAML: `.yaml`, `.yml`
* XML: `.xml`
* TOML: `.toml`

#### Programming Languages

* Python: `.py`, `.pyw`, `.pyi`
* Go: `.go`
* Rust: `.rs`
* C/C++: `.c`, `.h`, `.cpp`, `.cc`, `.hpp`
* Java: `.java`
* C#: `.cs`
* Swift: `.swift`
* Kotlin: `.kt`
* Ruby: `.rb`
* PHP: `.php`
* Dart: `.dart`

#### Shell & Config

* Shell scripts: `.sh`, `.bash`, `.zsh`, `.fish`
* SQL: `.sql`
* GraphQL: `.graphql`
* Dockerfile

#### Other

* Markdown: `.md` (raw view mode)
* Plain text: `.txt`, `.log`

### Editor Features

#### Syntax Highlighting

Each language gets appropriate color highlighting, making code easy to read and understand.

#### Line Numbers

Line numbers appear on the left for navigation and reference.

#### Minimap

A code overview appears on the right side, letting you see the structure of longer files and quickly jump to different sections.

#### Code Folding

Click the arrows next to code blocks to collapse or expand them. Works with:

* Functions and methods
* Classes
* Conditional blocks
* Loops
* JSON objects and arrays

#### Bracket Matching

Matching brackets, braces, and parentheses are highlighted in color, making it easy to see paired delimiters.

### Editing Code

#### Autosave

Changes save automatically after 2 seconds of inactivity. A dot in the tab title indicates unsaved changes.

#### Manual Save

Press **Cmd+S** (Mac) or **Ctrl+S** (Windows/Linux) to save immediately.

All common editing shortcuts work:

* **Cmd/Ctrl+C**: Copy
* **Cmd/Ctrl+V**: Paste
* **Cmd/Ctrl+Z**: Undo
* **Cmd/Ctrl+Shift+Z**: Redo
* **Cmd/Ctrl+F**: Find
* **Cmd/Ctrl+H**: Find and replace

#### Indentation

New files default to two-space indentation. Existing files keep their detected indentation style.

### File Watching

The editor detects when files are changed by other programs:

* If you have no unsaved changes, the file reloads automatically
* If you have unsaved changes, Nimbalyst shows a conflict banner so you can load the disk version or keep working with your current version

### File History

Code file edits are tracked in your file history:

* Press **Cmd+Y** (Mac) or **Ctrl+Y** (Windows/Linux) to open file history
* Restore any previous version of the file
* See when changes were made

### Tips

* **Hover for full path**: Hover over a tab to see the complete file path
* **Multiple files**: Open code and markdown files side by side in tabs
* **Theme support**: The editor automatically matches your Nimbalyst theme (light/dark)
* **Focus indicator**: When you click elsewhere and return, your cursor position is preserved


# File History and Restore

Nimbalyst saves file snapshots automatically. Open history with Cmd+Y to compare versions and restore a document after an AI edit goes wrong.

Nimbalyst keeps automatic snapshots of every document you edit, so version history is built into the editor with no git or other tools required. When an AI edit goes wrong, or you want yesterday's wording back, open the file's history, compare versions, and restore the one you want.

### Files with unsaved changes

Tabs show a dot (•) next to a filename with unsaved changes. The dot disappears after a manual save (Cmd+S) or an autosave (the interval is configurable).

### Opening file history

Snapshots are captured automatically as you work: on autosave, on manual save, and around AI edits, so you always have a version from just before the agent touched the file. They are stored compressed in Nimbalyst's local database.

Open the history panel for the current file in any of these ways:

* Press **Cmd+Y**
* Choose **Edit > View Local History** from the menu bar
* Open the **...** menu in the editor header and choose **View History**

<div align="left"><figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fm7FxnWKD0ybMfeuZ79mi%2Fimage.png?alt=media&amp;token=177b541e-a39b-434b-bcf7-291f65095f24" alt="" width="218"><figcaption><p>The editor's overflow menu includes View History.</p></figcaption></figure></div>

The panel lists every snapshot with a timestamp, a size, and how it was created (Auto Save, AI Edit, Pre Edit). Select a snapshot to preview its full content.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FaGsxXyy6D6d2DVeELSRv%2Fimage.png?alt=media&amp;token=ade752b2-7b4e-41d7-92c8-4febaff08dd2" alt=""><figcaption><p>The history panel: snapshots with timestamps on the left, a preview of the selected version on the right, and a Restore This Version button.</p></figcaption></figure>

### Comparing snapshots

Click a snapshot to see how it differs from the previous one. To compare any two versions, click the first snapshot and then Cmd+click the second.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FiI7wp33BSLAjgbdSqEfK%2Fimage.png?alt=media&amp;token=5cf41235-e928-4848-9107-81e2501af5a8" alt=""><figcaption><p>Comparing two snapshots side by side, with removed text in red on the old version and added text in green on the new one.</p></figcaption></figure>

Study the differences, then choose the version you want.

### Restoring a version

Select a snapshot and click **Restore This Version**. Your current version becomes a new snapshot, so history is preserved and you can undo the restoration if needed.

### Deleting snapshots

Hover a snapshot in the list and click its delete icon. Nimbalyst asks for confirmation before removing it.

### Where snapshots are stored

Snapshots live in the `document_history` table of Nimbalyst's local database, inside the application data folder:

| Platform | Application data folder                   |
| -------- | ----------------------------------------- |
| macOS    | `~/Library/Application Support/Nimbalyst` |
| Windows  | `%APPDATA%\Nimbalyst`                     |
| Linux    | `~/.config/Nimbalyst`                     |

Newer installs use SQLite (`sqlite-db/nimbalyst.sqlite`). Installs that predate the SQLite migration use PGLite (the `pglite-db/` folder) until they migrate. Development builds use a `@nimbalyst/electron` folder in the same location.

That database is backed up every 12 hours by default and on quit, so document history can be recovered after database corruption. You can change the interval under **Settings > Application > Database**. See [Database Backups and Restore](/troubleshooting/database-backups-and-restore).


# File Search, File Tree, and Tabs

Find files fast in Nimbalyst with Quick Open (Cmd+O), the project file tree, and tabs for working across several documents at the same time.

Nimbalyst gives you three ways to move around a project: Quick Open for jumping to anything by name or content, the file tree for browsing, and tabs for keeping several documents open at once. This page covers all three, plus the shortcuts that tie them together.

### Quick Open and Search

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FO5fFVXWOi17Y8KovtLn6%2Fimage.png?alt=media&amp;token=e070aa99-edfe-4144-9192-7c4877f04dc0" alt=""><figcaption><p>The search button sits at the top of the file sidebar, next to the new-file and new-folder buttons.</p></figcaption></figure>

Click the magnifying glass or press **Cmd+O** to open the unified Quick Open launcher.

<div align="left"><figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fv2IPipyQibuP0Hjeh5YJ%2Fimage.png?alt=media&amp;token=c079c603-a58b-4f54-9bb3-c9aa1ff51584" alt="" width="375"><figcaption><p>Typing a name in Quick Open lists matching files, with Enter to open and Esc to close.</p></figcaption></figure></div>

Quick Open brings several pickers together in one tabbed surface:

* **Files** - find files and folders by name, including dotfiles and images
* **In Files** - search within file contents across the project
* **Sessions** - jump to AI sessions and workstreams
* **Prompts** - find prompts
* **Projects** - switch between open projects
* **Trackers** - jump directly to tracker items
* **Memory** - search project knowledge across Docs, Trackers, and optionally Sessions when the Nimbalyst Memory extension is enabled

The Files results can also include team shared documents. Opening one takes you to its collaborative editor. The **Files** tab can narrow to just your local files or just your team's shared documents, and it remembers the choice for next time.

Use the tab bar to switch modes, and use the inline filters for narrower results. In the **Files** tab, selecting a folder reveals it in the file tree. Direct shortcuts for some tabs are shown inside the launcher itself.

#### Search Shortcuts

* **Cmd+O** — Quick Open for files, folders, shared documents, projects, and Tracker items
* **Cmd+L** — Session Quick Open
* **Cmd+Shift+L** — Prompt Quick Open
* **Cmd+Shift+F** — file-content search
* **Cmd+Shift+O** — Memory search
* **Cmd+Shift+D** — team shared-document search

Filename search, file-content search, and Memory search answer different questions:

* Use **Files** when you know all or part of a file name.
* Use **In Files** when you know the exact text inside a local file.
* Use **Trackers** for exact issue-key lookup or structured Tracker search.
* Use **Memory** for a concept or question that may be described differently across documents, Trackers, and sessions. Memory combines semantic and keyword matching. Project Memory can also index agent instructions and personal memory as separate sources, and can use an optional on-device embedding model configured in project settings.

<div align="left"><figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Foh5nTVuPekXW7zQecftw%2Fimage.png?alt=media&amp;token=1b9d020d-1c90-4f27-83a3-99f9b4a9e3f5" alt="" width="375"><figcaption><p>File-content search shows each matching file with a match count and the matching lines, highlighted in context.</p></figcaption></figure></div>

### File Tree

<div align="left"><figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FAw1PtERxcNjXtD9nuM3G%2Fimage.png?alt=media&amp;token=6c1acfed-baa4-484c-9d9d-00530d94a2f3" alt="" width="375"><figcaption><p>The file tree in the sidebar, with a folder expanded to show the documents inside it.</p></figcaption></figure></div>

The file tree shows all files in your project. Navigate them by:

* Click folders to expand/collapse
* Click files to open
* Recent files appear at top of sidebar
* Right-click a file to rename, delete, open, copy path, or open in a new window
* Move files by dragging (hold Option/Alt to copy)
* Deleted files, attachments, assets, and themes move to the system trash instead of being permanently deleted
* Show dotfiles in the file tree by selecting the "All Files" filter
* In a team project, right-click a collaboration-supported file and choose **Share to Team** to promote it into the shared document space. See [Collaborative Documents](/team-collaboration/documents).

### Creating from the Title Bar

The title bar carries two create buttons:

* The button on the left makes a new file, shared doc, or tracker item in the list you are looking at. It opens a menu of every type it can create there, so the same button adapts as you move between files, shared documents, and trackers.
* The button on the right starts a new session.

### Tab Management

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FdiqxpIxUhvY91hSpowOG%2Fimage.png?alt=media&amp;token=eed272db-2d81-4f31-b497-4118a344e285" alt=""><figcaption><p>The tab bar with several documents open. The dropdown on the right lists every open tab and offers Close All Tabs.</p></figcaption></figure>

Tabs let you work with multiple documents (or sessions) in one window.

* A dirty indicator (•) shows unsaved changes
* Open tabs are saved when the workspace closes and restored when it reopens
* Pin a tab to the far left by right-clicking it and selecting Pin Tab
* Keyboard shortcuts move you between tabs, and the tab dropdown jumps to any open tab

### Paste Options

* **Cmd+Shift+V** — force-paste as plain text without attachment conversion

### Navigation Gutter

* Right-click the navigation gutter and choose **Customize Gutter** to hide or show mode, extension-panel, and status icons.
* Drag icons into a manual order inside their group.
* Right-click an individual gutter icon to hide it directly.
* Changes apply immediately to every open Nimbalyst window and persist across projects.
* The account and Settings control remains available and cannot be hidden.


# Multi-Folder Projects

Attach additional folders to a project so one workspace spans several repositories. Attached folders appear in the explorer, in search, and to your agents, with git tracked per repository.

A project can span several folders. When your work lives across a few repositories but belongs to one effort, attach the other folders to the project you already have open instead of juggling separate windows.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-fd008f45b4675ea0a8422ea8cb164fa6131d9707%2Fdocs-multi-folder-project.png?alt=media" alt="The Nimbalyst file explorer showing Product Workspace as the primary root with Web App and API Service attached as two additional roots"><figcaption><p>Each attached folder appears as its own root in the same file explorer.</p></figcaption></figure>

An attached folder becomes part of the workspace:

* It appears in the file tree as its own root, alongside the primary folder
* Quick Open and in-file search cover it
* Your agents can read and write it, in every session in the project
* Git status, branches, and commits are tracked per repository, so each root shows its own branch and changes. Commit with AI proposes one commit per repository when changes span several. See [Working with Git](/developer-features/working-with-git)

## Attaching a Folder

Attach a folder any of these ways:

* **File menu**: choose **Attach Folder to Workspace** and pick the folder
* **Quick Open**: search for the folder and attach it from there
* **Explorer**: right-click in the file tree and attach from the context menu
* **Drag and drop**: drop a folder from Finder or File Explorer onto the file tree

Whichever way you start, Nimbalyst confirms before attaching. The attached folder becomes part of this project and inherits its agent trust level, which means agents in the project will be able to read and write it. If that folder deserves different trust than the project it is joining, keep it as its own project instead.

A workspace holds up to eight attached folders in addition to the primary one.

## Detaching a Folder

Right-click the attached root in the file tree to detach it. Detaching removes the root from the project but touches nothing on disk, and any tabs you had open from it stay open.

## How It Relates to Projects

The primary folder still defines the project: its name, its settings, and the trust level everything runs under. Attached folders ride along. If you open one of the attached folders as its own project later, it behaves like any other project, with no memory of having been attached elsewhere.


# Project Graph

Explore your whole project as one navigable surface. Atlas maps your project's areas, Pulse shows where activity moved over time, and Evidence Trails walks the recorded links between trackers, session

Project Graph indexes the artifacts your project already produces, including AI sessions, tracker items, commits, plans, documents, GitHub issues and pull requests, and project memory, and presents them as one navigable picture. Instead of a single tangled node diagram, it offers three complementary views over the same index: **Atlas**, **Pulse**, and **Evidence Trails**.

{% hint style="info" %}
Project Graph ships as a built-in extension on the alpha release channel and is off by default. Turn it on under **Settings > Application > Installed** with the extension's enable toggle. Once enabled, a **Project Graph** button appears in the navigation gutter on the left.
{% endhint %}

## Opening Project Graph

Click the **Project Graph** icon in the navigation gutter. The panel opens full screen with a toolbar for switching views, choosing an area, setting the time range, and opening settings.

While your project is being indexed for the first time, you can switch the **Data** selector from **Live project** to an illustrative sample of about 3,000 records to explore how the views work. Once indexed, Project Graph keeps a cached copy of your project's records, so on later launches it shows your data immediately and refreshes in the background instead of starting from a blank screen.

## The Three Views

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-803658f33e9e58a969629536d30be3aa328e3cf8%2Frelease-project-graph.png?alt=media" alt="The Project Graph Atlas view showing nine project area tiles with activity bars, record counts, and a detail panel on the right"><figcaption><p>Atlas draws each project area as a tile with its records, activity in range, and the sources that produced them.</p></figcaption></figure>

### Atlas

Atlas is a territory map of your project's areas. Each area is drawn as a tile whose position stays put: changing the date range, renaming an area, or refreshing the index repaints the overlays without rearranging the map, so you build spatial memory of where things live.

Selecting an area opens a detail panel with three tabs:

* **Connections:** how this area relates to others. Recorded links (a tracker item linked to a session, a commit touching a file) are shown separately from links that merely come from files sitting in the same directory, and each drawn connector names the relation that produced it.
* **Activity:** what happened in the area during the current time range.
* **Records:** the artifacts inside the area, with every list stating how many of the total it is showing.

### Pulse

Pulse answers "what changed recently, and where did attention move?" It is a grid: rows are areas (or the individual artifacts inside one selected area), columns are calendar buckets by day, week, or month, and each cell counts the distinct artifacts with recorded activity in that bucket. Rows sort by most recent activity, most events, or name.

Pulse is deliberately conservative about what a cell means. An empty cell means no events were loaded for that bucket, which is not evidence that nothing happened, and buckets outside the loaded history are marked as such rather than shown as quiet. Turn on **Compare previous period** in the toolbar to see the current window against the one before it, and click into cells to inspect the underlying events.

### Evidence Trails

Evidence Trails answers "why does this record exist, and what does it affect?" You focus one artifact at a time, and its recorded relations are grouped into named lanes: the sessions a tracker item was worked on in, the files a session edited, the files a commit touched, and so on. An inspector explains what in the sources supports each connection, and a relation that only comes from file-path containment is labeled that way and can be collapsed separately, so explicitly recorded links stay visible.

Following a connection moves the focus and builds a breadcrumb trail, so you can walk from a bug to the session that fixed it to the files that changed, and back.

## Sources

Project Graph draws on seven sources, each of which can be toggled in settings:

| Source    | What it contributes                       |
| --------- | ----------------------------------------- |
| Sessions  | AI sessions and the files they edited     |
| Trackers  | Tracker items and their links to sessions |
| Commits   | Git commits and the files they changed    |
| Plans     | Plan documents                            |
| Documents | Project documents                         |
| GitHub    | GitHub issues and pull requests           |
| Memory    | Project memory records                    |

The **Sources & limitations** disclosure above the view states exactly what is loaded and what is not, so the picture never silently overstates its coverage. Settings also control whether archived records are included, how far back event history loads (90 days, 1 year, or all available), and an optional per-source safety limit for very large projects.

## Areas

Areas are the map's regions. Project Graph proposes an initial set automatically after the first index, and records that no rule claims land in an **Unassigned** area rather than disappearing. In settings you can add your own area rules by tag, by file path, or by anchoring an area to a specific record, and you can rename any area directly on the map.

## Time Range and Comparison

The toolbar sets the window to 7, 30, or 90 days. The arrow buttons step to earlier and later windows, **Now** returns to the present, and **Compare previous period** overlays the preceding window of the same length. Narrowing the date range changes what is highlighted, not what is indexed: older context stays available.

## Saved Views

Once you have a combination you like (view, time range, area, comparison setting, and hidden record types), save it as a named view from settings. Saved views appear in the **Lens** dropdown in the toolbar, and a **Modified** marker shows when your current settings have drifted from the saved definition. You can keep up to 30.

## Exploring a Record

Clicking any record opens its source panel with three tabs:

* **Record:** the record itself, including its current status and its full body, loaded on demand from the source.
* **Focused graph:** the records connected to this one, paged rather than truncated.
* **Recorded history:** the events recorded for it, newest first.

From here, **Open original** jumps to the source artifact: the AI session, the tracker item, or the file in its editor. References to records that were not part of the loaded index can be resolved on demand, and a reference that cannot be found in any available source is reported as unresolved rather than guessed at.

## The Legacy Graph

The earlier single-canvas graph view is still available behind the **Advanced: legacy graph** button at the top of the panel, and **Return to project views** brings you back to Atlas, Pulse, and Evidence Trails.


# Share Link to a File

Create an encrypted, expiring public link for a markdown or visual file in Nimbalyst so people outside your workspace can read it in a browser.

Share Link turns a file in your project into a web page anyone can read in a browser, without a Nimbalyst account. Use it to hand a plan, a mockup, or a diagram to someone outside your workspace with a single URL.

Sharing works for markdown files and for visual file types with a web viewer, including mindmaps, Excalidraw diagrams, data models, spreadsheets (CSV/TSV), mockups, calc documents, and slides.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FKu6dJCaNPgECZb0n1LNs%2Fimage.png?alt=media&amp;token=fc923494-a2d6-481f-a6f0-86c45b7cf566" alt=""><figcaption><p>The file tree context menu, with Share Link highlighted for a markdown file.</p></figcaption></figure>

### Creating a link

1. Right-click the file in the file tree and select **Share Link**. (The same button also appears in the editor header for markdown files.)
2. Sign in if prompted; sharing requires a Nimbalyst account.
3. Choose how long the link should last: 1, 7, or 30 days. Your choice is remembered for next time.
4. Click **Share**, then copy the link and paste it anywhere: Slack, email, X, a doc.

### Security and safety

* Anyone with the link can view the file. Do not share files containing sensitive information.
* There is no password protection, but every link expires after the duration you chose.
* Shared content is stored encrypted on Cloudflare R2. It is end-to-end encrypted, and the decryption key travels only in the link itself, so Nimbalyst, Inc. cannot read the content.


# File Edits Sidebar

The File Edits Sidebar tracks every file your AI agent read or changed during a session, so you can review each modification before accepting.

The File Edits Sidebar lists every file the AI touched during a session, so you always know what was modified, referenced, or read, and what still needs your review. Use it as your review checklist after an agent finishes a task.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FZ6cvcg6DQgChwnS29vNU%2Fimage.png?alt=media&amp;token=c2312d4c-9533-4481-9cb7-51c953f14c6d" alt=""><figcaption><p>An agent session with the Edited list in the sidebar showing four changed files, one of them pending review with a Keep All button.</p></figcaption></figure>

* Every file the AI edited appears in the sidebar list
* Click a file to jump directly to the AI session that made the edit
* See how many changes are in each file and navigate between them
* **All Uncommitted Files** mode shows files with pending changes across your project

### Diff Peek

Hover any row in the edited-files list and a peek icon appears on the right. Click it to open a unified diff popover anchored to the row, so you can see exactly what the agent changed without leaving the session view or opening the file.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-933b4e968c2c9bbe4ec098527b936f6f01cc79df%2Fsession-edits-diff-peek.png?alt=media" alt="A pinned diff peek showing changes for a file in the All Session Edits sidebar"><figcaption><p>Review a file's changes from All Session Edits without leaving the agent session.</p></figcaption></figure>

* Hover the row to reveal the peek icon
* Click the icon to pin the diff popover
* The popover is resizable, and the size you pick is remembered (it stays in sync with the diff peek in the Git extension and the commit proposal widget)
* Click outside or press Esc to close


# Agent Window & Session Management

Manage AI coding sessions in the Nimbalyst Agent window. Start, resume, group, rename, and search long-running Claude Code and Codex sessions.

The Agent window is where you run and manage your AI sessions: long chat discussions, research, complex multi-file tasks, and AI-assisted development. Where Files mode is for editing your documents, the Agent window is for working with your agents and keeping many sessions organized.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-1cb3852f92e31ad0c7d9075b09c8d722fb75e5b2%2Fdocs-session-overview.png?alt=media" alt="The Agent window with the session list on the left, a transcript in the center, and the session panel on the right"><figcaption><p>The Agent window keeps the session list, conversation, and session details together.</p></figcaption></figure>

The Agent window has three main areas:

* **Left sidebar** with your sessions. Search and select sessions here.
* **Central transcript** where you converse with the agent, with full conversation history, tool call visualization, and streaming content.
* **Right panel**, which you can switch between edited files, review, and a chat about the session.

The [session management feature page](https://nimbalyst.com/features/session-management/) shows how sessions, [workstreams](/session-management/workstreams), and the kanban view fit together.

### Starting Sessions

Click the main **New session** button in the title bar, or press **Cmd/Ctrl+N**, to start a regular session immediately. When other launch types are available, the adjacent menu lists options such as **New Worktree**, **New Blitz**, **New Terminal**, **New Super Loop**, and **New Meta Agent**. Which options appear depends on Developer Mode, whether the project is a git repository, and the alpha features you enabled. To add a related session next to one you already have, use the **+** next to the session tab instead; see [Workstreams](/session-management/workstreams).

### Choose What the Right Panel Shows

The right panel is a switcher. Use the dropdown in its header to change what it displays.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-b1455399ae377394df64bd3b06e43e20298bd434%2Fagent-right-panel-switcher.png?alt=media" alt="The agent window right panel dropdown, open on three options: Edited Files with a checkmark, Review, and Chat with Session"><figcaption><p>Switch the right panel between edited files, review, and a chat about the session.</p></figcaption></figure>

* **Edited Files**: the files the agent created and changed in this session, with uncommitted changes and commit controls. See [View Files in Agent Mode](/session-management/view-files-in-agent-mode).
* **Review**: the review queue for changes waiting on your approval.
* **Chat with Session**: a conversation about the session itself, kept separate from the main transcript.

You can also open a tracker item as a tab in this window and work the item and the session together. See [Item Detail](/task-management/item-detail).

### Finding and Organizing Sessions

Run as many parallel sessions as you need, then search, filter, and resume them from the left sidebar. Session search covers titles, and you can search transcript contents too.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FnSMB4A6nAha9c6JUYplH%2Fimage.png?alt=media&amp;token=3c691c97-780d-446c-a97b-28d8d59a39a1" alt="The session list filtered by the search term bug report, with a Search contents option and matching sessions listed with match counts"><figcaption><p>Search sessions by title, or use Search contents to find matches inside transcripts.</p></figcaption></figure>

Useful session controls:

* **Turn summary stats**: each agent turn shows file count and line changes (for example, "Finished in 6m 57s, 3 files +45 -12").
* **Click-to-copy code blocks**: click or tap inline code blocks in transcripts to copy them.
* **Maximize button**: in the chat sidebar, open the current session in full Agent mode.
* **Drag-drop to create workstreams**: drag a session onto a standalone session to group them. See [Workstreams](/session-management/workstreams).
* **Start a session from a document**: "Start a new agent session" from a document pre-populates an @file reference to that document.
* **Rename a session**: right-click a session in the list and choose Rename. Workstream parent rows also support inline rename.
* **Preferred Agent Language**: under **Settings > Application > Agent Features**, set the language used to auto-generate session names.

If you keep long-running conversations, Nimbalyst preserves and organizes history that the terminal CLI would lose.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2F6kgDRhO57pqbWOitrGbh%2Fimage.png?alt=media&amp;token=f80f995a-47bd-4c39-81a0-7b8cb996b15e" alt="A comparison table titled Nimbalyst unleashes Claude Code from the terminal, contrasting Nimbalyst and the Claude Code CLI on session management features"><figcaption><p>How Nimbalyst session management compares with running Claude Code in a terminal.</p></figcaption></figure>

### Start a Background Session from Anywhere

Press **Cmd/Ctrl+Shift+N** from any Nimbalyst mode to open the session launcher over your current work.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-ee6838cb342eecbb1a592c0f6484e1429a6d58d3%2Fbackground-session-launcher.png?alt=media" alt="The Launch New Session composer floating over an open Excalidraw document, with agent, model, effort, and Actions controls"><figcaption><p>Start a session without leaving the document, Tracker, pull request, or shared file you are viewing.</p></figcaption></figure>

The launcher includes the same controls as the normal chat composer:

* Choose the agent and model.
* Set effort and supported thinking controls.
* Insert an Action or slash command.
* Mention files and Tracker items.
* Attach images and other supported context.

Drag the launcher by its title bar when it covers something you need to read. Sending the prompt starts the session in the background, closes the launcher, and keeps you in the current mode. Open Agent mode or the attention list whenever you want to follow the new session. Starting from a document or Tracker item can prefill the relevant reference so the agent receives the context you launched from.

### Change Models and Thinking from Chat

Press **Cmd/Ctrl+Shift+M** while the chat input is focused to open the model picker without reaching for the mouse. Type to search by the model's display name or model ID, then use the arrow keys and Enter to select it.

The model selection belongs to the session. Changing it affects later turns without changing the model used by other sessions.

Supported Claude Agent models also show **Extended: On** or **Extended: Off**:

* **Extended: On** keeps the model's extended thinking behavior.
* **Extended: Off** can reduce latency and token use when the task does not need as much reasoning.

The control appears only for models and providers that support it. Extended thinking stays on by default.

### Review the Context Sent with a Prompt

When you select content in an editor, the chat composer shows that selection as a removable chip before you send the prompt. Selection chips can represent:

* Selected text in documents and code files
* Spreadsheet cells
* A selected mockup screen
* One or more Excalidraw shapes
* Selection types contributed by other editors

Remove a chip when you do not want that selection sent to the model. Removing it changes only the pending prompt; it does not change or deselect the content in the editor.

### Contextual Tips

Empty sessions and other core surfaces can show contextual tips instead of a blank state. These cards point you toward features that fit what you are doing right now, such as opening Tracker mode when your work spreads across many sessions, worktree flows, keyboard shortcuts, shared docs, and mobile pairing. Tips often include a direct action like **Open Tracker**, plus **Next** and **All tips** controls so you can browse more guidance without interrupting your work.

### Session Kanban Board

Open the Session Kanban with **Cmd/Ctrl+Shift+K** to see all sessions in the workspace grouped by phase (Backlog, Planning, Implementing, Validating, Complete).

Hover any session card and its transcript opens in a peek popover. If the session is running, the transcript streams in live, so you can watch what the agent is doing without opening the session. The peek shows the recent context of long turns, not just the trailing tokens, and works for sessions, workstreams, and child sessions inside a workstream.

### Self-Pacing Session Wakeups

Agents can schedule themselves to wake up later and continue working, useful for long-running tasks where the agent needs to check back after a delay rather than running continuously.

* The agent picks the wakeup time itself, anywhere from 60 seconds to 7 days out.
* Wakeups persist across app restarts, but only fire while Nimbalyst is running.
* When a wakeup fires, you get an OS notification; clicking it focuses the workspace and opens the session.
* A wakeup banner appears in the session header with **Cancel** and **Fire now** controls, and sessions with a pending wakeup show a clock icon in the session list.

If the workspace window is closed when the wakeup is due, the wakeup waits and re-fires the next time you open that workspace.

### Agent Attention List

The Agent navigation icon shows a badge when sessions are running, unread, or waiting for you.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-75b3e376966a731316b9238c7d43706d9907163f%2Fagent-attention-list.png?alt=media" alt="The Agent navigation icon with a 9+ badge next to a Sessions panel showing 166 need attention and an Awaiting Input group"><figcaption><p>The attention list groups sessions by what they need, so a blocked agent does not disappear into session history.</p></figcaption></figure>

Open the icon to see sessions grouped as:

* **Awaiting input**: the agent is blocked on a question, approval, or permission.
* **Running**: the agent is actively working.
* **Unread**: the session has new activity you have not opened.

Select a session to open it. **Mark all read** clears unread state, but it does not approve requests or answer sessions that are awaiting input.

Agents can also send a local system notification when a workflow needs your attention and you have stepped away. Clicking the notification returns you to the relevant workspace and session. Notification availability follows your operating-system and Nimbalyst notification settings.

### Menu Bar Session Fleet

On macOS, the menu bar shows your session fleet without opening the app:

* The menu bar names a session as it starts, finishes, blocks, or fails, and flags a session that has stopped responding.
* When nothing is running, it quiets to a single mark.
* Click the session name the menu bar is showing to open that session in Nimbalyst.
* Open the panel to see which sessions are running, completed, or need attention, and click any session to navigate directly to it.
* The sessions panel can mark every unread session as read at once.
* A settings row in the panel lets you turn any of this behavior off.
* The dock and Agent navigation badges show a count for sessions that need your attention.

In session history, a session that launched other sessions is marked with an icon; hover it for a tooltip showing how many sessions it launched.

### Window State Persistence

The Agent window remembers, per workspace:

* Window size and position
* Active tab in the sidebar
* Session ID
* Developer tools state (if open)
* Transcript scroll position


# AI Usage Report

See which models and tools your AI sessions use, compare activity across projects over time, and find Nimbalyst tools you have not tried yet.

The AI Usage Report shows how you use models and tools across Nimbalyst. Use it to understand activity over time, compare projects, and discover tools that are available but not yet part of your workflow.

Open it from **Window > AI Usage Report**.

If you are deciding between API keys and a Claude or Codex subscription, see [Claude Code and Codex subscriptions](https://nimbalyst.com/claude-code-codex-subscriptions/).

## Overview

The **Overview** tab combines:

* Session and token totals
* An activity heatmap
* Historical usage over time
* Per-project activity

The project cards at the bottom break the all-project totals down by workspace, including sessions, tokens, and the date of the latest activity.

## Tool Usage

Open the **Tools** tab to see calls made to:

* Built-in agent tools, such as reading files, searching, editing, and running commands
* MCP tools
* Tools contributed by Nimbalyst extensions

The report includes:

* Your most-used tools
* Successful and failed call counts
* Built-in versus MCP and extension usage
* Calls over time
* Usage by provider
* Usage by project

Tool counts describe calls, not time spent or tokens consumed by a tool.

## Backfill Earlier Sessions

New tool calls are recorded automatically. Click **Backfill history** to populate the report from compatible Claude Agent and Codex sessions created before tool tracking was enabled.

Backfill reads your stored Nimbalyst session history. It does not rerun the sessions or call the tools again.

## Where the Data Lives

The report is generated from usage data stored locally by Nimbalyst. Tool tracking records the tool identity, project, provider, count, and error count; it does not turn tool inputs or outputs into a public activity feed.

The AI Usage Report is separate from provider billing dashboards. For authoritative subscription limits, API charges, or provider-specific usage windows, use the dashboard provided by the model provider.


# View Files in Agent Mode

View and edit the files an AI session touches directly inside Agent mode, without switching to Files mode to check what the agent did.

When an agent edits or reads files during a session, those files appear in a panel on the right side of the Agent window. You can open, review, and edit them there, next to the conversation, instead of switching to Files mode to check what the agent did.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FH6FXj4W3TzqUfvw0sVLx%2Fimage.png?alt=media&amp;token=85de293b-24c9-4563-9fd9-c60d8ef3ab31" alt="The Agent window with a session transcript in the center and the Files Edited panel on the right, showing an edited file with Keep and Revert controls"><figcaption><p>The Files Edited panel on the right lists what the session changed, with per-file review controls and a commit area below.</p></figcaption></figure>

### How to use

* When a session, workstream, or worktree touches a file, it appears in the right panel.
* Click a file to open it. You can open multiple files in tabs, and resize or hide the panel as needed.
* Edit files directly while collaborating with your agent.
* Right-click any file to open it in Files mode if you prefer the full editor experience.

Seeing agent output as rendered files rather than terminal text is the core idea behind the [visual editor for Claude Code](https://nimbalyst.com/visual-editor-for-claude-code/). In a workstream, the same panel combines files from every session; see [Workstreams](/session-management/workstreams).

### Collapsing sections

The panel groups files under section headers (Edited, Referenced, Read). Click a header to collapse or expand that group, which helps when a long session has touched many files.

### Tips

* **Long filenames** are truncated. Hover to see the full relative path from your workspace.
* **Multiple edits** to the same file are aggregated, so you see the total lines added and removed across all changes.
* **Git status updates** automatically when you switch back to Nimbalyst from another app.
* **Empty state**: if no files have been touched yet, the panel shows "No file interactions yet."


# Workstreams

Workstreams group related AI sessions that touch the same files or topic, so you can branch an approach without losing the earlier thread.

A workstream is a group of related AI sessions that appear together as tabs, share one combined view of edited files, and are grouped as one item in your session list. Use a workstream when several sessions belong to the same effort: trying a second approach to the same problem, running a side task in parallel, or splitting a big job across a few agents.

You never create a workstream from the New session menu. A workstream forms automatically the moment a session gains a second session.

### Creating a workstream

Start a session as usual. When you want to branch your work or run a related task alongside it, click the **+** button next to the session tab. The tooltip reads **New session in workstream**.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-94572852e602599e0f9c3a367c46675d64996fbb%2Fdocs-workstream-add-session.png?alt=media" alt="The plus button at the right edge of the session tab bar"><figcaption><p>Click + beside the session tabs to add a related session.</p></figcaption></figure>

Your single session converts into a workstream. Each session gets its own tab, and the session list on the left groups them under one parent with a session count.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-416dcc478e86d829bb794eb4c2be9eb7b3878354%2Fdocs-workstream-tabs.png?alt=media" alt="A workstream open in the Agent window with two related session tabs across the top"><figcaption><p>The original session becomes a workstream, with a tab for each related session.</p></figcaption></figure>

### One view of every file changed

The right panel shows all files modified across every session in the workstream, so you can review the combined result of the work in one place.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FlVaongwNZ6iNS0UzKFDN%2Fimage.png?alt=media&amp;token=601dd8ca-1c22-4b14-84ad-cd35a3c8d8eb" alt="The files panel listing files edited across all sessions in the workstream"><figcaption><p>Files edited by any session in the workstream, in one list.</p></figcaption></figure>

Click a file to open it right there in Agent mode, next to the sessions that changed it.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fs5JJaGk7uCFMOPl7V0Bb%2FFiles%20in%20Agent.png?alt=media&amp;token=b3ed9bdb-4d16-4a87-b98c-91a8920d42e4" alt="A file from the workstream open in the Agent mode editor"><figcaption><p>Click a file to review it in Agent mode.</p></figcaption></figure>

Right-click a file to open it in Files mode instead.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2F20zlCUi2LATrtWBh8sNx%2Fimage.png?alt=media&amp;token=31a31d97-f077-45f6-ac1c-5ff86c7351e0" alt="The right-click menu on a file, with the option to open it in Files mode"><figcaption><p>Right-click for the option to open in Files mode.</p></figcaption></figure>

### Workstreams and worktrees

These are easy to mix up:

* A **workstream** groups sessions. By default, its sessions share the same project folder and branch; grouping sessions does not itself isolate their file changes.
* A **worktree** gives a session its own git branch and folder, isolated from your main checkout. With Developer Mode enabled, choose **New Worktree** from the New session menu.

Use a workstream to organize related sessions; use a worktree when a session's changes should stay off your main branch. A session in a worktree can also grow into a workstream, so the two combine.

For running many agents against one project at once, see [agent orchestration](https://nimbalyst.com/features/agent-orchestration/) and [parallel Claude Code sessions](https://nimbalyst.com/parallel-claude-code-sessions/).

### Letting the agent add sessions

You can also ask the agent working in a session to spin off a sibling for a side task, without leaving the current session. Run `/launch-new-session` and describe the side task.

By default the new session joins the caller's workstream as a **sibling**, so the edited-files view and workstream overview are shared. The original session stays focused on its own thread while the sibling runs in parallel. You can mention the reasoning effort you want the new session to run at, or let the agent pick one that fits the work.

If the side task should be fully separate, say so ("isolated bug fix", "fix and commit separately") and the agent creates a top-level session instead of a sibling. Either kind can also be put on its own worktree branch; sibling-vs-isolated and worktree are independent choices.

You can also launch sibling sessions from the composer's Actions dropdown by configuring an Action with `launch: new-session`. See [AI Actions](/session-management/ai-actions) for the config keys.

### Why use workstreams

* Keep related work organized without losing context
* Compare different approaches to the same problem side by side
* Review all file changes from multiple sessions in one place


# Import Claude Code Sessions

Import sessions from the Claude Code CLI into Nimbalyst so you can browse, search, resume, and continue past terminal conversations visually.

If you have been using the Claude Code CLI in a terminal, you can bring those sessions into Nimbalyst and continue them in the Agent window. Imported sessions become regular Nimbalyst sessions: you can browse, search, and resume them, and they keep their full history.

Nimbalyst runs on top of the Claude Code you already have installed, so imported CLI sessions keep working the same way. See the [Claude Code GUI page](https://nimbalyst.com/claude-code-gui/).

### How to import

1. Open **File > Import Claude Code Sessions...**

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FjZ5tvwYbZraEBk5pVhHl%2Fimage.png?alt=media&amp;token=85f69be7-5e2c-4a08-be07-fd85357ababf" alt="The File menu open, with Import Claude Code Sessions... highlighted"><figcaption><p>The import command lives in the File menu.</p></figcaption></figure>

2. The import dialog scans your Claude Code session storage for sessions tied to the current workspace and shows totals at the top:

* **Total** sessions found
* **New** sessions not yet imported
* **Updates** to sessions you have already imported (Claude Code added more turns since your last import)
* **In Sync** sessions that already match what is in Nimbalyst

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FJdouQPJsFjf5eL69zMXF%2Fimage.png?alt=media&amp;token=51ec85e8-a376-4220-9b8c-d940dea4e439" alt="The import dialog with Total, New, Updates, and In Sync counts, a title search box, a project group, and an Import 2 Sessions button"><figcaption><p>The dialog shows each session's age, message count, and sync status. Check the ones you want, then click Import.</p></figcaption></figure>

3. Search by title, expand the project group, and check the sessions you want to import.
4. Click **Import n Sessions**.

Imported sessions show up in the Agent window session list and the kanban board. You can resume them, link them to tracker items, or open them in a worktree just like any other Nimbalyst session.

### What gets imported

* Full conversation history, including subagent turns
* Extended-thinking blocks
* Long tool results (inlined so they show up in the transcript)
* Follow-up prompts within a turn

### Workspace matching

Nimbalyst matches Claude Code's on-disk session directories to your current workspace. Workspaces with spaces, apostrophes, or accented characters in their path are handled correctly.

If the workspace-filtered scan finds nothing, the dialog falls back to showing all available Claude Code sessions and tells you the scope was broadened, so you can still import sessions that Claude Code stored under a different resolved path or sibling worktree.

### Tips

* Import is idempotent. Running it again on a session that already matches Nimbalyst's copy is a no-op; it shows up under **In Sync**.
* **Has Updates** means Claude Code added more turns to a session since you last imported it. Re-checking and re-importing brings the new turns over.
* Import works with sessions from Claude Code 2.1.x and later.


# / Commands and Skills

Use Claude Code and Codex slash commands, custom commands, and skills in Nimbalyst, and learn how actions, commands, and skills differ.

Slash commands and skills are reusable instructions for your agent: type `/` in the chat and pick one instead of retyping the same request. Nimbalyst supports Claude Code and Codex built-in slash commands, your own custom commands, and skills, all from the same typeahead.

### Actions vs Commands vs Skills

**Actions** are reusable prompt presets defined in a single `nimbalyst-local/ai-actions.md` file and surfaced as a dropdown in the composer. Pick one and the prompt drops into your draft. Best for "I copy-paste this prompt all the time." Typical examples include reviewing changed files, planning an implementation, and drafting release notes. See [AI Actions](/session-management/ai-actions).

**Commands** are simple markdown files that provide a prompt template. They live in `.claude/commands/`. When you type `/command-name`, the contents of that file are sent as a prompt to the agent.

**Skills** are richer integrations that can include instructions, workflows, and tool usage patterns. Nimbalyst ships with built-in skills (like `/commit`), plugins can provide skills, and you can create your own. A skill can define how the agent should behave for a specific workflow, for example how to manage your tracker state when working on blog posts.

### Using Slash Commands and Skills

Type `/` in the AI chat to see all available commands and skills. The typeahead shows every skill (user-created, plugin, and extension) so you can quickly find what you need.

Plugin skills are namespaced, and the inserted command matches what the agent SDK routes. For example:

* `/excalidraw:excalidraw`
* `/planning:design`
* `/feedback:bug-report`

Skills and commands written for one agent run in the other: workflow discovery is unified across Claude Code and Codex.

Ready-made skills you can drop into a project are listed on the [Nimbalyst skills page](https://nimbalyst.com/skills/), and the [commands and skills feature page](https://nimbalyst.com/features/commands-and-skills/) covers how they surface in the composer.

### @ Mentions

Type `@` in the AI chat to reference files and folders. The picker opens immediately, with suggestions sorted by recency so the files you most recently opened or edited are at the top. Keep typing to filter, or scroll to find older files. You can mention individual files or entire directories (shown with a folder icon).

Mentioning a file gives the agent direct context about which files you want it to work with, instead of relying on the agent to search for them.

In markdown documents, `@` is also the fastest way to embed supported custom-editor files. If the inserted file link sits by itself on its own line, Nimbalyst upgrades it into a live inline embed in WYSIWYG view. This is useful for mockups, Excalidraw files, data models, CSV files, and other custom-editor content you want to keep inside a spec or plan.

### @@ Session Mentions

Type `@@` in the AI chat to reference another session. The picker shows your sessions in recency order, so the conversation you were just in is one keystroke away.

Mentioning a session pulls its context into your current conversation. Use it when you want the agent to build on prior work, reuse research from an earlier session, or understand decisions made elsewhere, without re-explaining everything.

### Built-in Examples

**`/commit`** creates a git commit:

1. Runs `git status` and `git diff`
2. Reviews recent commits for style
3. Drafts a commit message with type prefix (`feat:`, `fix:`, etc.)
4. Stages and commits

**`/session-cleanup`** tidies your Sessions board:

1. Audits your sessions by phase and tags
2. Suggests phase corrections (for example, moving committed work out of planning)
3. Flags old completed sessions as archive candidates
4. Asks for your approval before changing anything

**`/planning:nimbalyst-coach`** reviews your project and recent sessions, then suggests extensions that match your files, features you have not tried, and instructions worth adding. It changes nothing until you approve.

**`/feedback:bug-report`** and **`/feedback:feature-request`** guide you through filing a bug report or feature request on the public Nimbalyst GitHub repo. See [Feedback, Discord, Support, and Releases](/getting-started/feedback-discord-support-releases).

### Create Your Own Commands

Custom commands live in `.claude/commands/` as markdown files. Go to the `.claude` directory in your project, then the `commands` folder, and edit or add your own commands there.

You can also go to Settings (click the gear on the bottom left), then Project Settings, to add commands.

### Create Your Own Skills

Skills are a powerful way to teach the agent how to handle recurring workflows. For example, you can create a skill that integrates with the tracker system, telling the agent to update tracker state whenever you work on certain types of tasks. See the [tracker overview](/task-management/overview) for how trackers fit into this.


# AI Actions

AI Actions are reusable prompt presets that show up in the Nimbalyst composer. Define them in one workspace file so they version and share.

AI Actions are reusable prompt presets that show up as a dropdown in the AI composer. Pick one and the prompt drops into your draft, ready to send or edit. They live in a single file in your workspace, so they are easy to version, share, and edit.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-6c70358812bd221e8d850f97ed65839bed641196%2FAI%20Actions%20Dropdown%20Dark.png?alt=media" alt="The Actions dropdown open above the AI composer, listing entries like Review changed files, Plan implementation, Draft release notes, and an Edit actions... link"><figcaption><p>The Actions dropdown open in the composer, with entries loaded from ai-actions.md and an Edit actions link at the bottom.</p></figcaption></figure>

### When to use Actions

Actions are the lightest-weight way to reuse a prompt:

* **Action**: a prompt you reuse often, defined in one file, picked from a dropdown.
* **Command** (`/`): a slash command in `.claude/commands/<name>.md`. Runs in either Claude Code or Codex.
* **Skill**: a richer integration with workflow logic and tool usage patterns.

If you find yourself pasting the same prompt more than twice, turn it into an Action.

See the [commands and skills feature page](https://nimbalyst.com/features/commands-and-skills/) for how Actions, Commands, and Skills differ in practice.

Starter Actions often include patterns like:

* **Review Changed Files**
* **Plan Implementation**
* **Draft Release Notes**
* **Inspect Current Editor**

### Where Actions live

Actions are defined in `nimbalyst-local/ai-actions.md` in your workspace. The first time you open the Actions dropdown in a workspace without that file, you'll see a "Create ai-actions.md with examples" button that seeds it with a few starter entries.

### File format

Each `## Heading` is one action. Everything between that heading and the next `##` is the prompt body that gets inserted into the composer.

```markdown
# AI Action Prompts

## Review changed files
/review changed files in this session and call out regression risk
in the affected modules.

## Plan implementation
Look at the active issue and the open editor. Produce a structured plan that:
- breaks the work into 3-5 phases
- identifies the files I'll need to touch
- flags any cross-cutting concerns

When you're done, ask me which phase to start with.

## Inspect current editor
Read the file that's currently open and tell me what you'd change. Be specific:
- 3 concrete improvements
- 1 thing that's already good and shouldn't change
```

### Launching a new sibling session from an Action

By default an Action drops its prompt into the current composer. You can also configure an Action to spin up a brand-new sibling session and submit the prompt there, so the current session stays focused on what it was already doing. See [Workstreams](/session-management/workstreams) for how sibling sessions appear in the sidebar.

Add a fenced YAML config block right under the heading:

````markdown
## Investigate in a new session
```yaml
launch: new-session
model: claude-code:opus
foreground: false
autoSubmit: true
```

Spin up a sibling investigation. Read the open file and the linked tracker item.
Produce a one-page summary of what the change should do, what it must not break,
and three risks to watch for. Reply in the sibling session when done.
````

Supported config keys:

| Key          | Values                                                          | What it does                                                                                                                      |
| ------------ | --------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| `launch`     | `same-session` (default), `new-session`                         | Whether the Action drops its prompt into the current composer or starts a sibling session.                                        |
| `model`      | a provider-qualified model id (for example, `claude-code:opus`) | Model to use when `launch: new-session`. Defaults to the current session's model.                                                 |
| `foreground` | `true` (default), `false`                                       | When `false`, the sibling session opens in the background so you stay focused on the current one.                                 |
| `autoSubmit` | `true` (default), `false`                                       | When `false`, the prompt is dropped into the sibling's composer but not sent. Useful when you want to tweak it before submitting. |
| `worktree`   | `false` (default), `true`                                       | When `true`, the new session starts in a git worktree. This requires `launch: new-session` and a git repository.                  |

Actions with `launch: new-session` show a small "open in new" icon in the dropdown so you can tell at a glance which ones will spin up a sibling.

### Editing your Actions

Click **Edit actions…** at the bottom of the Actions dropdown to jump straight to `nimbalyst-local/ai-actions.md`. Save the file and the dropdown updates the next time you open it. No restart needed.

### Sharing Actions with a team

`nimbalyst-local/` is normally gitignored, so Actions stay local by default. To share the same Action set through git, explicitly unignore and commit `nimbalyst-local/ai-actions.md` in your repository, or copy the file to teammates through another trusted channel. Pair this with `.claude/commands/` and your skills/CLAUDE.md to make a one-clone-and-go agent environment.


# Interactive Prompts (PromptForUserInput)

PromptForUserInput is a built-in Nimbalyst tool that lets your agent collect several answers at once through one structured widget.

`PromptForUserInput` is a built-in tool that lets your agent collect several inputs from you at once through a single structured widget in the transcript. Instead of asking three narrow questions back to back, the agent surfaces one prompt with multiple fields and waits for you to submit. Use it whenever you want to drive a decision visually: ranking, picking from a list, confirming, or editing a draft.

### When to use it

Ask for an interactive prompt when you want to:

* Prioritize a list by dragging items into order (for example, "help me prioritize my blogs")
* Approve or reject recommended changes in bulk (for example, "review these recommended changes to my tracker, keep some, drop others")
* Edit a short draft inline before the agent acts on it, such as a tweet, commit message, or summary
* Confirm a destructive or important action
* Collect a few related answers in one shot instead of a chat back-and-forth

More on how Nimbalyst passes structured input back to your agent is on the [agent integration page](https://nimbalyst.com/features/agent-integration/).

### How to trigger it from chat

You usually do not need to name the tool. Just describe the interaction you want:

* "Show me a prioritization widget for these blog posts so I can drag them into the order I want to publish."
* "Give me a checklist of the changes you recommend to my tracker so I can approve the ones I like."
* "Draft a tweet thread for this release and let me edit it before posting."
* "Ask me to confirm before you run the migration."

If your agent ignores the hint and falls back to plain chat, you can be explicit: "Use the `PromptForUserInput` tool."

### Field types

A single prompt can mix any of these five fields:

* **multiSelect**: pick any subset from a list of options. Good for "approve these, skip these".
* **singleSelect**: pick exactly one option. Good for choosing a branch, mode, or template.
* **reorder**: drag items into the order you want, with optional per-item removal. Good for prioritization.
* **editText**: inline rich-text editor for short drafts, using the same editor Nimbalyst uses elsewhere.
* **confirm**: yes/no confirmation with custom labels.

### Examples

#### Prioritize blog posts (reorder)

> **You:** I have five blog drafts in `/blog/drafts/`. Show me a prioritization widget so I can drag them into the order I want to publish, and let me drop any I want to kill.

The agent returns a single prompt with a `reorder` field listing the five drafts. You drag them into order, click the trash icon on the ones you want to drop, and submit. The agent then continues with the ordered, filtered list.

#### Approve tracker changes (multiSelect)

> **You:** Look at my open tracker items and recommend changes. Ask me which ones to apply.

The agent surveys your tracker, then surfaces a `multiSelect` prompt with each recommended change as an option ("Close issue #142 as duplicate", "Re-label #156 as bug", and so on). You check the ones you want, leave the others, and submit. The agent applies only the approved changes.

#### Draft and edit a tweet (editText + confirm)

> **You:** Draft a tweet announcing the 0.60.1 release and let me edit it before you post anything.

The agent surfaces one prompt with two fields: an `editText` field pre-filled with the draft, and a `confirm` field asking whether to post it. You polish the wording in place, flip confirm to yes, and submit.

### Voice mode behavior

In Voice Mode, the agent decides per prompt whether voice can handle the interaction or whether to defer to the on-screen widget. Long drafts and reorders with more than six items default to the screen, since reading them aloud is not useful. Short single-select and confirm prompts stay in voice.

### For extension and agent developers

`PromptForUserInput` is exposed as a standard MCP tool. Any agent that speaks MCP (Claude Code, Codex, OpenCode, GitHub Copilot, your own extension) can call it. The same prompt works on desktop and on the iOS app.

The schema is a flat type-discriminator object. Each field carries a `type` ("multiSelect", "singleSelect", "reorder", "editText", or "confirm") plus the options or initial value for that type. The response comes back as a JSON object keyed by field id. The wire name is `PromptForUserInput`, not `RequestUserInput`, to avoid collision with the Codex CLI's built-in `request_user_input` tool.

A minimal call looks like this:

```json
{
  "title": "Prioritize blog drafts",
  "fields": [
    {
      "id": "order",
      "type": "reorder",
      "label": "Drag into publish order",
      "items": [
        { "id": "a", "label": "Why we built Workstreams" },
        { "id": "b", "label": "Voice Mode tour" },
        { "id": "c", "label": "0.60.1 release notes" }
      ],
      "minItems": 1
    },
    {
      "id": "confirm",
      "type": "confirm",
      "label": "Lock in this order?"
    }
  ]
}
```

### Related

* [MCP](/setup-nimbalyst/mcp): overview of Nimbalyst's built-in MCP tools, including `AskUserQuestion` for simpler multiple-choice prompts.
* [Agent Window & Session Management](/session-management/agent-window-and-session-management): where these prompts appear in the transcript.


# Automations

Schedule recurring AI tasks in Nimbalyst. Automations run on a timer from a markdown file to produce standups, weekly reports, and reviews.

Automations are recurring AI tasks that run on a schedule inside Nimbalyst. Use them for anything you would otherwise do by hand on a rhythm: a daily standup summary, a weekly status report, a periodic code review.

Each automation is a markdown file in `nimbalyst-local/automations/`. The frontmatter defines the schedule and output settings, and the markdown body is the prompt that runs on each execution.

The [automations feature page](https://nimbalyst.com/features/automations/) covers scheduling patterns teams use, such as standups and recurring reviews.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FMfjzjXV1FnGKLbImxQbQ%2Fimage.png?alt=media&amp;token=86fd6966-4292-4962-b6aa-e7a260cdae82" alt="An automation file open in the editor, with a header bar showing Status Active, Schedule Daily at 09:00, last run date, run count, and a Run button"><figcaption><p>An open automation file. The header bar shows its status, schedule, last run, and run count above the prompt.</p></figcaption></figure>

## Creating an Automation

### Quick: Use `/automation`

Type `/automation` followed by a description:

```
/automation summarize my git commits every weekday morning
```

Nimbalyst creates the automation file with the right schedule and prompt, sets it to disabled so you can review it first, then tells you to open the file and enable it.

### Manual: Create the File

Create a `.md` file in `nimbalyst-local/automations/` with this format:

```markdown
---
automationStatus:
  id: standup-summary
  title: Daily Standup Summary
  enabled: false
  schedule:
    type: weekly
    days: [mon, tue, wed, thu, fri]
    time: "09:25"
  output:
    mode: new-file
    location: nimbalyst-local/automations/standup-summary/
    fileNameTemplate: "{{date}}-standup.md"
  runCount: 0
---

# Daily Standup Summary

Review the git log and recent file changes in this workspace since the previous business day. Summarize:

1. **What was accomplished** - List completed work based on commits and file changes
2. **What's in progress** - Identify files with uncommitted changes or recent branches
3. **Any blockers** - Note any error logs, failing tests, or stale branches

Format as a concise standup update suitable for sharing with the team.
```

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FIYQU8kxR0QI2fRzrqx3R%2Fimage.png?alt=media&amp;token=14e321d2-723e-4104-9c11-40390db93f3e" alt="The file tree showing an automations folder under nimbalyst-local, containing a daily-github-build-summary.md file and its output folder"><figcaption><p>Automation files live under nimbalyst-local/automations/, next to their output folders.</p></figcaption></figure>

## Document Header Controls

When you open an automation file, a header bar appears at the top of the editor with:

* **Enable/Disable toggle**: turn the automation on or off
* **Schedule display**: shows the schedule in plain language (for example, "Weekdays at 9:25 AM")
* **Last run info**: when it last ran and whether it succeeded
* **Run Now button**: trigger the automation immediately without waiting for the next scheduled time

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FMfjzjXV1FnGKLbImxQbQ%2Fimage.png?alt=media&amp;token=86fd6966-4292-4962-b6aa-e7a260cdae82" alt="The automation header bar with an enable toggle, Daily, Weekly, and Interval schedule tabs, a time picker, model selector, run history, and Run button"><figcaption><p>The header bar includes the enable toggle, schedule controls, a model selector, run history, and a Run button.</p></figcaption></figure>

## Schedule Types

### Daily

Runs once per day at the specified time.

```yaml
schedule:
  type: daily
  time: "09:00"
```

### Weekly

Runs on specific days of the week at the specified time. Valid days: `mon`, `tue`, `wed`, `thu`, `fri`, `sat`, `sun`.

```yaml
schedule:
  type: weekly
  days: [mon, wed, fri]
  time: "14:00"
```

### Interval

Runs every N minutes while Nimbalyst is open.

```yaml
schedule:
  type: interval
  intervalMinutes: 60
```

## Output Modes

Each run's output is written to files. You control how with the `output` block:

| Mode         | Behavior                                                                                                   |
| ------------ | ---------------------------------------------------------------------------------------------------------- |
| **new-file** | Creates a new file per run. Use `fileNameTemplate` with `{{date}}`, `{{time}}`, and `{{id}}` placeholders. |
| **append**   | Appends each run's output to a single `output.md` file with date headers.                                  |
| **replace**  | Overwrites a single `output.md` file each run, so only the latest result is kept.                          |

**Example output config:**

```yaml
output:
  mode: new-file
  location: nimbalyst-local/automations/standup-summary/
  fileNameTemplate: "{{date}}-output.md"
```

## AI Provider

By default, automations run using Claude Code. You can optionally specify a different provider or model:

```yaml
provider: claude-code     # "claude-code", "claude", "openai", or "openai-codex"
model: claude-code:sonnet # optional: specific model ID
```

## Execution History

Each automation tracks its run history in a `history.json` file inside the output directory. This includes timestamps, duration, success or error status, and links to the AI session that produced the output.

You can also ask the agent in chat:

```
What's the run history for my standup-summary automation?
```

## Example: Weekly Project Status Report

```markdown
---
automationStatus:
  id: weekly-status
  title: Weekly Project Status
  enabled: true
  schedule:
    type: weekly
    days: [fri]
    time: "16:00"
  output:
    mode: new-file
    location: nimbalyst-local/automations/weekly-status/
    fileNameTemplate: "{{date}}-status.md"
  runCount: 0
---

# Weekly Project Status

Generate a weekly status report for this project:

1. **Summary** - One paragraph overview of the week's progress
2. **Completed** - List all merged PRs and completed features this week (check git log)
3. **In Progress** - List open branches and their status
4. **Metrics** - Count commits, files changed, and lines added/removed
5. **Next Week** - Based on open branches and TODOs, suggest priorities

Format as a clean markdown report.
```

## Frontmatter Fields Reference

| Field                      | Required         | Description                                                     |
| -------------------------- | ---------------- | --------------------------------------------------------------- |
| `id`                       | Yes              | Unique kebab-case identifier                                    |
| `title`                    | Yes              | Human-readable name                                             |
| `enabled`                  | Yes              | `true` or `false`                                               |
| `schedule.type`            | Yes              | `daily`, `weekly`, or `interval`                                |
| `schedule.time`            | For daily/weekly | Time in 24h format (`"HH:MM"`)                                  |
| `schedule.days`            | For weekly       | Array of day abbreviations                                      |
| `schedule.intervalMinutes` | For interval     | Number of minutes between runs                                  |
| `output.mode`              | Yes              | `new-file`, `append`, or `replace`                              |
| `output.location`          | Yes              | Path for output files (relative to workspace)                   |
| `output.fileNameTemplate`  | For new-file     | Filename with `{{date}}`, `{{time}}`, and `{{id}}` placeholders |
| `provider`                 | No               | AI provider to use                                              |
| `model`                    | No               | Specific model ID                                               |
| `runCount`                 | Auto             | Incremented on each run                                         |
| `lastRun`                  | Auto             | ISO timestamp of last execution                                 |
| `lastRunStatus`            | Auto             | `success` or `error`                                            |
| `nextRun`                  | Auto             | ISO timestamp of next scheduled run                             |

## Tips

* **Start disabled**: new automations default to `enabled: false`. Review the prompt and schedule before enabling.
* **Edit anytime**: just edit the markdown file. Changes are picked up within 30 seconds.
* **Run Now to test**: use the Run Now button in the document header to test your automation before relying on the schedule.
* **Check output**: outputs appear in the `location` directory. Open them from the file tree.
* **Automations only run while Nimbalyst is open**: if Nimbalyst is closed at the scheduled time, the automation does not fire retroactively.


# Share Link to a Session

Create a public share link for an AI session so anyone can read the full transcript in a browser without installing Nimbalyst.

A share link publishes a read-only copy of a session transcript (or a markdown file) at a public URL, so a teammate can read it in a browser without installing Nimbalyst. Use it to show someone what an agent did, hand off context, or share an interesting conversation.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FjgnnSOUcDjDBNwKaoWXb%2Fimage.png?alt=media&amp;token=e1622df8-487f-4013-bdc5-7a0316d7619a" alt="The right-click menu on a session in the session list, showing options including Rename, Pin, Copy Session ID, and Share link"><figcaption><p>Right-click a session in the list and choose Share link.</p></figcaption></figure>

### How to share

You must be signed in to a Nimbalyst account before you create a link.

1. Right-click a session in the session list.
2. Select **Share link**.
3. Choose whether the link expires after **1 day**, **7 days**, or **30 days**. Nimbalyst remembers this choice for the next link.
4. If you use multiple accounts, choose which account owns the link.
5. Click **Copy link**, then paste it anywhere: Slack, email, X, or a document.

After sharing, the session menu changes to **Copy share link** and **Unshare**. Unshare removes the hosted copy immediately.

### Security and safety

* Anyone with the link can view the shared content. Do not share sessions containing sensitive information.
* Shared content is encrypted on your computer before upload. The decryption key lives in the URL fragment and is not sent to the share server, so anyone who receives the complete URL can decrypt the content in their browser.
* There is no separate password. Access ends when the chosen expiration is reached or you select **Unshare**.

Shared links are read-only. For live collaboration on the same session context, see [Nimbalyst for Teams](https://nimbalyst.com/teams/).


# Tracker Overview

Nimbalyst has a built-in issue tracker that keeps bugs, features, tasks, and plans in your project, next to your docs and AI sessions.

Nimbalyst's tracker manages work items, bugs, tasks, features, ideas, decisions, and plans, directly alongside your AI sessions and project files. Use it when you want the work you are tracking and the agents doing the work in the same place, instead of copying between a separate ticket tool and your editor. Each item type has its own status workflow, fields, and icon, and you can define custom types to fit your project.

The [task management feature page](https://nimbalyst.com/features/task-management/) shows the tracker in context alongside docs and sessions, and [kanban for Claude Code](https://nimbalyst.com/kanban-for-claude-code/) covers the board view for agent work.

Tracker types can be personal to you or shared with a team. Shared items support real-time field and rich-body editing, team comments and activity, and the same kanban, list, tag, relationship, agent, and session-linking workflows. See [Collaborative Trackers](/team-collaboration/trackers).

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-0b533280b9b50e6be856abbe640b2f1b351af83a%2Ffeature-tracker-kanban.png?alt=media" alt="The tracker kanban board showing a Bugs board with To Do, In Progress, In Review, and Done columns, filter chips and type list in the left sidebar"><figcaption><p>The kanban board for the Bugs type. The sidebar holds filters and one entry per tracker type; the toolbar has search, sort, import, and +New.</p></figcaption></figure>

## Why work in trackers instead of folders

Task trackers and document tools are usually separate, which forces a choice: either a task is a one-line ticket and the actual thinking lives in a document somewhere else, or you write the document and nothing tracks its state. Nimbalyst removes the split. **Every tracker item contains a full document**, so the work and the record of the work are the same object.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-e1750c7e063384cff0a05a0bfdd912c2811e3897%2Ftracker-item-content-document.png?alt=media" alt="A tracker item open beside the item list, its Content section holding a full document with headings, prose, an embedded mockup, and a comment thread"><figcaption><p>The item's Content section is a complete document, not a description field. Headings, embeds, and comments all live inside the item.</p></figcaption></figure>

The Content section is the same editor you get in any markdown file. Write the spec, the repro steps, the rollout plan. Embed a mockup, an Excalidraw diagram, a data model, a spreadsheet. Add checklists, tables, and code blocks. Reference other tracker items as live chips and other files as live embeds. Leave anchored comments on a specific passage.

### Your file tree stays clean

Without a tracker, every piece of work sheds files: a spec, a scratch note, a diagram, a follow-up list, each needing a folder and a name and a decision about where it belongs. Six months later nobody remembers whether the auth rework notes are under `docs/`, `planning/`, or `archive/2026/`.

When the writing lives inside the item, none of that reaches your file tree. The project keeps the files that are genuinely project artifacts, and the thinking around each piece of work stays attached to that piece of work.

### Let the flow carry the work, then archive it

The intended rhythm is to work through the tracker rather than to file things:

1. Create the item when the work appears, from a chat, a `/track` command, or the **+New** button.
2. Write and think inside it as the work develops, embedding whatever the work needs.
3. Move it across statuses as it progresses, and link the sessions, files, and pull requests it touches.
4. When it is done, mark it done. When it is no longer live, archive it.

Archiving is not deleting. An archived item keeps its body, its comments, its activity log, and every link it had to sessions, files, and other items.

It does get out of your way. Archived items are hidden from the board, from lists, from quick-open search, and from the tracker reference picker. To see them, add an **Archived** filter in the tracker filter box, or use a saved view that includes them. `nim tracker unarchive NIM-123` brings one back to active.

So finished work leaves your board without leaving your project. It is out of sight by default and retrievable on purpose, which is the thing folder-based organizing never quite manages.

### Folders still work, and trackers point at them

None of this replaces your file tree. Code, real documentation, and anything that belongs in the repository should stay a file under version control.

The two systems connect in both directions. A tracker item can link files for reference and can embed them live in its body. A markdown file can carry `trackerStatus` frontmatter and become an item itself, or contain inline `#type[...]` tags and tracker reference chips that show live status beside the prose. So a tracker item can point at the spec in `docs/`, and that spec can point back.

The rule of thumb: if it is a durable artifact of the project, make it a file. If it is the work itself, with a beginning, a middle, and an end, make it a tracker item and write inside it.

### Expand an item to full width

When the body grows past a comfortable size for the side panel, open **Expanded tracker content** for a full-width editing surface, with the item list still on the left and a chat about the item on the right.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-113ff79bfa7a9c434ee6a877fa961fbf9899cb82%2Ftracker-expanded-content.png?alt=media" alt="Expanded tracker content view, showing a full-width item body with a checklist, a slash-command insert menu, and an embedded Excalidraw diagram, with the item list on the left and a Chat about this item panel on the right"><figcaption><p>Expanded view gives the item body the full window, with the item list on the left and a chat scoped to this item on the right.</p></figcaption></figure>

Everything behaves as it does in the panel, with more room: slash commands for diagrams, tables, checklists, code blocks, collapsible sections, and column layouts. **Back to tracker** returns you to the board.

### What you can track

Nimbalyst includes seven built-in item types:

* **Bug**: Defects and issues to fix
* **Task**: General work items and to-dos
* **Idea**: Early-stage ideas before they become work
* **Decision**: Architectural and product decisions with context
* **Plan**: Larger initiatives with progress tracking
* **Milestone**: Groups of work organized around a target date
* **Release**: Groups of work shipped through an alpha or stable channel

Each type has its own statuses, fields, and color-coded icon. You can also define [custom tracker types](/task-management/custom-tracker-types).

### How items get created

Items can come from several sources:

* Ask the AI agent during a chat session
* Use the `/track` command for quick creation
* Write inline `#type[...]` tags in any markdown file
* Add `trackerStatus` YAML frontmatter to a markdown document
* Click the **+New** button in the tracker panel

### Where items are stored

Depending on how you create it, an item lives in one of three places:

* In Nimbalyst's local database, as a native tracker item
* Inside a markdown file, if you created it with an inline `#type[...]` tag
* As a markdown file itself, if the file carries `trackerStatus` frontmatter

Items you share also sync through the team's tracker space. Sharing an individual item is explicit; a tracker type that is shared with the team shares all of its items by design. See [Sharing Plans and Trackers](/task-management/sharing-plans-and-trackers).

### Learn more

* [Item Types and Fields](/task-management/item-types-and-fields): Built-in types, statuses, and field definitions
* [Kanban and List Views](/task-management/kanban-and-list): Board mechanics, filtering, and saved views
* [Item Detail](/task-management/item-detail): Editing fields, comments, and activity logs
* [Creating Items](/task-management/creating-items): All of the creation paths with examples
* [AI Integration](/task-management/ai-integration): How agents create, update, and query items
* [Commits and Sessions](/task-management/commits-and-sessions): Linking items to git history and conversations
* [Custom Tracker Types](/task-management/custom-tracker-types): Define your own types
* [Local Config](/task-management/local-config): Project-level settings and file organization


# Item Types and Fields

Nimbalyst ships seven built-in tracker item types, each with its own status workflow, fields, and icon. Learn what each type is meant to track.

Nimbalyst includes seven built-in tracker types. Each has its own status workflow, fields, and color-coded icon, so a bug moves through different stages than an idea, milestone, or plan. The type determines which columns appear on the kanban board and which fields are available in the detail view. If none of these fit a workflow, you can change them or add your own with [custom tracker types](/task-management/custom-tracker-types).

### Bug

For tracking defects and issues.

* **Icon:** Bug report (red)
* **Statuses:** To Do, In Progress, In Review, Changes Requested, Approved, Done, Won't Do, Duplicate
* **Fields:** Title, Status, Priority, Owner, Description, relationships, Tags

### Task

For general work items and to-dos.

* **Icon:** Task (blue)
* **Statuses:** To Do, In Progress, In Review, Changes Requested, Approved, Done, Won't Do, Duplicate
* **Fields:** Title, Status, Priority, Owner, Description, relationships, Tags

### Idea

For capturing ideas before they become work items.

* **Icon:** Lightbulb (yellow)
* **Statuses:** New, Considering, Accepted, Rejected
* **Fields:** Title, Status, relationships, Tags

### Decision

For recording architectural and product decisions with context.

* **Icon:** Gavel (purple)
* **Statuses:** To Decide, Evaluating, Decided, Implemented
* **Fields:** Title, Status, Chosen (the decision made), Priority, Owner, Stakeholders, relationships, Tags

### Plan

For larger initiatives with progress tracking.

* **Icon:** Flag (blue)
* **Statuses:** Draft, Ready, In Development, In Review, Changes Requested, Approved, Completed, Rejected, Blocked
* **Fields:** Title, Status, Plan Type, Priority, Progress (0-100%), Owner, Stakeholders, relationships, Tags, Start Date
* **Plan Types:** System Design, Feature, Bug Fix, Refactor, Documentation, Research

Plan items suit long-lived planning: write the goals, strategy, and architecture in the item's body, keep it updated as the work develops, and track progress on the item itself. Note this is different from Claude Code's `/plan` command, which creates a temporary plan for one implementation pass and is not integrated with the tracker. If you want conversational planning that lands in the tracker, create a custom slash command or skill (for example `/spec`) and have it create or update a Plan item.

### Milestone

For grouping work around a target date.

* **Icon:** Flag (purple)
* **Statuses:** Planned, Active, Done, Cancelled
* **Fields:** Title, Status, Owner, Start Date, Target Date, Description, Items, Tags

### Release

For grouping work into an alpha or stable release.

* **Icon:** Rocket (blue)
* **Statuses:** Planned, In Progress, Released, Cancelled
* **Fields:** Title, Status, Version, Git Tag, Channel, Released At, Owner, Description, Items, Tags

### Priority Levels

All item types that support priority use the same four-level scale:

| Priority | Use For                                       |
| -------- | --------------------------------------------- |
| Critical | Blocking issues that need immediate attention |
| High     | Important work that should be done soon       |
| Medium   | Standard priority (default)                   |
| Low      | Nice-to-have or can wait                      |


# Views: Kanban, List, and Tag Board

Switch between kanban board, list, and tag board views in the Nimbalyst tracker, then save any filter and grouping as a named view to reuse.

The tracker gives you several ways to look at the same items: a kanban board for moving work through statuses visually, a list view for dense sortable data, and a tag board for organizing by tag. Save any arrangement of filters and grouping as a named view to return to later.

See [kanban for Claude Code](https://nimbalyst.com/kanban-for-claude-code/) for how teams run agent work off a board.

### Kanban Board

The kanban board organizes items into columns by status. Each item type has its own status workflow, so the columns change depending on which type you are viewing. For custom types, the columns follow the order of the status options you defined in the type's schema.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-0b533280b9b50e6be856abbe640b2f1b351af83a%2Ffeature-tracker-kanban.png?alt=media" alt="The tracker kanban board for the Bugs type with To Do, In Progress, In Review, and Done columns and filter controls in the sidebar"><figcaption><p>A Bugs board with columns for each status. Sort controls sit above the board; filters and the type list are in the sidebar.</p></figcaption></figure>

### Moving Items

* **Drag between columns** to change an item's status. Dragging a task from "To Do" to "In Progress" updates the item immediately.
* **Drag within a column** to reorder items. Manual ordering lets you prioritize work visually without changing status.

### Card Display

Each card on the board shows:

* Type icon (color-coded by item type)
* Item title
* Priority badge (if set)
* Owner avatar (if assigned)
* Type tag label

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-115063b64d46478d73535d61097fcdcf5f697eea%2Ffeature-tracker-kanban-crop-card.png?alt=media" alt="Close-up of kanban cards showing status dot, title, type tag, priority badge, and owner avatar"><figcaption><p>Cards show a status dot, the title, the type tag, a priority badge when set, and the owner's avatar when assigned.</p></figcaption></figure>

### Detailed View

Click any card to open its detail view.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FO1AGQnZZMYV52JmNVnf1%2Fimage.png?alt=media&amp;token=7c79598b-f0b8-4cbc-8d02-ab6894320a5b" alt="A kanban board with a task selected and its detail panel open on the right showing status, priority, owner, content, and sessions"><figcaption><p>Selecting a card opens the detail panel on the right, with the item's fields, content, and linked sessions.</p></figcaption></figure>

### Selection

* **Click** a card to select it and open the detail panel.
* **Shift-click** to select a range of cards.
* **Click a column header** to select all cards in that column.
* **Right-click a column header** to open a context menu with bulk actions.

### Filtering

Filter chips and controls sit in the Tracker sidebar:

* **Mine**: Show only items assigned to you.
* **Unassigned**: Show only items with no owner.
* **High Priority**: Show items with High or Critical priority.
* **Favorites**: Show items you have starred.
* **Recently Viewed**: Return to items you opened recently, ordered by your most recent view.
* **Edited by Others**: Show the latest items whose most recent known editor is someone other than you.
* **Recent**: Show the 50 most recently updated items.
* **Archived**: Switch from active items to archived items.
* **Type filter**: Select which item type to display (Bug, Task, Plan, and so on).
* **Text search**: Search across titles, descriptions, and item IDs.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-84e019b4c84fa30533205b911383f38d7f904ebf%2Ftracker-navigation-filters.png?alt=media" alt="Tracker sidebar showing Favorites, Recently Viewed, Edited by Others, Recent, and Archived filters"><figcaption><p>Combine personal filters, type folders, saved views, search, and board controls to focus on the work that matters now.</p></figcaption></figure>

Click the star on a Tracker row or card to add or remove it from Favorites. Favorites and recently viewed state belong to you; starring an item does not change it for teammates.

The three recency filters are mutually exclusive because each uses a different ordering. Other filters can be combined and saved as a named view.

### List View

Switch to the list view for a table-based layout. The list view shows one row per item with sortable columns.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-a46905703e639d6197a4827b3d46b5f14f54db7e%2Ffeature-tracker-list-view.png?alt=media" alt="The tracker list view showing one row per task with status, priority, owner, and updated-time columns"><figcaption><p>The list view: one row per item with its status, priority, owner, and when it was last updated.</p></figcaption></figure>

* **Click a column header** to sort by that field (title, status, priority, owner, etc.).
* **Resize columns** by dragging the column border.
* **Configure visible columns** to show or hide fields that matter to you.
* Turn on the optional **Shared** column to see which items are shared with your team (off by default). See [Sharing Plans and Trackers](/task-management/sharing-plans-and-trackers).
* The same filtering and search controls from the kanban view apply here.

The list view works well when you have many items and need to scan or sort quickly, while the kanban view is better for visualizing workflow stages.

### Tag Board

The tag board (alpha) arranges items into one column per tag, with an "Untagged" column for the rest. An item with several tags appears in each matching column, so you can see everything touching a given area at once. Switch to it from the view buttons at the top of the tracker. The tag board is for organizing and scanning; open an item to make changes.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-ef5b8bc50f90858cf2e539b4ac4a2526611cbe26%2Frelease-collab-trackers.png?alt=media" alt="Tracker tag board showing plans grouped into #playwright and #search columns"><figcaption><p>The tag board groups items into a column per tag. Use the search bar to filter by tag with #.</p></figcaption></figure>

### Display Settings

Display Settings control how the current tracker is laid out: the view mode, grouping, ordering, and sort.

* Display Settings are remembered per tracker type, so grouping bugs by status does not regroup every other tracker.
* The **Type** column can show the type's name instead of its icon, which helps when several custom types share similar icons.

### Saved Views

Any combination of type filter, filter chips, grouping, and view mode can be saved as a named view. Set the tracker up the way you want it, then in the **Saved Views** section of the sidebar click **+**, name the view, and press Enter. Saved views appear in the sidebar; click one to reapply all of its settings at once. Remove a view by hovering it and clicking the **×**.


# Item Detail, Comments, Activity

Open a tracker item to edit fields in place, write the body, add comments, and follow the full activity history of a piece of work.

The detail view is where you work on a single tracker item: edit its fields in place, discuss it in comments, review its history, and launch or link the AI sessions that carry it forward. Click any item in the kanban board or list view to open it.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-0fbd30141094086763ebe3f1a02d128c03ffc6b3%2Ffeature-tracker-detail.png?alt=media" alt="A task selected on the kanban board with its detail panel open on the right, showing status, priority, owner, content location, and a Sessions section"><figcaption><p>The detail panel for a task: status, priority, and owner dropdowns, the item's content location, and the Sessions section with Launch Session.</p></figcaption></figure>

### Editable Fields

* **Title**: Click the title text to edit it inline.
* **Status**: Dropdown with all valid statuses for the item's type.
* **Priority**: Dropdown (Critical, High, Medium, Low).
* **Owner**: User picker to assign responsibility.
* **Description**: Text area for detailed notes and context.
* **Tags**: Add or remove categorization tags.
* **Due Date**: Date picker for deadlines.
* **Progress**: Percentage slider, available on Plan items only.

Fields vary by item type. For example, Release items include Version, Git Tag, Channel, and Released At, while Idea items keep a smaller set of fields for early-stage work. See [Item Types and Fields](/task-management/item-types-and-fields).

### Comments

Add comments to discuss an item without changing its fields. Each comment shows the author and timestamp.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-0fbd30141094086763ebe3f1a02d128c03ffc6b3%2Ffeature-tracker-detail.png?alt=media" alt="The item detail panel where fields, comments, and activity live"><figcaption><p>Comments and activity live in the same detail panel as the item's fields.</p></figcaption></figure>

Comments are useful for team discussions, leaving notes for your future self, or recording context that doesn't fit in the description. AI agents can also add comments to items during sessions.

You can edit or delete your own comments. Hover a comment you wrote and use the pencil to edit it inline (press Enter to save, Escape to cancel), or the trash icon to delete it. Edited comments are marked as edited.

### Activity Log

Every change to an item is recorded in the activity log:

* **Who** made the change (you or an AI agent)
* **When** it happened
* **What** changed (field name, before value, after value)

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-0fbd30141094086763ebe3f1a02d128c03ffc6b3%2Ffeature-tracker-detail.png?alt=media" alt="The item detail panel, which records every field change in its activity history"><figcaption><p>The detail panel records every change to the item, whether made by you or by an agent.</p></figcaption></figure>

The activity log provides a complete audit trail. When an AI agent updates an item during a session, marking a bug as done or changing a plan's progress, that change is recorded with the same detail as manual edits.

### Linked Sessions

Linked sessions appear at the top of the detail panel, above the item's fields, with a count. Each one shows the provider, the session title, and when it was last active. Click one to jump back to that conversation. Use **Launch Session** to start a fresh session for the item, or **Link Existing** to connect a session you already have.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-261cebdaa67f16c8367d6d611a0b6e17e8976bb0%2Frelease-0667-nim-cli.png?alt=media" alt="Tracker item detail with the Sessions section at the top, above Status and Priority"><figcaption><p>The Sessions section sits at the top of the item detail, with Link Existing and Launch Session controls.</p></figcaption></figure>

Linking is deliberate: creating or updating an item does not attach your current session unless you ask for it. See [Linking Sessions and Tracked Items](/task-management/linking-sessions-and-tracked-items).

### Open an Item in Agent Mode

A tracker item opens as a tab in Agent mode, exactly like a file. You get the item's full body above and the agent session below, so you can write in the item and direct the agent against it without switching modes or losing your place.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-e3f49359c60f613d5c3676cc85eb1d55fc76d0b8%2Ftracker-open-in-agent-mode.png?alt=media" alt="Agent mode with a tracker item open as a tab above the session, showing the item body with its fields and content on top, the agent conversation underneath, and the session edits panel on the right"><figcaption><p>The item opens as a tab above the session. Edit its body on top, work with the agent underneath.</p></figcaption></figure>

This is the natural place to work an item end to end. The agent reads and updates the same item you are editing, its file changes appear in the right panel as it goes, and the item stays linked to the session so the connection survives after you move on.

Use the **Files**, split, and **Agent** controls at the top right to change how much room the item and the conversation each get.

### Choose What the Right Panel Shows

The panel on the right of the agent window is a switcher, not a fixed sidebar. Use the dropdown in its header to change what it displays.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-b1455399ae377394df64bd3b06e43e20298bd434%2Fagent-right-panel-switcher.png?alt=media" alt="The agent window right panel dropdown, open on three options: Edited Files with a checkmark, Review, and Chat with Session"><figcaption><p>Switch the right panel between edited files, review, and a chat about the session.</p></figcaption></figure>

* **Edited Files**: The files the agent created and changed in this session, with uncommitted changes and commit controls.
* **Review**: The review queue for changes waiting on your approval.
* **Chat with Session**: A conversation about the session itself, separate from the main transcript.

When you have a tracker item open, the same panel can also scope a chat to that item. See [Agent Window & Session Management](/session-management/agent-window-and-session-management).

### Launch an Isolated Worktree

When Git worktrees are available, choose **Launch Worktree** in the Sessions section to start an isolated worktree and AI session for the item.

Nimbalyst proposes a branch and worktree name from the Tracker key and title, inserts a live Tracker reference into the session draft, and links the resulting session back to the item. Review the worktree details before creating it.

Use **Launch Session** for work that can happen in the current project checkout. Use **Launch Worktree** when the task needs its own branch and filesystem state. See [Worktrees](/developer-features/worktrees).

### Linked Files

Items backed by markdown files show their source file path. You can also explicitly link additional files to an item for reference: design docs, specs, or related source code.


# Creating Items

Several ways to create tracker items in Nimbalyst, from asking your AI agent during a session to writing inline tags or YAML in markdown.

You can create a tracker item wherever the work first appears: in a chat with the agent, inline in a document you are writing, or straight from the tracker panel. This page walks through each path, from conversational AI to structured YAML.

### From Chat

Ask the AI agent to create items during any session:

> "Create a bug for the login page crash on Safari" "Track this as a feature request: dark mode for the dashboard" "Log a decision: we're using PostgreSQL instead of MongoDB"

The AI determines the appropriate type, sets the status and fields based on your description, and creates the item. Ask the agent to link the item to the current session when that relationship should be recorded.

Turning a conversation into tracked work is one of the workflows in [project planning](https://nimbalyst.com/use-cases/project-planning/).

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-60961e5f4be762b3e1af1b3e7196c83362ab1b80%2Ffeature-tracker-create-chat.png?alt=media" alt="A chat panel where the user asks for a bug to be created for a Safari crash and the agent confirms it created a critical bug item, next to an open plan document"><figcaption><p>Ask the agent in chat to create an item. Here it files a critical bug for the Safari crash while a plan document stays open in the editor.</p></figcaption></figure>

### From the /track Command

Use `/track` in the chat input for quick inline creation:

```
/track Login page crashes on Safari when clicking forgot password
```

The AI analyzes your description, determines the item type (bug, task, feature, etc.), and creates the item. This is the fastest path when you know what you want to track.

### Inline in Markdown

Track items directly within any markdown document using `#type[...]` syntax:

```markdown
## Sprint Items

- Fix Safari crash #bug[status:to-do priority:critical]
- Add dark mode toggle #feature[status:in-progress priority:high owner:karl]
- Consider Redis for caching #idea[status:new]
- Use WebSockets over polling #decision[status:decided]
- Migrate to PostgreSQL #task[status:to-do priority:medium]
```

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-16fce2e510620d60d255c474b35786e601f24eb2%2Ffeature-tracker-inline-tags.png?alt=media" alt="A markdown plan document with a Next Steps checklist whose lines carry inline #task and #idea tags rendered as chips with priority and status icons"><figcaption><p>Inline tags render as live chips in the document. Each checklist line here is also a tracked task or idea.</p></figcaption></figure>

Inline items appear in the tracker alongside full-document items. Edit their properties in the markdown text or through the tracker UI; changes sync both ways.

### From YAML Frontmatter

Add `trackerStatus` frontmatter to any markdown file to make it a tracked item:

```yaml
---
trackerStatus:
  type: plan
title: Database Migration Strategy
status: draft
priority: high
owner: karl@example.com
tags: [backend, database]
---

## Overview

This plan covers migrating from SQLite to PostgreSQL...
```

The tracker system automatically picks up files with `trackerStatus` frontmatter and displays them in the kanban board. Changes to the file update the tracker item, and changes made through the tracker UI update the file.

This approach works well for plans, decisions, and features that deserve their own dedicated document.

For plans and decisions you don't have to write that block by hand. Open the three-dot Actions menu on any markdown document and use [Set Document Type](/visual-editors-powered-by-ai/markdown-wysiwyg/set-document-type) to have Nimbalyst write the frontmatter for you.

### Quick Track from Anywhere

Press **Cmd+Shift+I** anywhere in the app to file a tracker item of any type without leaving what you are doing. Pick the type, give it a title, and it lands in your tracker. Before you add it, Quick Track offers similar existing items, so you can jump to one instead of creating a duplicate.

### From the Tracker Panel

You can also click the **+New** button in the tracker panel to create an item directly. Select the type, fill in the fields, and the item is added to your tracker.


# Referencing Tracker Items

Drop a live reference to any tracker item into a document or AI chat. The chip shows the current status and title and stays up to date.

This page covers mentioning a tracker item inside a document or an AI chat. The reference renders as a chip that shows the item's current status and title, and it stays current as the item changes. For structured item-to-item relationships like parent and child, see [Linking Tracker Items](/task-management/linking-tracker-items); for connecting items to AI sessions, see [Linking Sessions and Tracked Items](/task-management/linking-sessions-and-tracked-items).

### Insert a reference with

In a document, type `#` and start typing to search your items by key, title, or description. Pick one from the list to insert it as a chip. Typing `##` or `###` still creates a heading, so your markdown headings are unaffected.

* Narrow the search to one type by including its name, for example type `#bug` to list only bugs, then keep typing to filter.
* Archived items are left out of the picker.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-85adb773f776560c3461ad66a3494be6b4ac6287%2Ftracker-reference-picker.png?alt=media" alt="The tracker reference picker filtered to bug items after typing #bug"><figcaption><p>Type # to search your items. Add a type name, like #bug, to narrow the list.</p></figcaption></figure>

The same reference works in the AI chat, so you can point the agent at a specific item as you talk to it.

### What the chip shows

A reference chip can show the item's type, issue key, live title, workflow state, and owner. Because it resolves the item live, those values update on their own as the item changes. Completed items keep their reference but cross out the title, making finished work visible without making the link disappear.

Click a chip to open a preview with the item's status, type, priority, and owner, plus a **Go to item** button that takes you straight to it. If the underlying item can't be found (it was deleted, or has not synced to this machine yet), the chip shows the identifier in muted text and marks it as not resolved.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-b4fd9d8a39aa1bfc25f2d153b234ec8cf53dd856%2Ftracker-reference-chip.png?alt=media" alt="An inserted tracker reference chip and its preview card with a Go to item button"><figcaption><p>A reference chip, and the preview that opens when you click it, with status, type, priority, and a Go to item button.</p></figcaption></figure>

In raw markdown, a reference is stored as a link using the `nimbalyst://` scheme, so it survives round-tripping through plain text.

### References from the AI

When an agent mentions a Tracker item in chat, it links the item as the same clickable chip instead of plain text. You get the live workflow state at a glance and can click through to the item without hunting for it.

References to other AI sessions in the transcript are clickable too, so you can move directly to the related conversation.


# Linking Tracker Items

Link tracker items to each other with parent, blocks, and duplicate relationships. Links are two-way, so setting one side updates the other.

This page covers structured relationships between tracker items: a module can be the parent of its features, a plan can block another plan, a bug can duplicate another. Links are two-way, so setting one side makes the reverse show up on the other item automatically. For loose mentions of an item inside a document or chat, see [Referencing Tracker Items](/task-management/referencing-tracker-items); for connecting items to AI sessions, see [Linking Sessions and Tracked Items](/task-management/linking-sessions-and-tracked-items).

### Relationship fields live on the tracker type

Item-to-item links are not switched on for every type by default, which is why they can be hard to find at first. A type gets them when its schema includes one or more **relationship fields**. Each relationship field sets:

* the **relationship** it represents (parent of, child of, depends on, blocks, relates to, duplicates, or supersedes),
* the **target types** it is allowed to link to, and
* whether it holds a **single** item or **many**.

The example below is a custom "Feature Module" type whose schema defines three relationship fields: **Parent Module** (child of), **Submodules** (parent of), and **Features** (parent of, pointing at feature items).

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-29445a9cc5058604edd173affb67feb1ed57f6e2%2Ffeature-tracker-relationship-fields.png?alt=media" alt="A Feature Module item showing Parent Module, Submodules, and Features relationship fields"><figcaption><p>Relationship fields defined on a type: Parent Module (child of), Submodules (parent of), and Features (parent of).</p></figcaption></figure>

### Set up the fields (ask your agent)

The quickest way to add relationship fields is to ask the AI agent in Nimbalyst to edit the type's schema. For a parent/child hierarchy, tell it something like:

> "For this tracker type, update the schema to support linked trackers. Make this tracker the parent of this tracker, and that one the child (a parent can have multiple children)."

Once it updates the schema, tell it which items to link to which, or let it work the links out from context. You can also edit the schema by hand under **Settings > Project > Trackers** (relationship is one of the field types). See [Custom Tracker Types](/task-management/custom-tracker-types).

### Link items

With relationship fields on the type, open an item's detail panel. Each relationship field lists the items already linked as pills. Click the **+** on the field, type in the box to find an item by key or title, and choose it. Remove a link with the **×** on its pill. A field can be restricted to certain target types, so if an item you expect is missing, it may not be an allowed type for that field.

### Two-way "Linked from" backlinks

When a relationship field is paired with an inverse field on the other type, the link stays in sync on both ends. In the Feature Module example, adding an item to **Submodules** automatically fills that item's **Parent Module** field, and removing either side clears the other. A field backlinks only when its schema names an inverse field; a one-way field records just the side you set.

### Relationship types

These are the relationship keys a field can use, with their natural inverse:

| Relationship | Inverse                                |
| ------------ | -------------------------------------- |
| Parent of    | Child of                               |
| Depends on   | Blocks                                 |
| Relates to   | Relates to (symmetric)                 |
| Duplicates   | reference (set an inverse to backlink) |
| Supersedes   | reference (set an inverse to backlink) |


# Sharing Plans and Trackers

How to share Nimbalyst plans and tracker items with teammates, and how personal and shared trackers differ in practice.

Plans and other full-document tracker items start out personal to your machine. You can share an individual item with your team so everyone works from the same copy, and edits sync both ways, including changes made offline. This page covers per-item sharing; for the complete team workflow, including shared boards, collaborative item bodies, comments, history, agent access, links, and shared tracker types, see [Collaborative Trackers](/team-collaboration/trackers).

Shared boards and the rest of the team layer are described on the [Teams trackers page](https://nimbalyst.com/teams/trackers/).

### Share an item

Open the item's detail panel and click **Share**. The button switches to **Shared** and the item becomes visible to your team. Click **Shared** again to make it local-only.

Sharing is available when:

* Your workspace has a team configured, and
* The item is a native tracker item or one backed by a markdown file (frontmatter or imported).

Inline tracker items, the ones written as markers inside a document, are always local. Promote one to a full item first if you want to share it. Some tracker types belong to the whole team by design; their items are always shared and have no per-item toggle.

### What stays in sync

Once an item is shared, its status, lifecycle, and body stay in sync across the team. Edits from teammates flow back to you, and edits you make offline sync the next time you reconnect. Session links are personal, so they are cleared when an item becomes shared.

### Seeing what is shared

Each item carries a small sync indicator: local, pending (waiting to sync), or synced. To scan sharing across many items at once, turn on the optional **Shared** column in the table view (see [Views: Kanban, List, and Tag Board](/task-management/kanban-and-list)). It is off by default.


# AI Integration

AI agents in Nimbalyst can create, update, and query tracker items during a session. Link the ones that matter, or turn agent access off.

AI agents in Nimbalyst can use the tracker: they can create, update, and query items during a session, so the board stays current while the work happens. You can link the items that matter back to the session for traceability, and you can turn agent access off per project.

Letting agents keep the board current is one of the workflows on the [task management feature page](https://nimbalyst.com/features/task-management/).

### Creating Items

During a coding or planning session, the AI can create tracker items on the fly when it identifies work to track:

> "I found a potential memory leak in the WebSocket handler. I've created a bug item to track it."

You can also ask the agent directly:

> "Create a task for updating the API documentation" "Log an idea: real-time collaboration for the editor" "Track a decision: we chose Tailwind over styled-components"

The agent selects the appropriate type, sets fields based on your description, and creates the item.

### Updating Items

Ask the agent to modify existing items:

> "Mark the login bug as done" "Set the database migration plan to in-progress and assign it to me" "Add a comment to bug #123 saying the fix is in PR #456" "Change the priority of the caching task to critical"

The agent can update any field: status, priority, owner, description, tags, and progress.

The agent can also **reclassify an item to a different type**, for example turning a task into a bug, without losing its comments, attachments, or session links. Just ask:

> "Convert task #42 to a bug" "This idea is actually a feature, reclassify it"

### Querying Items

Ask about your project's current state:

> "What bugs are currently open?" "Show me all high-priority tasks assigned to me" "List decisions made this month" "How many items are in the In Review column?" "Find all items tagged with 'backend'"

The agent can filter by type, status, priority, owner, tags, and perform full-text search across titles and descriptions.

### Session Linking

When an agent creates or updates a tracker item and explicitly links it to the session, the item is connected to that conversation. This means:

* From any item, you can see which sessions touched it
* From any session, you can see which items were created or modified
* You can trace the full history of an item back to the conversations that shaped it

Neither creating nor updating an item auto-links the current session. The agent has to opt in, which keeps sessions from accumulating unrelated items when the agent is just logging work in passing. Ask for the link when you want it recorded. See [Linking Sessions and Tracked Items](/task-management/linking-sessions-and-tracked-items).

### AI Agent Access

You control whether AI agents can use your trackers, per project. In **Settings > Project > Trackers**, the **AI Agent Access** toggle turns the tracker tools on or off for that project. It is on by default. Turn it off and the tracker tools are removed from the agent entirely, so it can neither read nor change your items. The change takes effect for new agent sessions.

### Transcript Widgets

Tracker operations performed by the agent appear as structured widgets in the chat transcript, not just plain text. Each widget shows the item type, title, status, and other key fields. Click the widget to navigate directly to the item in the tracker.

This makes it easy to review what the agent created or changed without scrolling through conversation text.


# Commits and Session Linking

Reference a tracker item ID in a git commit message and Nimbalyst links that commit to the item, giving traceability from idea to shipped code.

Tracker items connect to your git history, so you can trace a bug fix, feature, or task from the idea to the code that shipped it. This page covers commit linking; for connecting items to AI conversations, see [Linking Sessions and Tracked Items](/task-management/linking-sessions-and-tracked-items).

### Commit Linking

When a git commit message references a tracker item ID, the commit is linked to that item in the detail view. This lets you see exactly which commits relate to a bug fix, feature, or task.

For example, a commit message like:

```
Fix Safari login crash (NIM-42)
```

automatically associates the commit with tracker item NIM-42. The item's detail view shows the linked commit with its hash, message, and timestamp.

Tracing a change from item to commit to pull request is covered in [coding progress](https://nimbalyst.com/use-cases/coding-progress/).

### Opt-in automation

Turn commit-tracker linking on under **Settings > Application > Advanced**. When enabled, Nimbalyst links commits through a session's linked tracker items and by scanning commit messages for issue-key references, including commits made in the terminal. This setting applies across the app. See [Local Config](/task-management/local-config).


# Linking Sessions and Tracked Items

Link AI sessions to tracker items so the conversation behind a bug fix or a design decision stays attached to the work item it produced.

Linking a session to a tracker item keeps the conversation behind a bug fix or a design decision attached to the item it produced, so you can get back to either one from the other. This page covers item-to-session links; for links to git commits, see [Commits and Session Linking](/task-management/commits-and-sessions), and for relationships between items, see [Linking Tracker Items](/task-management/linking-tracker-items).

### Session Linking

Session linking is deliberate. Creating or updating an item does not automatically attach every active session. Link the session when the conversation is part of the item's implementation or decision history:

* Ask the agent to create an item and link it to the current session
* Tell the agent to link an existing item while it updates the item's status or fields
* Open the item and choose **Link Existing** to select a session yourself
* Choose **Launch Session** to start a new session from the item

### Navigating Between Items and Sessions

The connection is bidirectional:

* **From an item:** The detail view shows all linked sessions. Click any session to jump back to that conversation.
* **From a session:** The agent sidebar panel shows tracker items linked to the current session. Click any item to open its detail view.

### Linked Tracker Items Sidebar

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2F3TaRzSuILUzb02w2Sv0H%2Fimage.png?alt=media&amp;token=09e045fd-2c26-4620-91b6-be3b9abc05ec" alt="The agent sidebar&#x27;s Trackers section listing one linked bug item with an in-review status badge"><figcaption><p>The Trackers section of the agent sidebar, showing a bug linked to the current session with its status badge.</p></figcaption></figure>

In agent mode, a dedicated sidebar panel shows all tracker items linked to the current session. This panel updates when the agent or a person adds a link, giving you a live view of the work associated with the conversation.

### Closing the loop

Session and commit linking connect planning to execution. You can start with an idea, track it through a decision, assign it as a task, link it to the AI session that implemented it, and see the commits that shipped it, all from the item's detail view.


# Custom Tracker Types

Define your own tracker types in Nimbalyst with YAML config files or from Settings. Custom types get the same board, detail view, and AI integration.

Beyond the seven built-in types, you can define your own tracker types: customer feedback, interview questions, content briefs, or whatever else your project tracks. Custom types get the same kanban board, detail view, and AI integration as built-in types. Define them as YAML files, or edit them visually from Settings.

### Where to Define Custom Types

Create YAML files in your project's `.nimbalyst/trackers/` directory. Each file defines one custom tracker type. Nimbalyst loads these definitions when the workspace opens.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-cd42847320abe56bc94fc95d73d0bd1defdff4c8%2Ffeature-tracker-custom-type.png?alt=media" alt="A kanban board for a custom Customer Feedback type with New, Reviewing, Planned, Shipped, and Won&#x27;t Fix columns, and the type listed in the sidebar"><figcaption><p>A custom Customer Feedback type on the board, with its own status columns and its own entry in the type list.</p></figcaption></figure>

### Example: Customer Feedback

```yaml
# .nimbalyst/trackers/customer-feedback.yaml
type: customer-feedback
displayName: Customer Feedback
displayNamePlural: Customer Feedback
icon: feedback
color: "#f59e0b"

modes:
  inline: true
  fullDocument: false

idPrefix: fb
idFormat: ulid

fields:
  - name: title
    type: string
    required: true
  - name: status
    type: select
    default: new
    options:
      - value: new
        label: New
        icon: fiber_new
      - value: reviewing
        label: Reviewing
        icon: psychology
      - value: planned
        label: Planned
        icon: event
      - value: shipped
        label: Shipped
        icon: rocket_launch
      - value: wont-fix
        label: Won't Fix
        icon: block
  - name: source
    type: select
    options:
      - value: support
        label: Support Ticket
      - value: interview
        label: User Interview
      - value: survey
        label: Survey
      - value: social
        label: Social Media
  - name: customerName
    type: string
  - name: priority
    type: select
    options:
      - value: low
        label: Low
      - value: medium
        label: Medium
      - value: high
        label: High
      - value: critical
        label: Critical

roles:
  title: title
  workflowStatus: status
  priority: priority
```

### Field Types Reference

| Type           | Description                                | Options                                                                     |
| -------------- | ------------------------------------------ | --------------------------------------------------------------------------- |
| `string`       | Single-line text                           | `minLength`, `maxLength`                                                    |
| `text`         | Multi-line text                            | --                                                                          |
| `number`       | Numeric value                              | `min`, `max`                                                                |
| `select`       | Single choice from options                 | `options` array with `value`, `label`, `icon`, `color`                      |
| `multiselect`  | Multiple choices                           | Same as `select`                                                            |
| `date`         | Calendar date                              | --                                                                          |
| `datetime`     | Date and time                              | --                                                                          |
| `boolean`      | True/false toggle                          | --                                                                          |
| `user`         | Person reference                           | --                                                                          |
| `array`        | List of values                             | `itemType`                                                                  |
| `relationship` | Link to other tracker items                | `relationshipTypeKey`, `targetTrackerTypes`, `multiValue`, `inverseFieldId` |
| `url`          | Web address with an optional display label | --                                                                          |
| `object`       | Structured value with nested fields        | `schema`                                                                    |

For how relationship fields behave once defined, see [Linking Tracker Items](/task-management/linking-tracker-items).

### Field Properties

| Property        | Description                                 |
| --------------- | ------------------------------------------- |
| `name`          | Field identifier (used in code and YAML)    |
| `type`          | One of the types listed above               |
| `required`      | Must have a value when creating             |
| `default`       | Initial value for new items                 |
| `displayInline` | Show in compact inline view (default: true) |
| `readOnly`      | Cannot be edited by users                   |

### Roles

Roles map your custom fields to standard tracker behaviors:

| Role             | Purpose                                                      |
| ---------------- | ------------------------------------------------------------ |
| `title`          | Which field is the item's display title                      |
| `workflowStatus` | Which field drives kanban columns                            |
| `priority`       | Which field is the priority level                            |
| `assignee`       | Which field is the item owner                                |
| `tags`           | Which field contains categorization tags                     |
| `progress`       | Which field tracks completion percentage                     |
| `dueDate`        | Which field is the deadline                                  |
| `startDate`      | Which field is the start date                                |
| `reporter`       | Which field records who reported the item                    |
| `externalKey`    | Which field shows an external issue or pull-request identity |
| `prMergedStatus` | Status value to apply when a linked pull request merges      |

### Schema Properties

| Property             | Description                                                     | Default    |
| -------------------- | --------------------------------------------------------------- | ---------- |
| `type`               | Unique identifier for this type                                 | Required   |
| `displayName`        | Singular display name                                           | Required   |
| `displayNamePlural`  | Plural display name                                             | Required   |
| `icon`               | Material Design icon name                                       | Required   |
| `color`              | Hex color for the icon                                          | Required   |
| `modes.inline`       | Show as inline markers in markdown                              | `true`     |
| `modes.fullDocument` | Can be a full markdown document                                 | `false`    |
| `idPrefix`           | 2-3 character prefix for IDs                                    | Required   |
| `idFormat`           | ID generation: `ulid`, `uuid`, or `sequential`                  | `ulid`     |
| `creatable`          | Can users create items of this type                             | `true`     |
| `primaryCapable`     | Can this type be an item's primary type                         | `true`     |
| `supportsTags`       | Automatically provide the standard tags field and role          | `true`     |
| `sharing`            | Ownership of the tracker schema and items: `personal` or `team` | `personal` |
| `draftByDefault`     | In a team tracker, create new items as private drafts           | `false`    |

### Editing a Type from Settings

You do not have to hand-write YAML. Open **Settings > Project > Trackers**, select a type, and choose **Customize**.

For a built-in or custom type, you can:

* Change the singular and plural labels, icon, and color.
* Add, rename, reorder, or remove workflow statuses.
* Give each status its own label, icon, and color.
* Add fields and configure their type, default value, and other properties.
* Assign field roles such as title, workflow status, priority, owner, tags, progress, and dates.

The preview shows how the type and its workflow will appear before you save. Changing a built-in type creates a project-level override; it does not modify Nimbalyst's built-in default for other projects.

Built-in types you have changed show **Reset to default**. Resetting removes the project's override and restores the current Nimbalyst definition, including its original fields and statuses.

### When Files and Settings Drift

Nimbalyst keeps a local copy of each type's schema in step with the YAML files in `.nimbalyst/trackers`. If the two diverge, for example after pulling a teammate's changes in git, a **Schema files are out of sync** warning appears and names the types that differ. Click **Resync from files** to bring the app back in line with the YAML on disk.

### Organize Tracker Types into Folders

Tracker type folders keep a long list of workflows manageable without changing the type itself.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-84d4ab9111bfc8309b721c3243289ffeae5b07da%2Ftracker-type-folders.png?alt=media" alt="Tracker type navigation organized into PM and Engineering, Marketing, and Customers folders"><figcaption><p>Group related Tracker types into folders and keep the most important workflows in a deliberate order.</p></figcaption></figure>

Create folders from the Tracker type navigation, move types into or out of a folder, and drag folders or types into a manual order. Choose **All** to view items across every folder.

Folders organize the navigation only. Moving a type does not change its fields, workflow, issue keys, or existing items.

In a Nimbalyst Team project, the folder structure and manual order synchronize so teammates see the same organization.


# The nim CLI

nim is a command-line tool for Nimbalyst trackers. List, create, update, comment, archive, and import items from your shell, and pipe JSON out.

`nim` is a companion command-line tool for working with your trackers from the terminal. Use it when you live in a shell or want to script against your items: list, create, update, comment on, archive, and import items without opening the app, and pipe results as JSON into other tools. For the tracker itself, see the [Tracker Overview](/task-management/overview).

### Install and run

`nim` ships as an npm package. Install it globally:

```bash
npm install -g @nimbalyst/cli
```

Then run commands as `nim <noun> <verb>`, for example `nim tracker list`. You can also run it without installing, with `npx nim tracker list`.

### How it connects

`nim` finds your workspace and tracker data on its own:

* When Nimbalyst is running, `nim` talks to the app (live mode), so writes go through the same path as the UI.
* When the app is closed, `nim` reads your local tracker database directly. Reads work either way.

A few commands depend on the running app: importing from external sources, linking a live session, and defining or deleting a type. Open Nimbalyst before using those. If you work with more than one project, point `nim` at one with `--workspace <path>`.

### Reading items

```bash
nim tracker list --type bug --status open --priority high
nim tracker list --where severity=critical --since 1d --json
nim tracker get NIM-123
nim tracker show NIM-123        # renders the body
nim tracker types              # list types; add "show <type>" for one schema
```

Common list filters: `--type`, `--status` (or the shortcuts `open` and `closed`), `--priority`, `--owner me`, `--search`, `--since` and `--until`, `--tag`, and `--where field=value` for anything else. Add `--json` for machine output, `--csv --columns key,status,title` for a table, or `--quiet` for just the IDs.

### Creating, updating, and commenting

```bash
nim tracker create bug "Login times out" --priority high --tag auth --body-file repro.md
nim tracker update NIM-123 --status in-review --owner me
nim tracker update NIM-123 --unset owner
nim tracker comment NIM-123 "Repro confirmed on main"
nim tracker archive NIM-123
nim tracker unarchive NIM-123
```

`create` takes the type and a title, plus optional `--status`, `--priority`, `--owner`, `--tag` (repeatable), `--label`, `--field key=value`, `--due`, `--progress`, and `--body` or `--body-file`. `update` takes the same flags to change fields, plus `--unset <field>` to clear one.

### Importing from external sources

With the app open, `nim` can pull items in from installed importers, such as GitHub issues:

```bash
nim tracker importers                                       # what is installed
nim tracker import search github-issues --repo owner/repo --state open
nim tracker import github-issues "owner/repo#42" --type bug
```

### Output and scripting

Every read command supports `--json`, so you can pipe `nim` into other tools. `nim status` reports how it is connecting and which workspace it resolved. Set `NIM_OWNER` so `--owner me` resolves to you, or `NIM_WORKSPACE` to fix a default project. Run any command with `--help` for its full set of flags.


# Local Config

Where Nimbalyst keeps tracker type definitions and markdown-backed items, and which tracker settings live in the app.

Tracker behavior comes from a mix of project files and Nimbalyst settings. Custom type definitions and markdown-backed items can travel through version control. Native tracker items and settings such as the issue-key prefix stay in Nimbalyst's local database and settings store unless you share their tracker with a team.

### Tracker Type Definitions

Custom tracker types live in the `.nimbalyst/trackers/` directory at your project root. Each YAML file in this directory defines one tracker type. Nimbalyst loads all type definitions when the workspace opens.

```
your-project/
  .nimbalyst/
    trackers/
      customer-feedback.yaml
      release-note.yaml
      interview-question.yaml
```

See [Custom Tracker Types](/task-management/custom-tracker-types) for the full YAML schema.

### Markdown-backed tracker items

Nimbalyst's built-in tracker workflows use the `nimbalyst-local/tracker/` directory for markdown files that carry inline tracker tags. You can also track a markdown file anywhere in the project by adding `trackerStatus` frontmatter.

```
your-project/
  nimbalyst-local/
    tracker/
      bugs.md
      sprint-12-tasks.md
      api-decisions.md
      q2-features.md
```

These are standard markdown files. Changes made through the tracker UI update the underlying file, and file edits flow back into the tracker.

### Issue Key Prefix

Each project can have a configurable issue-key prefix (for example `NIM`) for numbered local items. Configure it under **Settings > Project > Trackers**. In a team project, the team owns its shared issue-key prefix; personal items use a separate local prefix so keys do not collide.

### Commit-Tracker Linking

Automatic commit-tracker linking is an opt-in application setting under **Settings > Application > Advanced**. When enabled, Nimbalyst links commits through session relationships and by parsing issue keys (for example `NIM-42`) in commit messages, including commits made in the terminal.

### What Gets Version-Controlled

Tracker files are plain markdown, so they work with any version control system:

* `.nimbalyst/trackers/*.yaml` -- Type definitions travel with the repo. Anyone who clones the project gets the same custom types.
* `nimbalyst-local/tracker/*.md` -- Markdown-backed items can be committed for visibility through git or ignored to keep them machine-local.
* Changes to tracker items via the UI or AI update the underlying markdown files, which show up in your normal git diff and commit workflow.

Native items stored in Nimbalyst's database do not appear in git diffs. To collaborate on those items in real time, use a [team tracker](/team-collaboration/trackers).


# Coding with Coding Agents & Nimbalyst

How to code with Claude Code and Codex inside Nimbalyst, a visual interface for coding agents with your files, diffs, and sessions side by side.

Nimbalyst puts a visual interface on coding agents like Claude Code and Codex, so you can run agent sessions, read their edits as diffs, and browse your files in one desktop workspace. It runs on top of Claude Code and Codex rather than replacing them. See the [Claude Code GUI page](https://nimbalyst.com/claude-code-gui/) and the [Codex GUI page](https://nimbalyst.com/codex-gui/) for what the desktop workspace adds on top.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-92abccde7e0857a13018dfea6ec9c7a6562aa96a%2FCoding%20with%20Nimbalyst%20(1).gif?alt=media" alt="A coding agent session in Nimbalyst, with the session list on the left, red/green edit cards in the transcript, and the Files panel on the right"><figcaption><p>An agent session in Nimbalyst: your prompt, the agent's edits as red/green cards, and the files it touched, all in one view.</p></figcaption></figure>

### Nimbalyst's Two Modes

**Chat Mode** is an AI sidebar for quick questions and targeted edits. Good for:

* Explaining code
* Small edits to the current document
* Quick lookups

**Agent Mode** is full-screen autonomous coding. Good for:

* Multi-file refactors
* Implementing features from a plan
* Running tests and fixing failures iteratively
* Running multiple sessions in parallel

### Code Editor with Diff Visualization

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FTvuT4y8nCeeYNe4wikgB%2Fimage.png?alt=media&amp;token=61c3eaa7-2c26-47c3-bafa-3d66bef8bdd0" alt="A Python file open in the Nimbalyst code editor with syntax highlighting, file tabs, and a minimap"><figcaption><p>The code editor with syntax highlighting, file tabs, and a minimap for navigating longer files.</p></figcaption></figure>

When the AI edits code or a document, changes appear inline:

* **Green background**: added content
* **Red background**: removed content, shown with strikethrough

Changes remain visible until you accept or reject them:

* **Accept All** keeps all changes
* **Reject All** reverts to the original content

### Inline Edit Cards in the Transcript

Both Claude Code's `Edit` tool and Codex's `file_change` tool render as red/green edit cards directly in the session transcript, so you can see exactly what the agent did to each file as the turn unfolds.

Edit cards work for:

* New files, rendered as a single-color "added" card
* Existing files, with red lines for removals and green for additions
* Gitignored or never-snapshotted files
* Renamed and deleted files


# Basics on Code/Git for Non-Devs

A plain-language introduction to code and git for product managers and designers who want to use a coding agent without a dev background.

You do not need to be a developer to get value from a coding agent. This page covers the two things non-developers most often need: getting a copy of your team's code onto your machine, and knowing where to put documents so they are shared with the team through git.

### Working with Code

Coding agents like Claude Code and Codex can read and write code that lives on your machine. To get your team's code locally:

1. Install [GitHub Desktop](https://desktop.github.com/) (or another git client).
2. Ask your dev team for read-only access to the codebase.
3. Use GitHub Desktop to clone (download) the repository to your computer.

Once the code is local, you can open it as a project in Nimbalyst and ask a coding agent questions about it: what a feature does, what has changed recently, or where a piece of behavior lives. If you are a PM working alongside engineers, [Claude Code for product managers](https://nimbalyst.com/claude-code-for-product-managers/) covers the same ground without a terminal.

### Moving Plans or Other Documents into Git

Git only shares files that are inside the repository and not git-ignored. If you want a plan or other document to be synced with git so teammates can see it, move it into a folder that is not git-ignored.

For example, your organization might have a folder for specifications or shared plans. When a plan you are working on is ready for others to see and reference, move it into that folder.


# Turn on/off Developer Mode

Turn Developer Mode on or off in Nimbalyst to show or hide the terminal, git worktrees, and the other git features you may not need.

Nimbalyst has two application modes. Standard Mode keeps the interface focused on writing, editing, and AI assistance; Developer Mode adds the terminal, worktrees, and git tooling. Turn on Developer Mode when you work with code; leave it off if those features would just be clutter.

### What Developer Mode Adds

The following features are only available in Developer Mode:

* Terminal
* Worktrees
* Many git features, such as Pull Request mode

Git-related features also require the project to be a git repository. Everything gated behind Developer Mode is described on the [developer tools page](https://nimbalyst.com/features/developer-tools/).

### Turning Developer Mode On or Off

1. Open **Settings**.
2. Go to **Advanced**.
3. Under **Application Mode**, choose **Standard Mode** or **Developer Mode**.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FPshCPva1v19TOEzd9PR9%2Fimage.png?alt=media&amp;token=8ccb5bd5-01e8-4502-a598-7b1054124bfc" alt="The Advanced Settings panel with Application Mode cards for Standard Mode and Developer Mode, Developer Mode selected"><figcaption><p>Choose Standard Mode or Developer Mode under Settings, Advanced, Application Mode.</p></figcaption></figure>


# Terminal Window

Run a Ghostty-powered terminal inside Nimbalyst. Create multiple terminal sessions in your workspace directory that survive app restarts.

Nimbalyst includes a Ghostty-powered terminal, so you can run commands in your workspace without leaving the app. You can open multiple terminal sessions, each running independently, and their output persists across app restarts. The terminal sits alongside the visual editors rather than replacing them; see the [developer tools page](https://nimbalyst.com/features/developer-tools/). The terminal requires [Developer Mode](/developer-features/turn-on-off-developer-mode).

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FWrUDs581brz2Zot1q077%2FTeminals.png?alt=media&amp;token=bda408ef-32f2-4d09-b7b8-6b2b0ba0233f" alt="Nimbalyst in Agent mode with the terminal panel open along the bottom, showing a shell prompt in the workspace directory"><figcaption><p>The terminal panel opens along the bottom of the workspace, with a shell running in your project directory.</p></figcaption></figure>

### Opening and Closing the Terminal

Open and close the terminal panel from the terminal icon in the left nav, or press **Ctrl+\`**.

Add more terminals by clicking **+** to create a new terminal tab.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FEJWRzBAuLBf2xytN96AR%2FMultiple%20Terminals.png?alt=media&amp;token=83767d38-9280-44f3-9c84-1d6cea089a68" alt="Three terminal tabs across the top of the terminal panel, with a plus button to add another"><figcaption><p>Each terminal tab is an independent shell session; click + to add another.</p></figcaption></figure>

### Using the Terminal

Type commands and press Enter to run them. The terminal works like any standard shell:

* Run commands: `ls`, `git status`, `npm install`, and so on
* Navigate directories: `cd folder`
* Use tab completion (depends on your shell)
* Access command history with the up and down arrow keys

#### Shell Detection

Nimbalyst automatically detects and uses your system shell:

| Platform | Default Shell       |
| -------- | ------------------- |
| macOS    | zsh (or bash)       |
| Linux    | bash (or zsh, fish) |
| Windows  | PowerShell (or cmd) |

#### Scrollback and History

Terminal output is preserved, up to 500KB per terminal. When you reopen a terminal session, previous output is restored, you can scroll back through it, and a new shell process starts in the same directory.

Your shell's own command history (up and down arrows) also persists across sessions. Fish shell and Windows cmd have limited history persistence.

#### Process Management

* **Running processes**: commands run until they complete or you stop them with Ctrl+C
* **Shell exit**: if the shell exits, press Enter to restart it
* **App quit**: when you close Nimbalyst, all terminal processes are stopped and scrollback is saved

### Terminals in Worktrees

Each [worktree](/developer-features/worktrees) has a dedicated terminal button, so you get a terminal scoped to that worktree's directory, with its own persisted scrollback.

### Tips

* Each terminal starts in your workspace folder
* Copy and paste with your normal system shortcuts (Cmd+C/Cmd+V on Mac, Ctrl+C/Ctrl+V on Windows/Linux)
* Clear the screen with `clear` or Ctrl+L
* Environment variables set during a session do not persist to new sessions


# Worktrees

Use git worktrees in Nimbalyst to run AI coding agents on several branches at once, each with its own directory, session, and diff to review.

A git worktree gives an AI session its own branch and its own working directory, isolated from your main checkout. Use a worktree when you want an agent to build a feature, try an experiment, or investigate a branch without touching the code you are working in. Worktrees require [Developer Mode](/developer-features/turn-on-off-developer-mode) and a git repository.

For background on why worktrees matter when several agents are running at once, see the [git worktrees guide](https://nimbalyst.com/blog/git-worktrees-for-ai-coding-agents-complete-guide/).

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FNVzHlMBm7rppje3MCpvN%2FWorkTrees.png?alt=media&amp;token=4a26d4c9-1596-48c2-9816-ef18431f2fc4" alt="An agent session running in a worktree, with the transcript&#x27;s edit cards in the center and the worktree&#x27;s uncommitted files, commit box, and Merge to master button on the right"><figcaption><p>An agent session in its own worktree: edits happen on an isolated branch, with commit and merge controls in the right panel.</p></figcaption></figure>

### Creating a Worktree

There are three ways to start a worktree session:

1. From the menu beside **New session** in the title bar, choose **New Worktree** (**Cmd/Ctrl+Alt+W**). This starts an isolated AI session on a new branch.
2. From a Tracker item, choose the worktree action to launch an isolated session with that item linked as its context.
3. From Pull Request mode, choose **Open in Worktree** to check out the pull request branch and start a session inside it. See [Pull Request Reviews](/developer-features/pull-request-reviews).

### Working in a Worktree

* Each worktree has its own file system state, so changes never interfere with your main branch or with other worktrees.
* Review the session's edits, commit them, and merge the branch back from the panel next to the session.
* Rebase a worktree even with uncommitted changes; Nimbalyst auto-stashes them for you.
* Use the worktree's terminal button to open a [terminal](/developer-features/terminal-window) scoped to that worktree's directory.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FCDUBFJmiFxdftHxOq2WI%2FWorktree%20with%20Files.png?alt=media&amp;token=85aab04a-a2e0-493b-9e63-1ac8d0337cfa" alt="A file from a worktree session open in the editor with green added lines and Revert and Keep buttons, next to the worktree&#x27;s commit panel"><figcaption><p>Reviewing a worktree session's changes: open any edited file, then keep or revert the changes before committing.</p></figcaption></figure>

### Worktrees vs Workstreams

These are easy to mix up:

* A **workstream** groups related sessions. All of its sessions work in the same project folder on the same branch. See [Workstreams](/session-management/workstreams).
* A **worktree** gives a session its own git branch and folder, isolated from your main checkout.

Use a workstream to organize related sessions; use a worktree when a session's changes should stay off your main branch. A session in a worktree can also grow into a workstream, so the two combine.


# Working with Git

Commit, check status, and manage branches in Nimbalyst with AI-generated commit proposals and git file status colors in the file tree.

Nimbalyst builds git into the workspace: commit proposals written by the AI, live file status colors, and a visible record of every git operation. Use it to review and commit an agent's work without switching to a terminal or another git client. Most git features require [Developer Mode](/developer-features/turn-on-off-developer-mode) and a git-integrated project.

The [git feature page](https://nimbalyst.com/features/git/) covers commit proposals, status colors, and branch handling.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FNVzHlMBm7rppje3MCpvN%2FWorkTrees.png?alt=media&amp;token=4a26d4c9-1596-48c2-9816-ef18431f2fc4" alt="The git panel next to an agent session, showing uncommitted files, a pending review banner, a commit message box, and a Merge to master button"><figcaption><p>The git panel next to an agent session: uncommitted files, pending reviews, commit box, and merge controls in one place.</p></figcaption></figure>

### Committing

* **Commit with AI** generates an interactive commit proposal from your changes, which you approve or edit before it commits.
* You can also commit manually the files edited in an AI session.
* When committing, use the interactive file picker to select exactly which files to include.
* Pending file reviews are auto-approved when you commit.
* File status colors (green for added, yellow for modified, red for deleted) show what changed at a glance, and status updates appear instantly without polling.
* Nimbalyst detects agent changes made outside its own edit tools too, including `rm`, `mv`, and `echo >>`.
* Sessions show an uncommitted files count, so you can see which sessions have pending changes.

### Multi-Repository Projects

When a project spans several repositories, for example through [attached folders](/file-management/multi-folder-projects), the Git panel keeps each one distinct:

* The **Changes** tab can show every repository in the project at once, each with its own file list and commit box, so you can review and commit each repository without switching between them.
* **Commit with AI** proposes one commit per repository when your changes span several. You approve each proposal separately, and each gets its own message.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-da93fdaafa755b63fb4f21791e1a55dcc49ceb2d%2Frelease-git-multi-repo.png?alt=media" alt="The Git panel&#x27;s Changes tab showing three repositories at once, each with its own changed-file list, commit message box, and Commit with AI button"><figcaption><p>All repositories at once in the Changes tab, each with its own file list and commit box.</p></figcaption></figure>

### Files Sidebar in Agent Mode

The sidebar in Agent mode shows a compact list of files the session touched, plus a pending review banner at the bottom when files need review.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FyqX0TJHHcuszMsxhtWtq%2Fimage.png?alt=media&amp;token=0bf0566f-de9b-4cac-ab22-b8671034641d" alt="An agent session with the Files sidebar on the right, listing Edited files with status badges and Read files, above a Keep All banner for a file pending review"><figcaption><p>The Files sidebar groups a session's files into Edited and Read, with git status badges and a pending review banner.</p></figcaption></figure>

Files are organized into three collapsible sections:

#### Edited

Files the AI has modified. These show:

* **Operation icon**: what the AI did to the file
  * Green `+` = created new file
  * Blue pencil = edited existing file
  * Red trash = deleted file
  * Orange rename = renamed file
* **Git status badge**: current version control state
* **Line counts**: `+5` (lines added) `-3` (lines removed)
* **Pending review indicator**: yellow highlight with a review icon if awaiting your approval

#### Referenced

Files you mentioned in your prompts using `@filename` syntax. You brought these to the AI's attention, but they were not necessarily modified.

#### Read

Files the AI read to understand your codebase. These provided context but were not modified.

### Git Status Badges

For edited files, small colored badges show the git status:

| Badge          | Meaning                          |
| -------------- | -------------------------------- |
| **M** (yellow) | Modified - changes not staged    |
| **S** (green)  | Staged - changes ready to commit |
| **?** (gray)   | Untracked - new file not in git  |
| **D** (red)    | Deleted                          |

Hover over a badge to see "Git status: modified" (or staged, and so on).

### Pending Review Files

When the AI makes changes, those files may show as "pending review":

* **Yellow background**: the file has AI changes you have not reviewed yet
* **Review icon**: a small review icon appears next to the filename
* **Banner**: shows a count like "3 files pending review" with a **Keep All** button

Click **Keep All** to accept all pending AI changes at once, or review files individually by clicking on them.

### File Activity and Git Status in Files Mode

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FofQ11VbSvSuKqbkT8hbh%2Fimage.png?alt=media&amp;token=21a470e3-faba-405a-bcf3-9174d3dbc023" alt="The file tree filter menu in Files mode, with options for Uncommitted Changes, Files Read, and Files Written, and M badges on modified files"><figcaption><p>Filter the file tree by Uncommitted Changes, Files Read, or Files Written; git status badges appear next to each file.</p></figcaption></figure>

The file tree tracks the files the AI interacts with during a session:

* **Git status**: shown with a badge (M for modified, ? for untracked)
* **Uncommitted Changes**: filter to only files and folders with uncommitted changes
* **Files Read**: files the AI examined for context in the session
* **Files Written**: files written to by the AI during the session

### Diff Peek in the Commit Proposal

Each file in a commit proposal has a diff peek popover, so you can see exactly what changed without leaving the widget. It uses the same diff view as the Git extension's changes panel, and the popover is resizable; the size you pick is remembered globally, so the proposal widget and the Git extension stay in sync.

The peek shows a combined HEAD-vs-working diff that includes staged, unstaged, and untracked changes uniformly.

### Diff Peek in the Git Log

In the Git extension, when you select a commit in the log, the commit detail panel lists every file touched by that commit. Click any file in that list to pin its unified diff in the same peek popover.

* Click a file to open the diff for that file at that commit
* **Up/Down** arrow keys step through files in the commit while the popover is pinned
* **Esc** closes the popover
* The popover reuses the size persisted by the changes panel and the commit proposal widget, so all three diff peeks stay in sync

### Git Command History

While a git command is running, the title bar names the command and who started it, so you can tell at a glance whether you or an agent kicked it off.

Open the Git extension's **Output** tab to follow commands run through Nimbalyst. Push, pull, fetch, commit, and other git operations appear as they run and remain available after the panel closes or the renderer reloads. The Output tab also marks the commands an agent ran, keeping your own operations separate from agent activity.

Each entry shows:

* The command and start time
* Live standard output and error output
* Running, completed, failed, or interrupted state
* Duration and exit code
* A suggested recovery step for common git failures

Long errors show a short preview. Choose **View full error** for the complete message or **Copy** to put the error on the clipboard. Use **Clear Log** when you no longer need the completed history; a command that is still running remains attached until it finishes.

This is separate from the shell history in the [Terminal](/developer-features/terminal-window). Terminal history remembers commands typed into a shell, while git command history records operations launched by Nimbalyst and their output.

### Auto-Approve Commits

Skip the manual approval step for git commit proposals:

1. Go to **Settings** and enable **Auto-approve commits**, or toggle it directly on any git commit proposal widget.
2. When enabled, Claude's commit proposals are committed automatically without waiting for your approval.


# Pull Request Reviews

Review GitHub pull requests inside Nimbalyst. Read the diff, run an AI review, open the branch in a worktree, then comment, approve, or merge.

Review GitHub pull requests without leaving Nimbalyst. Pull Request mode brings the conversation, changed files, commits, checks, tracker-based triage, and AI review workflow into one place.

See [code review](https://nimbalyst.com/use-cases/code-review/) for how teams run AI-assisted reviews end to end.

## Before You Begin

Pull Request mode is available when:

* Developer Mode is enabled. See [Turn on/off Developer Mode](/developer-features/turn-on-off-developer-mode); the setting is under Settings, Advanced, Application Mode.
* The project is a Git repository whose `origin` remote points at GitHub (GitHub Enterprise hosts work too).
* The [GitHub CLI](https://cli.github.com/) is installed and signed in with `gh auth login`.

All GitHub access goes through your `gh` CLI. Nimbalyst stores no GitHub tokens of its own. If `gh` is missing or signed out, Pull Request mode shows setup instructions and a recheck button.

Open Pull Request mode from the **Pull Requests** button in the navigation gutter or press **Cmd+U**. The button appears once Developer Mode is on and the workspace has a GitHub remote.

## Find the Pull Request That Needs You

Use the filters above the pull request list to focus on:

* **Open** or **Closed** pull requests
* **Awaiting my review**
* **Created by me**
* **With conflicts** or **Draft**
* **Review Status** chips, which appear when pull requests are linked to tracker items (see triage below)

Search by title or pull request number, then sort by recent activity.

## Review a Pull Request

Select a pull request to open its detail view:

* **Conversation** shows the description, inline review threads (open, resolved, and outdated), and the discussion. Add your own pull-request-level comment from the box at the bottom.
* **Files Changed** shows the diffs with a file tree. Switch between a full-file compare view and a GitHub-style collapsed diff with unified or split layout. Very large diffs load on demand.
* **Commits** shows the commits included in the branch, with per-commit stats and copyable SHAs.
* **Checks** shows CI and other GitHub checks grouped by failing, in progress, and passing, with links to the details on GitHub. Results refresh on a polling interval rather than streaming live.

The header also shows the source and destination branches, linked Tracker items, review state, and merge readiness.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-190113ca2625b88b4640243733634e44bc5ee9e0%2Fpr-review-mode-dark.png?alt=media" alt="Pull Request mode with a pull request open on the Conversation tab and the Approve, Review with AI, GitHub, and Open in Worktree actions visible"><figcaption><p>Review the pull request directly, start an AI review, or open the branch in an isolated worktree.</p></figcaption></figure>

## Review with AI

Click **Review with AI** to start an agent session prefilled with a review command for the pull request. The session opens in the chat pane right next to the pull request, and each prompt carries a compact PR context card so the agent knows exactly which pull request it is reviewing. If tracker items reference the pull request, the session is linked to them automatically.

The agent can inspect the pull request, explain the changes, identify risks, and suggest review feedback using the same project context and tools as your other Nimbalyst sessions.

## Open the Pull Request in a Worktree

Click **Open in Worktree** to create (or reuse) an isolated worktree on the pull request branch and open an agent session inside it. Edits and Git operations stay separate from your main working directory, and Nimbalyst switches to Agent mode with the session ready.

Use a worktree when you want the agent to run tests, make follow-up edits, or investigate the branch without disturbing other work. See [Worktrees](/developer-features/worktrees).

## Triage with Review Statuses

Pull request triage runs on Nimbalyst Trackers. Link a pull request to any Tracker item with **Link tracker item** in the pull request header. Once linked:

* The item's workflow status appears as a status pill in the header. Click the pill to change the review status.
* Rows in the pull request list show a compact status badge, and the sidebar gains matching **Review Status** filter chips.
* You can move between the pull request, the Tracker item, and any linked AI session without searching for each one.

A common setup is a dedicated tracker type for pull requests with statuses such as Backlog, Needs Review, Inspecting, and Safe, with one item per pull request. Nimbalyst never creates these items automatically; create them yourself or ask your agent to create and link them for the open pull requests.

Merging inside Nimbalyst can also advance linked items automatically when their tracker type defines a post-merge workflow status, and a one-click hint offers the update after a pull request merges.

## Comment, Approve, or Merge

Add pull-request-level comments from the Conversation tab. Inline review threads from other reviewers are shown for context but cannot be authored inline yet, and there is no request-changes action; use a comment or an approval.

Use the actions in the pull request header to approve or merge when the repository and your GitHub account allow it. Nimbalyst supports GitHub's squash, merge-commit, and rebase strategies, limited to the methods the repository allows, and always asks for confirmation before merging. For squash and merge-commit merges you can edit the commit message first.

### GitHub CLI Workflow Permission

Some pull requests modify GitHub Actions workflow files. GitHub requires the CLI token to include the `workflow` scope before those changes can be merged.

If Nimbalyst reports that the scope is missing, run:

```bash
gh auth refresh -h github.com -s workflow
```

Complete the GitHub authorization flow, then return to the pull request and retry the merge.


# Agent Teams

Agent Teams let one coding agent session spawn parallel teammate agents. Super Loops run an agent iteratively on one task until it is complete.

Agent Teams and Super Loops are two ways to get more out of a coding agent than a single linear session. Agent Teams let one session split its work across parallel teammate agents; a Super Loop runs one agent over and over on a single task until the task is done. Running fan-out work across several agents is covered on the [agent orchestration page](https://nimbalyst.com/features/agent-orchestration/).

### Agent Teams

Agent Teams let a single coding agent session spawn teammate agents that work in parallel. This suits work that splits into independent subtasks, at the cost of using more tokens.

To turn it on:

1. Go to **Settings** and open the **Claude Agent** panel.
2. Enable **Agent Teams (Experimental)**.
3. Start a session. When the agent decides subtasks can run in parallel, it spawns teammates automatically.
4. Each teammate shows a distinct progress indicator in the transcript.

Good to know:

* Teammate output stays contained; it does not leak into the main transcript.
* The main session waits for all teammates to finish before completing.

### Super Loops

A Super Loop runs an autonomous agent iteratively until a task is complete. Each iteration starts with fresh context while progress persists via files, so the loop can chip away at a large task without ever filling up one session's context window. Super Loops require a git repository; a dedicated [worktree](/developer-features/worktrees) is created automatically for each loop, so its changes stay off your main branch.

To start one:

1. Open **Settings > Application > Agent Features** and enable **Super Loops**.
2. Return to Agent mode, open the menu beside **New session**, and choose **New Super Loop**. This option is disabled until the project is a git repository.
3. Describe the task. The description is saved to `.superloop/task.md` in the new worktree.
4. Pick the model and the maximum number of iterations, then create the loop.

The agent then works in iterations, reading its own progress files at the start of each one, until the task is complete or the iteration limit is reached.


# Nimbalyst Teams: Step by Step

A step-by-step walkthrough of Nimbalyst Teams: sign in, invite your team, and work together in shared trackers and documents with your coding agents.

This tutorial takes you, in seven steps, from a solo workspace to a team working in the same trackers, the same documents, and the same files as their coding agents. Every screen below is the product as it ships.

Watch the whole walkthrough in under three minutes, or read the steps below.

{% embed url="<https://www.youtube.com/watch?v=Ua-zh-UJh-s>" %}

## Step 1. Sign in to Nimbalyst

Open the user menu at the bottom of the left rail and choose **Sign in**.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-cabe8e891cfe595644ec328fbfe19b4ca69a8aef%2Fteams-tutorial-user-menu.png?alt=media" alt="The Nimbalyst user menu open, showing Application Settings, Project Settings, No organization, and Sign in"><figcaption><p>The user menu at the bottom of the left rail.</p></figcaption></figure>

Sign in with Google or with a magic link sent to your email address. Signing in is what connects this copy of Nimbalyst to a team.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-5b592fa6d396b18c3bbf532d8bfbbce6d8833def%2Fteams-tutorial-sign-in.png?alt=media" alt="The Account tab in Nimbalyst Settings, showing Continue with Google and an email field for a magic link"><figcaption><p>Sign in from Settings, under Account.</p></figcaption></figure>

## Step 2. Create your organization

From that same menu, choose **Set up** next to **No organization**.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-30d42ca9bb3776c7d28c5a2b5eb9afcd12374840%2Fteams-tutorial-org-setup.png?alt=media" alt="The user menu with the No organization row highlighted and a Set up action beside it"><figcaption><p>Set up an organization from the user menu.</p></figcaption></figure>

Name your organization. Everyone you invite sees this name, and you can change it later.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-fbe5a0c7faf64f9f8df2d569d1730ec7531d7eb1%2Fteams-tutorial-org-name.png?alt=media" alt="The New organization dialog on its Name step, with an organization name typed in and the owner&#x27;s address below the field"><figcaption><p>Step one of three: name the organization.</p></figcaption></figure>

Then invite your teammates by email. They join as members, and you can change roles afterwards.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-a57e7e99d6aa39cc3f6da27ea6181c4c90ed1c54%2Fteams-tutorial-org-invite.png?alt=media" alt="The New organization dialog on its Invite step, with a teammate&#x27;s email address entered"><figcaption><p>Step two of three: invite the team.</p></figcaption></figure>

Everyone you add appears in the organization's member list, where you can change a role or invite more people at any time.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-6a02ab37457e881f593c9f2f6688f95a460b9737%2Fteams-tutorial-org-members.png?alt=media" alt="The organization management dialog listing team members with their email addresses and roles, and an invite field at the bottom"><figcaption><p>The member list for your organization.</p></figcaption></figure>

## Step 3. Your teammate receives an invite email

They receive an email with one button. There is no account to create first.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-22a31e144cd0a851b4acef3ea7873d15341f3cd4%2Fteams-tutorial-invite-email.png?alt=media" alt="The invitation email, with an explanation of Nimbalyst and a Join button"><figcaption><p>The invitation email your teammate receives.</p></figcaption></figure>

## Step 4. They accept and land in the team

Clicking through accepts the invitation and puts them in the organization. From there they can open the team in the desktop app, or keep working in the browser.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-da91370066da23dce38ecc3a9c4ec3c858e2199d%2Fteams-tutorial-invite-accepted.png?alt=media" alt="The confirmation screen after accepting an invitation, offering to open the desktop app or continue in the browser"><figcaption><p>The invitation is accepted and your teammate is in the organization.</p></figcaption></figure>

## Step 5. Working collaboratively in trackers

Switch to **Tracker** mode. With a team, the left navigation splits into two groups. The top group belongs to the organization and everyone in it sees the same items. The bottom group stays on your machine.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-19c3e7e93a9d43127dc7ffdee4f7209884c6a9c9%2Fteams-tutorial-tracker-nav.png?alt=media" alt="The tracker sidebar split into a Northwind section marked Shared with 5 people and a Personal section marked Local only"><figcaption><p>The team's trackers appear first; your personal trackers stay on your machine.</p></figcaption></figure>

Every tracker opens as a grid you can edit in place. Press **Cmd+Shift+N** anywhere in Nimbalyst to launch an agent session against whatever you are looking at, without leaving the board.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-11e24b00a3080a50640bfa11785586bfc44a1176%2Fteams-tutorial-tracker-grid.png?alt=media" alt="A shared bug tracker in grid view with the Launch New Session popup open over it, carrying a prompt about a checkout timeout"><figcaption><p>Cmd+Shift+N puts an agent on the item in front of you.</p></figcaption></figure>

Open an item and it expands into a full document the team writes together, with its own agent chat alongside.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-41cd28100c6e2a183ab14885ef8354b9f7ee09f1%2Fteams-tutorial-tracker-detail.png?alt=media" alt="A tracker item expanded to full width with a written body and a Chat about this item panel on the right"><figcaption><p>An item's body is a document, not a text field.</p></figcaption></figure>

Put a file reference on its own line in that body and it becomes a live embed. Anyone with access can edit it in place, or open it in its own editor.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-2d8f752331049afbaaa69c9d0450861f9c5792ec%2Fteams-tutorial-tracker-embeds.png?alt=media" alt="A tracker item body containing two live embeds, an Excalidraw diagram and a UI mockup, each with its path and an Open action"><figcaption><p>Embedded files render live inside the item.</p></figcaption></figure>

Link your own agent sessions and the files they touched to an item, so the work and the record of it stay together.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-ef1b6ad2a558d6b17b5a5ed90d8754fce9921f3c%2Fteams-tutorial-tracker-links.png?alt=media" alt="A tracker item detail panel showing a Sessions section with Link Existing and Launch Session actions"><figcaption><p>Link an existing session, or launch a new one from the item.</p></figcaption></figure>

## Step 6. Working collaboratively in documents

Right click any file in your project and choose **Share to Team**. Nimbalyst scans the file for embedded files and offers to share those alongside it, so your teammates do not open the document and find empty placeholders. A whole folder shares the same way: right-click it and choose **Share Folder to Team** to publish everything shareable inside it at once, mirroring its subfolders in the team space.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-fbae1f1b3121f5a561ee6d164201cd7d71a79847%2Fteams-tutorial-share-to-team.png?alt=media" alt="The file tree context menu open on a markdown file, showing the Share to Team action"><figcaption><p>Any project file can become a shared document.</p></figcaption></figure>

**Shared Docs** holds every shared document and folder in one place. A blue dot marks anything changed since you last opened it.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-dcc9d611e6cc4e7ea627f5c92119a6809e56357c%2Fteams-tutorial-shared-docs.png?alt=media" alt="The shared documents space with a folder tree on the left and a table of shared documents with authors, last edited times, and unread dots"><figcaption><p>One space for everything the organization shares.</p></figcaption></figure>

Star the documents you work in every day and the **Favorites** filter brings them straight back.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-c71783468d0add33cd16fb9f71ad8f9002999835%2Fteams-tutorial-favorites.png?alt=media" alt="The shared documents space filtered to Favorites, showing a single starred document"><figcaption><p>The Favorites filter shows only the documents you starred.</p></figcaption></figure>

Open a shared document and you are editing the same copy as everyone else, with a labelled cursor for each person. Each teammate's locally running coding agent works in that same document.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-96d2da5b934bcb0acc9a307ebd2d787e38ad5b6d%2Fteams-tutorial-shared-doc.png?alt=media" alt="A shared launch plan open in Nimbalyst with a teammate&#x27;s labelled cursor in the text and an agent prompt staged in the chat"><figcaption><p>People and their agents edit one shared copy.</p></figcaption></figure>

Select a passage to leave a comment, mention someone with `@`, and reply in the thread. Comments live with the document, so they follow it everywhere it is opened.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-09d9d7d454da04b2cfaf9ac27b729f3584366bcf%2Fteams-tutorial-comments.png?alt=media" alt="A comment thread on a highlighted passage of a shared document, with a reply below the first comment"><figcaption><p>Comments and replies attach to the passage they are about.</p></figcaption></figure>

Anything addressed to you shows a badge in the top right corner of the window.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-cf14edc2247b94e1e2e498b2cc8ea0efb3622f65%2Fteams-tutorial-inbox-badge.png?alt=media" alt="The top-right toolbar cluster in Nimbalyst with an unread count badge on the inbox button"><figcaption><p>The unread badge sits in the top-right corner of the window.</p></figcaption></figure>

Open it for a single list of every mention, comment, and message waiting on you, each linked to the document it came from.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-89298b6db6d2d81944ac4f3a7d94eed607e5d4c6%2Fteams-tutorial-inbox.png?alt=media" alt="The team inbox listing mentions, comments, and messages with the document each one came from"><figcaption><p>Every mention, comment, and message in one list.</p></figcaption></figure>

## Step 7. Teammates can work in the browser

Someone without the desktop app opens [console.nimbalyst.com](https://console.nimbalyst.com) and reads, writes, and comments on the same shared documents. People on the desktop app and people in the browser work side by side on the same files.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-e20bd3739e2445ab018ba79b057b440b877fbfc8%2Fteams-tutorial-web-console.png?alt=media" alt="The Nimbalyst web console showing the same shared document tree and table in a browser"><figcaption><p>The same shared documents open in a browser.</p></figcaption></figure>

See [Web Console](/team-collaboration/web-console) for what the browser supports.

## Where to go next

* [Team Collaboration Overview](/team-collaboration/overview)
* [Collaborative Documents](/team-collaboration/documents)
* [Collaborative Trackers](/team-collaboration/trackers)
* [Set Up Nimbalyst Teams](/team-collaboration/setup-teams-and-orgs)


# Team Collaboration Overview

How Nimbalyst Teams adds shared documents and trackers on top of each teammate’s local workspace and their own locally running coding agents.

Each teammate runs the open-source Nimbalyst app on their own machine with their own Claude Code, Codex, or other local agents. Nimbalyst Teams adds a shared layer for files and Trackers without replacing anyone's local workspace, environment, or agents.

See [Nimbalyst for Teams](https://nimbalyst.com/teams/) for what the shared workspace covers, or go straight to [Nimbalyst Teams: Step by Step](/team-collaboration/teams-tutorial).

{% hint style="info" %}
Nimbalyst Teams is in **beta**. Expect bugs. Organizations are free during beta and will require a paid Nimbalyst Teams subscription after launch.
{% endhint %}

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-86ed955185ff288fb1fc68d23c3d5f6b0ddfca3a%2Fcollab-real-excalidraw.png?alt=media" alt="Two teammates editing the same architecture diagram in real time on a shared canvas, with a live labeled cursor"><figcaption><p>People and their agents work together on the same shared documents, mockups, diagrams, and trackers.</p></figcaption></figure>

### One integrated workflow for the whole team

Manage agents, edit the work visually, and track tasks in a shared workspace where each teammate keeps using their own local Nimbalyst and agents, live or asynchronously. Nimbalyst keeps plans, visual files, Trackers, sessions, reviews, and delivery links together so context survives every handoff.

* **One workflow from plan to ship:** Move from a spec to a mockup, implementation session, Tracker update, review, commit, and pull request without rebuilding the story in each tool.
* **Every file type in the same context:** Work across markdown, code, mockups, diagrams, spreadsheets, data models, and other supported editors while teammates and their agents stay connected to the same project context.
* **Less context switching:** Stop moving between a document app, task tracker, diagram tool, editor, and terminal or copying context from one into another.
* **Higher-bandwidth collaboration:** Rich visual editors, live presence, linked work, and immediate status let the team understand and direct more work at once than a collection of text-only tools.

### Edit the same docs, mockups, and diagrams together

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-281263d9b98f9d7cede3c5c68f858c2d985631f6%2Fcollab-real-doc-mockup.png?alt=media" alt="Two teammates editing the same document, with a UI mockup embedded inline and a live labeled cursor"><figcaption><p>A shared document can contain an editable mockup, diagram, image, or tracker inline.</p></figcaption></figure>

* **True multiplayer:** Edit shared markdown, mockups, and diagrams together in real time, with a live cursor for everyone in the document.
* **Your agents in the same room:** Each teammate's local Claude Code and Codex agents edit the same shared documents, not separate copies.
* **Promote and review:** Promote any local file to a shared one in a click, and review its full change history.

### Plan and track the work on one shared board

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-68a03ca122e1c26d49de71ae5777bbd696b7528a%2Fteam-tracker-detail.png?alt=media" alt="A shared task list with an item open, showing its linked session, status, priority, owner, and written content"><figcaption><p>The team and its agents keep the same tracker items, fields, and linked sessions current.</p></figcaption></figure>

* **Shared boards and trackers:** Plans, decisions, bugs, tasks, and ideas live on shared boards and trackers in the same workspace as your docs.
* **Everyone updates the same items:** Teammates and their local agents read and update the same tracker items, so the board reflects what is actually happening.
* **One place for status:** See what is in progress, done, or blocked instead of pinging people for updates.

### Ask for feedback and get a tally, not a thread

* **Structured asks:** Attach the document, mockup, or diagram and ask a question people answer by picking, ranking, rating, or confirming.
* **Counted results:** See the vote per option, the rating spread, who has not answered, and nudge the people still outstanding.
* **Answers about a pinned version:** Every artifact is pinned at send, so a reply is always about the version that was asked about.

These asks are decision blocks you can also insert directly into any shared document, collect private votes on, and seal with an attributed outcome that stays in the markdown. See [Decision Blocks in Documents](/team-collaboration/decisions).

See [Ask Your Team for Feedback](/team-collaboration/feedback-requests).

### One connected workspace

Shared docs, local files, trackers, and agent sessions live together and link to each other. A tracker can link to the session working it, the source document it came from, and the pull request that closes it. Documents can contain live tracker references and embedded visual files.

For a look at how the shared layer works across a whole team, see [how Nimbalyst Teams works](https://nimbalyst.com/teams/how-it-works/).

### How collaboration works

1. **Everyone works locally.** Each teammate runs Nimbalyst on their own machine with their own Claude Code, Codex, or other agents.
2. **Authenticate to Nimbalyst Teams.** Signing in gives each person access to the organizations, projects, shared files, and shared Trackers they are authorized to use.
3. **Promote what should be shared.** Move a local file or Tracker into the shared team workspace when the team should work on it. Only explicitly shared content enters the team collaboration flow.
4. **Work live, asynchronously, or offline.** Shared files and Trackers sync across everyone's workspace. Previously opened documents remain available from an encrypted local copy, and offline changes upload when the device reconnects.
5. **Keep the work connected.** Shared docs, local files, Trackers, and sessions link to one another so the team and its agents work from one picture instead of scattered tools.

### Set up Nimbalyst Teams

Getting a team running takes three steps:

1. Sign in under **Settings > Account > Accounts** and create an organization.
2. Attach the current project to that organization under **Settings > Project > Sharing**.
3. Invite teammates by email from the organization management dialog.

Full instructions, including roles, projects, messaging, and encryption, are in [Set Up Nimbalyst Teams and Organizations](/team-collaboration/setup-teams-and-orgs).

Continue with [Collaborative Documents](/team-collaboration/documents) or [Collaborative Trackers](/team-collaboration/trackers).

### Teammates without the app

Anyone you invite can open your team's shared documents in a browser at [console.nimbalyst.com](https://console.nimbalyst.com), edit them live, and leave comments without installing anything. See [Web Console](/team-collaboration/web-console).

### Enterprise-grade security, local-first by default

Your code stays on your machine. Only what you choose to share gets synced, and only the people you invite can read it.

* **Encrypted through Cloudflare:** Shared documents, Trackers, and tasks flow through Nimbalyst's Cloudflare sync service and are encrypted in transit and at rest.
* **Isolated and authorized per team:** Team data is isolated per team and requires an authenticated, authorized membership.
* **SOC 2 Type 2 certified:** Nimbalyst has completed SOC 2 Type 2 certification with audited controls, processes, and documented compliance.
* **Local-first by default:** Local files remain on your machine until you promote one for the team and its agents to work on together.

Nimbalyst-hosted Teams uses server-managed encryption keys so authorized web, CLI, and agent experiences can access shared team work. Hosted team data is encrypted but is not zero-knowledge. Personal device sync uses a separate end-to-end encrypted model.


# Collaborative Documents

Share markdown docs, mockups, and diagrams with your team. Teammates and their local coding agents edit the same files in real time.

A collaborative document is a file your whole team edits together: markdown, mockups, diagrams, and more, in real time or asynchronously. Each teammate's locally running Nimbalyst and configured agents work in the same shared files, not separate copies.

See [collaborative documents in Nimbalyst Teams](https://nimbalyst.com/teams/documents/) for how shared editing works.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-51384caa962066a4a12de533f35d66225c1e7cb5%2Fcollab-real-multiplayer-doc.png?alt=media" alt="Two teammates editing the same markdown document in real time, with presence and a live labeled cursor"><figcaption><p>True multiplayer editing keeps everyone on one shared copy.</p></figcaption></figure>

### Everyone in the same document at once

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-b3694ea2879264e4f754949d3daa4924c95d8ce1%2Fteam-collab-presence.png?alt=media" alt="Two teammates editing the same document with presence avatars and a live labeled cursor"><figcaption><p>Presence avatars and labeled cursors show who is in the document and where they are working.</p></figcaption></figure>

* **True multiplayer:** Type in the same markdown, mockup, or diagram at the same time, with a live cursor for every person in the document.
* **See who is here:** Presence avatars show who is in the document and where they are working right now.
* **Your agents, in the same file:** Each teammate's local Claude Code and Codex agents edit the same shared document, so people and agents stay on one copy.

### One document, every kind of content inside it

Shared documents are not limited to text. Embed a mockup, diagram, image, or inline tracker in the page and edit it in place.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-281263d9b98f9d7cede3c5c68f858c2d985631f6%2Fcollab-real-doc-mockup.png?alt=media" alt="A shared document with a UI mockup embedded inline and a live cursor"><figcaption><p>The embedded mockup remains editable inside the shared document.</p></figcaption></figure>

* **Markdown, mockups, and diagrams:** Work in shared markdown, UI mockups, Excalidraw, Mermaid, mind maps, data models, and spreadsheets in one workspace.
* **Embed anything inline:** Drop an Excalidraw canvas, mockup, image, or other supported extension file into a document and edit it inline.
* **Inline trackers:** Add an editable tracker reference inside a document so the plan and the task remain connected.

Type `@` to choose a project file. Put the file reference by itself in a paragraph and Nimbalyst upgrades compatible editor types into a live inline embed.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-fb3d8816b8249f476ccfc07cc2263525bead2c1c%2Fteam-doc-embedded-shared-files.png?alt=media" alt="A shared markdown document containing two live embeds, a mockup showing a tracker board and an Excalidraw diagram, each with a header naming its shared path and an Open action"><figcaption><p>Embedded files render live inside the shared document. Each embed names its shared path and opens in its own editor.</p></figcaption></figure>

An embed inside a shared document is a live view of another shared file, not a flattened image. The mockup and the diagram above are still their own documents. Anyone with access can edit them in place, or click **Open** to work on them in the full editor, and the change appears everywhere the file is embedded.

### Sharing a document that contains embeds

When you share a markdown file that embeds other files, those embedded files have to be shared too. Otherwise your teammates would open the document and find empty placeholders where the mockup and diagram should be.

Nimbalyst handles this in the **Share to Team** dialog. It scans the document for embedded files and lists each one under **Linked documents**, pre-checked.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-2596233d73e12fc5b1c78da0868e0e4522664f36%2Fteam-share-to-team-linked-documents.png?alt=media" alt="The Share to Team dialog showing the source file, shared name, destination folder tree, and a Linked documents section listing an embedded mockup and an Excalidraw diagram, both checked and marked Already shared"><figcaption><p>Share to Team finds the files a document embeds and shares them alongside it.</p></figcaption></figure>

* **Everything the document needs, in one action:** Leave the linked documents checked and Nimbalyst shares them with the parent document, so the embeds render for everyone.
* **Already-shared files are recognized:** An embedded file that is already in the team space is marked **Already shared** and is reused rather than duplicated.
* **You stay in control:** Uncheck any linked document you do not want in the team space. Its embed will show as unavailable for teammates until you share it.
* **The count reflects your choices:** The confirm button tells you how many documents are about to be shared.

Embedding works the same way in a tracker item body. See [Collaborative Trackers](/team-collaboration/trackers).

### Supported shared file types

Nimbalyst can share and co-edit:

* Markdown, plain-text, and code files such as TypeScript, HTML, Swift, and Python
* Excalidraw diagrams and supported visual diagrams
* Mockups
* CSV, TSV, and calc spreadsheets
* Data models
* Other extension file types that declare collaboration support

The editor determines how collaboration appears. Text and code show live cursors and selections, spreadsheets show the selected cell and active editor, and visual editors can show canvas selections and presence.

### Promote any local file to shared in a click

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-611ec2d3c320bfaf69fcc7d6838197d6cbeed86d%2Fteam-doc-promote.png?alt=media" alt="The file context menu open on a document, with a Share to Team action"><figcaption><p>Start locally, then choose Share to Team when the file is ready for collaboration.</p></figcaption></figure>

1. In Files mode, right-click the local file.
2. Choose **Share to Team**.
3. Choose its shared name and destination folder.
4. Confirm **Share to Team**.

Only what you choose is shared. Your code and other local files remain on your machine. Nimbalyst keeps a link to the originating local file so you can open, relink, or re-upload it when needed.

Whole folders share the same way. Right-click a folder and choose **Share Folder to Team** to publish everything shareable inside it at once, with its subfolders mirrored in the team space so the shared tree keeps the structure you already have.

The shared copy flows through Nimbalyst's Cloudflare sync service and is encrypted in transit and at rest. Teammates who return later receive the changes made while they were away and can continue with their own local agents.

### Work Offline

Previously opened shared documents open immediately from an encrypted local copy when the network is unavailable. You can continue editing text, supported visual content, and attachments while offline.

Nimbalyst keeps document changes and attachment uploads in a durable queue. When the device reconnects, it uploads the queued work and merges it with changes received from teammates. The queue survives a window or application restart.

Documents you have never opened still require a connection for their first download. An attachment that is not yet cached shows an unavailable placeholder until Nimbalyst can retrieve it.

### Discuss the work right where it lives

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-eafa79d9910d1776d56c2e0f52ea8f1cfa54d7cf%2Fteam-doc-comment.png?alt=media" alt="A shared document with a highlighted passage and a comment thread with a reply"><figcaption><p>Comments keep review feedback beside the exact passage being discussed.</p></figcaption></figure>

* **Comment in context:** Leave a comment on a passage or section so feedback sits next to the thing it is about.
* **Threads that resolve:** Reply, resolve, and reopen threads so review happens in the document instead of a separate chat.
* **Everyone stays in sync:** Comments sync in real time so the whole team sees the discussion as it happens.

### Never lose a version

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-d5898434a276b906273372cf0b7c3f7603894c06%2Fteam-doc-history.png?alt=media" alt="Document History for a shared document, showing a saved revision, its author and metadata, and a Restore as Current Version action"><figcaption><p>Review saved revisions and restore the one you need without leaving the shared document.</p></figcaption></figure>

* **Full change history:** Every shared document keeps its history so you can see how it changed and who changed it.
* **Restore in one click:** Roll a document back to an earlier version without leaving the editor.
* **Review before you trust:** Scan what changed since you last looked so nothing slips by unnoticed.

Right-click a document in the Collaboration sidebar and choose **View History**. Press **Cmd/Ctrl+S** in a shared document to save a revision.

### Find shared work in the Shared home

**Shared home** lists every document in the team space in one sortable table, with the folder tree beside it.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-31ff1b4b90949245af2e5e2f55a66cb5200bf769%2Fteam-shared-hub-grid.png?alt=media" alt="The Shared home view listing shared documents in a table with Name, Type, Created by, Last edited, Viewed by me, and Folder columns, filter tabs for All, Favorites, Unread, Recently opened, Shared with me, and Shared by me, and unread dots beside several rows"><figcaption><p>Shared home lists every shared document with its type, folder, author, and when you last looked at it.</p></figcaption></figure>

* **Sort by any column:** Name, type, who created it, when it was last edited, when you last viewed it, and which folder it lives in.
* **Filter to what matters:** **All**, **Favorites**, **Unread**, **Recently opened**, **Shared with me**, and **Shared by me**, with a count on the unread filter.
* **Narrow further:** Filter by type, by person, or by folder, and search across every shared document.
* **List or tiles:** Switch between the table above and a tile view from the toggle at the top right.

### Favorites, and what changed since you were last here

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-19de54df2c95084472b7ac4a67a203d38845b4c9%2Fteam-favorites-and-unread-dot.png?alt=media" alt="A shared folder in the Collaboration sidebar, with gold stars marking three favorited files and blue dots marking two files that changed since they were last opened"><figcaption><p>A gold star marks a favorite. A blue dot marks a document that changed since you last opened it.</p></figcaption></figure>

* **Favorites:** Star the documents you keep coming back to and reach them from the **Favorites** filter. Starred files show a gold star wherever they appear.
* **Changed since you were away:** A blue dot marks each shared document that changed since you last opened it. Opening the document clears the dot.
* **New and recently updated:** Use the **Unread** and **Recently opened** filters to catch up on what moved while you were away, sorted by the last change.

The Collaboration sidebar also provides shared folders, search, drag-and-drop organization, and **All**, **Favorites**, and **Updated** filters.

### Open shared documents in a browser

Shared documents also open at [console.nimbalyst.com](https://console.nimbalyst.com), where teammates can edit them live and comment without installing the desktop app. Markdown documents open in the full editor; other document types open as editable source text. See [Web Console](/team-collaboration/web-console).


# Collaborative Trackers

Share one tracker board across your team. Teammates and their locally running AI agents keep the same bugs, features, and plans current.

A collaborative tracker is a shared board your team and its agents keep current. Bugs, features, tasks, plans, and decisions live on shared Trackers in the same workspace as your docs, and teammates and their local agents update the same items in real time or asynchronously, so the board reflects what is actually happening.

See [shared trackers in Nimbalyst Teams](https://nimbalyst.com/teams/trackers/) for how the shared board works.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-f4ab9f0a3bf6d0f7015bd07670155d5fa6d6b17e%2Fteam-tracker-tag-board.png?alt=media" alt="A shared tracker board grouped into tag columns such as API, mobile, reliability, and authentication"><figcaption><p>Group shared work by tag to see plans across areas and milestones.</p></figcaption></figure>

### One board, everyone on it

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-ac6c5f402ba0096d9a850cae1c44e95bcd2df24a%2Fteam-shared-board.png?alt=media" alt="A shared task board with To Do, In Progress, In Review, and Done columns"><figcaption><p>Use kanban stages, lists, filters, and saved views to organize shared work.</p></figcaption></figure>

* **Real-time and multiplayer:** The board updates live as people and agents change items, with no refresh or manual synchronization.
* **Kanban with your stages:** Move work across the stages you define, from backlog to done, on a shared kanban board.
* **Recently changed:** See what moved recently, with a marker on items that changed since you last looked.

The tracker also includes a sortable list, filters, saved views, and a tag board.

### Radar: what happened since you left

Shared trackers get **Radar**, a digest of teammate activity built around the time you were last on the board. Open a shared tracker, click **Display** at the top of the view, and choose **Radar** alongside the list, table, kanban, timeline, and tag board views.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-4fe0db56b3053d3d11f36282ebf964f0ff031ea7%2Frelease-tracker-radar.png?alt=media" alt="The Radar view of a tracker showing three teammate cards with their latest activity and a Moved section listing status changes attributed to each person"><figcaption><p>Radar summarizes each teammate's recent activity and lists every status move since you were last on the board.</p></figcaption></figure>

Radar groups what it finds into four sections:

* **Needs you:** Items of yours a teammate commented on or moved.
* **Moved:** Status changes, laid out by the teammate who made them.
* **Sweeps:** Bulk changes, such as one person closing a batch of items at once.
* **Stalled:** In-flight items that have had no activity for a while.

A window selector at the top narrows the digest to everything **Since you left**, or to the last 2, 8, or 24 hours, or 3 days. Radar is available in the desktop app and in the web console.

### Your agents and your team keep it up to date

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-68a03ca122e1c26d49de71ae5777bbd696b7528a%2Fteam-tracker-detail.png?alt=media" alt="A tracker item detail kept up to date with a linked session, status, priority, owner, and written content"><figcaption><p>Open an item to see its current fields, content, owner, and the session working on it.</p></figcaption></figure>

* **Agents update the board:** Claude Code and Codex agents can create items, change status, and update many trackers as they work.
* **People edit too:** Teammates edit the same items by hand, so the board stays accurate whether a person or agent made the change.
* **Comments and full history:** Every item keeps a threaded discussion and a record of what changed and who changed it.

Enable or disable agent Tracker tools per project under **Settings > Project > Trackers > AI Agent Access**.

### Track any kind of work

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-37ad79a36b82ea99f855d2099074f5d8594b0ad0%2Fteam-tracker-types.png?alt=media" alt="The tracker sidebar with configurable types including Modules and Initiatives, and an Authentication module open with child features and fields"><figcaption><p>Create tracker types and relationships that match how your team organizes work.</p></figcaption></figure>

* **Bugs, features, and your own types:** Use built-in trackers or define custom types with the fields you need.
* **Hierarchy and links:** Break work into parent and child items and link related items across trackers.
* **Fields that fit:** Give each type its own fields, statuses, owners, tags, dates, priorities, and progress.

See [Custom Tracker Types](/task-management/custom-tracker-types) and [Linking Tracker Items](/task-management/linking-tracker-items).

### A collaborative document inside every item

Each full tracker item has a rich body the team edits together, so the plan and discussion live with the task.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-518eb44d8c72879579aed81b58ea2090894ca51c%2Fteam-tracker-embedded-doc.png?alt=media" alt="A tracker item with a collaborative rich-text body, including an Excalidraw diagram and mockup embedded inline"><figcaption><p>Write the plan in the item and embed diagrams, mockups, images, and other project files.</p></figcaption></figure>

* **Write the plan in place:** Draft the spec, repro steps, decision, or rollout plan inside the item.
* **Diagrams and mockups too:** Add diagrams, mockups, images, data models, and spreadsheets so the full picture sits with the work.
* **Edited together:** The item body is collaborative, so teammates and agents work on it in the same place.

### Every item is wired into the work

An item connects to the sessions working it, the parent and child items around it, and the documents that reference it.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-3377436fe9bde6fbcc80db9cc42ee93253997466%2Fteam-tracker-links.png?alt=media" alt="An initiative showing its parent, child item, tags, content, and linked session"><figcaption><p>Build a hierarchy around the work and link the session, source file, and pull request that belong to it.</p></figcaption></figure>

* **Hierarchy and linked sessions:** Break work into parent and child items, and connect each one to the session working it, the file it came from, and the pull request that closes it.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-7d8c29687cf84dd66dd27f5689d52faab2816ca8%2Fteam-tracker-agent.png?alt=media" alt="An agent session reporting updates to linked tracker items, with those items visible in the Trackers panel"><figcaption><p>The agent updates linked items while it works and reports the changes in the session.</p></figcaption></figure>

* **Updated from the session:** Claude Code and Codex agents change linked items as they work, so a session and its tracker items stay in step.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-6f30ac66652ae0c8cff24f40046d67b605d49ede%2Fteam-doc-tracker-pills.png?alt=media" alt="A launch-readiness document containing live tracker reference pills with item keys, titles, and statuses"><figcaption><p>Reference live tracker items in a document so their current status stays beside the plan.</p></figcaption></figure>

* **Tracker pills in your docs:** Reference an item in any document with a live pill that shows its status and links back to the board.

Use **Link Existing**, **Launch Session**, or ask the agent to link the current session when that relationship belongs in the item's history.

### Keep trackers personal or share them, and organize by tag

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-f4ab9f0a3bf6d0f7015bd07670155d5fa6d6b17e%2Fteam-tracker-tag-board.png?alt=media" alt="A tracker board grouped by tag, with columns for areas such as API, mobile, reliability, and authentication"><figcaption><p>Keep personal trackers on your machine, share team trackers, and group the shared board by tag.</p></figcaption></figure>

* **Personal trackers:** Track your own work in personal trackers that stay on your machine.
* **Team trackers:** Share a tracker so the whole team and its agents work on the same board.
* **Board by tag:** Group the board by tag to slice work by area, milestone, or any other label.

#### A tracker is personal or the team's

Every tracker type is either personal or the team's, decided per tracker under **Settings > Project > Trackers**. Personal trackers are only visible to you. Sharing a tracker hands its fields, items, and numbering to the team: every item is published with its issue key, and from then on editing the fields changes them for everyone.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-d879f0e6f4a5f9a16c1e613c79c47fa5b2679912%2Fteam-sync-policy.png?alt=media" alt="A settings panel listing tracker types such as Plans, Decisions, Bugs, Tasks, Ideas, Milestones, and Releases, each with an item count and its current sharing state"><figcaption><p>Tracker types in Project Settings, each with its item count and its sharing state beside it.</p></figcaption></figure>

Sharing cannot be undone: a team tracker is never made personal again, because that would take teammates' items away from them. To stop using a tracker, archive it instead. An archived tracker keeps every item visible and searchable, but its items become read-only and no new ones can be added. You can unarchive it at any time.

A team tracker can also be set so new items start as drafts. A draft stays private until its author publishes it, so one shared tracker can hold both team work and items you are still roughing out. Inline `#type[...]` items stay local until they are promoted to full items.

Shared Tracker data flows through Nimbalyst's Cloudflare sync service and is encrypted in transit and at rest. Personal trackers remain outside the team workspace.


# Ask Your Team for Feedback

Ask teammates a structured question about a document, mockup, or diagram. Your agent drafts the request, it lands in their inbox with the artifacts attached, and you get a tally instead of a thread.

A feedback request is a structured question about something you made. You attach the artifacts, write the questions as answerable fields rather than prose, pick who answers what, and send it. Recipients answer in place. You get counted results instead of a thread you have to summarize yourself.

{% hint style="info" %}
Feedback requests are part of [Nimbalyst Teams](/team-collaboration/overview) and need an organization. Everyone you send to has to be a member of it.
{% endhint %}

## Your Agent Drafts It, You Send It

Ask your agent for the review and it composes the request as a card in the transcript. Nothing is sent and nothing is published until you press **Send request**.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-0253b17ca850a0b2d0788f2c05e98f52e5ef0ad7%2Ffeedback-compose-top.png?alt=media" alt="A feedback request card in the agent transcript showing three attached subjects, three recipients, and per-recipient ask assignment chips"><figcaption><p>The compose card is editable before it goes anywhere. Add or remove people, change what each person is asked, drop an artifact.</p></figcaption></figure>

The card has three parts:

* **Subject:** the files the reviewers are looking at. Each is pinned at send, so an answer is always about the version that was asked about, not whatever the file became afterwards.
* **Recipients:** who is being asked. The chips beside each person are the questions assigned to them, so one request can ask the designer about the layout and the finance lead about the numbers.
* **Asks:** the questions themselves, plus how the request is delivered.

Good prompts to start from:

* "Ask Dana, Sam, and Greg which of these three mockups we should ship."
* "Get sign-off from the team on this migration plan before I start."
* "Ask Priya to rate whether these numbers are defensible, and ask everyone else to confirm the scope."

## Questions People Can Actually Answer

An ask is a field rather than a paragraph, which is what makes the results countable.

| Ask type       | What the recipient does                            |
| -------------- | -------------------------------------------------- |
| Choose one     | Chooses a single option                            |
| Choose several | Checks any number of options                       |
| Rank options   | Drags options into an order                        |
| Rate 1 to 5    | Picks a value on a scale you label at both ends    |
| Yes or no      | Confirms or declines                               |
| Edit a draft   | Revises a draft you seed and returns their version |

Choose-one and rank asks can carry a live artifact per option: a document, tracker item, file, or session rendered as a preview instead of a text label. So "which layout do we ship?" shows the three mockups themselves and the reviewer votes on the design rather than on a name.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-862b57a16aad2905d571d02b3e9cf64e078cb74e%2Ffeedback-compose-asks.png?alt=media" alt="The lower half of a feedback request card showing a choose-one ask, a rating ask, a yes-or-no ask, and the delivery settings for visibility, deadline, and session wake"><figcaption><p>Delivery settings sit at the bottom of the card: when answers become visible, whether there is a deadline, and when the session should wake up.</p></figcaption></figure>

Delivery has three choices:

* **Answers visible:** **To everyone asked** shows each answer as it arrives. **After each person responds** keeps every answer hidden from someone until they have answered themselves, so the first reply cannot anchor everyone else.
* **Due:** an optional deadline.
* **Wake this session:** bring the agent session that asked back to life when enough people have replied, so the work continues without you having to remember to restart it.

## Where the Request Lands

Sending writes each ask into a shared markdown document as a [decision block](/team-collaboration/decisions): the document the request is about, or a newly created shared decision document when there is no host document. A standalone decision document also creates a tracker item automatically, so the open question shows up on the team's board.

The attached artifacts are published as shared documents, into a **Feedback requests** folder unless you choose another destination, and the request is delivered to each recipient's Inbox. A file already shared with your team is reused rather than duplicated.

Recipients answer the request in their Inbox in Nimbalyst, or in a browser: **Copy link** on the request gives you a [console.nimbalyst.com](https://console.nimbalyst.com) link that opens the [web console](/team-collaboration/web-console) directly at the document and block, which is how you reach someone who is not at their desktop.

## Reading the Results

The author's view is a tally, not a transcript.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-07d25c63ba744cb9e7d72fb279dbe34499fb6360%2Ffeedback-results.png?alt=media" alt="The results view of a feedback request showing vote bars for a choose-one question, a rating average, a yes-or-no split, and a Waiting on section with a Nudge button"><figcaption><p>Counts per option, the rating average and spread, the yes-or-no split, and who has not answered yet.</p></figcaption></figure>

* **Counts per ask:** vote bars with the number and, when answers are attributed, who voted which way
* **The spread, not just the average:** a rating shows its lowest and highest alongside the mean, because three people at 5 and one at 1 is a different situation from four people at 4
* **Waiting on:** who still owes an answer, with **Nudge** for one person or everyone outstanding
* **Discussion:** a thread on the request itself, for the argument that a field cannot hold

When answers are hidden until answered, the waiting-on list stays anonymous too. Naming who is outstanding would identify the answers already in.

## Anonymous and Attributed Requests

**After each person responds** keeps the request anonymous while it is being answered: nobody sees a peer's answer, and nobody can work out who said what from who is left.

**To everyone asked** shows answers as they arrive, attributed by name. Use it for sign-off and approvals, where who agreed is the point.

## Sealing and Closing a Request

The loop from question to decision keeps a person in charge of each step:

* **Answers accumulate privately.** Each reply lands in the tally, subject to the visibility setting you chose, and the request keeps taking answers until you close it or its deadline passes.
* **Quorum informs you; it does not decide.** Reaching the number of answers you asked for marks the request answered so you know it is time to settle it. Nothing closes on your behalf.
* **A person seals the decision.** You seal the block with an outcome, attributed by name and preserved in the markdown of the document itself, so the decision travels with the file.
* **The session resumes.** Sealing wakes the agent session that asked, and it continues its work with the results in hand.

Closed, expired, and cancelled requests stay in the Feedback section of your organization, beside the Inbox, so a decision made three weeks ago is still there with the counts that produced it and the artifacts as they were at the time.

Feedback requests are built on the same decision blocks you can insert into any document yourself. See [Decision Blocks in Documents](/team-collaboration/decisions).


# Decision Blocks in Documents

Put a decision question inside the document it is about. Author it as an answerable field, decide it yourself or ask teammates, and seal an attributed outcome that stays in the markdown.

A decision block is a question that lives inside a document. Instead of settling "which layout do we ship?" in a chat thread three tools away from the mockups, the question sits in the plan next to the options, collects answers, and ends with a sealed outcome written into the markdown itself. The decision travels with the document.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-522bfd6889f12565b481d3c910df296e86542872%2Frelease-decision-blocks.png?alt=media" alt="A markdown document with an open decision block offering three rate-limiting options and a sealed decision below it, expanded to show each teammate&#x27;s attributed vote"><figcaption><p>An open question with its options, and a sealed decision below it with every vote attributed in the expanded outcome.</p></figcaption></figure>

## Inserting a Decision Question

In any markdown document, type `/` (or open the component picker) and choose **Decision question**. The picker matches on **decision**, **question**, **feedback**, **poll**, and **vote**, so any of those words finds it.

## Authoring the Question

A decision block is a field people answer, not a paragraph they reply to. Six ask types cover the shapes a decision takes:

| Ask type       | What the answerer does                             |
| -------------- | -------------------------------------------------- |
| Choose one     | Chooses a single option                            |
| Choose several | Checks any number of options                       |
| Rank options   | Drags options into an order                        |
| Rate 1 to 5    | Picks a value on a scale you label at both ends    |
| Yes or no      | Confirms or declines                               |
| Edit a draft   | Revises a draft you seed and returns their version |

Choose-one and rank asks can carry a live artifact per option: a document, tracker item, file, or session rendered as a preview instead of a text label. Voting on "which mockup?" means looking at the mockups.

## Deciding Alone

A decision block does not require an audience. Use one to frame a choice for yourself, weigh the options, and seal the outcome so the document records what was decided and why. A plan that accumulates sealed decisions is its own history.

## Asking Teammates

Open **Ask teammates** on the block to pick recipients and send it. The question lands in each person's Inbox, and the block shows how many of the people asked have answered.

{% hint style="info" %}
Asking teammates requires [Nimbalyst Teams](/team-collaboration/overview) and a shared document. Everyone you ask has to be a member of your organization.
{% endhint %}

Answers are private. Each reply lands in a counted tally rather than in the document text, so the block shows the running count while it collects, and the first answer cannot anchor everyone after it. Teammates who are not at their desktop can answer in the [web console](/team-collaboration/web-console) through a link that opens the document at the block.

## Sealing the Outcome

When you are ready to settle the question, seal the block with an outcome. The seal is attributed by name and written into the markdown of the document itself, so the decision is readable anywhere the file goes: in Nimbalyst, in a diff, in a plain text editor, or by an agent reading the raw file. Reaching the number of answers you asked for marks the question answered, but only a person seals it.

## Agents Ask With the Same Blocks

When your agent composes a [feedback request](/team-collaboration/feedback-requests), it is writing these same decision blocks into a shared document. Sealing one wakes the session that asked, so the agent continues its work with the results. Everything on this page about ask types, private answers, and sealing applies there too.


# Web Console (console.nimbalyst.com)

Open your team's shared documents in a browser at console.nimbalyst.com, edit them live with teammates, leave comments, and manage your organization.

The Nimbalyst Web Console at [console.nimbalyst.com](https://console.nimbalyst.com) opens your team's shared documents in a browser. Nothing needs to be installed, and it uses the same collaboration service and permissions as the desktop app.

It exists so the people who need to read and respond to your work do not need to become Nimbalyst users first. Write a plan in the desktop app, share it with your team, and a teammate can open the link, follow your live edits, and leave comments from any browser.

{% hint style="info" %}
The console is part of Nimbalyst Teams, which is in **beta**. Expect bugs. Organizations are free during beta and will require a paid Nimbalyst Teams subscription after launch.
{% endhint %}

They can edit it too. Editing runs in both directions: a teammate with edit access types straight into the same document you are in, and their changes land in your desktop app as they make them. You each see the other's cursor while you work.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-128bdad1981dbb8b912ef02ec6f3443828e12b99%2Fconsole-editor-live.png?alt=media" alt="A shared markdown plan open in the browser editor, with a teammate&#x27;s labeled cursor in the document, a comments button showing four threads, and an Open in desktop link"><figcaption><p>A shared plan open in a browser, with a teammate editing alongside you.</p></figcaption></figure>

### What you can do in a browser

* **Open shared documents.** Browse your organization's shared document tree, folders, and projects. Every shared document opens, whatever its type.
* **Edit live.** Shared markdown documents are fully editable, with everyone's changes syncing in real time. Other document types open as editable source text.
* **See who else is here.** Live labeled cursors show each teammate editing alongside you, colored per person.
* **Comment on the text.** Select a passage, add a comment, reply, resolve, and mention teammates with `@`.
* **Manage your organization.** Billing, roles, invitations, security posture, and organization lifecycle.

The browser is a companion to the desktop app rather than a replacement for it. See [What the browser cannot do](#what-the-browser-cannot-do) for the specifics.

### Signing in

The console uses the same account as the desktop app. Two ways in:

1. **Continue with email** sends a magic link to your work address.
2. **Continue with Google** uses your connected Google identity.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-280a7ea50dcdeb1a77c95b8e1bf677823626ad90%2Fconsole-sign-in-dark.png?alt=media" alt="The Nimbalyst Web Console sign-in screen, with a work email field and a Continue with Google button"><figcaption><p>Sign in with the account connected to your organization.</p></figcaption></figure>

If your account belongs to more than one organization, you choose which one to open after signing in. You can switch organizations later from the profile menu at the bottom of the left navigation, without signing in again.

Browser sessions last seven days and are scoped to one signed-in account.

If you follow a link to a document while signed out, the console remembers where you were headed and returns you there after you sign in.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-5fdec2de7645625d150403a497e11d85021b2967%2Fconsole-session-expired.png?alt=media" alt="The console sign-in screen showing an alert reading: Your session is not active. Sign in to continue to this organization link."><figcaption><p>Following a shared link while signed out preserves your destination.</p></figcaption></figure>

### Accepting an invitation

When an organization admin invites you by email, the invitation link brings you to the console, accepts your membership, and lands you on the team's shared documents so you can start reading and editing right away. The desktop app is offered alongside, with a download link if you do not have it yet, for the work only it can do.

### Working in shared documents

The left navigation has two modes: **Shared Docs** and **Organization**.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-b0d51fb051776631d244f4e4b507c4213e0734d6%2Fconsole-shared-docs.png?alt=media" alt="The web console listing an organization&#x27;s shared documents in a table with Name, Type, Created by, Last edited, and Folder columns, beside a folder tree"><figcaption><p>Every shared document in the project, with its type, folder, author, and last edit.</p></figcaption></figure>

In Shared Docs you get a document tree on the left, a tab strip across the top for the documents you have open, and a breadcrumb showing organization, project, folder, and document. The tree and the comments panel are both resizable by dragging their edges, or with the arrow keys once a handle is focused. Double-click a handle to reset it.

If your organization has several projects, the project switcher sits at the top of the tree and shows how many shared documents each one holds.

Your open tabs, panel widths, and last-used project are remembered in the browser, so returning to the console puts you back where you were.

#### Editing together

Shared markdown documents are live, with images rendering in place. Above the document, a status pill reports the connection (**Live**, **Connecting**, **Reconnecting**, **Offline**, or **Read-only**) and a save chip reports whether your changes are saved. Rapid consecutive edits, such as retyping a spreadsheet cell, save in order so the latest value always wins.

The document stays hidden until the first sync completes, so you never type into what looks like an empty document while the server copy is still loading.

Each teammate editing with you appears as a colored cursor labeled with their name. Screen readers announce people joining, leaving, and editing.

Edits go both ways. Anyone whose organization role allows it can type into the document from the browser, and those changes reach the desktop app and every other open browser as they happen. Viewers and guests are held to reading.

#### Commenting

Select any text in the document and choose **Add comment**. Comments dock in a panel on the right, which you can toggle from the floating comments button. The button carries a count when the panel is closed.

* Reply to a thread, then **Resolve** it once it is handled.
* Type `@` in the composer to mention a teammate.
* Mentioned teammates are notified.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-14fd367a136d941500a8d0e620de60cd329fdd24%2Fconsole-comments.png?alt=media" alt="A shared plan open in the browser with the comments panel docked on the right, showing four threads anchored to passages, each with an author, a timestamp, a reply box, and Resolve and Delete actions"><figcaption><p>Comments anchor to the passage they are about, with replies and resolve in the docked panel.</p></figcaption></figure>

Commenting depends on your organization role. Owners, admins, and members can write comments. Viewers and guests can read but not comment. Comments are also withdrawn on any document the server has made read-only for you.

#### Opening in the desktop app

Every document has an **Open in desktop** link in its status bar that hands the document off to Nimbalyst on your machine. A document that opens as source text offers the same handoff more prominently, since its visual editor lives in the desktop app.

### Organization administration

Switch the left navigation to **Organization** for five sections:

| Section               | What it covers                                                                                                                                                  |
| --------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Overview**          | Your role, membership type, and every project in the organization                                                                                               |
| **Billing**           | Current plan, status, seat count, and period end; seat changes and payment management run through the billing provider, and the console never sees card details |
| **Roles and members** | The member list, each person's role, role changes, member removal, and email invitations                                                                        |
| **Security**          | Data custody mode, encryption key epoch and fingerprint, and the twenty most recent organization audit events                                                   |
| **Danger zone**       | Merge this organization into another, or delete it permanently                                                                                                  |

Deleting an organization requires typing its exact name. Role changes and every other privileged write are checked again by the collaboration service, so the console never grants access on its own.

### What the browser cannot do

The console is deliberately narrower than the desktop app. Today:

* **Rich editing is for markdown.** Shared markdown documents open in the full editor. Every other shared document, including mockups, diagrams, data models, mind maps, spreadsheets, and code files, opens as editable source text, so nothing shared is out of reach in a browser. The visual editors for those types remain in the desktop app.
* **Tracker boards stay in the desktop app.** The Radar digest of shared tracker activity is available in the browser, but the boards themselves do not open there.
* **Documents above 8 MiB of collaborative state** are too large for a browser tab and offer a desktop handoff instead.
* **No document history or version view.**
* **No export or embedding.**
* **No promoting a local file to the team.** Sharing a local file to your organization happens in the desktop app.
* **No personal (non-team) documents**, and no read receipts.
* **No creating projects or organizations.** The console works with organizations and projects that already exist.

### Troubleshooting

| What you see                                        | What it means                                                                                                                                  |
| --------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| **No access to this organization**                  | The link points at an organization your account cannot open. Check you signed in with the right address.                                       |
| **Organization access was removed**                 | Your membership ended while you had the document open. Live access stops immediately.                                                          |
| **Document not found**                              | The document was deleted, or it left the project you have access to.                                                                           |
| **Your session expired**                            | Sign in again. Your destination is preserved.                                                                                                  |
| **Shared documents are unavailable**                | The collaboration service could not be reached. Your route is kept, so a retry returns you to the same place.                                  |
| **This document is too large to edit in a browser** | Nothing is lost. Open it in the desktop app, which has no such limit.                                                                          |
| **This document is now read-only**                  | The server rejected an edit. The rejected change was not saved.                                                                                |
| **This document could not be opened**               | The first sync did not complete. Nothing you type would be saved, so editing stays off until the connection returns. **Try again** retries it. |

If a sign-in link fails, it has usually been used already or expired. Request a fresh one.

### Related

* [Team Collaboration Overview](/team-collaboration/overview)
* [Collaborative Documents](/team-collaboration/documents)
* [Set Up Nimbalyst Teams and Organizations](/team-collaboration/setup-teams-and-orgs)


# Set Up Nimbalyst Teams

Create a Nimbalyst organization, attach a project to it, invite teammates, and manage members, projects, messaging, and encryption from the organization management dialog.

Nimbalyst Teams has two layers. An **organization** holds the member roster, billing, messaging settings, and encryption. A **project** is one git repository attached to that organization, with its own shared documents and trackers. Nimbalyst uses the project's git remote as its identity, so teammates who open clones of the same repository connect to the same team project.

Setup lives in two places: **Settings** for your account and the current project, and the **organization management dialog** for everything organization-wide.

{% hint style="info" %}
Nimbalyst Teams is in **beta**. Expect bugs. Organizations are free during beta and will require a paid Nimbalyst Teams subscription after launch.
{% endhint %}

### Before you begin

Make sure that:

* You have opened the correct project in Nimbalyst.
* The project has a git remote named `origin` if you want automatic project matching.
* You are signed in to Nimbalyst under **Settings > Account > Accounts**.
* Teammates will sign in with the email addresses you invite.

### Create an organization

Your signed-in accounts and the organizations each one belongs to are listed under **Settings > Account > Accounts**. Use **New organization** here to start one, or **Manage** to open the management dialog for an existing one.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-cee63a4ca4192e77703ab181688cdead6340fe1a%2Fteam-account-organizations.png?alt=media" alt="Settings, Account, Accounts, showing the signed-in email with its organizations, each with an Admin or Owner role badge, a Manage button, and a New organization button"><figcaption><p>Every organization your signed-in account belongs to, with your role in each.</p></figcaption></figure>

Each row shows your role, **Owner** or **Admin**, and how many projects the organization holds. The person who creates an organization becomes its owner. You can also **Add another account** and belong to organizations under more than one identity.

### Attach this project to an organization

Project-level sharing lives under **Settings > Project > Sharing**. This panel is where a repository becomes a team project.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-bff8d2b85af2b5307a31fa227d573ca18d1aebe5%2Fteam-project-sharing-panel.png?alt=media" alt="Settings, Project, Sharing, showing the Organization section with the signed-in account and the organization attachment controls"><figcaption><p>Settings > Project > Sharing attaches the current repository to an organization.</p></figcaption></figure>

To create a team from this project:

1. Open **Settings**.
2. Select **Project** at the top.
3. In the sidebar, select **Sharing**.
4. Click **Create Team**.
5. Confirm the team name and detected git remote. If you have more than one Nimbalyst account, choose the account that should own the team.
6. Click **Create Team**.

Nimbalyst creates the organization, registers this repository as its first project, and prepares the team's encryption.

If you already administer an organization, use **Add to an existing organization** instead of creating another one:

1. Select the organization.
2. Click **Add Project**.
3. Confirm that this workspace appears as a project under the organization.

Each project has its own tracker and document space. Projects in the same organization share the member roster, messaging settings, and encryption.

### Manage the organization

Organization administration is a dialog that opens in whatever window you are already in, rather than a fourth Settings scope. Open it any of these ways:

* **Organization switcher** in the navigation gutter, then **Manage organization…**.
* **Settings > Account > Accounts**, then **Manage** on the organization's row.
* The organization row in the **account menu** at the bottom of the navigation gutter.
* **Settings > Project > Sharing**, then **Open organization**, which lands on the **Projects** page.
* The pending-invitations row in the organization switcher, which lands on **Members**.

The dialog's sidebar holds **Members**, **Projects**, and **Settings**, plus **Billing** and **Danger zone** for owners and admins. Plain members do not see the last two.

**Window > Organization Messages** (**Cmd/Ctrl+Alt+O**) is a different surface. It opens the messaging window for rooms and direct messages, not the administration dialog.

#### Members and roles

**Members & Roles** carries a `beta` chip while roles and verification settle. Under **Members**, enter a teammate's email address and click **Invite**. Inviting someone asks what they get: their role, any extra projects beyond the current one, and folders to share with the team, so a new teammate arrives to real work instead of an empty organization. The invite stays pending until that person joins. An owner or admin can revoke a pending invite, remove a member, or move a member between **Admin** and **Member**.

This page also shows identity fingerprints so teammates can verify one another. Compare fingerprints through a separate trusted channel before marking someone verified. A changed fingerprint means the member's device identity changed, so verify it again before trusting the new key. Owners and admins can re-share a team key when a verified member changes devices.

#### Projects

**Projects** lists every project in the organization, including ones you have not cloned locally.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-1bf66c1a13a65e467dc33a27133ca1a35832c965%2Fteam-org-window-projects.png?alt=media" alt="The organization management dialog Projects page, listing a git-linked project with a Manage access button and a reserved Organization Space entry"><figcaption><p>Every project in the organization, whether or not you have a local clone.</p></figcaption></figure>

Use **Manage access** to control who can reach a project's shared documents and trackers. To add a project, open it in Nimbalyst and go to **Project Settings > Sharing > Add to an existing organization**. **Organization Space**, a shared area for documents and trackers that belong to the organization rather than to a single repository, is reserved for a later release.

#### Settings: messaging, security, and encryption

**Settings** covers organization-wide configuration. Members can view this page; only owners and admins can change it.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-7430b9752229d83a8952d152d534761f6203b34f%2Fteam-org-window-settings.png?alt=media" alt="The organization management dialog Settings page, showing the organization name with a Rename action, Messaging toggles for Rooms and Direct messages, a who-can-create-rooms selector, and a Security panel reading Encrypted by Nimbalyst with encryption active"><figcaption><p>Rename the organization, control built-in messaging, and check encryption status.</p></figcaption></figure>

* **Organization:** Rename the organization. The owner's email address is shown beneath it.
* **Messaging:** Turn **Rooms** and **Direct messages** off for organizations that chat elsewhere. The Inbox, document comments, and tracker comments are unaffected. **Who can create rooms** offers **Any member** or **Organization admins only**, and is unavailable while Rooms is off.
* **Security:** Team data is encrypted in transit and at rest with keys managed by Nimbalyst. This is separate from personal sync encryption, whose keys remain only on your devices.

**Billing** and **Danger zone** round out the dialog. Details on encryption, data isolation, and SOC 2 are on the [security page](https://nimbalyst.com/features/security/).

### Join an invited team

Accepting the invitation link opens the team in the browser at the [web console](/team-collaboration/web-console), landing on its shared documents, so a new teammate can start reading and editing before installing anything. The desktop app is offered alongside, with a download link, for the work only it can do.

To connect the desktop app, the invited person should:

1. Sign in to Nimbalyst with the invited email address.
2. Open a clone of the team's repository in Nimbalyst.
3. Open **Settings > Project > Sharing**.
4. Click **Join Team** on the invitation card.

Because the repository remote matches the team project, the shared documents and trackers become available once the invitation is accepted and the encryption key is ready.

If the invite does not appear, confirm the signed-in email address and the repository's `origin` remote first.

### Use multiple accounts

Add or reconnect accounts under **Settings > Account > Accounts**, then switch between them from the account menu in the navigation footer.

When you create an organization, add a project to one, or create a shared link, Nimbalyst lets you choose which signed-in account owns that action. Organization membership and project access continue to use that account even when another account is selected for personal mobile sync.

If an invitation or team project is missing, first switch to the account whose email address received the invitation.

### Which scope does what

| You want to…                                              | Go to                              |
| --------------------------------------------------------- | ---------------------------------- |
| Sign in, add an account, or start an organization         | **Settings > Account > Accounts**  |
| Attach this repository to an organization, or join a team | **Settings > Project > Sharing**   |
| Choose which tracker types sync to the team               | **Settings > Project > Trackers**  |
| Invite people, set roles, verify fingerprints             | **Organization dialog > Members**  |
| Manage project access across the organization             | **Organization dialog > Projects** |
| Rename the org, control messaging, check encryption       | **Organization dialog > Settings** |
| Chat in rooms and direct messages                         | **Window > Organization Messages** |

Team content is authorized with the active team membership. Personal session and mobile sync use a separate personal identity and do not grant access to team documents or trackers. See [Application, Account, and Project Settings](/setup-nimbalyst/settings-scopes) for the complete settings model.

### Start collaborating

After the team is connected:

* Open **Collaboration** mode to create and organize shared documents.
* Right-click a supported local file and choose **Share to Team**.
* Open **Trackers** to share hybrid items or work in tracker types configured as shared.

Continue with [Collaborative Documents](/team-collaboration/documents) and [Collaborative Trackers](/team-collaboration/trackers).


# Extension System & Marketplace

Install Nimbalyst extensions from the marketplace registry to add editors, AI tools, and panels, or publish an extension you built yourself.

This page explains what Nimbalyst extensions are, how to install and manage them from the built-in Marketplace, and where to start if you want to build your own. It is written for anyone using Nimbalyst; no development experience is needed until the final section.

The full list of published extensions, with screenshots, is at [nimbalyst.com/extensions](https://nimbalyst.com/extensions/).

## What Are Extensions?

Extensions are add-ons that give Nimbalyst new capabilities. Each extension can add custom editors for new file types, AI tools that let your agent interact with your content, sidebar panels, settings pages, themes, keyboard shortcuts, and more.

Extensions work seamlessly alongside Nimbalyst's built-in editors. When you open a file, Nimbalyst checks whether any extension handles that file type and loads the right editor automatically. Extensions have full access to Nimbalyst's theming system, so they always match your current look and feel.

## Browsing the Marketplace

Go to **Settings > Extensions > Marketplace** to browse and install extensions.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-55af2eb57e5f333f3dc88d926c63d7118a759b19%2Fdocs-marketplace-discover.png?alt=media" alt="Extension Marketplace showing featured extensions and category filters"><figcaption><p>The Extension Marketplace in Settings, with a search box, category filters, and featured extension cards such as CSV Spreadsheet, DatamodelLM, Excalidraw, and MockupLM.</p></figcaption></figure>

Click any extension card to see its full details, screenshots, permissions, and install button.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-21600c4395a3c15ec84ef257a44653e05b93087c%2Fdocs-marketplace-detail.png?alt=media" alt="Extension detail modal showing description, screenshots, and install button"><figcaption><p>The detail view for the CSV Spreadsheet extension, showing its description, feature highlights, a screenshot, and the version number.</p></figcaption></figure>

### What's in the catalog

The catalog is updated as extensions are released, so use the Marketplace for the current list, versions, screenshots, and permissions. Recent additions include:

* **Electronics Studio**: work with tscircuit and Circuit JSON in schematic, PCB, assembly, and 3D views, run simulations, and export manufacturing and review artifacts.
* **Replicad CAD**: build parametric 3D models in TypeScript with a live B-rep preview, STEP import and export, geometry inspection, and printability tools.
* **Media Viewer**: open and play `.mp4` files in a tab, including scrubbing through long recordings.

Marketplace cards show whether an extension is installed and whether an update is available.

### Managing Installed Extensions

View all installed extensions under **Settings > Extensions > Installed**. This is the single panel for everything you have installed. Marketplace, GitHub, local dev, and built-in extensions all show up here, each with a source pill so you can tell them apart at a glance.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-ed6c417884faeec78d98c2c2f1b9cf2c2578a108%2Fdocs-extensions-installed.png?alt=media" alt="Installed Extensions panel showing all active extensions with details"><figcaption><p>The Installed Extensions panel, with the extension list and enable toggles on the left and the selected extension's plugin, contributed AI tools, and permissions on the right.</p></figcaption></figure>

Each row has an enable toggle and an indicator if an update is available. Click an extension to open the detail pane, which includes its AI tools, permissions, file path, and **Update**, **Repository**, **Reveal**, and **Uninstall** actions.

The Marketplace page itself only shows the Discover catalog. An **Installed** button at the top of the page shows your install count and any pending updates, and takes you to the Installed panel.

### Themes from Extensions

Extensions can ship themes. Any theme contributed by an installed extension shows up under **Settings > Application > Themes** in an **Extension Themes** group, and in the gutter theme popup, alongside the built-in themes. Pick one and Nimbalyst applies it just like a first-party theme.

If you later disable or uninstall the extension that provided the active theme, Nimbalyst falls back gracefully so your workspace stays usable.

### Installing from GitHub

At the bottom of the Marketplace discover page, you can paste a GitHub repository URL to install any extension directly from source. The repository must contain a valid `manifest.json` file.

## Build Your Own Extensions

Extensions are self-contained packages that declare their file types, editors, and UI contributions via a manifest. You can build extensions that do everything the built-in ones do.

**What you can build:**

* **Custom editors** for any file type (spreadsheets, diagrams, visual tools)
* **AI tools** that Claude can use to read and modify your editor's content
* **Panels** for sidebar views, fullscreen modes, or floating windows
* **Application or Project settings pages** with project-aware context
* **Project filesystem access** for editors that manage related files
* **Typed tracker item pickers and live references**
* **Themes, slash commands, file icons, and new file templates**

**How development works:**

* The **Extension Dev Kit** (bundled with Nimbalyst) scaffolds a new extension project with a starter template, hot reload, and MCP tools for build, install, and reload from inside Nimbalyst.
* Editors integrate through the **EditorHost contract** (load/save, dirty state, theme, external change handling) so custom editors behave exactly like first-party ones.
* The full **Extension SDK** provides clipboard access, screenshot export, AI and network permissions, and the same MCP tooling that first-party extensions use.

For full technical documentation on building extensions, see [Building Your Own Extensions](/extensions/building-extensions).


# Building Your Own Extensions

Build your own Nimbalyst extension with custom editors, AI tools, panels, and themes, packaged with a manifest that declares what it adds.

This section is the developer documentation for building Nimbalyst extensions: custom editors, AI tools, panels, themes, and more. It is written for developers comfortable with React and TypeScript.

Extensions are self-contained packages with a `manifest.json` that declares their contributions. Nimbalyst is open source, and the built-in extensions live alongside the app source in [github.com/nimbalyst](https://github.com/nimbalyst); the fastest way to learn the extension API is to read those built-in extensions.

The [extensions feature page](https://nimbalyst.com/features/extensions/) covers what extensions can contribute to the app.

## What Can Extensions Do?

* **Custom Editors**: new ways to view and edit file types (spreadsheets, diagrams, 3D models)
* **AI Tools**: tools that Claude can use to interact with your extension
* **AI Completions**: call chat models (Claude, OpenAI, LM Studio) directly from your extension
* **Panels**: sidebar panels, fullscreen views, floating windows, or bottom panels
* **Settings Pages**: application- or project-scoped settings with repository context
* **Project Filesystem Access**: read and update related project files from a custom editor
* **Tracker References**: typed item pickers and live tracker reference chips
* **Themes**: custom color themes
* **Slash Commands**: commands users can invoke from the chat
* **File Icons**: custom icons for file types in the sidebar
* **New File Types**: entries in the "New File" menu

## Quick Start

The recommended workflow is to create and iterate on extensions from inside Nimbalyst:

1. Enable **Extension Dev Tools** in **Settings > Application > Advanced**
2. Use `File > New Extension Project` or ask Claude to run `/new-extension`
3. Describe the extension you want Claude to build from the starter scaffold
4. Ask Claude to build and install the extension with `extension_build` and `extension_install`
5. Use `extension_reload` for rebuild plus reinstall during iteration

See [Getting Started](/extensions/building-extensions/getting-started) for a step-by-step walkthrough.

## Project Structure

A typical extension project:

```
my-extension/
  manifest.json       # Extension metadata and contributions
  package.json        # npm dependencies
  tsconfig.json       # TypeScript configuration
  vite.config.ts      # Build configuration
  src/
    index.ts          # Extension entry point (activate/deactivate)
    components/       # React components
    styles.css        # Scoped styles
```

## Development Workflow

1. **Create**: use `/new-extension` inside Nimbalyst or copy a starter project
2. **Develop**: edit files in your extension project
3. **Build**: Claude uses `extension_build` to compile
4. **Install**: Claude uses `extension_install` to load it
5. **Test**: open a file with your extension's file type
6. **Iterate**: Claude uses `extension_reload` for hot updates

## Core Concepts

### The Extension Manifest

Every extension needs a `manifest.json` that describes what it provides. At minimum:

```json
{
  "id": "com.example.my-editor",
  "name": "My Editor",
  "version": "1.0.0",
  "main": "dist/index.js"
}
```

See [Manifest Reference](/extensions/building-extensions/manifest-reference) for the complete schema.

### The EditorHost Contract

Custom editors receive a `host` prop that handles all communication with Nimbalyst: loading and saving files, tracking dirty state, theme changes, and AI diff mode. The `useEditorLifecycle` hook wraps the host into a single, clean API.

See [Custom Editors](/extensions/building-extensions/custom-editors) for the full guide.

### AI Tool Integration

AI tools let Claude interact with your editor programmatically. Define tools with a name, description, input schema, and handler function. Claude reads the description to decide when to call your tool.

See [AI Tools](/extensions/building-extensions/ai-tools) for examples and best practices.

### Permissions

Extensions declare the capabilities they need:

| Permission   | What It Grants                                             |
| ------------ | ---------------------------------------------------------- |
| `filesystem` | Read and write files in the workspace                      |
| `ai`         | Register AI tools and call chat/completion models directly |
| `network`    | Make network requests to external services                 |

## Documentation

| Document                                                                 | Description                               |
| ------------------------------------------------------------------------ | ----------------------------------------- |
| [Getting Started](/extensions/building-extensions/getting-started)       | Create your first extension in 10 minutes |
| [Custom Editors](/extensions/building-extensions/custom-editors)         | Build editors for new file types          |
| [AI Tools](/extensions/building-extensions/ai-tools)                     | Add tools that Claude can use             |
| [Manifest Reference](/extensions/building-extensions/manifest-reference) | Complete manifest.json schema             |
| [API Reference](/extensions/building-extensions/api-reference)           | TypeScript types and interfaces           |

## Prerequisites

* Nimbalyst with Extension Dev Tools enabled (**Settings > Application > Advanced**)
* Node.js 18+
* Basic knowledge of React and TypeScript

## Built-in Extension Examples

Study the built-in extensions for patterns and best practices:

| Extension       | File Types       | Notable Patterns                           |
| --------------- | ---------------- | ------------------------------------------ |
| Excalidraw      | `.excalidraw`    | Imperative API via refs, 19 AI tools       |
| CSV Spreadsheet | `.csv`, `.tsv`   | RevoGrid with custom save, formula support |
| DataModelLM     | `.prisma`        | Zustand store, screenshot export           |
| MockupLM        | `.mockup.html`   | iframe preview, AI generation              |
| SQLite Browser  | `.db`, `.sqlite` | Read-only binary editor, 9 AI tools        |

These are all in `packages/extensions/` in the [Nimbalyst repository on GitHub](https://github.com/nimbalyst).


# Getting Started

Create your first Nimbalyst extension step by step, ending with a working custom editor for a new file type built on the extension SDK.

This guide walks you through creating your first Nimbalyst extension, aimed at developers who know some React and TypeScript. By the end, you'll have a working extension that registers a custom editor for `.hello` files.

## Recommended: Create It From Inside Nimbalyst

The intended workflow is to scaffold and iterate on extensions from inside Nimbalyst:

1. Enable Extension Dev Tools in **Settings > Application > Advanced**
2. Use `File > New Extension Project` or `Developer > New Extension Project`
3. Or ask Claude to run `/new-extension ~/my-first-extension "Hello Editor" *.hello`
4. Ask Claude to build and install it with `extension_build` and `extension_install`
5. Use `extension_reload` while iterating

The rest of this guide shows the manual scaffold path if you prefer to create the project yourself.

## Prerequisites

1. **Enable Extension Dev Tools**: go to **Settings > Application > Advanced** and enable "Extension Dev Tools"
2. **Node.js 18+**: required for building extensions

## Step 1: Create the Project

Create a new directory for your extension:

```bash
mkdir my-first-extension
cd my-first-extension
npm init -y
```

## Step 2: Install Dependencies

```bash
npm install --save-dev typescript vite @nimbalyst/extension-sdk
npm install react
```

## Step 3: Create the Manifest

Create `manifest.json`. This tells Nimbalyst about your extension:

```json
{
  "id": "com.example.hello-editor",
  "name": "Hello Editor",
  "version": "1.0.0",
  "description": "A simple custom editor for .hello files",
  "main": "dist/index.js",
  "apiVersion": "1.0.0",
  "contributions": {
    "customEditors": [
      {
        "filePatterns": ["*.hello"],
        "displayName": "Hello Editor",
        "component": "HelloEditor"
      }
    ],
    "newFileMenu": [
      {
        "extension": ".hello",
        "displayName": "Hello File",
        "icon": "description",
        "defaultContent": "Hello, World!"
      }
    ]
  }
}
```

`apiVersion` is currently optional but recommended.

## Step 4: Create the Vite Config

Create `vite.config.ts`:

```typescript
import { defineConfig } from 'vite';
import { createExtensionConfig } from '@nimbalyst/extension-sdk/vite';

export default defineConfig(
  createExtensionConfig({
    entry: './src/index.ts',
  })
);
```

## Step 5: Create the TypeScript Config

Create `tsconfig.json`:

```json
{
  "compilerOptions": {
    "target": "ES2020",
    "module": "ESNext",
    "moduleResolution": "bundler",
    "jsx": "react-jsx",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "declaration": true,
    "outDir": "dist",
    "rootDir": "src"
  },
  "include": ["src/**/*"]
}
```

## Step 6: Create the Extension Entry Point

Create `src/index.ts`:

```typescript
import type { ExtensionContext } from '@nimbalyst/extension-sdk';
import { HelloEditor } from './HelloEditor';

// Export components that the manifest references
export const components = {
  HelloEditor,
};

// Called when the extension is loaded
export function activate(context: ExtensionContext) {
  console.log('Hello Editor extension activated!');
}

// Called when the extension is unloaded
export function deactivate() {
  console.log('Hello Editor extension deactivated');
}
```

## Step 7: Create the Editor Component

Create `src/HelloEditor.tsx`:

```tsx
import React, { useRef, useReducer } from 'react';
import { useEditorLifecycle } from '@nimbalyst/extension-sdk';
import type { EditorHostProps } from '@nimbalyst/extension-sdk';

export function HelloEditor({ host }: EditorHostProps) {
  const textRef = useRef('');
  const textareaRef = useRef<HTMLTextAreaElement>(null);
  const [, forceRender] = useReducer((x) => x + 1, 0);

  const { isLoading, error, markDirty } = useEditorLifecycle(host, {
    applyContent: (content: string) => {
      textRef.current = content;
      if (textareaRef.current) {
        textareaRef.current.value = content;
      }
      forceRender();
    },
    getCurrentContent: () => textRef.current,
  });

  const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
    textRef.current = e.target.value;
    markDirty();
  };

  if (error) return <div style={{ padding: '20px' }}>Error: {error.message}</div>;
  if (isLoading) return <div style={{ padding: '20px' }}>Loading...</div>;

  return (
    <div style={{
      padding: '20px',
      height: '100%',
      display: 'flex',
      flexDirection: 'column'
    }}>
      <h2 style={{ marginBottom: '10px' }}>Hello Editor</h2>
      <p style={{ color: 'var(--nim-text-muted)', marginBottom: '10px' }}>
        Editing: {host.filePath}
      </p>
      <textarea
        ref={textareaRef}
        defaultValue={textRef.current}
        onChange={handleChange}
        style={{
          flex: 1,
          padding: '10px',
          fontSize: '16px',
          fontFamily: 'monospace',
          backgroundColor: 'var(--nim-bg-secondary)',
          color: 'var(--nim-text)',
          border: '1px solid var(--nim-border)',
          borderRadius: '4px',
          resize: 'none'
        }}
      />
    </div>
  );
}
```

**Key points:**

* `useEditorLifecycle` handles loading, saving, file watching, echo detection, and dirty state
* `applyContent` pushes content into the editor (on load, external changes)
* `getCurrentContent` pulls content from the editor (on save)
* Call `markDirty()` when the user edits; the hook manages `host.setDirty()` for you
* Content lives in a ref, not React state; the textarea uses `defaultValue`

## Step 8: Add Build Script

Update your `package.json` to add a build script:

```json
{
  "scripts": {
    "build": "vite build"
  }
}
```

## Step 9: Build and Install

Now ask Claude to build and install your extension:

> "Build and install my extension from \~/my-first-extension"

Claude will use the `extension_build` and `extension_install` tools to compile and load your extension.

## Step 10: Test It

1. Create a new file with the `.hello` extension
2. Your custom editor should appear instead of the default text editor
3. Make changes and save; they persist to the file

## Next Steps

* Add styling with a `styles.css` file
* Add AI tools so Claude can interact with your editor
* Add a toolbar with actions
* Handle more complex file formats

See the [custom-editors.md](/extensions/building-extensions/custom-editors) guide for more advanced editor development.

## Troubleshooting

### Extension doesn't load

1. Check the console for errors (View > Toggle Developer Tools)
2. Verify your `manifest.json` has a valid `id` field
3. Make sure `dist/index.js` exists after building

### Editor doesn't appear for file type

1. Check that `filePatterns` in the manifest matches your file extension
2. Verify the `component` name matches what you export in `components`

### Changes don't appear after editing

Ask Claude to reload the extension:

> "Reload my hello-editor extension"

This will rebuild and hot-reload without restarting Nimbalyst.


# Custom Editors

Build a custom editor extension for Nimbalyst: the useEditorLifecycle hook, the EditorHost interface, undo and redo, and large file handling.

This guide covers building custom editor extensions: the `useEditorLifecycle` hook, the `EditorHost` interface, styling, and patterns for larger editors. It is for extension developers; read [Getting Started](/extensions/building-extensions/getting-started) first if you have not built an extension yet.

Custom editors are the most powerful extension type. They let you create entirely new ways to view and edit file types, from spreadsheets to diagrams to 3D models.

## How Custom Editors Work

When a user opens a file, Nimbalyst checks if any extension has registered a custom editor for that file type. If found, your React component is rendered instead of the default editor.

Your component receives a single `host` prop from Nimbalyst. The host handles loading, saving, dirty tracking, file change notifications, and optional features like diff mode.

## The useEditorLifecycle Hook

The recommended way to build custom editors is with the `useEditorLifecycle` hook. It replaces all manual `EditorHost` subscription boilerplate (loading, saving, echo detection, file watching, diff mode, theme) with a single hook call.

```tsx
import { useEditorLifecycle } from '@nimbalyst/extension-sdk';
import type { EditorHostProps } from '@nimbalyst/extension-sdk';

export function MyEditor({ host }: EditorHostProps) {
  const editorRef = useRef<MyEditorAPI>(null);

  const { isLoading, error, theme, markDirty, diffState } = useEditorLifecycle(host, {
    applyContent: (data) => editorRef.current?.load(data),
    getCurrentContent: () => editorRef.current?.getData() ?? defaultValue,
    parse: (raw) => JSON.parse(raw),
    serialize: (data) => JSON.stringify(data),
  });

  if (error) return <div>Failed to load: {error.message}</div>;
  if (isLoading) return <div>Loading...</div>;

  return <MyEditorComponent ref={editorRef} onChange={markDirty} theme={theme} />;
}
```

### How It Works

The hook interacts with your editor through pull/push callbacks; content never lives in React state:

* **`applyContent(parsed)`**: Called to push content INTO the editor (on initial load, on external file change). Update your editor's internal state here.
* **`getCurrentContent()`**: Called to pull content FROM the editor (on save). Return the current state. Omit for read-only editors.
* **`parse(raw)`**: Convert raw file string into your editor's format. Omit if your editor works with raw strings.
* **`serialize(data)`**: Convert your editor's format back to a string for saving. Omit if already a string.

### What It Returns

| Field              | Type                        | Description                                   |
| ------------------ | --------------------------- | --------------------------------------------- |
| `isLoading`        | `boolean`                   | `true` until initial content is loaded        |
| `error`            | `Error \| null`             | Error from initial load                       |
| `theme`            | `string`                    | Current theme name (reactive)                 |
| `markDirty`        | `() => void`                | Call when the user makes an edit              |
| `isDirty`          | `boolean`                   | Whether unsaved changes exist                 |
| `diffState`        | `DiffState<T> \| null`      | AI edit diff with `accept`/`reject` callbacks |
| `toggleSourceMode` | `(() => void) \| undefined` | Toggle to Monaco source view                  |
| `isSourceMode`     | `boolean`                   | Whether source mode is active                 |

### Editor Architecture Patterns

The hook supports three common architectures:

**Library-managed** (Excalidraw, Three.js): callbacks talk to the library's imperative API via refs:

```tsx
const apiRef = useRef<ExcalidrawImperativeAPI>(null);
useEditorLifecycle(host, {
  applyContent: (elements) => apiRef.current?.updateScene({ elements }),
  getCurrentContent: () => apiRef.current?.getSceneElements() ?? [],
  parse: (raw) => JSON.parse(raw).elements,
  serialize: (elements) => JSON.stringify({ elements }),
});
```

**Store-managed** (Zustand, custom stores): callbacks talk to a store:

```tsx
const storeRef = useRef(createMyStore());
useEditorLifecycle(host, {
  applyContent: (doc) => storeRef.current.getState().loadDocument(doc),
  getCurrentContent: () => storeRef.current.getState().document,
  parse: parseDocument,
  serialize: serializeDocument,
});
```

**Read-only** (PDF viewer, SQLite browser): only `applyContent`, no save:

```tsx
const dataRef = useRef<ArrayBuffer | null>(null);
const [, forceRender] = useReducer((x) => x + 1, 0);
useEditorLifecycle(host, {
  applyContent: (data) => { dataRef.current = data; forceRender(); },
  binary: true,
});
```

### Additional Options

| Option             | Type                           | Description                                                                                   |
| ------------------ | ------------------------------ | --------------------------------------------------------------------------------------------- |
| `binary`           | `boolean`                      | Use `loadBinaryContent()` instead of `loadContent()`. For PDFs, images, SQLite, etc.          |
| `onLoaded`         | `() => void`                   | Called after initial content is loaded and applied                                            |
| `onExternalChange` | `(content: T) => void`         | Called when an external file change is detected (not from our own save)                       |
| `onSave`           | `() => Promise<void>`          | Replace the default save flow. Use for async content extraction (e.g., RevoGrid)              |
| `onDiffRequested`  | `(config: DiffConfig) => void` | Replace default diff handling. Use for specialized diff rendering (e.g., cell-level CSV diff) |
| `onDiffCleared`    | `() => Promise<void>`          | Replace default diff cleanup. Paired with `onDiffRequested`                                   |

### Echo Detection

The hook automatically ignores file change notifications caused by our own saves. This prevents the editor from reloading content immediately after saving, a common source of bugs in manual implementations.

## EditorHost Interface

The `useEditorLifecycle` hook wraps this interface. You rarely need to use it directly, but it's useful to understand what's available. This is an abbreviated view of the core members; see the [API Reference](/extensions/building-extensions/api-reference) for the full interface, including storage, chat context, and editor API registration.

```typescript
interface EditorHostProps {
  host: EditorHost;
}

interface EditorHost {
  readonly filePath: string;
  readonly fileName: string;
  readonly theme: string;
  readonly isActive: boolean;
  readonly workspaceId?: string;
  readonly fs?: EditorHostFileSystem;

  loadContent(): Promise<string>;
  loadBinaryContent(): Promise<ArrayBuffer>;
  onFileChanged(callback: (newContent: string) => void): () => void;
  setDirty(isDirty: boolean): void;
  saveContent(content: string | ArrayBuffer): Promise<void>;
  onSaveRequested(callback: () => void | Promise<void>): () => void;
  onThemeChanged(callback: (theme: string) => void): () => void;
  openHistory(): void;

  // Diff mode (AI edits)
  onDiffRequested?(callback: (config: DiffConfig) => void): () => void;
  reportDiffResult?(result: DiffResult): void;
  onDiffCleared?(callback: () => void): () => void;

  // Source mode (toggle to Monaco)
  toggleSourceMode?(): void;
  onSourceModeChanged?(callback: (isActive: boolean) => void): () => void;
  isSourceModeActive?(): boolean;
}
```

## Key Concepts

### Content Ownership

Nimbalyst editors use a **host-driven save model** where the editor owns its content state:

1. **Initial load**: The hook calls `host.loadContent()` and passes the result to your `applyContent` callback
2. **Dirty tracking**: Call `markDirty()` when the user makes changes
3. **Saving**: The hook subscribes to save events and calls your `getCurrentContent` to get the data
4. **External changes**: The hook detects external file changes, filters echoes, and calls `applyContent`

### Why Not Pass Content as a Prop?

The `EditorHost` model is more efficient for complex editors:

* Spreadsheets with thousands of cells do not need to serialize on every keystroke
* Diagram editors can maintain rich object graphs internally
* Binary editors can load and save `ArrayBuffer` data without pretending everything is text
* Imperative editor libraries (Excalidraw, RevoGrid, Three.js) cannot be re-rendered anyway

## Accessing Other Project Files

A file-backed custom editor can use the optional `host.fs` service when it needs to read or update project files beyond the document currently open in the editor. This is useful for CAD projects, generated assets, compilers, analyzers, and editors backed by several related files.

```tsx
const snapshots = await host.fs?.read([
  'models/assembly.json',
  'models/materials.json',
]);

const assembly = snapshots?.[0];
if (assembly?.exists && assembly.content && assembly.sha256) {
  await host.fs?.write({
    label: 'Update assembly',
    actor: 'user',
    changes: [
      {
        path: assembly.path,
        expectedSha256: assembly.sha256,
        content: updateAssembly(assembly.content),
      },
    ],
  });
}
```

The service:

* Restricts paths to the active workspace, including protection against symlink escapes.
* Returns a SHA-256 version token with every read.
* Uses the version token for compare-and-swap writes so an editor cannot silently overwrite a newer file.
* Refuses to write a file that has unsaved changes in another open editor.
* Records successful writes in Nimbalyst document history.
* Can observe external project-file changes through `host.fs.onChanged()`.

`host.fs` is optional. It is not present for virtual, embedded, offscreen, or collaborative hosts that cannot provide raw local-disk semantics. Always guard it before use and provide a clear read-only or unavailable state.

Use `loadContent()` and `saveContent()` for the editor's primary file. Use `host.fs` only for additional project files.

## Registering the Editor

In your `manifest.json`:

```json
{
  "contributions": {
    "customEditors": [
      {
        "filePatterns": ["*.mytype", "*.myt"],
        "displayName": "My Type Editor",
        "component": "MyEditor",
        "supportsDiffMode": false,
        "showDocumentHeader": false
      }
    ]
  }
}
```

And export it from your entry point:

```typescript
// src/index.ts
import { MyEditor } from './MyEditor';

export const components = {
  MyEditor,
};
```

## Styling Your Editor

### Using CSS Variables

Nimbalyst provides CSS variables for theming. Always use these instead of hardcoded colors:

```css
.my-editor {
  background: var(--nim-bg);
  color: var(--nim-text);
  border: 1px solid var(--nim-border);
}

.my-editor-toolbar {
  background: var(--nim-bg-secondary);
  border-bottom: 1px solid var(--nim-border);
}

.my-editor-button:hover {
  background: var(--nim-bg-hover);
}
```

### Available CSS Variables

| Variable             | Purpose                   |
| -------------------- | ------------------------- |
| `--nim-bg`           | Main background           |
| `--nim-bg-secondary` | Toolbar/panel background  |
| `--nim-bg-tertiary`  | Nested element background |
| `--nim-bg-hover`     | Hover state background    |
| `--nim-text`         | Main text color           |
| `--nim-text-muted`   | Muted text                |
| `--nim-text-faint`   | Very muted text           |
| `--nim-border`       | Main borders              |
| `--nim-primary`      | Accent/brand color        |

### Including Styles

Create a `styles.css` file and reference it in your manifest:

```json
{
  "styles": "dist/index.css"
}
```

Import it in your entry point:

```typescript
// src/index.ts
import './styles.css';
```

## Handling Large Files

For large files, consider:

### Virtualization

Only render visible rows/items:

```tsx
import { useVirtualizer } from '@tanstack/react-virtual';

function LargeListEditor({ items }) {
  const parentRef = useRef<HTMLDivElement>(null);

  const virtualizer = useVirtualizer({
    count: items.length,
    getScrollElement: () => parentRef.current,
    estimateSize: () => 35,
  });

  return (
    <div ref={parentRef} style={{ height: '100%', overflow: 'auto' }}>
      <div style={{ height: virtualizer.getTotalSize() }}>
        {virtualizer.getVirtualItems().map(virtualRow => (
          <div
            key={virtualRow.key}
            style={{
              position: 'absolute',
              top: virtualRow.start,
              height: virtualRow.size,
            }}
          >
            {items[virtualRow.index]}
          </div>
        ))}
      </div>
    </div>
  );
}
```

### Lazy Parsing

Parse content incrementally:

```typescript
function parseContentLazy(content: string) {
  // Return a lightweight wrapper that parses on demand
  return {
    getRow(index: number) {
      // Parse just this row when needed
    },
    get length() {
      // Count rows without full parse
    }
  };
}
```

## Undo/Redo Support

Nimbalyst doesn't provide built-in undo for custom editors. Implement your own:

```tsx
import { useState, useCallback } from 'react';

function useUndoRedo<T>(initialState: T) {
  const [history, setHistory] = useState<T[]>([initialState]);
  const [index, setIndex] = useState(0);

  const state = history[index];

  const setState = useCallback((newState: T) => {
    const newHistory = history.slice(0, index + 1);
    newHistory.push(newState);
    setHistory(newHistory);
    setIndex(newHistory.length - 1);
  }, [history, index]);

  const undo = useCallback(() => {
    if (index > 0) setIndex(index - 1);
  }, [index]);

  const redo = useCallback(() => {
    if (index < history.length - 1) setIndex(index + 1);
  }, [index, history.length]);

  const canUndo = index > 0;
  const canRedo = index < history.length - 1;

  return { state, setState, undo, redo, canUndo, canRedo };
}
```

## Keyboard Shortcuts

Handle keyboard shortcuts in your editor:

```tsx
function MyEditor({ content, onChange }) {
  useEffect(() => {
    const handleKeyDown = (e: KeyboardEvent) => {
      // Cmd/Ctrl + Z for undo
      if ((e.metaKey || e.ctrlKey) && e.key === 'z' && !e.shiftKey) {
        e.preventDefault();
        undo();
      }
      // Cmd/Ctrl + Shift + Z for redo
      if ((e.metaKey || e.ctrlKey) && e.key === 'z' && e.shiftKey) {
        e.preventDefault();
        redo();
      }
    };

    window.addEventListener('keydown', handleKeyDown);
    return () => window.removeEventListener('keydown', handleKeyDown);
  }, [undo, redo]);

  // ...
}
```

## Example: Simple Table Editor

A complete example using `useEditorLifecycle`:

```tsx
import React, { useRef } from 'react';
import { useEditorLifecycle } from '@nimbalyst/extension-sdk';
import type { EditorHostProps } from '@nimbalyst/extension-sdk';

export function TableEditor({ host }: EditorHostProps) {
  const dataRef = useRef<string[][]>([]);
  const tableRef = useRef<HTMLTableElement>(null);

  const parseCSV = (text: string): string[][] =>
    text.split('\n').map(row => row.split(',').map(cell => cell.trim()));

  const serializeCSV = (data: string[][]): string =>
    data.map(row => row.join(',')).join('\n');

  const { isLoading, error, theme, markDirty } = useEditorLifecycle(host, {
    applyContent: (data: string[][]) => {
      dataRef.current = data;
      renderTable();
    },
    getCurrentContent: () => dataRef.current,
    parse: parseCSV,
    serialize: serializeCSV,
  });

  function renderTable() {
    // Re-render table imperatively or use forceUpdate
  }

  if (error) return <div>Error: {error.message}</div>;
  if (isLoading) return <div>Loading...</div>;

  return (
    <div style={{ padding: '10px', overflow: 'auto', height: '100%' }}>
      <table ref={tableRef} style={{ borderCollapse: 'collapse', width: '100%' }}>
        <tbody>
          {dataRef.current.map((row, rowIndex) => (
            <tr key={rowIndex}>
              {row.map((cell, colIndex) => (
                <td key={colIndex} style={{ border: '1px solid var(--nim-border)' }}>
                  <input
                    defaultValue={cell}
                    onChange={e => {
                      dataRef.current[rowIndex][colIndex] = e.target.value;
                      markDirty();
                    }}
                    style={{
                      width: '100%',
                      padding: '4px',
                      border: 'none',
                      background: 'transparent',
                      color: 'var(--nim-text)'
                    }}
                  />
                </td>
              ))}
            </tr>
          ))}
        </tbody>
      </table>
    </div>
  );
}
```

## Best Practices

### Shared documents

`useEditorLifecycle` handles file-backed editing. A custom editor that opts into shared documents also needs two collaboration pieces:

* `useCollaborativeEditor` binds one mounted editor to the shared Y.Doc for live edits and presence.
* A `CollabContentAdapter` lets the host seed a shared document from a file, export it, build revision snapshots and search text, and apply structured AI edits even when no tab is open.

Register one adapter per `documentType` during `activate()` with `context.services.collab.registerContentAdapter(adapter)`, and declare matching `collaboration` metadata on the custom editor contribution. Implement `toPlainText` for search and AI read access; AI write access also requires `toStructured` and `applyStructuredPatch` so the host has a typed patch contract.

If the Y.Doc layout changes, bump the adapter's `layoutVersion` and provide migrations. Adapters run in the client against an already decrypted Y.Doc; the collaboration server continues to treat document state as opaque encrypted data.

1. **Use `useEditorLifecycle`** - Handles loading, saving, echo detection, file watching, diff mode, and theme
2. **Keep content out of React state** - Use refs or external stores for editor data
3. **Use CSS variables** - Your editor should respect the user's theme
4. **Handle empty content** - The file might be new or empty
5. **Call `markDirty()`** - Not `host.setDirty()` directly -- the hook tracks dirty state for you
6. **Test with large files** - Ensure your editor performs well
7. **Register a collaboration adapter** if the file type can be shared, so history, export, search, re-upload, and AI features can understand it

## Next Steps

* Add [ai-tools.md](/extensions/building-extensions/ai-tools) so Claude can interact with your editor
* See [manifest-reference.md](/extensions/building-extensions/manifest-reference) for all configuration options
* Check the built-in extensions in `packages/extensions/` in the Nimbalyst repository for production examples


# AI Tools

Add AI tools to a Nimbalyst extension so coding agents can read and change your custom file types instead of only seeing raw file content.

AI tools let supported coding agents interact with your extension programmatically. When you add tools, an agent can read structured data, make targeted changes, and help users work with your custom file types.

## Why Add AI Tools?

Without tools, an agent can only:

* Read the raw file content
* Suggest edits to the raw content

With tools, an agent can:

* Query structured data ("What columns are in this spreadsheet?")
* Make targeted changes ("Add a row with these values")
* Perform complex operations ("Sort by the date column")
* Understand your data model ("What entities are defined?")

## Tool Definition Structure

Tools are defined in your extension's entry point:

```typescript
// src/index.ts
import type { ExtensionAITool } from '@nimbalyst/extension-sdk';

export const aiTools: ExtensionAITool[] = [
  {
    name: 'my_tool_name',
    description: 'What this tool does - the agent reads this to decide when to use it',
    inputSchema: {
      type: 'object',
      properties: {
        param1: {
          type: 'string',
          description: 'Description of param1',
        },
        param2: {
          type: 'number',
          description: 'Description of param2',
        },
      },
      required: ['param1'],
    },
    handler: async (args, context) => {
      // Implement tool logic
      return { result: 'success' };
    },
  },
];
```

## Registering Tools in the Manifest

Add tools to your `manifest.json`:

```json
{
  "permissions": {
    "ai": true
  },
  "contributions": {
    "aiTools": [
      "myext.get_data",
      "myext.update_data"
    ]
  }
}
```

## Tool Handler Context

The handler receives a context object with useful information:

```typescript
interface AIToolContext {
  // Path to the current workspace (if any)
  workspacePath?: string;

  // Path to the active file (if any)
  activeFilePath?: string;

  // Access host services such as filesystem, UI, and AI helpers
  extensionContext: ExtensionContext;

  // Imperative API registered by the targeted mounted editor, when available
  editorAPI?: unknown;
}
```

## Example: Spreadsheet Tools

Before implementing a tool, declare how it accesses document state:

```typescript
type ExtensionAIToolAccess =
  | { kind: 'filesystem' }
  | { kind: 'editor-read' }
  | { kind: 'editor-write' };
```

* Use `access: { kind: 'filesystem' }` when the handler can read or write the current file through `context.extensionContext.services.filesystem`. This avoids mounting an editor and reads the latest disk content.
* Use `editor-read` for operations that need a mounted editor API without changing content, such as renderer-backed screenshots or selection inspection.
* Use `editor-write` only when the tool intentionally changes editor state. The host then performs a conflict-aware save after the handler finishes.

Accepting a `filePath` argument does not require editor access. A compiler, analyzer, or converter that works from disk should still declare `filesystem`. The older `readOnly: true` field remains compatible, but new tools should use `access`.

Here's a complete example for a CSV/spreadsheet editor:

```typescript
import type {
  AIToolContext,
  ExtensionAITool,
  ExtensionToolResult,
} from '@nimbalyst/extension-sdk';

async function loadActiveFile(context: AIToolContext): Promise<{
  filePath: string;
  content: string;
} | ExtensionToolResult> {
  if (!context.activeFilePath) {
    return { success: false, error: 'No active file is open.' };
  }

  try {
    const content = await context.extensionContext.services.filesystem.readFile(context.activeFilePath);
    return {
      filePath: context.activeFilePath,
      content,
    };
  } catch (error) {
    return {
      success: false,
      error: `Failed to read active file: ${error instanceof Error ? error.message : String(error)}`,
    };
  }
}

// Helper to parse CSV
function parseCSV(content: string): string[][] {
  return content.split('\n').map(row => row.split(','));
}

export const aiTools: ExtensionAITool[] = [
  {
    name: 'csv.get_schema',
    description: 'Get the column names and row count of the current CSV file',
    scope: 'global',
    access: { kind: 'filesystem' },
    inputSchema: {
      type: 'object',
      properties: {},
    },
    handler: async (_args, context) => {
      const loaded = await loadActiveFile(context);
      if ('success' in loaded) {
        return loaded;
      }

      const rows = parseCSV(loaded.content);
      const headers = rows[0] || [];

      return {
        success: true,
        data: {
          columns: headers,
          rowCount: rows.length - 1,
          filePath: loaded.filePath,
        },
      };
    },
  },

  {
    name: 'csv.get_rows',
    description: 'Get rows from the CSV file. Returns data as objects with column names as keys.',
    inputSchema: {
      type: 'object',
      properties: {
        startRow: {
          type: 'number',
          description: 'Starting row index (0-based, excluding header)',
        },
        count: {
          type: 'number',
          description: 'Number of rows to return (default: 10)',
        },
      },
    },
    handler: async (args, context) => {
      const loaded = await loadActiveFile(context);
      if ('success' in loaded) {
        return loaded;
      }

      const rows = parseCSV(loaded.content);
      const headers = rows[0] || [];
      const dataRows = rows.slice(1);

      const start = typeof args.startRow === 'number' ? args.startRow : 0;
      const count = typeof args.count === 'number' ? args.count : 10;
      const selectedRows = dataRows.slice(start, start + count);

      return {
        success: true,
        data: {
          rows: selectedRows.map(row => {
            const obj: Record<string, string> = {};
            headers.forEach((h, i) => {
              obj[h] = row[i] || '';
            });
            return obj;
          }),
          totalRows: dataRows.length,
        },
      };
    },
  },

  {
    name: 'csv.add_row',
    description: 'Add a new row to the CSV file',
    inputSchema: {
      type: 'object',
      properties: {
        data: {
          type: 'object',
          description: 'Object with column names as keys and cell values',
        },
      },
      required: ['data'],
    },
    handler: async (args, context) => {
      const loaded = await loadActiveFile(context);
      if ('success' in loaded) {
        return loaded;
      }

      const rows = parseCSV(loaded.content);
      const headers = rows[0] || [];

      // Build new row from data object
      const values = (args.data as Record<string, string>) || {};
      const newRow = headers.map(h => values[h] || '');
      rows.push(newRow);

      const nextContent = rows.map(r => r.join(',')).join('\n');
      await context.extensionContext.services.filesystem.writeFile(
        loaded.filePath,
        nextContent
      );

      return {
        success: true,
        message: `Added a row to ${loaded.filePath}.`,
        data: {
          rowIndex: rows.length - 1,
        },
      };
    },
  },
];
```

## Updating File Content

When a tool needs to modify a file, write through the filesystem service:

```typescript
handler: async (args, context) => {
  // ... modify data ...

  if (!context.activeFilePath) {
    return { success: false, error: 'No active file is open.' };
  }

  await context.extensionContext.services.filesystem.writeFile(
    context.activeFilePath,
    serializedData
  );

  return {
    success: true,
    message: 'Row added successfully',
  };
}
```

Nimbalyst will:

1. Persist the updated file content
2. Notify the active editor through file watching
3. Let the editor reload or reconcile its in-memory state

## Tool Naming Conventions

Use a prefix for your tools to avoid conflicts:

```
extensionname.action_name
```

Examples:

* `csv.get_schema`
* `csv.add_row`
* `diagram.add_node`
* `datamodel.get_entities`

## Writing Good Tool Descriptions

The agent uses the description to decide when to use your tool. Be specific:

**Good:**

```typescript
description: 'Get the column names and data types from the current CSV file. Returns an array of column definitions.'
```

**Bad:**

```typescript
description: 'Get schema'  // Too vague
```

## Error Handling

Return errors as objects, not thrown exceptions:

```typescript
handler: async (args, context) => {
  if (!context.activeFilePath) {
    return { success: false, error: 'No active file is open' };
  }

  if (!args.columnName) {
    return { success: false, error: 'columnName parameter is required' };
  }

  try {
    // ... do work ...
    return { success: true, data: result };
  } catch (e) {
    return {
      success: false,
      error: `Failed to process: ${e instanceof Error ? e.message : String(e)}`,
    };
  }
}
```

## Input Schema

The `inputSchema` follows JSON Schema format:

```typescript
inputSchema: {
  type: 'object',
  properties: {
    // String parameter
    name: {
      type: 'string',
      description: 'The name to use',
    },

    // Number parameter
    count: {
      type: 'number',
      description: 'How many items',
    },

    // Boolean parameter
    includeHeaders: {
      type: 'boolean',
      description: 'Whether to include header row',
    },

    // Enum parameter
    format: {
      type: 'string',
      enum: ['json', 'csv', 'xml'],
      description: 'Output format',
    },

    // Array parameter
    columns: {
      type: 'array',
      items: { type: 'string' },
      description: 'List of column names',
    },

    // Object parameter
    options: {
      type: 'object',
      properties: {
        sortBy: { type: 'string' },
        ascending: { type: 'boolean' },
      },
    },
  },
  required: ['name'], // Required parameters
}
```

## Best Practices

1. **Keep tools focused** - One tool, one job
2. **Return structured data** - Objects are easier for agents to work with
3. **Include context in responses** - Return relevant metadata
4. **Handle missing files gracefully** - Check if `activeFilePath` exists and read through the filesystem service
5. **Validate inputs** - Check required parameters
6. **Use descriptive names** - `get_column_stats` not `stats`

## Testing Tools

Test your tools by asking an agent to use them:

> "What columns are in this CSV file?"

The agent should invoke your `csv.get_schema` tool and report the results.

## Example: Data Model Tools

For a more complex example, here are tools for a data modeling extension:

```typescript
export const aiTools: ExtensionAITool[] = [
  {
    name: 'datamodel.get_entities',
    description: 'List all entities (tables/models) defined in the data model',
    inputSchema: { type: 'object', properties: {} },
    handler: async (_args, context) => {
      if (!context.activeFilePath) {
        return { success: false, error: 'No active file is open' };
      }

      const content = await context.extensionContext.services.filesystem.readFile(
        context.activeFilePath
      );
      const model = parseDataModel(content);

      return {
        success: true,
        data: {
          entities: model.entities.map(e => ({
            name: e.name,
            fieldCount: e.fields.length,
          })),
        },
      };
    },
  },

  {
    name: 'datamodel.get_entity',
    description: 'Get detailed information about a specific entity',
    inputSchema: {
      type: 'object',
      properties: {
        name: { type: 'string', description: 'Entity name' },
      },
      required: ['name'],
    },
    handler: async (args, context) => {
      if (!context.activeFilePath) {
        return { success: false, error: 'No active file is open' };
      }

      const content = await context.extensionContext.services.filesystem.readFile(
        context.activeFilePath
      );
      const model = parseDataModel(content);
      const entity = model.entities.find(e => e.name === args.name);

      if (!entity) {
        return { success: false, error: `Entity '${args.name}' not found` };
      }

      return {
        success: true,
        data: {
          name: entity.name,
          fields: entity.fields.map(f => ({
            name: f.name,
            type: f.type,
            required: f.required,
          })),
          relations: entity.relations,
        },
      };
    },
  },

  {
    name: 'datamodel.add_field',
    description: 'Add a new field to an entity',
    inputSchema: {
      type: 'object',
      properties: {
        entityName: { type: 'string' },
        fieldName: { type: 'string' },
        fieldType: { type: 'string' },
        required: { type: 'boolean' },
      },
      required: ['entityName', 'fieldName', 'fieldType'],
    },
    handler: async (args, context) => {
      if (!context.activeFilePath) {
        return { success: false, error: 'No active file is open' };
      }

      const content = await context.extensionContext.services.filesystem.readFile(
        context.activeFilePath
      );
      const model = parseDataModel(content);
      const entity = model.entities.find(e => e.name === args.entityName);

      if (!entity) {
        return { success: false, error: `Entity '${args.entityName}' not found` };
      }

      entity.fields.push({
        name: args.fieldName,
        type: args.fieldType,
        required: args.required ?? false,
      });

      await context.extensionContext.services.filesystem.writeFile(
        context.activeFilePath,
        serializeDataModel(model)
      );

      return {
        success: true,
        message: `Added ${args.fieldName} to ${args.entityName}.`,
      };
    },
  },
];
```

## Calling AI Models Directly

Extensions can also call configured chat/completion models directly, without creating or driving a coding-agent session. This is useful for summarization, classification, code generation, or any task where the extension itself needs an AI response.

### Prerequisites

Your manifest must declare `permissions.ai: true`.

### Listing Available Models

```typescript
export async function activate(context: ExtensionContext) {
  const models = await context.services.ai!.listModels();
  // => [
  //   { id: "provider:model-id", name: "Model display name", provider: "provider" },
  //   ...
  // ]
}
```

Only models from chat providers the user has enabled and configured are returned (Claude, OpenAI, LM Studio). Agent providers like Claude Code are not included.

### Non-Streaming Completion

```typescript
const result = await context.services.ai!.chatCompletion({
  messages: [
    { role: 'user', content: 'Classify this text as positive or negative: "Great product!"' },
  ],
  model: models[0].id, // optional; use an ID returned by listModels()
  systemPrompt: 'Respond with a single word: positive or negative.',
  temperature: 0,
  maxTokens: 10,
});

console.log(result.content);  // "positive"
console.log(result.model);    // "claude-sonnet-4-6-20250514"
console.log(result.usage);    // { inputTokens: 42, outputTokens: 1 }
```

### Streaming Completion

For longer responses where you want to show results incrementally:

```typescript
const handle = await context.services.ai!.chatCompletionStream({
  messages: [
    { role: 'user', content: 'Write a haiku about programming' },
  ],
  onChunk: (chunk) => {
    if (chunk.type === 'text') {
      // Append text to your UI
      appendToOutput(chunk.content!);
    } else if (chunk.type === 'error') {
      showError(chunk.error!);
    }
    // chunk.type === 'done' means the stream is complete
  },
});

// Optionally abort:
// handle.abort();

// Wait for the full result:
const result = await handle.result;
console.log(result.content); // Full response text
```

### Multi-Turn Conversations

Pass multiple messages for conversation context:

```typescript
const result = await context.services.ai!.chatCompletion({
  messages: [
    { role: 'user', content: 'What is the capital of France?' },
    { role: 'assistant', content: 'The capital of France is Paris.' },
    { role: 'user', content: 'What is its population?' },
  ],
});
```

### Structured Output (JSON Mode)

Use `responseFormat` to constrain the model's output to valid JSON:

```typescript
// Simple JSON mode - model returns valid JSON
const result = await context.services.ai!.chatCompletion({
  messages: [{ role: 'user', content: 'List 3 colors with hex codes' }],
  systemPrompt: 'Respond in JSON format.',
  responseFormat: { type: 'json_object' },
});
const data = JSON.parse(result.content);
```

For stricter control, use `json_schema` to enforce a specific shape:

```typescript
const result = await context.services.ai!.chatCompletion({
  messages: [{ role: 'user', content: 'Classify this issue: login page crashes on Safari' }],
  responseFormat: {
    type: 'json_schema',
    schema: {
      type: 'object',
      properties: {
        category: { type: 'string', enum: ['bug', 'feature', 'question'] },
        severity: { type: 'string', enum: ['low', 'medium', 'high', 'critical'] },
        component: { type: 'string' },
      },
      required: ['category', 'severity', 'component'],
    },
  },
});
const classification = JSON.parse(result.content);
// => { category: "bug", severity: "high", component: "auth" }
```

### Key Points

* **Stateless**: These calls do not create sessions in the session history. Each call is independent.
* **Model selection**: Use `listModels()` to discover available models, then pass an `id` to `chatCompletion()` or `chatCompletionStream()`. If you omit the model, the first available provider's default is used.
* **Chat providers only**: Claude, OpenAI, and LM Studio. Agent providers (Claude Code, Codex) are not available through this API.
* **User configuration**: The API respects the user's provider settings and API keys. If a provider is disabled or unconfigured, its models won't appear in `listModels()`.

## Next Steps

* See [custom-editors.md](/extensions/building-extensions/custom-editors) to build the visual component
* Check [manifest-reference.md](/extensions/building-extensions/manifest-reference) for all configuration options
* Check the built-in extensions in `packages/extensions/` in the Nimbalyst repository for production examples
* See [api-reference.md](/extensions/building-extensions/api-reference) for full type definitions


# Manifest Reference

Full reference for the Nimbalyst extension manifest.json: required fields, permissions, contributions, file pattern syntax, and validation.

The `manifest.json` file declares your extension metadata, permissions, and contributions.

## Basic Structure

```json
{
  "id": "com.example.my-extension",
  "name": "My Extension",
  "version": "1.0.0",
  "main": "dist/index.js",
  "styles": "dist/index.css",
  "apiVersion": "1.0.0",
  "permissions": {},
  "contributions": {}
}
```

## Required Fields

### `id`

Unique identifier for your extension.

```json
"id": "com.yourcompany.extension-name"
```

* Use reverse-domain style identifiers.
* Must start with a letter.
* Can contain letters, numbers, dots, underscores, and hyphens.

### `name`

Human-readable name shown in the UI.

```json
"name": "CSV Spreadsheet Editor"
```

### `version`

Extension version in semver format.

```json
"version": "1.0.0"
```

### `main`

Path to the built JavaScript entry point, relative to the manifest.

```json
"main": "dist/index.js"
```

`main` is required for normal extensions. Claude-plugin-only extensions can omit it if they do not ship runtime code.

## Optional Top-Level Fields

### `description`

Short description of what your extension does.

```json
"description": "Edit CSV files with a spreadsheet interface"
```

### `author`

Author or organization name.

```json
"author": "Nimbalyst"
```

### `styles`

Path to a CSS bundle to load with your extension.

```json
"styles": "dist/index.css"
```

### `apiVersion`

Optional extension API version string.

```json
"apiVersion": "1.0.0"
```

This is currently recommended, not required. Use it so future compatibility checks can warn more precisely.

### `requiredReleaseChannel`

Restrict visibility to a release channel.

```json
"requiredReleaseChannel": "alpha"
```

Allowed values:

* `"stable"`
* `"alpha"`

### `defaultEnabled`

Control whether the extension starts enabled the first time it is discovered.

```json
"defaultEnabled": false
```

If omitted, the extension defaults to enabled.

## Permissions

Declare the capabilities your extension needs:

```json
"permissions": {
  "filesystem": true,
  "ai": true,
  "network": false,
  "catalog": ["nimbalyst-database-read"]
}
```

Available permissions:

| Permission   | Description                                                                                                                                                                                                     |
| ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `filesystem` | Read and write files through extension services                                                                                                                                                                 |
| `ai`         | Register AI tools, context providers, and call AI chat/completion models directly (`listModels`, `chatCompletion`, `chatCompletionStream`)                                                                      |
| `network`    | Reserved for network-enabled extensions                                                                                                                                                                         |
| `catalog`    | Permission-catalog capability IDs required by gated host APIs. For example, database reads require `nimbalyst-database-read`. Backend modules declare their own permissions on the module contribution instead. |

## Contributions

The `contributions` object declares what your extension adds to Nimbalyst.

### `customEditors`

Register custom editors for matching file types.

```json
"contributions": {
  "customEditors": [
    {
      "filePatterns": ["*.csv", "*.tsv"],
      "displayName": "Spreadsheet Editor",
      "component": "SpreadsheetEditor",
      "supportsSourceMode": true,
      "supportsDiffMode": true,
      "readOnlyDuringDiff": true,
      "supportsTranscriptEmbed": true,
      "transcriptEmbedHeight": 420,
      "showDocumentHeader": true
    }
  ]
}
```

| Field                     | Type       | Description                                                                                                                   |
| ------------------------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------- |
| `filePatterns`            | `string[]` | Glob patterns for matching files                                                                                              |
| `displayName`             | `string`   | Name shown in the editor selector                                                                                             |
| `component`               | `string`   | Key in your exported `components` object                                                                                      |
| `supportsSourceMode`      | `boolean`  | Enables the host's source-mode toggle                                                                                         |
| `supportsDiffMode`        | `boolean`  | Enables the host's AI diff review mode. Defaults to `false` when omitted                                                      |
| `readOnlyDuringDiff`      | `boolean`  | Tells the host that this editor actually locks manual edits during diff review. Defaults to `false`                           |
| `supportsTranscriptEmbed` | `boolean`  | Allows a read-only, click-to-activate editor embed in agent transcripts. Defaults to `false`                                  |
| `transcriptEmbedHeight`   | `number`   | Preferred transcript embed height in pixels. Defaults to `360`                                                                |
| `showDocumentHeader`      | `boolean`  | Shows the host-provided document header above the editor. Defaults to `true` when omitted                                     |
| `collaboration`           | `object`   | Declares shared-document support and optional awareness fields. Editors that opt in must implement the collaborative binding. |

### `documentHeaders`

Render UI above matching editors without replacing the editor itself.

```json
"documentHeaders": [
  {
    "id": "astro-frontmatter",
    "filePatterns": ["*.astro"],
    "displayName": "Astro Frontmatter",
    "component": "AstroFrontmatterHeader",
    "priority": 100
  }
]
```

### `aiTools`

Declare AI tools your extension provides. This is an array of tool name strings, not full tool definitions.

```json
"aiTools": [
  "csv.get_schema",
  "csv.query"
]
```

The actual tool definitions belong in your TypeScript exports:

```ts
export const aiTools: ExtensionAITool[] = [
  {
    name: 'csv.get_schema',
    description: 'Get the column names from the active CSV file',
    inputSchema: { type: 'object', properties: {} },
    handler: async (_args, context) => {
      return { success: true, data: {} };
    },
  },
];
```

### `newFileMenu`

Add items to the "New File" menu.

```json
"newFileMenu": [
  {
    "extension": ".csv",
    "displayName": "CSV Spreadsheet",
    "icon": "table",
    "defaultContent": "Column A,Column B\n,\n,"
  }
]
```

### `fileIcons`

Override file icons in the sidebar.

```json
"fileIcons": {
  "*.csv": "table",
  "*.tsv": "table",
  "*.json": "data_object"
}
```

Keys are glob patterns. Values are Material icon names.

### `slashCommands`

Register slash commands for the command picker.

```json
"slashCommands": [
  {
    "id": "csv.insert-table",
    "title": "Insert CSV Table",
    "description": "Insert a table from CSV data",
    "icon": "table",
    "keywords": ["csv", "table"],
    "handler": "insertCsvTable"
  }
]
```

| Field         | Type       | Description                           |
| ------------- | ---------- | ------------------------------------- |
| `id`          | `string`   | Stable command identifier             |
| `title`       | `string`   | Label shown in the picker             |
| `description` | `string`   | Optional help text                    |
| `icon`        | `string`   | Optional Material icon name           |
| `keywords`    | `string[]` | Optional search keywords              |
| `handler`     | `string`   | Name of the exported handler function |

### `commands` and `keybindings`

Declare named actions in `commands`, then bind keys separately in `keybindings`. Panel toggle commands are registered automatically as `<extensionId>.<panelId>.toggle`, so a panel shortcut does not need a matching `commands` entry.

```json
"commands": [
  {
    "id": "csv.refresh",
    "title": "Refresh CSV Data"
  }
],
"keybindings": [
  {
    "key": "cmd+shift+r",
    "command": "csv.refresh"
  }
]
```

### `configuration`

Declare user/workspace settings for your extension.

```json
"configuration": {
  "title": "CSV Tools",
  "properties": {
    "delimiter": {
      "type": "string",
      "default": ",",
      "description": "Default delimiter for new CSV files",
      "scope": "workspace"
    }
  }
}
```

### `claudePlugin`

Bundle a Claude Code plugin with the extension.

```json
"claudePlugin": {
  "path": "claude-plugin",
  "displayName": "CSV Assistant",
  "description": "Adds Claude Code helpers for CSV workflows",
  "enabledByDefault": true
}
```

### `panels`

Register non-file-based panels.

```json
"panels": [
  {
    "id": "database-browser",
    "title": "Database",
    "icon": "database",
    "placement": "sidebar",
    "aiSupported": true
  }
]
```

`placement` must be one of:

* `"sidebar"`
* `"fullscreen"`
* `"floating"`
* `"bottom"`

### `settingsPanel`

Add a nested settings UI inside the extension's installed-extension detail.

```json
"settingsPanel": {
  "component": "CsvSettingsPanel",
  "title": "CSV Tools",
  "icon": "settings",
  "order": 100
}
```

### `settingsRoutes`

Add a first-class page to the Application or Project Settings sidebar:

```json
"settingsRoutes": [
  {
    "id": "memory",
    "scope": "project",
    "label": "Memory",
    "group": "Project",
    "icon": "psychology",
    "order": 80,
    "component": "MemorySettings"
  }
]
```

| Field       | Type                         | Description                                                                          |
| ----------- | ---------------------------- | ------------------------------------------------------------------------------------ |
| `id`        | `string`                     | Unique route ID inside this extension. The host namespaces it to prevent collisions. |
| `scope`     | `"application" \| "project"` | Settings scope where the page appears. Account routes are reserved for Nimbalyst.    |
| `label`     | `string`                     | User-facing sidebar label.                                                           |
| `group`     | `string`                     | Optional sidebar group. Defaults to `Extensions`.                                    |
| `icon`      | `string`                     | Optional Material Symbol name. Defaults to `extension`.                              |
| `order`     | `number`                     | Optional sort order within the extension group. Defaults to `100`.                   |
| `component` | `string`                     | Component name exported from the module's `settingsPanel` record.                    |

Project routes receive the active repository through `SettingsPanelProps.workspacePath` and the complete target through `projectTarget`. Application routes omit project context.

Use `settingsRoutes` when the extension owns a settings destination users should navigate to directly. Use `settingsPanel` for configuration that belongs inside the installed-extension detail.

### `themes`

Register selectable themes contributed by your extension.

```json
"themes": [
  {
    "id": "solarized-light",
    "name": "Solarized Light",
    "isDark": false,
    "colors": {
      "bg": "#fdf6e3",
      "text": "#657b83",
      "primary": "#268bd2"
    }
  }
]
```

### `nodes`, `transformers`, and `hostComponents`

These contribution arrays declare names of exports provided by your module.

```json
"nodes": ["MyLexicalNode"],
"transformers": ["myMarkdownTransformer"],
"hostComponents": ["MyFloatingToolbar"]
```

`lexicalExtensions` is the supported contribution for Lexical features built with `defineExtension` from `@lexical/extension`. The strings in the manifest name entries in the module's exported `lexicalExtensions` record.

### Advanced contributions

The SDK also defines contribution types for provider-neutral `agentWorkflows`, isolated `backendModules`, `trackerImporters`, and `aiAgentProviders`.

Backend modules run in a utility process or worker thread and remain disabled until the user grants them at first use. Their declaration names the built entry file, runtime, granular permission IDs, and a short purpose shown in the consent prompt. Renderer-side gated APIs instead use the top-level `permissions.catalog` array.

Tracker importers and AI agent providers reference a backend module because their privileged work cannot run in the renderer. These surfaces have additional permission, validation, and lifecycle requirements; use the TypeScript declarations from your installed `@nimbalyst/extension-sdk` and the current built-in extensions as the canonical reference.

## Complete Example

```json
{
  "id": "com.nimbalyst.csv-tools",
  "name": "CSV Tools",
  "version": "1.0.0",
  "description": "Custom CSV editing and AI helpers",
  "author": "Nimbalyst",
  "main": "dist/index.js",
  "styles": "dist/index.css",
  "apiVersion": "1.0.0",
  "defaultEnabled": true,
  "permissions": {
    "filesystem": true,
    "ai": true
  },
  "contributions": {
    "customEditors": [
      {
        "filePatterns": ["*.csv", "*.tsv"],
        "displayName": "Spreadsheet Editor",
        "component": "SpreadsheetEditor",
        "supportsSourceMode": true
      }
    ],
    "aiTools": [
      "csv.get_schema",
      "csv.query"
    ],
    "fileIcons": {
      "*.csv": "table",
      "*.tsv": "table"
    },
    "slashCommands": [
      {
        "id": "csv.insert-table",
        "title": "Insert CSV Table",
        "handler": "insertCsvTable"
      }
    ],
    "configuration": {
      "properties": {
        "delimiter": {
          "type": "string",
          "default": ","
        }
      }
    },
    "settingsRoutes": [
      {
        "id": "csv",
        "scope": "project",
        "label": "CSV Tools",
        "component": "CsvSettingsPanel"
      }
    ]
  }
}
```

## File Pattern Syntax

File patterns use glob syntax:

| Pattern        | Matches                          |
| -------------- | -------------------------------- |
| `*.csv`        | Any file ending in `.csv`        |
| `*.{csv,tsv}`  | Files ending in `.csv` or `.tsv` |
| `data/*.json`  | JSON files in `data/`            |
| `**/*.test.ts` | Test files anywhere in the tree  |

## Validation Notes

Nimbalyst validates your manifest on load. Common errors:

* Missing required top-level fields: `id`, `name`, `version`, or `main`
* `aiTools` contains objects instead of tool-name strings
* `slashCommands` uses old `name` / `displayName` fields instead of `id` / `title`
* `fileIcons` is declared as an array instead of an object map
* Contribution component names do not match your exported module names

## Best Practices

1. Use a stable reverse-domain `id`.
2. Request only the permissions you actually need.
3. Keep `contributions.aiTools` and your exported `aiTools` array in sync.
4. Prefer adding `apiVersion` even though it is currently optional.
5. Validate on every build with `validateExtensionBundle()`.


# API Reference

TypeScript API reference for @nimbalyst/extension-sdk, covering ExtensionContext, custom editors, AI tools, panels, storage, and manifest types.

This document summarizes the main TypeScript exports from `@nimbalyst/extension-sdk`.

## Main Imports

```ts
import type {
  ExtensionContext,
  ExtensionManifest,
  ExtensionModule,
  EditorHostProps,
  ExtensionAITool,
  AIToolContext,
  ExtensionToolResult,
  PanelHostProps,
  SettingsPanelProps,
  SettingsRouteContribution,
  SettingsRouteProjectTarget,
  ResolvedTrackerReference,
} from '@nimbalyst/extension-sdk';

import {
  REQUIRED_EXTERNALS,
  TrackerReferenceChip,
  TrackerReferencePicker,
  navigateToTrackerReference,
  useEditorLifecycle,
  useResolvedTrackerReference,
  validateExtensionBundle,
} from '@nimbalyst/extension-sdk';
import { createExtensionConfig } from '@nimbalyst/extension-sdk/vite';
```

## Extension Entry Point

Your extension module can export any subset of these fields:

```ts
interface ExtensionModule {
  activate?: (context: ExtensionContext) => void | Promise<void>;
  deactivate?: () => void | Promise<void>;

  components?: Record<string, React.ComponentType<EditorHostProps>>;
  aiTools?: ExtensionAITool[];
  slashCommandHandlers?: Record<string, () => void>;

  nodes?: Record<string, unknown>;
  transformers?: Record<string, unknown>;
  lexicalExtensions?: Record<string, unknown>;
  hostComponents?: Record<string, React.ComponentType>;

  panels?: Record<string, PanelExport>;
  settingsPanel?: Record<string, React.ComponentType<SettingsPanelProps>>;
}
```

## `ExtensionContext`

Passed to `activate()` and available inside `AIToolContext.extensionContext`.

```ts
interface ExtensionContext {
  manifest: ExtensionManifest;
  extensionPath: string;
  services: ExtensionServices;
  subscriptions: Disposable[];
}
```

### `ExtensionServices`

```ts
interface ExtensionServices {
  filesystem: ExtensionFileSystemService;
  ui: ExtensionUIService;
  ai?: ExtensionAIService;
  configuration?: ExtensionConfigurationService;
}
```

```ts
interface ExtensionFileSystemService {
  readFile(path: string): Promise<string>;
  writeFile(path: string, content: string | Uint8Array): Promise<void>;
  fileExists(path: string): Promise<boolean>;
  findFiles(pattern: string): Promise<string[]>;
}

interface ExtensionUIService {
  showInfo(message: string): void;
  showWarning(message: string): void;
  showError(message: string): void;
}

interface ExtensionConfigurationService {
  get<T>(key: string, defaultValue?: T): T;
  update(key: string, value: unknown, scope?: 'user' | 'workspace'): Promise<void>;
  getAll(): Record<string, unknown>;
}
```

### `ExtensionAIService`

Available when `permissions.ai` is `true`. Provides AI tool registration and direct access to chat/completion models.

```ts
interface ExtensionAIService {
  // Register AI tools that Claude can call
  registerTool(tool: ExtensionAITool): Disposable;
  registerContextProvider(provider: ExtensionContextProvider): Disposable;

  // Session-backed prompt (creates a session in history)
  sendPrompt(options: {
    prompt: string;
    sessionName?: string;
    provider?: 'claude-code' | 'claude' | 'openai';
    model?: string;
  }): Promise<{ sessionId: string; response: string }>;

  // List available chat models (Claude, OpenAI, LM Studio)
  listModels(): Promise<ExtensionAIModel[]>;

  // Stateless chat completion (no session created)
  chatCompletion(options: ChatCompletionOptions): Promise<ChatCompletionResult>;

  // Streaming chat completion (no session created)
  chatCompletionStream(options: ChatCompletionStreamOptions): Promise<ChatCompletionStreamHandle>;
}
```

### Chat Completion Types

```ts
interface ExtensionAIModel {
  id: string;        // e.g. "claude:claude-sonnet-4-6-20250514"
  name: string;      // e.g. "Claude Sonnet 4.6"
  provider: string;  // "claude" | "openai" | "lmstudio"
}

interface ChatCompletionMessage {
  role: 'user' | 'assistant' | 'system';
  content: string;
}

interface ChatCompletionOptions {
  messages: ChatCompletionMessage[];
  model?: string;           // Model ID from listModels(). Provider default if omitted.
  maxTokens?: number;
  temperature?: number;     // 0-1
  systemPrompt?: string;    // Prepended as system message
  responseFormat?: ResponseFormat; // Constrain output format (JSON, JSON schema)
}

type ResponseFormat =
  | { type: 'text' }                                          // Default: plain text
  | { type: 'json_object' }                                   // Valid JSON output
  | { type: 'json_schema';                                    // JSON matching a schema
      schema: JSONSchema;
      name?: string;     // Optional schema name (default: 'response')
      strict?: boolean;  // default: true for OpenAI
    };

interface ChatCompletionResult {
  content: string;          // Assistant response
  model: string;            // Model that was used
  usage?: {
    inputTokens: number;
    outputTokens: number;
  };
}

interface ChatCompletionStreamChunk {
  type: 'text' | 'error' | 'done';
  content?: string;         // Text delta (when type is 'text')
  error?: string;           // Error message (when type is 'error')
}

interface ChatCompletionStreamOptions extends ChatCompletionOptions {
  onChunk: (chunk: ChatCompletionStreamChunk) => void;
}

interface ChatCompletionStreamHandle {
  abort(): void;                        // Cancel the stream
  result: Promise<ChatCompletionResult>; // Resolves on completion
}
```

## Custom Editors

Custom editors receive a single `host` prop. Use the `useEditorLifecycle` hook (from `@nimbalyst/extension-sdk`) to handle all lifecycle concerns.

### useEditorLifecycle Hook

```ts
import { useEditorLifecycle } from '@nimbalyst/extension-sdk';

function useEditorLifecycle<T = string>(
  host: EditorHost,
  options: UseEditorLifecycleOptions<T>
): UseEditorLifecycleResult<T>;
```

```ts
interface UseEditorLifecycleOptions<T> {
  applyContent: (content: T) => void;       // Push content into the editor
  getCurrentContent?: () => T;               // Pull content from the editor (omit for read-only)
  parse?: (raw: string) => T;                // Parse raw file string into editor format
  serialize?: (content: T) => string;        // Serialize editor format to string
  binary?: boolean;                          // Use loadBinaryContent() for binary files
  onLoaded?: () => void;                     // Called after initial load
  onExternalChange?: (content: T) => void;   // Called on external file changes (not echoes)
  onSave?: () => Promise<void>;              // Custom save flow (replaces default)
  onDiffRequested?: (config: DiffConfig) => void;  // Custom diff handling
  onDiffCleared?: () => Promise<void>;       // Custom diff cleanup
}

interface UseEditorLifecycleResult<T> {
  isLoading: boolean;                        // True until initial content loads
  error: Error | null;                       // Load error
  theme: string;                             // Current theme (reactive)
  markDirty: () => void;                     // Call on user edit
  isDirty: boolean;                          // Unsaved changes exist
  diffState: DiffState<T> | null;            // AI edit diff (null when inactive)
  toggleSourceMode: (() => void) | undefined;
  isSourceMode: boolean;
}

interface DiffState<T> {
  original: T;                               // Content before AI edit
  modified: T;                               // Content after AI edit
  tagId: string;                             // History tag ID
  sessionId: string;                         // AI session that made the edit
  accept: () => void;                        // Accept changes
  reject: () => void;                        // Revert to original
}
```

### EditorHost Interface

The `useEditorLifecycle` hook wraps this interface. You rarely need to use it directly.

```ts
interface EditorHostProps {
  host: EditorHost;
}
```

```ts
interface EditorHost {
  readonly filePath: string;
  readonly fileName: string;
  readonly theme: string;
  readonly isActive: boolean;
  readonly workspaceId?: string;
  readonly supportsSourceMode?: boolean;
  readonly storage: ExtensionStorage;
  readonly fs?: EditorHostFileSystem;

  onThemeChanged(callback: (theme: string) => void): () => void;

  loadContent(): Promise<string>;
  loadBinaryContent(): Promise<ArrayBuffer>;
  onFileChanged(callback: (newContent: string) => void): () => void;

  setDirty(isDirty: boolean): void;
  saveContent(content: string | ArrayBuffer): Promise<void>;
  onSaveRequested(callback: () => void): () => void;

  openHistory(): void;
  openExternal?(url: string): Promise<void>;

  onDiffRequested?(callback: (config: DiffConfig) => void): () => void;
  reportDiffResult?(result: DiffResult): void;
  isDiffModeActive?(): boolean;
  onDiffCleared?(callback: () => void): () => void;

  toggleSourceMode?(): void;
  onSourceModeChanged?(callback: (isSourceMode: boolean) => void): () => void;
  isSourceModeActive?(): boolean;

  getConfig?<T>(key: string, defaultValue?: T): T;
  registerMenuItems(items: EditorMenuItem[]): void;
}
```

Supporting editor types:

```ts
interface EditorMenuItem {
  label: string;
  icon?: string;
  onClick: () => void;
}

interface DiffConfig {
  originalContent: string;
  modifiedContent: string;
  tagId: string;
  sessionId: string;
}

interface DiffResult {
  content: string;
  action: 'accept' | 'reject';
}
```

### Project Filesystem

`EditorHost.fs` provides workspace-bounded, versioned access to additional project files:

```ts
interface ProjectFileSnapshot {
  path: string;
  exists: boolean;
  content: string | null;
  sha256: string | null;
}

interface ProjectFileChange {
  path: string;
  expectedSha256: string | null;
  content: string | null;
}

interface ProjectFileEdit {
  label: string;
  actor: 'user' | 'agent';
  changes: ProjectFileChange[];
}

interface ProjectFileWriteReceipt {
  id: string;
  label: string;
  actor: 'user' | 'agent';
  timestamp: number;
  files: Array<{
    path: string;
    beforeSha256: string | null;
    afterSha256: string | null;
  }>;
  atomic: false;
}

interface EditorHostFileSystem {
  read(paths: string[]): Promise<ProjectFileSnapshot[]>;
  write(edit: ProjectFileEdit): Promise<ProjectFileWriteReceipt>;
  onChanged(callback: (paths: string[]) => void): () => void;
}
```

The service is optional and is unavailable for hosts without local project-file semantics. Writes use the SHA-256 returned by `read()` to prevent stale overwrites.

## Tracker References

The SDK exports host-owned Tracker UI so extensions can store portable issue keys while Nimbalyst owns search, live resolution, display, and navigation.

```tsx
import {
  TrackerReferenceChip,
  TrackerReferencePicker,
  useResolvedTrackerReference,
  navigateToTrackerReference,
} from '@nimbalyst/extension-sdk';

function TrackerField({
  value,
  onChange,
}: {
  value: string[];
  onChange(value: string[]): void;
}) {
  return (
    <TrackerReferencePicker
      value={value}
      onChange={onChange}
      multiple
      placeholder="Link Tracker items"
    />
  );
}
```

```ts
interface ResolvedTrackerReference {
  id: string;
  issueKey?: string;
  title: string;
  status?: string;
  type?: string;
  priority?: string;
  owner?: string;
  updatedAt?: string;
}
```

* `TrackerReferencePicker` provides the canonical typed search and selection UI.
* `TrackerReferenceChip` renders a live reference in default or compact form.
* `useResolvedTrackerReference(referenceKey)` resolves a stored key reactively.
* `navigateToTrackerReference(reference)` opens the item in Nimbalyst.

Persist the issue key or reference key, not a copied title or workflow state. The host resolves mutable fields when it renders the reference.

## AI Tools

```ts
interface ExtensionAITool {
  name: string;
  description: string;
  inputSchema?: JSONSchema;
  parameters?: JSONSchema; // legacy alias
  scope?: 'global' | 'editor';
  editorFilePatterns?: string[];
  handler: (
    params: Record<string, unknown>,
    context: AIToolContext
  ) => Promise<ExtensionToolResult>;
}
```

```ts
interface AIToolContext {
  workspacePath?: string;
  activeFilePath?: string;
  extensionContext: ExtensionContext;
}
```

```ts
interface ExtensionToolResult {
  success: boolean;
  message?: string;
  data?: unknown;
  error?: string;
  extensionId?: string;
  toolName?: string;
  stack?: string;
  errorContext?: Record<string, unknown>;
}
```

### JSON Schema Types

```ts
interface JSONSchema {
  type: 'object' | 'array' | 'string' | 'number' | 'boolean' | 'null';
  properties?: Record<string, JSONSchemaProperty>;
  required?: string[];
  items?: JSONSchema;
  description?: string;
}

interface JSONSchemaProperty {
  type: 'string' | 'number' | 'boolean' | 'array' | 'object' | 'null';
  description?: string;
  enum?: Array<string | number>;
  items?: JSONSchemaProperty;
  properties?: Record<string, JSONSchemaProperty>;
  required?: string[];
  default?: unknown;
}
```

## Panels

Panels are non-file-based extension UIs.

```ts
interface PanelExport {
  component: React.ComponentType<PanelHostProps>;
  gutterButton?: React.ComponentType<PanelGutterButtonProps>;
  settingsComponent?: React.ComponentType<PanelHostProps>;
}
```

```ts
interface PanelHostProps {
  host: PanelHost;
}

interface PanelHost {
  readonly panelId: string;
  readonly extensionId: string;
  readonly theme: string;
  readonly workspacePath: string;
  readonly isSettingsOpen: boolean;
  readonly ai?: PanelAIContext;
  readonly storage: ExtensionStorage;

  onThemeChanged(callback: (theme: string) => void): () => void;
  openFile(path: string): void;
  openPanel(panelId: string): void;
  close(): void;
  openSettings(): void;
  closeSettings(): void;
}
```

```ts
interface PanelAIContext {
  setContext(context: Record<string, unknown>): void;
  getContext(): Record<string, unknown>;
  clearContext(): void;
  notifyChange(event: string, data?: unknown): void;
  onContextChanged(callback: (context: Record<string, unknown>) => void): () => void;
}
```

```ts
interface SettingsPanelProps {
  storage: ExtensionStorage;
  theme: string;
  callBackendTool?: (
    toolName: string,
    args?: Record<string, unknown>
  ) => Promise<unknown>;
  workspacePath?: string;
  projectTarget?: SettingsRouteProjectTarget;
}
```

`workspacePath` and `projectTarget` are provided only for first-class project settings routes. Application routes and legacy nested settings panels do not receive project context.

```ts
type SettingsRouteProjectTarget =
  | { kind: 'workspace'; workspacePath: string }
  | { kind: 'organizationProject'; orgId: string; projectId: string };

interface SettingsRouteContribution {
  id: string;
  scope: 'application' | 'project';
  label: string;
  group?: string;
  icon?: string;
  order?: number;
  component: string;
}
```

## Extension Storage

`ExtensionStorage` is available to custom editors, panels, and settings panels.

```ts
interface ExtensionStorage {
  get<T>(key: string): T | undefined;
  set<T>(key: string, value: T): Promise<void>;
  delete(key: string): Promise<void>;

  getGlobal<T>(key: string): T | undefined;
  setGlobal<T>(key: string, value: T): Promise<void>;
  deleteGlobal(key: string): Promise<void>;

  getSecret(key: string): Promise<string | undefined>;
  setSecret(key: string, value: string): Promise<void>;
  deleteSecret(key: string): Promise<void>;
}
```

## Manifest Types

The manifest shape is defined by `ExtensionManifest` and `ExtensionContributions`. See [Manifest Reference](/extensions/building-extensions/manifest-reference) for field-by-field guidance.

```ts
interface ExtensionManifest {
  id: string;
  name: string;
  version: string;
  description?: string;
  author?: string;
  main: string;
  styles?: string;
  apiVersion?: string;
  permissions?: ExtensionPermissions;
  contributions?: ExtensionContributions;
  requiredReleaseChannel?: 'stable' | 'alpha';
  defaultEnabled?: boolean;
}
```

```ts
interface ExtensionContributions {
  customEditors?: CustomEditorContribution[];
  fileIcons?: Record<string, string>;
  aiTools?: string[];
  newFileMenu?: NewFileMenuContribution[];
  commands?: CommandContribution[];
  keybindings?: KeybindingContribution[];
  slashCommands?: SlashCommandContribution[];
  nodes?: string[];
  transformers?: string[];
  lexicalExtensions?: string[];
  hostComponents?: string[];
  configuration?: ExtensionConfigurationContribution;
  claudePlugin?: ClaudePluginContribution;
  panels?: PanelContribution[];
  settingsPanel?: SettingsPanelContribution;
  settingsRoutes?: SettingsRouteContribution[];
  documentHeaders?: DocumentHeaderContribution[];
  themes?: ThemeContribution[];
  agentWorkflows?: AgentWorkflowsContribution;
  backendModules?: BackendModuleContribution[];
  trackerImporters?: TrackerImporterContribution[];
  aiAgentProviders?: AiAgentProviderContribution[];
}
```

The interfaces above are a working map of the common surface, not a substitute for your installed SDK's declarations. Advanced provider, backend-module, collaboration, and tracker-importer APIs evolve with the host; import their types from the package rather than copying these abbreviated declarations into an extension.

## Vite Helper

Use `createExtensionConfig()` to get the correct externalization and output shape for extensions.

```ts
import react from '@vitejs/plugin-react';
import { createExtensionConfig } from '@nimbalyst/extension-sdk/vite';

export default createExtensionConfig({
  entry: './src/index.tsx',
  plugins: [react()],
});
```

## Validation Helpers

```ts
import { validateExtensionBundle } from '@nimbalyst/extension-sdk';

const result = await validateExtensionBundle('/path/to/extension');
```

```ts
interface ValidationResult {
  valid: boolean;
  errors: string[];
  warnings: string[];
  manifest?: ExtensionManifest;
}
```

## Required Externals

`REQUIRED_EXTERNALS` exports the package names that must stay external in your build because Nimbalyst provides them at runtime.


# Mobile App

Run your desktop coding agents from your phone with Nimbalyst Mobile. Start and resume sessions, answer approvals, and edit synced markdown on the go.

Nimbalyst Mobile is an iOS app that runs your desktop coding agents from your phone. Use it when you are away from your desk and want to start new sessions, resume or redirect running ones, answer an agent that is waiting for approval, and edit synced markdown files (in alpha for now).

### Why Mobile?

When you run multiple parallel sessions, agents often finish or hit a blocker while you are at lunch, commuting, or in a meeting. Nimbalyst Mobile keeps you connected so you can start new work, answer a waiting agent, or just keep an eye on things from wherever you are.

See [mobile agent management](https://nimbalyst.com/mobile-agent-management/) for what the phone app covers.

### How It Works

The mobile app links securely to the desktop app running Nimbalyst. You select which projects to sync, then run sessions, edit files, and manage your agents from the phone while the work itself executes on your desktop machine.

iPhone and iPad share one adaptive layout. Rotating the device preserves the active session and any draft you are composing, and wide screens add a session sidebar so you can switch sessions without leaving the one you are reading.

### Setup

1. On desktop, sign in to Nimbalyst and select which projects you want synced.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FxU9xZLC0iO1g9jlV6nS6%2Fimage.png?alt=media&amp;token=37ab0da4-c59d-4787-becb-4671c18a1f31" alt="The desktop sync settings panel with the signed-in account, the Projects to Sync list, and the Pair Device button"><figcaption><p>On desktop: the signed-in account, the Projects to Sync list, and the Pair Device button.</p></figcaption></figure>

2. Download the Nimbalyst mobile app from the **iOS App Store**.
3. Sign in with Google or use your email address and the magic link Nimbalyst sends you.
4. On desktop, click the **Pair Device** icon.
5. In the mobile app, scan the QR code and authenticate with the same credentials.

**If QR scanning doesn't work** (camera issues, bright sunlight): use the "Copy to Clipboard" option on desktop and paste the pairing data manually into the mobile app's text field.

### Use Multiple Accounts

You can sign in with more than one Nimbalyst account on iOS and switch between them from the account menu.

Each account keeps its own organizations, project access, paired-device state, and personal sync profile. If some content is not visible, switch to the account that owns the project or received the team invitation.

On desktop, manage accounts under **Settings > Account > Accounts** and choose mobile projects under **Settings > Account > Mobile App**.

***

### What Syncs to Mobile

**Sessions:** Full conversation history, session metadata (title, provider, model), status, and draft inputs you're composing.

**Project Files:** Markdown files (`.md`) from projects with **Docs** enabled sync to mobile. You can read and edit them, so documentation, plans, and notes stay updatable from your phone, and edits sync back to desktop. Document sync is currently available on the Alpha update channel: select **Alpha (Developer Releases)** under **Settings > Application > Advanced**, then enable **Docs** for the project under **Settings > Account > Mobile App**.

**What doesn't sync:** Code files, images, Excalidraw diagrams, mockups, data models, PDFs, CSVs, app settings, and extension data. These remain on desktop only.

***

### Start New Sessions

You don't need to be at your desk to kick off work. Start a brand new AI session from your phone: pick a project, type a prompt, and the session runs on your desktop machine.

### Choosing a Model

Pick which agent and model run your work right from your phone. The model you select becomes the default for new sessions you start on mobile.

1. Open a project and stay on its **Sessions** list.
2. Tap the **+** button in the top right to open the new session menu.
3. Tap the **Model** row at the bottom of the menu. It shows the current agent and model selection.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-f563c4aa20f97e33fd93592788750ec471483345%2Fmobile-model-menu.png?alt=media" alt="Mobile new session menu showing the Model row at the bottom"><figcaption><p>The new session menu, with the Model row showing the current agent and model.</p></figcaption></figure>

4. In the **Select Model** sheet, tap the model you want. A checkmark marks the active choice.

Models are grouped under **Agents**:

* **Claude Agent (Claude Code)**
* **OpenAI Codex**

The list reflects the providers and models you have set up on your desktop, so what you see may differ.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-adc0b74306c8f06815a2696c8d2daf9ebe57bc81%2Fmobile-select-model.png?alt=media" alt="Select Model sheet listing Claude Agent and OpenAI Codex models with the active one checked"><figcaption><p>The Select Model sheet, with Claude Agent and Codex models grouped under Agents and the active model checked.</p></figcaption></figure>

Each session in your list also shows its own model badge, so you can tell at a glance which agent is running each one.

### Session Dashboard

See all your active, completed, and paused sessions at a glance, with color-coded status, sorted by activity. One tap opens the details.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-7fc63cb88e5781fa2620988f6659c03cb0a8fa7d%2Fmobile-session-dashboard.png?alt=media" alt="Mobile session list filtered by All, Active, Planning, and Done"><figcaption><p>The session list with All, Active, Planning, and Done filters; each session shows its model and phase.</p></figcaption></figure>

### Answer Questions and Approvals

When a session is waiting for input, open it to answer the question or respond to its approval request. This includes tool permissions, plan approval, and commit proposals surfaced in the transcript. Code diff review remains a desktop workflow.

### Resume

Session stalled? Resume it with a voice note or typed instruction right from your phone. Redirect the agent or continue the conversation just like you would on desktop.

* **Queue a prompt:** If the session is busy, your prompt queues and runs when the current task finishes. You can queue multiple prompts while offline.
* **Attach images:** Take a photo or choose from your camera roll. Useful for screenshots of bugs, whiteboard sketches, or design references.
* **Draft sync:** Start typing a message on mobile, switch to desktop, and your draft is there waiting.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-b2447624f79d08322a14e4999fc637138acc625d%2Fmobile-resume-reassign.png?alt=media" alt="Mobile session view with the agent&#x27;s result above and the composer below"><figcaption><p>The composer below a finished response, ready to send a follow-up instruction.</p></figcaption></figure>

### Voice on Mobile

Drive your desktop sessions by voice from your phone. Ask the voice agent to start a new session, find a session by topic, switch between sessions, summarize one (including any question it is waiting on), answer a pending question, or send a new coding task to your desktop.

There is no permanent mic button. Start voice from the **•••** menu inside a session (**Start Voice Mode**), or from the **+** menu on a project's **Sessions** tab (**Start Voice Agent**). The floating mic appears once it connects, with **Pause** and **Cancel** so you stay in control.

Voice runs in the iOS app and is in alpha. See [Voice on Mobile](/mobile/voice-on-mobile) for setup, controls, and troubleshooting, or [Voice Mode](/setup-nimbalyst/voice-mode) for the desktop side.

### Lock Screen Live Activity

On iPhone, your session fleet also reaches the Lock Screen and Dynamic Island as a Live Activity. Sessions are ranked by how long each one has been waiting on you, so the agent that has been blocked the longest is the first thing you see. Tap a session to open it in the app.

### Push Notifications

Get notified when sessions complete, hit errors, or need your approval. Your agents tell you when they need you, so you can stop checking.

**Smart routing:** Notifications only go to your phone when you're away from your desktop. If Nimbalyst is active on your Mac, your phone stays silent.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-87523ae87fb02524e740db8eda190c3ee3eedcfb%2Fmobile-push-notifications.png?alt=media" alt="A Session Complete push notification from Nimbalyst"><figcaption><p>A Session Complete notification summarizing what the agent finished.</p></figcaption></figure>

### Desktop Sync

Sessions, prompts, supported approvals, and enabled markdown documents sync with your desktop Nimbalyst workspace. Prompts you queue from your phone run on your desktop machine, and markdown edits sync back to the corresponding project file.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-e31f97ee2106b33f9d89f8deccc6bdb158c1b93c%2Fmobile-desktop-sync.png?alt=media" alt="Mobile Settings screen showing the sync connection status as Connected"><figcaption><p>The mobile Settings screen showing the sync connection status.</p></figcaption></figure>

### Sleep Prevention / Keep Awake

A common issue with mobile sync is your desktop going to sleep, which breaks the connection. In Nimbalyst Settings, you can enable **sleep prevention** to keep your desktop awake while syncing. Choose between:

* **Off**: default, no sleep prevention
* **Always**: keeps your desktop awake whenever Nimbalyst is running
* **When plugged in**: only prevents sleep when your computer is connected to power

### Clickable Links in Transcripts

Links in session transcripts on iOS are tappable, so you can open URLs directly from your mobile session view.

### Encryption and Privacy

All data synced between your devices is end-to-end encrypted:

* **Encryption:** AES-256-GCM per message, each with its own initialization vector
* **Key exchange:** Via QR code during setup; keys never touch our servers
* **Server access:** Our sync servers store and relay encrypted data. They cannot read your content.

Your encryption key is derived from the seed shared during QR pairing using PBKDF2 with 100,000 iterations.

### Offline Behavior

* **Reading:** Previously synced sessions and files are cached locally and readable without connectivity
* **Writing:** Compose and queue prompts while offline; they transmit automatically when you're back online
* **Limitations:** No push notifications or real-time updates while offline. New desktop sessions won't appear until you reconnect.

When you come back online, the app syncs incrementally, fetching only messages newer than what you already have.

### Troubleshooting

**Sessions not appearing on mobile**

* Verify the project is enabled under **Settings > Account > Mobile App** on desktop.
* Confirm that the same account is active on the desktop and phone.
* Check that mobile sync is enabled for that account.
* Ensure both devices are online.

**Push notifications not working**

* Check that notifications are enabled in your phone's system settings for Nimbalyst.
* Notifications are suppressed when Nimbalyst is active on desktop. This is intentional.

**Sync feels slow**

* Large sessions with many messages take longer on first sync.
* After initial sync, updates are incremental and near-instant.
* Check your network connection on both devices.

### Works With Claude Agent and Codex

Manage Claude Agent and OpenAI Codex sessions from one app. Other direct chat providers can also appear in the mobile model picker when they are enabled on desktop.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-e5e2c433eb08f54521454bd1d002af6a74a552da%2Fmobile-all-agents.png?alt=media" alt="The Select Model sheet showing OpenAI Codex models with the active one checked"><figcaption><p>Codex models in the Select Model sheet, with the active model checked.</p></figcaption></figure>


# Voice on Mobile

Talk to the coding agents running on your desktop from the Nimbalyst iOS app. Voice relays what you say and speaks the result back to you.

Talk to your desktop coding agents from your phone. The mobile voice agent listens, relays what you say to a session running on your desktop, and speaks the result back to you. Voice Mode is in **alpha** while we polish it.

Voice is part of the mobile workflow described on the [mobile agent management page](https://nimbalyst.com/mobile-agent-management/).

Voice runs in the **iOS** app.

### Before you start

Three things need to be in place.

1. **Your phone is paired and signed in.** See [Mobile App](/mobile/mobile-app) for pairing and sync setup.
2. **Your desktop is running and connected.** Voice on mobile drives sessions on your computer, so the desktop app has to be awake and syncing. Sleep prevention under **Settings > Account > Mobile App** on desktop keeps the connection alive while you are away from your desk.
3. **An OpenAI API key has synced to your phone.** Voice Mode runs on OpenAI's realtime voice models, and your phone gets the key from your desktop rather than from a field you type into.

To check the key, open **Settings > Voice Mode** in the mobile app. The **OpenAI API Key** row should read **Synced from desktop** with a green check.

If it reads **Not synced yet**, set an OpenAI key on the desktop under **Settings > Application > Voice Mode**. A Claude or Codex agent login on its own is not enough. See [AI Provider Setup and Notifications](/setup-nimbalyst/ai-provider-setup-and-notifications). Your desktop pushes the key a few seconds after your phone connects, and again on every reconnect, so reopening the mobile app is the quickest way to trigger a resync.

### Start a voice session

There is no permanent mic button on the main screens. Voice stays off until you start it from a menu, and the floating mic appears once it connects.

**Project-wide**, where the voice agent can work with any session in the project or create a new one:

1. Open a project so you are on its session list, **Sessions** tab.
2. Tap **+** in the top right.
3. Tap **Start Voice Agent**.

**Focused on one session**, where everything you say targets that session:

1. Open the session.
2. Tap **•••** in the top right.
3. Tap **Start Voice Mode**.

The first time you start voice, iOS asks for microphone permission. Voice cannot connect without it.

To end a session, tap **Cancel** on the floating mic, open a session's **•••** menu and choose **Stop Voice Mode**, or just tell the voice agent to stop.

### The floating mic

Once connected, a floating mic sits at the bottom of the screen and a small status pill appears in the navigation bar.

| Control    | What it does                                                                                       |
| ---------- | -------------------------------------------------------------------------------------------------- |
| **Mic**    | Tap to talk, to resume after the mic has gone idle, or to interrupt the agent while it is speaking |
| **Pause**  | Releases the mic while listening, or stops the agent mid-sentence while it is speaking or thinking |
| **Resume** | Brings the mic back after an idle timeout                                                          |
| **Cancel** | Ends the voice session                                                                             |

The mic ring pulses amber with a small badge while the voice agent runs a tool, so you can watch it look something up instead of wondering whether it heard you. The status pill mirrors the same states: a filled mic while listening, a speaker while speaking, and dots while it is thinking.

### Sending a task to a session

Coding requests are not fired off the instant you finish talking. A card slides up showing the target session and the exact prompt, with a countdown running. **Cancel** drops it, **Send Now** skips the wait, and doing nothing sends it when the countdown ends. The pause gives you a chance to catch a misheard request before it reaches the agent.

Set the length of the countdown under **Settings > Voice Mode > Confirm Delay**. Once sent, the prompt queues on your desktop like any other mobile prompt and runs on your machine.

### What you can ask for

* Start a new session. The device that asked for it opens the session once it exists, and your other devices just see it appear in their list.
* Find a session by topic, described in your own words.
* Switch between sessions.
* Summarize a session, including any question it is waiting on.
* Answer a session's pending question by voice.
* Send a new coding task to a session.
* Ask the coding agent a question and wait for the spoken answer.
* Look something up in your project's docs, plans, and decisions, answered from your desktop's project memory when it is available.

### Idle and wake

After a stretch with nothing happening (30 seconds by default) the mic goes idle. The connection stays up and the microphone is released, so the app is not listening in the background. Tap the mic or **Resume** to pick up where you left off.

With **Auto-Announce Completions** on, a session finishing wakes voice back up and speaks the result. You can kick off work, put the phone in your pocket, and hear how it went.

### Mobile voice settings

Under **Settings > Voice Mode** in the mobile app:

* **OpenAI API Key.** Status of the key synced from your desktop. Read-only.
* **Voice.** The spoken voice. Your desktop's voice preference syncs here, so both devices sound the same unless you pick a different one on the phone.
* **Idle Timeout.** How long the mic stays open with nothing happening, from 10 to 120 seconds.
* **Auto-Announce Completions.** Whether a finished session wakes voice to speak its result.
* **Confirm Delay.** The countdown on the pending prompt card, from 1 to 10 seconds.

The spoken language follows the preferred agent language configured on your desktop, whatever language you speak in, and falls back to English when no preference is set.

### Troubleshooting

**No Start Voice Agent in the + menu.** The item appears on the **Sessions** tab of a project and only while voice is off. Switch back from the **Files** tab if you are on it. If voice is already running, the session menu offers **Stop Voice Mode** instead.

**"Sync an OpenAI API key from Nimbalyst on your Mac."** Your phone has no key yet. Set one on the desktop under **Settings > Application > Voice Mode**, confirm the desktop is running, then reopen the mobile app to trigger a resync. The row under **Settings > Voice Mode** on mobile should change to **Synced from desktop**.

**Microphone permission denied.** Grant it under iOS Settings > Nimbalyst > Microphone, then start voice again.

**Voice ends when the connection drops.** Mobile does not silently reconnect the way desktop does. If the connection is lost, the voice session ends and you start it again from the menu.

**Nothing reaches the desktop.** Check the connection indicator in the project list. Voice relays through the same encrypted sync channel as your sessions, so if sessions are not updating, voice commands will not land either. A sleeping desktop is the usual cause, which is what sleep prevention is for.

### A note on stability

Voice Mode is alpha and may change, break, or be removed without notice. If you hit a problem, share feedback via Discord or our support channels. See [Feedback, Discord, Support, Releases](/getting-started/feedback-discord-support-releases).

For the desktop side and the full settings panel, see [Voice Mode](/setup-nimbalyst/voice-mode).


# AI Provider Setup and Notifications

Connect Claude, Codex, Copilot, and other AI providers in Nimbalyst, add keys or subscriptions, and set up session completion notifications.

Nimbalyst works with the coding agents and AI subscriptions you already have. This page covers which providers are supported, how to connect each one under **Settings > Application**, and how to get notified when a session finishes.

### Supported AI Providers

The following coding agents are currently supported:

* Claude Agent
* OpenAI Codex
* Claude Code CLI (opt-in)
* OpenCode (Alpha)
* GitHub Copilot (Alpha)
* Grok Build (Alpha)
* Cursor Agent (Alpha)
* Gemini through Antigravity (Alpha)

Alpha providers are toggled on individually from their own settings panels. See [Alpha Features](/setup-nimbalyst/alpha-features).

Models are discovered dynamically from each provider, so current Claude and Codex generations (for example Claude Fable 5.1 and GPT-6 Astra) appear in the model picker as providers ship them.

Nimbalyst works with the agents you already pay for. See [Claude Code and Codex subscriptions](https://nimbalyst.com/claude-code-codex-subscriptions/) for how existing plans are used.

You can also configure Nimbalyst to access AI models directly; see [Integrate other AI models](#integrate-other-ai-models-with-nimbalyst-optional) below.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-ac8887ab7b6a64356819625db804833002e94f48%2Fdocs-ai-providers.png?alt=media" alt="Nimbalyst Application Settings with Claude Agent selected and the list of available agent providers in the sidebar"><figcaption><p>AI Providers in Application Settings on macOS. Select a provider in the sidebar to enable it, authenticate, and configure its behavior.</p></figcaption></figure>

### OpenAI Codex

OpenAI Codex is enabled by default for new Nimbalyst installations. Existing provider choices are preserved when you upgrade.

Open **Settings > Application > OpenAI Codex** to sign in, review the discovered models, or provide an API key override. By default, Codex uses the signed-in Codex or ChatGPT subscription.

Codex sessions support the same core Nimbalyst workflow as Claude Agent:

* **Inline edit cards**: Codex `file_change` tool calls render as red/green edit cards in the transcript, matching how Claude's Edit tool already renders.
* **Slash command autocomplete**: Codex slash commands surface in the same unified `/` picker as Claude Code commands.
* **Cross-agent skills and commands**: Skills and commands written for one agent run in the other, so workflow discovery is unified across providers.
* **Reasoning blocks**: Codex reasoning items map into transcript thinking blocks.
* **Worktree isolation**: sessions started in a worktree run inside that worktree and keep their edits on its branch.

### Claude Agent

Claude Agent is Nimbalyst's integrated Claude coding agent. Open **Settings > Application > Claude Agent** to authenticate, choose visible models, and configure its behavior.

Use your Claude subscription login or an Anthropic API key that you explicitly add in Nimbalyst. Nimbalyst does not import API keys from environment variables.

Claude Enterprise SSO is supported when your organization provides it.

#### Claude Code CLI

The raw Claude Code CLI provider is opt-in for new installations. Turn it on from the Claude Agent settings when you specifically want the native CLI terminal experience. Upgrading does not disable it if you already selected it.

When enabled, Claude models appear under separate Claude Agent and Claude Code CLI groups in the model picker.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-155361c48db88e38b613c1a691c22f0a821778c6%2FClaude%20model%20picker.png?alt=media" alt="Nimbalyst model picker showing the Claude Agent and Claude Code CLI groups" width="189"><figcaption><p>The model picker with Claude models grouped under Claude Agent and Claude Code CLI.</p></figcaption></figure>

#### Effort Level

Claude Agent and Claude Code CLI support an effort selector. Higher levels let the model spend more reasoning effort on a turn at the cost of additional latency and usage.

Pick from five levels:

* **Low**
* **Medium**
* **High**
* **xHigh**
* **Max**

The selector is part of the session controls, and it only offers the levels the selected model accepts.

#### Extended Thinking

Supported Claude Agent models also show **Extended: On** and **Extended: Off**. Extended thinking stays on by default. Turn it off per session when lower latency and token use matter more than additional reasoning.

Press **Cmd/Ctrl+Shift+M** in the chat input to open the model picker from the keyboard. Search by model name or ID, then use the arrow keys and Enter to select a model.

### OpenCode (Alpha)

OpenCode is an open-source coding agent with multi-model support. It works with Claude, OpenAI, Gemini, and local models through a unified interface.

To set it up, open **Settings > Application > OpenCode**:

1. Install the OpenCode CLI (use the **Install OpenCode CLI** button or follow the OpenCode docs).
2. Toggle **Enable OpenCode** on.
3. Configure and authenticate model providers in OpenCode's own settings. The optional API key field in Nimbalyst is used only to test the connection; it does not replace OpenCode's provider configuration.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-0ba1cca7b27772651d78b48173252aedbdc69dbf%2FOpenCode%20Settings.png?alt=media" alt="The OpenCode settings panel"><figcaption><p>OpenCode agent provider settings</p></figcaption></figure>

### GitHub Copilot (Alpha)

GitHub Copilot is supported as a coding agent via the ACP (Agent Communication Protocol) server mode. It uses your existing Copilot CLI login for authentication.

To set it up, open **Settings > Application > GitHub Copilot**:

1. Install the Copilot CLI (`npm install -g @github/copilot`, or use the **Install Copilot CLI** button).
2. Toggle **Enable GitHub Copilot** on.
3. Authenticate by running `copilot` and using the `/login` command. Model selection is managed by Copilot, so no additional API key is required.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-ad2b440697d3048d490120713d35f55cc1ec5585%2FGitHub%20Copilot%20Settings.png?alt=media" alt="The GitHub Copilot settings panel"><figcaption><p>GitHub Copilot agent provider settings</p></figcaption></figure>

### Grok Build (Alpha)

Grok Build is xAI's coding agent. Enable it under **Settings > Application > Grok Build**.

Grok Build sessions can answer questions and approve tool use while they run, reach your Nimbalyst tools, and use the model you picked.

### Cursor Agent (Alpha)

Cursor Agent runs the Cursor coding agent headlessly against your project. Install the Cursor CLI, run `cursor-agent login`, then enable it under **Settings > Application > Cursor Agent**. It uses your existing Cursor CLI login.

### Gemini through Antigravity (Alpha)

Gemini uses the language server bundled with Google's Antigravity desktop app. Install Antigravity and sign in once, then open **Settings > Application > Gemini**. Antigravity does not need to remain open while the agent runs.

### Integrate other AI Models with Nimbalyst (optional)

* Nimbalyst can integrate with Anthropic, OpenAI, or LM Studio for local models.
* Add an API key in Nimbalyst for Anthropic or OpenAI. Nimbalyst never reads those keys from environment variables.
* As these are not coding agents, only some features are supported.
* For LM Studio, run its local server and enter the server URL; it does not require an API key.
* Return to **Settings > Application** to change the configuration later.

Provider API keys you save in Nimbalyst are encrypted on disk.

### Notification that AI response is complete

Open **Settings > Application > Notifications**.

<div align="left"><figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FSOFYBrlawEyz85s7TCzw%2Fimage.png?alt=media&amp;token=81960173-b33d-4f8e-9aef-b2941f2bbbd2" alt="The Notifications settings panel with Completion Sounds and OS Notifications sections" width="563"><figcaption><p>The Notifications panel: completion sounds with a sound type picker and Test Sound, plus OS notifications.</p></figcaption></figure></div>

By default:

* You are notified when an AI session completes.
* When Nimbalyst is not the active window, a system notification can appear. Clicking it takes you to the workspace and session that needs attention.
* Agents can also request an attention notification during a longer workflow.

Use the Notifications page to control these behaviors.

### Completion Sounds

Nimbalyst can also play a sound when the AI or an agent finishes a turn and is ready for you again. Find it under **Settings > Application > Notifications > Completion Sounds**.

* Turn it on with **Enable Completion Sounds**.
* Pick a built-in **Sound Type** (chime, bell, or pop), or choose **custom** to use your own audio file.
* For a custom sound, click **Choose File** and pick an audio file. Supported formats are MP3, WAV, OGG, M4A, AAC, and FLAC.
* Adjust the **Volume**, and use **Test Sound** to hear your choice.


# Application, Account, and Project Settings

Nimbalyst splits settings into application, account, and project scopes, so it is clear whether a change applies everywhere or to one project.

Nimbalyst separates settings into three scopes so it is clear whether a change applies everywhere, to a signed-in identity, or only to the current project.

Open Settings with **Cmd/Ctrl+,** or from the account menu, then choose **Application**, **Account**, or **Project** at the top.

## Application

Application settings follow this Nimbalyst installation across projects. Use this scope for:

* Notifications and themes
* Voice Mode and agent features
* Agent and chat providers
* The extension Marketplace and installed extensions
* Application-level MCP servers
* Tools and token-cost controls
* Advanced and database settings

Choose Application when a provider, extension, MCP server, or preference should be available in every project you open.

Database Settings, under this scope, is where you look after a database problem. It can recover database copies Nimbalyst preserved rather than deleted, roll back a SQLite migration to the preserved PGLite copy, and explain why an automatic migration is being held back on this computer. Recovery and rollback keep the original data intact across restarts. See [Database Backups and Restore](/troubleshooting/database-backups-and-restore).

## Account

Account settings manage signed-in Nimbalyst identities and personal device sync:

* Add, reconnect, switch, or sign out of accounts
* Choose the account used for personal and mobile sync
* Pair and manage devices
* Choose projects and documents that sync to mobile
* Manage shared links owned by an account

You can sign in with multiple accounts. A project, organization, or shared link can belong to a different account from the one used for personal mobile sync.

## Project

Project settings apply only to the current workspace:

* Sharing and organization membership
* Agent permissions
* Tracker configuration
* Project-specific AI provider overrides
* Project-level MCP servers
* GitHub integration
* Project extension settings

Project-level MCP servers and provider overrides are useful when a tool or model should be available only inside one repository.

## Organization Management

Organizations have a dedicated management dialog rather than a fourth Settings scope. Open it from the organization switcher (**Manage organization…**), the account menu, or **Manage** on an organization row in **Settings > Account > Accounts**.

Use it to manage:

* Members, invitations, and roles
* Projects in the organization and who can access each one
* Organization messaging, security, and encryption
* Billing, and organization deletion under Danger zone

**Window > Organization Messages** is separate. It opens the messaging window for rooms and direct messages, not administration.

See [Set Up Nimbalyst Teams and Organizations](/team-collaboration/setup-teams-and-orgs) for the full walkthrough.

## Extension Settings

Extensions can add their own first-class pages under Application or Project settings. A Project extension page receives the current repository as context, so the same extension can keep different configuration in different projects.

If an extension page is missing, confirm that the extension is installed and enabled in the same scope.

## Choosing the Right Scope

| You want to change…                                                 | Use                 |
| ------------------------------------------------------------------- | ------------------- |
| Theme, notifications, default agent, or a tool used everywhere      | Application         |
| Signed-in accounts, mobile sync, devices, or shared links           | Account             |
| Permissions, Trackers, sharing, GitHub, or tools for one repository | Project             |
| Team roster, invitations, or organization projects                  | Organization dialog |


# Claude Code in Vertex, Bedrock

Configure Claude Code in Nimbalyst to run through Google Vertex AI or Amazon Bedrock using your own cloud account and existing credentials.

Nimbalyst can run Claude through your preferred cloud provider, Claude on Vertex AI (Google Cloud) or Amazon Bedrock, instead of Anthropic directly. Use this when your organization already has cloud billing and compliance set up with one of those providers.

You configure this by adding environment variables in the Claude Agent settings panel. Nimbalyst sets them for the Claude Code sessions it launches; they are stored with your Claude Code settings, and Nimbalyst never reads API keys from your shell environment.

### How to configure

1. Open **Settings > Application > Claude Agent**.
2. Scroll to the **Environment Variables** section.
3. Add the required variables for your provider.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FduHzSqRK9uwYyapPlEsC%2Fimage.png?alt=media&amp;token=84dd0e9b-faf6-46fd-a491-b339827913d5" alt="The Environment Variables section of the Claude Agent settings with name and value fields and an Add button"><figcaption><p>The Environment Variables section: enter a variable name and value, then click Add.</p></figcaption></figure>

**For Google Vertex AI:**

| Variable                      | Value                                           |
| ----------------------------- | ----------------------------------------------- |
| `CLAUDE_CODE_USE_VERTEX`      | `1`                                             |
| `CLOUD_ML_REGION`             | `global` (or a specific region like `us-east5`) |
| `ANTHROPIC_VERTEX_PROJECT_ID` | Your GCP project ID                             |

Prerequisites: Enable the Vertex AI API in your GCP project, request access to Claude models in the Model Garden, and authenticate via `gcloud auth application-default login`.

**For Amazon Bedrock:**

| Variable                  | Value                                  |
| ------------------------- | -------------------------------------- |
| `CLAUDE_CODE_USE_BEDROCK` | `1`                                    |
| `AWS_REGION`              | `us-east-1` (or your preferred region) |

Prerequisites: Enable Bedrock access in your AWS account, request access to Claude models, and configure AWS credentials (via AWS CLI, environment variables, or SSO profile).

### Benefits

* Use existing cloud credentials and billing
* Meet enterprise compliance requirements
* Choose the provider that fits your infrastructure
* No separate Anthropic API key required


# MCP

Add MCP servers to Nimbalyst so your coding agent can reach GitHub, Linear, Slack, and other services. Covers install, config, and permissions.

MCP (Model Context Protocol) servers extend what your coding agent can do in Nimbalyst. They give your agent access to external services like GitHub, Linear, Slack, and more. Add one when you want the agent to work with a tool you already use.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FJ1pBc9XDlJuxIRdclLDe%2Fimage.png?alt=media&amp;token=a0765aba-4f66-4128-826b-1c75aa29fd5d" alt="The MCP Servers settings page showing the Add MCP Server template gallery"><figcaption><p>The MCP Servers settings page, with the template gallery for adding a server.</p></figcaption></figure>

### What Are MCP Servers?

MCP servers are connectors that let your coding agent interact with other apps and services. When you connect an MCP server, the agent gains new abilities like:

* Creating issues in Linear
* Searching your GitHub repositories
* Querying your database
* Accessing files in Google Drive

For setup walkthroughs and a list of servers worth connecting, see [Claude Code MCP setup](https://nimbalyst.com/blog/claude-code-mcp-setup/) and [best Claude Code MCP servers](https://nimbalyst.com/blog/best-claude-code-mcp-servers/).

### Built-in MCP Tools

Nimbalyst ships its own MCP tools that any agent can call to interact with the editor:

* **AskUserQuestion**: pops up one or more multiple-choice questions in the transcript and blocks the agent until you answer.
* **PromptForUserInput**: collects several inputs at once through a single structured-prompt widget. Five field types are available: multi-select, single-select, reorder, edit-text, and confirm. Voice mode honors a `voiceFriendly` hint and defers to the screen widget for long drafts or large reorders. See [Interactive Prompts](/session-management/interactive-prompts) for examples and trigger phrases.
* **display\_to\_user** / **capture\_editor\_screenshot**: render charts, images, or screenshots inline in the transcript.
* **developer\_git\_commit\_proposal**: surfaces the interactive commit proposal widget instead of running `git commit` from a shell.

### Calling a Configured MCP Server from Chat

Just refer to the MCP server in your chat and your coding agent will figure out you need to use it.

For example:

* "Add these to a Linear ticket"
* "Analyze this cohort in PostHog"

### Application vs Project Servers

You can configure servers at two levels:

**Application**

* Available in all your projects
* Good for personal tools you always want access to
* Example: Your personal GitHub account
* Configure under **Settings > Application > MCP Servers**

**Project**

* Only available in a specific project
* Good for project-specific services
* Example: A project's database connection
* Configure under **Settings > Project > MCP Servers**

Project servers receive the current repository as their scope and do not automatically appear in other workspaces. See [Application, Account, and Project Settings](/setup-nimbalyst/settings-scopes).

### Node Runtime for MCP Servers

MCP servers configured with `command: "node"` use Electron's bundled Node runtime. You don't need a system-wide Node.js install for MCP servers to work on a fresh Nimbalyst install.

### Adding MCP Servers

1. Open **Settings** with the account menu or `Cmd/Ctrl+,`.
2. Choose **Application > MCP Servers** or **Project > MCP Servers**.
3. Click **Add Server**.
4. Choose from a template or configure manually.
5. If the server requires credentials, enter them: for **API key** servers, paste the key into the server settings; for **OAuth** servers, click **Authorize** and sign in through your browser.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FJPvp36JRiYToq72WcUsG%2Fimage.png?alt=media&amp;token=8009d9e6-bcb5-4575-afa0-2dc5e391edbc" alt="The GitHub MCP server template configuration with a personal access token field, Test Connection, and Add Server button"><figcaption><p>Configuring the GitHub template: enter the required credential, test the connection, then add the server.</p></figcaption></figure>

#### Available Templates

Nimbalyst includes ready-to-use templates for popular services, grouped by category in the gallery. They include:

* **Development**: GitHub, Playwright, Chrome DevTools, Context7, Serena, Sentry
* **Productivity**: Linear, Notion, Asana, Atlassian (Jira and Confluence), Slack
* **Data & Analytics**: PostHog, Snowflake, AWS, Stripe
* **Design**: Figma
* **Search & Files**: Brave Search, Fetch, Filesystem

More templates ship over time; use the search field in the gallery to find one.

### Checking Server Status

In the MCP Servers settings, each server shows its status:

* **Connected**: Working and ready to use
* **Not authorized**: Needs authentication (click Authorize)
* **Error**: Something went wrong (check the error message)

### Troubleshooting

**Server not appearing in your agent's tools?**

* Make sure the server is enabled (not disabled)
* Check that authentication is complete
* Try restarting Nimbalyst

**OAuth authorization failed?**

* Complete the sign-in process in your browser
* Try revoking and re-authorizing
* Check your internet connection

**API key not working?**

* Verify the key is correct (no extra spaces)
* Check that the key has the required permissions
* Some services require specific scopes or access levels

### Privacy & Security

* All MCP connections are made locally from your computer
* API keys and tokens are stored securely on your machine
* OAuth tokens can be revoked at any time from settings
* No credentials are sent to Nimbalyst servers


# Alpha Features

Find and enable alpha features in Nimbalyst, understand the separate Alpha update channel, and see which capabilities are still experimental.

Nimbalyst labels early capabilities as **Alpha** while we polish them. Most have their own opt-in toggle and may be unstable. A few capabilities are available only in Alpha builds.

### Where to enable Alpha

Most alpha features are opt-in per user from the feature's own settings panel, with no master "enable everything" toggle. Voice Mode and alpha agent providers use their own panels. Super Loops, Blitz, and Meta Agent are toggled under **Agent Features**.

To turn one on, open **Nimbalyst → Settings**, find the feature panel, and flip its toggle. The exception is alpha-build functionality such as syncing markdown documents to the iOS app: switch **Settings > Application > Advanced > Update Channel** to Alpha first, then enable **Docs** for the project under **Settings > Account > Mobile App**.

What has shipped out of alpha is listed on the [changelog](https://nimbalyst.com/changelog/).

### How Alpha features are labeled

Anywhere an alpha feature appears in the UI, it is tagged with an `alpha` chip next to its name. For example, in the Settings sidebar Voice Mode, OpenCode, and GitHub Copilot all show the chip:

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-418c755eb2cfc90473e4270be1b1a8c2cdec0010%2FAlpha%20Settings%20Sidebar.png?alt=media" alt=""><figcaption><p>Alpha-tagged entries in the Settings sidebar</p></figcaption></figure>

This makes it easy to tell at a glance which capabilities are in early access.

### Update Channel

The **Update Channel** selector lives in **Settings > Application > Advanced**. Choose **Stable** for production-ready releases, or **Alpha (Developer Releases)** for frequent, rough builds. Most feature toggles are independent of the channel, while features that only ship in alpha builds require the Alpha channel.

### Currently in Alpha

The following features are available in Alpha today:

#### Voice Mode

Talk to your coding agent and have it talk back, on desktop and mobile. Turn it on under **Settings > Application > Voice Mode**. For everything it can do, the settings, and the mobile voice actions, see [Voice Mode](/setup-nimbalyst/voice-mode).

#### OpenCode (Agent Provider)

OpenCode is available as an additional agent provider alongside Claude Agent and OpenAI Codex. Select it under **Settings > Application > OpenCode**. See [AI Provider Setup and Notifications](/setup-nimbalyst/ai-provider-setup-and-notifications) for configuration details.

#### GitHub Copilot (Agent Provider)

GitHub Copilot is available as an additional agent provider. Select it under **Settings > Application > GitHub Copilot**. See [AI Provider Setup and Notifications](/setup-nimbalyst/ai-provider-setup-and-notifications) for configuration details.

#### Grok Build, Cursor Agent, and Gemini (Agent Providers)

These providers also have alpha-tagged panels under **Settings > Application > Agent Providers**. Grok Build uses your Grok CLI login, Cursor Agent uses your Cursor CLI login, and Gemini uses the language server bundled with Google's Antigravity desktop app. See [AI Provider Setup and Notifications](/setup-nimbalyst/ai-provider-setup-and-notifications) for configuration details.

#### Agent Features

A consolidated panel for agent-session behavior. Its individual alpha toggles are **Super Loops**, **Blitz**, and **Meta Agent**. The panel also holds related settings such as Auto-approve Commits, MCP server status, preferred agent language, and attachment staging. Find it under **Settings > Application > Agent Features**.

#### Database Recovery

In Developer Mode, **Settings > Application > Database** is alpha-tagged. It shows migration status and preserved recovery copies. Use it only when diagnosing or recovering the app database; see [Database Backups and Restore](/troubleshooting/database-backups-and-restore).

### A note on stability

Alpha features may change, break, or be removed without notice. If you hit a problem, please share feedback via Discord or our support channels — see [feedback-discord-support-releases.md](/getting-started/feedback-discord-support-releases).


# Voice Mode

Talk to your coding agent and hear it reply. How to turn on Nimbalyst Voice Mode on desktop and mobile, pick a voice, and run hands-free.

Talk to your coding agent and have it talk back, on desktop and mobile. Voice Mode is in **alpha** while we polish it.

### Turn it on

Open **Settings > Application > Voice Mode** and flip the toggle. There is no separate release channel to switch. The panel also shows microphone permission status, with a deep link to macOS System Settings if you need to grant access.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-a536abd156bfbb47dc296c751a8d0c8ba2d0863c%2Frelease-voice-mode.png?alt=media" alt="The activity bar mic button highlighted while Voice Mode is active"><figcaption><p>The mic button in the activity bar lights up while Voice Mode is active.</p></figcaption></figure>

### What the voice agent can do

* **Start a new coding session by voice.** Say something like "create a new session" and the agent creates one and makes it active, so any follow-up such as "ask the coding agent to..." or "run this prompt" targets the new session without you navigating there.
* **Run "Commit with AI" by voice.** The agent surfaces the same commit-proposal widget you get from the UI. Approve or reject by voice.
* **Use workspace slash commands.** Ask the voice agent to run a slash command that is available in the current project, such as "run the commit command" or "use slash track for this bug."
* **Generate a project summary** without an Anthropic API key. "Generate Project Summary" launches a new session in your configured agent (Claude Code, Codex, and so on) rather than calling the Anthropic API directly.

The voice agent reads the same workspace command catalog as the chat composer. A command must be available in the current project before voice can use it. See [/ Commands and Skills](/session-management/commands-and-skills) for built-in, extension-provided, and custom commands.

### On mobile

The voice agent runs in the iOS app too, and can drive your desktop sessions hands-free:

* Start a new coding session on your desktop.
* Find a session by topic, spoken in your own words.
* Switch between sessions.
* Summarize a session, including any question it is waiting on.
* Answer a session's pending question by voice.
* Send a new coding task to your desktop agent.

There is no permanent mic button on mobile. Start voice from the **+** menu on a project's **Sessions** tab (**Start Voice Agent**) or from the **•••** menu inside a session (**Start Voice Mode**). The API key comes from your desktop rather than a field on the phone. For setup, controls, and troubleshooting, see [Voice on Mobile](/mobile/voice-on-mobile).

#### The floating mic

While the voice agent is working, a floating mic shows what it is doing at each step. **Pause** stops it listening or speaking, and **Cancel** ends the turn, so you always stay in control.

### Settings

Voice Mode has its own settings panel under **Settings > Application > Voice Mode**:

* **Realtime Model.** `gpt-realtime-2` is the newer model, with stronger reasoning, a larger context window, and more consistent voice. `gpt-realtime` is the fallback for accounts without access to it.
* **Reasoning Effort.** Choose from minimal, low, medium, high, and extra high. Higher is smarter but slower and more expensive; low is a good default for a responsive voice relay. This applies to `gpt-realtime-2`.
* **Voice.** Pick the spoken voice, with a Preview button to hear a sample.
* **Turn detection.** Tune how the agent decides you are done speaking: input mode, voice-detection sensitivity, pause before processing, whether it can be interrupted, and how long the mic keeps listening (the listen window, 5 to 30 seconds).
* **Command submission.** Set a review delay before a voice command is sent to the coding agent, from immediate up to 10 seconds, so you can catch and edit a misheard request.
* **Language.** The voice agent always speaks in your configured preferred language, whatever language you speak to it in.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-d7da8472dabe2b2642a4cf9fdd2f3ae68aa3c807%2Fvoice-mode-settings.png?alt=media" alt="The Voice Mode settings panel showing turn detection, command submission, project summary, and pricing"><figcaption><p>The Voice Mode settings panel under Settings > Application > Voice Mode.</p></figcaption></figure>

The panel also shows a **Project Summary** (an AI-generated overview of your project that the voice agent uses for context, which you can regenerate) and OpenAI's **usage pricing** for voice, since Voice Mode runs on OpenAI's realtime voice models.

### The listen window

On desktop, the listen window (15 seconds by default) starts when audio playback drains in your speakers, not when the server finishes streaming, so the mic stays open through the end of the agent's reply. Turns that only call a function also wake the mic, with a short readiness cue when there is no audible reply.

### A note on stability

Voice Mode is alpha and may change, break, or be removed without notice. If you hit a problem, share feedback via Discord or our support channels. See [Feedback, Discord, Support, Releases](/getting-started/feedback-discord-support-releases).


# Open Data, Workflow, File Storage

Nimbalyst keeps your documents, metadata, and settings in open formats on your own machine, and the app itself is open source on GitHub.

This page covers where Nimbalyst keeps your content and configuration. Your documents, plans, workflow commands, and images live as ordinary files in your own folders, in formats any tool can read.

### Open Source App

Nimbalyst itself is open source. The full source code is published at [github.com/nimbalyst](https://github.com/nimbalyst), so you can audit how your files, sessions, and settings are handled, build your own version, or contribute back.

More on the license and what is open is on the [open source page](https://nimbalyst.com/open-source/).

### Documents and Status Stored as Markdown

<div align="left"><figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2F6qdZTYzclP9YyAlXGceK%2FMetaData%20Storage%20of%20Status.png?alt=media&amp;token=d2ee7e1f-7a68-4802-8f17-e1629cf335fc" alt="A plan file open in the Nimbalyst editor, showing YAML frontmatter above the markdown body" width="375"><figcaption><p>A plan file in the editor. The YAML frontmatter at the top holds the plan's status, priority, owner, tags, and dates; the markdown body follows below.</p></figcaption></figure></div>

* **Human-readable format**: Plans, documents, tasks, and status tracking use standard markdown files
* **Version control ready**: Plain text files work with Git for history and collaboration
* **YAML frontmatter**: Structured metadata sits as YAML at the top of the markdown file
* **No proprietary formats**: Edit your files with any text editor, never locked into a specific tool
* **Transparent tracking**: Plan status, progress, and metadata are all visible and editable in the markdown source

### Workflow and Config Stored as Coding Agent Commands

<div align="left"><figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2F2CmBcWlMXetcBpydPkX2%2FCustom%20Claude%20Code%20%3A.png?alt=media&amp;token=9f1d2827-c848-4619-906b-43466c8cdb6c" alt="Claude Code documentation describing custom slash commands stored as markdown files" width="375"><figcaption><p>Claude Code's custom slash commands are markdown files in the .claude/commands/ folder of your project, so your Nimbalyst workflows use the same open format.</p></figcaption></figure></div>

* **Slash commands**: Custom workflows stored in `.claude/commands/` as markdown files
* **Project instructions**: Repository-specific guidance in `CLAUDE.md` checked into your codebase
* **Local configuration**: Settings and preferences stored in standard application directories
* **Portable workflows**: Share custom commands and workflows by committing them to version control
* **No vendor lock-in**: All configuration uses open standards and readable formats

### Your Files Stored in Your File Tree or GitHub

<div align="left"><figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FNUe9HQDTAR6AMpRKIzgO%2FStore%20in%20Markdown.png?alt=media&amp;token=ab90698a-57bc-42dc-a0a3-1565b5fe310a" alt="A plans folder in the file tree containing individual .md plan files"><figcaption><p>A project's plans folder in the file tree. Each plan is an ordinary .md file you can open with any editor.</p></figcaption></figure></div>

* **File system first**: Local documents are stored directly in your local file system
* **Optional team workspace**: Files explicitly promoted to Nimbalyst Teams gain a shared copy that flows through Cloudflare encrypted in transit and at rest
* **Git integration**: Full support for Git version control and GitHub synchronization
* **Your choice of sync**: Use GitHub, GitLab, Bitbucket, or any Git hosting service you prefer
* **Standard file structure**: Local project content stays in files and folders you control
* **Backup friendly**: Standard file storage works with any backup solution

### Your Images Stored in Your Project

When you paste or insert an image, the image file itself is saved in your project's `.nimbalyst/assets` folder, and your markdown file holds a plain link to it. Both travel with the project like any other file.


# Permissions and Safety

How Nimbalyst permissions keep AI agents in bounds by approving file writes and shell commands, and guarding against prompt injection.

This page explains how permissions control what an AI agent can do in your projects: the settings Claude Code brings with it, the trust and approval layer Nimbalyst adds on top, and how to manage both.

### Why Permissions Matter

AI agents can execute code, modify files, and run shell commands. Without guardrails, a prompt injection or a mistake could delete files, leak secrets, or run malicious code. Permissions keep you in control.

How Nimbalyst surfaces and enforces agent permissions is covered on the [security feature page](https://nimbalyst.com/features/security/).

### Claude Code's Built-in Permissions

Claude Code uses settings files to define what the agent can do:

* **`.claude/settings.json`** - Project settings (shared with team)
* **`.claude/settings.local.json`** - Personal project settings (gitignored)
* **`~/.claude/settings.json`** - Global user settings

Each file can specify:

* `allow` - Patterns that auto-approve
* `deny` - Patterns that always block
* `additionalDirectories` - Folders outside the project the agent can access

Nimbalyst reads and honors these files, so permissions you already set up for Claude Code carry over.

### What Nimbalyst Adds

Nimbalyst adds a **workspace trust layer** on top of the coding agent's permissions:

1. **Trust Gate** - Projects must be explicitly trusted before the agent can do anything
2. **Permission Modes** - Choose how much autonomy to grant the agent
3. **Inline Confirmations** - Approve or deny actions as they happen

### Permission Modes

When you first use an agent in a project, Nimbalyst presents four autonomy levels:

| Mode                             | Behavior                                                                                                                                                      |
| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Agent-verified** (Recommended) | Routine work proceeds without interrupting you. Risky or uncertain actions are evaluated by the provider's automatic reviewer and can still require approval. |
| **Allow everything**             | Operations run without approval prompts or automatic review. Use only in a project and environment you fully trust.                                           |
| **Allow edits only**             | File edits proceed automatically. Shell commands and web requests ask first.                                                                                  |
| **Ask every time**               | Approve each agent action before it runs. Your saved approvals are remembered.                                                                                |

**Agent-verified** is the default. It keeps normal workflows moving while retaining a second review step for destructive or uncertain operations. Claude Agent and OpenAI Codex use their native automatic reviewers behind the same Nimbalyst mode.

### Allowing Web Searches in Allow Edits Only

To allow your coding agent to search and fetch websites, add approved domains to the URL allow list in Agent Permissions. You can use wildcard domain patterns such as `*.github.com` to allow subdomains, or use **Allow All Domains** when broad web access is appropriate for the project.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FXLoMU3aubjguuZ8gGibh%2Fimage.png?alt=media&amp;token=8005940b-2500-43eb-9078-d3025b1844dd" alt="The URL allow list in Agent Permissions, showing wildcard patterns and an Add URL Pattern button"><figcaption><p>The URL allow list in Agent Permissions. Each entry is a domain pattern, such as *.github.com, and Add URL Pattern adds a new one.</p></figcaption></figure>

### How Approval Works in Ask Every Time

When the agent wants to perform an action in **Ask every time**:

1. An inline confirmation appears with the action details
2. You choose:

* **Deny** - Block this request.
* **Allow Once** - Allow only this request.
* **Session** - Allow the displayed pattern until you close Nimbalyst.
* **Always** - Save the displayed pattern to `.claude/settings.local.json`.

### Managing Permissions

Open **Settings > Project > Agent Permissions** to:

* Change your permission mode
* View and remove approved patterns
* Add additional directories
* Reset to defaults

Permissions are project-specific. Giving an agent more autonomy in one repository does not grant the same access in every project.

### Pattern Examples

* `Bash(git:*)` - Allow git commands
* `Bash(npm:*)` - Allow npm commands
* `Edit` - Allow file edits
* `WebFetch(domain:github.com)` - Allow fetching from github.com

### Security Notes

* Sensitive paths (`~/.ssh`, `~/.aws`, etc.) are always blocked
* Compound bash commands get one-time patterns that don't persist
* Untrusted projects deny agent actions until you choose a permission mode


# Privacy

Nimbalyst is local first. Files, app state, and agents stay on your machine, and online features move only the data that feature needs.

This page describes what stays on your machine, what data moves when you turn on an online feature, and how to opt out of telemetry.

### Local First, Shared When You Choose

Nimbalyst starts with local files, local application state, and agents configured on your machine. You can use the desktop app without moving a project into a hosted workspace.

Online features move only the data needed for the feature you choose:

* **Local workspace by default**: Project files remain outside Nimbalyst Teams unless you explicitly promote them into the shared team workspace.
* **Nimbalyst Teams**: Shared files and Trackers flow through Nimbalyst's Cloudflare sync service. Team data is encrypted in transit and at rest, isolated per team, and available only to authenticated, authorized members.
* **Personal device sync**: Personal sessions, prompts, drafts, and settings use a separate end-to-end encrypted channel.
* **Optional telemetry**: Nimbalyst collects anonymous product analytics to improve the app. You can opt out under **Settings > Application > Advanced > Analytics**. Telemetry does not include file contents, file paths, API keys, authentication tokens, document content, session content, or chat content.
* **Accounts are optional for local use**: An account is required for online services such as Nimbalyst Teams and personal device sync, not for local editing.
* **API keys and settings protected on disk**: Provider API keys are encrypted at rest, and Nimbalyst's settings files are written with private file permissions (as of v0.77.2).
* **Open source**: Verify how these boundaries are implemented in the source at [github.com/nimbalyst](https://github.com/nimbalyst).

### In-App Feedback Reports

Filing a bug report or feature request from inside the app sends nothing until you approve it:

* Logs are gathered only if you leave the consent checkbox on when starting a bug report.
* Everything gathered goes through an anonymization pass, a scrubbing step plus an AI redaction step over file paths, project names, and identifiers, before you see the draft.
* You review the redacted draft, and the report opens as a pre-filled GitHub issue form in your browser. You submit it yourself on github.com; nothing is posted on your behalf.

The [trust page](https://nimbalyst.com/trust/) lists the subprocessors involved when you turn on team features.


# Session and Window State Storage

Where Nimbalyst stores AI session history and window state on your machine, including the local database location on macOS, Windows, and Linux.

Session history and window state are stored in a local database on your own machine. This page covers which database that is, where it lives, and what a session record contains.

### The database

**Backend:** SQLite on newer installs. Installs that predate the SQLite migration stay on PGLite until they migrate.

**Tables:** `ai_sessions` for the sessions themselves, `ai_agent_messages` for the message log behind each one.

**Location:** inside the Nimbalyst application data folder.

| Platform | Application data folder                   |
| -------- | ----------------------------------------- |
| macOS    | `~/Library/Application Support/Nimbalyst` |
| Windows  | `%APPDATA%\Nimbalyst`                     |
| Linux    | `~/.config/Nimbalyst`                     |

Development builds use an `@nimbalyst/electron` folder in the same platform-specific location.

The database itself is `sqlite-db/nimbalyst.sqlite` on SQLite, or the `pglite-db/` folder on PGLite.

### What a session record holds

* Session id, title, and workspace
* Provider and model
* Session type, mode, and agent role
* Document context and the last document state
* Draft input you typed but have not sent
* Parent, branch, and worktree links
* Status, pinned and archived flags, and created and updated timestamps

Conversation messages are stored separately in `ai_agent_messages` and linked back to the session id, so a long transcript does not have to be rewritten every time the session changes.

### Backups

Nimbalyst backs this database up every 12 hours by default and on quit, keeping two rolling copies by default. You can change the interval and keep one to three copies under **Settings > Application > Database**. See [Database Backups and Restore](/troubleshooting/database-backups-and-restore) for the backup locations and restore steps.


# Security

How Nimbalyst handles files, sessions, and credentials, with open source code your security team can audit and encryption for shared data.

This page covers how Nimbalyst approaches security: open source code you can audit, SOC 2 Type 2 certification, and encryption for shared team data.

### Open Source: Audit the Code Yourself

Nimbalyst is open source. The full source code is published at [github.com/nimbalyst](https://github.com/nimbalyst), so you (or your security team) can review exactly how the app handles your files, sessions, credentials, and network traffic.

### Nimbalyst is SOC 2 Type 2 Certified

Nimbalyst holds a SOC 2 Type 2 certification: an independent auditor has examined our security, availability, and confidentiality controls and verified they operated over time, not just on the day of the audit. Compliance is monitored continuously between audits.

Current certifications, subprocessors, and policies are published on the [trust page](https://nimbalyst.com/trust/), and the [security feature page](https://nimbalyst.com/features/security/) covers how data is handled in the app.

### Nimbalyst Teams Data Security

Nimbalyst Teams is a shared layer over each teammate's local Nimbalyst installation and locally configured agents. Only files and Tracker items explicitly shared with a team enter the team collaboration flow.

* **Cloudflare infrastructure**: Shared team data flows through Nimbalyst's Cloudflare sync service.
* **Encrypted in transit and at rest**: Team documents, Tracker data, and collaboration updates are encrypted while moving across the network and while stored.
* **Isolated per team**: Team data is stored in team-specific infrastructure and access requires an authenticated, authorized membership.
* **Server-managed team keys**: Nimbalyst-hosted Teams manages encryption keys so authorized web, CLI, and agent experiences can access team work. Hosted team data is encrypted but is not zero-knowledge.
* **Separate personal sync**: Personal device sync uses end-to-end encryption with keys that stay on your devices.


# FAQs

Answers to common Nimbalyst questions about open source, Claude Code custom commands, multiple workspaces, data privacy, offline use, and file associations.

Quick answers to the questions we hear most often.

### **Is Nimbalyst open source?**

Yes. Nimbalyst is open source and the code lives at [github.com/nimbalyst](https://github.com/nimbalyst). You can read the source, file issues, and contribute pull requests.

The [open source page](https://nimbalyst.com/open-source/) covers the license and what is included.

### **Can I use my existing Claude Code custom commands?**

Yes. Nimbalyst runs Claude Code itself, so slash commands in `.claude/commands/` and the instructions in your `CLAUDE.md` work the same way they do in the terminal.

### **Can I have multiple workspaces open?**

Yes, you can open as many windows as you like. Each workspace is independent, and you switch between them with the standard window shortcuts.

### **Is my data sent to AI providers?**

When you send a message to an agent, the prompt and the context supplied to that session go to the agent or model provider you selected. Nimbalyst does not send your project files to an AI provider merely because you opened or edited them. API keys you enter in Settings are stored encrypted at rest on your device and are used to authenticate requests to that provider.

With LM Studio, inference runs on the local server you configured. Other app features, such as update checks, sign-in, sync, or optional sharing, may still use the internet independently of the model request. See [Privacy](/open-safe-private-secure/privacy) for the full data-flow explanation.

### **Nimbalyst keeps opening my .md files instead of VS Code (or another app)**

This is a macOS behavior, not a Nimbalyst issue. On Mac, the "Always Open With" option in the right-click menu only applies to **that specific file**, not all files of that type.

To change the default app for **all** `.md` files:

1. In Finder, select any `.md` file
2. Press **⌘ + I** (Get Info)
3. Under **Open with**, select your preferred app (e.g., Visual Studio Code)
4. Click **Change All...**

This tells macOS to open every `.md` file with your chosen app going forward.

### **Can I use Nimbalyst offline?**

The full markdown editor works offline. AI features need an internet connection, except LM Studio, which runs locally.

### **What languages does Nimbalyst support?**

English today.

### **How does Nimbalyst compare to my current tools?**

Side-by-side comparisons against editors, task trackers, diagram tools, and agent harnesses are on the [comparison pages](https://nimbalyst.com/compare/).


# Troubleshooting

Fix common Nimbalyst problems, including agents not responding, provider outages, API key and login errors, sync issues, and install trouble.

This page collects fixes for the most common problems: an agent that stops responding, and crashes or freezes caused by running out of memory. For database problems, see [Database Backups and Restore](/troubleshooting/database-backups-and-restore).

### Claude or Codex is not responding: check the provider status pages first

Before you dig into Nimbalyst settings, your network, or your API key, check whether Anthropic or OpenAI is having an outage. When their APIs are degraded or down, sessions hang, time out, or return errors that look like a Nimbalyst bug but are not.

* **Anthropic (Claude):** [status.anthropic.com](https://status.anthropic.com)
* **OpenAI (Codex / ChatGPT):** [status.openai.com](https://status.openai.com)

If either provider is reporting an incident on the affected component (Messages API, Claude Code, Codex, etc.), the fix is to wait for them to recover. There is nothing to change on your end.

### Nimbalyst is crashing: increase the heap size

If Nimbalyst is crashing, freezing, or showing out-of-memory errors (especially in large projects, long sessions, or while working with big diffs), the V8 memory limit is the likely culprit. The default heap size is **4 GB**, which is enough for most projects but can be too small if you keep many sessions, tabs, or files open at once.

**How to increase it:**

1. Open **Nimbalyst > Settings > Application > Advanced**.
2. Scroll to the **Tools & Environment** section.
3. Find **Max Heap Size** and pick a larger value (6 GB, 8 GB, 12 GB, or 16 GB).
4. Restart Nimbalyst. The new limit takes effect on the next launch.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-ed790f306078947273cbed5cfb6f07229bb89bfb%2FIncrease%20Heap%20Size.png?alt=media" alt="Application settings, Advanced, Tools and Environment, with the Max Heap Size dropdown open"><figcaption><p>Settings > Application > Advanced > Tools &#x26; Environment: Max Heap Size dropdown</p></figcaption></figure>

Pick the smallest size that comfortably fits your workload. Going higher than you need does not make Nimbalyst faster, it just lets V8 hold more in memory before garbage collecting. If you routinely hit the ceiling at 4 GB, 8 GB is a reasonable next step. Reach for 12 GB or 16 GB only if you work with very large repos or many parallel sessions.

If raising the heap does not fix the crashes, share details (project size, what you were doing, any error messages) via Discord or support. See [Feedback, Discord, Support, Releases](/getting-started/feedback-discord-support-releases).

Still stuck? The [Nimbalyst site](https://nimbalyst.com/) has feature walkthroughs and demo videos that often show the setting you are looking for, and support is at <support@nimbalyst.com>.


# Database Backups and Restore

Where Nimbalyst stores its automatic database backups on macOS, Windows, and Linux, and how to restore one by hand for both the SQLite and PGLite backends.

Nimbalyst keeps rolling backups of its local database so a corrupted database does not cost you your session history. This page covers where those backups live, how often they are taken, and the exact restore steps for both database backends.

## Try in-app recovery first

Before restoring anything by hand, open **Settings > Application > Database**. Database Settings can handle the common cases without the command line:

* **Databases set aside on this computer** lists any database copy Nimbalyst preserved rather than deleted, with when it was set aside and what it contains. You can review a copy, reveal it on disk, or restore it. Restore is always an explicit action you confirm; nothing is restored automatically.
* **PGLite copies kept from a migration** shows the pre-migration copy of your PGLite database after a SQLite migration, and **Restore from preserved PGLite** rolls back to it if the migration left you worse off.
* If automatic migration has been **held back on this computer**, the panel explains the recorded reason and lets you clear the block so a later launch can assess the migration again.

Recovery and rollback keep the original data intact across restarts, so trying an in-app restore does not burn your only copy. The manual steps below are for when the app cannot start at all, or when you need a specific rolling backup slot that the panel does not offer.

## Which backend you are on

Nimbalyst ships two local database backends. Newer installs use **SQLite**. Installs that started before the SQLite migration stay on **PGLite** until you migrate.

Check in this order, inside the Nimbalyst application data folder (paths below). Nimbalyst itself resolves the backend the same way, so stop at the first line that matches:

1. **`database-backend.json` exists.** Open it and read the `backend` field. It says either `sqlite` or `pglite`, and it wins over everything else on disk.
2. **No `database-backend.json`, but a `pglite-db` folder exists.** You are on PGLite.
3. **Neither.** You are on SQLite.

You can also read the answer straight from the log: the first database line in `logs/main.log` inside the application data folder looks like `[Database] Backend selector resolved to 'sqlite'`.

Do not judge by the presence of a `sqlite-db` folder alone. If you migrated to SQLite and later rolled back from **Settings → Database**, that folder stays behind while `database-backend.json` says `pglite`, and restoring into it would do nothing.

You may also see a `pglite-db.migrated-<timestamp>` folder. That is the pre-migration copy of your old PGLite database, kept as a safety net. It is not the live database and it is not a backup slot, so ignore it when following the steps below. Database Settings manages these copies for you, including rollback and deletion, under **PGLite copies kept from a migration**.

Each backend has its own backup folder, so follow the section that matches yours.

## Where the files live

The application data folder is:

| Platform | Application data folder                   |
| -------- | ----------------------------------------- |
| macOS    | `~/Library/Application Support/Nimbalyst` |
| Windows  | `%APPDATA%\Nimbalyst`                     |
| Linux    | `~/.config/Nimbalyst`                     |

Development builds use an `@nimbalyst/electron` folder in the same platform-specific location.

Inside that folder:

| What          | SQLite                                                                                                  | PGLite                                                                                |
| ------------- | ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- |
| Live database | `sqlite-db/nimbalyst.sqlite` (plus `-wal` and `-shm` siblings)                                          | `pglite-db/` (a folder)                                                               |
| Backups       | `sqlite-db.backups/`                                                                                    | `db-backups/`                                                                         |
| Backup slots  | `nimbalyst.backup-current.sqlite`, `nimbalyst.backup-previous.sqlite`, `nimbalyst.backup-oldest.sqlite` | `pglite-db.backup-current/`, `pglite-db.backup-previous/`, `pglite-db.backup-oldest/` |
| Backup index  | `backup-metadata.json`                                                                                  | `backup-metadata.json`                                                                |

`backup-metadata.json` records the timestamp, size, and verification result for each slot, which is the quickest way to see how fresh your newest backup is.

## How backups are taken

* **Every 12 hours by default** while Nimbalyst is running.
* **On quit**, as part of the shutdown sequence.
* **At startup and on wake from sleep**, if the last successful backup is older than the configured interval. A laptop that slept through a backup window still gets a fresh snapshot.
* **Two rolling copies by default.** A new backup becomes `current` and the old `current` becomes `previous`.
* **Verified before it is kept.** Nimbalyst opens each new backup and reads from it before promoting it into the rolling slots, and rejects a snapshot that has shrunk to less than half the size of the one it would replace.

Under **Settings > Application > Database**, you can keep one, two, or three copies and change the interval. Setting the interval to **On quit only** disables periodic backups. Cadence changes take effect after a restart. The `oldest` slot exists only when you keep three copies.

On PGLite, a database that fails to open at startup triggers an automatic restore from the newest valid backup. On SQLite, restore is a manual step, which is what the rest of this page walks through.

## Restore a SQLite backup

Only follow this section if you confirmed SQLite is your active backend above.

Quit Nimbalyst completely first. Restoring while the app is running will not work, and can leave you with a half-written database.

### macOS and Linux

```bash
# 1. Quit Nimbalyst completely (Cmd+Q on macOS)

# 2. Go to the application data folder
cd ~/Library/Application\ Support/Nimbalyst     # macOS
# cd ~/.config/Nimbalyst                        # Linux

# 3. Move the bad database aside, including its WAL and SHM siblings
mv sqlite-db/nimbalyst.sqlite sqlite-db/nimbalyst.sqlite.bad
rm -f sqlite-db/nimbalyst.sqlite-wal sqlite-db/nimbalyst.sqlite-shm

# 4. Copy the most recent backup into place
cp sqlite-db.backups/nimbalyst.backup-current.sqlite sqlite-db/nimbalyst.sqlite

# 5. Start Nimbalyst
```

### Windows (PowerShell)

```powershell
# 1. Quit Nimbalyst completely

# 2. Go to the application data folder
cd "$env:APPDATA\Nimbalyst"

# 3. Move the bad database aside, including its WAL and SHM siblings
Rename-Item sqlite-db\nimbalyst.sqlite nimbalyst.sqlite.bad
Remove-Item sqlite-db\nimbalyst.sqlite-wal, sqlite-db\nimbalyst.sqlite-shm -ErrorAction SilentlyContinue

# 4. Copy the most recent backup into place
Copy-Item sqlite-db.backups\nimbalyst.backup-current.sqlite sqlite-db\nimbalyst.sqlite

# 5. Start Nimbalyst
```

Deleting the `-wal` and `-shm` files matters. They belong to the database you just replaced, and leaving them behind can corrupt the restored copy.

## Restore a PGLite backup

Only follow this section if you confirmed PGLite is your active backend above. If `database-backend.json` says `sqlite`, Nimbalyst never opens `pglite-db` and restoring it changes nothing. Use the SQLite steps instead.

Quit Nimbalyst completely first, the same as for SQLite.

PGLite stores its database as a folder rather than a single file, so every copy here is recursive.

### macOS and Linux

```bash
# 1. Quit Nimbalyst completely (Cmd+Q on macOS)

# 2. Go to the application data folder
cd ~/Library/Application\ Support/Nimbalyst     # macOS
# cd ~/.config/Nimbalyst                        # Linux

# 3. Rename the corrupted database (keeps it around just in case)
mv pglite-db pglite-db.bad

# 4. Copy the most recent backup into place
cp -r db-backups/pglite-db.backup-current pglite-db

# 5. Start Nimbalyst
```

### Windows (PowerShell)

```powershell
# 1. Quit Nimbalyst completely

# 2. Go to the application data folder
cd "$env:APPDATA\Nimbalyst"

# 3. Rename the corrupted database
Rename-Item pglite-db pglite-db.bad

# 4. Copy the most recent backup into place
Copy-Item -Recurse db-backups\pglite-db.backup-current pglite-db

# 5. Start Nimbalyst
```

## If the newest backup is also bad

Open `backup-metadata.json` in the backup folder before you pick. It lists each slot with its `timestamp`, `sizeBytes`, and `verified` flag, so you can see how much work each choice costs you rather than guessing.

Then work back through the available slots. `previous` is one backup window older. If you configured three copies, `oldest` is two windows older.

```bash
# SQLite
cp sqlite-db.backups/nimbalyst.backup-previous.sqlite sqlite-db/nimbalyst.sqlite
cp sqlite-db.backups/nimbalyst.backup-oldest.sqlite   sqlite-db/nimbalyst.sqlite

# PGLite
cp -r db-backups/pglite-db.backup-previous pglite-db
cp -r db-backups/pglite-db.backup-oldest   pglite-db
```

Repeat the same quit, clear, copy, launch sequence each time.

## What a restore brings back

The database holds:

* AI session and conversation history
* Document edit history behind the History sidebar
* Session metadata, prompts, and drafts
* Local tracker data

The following live outside the database and are untouched by a database problem or a restore:

* Your document and project files on disk
* Application and workspace settings
* Anything already synced to a Nimbalyst team

Because a restore rewinds to the last snapshot, work done between that snapshot and the failure is not recovered. Files on disk are unaffected either way.

## Cleaning up

Once you have confirmed the restore worked and your sessions are back, delete the copy you set aside.

macOS and Linux:

```bash
rm -f  sqlite-db/nimbalyst.sqlite.bad     # SQLite
rm -rf pglite-db.bad                      # PGLite
```

Windows (PowerShell):

```powershell
Remove-Item sqlite-db\nimbalyst.sqlite.bad            # SQLite
Remove-Item -Recurse -Force pglite-db.bad             # PGLite
```

You may also see `temp-backup-*` entries in a backup folder after a crash. They are leftovers from an interrupted snapshot, Nimbalyst sweeps them on the next launch, and they are safe to delete.

## Still stuck

If none of the available backups will open, send us the contents of `backup-metadata.json` and the main log from the `logs` folder in the same application data directory. Reach out on Discord or at <support@nimbalyst.com>, see [Feedback, Discord, Support, Releases](/getting-started/feedback-discord-support-releases).


# Windows: Detailed Install Guide

Install Nimbalyst on Windows, open a project, and connect Claude Agent or OpenAI Codex using a plan login or API key.

This guide takes you from the Windows installer to your first agent session. Download the current `.exe` from the [Nimbalyst download page](https://nimbalyst.com/download/).

## Install the App

1. Open the downloaded Nimbalyst installer.
2. Choose the installation options you want and finish setup.
3. Launch Nimbalyst from the Start menu or the shortcut you created.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FmAFREIYBbckdzLjrkVw8%2Fimage.png?alt=media&amp;token=1209ac95-95c7-4821-a15d-2ff8d9be154b" alt="The Windows installer showing Nimbalyst installation options"><figcaption><p>Choose the shortcuts you want, then continue through the installer.</p></figcaption></figure>

## Open a Project

A project is a folder on your PC. It can be a Git repository or any other folder containing the documents and files you want to work with.

1. On the Project Manager screen, choose **Open Folder** or **New Folder**.
2. Complete the welcome screen. Choose Standard Mode for a simpler writing workspace or Developer Mode for Git, terminal, and worktree features; you can change this later.
3. Use **Start tutorial** if you want a disposable example project, or **Get started…** to open your own folder.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FERG8tVZGleWZowVZf5Lw%2Fimage.png?alt=media&amp;token=347f5aad-358c-4275-954e-9e3ad9337fef" alt="Nimbalyst Project Manager for choosing or creating a project folder" width="563"><figcaption><p>Each project is backed by a folder on your filesystem.</p></figcaption></figure>

## Connect an Agent

The standard Claude Agent and OpenAI Codex integrations are included with Nimbalyst. You do not need to install Git for Windows or a separate CLI for either one.

1. Open **Settings > Application > AI Providers**.
2. Select **Claude Agent** or **OpenAI Codex** and enable it.
3. Authenticate with a supported subscription login, or choose the API-key option and enter your own key.
4. Return to the workspace, create a session, and select that provider in the composer.

Claude plan login opens a terminal for the OAuth flow and may ask you to type `/login`; return to Settings and click **Refresh** when authentication finishes. Codex plan login opens the ChatGPT sign-in flow in your browser.

{% hint style="info" %}
Git for Windows is still useful for Git repositories and is required by some optional CLI-based providers, but it is not required for Nimbalyst's standard bundled Claude Agent or Codex integrations. See [AI Provider Setup](/setup-nimbalyst/ai-provider-setup-and-notifications).
{% endhint %}

## Windows Spellchecker

Nimbalyst uses Electron's Windows spellchecker, which defaults to English. You can turn it off in Settings.

## Start Working

Type a request in the agent panel. The agent can research, write and edit files, build mockups and diagrams, and work with the project context that you give it. You review file changes in Nimbalyst before accepting them.


# Mac: Detailed Install Guide

Install Nimbalyst on macOS, open a project, and connect Claude Agent or OpenAI Codex using a plan login or API key.

This guide takes you from the macOS disk image to your first agent session. Download the current installer from the [Nimbalyst download page](https://nimbalyst.com/download/).

## Install the App

1. Open the downloaded Nimbalyst `.dmg` file.
2. Drag Nimbalyst into **Applications**.
3. Open Nimbalyst from **Applications**.
4. If macOS asks whether you want to open an app downloaded from the internet, click **Open**.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FRlRD5cc8N284ThTTmDzY%2Fimage.png?alt=media&amp;token=5c7d0776-4fb6-421f-88cd-c116dbf57597" alt="The Nimbalyst disk image with an arrow from the app to the Applications folder"><figcaption><p>Drag Nimbalyst into Applications, then launch it from there.</p></figcaption></figure>

Nimbalyst updates itself after installation. If macOS blocks the first launch, open **System Settings > Privacy & Security** and use the option to open Nimbalyst there.

## Open a Project

A project is a folder on your Mac. It can be a Git repository or any other folder containing the documents and files you want to work with.

1. On the Project Manager screen, choose **Open Folder** or **New Folder**.
2. Complete the welcome screen. Choose Standard Mode for a simpler writing workspace or Developer Mode for Git, terminal, and worktree features; you can change this later.
3. Use **Start tutorial** if you want a disposable example project, or **Get started…** to open your own folder.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2FI6MthAn6ZWD1patQ1pTY%2Fimage.png?alt=media&amp;token=669e5a74-571b-4e59-b38d-c2081eb27198" alt="Nimbalyst Project Manager for choosing or creating a project folder"><figcaption><p>Each project is backed by a folder on your filesystem.</p></figcaption></figure>

## Connect an Agent

The standard Claude Agent and OpenAI Codex integrations are included with Nimbalyst. You do not need to install a separate CLI for either one.

1. Open **Settings > Application > AI Providers**.
2. Select **Claude Agent** or **OpenAI Codex** and enable it.
3. Authenticate with a supported subscription login, or choose the API-key option and enter your own key.
4. Return to the workspace, create a session, and select that provider in the composer.

<figure><img src="https://562749618-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiVUeHZHlFlZrZt02syRC%2Fuploads%2Fgit-blob-ac8887ab7b6a64356819625db804833002e94f48%2Fdocs-ai-providers.png?alt=media" alt="Nimbalyst Application Settings with Claude Agent selected and other agent providers listed in the sidebar"><figcaption><p>The AI Providers settings on macOS. Leave Custom Claude Installation empty to use Nimbalyst's bundled runtime.</p></figcaption></figure>

Claude plan login opens Terminal for the OAuth flow and may ask you to type `/login`; return to Settings and click **Refresh** when authentication finishes. Codex plan login opens the ChatGPT sign-in flow in your browser.

{% hint style="info" %}
Nimbalyst also offers separate CLI providers for users who deliberately want a locally installed command-line agent. Those providers have their own installation checks. See [AI Provider Setup](/setup-nimbalyst/ai-provider-setup-and-notifications).
{% endhint %}

## Start Working

Type a request in the agent panel. The agent can research, write and edit files, build mockups and diagrams, and work with the project context that you give it. You review file changes in Nimbalyst before accepting them.


