A personal Windows desktop control center - every tool, URL, folder, script, and system command in one keyboard-driven hub.
Command-Center eliminates the fragmentation of scattered bookmarks, pinned apps, folder shortcuts, and scripts by consolidating every tool into one always-available desktop hub. A remappable global shortcut - Ctrl+Shift+Space - brings it to the foreground from any application; find what you need, launch it, and get back to work.
Items are organized hierarchically: Groups represent working domains (e.g. AutoHotkey, N8N, Data Analytics), Cards are thematic collections within a group, and Items are the launchable entries inside each card. Every item type - URL, software, folder, terminal command, or Windows system action - is first-class.
Item hierarchy:
graph TD
KS["⌨ Ctrl+Shift+Space"] --> CC["Command-Center"]
CC --> HOME["Home - Favorites · Recents"]
CC --> GRP["Group (e.g. Daily Routine)"]
GRP --> CARD["Card (e.g. Dev Tools)"]
CARD --> I1["URL"]
CARD --> I2["File"]
CARD --> I3["Folder"]
CARD --> I4["Command"]
Home screen - pinned favorites and recent launches at a glance:
Group page - cards and items, dark mode:
*The groups, cards, and items shown in these screenshots were put together to demonstrate the interface *
-
4 item types - URL, File, Folder, and Command (terminal with args + working directory)
File launches any file with an OS default handler:
Category File Types Executables .exe.bat.cmd.msi.ps1Documents .pdf.docx.xlsx.pptx.txt.csvMedia – Video .mp4.mkv.avi.movMedia – Audio .mp3.wav.flac.aacImages .jpg.png.gif.svg.webpScripts .py.ps1.js.sh.ahkArchives .zip.rar.7z.tar.gzDev / Config .json.yaml.env.xml.ini -
System actions via Command - lock screen, sleep, calculator, and other Windows system actions are set up as Command items using the Quick Templates system (11 categories, 57 built-in templates)
-
Global shortcut -
Ctrl+Shift+Spaceshows/hides the window from any app (remappable in Settings → Shortcuts) -
System tray - closing the window hides to tray; the process stays alive and reachable at all times. Right-click the tray icon for quick access to Show/Hide, Launch at Startup toggle, Reload, and Quit
-
Fuzzy search - searches item labels, paths, and tags via Fuse.js; full-text note search via SQLite FTS5. Results grouped by group → card; keyboard navigate with
↑/↓, launch withEnter, dismiss withEscape
- Drag-to-reorder items - drag items within a card to reorder them; drag across cards in the same group to move them. A grip handle slides in on hover (left of the icon). Sort order persisted to the database on drop
- Drag-to-reorder cards - drag cards within a group to reorganize their layout. A grip handle appears on hover in the card header. Card order persisted to the database on drop
- Group navigation - drag-reorderable group pills with per-group accent color and custom icon
- Custom section dividers - right-click any group pill → Insert divider after to add a named
── LABEL ──separator line between groups. Dividers are drag-reorderable alongside groups, and right-click a divider to rename or delete it. Useful for splitting a long group list into logical sections (e.g. Work, Personal, Tools)
- Pinned favorites - drag-reorderable; right-click any item → Pin to Home
- Recent launches - auto-populated, last 20 items with relative timestamps and favicons
- Horizontal type selector - URL / Open File / Folder / Command displayed as a compact pill tab row; active type highlighted with accent fill
- Quick Templates - 11 template categories (Shells, Dev Server, Git, Packages, System, Network, Docker, Python, Node, Ports, SSH) with 57 built-in templates; one click fills all three command fields instantly. Templates that require a working directory show a
set dirindicator - Notes and tags - 450-word note per item with word counter; unlimited tags (searchable via FTS5)
- Inline filter - real-time search across group names, card names, item labels, and paths; matching groups auto-expand and card panels auto-open
- Expand / Collapse all - single-click to expand or collapse all groups; separate button to open or close all item panels simultaneously
- Undo - a 5-second toast with a countdown bar appears after every bulk delete or bulk move; one click reverses the operation completely
- Empty group badge - groups with no cards display a quiet "Empty" pill so dead-weight entries are instantly visible without expanding
- Item counts in move dropdown - the "Move items to card" dropdown shows the current item count next to each card name
- BrowserView-based popups - each item set to "Open in Webview" opens a standalone
BrowserWindowwith aBrowserViewinside, giving websites their own isolated Chromium renderer process separate from the main app - One popup per URL - opening the same URL focuses the existing popup instead of spawning a duplicate
- Up to 5 concurrent popups - opening a sixth reuses the oldest popup window (each popup uses ~80–200 MB RAM)
- Session isolation - all popups share a single persistent partition (
persist:webview) with its own cookies, localStorage, and cache, fully separated from the main app session. Sign in to a site once and stay signed in across popup sessions - Editable URL bar - shows the page title while idle; click to see and edit the raw URL;
Enternavigates,Escapecancels
More webview details
- Right-click context menu - back, forward, reload, and open in default browser; back/forward are disabled when unavailable, evaluated at click time for accuracy
- Eject to browser - opens the current URL in the default system browser and closes the popup
- Always-on-top pin - toggles
setAlwaysOnTopso the popup floats above all other windows - Protocol guard -
will-navigateblocksfile://,javascript:,data:, and any other non-HTTP/HTTPS navigation in the BrowserView - Task Manager friendly - window title format
"Page Title - hostname"makes it easy to match a popup to its RAM entry in Windows Task Manager - CPU savings - frame rate drops to 1 fps while minimized, returns to 60 fps on restore
Four input methods per item, all resolved to a local file at runtime - no network calls at launch:
| Method | Icon source | Description |
|---|---|---|
| Auto / Favicon | auto / favicon |
Fetches and caches the site favicon for URL items |
| Auto - fetch by URL | favicon |
Type any URL in the Auto tab to fetch its favicon directly via favicon.vemetric.com |
| Emoji | emoji |
650+ Unicode emoji with keyword search and grid picker |
| Library | library |
1,460 Lucide icons with a per-item custom hex color |
| File - upload | custom |
Local image picked from disk |
| File - URL | url-icon |
Remote image URL downloaded and cached locally |
| File - base64 | b64-icon |
Base64 string pasted directly; decoded and saved as file |
| File - favicon | favicon |
Type any URL in the File tab to fetch and save its favicon locally |
- Dark / light theme toggle
- Font size (medium / large) and density (compact / comfortable)
- Launch on startup, minimize to tray
- Remappable global shortcut
- 100% local - all data in
%APPDATA%\Command-Center\; no cloud, no telemetry, no accounts - Auto-backup - snapshot on every write, rolling 10 kept; full export/import via
.zip - Item notes + tags - each item supports a 450-word note and unlimited tags, all FTS5-searchable
Items load per-card and cards load per-group - only the active group is ever in the DOM, regardless of total DB size. The practical ceilings for smooth operation are:
| Dimension | Smooth ceiling | Notes |
|---|---|---|
| Total items in DB | ~5,000 | SQLite + Fuse.js index; no degradation until ~20,000 |
| Groups in sidebar | ~50 | Pills render all at once; 100+ starts to feel sluggish |
| Cards per group | ~20 | All cards in active group render simultaneously |
| Items per card | ~50 | No virtual scroll; 100+ items in one card becomes heavy |
A typical heavy setup - 20 groups × 8 cards × 30 items = 4,800 items - runs without any noticeable overhead.
| Library | Version | Role |
|---|---|---|
| Electron | 30 | Desktop shell, BrowserWindow, BrowserView, IPC |
| React | 18 | UI framework |
| TypeScript | 5 | Type safety throughout (strict mode) |
| Vite + electron-vite | 5 / 2 | Build tooling, HMR |
| Tailwind CSS | 3 | Styling via design tokens |
| better-sqlite3 | 9 | Local SQLite database, WAL mode |
| Fuse.js | 7 | Client-side fuzzy search |
| @dnd-kit | 6 / 8 | Drag-and-drop reordering |
| lucide-react | 0.378 | 1,460 icons, loaded on demand |
| jszip | 3 | Export / import ZIP archives |
contextIsolation: true,nodeIntegration: false- renderer has no direct Node.js access- All system calls route through typed IPC channels defined in
electron/preload.ts - All IPC inputs are sanitized via
electron/utils/sanitize.tsbefore use
| Decision | Rationale |
|---|---|
| SQLite over JSON | Queryable, crash-safe, FTS5 full-text search |
BrowserView over <webview> |
Own process, non-blocking, stable API |
| State-based routing | No react-router needed in a single-window app |
| Dynamic Lucide loading | Barrel import excluded from Vite pre-bundle; icons loaded individually to avoid ~1 MB startup overhead |
| Auto-backup on every write | Never lose more than one operation |
| Custom asset protocol | command-center-asset:// maps to %APPDATA%\Command-Center\ with path traversal protection |
| Mixed flat DndContext for sidebar | Groups and dividers share one DndContext so dividers drag alongside groups without breaking sort order |
| Single DndContext for card grid | Cards and items share one DndContext in CardGrid; data.type='card' discriminates card drags from item drags so both reorder paths coexist without conflict |
| Path | Contents |
|---|---|
%APPDATA%\Command-Center\command-center.db |
Main SQLite database |
%APPDATA%\Command-Center\backups\ |
Auto-backup snapshots (rolling 10) |
%APPDATA%\Command-Center\assets\icons\ |
Uploaded and URL-fetched icons |
%APPDATA%\Command-Center\assets\favicons\ |
Cached favicons |
src/
├── components/
│ ├── cards/ # Card grid and card header
│ ├── groups/ # Group pills, color picker, icon picker
│ ├── items/ # Item rows, form panel, icon picker, context menu
│ ├── layout/ # AppShell, TopBar, Sidebar, WebviewPanel, SearchResults
│ └── ui/ # Shared primitives (ConfirmDialog, UndoToast)
├── context/ # FavoritesContext, SettingsContext, ThemeContext
├── hooks/ # useCards, useGroups, useItems, useSearch, useRecents, useWebview
├── pages/ # HomePage, GroupPage, GroupManagerPage, SettingsPage, …
├── types/ # Shared TypeScript interfaces (Item, Group, Card, AppSettings, …)
└── utils/ # ipc.ts, lucide-registry.ts
| Requirement | Version |
|---|---|
| Windows | 10 or 11 (x64) |
| Node.js | v18+ (v22 recommended) |
| Visual Studio Build Tools | 2022 with Desktop development with C++ workload (download) |
Visual Studio Build Tools are required by
better-sqlite3to compile the native SQLite binding against the installed Electron version.
git clone https://github.com/wsnh2022/command-center.git
cd command-center
npm installIf better-sqlite3 fails to compile after install:
npm run rebuildnpm run devNote: If icons appear broken on first launch, stop the dev server and restart. The
command-center-asset://protocol registers at app startup and cannot be hot-reloaded mid-session.
npm run distOutputs to release/:
| File | Description |
|---|---|
Command-Center Setup 0.1.0-beta.exe |
NSIS installer (~86 MB, includes Electron runtime) |
Command-Center 0.1.0-beta.exe |
Portable executable (no install required) |
win-unpacked/ |
Unpacked build directory |
Quit the app from the system tray before running
npm run dist. An open process holds a file lock on the.exeand electron-builder will fail withEBUSY. Delete therelease/folder if it exists - Windows Defender may lock the previous build.
| Shortcut | Action |
|---|---|
Ctrl+Shift+Space |
Show / hide window (global - works from any app) |
Ctrl+S |
Focus search bar from anywhere in the window; selects existing text so you can type immediately |
↑ / ↓ |
Navigate search results |
Enter |
Launch selected search result |
Escape |
Close search overlay / dismiss modals |
The global shortcut is remappable in Settings → Shortcuts.
| Target | Actions available |
|---|---|
| Any item row | Open in Webview, Pin / Unpin, Select, Edit, Copy path, Move to card, Delete |
| Webview popup content area | Back, Forward, Reload, Open in browser |
| Group pill in sidebar | Rename / Edit, Delete, Insert divider after |
| Custom sidebar divider | Rename, Delete |
| System tray icon | Show / Hide window, Launch at Startup (checkbox), Reload, Quit |
v0.1.0-beta - feature-complete for daily use.
| Feature | Status |
|---|---|
| Core launcher (URL, File, Folder, Command) | ✅ Shipped |
| Global shortcut, system tray, minimize to tray | ✅ Shipped |
| Fuzzy search (Fuse.js) + full-text note search (FTS5) | ✅ Shipped |
| Favorites + recents home screen | ✅ Shipped |
| Icon system (emoji, library, custom, favicon, base64) | ✅ Shipped |
| Drag-to-reorder items within and across cards | ✅ Shipped |
| Drag-to-reorder cards within a group | ✅ Shipped |
| Sidebar custom dividers with drag reorder | ✅ Shipped |
| Group Manager (inline filter, bulk actions, undo) | ✅ Shipped |
| Webview popup (BrowserView, session isolation, eject, pin) | ✅ Shipped |
| Import / Export (ZIP archive) + rolling auto-backup | ✅ Shipped |
| Global shortcut remapping | ✅ Shipped |
Issues and PRs are welcome. Please open an issue first to discuss significant changes. For bug reports, include your Windows version, Node.js version, and steps to reproduce.
Built with AI assistance (Claude Code). The AI was a fast executor. Every decision, judgment, and direction came from the human behind it.
Read more
AI can write code. What it cannot do is think for you. Every decision, every time a feature felt wrong, every fix that broke something three layers away - that took a human. The AI was a fast executor. The judgment of what to build, why it should work a certain way, and when something was subtly off - none of that was automated. What changed was the speed of execution, not the need for judgment.
I've been running Command-Center as my daily driver for the past week. One keyboard shortcut, one window - every tool, URL, script, and workflow across both my personal and professional life, organised exactly the way I think about them. It is the bird's-eye view I always wanted and never found in an existing app. Building it was the hard part. Using it has been the payoff.
Weeks of iteration went into this - not just writing code, but rethinking decisions, absorbing edge cases, and building something worth daily use.
Built by wsnh2022 - Automation Engineer and Electron desktop developer based in India. Portfolio: wsnh2022.github.io
MIT — see LICENSE for details.










