Scaffold
Download the starter, versioned SDK, TypeScript declarations, and manifest schema.
Textxt Mini Apps are HTTPS web applications that run in a sandboxed chat panel. Use the SDK, test against a local host, submit a signed-in release, and ship through one review pipeline.
Download the starter, versioned SDK, TypeScript declarations, and manifest schema.
Use host.html to simulate context, messages, drafts, boards, polls, events, and errors.
Developer Console fetches, scans, hashes, and privately archives every executable release file before review.
Approved releases support staged rollout, beta users, health checks, rollback, disable, analytics, and support.
The starter has no build step. It includes an app, manifest, local Bridge host, and standalone validator.
mkdir conversation-notes && cd conversation-notes
BASE=https://textxt.com/mini-apps/starter
curl -fsSLO "$BASE/index.html"
curl -fsSLO "$BASE/manifest.json"
curl -fsSLO "$BASE/host.html"
curl -fsSLO "$BASE/textxt-mini-app.js"
curl -fsSLO "$BASE/validate-manifest.mjs"
npx serve .
# Open the printed URL + /host.html
Use --local while your start URL is localhost. Production submission always requires HTTPS.
node validate-manifest.mjs \
--local manifest.json
node validate-manifest.mjs \
--remote manifest.json
The SDK pins the parent origin, creates request IDs, handles timeouts, maps Bridge errors, and dispatches events. Do not implement raw postMessage transport.
<script src="https://textxt.com/mini-apps/sdk/1.0.2/textxt-mini-app.js"></script>
<script>
const bridge = window.TextxtMiniApp.createBridge();
bridge.on("context", (context) => {
console.log(context.bridge.availableCommands);
});
await bridge.sendMessage({ text: "Result from my app" });
</script>
Users consent per app and chat. New release permissions are never granted automatically.
const context = await bridge.getContext();
const canPoll = context.bridge
.availableCommands
.includes("createPoll");
| Group | Commands | Notes |
|---|---|---|
| Context | getContext | Chat, topic, locale, theme, discovery metadata, and a non-authenticated correlation session. |
| Conversation | sendMessage, setDraft, updateMessage, shareMiniAppMessage, openTopic | All writes are permission-checked by the host. |
| Shared data | listBoards, createBoard, getBoard, saveBoard, subscriptions, Caro mutations | Chat-scoped persisted collaboration with revision checks. |
| Polls | createPoll, getPoll, listPolls, castVote, closePoll | Realtime poll state managed by Textxt. |
| TXT wallet | getTxtWallet, requestTxtPayment | Reads the available TXT balance and opens a host-controlled confirmation sheet. Mini Apps never debit wallets directly. |
| Services | invokeTextxtService / invokeService | Calls only backend operations registered for this app. Textxt supplies authenticated runtime context and validates consent server-side. |
| Host | uploadFile, generateImage, resize, logEvent, reportError, closeMiniApp | File and AI access are only available in the real host. Error reports feed release health analytics. |
const context = await bridge.getContext();
if (context.bridge.availableCommands.includes("requestTxtPayment")) {
const result = await bridge.requestTxtPayment({
amount: 25,
reference: "invoice-1042",
description: "Shared dinner"
});
console.log(result.operationId, result.balance);
}
Declare wallet in the manifest. Textxt verifies the app owner and chat consent, then asks the user to confirm the amount and recipient.
Never include ownerId, review status, or timestamps. Textxt derives those from the authenticated submission.
{
"manifestVersion": 1,
"appId": "conversation-notes",
"name": "Conversation Notes",
"description": "Capture a note and send it back to the conversation.",
"iconUrl": "https://example.com/icon.png",
"startUrl": "https://example.com/app/v1.0.0/index.html",
"allowedOrigins": ["https://example.com"],
"permissions": ["readContext", "sendMessage", "setDraft"],
"capabilities": ["message.text"],
"bridgeVersion": "1.0",
"minimumHostVersion": "1.1.0",
"requiredHostCapabilities": ["bridge.service-invoke"],
"visibility": "private",
"tags": ["notes", "productivity"],
"version": "1.0.0",
"privacyPolicyUrl": "https://example.com/privacy",
"supportUrl": "https://example.com/support",
"releaseNotes": "Initial release."
}
private | Only the developer can discover and install it. |
shared | Available to signed-in Textxt users through sharing. |
public | Listed in public discovery after review. |
Mini Apps are isolated from Textxt authentication and direct Firestore access. The Bridge is the only supported host boundary.
https://textxt.com and https://textxt-14209.web.appsession.id or legacy sessionToken as authenticationSign in to Textxt, open Settings → Mini app developer, paste the validated manifest, and submit. Developers never write catalog records directly.
Executable files pass network and source checks, then receive an archived SHA-256 digest.
Textxt rechecks the live digest before approval and records an SLA event if review is delayed.
Load the manifest back into the editor, address review notes, and resubmit.
New apps go live; updates can roll out by beta list and deterministic percentage before promotion.
Increase the semantic version and publish it at a new immutable URL. Monitor runs and errors, adjust rollout, promote, or roll back to the prior approved release. Removed origins and permissions are revoked at runtime.
Third-party apps can share standard Mini App cards. Interactive inline bubble renderers are trusted host extensions and require a separate platform review; arbitrary app code never runs in the message list.