Skip to content

CLI Overview

The app-platform CLI lets you manage and publish games on the App Platform from your terminal or in automated scripts. It wraps the REST API with a convenient interface, similar to gh for GitHub.

If you'd like to interface with the platform programmatically from code, see Programmatic Usage or the REST API docs.

Installing the CLI

The CLI requires Bun — its entry points are shipped as TypeScript and run by Bun directly.

Installing from outside the codebase

Install the published tarball into any Bun project:

bash
bun add https://misc-dev-uploads.quora-913.workers.dev/b9fea504af3e4511d924ba26f315c42d65bc6e51a46bbe6a21a1cc8e87f85c6c
bash
bunx app-platform --version

The URL above points at the most recent tarball uploaded to misc-dev-uploads. It is regenerated by bun run publish-tar inside apps/app-platform-cli/ (which packs the CLI and uploads via the dev-tools CLI) and committed into this file.

The tarball is self-contained: production dependencies are plain npm packages and there are no workspace:* references. packaging.test.ts enforces this invariant — shipped source files may only import declared deps or node:* builtins.

Installing from inside the codebase

Poe Employee Note

If you have the monorepo cloned, install-cli wires a wrapper script that always resolves to the clone you're currently in:

bash
# From the repo root
cd apps/app-platform-cli
bun run install-cli

This writes ~/.local/bin/app-platform, which walks up from $PWD to find the nearest clone's cli.ts. Make sure ~/.local/bin is on your PATH:

bash
export PATH="$HOME/.local/bin:$PATH"

Checking the version

bash
app-platform --version

Authentication

The CLI requires a Poe API key. Get one at poe.com/api/keys, then set it as an environment variable:

bash
export POE_API_KEY=your_key_here

Verify it works:

bash
app-platform auth whoami

Available Commands

auth — Authentication & Account Info

bash
app-platform auth login              # Verify API key, show user info
app-platform auth whoami             # Show current user
app-platform auth usage              # Show point balance
app-platform auth points-history     # Show usage history table
app-platform auth logout             # End session

apps — App Management

bash
app-platform apps list               # List all your apps
app-platform apps get <appHandleOrId>
app-platform apps publish --handle my-app --dir ./dist

chat — Interactive AI Chat

bash
app-platform chat                    # Start interactive chat (default: Claude-Opus-4.6)
app-platform chat --model GPT-4o    # Use a different model

models — Model Management

bash
app-platform models list             # List available LLM models

accounts — Connected Accounts

bash
app-platform accounts list           # List linked OAuth accounts
app-platform accounts unlink <providerId>

Global Options

bash
--json                           # Output as machine-readable JSON
--server <url>                   # Override the server URL (e.g. for local dev)
--version                        # Show version
--help                           # Show help

Environment Variables

VariableRequiredDescription
POE_API_KEYYesYour Poe API key (get one here)
POE_SERVER_URLNoServer URL override (same as --server flag)

Using in scripts

All commands support --json for machine-readable output, making it easy to pipe into tools like jq:

bash
# List app handles
app-platform apps list --json | jq '.[].handle'

# Sum point costs
app-platform auth points-history --json | jq '[.[] | .cost_points] | add'

# Get a specific app's bundle URL
app-platform apps get myuser/my-app --json | jq '.bundleUrl'

Local development

Point the CLI at a local server:

bash
app-platform --server http://localhost:8787 apps list

Programmatic usage

The CLI package also exports a SlopPoeClient for use in scripts and tools:

typescript
import { SlopPoeClient, assertSuccess } from "@ai-app/app-platform-cli";

const client = new SlopPoeClient({ apiKey: process.env["POE_API_KEY"]! });

const result = await client.listApps();
assertSuccess(result); // throws on failure
for (const app of result.apps) {
  console.log(`${app.handle} (${app.id})`);
}