Workflow UI templates
RAFT browser tools can be customized by workflow-owned UI template files in the workflow configuration repository. These templates let workflow maintainers control what the manifest generator and report viewer show without requiring a RAFT release for every workflow-specific UI change.
Template locations
For a workflow configuration repository such as:
workflow-configs/lens/lens-human/lens-human-fastqs/
RAFT looks for manifest templates in this order:
lens.human.fastqs.manifest-ui.json
manifest-ui.json
RAFT looks for report templates in this order:
lens.human.fastqs.report-ui.json
report-ui.json
The input-specific filename is preferred. The generic filename is useful when the same UI behavior applies to every input mode for a workflow.
If no workflow-owned template is available, RAFT falls back to packaged generic defaults.
Manifest template
The manifest template controls manifest columns, sample types, workflow labels,
and workflow-level sample requirements.
RAFT also uses this file for CLI manifest validation when
raft check-manifest can auto-detect a single workflow template from a
project or when --manifest-ui-template is provided explicitly. The CLI uses
columns[].required, columns[].allowed_values, and
sample_types[].prefix/sample_types[].normal for structural checks, then
applies additional cross-row checks that are not represented in the UI
template.
A LENS-style example:
{
"schema_version": "1.0",
"name": "LENS manifest",
"description": "Manifest requirements for LENS tumor antigen discovery.",
"columns": [
{"name": "Patient_Name", "label": "Patient name", "required": true},
{"name": "Run_Name", "label": "Run name", "required": true},
{"name": "Dataset", "label": "Dataset", "required": true},
{"name": "File_Prefix", "label": "File prefix", "required": true},
{
"name": "Sequencing_Method",
"label": "Sequencing method",
"required": true,
"allowed_values": ["WES", "WXS", "WGS", "RNA-Seq", "RNA"]
},
{
"name": "Normal",
"label": "Normal",
"required": true,
"allowed_values": ["TRUE", "FALSE"]
},
{"name": "Group", "label": "Group", "required": false},
{"name": "Alleles", "label": "Alleles", "required": false}
],
"sample_types": [
{
"id": "tumor_dna",
"label": "Tumor DNA",
"prefix": "ad-",
"normal": false,
"sequencing_method": "WES"
},
{
"id": "normal_dna",
"label": "Normal DNA",
"prefix": "nd-",
"normal": true,
"sequencing_method": "WES"
},
{
"id": "tumor_rna",
"label": "Tumor RNA",
"prefix": "ar-",
"normal": false,
"sequencing_method": "RNA-Seq"
},
{
"id": "normal_rna",
"label": "Normal RNA",
"prefix": "nr-",
"normal": true,
"sequencing_method": "RNA-Seq"
}
],
"workflows": [
{
"value": "lens",
"label": "LENS",
"description": "Tumor antigen discovery from tumor DNA, normal DNA, and tumor RNA.",
"requirements": {
"normal_dna": true,
"tumor_dna": true,
"tumor_rna": true,
"normal_rna": false
}
}
]
}
Manifest template fields
columnsDefines the manifest columns exported by the generator. Each entry should include
name.label,required,description, andallowed_valuesare optional UI hints.sample_typesDefines selectable sample types and their
Run_Nameprefixes. Theidvalues should be stable machine-readable names. These IDs are also used in workflowrequirements.workflowsDefines workflow choices and sample requirements. Requirements are keyed by sample type
id.
Report template
The report template controls the patient-level sections shown by the RAFT report viewer. RAFT keeps the standard patient sidebar, group navigation, and collapsible layout behavior. Workflow maintainers customize the main report sections, labels, renderer hints, input file patterns, controls, and optional table columns. Workflows do not need to produce pMHC data; QC-only and generic table-based reports are supported.
A minimal LENS-style example:
{
"schema_version": "1.0",
"name": "LENS report",
"description": "Patient-level antigen report and QC review for LENS.",
"bundle_format": "raft-report-bundle-v1",
"layout": {
"navigation": "patients",
"group_navigation": true,
"collapsible_sidebar": true
},
"sections": [
{
"id": "report",
"label": "Report",
"renderer": "lens_antigen_report",
"source": "lens",
"default": true,
"patterns": ["*.report.tsv", "*report*.tsv"],
"controls": {
"show_filters": true,
"show_visualizations": true,
"show_table": true,
"show_cards": true
},
"table": {
"columns": [
{"key": "peptide", "label": "Peptide", "format": "text"},
{"key": "allele", "label": "Allele", "format": "text"},
{"key": "priority_score_maximum", "label": "Max Priority Score", "format": "float"},
{"key": "mhcflurry_2.1.1.aff", "label": "MHCFlurry Aff", "format": "float"},
{"key": "ccf", "label": "CCF", "format": "float"},
{"key": "vaf", "label": "VAF", "format": "float"},
{"key": "tpm", "label": "Log2(TPM)", "format": "log2"},
{"key": "antigen_source", "label": "Source", "format": "text"}
]
}
},
{
"id": "qc",
"label": "QC",
"renderer": "qc_summary",
"source": "qc"
}
]
}
Generic table example:
{
"schema_version": "1.0",
"name": "Somatic variation report",
"description": "Somatic variant calls and run-level QC.",
"bundle_format": "raft-report-bundle-v1",
"sections": [
{
"id": "somatic_variants",
"label": "Somatic variants",
"renderer": "table",
"default": true,
"patterns": ["*somatic*.tsv"],
"table": {
"columns": [
{"key": "chrom", "label": "Chrom", "format": "text"},
{"key": "pos", "label": "Position", "format": "int"},
{"key": "gene", "label": "Gene", "format": "text"},
{"key": "effect", "label": "Effect", "format": "text"},
{"key": "vaf", "label": "VAF", "format": "float"}
]
}
},
{
"id": "qc",
"label": "QC",
"renderer": "qc_summary",
"source": "qc"
}
]
}
QC-only example:
{
"schema_version": "1.0",
"name": "HLA typing QC",
"description": "Review HLA typing outputs and quality-control metrics.",
"bundle_format": "raft-report-bundle-v1",
"sections": [
{
"id": "qc",
"label": "QC",
"renderer": "qc_summary",
"source": "qc",
"default": true
},
{
"id": "files",
"label": "Files",
"renderer": "file_index",
"patterns": ["*"]
}
]
}
Report template fields
bundle_formatIdentifies the report bundle format the viewer expects. Current RAFT bundles use
raft-report-bundle-v1.layoutDeclares standard viewer layout expectations. The current viewer always uses patient navigation on the left, supports patient groups, and lets users collapse the sidebar.
sectionsDefines patient-level tabs. Each section should define a stable
idand displaylabel.rendererSelects how a section is displayed. Supported values are
tablefor generic TSV/TXT tables,qc_summaryfor built-in QC summaries,file_indexfor a list of bundle files, andlens_antigen_reportfor the LENS-specific pMHC report.patternsOptional file globs used by
tableandfile_indexsections. For example,["*somatic*.tsv"]restricts a table section to matching bundle files. If omitted, all loaded TSV/TXT report files are eligible.controlsOptional controls for
lens_antigen_reportsections. Setshow_filters,show_visualizations,show_table, orshow_cardstofalseto hide that part of the LENS report section.table.columnsOptional table column list for
tableandlens_antigen_reportsections. Each column needskeyandlabel. If omitted for a generictablesection, RAFT infers columns from the first loaded row. Supportedformatvalues aretext,string,float, andlog2.
Note
The report viewer is section-driven. Use lens_antigen_report only when
the workflow emits LENS-style pMHC rows. Other workflows should usually start
with table, qc_summary, and file_index sections.
Testing templates
To test workflow-owned templates locally:
Add the template files to the workflow configuration repository.
Run
raft runorraft run-demofor the workflow and version that should use the templates.Open the manifest generator or report viewer through RAFT.
Confirm that workflow labels, sample types, requirements, and report bundle behavior match the template.
For hosted UI testing, make sure the template files are committed to the public
workflow configuration repository. The hosted manifest generator can fetch
manifest-ui.json directly from GitLab when the local RAFT API is not
available.