Documentation

The Assistant

A chat pane that lives beside the dashboard on every tab — and, once connected to a language model, becomes an analyst that sees your holdings, your screen and your last actions, and can drive the dashboard for you. You choose the model: a cloud API or local inference on desktop.

Ask to backtest the recommended trades over the last year to open Simulation's historical strategy. The backtest_trades action accepts an optional month/day interval, local criterion weights, and transferPolicy: strict|cashEquivalent. Strict is the default; the assistant uses the cash-equivalent approximation only when you explicitly choose it, and states that original acquisition dates and tax costs are unknown. The assistant sees the completed summary and excluded criteria; it must describe coverage rather than claim exact historical recommendations where inputs were never archived.

Trade explanations receive the allocator’s actual limiting reason and order counts. A small eligible holding is a per-position constraint: increasing the total sell budget does not make that holding larger. The assistant can distinguish this from a budget that cannot fund the requested number of orders at the minimum.

Connecting a provider

On the hosted app you do not have to: a new session starts already answering, on gpt-5.6-luna and a small free budget carried by our own key, with a donut beside the chat showing how much is left (what that means for your data). The budget is metered on what the call actually costs us, and cached prompt tokens — the large, unchanging part of the context that OpenAI serves from its own cache on a follow-up question — are charged at a tenth of the normal rate, so a conversation goes much further than its first question suggests. Connect your own provider when you want a different model, a bigger budget, or the conversation kept entirely on your machine — and on the desktop app, where there is no free budget, from the start.

Open ⚙ Settings → Assistant and pick one of five providers:

ProviderSetup
OpenAIPaste an API key; the five latest models are offered.
AnthropicPaste an API key; the Claude models via Anthropic's native API. The main slot offers claude-opus-5 (the default), claude-fable-5-1, claude-fable-5 and claude-sonnet-5; the fast slot claude-haiku-4-5 with Sonnet as the upgrade option. Prompt caching is built in — the unchanging portfolio context is marked cacheable, so follow-up questions are billed at the provider's cached rate — and the Thinking switch and effort selector map straight onto Claude's reasoning controls.
OpenRouterPaste an API key; any of its 300+ models. The model field suggests the whole catalogue once a key is saved — before that it is free text with an example, since the catalogue is only fetched for a session that has a key to spend on it.
OllamaLocal inference on the same computer as the desktop app, with no per-token charge. A running server is auto-detected on localhost (URL configurable); installed models appear in a dropdown, and new ones can be downloaded right from the dialog with a progress bar, from a curated list with disk sizes. The in-dialog download is a local-install and desktop app feature: on the hosted app the models would land on our server rather than on your machine, so the button is not offered there.
LM StudioAlso local and auto-detected — loaded models appear in the dropdown.

Local-server detection is live: while the Assistant tab is open with Ollama or LM Studio picked, it re-probes the server every few seconds — load a model in LM Studio and it appears in the dropdown without reopening Settings. On the hosted app the backend calls the LLM server-side and cannot reach localhost on your machine; connecting a local model there needs a tunnel — see Local models with the cloud app for the full setup and the risks.

API keys you enter are not mirrored to your browser: the hosted app stores them encrypted for your session or account, and desktop stores them encrypted in its local database (see Privacy & your data). When Fortunest desktop and Ollama or LM Studio run on the same computer, model inference stays there. A hosted Fortunest session still stores portfolio data on the hosted service, and reaching your model through a tunnel sends context through that tunnel. Cloud AI, tax calculations, sharing and hosted sync remain separate outbound services.

Press Save and the assistant arms itself — the chat pane's header is titled AI Assistant, and the red/green status dot beside that title shows the live state (hover it for the reason when it's red), re-checked every minute. Nothing calls an LLM and no tokens are spent while it's red. A session token counter (in/out) sits in the pane's corner, next to the context: figure. That heading is one compact band at any pane width: the four controls (⇩ ⟲ ↘ –) stay one row, top-right, and when the two counters no longer fit on one line they stack into a two-line block beside the controls — never onto rows of their own under them — and past that each shrinks to an ellipsis (hover it for the figure).

The free budget, and what it buys

There are three sizes, each double the one below it, and only the last one refills. A brand-new account sits on the first size until it confirms its email address — nothing else about the account is held back, and confirming is what starts the second one:

WhoBudgetRefills?
Guest — no accountThe base amount, once per browser sessionNever
Free account, address not confirmed yetThe guest amountNever. Opening the confirmation link emailed at sign-up moves you to the row below.
Free accountDouble the guest amountGranted once, when you confirm your email address. It is a fresh budget, not a top-up: whatever you already spent before it does not follow you. Accounts created with Continue with Google start here — Google has already confirmed the address.
ProDouble again — four times the guest amountEvery month, on the day of the month you subscribed. A plan bought on the 14th refills on the 14th; ⚙ Settings → Assistant shows the next date under the bar.

How many questions that is depends entirely on which model you pick, because the models differ in price by more than twenty-five times. The figures below assume the app’s measured context, conversations of about ten questions each (the first question pays full price, the rest reuse the cached prefix), and roughly a five-hundred-word answer:

ModelGuestFree accountPro, per month
gpt-5.6-luna — the default~100~200~400
gpt-5.6-terra~10~20~40
gpt-5.6-sol — the most expensive~4~8~16

Estimates, not an allowance in questions: the budget is metered in what the calls actually cost, and these figures come from a real session — four accounts of demo data, three reports and eight questions — not from a model. Two things move them more than anything else. Thinking: the assistant thinks before answering by default, at the High level, and that thinking is charged like any other answer — turning it down or off under ⚙ Settings → Assistant stretches the budget several times further. Portfolio size: a question about fifty holdings costs more than one about five. A long conversation is also cheaper per question than a series of one-off ones, because everything but the current prices and your latest question is reused from the cache. The gpt-5.6-luna row is the default model: it is what you get without changing a setting and it answers ordinary portfolio questions well. Plan cards summarize whether the budget is granted once or refills monthly; this table gives the detailed estimates. Any model stays selectable on the free budget; the pricier ones simply drain it faster, by roughly ten times on gpt-5.6-terra and twenty-five on gpt-5.6-sol.

One more limit: how fast you can ask

Separate from the budget, and much easier to stay under: the assistant answers up to twenty requests a minute without an account, and thirty once you are signed in. That covers every request the assistant makes on your behalf — your questions, the proactive tips, the ✨ insight pills and the one-click report cards — and it exists so that nobody can script the free assistant hard enough to use up the day’s shared capacity for everyone else.

Clicking around normally will not reach it. If you do, the chat says so in a line of its own and the same question works again a few seconds later — nothing is spent, and it is not the budget running out. The two messages are deliberately worded differently so you can tell which one you are looking at. Signed-in sessions get their own separate allowance, so sharing an office or campus connection with other Fortunest users cannot slow you down.

Locking your API key down

An API key you paste into Settings works only for your own portfolio's calls — but for extra security you can restrict the key itself at your provider, so it is useless anywhere else even if it ever leaked:

One nuance: the IP applies to the hosted app only, where the server makes the LLM calls. The desktop app in local mode talks to the provider straight from your own computer — there is no server in between, so an IP allow-list would have to cover your own network instead (usually not practical on a home connection; prefer spend caps there).

The two model slots

Both picks persist per provider; changing either model (or its thinking settings) clears the AI caches so one model's output is never served as another's.

What each message carries

Every question you ask travels with what the assistant needs to answer it. ⚙ Settings → Assistant → Assistant context is a checkbox per part of that: checked rides along with every message; unchecked is left for the assistant to read on demand with a focused read when a question actually needs it — so it costs nothing until then. There are no modes to choose between any more (the old Auto / Full / Tools picker is gone, 11.09.2026): the tools are simply always active whenever the model can call them.

