create-fedi-app
Modules

ecash-balance

Always-on module — fediInternal version detection, mini app listing, and install prompts at /demo/ecash.

Surfaces Fedi-specific APIs that exist only inside the wallet WebView. This module focuses on window.fediInternal discovery and mini app management (list installed apps, trigger install prompts).

Files added

FilePurpose
hooks/useFediBalance.tsDetects fediInternal version; lazy-loads mini apps on user action
components/fedi/BalanceDisplay.tsxVersion badge, load button, installed app list
components/fedi/FediVersionBadge.tsxShows detected API version
components/fedi/InstallMiniAppButton.tsxTriggers installMiniApp prompt
components/fedi/ManageMiniAppsPermissionHint.tsxActionable copy when manageInstalledMiniApps is denied
app/demo/ecash/page.tsxDemo explaining version tiers and permissions

useFediBalance

type TMiniAppsLoadState =
  | { status: 'idle' }
  | { status: 'loading' }
  | { status: 'loaded'; miniApps: TMiniApp[] }
  | { status: 'permissionDenied' }
  | { status: 'error' };

type TFediBalanceState =
  | { status: 'loading' }
  | { status: 'unavailable' }
  | { status: 'ready'; version: 0 | 1 | 2; miniAppsLoad: TMiniAppsLoadState };

State machine:

  1. loading — initial mount
  2. unavailablewindow.fediInternal not injected (normal browser)
  3. ready — version detected; on v2, mini apps load only when loadMiniApps() is called from a button

FediVersionBadge

Small debug badge for development. Shows fediInternal API v2 or "not available" message.

InstallMiniAppButton

Calls installMiniApp on v2 after user click. Shows ManageMiniAppsPermissionHint when Fedi denies manageInstalledMiniApps.

<InstallMiniAppButton
  id="companion-app"
  title="Companion App"
  url="https://example.com/app"
/>

Demo route

/demo/ecash — explains v0/v1/v2 differences, user-triggered mini app list, and install flow with permission handling.

See also

On this page