Releases: rohitect/nexora-ide-releases
Nexora v0.1.6
Nexora 0.1.6
Spin up a local Kubernetes cluster without leaving Nexora — a guided wizard that creates, streams and opens a kind cluster for you.
✨ Features
☸️ Create a local cluster (kind)
Need a throwaway Kubernetes cluster to test against? Nexora can now create one for you with kind (Kubernetes IN Docker) — right from the Kubernetes → Clusters tab.
- One button, guided the whole way — hit + New cluster on the Clusters tab (or New cluster on a cluster's Overview) and a four-step wizard walks you through it: check prerequisites → configure → watch it build → open.
- Prerequisite check up front — the wizard verifies Docker (and that the daemon is actually running),
kubectl, andkindbefore you start, with one-clickbrew installfor the missing CLIs and a Docker Desktop download link. - Presets or fine-grained control — pick Minimal / Development / Multi-node, or set it yourself: cluster name, Kubernetes version, worker-node count, host ingress ports (80/443), and an optional metrics-server install for
kubectl top. A live preview shows the exactkindconfig that will be applied, and an Advanced box lets you paste your own YAML to override everything. - Watch it come up live — creation streams real-time output with a phase tracker (pulling the node image → control-plane → CNI → storage → ready), and a Cancel button that actually stops the build.
- Open it the moment it's ready — on success, Open cluster drops you straight into the new
kind-<name>context as a tab. - Manage what you've got — the Clusters tab lists your local kind clusters with running status and a one-click delete (which also cleans up the kubeconfig context).
🖥️ Nodes, fully browsable
The Nodes entry in the Kubernetes sidebar is now a real, live page instead of a placeholder.
- A proper list — every node with its Ready/NotReady status, roles, kubelet version, internal IP, OS image and age, updating live like the other resource tables.
- A rich side panel — click a node to see its capacity vs. allocatable (CPU / memory / pods / ephemeral-storage), full system info (kubelet, runtime, kernel, architecture), addresses, taints, colour-coded conditions, and its labels/annotations — plus the raw YAML tab.
📐 A better way to scale
Scaling a Deployment, StatefulSet or ReplicaSet now opens a proper dialog instead of a cramped inline box.
- See the change before you make it — a current → target read-out with a coloured delta (
+2/-1) and the live ready count. - Set it however you like — a
−/+stepper, a slider, or one-tap presets (0, 1, 3, 5, 10). - Guard rails — a clear warning when you scale to 0 (it takes the workload offline), and Apply is disabled unless the target actually differs, so you can't fire an accidental no-op.
🔐 SSH Client — a new plugin
A Termius-style SSH client, now in the plugin marketplace: manage your servers, open terminals, browse files, and let the assistant help out.
- A real connection manager — save hosts (grouped), and authenticate with a key straight from
~/.ssh, a pasted private key, or a password. Each host's key is verified on first connect (trust-on-first-use), with a loud warning if it ever changes. - Interactive terminals, multi-tab — open a full terminal per host and flip between tabs; sessions stay alive in the background as you move around the app.
- SFTP file browser — navigate the remote filesystem, upload and download, rename, make folders, and delete.
- In your chats too — the assistant can list your saved hosts, read remote files and list directories, and — with a per-host opt-in — run commands, handy for poking at a box mid-incident.
- A built-in assistant in the terminal — open the ✨ AI panel beside any session and ask it to investigate. It runs its commands right in the terminal you're watching — read-only diagnostics run automatically, anything that changes the box waits for your approval — renders its answers as Markdown, and lets you pick which of your configured LLMs responds.
- Install it from the marketplace.
🧩 Pin plugins to the sidebar
Plugins that contribute a view can now live right in the main left sidebar, so the ones you use all the time are one click away.
- Pin from the Plugins page — each plugin view now has a 📌 toggle; pin it and it shows up as a first-class item in the left rail, under a new Plugins section below the built-in destinations.
- Clearly a plugin — pinned items render with the plugin's own icon plus a small puzzle badge, so they're easy to tell apart from Nexora's built-in sections.
- Reorder by dragging — drag pinned items up and down to arrange them however you like; the order sticks.
- They stay live — a pinned view keeps running in the background, so switching to another section and back doesn't reload it or drop its state (your SSH terminal, for instance, stays connected).
- Unpin anytime — the same toggle on the Plugins page removes it from the rail.
☁️ EC2 Manager — a smarter assistant
The AWS EC2 Manager plugin's connect screen and built-in assistant got a meaningful upgrade.
- The assistant works in the terminal you're watching. Instead of running its commands down a hidden side channel, the assistant now types them straight into your live session — SSM, SSH, EC2 Instance Connect or serial console — so you see exactly what it ran and the output it read, right alongside your own commands.
- Pick the model. A provider dropdown in the assistant header lets you choose which of your configured LLMs answers — defaulting to your default provider.
- Properly formatted replies. Assistant messages now render as Markdown — headings, lists, and fenced code blocks instead of a wall of plain text.
- A roomier connected view. Once you connect, the instance summary and method tabs collapse into a slim status bar (method, instance, an AI toggle and Disconnect), handing the full height to the terminal and assistant. The assistant now starts hidden — flip it on with the AI button whenever you want a hand.
🐛 Fixes
- Pods now show "Terminating". A pod being deleted keeps reporting its old phase (usually Running) for its whole grace period, so it used to just vanish from the list. Nexora now surfaces it as Terminating — matching kubectl and Lens — until it's actually gone.
- Live, second-level ages. Relative ages in the Kubernetes tables now show seconds up to two minutes (then minutes / hours / days) and tick on their own once a second, so a freshly-created or terminating pod reads naturally instead of only updating when something else changes.
- The Refresh button shows it's working. Refreshing an already-loaded resource gave no feedback — the spinner never spun. It now spins and reads Refreshing… for the duration of the re-list (held briefly so a fast cluster still registers the action).
- Log search no longer yanks you around. While tailing logs with an active search, every incoming batch used to scroll the view back to the matched text. Matches now stay highlighted with their count and ↑/↓ navigation, and the view only moves when you jump between matches — not when new lines arrive.
- Smoother typing in the SQL editor. Typing a query could lag on lower-end Macs — each keystroke re-rendered the whole results grid and re-scanned the entire document. The editor now keeps results and inactive query tabs out of the keystroke path, so typing stays responsive even with a large result set open.
- Opening a second pod-logs tab now focuses it. Streaming logs for one pod and then another added the new tab to the bottom panel but left you looking at the previous one. The newly-opened tab now comes to the front.
- Scrollable bottom-panel tabs. When enough log/shell tabs are open to overflow the bottom panel's width, you can now scroll the strip with the trackpad/scroll wheel or the new ◂ ▸ buttons, and the active tab always scrolls into view.
Nexora v0.1.5
Nexora 0.1.5
Plugins arrive in Nexora — sandboxed, signed extensions you install in one click. Plus commit & push in one move.
✨ Features
🧩 Plugins — extend Nexora at runtime
Nexora now has a real plugin system: sandboxed, signed extensions that add AI tools and panels to the app — no rebuild, installed in one click.
- Sandboxed by default — a plugin's backend runs in an embedded WebAssembly runtime. It can only reach the network hosts, secrets and files it declares, and you approve those at install. Plugins load lazily and idle-suspend when unused.
- Install on double-click — grab a
.nexpluginfrom the new plugin marketplace and double-click it (or Plugins → Install from file). A consent sheet shows the publisher signature and the exact permissions before anything runs. - Signed & verified — packages are minisign-signed, and upgrades must come from the same publisher. A new Plugins page in the sidebar lists everything you've installed, with enable/disable, per-plugin secrets (kept in the OS keychain), and one-click uninstall.
- AI-aware — a plugin can expose tools the in-app assistant calls and panels that open like any other view.
☁️ AWS S3 Explorer — the first plugin
The first plugin in the marketplace: a full S3 browser, scoped to whatever AWS account and role you choose.
- Three ways to sign in — reuse your machine's existing
aws sso login, run the SSO device flow in-app (pick an account → permission-set role, just like the AWS access portal), or use static access keys. - Browse & manage — navigate buckets and folders, preview and download objects, upload, create folders and delete — across regions automatically.
- In your chats too — the assistant can list buckets and objects and read objects from the active session.
- Install it from the marketplace.
⬆️ Commit & Push, in one click
The Commit button in a service's Source Control panel now has a sibling: Commit & Push.
- Split button — hit the main button to run your usual action, or open the chevron menu to choose between Commit and Commit & Push.
- Push happens right after the commit — Commit & Push commits your staged changes and immediately pushes them to
originon the current branch, so there's no second trip to the Push button. - Remembers your choice — whichever action you pick from the menu becomes the new default for that button (and your
⌘/Ctrl+Entershortcut), and it sticks across restarts. - Safe on failure — if the commit lands but the push can't (auth, network, etc.), the commit is still saved and the push error is shown so you can retry from the header Push button.
🔒 Touch ID, on by default
Nexora now turns on Touch ID protection automatically — no toggle to hunt for.
- Vault unlock — when your secrets vault is set up (and on the next unlock of an existing vault), Nexora enrolls Touch ID for you on any Mac that supports it. Unlocking is a fingerprint away, with your passphrase always available as a fallback.
- Database connections — new connections require Touch ID to open, test or export by default, and existing connections that never set a preference are protected too. You can still turn it off per connection, and that choice is remembered.
- Nothing forced where it can't work — on machines without biometrics (or builds that can't reach the secure keychain), it quietly stays on passphrase/login-password unlock.
🐛 Fixes
- Push a brand-new branch — it just works now. Pushing from a branch that had never been pushed used to silently fail (git aborts with "the current branch has no upstream branch"). Push (and Commit & Push) now publishes the branch automatically, setting its upstream to
origin/<branch>on that first push — no command line needed. - See at a glance when a branch isn't pushed. The Source Control header now flags a branch that has no upstream yet: an amber "N unpushed" / "Not published" badge instead of the usual ↑/↓ counts, and the Push button reads Publish branch. Once published, it goes back to the normal ahead/behind indicators.
Nexora v0.1.4
Nexora 0.1.4
Save the commands you keep retyping as scripts, and work your service's GitHub — README, Issues, Pull Requests and Actions — without leaving the app.
✨ Features
📜 Per-service terminal scripts
The service shell terminal gets a Scripts menu: save reusable commands once, then run them with a click instead of retyping them every time.
- Scoped to the service you're in — each service keeps its own script list, so a
tail the logsorseed the dbscript lives with the service it belongs to. Your existing global scripts show up in the same menu too, grouped separately. - Click to run — open the Scripts button in the terminal toolbar and pick one. It runs in the pane you last worked in.
- Type-for-review or run-on-click — each script has an auto-run switch: on, it executes immediately; off, it's typed into the prompt so you can eyeball or tweak it before pressing Enter. Auto-run scripts are flagged in the menu.
- Save a selection as a script — highlight any command in the terminal, right-click, and choose Save selection as script — the new-script dialog opens with the text already filled in.
- Title, description & category — give each script a name and a short description so a months-old one-liner still makes sense. Add, edit, and delete service scripts right from the menu.
- Remembered across restarts — scripts are saved per service and are there next time you open it.
🐙 GitHub, right in the service
Any service with a linked GitHub account and repo now gets four live tabs — no more bouncing to the browser to check a PR or kick off a build.
- README — the repo's README rendered inline, images and all.
- Issues — browse and filter by state and label, open one to read the thread, then comment, create, close or reopen without leaving Nexora.
- Pull Requests — the open-PR list with a live CI status badge per PR; open one for its description, checks, review thread, and a built-in file-by-file diff viewer. Approve, request changes, comment, and merge (merge / squash / rebase) right there.
- Actions — recent workflow runs with status, drill into a run's jobs and steps, and re-run, re-run failed, or cancel. Hit Run workflow and Nexora reads the workflow's own
workflow_dispatchinputs, so you fill in exactly the parameters it asks for — dropdowns for choices, checkboxes for booleans, with the declared defaults. - Outward-facing actions confirm first — anything that writes to GitHub (a comment, a merge, a dispatch) asks before it goes out.
Nexora v0.1.3
Nexora 0.1.3
Pick exactly which Skills and MCP servers each AI assistant can use — right from the chat, no detour through Settings.
✨ Features
⚡ AI chat — choose Skills & connect MCP servers in-chat
Every AI assistant (Service, Cluster, and Chat) gets a new Capabilities button in the composer. One click opens a popover with two sections — your Skills and your external MCP servers — so you can tune what the assistant can do for the chat you're in, without leaving it.
- Activate Skills per chat — tick the Skills you want in play; their guidance is folded into the assistant and (when a Skill declares one) its tool set is narrowed to match. Untick to drop back to the defaults.
- Toggle MCP servers — turn the servers already available to this chat on or off for the current conversation.
- Connect a new server — a server that isn't wired to this chat yet shows a Connect action: one click attaches it to this surface (this service, all Cluster chats, or the main Chat) so it's ready to use. Manage trust and remove it later from Settings.
- Remembers your choice — each surface keeps your last selection and applies it to new chats, so you set it once and move on.
- Available everywhere — the same control now lives in the main Chat too, not just the Service and Cluster assistants.
⌨️ Customizable keyboard shortcuts
A new Settings → Keyboard Shortcuts page lists every major shortcut in one place and lets you remap the ones you reach for most.
- Rebind in two clicks — hit Edit, press the keys you want, and Save. The command palette, performance overlay, navigation back/forward, file save, Markdown preview toggles, SQL run, NL→SQL, and find/filter are all customizable.
- Conflict-aware — if a combo is already in use, you're warned which shortcut it clashes with — but you're still free to assign it.
- One-tap reset — revert any single shortcut, or all of them, back to the defaults.
- Full reference — built-in contextual keys (send message, close dialogs, topology toggles, and more) are listed too, so the page doubles as a complete cheat sheet.
- Remembers your choices — your bindings persist across restarts.
🔀 Switch between any open tab with Ctrl+Tab
Press Ctrl+Tab anywhere to flip between everything you have open — code files, terminals, database connections, service and cluster tabs, and pages — without reaching for the mouse.
- Hold-and-cycle — hold Ctrl and tap Tab to walk down the list, Ctrl+Shift+Tab to walk back up, then release Ctrl to jump to the highlighted tab. Arrows, Enter, Esc, and clicking work too.
- Grouped by context — tabs are segregated under section headers (each open service, then Kubernetes, Kafka, and App pages), so you can see at a glance which area each tab belongs to.
- Smart ordering — the tabs closest to what you're working on come first: the current service's open code files, then its terminals and database tabs, then the broader service / cluster / page tabs.
- Works from anywhere — even with focus inside a terminal or the code editor, Ctrl+Tab opens the switcher instead of being swallowed by the editor.
- Always current — tabs appear the moment you open them and drop off the list as soon as you close them.
🧰 Quick utilities with ⌘U
Press ⌘U anywhere to open a quick-tools picker — twelve focused tools for the things you otherwise leave the IDE for: freeing a stuck port, approving a PR, decoding a JWT.
- One shortcut, fuzzy search — ⌘U opens the command palette locked to a new Utilities mode (typing
!in the palette does the same). Type a few characters, hit Enter, and the tool opens in its own focused dialog. Esc puts you right back where you were typing. - Kill a process on a port — type the port, see exactly what's listening (name, PID, full command line), pick what to kill, confirm, and get a per-process result. Stale entries are re-checked at the moment you confirm, so the wrong process is never signalled. Check a Port is the look-don't-touch sibling, and recent ports come back as one-click chips.
- GitHub, without the browser — four tools that work against the repos your services already link: Approve a Pull Request (approve / request changes / comment, with a live CI-checks badge before you commit to it), Merge a Pull Request (squash, merge, or rebase), My Open Pull Requests across every linked repo, and Run a Workflow to fire a
workflow_dispatchon any branch. GitHub Enterprise connections work too. - HTTP ping — GET/HEAD any URL and see the status, latency, and every redirect hop. Great for a quick
/healthzcheck on a local service. - Converters — Base64 encode/decode (UTF-8 safe, URL-safe toggle), JSON pretty-print / minify / validate with error position, UUID v4 generation, epoch ↔ ISO/local time with a "now" button, and JWT decode that flags an expired
expat a glance. - Make it yours — the new Settings → Utilities page (also one gear-click away from any tool dialog) has enable/disable toggles per tool plus the knobs that matter: skip the kill confirmation, tune the kill grace period and ping timeout, stop pings at the first redirect, and set your default merge method and review action.
- Safe by default — every destructive action (kill, approve, merge, run workflow) asks for an inline confirmation first, and ⌘U is fully re-bindable in Keyboard Shortcuts.
🔐 Touch ID for database connections
Mark any database connection as protected, and Nexora asks for Touch ID before opening it — so a prod connection can't be opened by whoever wanders past your unlocked laptop.
- Per-connection control — a new Require Touch ID to connect toggle in the connection dialog. Protect prod, leave localhost frictionless.
- Touch ID first, never locked out — uses the native macOS auth sheet, with your login password (or Apple Watch) as fallback when the sensor isn't available — clamshell mode included.
- Don't ask again for N minutes — a successful check is remembered for a grace window you choose per connection (default 15 minutes,
0= ask every time), so back-to-back connects don't nag. - Covers every way the password leaves the keychain — connecting, testing a saved connection, and exporting it with the password included all pass through the same gate.
- Can't be switched off silently — unticking Require Touch ID on a protected connection asks for authentication first (always — the grace window doesn't apply), so the protection can't be removed behind your back.
- Travels with the connection — the setting is kept in encrypted
.nexdbconnexports, so an imported connection arrives protected.
🗂️ Multiple query tabs in the SQL editor
The SQL editor now works in tabs — keep several queries open side by side per database connection, just like the desktop SQL clients you're used to.
- Open as many as you need — hit + for a new query tab (up to 15 per connection). Each tab is its own scratch buffer with its own results.
- Nothing is lost when you switch — every tab keeps its query text, results grid, cursor, and scroll position, so flipping between tabs is instant and never re-runs anything.
- Name them — tabs start as Query 1, Query 2… and a double-click lets you rename one so you can tell your tabs apart.
- Recall opens a fresh tab — loading a Saved query (the new tab takes the query's name) or a History entry, and the chat's Put in editor, all open in a new tab instead of clobbering what you were writing.
- Remembered across restarts — your open query tabs and their contents are saved per connection and restored next time you open it.
🐛 Fixes
- Confirm before quitting. Cmd+W and Cmd+Q no longer close Nexora instantly — they pop a quick Quit Nexora? confirmation first, so an accidental keystroke can't drop you out of a long session. Esc (or Cancel) keeps you put; Enter (or Quit) exits.
- Add and rename Kubernetes dashboards. The + (new dashboard) and rename actions on the Cluster dashboard did nothing — they relied on a browser prompt the app's webview never shows. They now open a proper in-app name dialog, so you can create as many dashboards as you like beyond the default.
Nexora v0.1.2
Nexora 0.1.2
A right-click file manager in the Code editor, a matching context menu for Git changed files, encrypted export/import of database connections, and smarter AI assistants that know what time it is.
✨ Features
🗂️ Code editor — right-click the file tree
The file explorer is no longer read-only. Right-click any file, folder, or the empty space below them — common file chores no longer mean dropping out to a terminal or Finder.
- New File… / New Folder… — inline name entry right where you clicked; new files open in a tab automatically.
- Rename — edit in place with the basename pre-selected (the extension stays put); ⏎ commits, esc cancels.
- Duplicate — copies a file or whole folder to the next free
… copy/… copy 2sibling. - Delete — moves to the OS Trash (recoverable, with a confirm), never an unrecoverable unlink.
- Reveal in Finder — jump to the item in your OS file manager.
- Copy Path / Copy Relative Path / Copy Name — absolute, service-root-relative, or just the filename.
Expanded folders stay expanded after each change, tabs for renamed or trashed files close themselves, and every operation is sandboxed to the service's local checkout.
🌿 Git — right-click the changed-files list
The Commits tab's file list gets a context menu too — selection-aware, so right-clicking inside a multi-selection acts on every selected file (Stage (3)).
- Stage / Unstage — same as the hover buttons, but across a whole selection.
- Discard Changes… — now behind a proper confirmation that spells out what happens: tracked changes revert to the last commit, untracked files move to the OS Trash (recoverable) — which also means untracked files can finally be discarded at all.
- Open in Editor — jump straight to the file in the Code tab.
- Copy Path / Copy Relative Path — single file or the whole selection.
- Reveal in Finder — show the file in your OS file manager.
🔐 Database — export & import a connection (encrypted)
Move a database connection between Nexora installs without re-typing anything — each connection exports to a single password-protected *.nexdbconn file.
- Export (encrypted) — bundles the connection config, prerequisite/tunnel setup, saved password, data-dictionary annotations, and saved queries. Pick a passphrase and tick exactly what to include.
- Import — unlock with the passphrase, preview what's inside, optionally rename, and it lands as a brand-new connection. The password goes back into your OS keychain; annotations and saved queries reattach automatically.
- Double-click to import —
.nexdbconnfiles are registered with the OS: open one from Finder and Nexora launches, asks which service to import into, and drops you on the new connection. - Encrypted end-to-end — the entire bundle (hostnames and usernames included) is sealed with AES-256-GCM behind an Argon2id-stretched passphrase. No passphrase, no data — and a wrong passphrase or tampered file is rejected cleanly.
⬇️ Updates — grab the installer yourself
The update banner gains a Release page button next to Download — it opens the version's GitHub release page so you can install manually instead of in-app. It also appears next to Retry when an in-app update fails, so a broken auto-update always leaves a way out.
📊 K8s dashboards — readable widget error states
Failing dashboard widgets (e.g. 403s from RBAC-restricted clusters) no longer dump the raw Kubernetes API error into the widget body. You get a compact error state — icon, "Failed to load data", a one-line summary — plus a Details popup with the full raw error, copyable in one click. "Data source missing" notes (metrics-server / Prometheus) get the same treatment: summarized and clamped, no more overflowing text.
🕒 AI assistants — time & environment awareness
Every message to the AI (Service, Cluster, and Chat) now carries the current date & time, your timezone, locale, and the app/OS it's running in. The assistant can reason about "today", "now", and "the last 24 hours" — and line log timestamps up against the real clock — without asking or guessing. Rebuilt fresh on every send, so it stays current through long conversations.
🐛 Fixes
- AI composer — input clears reliably after sending. Text pre-filled from a seed (K8s logs "Ask AI", pinned evidence, or a Chat prompt template) could re-paste itself over the box after a send. Seeds are now strict one-shots: applied once, then retired — sending always empties the composer.
Nexora v0.1.1
Nexora 0.1.1
A ⌘K command palette, branching chat (explore a conversation as a tree — and run branches in parallel), and a scoped, self-pruning AI Inspector, plus a round of editor and settings polish.
✨ Features
⌘K command palette — go anywhere, run anything
Press ⌘K / Ctrl+K — or click the Search pill in the title bar — to fuzzy-jump to any view or run any action without hunting through the sidebar.
- Navigate anywhere — top-level pages, every service (Code / Database / Deployments / Chat tabs), every Kubernetes context (Performance Report + Chat), Kafka connections, Settings sections, and recent AI conversations.
- Run actions — back/forward, open Settings, toggle the performance overlay, reload the window — plus context-aware ones like Copy link to this view (a
nexora://deep link) and Open YAML for a focused Kubernetes resource. - Smart ranking — recent destinations and your most-run commands surface first, and persist across restarts.
- Prefix modes —
>for actions only,@for Settings sections. - Keyboard-driven — ↑/↓ to move, ⏎ to run, esc to close; results grouped by category with matches highlighted as you type.
🌿 Threaded chat — branch a conversation into a tree
The main Chat page is no longer a single straight line — fork from any reply to explore alternatives without losing or polluting the original thread.
- + New branch on any response forks the conversation; each branch sees only its own ancestor path, so siblings never bleed into each other's context.
- Navigate branches — an inline
‹ n/m ›switcher flips between siblings in the thread, while Tree and Split views give a bird's-eye canvas of the whole conversation. Click any turn to jump to it, and rename, prune, or search across branches from there. - Per-branch scope — a branch can narrow the services/clusters it talks to; branches without an override inherit the nearest ancestor's. The composer and left rail always show the scope the next message will use.
- Branches run in parallel — start a new branch while another is still working (up to five at once, each finishing independently). Kick off a long investigation on one branch, fork off an earlier reply, and explore a different angle without waiting.
🔍 AI Inspector — time-range filter + two-week retention
The Inspector showed every trace it had ever recorded, unbounded. Now it's scoped and self-pruning.
- Time-range filter in the header scopes the Requests, Errors, and Tools lists — and the usage totals (requests / tokens / cost) — to Last hour, 24 hours, 7 days, or 14 days (default 24h). Hidden on the Sessions tab, which lists only active sessions.
- Two-week retention — older traces purge automatically (on launch, then every 6 hours), so the store can't grow without bound. Active agent sessions are always kept regardless of age. The longest filter window matches the retention cap.
🐛 Fixes
- Products settings — consistent card alignment. Product cards now stack in a single column at a comfortable max width, so every card aligns and expanding one only changes its height (no more ragged auto-fill grid where an expanded product looked far wider than its neighbours). Other sections keep the shared masonry grid.
- Service tab — collapsible left sidebar. A new toggle collapses the per-service rail from 180px to a 48px icon-only strip (with tooltips + the active-item highlight), giving the content area and AI panel more room. The choice persists across reloads (global across services).
- Code editor — centered markdown preview. The rendered preview is now horizontally centered in the pane at a comfortable reading width, instead of hugging the left edge with a wide empty gutter. Applies to both split and preview-only modes.
- Code editor — toggle the file tree. Show/hide the file explorer via a button at the start of the tab strip or ⌘B / Ctrl+B (VS Code parity), reclaiming its fixed 256px for the editor and preview. The choice persists across reloads.
Nexora v0.1.0
Nexora v0.1.0 release