Alpha Release: JK Index is in active development. Data coverage is expanding and you may see gaps or inconsistencies as we iterate. Feedback is welcome.

Dev Updates

🔥 45 updates in last 7 days

🕒 Last update 15 hours ago

Latest updates and improvements to JK Index

Development Analytics

378
Total Updates
44
Last 7 Days
120
Last 30 Days
83
Day Streak

Activity

Consistent shipping, week after week

Focus Areas

Backend300 (79.4%)
Data139 (36.8%)
Frontend123 (32.5%)
Testing69 (18.3%)
UX60 (15.9%)
Data Quality58 (15.3%)
Infra54 (14.3%)

Shipping Velocity

This week: 44 updates
Previous week: 26 updates

Latest Shipped Features

Pricing contract docs

Explore authentication, outcomes, reason codes, CAD/FX, caching, and copy-paste examples for Pokémon, One Piece, and Riftbound.

View docs
🚀

Post-FRLG soft support live

Explore 100 newly promoted Pokemon set cohorts and nearly 30k newly added cards in the live index.

View Pokemon Sets

Spiritforged now has full soft support

Browse Spiritforged under Modern with richer set details and broad card image coverage.

Explore Riftbound Sets

Release Notes

Smoke and v0 API test coverage

v0.6.342
TestingFrontendInfraDocs

Production smoke and frontend smoke now cover all external v0 API endpoints with optional keyed checks. The Node smoke runner (scripts/smoke/run_smoke.mjs) runs keyed checks for GET /api/v0/health, /api/v0/coverage, and /api/v0/price when TEST_API_KEY or --api-key is set; V0_PRICE uses the first TCG/set from the coverage response. The prod-smoke CI workflow passes TEST_API_KEY from repository secrets so keyed v0 checks run in CI when configured. The frontend smoke suite (npm run test:smoke) includes v0 health and v0 API integration tests (coverage and price) when INTEGRATION_API_BASE and TEST_API_KEY are set; they are skipped otherwise so Jest reports skipped instead of a false pass. Shared helpers (v0IntegrationHelpers) centralize backend root and auth headers for v0 tests. Docs (contract README, docs/ci/smoke.md) describe the full test stack: unkeyed and keyed checks, frontend smoke patterns, and safe addition of new checks.

Changes:

  • Node smoke runner: optional keyed v0 checks (health, coverage, price); TEST_API_KEY or --api-key; V0_PRICE built from coverage
  • prod-smoke.yml: pass TEST_API_KEY from secrets so CI runs keyed v0 checks when secret is set
  • Frontend smoke: include v0Health and v0Api integration tests in test:smoke; use shared v0IntegrationHelpers
  • docs/ci/smoke.md: table of all checks (unkeyed + keyed), auth column, prod usage with TEST_API_KEY
  • backend/tests/contract/README.md: frontend smoke and Node smoke v0 coverage when TEST_API_KEY set

v0 test key docs, Railway v0 API doc, integration test

v0.6.341
DocsFrontendInfra

Documentation and tooling for using a dedicated v0 API key when testing or running smoke checks against production. Contract README now explains TEST_API_KEY: store the raw key from a production-created key (e.g. label test or ci) in .env or CI secrets and use it for manual or scripted calls to production v0. New docs/RAILWAY_V0_API.md describes the single Railway variable required for v0 (PARTNER_API_KEY_HMAC_SECRET), how to create production keys with the same secret, and that no other vars are needed to enable the API. A frontend integration test hits GET /api/v0/health with TEST_API_KEY when INTEGRATION_API_BASE or NEXT_PUBLIC_API_BASE is set; it skips when the key is missing. .env.example documents the optional TEST_API_KEY variable.

Changes:

  • Contract README: Testing against production v0 section; TEST_API_KEY usage and link to RAILWAY_V0_API.md
  • docs/RAILWAY_V0_API.md: PARTNER_API_KEY_HMAC_SECRET required; creating prod keys; TEST_API_KEY for tests
  • frontend/tests/integration/v0Health.integration.test.ts: authed /api/v0/health when base + TEST_API_KEY set
  • .env.example: TEST_API_KEY placeholder and comment

Readyz request-thread fix + status page hydration fix

v0.6.340
BackendFrontendInfra

The /readyz endpoint no longer runs the DB check in a thread pool, which could cause "unknown" readiness when the session was used from another thread. Readiness now runs in the request thread with a 2s statement_timeout so the check is reliable and does not hang. The /status page hydration error (server rendering "Offline" while the client showed "Checking readiness…") is fixed by deferring use of navigator.onLine until after mount, so server and client render the same initial state.

Changes:

  • Backend: readyz runs in request thread; SET LOCAL statement_timeout = 2s; removed thread pool; server-side logging on failure
  • Frontend: hasMounted flag so level/offline is computed only after mount; eliminates React hydration mismatch

