The slowest thing in most operations software is not the database. It is a person clicking through four menu levels because they cannot remember whether a serial number belongs to an asset or an item. Press the key, type three characters, and the answer arrives grouped by what kind of thing it is.
⌘+K· or ·Ctrl+K
Command paletteEsc to close
latitude
Assets
Dell Latitude 5440 — LAP-001 SN12345 · G. Wanjiku
Dell Latitude 7420 — LAP-018 SN87901 · available
Items
Dell Latitude charger, 65W SKU-2210 · 14 on hand
POs
PO-2026-0912 — 5 × Dell Latitude 5440 Sanlam Hardware · received
Employees
Assigned laptops — Latitude custody list 4 employees
Nobody's question comes with a module attached to it.
Somebody walks up holding a serial number. It could be an asset. It could be an inventory item with a barcode. It might appear on a purchase order line, or in a quotation the supplier sent, or on a helpdesk ticket where a user complained about it. In a system organised by module, the person has to guess which one before they can ask — and a wrong guess costs three clicks and a moment of feeling stupid.
A single search that crosses record types removes the guess. You type the thing you know, and the system tells you which kinds of record it belongs to. That is the entire value proposition, and it is worth more in practice than most features that take ten times longer to build.
Mode one — find a record
Type two characters and it starts searching.
Below two characters, the palette shows destinations instead — because a one-letter search returns everything, which is the same as returning nothing. From the second character it queries live, debounced, and swaps the destination list for grouped results.
Results arrive grouped by record type with an icon per group, so the shape of the answer is visible before you read a word of it.
Each row carries a subtitle — the identifier, the status, the counterparty — so two similarly named records are distinguishable without opening either.
Arrow keys walk the results, Enter opens, Escape closes. The mouse is optional throughout.
A “view all results” row carries the same query to the full search page, five per group in the palette and ten per group on the page.
Mode two — go somewhere
Empty, it is an index of the product.
Open the palette without typing and you get the destination list: every significant screen in the product, grouped the way the sidebar is grouped, filtered to what your role can actually open. It is the fastest route to a page whose name you know and whose location you do not.
Sections mirror the sidebar — Overview, Operations, Inventory, Assets, Procurement, Sales, Accounting and the rest — so the palette reads as a map rather than a pile of links.
Every entry carries the same permission its route carries. A user without accounting never sees Journal Entries, rather than seeing it and bouncing off a 403.
A handful of entries are actions rather than destinations. Light and dark theme sits at the top of the list, above the links, because it acts and leaves you where you are.
The theme switch deliberately does not close the panel — the panel is itself themed, so you can flip it twice and watch the difference.
Sixteen groups, one query
What actually gets searched, and what each row tells you.
Not a marketing round number. This is the list, and it includes the two groups people are always surprised by: settings pages and connector pages, because “where do I turn off the emails” is a search query as much as a vendor name is.
Itemsname, barcode → item detailAssetsasset code, name, barcode, serial → asset recordVendorsname, company, email → vendor fileSuppliersprequalification applications by applicantCustomerscompany, contact name, email → customer 360Invoicesnumber, customer, amount → invoicePurchase ordersPO number, vendor → order and receiptsRFQstitle, reference → RFQ and responsesQuotationsreference, vendor → quotation comparisonExpensesdescription, category, reference → claimEmployeesname, employee number, job title → recordProjectsname, code → project workspaceTaskstitle, project → task detailTicketssubject, requester, reference → ticket threadSettings pagesthe settings screen itself, by name or aliasConnectorsintegration pages — Slack, QuickBooks, M-Pesa
The two settings groups are the sleeper feature. The single most common support question in any operations product is a variant of “where is the setting for…”, and the answer is almost never the word the person searched for. So settings pages carry aliases: search 2fa and you reach the security policy; search too many emails and you reach notification preferences; search cost center and you reach departments. The same word-start match rule is implemented on the server, in the browser and in the mobile app, so a settings page is findable identically on all three.
Why the list is different for everybody
A shortcut to a page you cannot open is not a shortcut. It is a small daily insult.
Before the destination list was a registry, it was a flat block of links shown to everybody. A storekeeper opened the palette, saw Journal Entries and Chart of Accounts, pressed Enter, and got a permission error. That happens once and the person stops trusting the palette. Now every entry declares the permission its route declares, and the list is built per user.
Operations manager32 entries
Dashboard
Approvals Hub
Ops Control Tower
Items
Inventory Adjustments
Stock Transfers
Assets
Asset Pool Movements
Asset Custodians
Procurement Requests
Purchase Orders
Vendors
Journal Entries
Chart of Accounts
General Ledger
Budgets
Holds inventory, assets, procurement and accounting permissions, so the whole list is reachable and every Enter opens something.
Storekeeper9 entries
Dashboard
Approvals Hub
Ops Control Tower
Items
Inventory Adjustments
Stock Transfers
Assets
Asset Pool Movements
Asset Custodians
Procurement Requests
Purchase Orders
Vendors
Journal Entries
Chart of Accounts
General Ledger
Budgets
Same palette, same keystroke, seven fewer rows. Nothing greyed out and nothing to bounce off — the entries simply are not there.
The same principle governs the search half, and it is a stronger guarantee: every query is scoped to the signed-in user's workspace in the query itself, not filtered afterwards. With no workspace and no query there is nothing to search and the result is empty groups rather than a leak, which is the correct failure direction for a feature that touches sixteen tables at once.
The destination list
An index of the product, in the order the product is organised.
Places to go, not things to do. Actions — raising a request, opening a modal, starting a count — live in the quick-action machinery beside it rather than being mixed into a list of pages, because a list where half the rows navigate and half of them fire is a list nobody can predict.
Overview
Dashboard
Reports
Awra Insights
Settings
Operations
Approvals Hub
Ops Control Tower
Alerts
Anomalies
Scan & Act
Inventory
Items
Inventory Adjustments
Inventory Counts
Inventory Traceability
Stock Transfers
Warehouses & Locations
Assets
Assets
Asset Movements
Asset Pool Movements
Asset Custodians
Asset Scan
Asset Reports
Procurement
Procurement Requests
RFQs
Quotations
Purchase Orders
Vendors
Supplier Performance
Strategic Sourcing
Supplier Prequalification
Sales
POS
Customers
Customer Invoices
Credit Notes
Payments Register
Accounting
Journal Entries
Expenses
Budgets
Chart of Accounts
General Ledger
Appearance
Light theme
Dark theme
Follow system
Appearance is at the top of the real list rather than the bottom, and it is the one section that is not a set of destinations. That placement is deliberate: it is the only entry somebody opens the palette specifically to use twice in a row.
The whole keymap
Four keys. There is no fifth thing to learn.
A palette with twelve shortcuts is a palette nobody uses, because remembering the shortcuts is the same problem as remembering the menu. This one has four, the modifier is correct on both platforms without a setting, and every other route into it is a click.
Keys
What happens
⌘K
Opens the palette from anywhere in the product, with the field focused and empty. On Windows and Linux the same chord is Ctrl+K — the platform is detected rather than configured, so nobody has to find a keyboard setting.
Esc
Closes it, from any state, including mid-search. The same key closes it whether you are looking at destinations or results, which is the point of having one escape.
↑↓
Walks whichever list is currently showing. Section headings are skipped, so arrowing down never lands on a title you cannot open, and the active row scrolls itself into view rather than disappearing off the bottom.
↵
Opens the highlighted row. On a search result that is the record; on a destination that is the page; on the theme entries it applies the theme and leaves the palette open.
There is also a visible trigger in the topbar showing the chord, for the substantial number of people who will never learn a keyboard shortcut and should not have to. The palette is not a power-user secret; it is the primary navigation for anybody who wants it to be.
One implementation detail worth stating
Search results are markup built from your data, which is exactly where injection lives.
A palette result row is assembled in the browser from values that arrived over the network — a vendor name, an item description, somebody's typed reference. The server-side template engine never touches it, so the escaping the rest of the product gets for free does not apply here. This is the single most common place a web application gets this wrong.
Every interpolated value in the palette's result renderer — the title, the subtitle, the icon class and the destination URL — goes through one shared escaper, defined once and loaded from the head of every layout. Not a copy per page: there were nine copies of that function in this codebase before they were consolidated, and two of them declared the same global name, which is a syntax error that silently discards the entire script block it appears in. Consolidating it is the reason the palette and every modal on the page cannot take each other down.
This is fast lookup, not a search engine. The difference matters.
Search is the feature people most often oversell, because a demo with three records looks identical to a demo with three hundred thousand. Here is what this actually is.
Global search & palette — what is real
What AWRA OpsHub does today
Sixteen record groups in one query — items, assets, vendors, supplier prequalification applications, customers, invoices, purchase orders, RFQs, quotations, expenses, employees, projects, tasks, tickets, settings pages and connector pages.
Every query scoped to the workspace inside the query itself, not filtered after the fact, with an empty result rather than a broad one when there is no workspace context.
A permission-filtered destination list built per user from a registry where each entry declares the same permission its route declares, so nobody is offered a page they cannot open.
Results grouped by record type with a per-row subtitle — identifier, status or counterparty — so near-identical names are distinguishable without opening either.
Full keyboard operation: the platform-correct modifier chord to open, arrows that skip section headings, Enter to open, Escape to close, and an active row that scrolls itself into view.
A two-character threshold with a debounced live query, so a single keystroke does not fire a sixteen-table search.
Searchable settings pages with alias terms — 2fa, cost center, too many emails — matched by the same word-start rule on the server, in the browser and in the mobile app.
Theme switching from the palette, placed above the destinations and deliberately not closing the panel, because it is the one entry people use twice in a row.
A visible topbar trigger showing the chord, so the palette is available to people who will never learn a shortcut.
One shared HTML escaper applied to every interpolated value in the result renderer, including the destination URL and the icon class.
More we can add to your workspace
Full-text search over document bodies and attachments — the text inside an uploaded invoice PDF, a scanned delivery note or a long ticket thread, with the indexing pipeline that requires.
Fuzzy and phonetic matching, so a misspelled vendor name or a transposed serial number still finds its record.
Dedicated search infrastructure — an external index for very large datasets, with the operational commitments that come with running one.
Query syntax inside the palette — filters, field prefixes and date ranges typed as text rather than chosen on a filter screen.
Recent and frequent results surfaced first, learned from what you personally open rather than ordered by record type.
Actions executable from the palette itself — creating a request or starting a count without navigating to the screen first.
Saved searches promoted into the palette, so a filter you use every morning is two characters away.
A configurable keymap, for the people who want the chord on a different key.
Where we point you to a specialist
We will not show a destination somebody cannot reach. It is left out of the list entirely, rather than greyed out or shown behind a lock icon. A shortcut that produces a permission error teaches people to stop using the shortcut, and the second time is the one that matters.
We will not widen the workspace scope for a demo, an export or a support case. Cross-workspace search is not a setting we ship, because a search feature that reaches sixteen tables at once is precisely where that would be hardest to notice going wrong.
We will not describe this as a search engine. It is indexed lookup over structured fields, tuned to answer “where is this record” in a few hundred milliseconds. If your requirement is relevance ranking over unstructured text, say so and we will scope it honestly rather than let the demo imply it.
We will not build markup from your data without escaping it. There is one escaper in this codebase and it is loaded from the head of every layout. A page that defines its own is a defect, and it is gated in the build rather than left to review.
Full-text search inside stored documents is the most-requested item in that middle column and the most honest one to scope, because the cost is the indexing pipeline rather than the search box. Tell us which document types your team actually hunts through and we will come back with a written spec, a timeline and a price.
What sits beside it
Finding a record is half of it. The other half is doing something with it.
This is the least glamorous feature in the product and the one experienced users notice within an hour. It does not change what the system can do. It changes how long it takes to get to it, on every single task, for everybody, forever.
Type the serial number. The system says which record types it belongs to.
New starters find things
A person on day two can reach any screen they have permission for without learning the menu tree.
Settings stop being a support ticket
Search 2fa, or cost center, or too many emails, and land on the right screen.
Nobody hits a permission wall
The destination list is built from your own role, so every Enter opens something.
Hands stay on the keyboard
Four keys, both platforms, and a visible trigger for the people who prefer the mouse.
One search box, sixteen answers
The question does not have to be sorted into a module before it can be asked.
Frequently asked questions
What does the command palette actually search?
Sixteen groups in one query: inventory items, assets, vendors, supplier prequalification applications, customers, customer invoices, purchase orders, RFQs, quotations, expenses, employees, projects, tasks, helpdesk tickets, settings pages and connector pages. Results come back grouped by record type with an icon per group and a subtitle per row — the identifier, the status or the counterparty — so two similarly named records can be told apart without opening either. The palette shows five per group; the full search page shows ten.
How do I open it?
Command+K on a Mac, Control+K on Windows or Linux. The platform is detected rather than configured, so there is nothing to set up. Escape closes it from any state. There is also a visible trigger in the topbar showing the chord, because a substantial number of people will never learn a keyboard shortcut and should not have to — the palette is intended as primary navigation for anybody who wants it, not a power-user secret.
What happens if I open it and do not type anything?
You get the destination list: an index of the product, grouped the way the sidebar is grouped — Overview, Operations, Inventory, Assets, Procurement, Sales, Accounting and so on. It is the fastest route to a page whose name you know and whose location you do not. Searching begins at the second character; below that the palette keeps showing destinations, because a one-character query returns everything, which is the same as returning nothing.
Does everyone see the same list of destinations?
No, and this is deliberate. Every entry in the destination registry declares the same permission its underlying route declares, and the list is built per user. A storekeeper does not see Journal Entries greyed out or behind a lock icon — it is simply absent. Before this was a registry it was a flat block of links shown to everybody, so people pressed Enter and got permission errors, and a shortcut that produces an error is a shortcut people stop using.
Can search results from another organisation leak into mine?
No. Every one of the sixteen queries is scoped to the signed-in user's workspace inside the query itself, rather than being filtered after the results come back. With no workspace context and no query, the result is empty groups rather than a broad search — the correct failure direction for a feature that touches sixteen tables at once. Cross-workspace search is not a setting we ship.
Can I search for a settings page?
Yes, and it is one of the more useful things in here. Settings pages and connector pages are two of the sixteen groups, and settings entries carry alias terms because the word somebody searches is almost never the page name: search 2fa and you reach the security policy, too many emails and you reach notification preferences, cost center and you reach departments. The same word-start match rule is implemented on the server, in the browser and in the mobile app, so a settings page is findable identically on all three surfaces.
Is this full-text search over documents?
No, and it would be dishonest to imply otherwise. This is indexed lookup over structured fields — names, codes, barcodes, serial numbers, references, email addresses — tuned to answer “where is this record” quickly. It does not search the text inside an uploaded invoice PDF, a scanned delivery note or a long ticket thread, and it does not do fuzzy or phonetic matching, so a transposed serial number will not find its record. Both are buildable; both need an indexing pipeline rather than a wider search box, so we would rather scope them honestly than let a demo imply them.
Are search results safe to render?
Yes, and it is worth stating because this is the classic place a web application gets it wrong. Palette rows are assembled in the browser from data that arrived over the network, so the server-side template escaping the rest of the product enjoys does not apply. Every interpolated value in the result renderer — the title, the subtitle, the icon class and the destination URL — goes through one shared escaper defined once and loaded from the head of every layout. There is exactly one such function in the codebase, and a page that declares its own fails the build.
Help Center
Need a quick answer while you read?
Run inventory, procurement, assets, sales, and field work with approved AWRA guidance for setup, migration, integrations, security, pricing, and support.
We use necessary cookies for secure sessions. With your permission, we also use cookies and browser storage for preferences, analytics, and demo engagement. Privacy Policy
AWRA OpsHub
Cookie settings
Cookie Consent Manager
Necessary cookies stay on for login, CSRF protection, and security. You can choose the optional categories below.
Overview
General Information
AWRA uses cookies and browser storage to keep public pages secure, remember selected preferences, measure website performance, and manage demo engagement prompts.
You can choose whether functional and marketing engagement storage apply. Analytics measurement is always active in this AWRA setup.
These settings apply to AWRA public website experiences such as the homepage, feature pages, pricing calculator, blog, help center, and request-demo page. Authenticated dashboard and vendor portal sessions still rely on required security cookies.
Required
Always active
Functional
Optional
Analytics
Always active
Marketing
Optional
For more context on privacy handling, open the Privacy Policy.
Required Cookies
Required Cookies
Always Active
Required cookies and storage support basic website delivery, secure sessions, request protection, and remembering the consent choice itself.
These cannot be switched off from this manager because disabling them would break login/session behavior, form protection, or the ability to remember the privacy choice you save.
Cookie details
Session security: keeps secure server sessions working while browsing AWRA.
CSRF protection: helps verify form submissions and protect requests.
Consent record: stores the preference decision so the banner does not keep asking after a choice is saved.
Examples: Laravel session cookies, CSRF tokens, and the AWRA consent preference record.
Duration: session security can expire with the browser/session; saved consent can last longer so the same browser remembers the choice.
Functional Cookies
Functional Cookies
Functional storage improves the public website experience by remembering interface choices, helper states, dismissed notices, and short-lived interaction preferences.
Turning this off does not stop secure required cookies or analytics. It only limits optional convenience memory.
If disabled, AWRA may show some helper prompts again or forget non-essential display choices. Core public pages, contact forms, and request-demo forms still work.
Cookie details
UI preferences: remembered display choices and helper states where available.
Dismissed notices: session-level or preference-level memory for notices the visitor has closed.
Frequency helpers: optional browser storage that prevents repeated prompts when allowed.
Examples: localStorage or sessionStorage values for dismissed banners, guide/helper states, and lightweight public-page preferences.
Effect when off: AWRA avoids optional convenience memory unless it is also allowed through marketing and engagement preferences.
Analytics Cookies
Analytics Cookies
Always Active
Analytics helps AWRA understand public page performance, traffic patterns, and content usefulness so we can improve the marketing website.
This category does not by itself enable demo popups, exit-intent prompts, or advertising pixels. Those are controlled by Marketing & engagement.
In this AWRA setup, Google Analytics and Google Tag Manager measurement are treated as mandatory website measurement and remain active.
Cookie details
Google Analytics / GTM: measures aggregate traffic and page activity.
Performance insight: helps identify which public pages, docs, and demo paths visitors use.
Operational signal: supports website quality decisions without enabling demo popups by itself.
Examples: Google measurement identifiers such as GA/GTM tags and related browser identifiers set by Google scripts.
Use: page views, source/referrer trends, public content performance, and product education page effectiveness.
Marketing & engagement
Marketing & engagement
Marketing and engagement storage supports demo prompts, exit-intent prompts, campaign attribution, and future advertising pixels.
When disabled, AWRA will not auto-open demo or exit-intent popups. CTA buttons can still open a form because that is a direct visitor action.
When enabled, AWRA can remember that a visitor already saw, dismissed, or submitted a demo prompt so the same popup is not repeated aggressively.
Cookie details
Demo prompt memory: tracks whether an auto prompt or exit prompt was recently dismissed.
Demo submission memory: avoids asking again after a visitor submits a demo request.
Campaign context: keeps source page, referrer, and UTM context available for demo requests.
Examples: popup frequency caps, demo-submitted flags, engagement source fields, and UTM/referrer context.
Effect when off: auto demo prompts and exit-intent prompts stay blocked; normal navigation and manually clicked CTA buttons still work.