Under the list, one line says what the model in play can do. If it can call tools, anything unchecked is a question away. If it cannot — an older or smaller model — there is nowhere to fetch from, so everything is sent with every message regardless of the boxes. With a model on your own machine that answer comes from the model server itself: Ollama and LM Studio both report whether a model was trained to call tools, and that is believed over any guess from its name. Only a server that says nothing about it (an older build, or one that isn't running when you pick the model) falls back to recognising the family by name.

It is one setting for the whole app, the same on every plan — a performance choice, not a paid feature. The Context window behind the chat header's context: figure says what a message carries and, once one has been sent, breaks the last one's input into instructions, portfolio core, tool results and conversation history, so you can see where the tokens actually went.

With the full snapshot left unchecked the message carries the core digest in place of it — the current totals and day change, your ten largest positions, the allocation, the plan totals, what is coming, your strategy, the central-bank rates and risk regime, your own trades of the context window, and your notes and memories in full — and the assistant fetches whatever else the question needs through the focused reads. It is told the policy along with the list: reach for the small, focused read first, ask for what the question needs and nothing more, and treat the everything-at-once read as a last resort. A model that cannot call tools is not left out: the same reads are available to it as ordinary in-chat actions, so it can ask for your holdings or your news and answer from what comes back, whatever the boxes say. And nothing goes stale — the digest that travels with a question is cut from the same valuation the rest of the answer is, so the day change it quotes is the one on your screen. In the Context window, the sections the digest replaces are shown at zero tokens with the note that they are available on demand and what they would cost if the assistant asked for them; a zero there means “not sent with this message”, never “empty”. The rows the digest carries — your investing strategy, your notes, the macro & rates line and your recent trades — read differently on purpose: they show one figure, carried in the digest and their share of it, in place of the zero they used to print first. Their tokens are billed on the digest’s own row, and a zero beside a section that rides every message read as “empty”. A carried section that is genuinely empty is the exception: its share of the digest is zero too, so there is no other figure to show and the row still reads ~0 tokens · carried in the digest.

That fetching happens on our server, inside the same request — nothing leaves the answer half-finished waiting for your browser. Everything the assistant asks for in a single reply is fetched at the same time, and you watch it happen: a row appears for each read as it starts and fills in with what it found — holdings · 5 rows of 29 — before the first word of the answer. A question that needs a second look gets one, up to three rounds, and then the assistant answers with what it has rather than reading forever. Every result is capped — the portfolio summary gets twice the room of an ordinary read, because it is the one that has to carry a whole picture — and a list that had to be cut says how to ask for the rest, so a big portfolio slows nothing down. One answer may make at most twenty-four of these reads, however it splits them up. It may only read this way: a request that would spend or change anything is refused and it is told why. The things that change your dashboard — switching the chart, filling the filter, opening a drawer — still happen in your browser exactly as before.

Leaving the Product docs index unchecked also keeps the assistant's own instructions short, because on a small local model they are what fills the window: it leaves out the index of manual sections (the manual is searchable, so the assistant looks a page up instead of carrying a menu of every section title) and sends the list of things it can change on your dashboard in a compact form — every command and every value it accepts, without the explanations. On a demo portfolio that is about 10,300 tokens of instructions instead of about 27,300, which is most of what a 32k local model has to work with. Check the box and the index rides along as it always did.

The reads themselves are listed further down, one per surface of the app, with what each one can be asked for: Focused reads. That chapter also covers what you see in the conversation while one runs, and the head start that answers most data questions in a single round.

Setting up a local model from scratch

With Fortunest desktop and the model running on the same computer, local inference has no per-token charge and that model request stays on the device. Hosted access through a tunnel is different; it does not make the hosted portfolio local. The separate online services are listed in desktop privacy. You need three things: a server app (LM Studio or Ollama, both free), a model your hardware can hold, and a large enough context window — the last one is the step most guides skip and the most common reason a local setup "connects but fails".

Context window: at least ~32 000 tokens, comfortably 50 000+. Every question travels with your portfolio snapshot, the action spec and the conversation so far — around 30 000 tokens before you've typed a word (the context: figure in the chat header shows your own number live). Many tools load models with a 4 096 or 8 192 default; that's far too small — the header's context figure turns red, and the assistant refuses the message in a red line that says what to change rather than handing the model a prompt it cannot hold. Longer conversations and attachments want the extra room, hence 50 000+ when the model and your RAM allow it.

LM Studio, step by step

  1. Download LM Studio from lmstudio.ai (macOS, Windows, Linux) and open it.
  2. Get a model: the 🔍 search tab lists them with download sizes. Good starting points: openai/gpt-oss-20b on a 16 GB+ machine, or an 8B-class model (Llama, Qwen) on 8–16 GB.
  3. Load it with a bigger window. When loading the model, open its load settings and raise Context Length — the pane shows what the model supports (often 131 072); set at least ~32 000, ideally 50 000+. This is a per-load setting: reloading the model with a new length is what actually applies it. The app notices a reload within a minute — the header's context: … / N follows the live value.
  4. Start the server: Developer tab → toggle Status: Running. The address next to Reachable at — http://127.0.0.1:1234 by default — is the server URL. Running the app on the same machine, you don't need to enter it anywhere: that's exactly where Fortunest looks.
  5. In Fortunest: ⚙ Settings → Assistant → LM Studio. Your loaded model appears in the dropdowns (detection is live — no reopening needed); pick the conversation and fast models yourself and press Save.

Ollama, step by step

  1. Install from ollama.com (macOS, Windows, Linux; brew install ollama also works). After install it runs quietly in the background at http://localhost:11434 — again the default the app probes, nothing to configure on the same machine.
  2. Get a model either right from Fortunest — Settings → Assistant → Ollama offers a curated list with disk sizes and downloads with a progress bar — or on the command line: ollama pull llama3.1:8b.
  3. Context is handled for you: the app requests a 32 768-token window on every Ollama call, so there's no slider to remember — but your machine still needs the memory to serve it.
  4. Pick the models in ⚙ Settings → Assistant and press Save.

A hardware reality check

The model file has to fit in memory (RAM, or GPU memory where you have it), and a big context window adds to that. Rough quantized-model guide: an 8B model wants ~6–8 GB free, a 20B-class model ~13–16 GB, 30B+ upwards of 20 GB. If loading with a 50k context fails or answers crawl, try a smaller model before a smaller window — the window is load-bearing for this app.

The Server field in Settings → Assistant exists for the exceptions: a non-default port, the model running on another machine on your network, or the hosted app reaching your machine through a tunnel — that last one is its own chapter below, risks included.

Local models with the cloud app — advanced

Advanced users only — at your own risk. Everything in this chapter exposes a server running on your computer to the public internet for as long as a tunnel is up. Read the risks before you start. The safer way to use local models is to run Fortunest itself on your machine — then the app and the model share localhost and no tunnel exists at all. The desktop download is the packaged option; check its supported release and system requirements.

Why this needs anything at all: the hosted app calls your model server-side. When app.fortunest.ai asks for localhost:1234 it reaches itself, never your machine — so the app must be given a public address that forwards to your computer: a tunnel. When you pick Ollama or LM Studio on the hosted app, a confirmation dialog first makes sure you know what you're opting into; the Server field then takes the tunnel URL. The hosted app accepts only publicly routable Server URLs — a private address could never reach your laptop from the cloud anyway, and allowing one would let visitors aim the backend at its own internal network.

Option A — ngrok

  1. Create a free account at ngrok.com and install the agent: brew install ngrok on macOS, winget install ngrok.ngrok on Windows, or the download on their site.
  2. Connect the agent to your account (one-time): ngrok config add-authtoken YOUR_TOKEN — the token is on your ngrok dashboard.
  3. In LM Studio, load a model and start the server (Developer → Start server, port 1234).
  4. Start the tunnel: ngrok http 1234. It prints a https://…ngrok-free.app address.
  5. In the app: ⚙ Settings → Assistant, pick LM Studio, confirm the warning, paste the address into Server and press Save. Detection follows within a few seconds and your loaded model appears in the dropdowns.
  6. When you're done, stop the tunnel (Ctrl-C). The address dies with it; the next start mints a fresh one — just paste the new one over the old.

Option B — cloudflared (no account needed)

  1. Install the agent: brew install cloudflared on macOS, winget install Cloudflare.cloudflared on Windows, or the package from Cloudflare's downloads page. Quick tunnels need no account or sign-in.
  2. Start LM Studio's server as above, then: cloudflared tunnel --url http://localhost:1234. It prints a https://…trycloudflare.com address.
  3. Paste that address into Settings → Assistant → Server (after picking LM Studio and confirming the warning) and press Save.

Using Ollama instead of LM Studio

Same idea, port 11434 — but Ollama refuses requests whose Host header isn't local (its protection against DNS rebinding), so tell the tunnel to rewrite the header:

  1. ngrok http 11434 --host-header=localhost:11434, or
  2. cloudflared tunnel --url http://localhost:11434 --http-host-header localhost:11434

Skip the OLLAMA_HOST=0.0.0.0 OLLAMA_ORIGINS=* advice you may find elsewhere for this setup. 0.0.0.0 binds Ollama — which has no authentication — to every network interface, so anyone on your Wi-Fi can use it; ORIGINS=* additionally lets any website you visit call your local Ollama from your own browser. The host-header rewrite above needs neither: Ollama stays bound to 127.0.0.1, reachable only through your tunnel.

The risks, honestly — and how to shrink them

LM Studio's and Ollama's servers have no authentication: while a tunnel is up, the URL is the credential.

RiskWhat it means — and how to shrink it
Compute theftAnyone who learns the URL gets free inference on your GPU — heat, battery, and contention with your own use; LM Studio's management endpoints even let a stranger load or eject models. Keep tunnels short-lived: start when you sit down, stop when you're done. Both vendors mint a fresh random URL per start, so yesterday's leak is worthless today.
URL leaksThe random addresses aren't practically guessable; the realistic leaks are yours — screenshots, screen shares, pasted logs. Treat the URL like a password. It's also stored in your app session's settings, where the deployment's operator could see it.
Traffic visibilityTLS terminates at the tunnel vendor's edge, so ngrok/Cloudflare can technically see the traffic — which includes the portfolio context sent to your model. If that bothers you, don't tunnel: run the app locally instead.
Server bugsThese are development-grade servers, not hardened internet services — Ollama has had remotely exploitable bugs (CVE-2024-37032). Keep LM Studio and Ollama updated, and keep the exposure window short.
Watch the doorLM Studio's server console prints every request it gets. Traffic you didn't cause means someone found the URL: stop the tunnel — that alone ends their access.

For calibration, what a URL-holder cannot get: your portfolio data, your chat history, your app session, or files on your disk (short of an unpatched server vulnerability). The exposure is your compute, its availability, and the server's own attack surface — for exactly as long as the tunnel runs.

Two closing notes: putting basic-auth on the tunnel (ngrok http 1234 --basic-auth …) does not work — the app's backend sends no credentials and refuses URLs with credentials embedded in them. And once more: the setup with none of these trade-offs is running Fortunest locally, with a model on the same computer, so inference needs no public tunnel. Other online-service choices retain the data flows described in Privacy.

Chatting

The assistant pane before a model is connected: the opening message, the four ✨ report cards each marked Assistant unavailable, the Learn card with its course and tour tiles, and four example questions
The assistant pane before a model is connected — the state a new install opens in. The ✨ report cards are there but dimmed, with one Assistant unavailable line above the row, and the red dot beside the title says the same thing (the screenshot predates 04.09.2026, when the cards lost their printed descriptions to their tooltips and started sharing a row two at a time); the walkthroughs on the Learn card — the 🌱 Investing Foundations Course tile first, the 🎓 Dashboard tour tile with its Beginner / Intermediate / Advanced control second — run regardless (the screenshot still shows the card's earlier two-row layout). Connect a model under ⚙ Settings → Assistant and the cards become one-click reports.

Below the report cards sit example questions, one click each, there to show the range rather than to be the only way in. Since 04.09.2026 they follow the tab you are on — one or two per tab, each phrased for something the assistant can actually do there: on Portfolio "Show my top 5 holdings" and "Compare me to the S&P 500"; on Explore "Show the biggest movers this week"; on Trades "Why is the top buy candidate scored that way?"; on Simulation a what-if and the goal seek; on Taxes "Which lots become tax-free within 12 months?" and a sell plan; on Social your friends and the investors you follow. One more chip is built from your own data: once the portfolio has loaded, "What is driving NVDA this week?" names your largest holding (on Simulation it becomes "What if I bought €1 000 more of NVDA?"), lit a shade differently from the standing ones. With no holdings there is simply no such chip.

Before a model is connected the pane says why — the same sentence the status dot beside the title carries ("No assistant configured — add an API key or a local model under ⚙ Settings → Assistant", "Assistant disabled — switch it back on…", "Free budget used up — …") — printed once, with one Set up the assistant button that opens ⚙ Settings → Assistant. Nothing asks you to hover the dot (the phone drawer has no hover). Until a model exists the report cards and the example questions are not shown at all, only the Learn card, whose walkthroughs play without one; a model that is merely off right now (switched off, budget spent, server down) keeps the cards, dimmed, under that reason line.

Three small hand-offs on every reply. Copy appears at a reply's top-right corner on hover — always visible on a phone — and puts the reply's raw markdown on the clipboard. It keeps that corner to itself: the reply's first line wraps short of it, so even a one-line reply in a narrow bubble is never covered, and the chip stays solid while you point at it; a fenced code block in a reply has its own Copy for just the block, so a command line lifts out as it would be typed. Click a reply and its generated-at line now ends with what that one reply cost, "· 4 210 in / 380 out" tokens, whenever the provider reported it (the header's counter is the whole conversation); click one of your own questions and a "Sent 9 Sep 2026 16:20" line appears the same way. The report cards and example questions always open the conversation, and everything after them — connected-agent activity, your questions, replies — sits in the order it happened. And typing / into an empty question box opens the verb list — every dashboard action the assistant is prompted with (whatif, toggle_favourite, sell_plan…), with its parameters and one line of what it does, narrowing as you keep typing; Enter or a click fills the box with verb {parameters} straight from the assistant's own instructions, for you to complete in words. The list is read from those instructions on the server (GET /api/assistant/verbs), so it can never disagree with what the model was told. A slash anywhere else in a sentence ("sell 3/4 of it") is just a slash.

Walkthrough Continue waits for the current step’s actions and explanation. Stop or restarting prevents late continuation; it cannot undo an action already started. A chapter requiring unavailable Taxes or Social access shows Guidance only, clears its spotlight and performs no hidden-panel action. Taxes requires Pro; Social works with a free signed-in account. The completion message distinguishes guidance-only chapters from performed actions.

The chat also plays the guided walkthroughs (see Take the tour for the three app-tour levels). Beside the tour sits a different kind of tutorial: 🌱 Investing Foundations — 25 steps about investing itself, for people who haven't made their first trade. It needs no data and loads none: unlike the tour, it never seeds the demo portfolio, because an empty dashboard is exactly where its reader is standing. The course opens by asking where you're starting from — the answer tunes what it skips, every pick is answered with a short reply of its own, and "I have a plan already" (which jumps past the pre-flight chapter) hears a one-breath recap of what it skipped: emergency buffer, expensive debt first, only money that can stay. Step numbers count your route, so a skipped chapter drops out of the [n/N] counter. Straight after the pre-flight checks — and on both routes, since the plan-haver’s jump lands on it — comes the “Why invest at all” chapter: three steps with real charts drawn in the chat bubble from 30 years of genuine market history bundled inside the app (they work offline, over an empty portfolio) — $1,000 from 1996 in stocks, gold and bonds against mattress cash; what inflation quietly took from that cash; and the same $1,000 started ten and twenty years later, the compounding head start. The copy states the end values, points at the crashes on the lines, and says the next 30 years aren’t promised. Every course chart shows a hover crosshair — a vertical line at the year under the cursor with each line’s value there — and the costs step draws a fourth chart: the same $1,000 with a 0%, 1% and 2% yearly fee, thirty years out. It then teaches what an investment actually is and the four things that decide your outcome — with the Simulation tab doing the arithmetic on your own numbers — treats risk honestly (including the 2008 "would you have sold?" question, whose answer is remembered for the assistant), and names the common approaches without recommending any: the arithmetic is stated as fact, the contested choices are shown from both sides, and the app takes no house view. It ends with your plan written into ⚙ Settings → Strategy and Investing notes, then offers the Beginner tour of the app. Like every walkthrough it is pregenerated — it runs with no model connected, and only questions asked along the way need one.

Once you have finished it, the course collapses onto the Learn card's own title line. Its tile folds into a small chip beside the Learn heading — Investing Foundations ✓, the tick green — and the Dashboard tour tile takes the whole width and the card's one lime button. The chip is not just a label: click it and the tile comes back in full, with a quiet Restart course that begins again at step 1; click it a second time and it folds away. The same happens to the tour once every level is done — Dashboard tour ✓ beside the title, clickable back open to a Retake — so a card with both walkthroughs finished is one line: Learn, and two ticked chips. A tour with levels left keeps its whole tile; a ✓ on a level's own pill in the Beginner / Intermediate / Advanced control is what marks the levels already walked. Nothing reopened from a chip is ever lime: it is a retake, not a new offer. The course is reachable by asking too, as it always was — type "restart the investing course", "I want to do the Foundations course again" or anything that plainly means it, and the assistant runs tutorial {op: start, level: foundations}, which begins at step 1 exactly as on a fresh account and never refuses on the grounds that you already finished.

The assistant sees everything on the Portfolio tab — holdings, performance, allocation, insights, events, dividends, recent news, your strategy and watchlist, benchmark returns, per-holding fundamentals — and what you're doing: your live view (tab, currency, filters, whatever drawer or dialog is open on top, the simulation you ran) plus a log of your last 50 actions travels with every message. Ask about "this position" without any further context.

Ask AI — from a tooltip or an alert

You rarely have to type the question. Every ⓘ tooltip that explains something (and the other explanations that open on hover, such as the Fair value card’s model names and bars), and every row of the Insights & alerts list, carries a small Ask AI button — the assistant’s three sparks and the two words; hover it and it says “Ask the AI assistant more about this.” Press it and the assistant opens (from its launcher disc or as the phone’s sheet if it was folded away), the question lands in the current conversation as your own message, and the answer starts at once — there is no second click. The question quotes what you were reading: for a tooltip, the thing it is attached to and its full text — Explain more about this: “Cash — Uninvested cash reconstructed from each export’s deposits, withdrawals, trades and dividends…”; for an insight, its sentence and when it appeared; for a delivered alert, its title and the digest’s own words (the row shows only the title), with the day and time it arrived. The exceptions are the social and consensus-shift digests: they carry other people’s words — your friends’ posts and replies, the names in their shared holdings — and the question goes out as yours, so those are asked about by their title and time alone. Asking does not tick the insight off or mark the alert read. Press Ask AI again while an answer is still coming and the new question waits its turn: up to three are sent one after another, each once the answer before it is finished; a fourth goes into the ask box for you to send when you are ready. If the assistant can’t answer right now — no model set up, the free budget spent, switched off — the chat opens on its usual explanation and nothing is sent.

The tooltip waits for you. Move off the ⓘ (or the label or figure the tip belongs to), across the small gap and onto the tip, and it stays open for as long as the pointer rests there; it closes a moment (about a quarter of a second) after the pointer has left both, and it does not follow the pointer around. By keyboard: Tab to an ⓘ and its tip opens; the next Tab steps onto Ask AI (Enter asks), Shift+Tab or Esc goes back to the ⓘ (Esc closing the tip), and Tab again carries on through the page. On a phone, tap the ⓘ and then the button inside the tip. Tips that only read out a value under the pointer — a chart’s day, a heatmap cell, a sparkline — and the short control hints (“Close”, “Drag to resize”) have no Ask AI: there is nothing in them to explain.

Asking “what should I buy?”

The answer depends on what the assistant already knows about you. With a portfolio and a written strategy (⚙ Settings → Strategy) it answers the way it always has — recommendations grounded in your data, honoring your thesis, horizon and risk tolerance. With a portfolio but no strategy, it first reads your own trading pattern back to you (one fund bought at a steady rhythm looks like passive dollar-cost averaging; many picks and rebalances look like active stock-picking), confirms with a couple of questions, and saves the result as your strategy only once you agree.

On an empty portfolio — or once you have started the Investing Foundations tutorial — it deliberately recommends no tickers at all. Instead it sketches the decision framework (owning vs lending, whole-market index funds vs picking stocks), then asks up to four short profiling questions, one per reply, each with clickable answer chips: click one and it lands in the conversation as your reply, or type your own words instead. Only what you actually answer is saved — through the same settings the ⚙ dialog writes: your horizon, your risk tolerance, a one-sentence strategy in your own words, and a monthly amount for the trade plan. From there it points you at the Explore tab and the simulator with your own numbers; any fund it names along the way is an illustrative example of a category, never advice to buy it.

The dock

The assistant opens maximized by default: a full-height side pane that pushes the dashboard left so nothing is hidden — and nothing ever covers it: drawers, dialogs and maximized charts all stop at its edge. A window control turns it into a small floating window bottom-right (drag its top-left corner to resize); minimize drops it to a launcher disc — a lime circle in the bottom-right corner carrying a speech bubble with the assistant’s three sparks twinkling inside it, over a large “AI”, so it says what it opens rather than leaving the glyph to carry it. The sparks pulse in turn, and faster when a reply is waiting unread; a small light on the corner shows whether the assistant is connected. (If you have asked your system for reduced motion, none of it moves.) Phones get a 💬 bottom-sheet drawer instead, opened from the same disc: there it lives in the bottom control panel’s right-hand column, the biggest target in the row. Float/minimize choices stick for the browser-tab session and reset to maximized on the next visit — except while the Get started card is still showing: a new visitor’s assistant starts each new tab minimized to its disc — the disc opens it any time — until they have met it: sent it a question, started a walkthrough, or pressed the card’s last step, Open the AI assistant chat, which opens it with the caret in the ask box. From then on, or once the card is finished or closed, a new tab opens it docked. The pane holds its dock at every width a window can hold it — narrowing the window squeezes the pane first, down to its own minimum, and then the dashboard column. Below the width where the pane and the header cannot both fit (862 px) it folds into its launcher bubble, and re-opening it there gives you the floating window rather than a pane the window has no room for. Widen the window again and the side pane comes back by itself, at the width that closed it — unless you were the one who minimized it, in which case it stays where you put it. Narrower still and the phone’s bottom sheet takes over.

While the pane is docked, the dashboard is its own scrolling column, so its scrollbar sits between the dashboard and the chat rather than at the far right of the window, past the chat. The keys work as usual — PageDown, Space, End and the arrows scroll the dashboard — and maximizing or restoring the pane keeps you where you were reading. A floating or minimized chat overlays the page instead of standing beside it, so there the page scrolls as it always did. The phone’s bottom sheet overlays it too, but at full height it holds the page still underneath — including a flick that runs past the end of the conversation, which stays in the conversation instead of dragging the dashboard along. Pull the sheet down to its short height (the panel-height button beside ×) and the page behind is yours to scroll again, which is what that height is for. With the on-screen keyboard up the sheet ends on the keyboard’s top edge, so the whole conversation and the question box stay on screen and nothing of the page shows beside them.

Driving the dashboard from chat

The assistant doesn't just describe the dashboard — it can drive it. Type a command like "Go to allocation" and the app switches to the right tab, smoothly scrolls to the card, expands it — and the assistant comments in the same message, using the very numbers the card shows and whatever you discussed before. Three starter buttons under the one-click report cards suggest example commands to try.

You typeWhat happens
Navigate & reveal
  • "Go to allocation"
  • "Show Risk"
  • "How is my dividend income doing"
  • "What are important upcoming events"
  • "How much did I trade in June?"
Switches to the Portfolio tab, smoothly scrolls to the matching card — Allocation, Risk, Dividends & income, the Events card's Upcoming section, the Trading Activity punch card — expands it, and comments on what it shows.
Filter holdings
  • "Which are my top 5 holdings"
  • "Show only my tech stocks"
  • "Show my worst performers this year"
Scrolls to the holdings table and sets its smart filter, then comments on the result. Top-N and metric filters ("top 5 holdings", "my best PEG holdings") are answered rule-based and come back ordered; semantic ones ("tech stocks") run on the fast model.
Control the chart
  • "Compare me to the S&P 500"
  • "Zoom the chart to this year"
  • "Show the last 5 years"
Scrolls to the value chart, switches it to Return % mode and turns on the S&P 500 TR benchmark, or presses the matching range button — then summarizes how the portfolio did over that window.
Run simulations
  • "What if I buy 1.2 shares of nvidia"
  • "What if I sell half of my Tesla?"
  • "How much do I need to invest monthly to have 500k in 2040?"
Switches to the Simulation tab, prefills and runs the what-if trade — or fills the Future simulator's goal seek — and summarizes the real simulation output and, for projections, the assumptions behind it.
Explore the market
  • "Show me the largest companies"
  • "What's moving today?"
  • "Heatmap of my portfolio since I bought"
  • "Heatmap my AI plays list over the year"
Switches to Explore, scrolls to the Markets table and its eight lists, and highlights the movers most relevant to your holdings and watchlist — or opens a heatmap on the grid and time window you asked for, switching to whichever tab it lives on: the Market heatmap on Explore (which also paints your starred watchlist or any named list of it, by name), the Portfolio heatmap under the value chart. For an index, ask “show DAX 40” or “show the S&P 500 heatmap”. The assistant selects the list and can sort its loaded rows. A named watchlist you do not keep is answered with the ones you do, rather than an empty map.
Look up any company
  • "Is Palantir expensive?"
  • "What's the news on Novo Nordisk?"
  • "How did ASML's last quarter go?"
  • "What do you think about recent LMND earnings?"
Fetches the figures live for a company you don't own, rather than answering from memory: the quote (price, market cap, the valuation / growth / quality / debt ratios, the 52-week range, the analyst target and the app's own score with its reasons — the same row the Explore table shows), the latest news headlines with links, and the earnings picture: upcoming earnings and dividend dates, the last reported quarters with their EPS beat or miss, and the company's own results filing downloaded from the SEC — the earnings press release or shareholder letter inside the 8-K (a 6-K for foreign issuers, the 10-Q otherwise), so an answer about a quarter quotes revenue, margins and guidance as the company wrote them. A company name resolves as well as a ticker, and the reply names the one it landed on. Where one source can be checked against another it is — a silent earnings-dates table is backed up by the quarterly history, and the SEC filing is found from the company's filing history even when no earnings date could be fetched — and whatever is genuinely missing is reported with its reason ("the SEC only covers companies that file with it", which is why European listings, crypto and most ETFs have no filing) instead of guessed at.
Quick actions
  • "Tell me about my Nvidia position"
  • "Add ASML to my favourites"
  • "Switch to dark mode"
  • "Show values in USD"
