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:

ProviderSetup
OpenAIPaste an API key; the five latest models are offered.
OpenRouterPaste an API key; any of its 300+ models, with suggestions.
OllamaFree 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 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 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:

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.

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

  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. 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

  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, where your model and your data never leave the machine.

Chatting

The assistant pane with its opening message and the one-click report suggestion cards
The assistant pane β€” the one-click report cards sit right below the opening message.

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.

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 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?"
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

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

ActionParametersWhat it does
show_cardcard β€” 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_socialpane?: feed | friends; handle? β€” a friend's @handleSwitches to the Social tab; handle opens that friend's shared-portfolio view.
exploretable: top | movers | favouritesShows an Explore-tab table (largest companies, most active today, or your watchlist).
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 | 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_assetsymbolOpens that asset's detail drawer.

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.
filter_holdingsquery β€” natural language; "" clears the filterSets the holdings table's smart filter ("top 5 holdings", "technology sector", "biggest losers this year").
tutorialop: 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:

ActionParametersWhat it does
search_assetsquery; smart?: true for the finder's semantic modeTypes into the topbar asset finder and opens its results; the hits come back to the assistant.
market_lookupsymbol β€” 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_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.

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, amountEur, 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.

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 β€” EUR to raise; symbol?Runs the Sell optimizer: which open lots to sell for the lowest estimated tax.
add_manual_lotsymbol; date "YYYY-MM-DD"; qty; unitCostEur; 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 data & notes

ActionParametersWhat it does
add_manual_assetname; 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_assetsymbol (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_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).

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.
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.
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.
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 (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.

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 adviceA 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 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 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.

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.

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.