For extension owners
Add a FACEIT install button.
Use one script tag or a framework wrapper. AddonPort opens FACEIT, reports the result, and needs no backend, custom package, or catalog listing from the extension owner.
Choose an integration
Replace the example with the extension's 32-character Chrome Web Store ID.
<script
src="https://addonport.dev/sdk/v0.1.0-beta.3/addonport-button.js"
integrity="sha384-S44QavU5ux+H2a0FXQRmS7dCTSLCGQf0OnAPrBshmuUV8VHZBkUDEjmGHX5nJIiW"
crossorigin="anonymous"
defer
></script>
<addonport-install-button
target="abcdefghijklmnopabcdefghijklmnop"
label="Install for FACEIT"
></addonport-install-button>Hosted sessions are the default. The button creates one short-lived request, opens FACEIT, and reports confirmation or rejection to the page. The public service stores no account or long-lived device identity.
If Connect is unavailable or no compatible client claims the session, the button emits addonport-error and opens a direct install handoff. Set mode="direct" to always skip Connect.
Button API
Attributes configure behavior; CSS properties and parts control appearance.
Attributes
target- Required. Chrome Web Store extension ID or AddonPort catalog slug.
label- Optional idle label. Defaults to "Install with AddonPort".
disabled- Optional boolean attribute that disables interaction.
mode- Optional. Defaults to "session"; use "direct" to skip Connect.
api-base-url- Advanced. Browser-side override for an adapter deployment pinned to the same origin.
Styling
--addonport-accent- Accent, focus, and status color.
--addonport-bg- Button background color.
--addonport-fg- Text and icon color.
::part(button | icon | label)- Shadow parts for site-specific styling beyond the color properties.
Events and data
Every event bubbles through Shadow DOM and exposes its payload in event.detail.
Web component events
addonport-open- Direct and session modes. Returns mode, validated intent, and deepLink.
addonport-status- Session mode. Returns the latest SessionSnapshot while polling.
addonport-complete- Session mode. Returns the completed SessionSnapshot.
addonport-error- Returns a session or handoff error; a direct fallback may follow.
Framework callbacks
React- onOpen, onStatus, onComplete, and onError receive the payload directly.
Vue- @open, @status, @complete, and @error receive the emitted payload directly.
type AddonPortOpenDetail = {
mode: "direct" | "session";
intent: { action: "install"; target: string };
deepLink: string;
};
type SessionSnapshot = {
protocolVersion: 2;
sessionId: string;
state: "created" | "client_opened" | "awaiting_confirmation" |
"completed" | "rejected" | "failed" | "expired";
intent: AddonPortOpenDetail["intent"];
createdAt: string;
updatedAt: string;
expiresAt: string;
client?: { adapter?: string; version?: string; platform?: string };
result?: { installedVersion?: string; message?: string };
error?: { code: string; message: string };
};
type AddonPortButtonEventMap = {
"addonport-open": AddonPortOpenDetail;
"addonport-status": SessionSnapshot;
"addonport-complete": SessionSnapshot;
"addonport-error": unknown;
};addonport-open is a handoff signal, not installation proof. Only addonport-complete reports completion. Session results are UX signals rather than authentication or device attestation.
Direct protocol
Use links directly when the page does not need installation status.
<a href="addonport://install/abcdefghijklmnopabcdefghijklmnop">
Install for FACEIT with AddonPort
</a>
<p>Didn't open? <a href="https://addonport.dev/">Get AddonPort</a></p>addonport://install/<id>- Review and install a catalog slug or Chrome extension ID.
addonport://launch/<id>- Open the action for an installed extension.
addonport://open- Open the in-client manager.
Session lifecycle
The hosted service connects the page to one native confirmation flow.
The SDK prepares a five-minute request, opens its signed handoff, and polls through created, client opened, confirmation, and terminal states. Claim and polling tokens are separate and never belong in page URLs or analytics.
The public endpoint accepts HTTPS extension sites. Session creation is rate limited and no cookies, account, or persistent socket are required. A custom api-base-url works only when the native adapter is independently pinned to that same private origin. The public FACEIT adapter does not accept arbitrary service origins from websites.
import { AddonPortClient } from "@addonport/sdk";
const client = new AddonPortClient({
client: { name: "extension-site", version: "1.0.0" },
});
const result = await client.run({
action: "install",
target: "abcdefghijklmnopabcdefghijklmnop",
});Native Windows apps
Read the current-user registry key without launching FACEIT.
HKCU\Software\AddonPort\FACEIT
DisplayVersion REG_SZ <adapter version>
InstallLocation REG_SZ <payload directory>
Protocol REG_SZ addonport
ProtocolVersion REG_SZ 2Compare ProtocolVersion before relying on newer link actions. Browser pages cannot read this key and should keep the direct-link fallback.
There is no public self-service catalog submission yet. Catalog metadata is optional for direct installation.