Opens the asset's detail drawer with a summary of the position, stars the stock into your favourites with a one-line take, or applies the appearance / currency setting immediately.
Change settings
  • "Set quote refresh to 30 minutes"
  • "Disable the Kraken source"
  • "Set my strategy to dividend growth, 15-year horizon"
Adjusts ⚙ Settings values by name, one or several in one request ("set risk to low, horizon to 45 and refresh cadence to 30 minutes" applies atomically) — refresh cadence, data sources on/off, investing strategy text / horizon / risk level, the six trade-plan values, assistant proactivity — through the exact same staged-save path as the dialog's Save button (settings that need it rebuild the portfolio in place — a slim "Rebuilding portfolio…" pill shows while it runs, no page reload). Out-of-range values are refused with the valid range named, and if the Settings dialog is open with unsaved edits the assistant declines rather than saving your half-made changes.

Ask where something is

The assistant carries a map of the whole app: every tab, card, chart view, heatmap and ⚙ Settings tab, with what each one shows. Ask "where can I see my drawdown for this year?" or "how do I see each account's cash?" and it names the place that fits your question, as a link that takes you there. The same word can mean different places. The drawdown of the whole portfolio is Portfolio value over time › Drawdown, the value chart's Drawdown view. The drawdown of each position you hold is Portfolio heatmap › Drawdown, or the Drawdown column of the holdings table. The drawdown of your favourites or of a market list is Explore › Heatmap › Drawdown. Each account's cash is listed on the Cash tile, and each account's value in the accounts list on the Portfolio value tile.

