Skip to content

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

Draft
vdauwera wants to merge 28 commits into
masterfrom
gvda_triathlon
Draft

New course: Nextflow Triathlon: plain Nextflow + nf-core + Seqera platform#951
vdauwera wants to merge 28 commits into
masterfrom
gvda_triathlon

Conversation

@vdauwera

@vdauwera vdauwera commented May 8, 2026

Copy link
Copy Markdown
Collaborator

Creates a new training course (docs/en/docs/nextflow_triathlon/) designed as a fast-track introduction to the Nextflow ecosystem. The course covers three topics in sequence:

  • Part 1 (~45 min): Condensed version of Nextflow Run parts 1 & 2 — running pipelines, the work/ directory, -resume, channels, multi-step workflows, and containers.
  • Part 2 (~45 min): Adapted from Hello nf-core part 1 — finding and running nf-core pipelines, parameter and input validation, custom configuration, plus a new section running nf-core/rnaseq with the test profile as a bridge to Part 3.
  • Part 3 (~45 min): New content for Seqera Platform — launching nf-core/rnaseq from the Seqera Pipelines catalog at production scale (based on the Seqera Platform getting-started tutorial), then adding nf-core/demo from GitHub to demonstrate the bring-your-own-pipeline workflow.

Also includes orientation, next steps, and survey pages, mkdocs.yml nav and plugin config updates, and a note in the orientation to upgrade the Codespaces machine to 8 cores for parallel execution demos.

@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 de852b9
🔍 Latest deploy log https://app.netlify.com/projects/nextflow-training/deploys/6a76929e87165900085406dc
😎 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!

⚠️ 34 files had 47 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 47 issues
Type Location Message
Warning hello-nf-core/solutions/composable-hello/hello.nf:36:5 Emit name should be omitted when there is only one emit
Warning hello-nf-core/solutions/core-hello-part1/subworkflows/local/utils_nfcore_hello_pipeline/main.nf:30:5 Parameter was not used -- prefix with _ to suppress warning
Warning hello-nf-core/solutions/core-hello-part1/subworkflows/local/utils_nfcore_hello_pipeline/main.nf:33:5 Parameter was not used -- prefix with _ to suppress warning
Warning hello-nf-core/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 hello-nf-core/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 hello-nf-core/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 hello-nf-core/solutions/core-hello-part1/workflows/hello.nf:68:17 Variable was declared but not used
Warning hello-nf-core/solutions/core-hello-part2/subworkflows/local/utils_nfcore_hello_pipeline/main.nf:30:5 Parameter was not used -- prefix with _ to suppress warning
Warning hello-nf-core/solutions/core-hello-part2/subworkflows/local/utils_nfcore_hello_pipeline/main.nf:33:5 Parameter was not used -- prefix with _ to suppress warning
Warning hello-nf-core/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 hello-nf-core/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 hello-nf-core/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 hello-nf-core/solutions/core-hello-part2/workflows/hello.nf:45:55 Parameter was not used -- prefix with _ to suppress warning
Warning hello-nf-core/solutions/core-hello-part2/workflows/hello.nf:77:17 Variable was declared but not used
Warning hello-nf-core/solutions/core-hello-part3/modules/local/cowpy/main.nf:30:9 Variable was declared but not used
Warning hello-nf-core/solutions/core-hello-part3/subworkflows/local/utils_nfcore_hello_pipeline/main.nf:30:5 Parameter was not used -- prefix with _ to suppress warning
Warning hello-nf-core/solutions/core-hello-part3/subworkflows/local/utils_nfcore_hello_pipeline/main.nf:33:5 Parameter was not used -- prefix with _ to suppress warning
Warning hello-nf-core/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 hello-nf-core/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 hello-nf-core/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 hello-nf-core/solutions/core-hello-part3/workflows/hello.nf:74:17 Variable was declared but not used
Warning hello-nf-core/solutions/core-hello-part4/modules/local/cowpy/main.nf:30:9 Variable was declared but not used
Warning hello-nf-core/solutions/core-hello-part4/subworkflows/local/utils_nfcore_hello_pipeline/main.nf:30:5 Parameter was not used -- prefix with _ to suppress warning
Warning hello-nf-core/solutions/core-hello-part4/subworkflows/local/utils_nfcore_hello_pipeline/main.nf:33:5 Parameter was not used -- prefix with _ to suppress warning
Warning hello-nf-core/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 hello-nf-core/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 hello-nf-core/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 hello-nf-core/solutions/core-hello-part4/workflows/hello.nf:74:17 Variable was declared but not used
Warning hello-nf-core/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 hello-nf-core/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 hello-nf-core/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 hello-nf-core/solutions/core-hello-start/workflows/hello.nf:18:5 Parameter was not used -- prefix with _ to suppress warning
Warning hello-nf-core/solutions/core-hello-start/workflows/hello.nf:45:9 Variable was declared but not used
Warning hello-nf-core/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/metadata/2.4/main.nf:42:22 Parameter was not used -- prefix with _ to suppress warning
Warning side-quests/solutions/metadata/3.2/main.nf:42:22 Parameter was not used -- prefix with _ to suppress warning
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)
hello-nf-core/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:
hello-nf-core/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)
hello-nf-core/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()
hello-nf-core/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}'
     """
 }
hello-nf-core/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}
     """
 }
