diff --git a/.github/workflows/add-new-issues-to-project.yml b/.github/workflows/add-new-issues-to-project.yml
index aa8252552..5296e7a1f 100644
--- a/.github/workflows/add-new-issues-to-project.yml
+++ b/.github/workflows/add-new-issues-to-project.yml
@@ -10,7 +10,7 @@ jobs:
name: Add issue to project
runs-on: ubuntu-latest
steps:
- - uses: actions/add-to-project@v1.0.1
+ - uses: actions/add-to-project@v2
with:
project-url: https://github.com/orgs/GNS3/projects/3
github-token: ${{ secrets.ADD_NEW_ISSUES_TO_PROJECT }}
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index 06ab2cc62..7479a13b2 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -56,11 +56,11 @@ jobs:
# your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages
steps:
- name: Checkout repository
- uses: actions/checkout@v4
+ uses: actions/checkout@v7
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
- uses: github/codeql-action/init@v3
+ uses: github/codeql-action/init@v4
with:
languages: ${{ matrix.language }}
build-mode: ${{ matrix.build-mode }}
@@ -88,6 +88,6 @@ jobs:
exit 1
- name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@v3
+ uses: github/codeql-action/analyze@v4
with:
category: "/language:${{matrix.language}}"
diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml
index 75f1d5e43..8c17f15f4 100644
--- a/.github/workflows/docker-build.yml
+++ b/.github/workflows/docker-build.yml
@@ -13,7 +13,7 @@ jobs:
steps:
- name: Checkout code
- uses: actions/checkout@v4
+ uses: actions/checkout@v7
- name: Login to GitHub Container Registry
uses: docker/login-action@v4
diff --git a/.github/workflows/publish-api-documentation.yml b/.github/workflows/publish-api-documentation.yml
index f2d635030..ad64fc525 100644
--- a/.github/workflows/publish-api-documentation.yml
+++ b/.github/workflows/publish-api-documentation.yml
@@ -12,11 +12,11 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v7
with:
fetch-depth: 0
ref: "gh-pages"
- - uses: actions/setup-python@v5
+ - uses: actions/setup-python@v6
with:
python-version: 3.12
- name: Merge changes from 3.0 branch
diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml
index fe94b2aa0..4ec75343d 100644
--- a/.github/workflows/testing.yml
+++ b/.github/workflows/testing.yml
@@ -21,9 +21,9 @@ jobs:
python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v7
- name: Set up Python ${{ matrix.python-version }}
- uses: actions/setup-python@v5
+ uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
- name: Display Python version
diff --git a/docs/api/examples/controller_get_templateidbaseconfig.txt b/docs/api/examples/controller_get_templateidbaseconfig.txt
new file mode 100644
index 000000000..9e3d9c25c
--- /dev/null
+++ b/docs/api/examples/controller_get_templateidbaseconfig.txt
@@ -0,0 +1,17 @@
+curl -i -X 'http://localhost:3080/v2/templates/19021f99-e36f-394d-b4a1-8aaa902ab9cc/base-config/vpcs_base_config.txt'
+
+GET /v2/templates/19021f99-e36f-394d-b4a1-8aaa902ab9cc/base-config/vpcs_base_config.txt HTTP/1.1
+
+HTTP/1.1 200 OK
+Connection: close
+X-Route: /v2/templates/{template_id}/base-config/{filename}
+Server: Python/3.14 GNS3/2.2.60.dev1+713dbb7f
+Content-Type: application/json
+Content-Length: 144
+Date: Mon, 18 May 2026 18:34:10 GMT
+
+{
+ "content": "# test config\n\ndhcp\n",
+ "filename": "vpcs_base_config.txt",
+ "template_id": "19021f99-e36f-394d-b4a1-8aaa902ab9cc"
+}
\ No newline at end of file
diff --git a/docs/api/examples/controller_get_templatesbaseconfigs.txt b/docs/api/examples/controller_get_templatesbaseconfigs.txt
new file mode 100644
index 000000000..263cbfa1f
--- /dev/null
+++ b/docs/api/examples/controller_get_templatesbaseconfigs.txt
@@ -0,0 +1,44 @@
+curl -i -X 'http://localhost:3080/v2/templates/base-configs'
+
+GET /v2/templates/base-configs HTTP/1.1
+
+HTTP/1.1 200 OK
+Connection: close
+X-Route: /v2/templates/base-configs
+Server: Python/3.14 GNS3/2.2.60.dev1+713dbb7f
+Content-Type: application/json
+Content-Length: 576
+Date: Mon, 18 May 2026 18:28:53 GMT
+
+[
+ {
+ "filename": "config1.txt"
+ },
+ {
+ "filename": "config2.txt"
+ },
+ {
+ "filename": "ios_base_startup-config.txt"
+ },
+ {
+ "filename": "ios_etherswitch_startup-config.txt"
+ },
+ {
+ "filename": "iou_l2_base_startup-config.txt"
+ },
+ {
+ "filename": "iou_l3_base_startup-config.txt"
+ },
+ {
+ "filename": "test_config.txt"
+ },
+ {
+ "filename": "update_test.txt"
+ },
+ {
+ "filename": "vpcs_base_config.txt"
+ },
+ {
+ "filename": "vpcs_base_config2.txt"
+ }
+]
\ No newline at end of file
diff --git a/docs/api/examples/controller_put_templateidbaseconfig.txt b/docs/api/examples/controller_put_templateidbaseconfig.txt
new file mode 100644
index 000000000..c70e315b8
--- /dev/null
+++ b/docs/api/examples/controller_put_templateidbaseconfig.txt
@@ -0,0 +1,17 @@
+curl -i -X 'http://localhost:3080/v2/templates/19021f99-e36f-394d-b4a1-8aaa902ab9cc/base-config/vpcs_base_config.txt'
+
+PUT /v2/templates/19021f99-e36f-394d-b4a1-8aaa902ab9cc/base-config/vpcs_base_config.txt HTTP/1.1
+
+HTTP/1.1 200 OK
+Connection: close
+X-Route: /v2/templates/{template_id}/base-config/{filename}
+Server: Python/3.14 GNS3/2.2.60.dev1+713dbb7f
+Content-Type: application/json
+Content-Length: 144
+Date: Mon, 18 May 2026 18:37:57 GMT
+
+{
+ "content": "# test config\n\ndhcp\n",
+ "filename": "vpcs_base_config.txt",
+ "template_id": "19021f99-e36f-394d-b4a1-8aaa902ab9cc"
+}
\ No newline at end of file
diff --git a/docs/api/v2/controller/template/templatesbaseconfigs.rst b/docs/api/v2/controller/template/templatesbaseconfigs.rst
new file mode 100644
index 000000000..dc4de3e8c
--- /dev/null
+++ b/docs/api/v2/controller/template/templatesbaseconfigs.rst
@@ -0,0 +1,38 @@
+GET /v2/templates/base-configs
+------------------------------------------------------------------------------------------------------------------------------------------
+
+.. contents::
+
+GET /v2/templates/base-configs
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+List all available base configuration files
+
+Response status codes
+**********************
+- **200**: List of base configuration files returned
+
+Output
+*******
+
+.. raw:: html
+
+
+
+ | Name |
+ Type |
+ Description |
+
+
+
+ | filename |
+ string |
+ Name of the base configuration file |
+
+
+
+
+Sample session
+***************
+
+.. literalinclude:: ../../../examples/controller_get_templatesbaseconfigs.txt
\ No newline at end of file
diff --git a/docs/api/v2/controller/template/templatestemplateidbaseconfigfilename.rst b/docs/api/v2/controller/template/templatestemplateidbaseconfigfilename.rst
new file mode 100644
index 000000000..98b356270
--- /dev/null
+++ b/docs/api/v2/controller/template/templatestemplateidbaseconfigfilename.rst
@@ -0,0 +1,90 @@
+/v2/templates/{template_id}/base-config/{filename}
+------------------------------------------------------------------------------------------------------------------------------------------
+
+.. contents::
+
+GET /v2/templates/**{template_id}**/base-configs/**{filename}**
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+List all available base configuration files
+
+Response status codes
+**********************
+- **200**: List of base configuration files returned
+
+Output
+*******
+
+.. raw:: html
+
+
+
+ | Name |
+ Type |
+ Description |
+
+
+
+ | filename |
+ string |
+ Name of the base configuration file |
+
+
+
+
+Sample session
+***************
+
+.. literalinclude:: ../../../examples/controller_get_templateidbaseconfig.txt
+
+
+PUT /v2/templates/**{template_id}**/base-config/**{filename}**
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Update base configuration file content
+
+Response status codes
+**********************
+- **200**: File updated
+- **404**: File not found
+
+Input
+*******
+
+.. raw:: html
+
+
+
+ | Name |
+ Mandatory |
+ Type |
+ Description |
+
+
+ | content | ✔ | string | New file content |
+
+
+
+Output
+*******
+
+.. raw:: html
+
+
+
+ | Name |
+ Mandatory |
+ Type |
+ Description |
+
+
+ | template_id | ✔ | string | Template UUID |
+ | filename | ✔ | string | Base configuration filename |
+ | content | ✔ | string | Updated file content |
+
+
+
+Sample session
+***************
+
+.. literalinclude:: ../../../examples/controller_put_templateidbaseconfig.txt
\ No newline at end of file