Say "show me" or "take me there" and the assistant switches there itself: it changes the chart's view, tints a heatmap, opens the Simulation tab at What if I trade? or the Simulator, or opens ⚙ Settings on the right tab, scrolled to the section ("where do I set my allocation targets?" lands on ⚙ Settings → Trades → Allocation targets). Opening Settings never changes or saves anything. For anything the map doesn't cover, it searches this manual.

Custom assets by conversation

You can also create data by talking: ask for "add my apartment in Prague, bought 2019 for 200k EUR" and the assistant collects whatever is still missing — name, purchase date, price, currency, an optional yearly appreciation — asking follow-up questions until the entry is complete, then creates the asset. It appears under ⚙ Settings → Data exactly like a manually added asset: part of your allocation and history, toggleable and editable any time.

Market-priced assets work the same way, live-priced: "add 2 oz of gold futures" or "add 10 shares of RHM.DE" resolves your words through the same symbol search the Settings bar uses and adds the position — priced from live market data in the holdings table, allocation and charts, like any broker holding. An exact ticker adds directly; when several listings match a name, the assistant lists the candidates and asks which one you meant before anything is added. The acquisition date defaults to today and the per-unit price to the market close on that date unless you state them. It also reads positions out of an attached file or a screenshot — paste a brokerage position list and it adds each line as its own asset. A multi-asset add like that recalculates the portfolio once, at the end rather than after every line: each position still shows its own “Adding…” chip and reports its own success or failure, but the “Recalculating summary & analysis” pass runs a single time for the whole batch.

Every added asset lands in a named group — an account in the Portfolio value card. The assistant sees the groups you have and puts the asset into the one that fits ("add my cottage to Real estate"); when none fits, or you have none yet, it names a new group itself, and positions it adds together from one brokerage screenshot share one. Renaming, splitting or deleting a group stays yours, under ⚙ Settings → Data: a group is not a data source with a switch of its own, so the assistant includes or excludes its assets one by one.

What was added can be edited and switched by conversation too. "change the buy date for SOL and AAVE to 2021-09-01" edits the existing positions in place (edit_asset) — quantity (the new total), acquisition date and per-unit price for a market-priced asset; date and the value at that date for a manually tracked one — changing only the fields you name, exactly like the row inputs under ⚙ Settings → Data. A manually tracked asset's value is compounded from its acquisition date at the yearly change you gave it, so “what it is worth today” is date = today and price = that value. A market-priced position whose price you never typed re-prices to the market close on its new acquisition date when the date moves — a price you typed is never touched, and the same holds for the Settings row. Two hand-added lots of the same symbol come back listed with their ids so the assistant can ask which one you meant. And the include/exclude ticks there answer to chat as well: "exclude my Prague flat" or "turn my Kraken account back on" flips one added asset (toggle_asset — every lot of a symbol, unless an id picks one) or a whole data source (toggle_account) in or out of the portfolio without deleting anything; an account name that fits several sources is asked about, never guessed. Several edits or toggles in one reply share a single recalculation, the same way a multi-asset add does. Holdings imported from broker files stay managed by their files — the assistant says so rather than guessing at them.

What you can rely on

A turn that goes wrong

Since 04.09.2026 a turn always ends in something you can act on:

The complete action reference

Everything above runs on a fixed vocabulary of 52 typed chat commands — each with a strict name, parameters and allowed values; a request that doesn't map onto one of them is answered in plain text instead of guessed at. You never type these names yourself — plain English is the interface — but the list below is the authoritative "what can it actually do", and it is how a skill references an action: a skill's text can name one by its action name ("on app start, use the show_card action with card allocation") and the assistant carries it out. Parameters marked ? are optional.

Actions: navigate & reveal

ActionParametersWhat it does
show_cardcard — one of allocation, risk, events, income, holdings, chart, insights, value, cash, pl, fundamentals, drift, assets (Portfolio — drift is the Allocation drift bars at the foot of the Allocation card, inside that card’s “Full breakdowns” expander — which show_card opens for you, and expand: false closes again; assets is the Value per asset card above it), recommendations, trade_plan, recent_trades (the Recent trades table under the plan), trade_flow (the Money flow chart under it), activity (Trades), trades_summary, tax_lots, sell_optimizer, maturing_lots, annual_gains, transfers, manual_lots (Taxes); expand? (false collapses); collapse? — cards to close alongside; section? ("upcoming", events card only); month? ("YYYY-MM", activity card only)Switches to the card's home tab, scrolls to it and expands its breakdown. insights is the topbar Insights & alerts bell rather than a card: it opens the bell's list wherever you are (no tab switch), and expand: false closes it.
show_trades—Switches to the Trades tab.
show_taxes—Switches to the Taxes tab.
show_socialpane?: feed | friends; handle? — a friend's @handleSwitches to the Social tab; handle opens that friend's shared-portfolio view.
show_simulationcard?: whatif | simulatorSwitches to the Simulation tab and scrolls to What if I trade? or the Simulator. Only navigates; the simulation actions below run things.
open_settingstab: general | data | strategy | trades | taxes | social | alerts | assistant | about; section? — a section's label, e.g. "Allocation targets"Opens ⚙ Settings on that tab, scrolled to the section with a brief highlight. A section the tab doesn't have is refused, with the tab's real sections named. Only navigates: nothing is changed or saved (set_setting changes a value).
exploretable: top | movers | favourites | heatmap | macro (the Macro card: central-bank rates, VIX, the yield curve); for the heatmap also mode: market | favourites | portfolio, list: a watchlist name, and range: 1D … 10Y | PosShows an Explore-tab surface: one of the three tables (largest companies, most active today, your watchlist), or a heatmap — mode picks the grid and switches to the tab it lives on: market is the Market heatmap on Explore, favourites is that same card over everything you have starred, list is that card over one named list (which implies favourites; the name is matched however you capitalised it, and a name you do not keep is refused with the ones you do), and portfolio is the Portfolio heatmap under the value chart. Leave mode out and it acts on whichever heatmap you are already looking at. range is the window the colours measure and each grid remembers its own; Pos — since each position was first held — exists on the Portfolio heatmap only, and a window a heatmap does not have is refused rather than guessed at.
sort_tabletable: holdings | top | movers | favourites; column — a column key; desc?Sorts that table by a column, like clicking its header.
expand_tradestarget: lots_row | lots_all | recs_why | recs_all_buys | recs_all_sells | weights; symbol (required for lots_row and recs_why); on? (false collapses)Expands or collapses a Trades/Taxes-tab element — a lot detail, the full candidate tables, the criteria-weight sliders.
open_assetsymbolOpens that asset's detail panel — a holding, a favourite, or any listed symbol the top-right asset finder can place, held or not. A ticker the finder cannot place is refused with the near misses named (“WD” → WDC.DE, WDC.F). On a wide window the panel stands as a column beside the dashboard, so the rest of the page stays usable while you read it.
open_breakdownwhich: value | plOpens the Portfolio value breakdown dialog (deposits → income → profits → today’s value) or the Total P/L views dialog (each reading of the profit and its percentage) — the dialogs a click on the Portfolio value or Total P/L figure opens.

Actions: chart, holdings filter & the tutorial

ActionParametersWhat it does
set_chartAt least one of: mode? (overall | companies | returns | drawdown); range? (1D | 1W | 1M | 3M | 6M | YTD | 1Y | 5Y | All); benchmarks_on? / benchmarks_off? (keys sp500, world, nasdaq, bonds, gold, usd, btc; benchmarks_off: "all" clears them all); lines_on? / lines_off? (line names: "total", an account name, "diversification", or an asset-type / sector line such as "type:Crypto", "sector:Technology"); from? ("YYYY-MM-DD", a year, or "all" to clear)Adjusts the portfolio value chart — mode, range, benchmark and value lines, custom start date. range already sets the day every comparison restarts from, so from is only for a date no range expresses. The two are mutually exclusive, exactly as in the card: a from date replaces the range selection (no range button stays selected) and a range clears the date, so sending both in one call is refused — from: "all" beside a range is fine, since it only clears the date.
set_as_of_datedate: "YYYY-MM-DD", or null for nowShows the Portfolio tab as it stood at that day’s close — the Time travel clock on the Portfolio value tile, done from the chat. Switches to the Portfolio tab first; null (or today) returns to the live portfolio. A day before the price data begins is refused, naming the earliest day that works (never the first transaction, which can itself be too early); a future day, naming today. The answer carries the day’s own figures — the total, the cash, that day’s move and how many holdings there were — so “what was it worth then?” is answered from that day, not today.
filter_holdingsquery — natural language; "" clears the filterSets the holdings table's smart filter ("top 5 holdings", "technology sector", "biggest losers this year", "most beaten down").
tutorialop: start | next | stop; level?: beginner | intermediate | advanced | foundations (with start)Drives the guided walkthrough that plays inside the chat — the three app-tour levels, or foundations for the Investing Foundations course. A finished walkthrough is collapsed to a chip on the Learn card, so asking for it in words is the other way back in: this verb restarts a completed course from step 1.

Actions: search, live market data & this manual

These fetch data for the assistant's answer and leave your view where it is:

ActionParametersWhat it does
search_assetsquery; smart?: true for the finder's semantic modeTypes into the topbar asset finder and opens its results; the hits — symbol, name, exchange and type — come back to the assistant. This is also how the assistant resolves an asset you describe by name: ask it to "simulate 200 a month into an S&P 500 ETF, a global equity ETF and a bond ETF" and it runs one search per asset (exactly what typing into the finder would find), picks the matching tickers itself and carries on with the simulation, instead of asking you for exact symbols. It only asks when the matches are genuinely ambiguous — and then it names the top candidates to pick from.
market_lookupsymbol — a ticker or company name, or symbols — a list of up to 25 of them (the two are mutually exclusive); parts? — any of quote, news, earnings (default quote)Fetches live data for any company, held or not — price and ratios, headlines, earnings dates and the company's own SEC results filing. Several companies come back in one action, keyed by ticker, with any that could not be resolved named.
price_ondate — YYYY-MM-DD, up to 8 of them, or "today"; symbol? — a ticker or name; currency? — the code to price it in; fx? — pairs like USD/CZKWhat something was worth on a given date. The assistant’s portfolio context is today’s snapshot plus rolling changes, so “what was Bitcoin worth on 1 August?”, “what did it cost at the beginning of April, and what is the change?” and “what was the CZK rate then?” used to have no answer in it. This reads the close off the same daily price series the charts are drawn from, and converts it at that day’s exchange rate, not today’s. Ask for several dates in one go, and the assistant does the percentage change itself. When the market was shut on the date you named it answers with the last trading day before it and says so; where a split has happened since, it can give both the split-adjusted price (comparable with today) and what the share actually traded at on the day.
docs_lookuplabels — 1–5 section labels ("page#anchor")Reads sections of this manual so the answer quotes the real text.
docs_searchquery; limit? 1–8Fulltext-searches the manual and website, returning the best-matching sections with links and screenshots.

Focused reads: asking for one table, not everything

