The first IOUX · 19 modules · 150 tests · 0 dependencies

The IOUX for
enterprise web apps

An IOUX (Integrated Operational UX) is to application operators what an IDE is to developers. CtrlK integrates command palette, saved views, shareable view links, keyboard shortcuts, persistent selections, field navigation, macros, and undo into a single operational layer — on top of any existing enterprise app. No redesign required.

Get Started See It In Action
$ npm i @ctrlk/core Click to copy
19 modules
150 tests
125 KB min
0 deps
An IDE transformed text editors into developer workspaces. An IOUX transforms enterprise web apps into operator workspaces. Same paradigm shift — different domain.
— Introducing Operational UX (OpUX)
Why OpUX Matters

12 Operational UX failures every enterprise app shares

Traditional UX serves first-time and casual users. Operational UX (OpUX) serves the people who use your app 6 hours a day, every day, for years. Nobody designs for them. These 12 failures are why they escape to Excel.

#01
No horizontal navigation
150-column grids with only a scroll bar. No column search, no bookmarks, no jump-to.
8-16 min/day lost
#02
Column sets don't exist
Users manually hide/show columns every time they switch tasks. No named profiles.
5-15 min/day lost
#03
Pages organized by data, not task
Detail pages group fields by structure. Users think in tasks: "verify this eligibility."
10-20 min/day lost
#04
Primitive cell interaction
Double-click to edit, sometimes. No F2, no Tab-through, no commit-and-advance.
10-15 min/day lost
#05
Selection resets on page change
Select 5 rows on page 1, navigate to page 3 — selection gone. No persistent sets.
5-10 min/day lost
#06
Comparison requires memory
Compare row 12 with row 87? Remember it in your head. No pinning, no split view.
8-12 min/day lost
#07
Filters don't survive navigation
Apply 4 filters. Click a link. Hit Back. Filters gone. Rebuild. Every. Single. Time.
10-20 min/day lost
#08
Grid and detail page don't talk
Edit a record, return to grid — no indicator of what changed or what you reviewed.
5-10 min/day lost
#09
Export is the escape hatch
Every CSV export = "your app can't do what I need." Pivot, formula, freeze — Excel wins.
15-30 min/day lost

+ 3 more (dirty tracking, audit trail, collaboration). Read the full OpUX failure catalog →

The IOUX

19 modules. One <script> tag.

Like an IDE integrates editing, compiling, and debugging — an IOUX integrates commands, views, shortcuts, macros, and history into an operational workspace. CtrlK produces no visible elements by default. Your app controls appearance. CtrlK controls operability. Works with React, Angular, Vue, AG Grid, DevExtreme, Bootstrap, Tailwind, or none of them.

🔍
CommandPalette
Ctrl+K searchable command UI
Core
ShortcutEngine
Scope-aware keys + chord sequences
Core
📐
DensityController
Compact / comfortable / spacious
Core
🔄
AutoDiscovery
Drop-in: auto-register DOM elements
Core
💾
ViewStateManager
Named views, filter persistence
State
SelectionModel
Cross-page selections + set ops
State
📝
FieldRegistry
Jump-to-field, dirty tracking, pins
State
🔌
GridAdapter
Abstract interface for any grid
State
MacroEngine
Record, parameterize, replay
Power
HistoryManager
App-level undo/redo + branching
Power
🏷
ActiveFilterBar
Dismissible filter chips UI
Power
📊
@ctrlk/ag-grid
AG Grid adapter (v28-v31+)
Adapter
🔎
ColumnNavigator
Column search, bookmarks, groups
Nav
🎯
FocusNavigator
Spatial zone navigation (F6)
Nav
📋
SessionTracker
Visit/review/dirty + batch progress
Nav
@ctrlk/react
7 hooks + CtrlKProvider
Framework
🅰
@ctrlk/angular
Service + 4 directives
Framework
📦
EventBus + Registry
Foundation: events + commands
Core
🔗
ViewShare
Shareable view links + team views
State
Experience the IOUX

Press Ctrl+K right now

This website runs CtrlK. The command palette is live. Try searching for "density" or "navigate" — then execute a command. This is what your enterprise app gets with one script tag. This is IOUX.

ctrlk.dev — live on this page
Press Ctrl+K to open the command palette

Try: Ctrl+D to cycle density
Ctrl+/ to see all shortcuts

Every section of this site is a registered command. Navigate without scrolling.
New Paradigm

Share your view, not a screenshot

Enterprise apps are internal — there's no way to share what you're seeing. Today you screenshot it, losing all interactivity. Or you dictate a recipe: "go to loans, filter by healthcare, sort by spread, hide columns 3 through 47." CtrlK lets you share the exact view — filters, columns, sort, scroll position — as a link.

Tier 1 — URL Links (no server)JavaScript
// Share your exact view as a link
const link = ctrlk.share.createLink({
  name: 'Healthcare watchlist',
});
// → https://app.co/loans#ctrlk=eJxVj8...

