v1.17.2
2026-08-13"RebrandPolish"patchFixed
- Replaced the remaining "GLOBAL EQUITY TERMINAL" wordmarks (landing header, terminal header, auth screens, app footer, PDF header) with MYGLOBALEQUITIES.
Release notes
Currently running v1.17.2 · "RebrandPolish" · released 2026-08-13.
43 releases · sourced from CHANGELOG.md.
llms.txt.https://myglobalequities.com.rankaisolutions.tech sender domain (From/DKIM); only the display name and site links changed.display=swap.seroval resolves to a patched release (GHSA-mv8w-475r-vwqw: type-confusion during fromJSON() deserialization). Lockfile regenerated as text bun.lock; dependency scan now clean./app) instead of the marketing landing page. The help overlay labeled it "Go to Screener" but the mapping still pointed to /.SiteNav already renders AuthNav; these routes were passing an extra <AuthNav /> into the right slot, doubling the AlertBell, account dropdown, and Home link.bun run build with no .env), so the Supabase client threw on import and the router's error boundary took over every route. The publishable values are now provided as a build-time define fallback in vite.config.ts, so every build path produces a working bundle regardless of env. Live evidence before the fix: the analysis fetch returned 200 in ~670 ms while the page itself still showed "System error".useEffect depended on the useMutation object (new reference each render); now pinned to a ref so it triggers exactly once per ticker.toLocaleTimeString produces different strings on Node vs the browser; the refresh time is now rendered only after hydration so SSR and client agree on first paint. Removes the React "Hydration failed" warning and the full-page re-render that came with it.analyzeTicker was returning HTTP 500 {"unhandled":true,"message":"HTTPError"} from h3 whenever any provider threw synchronously (e.g. a sync URL/JSON edge in the fallback chain), which the client perceived as a frozen "Analyzing…" spinner. The handler is now wrapped in a top-level try/catch that always returns a clean { error, fallback: true } shape the UI can render.tryMetricProvider, new safeQuote) so synchronous throws inside any provider client are caught instead of escaping. Previously await foo().catch(() => null) could not catch a sync throw.fetchMetricsUncached, so the 10-provider fallback chain can't compound into a 50 s worst-case sit.demo key (which was slowing every analysis by ~5 s).FINIMPULSE_API_KEY is set. No code path depends on it.finnhub.server.ts, tiingo.server.ts, eodhd.server.ts, alpaca.server.ts, nasdaq-data-link.server.ts.fred.server.ts — FRED macro time-series client (wired for future macro panels, not in the equity chain).ccxt.server.ts — keyless crypto quote helper hitting Binance/Coinbase public REST (no Node-only ccxt npm dep; wired for future crypto panels)./sources page listing every provider with its activation key and role.src/components/terminal/terminal-page.tsx) — switched terminal search/analyze calls to the TanStack useServerFn client wrapper so serialized server-function responses resolve cleanly in React Query, and added client-side timeout guards that surface a retryable error instead of leaving the button in Running… indefinitely.src/srv/analyze.ts) — Peer enrichment fanned out 25 unbounded concurrent peer fetches × multiple providers, exceeding the Cloudflare Worker subrequest concurrency limit and triggering "stalled HTTP response was canceled to prevent deadlock", which surfaced as an unhandled HTTPError to the client. Peer fetches are now capped at 5 concurrent via a mapWithConcurrency helper.src/srv/analyze.ts) — Wrapped fetchMetrics and peer enrichment in try/catch. When the primary chain (Finimpulse → Yahoo → FMP → Stooq → Alpha Vantage) is fully unavailable, the handler now returns { error, fallback: true } instead of throwing, so the UI can show a friendly retry state. When the target resolves but peer enrichment fails, the terminal still renders with empty peers.Enhanced data resilience with Alpha Vantage integration, graceful API key handling, and performance optimizations to ensure the app works reliably with free data sources.
src/server/alphavantage.server.ts) — 4th fallback data provider (500 requests/day free tier, demo key support). Covers global equities, forex, and crypto with comprehensive market data including historical prices, company overview, and search functionality.src/server/finimpulse.server.ts) — Finimpulse now gracefully skips when API key is missing instead of throwing errors. App functions normally using fallback providers (Yahoo, FMP, Stooq, Alpha Vantage).src/server/analyze.ts) — Extended data fetching chain: Finimpulse → Yahoo Finance → Financial Modeling Prep → Stooq → Alpha Vantage. Each provider has retry logic and timeout handling.src/server/analyze.ts) — Added Alpha Vantage as final fallback in search functionality when other providers return no results.src/server/analyze.ts, src/server/finimpulse.server.ts) — Extended cache times: analyze metrics (2min → 5min), screener rows (5min → 10min), search queries (5min → 10min). Reduced API calls and improved cache hit rates.src/components/terminal/terminal-page.tsx) — Enhanced defensive checks in v1.14.0 helper functions to prevent runtime errors when data is incomplete or missing.Transforms the key metrics display into an educational, actionable analytics powerhouse with interactive tooltips, contextual advice, peer comparisons, and historical context.
src/components/terminal/terminal-page.tsx) — hover over any metric to see contextual, threshold-based guidance. P/E tooltips explain valuation ranges from very low (<10) to very high (>35), RSI tooltips show overbought/oversold conditions with specific recommendations, performance and ROC tooltips indicate momentum strength.src/components/terminal/terminal-page.tsx) — dynamic recommendations based on metric combinations: value + momentum alignment signals, deep value opportunities (oversold RSI + attractive P/E), overbought warnings, valuation risks, trend confirmation/breakdown, 52W low proximity analysis, and momentum shift detection (ROC divergence).src/components/terminal/terminal-page.tsx) — calculates peer averages for P/E, market cap, RSI, and 5D performance; shows relative positioning with interpretive context like "trading at 67% of sector average" or "outperforming peers by 3.2%".src/components/terminal/terminal-page.tsx) — toggle buttons for Fundamentals, Technicals, Momentum, and Valuation groups. State-managed via React useState with visual feedback for active/inactive groups. Dynamic grid layout adjusts based on selections.src/components/terminal-page.tsx) — analyzes metric direction over time using historical price data: price action trends (5-day averages), RSI momentum changes (current vs 5 days ago), moving average structure evolution, volatility regime detection. Uses custom RSI calculation for historical analysis.src/components/terminal-page.tsx) — shows where current metrics rank against 6-month historical range: price level percentile, RSI percentile vs historical readings, volatility regime comparison (current vs historical average). Provides percentile-based interpretations for decision-making.getContextualAdvice, getPeerComparison, getActionableInsights, getMetricTrends, getHistoricalContext, calculateRSI, calculateVolatility for advanced metric analysis.src/components/terminal/terminal-page.tsx) — complete restructure with grouped metric panels, educational "Metrics Explained" panel, and progressive disclosure via expandable "Full Details" section. Company info and key highlights moved to compact card layout for better visual hierarchy.fetchHistoryVolume function to all data providers (Finimpulse, Yahoo, FMP, Stooq) for comprehensive volume data access.volumes: number[] field.src/server/analyze.ts).Integrates research tasks with alerts for seamless workflow management and delivers significant performance optimizations across the application.
src/routes/tasks.tsx, src/routes/alerts.tsx) — link research tasks to alerts bidirectionally. Create alerts directly from task cards via quick form (pre-fills ticker), show related alerts on task cards with unlink functionality, and link alerts to tasks from the alerts creation form.src/server/tasks.functions.ts) — tasks can be configured to automatically disable all linked alerts when marked as "Done". Controlled via disable_alerts_on_complete column and checkbox in task creation.supabase/migrations/20260512203000_task_alert_integration.sql) — added task_id UUID column to alerts table with foreign key to tasks, disable_alerts_on_complete boolean column to tasks table, and performance index on alerts.task_id.src/server/alerts.functions.ts) — new linkAlertToTask, unlinkAlertFromTask, getAlertsForTask, and disableAlertsForTask functions for task-alert relationship management.src/routes/app.tsx, src/routes/terminal.$symbol.tsx) — React.memo for TaskCard, AlertRow, and NewAlertForm components; optimized query caching with 5min staleTime and 10min gcTime; reduced API calls from every 60s to every 5min (~60% reduction); disabled refetchOnWindowFocus and refetchOnMount; lazy loading for heavy TerminalPage component with Suspense fallback.src/lib/version.ts) — added taskAlertIntegration and performanceOptimizations flags.src/routes/alerts.tsx) — added "Task" column showing linked tasks with navigation, expanded form to include task linking dropdown.Adds a dedicated research Tasks board so users can capture to-dos and link them to tickers.
src/routes/tasks.tsx, src/server/tasks.functions.ts) — new /tasks route with kanban-style columns (To-do / In progress / Done). Each task supports title, optional notes, optional ticker link (deep-links into /terminal/$symbol), and an optional due date. Status changes via inline dropdown; completion timestamps are recorded server-side.public.tasks table + task_status enum, full per-user RLS (view / insert / update / delete scoped to auth.uid()), set_updated_at trigger, and indexes on user_id and symbol.src/components/site-nav.tsx) — Workspace dropdown now includes Tasks between Theses and Alerts.src/lib/glossary.ts) — added an entry for the Tasks board.Smarter ticker resolution in Analyze and Compare, plus ISIN support.
src/components/terminal/terminal-page.tsx, src/routes/compare.tsx) — pasting a 12-character ISIN (e.g. US0378331005) into the Analyze search box or the Compare add-ticker input now resolves to the canonical listing via the existing search pipeline. Compare additionally maps the resolved symbol back into the curated universe.src/lib/glossary.ts) — added an entry for ISIN.src/components/terminal/terminal-page.tsx) — typing lowercase words like adani or reliance into Analyze previously fast-pathed to a doomed direct ticker fetch (no exchange suffix). The fast-path now requires real ticker shape (contains ., contains a digit, or short ALL-CAPS); everything else goes through search and surfaces the disambiguation picker.src/routes/compare.tsx) — the Add input now matches by company name and partial symbol within the curated universe, not just exact ticker.Hardens screener data resilience, fixes a runtime crash on the screener header, and tightens CI security gating.
src/server/finimpulse.server.ts, src/server/analyze.ts) — when Yahoo's quoteSummary endpoint is blocked, Sector / Industry / Market Cap / P/E / P/B / dividend yield are now backfilled from FMP (when configured) and finally from the static universe metadata, so rows no longer show — for covered tickers.src/routes/app.tsx) — safe optional chaining on data?.meta?.mockCount / liveCount prevents a "Cannot read properties of undefined" crash when the universe query is loading or returns 401..github/workflows/regression.yml) — bun pm audit --audit-level high is no longer masked with || true; added Trivy filesystem scan (CRITICAL/HIGH fails the build); Gitleaks and Trivy now upload SARIF results to GitHub Code Scanning; daily scheduled run (06:00 UTC) catches newly-disclosed advisories.Ships the full email surface end-to-end: every auth message and the morning brief now render with a single branded MyGlobalEquities template, route through a durable retry queue, and are observable from a new admin dashboard. Also locks down database function privileges flagged by the security scan.
src/lib/email-templates/{signup,magic-link,recovery,invite,email-change,reauthentication}.tsx, src/lib/email-templates/brand.ts) — signup confirmations, magic links, password recovery, invitations, email-change, and reauthentication all share a single white-bodied amber-accent template that matches the in-app terminal aesthetic.src/lib/email-templates/morning-brief.tsx, src/routes/api/public/hooks/run-scheduled-briefs.ts) — scheduled morning briefs now render the same branded template and flow through the queue, with end-to-end verification from pending → sent in email_send_log.src/routes/admin.emails.tsx, src/server/admin-emails.functions.ts) — new /admin/emails route surfaces failure rate, queue latency (p50/p95/max), retry counts, and DLQ depth. Includes deliverability alerts (≥3 failures in 24h, p95 latency >30s) and one-click test triggers for each auth template + morning brief.public.user_roles table + has_role() helper) — admin gating for the email dashboard. Roles live in their own table per security guidance; first user seeded as admin.MyGlobalEquities <noreply@myglobalequities.com> for a consistent inbox brand.REVOKE EXECUTE on enqueue_email, delete_email, read_email_batch, move_to_dlq, and bump_shared_watchlist_view from public / anon / authenticated; restricted to service_role. has_role retains authenticated execute (required for RLS evaluation).@react-email/components; no runtime fetches.process-email-queue) handles retries, rate-limit backoff, and DLQ routing automatically.Hardens the data layer so the terminal stays useful even when any single upstream provider is rate-limited, geo-blocked, or simply down. Adds a comprehensive in-app User Guide.
src/server/yahoo.server.ts, src/server/fmp.server.ts, src/server/stooq.server.ts, src/server/indicators.server.ts) — screener and terminal rows resolve through a chain: Finimpulse → Yahoo Finance → Financial Modeling Prep (free tier) → Stooq. All four are free, key-less, edge-runtime compatible. Indicators (RSI, ROC, MA cross, 5D %) are recomputed locally from whichever provider returned price history, so rows stay populated even when fundamentals are partial.src/components/provider-badge.tsx) — every screener row and sourced metric shows a small badge (FIM / YHO / FMP / STQ) indicating which free upstream supplied the data. Hover reveals the full provider name.src/routes/system.guide.tsx) — 8-section in-app manual: Screener basics, Terminal page, Scoring vectors, Data fallback hierarchy, Watchlists & sharing, Alerts & theses, Keyboard shortcuts, FAQs. Linked from the System nav dropdown.src/components/terminal/terminal-page.tsx) — /terminal/$symbol would stay stuck on "Analyzing..." on direct navigation due to a useRef boolean swallowing the second StrictMode mount. The auto-run guard now keys off the initialTicker value, so re-mounts and symbol switches both re-trigger analysis correctly.src/routes/index.tsx) — universe stats flickered between "—" and the real ticker count on first load. Loader now awaits the prefetchQuery so SSR and client hydrate with the same value.src/server/cache.server.ts).Security hardening following a GDPR / EU AI Act / vulnerability audit. No user-facing changes.
src/routes/api/public/hooks/run-scheduled-briefs.ts) — endpoint now requires CRON_SECRET via x-cron-secret or Authorization: Bearer. Unauthenticated calls return 401. Closes the denial-of-wallet vector on a previously open POST endpoint that triggered AI-gateway spend.CRON_SECRET from vault.secrets and inject it into the http_post headers, so the secret is never embedded in scheduler config.{ error: "Internal error" } instead of error.message); full details remain in server logs only.First outward-facing feature: turn any watchlist into a read-only public link. Each share is a fixed snapshot of tickers, rendered with live metrics on a public /w/<token> route — no sign-in required for viewers. Sets up a viral acquisition loop and gives the landing page a concrete public demo.
src/server/share.functions.ts, src/routes/w.$token.tsx, src/components/share-watchlist-dialog.tsx) — createShare / listShares / revokeShare / getSharedWatchlist. Owners click Share on the watchlist page, optionally set an expiry (1/7/30/90 days or never), and copy a link. Recipients land on a branded read-only page with the full screener row data (price, mcap, P/E, RSI, 5D %, value/momentum/risk/confidence scores) and per-ticker drill-through to /terminal/<symbol>.shared_watchlists table with token (22-char base64url, ~132 bits entropy), symbols[] snapshot, view_count, expires_at, revoked_at. RLS scopes owner CRUD to auth.uid() and grants public read for active rows (non-revoked, non-expired). Token is the access gate.bump_shared_watchlist_view(token) is SECURITY DEFINER with EXECUTE revoked from anon / authenticated / public. Only the SSR loader (service role) increments the counter, preventing client-side spam.og:title / og:description / twitter:card based on the watchlist name and ticker count, plus a canonical URL. Every shared link is its own indexable page.notFoundComponent ("Share unavailable") rather than leaking the existence of the link.Security hardening for the email queue infrastructure shipped in 1.8.0. No user-facing changes.
search_path on enqueue_email, delete_email, read_email_batch, and move_to_dlq to prevent search-path hijacking on these SECURITY DEFINER wrappers.anon and authenticated roles on the same four functions; only the service_role (used by trusted server code) can invoke the email queue. Closes the three Supabase linter findings (function_search_path_mutable, anon_security_definer_function_executable, authenticated_security_definer_function_executable).Take the v1.7 scheduled brief out of the app and into the user's inbox. Wires up Lovable Emails on a verified sender subdomain and reuses the existing per-user schedule + cron pipeline.
brief_schedules gains email_enabled and optional email_to columns. When enabled, the hourly cron at src/routes/api/public/hooks/run-scheduled-briefs.ts renders the brief through the React Email template morning-brief and POSTs it to the local send-transactional-email route, authenticating with the service-role key. Recipients default to the user's auth email; an override is supported.notify.rankaisolutions.tech (DNS delegated to Lovable nameservers). Adds the standard email queue (email_send_log, email_send_state, suppressed_emails, email_unsubscribe_tokens + pgmq queues) and the queue dispatcher (/lovable/email/queue/process) running every 5s via pg_cron. Includes the public /email/unsubscribe page and handle-email-suppression hook.src/lib/email-templates/morning-brief.tsx) — branded React Email layout with date, ticker list, AI summary, top 5 moves with 5D % and RSI, and the standard system-managed unsubscribe footer (auto-appended).src/components/schedule-brief.tsx) — adds an "Also email it to me" toggle and an optional override address field next to the existing UTC hour picker.src/server/v17.functions.ts) — schema now includes emailEnabled and emailTo.notify.rankaisolutions.tech completes (visible in Cloud → Emails). Until then briefs continue to land in-app only.Compounds the v1.6 USP — make the differentiator features work for the user even when they're not looking.
src/server/v16.functions.ts → evaluateThesis) — when a thesis evaluation flips from a non-broken state into breaking or broken, the system auto-inserts an alert_event (type thesis_break) so the bell badge lights up and the in-app toast surfaces it. Only fires on transition; re-evaluating a still-broken thesis does NOT spam. Re-uses the existing alert event pipeline — no new UI surface.src/components/schedule-brief.tsx, src/server/v17.functions.ts, src/routes/api/public/hooks/run-scheduled-briefs.ts) — opt-in daily AI-generated brief over the active watchlist. User picks a UTC hour; an hourly pg_cron job hits the public hook route, which finds due users (matching hour, not yet processed today) and generates briefs via the AI Gateway, persisting each to brief_runs for in-app reading. Idempotent per-user-per-day via last_run_at.brief_schedules table (RLS-scoped to auth.uid(), one row per user, hour_utc 0–23). New enum value thesis_break on alert_type.pg_cron and pg_net enabled; run-scheduled-briefs-hourly cron job scheduled at minute 5 of every hour.USP release — three AI-native features competitors don't bundle today.
src/components/ask-terminal.tsx, src/server/v16.functions.ts → askTerminal) — conversational Q&A docked to every ticker page. The chat is grounded in the same facts block used by the AI Narrative (price, valuation, momentum, recommendation), so the model never invents numbers. 4 starter prompts, 500-char input cap, 20-turn history window. Non-streaming for parity with existing AI helpers.src/components/morning-brief.tsx, generateBrief) — one-paragraph digest of overnight moves over the active watchlist (up to 30 tickers). Highlights the 5 largest |5D %| movers as colored chips. Persists each run to brief_runs (RLS-scoped) for history. On-demand generation only — no auto-burn of AI credits.src/routes/theses.tsx, upsertThesis / listTheses / evaluateThesis / deleteThesis) — write a one-paragraph thesis per ticker; AI re-evaluates against live metrics on demand and tags it intact / monitor / breaking / broken with 2–4 sentence rationale. Tool-calling enforces structured verdicts. Unique per (user_id, symbol).theses and brief_runs tables. Both RLS-scoped to auth.uid(). theses.updated_at is auto-maintained by the existing set_updated_at() trigger./theses added to the Workspace group.chat() helper → Lovable AI Gateway. No new secrets, no new providers, no new redistribution risk.Data-rights hygiene — tighten news prompt, attribute upstream sources, propagate disclaimer to PDF exports.
rights line. New "Data rights & attribution" panel + cross-link to /legal.IP & disclaimer hygiene — reduce trademark/legal risk surface.
Production hardening — error visibility, query defaults, mobile pass.
error_logs table + reportError server function + logClientError client helper. Captures errors from AppErrorBoundary, router defaultErrorComponent, and global unhandledrejection/error listeners. Server attributes to auth.uid() via verified bearer token; never trusts client-supplied user_id. Dedupes identical messages within 60s, swallows its own failures, truncates payloads.src/router.tsx — staleTime 60s, gcTime 5min, refetchOnWindowFocus off, refetchOnReconnect on, networkMode online, smart retry that skips 4xx (auth/validation) and retries transient once. Mutations never auto-retry.body { overflow-x: hidden } to prevent stray elements from breaking layout on <768px.overflow-x-auto. Verified at 375×812: hero, screener, terminal, compare, data-quality, landing all render cleanly.UX polish — skeleton loaders and friendlier empty states across data-heavy panels.
src/components/feedback-states.tsx — EmptyState, EmptyStateLink, TableSkeleton, StatGridSkeleton, ParagraphSkeleton. Single source of truth for loading and zero-data UX.LOADING… placeholders on Screener, Watchlist, Compare, Portfolio, Alerts, Events, Data Quality, AI Narrative and News & Catalysts. Shimmering rows preserve layout and reduce perceived wait, especially after the retry/timeout behaviour added in v1.4.2.LOADING UNIVERSE… line.Accessibility pass and server-input audit.
__root.tsx — visible on keyboard focus, jumps past the nav. Lets screen-reader and keyboard-only users bypass the header on every route.src/styles.css — every keyboard-focused element now shows a 2px ring in the amber accent color. Mouse users unaffected (focus-visible suppresses on click).createServerFn mutations (addAlert, toggleAlert, deleteAlert, addHolding, deleteHolding, searchTickers, analyzeTicker, aiParseQuery, aiTickerNarrative, aiNewsCatalysts, fetchEvents, fetchUniverse, markAlertEventsRead, evaluateMyAlerts) already use Zod .inputValidator() with min/max/regex/uuid where appropriate. No unvalidated server entry points.aria-label, aria-pressed, or role="dialog" + aria-modal. <main> landmark present on every route.Hardened all outbound HTTP calls with retry + per-attempt timeout.
src/server/http.server.ts exposes fetchWithRetry: shared helper with exponential backoff (250ms → 1s → 4s, 3 attempts), 12s default per-attempt timeout (30s for AI/news), and an explicit retry whitelist (network errors, 408, 425, 429, 5xx). 4xx responses bypass retry — they're deterministic.finimpulse.server.ts, analyze.ts) now uses fetchWithRetry. Transient 502/503/504s no longer surface as failed analysis; the universe + ticker analyze pipelines self-heal.ai.server.ts) wrapped with retry. AI narrative and ⌘K co-pilot survive transient gateway blips.news.functions.ts) wrapped with retry. Recovers from upstream rate limits (429) and transient 5xx without user-visible errors.App-wide error boundary so render errors never produce a blank screen.
<AppErrorBoundary> wraps <Outlet /> in __root.tsx. Catches any uncaught render error in any route or descendant component and shows a recoverable card (error message + Try again / Home) instead of the white screen of death.componentDidCatch).defaultErrorComponent already covered loader throws; this closes the gap for render-time and hook-time errors (e.g. unexpected useQuery data shapes, missing fields, third-party widget failures).Automated regression test suite, gated on every build.
lib/format, lib/scores, and lib/backtest (13 tests). Run with bun run test:unit./, /app, /compare, /watchlist, /events, /data-quality, /sources, /changelog, /settings. - /terminal/AAPL deep-link mounts and surfaces ticker (validates v1.3.5). - /portfolio and /alerts auth-gating; /auth form presence. - /app screener row render + filter; /watchlist controls visible..github/workflows/regression.yml) runs unit then E2E on every push and pull request, blocking deploys on failure.bun run test:regression runs the full suite locally.tests/README.md documents structure, how to add tests, and the auth-mock follow-up.Deep-link reliability for /terminal/$symbol.
/terminal/AAPL and other ticker deep-links no longer return a hard 404 when the server-side analyze call fails or rate-limits. The route now skips the blocking loader and lets the client-side terminal handle the analysis, surfacing analyzer errors inline instead of breaking navigation./terminal/$symbol is derived from the URL ticker so share previews work even before analysis completes.First-class account menu for signed-in users.
Authenticated alert and portfolio server calls now attach the active session token explicitly, preventing raw 401 Response errors from surfacing as blank-screen runtime crashes.
AlertBell now waits for a valid auth token before listing, evaluating, or marking alert events, and falls back to empty notification state on transient auth errors./alerts and /portfolio now pass auth headers to their protected server functions and return safe empty states instead of letting unauthorised responses reach the router error boundary.Popup-blocker resilience for the new-tab auth flow.
sessionStorage (auth:return-to) and navigate /auth in the same tab as a fallback. After successful sign-in, the auth page shows a dedicated success screen with two clear actions: - ← Back to where you were — returns to the original screen with the session intact (no data loss). - Continue to the terminal — goes to /app.openAuthPopup() now detects blocked popups (null / immediately closed window handle) and triggers the same-tab fallback automatically./app in the same-tab fallback flow — the user explicitly chooses where to go next.Auth flow polish: signed-in users can now return to the landing page, and the Sign-in / Sign-up flow opens in a separate tab that auto-closes on success — keeping the original tab in place.
/auth?popup=1 in a new browser tab. After successful auth, the tab posts an get-auth-success message to the opener and closes itself; the original tab refreshes its session in place.src/lib/auth-popup.ts to centralise the popup + opener message handshake (with graceful fallback if popups are blocked)./auth accepts a popup search param. When set, the page hides the "← Back to home" link, shows a "Close this tab" affordance, and skips the in-tab redirect to /app after success./ to /app for signed-in users — the landing page is now reachable at any time.undefined (data?.totals?.cost) to prevent the router-level crash that blocked navigation back to the landing page after sign-in.Top navigation restructured from a flat 10-link bar into 4 grouped dropdowns, modelled on Koyfin / Bloomberg Terminal patterns. Same destinations, faster to scan, no more wrapping at narrow widths.
md to keep the header single-row.Landing page restructured into a tight 7-section flow modelled on the patterns used by leading equity-research platforms (Koyfin, Atom Finance, TIKR, Simply Wall St): lead with proof and product, then narrative, then conversion.
Landing page is now separate from the workspace. The marketing site greets new visitors at /; the screener and all in-app routes live under /app. Signed-in users are auto-redirected from / into the workspace.
/ is now a pure marketing landing (hero + about + CTA). The screener moved to /app (deep-link + URL-state preserved). All in-app links, the command palette, and "Back to screener" CTAs now target /app./ are sent straight to /app (with replace), so the landing is shown to logged-out visitors only./app. Logo still goes to /./ (landing) and /app (screener).First stable release. The terminal now covers research, monitoring, and personal portfolio tracking end-to-end.
AlertBell with unread badge and toast delivery; /alerts page to manage rules and view event history.AuthProvider wraps the app; /auth route handles sign-in / sign-up.src/lib/version.ts as single source of truth, CHANGELOG.md, footer build tag, semver in package.json.holdings, alerts, alert_events tables and RLS policies.portfolio.functions.ts, alerts.functions.ts, news.functions.ts.Pre-1.0 work: screener, terminal analysis page, compare, watchlists, events calendar, AI narrative, diff mode, sector heatmap, data quality view, sources panel, currency toggle, keyboard shortcuts, command palette, PDF export.
This analysis is for informational purposes only and is not financial advice. Free-source market data may be delayed, incomplete, adjusted, stale, or unavailable. Investors should verify all data independently or consult a qualified financial advisor before making investment decisions.
Data sources: Finimpulse, Yahoo Finance, Financial Modeling Prep, Stooq. Each row is tagged with its provider badge. Data is shown for individual research only and may be delayed by 15+ minutes; redistribution is not permitted. All trademarks belong to their respective owners.