npx skills add ...
npx skills add dembrandt/dembrandt-skills --skill information-architecture
Naming, navigation, a UI that mirrors the data model, confirms for irreversible changes. Use when structuring a large application or naming its entities.
npx skills add dembrandt/dembrandt-skills --skill information-architecture
In small products, users find their way by exploring. In large applications — multi-module SaaS, ERPs, analytics platforms, marketplaces — exploration breaks down. The structure itself must do the navigational work. Information architecture is the design of that structure: what exists, what it is called, and how it relates to everything else.
Good IA is invisible. Users find what they need without thinking about the structure. Bad IA forces users to hold a map in their head.
The names given to entities, sections, and actions are one of the most consequential design decisions in a large application. Bad names create cognitive friction on every visit.
Principles:
task_assignment. If they call it a "client", do not surface contact_entity.Naming audit questions:
The terms a company uses internally are frequently not the terms the customer should see. An internal casual shorthand ("the recon job", "a P2 ticket") is precise for the team but opaque to an outsider. When a term crosses from the internal build into the customer-facing app, translate it to the customer's word, or a universally understood one — never ship the internal shorthand by default.
The UI should be a direct, legible expression of the underlying data model. Users build a mental model of the product by interacting with it — that mental model should match how the data actually works.
Match entities to screens. Each major data entity (Project, Invoice, User, Product) typically deserves its own list view and detail view. Do not collapse distinct entities into one screen because it seems simpler — users will be confused when one action affects something they did not see.
Expose relationships. If a Project contains Tasks, and Tasks belong to Users, the UI hierarchy should reflect this:
Breadcrumbs, parent labels, and contextual references ("3 tasks in this project") reinforce the data relationships visually.
Show transformation paths. The UI should make it clear how data moves through the system. A draft becomes published. An invoice moves from pending to paid. A user is promoted to admin. These state transitions should be visible:
Signal the scope of actions. Before a user commits to an action, they must understand what it will affect:
Any action that is irreversible, affects a wide scope, or causes data loss requires explicit confirmation before execution. The confirm dialog is not a courtesy — it is a contract with the user.
When a confirm dialog is required:
| Action type | Example | Dialog required |
|---|---|---|
| Permanent deletion | Delete project, remove user | Always |
| Bulk destruction | Delete all items in a filter | Always |
| Irreversible state change | Publish, Submit, Send | Yes if no undo |
| Wide-scope change | Transfer ownership, change billing plan | Always |
| Account-level action | Cancel subscription, delete account | Always |
| Permission escalation | Grant admin access | Yes |
Confirm dialog anatomy:
Rules:
What not to use a confirm dialog for:
IA manifests most visibly in navigation. As products grow, navigation must scale with them.
Flat is fast, deep is findable. Aim for no more than 3 levels of hierarchy in primary navigation. If the product requires more, introduce grouping and search rather than more levels.
Group by user goal, not by product feature. Users navigate to accomplish tasks. Group navigation items around what users want to do, not around how the backend is organised.
Progressive disclosure for power users. Show the most-used sections in primary navigation. Secondary features live in settings, secondary nav, or are reached via search. Do not surface every feature at the top level.
Global search as escape hatch. In large applications, search reduces the navigation burden. Users who know what they want should never have to navigate through 4 levels to find it.
Logo as Home. The product logo should always be an interactive link leading back to the primary landing page or dashboard. This is a universal user expectation — a "reset button" for navigation.
Global Header Consistency. In applications with deep hierarchy, keep the primary header and top-level navigation consistent across all views. Changing the global navigation based on the user's current depth disorients them and removes their easy path back to other content.
Persistent context. In deeply nested views, the user must always be able to answer: where am I, what does this belong to, and how do I get back?
Use parent labels and contextual headers to reinforce the current location.
An information architecture rarely breaks in one decision. It erodes: each new page gets a link in the place that seemed nearest, and a few releases later the menu is a floor plan nobody drew. If moving through the product feels like getting lost in a shopping mall, with every corridor leading to more corridors and the same shop appearing on three floors, the structure has stopped working. A mall profits when people wander. A website or an application does not.
Do not mess with the structure casually. A visitor learns where things are once and relies on it afterwards. Moving, renaming or regrouping navigation spends that learning, so change it for the customer's sake and not because a new feature needed a home.
Audit for drift. List every navigation link with its target. Sort by target. Every target that appears more than once, and every label that appears more than once, is a finding.
When a feature or control adds density but a subset of users still needs it, you have three moves, not two. The mistake is treating it as a binary of show it or remove it.
Deliberate friction is a feature. Place the reveal at the flow step where the user needs it — don't pre-load every option. Same instinct as the H1–H3 discipline (see modular-scale-typography): when a view sprouts deeper hierarchy, push the secondary layer into an opening/closing element.
Choose the container by the content's weight: accordion/expandable for inline detail the user reads in place, popover/drawer for a short secondary task, modal for a focused sub-task or confirmation that must interrupt.
Change over time and difference across peers are two questions. Give each its own vocabulary and never put both under one word on one card: a header that says "heavy drift" for peers against each other, over rows that say "drift: 3 changes" for each against its own past, cannot be read.
Bad: Settings → Integrations → Webhooks → Event types
Good: Developer → Webhooks