// Paste in Slack. Colleague clicks.
// Their app restores your exact view:
//   same filters, columns, sort, scroll.
// Zero infrastructure needed.

// Preview without applying:
ctrlk.share.peekLink(url);
// → { name, sharedBy, hasGridState: true }
Tier 2 — Team Views (stored)JavaScript
// Publish to team — appears in Ctrl+K
await ctrlk.share.publish(
  'Monday Surveillance',
  { scope: 'team' }
);

// Team members see it in the palette:
//   "Monday Surveillance — shared by Alice"

// Load a team view
await ctrlk.share.load(viewId);

// Usage tracking built in
// → "Used 47 times by 5 team members"

// Tier 3 (Enterprise): Live sharing
ctrlk.share.startBroadcast();
// Others follow your view in real-time
See It Work

5 live demos, 4 frameworks, 2 grid libraries

Each demo is a self-contained application running CtrlK. Open any of them and press Ctrl+K. Every demo has column search (Ctrl+G), density control (Ctrl+D), and shareable view links (Ctrl+Shift+S).

👥
HR Employee Directory
Vanilla JS · 25 columns · Column profiles, bookmarks, Ctrl+G horizontal jump
Demo 1
🎧
Support Ticket Queue
React 18 · Batch review with progress bar, Alt+N workflow, smart views
Demo 2
🏥
Patient Record
Vue 3 · Field search, dirty tracking, pre-save diff, field pinning
Demo 3
📦
Inventory (AG Grid)
AG Grid v31 · Saved views with Ctrl+1-5, column chooser, LRU eviction
Demo 4A
📦
Inventory (DevExtreme)
Same app, different grid — proves the adapter abstraction
Demo 4B
📖
Implementation Guide
Step-by-step developer instructions for all 5 demos
Guide
The OpUX Gap

Why they always go back to Excel

Without IOUX

Mouse-first interaction
Views are URLs, not saved states
No way to share what you're looking at
Selection resets on navigation
Undo limited to form fields
Fixed information density
Zero automation support
Every workflow is manual, every time
vs

With IOUX (CtrlK)

Keyboard-first, mouse fallback
Named views: columns + filters + scroll
Shareable view links — paste in Slack
Persistent cross-page selections
App-level undo with branching
User-controlled density
Record and replay macros
Build once, invoke forever
Add the IOUX Layer

Three integration patterns

Start with Pattern A in 30 seconds — drop in the script, get a command palette immediately. Evolve to Pattern C over months with framework-native hooks and directives. No migration, no rewrite — each pattern extends the previous.

Pattern A — Drop-In (30 seconds)HTML
<!-- Add to any page. Zero config. -->
<script src="ctrlk.runtime.js"></script>

<!-- Ctrl+K now opens command palette.
     All buttons auto-discovered.
     Density control active. -->
Pattern B — DeclarativeJavaScript
import ctrlk from 'ctrlk';

ctrlk.commands.register({
  id: 'filter.failed',
  title: 'Show Failed Only',
  shortcut: 'Alt+F',
  execute: () => setFilter('failed'),
});

// Save complete app state as a named view
ctrlk.views.save('Monday Surveillance');

// Select by expression — no clicks
ctrlk.selection.where(
  row => row.spread > 500
);
Pattern C — React HooksReact
import { useCtrlkCommand, useCtrlkView }
  from '@ctrlk/react';

function SurveillanceGrid() {
  useCtrlkCommand({
    id: 'grid.refresh',
    title: 'Refresh Data',
    shortcut: 'Ctrl+R',
    execute: () => fetchData(),
    undo: (prev) => setData(prev),
  });

  const [filters, setFilters] =
    useCtrlkView('grid.filters', {});

  return <Grid filters={filters} />;
}
Pattern C — Angular DirectivesAngular
<!-- Register commands from templates -->
<button
  ctrlkCommand="export.csv"
  ctrlkCommandTitle="Export CSV"
  ctrlkCommandShortcut="Ctrl+Shift+E"
  (click)="exportCsv()">
  Export
</button>

<!-- Register fields for jump-to -->
<input
  ctrlkField="patient.name"
  ctrlkFieldLabel="Patient Name"
  ctrlkFieldSection="Demographics"
  [(ngModel)]="patient.name" />
IOUX Ecosystem

Works with your stack

An IOUX is a behavioral layer — it sits between your CSS framework and your application logic. It doesn't replace your grid library, your component framework, or your design system. It makes them all operable.

React
7 hooks + Provider
🅰
Angular
Service + directives
💚
Vue
Composables (coming)
📊
AG Grid
Full adapter v28-31+
📋
DevExtreme
Full adapter v21+
📈
Kendo
Adapter (coming)
🎨
Bootstrap
Compatible
🎯
Material
Compatible
🌊
Tailwind
Compatible
The enterprise software industry spends billions building applications that their most valuable users escape from — into Excel. This is not a feature gap. It is a missing architectural layer. An IDE solved this for developers. An IOUX solves it for everyone else.