hello-nf-core/solutions/composable-hello/modules/sayHello.nf
View
@@ -13,6 +13,6 @@ process sayHello {
 
     script:
     """
-    echo '$greeting' > '$greeting-output.txt'
+    echo '${greeting}' > '${greeting}-output.txt'
     """
 }
hello-nf-core/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)
hello-nf-core/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 }]
 }
hello-nf-core/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)
hello-nf-core/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
hello-nf-core/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)
hello-nf-core/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()
hello-nf-core/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}'
     """
 }
hello-nf-core/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)
hello-nf-core/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'
     """
 }
hello-nf-core/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)
hello-nf-core/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)
hello-nf-core/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)
hello-nf-core/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)
hello-nf-core/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)
hello-nf-core/solutions/core-hello-part1/subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config(truncated)
hello-nf-core/solutions/core-hello-part1/subworkflows/nf-core/utils_nfschema_plugin/main.nf(truncated)
hello-nf-core/solutions/core-hello-part1/workflows/hello.nf(truncated)
hello-nf-core/solutions/core-hello-part2/conf/base.config(truncated)
hello-nf-core/solutions/core-hello-part2/conf/modules.config(truncated)
hello-nf-core/solutions/core-hello-part2/conf/test.config(truncated)
hello-nf-core/solutions/core-hello-part2/conf/test_full.config(truncated)
hello-nf-core/solutions/core-hello-part2/main.nf(truncated)
hello-nf-core/solutions/core-hello-part2/modules/local/collectGreetings.nf(truncated)
hello-nf-core/solutions/core-hello-part2/modules/local/convertToUpper.nf(truncated)
hello-nf-core/solutions/core-hello-part2/modules/local/cowpy.nf(truncated)
hello-nf-core/solutions/core-hello-part2/modules/local/sayHello.nf(truncated)
hello-nf-core/solutions/core-hello-part2/modules/nf-core/find/concatenate/main.nf(truncated)
hello-nf-core/solutions/core-hello-part2/nextflow.config(truncated)
hello-nf-core/solutions/core-hello-part2/subworkflows/local/utils_nfcore_hello_pipeline/main.nf(truncated)
hello-nf-core/solutions/core-hello-part2/subworkflows/nf-core/utils_nextflow_pipeline/main.nf(truncated)
hello-nf-core/solutions/core-hello-part2/subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config(truncated)
hello-nf-core/solutions/core-hello-part2/subworkflows/nf-core/utils_nfcore_pipeline/main.nf(truncated)
hello-nf-core/solutions/core-hello-part2/subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config(truncated)
hello-nf-core/solutions/core-hello-part2/subworkflows/nf-core/utils_nfschema_plugin/main.nf(truncated)
hello-nf-core/solutions/core-hello-part2/workflows/hello.nf(truncated)
hello-nf-core/solutions/core-hello-part3/conf/base.config(truncated)
hello-nf-core/solutions/core-hello-part3/conf/modules.config(truncated)
hello-nf-core/solutions/core-hello-part3/conf/test.config(truncated)
hello-nf-core/solutions/core-hello-part3/conf/test_full.config(truncated)
hello-nf-core/solutions/core-hello-part3/main.nf(truncated)
hello-nf-core/solutions/core-hello-part3/modules/local/collectGreetings.nf(truncated)
hello-nf-core/solutions/core-hello-part3/modules/local/convertToUpper.nf(truncated)
hello-nf-core/solutions/core-hello-part3/modules/local/cowpy.nf(truncated)
hello-nf-core/solutions/core-hello-part3/modules/local/cowpy/main.nf(truncated)
hello-nf-core/solutions/core-hello-part3/modules/local/sayHello.nf(truncated)
hello-nf-core/solutions/core-hello-part3/modules/nf-core/find/concatenate/main.nf(truncated)
hello-nf-core/solutions/core-hello-part3/nextflow.config(truncated)
hello-nf-core/solutions/core-hello-part3/subworkflows/local/utils_nfcore_hello_pipeline/main.nf(truncated)
hello-nf-core/solutions/core-hello-part3/subworkflows/nf-core/utils_nextflow_pipeline/main.nf(truncated)
hello-nf-core/solutions/core-hello-part3/subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config(truncated)
hello-nf-core/solutions/core-hello-part3/subworkflows/nf-core/utils_nfcore_pipeline/main.nf(truncated)
hello-nf-core/solutions/core-hello-part3/subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config(truncated)
hello-nf-core/solutions/core-hello-part3/subworkflows/nf-core/utils_nfschema_plugin/main.nf(truncated)
hello-nf-core/solutions/core-hello-part3/workflows/hello.nf(truncated)
hello-nf-core/solutions/core-hello-part4/conf/base.config(truncated)
hello-nf-core/solutions/core-hello-part4/conf/modules.config(truncated)
hello-nf-core/solutions/core-hello-part4/conf/test.config(truncated)
hello-nf-core/solutions/core-hello-part4/conf/test_full.config(truncated)
hello-nf-core/solutions/core-hello-part4/main.nf(truncated)
hello-nf-core/solutions/core-hello-part4/modules/local/collectGreetings.nf(truncated)
hello-nf-core/solutions/core-hello-part4/modules/local/convertToUpper.nf(truncated)
hello-nf-core/solutions/core-hello-part4/modules/local/cowpy.nf(truncated)
hello-nf-core/solutions/core-hello-part4/modules/local/cowpy/main.nf(truncated)
hello-nf-core/solutions/core-hello-part4/modules/local/sayHello.nf(truncated)
hello-nf-core/solutions/core-hello-part4/modules/nf-core/find/concatenate/main.nf(truncated)
hello-nf-core/solutions/core-hello-part4/nextflow.config(truncated)
hello-nf-core/solutions/core-hello-part4/subworkflows/local/utils_nfcore_hello_pipeline/main.nf(truncated)
hello-nf-core/solutions/core-hello-part4/subworkflows/nf-core/utils_nextflow_pipeline/main.nf(truncated)
hello-nf-core/solutions/core-hello-part4/subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config(truncated)
hello-nf-core/solutions/core-hello-part4/subworkflows/nf-core/utils_nfcore_pipeline/main.nf(truncated)
hello-nf-core/solutions/core-hello-part4/subworkflows/nf-core/utils_nfcore_pipeline/tests/nextflow.config(truncated)
hello-nf-core/solutions/core-hello-part4/subworkflows/nf-core/utils_nfschema_plugin/main.nf(truncated)
hello-nf-core/solutions/core-hello-part4/workflows/hello.nf(truncated)
hello-nf-core/solutions/core-hello-start/conf/base.config(truncated)
hello-nf-core/solutions/core-hello-start/conf/modules.config(truncated)
hello-nf-core/solutions/core-hello-start/conf/test.config(truncated)
hello-nf-core/solutions/core-hello-start/conf/test_full.config(truncated)
hello-nf-core/solutions/core-hello-start/main.nf(truncated)
hello-nf-core/solutions/core-hello-start/nextflow.config(truncated)
hello-nf-core/solutions/core-hello-start/subworkflows/local/utils_nfcore_hello_pipeline/main.nf(truncated)
hello-nf-core/solutions/core-hello-start/subworkflows/nf-core/utils_nextflow_pipeline/main.nf(truncated)
hello-nf-core/solutions/core-hello-start/subworkflows/nf-core/utils_nextflow_pipeline/tests/nextflow.config(truncated)
hello-nf-core/solutions/core-hello-start/subworkflows/nf-core/utils_nfcore_pipeline/main.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
The redirects plugin (enabled earlier for the retired Training Collections
URLs) was only present because the local Docker preview image happens to
bundle it via its squidfunk/mkdocs-material base image. Neither the
Netlify preview build (_scripts/docs.py, via its uv inline deps) nor the
production docs.yml workflow installed it, so both failed with
"Config value 'plugins': The redirects plugin is not installed" the
moment mkdocs.yml enabled it. Reproduced the Netlify build locally via
uv run docs.py build-all and confirmed all 11 languages now build clean.
Covers content this branch moves that is currently live on master:
the old Nextflow Run course (now archived), the Hello nf-core lessons
renumbered down by one, and the demo lesson extracted into the new
nf-core Run course. Verified each target resolves with no plugin
warnings and spot-checked one end-to-end in the preview.
Resolves the 8 real conflicts from ~3 months of independent master work
overlapping with this branch's restructuring:

