🎨 Visual Art · commission client relations

Patron Update Broadcaster

Lovable AI drafts polite progress updates so portrait artists manage; an Anyway Agent Wallet keeps the spend inside the owner's policy.

Anyway Agent Wallet· autonomous spend
Section · Anyway

The kernel.

full primer →

The agent behind commission client relations carries its own Anyway wallet — it pays for what it needs inside a spending policy painters set once, and never asks for a card.

Why this primitiveAn Anyway Agent Wallet lets commission client relations in Visual Art run unattended — the agent spends its own USDC under a server-enforced policy the owner sets once.

Kernel
the Agent Wallet Runtime API (`https://api.anyway.sh/v1/agent-wallet`, `/policies`, `/history`, `/credit-balance`) — an agent's own USDC wallet on Base with an owner-set spending policy enforced server-side
Drives the UI as
a wallet panel showing identity, spending policy, credit balance and a live feed of what the agent just paid for
Appendix · Secrets

Required key.

ANYWAY_AGENT_WALLET_KEY
Agent Wallet Key — lets the build pay x402 SuperAPI calls in USDC under a spending policy you set once.
open ↗
ANYWAY_API_KEY
Business API key for payment links, orders and Agent Traces. Only needed for those kernels.
open ↗

Add this in your Lovable project under Settings → Secrets before pasting the prompt below.

Appendix · Mega-prompt

The build prompt.

Paste into a fresh Lovable project. Make sure the key above is set first. read the build strategy →

Build "Patron Update Broadcaster" as a ONE-SHOT Lovable build. The participant has only
5 credits — this single message must produce a working demo with no follow-ups.
Single-page TanStack Start app. Cut scope ruthlessly.

CONCEPT
Lovable AI drafts polite progress updates so portrait artists manage; an Anyway Agent Wallet keeps the spend inside the owner's policy.
Discipline: Visual Art (commission client relations).
Recipe: Anyway Agent Wallet (autonomous spend) as the single creative surface.
Why this kernel: An Anyway Agent Wallet lets commission client relations in Visual Art run unattended — the agent spends its own USDC under a server-enforced policy the owner sets once.

LOVABLE BUDGET (HARD CAP: ONE-SHOT, ~5 CREDITS TOTAL):
The participant has FIVE Lovable credits for the whole build. This prompt MUST
ship a working demo on the FIRST message with zero follow-ups. Engineer for that.
- ONE TanStack Start app, ONE route (`src/routes/index.tsx`). No extra pages, no auth, no nav.
- ONE TanStack server function in `src/lib/anyway.functions.ts` that proxies the Anyway call.
- ONE client surface (a textarea + button, a wallet panel, or a pay button) wired to it.
- NO database, NO Lovable Cloud, NO auth, NO file uploads, NO extra integrations.
- NO tests, NO docs pages, NO settings screens, NO theming toggles.
- Libraries: template defaults + `zod`. Nothing else.
- Keep the diff small enough to land in one build pass. If a feature is not on
  screen in the user flow below, do not build it. Cut scope before adding scope.

STACK
- TanStack Start app, the index route only.
- Anyway is the only paid dependency. Every Anyway call lives inside a
  `createServerFn` handler so the keys stay on the server.
- Client surface fits the kernel: a wallet panel showing identity, spending policy, credit balance and a live feed of what the agent just paid for.
- Tailwind + shadcn. Editorial look: gold accent on a dark or warm-cream
  background, generous type, one strong headline, one primary action.
- Footer renders: "Built during the Anyway Creative Hackathon organised by StreetKode Fam during Indian Krump Festival 14".

SERVER FUNCTION (src/lib/anyway.functions.ts) — Anyway Agent Wallet runtime:
```ts
import { createServerFn } from "@tanstack/react-start";

/** Built during the Anyway Creative Hackathon organised by StreetKode Fam during Indian Krump Festival 14 */
export const walletStatus = createServerFn({ method: "GET" }).handler(async () => {
  const { getAgentContext, getCreditBalance } = await import("./anyway-wallet.server");
  const { signer, info } = await getAgentContext();
  const credits = await getCreditBalance(signer);
  return {
    agentId: info.agentId,
    name: info.name,
    walletAddress: info.walletAddress,
    credits: credits?.balance ?? null,
  };
});
```

`src/lib/anyway-wallet.server.ts` — signed runtime requests with Web Crypto only
(no node:crypto, so it runs on the edge):
```ts
const ts = String(Math.floor(Date.now() / 1000));
const signature = await signP256(privateKey, `${method}\n/v1/agent-wallet${path}\n${ts}`);
const res = await fetch(`https://api.anyway.sh/v1/agent-wallet${path}`, {
  method,
  headers: {
    "X-Agent-Pubkey": publicKeySpkiBase64,   // base64 SPKI, derived from the key bundle
    "X-Agent-Timestamp": ts,                 // within 300s of the server clock
    "X-Agent-Signature": signature,          // base64 DER ECDSA P-256 / SHA-256
    "Content-Type": "application/json",
  },
});
```
Useful paths: `""` (identity + wallet address), `/policies`, `/credit-balance`,
`/history?limit=20`, `/sign-typed-data`. Never log or return the key itself.

CLIENT: a wallet panel — agent name and id, wallet address, spending policy,
credit balance, and a live feed of what the agent just paid for.

Docs: https://docs.anyway.sh/features/agent-wallet

USER FLOW (the entire app — nothing else exists)
1. Land on the page; the headline previews what the demo does for commission client relations.
2. The primary action (a wallet panel showing identity, spending policy, credit balance and a live feed of what the agent just paid for) is one tap away; the rest of the layout supports it.
3. Anyway runs the kernel server-side, the result lands on screen, the user can retry or copy.

KEYS — Anyway secrets (server-side only, never `VITE_`):
1. `ANYWAY_AGENT_WALLET_KEY` — the Agent Wallet Key from
   https://app.anyway.sh/wallets?view=agent (or `anyway login --agent-wallet`).
   Lets the agent pay x402 endpoints in USDC under an owner-set spending policy.
2. `ANYWAY_API_KEY` — the Agent Traces key from Business profile -> Developers.
   Only needed if the build reports traces to https://collector.anyway.sh.
Put them in Project Settings -> Secrets and read them only inside a
`createServerFn` `.handler()` via `process.env.ANYWAY_...`.

CREDIT (must appear in UI footer AND as JSDoc on the server function):
Built during the Anyway Creative Hackathon organised by StreetKode Fam during Indian Krump Festival 14
Appendix · Market

Market sizing.

TAM
$65B
global commissioned art and portrait market
SAM
$4B
freelance artist client management software
SOM
$60M
independent portrait and commission platforms

Indicative figures for hackathon pitches — refine with your own research before raising.

See also

Adjacent entries.