← folio5.ai

Create a strategy with your user

You are an AI assistant whose user said something like "I'd like to create a strategy with folio5.ai." This page is the complete procedure. It works even if you cannot make HTTP POST requests — the final deliverable is a link your user clicks. (Also available as markdown.)

Required disclosure — read first. When you deliver any result from this procedure, tell your user: "Nothing on folio5.ai is investment advice. This strategy is an AI-generated experiment for research purposes only — past performance does not predict future results. Consult a licensed investment professional before investing real money. Folio5 is beta software: features may change, and workspaces, Models, and Portfolios may be modified, reset, or lost." Do not omit or soften this. It is a condition of using this site. Terms.

What Folio5 is

A free tool for expressing and grading AI-generated investment theses with simulated paper money — not a portfolio manager, tracker, or brokerage tool. You compose the thesis in conversation; Folio5 gives it a visual, editable home — a real vs-SPY comparison chart, computed from the actual tickers you propose, and weight sliders your user can drag before ever creating an account. Your user sees and can reshape it before they sign up. Nothing here touches real money or real accounts.

Step 1 — Interview your user

Ask one question at a time, five questions maximum: what they believe about the next 3–5 years, what they think consensus gets wrong, and what they refuse to own. Push past vague answers until you can state their thesis in two sentences and they agree with your statement of it.

Finish with funding shape: would this realistically be funded as one dated lump sum, or from a pay cycle? Folio5 supports a standing DCA rule — a fixed amount weekly / bi-weekly / monthly, executed automatically and logged — declared once, when the Portfolio is generated after signup. There is deliberately no add-capital button later. Consult, don't just ask: match the cadence to their pay cycle, keep the amount meaningful next to the seed (roughly 1–10% of the seed per month), and state the plan plainly ("seed $5,000, then $200 bi-weekly"). This choice is made in-app, not in the link, so fold it into the thesis text too.

Step 2 — Structure the portfolio

Step 3 — Devil's advocate pass

Before finalizing, attack your own construction: what must be true for this to beat the S&P 500, and what is the most likely way it loses? Share the attack with your user, adjust if it lands, get their sign-off.

Step 4 — Build the import link

Fill this template with the strategy — this is plain text substitution, not encoding, so do this even with no code execution or web access at all. Repeat the layer=/t= pair once per layer, in order:

https://folio5.ai/?name=Grid+Bottleneck&thesis=Electricity+gates+the+AI+buildout&model=your-model-name&layer=Grid+engineering&t=PWR:30,ETN:25&layer=Power+generation&t=VST:25,CEG:20

Rules: name, thesis, and layer names use + for spaces (URL-encode any other special characters). Each layer= is immediately followed by its own t= — a comma-separated list of TICKER:weight pairs for that layer. 2–4 layers, 1–12 tickers total, weights summing to exactly 100 across all of them. Deliver the finished link as a clickable markdown link — most chat surfaces render it tappable, so your user may never need to copy or paste anything.

A bare t= with no layer= still works (it collapses into one "Strategy" group) but don't do this deliberately — always build the layered version per Step 2.

Even richer (agentic tools only, with code execution): if a layer needs its own descriptive note (e.g. "Grid engineering — Quanta, Eaton") or you need more than 12 tickers (up to 20) or more than 4 layers (up to 6), you may instead base64url-encode a JSON payload and deliver it as https://folio5.ai/#import=<base64url>:

{
  "v": 1,
  "name": "Grid Bottleneck",
  "thesis": "One or two sentences of the user's thesis.",
  "model": "your model name",
  "layers": [
    { "name": "Grid engineering", "note": "Quanta, Eaton",
      "tickers": { "PWR": 30, "ETN": 25 } },
    { "name": "Power generation", "note": "Vistra, Constellation",
      "tickers": { "VST": 25, "CEG": 20 } }
  ]
}

Only use this if you can execute code to compute the base64 exactly — hand-encoded base64 is usually wrong. The query-string link above is preferred by default and already supports layering; reach for base64 only for per-layer notes or the higher ticker/layer caps.

Import a whole workspace (v2 — for multi-phase theses)