- docs/en/docs/hello_nf-core/01_rewrite_hello.md,
  docs/en/docs/hello_nf-core/03_make_module.md,
  docs/en/docs/nfcore_run/01_run_demo.md: these are rename conflicts from
  the Hello nf-core lesson renumbering and the demo lesson's extraction
  into the new Run nf-core course. Kept this branch's part numbering and
  file structure, but adopted master's `channel.topic` (lowercase)
  correction, which matches the capitalization used everywhere else in
  that file.
- hello-nf-core/solutions/core-hello-part1/subworkflows/nf-core/
  utils_nfcore_pipeline/tests/main.nf.test(.snap): rename-detection
  misses; content is byte-identical to what's already at the renamed
  location, so resolved as-is.
- hello-nf-core/solutions/core-hello-part{2,4}/modules.json and
  core-hello-part1/modules.json (resurrected from part5 via a
  modify/delete conflict): master bumped the utils_nfcore_pipeline and
  utils_nfschema_plugin subworkflow pins; adopted those newer git_sha
  values and normalized formatting to the 4-space style used by sibling
  modules.json files elsewhere in the repo. Removed the resurrected
  core-hello-part5/modules.json since that directory was intentionally
  renamed to core-hello-part1 on this branch.

Verified with `uv run docs.py build-all` (the same command Netlify/CI
use) that all 11 languages still build cleanly after the merge.
When resolving the merge conflict in this file, I kept our branch's
projectDir/launchDir/workDir values (correct: launchDir/workDir should
say nfcore-run, not hello-nf-core, since this course was extracted into
its own directory). But projectDir doesn't depend on which course
directory the student is in - it reflects Nextflow's pipeline cache
layout, which master had already updated to the current
.repos/<repo>/clones/<sha> format everywhere else in this same file
(including the configFiles line two lines below, which auto-merged
without conflict). Picking "ours" for projectDir left it mismatched
against that auto-merged configFiles line, a mismatch that didn't exist
on either side before the merge. Updated projectDir to match.
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.

1 participant