Skip to content

wsnh2022/Command-Center

Repository files navigation

Command-Center

Cover

A personal Windows desktop control center - every tool, URL, folder, script, and system command in one keyboard-driven hub.

Version Platform Status License

Repo Views Stars Downloads Last Commit


Overview

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"]
Loading

Home screen - pinned favorites and recent launches at a glance:

Home screen

Group page - cards and items, dark mode:

Group page

*The groups, cards, and items shown in these screenshots were put together to demonstrate the interface *


Features

Core Launcher

  • 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 .ps1
    Documents .pdf .docx .xlsx .pptx .txt .csv
    Media – Video .mp4 .mkv .avi .mov
    Media – Audio .mp3 .wav .flac .aac
    Images .jpg .png .gif .svg .webp
    Scripts .py .ps1 .js .sh .ahk
    Archives .zip .rar .7z .tar.gz
    Dev / 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+Space shows/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 with Enter, dismiss with Escape

Global search results

  • 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

Card and item drag reorder


Sidebar

  • 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)

Sidebar dividers and group icons


Home Screen

  • Pinned favorites - drag-reorderable; right-click any item → Pin to Home
  • Recent launches - auto-populated, last 20 items with relative timestamps and favicons

Item Form

  • 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 dir indicator
  • Notes and tags - 450-word note per item with word counter; unlimited tags (searchable via FTS5)

Item form - URL with favicon fetch

Item form - Command templates


Group Manager

  • 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

Group Manager - inline filter

Group Manager - bulk select and actions


Webview Popup

  • BrowserView-based popups - each item set to "Open in Webview" opens a standalone BrowserWindow with a BrowserView inside, 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; Enter navigates, Escape cancels
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 setAlwaysOnTop so the popup floats above all other windows
  • Protocol guard - will-navigate blocks file://, 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

Webview popup


Icon System

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

Icon picker - Library with color


Settings & Customization

  • Dark / light theme toggle
  • Font size (medium / large) and density (compact / comfortable)
  • Launch on startup, minimize to tray
  • Remappable global shortcut

Settings - appearance


Data & Privacy

  • 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

Performance & Scale

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.


Tech Stack

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

Architecture

Security Model

  • 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.ts before use

Key Design Decisions

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

Data Paths

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

Source Layout

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

Getting Started

Prerequisites

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-sqlite3 to compile the native SQLite binding against the installed Electron version.

Install

git clone https://github.com/wsnh2022/command-center.git
cd command-center
npm install

If better-sqlite3 fails to compile after install:

npm run rebuild

Development

npm run dev

Note: 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.

Production Build

npm run dist

Outputs 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 .exe and electron-builder will fail with EBUSY. Delete the release/ folder if it exists - Windows Defender may lock the previous build.


Keyboard Shortcuts

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.

Context Menus (right-click)

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

Roadmap

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

Contributing

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.


A note on how this was built

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.


Author

Built by wsnh2022 - Automation Engineer and Electron desktop developer based in India. Portfolio: wsnh2022.github.io


License

MIT — see LICENSE for details.

About

Personal Windows desktop control center - every tool, URL, folder, script, and system action in one keyboard-driven hub.

Resources

Stars

Watchers

Forks

Packages