Splatterface Games · shared infrastructure

Forge tools that feel native.

jethaForge is the workbench foundation under our studio tools — composable workspaces, one action catalog, portable contracts, and real desktop windows. Applications keep their domain; the shell is already built.

See the boundary ↓

The problem

Every serious tool ends up rebuilding the same shell: docking panels, command palettes, settings, persistence, window management, typed transport. Each copy drifts, each team pays for it twice, and none of it is the part users actually care about.

The library owns everything that is not application-specific.

jethaForge takes that position literally. The foundation supplies the workbench; the application supplies its records, handlers, editor tools, and engines.

What it provides

Where it sits in the studio

LayerOwnerExamples
Workbench systemjethaForgeWorkspaceShell, docking, command palette, settings, window host
Runtime surfacesjethaForgeViewports, transport, geometry lifecycle, durable store
Domaineach toolGarment fit evidence (Atelier), TM engine (HouseCat), clip ops (Walt), tree synthesis (Midori), LOD pipeline (Lodder), shader workbench (Matthias), 3D authoring (Megumi), verification harness (GameQA)

How the boundary stays honest

Contracts are versioned and pinned. Applications consume the stack by immutable revision, not a floating dependency, so a stack change can't silently alter a shipping tool. New capabilities enter through schema changes and reviewed stack PRs — never by reaching around the boundary.

What an application looks like

The shell, panels, actions, and hosts come from the stack; the app declares its domain.

Repository ↗
import { WorkspaceShell } from '@jethac/tools-frontend-stack/ui';

export function Workbench() {
  return (
    <WorkspaceShell
      title="My application"
      panels={applicationPanels}
      actions={applicationActions}
      docking={{ preferenceAdapter, windowHost }}
    />
  );
}

// docking, palette, settings, windows, persistence — supplied
// applicationPanels, applicationActions — yours