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 a fully private local one.
Connecting a provider
Open β Settings β Assistant and pick one of four providers:
| Provider | Setup |
|---|---|
| OpenAI | Paste an API key; the five latest models are offered. |
| OpenRouter | Paste an API key; any of its 300+ models, with suggestions. |
| Ollama | Free and fully private, on your machine. 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. |
| LM Studio | Also 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 never live in your browser β they're stored encrypted on the server for your session or account (see Privacy & your data). Local models keep everything on your machine: the portfolio snapshot travels to your own Ollama/LM Studio server and nowhere else.
Press Save and the assistant arms itself β the red/green status dot in the chat pane's header 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.
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:
- Spend caps and usage limits. Both the OpenAI and Anthropic consoles (and most OpenRouter-style aggregators) let you cap a key's monthly spend or rate β set one that matches your expected assistant usage.
- Scoped keys. Where the console offers project- or scope-restricted keys, create a dedicated key for Fortunest rather than reusing an account-wide one.
- IP allow-listing. Where the provider supports restricting a key to caller addresses, whitelist the app server's egress IP. The hosted app shows the current address right where you need it: it sits directly under the API key field in β Settings β Assistant, with a Copy button β paste it into the provider's allow-list as-is.
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
- The conversation model answers your chat questions and writes the one-click reports. Thinking/effort controls appear where the model supports them (thinking on, high effort by default).
- A subordinate fast model β background insights & search (same model list, thinking off by default for speed) runs everything else: proactive comments, the β¨ AI insights, β¨ smart search in the finder and Explore, the semantic holdings filter, and article/filing summaries. Metric and top-N holdings filters (
"top 5 holdings","my best PEG holdings","7 of my highest free cash flow holdings") are answered locally without calling any model.
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.
Setting up a local model from scratch
A local model means the whole conversation β your portfolio included β never leaves your machine, and it costs nothing per token. 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 β answers get cut off or refuse outright, and the header's context figure turns red to tell you. Longer conversations and attachments want the extra room, hence 50 000+ when the model and your RAM allow it.
LM Studio, step by step
- Download LM Studio from lmstudio.ai (macOS, Windows, Linux) and open it.
- Get a model: the π search tab lists them with download sizes. Good starting points:
openai/gpt-oss-20bon a 16 GB+ machine, or an 8B-class model (Llama, Qwen) on 8β16 GB. - 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: β¦ / Nfollows the live value. - Start the server: Developer tab β toggle Status: Running. The address next to Reachable at β
http://127.0.0.1:1234by 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. - 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
- Install from ollama.com (macOS, Windows, Linux;
brew install ollamaalso works). After install it runs quietly in the background athttp://localhost:11434β again the default the app probes, nothing to configure on the same machine. - 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. - 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.
- 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. A simpler packaged local install is under way.
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
- Create a free account at ngrok.com and install the agent:
brew install ngrokon macOS,winget install ngrok.ngrokon Windows, or the download on their site. - Connect the agent to your account (one-time):
ngrok config add-authtoken YOUR_TOKENβ the token is on your ngrok dashboard. - In LM Studio, load a model and start the server (Developer β Start server, port 1234).
- Start the tunnel:
ngrok http 1234. It prints ahttps://β¦ngrok-free.appaddress. - 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.
- 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)
- Install the agent:
brew install cloudflaredon macOS,winget install Cloudflare.cloudflaredon Windows, or the package from Cloudflare's downloads page. Quick tunnels need no account or sign-in. - Start LM Studio's server as above, then:
cloudflared tunnel --url http://localhost:1234. It prints ahttps://β¦trycloudflare.comaddress. - 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:
ngrok http 11434 --host-header=localhost:11434, orcloudflared 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.
| Risk | What it means β and how to shrink it |
|---|---|
| Compute theft | Anyone 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 leaks | The 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 visibility | TLS 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 bugs | These 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 door | LM 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, where your model and your data never leave the machine.
Chatting
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.
- To see exactly what it knows, open the Context window (click the
context:indicator in the assistant's header): every section β live view, strategy, recent actions, portfolio snapshot, favourites, simulations, news, events, instructions β with its token estimate. - Ticker symbols in replies are live β known symbols render as chips: click to open the asset's details from any tab, hover for a one-week mini chart; for symbols you hold, also your units, value and portfolio share.
- It can draw charts β interactive Vega-Lite charts render inline, expand to a modal and download as PNG or JSON.
- Answers render as markdown β when structure genuinely helps, replies come back with real tables (ask for "the values driving each pick's scores in one table"; wide ones scroll sideways inside the bubble), short headers, nested lists, italic, inline code and code blocks β and the live ticker chips keep working inside table cells and list items. Simple questions still get simple prose.
- It knows this manual β ask how something works ("how do I export my Revolut history?") and it looks up or fulltext-searches the documentation you are reading right now before answering, then grounds the reply in it. Answers can cite the docs with real links β hover one for a thumbnail preview of the page β and include the manual's screenshots (like the broker export walkthroughs) right below the answer.
- Attachments: π or paste from the clipboard. Images go to multimodal models (marked by a picture-frame badge next to the model name) and are downscaled client-side; PDF and text files work with any model β their text is extracted and travels inline. Switching to a text-only model mid-conversation silently drops earlier images instead of erroring.
- You can keep the conversation β the β© button beside β² saves what is in the chat window as a self-contained HTML file (
fortunest-chat-2026-08-13.html), or opens your browser's print dialog so you can Save as PDF. Both are produced in your browser: nothing is uploaded, the file needs no internet connection to open, and it carries only what the bubbles show β the messages, their formatting, their tables and code blocks, the charts as pictures, the attachment chips. No portfolio context, no model or provider name, no token counts, no account details, no keys. - Enter sends, Shift+Enter breaks a line; the box grows with long questions. β² resets the conversation.
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 bubble. Phones get a π¬ bottom-sheet drawer instead. Float/minimize choices stick for the browser-tab session and reset to maximized on the next visit.
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, and the phone's bottom sheet, overlay the page instead of standing beside it, so there the page scrolls as it always did.
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 type | What 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?" |
Switches to Explore, scrolls to the Largest companies / Most active today table, and highlights the movers most relevant to your holdings and watchlist. |
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 5 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 explore top count to 5" applies atomically) β refresh cadence, Explore table sizes, data sources on/off, investing strategy text / horizon / risk level, monthly buy-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. |
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 Yahoo Finance 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.
What you can rely on
- Graceful degradation β if an action can't be performed (an unknown card, an asset you don't hold), the assistant says so in the chat and answers the question textually instead. Never a silent failure.
- Real numbers β the chat commentary always comes from the same data the card on screen displays, and respects the previous conversation.
- Actions become context β every performed action lands in the Recent Actions log, same as your manual clicks, so follow-up questions know what's currently on screen.
The complete action reference
Everything above runs on a fixed vocabulary of 38 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
| Action | Parameters | What it does |
|---|---|---|
show_card | card β one of allocation, risk, events, income, holdings, chart, insights, value, cash, pl, fundamentals (Portfolio), recommendations, monthly_plan, drift, rec_history, 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. |
show_trades | β | Switches to the Trades tab. |
show_taxes | β | Switches to the Taxes tab. |
show_social | pane?: feed | friends; handle? β a friend's @handle | Switches to the Social tab; handle opens that friend's shared-portfolio view. |
explore | table: top | movers | favourites | Shows an Explore-tab table (largest companies, most active today, or your watchlist). |
sort_table | table: holdings | top | movers | favourites; column β a column key; desc? | Sorts that table by a column, like clicking its header. |
expand_trades | target: lots_row | lots_all | recs_why | recs_all_buys | recs_all_sells | weights | history; 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, the recommendation history. |
open_asset | symbol | Opens that asset's detail drawer. |
Actions: chart, holdings filter & the tutorial
| Action | Parameters | What it does |
|---|---|---|
set_chart | At 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. |
filter_holdings | query β natural language; "" clears the filter | Sets the holdings table's smart filter ("top 5 holdings", "technology sector", "biggest losers this year"). |
tutorial | op: start | next | stop; level?: beginner | intermediate | advanced (with start) | Drives the guided walkthrough that plays inside the chat. |
Actions: search, live market data & this manual
These fetch data for the assistant's answer and leave your view where it is:
| Action | Parameters | What it does |
|---|---|---|
search_assets | query; smart?: true for the finder's semantic mode | Types into the topbar asset finder and opens its results; the hits come back to the assistant. |
market_lookup | symbol β a ticker or company name; 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. One company per action. |
docs_lookup | labels β 1β5 section labels ("page#anchor") | Reads sections of this manual so the answer quotes the real text. |
docs_search | query; limit? 1β8 | Fulltext-searches the manual and website, returning the best-matching sections with links and screenshots. |
Actions: favourites & watchlist
| Action | Parameters | What it does |
|---|---|---|
toggle_favourite | symbol or symbols (array); on: true | false; list? β one of your list names | Stars 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_list | op: create | rename | delete; name; newName? (rename) | Manages the watchlist's named lists themselves. Deleting a list never unstars anything. |
Actions: simulation
| Action | Parameters | What it does |
|---|---|---|
whatif | symbol; side: buy | sell; exactly one of quantity, amountEur, fraction (0β1 of the position) | Simulates a trade in the what-if card ("sell half my Tesla" β fraction: 0.5). |
dca_goal | goalAmount; targetYear | targetMonth ("YYYY-MM") | targetDate ("YYYY-MM-DD"); assets? β symbols replacing the plan's list | Runs the Future Simulator's goal seek: what to invest to reach the goal by the target. |
set_simulation | At 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. |
Actions: trades & taxes
The tax actions answer with illustrative orientation, never tax advice:
| Action | Parameters | What it does |
|---|---|---|
set_asset_target | name β a symbol; pct 0β100 (0 removes) | Sets one allocation target the trade recommendations pull toward, like β Settings β Trades. |
set_sector_target | name β a sector label; pct 0β100 (0 removes) | Same, for a sector target. |
tax_free_summary | symbol? β narrows to one asset | Fetches the current tax-lot summary (tax-free sellable value, next time-test maturity, YTD proceeds vs the small-sale limit) without changing tabs. |
sell_plan | amount β EUR to raise; symbol? | Runs the Sell optimizer: which open lots to sell for the lowest estimated tax. |
add_manual_lot | symbol; date "YYYY-MM-DD"; qty; unitCostEur; source?; note? | Adds an opening-balance tax lot for purchases predating your uploaded history. |
transfer_action | symbol; op: confirm | dismiss | undo | Settles a suspected inter-account transfer on the Taxes tab β all three reversible. |
Actions: adding data & notes
| Action | Parameters | What it does |
|---|---|---|
add_manual_asset | name; date "YYYY-MM-DD"; price; currency?; apy? (percent per year) | Adds a manually tracked asset (real estate, physical goldβ¦) β the assistant asks for missing required fields first. |
add_market_asset | symbol (exact ticker) or query (words to resolve); quantity; date? (defaults to today); price? (defaults to that date's market close) | Adds a market-priced position without a broker export β anything Yahoo Finance can price. Ambiguous names come back as candidates to pick from. |
sync_connector | name? β an account name, loosely matched; omitted syncs every connected one | Pulls fresh data now from a directly connected exchange/broker, like its Sync button. Runs in the background; CSV uploads are not connections. |
add_note | text β up to 500 characters | Saves a standing investing note π (up to 20). |
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):
| Action | Parameters | What it does |
|---|---|---|
friend_portfolio | handle; 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. |
social_feed | limit? 1β10 | Reads 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
| Action | Parameters | What it does |
|---|---|---|
set_theme | mode: dark | light | auto | Switches the color theme. |
set_currency | code β one of the 30 supported display currencies (USD, EUR, GBP, CZK, β¦) | Switches the display currency; the portfolio rebuilds and the dashboard refreshes in place. |
set_model | model β an id from the current provider's model list; fast?: true targets the fast slot | Switches the conversation model (or, explicitly asked, the fast model). |
set_setting | key, value, source? β or a settings array applying several atomically. Keys: quote_refresh_minutes (15β120), explore_top_count / explore_movers_count (5β100), context_trade_months (0β24), proactivity (off | minimal | active), strategy_text, strategy_horizon_years (1β50), strategy_risk (low | medium | high), monthly_invest_amount, monthly_latest_day (1β31), monthly_max_buys (1β10), monthly_min_order, pairing_mode (fifo | optimize | optimizeYearly), time_test_years (0β10), crypto_time_test, crypto_time_test_from, small_sale_limit_czk, exempt_gains_cap_czk, tax_rate_pct (0β60), the twelve trade_weight_β¦ keys (0β100; append the criterion: allocation_drift, sector_drift, valuation, analyst_upside, momentum, risk_fit, quality, dividend, tax_freedom, time_test_proximity, loss_harvest, hygiene), 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 a batch applies all-or-nothing. |
Actions that fetch data (market_lookup, 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.
One-click reports β¨
Suggestion cards sit right below the assistant's opening message (dimmed with a "Connect the Assistant" note 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.
| Report | What you get |
|---|---|
| Portfolio brief | State of the portfolio, today's moves tied to actual news headlines, events ahead, major risks and watch items. |
| Strategy check | Your 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 advice | A concrete monthly buy plan β which tickers, how much of your budget into each, and the day to place the order β honoring the Monthly buy plan knobs in β Settings β Trades. Framed as scenarios to research, never as financial advice; cached until the budget, strategy or month changes. |
| Earnings season digest | A 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 Yahoo's 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.
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 monthly 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.
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.
| Target | Where the skill's text is injected |
|---|---|
chat | The conversation β every chat message's system prompt (the default). |
tips | Proactive tips β the compact context behind the assistant's volunteered remarks. |
reports | The one-click β¨ reports: Portfolio brief, Strategy check, Buy advice and the seasonal Earnings season digest. |
appStart | The 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.
Where else the assistant shows up
- β¨ AI insights in the Portfolio tab's insight strip β up to four model-found patterns.
- β¨ Smart search β quoted prompts in the topbar finder and Explore.
- β¨ Semantic holdings filter β quoted text in the holdings table's filter box.
- β¨ News & filing summaries β on asset detail panels and the Events card's filed reports.
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.