PR1: TCG-first copy and metadata across site

v0.6.339
Frontend

We shipped TCG-first SEO and copy across the JK Index frontend. Root layout default title and description now name all three TCGs (Pokémon TCG, One Piece TCG, Riftbound TCG) and include intent phrases: sold listings, market price, and graded (PSA) price history. Homepage H1 and hero subline, About section, and footer tagline use the same language. Card, set, and TCG landing pages have updated metadata templates with TCG and price-index wording. The how-prices page and navbar tagline now say TCG explicitly. Dev-updates route has its own layout with title and description. No routing or JSON-LD changes.

Changes:

  • Root layout: default title and description name all three TCGs and intent phrases; template adds "| JK Index" to child titles
  • Homepage: H1 "TCG Price Index – Pokémon, One Piece & Riftbound"; hero and About mention sold listings, market price, graded (PSA)
  • Footer tagline and navbar under logo: TCG price index and market intelligence wording
  • Card, set, and TCG layouts: generateMetadata titles/descriptions include TCG, sold listings, market price, price index
  • How-prices page and dev-updates layout: TCG in title/description and intro copy

Frontend and SEO audit: TCG copy, performance, code quality

v0.6.338
FrontendDocs

We added a full frontend and SEO audit document (docs/audit-jk-index-seo-perf-quality.md) covering TCG-first discoverability, Core Web Vitals, and code quality. The audit recommends explicit TCG language in titles and meta (e.g. Pokémon TCG price index, One Piece TCG card prices, sold listings, graded PSA price history), a technical SEO checklist with file-level fixes, top 10 performance issues with concrete fixes (LCP, CLS, INP, bundle, images, preconnect, fonts), and a ranked backlog with four PR-sized slices. No React Native in this repo; audit is web-only.

Changes:

  • New audit doc: Repo map, SEO findings (titles/descriptions/H1 table, missing landing pages), technical SEO checklist
  • Performance: LCP/CLS/INP fixes, preconnect, fonts, image dimensions, console cleanup; verification steps
  • Code quality: type safety, error boundaries, no-console in prod, PR plan with files and acceptance criteria
  • Backlog: P0/P1/P2 with effort and impact; TCG language guidance for all copy

Status page discoverability + RN-grade UX

v0.6.337
FrontendBackendAPIInfra

The /status page is now easy to find from the API surface: Platform API landing and docs include a Status button and a "Status / Health" link in the docs TOC with copy about live readiness checks and request IDs. The docs auth section has a callout: "Having trouble? Check /status and include X-Request-Id in support DMs." The status page itself was upgraded for RN-style clients: clear state labels (Healthy, Not Ready, Down, Offline), user-friendly messages for each error (e.g. timeout, network_error, 503 reasons), response time and copyable Request ID, a collapsed Details section with raw /readyz JSON, and "What to do next" guidance. The backend uses a shared executor for /readyz to avoid thread leakage; tests cover stability and documented reason codes.

Changes:

  • Platform API landing and docs: Status CTA; ApiDocsToc "Status / Health" link; auth callout for /status + X-Request-Id
  • Status page: getStatusMessageForReason mapping, Copy Request ID, response time, Details (raw JSON), no Down until request fails
  • Backend: module-level readyz executor, RUN_READYZ_SYNC for tests; READYZ_503_REASONS regression test

Health surface: /healthz, /readyz, /api/v0/health, /status page

v0.6.336
BackendFrontendAPIInfra

A production-grade API health surface is now available for load balancers, status pages, and high-scale clients (e.g. React Native). Backend exposes GET /healthz (liveness), GET /readyz (readiness with DB and schema checks, bounded timeout), and GET /api/v0/health (keyed, detailed checks: db, fx_table, fx_rate_usd_cad). The web status page at /status loads fast, uses a single bounded request to /readyz with timeout and optional retries, shows last-checked time and request ID for debugging, and does not poll. Production smoke now requires 200 on /healthz, /readyz, and /status. Docs in docs/dev/api_health.md cover recommended RN usage, retry policy, and ETag/304.

Changes:

  • Backend: /healthz, /readyz (public), /api/v0/health (Bearer key); readyz uses 2s DB timeout and coarse reason codes
  • Frontend: /status page with StatusBadge, fetchHealth wrapper (timeout, retries for 502/503 only), client cache 30s
  • Smoke: FRONTEND_STATUS, API_HEALTHZ, API_READYZ added to checks.json
  • docs/dev/api_health.md: RN usage, retry policy, conditional requests

Pricing API v0 Phase 2.4d: CAD snapshots, money strings, fx_rate at 6 decimals

v0.6.335
BackendAPIFeature

