Here is a complete, self-contained `REFERENCE.md` file that captures the entire system architecture. It bridges your plaintext TanStack Start frontend with a high-performance **Go-based data loader** streaming raw **YAML telemetry** into a **Valkey** cache (the open-source, high-performance successor to Redis).
You can save this file locally to use as your architectural blueprint.
### `REFERENCE.md`
Markdown
````
# Architectural Reference: Quark's Holo-Grid Ledger
This document serves as the absolute technical reference for the intergalactic terminal sportsbook. The architecture uses a three-tier design to handle high-frequency data streams safely and efficiently:
1. **Data Layer**: Flat YAML configuration files mimicking raw sub-atomic telemetry.
2. **Ingestion Layer (Go)**: A high-performance Go routine that parses YAML files and pushes records continuously into a Valkey cache instance.
3. **Application Layer (TanStack Start)**: A type-safe, server-rendered frontend pulling directly from Valkey via server functions and background synchronization hooks.
---
## 1. System Topology
```mermaid
graph LR
subgraph Data Layer
A[(telemetry.yaml)]
subgraph Ingestion Layer
B[Go Ingestion Worker]
end
subgraph Cache Layer
C[(Valkey Cache Instance)]
end
subgraph Presentation Layer
D[TanStack Start SSR Server] --> E[Browser Terminal UI]
end
A --> B
B -- HSET / LPUSH --> C
C -- READ --> D
````
## 2. Data Layer: Telemetry YAML Layout
Place these static definition assets under the `./data-source/` directory root.
### File: `./data-source/sectors.yaml`
YAML
```
sectors:
- id: "sector-001"
name: "Sector 001 (Earth Array)"
quadrant: "Alpha"
initial_shield_capacity: 100
kinetic_yield: 4.2
status: "LIVE"
markets:
- id: "s1-over"
name: "Kinetic Yield Over 8.5 TW"
initial_price: 1.85
- id: "s1-under"
name: "Kinetic Yield Under 8.5 TW"
initial_price: 1.95
- id: "wolf-359"
name: "Wolf 359 Outpost"
quadrant: "Alpha"
initial_shield_capacity: 34
kinetic_yield: 12.8
status: "LIVE"
markets:
- id: "w359-fail"
name: "Total Shield Failure"
initial_price: 1.40
- id: "w359-hold"
name: "Defenses Hold Perimeter"
initial_price: 2.80
```
## 3. Ingestion Layer: Go Worker Utility
This Go engine handles parsing the local YAML file, calculating artificial odds fluctuations, and writing live JSON payloads directly into **Valkey** using standard Redis protocol definitions via the `go-redis/v9` driver.
### File: `./ingestion-engine/main.go`
Go
```
package main
import (
"context"
"encoding/json"
"fmt"
"log"
"math/rand"
"os"
"time"
"[github.com/redis/go-redis/v9](https://github.com/redis/go-redis/v9)"
"gopkg.in/yaml.v3"
)
type Market struct {
ID string `yaml:"id" json:"id"`
Name string `yaml:"name" json:"name"`
Price float64 `yaml:"initial_price" json:"price"`
Trend string `json:"trend"`
}
type Sector struct {
ID string `yaml:"id" json:"id"`
Name string `yaml:"name" json:"name"`
Quadrant string `yaml:"quadrant" json:"quadrant"`
ShieldCapacity int `yaml:"initial_shield_capacity" json:"shieldCapacity"`
KineticYield float64 `yaml:"kinetic_yield" json:"kinetic_yield"`
Status string `yaml:"status" json:"status"`
Markets []Market `yaml:"markets" json:"markets"`
}
type Config struct {
Sectors []Sector `yaml:"sectors"`
}
var ctx = context.Background()
func main() {
// 1. Connect to Valkey (Using standard Redis protocol port 6379)
valkeyClient := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // Default empty
DB: 0, // Default DB
})
// Test connection
if err := valkeyClient.Ping(ctx).Err(); err != nil {
log.Fatalf("Critical: Could not resolve Valkey connection: %v", err)
}
fmt.Println("> Subspace Comms Link to Valkey established.")
// 2. Read and parse the YAML file
yamlFile, err := os.ReadFile("../data-source/sectors.yaml")
if err != nil {
log.Fatalf("Error reading target file definitions: %v", err)
}
var config Config
if err := yaml.Unmarshal(yamlFile, &config); err != nil {
log.Fatalf("Error parsing configuration details: %v", err)
}
// 3. Fire the Ingestion Loop Simulation
ticker := time.NewTicker(2000 * time.Millisecond)
defer ticker.Stop()
fmt.Println("> Telemetry engine loop initiated. Streaming telemetry logs...")
for range ticker.C {
for i := range config.Sectors {
sector := &config.Sectors[i]
// Fluctuate shield capacities artificially
shieldChange := rand.Intn(5) - 2 // -2 to +2
sector.ShieldCapacity += shieldChange
if sector.ShieldCapacity > 100 {
sector.ShieldCapacity = 100
} else if sector.ShieldCapacity < 0 {
sector.ShieldCapacity = 0
}
// Modulate marker coefficients
for j := range sector.Markets {
market := §or.Markets[j]
priceShift := (rand.Float64() * 0.2) - 0.1 // -0.10 to +0.10
oldPrice := market.Price
market.Price = oldPrice + priceShift
if market.Price < 1.05 {
market.Price = 1.05
}
if market.Price > oldPrice {
market.Trend = "up"
} else if market.Price < oldPrice {
market.Trend = "down"
} else {
market.Trend = "stable"
}
}
// Marshall state to absolute JSON for application caching efficiency
jsonPayload, err := json.Marshal(sector)
if err != nil {
log.Printf("Error marshalling schema object: %v", err)
continue
}
// Push atomic updates directly into Valkey hash set
key := fmt.Sprintf("sector:telemetry:%s", sector.ID)
err = valkeyClient.Set(ctx, key, jsonPayload, 0).Err()
if err != nil {
log.Printf("Valkey stream pipeline transmission error: %v", err)
}
}
log.Println(">> Atomic telemetry matrix block sent to Valkey pipeline cluster.")
}
}
```
## 4. Application Layer: Reading from Valkey in TanStack Start
Your frontend reads directly from the cache pool inside server execution limits. This guarantees sub-millisecond data delivery times to the rendering layer.
First, make sure you have standard client integration parameters ready (`npm i ioredis`).
### File: `./src/server/db/valkeyConnector.ts`
TypeScript
```
import Redis from 'ioredis'
// Connect to local Valkey instance over port 6379
export const valkey = new Redis({
host: '127.0.0.1',
port: 6379,
})
export async function fetchLiveSectorFromCache(sectorId: string) {
const data = await valkey.get(`sector:telemetry:${sectorId}`)
if (!data) return null
return JSON.parse(data)
}
```
### File: `./src/routes/quadrants/$sectorId.tsx`
TypeScript
```
import { createFileRoute } from '@tanstack/react-router'
import { useQuery } from '@tanstack/react-query'
import { fetchLiveSectorFromCache } from '../../server/db/valkeyConnector'
import { createServerFn } from '@tanstack/react-start'
// Server RPC definition boundary
const getCachedSectorData = createServerFn({ method: 'GET' })
.input(String)
.handler(async ({ input: sectorId }) => {
return await fetchLiveSectorFromCache(sectorId)
})
export const Route = createFileRoute('/quadrants/$sectorId')({
loader: async ({ params }) => {
const initialSnapshot = await getCachedSectorData({ input: params.sectorId })
return { initialSnapshot }
},
component: TerminalGridPane,
})
function TerminalGridPane() {
const { initialSnapshot } = Route.useLoaderData()
const { sectorId } = Route.useParams()
// High-frequency client polling strategy linking right back to Valkey keyspaces
const { data: sector } = useQuery({
queryKey: ['live-telemetry', sectorId],
queryFn: () => getCachedSectorData({ input: sectorId }),
initialData: initialSnapshot,
refetchInterval: 2000,
})
if (!sector) return
> ERROR: MATRIX SYNC COMPROMISED
return (
> COGNITIVE STREAM: {sector.name}
QUADRANT TELEMETRY: {sector.quadrant}
SHIELD EFFICIENCY: {sector.shieldCapacity}%
{/* Dynamic Betting Selections Render */}
{sector.markets.map((m: any) => (
))}
)
}
```
To bring factions into your data, you just need to explicitly name the two competing forces inside your **Sectors**. In a sportsbook, these are your **Home Team** and **Away Team** (or Competitor A and Competitor B).
By adding a `factions` object to your data model, your Go engine can calculate specific tactical advantages, and your TanStack Start frontend can render a true _"Versus"_ scoreboard layout.
Here is how you inject factions across your entire architecture.
## 1. Update the Data Layer (`data-source/sectors.yaml`)
Add a `factions` object to each sector inside your YAML file. Give each faction a clear name and track their individual shield capacities separately instead of having just one global shield score.
YAML
```
sectors:
- id: "sector-001"
name: "Sector 001 (Earth Array)"
quadrant: "Alpha"
kinetic_yield: 4.2
status: "LIVE"
factions:
home:
name: "Starfleet Command"
shield_capacity: 100
away:
name: "The Borg Collective"
shield_capacity: 100
markets:
- id: "s1-home-win"
name: "Starfleet Victory"
initial_price: 2.10
- id: "s1-away-win"
name: "Borg Assimilation"
initial_price: 1.65
```
## 2. Update the Go Ingestion Engine (`main.go`)
Now, update your Go structs to parse these factions, and modify the engine loop so the factions actively damage each other's shields.
Go
```
type Faction struct {
Name string `yaml:"name" json:"name"`
ShieldCapacity int `yaml:"shield_capacity" json:"shieldCapacity"`
}
type FactionsSchema struct {
Home Faction `yaml:"home" json:"home"`
Away Faction `yaml:"away" json:"away"`
}
type Sector struct {
ID string `yaml:"id" json:"id"`
Name string `yaml:"name" json:"name"`
Quadrant string `yaml:"quadrant" json:"quadrant"`
KineticYield float64 `yaml:"kinetic_yield" json:"kinetic_yield"`
Status string `yaml:"status" json:"status"`
Factions FactionsSchema `yaml:"factions" json:"factions"`
Markets []Market `yaml:"markets" json:"markets"`
}
// Inside the background loop, simulate combat between the factions:
for i := range config.Sectors {
sector := &config.Sectors[i]
// Randomly choose which faction takes a hit this tick
if rand.Float64() > 0.5 {
sector.Factions.Home.ShieldCapacity -= rand.Intn(8) // Borg fires on Starfleet
} else {
sector.Factions.Away.ShieldCapacity -= rand.Intn(5) // Starfleet fires on Borg
}
// Clamp values between 0 and 100
if sector.Factions.Home.ShieldCapacity < 0 { sector.Factions.Home.ShieldCapacity = 0 }
if sector.Factions.Away.ShieldCapacity < 0 { sector.Factions.Away.ShieldCapacity = 0 }
// Dynamically shift odds based on who has higher shields
for j := range sector.Markets {
market := §or.Markets[j]
// If Home shields drop below Away shields, increase Home odds multiplier (underdog status)
if sector.Factions.Home.ShieldCapacity < sector.Factions.Away.ShieldCapacity {
if market.ID == "s1-home-win" { market.Price += 0.05 }
}
}
}
```
## 3. Render the Confrontation in the UI (`$sectorId.tsx`)
Now that Valkey is serving the detailed faction data, you can build a plaintext split-panel scoreboard at the top of your main grid layout.
TypeScript
```
function SectorConsoleView() {
const { sectorId } = Route.useParams()
const { data: sector } = useQuery({
queryKey: ['live-telemetry', sectorId],
queryFn: () => getCachedSectorData({ input: sectorId }),
refetchInterval: 2000,
})
if (!sector) return
TOTAL ENERGY RELEASED:{sector.kinetic_yield.toFixed(1)} TW
{/* Markets Selection Grid sits underneath this header view */}
)
}
```
Here is your consolidated, terminal-ready command dictionary mapping our **Star Trek Telemetry** to standard **Sportsbook Architecture**:
| **Space-Grid Term** | **Real-World Sportsbook Translation** | **Practical Example** |
| ------------------------- | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
| **Quadrant** | **Sport Category / League** | _Alpha Quadrant_ (Matches your top-level category menu, like filtering for Premier League or NBA). |
| **Sector** | **Individual Match / Fixture** | _Sector 001_ or _Wolf 359_ (The active "game page" where an event is currently happening). |
| **Factions** | **Teams / Contenders** | _Starfleet Command (Home)_ vs. _The Borg Collective (Away)_ (The competitors squaring off inside the arena). |
| **Shield Capacity** | **Live Defensive Metric / Health** | _Starfleet Shields: 74%_ (Acts like an active match timeline indicator, showing which side is taking damage or losing control). |
| **Kinetic Yield** | **Live In-Play Match Score** | _14.2 Terawatts released_ (The cumulative scoreboard counter that grows as action happens, like total points scored). |
| **Market** | **Betting Line / Wager Type** | _Faction Victory_ or _Total Kinetic Yield Over/Under_ (The explicit proposal lines a user risks their Latinum on). |
| **Latinum** | **Account Balance Base Currency** | _Gold-Pressed Latinum_ (The account balance backing your betslip tokens). |
| **Subspace Interruption** | **Odds Change Suspended Lockout** | _Market Suspended_ (The background Valkey cache triggers an automatic input lockout when a sudden scoring event happens). |
To generate a continuous, realistic stream of sports matches (Sectors) and betting options (Markets), you shouldn't hardcode individual events. Instead, you need a stable, static **Taxonomy Base Data** file.
Think of this base taxonomy file as a template library. Your Go ingestion engine will read this library, pick two opposing factions, assign them a sector arena, and generate the live match data dynamically.
Here is the structured YAML blueprint for your taxonomy database and how the generation engine maps it out.
## 1. The Core Taxonomy Configuration (`data-source/taxonomy.yaml`)
This file holds your static master rules. It defines what factions exist, which quadrants they belong to, their natural rivalries, and standard betting templates.
YAML
```
# data-source/taxonomy.yaml
quadrants:
- id: "alpha"
name: "Alpha Quadrant"
factions:
- id: "starfleet"
name: "Starfleet Command"
type: "defensive"
- id: "borg"
name: "The Borg Collective"
type: "aggressive"
- id: "cardassians"
name: "Cardassian Union"
type: "tactical"
- id: "beta"
name: "Beta Quadrant"
factions:
- id: "klingons"
name: "Klingon Empire"
type: "aggressive"
- id: "romulans"
name: "Romulan Star Empire"
type: "tactical"
# Standard templates used by the generator to instantiate structural betting lines
market_templates:
- id: "match-outcomes"
name: "Combat Resolution"
selections:
- type: "home-win"
suffix: "Decisive Victory"
- type: "away-win"
suffix: "Decisive Victory"
- id: "kinetic-over-under"
name: "Total Kinetic Yield"
selections:
- type: "over"
name: "Over 8.5 Terawatts"
base_price: 1.85
- type: "under"
name: "Under 8.5 Terawatts"
base_price: 1.85
# A list of location names the engine can pick to host matches
sector_pool:
- id: "wolf-359"
name: "Wolf 359 Outpost"
quadrant: "alpha"
- id: "sector-001"
name: "Sector 001 (Earth Core)"
quadrant: "alpha"
- id: "narendra-3"
name: "Narendra III Outpost"
quadrant: "beta"
```
## 2. The Generation Blueprint: From Rules to Live Data
When your Go ingestion engine spins up, it loops through this taxonomy file to generate actual live events using an instantiation pattern:
Plaintext
```
[ TAXONOMY DEFINITION ]
│
▼ (Go Generator Engine)
1. Pick Location: "Wolf 359" (Alpha)
2. Pick Home Faction: "Starfleet Command"
3. Pick Away Faction: "The Borg Collective"
4. Hydrate Market Templates: Substitute Faction names into strings
│
▼
[ LIVE VALKEY DATA STRUCTURE ]
```
## 3. The Go Generation Logic (Conceptual Snippet)
This is how your Go ingestion worker takes the abstract templates from `taxonomy.yaml` and handles generating real live event instances:
Go
```
// Psuedocode for the Go template instantiation loop
func GenerateLiveEvent(location SectorPoolItem, home Faction, away Faction, templates []MarketTemplate) Sector {
var generatedMarkets []Market
for _, tmpl := range templates {
if tmpl.ID == "match-outcomes" {
generatedMarkets = append(generatedMarkets, Market{
ID: location.ID + "-moneyline-home",
Name: home.Name + " " + tmpl.Selections[0].Suffix, // "Starfleet Command Decisive Victory"
Price: 2.00, // Balanced starting base odds
})
generatedMarkets = append(generatedMarkets, Market{
ID: location.ID + "-moneyline-away",
Name: away.Name + " " + tmpl.Selections[1].Suffix, // "The Borg Collective Decisive Victory"
Price: 1.80, // Borg slight favorite based on aggressive profile
})
}
}
return Sector{
ID: location.ID,
Name: location.Name,
Quadrant: location.Quadrant,
Status: "LIVE",
Factions: FactionsSchema{
Home: FactionState{Name: home.Name, ShieldCapacity: 100},
Away: FactionState{Name: away.Name, ShieldCapacity: 100},
},
Markets: generatedMarkets,
}
}
```
By organizing your database logic this way, you can add new teams (factions) or new stadiums (sectors) directly to your `taxonomy.yaml` file without altering a single line of your Go simulation logic or your TanStack Start React components. Everything down the wire becomes purely data-driven!