v0.1.15 — Beta-feedback sweep
Released 2026-05-05. macOS Apple Silicon DMG signed + notarized; Windows + Linux build via CI on tag push. Install from codenow.pro/download .
This release is driven by a private-beta tester’s bug + UI/UX report. The headline: CodeNow now feels like a real IDE, not a notepad with tabs.
Editor essentials (P0 #1–3)
The Monaco editor was running with a near-default config. v0.1.15 enables:
- Auto-indentation on Enter inside blocks, JSX, function bodies.
- JSX tag auto-closing. Type
<div>and</div>is inserted. Works in.tsx,.jsx,.ts,.js. - Inline autocomplete with quick-suggestions while you type, plus parameter hints on
(, bracket-pair colorization, indent guides, auto-closing brackets and quotes, language-defined auto-surround. - TypeScript / JavaScript language service wired up with
JsxEmit.React, ESNext target, NodeJS module resolution. Standard built-in TS/JS IntelliSense now fires on the renderer side without an external LSP.
Auto-import for hooks (e.g., useState → import added to top of file) is deferred to v0.1.16 — that needs a full TypeScript Language Server integration which is multi-week work.
File tree (P0 #5, #6, #8)
- Right-click context menu on any file or folder row in the tree. For folders: New File / New Folder / Rename / Delete / Reveal in Finder. For files: Open / Rename / Delete / Reveal in Finder. Right-click on the empty area of the tree opens a root-level menu.
- + New file / + New folder icon buttons in the Files panel header — no more dropping out to the OS file manager or the terminal.
.env*and other dev dotfiles now visible by default..env.local,.gitignore,.editorconfig,.npmrc,.eslintrc*,.prettierrc*,.babelrc*,.stylelintrc*all show in the tree out of the box. A “Show hidden” toggle in the panel header reveals truly-hidden things;.git/,.DS_Store,.next/,.cache/, IDE folders stay filtered even with the toggle on.- Delete uses the trash, not unlink —
shell.trashItemso accidental deletes are recoverable. - Three new safe IPCs added:
rename-path,trash-path,reveal-in-finder.
Agent scaffolder (P0 #7, #9, #10)
A beta tester scaffolded a Google ADK agent and got: files dumped into the project root, the agent crashed with ValueError: No API keys provided, and the manifest claimed claude-opus-4-7 was the preferred model. All three fixed:
- Agents scaffold into a slug-named subfolder (
<projectPath>/<slug>/agent.py, etc.) instead of cluttering the project root. Recorder’s project-root anchor was updated to.codenow/agent-studio/so JSONL recordings still land in the right place. - Templates auto-load
.env.local. Python entrypoints getfrom dotenv import load_dotenv; load_dotenv('.env.local')andpython-dotenv>=1.0.0inrequirements.txt. TypeScript entrypoints getimport { config } from 'dotenv'; config({ path: '.env.local' })anddotenvinpackage.json. - Per-kit default
preferred_model— Google ADK →gemini-2.0-flash, Microsoft Agent Framework →gpt-4o, Claude SDK / Cursor SDK / Empty →claude-opus-4-7.
Build New Agent — smart kit detection (P0 #11, #12)
The kit picker now reads your BYOK state and recommends a kit you can actually run:
| Detected key | Recommended kit |
|---|---|
| Anthropic | Claude Agent SDK (TypeScript) |
| OpenAI / Azure | Microsoft Agent Framework (Python) |
| Google AI Studio | Google ADK (Python) |
| (none) | Claude SDK with an inline warning explaining you’ll need an Anthropic API key first |
Each kit card now shows whether the key it needs is set or missing (Key set: GOOGLE_API_KEY vs Needs ANTHROPIC_API_KEY). Nothing is disabled — pick whatever you want — but the friction is visible upfront instead of after a runtime failure.
The AGENT21_CLIENT_SECRET missing-secret message now includes the env-var snippet inline plus two help links: “How to get a secret” → wiki Requirements page, “What is Agent21?” → agent21.dev.
Migration Assistant rebuild (P1 #13)
The first-launch Migration Assistant was the loudest source of complaints: confusing item count, dead-end “N more need a quick check” line, items that look like buttons but aren’t, no progress indicator, no escape hatch.
Rewritten:
- Headline counts only importable-now items. SSH keys marked “already set” no longer inflate the number.
- “N need a quick check” is now clickable — expands an amber section listing each item with its specific reason (“VS Code: settings file is encrypted — open VS Code once to unlock”, etc.).
- “Already configured (N)” lives in a separate collapsed section below the actionable items, with a non-interactive grey checkmark instead of a button-styled green pill.
- Re-scan demoted to a ghost-style secondary, moved away from the primary CTA.
- Step 1 of 3 · Import progress strip replaces the “30-SECOND SETUP” badge.
- Skip for now text-button at the bottom-left lets you bail without re-prompting on next launch.
Claude Code tab — friendly empty state (P1 #16, #17)
Click the Claude Code tab without the CLI installed and you used to see zsh: command not found: claude. Now you see an install card with:
- Headline: “Claude Code CLI not installed”
- Copy-able install command:
curl -fsSL https://claude.ai/install.sh | sh - “Copy install command” button + “Re-check” button
- A note: “Requires a Claude Pro or Claude Max subscription. The free claude.ai tier does not work here.”
- Link to wiki Requirements page
When the CLI is detected for the first time, a one-time toast surfaces the Pro/Max requirement so you don’t get blindsided after install.
macOS application menu — File + Terminal (P1 #19)
The app menu now has the menus every other IDE has:
File
- New File ⌘N · New Folder ⌘⇧N · Open Project Folder… ⌘O
- Save ⌘S · Save All ⌘⌥S
- Close Tab ⌘W
Terminal
- New Terminal ⌃⇧` · Toggle Terminal Panel ⌘J
- Switch to Claude Code Tab ⌘⇧C
(Multi-pty terminal panes — opening a second shell — is queued for v0.1.16.)
Other UX (P1 #14, #15, #18, #20, #21, #22)
- “Read START_HERE.md first” button after agent scaffolding now actually opens the file in Monaco (was closing the modal and stranding the user).
- “Build your first agent in 60 seconds” hello-card disappears the moment the project has any agent. No more nagging for already-completed setup.
- Sidebar tooltips are now fast (300ms delay, custom CSS) instead of the slow ~2s native macOS tooltip on
title=. - Terminal panel resizes by drag — top edge handle, persisted height, 80px min / 70% of window max.
- Bottom panel hidden on boot by default; the pty is spawned lazily on first focus, not on app start. No more “empty terminal staring at you with nothing in it”.
- Live collab pill hidden when you’re alone. Was confusing — looked like someone else might be editing your code. Pill only appears when peerCount ≥ 1.
Welcome screen + IDE chrome
- + Create New Project button on the welcome screen alongside the existing Open Project Folder. Creates a fresh directory under
~/Documents(configurable) and adds it as a project — no need to drop out to Finder first. - Help & Wiki sidebar button at the bottom of the left sidebar — 1-click opens
wiki.codenow.proin your default browser. - Report bug item in the user-pill menu — opens a structured GitHub issue template at
codenow-wiki/issues/newso beta feedback lands with the right environment fields pre-filled. - Bottom status bar consolidation — Format · Format on save · Autofix on save now live behind a
⚙ Editorpopover so the bar isn’t a wall of toggles. Theme · Knowledge · Migrate · Share · Members stay visible. - IDLE pill fix — the debugger-state badge that read “IDLE” next to the Debug tab was missing a CSS hidden rule, so it was always visible. Now correctly hides when the debugger is idle and shows a colored RUNNING / STOPPED badge during active sessions.
- DevTools always dock to bottom.
Cmd+Opt+Inow opens the inspector docked beneath the editor (was floating detached or right-side, depending on your last session). Easier IDE-on-IDE debugging.
Slack first-class
The voice MVP was pulled in v0.1.10 in favor of “use Slack for huddles.” v0.1.15 makes that promise real:
- Auto-detect Slack desktop app on macOS (
/Applications/Slack.app+mdfindfallback), Windows (%LOCALAPPDATA%/slack/slack.exe), Linux (/snap/bin/slack,/usr/bin/slack). Detection is cached per session. - First-launch suggestion banner (one-time, dismissible): “Slack detected — connect for 1-click team handoff?”
- Topbar Slack pill showing the connected workspace name. Click opens Slack workspace home.
- Connect Slack workspace flow — paste workspace ID + optional default channel + optional user token. Token goes through
safeStorage(never plaintext in settings.json). - 1-click Open in Slack button (Slack’s official 4-square SVG mark) next to every CodeNow channel in the Members modal. When mapped to a Slack channel, opens
slack://channel?team=…&id=…in your local Slack app. When unmapped, prompts to set up a mapping. - Channel mapping —
settings.slackChannelMappersists per-channel mappings between CodeNow channels and Slack channels. The CodeNow channels and Slack channels are separate platforms with separate identities; the map creates a 1-click jump for handoffs. - “Send to Slack” on agent run output — posts a summary to the configured default channel via Slack Web API (when a token is configured) or falls back to a deep link with the summary copied to your clipboard.
Server-side /codenow slash commands + bidirectional channel sync are queued for v0.1.16.
Wiki support docs
- New
/wiki/requirementspage documents Pro/Max subscription requirements, Google ADK quota gotchas, and the kit→key matrix. - New “CodeNow channels vs. Slack channels” section explains the difference between project-scoped CodeNow chat (Supabase Realtime) and your Slack workspace channels.
- “Report issue ↗” link in the wiki Navbar + Footer.
.github/ISSUE_TEMPLATE/{bug_report,feature_request}.mdso users hit a structured form rather than a blank issue.- Homepage version prose bumped to v0.1.15.
Editor visual polish
- Modal padding pass. Migration Assistant / Build New Agent / Manifest Editor all gained breathing room —
.modal-contentpadding 0 → 24px / 28px sides,.iw-sectiongaps + section-to-section margins bumped, modal headers gain bottom-borders, modal buttons have amin-height: 32pxminimum. - Emojis → SVG icons. Section icons in the Migration Assistant and a few static markup spots (Claude lead-gen card, multi-apply toolbar) are now Lucide-style 16×16 strokes instead of emoji characters. Status indicators (✓, ✗, ▸, ▾) intentionally remain — they’re functional, not decoration.
- Manifest fields autofill.
Built Bynow pre-fills from your CodeNow profile (firstName + lastNamefromauth.json), and version defaults to0.1.0when blank. Non-destructive — won’t overwrite anything you’ve already set. - “No tools detected” friendlier copy. The terse “Add
@tooldecorators…” message is now multi-line help with examples for Python and TypeScript, and aLearn more →link to the agent-tools tutorial. - Google ADK quota warning on the Build New Agent kit card AND post-scaffold: Free tier is ~10 req/min, ~1500/day. Use Vertex AI or enable billing for real workloads.
Auto-import for React / Next.js / Node
- Naive auto-import on save. The previous editor was a notepad — type
useStateand you had to manually addimport { useState } from 'react'. Now: 47 of the most common identifiers auto-resolve their imports, get inserted at the top of the file (after'use client' / 'use server'directives + leading comments), and a status-bar toast tells you what was added. - Coverage: all 25 React hooks + lifecycle helpers (
useState,useEffect,useRef,useMemo,useCallback,useContext,useReducer,useTransition,useDeferredValue,useId,useSyncExternalStore,Fragment,Suspense,lazy,memo,forwardRef,createContext, …), Next.js navigation/server primitives (useRouter,usePathname,redirect,notFound,NextRequest,NextResponse,cookies,headers,revalidatePath,revalidateTag,unstable_cache,Image,Link), Node built-ins (path,fs,os,crypto,child_processnamed exports). - Honestly naive. No project-graph awareness, no re-export resolution, no same-name disambiguation. Skips locally-declared names and already-imported names. The full LSP-driven, project-aware version is queued for v0.1.16.
Embedded terminal — yellow-warning fix
The persistent “Native installation exists but ~/.local/bin is not in your PATH” Claude Code warning that fired every time the embedded terminal opened on a project where the user’s ~/.zshrc hardcoded PATH is gone. CodeNow now writes a ~/.codenow/zsh-shim/.zshrc + .zprofile that source the user’s real dotfiles and then re-prepend ~/.local/bin, /opt/homebrew/bin, /usr/local/bin to PATH. The pty spawns with ZDOTDIR pointed at the shim. Your real ~/.zshrc stays untouched.
Carried forward from v0.1.14
- Personalized invitations (First/Last name → “Hi Sarah,”)
- Consolidated Members modal (Members + Channels + Live coding session + Recent activity)
team_audit_log+ system messages on join/leave/remove- Trial users can invite (capped at 5 seats per project)
- Email FROM unified to
no-reply@codenow.pro - Stale-session banner removed
Known follow-ups (v0.1.16)
- JIRA first-class integration — sidebar with My tickets, transitions, comments, “Slack it on close” hook.
- “Slack it” — right-click code selection → send to Slack as a code block via Web API or deep link.
- Daily status compiler — 1-click “Send today’s status” that compiles git log + LOC + closed JIRA tickets into a Slack message.
- Slack invite Tier B — full OAuth +
chat.postMessagefor true 1-click invites (today’s “Share via Slack” copies the invite to your clipboard so you can paste in Slack). /codenowSlack slash commands + bidirectional channel sync — server-side Slack app atcodenow.pro/slack/install.- Auto-import via real TypeScript Language Server — replaces the naive 47-identifier table-based v0.1.15 implementation with project-aware imports.
- Multi-pane terminal — open a second shell side-by-side instead of cycling through tabs.
- Fork-replay path adjustment —
src/main.jsstill looks at project root foragent.py/agent.ts; needs to also scan<projectPath>/<slug>/since v0.1.15 scaffolders write into a slug subfolder. detect-agentsIPC — same root-only assumption as fork-replay; same fix.- In-app Slack channel naming badges — visual differentiation between CodeNow channels and Slack channels in the Members modal (the wiki Requirements page already explains the distinction).