986 LAUNCHER

One floating launcher for every 986 tool.

A draggable bubble that opens a searchable list of every internal tool. It's running on this page right now — grab it, drag it anywhere, click it.

Install

Add one line before </body> in any 986 app. Nothing else.

<script src="https://launcher.986enterprise.com/v1.js" defer></script>

In Next.js, put it in the root layout:

import Script from 'next/script'

<Script src="https://launcher.986enterprise.com/v1.js" strategy="lazyOnload" />

Options

AttributeDefaultWhat it does
data-role Shows tools tagged for this role, plus all untagged ones.
data-accent#14A99E Accent colour of the bubble and highlights.
data-hotkeyalt+space Keyboard toggle. Use off to disable.
data-hide-on Comma-separated path prefixes to stay hidden on, e.g. /login,/signup.

The bubble remembers where each person parked it, per browser. It never renders inside an iframe, and all its styling lives in a shadow root — it cannot leak into or inherit from the host app.

Managing the tool list

The list comes from public.launcher_tools in the shared 986-helpdesk Supabase project. Add a row, and it appears in every app within ten minutes — no redeploy anywhere.

insert into public.launcher_tools
  (name, description, url, category, icon, sort_order)
values
  ('New Tool', 'What it does', 'https://…', 'Work', '🧰', 130);

Set is_active = false to hide one. Set roles = '{admin,pic}' to restrict it. Leave roles null and everyone sees it.

This table is world-readable by design — the widget reads it with the public key. Tool names and URLs only. Never put PHI, credentials, or private notes in it.

Console API

__986Launcher.open()      // open the panel
__986Launcher.close()
__986Launcher.refresh()   // drop the cache, re-fetch the tools
__986Launcher.reset()     // put the bubble back in the corner
__986Launcher.destroy()