Phase 2.4d completes the v0 pricing milestone: builders with API keys can use GET /api/v0/price for real USD and CAD snapshots. All money fields (latest, median) are decimal strings at 2 decimals (ROUND_HALF_UP). CAD responses include fx_rate as a 6-decimal string, fx_as_of (ISO8601), and fx_source. When FX is missing, the response remains matched with snapshot=null and reason_code=fx_unavailable (no silent fallback). Centralized helpers: money.py (quantize_money, money_str, fx_rate_str) and snapshot_currency.py (convert_snapshot_usd_to_cad). Contract and observability tests cover USD/CAD snapshot-present, fx_unavailable, and no_pricing_for_segment.

Changes:

  • Money and FX formatting: money_str (2 dp), fx_rate_str (6 dp), ROUND_HALF_UP; snapshot_currency.convert_snapshot_usd_to_cad
  • get_usd_snapshot_for_segment returns JSON-ready strings; get_cad_snapshot_for_segment returns CAD snapshot or fx_unavailable sentinel (FX checked first)
  • Price route: USD and CAD paths return snapshot + as_of when data exists; as_of omitted when snapshot null
  • Contract tests: USD snapshot asserts string latest/median; new CAD snapshot test (psa_10, fx_rate 1.352742); observability test for CAD path

Pricing API v0 Phase 2.4c: USD segment snapshots

v0.6.334
BackendAPI

Phase 2.4c wires real USD pricing snapshots into GET /api/v0/price for supported segments. When sales data exists for the requested card and segment (raw_nm/lp/mp or psa_7–psa_10), the response now includes pricing.snapshot with latest, median, count, and currency=USD, plus pricing.as_of (ISO8601). When no data exists, outcome remains matched with snapshot=null and reason_code=no_pricing_for_segment. CAD requests are unchanged (Phase 2.4d will add conversion). Contract and observability tests cover snapshot-present and null paths.

Changes:

  • get_usd_snapshot_for_segment() wrapper: query + compute_snapshot; returns (snapshot_dict, as_of) or None
  • Price route: USD path calls snapshot service; populates snapshot/as_of and omits reason_code when snapshot present
  • Contract tests: raw_nm and psa_8 USD with seeded sales assert snapshot shape and as_of; observability test for reason_code=null when snapshot exists

Pricing API v0 Phase 2.4b: segment sales query layer

v0.6.333
BackendAPI

Phase 2.4b adds the DB query layer that returns sale rows for a single card and segment with no cross-segment contamination. Raw segments (raw_nm, raw_lp, raw_mp) filter on ungraded sales and stored raw_condition; PSA segments (psa_7 through psa_10) filter on graded PSA sales by grade tier. Results are ordered by newest sale_date first with a stable tie-breaker. Unknown canonical_id returns an empty list. No route, auth, or contract changes in this step.

Changes:

  • get_segment_sales_rows(session, canonical_id, segment) returns list of SnapshotInputRow for snapshot core
  • Raw buckets map to canonical_sales.raw_condition (NM/LP/MP); PSA tiers filter grading_company=PSA and grade_value
  • Ordering: sale_date desc, id desc; USD-only; schema-isolated tests for raw, PSA, and exclusions

Pricing API v0 Phase 2.4a: snapshot computation core

v0.6.332
BackendAPI

Phase 2.4a adds the pure snapshot computation layer for the Pricing API v0: deterministic latest, median, count, and as_of from an in-memory list of sale rows. All price math uses Decimal for precision; latest is defined by newest sale date (not highest price), and even-N median is the arithmetic mean of the two middle values. This core is isolated from routes and the database so it can be tested and relied on before wiring to real data. No API or contract changes in this step.

Changes:

  • SnapshotInputRow and SnapshotResult types; compute_snapshot(rows) returns None for empty input
  • Latest = price from row with max(sale_date); tie-break deterministic by input order
  • Median from sorted USD prices; even N uses (left_mid + right_mid) / 2 with Decimal
  • Unit tests for empty, single row, odd/even median, latest-by-date, and decimal precision

Pricing API v0 Phase 2.3: observability (structured logs and metrics)

v0.6.331
BackendAPI

Phase 2.3 makes the Pricing API v0 observable before adding real pricing snapshots. Every request to /api/v0/price or /api/v0/coverage now produces one machine-readable log event with request ID, API key ID, path, outcome, and reason code so support and operations can trace and analyze usage. Prometheus metrics were added for request counts by outcome and path, latency histograms, rate-limit hits, and cache hit/miss when clients use conditional requests. No API contract or response bodies changed; this is instrumentation only.

Changes:

  • Structured log per v0 request: event, request_id, api_key_id, path, status, duration_ms, outcome, reason_code
  • Prometheus counters and latency histogram for v0 routes; rate_limited and cache hit/miss counters
  • Routes annotate request state with outcome and reason for logging; auth sets api_key_id on request
  • Observability tests assert log shape and metric recording; contract tests unchanged