15 Commits

Author SHA1 Message Date
k 8534d90589 ui: tighten dashboard copy and fix layout issues 2026-06-14 21:58:56 +08:00
k 4c3c8c6f87 KOL count: 29 → 25 across marketing/SEO copy
Backend KOL_FEEDS trimmed from 29 to 25 (dead feeds removed).
Sync all hardcoded count mentions:
- layout.tsx JSON-LD, page.tsx (metric + comparison + copy)
- kol/page.tsx, KolPageClient.tsx ("and 26 more" → "and 22 more")
- glossary/page.tsx, opengraph-image.tsx
- public/llms.txt, llms-full.txt
- drop removed KOLs (Dragonfly Capital, Nic Carter) from named lists

Bundles other in-flight frontend work already in the working tree.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 22:55:27 +08:00
k ec8e9de5b1 copy: tighten Settings + Analytics wording
Settings:
- Control center body: active voice ("Arm the bot, set per-system risk limits...")
- PageHint: "Your account's full control surface — ..."
- Scope intro: 3 sentences → one bullet line with ·
- Macro scope card: "sleeve" → "system"; "behavior" → "targets"
- Global scope card: "manual window" → clearer list; "guardrails that apply to both systems"
- Telegram section note: "Bind notifications after the trading path is configured" → "Set up Telegram alerts once the bot is live"

Analytics:
- Unlock card title: "Private performance is locked" → "Your performance data is private"
- Unlock body: tighten "wallet-specific" phrase; parenthetical format for the no-gas note

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-30 12:07:49 +08:00
k aa6ede051e feat(seo/geo): Dataset + Article + BreadcrumbList structured data, noindex archive
GEO (AI answer engines) — make the signal feeds and case studies machine-citeable:
- Dataset JSON-LD on /trump, /kol, /trades (creator=Endorphin, publisher→#org,
  isAccessibleForFree, temporalCoverage). These are the "data/history/track
  record" entities Perplexity/Gemini/ChatGPT cite.
- case-studies: ItemList of 5 Article nodes, each with headline/description/
  articleBody/about + citation→evidence URL + author=Endorphin. ISO dates
  derived where parseable, omitted for vague labels.
- public/llms-full.txt: single-doc full reference (methodology + glossary +
  case studies w/ sources inlined) for one-fetch AI ingestion; linked from llms.txt.

SEO:
- Breadcrumbs component (components/seo/Breadcrumbs.tsx) → BreadcrumbList JSON-LD
  on the 8 indexable content pages (trump/kol/macro/trades/analytics/
  methodology/glossary/case-studies).
- /archive split into server page + ArchivePageClient; server page sets
  robots noindex (legacy/test data — thin-content risk).
- openGraph added to /trades and /analytics (previously meta+canonical only).

Verified: tsc 0 errors, next build passes, runtime curl confirms all JSON-LD
types render and llms-full.txt serves 200. No trading/API/component-logic changes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-30 03:08:59 +08:00
k 594d9817ba fix(analytics): never mix paper + live P&L; settings live-switch copy
Money-safety/accuracy bug: analytics computed total P&L, win rate, drawdown,
and every metric over ALL trades regardless of is_paper. A user who tried
paper mode then went live saw simulated and real P&L summed into one number
on the page whose entire purpose is 'did the bot make REAL money'.

Now: split trades by is_paper. Default to LIVE. A Live/Paper toggle appears
only when the wallet has both; otherwise auto-pick whichever exists. Paper
view shows a prominent 'SIMULATED — not real-money results' banner. All
metrics derive from the selected mode's trades only.

Also: BotConfigPanel handleUpgradeToLive copy now states Auto-Trade is forced
OFF on the paper→live switch (matches backend subscribe.py safety reset).

tsc + next build clean.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-30 01:03:15 +08:00
k e78a61bd6e fix(settings/analytics): canonical /en/, precise anchor navigation, scope card copy
Canonical URL fixes (parity with trump/macro/kol done earlier):
- analytics/page.tsx: canonical was `${siteUrl}/${locale}/analytics` → /en/
- settings/page.tsx:  canonical was `${siteUrl}/${locale}/settings`  → /en/

Settings scope card anchor navigation:
- Three scope cards ('Trump Signal ↓', 'Macro Vibes ↓', 'Global ↓') all
  pointed to #bot-config — same destination, no differentiation. Renamed:
  #config-trump / #config-macro / #config-global.
- Added matching id='config-trump/macro/global' to the three sections in
  BotConfigPanel so the anchors actually land at the right section.
- Removed misleading 'tab' wording ('Trump Signal tab ↓') — BotConfigPanel
  is not a tab component; it's a single-page vertical form. Copy now reads
  'Configure Trump ↓' etc.
