Component Registry
Remora's viewer components are available as a shadcn-compatible registry, hosted on GitHub Pages. This lets you install the component source directly into your project so you can customize it freely.
Available Components
Workflow Viewer
Interactive DAG visualization (and editor) for workflow definitions, built on React Flow.
npx shadcn@latest add https://isaacwasserman.github.io/remora/r/workflow-viewer.jsonDependencies installed: @remoraflow/core, @xyflow/react, @dagrejs/dagre
Workflow Step Detail Panel
Read-only panel that displays step parameters, resolved inputs, execution history, and diagnostics for a selected workflow step.
npx shadcn@latest add https://isaacwasserman.github.io/remora/r/workflow-step-detail-panel.jsonDependencies installed: @remoraflow/core
Workflow Step Editor Panel
Editable side panel with type-specific parameter editors for every step type. Pair with WorkflowViewer isEditing for a full workflow builder UI.
npx shadcn@latest add https://isaacwasserman.github.io/remora/r/workflow-step-editor-panel.jsonDependencies installed: @remoraflow/core, CodeMirror editors
Prerequisites
- A project with shadcn/ui configured (for the
@/path alias and Tailwind CSS) - Import
@xyflow/react/dist/style.csssomewhere in your app (required for the viewer)
Dark Mode
Both components follow the shadcn convention for dark mode — they use Tailwind's dark: variant classes and detect the dark class on <html>. No props needed; just toggle class="dark" on your document element as you normally would with shadcn/ui.
Usage
The components are independent — use any combination:
Viewer + Detail Panel (read-only)
import { WorkflowViewer } from "@/components/workflow-viewer/workflow-viewer";
import { StepDetailPanel } from "@/components/workflow-step-detail-panel/panels/step-detail-panel";
import type { WorkflowStep, Diagnostic } from "@remoraflow/core";
import { useState } from "react";
import "@xyflow/react/dist/style.css";
export function WorkflowPage({ workflow, diagnostics }) {
const [step, setStep] = useState<WorkflowStep | null>(null);
const [stepDiagnostics, setStepDiagnostics] = useState<Diagnostic[]>([]);
return (
<div className="flex h-screen">
<div className="flex-1">
<WorkflowViewer
workflow={workflow}
diagnostics={diagnostics}
onStepSelect={(s, d) => {
setStep(s);
setStepDiagnostics(d);
}}
/>
</div>
{step && (
<StepDetailPanel
step={step}
diagnostics={stepDiagnostics}
onClose={() => setStep(null)}
/>
)}
</div>
);
}Viewer + Editor Panel (editable)
import { WorkflowViewer } from "@/components/workflow-viewer/workflow-viewer";
import { StepEditorPanel } from "@/components/workflow-step-editor-panel/panels/step-editor-panel";
import type { WorkflowDefinition, WorkflowStep, Diagnostic } from "@remoraflow/core";
import { useState } from "react";
import "@xyflow/react/dist/style.css";
export function WorkflowBuilder({ tools }) {
const [workflow, setWorkflow] = useState<WorkflowDefinition | null>(null);
const [step, setStep] = useState<WorkflowStep | null>(null);
const [stepDiagnostics, setStepDiagnostics] = useState<Diagnostic[]>([]);
const availableToolNames = Object.keys(tools ?? {});
return (
<div className="flex h-screen">
<div className="flex-1">
<WorkflowViewer
workflow={workflow}
isEditing
onWorkflowChange={setWorkflow}
tools={tools}
onStepSelect={(s, d) => {
setStep(s);
setStepDiagnostics(d);
}}
/>
</div>
{step && (
<StepEditorPanel
step={step}
availableToolNames={availableToolNames}
allStepIds={workflow?.steps.map((s) => s.id) ?? []}
diagnostics={stepDiagnostics}
onChange={(updates) => {
// merge updates into the workflow
}}
onClose={() => setStep(null)}
/>
)}
</div>
);
}npm Package Alternative
If you don't need to customize the components, you can use them directly from the npm package instead:
bun add @remoraflow/core @remoraflow/ui react react-dom @xyflow/reactimport { WorkflowViewer, StepDetailPanel, StepEditorPanel } from "@remoraflow/ui";See the Getting Started guide for details.
Registry Endpoint
The registry index is available at:
https://isaacwasserman.github.io/remora/r/registry.json