Skip to content

Commit fc32ba9

Browse files
committed
Release v0.0.44
## What's New ### Features - **Kanban Board View** — New Kanban board view for managing workspaces - **Voice Input** — Voice dictation with OpenAI Whisper API - **Extensible Mention Providers** — Add custom mention providers for @ mentions - **Custom Hotkeys in Context Menus** — Your keyboard shortcuts now show in context menus ### Improvements & Fixes - **Kanban UI** — Smaller, centered columns for better layout - **Plan Indicator** — Removed PlanIcon from plan update status indicator - **Kanban Settings** — Hide Kanban hotkey in settings when feature is disabled
1 parent 8cda90d commit fc32ba9

52 files changed

Lines changed: 5787 additions & 80 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.env.example

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,8 @@ VITE_POSTHOG_HOST=https://us.i.posthog.com
3131
# API URL (optional - defaults to https://21st.dev)
3232
# Only change this if you're running the web app locally
3333
# MAIN_VITE_API_URL=http://localhost:3000
34+
35+
# Voice Input (optional - uses OpenAI Whisper API)
36+
# Set this to enable voice-to-text for users without a paid subscription
37+
# Get your API key at https://platform.openai.com/api-keys
38+
# MAIN_VITE_OPENAI_API_KEY=sk-...

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ By [21st.dev](https://21st.dev) team
2424
| **Custom Subagents** |||
2525
| **Subscription & API Key Support** |||
2626
| **Custom Models & Providers (BYOK)** |||
27+
| **Voice Input** | ✅ Hold-to-talk dictation ||
2728
| **Checkpointing** | 🚧 Beta ||
2829
| **Tool Approve** | 📋 Backlog ||
2930
| **Hooks** |||

build/entitlements.mac.plist

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
<true/>
1313
<key>com.apple.security.network.server</key>
1414
<true/>
15+
<key>com.apple.security.device.audio-input</key>
16+
<true/>
1517
</dict>
1618
</plist>
1719

package.json

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "21st-desktop",
3-
"version": "0.0.43",
3+
"version": "0.0.44",
44
"private": true,
55
"description": "1Code - UI for parallel work with AI agents",
66
"author": {
@@ -191,7 +191,10 @@
191191
"hardenedRuntime": true,
192192
"gatekeeperAssess": false,
193193
"entitlements": "build/entitlements.mac.plist",
194-
"entitlementsInherit": "build/entitlements.mac.plist"
194+
"entitlementsInherit": "build/entitlements.mac.plist",
195+
"extendInfo": {
196+
"NSMicrophoneUsageDescription": "1Code needs microphone access for voice dictation"
197+
}
195198
},
196199
"dmg": {
197200
"window": {

src/main/auth-manager.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,3 +277,25 @@ export class AuthManager {
277277
}
278278
}
279279
}
280+
281+
// Global singleton instance
282+
let authManagerInstance: AuthManager | null = null
283+
284+
/**
285+
* Initialize the global auth manager instance
286+
* Must be called once from main process initialization
287+
*/
288+
export function initAuthManager(isDev: boolean = false): AuthManager {
289+
if (!authManagerInstance) {
290+
authManagerInstance = new AuthManager(isDev)
291+
}
292+
return authManagerInstance
293+
}
294+
295+
/**
296+
* Get the global auth manager instance
297+
* Returns null if not initialized
298+
*/
299+
export function getAuthManager(): AuthManager | null {
300+
return authManagerInstance
301+
}

src/main/index.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { app, BrowserWindow, Menu, session } from "electron"
33
import { existsSync, readFileSync, readlinkSync, unlinkSync } from "fs"
44
import { createServer } from "http"
55
import { join } from "path"
6-
import { AuthManager } from "./auth-manager"
6+
import { AuthManager, initAuthManager, getAuthManager as getAuthManagerFromModule } from "./auth-manager"
77
import {
88
identify,
99
initAnalytics,
@@ -84,11 +84,12 @@ export function getAppUrl(): string {
8484
return process.env.ELECTRON_RENDERER_URL || "https://21st.dev/agents"
8585
}
8686

87-
// Auth manager singleton
87+
// Auth manager singleton (use the one from auth-manager module)
8888
let authManager: AuthManager
8989

9090
export function getAuthManager(): AuthManager {
91-
return authManager
91+
// First try to get from module, fallback to local variable for backwards compat
92+
return getAuthManagerFromModule() || authManager
9293
}
9394

9495
// Handle auth code from deep link (exported for IPC handlers)
@@ -802,8 +803,8 @@ if (gotTheLock) {
802803
// Build initial menu
803804
buildMenu()
804805

805-
// Initialize auth manager
806-
authManager = new AuthManager(!!process.env.ELECTRON_RENDERER_URL)
806+
// Initialize auth manager (uses singleton from auth-manager module)
807+
authManager = initAuthManager(!!process.env.ELECTRON_RENDERER_URL)
807808
console.log("[App] Auth manager initialized")
808809

809810
// Initialize analytics after auth manager so we can identify user

src/main/lib/trpc/routers/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { skillsRouter } from "./skills"
1313
import { agentsRouter } from "./agents"
1414
import { worktreeConfigRouter } from "./worktree-config"
1515
import { commandsRouter } from "./commands"
16+
import { voiceRouter } from "./voice"
1617
import { createGitRouter } from "../../git"
1718
import { BrowserWindow } from "electron"
1819

@@ -36,6 +37,7 @@ export function createAppRouter(getWindow: () => BrowserWindow | null) {
3637
agents: agentsRouter,
3738
worktreeConfig: worktreeConfigRouter,
3839
commands: commandsRouter,
40+
voice: voiceRouter,
3941
// Git operations - named "changes" to match Superset API
4042
changes: createGitRouter(),
4143
})

0 commit comments

Comments
 (0)