- SystemControl already links to settings#bot-config which still resolves
  (the outer #bot-config wrapper div in SettingsClient is unchanged).

tsc + next build clean.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-30 00:56:59 +08:00
k a8522a2bf8 fix: Macro fetches by source, Analytics single-basis stats, funding venue label
- Macro page fetches getPosts(200, 1, source) per active tab instead of
  filtering the latest-500 global feed — rare bottom/funding signals no longer
  vanish behind Trump posts (backend now supports ?source=).
- Analytics: compute ALL time windows from the one closed_at-filtered trades
  list; dropped the 30d-only backend /performance special-case that mixed an
  opened_at basis into the same screen as the closed_at metric grid. Trade
  fetch raised 100→500 so the local computation covers ample history.
- Funding panel shows snap.venue (capitalized) instead of hardcoded "Binance".
- lib/api: getPosts gains optional source param; FundingSnapshot gains venue.

tsc + next build clean.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-29 15:15:41 +08:00
k 3ac1431336 fix(analytics): in-page unlock for private performance (parity with trades)
The analytics page had the same view-envelope gap just fixed on the trades
page: a connected wallet that hadn't first visited Settings only saw "Private
performance is locked" with no way to unlock in place. Added an "Unlock
performance" button that mints a view_user envelope (one signature, no gas) —
which both /performance and /trades accept — then reloads. Public
signal-accuracy still loads regardless. Refactored the loader to a reusable
loadAll(forcedEnv?) with an aliveRef guard, mirroring TradesPageClient.

Verified backend contracts unchanged: /performance accepts view_performance
or view_user; /signals/accuracy still returns overall + by_signal +
total_directional_signals. tsc + next build clean.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-29 15:07:06 +08:00
k d01adc4790 style(dashboard): unify Macro composite into one card + dark-mode fix
for Performance accent

User flagged the macro index box on the overview page as feeling
disjointed. Reshaped it from three stacked elements (band → track →
scale) into a single bordered card so it reads as ONE component.

  - JSX: wrap the three pieces in <div className="overview-macro-card">
  - CSS: new .overview-macro-card with tone-coloured rim (bull/bear/neutral)
  - Solid neutral-gray filled needle (was a hollow ring — looked like a
    placeholder); tone-coloured background + white inner ring + double
    shadow so it stands out on any gradient position
  - Removed the .overview-score-fill overlay — the gradient already
    encodes the spectrum; layering an opaque fill obscured it near 0
  - Thinner track (14px vs 22px), tighter scale labels, smaller pill
  - Added "TODAY · 8 INDICATORS" stamp next to the title — gives users
    a quick anchor of what they're looking at + freshness

Plus: dark-mode override for .overview-stat-card.accent (the Performance
card). It was using a cream gradient that floated as a glaring
out-of-theme block on dark mode. Mirrored the existing .kpi.accent dark
treatment so it stays visually grouped with the rest of the dashboard.

Also includes the in-flight overview rewrite from the other AI tool
(legacy /btc redirect to /macro, middleware.ts replacing proxy.ts for
Next.js routing, refactored several dashboard panels). TypeScript clean,
production build passes.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-27 11:25:59 +08:00
k f34ae9eb00 feat(macro-vibes): rename BTC Signal → Macro Vibes; add MacroPanel UI
Module rename across page H1, navbar tab, URL (/en/btc → /en/macro),
all metadata/JSON-LD, sitemap, llms.txt, opengraph image, and SystemControl
copy. Old /btc route fully removed.

New components/btc/MacroPanel.tsx polls /api/macro/snapshot and lays out
the 8 indicators in four sections (Valuation / Bottom trigger reference /
Market structure / Sentiment & flows / Positioning) with tone-coloured
values, current-band threshold chips, and a single CoinGlass / source
chart link per card. Composite -100..+100 needle pulses on score change.

Also fixes the pinned bottom-reversal alert on the homepage, which still
linked to the now-404 /en/btc — now routes to /en/macro.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-26 01:05:18 +08:00
k d72323b1c6 Production polish: i18n shelved, PWA icons, SEO/GEO cleanup, UX fixes
Big-picture changes since 01be8e7:

New routes — /trump /btc /kol /trades /analytics /archive plus four
SEO landing pages (/methodology /glossary /case-studies /contact),
all served under /[locale]. Each has dedicated metadata + JSON-LD.

KOL page (new) — DigestWidget + OnchainWidget + TalkVsTradesWidget,
filter by handle/ticker, click-through to per-post detail with the
original AI-extracted ticker/conviction/quote.

BTC page (new) — tabbed: macro-bottom (AHR999 + 200WMA + Pi Cycle)
and funding-rate reversal, with live sparkline + threshold bands.

Telegram card on Settings — wallet-link code generation, status,
disconnect. Preferences moved into the bot itself (/trump /btc etc.)
so the card stays minimal.

SignalMonitor (new) — ETH/LINK Bollinger breakout monitor in its own
component, shares the singleton WsProvider so no second WS opens.

WS singleton refactor (lib/wsContext) — shared WsProvider + useWsSubscribe
hook. Cleanup now actively closes the socket on unmount; previously the
local `ws` couldn't be reached from cleanup and leaked one connection
per StrictMode remount.

OpenPositions polling no longer pops MetaMask in the background —
splits into load('first') for user-initiated and load('poll') that
uses getCachedViewEnvelope without signing.

i18n shelved — proxy.ts (Next 16 middleware rename) wires next-intl
but only Navbar + layout footer have translations. Rest of UI used
isZh ternary scattered across 28 files. All `const isZh = locale === 'zh'`
flipped to `const isZh = false` so every site renders English; Chinese
branches kept as dead code so revival is one regex away.
LanguageSwitch hidden but file kept. zh-CN hreflang removed from
metadata + sitemap to avoid duplicate-content penalties.

Wallet error handling — lib/walletError.ts: isUserRejection walks EIP-1193
code 4001 + .cause chain; previous string-match for "reject"/"denied"
broke for users running MetaMask in non-English UIs. 12 call sites
migrated across 5 components.

PWA icons — app/icon.tsx + app/apple-icon.tsx render the brand "α" via
Next's ImageResponse so no static PNG asset is required. manifest.ts
references /icon and /apple-icon dynamic routes.

OG image + sitemap + robots — dynamic 1200×630 OG card; robots blocks
both /en/settings and /zh/settings; sitemap only emits /en routes;
JSON-LD covers SoftwareApplication + Organization + 10-Q FAQPage.

Landing page polish — Launch Dashboard button stripped of magnetic
hover + shimmer + lift + glow expansion (multiple users found it busy);
hero scramble alphabet swapped to alphanumeric (was block characters);
"15 KOL feeds" copy updated to 19 in 5 places.

PostCards source icons — new entries for btc_bottom_reversal,
funding_reversal, kol_divergence so they no longer fall through to
the generic "first letter" fallback.

Archive page filter — excludes funding_reversal + kol_divergence
(previously only excluded truth + btc_bottom_reversal so new live
signals leaked into the legacy archive).

Cache + skeleton loading — lib/cache.ts SWR module with per-key TTL,
applied across the major pages so navigation feels instant.

SignConfirmSheet — 4 hardcoded Chinese strings translated to English
(English users were seeing zh-only "需要钱包签名" etc).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-25 00:53:27 +08:00
k 01be8e790b fix: dashboard live price + 24h % + chart tick + null-pnl safety
Five bugs in the same blast radius (places we render a price/percent).

DashboardClient.tsx
  • Hero price read lastCandle.close (REST candle, frozen until user
    changes asset/tf). WebSocket livePrices was set but never read.
    Now: livePrice ?? lastCandle.close.
  • "+21.84% · 4H" was (last_close - first_open) / first_open over
    the entire candle window. limit=200 + tf=4H = 33 days shown as
    "4H". Find candle closest to now-24h, label "24h" consistently.

ChartPanel.tsx
  • Chart only re-rendered on candles prop change. Live WS ticks
    ignored. Added useEffect calling series.update() with
    livePrices[asset] on every tick.

analytics/page.tsx
  • reduce(sum + trade.pnl_usd) when pnl_usd is null → NaN poison.
  • Math.max/min over null cast to 0 → bogus "best/worst trade".
  • Win-rate denominator counted null-pnl trades as losses.
  • calcDrawdownPct had the same null poisoning.
  Fix: gate aggregations on priced subset only.

trades/page.tsx
  • ROI could divide by 0/null; entry/exit crashed on null.toLocaleString().
  Added guards.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 19:57:28 +08:00
k 040e1df685 feat: revamp dashboard, trades, and add landing/legal pages
- Major UI updates across dashboard, analytics, posts, trades, settings
- New landing page, robots/sitemap, contact/privacy/terms pages
- Updated globals.css with extensive styling and new landing.css
- Refactor signedRequest, realtime data hook, and dashboard store

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-25 16:04:57 +08:00
k 83e5892ddf done 2026-04-21 19:32:53 +08:00
k 1747fc489f first day of vibe coding 2026-04-20 22:11:18 +08:00