---
path: /domains/nyx/renderer
surface: customer
domain: nyx
auth: signed-in
source: apps/oshun/web/src/app/domains/nyx/renderer/page.tsx
status: walked
last_walked:
  '2026-05-29 automated runtime walk (Playwright headless) — render, /v1 data
  (2xx), console/page-errors, expected content, screenshot verified; live
  screen-reader, touch, offline, and telemetry-delivery checks pending a manual
  AT pass. Evidence: WALKTHROUGH/results/runtime-sweep-2026-05-29.md'
classification: specimen
---

# Nyx · Sky Renderer

> **Specimen surface.** Per P3.4 (2026-05-24), this route is reclassified as a
> configuration/specimen page that powers the visual presentation used by other
> Nyx surfaces (star chart, moon, solar system). It is not part of the canonical
> customer journey — operators and power- users reach it through deep links from
> the surfaces it backs. Sibling specimen:
> [`domains-nyx-widgets.md`](./domains-nyx-widgets.md).

## Purpose

Configurable sky-rendering surface — tune star field generation, planet
overlays, deep-sky objects, post-processing, background, and cosmic-scale
display. The renderer powers the visual presentation used by the star chart and
is itself exposed as a configurable surface here. Wired via
`apps/oshun/web/src/app/domains/nyx/renderer/page.tsx` ('use client') which
mounts `<NyxSkyRenderer onClose={() => router.back()} />`.

## Entry points

- **Direct URL / bookmark** — yes (signed-in)
- **In-app navigation** — verify whether the star chart links into the renderer
  settings or whether this is reachable independently
- **Browser back affordance** — in-component back button calls `router.back()`

## Layout regions

`NyxSkyRenderer`
(`apps/oshun/web/src/components/domains/nyx/NyxSkyRenderer.tsx`):

- **Header**: back button (`aria-label="Back"`), title `<h1>Sky Renderer</h1>`
- **Tab bar**: six tabs from `TABS` — `Star Field` (`stars`, `Star` icon),
  `Planets` (`Globe` icon), `Deep Sky` (`Sparkles` icon), `Post-Processing`
  (`post`, `Paintbrush`), `Background` (`CloudFog`), `Cosmic Scale` (`scale`,
  `Maximize2`)
- **Per-tab content**: controls for the tab's render layer — toggles with
  `aria-label="<label>: on/off"`, opacity sliders with
  `aria-label="<layer> layer opacity, currently <N> percent"`
- **Preview canvas** — verify whether the panel includes a live preview

## States

- [ ] **Loading** — client component; no async data
- [ ] **Default tab** — `Star Field` (verify initial `activeTab`)
- [ ] **Layer toggles** — each per-layer toggle flips on/off
- [ ] **Opacity adjusted** — layer opacity slider updates the preview
- [ ] **Cosmic Scale tab** — verify scale slider affects render distance
- [ ] **Offline** — static client bundle

## Interactions

### Header

- [ ] **"Back" button** (icon, `ArrowLeft`) — `onClose` → `router.back()`

### Tab bar (six tabs)

- [ ] **Star Field tab** — sets `activeTab='stars'`
- [ ] **Planets tab** — sets `activeTab='planets'`
- [ ] **Deep Sky tab** — sets `activeTab='deep-sky'`
- [ ] **Post-Processing tab** — sets `activeTab='post'`
- [ ] **Background tab** — sets `activeTab='background'`
- [ ] **Cosmic Scale tab** — sets `activeTab='scale'`

### Per-layer controls

- [ ] **Layer toggle** (button)
  - Screen reader: `aria-label="<label>: on" / "<label>: off"`
- [ ] **Layer opacity slider** (range input)
  - Screen reader: `aria-label="<layer> layer opacity, currently <N> percent"`
- [ ] **Spectral / shape selectors** — verify Star Field controls

## Data & contracts

- **Reads**: bundled defaults inside the component (~1700 lines)
- **Writes**: in-memory render settings; verify whether these persist across
  reloads
- **Realtime**: none
- **Caching**: static client bundle
- **Auth/role check**: middleware enforces signed-in for `/domains/*`

## Cross-references

- Star chart surface: [`domains-nyx-star-chart.md`](./domains-nyx-star-chart.md)
  — the renderer's primary consumer
- Sky conditions:
  [`domains-nyx-sky-conditions.md`](./domains-nyx-sky-conditions.md) (post-
  processing reflects local conditions)
- Component source:
  `apps/oshun/web/src/components/domains/nyx/NyxSkyRenderer.tsx`

## Open questions / known gaps

- [ ] Confirm whether the renderer settings have a persistence model (the star
      chart doesn't consume them) — is this a configuration surface whose output
      goes to other Nyx views, or a standalone playground?
- [ ] Document the live preview canvas — does it render with the current
      settings, or is it a static reference?
- [ ] Cross-cutting: the file may be a visualization-primitive surface consumed
      by other routes (e.g., star chart, time travel) rather than a standalone
      customer surface — clarify scope before walking
