Skip to content

New course: Nextflow Triathlon: plain Nextflow + nf-core + Seqera platform - #951

Merged
mribeirodantas merged 68 commits into
masterfrom
gvda_triathlon
Sep 13, 2026
Merged

mribeirodantas merged 68 commits into
masterfrom
gvda_triathlon

Conversation

@vdauwera

@vdauwera vdauwera commented May 8, 2026

Copy link
Copy Markdown
Collaborator

UPDATED Aug with new plan:

1. Reorganized courses around Users vs. Developers

Instead of beginner vs advanced:

  • Users = Nextflow Run, Run nf-core, Run with Seqera (aka the Nextflow Triathlon)
  • Developers = Hello Nextflow, Build with nf-core, Side Quests, Nextflow for Science

Home page catalog redesigned to match:

  • Cards now read "For users" / "For developers" instead of "Introductory/Advanced track".
  • Users card adds a "Configure execution" entry — marked coming soon, not a real course yet (placeholder "Nextflow Dot Config").
  • Developers card: Side Quests and Nextflow for Science now show a single "Browse available/all use cases" entry
    linking to their overview page, instead of listing every sub-course individually.

Site-wide nav menu changes:

  • Sidebar now groups courses under non-clickable "Users" and "Developers" labels:
  • The old "Training Collections" section (Architect's Toolkit, Nextflow Triathlon) was retired (see note in point 3); old URLs redirect.
  • New "Setup & Help" group for Training Environment and other help items.
  • Every course landing page now reads "Overview" in the sidebar (instead of repeating the course title).

2. New "Users" track details

The branch introduces (via the former "Nextflow Triathlon" work) three new streamlined 'getting started' courses aimed at people who need to run pipelines, not develop them — no prior coding assumed. They were originally one long lesson each; now split into multiple parts for pacing. This may still need some refinement (including shoving the code explanation bits into collapsible 'more info' sections). The goal is for each to take roughly one hour to teach.

  • Nextflow Run: Part 1: Running basics / Part 2: Configuration basics
  • Run nf-core: Part 1: Find & try demo / Part 2: Configure execution / Part 3: Run a production pipeline
  • Run with Seqera: Part 1: Use from the web interface / Part 2: Use from the CLI

3. Training Collections retired + Side Quests table reorganized

The table on the Side Quests page now shows logical groupings, with clear subheader rows.

The "Training Collections" section wasn't really working as it was. We could bring it back in some form if we have multiple collections to showcase, but the reorganized table of Side Quests hopefully makes it mostly unnecessary.

We could potentially create a section with dedicated landing pages for standard multi-course trainings like we run at summits or sessions.

@vdauwera vdauwera self-assigned this May 8, 2026
@netlify

netlify Bot commented May 8, 2026

Copy link
Copy Markdown

Deploy Preview for nextflow-training ready!

Name Link
🔨 Latest commit 502fdcb
🔍 Latest deploy log https://app.netlify.com/projects/nextflow-training/deploys/6aa6d1ab2185aa0008ab8392
😎 Deploy Preview https://deploy-preview-951--nextflow-training.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@vdauwera vdauwera changed the title First pass of the triathlon course New course: Nextflow Triathlon: plain Nextflow + nf-core + Seqera platform May 8, 2026
@github-actions

github-actions Bot commented May 8, 2026

Copy link
Copy Markdown
Contributor

Nextflow linting complete!

⚠️ 32 files had 45 warnings
✅ 183 files had no errors
🔧 131 files would be changed by auto-formatting

💡 Tip: Click filename locations to go directly to that code.

View all 45 issues
Type Location Message
Warning nfcore-build/solutions/composable-hello/hello.nf:36:5 Emit name should be omitted when there is only one emit
Warning nfcore-build/solutions/core-hello-part1/subworkflows/local/utils_nfcore_hello_pipeline/main.nf:30:5 Parameter was not used -- prefix with _ to suppress warning
Warning nfcore-build/solutions/core-hello-part1/subworkflows/local/utils_nfcore_hello_pipeline/main.nf:33:5 Parameter was not used -- prefix with _ to suppress warning
Warning nfcore-build/solutions/core-hello-part1/subworkflows/nf-core/utils_nextflow_pipeline/main.nf:43:5 Emit name should be omitted when there is only one emit
Warning nfcore-build/solutions/core-hello-part1/subworkflows/nf-core/utils_nfcore_pipeline/main.nf:20:5 Emit name should be omitted when there is only one emit
Warning nfcore-build/solutions/core-hello-part1/subworkflows/nf-core/utils_nfschema_plugin/main.nf:72:5 Emit name should be omitted when there is only one emit
Warning nfcore-build/solutions/core-hello-part1/workflows/hello.nf:68:17 Variable was declared but not used
Warning nfcore-build/solutions/core-hello-part2/subworkflows/local/utils_nfcore_hello_pipeline/main.nf:30:5 Parameter was not used -- prefix with _ to suppress warning
Warning nfcore-build/solutions/core-hello-part2/subworkflows/local/utils_nfcore_hello_pipeline/main.nf:33:5 Parameter was not used -- prefix with _ to suppress warning
Warning nfcore-build/solutions/core-hello-part2/subworkflows/nf-core/utils_nextflow_pipeline/main.nf:43:5 Emit name should be omitted when there is only one emit
Warning nfcore-build/solutions/core-hello-part2/subworkflows/nf-core/utils_nfcore_pipeline/main.nf:20:5 Emit name should be omitted when there is only one emit
Warning nfcore-build/solutions/core-hello-part2/subworkflows/nf-core/utils_nfschema_plugin/main.nf:72:5 Emit name should be omitted when there is only one emit
Warning nfcore-build/solutions/core-hello-part2/workflows/hello.nf:45:55 Parameter was not used -- prefix with _ to suppress warning
Warning nfcore-build/solutions/core-hello-part2/workflows/hello.nf:77:17 Variable was declared but not used
Warning nfcore-build/solutions/core-hello-part3/modules/local/cowpy/main.nf:30:9 Variable was declared but not used
Warning nfcore-build/solutions/core-hello-part3/subworkflows/local/utils_nfcore_hello_pipeline/main.nf:30:5 Parameter was not used -- prefix with _ to suppress warning
Warning nfcore-build/solutions/core-hello-part3/subworkflows/local/utils_nfcore_hello_pipeline/main.nf:33:5 Parameter was not used -- prefix with _ to suppress warning
Warning nfcore-build/solutions/core-hello-part3/subworkflows/nf-core/utils_nextflow_pipeline/main.nf:43:5 Emit name should be omitted when there is only one emit
Warning nfcore-build/solutions/core-hello-part3/subworkflows/nf-core/utils_nfcore_pipeline/main.nf:20:5 Emit name should be omitted when there is only one emit
Warning nfcore-build/solutions/core-hello-part3/subworkflows/nf-core/utils_nfschema_plugin/main.nf:72:5 Emit name should be omitted when there is only one emit
Warning nfcore-build/solutions/core-hello-part3/workflows/hello.nf:74:17 Variable was declared but not used
Warning nfcore-build/solutions/core-hello-part4/modules/local/cowpy/main.nf:30:9 Variable was declared but not used
Warning nfcore-build/solutions/core-hello-part4/subworkflows/local/utils_nfcore_hello_pipeline/main.nf:30:5 Parameter was not used -- prefix with _ to suppress warning
Warning nfcore-build/solutions/core-hello-part4/subworkflows/local/utils_nfcore_hello_pipeline/main.nf:33:5 Parameter was not used -- prefix with _ to suppress warning
Warning nfcore-build/solutions/core-hello-part4/subworkflows/nf-core/utils_nextflow_pipeline/main.nf:43:5 Emit name should be omitted when there is only one emit
Warning nfcore-build/solutions/core-hello-part4/subworkflows/nf-core/utils_nfcore_pipeline/main.nf:20:5 Emit name should be omitted when there is only one emit
Warning nfcore-build/solutions/core-hello-part4/subworkflows/nf-core/utils_nfschema_plugin/main.nf:72:5 Emit name should be omitted when there is only one emit
Warning nfcore-build/solutions/core-hello-part4/workflows/hello.nf:74:17 Variable was declared but not used
Warning nfcore-build/solutions/core-hello-start/subworkflows/nf-core/utils_nextflow_pipeline/main.nf:43:5 Emit name should be omitted when there is only one emit
Warning nfcore-build/solutions/core-hello-start/subworkflows/nf-core/utils_nfcore_pipeline/main.nf:20:5 Emit name should be omitted when there is only one emit
Warning nfcore-build/solutions/core-hello-start/subworkflows/nf-core/utils_nfschema_plugin/main.nf:72:5 Emit name should be omitted when there is only one emit
Warning nfcore-build/solutions/core-hello-start/workflows/hello.nf:18:5 Parameter was not used -- prefix with _ to suppress warning
Warning nfcore-build/solutions/core-hello-start/workflows/hello.nf:45:9 Variable was declared but not used
Warning nfcore-build/solutions/core-hello-start/workflows/hello.nf:54:5 Emit name should be omitted when there is only one emit
Warning side-quests/solutions/debugging/buggy_workflow.nf:91:44 Implicit closure parameter is deprecated, declare an explicit parameter instead
Warning side-quests/solutions/essential_scripting_patterns/main.nf:59:25 Parameter was not used -- prefix with _ to suppress warning
Warning side-quests/solutions/essential_scripting_patterns/main.nf:63:53 Parameter was not used -- prefix with _ to suppress warning
Warning side-quests/solutions/essential_scripting_patterns/main.nf:68:5 Variable was declared but not used
Warning side-quests/solutions/essential_scripting_patterns/main.nf:69:5 Variable was declared but not used
Warning side-quests/solutions/metadata/1.2/main.nf:5:5 Variable was declared but not used
Warning side-quests/solutions/splitting_and_grouping/main.nf:11:25 Parameter was not used -- prefix with _ to suppress warning
Warning side-quests/solutions/splitting_and_grouping/main.nf:14:25 Parameter was not used -- prefix with _ to suppress warning
Warning side-quests/solutions/splitting_and_grouping/main.nf:29:5 Variable was declared but not used
Warning side-quests/solutions/working_with_files/6/main.nf:10:43 Variable was declared but not used
Warning side-quests/solutions/working_with_files/6/main.nf:30:22 Parameter was not used -- prefix with _ to suppress warning
View formatting changes
FileDiff
hello-nextflow/solutions/1-hello-world/hello-world-2.nf
View
@@ -4,7 +4,6 @@
  * Use echo to print 'Hello World!' to a file
  */
 process sayHello {
-
     output:
     path 'output.txt'
 
hello-nextflow/solutions/1-hello-world/hello-world-3.nf
View
@@ -4,7 +4,6 @@
  * Use echo to print 'Hello World!' to a file
  */
 process sayHello {
-
     input:
     val greeting
 
hello-nextflow/solutions/2-hello-channels/hello-channels-1.nf
View
@@ -4,7 +4,6 @@
  * Use echo to print 'Hello World!' to a file
  */
 process sayHello {
-
     input:
     val greeting
 
@@ -29,7 +28,7 @@ workflow {
     main:
     // create a channel for inputs
     greeting_ch = channel.of('Hello Channels!')
-                        .view()
+        .view()
     // emit a greeting
... (truncated)
hello-nextflow/solutions/2-hello-channels/hello-channels-2.nf
View
@@ -4,7 +4,6 @@
  * Use echo to print 'Hello World!' to a file
  */
 process sayHello {
-
     input:
     val greeting
 
@@ -29,7 +28,7 @@ workflow {
     main:
     // create a channel for inputs
     greeting_ch = channel.of('Hello', 'Bonjour', 'Hola')
-                        .view()
+        .view()
     // emit a greeting
... (truncated)
hello-nextflow/solutions/2-hello-channels/hello-channels-3.nf
View
@@ -4,7 +4,6 @@
  * Use echo to print 'Hello World!' to a file
  */
 process sayHello {
-
     input:
     val greeting
 
@@ -28,12 +27,12 @@ workflow {
 
     main:
     // declare an array of input greetings
-    greetings_array = ['Hello','Bonjour','Hola']
+    greetings_array = ['Hello', 'Bonjour', 'Hola']
     // create a channel for inputs
... (truncated)
hello-nextflow/solutions/2-hello-channels/hello-channels-4.nf
View
@@ -4,7 +4,6 @@
  * Use echo to print 'Hello World!' to a file
  */
 process sayHello {
-
     input:
     val greeting
 
@@ -29,11 +28,11 @@ workflow {
     main:
     // create a channel for inputs from a CSV file
     greeting_ch = channel.fromPath(params.input)
-                        .view { csv -> "Before splitCsv: $csv" }
-                        .splitCsv()
-                        .view { csv -> "After splitCsv: $csv" }
... (truncated)
hello-nextflow/solutions/3-hello-workflow/hello-workflow-1.nf
View
@@ -4,7 +4,6 @@
  * Use echo to print 'Hello World!' to a file
  */
 process sayHello {
-
     input:
     val greeting
 
@@ -21,7 +20,6 @@ process sayHello {
  * Use a text replacement tool to convert the greeting to uppercase
  */
 process convertToUpper {
-
     input:
     path input_file
... (truncated)
hello-nextflow/solutions/3-hello-workflow/hello-workflow-2.nf
View
@@ -4,7 +4,6 @@
  * Use echo to print 'Hello World!' to a file
  */
 process sayHello {
-
     input:
     val greeting
 
@@ -21,7 +20,6 @@ process sayHello {
  * Use a text replacement tool to convert the greeting to uppercase
  */
 process convertToUpper {
-
     input:
     path input_file
... (truncated)
hello-nextflow/solutions/3-hello-workflow/hello-workflow-3.nf
View
@@ -4,7 +4,6 @@
  * Use echo to print 'Hello World!' to a file
  */
 process sayHello {
-
     input:
     val greeting
 
@@ -21,7 +20,6 @@ process sayHello {
  * Use a text replacement tool to convert the greeting to uppercase
  */
 process convertToUpper {
-
     input:
     path input_file
... (truncated)
hello-nextflow/solutions/3-hello-workflow/hello-workflow-4.nf
View
@@ -4,7 +4,6 @@
  * Use echo to print 'Hello World!' to a file
  */
 process sayHello {
-
     input:
     val greeting
 
@@ -21,7 +20,6 @@ process sayHello {
  * Use a text replacement tool to convert the greeting to uppercase
  */
 process convertToUpper {
-
     input:
     path input_file
... (truncated)
hello-nextflow/solutions/4-hello-modules/hello-modules-2.nf
View
@@ -7,7 +7,6 @@ include { sayHello } from './modules/sayHello.nf'
  * Use a text replacement tool to convert the greeting to uppercase
  */
 process convertToUpper {
-
     input:
     path input_file
 
@@ -24,7 +23,6 @@ process convertToUpper {
  * Collect uppercase greetings into a single output file
  */
 process collectGreetings {
-
     input:
     path input_files
... (truncated)
hello-nextflow/solutions/4-hello-modules/hello-modules-3.nf
View
@@ -8,7 +8,6 @@ include { convertToUpper } from './modules/convertToUpper.nf'
  * Collect uppercase greetings into a single output file
  */
 process collectGreetings {
-
     input:
     path input_files
     val batch_name
@@ -38,8 +37,8 @@ workflow {
     main:
     // create a channel for inputs from a CSV file
     greeting_ch = channel.fromPath(params.input)
-                        .splitCsv()
-                        .map { line -> line[0] }
+        .splitCsv()
... (truncated)
hello-nextflow/solutions/4-hello-modules/hello-modules-4.nf
View
@@ -18,8 +18,8 @@ workflow {
     main:
     // create a channel for inputs from a CSV file
     greeting_ch = channel.fromPath(params.input)
-                        .splitCsv()
-                        .map { line -> line[0] }
+        .splitCsv()
+        .map { line -> line[0] }
     // emit a greeting
     sayHello(greeting_ch)
     // convert the greeting to uppercase
hello-nextflow/solutions/4-hello-modules/modules/collectGreetings.nf
View
@@ -2,7 +2,6 @@
  * Collect uppercase greetings into a single output file
  */
 process collectGreetings {
-
     input:
     path input_files
     val batch_name
hello-nextflow/solutions/4-hello-modules/modules/convertToUpper.nf
View
@@ -2,7 +2,6 @@
  * Use a text replacement tool to convert the greeting to uppercase
  */
 process convertToUpper {
-
     input:
     path input_file
 
hello-nextflow/solutions/4-hello-modules/modules/sayHello.nf
View
@@ -2,7 +2,6 @@
  * Use echo to print 'Hello World!' to a file
  */
 process sayHello {
-
     input:
     val greeting
 
hello-nextflow/solutions/5-hello-containers/hello-containers-2.nf
View
@@ -20,8 +20,8 @@ workflow {
     main:
     // create a channel for inputs from a CSV file
     greeting_ch = channel.fromPath(params.input)
-                        .splitCsv()
-                        .map { line -> line[0] }
+        .splitCsv()
+        .map { line -> line[0] }
     // emit a greeting
     sayHello(greeting_ch)
     // convert the greeting to uppercase
hello-nextflow/solutions/5-hello-containers/modules/collectGreetings.nf
View
@@ -2,7 +2,6 @@
  * Collect uppercase greetings into a single output file
  */
 process collectGreetings {
-
     input:
     path input_files
     val batch_name
hello-nextflow/solutions/5-hello-containers/modules/convertToUpper.nf
View
@@ -2,7 +2,6 @@
  * Use a text replacement tool to convert the greeting to uppercase
  */
 process convertToUpper {
-
     input:
     path input_file
 
hello-nextflow/solutions/5-hello-containers/modules/sayHello.nf
View
@@ -2,7 +2,6 @@
  * Use echo to print 'Hello World!' to a file
  */
 process sayHello {
-
     input:
     val greeting
 
hello-nextflow/solutions/6-hello-config/hello-config.nf
View
@@ -20,8 +20,8 @@ workflow {
     main:
     // create a channel for inputs from a CSV file
     greeting_ch = channel.fromPath(params.input)
-                        .splitCsv()
-                        .map { line -> line[0] }
+        .splitCsv()
+        .map { line -> line[0] }
     // emit a greeting
     sayHello(greeting_ch)
     // convert the greeting to uppercase
hello-nextflow/solutions/6-hello-config/modules/collectGreetings.nf
View
@@ -2,7 +2,6 @@
  * Collect uppercase greetings into a single output file
  */
 process collectGreetings {
-
     input:
     path input_files
     val batch_name
hello-nextflow/solutions/6-hello-config/modules/convertToUpper.nf
View
@@ -2,7 +2,6 @@
  * Use a text replacement tool to convert the greeting to uppercase
  */
 process convertToUpper {
-
     input:
     path input_file
 
hello-nextflow/solutions/6-hello-config/modules/sayHello.nf
View
@@ -2,7 +2,6 @@
  * Use echo to print 'Hello World!' to a file
  */
 process sayHello {
-
     input:
     val greeting
 
hello-nextflow/solutions/6-hello-config/nextflow.config
View
@@ -6,7 +6,7 @@ conda.enabled = true
 */
 process {
     memory = 1.GB
-    withName: 'cowpy' {
+    withName: cowpy {
         memory = 2.GB
         cpus = 2
     }
@@ -32,11 +32,7 @@ profiles {
     univ_hpc {
         process.executor = 'slurm'
         conda.enabled = true
-        process.resourceLimits = [
-            memory: 750.GB,
... (truncated)
nfcore-build/solutions/composable-hello/hello.nf
View
@@ -14,9 +14,7 @@ include { collectGreetings } from './modules/collectGreetings.nf'
 include { cowpy } from './modules/cowpy.nf'
 
 workflow HELLO {
-
     take:
-    // channel of greetings
     greeting_ch
 
     main:
nfcore-build/solutions/composable-hello/main.nf
View
@@ -9,12 +9,12 @@ params.greeting = 'greetings.csv'
 workflow {
     // create a channel for inputs from a CSV file
     greeting_ch = channel.fromPath(params.greeting)
-                        .splitCsv()
-                        .map { line -> line[0] }
+        .splitCsv()
+        .map { line -> line[0] }
 
     // call the imported workflow on the channel of greetings
     HELLO(greeting_ch)
 
     // view the outputs emitted by the workflow
-    HELLO.out.view { output -> "Output: $output" }
+    HELLO.out.view { output -> "Output: ${output}" }
... (truncated)
nfcore-build/solutions/composable-hello/modules/collectGreetings.nf
View
@@ -10,8 +10,8 @@ process collectGreetings {
     val batch_name
 
     output:
-    path "COLLECTED-${batch_name}-output.txt" , emit: outfile
-    val count_greetings , emit: count
+    path "COLLECTED-${batch_name}-output.txt", emit: outfile
+    val count_greetings, emit: count
 
     script:
     count_greetings = input_files.size()
nfcore-build/solutions/composable-hello/modules/convertToUpper.nf
View
@@ -13,6 +13,6 @@ process convertToUpper {
 
     script:
     """
-    cat '$input_file' | tr '[a-z]' '[A-Z]' > 'UPPER-${input_file}'
+    cat '${input_file}' | tr '[a-z]' '[A-Z]' > 'UPPER-${input_file}'
     """
 }
nfcore-build/solutions/composable-hello/modules/cowpy.nf
View
@@ -15,6 +15,6 @@ process cowpy {
 
     script:
     """
-    cat $input_file | cowpy -c "$character" > cowpy-${input_file}
+    cat ${input_file} | cowpy -c "${character}" > cowpy-${input_file}
     """
 }
nfcore-build/solutions/composable-hello/modules/sayHello.nf
View
@@ -13,6 +13,6 @@ process sayHello {
 
     script:
     """
-    echo '$greeting' > '$greeting-output.txt'
+    echo '${greeting}' > '${greeting}-output.txt'
     """
 }
nfcore-build/solutions/core-hello-part1/conf/base.config
View
@@ -11,13 +11,13 @@
 process {
 
     // TODO nf-core: Check the defaults for all processes
-    cpus   = { 1      * task.attempt }
-    memory = { 6.GB   * task.attempt }
-    time   = { 4.h    * task.attempt }
+    cpus = { 1 * task.attempt }
+    memory = { 6.GB * task.attempt }
+    time = { 4.h * task.attempt }
 
     errorStrategy = { task.exitStatus in ((130..145) + 104 + (175..177)) ? 'retry' : 'finish' }
-    maxRetries    = 1
-    maxErrors     = '-1'
+    maxRetries = 1
... (truncated)
nfcore-build/solutions/core-hello-part1/conf/modules.config
View
@@ -12,10 +12,5 @@
 
 process {
 
-    publishDir = [
-        path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" },
-        mode: params.publish_dir_mode,
-        saveAs: { filename -> filename.equals('versions.yml') ? null : filename }
-    ]
-
+    publishDir = [path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename }]
 }
nfcore-build/solutions/core-hello-part1/conf/test.config
View
@@ -11,21 +11,17 @@
 */
 
 process {
-    resourceLimits = [
-        cpus: 2,
-        memory: '4.GB',
-        time: '1.h'
-    ]
+    resourceLimits = [cpus: 2, memory: '4.GB', time: '1.h']
 }
 
 params {
-    config_profile_name        = 'Test profile'
+    config_profile_name = 'Test profile'
... (truncated)
nfcore-build/solutions/core-hello-part1/conf/test_full.config
View
@@ -11,7 +11,7 @@
 */
 
 params {
-    config_profile_name        = 'Full test profile'
+    config_profile_name = 'Full test profile'
     config_profile_description = 'Full test dataset to check pipeline function'
 
     // Input data for full size test
nfcore-build/solutions/core-hello-part1/main.nf
View
@@ -13,9 +13,9 @@
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 */
 
-include { HELLO  } from './workflows/hello'
+include { HELLO } from './workflows/hello'
 include { PIPELINE_INITIALISATION } from './subworkflows/local/utils_nfcore_hello_pipeline'
-include { PIPELINE_COMPLETION     } from './subworkflows/local/utils_nfcore_hello_pipeline'
+include { PIPELINE_COMPLETION } from './subworkflows/local/utils_nfcore_hello_pipeline'
 /*
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     NAMED WORKFLOWS FOR PIPELINE
@@ -26,7 +26,6 @@ include { PIPELINE_COMPLETION     } from './subworkflows/local/utils_nfcore_hell
 // WORKFLOW: Run main analysis pipeline depending on type of input
 //
... (truncated)
nfcore-build/solutions/core-hello-part1/modules/local/collectGreetings.nf
View
@@ -10,8 +10,8 @@ process collectGreetings {
     val batch_name
 
     output:
-    path "COLLECTED-${batch_name}-output.txt" , emit: outfile
-    val count_greetings , emit: count
+    path "COLLECTED-${batch_name}-output.txt", emit: outfile
+    val count_greetings, emit: count
 
     script:
     count_greetings = input_files.size()
nfcore-build/solutions/core-hello-part1/modules/local/convertToUpper.nf
View
@@ -13,6 +13,6 @@ process convertToUpper {
 
     script:
     """
-    cat '$input_file' | tr '[a-z]' '[A-Z]' > 'UPPER-${input_file}'
+    cat '${input_file}' | tr '[a-z]' '[A-Z]' > 'UPPER-${input_file}'
     """
 }
nfcore-build/solutions/core-hello-part1/modules/local/cowpy.nf
View
@@ -7,14 +7,14 @@ process cowpy {
     conda 'conda-forge::cowpy==1.1.5'
 
     input:
-        path input_file
-        val character
+    path input_file
+    val character
 
     output:
-        path "cowpy-${input_file}"
+    path "cowpy-${input_file}"
 
     script:
     """
... (truncated)
nfcore-build/solutions/core-hello-part1/modules/local/sayHello.nf
View
@@ -13,6 +13,6 @@ process sayHello {
 
     script:
     """
-    echo '$greeting' > '$greeting-output.txt'
+    echo '${greeting}' > '${greeting}-output.txt'
     """
 }
nfcore-build/solutions/core-hello-part1/nextflow.config
View
@@ -11,30 +11,30 @@ params {
 
     // TODO nf-core: Specify your pipeline's command line flags
     // Input options
-    input                      = null
+    input = null
 
     // Boilerplate options
-    outdir                       = null
-    publish_dir_mode             = 'copy'
-    monochrome_logs              = false
-    help                         = false
-    help_full                    = false
-    show_hidden                  = false
-    version                      = false
... (truncated)
nfcore-build/solutions/core-hello-part1/subworkflows/local/utils_nfcore_hello_pipeline/main.nf
View
@@ -8,13 +8,13 @@
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 */
 
-include { UTILS_NFSCHEMA_PLUGIN     } from '../../nf-core/utils_nfschema_plugin'
-include { paramsSummaryMap          } from 'plugin/nf-schema'
-include { samplesheetToList         } from 'plugin/nf-schema'
-include { paramsHelp                } from 'plugin/nf-schema'
-include { completionSummary         } from '../../nf-core/utils_nfcore_pipeline'
-include { UTILS_NFCORE_PIPELINE     } from '../../nf-core/utils_nfcore_pipeline'
-include { UTILS_NEXTFLOW_PIPELINE   } from '../../nf-core/utils_nextflow_pipeline'
+include { UTILS_NFSCHEMA_PLUGIN } from '../../nf-core/utils_nfschema_plugin'
+include { paramsSummaryMap } from 'plugin/nf-schema'
+include { samplesheetToList } from 'plugin/nf-schema'
+include { paramsHelp } from 'plugin/nf-schema'
... (truncated)
nfcore-build/solutions/core-hello-part1/subworkflows/nf-core/utils_nextflow_pipeline/main.nf
View
@@ -10,9 +10,9 @@
 
 workflow UTILS_NEXTFLOW_PIPELINE {
     take:
-    print_version        // boolean: print version
-    dump_parameters      // boolean: dump parameters
-    outdir               //    path: base directory used to publish pipeline results
+    print_version // boolean: print version
+    dump_parameters // boolean: dump parameters
+    outdir //    path: base directory used to publish pipeline results
     check_conda_channels // boolean: check conda channels
 
     main:
@@ -72,10 +72,10 @@ def getWorkflowVersion() {
 //
... (truncated)
nfcore-build/solutions/core-hello-part1/subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config
View
@@ -1,9 +1,9 @@
 manifest {
-    name            = 'nextflow_workflow'
-    author          = """nf-core"""
-    homePage        = 'https://127.0.0.1'
-    description     = """Dummy pipeline"""
+    name = 'nextflow_workflow'
+    author = """nf-core"""
+    homePage = 'https://127.0.0.1'
+    description = """Dummy pipeline"""
     nextflowVersion = '!>=23.04.0'
-    version         = '9.9.9'
-    doi             = 'https://doi.org/10.5281/zenodo.5070524'
+    version = '9.9.9'
+    doi = 'https://doi.org/10.5281/zenodo.5070524'
... (truncated)
nfcore-build/solutions/core-hello-part1/subworkflows/nf-core/utils_nfcore_pipeline/main.nf
View
@@ -125,12 +125,12 @@ def paramsSummaryMultiqc(summary_params) {
         }
 
     def yaml_file_text = "id: '${workflow.manifest.name.replace('/', '-')}-summary'\n" as String
-    yaml_file_text     += "description: ' - this information is collected when the pipeline is started.'\n"
-    yaml_file_text     += "section_name: '${workflow.manifest.name} Workflow Summary'\n"
-    yaml_file_text     += "section_href: 'https://github.com/${workflow.manifest.name}'\n"
-    yaml_file_text     += "plot_type: 'html'\n"
-    yaml_file_text     += "data: |\n"
-    yaml_file_text     += "${summary_section}"
+    yaml_file_text += "description: ' - this information is collected when the pipeline is started.'\n"
+    yaml_file_text += "section_name: '${workflow.manifest.name} Workflow Summary'\n"
+    yaml_file_text += "section_href: 'https://github.com/${workflow.manifest.name}'\n"
+    yaml_file_text += "plot_type: 'html'\n"
+    yaml_file_text += "data: |\n"
... (truncated)
nfcore-build/solutions/core-hello-part1/subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config(truncated)
nfcore-build/solutions/core-hello-part1/subworkflows/nf-core/utils_nfschema_plugin/main.nf(truncated)
nfcore-build/solutions/core-hello-part1/workflows/hello.nf(truncated)
nfcore-build/solutions/core-hello-part2/conf/base.config(truncated)
nfcore-build/solutions/core-hello-part2/conf/modules.config(truncated)
nfcore-build/solutions/core-hello-part2/conf/test.config(truncated)
nfcore-build/solutions/core-hello-part2/conf/test_full.config(truncated)
nfcore-build/solutions/core-hello-part2/main.nf(truncated)
nfcore-build/solutions/core-hello-part2/modules/local/collectGreetings.nf(truncated)
nfcore-build/solutions/core-hello-part2/modules/local/convertToUpper.nf(truncated)
nfcore-build/solutions/core-hello-part2/modules/local/cowpy.nf(truncated)
nfcore-build/solutions/core-hello-part2/modules/local/sayHello.nf(truncated)
nfcore-build/solutions/core-hello-part2/modules/nf-core/find/concatenate/main.nf(truncated)
nfcore-build/solutions/core-hello-part2/nextflow.config(truncated)
nfcore-build/solutions/core-hello-part2/subworkflows/local/utils_nfcore_hello_pipeline/main.nf(truncated)
nfcore-build/solutions/core-hello-part2/subworkflows/nf-core/utils_nextflow_pipeline/main.nf(truncated)
nfcore-build/solutions/core-hello-part2/subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config(truncated)
nfcore-build/solutions/core-hello-part2/subworkflows/nf-core/utils_nfcore_pipeline/main.nf(truncated)
nfcore-build/solutions/core-hello-part2/subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config(truncated)
nfcore-build/solutions/core-hello-part2/subworkflows/nf-core/utils_nfschema_plugin/main.nf(truncated)
nfcore-build/solutions/core-hello-part2/workflows/hello.nf(truncated)
nfcore-build/solutions/core-hello-part3/conf/base.config(truncated)
nfcore-build/solutions/core-hello-part3/conf/modules.config(truncated)
nfcore-build/solutions/core-hello-part3/conf/test.config(truncated)
nfcore-build/solutions/core-hello-part3/conf/test_full.config(truncated)
nfcore-build/solutions/core-hello-part3/main.nf(truncated)
nfcore-build/solutions/core-hello-part3/modules/local/collectGreetings.nf(truncated)
nfcore-build/solutions/core-hello-part3/modules/local/convertToUpper.nf(truncated)
nfcore-build/solutions/core-hello-part3/modules/local/cowpy.nf(truncated)
nfcore-build/solutions/core-hello-part3/modules/local/cowpy/main.nf(truncated)
nfcore-build/solutions/core-hello-part3/modules/local/sayHello.nf(truncated)
nfcore-build/solutions/core-hello-part3/modules/nf-core/find/concatenate/main.nf(truncated)
nfcore-build/solutions/core-hello-part3/nextflow.config(truncated)
nfcore-build/solutions/core-hello-part3/subworkflows/local/utils_nfcore_hello_pipeline/main.nf(truncated)
nfcore-build/solutions/core-hello-part3/subworkflows/nf-core/utils_nextflow_pipeline/main.nf(truncated)
nfcore-build/solutions/core-hello-part3/subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config(truncated)
nfcore-build/solutions/core-hello-part3/subworkflows/nf-core/utils_nfcore_pipeline/main.nf(truncated)
nfcore-build/solutions/core-hello-part3/subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config(truncated)
nfcore-build/solutions/core-hello-part3/subworkflows/nf-core/utils_nfschema_plugin/main.nf(truncated)
nfcore-build/solutions/core-hello-part3/workflows/hello.nf(truncated)
nfcore-build/solutions/core-hello-part4/conf/base.config(truncated)
nfcore-build/solutions/core-hello-part4/conf/modules.config(truncated)
nfcore-build/solutions/core-hello-part4/conf/test.config(truncated)
nfcore-build/solutions/core-hello-part4/conf/test_full.config(truncated)
nfcore-build/solutions/core-hello-part4/main.nf(truncated)
nfcore-build/solutions/core-hello-part4/modules/local/collectGreetings.nf(truncated)
nfcore-build/solutions/core-hello-part4/modules/local/convertToUpper.nf(truncated)
nfcore-build/solutions/core-hello-part4/modules/local/cowpy.nf(truncated)
nfcore-build/solutions/core-hello-part4/modules/local/cowpy/main.nf(truncated)
nfcore-build/solutions/core-hello-part4/modules/local/sayHello.nf(truncated)
nfcore-build/solutions/core-hello-part4/modules/nf-core/find/concatenate/main.nf(truncated)
nfcore-build/solutions/core-hello-part4/nextflow.config(truncated)
nfcore-build/solutions/core-hello-part4/subworkflows/local/utils_nfcore_hello_pipeline/main.nf(truncated)
nfcore-build/solutions/core-hello-part4/subworkflows/nf-core/utils_nextflow_pipeline/main.nf(truncated)
nfcore-build/solutions/core-hello-part4/subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config(truncated)
nfcore-build/solutions/core-hello-part4/subworkflows/nf-core/utils_nfcore_pipeline/main.nf(truncated)
nfcore-build/solutions/core-hello-part4/subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config(truncated)
nfcore-build/solutions/core-hello-part4/subworkflows/nf-core/utils_nfschema_plugin/main.nf(truncated)
nfcore-build/solutions/core-hello-part4/workflows/hello.nf(truncated)
nfcore-build/solutions/core-hello-start/conf/base.config(truncated)
nfcore-build/solutions/core-hello-start/conf/modules.config(truncated)
nfcore-build/solutions/core-hello-start/conf/test.config(truncated)
nfcore-build/solutions/core-hello-start/conf/test_full.config(truncated)
nfcore-build/solutions/core-hello-start/main.nf(truncated)
nfcore-build/solutions/core-hello-start/nextflow.config(truncated)
nfcore-build/solutions/core-hello-start/subworkflows/local/utils_nfcore_hello_pipeline/main.nf(truncated)
nfcore-build/solutions/core-hello-start/subworkflows/nf-core/utils_nextflow_pipeline/main.nf(truncated)
nfcore-build/solutions/core-hello-start/subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config(truncated)
nfcore-build/solutions/core-hello-start/subworkflows/nf-core/utils_nfcore_pipeline/main.nf(truncated)
nfcore-build/solutions/core-hello-start/subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config(truncated)
nfcore-build/solutions/core-hello-start/subworkflows/nf-core/utils_nfschema_plugin/main.nf(truncated)
nfcore-build/solutions/core-hello-start/workflows/hello.nf(truncated)

vdauwera and others added 19 commits May 8, 2026 17:48
Adds the complete nextflow-triathlon/ working directory with scripts
(1-hello.nf, 2-inputs.nf, main.nf), modules, data files, nextflow.config,
and a solutions/ subdirectory with symlinks for self-contained testing.

Rewrites 01_run_basics.md into four sections: Hello World, Process multiple
inputs, Run a multi-step pipeline, and Configure the pipeline. The config
section introduces nextflow.config structure and profiles, setting learners
up for the nf-core pipeline demo in Part 2.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Part 1 exercises now live under nextflow-triathlon/basics/, and Parts 2/3
nf-core runs use nextflow-triathlon/nf-core/. This prevents the triathlon
nextflow.config from overriding params.input when running nf-core pipelines
from the same directory.

Also adds laptop.config (withLabel overrides capping memory to 6 GB) for
local development, and updates rnaseq docs to reflect the current pipeline
version (3.26.0, revision e7ca46272c).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Rewrite sections 4.2 and 4.3 to:
- Show the memory failure when running rnaseq without config overrides
- Explain nf-core process labels and the withLabel: fix via laptop.config
- Transition to Seqera Platform as the path to real-scale analysis
- Add link to Seqera academic program

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Comment out withName: 'cowpy' block in nextflow.config to prevent
  selector warning when running scripts without the cowpy process
- Add -with-report section and executor note to 01_run_basics.md
- Fix inline code formatting in headings (work/, -resume)
- Update nf-core/demo pull revision hash and directory listing in 02_run_nfcore.md
- Remove solutions/ directory from basics/ (not needed for this tutorial)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…nd CLI-first workflow

- Add section 1: sign up, Community Showcase, compute options (own infra vs Seqera Compute)
- Simplify section 2 launch form with test profile pre-filled; fold form details into info admonition
- Add tw CLI install instructions; fix tw launch to use workspace pipeline name
- Restructure section 4 as CLI-first: tw pipelines add, verify in Launchpad, then launch

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add .seqera_config stub with comments pointing to where values are found in Seqera UI
- Rewrite section 3.3 to use config file for token and workspace ID
- Add tw --version expected output and recap sentence
- Add tip about TOWER_COMPUTE_ENV and link to tw CLI reference docs
- Add recap sentences after tw runs list and tw pipelines add outputs
- Fix .seqera_config path consistency throughout

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Update all path references in orientation, Part 1, Part 2, and Part 3 docs.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Update references in mkdocs.yml, index.md, and 00_orientation.md.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Update references in mkdocs.yml and index.md.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Part 1: add output block code snippet and recap sentence; fold nextflow.config into collapsed admonition
- Part 2: replace sections 3.1.3-3.1.4 with brief validation note; fold laptop.config into collapsed admonition
- Part 3: address tw --version output, compute env tip, and workspace recap TODOs
- index.md: comment out unfinished video section

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The index_page template requires a <!-- additional_information --> marker
to split summary content from course overview. Its absence caused the
Netlify build to error out.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Part 1: add -ansi-log false run to show per-call output; fix output
  block in 1.4.4 to show 1-hello.nf; update main.nf publish paths from
  'main' to 'full_pipeline'; fix nextflow.config admonition type
- Part 2: rewrite 4.2 memory error explanation with base.config context;
  improve 3.2.1/3.2.2 with touch/run instructions, command output
  admonitions, and -resume flag; add .command.sh admonition for ext.args;
  replace ls with tree for conf/ listing; fix laptop.config admonition
  type; convert TODO to tip admonition for academic program

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… triathlon Parts 1-3

Part 1 (01_run_nextflow.md):
- Fix output filename (Hello World!-output.txt, not Hello-output.txt)
- Update all console output hashes and revision IDs to match actual runs
- Fix section 1.4.4 output block (was showing main.nf instead of 1-hello.nf)
- Fix duplicate section 2.1 numbering (renumber to 2.1-2.4)
- Fix resume command typo (csv-resume → csv -resume) and remove stray -ansi-log false
- Add hl_lines to process output blocks, channel construction, container directive, and chaining

Part 2 (02_run_nfcore.md):
- Fix nf-core/demo asset tree path (pipelines/ → /workspaces/.nextflow/assets/)

Part 3 (03_run_seqera.md):
- Add explanation in 4.2 that input/outdir appear red (required, no defaults)
- Rewrite 4.3 as web interface launch with manual parameter entry
- Add new 4.4: CLI launch using -p test + --params-file for outdir
- Explain why tw launch requires --params-file instead of individual flags
- Update intro and summary to reflect two-path launch approach

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Replace "Course structure" with "Get ready to work" section matching other courses
- Set working directory to triathlon/ + code . to focus VSCode
- Add tree output showing full triathlon/ structure including .seqera_config
- Simplify Part 1 tip to relative cd basics
- Update Part 2 tip to include relative cd ../nf-core option

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Update tip in section 4.4 to demonstrate passing --params-file and
--profile to tw pipelines add, so defaults are saved with the pipeline
registration rather than specified at launch time.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
vdauwera and others added 4 commits July 18, 2026 16:21
…g Collection

Replaces the Nextflow Run course with Triathlon Part 1, extracts a new
standalone nf-core Run course from Hello nf-core's demo-pipeline lesson
(extended with a pull-and-run nf-core/rnaseq section from Triathlon
Part 2), adds a new Seqera Platform side quest from Triathlon Part 3,
and ties the three together in a new "Nextflow Triathlon" Training
Collection. The old Nextflow Run course is retired to a browsable but
unlisted archive path; the standalone Triathlon course and its exercise
code are removed now that their content has been redistributed.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Add non-clickable sidebar group labels (Users/Developers) via a custom
  nav.html override, driven by extra.nav_group_labels in mkdocs.yml
- Move Help under Home; add new Run with Seqera course (moved out of
  Side Quests) under the Users group
- Rename nf-core Run -> Run nf-core, Run on Seqera -> Run with Seqera,
  and Hello nf-core -> Build with nf-core for clarity
- Flatten Training Collections into a Learning Paths label, then retire
  it entirely: fold Architect's Toolkit into a "Suggested path" section
  on the Side Quests index, drop Nextflow Triathlon (now redundant with
  the Users course ordering), and add redirects for the old URLs
- Sync the corresponding renames/labels across all translated mkdocs.yml
  and content files where the old names were embedded as literal terms
- Introduce a generic nav_title_overrides mechanism in mkdocs_hooks.py so
  a section's sidebar title can differ from its index page's own title
- Move Training Environment out of Help into its own top-level item, then
  group it with the version/help reference pages under a new "Setup & Help"
  label at the bottom of the nav
- Rename each course section's first sub-item to "Overview" (Nextflow Run,
  Run nf-core, Run with Seqera, Hello Nextflow, Build with nf-core,
  Nextflow for Science, Side Quests) to avoid repeating the section name,
  without changing the underlying page's own title
- Restructure the Side Quests catalog into a single HTML table with
  colspan category-separator rows, with matching CSS for the header/
  category row styling
- Sync all of the above to translated mkdocs.yml files, using each
  language's own already-translated titles where they exist
- Extend nav_title_overrides usage to Nextflow for Science and Side Quests
  so their first sub-item reads "Overview" too, and add a matching
  nav_child_title_overrides mechanism so that label can be translated
  per language (it was previously always English, set once in the shared
  nav list)
- Reorder the Side Quests nav to match the catalog table's categories,
  and add a nav-item.html override so non-clickable category separators
  can be injected into a nested nav list, not just the top-level one
  (new nav_section_separators config, reusing the existing group-label
  styling)
- Sync all of the above to translated mkdocs.yml files
vdauwera and others added 3 commits September 11, 2026 17:15
New cards for Training Environment, Nextflow versions, The Hello
pipeline, and Getting help, mirroring the corresponding sidebar nav
group. Adds a .mb-4 helper class for spacing below the section.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- Compact the two homepage accordions (version compatibility,
  environment options) covered by the Setup & Help section, replacing
  them with a new "Training Events" page and matching homepage card,
  symmetric with "Self-service courses". Differentiate the two button
  styles (filled vs outlined) and point the courses button down since
  it jumps to an anchor lower on the same page.
- New page covers official training events (as cards), information for
  trainers, and the open-source license/contribution policy, with a
  visual separator in the sidebar nav to set it apart from the Setup &
  Help utility pages it's nested under.
- Add the new page to .prettierignore, alongside index.md/help.md/etc,
  since prettier's default list formatting breaks MkDocs Material's
  grid cards.
- Drop the now-stale "keep in sync" comment on the local installation
  page's version compatibility notice.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@vdauwera

Copy link
Copy Markdown
Collaborator Author

Summary of changes since last sync with master

Users track homepage

  • Listed the three science courses (Genomics, RNAseq, Bioimaging) individually on the homepage instead of a
    single catalog link, then dropped the repetitive "Nextflow for" prefix and specified "bulk" RNAseq to match the
    course's own wording.
  • Renamed "Nextflow Dot Config" → "Nextflow Config" (clearer, less jargon-y) and "Configure execution" → "Manage
    execution" (room to add performance/HPC/cloud topics later), with a placeholder note teasing that expansion and
    an interest-poll mention.

Homepage structure

  • Removed the year-old "Looking for archived training materials?" callout; moved the still-relevant Nextflow Run
    archive pointer to a note on that course's own page.
  • Dropped the redundant in-page Seqera logo (footer already shows one) from four pages.
  • Added a new "Setup & Help" section to the homepage with cards for Training Environment, Nextflow versions, The
    Hello pipeline, and Getting help, mirroring the sidebar nav group.
  • Replaced the "Additional information" accordion (version compatibility, environment options, training events,
    trainer info, license) with a new Training Events page — covering official training events (as cards for
    Training Weeks, Seqera Events, Nextflow Ambassadors, nf-core), trainer info, and the license/contribution policy
    — linked from a homepage card symmetric with "Self-service courses," plus a bold visual separator in the sidebar
    nav.

Incidental fixes

  • Added training_events.md to .prettierignore (prettier's default list formatting breaks MkDocs Material's
    grid cards — same known issue as index.md/help.md).
  • Removed a stale "keep in sync" comment on the local install page's version-compatibility notice.

vdauwera and others added 3 commits September 11, 2026 21:37
The Build with nf-core course now uses the v2 parser like every other
course; the exception no longer applies.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- Use nf-core now explicitly requires Nextflow Run (previously implicit),
  with the audience description updated to match.
- Scale with Seqera now requires both Nextflow Run and Use nf-core,
  rather than only Use nf-core.
- Build with nf-core now requires both Hello Nextflow and Use nf-core,
  rather than only recommending the latter.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- hello-nf-core/solutions/core-hello-part1: correct validate_params to
  false, matching what the lesson (section 5.4) instructs and what
  parts 2-4 already have; the stale `true` broke running this solution
  checkpoint with the documented test profile.
- nfcore_run/00_orientation.md: drop the stale instruction to disable
  the v2 syntax parser (contradicted the rest of the site and isn't
  needed; nf-core/demo and nf-core/rnaseq both run fine under v2).
  Align nf-core tools version with Build with nf-core (4.0.2, was
  stale at 3.5.2). Add a note that nf-core/demo enforces its own
  stricter Nextflow >=25.10.4 requirement above the general 25.10.2
  training floor.
- Fix 4-space admonition indentation in 6 nf4_science lesson pages
  (were indented 5 spaces, causing a stray leading space in rendered
  tip/note text).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@vdauwera
vdauwera marked this pull request as ready for review September 12, 2026 14:31
vdauwera and others added 7 commits September 12, 2026 11:56
Remove docs/en/docs/archive/nextflow_run/ entirely and repoint the
remaining live references (course index note, mkdocs.yml redirects) to
the last released version at https://training.nextflow.io/3.6.1/nextflow_run/,
avoiding a confusing in-repo archive folder.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…ions

Nextflow Run's Part 2 now generates an execution report and resolves a
profile itself, so Nextflow Config can build on that instead of
reintroducing the same commands from scratch. Add real before/after
resource numbers for the cowpy withName example instead of the vague
"you won't see a real difference" placeholder.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Restructure "Configure the pipeline" into: examining nextflow.config
section by section (with real code for each element), supplying
configuration via supplemental files (-c and -params-file), and
generating an execution report.

- Number software packaging/process settings/pipeline parameters/profiles
  as proper subsections, each showing the actual code it refers to
- Add cpus to the process block, and note that per-process overrides are
  covered in Nextflow Config
- Rework the run-specific config example (custom.config) to override
  process resources and switch Docker for Conda, matching nf-core's
  institutional-config pattern, instead of overriding params
- Add a conda directive to nextflow-run's own cowpy module so that
  Conda run actually works end-to-end
- Add test-params.yaml/json for the parameter file exercise
- Embed a real screenshot of the execution report's Tasks tab

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- 2.1: show that the condensed output hides three separate task
  executions running in parallel, each in its own isolated work/
  directory, and explain why that isolation makes concurrent execution
  safe
- Add a note before each "Optional: Code walkthrough" section that
  understanding the code isn't required to run pipelines
- 3: add intro prose connecting this section to the single-process and
  parallel-input exercises that came before it
- 3.1: unpack the results directory structure (author-defined via the
  output block), the fan-out-then-fan-in shape of the pipeline, the
  dataflow execution model, and how task isolation generalizes across
  multiple processes (with a real collectGreetings example showing
  staged symlinks to upstream task directories)
- Fix heading levels in the 1.4 and 3.2 code walkthroughs: their
  subsections were siblings of the section heading instead of nested
  under it

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Recycle the "manage workflow executions" content from the old Nextflow
Run course and Hello Nextflow, adapted to this course's four-process
pipeline: inspecting the .nextflow/history file and nextflow log, and
cleaning up old work directories with nextflow clean.

Place it before "Run pipelines from remote repositories" (now Part 4),
since it builds directly on Part 1's -resume section rather than on
anything about remote pipelines. Update all cross-references, the nav,
the lesson plan table, and the course summary accordingly.

Also expand the remote-repositories part with where pulled pipelines
are cached (nextflow info, nextflow list) and how to unpin a pipeline
after pinning it to a specific revision, both verified against real
nextflow-io/hello runs.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The previous commit only captured the bare file rename and the new
manage-executions file; a bad pathspec in an earlier `git add` silently
dropped the rest of that change from staging. This commit adds what
was missing:

- 04_remote_repositories.md: title bumped to Part 4, "What's next?"
  links swapped with Part 3, plus the caching (nextflow info/list) and
  unpin-a-pipeline (nextflow clean stuck-revision case) sections
- 02_configure_pipeline.md, index.md, next_steps.md, mkdocs.yml:
  cross-references, nav order, lesson table, and course summary updated
  to match Part 3 (manage executions) / Part 4 (remote repositories)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The "Your journey" and "What you learned" sections overstated the
course's code-level content (channels, module structure) that's now
only covered in optional code walkthroughs, and duplicated the same
ground twice. Consolidate into "Your journey" (narrative) directly
followed by "Skills acquired" (concrete takeaways), drop the pipeline
structure description, vary the repetitive "then, then, then"
transitions, and trim "Next steps" down to three suggestions plus a
closing pointer to Hello Nextflow for learners ready to write pipelines
rather than just run them.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@vdauwera

Copy link
Copy Markdown
Collaborator Author

Nextflow Run: course rework

  • Removed the archived old course version; now points to the 3.6.1 release instead.
  • Part 1: added explanation of parallel execution, task isolation, and pipeline structure (results layout,
    fan-out/fan-in, dataflow).
  • Part 2: restructured into clearer sections; reworked the config example to use nf-core-style resource/Conda
    overrides; added a report screenshot.
  • New Part 3 (Manage workflow executions): nextflow log and nextflow clean, recycled from the old course.
  • Part 4 (Remote repositories): added pipeline caching and unpin/pin coverage; swapped order with Part 3.
  • Rewrote the course summary to match what's actually taught (dropped code-level claims not covered in core
    content).
  • Minor cross-reference additions in Nextflow Config.

All exercises re-tested end-to-end against a real Nextflow install.

vdauwera and others added 3 commits September 13, 2026 02:30
Nextflow Config's Part 1 (parameters and outputs) covered material that
is now redundant with Nextflow Run, and its process-name-based output
organization pattern isn't recommended practice. Its output-management
content moves to a new "Manage pipeline outputs" section in Nextflow
Run Part 2, config-only (outputDir, workflow.output.mode), leaving
Nextflow Config as a tight two-part course on compute environments and
profiles.

Nextflow Run also gains a "Generate pipeline reports" section (execution
report and timeline) under Part 3, and Part 4's title is shortened to
"Run remote pipelines".

main.nf's output block now interpolates params.batch instead of a
hardcoded prefix, so config-only exercises can change output location
without touching pipeline code.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Add a walkthrough (Part 1, section 2.3) that inspects a real .command.run
file to show that Nextflow always wraps a task in a generated submission
script, even locally, and that changing the executor only changes how
that same script gets launched and tracked (direct execution vs. a
scheduler's submission command).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The course is renamed to Execution Config to make clear it's about
adapting execution environments, not generic pipeline configuration.

Part 1 gets a scenario-driven lead-in explaining why the same pipeline
code needs to adapt to different environments, since it previously
jumped straight into exercises with no framing.

Part 1 is split once it covers packaging and execution platform
selection: resource allocation moves into a new Part 2, which also
gains a new section on automatically retrying failed tasks with
errorStrategy, maxRetries, and task.attempt-scaled resource allocations,
tested for real against a genuine out-of-memory failure. Profiles
becomes Part 3.

Also fixed Part 1's Conda exercise, which contradicted its own "adapt
without touching code" premise by having learners add a conda directive
to modules/cowpy.nf. It's now set entirely via nextflow.config using
process.withName, consistent with how container is already set in code.
Traced that change through Part 2 and Part 3's examples, which also
reference cowpy's process config.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@vdauwera

Copy link
Copy Markdown
Collaborator Author

Rename Nextflow Config to Execution Config, split Part 1, add retries

Renamed the course to Execution Config to make clear it's about adapting execution environments, not generic
pipeline configuration.

Added a scenario-driven lead-in to Part 1, which previously jumped straight into exercises with no framing.

Split Part 1 once it covered packaging and execution platform selection:

  • Part 1: Adapt to your compute environment — packaging (Docker/Conda) + execution platform selection
  • Part 2: Manage compute resources and failures (new) — resource profiling/limits, plus a new section on
    automatically retrying failed tasks (errorStrategy, maxRetries, task.attempt-scaled memory), tested against a
    real out-of-memory failure
  • Part 3: Use profiles to switch configurations — renumbered, unchanged

Also fixed Part 1's Conda exercise, which had learners edit modules/cowpy.nf directly, contradicting the course's
"adapt without touching code" premise. The conda directive is now set entirely via nextflow.config, with Part 2
and Part 3's examples updated to match.

vdauwera and others added 4 commits September 13, 2026 03:38
The After tab highlighted the unchanged conda line while missing cpus,
caught by re-validating the course after the restructuring commit.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Execution Config Part 3: fold "2. Combine profiles" into section 1 as
1.3, since it was a single-subsection section with nothing else under
it. Consolidated the two Takeaways into one.

Rename docs/en/docs/nextflow_config/ -> execution_config/ and its
project directory nextflow-config/ -> execution-config/, matching the
course's already-renamed title. Updated mkdocs.yml (nav, title map,
enumerate-headings paths) and added redirects for all old URLs.

Rename docs/en/docs/hello_nf-core/ -> nfcore_build/ and its project
directory hello-nf-core/ -> nfcore-build/ (title stays "Build with
nf-core", only paths change). This course is translated into 10
languages and was previously released, so also: fixed the 4 pre-existing
redirect chains left dangling by the rename, added redirects for all 8
current pages, updated cross-references from 15 other English course
files, fixed internal self-references (working directory paths in
captured console output, image include paths), and updated tooling that
references this directory by name (CLAUDE.md, the repo-conventions
skill doc, and the translation script's PRIORITY_DIRS). Left the 10
translated copies as-is, to be picked up by the next translation
regeneration pass.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
my_params.yml, malformed_samplesheet.csv, and custom.config lived in
nfcore-build/ (Build with nf-core), described in its own orientation
page as "used in Part 1," but were never actually referenced in that
course's lesson content. They belong to nfcore-run/ (Use nf-core),
which genuinely uses them in Part 2 and was missing them entirely -
caught by a validation pass ahead of merge. Moved them there and
removed the stale description from nfcore-build's orientation page.

Verified all three fixtures work exactly as nfcore_run/02_configure_execution.md
documents: -params-file, the malformed-samplesheet validation error,
and the custom.config resource/ext.args overrides.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Renamed docs/en/docs/nfcore_run/ -> nfcore_use/ and seqera_run/ ->
seqera_scale/ (project dirs nfcore-run/ -> nfcore-use/, seqera-run/ ->
seqera-scale/) so the slugs read as "use nf-core" and "scale with
Seqera" instead of leftover names from before those courses were
retitled. Titles unchanged. Updated mkdocs.yml (nav, title map, heading
config, redirects for all 13 old page URLs, including fixing the
existing hello_nf-core -> nfcore_run redirect target so it doesn't
dangle), cross-references from 8 other files, and self-references
inside both courses (working directory paths, image includes).

Added real Typeform survey IDs for Execution Config, Nextflow Run,
Use nf-core, Build with nf-core, and Scale with Seqera (all confirmed
distinct and loading correctly), and wired up the homepage's "vote on
what to cover next" interest poll link.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@vdauwera

Copy link
Copy Markdown
Collaborator Author

Final summary of the completed work

Introduces the Users learning track: three hands-on courses for running Nextflow pipelines without necessarily
writing code, plus a supporting execution-configuration course.

  • Nextflow Run: launch, configure, and manage pipeline executions locally and from remote repositories.
  • Use nf-core: find, run, and configure community-curated nf-core pipelines, from a minimal demo to a
    production-scale run.
  • Scale with Seqera: launch and monitor pipelines via Seqera Platform, from both the web UI and CLI.
  • Execution Config: adapt pipeline execution to different compute environments — software packaging, executors,
    resource allocation, retries, and profiles.

Homepage and navigation reorganized into Users/Developers tracks, with a new Setup & Help section and Training
Events page.

Course directories renamed for consistency with their current titles (all with redirects for old URLs):
nextflow_config → execution_config, hello_nf-core → nfcore_build, nfcore_run → nfcore_use, seqera_run → seqera_scale.

All courses tested end to end with real pipeline runs, not just doc review. Heading numbering, nextflow lint, and
link/redirect/anchor checks pass clean across the full repo.

@vdauwera

Copy link
Copy Markdown
Collaborator Author

@mribeirodantas if I could please get your final 👍 :)

@mribeirodantas
mribeirodantas merged commit 2571b5c into master Sep 13, 2026
9 checks passed
@mribeirodantas
mribeirodantas deleted the gvda_triathlon branch September 13, 2026 17:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants