01 Wayfinder / public study

A landmark you can interrogate.

A hand-built 3D signal for testing one useful idea: a variation is easier to review when its rules stay visible. This is an educational prototype, not a product preview.

Drag to orbitScroll to zoomSeed returns the same form
Starting points
Preparing scene…
Geometry identity
Appearance preset
Review stateIllustrative only

A review state records the chosen form, seed, palette, and public-lab identity. It is not a product asset.

THE REVIEWABLE VARIATION

What this lab is for

It gives a review conversation a stable starting point. A team can call out a particular form, preserve the seed and generator revision it used, then decide whether the actual exported asset meets its own requirements.

01

Choose

Pick a form, palette, and seed—then see a concrete variation.

02

Identify

The structural identifier is stable for a form and seed, independent of its palette.

03

Review

Carry the selected inputs into a project’s own review and export checks.

PUBLIC TYPESCRIPT SPECIMEN

A review key is not a generator.

This intentionally small TypeScript example records the inputs around a generated candidate. It does not create geometry, call a model, or represent GenATK product code. Its point is to make a review reference stable when settings arrive in a different order.

Inspect the standalone example
/**
 * A deliberately small public example for recording a generated variation.
 * It is independent of GenATK product code and does not generate geometry.
 */
export interface PublicReviewStateInput {
  assetId: string;
  generatorRevision: string;
  seed: number;
  settings: Record<string, string | number | boolean>;
  exportTarget: string;
}

export interface PublicReviewState {
  assetId: string;
  generatorRevision: string;
  seed: number;
  settings: Record<string, string | number | boolean>;
  exportTarget: string;
  reviewKey: string;
}

function normalizeSeed(seed: number) {
  return Number.isFinite(seed) ? (Math.trunc(seed) >>> 0) : 0;
}

function stableSettings(settings: PublicReviewStateInput['settings']) {
  return Object.fromEntries(Object.entries(settings).sort(([left], [right]) => left.localeCompare(right)));
}

function smallHash(value: string) {
  let state = 2166136261;
  for (const character of value) {
    state ^= character.charCodeAt(0);
    state = Math.imul(state, 16777619);
  }
  return (state >>> 0).toString(36).padStart(7, '0');
}

export function createPublicReviewState(input: PublicReviewStateInput): PublicReviewState {
  const seed = normalizeSeed(input.seed);
  const settings = stableSettings(input.settings);
  const identity = JSON.stringify({
    assetId: input.assetId.trim(),
    generatorRevision: input.generatorRevision.trim(),
    seed,
    settings,
    exportTarget: input.exportTarget.trim(),
  });

  return {
    assetId: input.assetId.trim(),
    generatorRevision: input.generatorRevision.trim(),
    seed,
    settings,
    exportTarget: input.exportTarget.trim(),
    reviewKey: `review-${smallHash(identity)}`,
  };
}

It is intentionally not a product demo

The geometry, materials, seeded generator, and IDs here were written solely for this page. They do not measure rendering quality, asset compatibility, file size, runtime performance, or unreleased GenATK capabilities.

For the tool-agnostic next step, use the asset review record. For the underlying idea, read why reproducible procedural assets are easier to review.

Early access

Follow the build, not the hype.

Occasional notes on experiments, public labs, and the eventual toolkit. No launch-date promise and no spam.

By subscribing, you agree to receive GenATK updates. You can unsubscribe at any time. See privacy.