With Full portfolio snapshot ticked in Assistant context the assistant is given your whole portfolio with every question — on a large portfolio that is tens of thousands of characters, most of it irrelevant to what you asked. The focused reads are the alternative, and what every unchecked box is served by: small, named, parameterised reads that fetch exactly the slice a question needs, from the same snapshot the rest of the answer is built on, so nothing is recomputed and nothing can disagree. There are fifteen of them, one per surface of the app, grouped below. They are also offered to agents you connect over MCP, where each one is a read-only tool. Every result says which currency its amounts are in, and a long list comes back one page at a time with a cursor to continue. Several tickers are one read. Anything that answers about a company takes a list of them — up to 25 — instead of being asked once per ticker: one position deep, a market lookup, a historical price, headlines, calendar dates, insider filings, tax lots and trade candidates. The answer is keyed by ticker, and no ticker you asked for can go missing quietly: one with no data behind it is named, and so is one the answer had to shorten to fit. The whole batch stays within one read’s budget. Amounts have always been in your display currency, never euros; since 11.09.2026 every field whose name ends in Eur (amountEur, buyEur, valueEur …) ships beside a plain-named twin (amount, buy, value) and the Eur half is deprecated — it will be removed in a later release, so an agent written against it should read the plain name.

You can see them happen. Consecutive focused reads share one bubble marked with the flash action icon above the answer, with one compact line per call — “Read your holdings (top 5 by weight)”, and the asset after a colon when the read named one — “Read one of your positions: NVDA”. Click the header to minimize or reopen the list, or, on a run of eight or more, the small round Collapse actions button floating at its bottom right, in a narrow strip beside the rows so it never covers a line. Internal assistant calls show their status without expandable arguments or JSON; failed reads keep their error message visible. Consecutive in-chat action blocks can also be folded together. The rows stay with the answer, and the conversation you save lists them one line each; they are never sent back to the model, which already had those results when it wrote the reply. Models that cannot call tools — most models you run on your own machine — reach the same reads a different way, by naming one in their reply; the app runs it for them against the same read-only registry and hands back the result, so a local model answers from your real figures too — in the browser and, from the next release, in the desktop app, where a local model is the default.

Most of the time the read has already happened by the time the assistant starts writing. Every message you send is first read by the quick, cheap pass that handles direct commands; where the model can call tools that pass may also recognise a question about your figures and name the reads the answer will need — up to four of them — so the app fetches them and hands the results over with your question. “What are my top 5 holdings” is then answered in one go rather than in two: one round to ask for the holdings and another to answer from them. It is a guess, and a wrong one costs nothing you would notice — the assistant still has every read available and simply asks for what it actually wants, the rows appear in the conversation exactly the same way, and a read that could not run is one the answer works around.

Actions: favourites & watchlist

ActionParametersWhat it does
toggle_favouritesymbol or symbols (array); on: true | false; list? — one of your list namesStars or unstars one or several symbols; with list, adds to / removes from that named list (an unknown list is created on add; unstarring removes from every list).
favourite_listop: create | rename | delete; name; newName? (rename)Manages the watchlist's named lists themselves. Deleting a list never unstars anything.

Actions: simulation

