Back to lab notesBuild notes
Build notes3 min read

A plugin should feel like it belongs.

The best place for a small tool may be inside something people already use. That makes fitting in part of the engineering work.

A plugin starts with a different kind of promise from a standalone application. It joins a place someone has already arranged around their work.

The person has a theme, familiar controls, shortcuts, and expectations about what happens when they close a panel. A useful addition should respect that environment rather than behaving as though it has acquired the whole screen.

That is part of what makes small extensions interesting. There is room to make something valuable without making another destination people need to remember to visit.

Begin with the host’s conventions

Before inventing a new interface, look at the environment it will live in. How does it display errors? Where do settings belong? What does a disabled control look like? How does keyboard focus move through a panel?

Use those conventions when they serve the task. A plugin can have a recognizable identity without replacing every familiar interaction with a new one.

For a hypothetical desktop utility that shows a small piece of reference information, a compact panel may be enough. Opening a separate full-screen dashboard every time would need a convincing reason.

Fitting in is not the same as disappearing. It means making the new capability understandable in the language of the existing workspace.

Ask for access when the job needs it

A small interface should not hide a large permission request. Explain what information the plugin needs and why, and keep optional capabilities separate where the host supports that distinction.

Chrome’s extension permissions documentation distinguishes required permissions from permissions a user can grant at runtime. It recommends optional permissions where the functionality allows them. Other plugin hosts have different mechanisms, so the implementation needs to follow the actual platform rather than borrow a label.

The product question is consistent: can someone use the basic feature without granting access needed only by an optional one?

A refusal should also produce a sensible experience. Explain what remains available instead of repeatedly prompting until the person gives in.

Make failure smaller than the workspace

Consider what happens when an external service is unavailable. The plugin might show the last successful value with a clear timestamp, or replace it with an explicit unavailable state. Which is better depends on whether stale information could mislead the person.

What it should not do is silently present old data as current.

Give error states, resource use, and cleanup the same attention as the normal panel. Test repeated opening and closing, changes of theme, and disabled permissions. Make sure removing the plugin leaves the host usable and explains what happens to any retained settings or data.

Ship the explanation alongside the code

A repository should say what environment the plugin supports, how to install it, how to remove it, and where to report a problem. Describe compatibility only as far as it has been checked.

These are the kinds of questions behind the lab’s interest in open-source tools. Being able to inspect the work is valuable; being able to understand its boundaries is valuable too.

A plugin does not need to announce itself every time it helps. Sometimes the nicest outcome is that the workspace feels a little more capable, and still feels like home.