feat: company names for tickers (Alpaca backfill + subtle display)
Deploy / lint (push) Successful in 6s
Deploy / test (push) Successful in 55s
Deploy / deploy (push) Successful in 32s

Store an optional company name on Ticker (migration 014) and backfill it from
Alpaca's asset list in a single Trading-API call for the whole universe — no
per-ticker fetch. Runs automatically at the end of universe bootstrap and via a
manual "Backfill Names" button (admin) / POST /admin/tickers/backfill-names.

The name ships on /tickers; a shared symbol→name map (useTickerNames) lets any view
show it without its own request. Displayed subtly next to the symbol — in the global
search, the ticker header, and as a small muted line under the symbol in Top Setups
and Open Trades (no extra column, truncated so it never widens the table).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-01 10:50:40 +02:00
co-authored by Claude Opus 4.8
parent a9f4686157
commit da0bb3367e
14 changed files with 169 additions and 2 deletions
@@ -1,5 +1,6 @@
import { useEffect, useState } from 'react';
import {
useBackfillTickerNames,
useBootstrapTickers,
useTickerUniverseSetting,
useUpdateTickerUniverseSetting,
@@ -17,6 +18,7 @@ export function TickerUniverseBootstrap() {
const { data, isLoading, isError, error } = useTickerUniverseSetting();
const updateDefault = useUpdateTickerUniverseSetting();
const bootstrap = useBootstrapTickers();
const backfillNames = useBackfillTickerNames();
const [universe, setUniverse] = useState<TickerUniverse>('sp500');
const [pruneMissing, setPruneMissing] = useState(false);
@@ -85,6 +87,14 @@ export function TickerUniverseBootstrap() {
>
{bootstrap.isPending ? 'Bootstrapping…' : 'Bootstrap Now'}
</button>
<button
className="px-4 py-2 text-sm rounded border border-white/[0.1] text-gray-300 hover:text-white disabled:opacity-50"
onClick={() => backfillNames.mutate()}
disabled={backfillNames.isPending}
title="Fill in company names from Alpaca (one request for all tickers)"
>
{backfillNames.isPending ? 'Backfilling…' : 'Backfill Names'}
</button>
</div>
</div>
);