|

External storefronts

Give an LLM the Financial storefront skill to adapt the built-in client portal or create a separate client.

To create a custom Financial storefront, copy the skill and give it to your LLM. The skill will explain how features/storefront and the customer-facing app routes implement Financial's current client portal.

After that source orientation, it will ask what you dislike, what should stay, what workflows and users matter, and what the replacement should look and feel like. It then traces the exact routes, feature slices, GraphQL calls, schema, access rules, sessions, and provider boundaries in the supplied Financial codebase before proposing work.

Skill file: /skills/openfront-financial-custom-storefront/SKILL.md

Current storefront routes

The "storefront" here is an investor portal, not a shop. There is no cart, checkout, or payment. Routes live under app/(storefront)/; logic lives in features/storefront (screens, components, lib/data). Pages under the (customer) group render the sign-in form in place of the page when no one is signed in.

RouteCustomer journey
/Home: market board, and for signed-in users, recorded totals and recent activity
/marketsPublic quote list (publicMarketQuotes)
/markets/[symbol]Public asset detail with price-history chart
/tradePlace a market or limit order on an owned account (placeFinancialOrder); market orders fill by simulation
/orders, /orders/[id]Order history; order detail with terms, fills, trades, and cancel (cancelFinancialOrder)
/portfolioAccounts, positions, and snapshots (ownedPortfolio) with coverage state
/fundingRequest a deposit or withdrawal (requestFinancialTransfer) and see transfer history
/watchlistAdd or remove symbols (changeOwnedWatchlistSymbol)
/activityLedger entries (ownedLedgerEntries)
/statementsStatements, dividends, and open and closed tax lots
/account (login slot)Sign in, sign up (only works when PUBLIC_SIGNUPS_ALLOWED=true), password reset request
/account (dashboard slot)Profile, password, and bank accounts: link, verify with simulated micro-deposits, set primary, deactivate

The portal signs in with Keystone's keystonejs-session cookie, set server-side. The store name, logo, colour, and paper-trading disclosure come from publicFinancialIdentity; if no store settings exist the portal shows an unconfigured screen.

Other public routes

  • /api/public/trades?userId=...&since=... returns filled paper orders for a user whose public profile is enabled, after the profile's trade delay. It reads with the caller's own session, so list access rules decide what is visible.
  • /api/webhooks/financial accepts signed provider events. It is not a customer route.

Journey boundaries

  • Nothing in the portal moves real money or reaches an exchange. Keep the paper-trading disclosure visible.
  • Orders can be refused by approval policies, KYC or risk-profile status, margin permission, excluded symbols, or the maximum position size. Show the server's message; do not pre-judge it in the client.
  • Transfers stay pending until an operator settles them in the console.
  • Bank verification is a local simulation. The deposit amounts are generated by the app, not sent by a bank.

On this page