Skip to main content
An extension is a manifest plus a bundle. You build it, an owner installs it on their project, and it renders inside Tappify’s dashboard — the host — next to Tappify’s own numbers. Start with Your first extension to have one running in ten minutes. The manifest, tappify.extension.json, declares three things: The bundle is the code behind those declarations: a Module Federation remote that Tappify serves from its own CDN and mounts in a shadow root on the owner’s page.

What Tappify owns and what you own

Tappify owns the chrome, the session, the tokens, the approval cards and the provenance mark. You own the pixels inside your mount and the endpoints behind your own server.

Tappify draws

Loading, failure and missing-scope states, the vendor tile on every surface you render, the consent screen, every approval card, and the expand panel’s chrome.

You draw

Your component’s content, its own empty and error states inside the card, and the responses from your server.
Everything crosses one bridge, tap, which the host provides. Your code never touches the host’s DOM, router, cookies or storage, never sees a Tappify session credential or another extension’s data, and never writes to the owner’s store without an approval card. The full list is on What extensions can never do. When your extension fails to load, the host draws a card saying so and the rest of Tappify carries on. That contract is why the mount is a shadow root and why the loader has an 8-second timeout.

The pieces you install

Create a vendor account

One command creates the vendor, the workspace and the sandbox project.

Your first extension

Scaffold, run, see it on a project, publish.