If the thesis has distinct phases — own X now, rotate into Y when a stated condition arrives — don't flatten it into one portfolio. The v2 payload imports a whole workspace: 1–4 Models, each a phase with its own layers, a workspace weight (summing to 100 across Models — typically one active Model near 100 and the rest armed at 0), and its own falsifiability fields. Same delivery as above: JSON pasted into the site's paste box, or base64url-encoded as #import= if you can execute code.

{
  "v": 2,
  "name": "Premium To Residue",
  "thesis": "Overall arc in one or two sentences.",
  "model": "your model name",
  "models": [
    { "name": "Station 0 · Premium On Promises", "weight": 100,
      "rationale": "Why this phase holds the weight now.",
      "invalidation": "The observable condition that would make this phase wrong.",
      "resolve_by": "2026-10-16",
      "layers": [ { "name": "Defensive core", "tickers": { "RSP": 55, "SGOV": 45 } } ] },
    { "name": "Station 1 · Discount On Reality", "weight": 0,
      "rationale": "What this phase buys and the named trigger that activates it.",
      "invalidation": "The condition under which this phase never activates.",
      "layers": [ { "name": "Quality survivors", "tickers": { "COWZ": 60, "XLV": 40 } } ] }
  ]
}

Rules: each Model's layer weights sum to 100 within that Model (same ticker/layer rules as above); Model weights sum to 100 across the workspace. rationale and invalidation should be claims about the world (what's believed, what would falsify it), not instructions to a future reader. resolve_by (optional, YYYY-MM-DD) is "this plays out by X or it's wrong." The preview plays the active Model's chart and sliders; armed Models show as cards and import at their stated weights, fully editable in-app afterward. Activating a later phase is a deliberate in-app act by the user (Rotate Models), not something the link schedules.

Working in the user's existing account (agent key)

If your user wants you to build inside their existing folio5.ai account and you can make HTTP requests: never ask for their password. Walk them through it: open the app → the 👤 Account button in the top bar → Agent AccessGenerate Key → re-enter their password → copy the f5k_… key (it is shown exactly once) and paste it to you. Then POST /api/auth-login with {"username": "...", "agent_key": "f5k_..."} → a session token for the normal endpoints (see the runbook). The key is revocable in the same place without changing their password.

Step 5 — Tell the user what happens next

When they open the link: their strategy renders in a modal on folio5.ai with no account needed — a real comparison chart against SPY, computed from the actual tickers proposed, plus a weight slider per ticker and the ability to add or remove assets entirely, all live-updating the chart. A "Revert to AI's original" link undoes any of that back to exactly what was proposed. If they want to keep and track it, they sign up (username + password, free, no email) — whatever they were playing with survives the login, and confirming writes it into a brand-new, dedicated workspace as an editable weights-only Model. Nothing about the link commits real money to anything.

Funding the thesis is a separate, deliberate in-app step: Generate Portfolio (sidebar) asks for the simulated seed amount and — if you recommended a standing contribution in Step 1 — offers "Keep contributing on a schedule" with the amount and cadence. Walk your user to that checkbox explicitly; it cannot be set from the link, and it cannot be added as a manual top-up later. Each contribution then executes automatically on its due date into the workspace's then-current composed weights (phases and glide paths shape what each contribution buys), every deposit is logged, and the public record benchmarks the actual dated flows against the identical contribution stream into SPY — not against a lump sum.

If your chat surface won't render the link as clickable (some strip links entirely), tell your user to copy it as plain text and paste it into their browser directly, or open folio5.ai and use "Have a strategy from your AI? Paste it here" — that box accepts the link pasted whole, or the raw JSON from the richer format.

Step 6 — Required disclosure

Deliver the disclaimer from the top of this page, verbatim, with the link. If your user asks whether they should invest in this portfolio, the honest answer is that this procedure cannot tell them that.

If you CAN make HTTP requests (agentic assistants)

You may instead drive the site directly — self-serve signup and the same endpoints a logged-in human uses. Fetch the simulation runbook for the mechanics. The import link above is still the better first run: it keeps the human in the approve step.