ActionParametersWhat it does
whatifsymbol; side: buy | sell; exactly one of quantity, amount (cash, in your display currency — also accepted under the deprecated name amountEur, never both at once), fraction (0–1 of the position)Simulates a trade in the what-if card ("sell half my Tesla" → fraction: 0.5).
dca_goalgoalAmount; targetYear | targetMonth ("YYYY-MM") | targetDate ("YYYY-MM-DD"); assets? — symbols replacing the plan's listRuns the Future simulator's goal seek: what to invest to reach the goal by the target.
set_simulationAt least one of: horizonMonths? (1–360); lookbackMonths? (6–240); mode? (dca | goal | none); assets? ([{symbol, amount?, days?}], replaces the plan's rows); sells? ([{amount, days?}], or false to turn periodic selling off); benchmarks? (chart benchmark keys); diversification? (overlay on/off)Adjusts the Future simulator's projection.
backtest_tradesinterval?: {unit: months | days, value} (monthly by default); weights? — criterion weights 0–100; transferPolicy?: strict (default) | cashEquivalentRuns the recommended-trade backtest: last year’s trade-plan recommendations replayed on the Simulation tab’s Historical mode, from dated prices and filed reports only — today’s settings applied in hindsight, not the ones you had then. The answer quotes the actual and passive results, the coverage and the transfer policy. It places no orders and changes no setting.

Actions: trades & taxes

The tax actions answer with illustrative orientation, never tax advice:

ActionParametersWhat it does
set_asset_targetname — a symbol; pct 0–100 (0 removes)Sets one allocation target the trade recommendations pull toward, like ⚙ Settings → Trades.
set_sector_targetname — a sector label; pct 0–100 (0 removes)Same, for a sector target.
tax_free_summarysymbol? — narrows to one assetFetches the current tax-lot summary (tax-free sellable value, next time-test maturity, YTD proceeds vs the small-sale limit) without changing tabs.
sell_planamount — how much to raise, in your display currency; symbol?Runs the Sell optimizer: which open lots to sell for the lowest estimated tax.
add_manual_lotsymbol; date "YYYY-MM-DD"; qty; unitCostEur — the cost per unit, genuinely in EUR here (the app converts it at the lot’s own date); source?; note?Adds an opening-balance tax lot for purchases predating your uploaded history.
transfer_actionsymbol; op: confirm | dismiss | undoSettles a suspected inter-account transfer on the Taxes tab — all three reversible.

Actions: adding & editing data, notes

ActionParametersWhat it does
add_manual_assetname; date "YYYY-MM-DD"; price; currency?; apy? (percent per year); group?Adds a manually tracked asset (real estate, physical gold…) — the assistant asks for missing required fields first. group is the named group it joins — one you have, or a short new name the assistant picks; without it, the first group.
add_market_assetsymbol (exact ticker) or query (words to resolve); quantity; date? (defaults to today); price? (defaults to that date's market close); group?Adds a market-priced position without a broker export — anything the market-data feed can price. Ambiguous names come back as candidates to pick from. Several adds in one reply share a single portfolio recalculation. group works as for add_manual_asset; positions added together from one brokerage share one.
edit_assetsymbol (ticker), name or id (from an ambiguity answer); any of quantity? (the new total; market-priced only), date? "YYYY-MM-DD", price?Edits an existing hand-added asset under ⚙ Settings → Data — only the named fields change. price is the per-unit acquisition price for a market-priced asset (a never-typed one follows a date change to that date's close); for a manually tracked asset it is the value at the acquisition date, compounded from there. Several edits in one reply share a single recalculation; broker-imported holdings are not editable this way.
toggle_assetsymbol, name or id; on: true | falseThe include/exclude tick on a hand-added asset's ⚙ Settings → Data row — takes it out of the portfolio (or back in) without deleting it. A bare symbol switches every lot of it; an id picks one.
toggle_accountname — exact, else a fragment that fits one source; on: true | falseThe same tick for a whole data source — an uploaded export or a connected account (equivalent to set_setting's source_enabled). A fragment that fits several sources comes back naming them.
sync_connectorname? — an account name, loosely matched; omitted syncs every connected onePulls fresh data now from a directly connected exchange/broker, like its Sync button. Runs in the background; CSV uploads are not connections.
add_notetext — up to 500 charactersSaves a standing investing note 📝 (up to 20).
save_memorytext — up to 300 charactersSaves one concise assistant memory 🧠 (50 kept — the oldest rolls out). The assistant also uses it on its own after a non-trivial answer.

Actions: social

These need a signed-in account with Social switched on; a friend's figures are always relative (percentages and ratios, never money amounts):

ActionParametersWhat it does
friend_portfoliohandle; brief?: true for the short form (used when fetching several friends at once)Fetches what one friend shares — allocation, holdings by weight, performance, risk — for the assistant's answer, without leaving your tab.
group_portfoliogroup: friends | investors; weighting?: equal | aum (investors only — weighted by each fund’s filed equity)Reads what the room holds — your friends’ or your followed investors’ combined holdings — beside yours: the gap is your weight minus the group’s, in percentage points. Friends are equal-weighted; the investor group needs Pro. Members whose data cannot be read are left out, and the 13F caveats come with the answer.
super_investor_portfolioname — an investor on the rosterReads a Super Investor’s latest SEC 13F portfolio — holdings by weight, sectors, the quarter’s new / added / trimmed / sold-out positions and an approximate return. Only for an investor you follow; the answer always says what a 13F is not: quarterly, up to ~45 days old, US long positions only, the return approximate. A name not on the roster comes back with the roster.
follow_super_investorname; off?: true to unfollowFollows (or unfollows) an investor on the roster — one-way and reversible, nothing to approve. The free plan follows two; past that the answer names the Pro upgrade.
social_feedlimit? 1–10Reads the friends' feed (posts, attachments, reactions), newest first, from any tab.
social_requests—Lists pending incoming and outgoing friend requests. Read-only by design: answering a request happens on the Social tab, never in chat.
publish_snapshot—Pushes an updated snapshot to your friends now. Publishing is otherwise automatic, and an hourly publish cap applies.

Actions: settings & appearance

ActionParametersWhat it does
set_thememode: dark | light | autoSwitches the color theme.
simple_viewon?: true | false; cards? — the full list, in order, from value, cash, pl, fundamentals, chart, heatmap, allocation, risk, income, events, holdings (one of the two at least)The Portfolio tab's Simple view: switches it on or off and/or arranges its cards — the same switch and list as ⚙ Settings → General. cards is always the whole list in the wanted order (the assistant knows the current one while the view is on, so “add the risk card” is that list plus risk); on alone flips the switch and keeps the list. Off leaves the full page and never touches another tab. A show_card for a card the view hides is refused with the list to send instead.
set_currencycode — one of the 30 supported display currencies (USD, EUR, GBP, CZK, …)Switches the display currency; the portfolio rebuilds and the dashboard refreshes in place. It also re-values the trade plan (⚙ Settings → Trades: Invest, Min order, Sell, Min sale) at the current rate — the plan is stored without a currency of its own, so a bare switch would restate 10 000 CZK as 10 000 USD — and the reply names both amounts ("Invest 10,000 CZK → 480.28 USD"). No exchange rate available refuses the whole switch rather than restating the plan; asking for the currency already in use is a no-op; the two tax thresholds carry their own currency and are left untouched. Refused while ⚙ Settings is open with unsaved edits, whose staged plan would overwrite the converted one.
set_modelmodel — an id from the current provider's model list; fast?: true targets the fast slotSwitches the conversation model (or, explicitly asked, the fast model).
set_settingkey, value, source? — or a settings array applying several atomically. Keys: quote_refresh_minutes (a ladder, not a range: 15, 30, 60, 120, 240, 480, 720 or 1440 minutes), context_trade_months (0–24), context_sections (an object of true/false over strategy, notes, memories, macro, recentTrades, events, favourites, news, tradesDigest, docs, portfolio — which parts of the assistant’s context ride every message, overlaid on the saved choice; “always send my news” is {news: true}), proactivity (off | minimal | active), strategy_text, strategy_horizon_years (1–50), strategy_risk (low | medium | high; like the ⚙ Risk selector it swaps a thesis that is empty or still one of the presets for that level’s preset, keeps one you wrote yourself, and reports which it did — in the app’s chat and from a connected assistant alike; a strategy_text in the same batch wins), buy_amount, buy_count (1–10, subject to eligibility and capacity), buy_min_order, and the independent sale amount sell_amount (0 = no sell plan), sell_count (1–10), sell_min_order, pairing_mode (fifo | optimize | optimizeYearly), time_test_years (0–10), crypto_time_test, crypto_time_test_from, small_sale_limit / exempt_gains_cap (the amount, in the threshold's own currency) with small_sale_limit_currency / exempt_gains_cap_currency (an ISO code — converts the threshold at today's rate; refused, not guessed, when no rate is available) and the _czk spellings of both (the same amount stated in CZK), tax_rate_pct (0–60), the eight trade_weight_… keys (0–100: quality, valuation, fair_value, analyst_upside, momentum, drawdown, dividend, group_consensus), buy_candidates_from (owned+favourites | owned | favourites — ⚙ Settings → Trades’ “Buy candidates from”: which universe the BUY side of the Trades recommendations is scored over; the sell side is always what you hold) with buy_candidates_list (a watchlist list by NAME, or all for the whole starred set — “only recommend from my WannaBuy list” is the two together in one batch), alert_move_rule and alert_drawdown_rule (the two ⚙ Settings → Alerts rule lists: a threshold percent plus an optional scope — all, an asset class or a ticker — and, for drawdowns, an optional days lookback the peak is taken over; 0 removes the rule), source_enabled (with source: the account name), and the Social switches social_enabled, social_presence, social_share_holdings / performance / allocation / risk / buy_plan / targets / plan_tier / platform / brokers / trade_events (signed-in accounts only)Changes dashboard settings through the exact same staged-save path as ⚙ Settings' Save — out-of-range values are refused with the valid range named (and for the refresh cadence, which is a ladder rather than a range, the whole list of allowed steps), and a batch applies all-or-nothing.

Actions that fetch data (market_lookup, price_on, docs_lookup, docs_search, search_assets, friend_portfolio, social_feed, social_requests, tax_free_summary, sell_plan, sync_connector, …) hand their result back to the assistant, which answers grounded in those numbers; when an action fails, the assistant reports the actual reason and answers textually — the guarantees above apply to every verb on this page.

Asking about several things at once. One question can run many of those lookups — eight companies to compare, or every friend's portfolio — and all their results travel back to the assistant in a single message with a size limit. When the whole batch would not fit, that space is shared out evenly rather than filled first-come: every company still comes back with its identity and its headline numbers (price, market cap, the ratios, the dates), and what gives way is the bulk inside the big ones — the news headlines and the SEC filing text — starting with the largest. Each result that lost something says exactly what, so the assistant tells you (“I have the quote for all eight, but the filings didn't fit”) instead of quietly answering from memory, and can offer to re-fetch the one or two that matter. Nothing is ever handed back half-written: if even that is not enough — hundreds of results at once — whole results are left out and the assistant is told how many.

Planner settings: use set_setting with max_company_weight_pct (null clears), allocation_mode (ratings/targets), or planning_targets (funds, crypto, stocks, cash). Batch a target mix with its mode; active percentages total 100%. Invest is new money; Sell is independent. Rules and example.

One-click reports ✨

Suggestion cards sit right below the assistant's opening message (dimmed, with a single "Assistant unavailable" line above the row, while disconnected). Clicking one posts the exact server-side prompt as your side of the conversation — a compact bubble with a "show full prompt" expander, so what you read is literally what the model receives — and streams the report into the chat, where follow-up questions build on it. Clicking again regenerates; a grey timestamp stub on the card jumps back to the report.

A card carries only its title — "✨ Generate Portfolio brief". What the report actually contains, including live numbers like your saved risk and horizon or the budget the buy plan will spend, is in the card's tooltip: hover anywhere on the card and it opens at the cursor, leading with the report's own sentence (the same one the table below gives) and closing with what a click does. Only what is actionable or a state stays printed on the card: the ⚙ Settings deep links, the last run's timestamp stub, the season's filing links, an error. Because the cards are half the height they used to be, two share a row wherever the pane is wide enough — the standard side dock, the narrowest floating window and the phone sheet all fit two, and one per line below that; the Learn card and the example questions underneath keep the whole width.

ReportWhat you get
Portfolio briefState of the portfolio, today's moves tied to actual news headlines, events ahead, major risks and watch items.
Strategy checkYour portfolio evaluated against your saved thesis, horizon and risk tolerance — an alignment score, what fits, what diverges, concrete sized moves to consider. Needs a saved strategy (the card deep-links to ⚙ Settings → Strategy).
Buy adviceExplains the current buy and sell orders, amounts and limits from Settings → Trades. Fewer orders and unspent money keep their plan reasons. Cached until the plan, strategy or month changes.
Earnings season digestA seasonal card that appears only as an earnings season wraps — once ~3 of your holdings (or a quarter of a smaller portfolio) have reported within ~6 weeks. One report aggregates the whole season: beat/miss/in-line verdicts from reported-vs-expected EPS, guidance changes from the SEC filings, biggest surprises first, weighed by position size. The Events card shows a matching one-line season summary that generates it on click.

Proactive tips

When connected, the assistant can comment as you work — star a stock and it might flag your existing concentration in that sector. Tune it with the Off / Minimal / Active slider in ⚙ Settings → Assistant (default: Active). Tips run on a compact context (~5× smaller than the chat's) plus a condensed digest of the conversation so far, so they fire fast (~1.5 s after your action, at most one attempt per 15 s) and never repeat what was already discussed.

A tip looks different from an answer to something you asked: it is the same bubble with a faint green wash, and it opens with a bold “Tip - …:” line saying why it appeared — “Tip - You looked at AAPL:”, “Tip - You opened the Trades tab:”, “Tip - You showed the S&P 500 benchmark:”. That line is written by the app from the action that set the tip off, not by the model, so it is always there and always true. The small arrow in the tip’s top-right corner, beside Copy, folds it down to that line and the start of its text, and opens it again; clicking an open tip’s text shows when it was written, as on any other message, and clicking a folded tip opens it. Tips also fold on their own so they never crowd the conversation: only the newest two tips are open, and every older one folds as soon as a newer tip arrives — however long the conversation below a tip grows, that alone never folds it. A tip you open again yourself counts as new: it stays open until two more tips have arrived, then folds like the rest. A tip you fold stays folded, and both choices are kept when the page reloads.

Investing notes 📝

Short, timestamped reminders you write for the assistant — "sell X before earnings", "when the FED raises rates, reallocate more into bonds". Edit them behind the always-visible 📝 pill next to the asset search in the topbar (it pins to the screen as you scroll, on every tab), or under ⚙ Settings → Strategy, where they live alongside your investing thesis: up to 20 notes of 500 characters each, newest first. You can also just ask the assistant — "add a note: watch my cash level this month" — and it saves the note itself. They travel with every chat message, proactive tip and ✨ report — a tip can point back to "your note from 12 Jul", Buy advice weighs them when drafting the trade plan, and Trades-tab candidates your notes mention get a small 📝 hint (the rule-based scores stay untouched). The assistant treats notes as your standing intentions: it weighs and references them, pushes back when your data argues otherwise, and never executes one on its own.

Assistant memory 🧠

The assistant also keeps its own notebook: concise memories saved across chats. After a non-trivial answer it can file a short line — phrases, terms and values, never prose ("worst PEG: INTC 3.1; advised trim") — recording what you asked or assumed and what it concluded; you can also just say "remember that I prefer dividend stocks". Every memory is stamped automatically with the situation it was saved in — the date, which accounts were loaded, and your overall portfolio value at that moment, nothing more — and the whole list travels with every chat message, so a new conversation picks up where the last one ended. The assistant reads those bracketed figures as historical, never as today's numbers. Up to 50 memories of 300 characters; when the list is full, the oldest rolls out to make room. Review them under ⚙ Settings → Assistant → View memories — a dialog just like the investing notes, where each line shows its stamp and can be edited in place or deleted (editing keeps the stamp: it describes the moment of saving). The Assistant memory switch beside the button (on by default) turns the whole feature off: nothing new is saved, the list stops travelling with your messages, and your saved memories stay put — still yours to review, edit or delete — until you switch it back on. Where notes are your standing intentions, memories are the assistant's record of what was discussed.

Skills — reusable custom instructions

Skills are Markdown files with standing instructions the assistant follows — output formats, focus areas, opening routines. Manage them under ⚙ Settings → Assistant → Skills: upload a .md file, click a skill's name to edit its text in a larger editor dialog, untick it to keep it without applying it, or ✕ to delete. Changes apply immediately (no Save needed), and skills are stored with your other session data — they survive restarts, ride the browser backup, and move into your account when you sign up. Limits: up to 10 skills, 16 KB each, 40 KB of enabled skill text in total. The chat's Context window lists your skills as their own section with a token estimate. A skill can also tell the assistant when to act, naming any of its dashboard actions from the complete action reference by name — show_card, sort_table, docs_lookup and the rest. Skills customize behavior — they can never override the assistant's safety and grounding rules, and never make it present financial advice.

Targeting surfaces with applies-to

The first line of a skill may name which assistant surfaces it applies to — for example applies-to: chat, tips. Parsing is lenient (Applies To =, an optional --- fence around the line, any comma or space separation all work); the line itself is stripped before the text reaches the model. Without a header, a skill applies to the chat only.

TargetWhere the skill's text is injected
chatThe conversation — every chat message's system prompt (the default).
tipsProactive tips — the compact context behind the assistant's volunteered remarks.
reportsThe one-click ✨ reports: Portfolio brief, Strategy check, Buy advice and the seasonal Earnings season digest.
appStartThe first exchange of a fresh chat session — the assistant's opening reply carries the skill as an app-start directive (clearing the conversation starts a fresh session).

Example skills

An output-format skill for the Portfolio brief (save as brief-format.md):

applies-to: reports
When generating the Portfolio brief, always format the output like this:
- open with a single-line verdict (calm / watch / act), then the sections
- every number in bold, every percentage with one decimal
- close with "Next review:" and a suggested date

A tips-behavior skill:

applies-to: tips
When generating tips, include the concrete EUR amount at stake whenever
you mention a position, and prefer tips about concentration risk over
tips about daily price moves.

An app-start skill — the assistant's first reply of each session honors it:

applies-to: appStart
On app start, list my top 5 holdings by value with their last daily moves,
one line each, before anything else.

A skill that references actions by name — the assistant performs them when the skill's condition is met:

applies-to: appStart
On app start, use the show_card action with card "allocation" and comment
on the two largest weights. Then sort the holdings by this year's return
(the sort_table action on the holdings table, column returnPct, descending).

Four ready-made investing skills sit directly in ⚙ Settings → Assistant → Skills behind "Need inspiration?" — dividend-focus (income-first advice), value-discipline (valuation guardrails on every buy), risk-guardrails (concentration warnings) and opening-checkin (a recap when the app starts). One click adds them; edit the text afterwards to make them yours.

Your own agent — Pro

Connect your existing Codex, Claude Code, the Claude app, ChatGPT — or Siri, through the MCP Agent iPhone app — to your portfolio with MCP, the connection protocol shared by these clients. You need a paid Pro Fortunest account and your chosen agent installed and signed in. No provider API key is needed for the Fortunest connection.

In Settings → Assistant, click the External agents button in the connection subpanel beside Assistant overall. The compact list below it shares the same connections and Revoke controls as the detailed view. The button opens the connection dialog above Settings: the connection status, your connections with their permissions and expiry, their last-active and connected times and client-id prefix in full (each with Revoke), connection-wide permissions and the synchronized-portfolio controls. There, click Connect to agent to open the setup dialog, then choose your client for copyable instructions. Connection help stays collapsed until you expand it. Follow the web steps below for the hosted portfolio, or the desktop steps for the installed Fortunest app. Keep a dashboard open when asking an agent to control it.

For a short first-connection check, plan boundaries and the desktop hosting requirement, see connect an MCP agent to your portfolio.

The dashboard reacts immediately. Since 12.09.2026 an open Fortunest tab holds a live connection to the server, so an agent’s work shows up the moment it happens: the action it asked for runs in the tab, and the approval card and the agent-activity list update at once, instead of waiting for the tab’s next check a few seconds later. Nothing extra crosses the connection — it only says “there is something new”, and the tab then reads it the way it always has. If the connection cannot be opened (an office network or a proxy that holds streamed responses back), the tab falls back to checking on its own timer and everything still works, just a little later.

Codex app — hosted portfolio

  1. Sign in to your paid Pro account in Fortunest.
  2. In Codex, open Settings → Plugins → MCPs. Use Add to add an MCP server. Set the name to fortunest, choose Streamable HTTP, and fill in the fields below.
    • URL: https://app.fortunest.ai/mcp
    • Bearer token env var: Leave blank.
    • Headers: Leave blank.
    • Headers from environment variables: Leave blank.
    Fortunest uses browser sign-in (OAuth). No API key or manually entered token is needed. MCP_BEARER_TOKEN is placeholder text; do not type it in. For another Fortunest deployment, copy its endpoint from External agents Settings.
  3. Click Save, select Restart if offered, then Authenticate beside the server.
  4. In the browser, sign in to the same Fortunest account, review the requested permissions and click Allow connection. Return to Codex.
  5. Return to Codex’s MCPs list and check fortunest, then start a new task and try the read-only check below.
Correct Codex Fortunest MCP settings: URL https://app.fortunest.ai/mcp, with Bearer token env var, Headers, and Headers from environment variables left empty
Correct hosted settings. Fill in only the URL: https://app.fortunest.ai/mcp. Leave Bearer token env var, Headers and Headers from environment variables blank. The gray MCP_BEARER_TOKEN, Key and Value text shown here is placeholder text in empty fields. Save any changes, then return to the MCPs list and select Authenticate for browser sign-in. Click the image to enlarge it.

Couldn’t connect to fortunest: open the gear beside fortunest in Codex’s MCPs list, verify the URL above and clear any values you entered in the bearer-token or header fields. Save changes, restart if offered, then select Authenticate and complete browser sign-in. The enabled toggle alone does not confirm a connection. If the details say invalid_redirect_uri or “Only allowlisted native loopback callback paths are accepted”, the Fortunest server needs a Codex callback compatibility update. Retry Authenticate after that server update; a token or header will not fix it. For other errors, note the exact message from Codex or the sign-in page.

See the official Codex MCP documentation for connection and OAuth configuration.

Claude app — hosted portfolio

Claude on the web, Claude Desktop, Claude mobile and Cowork share one connector setup, brokered through your Claude account. Fortunest registers Claude automatically (dynamic client registration) and accepts Claude’s published callback https://claude.ai/api/mcp/auth_callback; there is nothing to register yourself.

  1. Sign in to your paid Pro account in Fortunest.
  2. In Claude, open Settings → Connectors (on Pro/Max: Customize → Connectors → +) and choose Add custom connector. Fill in the fields as follows:
    • Name: Fortunest
    • Remote MCP server URL: https://app.fortunest.ai/mcp — exactly, without a trailing slash.
    • Authentication: Always required (Claude detects this).
    • OAuth client: No client ID — register one automatically. Fortunest does not support Anthropic’s hosted client metadata, and you have no client ID of your own to enter.
    • Additional request headers: none.
    • Advanced → Transport: Streamable HTTP.
    No API key, client secret or header is needed. Click Add.
  3. Select Connect beside Fortunest. In the browser, sign in to the same Fortunest account, review the permissions and click Allow connection. Return to Claude.
  4. Start a new chat, open the tools menu (+), check that Fortunest is enabled and try the read-only check below.

Members of a Team or Enterprise organization need an owner to add the connector under organization settings; free Claude accounts get one custom connector. See the Claude custom connector guide.

ChatGPT app — hosted portfolio

Custom MCP connectors need ChatGPT’s Developer mode (Plus, Pro, Business, Enterprise and Edu plans; a workspace owner may have to allow them). Fortunest registers ChatGPT automatically and accepts its published callbacks.

  1. Sign in to your paid Pro account in Fortunest.
  2. In ChatGPT, open Settings → Apps & Connectors → Advanced settings and turn on Developer mode. Older versions keep the toggle under Settings → Connectors → Advanced or Settings → Security.
  3. Back in Apps & Connectors, choose Create and fill in:
    • Name: Fortunest
    • Description: optional.
    • MCP server URL: https://app.fortunest.ai/mcp — exactly, without a trailing slash.
    • Authentication: OAuth. Leave OAuth client ID and client secret blank.
    Confirm that you trust the application and click Create.
  4. ChatGPT opens Fortunest sign-in; if it does not, select Connect beside Fortunest. Sign in to the same Fortunest account, review the permissions and click Allow connection. Return to ChatGPT.
  5. Start a new chat, open + → More (or Developer mode), enable Fortunest and try the read-only check below.

See Developer mode and MCP apps in ChatGPT.

Discuss your portfolio in voice mode

Connect Fortunest using the Claude or ChatGPT setup above. In Claude, you can discuss your connected portfolio in voice mode. For ChatGPT Live, fetch a portfolio summary in a text conversation first, then switch to voice in the same chat to discuss that snapshot. Return to text when you need fresh portfolio data: Live does not currently call connected apps.

Checked 14 September 2026 against Claude’s voice guide and ChatGPT’s voice guide. Client availability and plan requirements can change. These are spoken conversations in the external clients; Fortunest’s dashboard actions remain typed chat commands.

MCP Agent on iPhone — Siri and Shortcuts

MCP Agent (Think Define Create; iOS 26) is an independent iPhone app that connects remote MCP servers to chat, voice, Siri and Shortcuts. Fortunest registers it automatically; the app finishes sign-in through its own app link (a private-use URL scheme the phone routes to the app), which the Fortunest server accepts beside loopback and hosted callbacks. Siri runs a Shortcut built from the app’s Ask MCP Agent action and speaks what Fortunest returns.

  1. Sign in to your paid Pro account in Fortunest.
  2. In MCP Agent, tap + to add a server and fill in:
    • Name: Fortunest
    • URL: for the app’s default on-device engine (Apple Intelligence, Siri) the small edition https://app.fortunest.ai/mcp/mini; with your own Anthropic or OpenAI key under the app’s Settings → Engine, the full edition https://app.fortunest.ai/mcp. Exactly as written, without a trailing slash.
    • Enabled: on.
    • Authentication → Method: OAuth 2.1.
    • Client ID and Client Secret: leave blank; Fortunest registers the app automatically.
    • Custom Headers: none.
    No API key, token or header is needed. Tap Save.
  3. Tap Fortunest in the server list and start its sign-in. iOS opens Fortunest in a sign-in sheet: sign in to the same account, review the permissions and tap Allow connection. iOS returns you to MCP Agent by itself.
  4. Open Chat (or Talk to the agent for voice) and try the read-only check below. Then build the Siri shortcut described below and say its name.

Apple Intelligence must be on, and downloaded. The app’s default engine is the iPhone’s on-device model, so Chat and Siri answer only once iOS Settings → Apple Intelligence & Siri shows the Apple Intelligence switch on and the note Support for Apple Intelligence is downloading has gone; until then the app prints Apple Intelligence is not enabled in red under your message. The switch appears only when the iPhone language and the Siri language are the same supported language — for example English (US) for both, chosen under Settings → General → Language & Region — and the download needs Wi-Fi and a charged battery. Your own Anthropic or OpenAI key under the app’s Settings → Engine skips the on-device model; with a key, use the full edition of the endpoint.

Two editions of the endpoint. https://app.fortunest.ai/mcp is the full Fortunest tool set — 88 tools, results of up to 8 000 characters — for agents with a large context window: Claude, ChatGPT, Codex, Claude Code, or MCP Agent with a cloud key. https://app.fortunest.ai/mcp/mini is the small edition for on-device models: the same sign-in and permissions (a connection to one is valid for the other), nine read-only tools — summary, top holdings, one holding, trade plan, allocation, risk, upcoming events, recent trades, watchlist — whose listing fits in about 600 tokens and whose answers are a few spoken sentences of at most 700 characters — company names rather than tickers, currency words rather than codes, and for the trade plan one reason per order, taken from the strongest criterion in its scoring (the same criteria the Trades tab weighs). Nothing in the small edition changes the portfolio, and every call still appears under Settings → Assistant → External agents. Apple’s on-device model holds 4 096 tokens for the prompt, the tool list and the answer together, so the full edition answers Exceeded model context window size there; edit the server in MCP Agent and switch its URL to the small edition. Right after a Fortunest restart the engine is cold and a first read can take close to a minute, longer than the app waits: the small edition then answers still loading your portfolio, ask again in a minute and keeps building in the background, so the retry is fast. Connecting the app also starts that build early.

Siri answers with the engine you chose in the app’s Settings → Engine — on-device, or your own Anthropic or OpenAI key; Fortunest needs neither. For spoken answers set iOS Settings → Apple Intelligence & Siri → Siri Responses → Prefer Spoken. Siri runs a Shortcut by its name. In the Shortcuts app add the Ask MCP Agent action with your question typed in — or set to Ask Each Time for a spoken prompt — add Speak Text pointed at its result, name the shortcut the phrase you want (My trade plan, Ask Fortunest) and run it once by hand so Siri learns it. Then say “Hey Siri, my trade plan”. Saying “Hey Siri, Ask MCP Agent” with the question in one breath does not reach the app, and without Speak Text Siri speaks only the first line and shows the rest as a card. The app’s Settings → Custom phrases builds the same kind of shortcut. The app’s free tier limits how many servers you can add and its own Pro lifts that — a separate subscription from Fortunest Pro. If sign-in fails with invalid_redirect_uri, the Fortunest server predates iPhone app support; retry after it is updated. See the MCP Agent support page.

Codex CLI — hosted portfolio

  1. In Terminal on the computer where Codex CLI is installed, run:
    codex mcp add fortunest --url https://app.fortunest.ai/mcp
    codex mcp login fortunest
  2. Complete the Fortunest browser sign-in and Allow connection step above.
  3. Start a new codex session, check /mcp and try the read-only check. Codex app and CLI share MCP configuration on the same host; you only need one setup method.

Claude Code — hosted portfolio

Fortunest advertises supported external-agent permissions during discovery, so Claude Code can request them for browser consent. The fixed callback port keeps the registered redirect URL consistent across sign-ins.

  1. In Terminal where Claude Code is installed, run:
    claude mcp add --transport http --scope user --callback-port 49310 fortunest https://app.fortunest.ai/mcp
    User scope makes the server available across your projects.
  2. Start claude, enter /mcp, select fortunest and follow its authentication prompt.
  3. In your browser, sign in to the Fortunest account containing your portfolio. Review the permissions and click Allow connection.
  4. Consent, sign-in and connection confirmation stay in the left panel above Settings, leaving Assistant chat accessible. If a fresh sign-in is required, Fortunest opens the sign-in form automatically and keeps your pending request through password, provider and two-factor authentication. After sign-in, review and allow the connection. The agent callback opens in another tab; Fortunest shows success only after the agent completes authentication. Use Continue to agent if your browser blocks the callback tab. If the request expires, restart authentication from the agent.
  5. Return to Claude Code, open a new session and check /mcp before trying the read-only check.

Installed Fortunest app — desktop bridge

  1. Open Fortunest and keep it running. In Settings → Assistant → External agents → One synchronized portfolio, click Connect hosted portfolio, then Open secure Fortunest sign-in. Complete sign-in, return to Fortunest, review which portfolio to keep and click Use selected portfolio and sync. This choice replaces one dataset; a backup preserves its previous inputs.
  2. Use a STDIO MCP server named fortunest-desktop. In Codex app’s Settings → Plugins → MCPs, use Add to add an MCP server, choose STDIO, and enter the command /Applications/Fortunest.app/Contents/MacOS/Fortunest and the argument --mcp-agent=codex, then Save and select Restart if offered. Alternatively, use the command for your client in Terminal:
    codex mcp add fortunest-desktop -- "/Applications/Fortunest.app/Contents/MacOS/Fortunest" --mcp-agent=codex
    claude mcp add --transport stdio --scope user fortunest-desktop -- "/Applications/Fortunest.app/Contents/MacOS/Fortunest" --mcp-agent=claude-code
    These paths assume a macOS installation in /Applications. On Windows/Linux, or with a different installation folder, substitute the full path to your Fortunest executable.
  3. Start a new Codex task, codex session or claude session. When the MCP server starts, the bridge opens browser sign-in. Use the same paid Pro account as the synchronized desktop portfolio and click Allow connection. The bridge handles authentication; do not run codex mcp login for this STDIO connection.
  4. Enter /mcp in your agent to check fortunest-desktop, then try the read-only check. The bridge accesses your synchronized hosted portfolio and requires the desktop app to remain open.

Check the connection

Ask your agent:

Use Fortunest to summarize my top five holdings. Do not change anything.

It should call Fortunest tools and return your portfolio’s holdings. Its grant also appears in Settings → Assistant → External agents, where you can revoke it. A saved MCP configuration alone does not mean authentication has succeeded.

If connection fails

Claude Code: Redirect URI not registered or invalid_scope

A saved callback URL can differ from the one used for sign-in, or the authorization request may omit permissions ("Explicit known permissions required"). Hosted Claude Code setup uses fixed callback port 49310. If you already added Fortunest, exit the pending authentication with Esc and exit Claude Code, then run these commands in Terminal to reset the user-scoped connection with explicit read-only permissions:

claude mcp logout fortunest
claude mcp remove --scope user fortunest
claude mcp add-json --scope user fortunest '{"type":"http","url":"https://app.fortunest.ai/mcp","oauth":{"callbackPort":49310,"scopes":"context:read portfolio:read dashboard:read"}}'
claude mcp login fortunest

Complete browser sign-in and restart Claude Code. This recovery connection can read portfolio and context but cannot change the portfolio or control the dashboard. These commands replace the user-scoped server entry; if you customized it or configured a project/local entry, update that entry instead. Port 49310 must be available. Choose another available port if needed, keep it fixed and repeat the reset. This recovery applies to hosted HTTP connections; the desktop STDIO bridge uses the reconnect steps below.

Tool list outdated: a connected client keeps the list of Fortunest tools it fetched when you added the connector, so a Fortunest update can leave it calling an older version; Fortunest tells clients that subscribe to server events to refetch it, and marks any connection still holding the older list Tool list outdated — reconnect in the client in Settings → Assistant → External agents until it does, which you clear by reconnecting Fortunest in that client.

Client reference: Codex MCP documentation, Claude Code MCP documentation, Claude custom connectors and ChatGPT Developer mode.

What you share and approve

Your connected agent can use the Assistant’s tools, calculations and context, including sent conversations, attachments, notes, memories, skills and reports. It can control a live dashboard and present attributed results. A command succeeds only when that dashboard acknowledges success. Failed actions remain marked failed in Agent activity.

Which tab. Every open Fortunest tab of your account is a dashboard the agent could drive, and with several open they used to look identical. Each tab now tells the server whether it is on screen and focused, which tab of the app it shows and what kind of browser it is, so the agent’s dashboard list reads Fortunest · Explore tab · Chrome · macOS · on screen rather than four times “Fortunest”. A command that names no tab goes to the one that stands out — the only tab open, the only one on screen, or the one you last clicked Approve in — and is refused up front, before any approval is asked for, when no tab stands out or the named one is gone. Approving an action delivers it to the tab you approved it in: the click is the one thing that proves which tab you are looking at, and that tab is remembered for the connection’s later commands. A closed tab drops off the list at once instead of lingering for most of a minute, and the agent’s tool result waits a few seconds for the tab’s own answer — “opened”, or why not — instead of reporting queued and leaving the refusal to a toast only you could see. You can see the same thing from your side: under the connection status in Settings → Assistant → External agents (and at the top of Agent activity) one line says An agent is driving this tab, or names the other one — An agent is driving another tab (Explore · Safari) — and says where an idle connection’s next command would arrive. An approval request appears in every open tab, so a request to move the dashboard now carries Will run in this tab: the tab you approve it in is the one that moves. Actions that only change data say nothing, because they belong to no tab.

Completed calls from connected agents also appear in Assistant chat. Consecutive calls share one flash-marked bubble whose header folds the whole list, for example Codex: read dashboard information. The agent’s own name leads the sentence, typed in its own colour and followed by a colon. When the call named an asset, the row says which: Codex: read one of your positions: NVDA, or a whole list after the colon — read the latest news: WDC, SNDK, MU, UBER, NFLX +2 more (five tickers, then a count of the rest). The tickers come from the call’s own arguments; nothing else about them leaves the disclosure. A run of eight or more actions carries a small round Collapse actions button at the bottom right of the open list — it stays within reach while you scroll the list and folds it back to its “⚡ N actions” chip. Above each action sits the same date-and-time line a generated reply shows, always visible without clicking. The connection label joins that line only when it differs from the app name, so the agent is never named twice; if two connections have the same name and label, a short connection suffix tells them apart there. Expand it to load the request and result. Failed, declined and undone calls say what happened; routine status checks stay out of the conversation. These bubbles work even without a chat model. A command the agent sends to this dashboard — sorting a table, opening an asset, showing a card — appears the moment the tab has run it: acknowledging the command is what completes the operation, so the page reads its agent status again right then rather than waiting for its next routine check. The live connection described above tells it the same thing and usually first; this read is the tab’s own, so the bubble still arrives with the action on a network that cannot keep that connection open. The server keeps the latest 100 calls whose details are retained (up to seven days); out of that pool chat shows the ones made during the conversation you are in: a new conversation — a fresh browser tab, Reset conversation, or the new session a sign-in brings — starts with no bubbles at all, while reloading the page keeps the running conversation’s. The times are the server’s, reconciled against your browser’s, so a computer clock a few minutes off neither hides nor repeats a call. Agent activity under Settings → Assistant lists the most recent operations.

Several agents can connect to the same portfolio. Their app name comes from the connection setup and their connection label from the connection you approved. New connections must supply an app name; older unnamed clients show External agent. These names identify the connection for display and are not verified product identities. Only one agent controls a particular dashboard at a time.

Open Agent activity in Settings → Assistant → External agents while an external agent is connected. Integrated Assistant chat and desktop synchronization alone do not enable this panel, and no agent banner appears at the top of dashboard pages. Integrated chat actions on web and desktop are automatically approved, with no additional approval dialog. Completed documentation and data lookups return their results to the assistant so it can answer in the same conversation without another message from you. External activity excludes integrated chat history. Pending approvals appear at the bottom of the AI Assistant conversation as compact cards. Expand Details to review the exact arguments and portfolio revision. Approve once, reject, allow matching bounded actions, or choose All actions from this connection for 1 hour or 8 hours. Connection-wide approval includes sensitive actions within the connection’s existing OAuth permissions and applies only to that connection. A new duration replaces its previous window; expiry and revocation are visible in chat and Settings. Later portfolio changes can still invalidate a proposal or its undo.

Agent activity stays within the left panel above Settings, leaving the Assistant chat available. Entries start collapsed with action, status and local timestamp. Click an entry to reveal its arguments, result or error and approval, resume or undo controls.

When an action runs without asking you again — because one of those permissions was still open — the agent is now told which permission let it through and when that permission expires: the connection-wide window, or the bounded permission for that action with the exact arguments it covers. An action you approved yourself carries no such note, so the two can never be confused, and a permission that has expired in the meantime sends the action back to you for approval rather than being trusted from when it was submitted.

New agent results show their title and the connected agent’s name with Open result. Retained results can be opened again in Agent activity after reloading. They remain separate from your integrated Assistant conversation.

External changes refresh open notes, memories, skills, favourites, followed investors and settings. Completed external syncs update connection status and activity counts in open Data settings. Unsaved settings stay in your draft, with a notice when saved values changed elsewhere. Resetting a conversation revokes access to the attachments shared through it; sent attachments renew while the dashboard stays connected.

Large context sections and group holdings are available in pages, so the agent can retrieve additional data without exceeding a response limit. Your portfolio context is also offered as named sections — the recommended trade plan, your holdings, your watchlist and the rest — so a connected agent asked for your recommended trades reads them in a single call instead of paging through everything. Every section name carries a one-line description of what it answers, so the agent picks the right one instead of reading everything first: the Trades tab alone is offered as four separate names — the trade plan, the buy candidates, the sell candidates and the tax-lot orientation. Asked “what are my recommended trades?”, a connected agent can also call one dedicated tool that returns just the plan: the buy and sell orders, what each costs, the net of the two and why the planner stopped where it did. Amounts are in your display currency. Nothing here places an order. That answer now carries the numbers and a pointer to the manual rather than the standing explanation of how the plan is built, which used to be repeated on every call and was longer than the orders themselves — an agent that wants the explanation asks for it, and gets exactly the same text. Every answer is likewise the outcome of what you asked for rather than a copy of the request, so a conversation with an agent spends its room on your portfolio instead of on bookkeeping. Connector progress never includes API-key identifiers or credentials.

After a Fortunest update, reconnect the connector to see new tools. Your agent stores the list of Fortunest tools it was offered when it connected, so a newly added tool or section stays invisible until you reconnect Fortunest (or refresh its tools) in the Claude app, Codex or ChatGPT.

The desktop app must be running. Connect its hosted portfolio in the same settings section; review both datasets and choose which one to keep. A backup preserves replaced inputs. Web and desktop then synchronize one portfolio, pause on conflicting edits, and queue automatic social publication. Successive edits share a background publication; a pending publication is not yet visible to friends.

Agent result text cannot execute actions. Inline charts cannot fetch remote resources. Connecting an agent never exposes your provider API keys or Fortunest login credentials. Review what you share with your chosen agent provider.

Smart search that uses Fortunest’s AI provider needs spending permission and an approved action. Ordinary asset lookups never silently trigger paid AI.

Completed action details and Undo are retained for 7 days, with minimal status history for 90 days. Interrupted actions require review and are never automatically retried. If no external agent is connected, recovery controls appear in Settings → Assistant. For external agents on desktop, review approvals and Undo in the hosted app.

Where else the assistant shows up

All of these run on the fast model, are marked with ✨ throughout the app, and stay visibly disabled (with a red "not connected" note) until you connect.

News summaries are shared, not per-person

The ✨ summary above a stock's headlines is the one thing here that isn't generated for you alone. The news about a company is the same news for everybody, so on the hosted app one summary per set of headlines is generated and then served to every reader. Two consequences, both in your favour:

Nothing about your portfolio is in that pool: it holds public article text and a ticker, with no account, session or holding attached. Filing summaries, insights, the brief and the chat itself are unaffected — those are about your data and stay entirely yours.

Action results, Undo and recovery

Undo checks the fields changed by its action. It refuses to overwrite a newer model/provider choice or a source that has since been replaced, even if its label is unchanged. A dashboard refresh arriving during an earlier refresh remains pending until its own acknowledgement.

Read-only agent requests retain their permissions, audit and retry identity while allowing ordinary portfolio edits to proceed. A busy reader pool asks the caller to retry. Failed browser recovery keeps its original backup; do not treat a partial recovery or an unconfirmed action as complete.

Desktop portfolio sync now preserves original favourite added dates. Upgrade the hosted app and desktop together before resuming sync; older readers reject the new format, and a new desktop identifies an old backend when its response is recognizable. Re-sync cannot recover dates already lost before this change.

Read a group portfolio

Ask “compare my portfolio with the friends group” or “what do my followed funds hold?”. The group_portfolio action reads consensus, allocation, overlap and approximate flows. Specify group: friends or investors; investor groups require Pro and optionally accept weighting: aum. Friends support equal weighting only. The assistant can describe the open group overlay and preserves the filing and flow caveats. Investor allocation coverage reflects cached metadata; unclassified weights are not missing holdings. An open group can expose current holdings while classification or history is still loading; its context names those unfinished sections.

Investor groups omit positions below 0.5% of each fund’s full filed equity value, retaining exactly 0.5% and original weights. Omitted counts and weight are visible, including per-fund details. Holder counts and history apply this cutoff; absence can mean a small holding, not no ownership or a sale. Flow actions still use actual filing changes for positions meeting the cutoff in either quarter. Interrupted sections are labelled incomplete, including in assistant context.

Score explanations requested while Trades first loads wait for its candidate tables — for as long as the tables are loading (a cold recompute can take a while), with a one-minute ceiling rather than a fixed few seconds. Buy and sell candidates are both considered, including when only one side has candidates.