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.
An IDE transformed text editors into developer workspaces. An IOUX transforms enterprise web apps into operator workspaces. Same paradigm shift — different domain.
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.
+ 3 more (dirty tracking, audit trail, collaboration). Read the full OpUX failure catalog →
<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.
Ctrl+K right nowThis 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.
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.
// 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 }
// 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
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).
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.
<!-- 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. -->
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 );
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} />; }
<!-- 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" />
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.
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.