diff --git a/docs/about/contributing/modules.md b/docs/about/contributing/modules.md new file mode 100644 index 0000000000000..b824fa209e77a --- /dev/null +++ b/docs/about/contributing/modules.md @@ -0,0 +1,386 @@ +# Contributing modules + +Learn how to create and contribute Terraform modules to the Coder Registry. Modules provide reusable components that extend Coder workspaces with IDEs, development tools, login tools, and other features. + +## What are Coder modules + +Coder modules are Terraform modules that integrate with Coder workspaces to provide specific functionality. They are published to the Coder Registry at [registry.coder.com](https://registry.coder.com) and can be consumed in any Coder template using standard Terraform module syntax. + +Examples of modules include: + +- **Desktop IDEs**: [`jetbrains-fleet`](https://registry.coder.com/modules/coder/jetbrains-fleet), [`cursor`](https://registry.coder.com/modules/coder/cursor), [`windsurf`](https://registry.coder.com/modules/coder/windsurf), [`zed`](https://registry.coder.com/modules/coder/zed) +- **Web IDEs**: [`code-server`](https://registry.coder.com/modules/coder/code-server), [`vscode-web`](https://registry.coder.com/modules/coder/vscode-web), [`jupyter-notebook`](https://registry.coder.com/modules/coder/jupyter-notebook), [`jupyter-lab`](https://registry.coder.com/modules/coder/jupyterlab) +- **Integrations**: [`devcontainers-cli`](https://registry.coder.com/modules/coder/devcontainers-cli), [`vault-github`](https://registry.coder.com/modules/coder/vault-github), [`jfrog-oauth`](https://registry.coder.com/modules/coder/jfrog-oauth), [`jfrog-token`](https://registry.coder.com/modules/coder/jfrog-token) +- **Workspace utilities**: [`git-clone`](https://registry.coder.com/modules/coder/git-clone), [`dotfiles`](https://registry.coder.com/modules/coder/dotfiles), [`filebrowser`](https://registry.coder.com/modules/coder/filebrowser), [`coder-login`](https://registry.coder.com/modules/coder/coder-login), [`personalize`](https://registry.coder.com/modules/coder/personalize) + +## Prerequisites + +Before contributing modules, ensure you have: + +- Basic Terraform knowledge +- [Terraform installed](https://developer.hashicorp.com/terraform/install) +- [Docker installed](https://docs.docker.com/get-docker/) (for running tests) +- [Bun installed](https://bun.sh/docs/installation) (for running tests and tooling) + +## Setup your development environment + +1. **Fork and clone the repository**: + + ```bash + git clone https://github.com/your-username/registry.git + cd registry + ``` + +2. **Install dependencies**: + + ```bash + bun install + ``` + +3. **Understand the structure**: + + ```text + registry/[namespace]/ + ├── modules/ # Your modules + ├── .images/ # Namespace avatar and screenshots + └── README.md # Namespace description + ``` + +## Create your first module + +### 1. Set up your namespace + +If you're a new contributor, create your namespace directory: + +```bash +mkdir -p registry/[your-username] +mkdir -p registry/[your-username]/.images +``` + +Add your namespace avatar by downloading your GitHub avatar and saving it as `avatar.png`: + +```bash +curl -o registry/[your-username]/.images/avatar.png https://github.com/[your-username].png +``` + +Create your namespace README at `registry/[your-username]/README.md`: + +```markdown +--- +display_name: "Your Name" +bio: "Brief description of what you do" +github: "your-username" +avatar: "./.images/avatar.png" +linkedin: "https://www.linkedin.com/in/your-username" +website: "https://your-website.com" +support_email: "support@your-domain.com" +status: "community" +--- + +# Your Name + +Brief description of who you are and what you do. +``` + +> [!NOTE] +> The `linkedin`, `website`, and `support_email` fields are optional and can be omitted or left empty if not applicable. + +### 2. Generate module scaffolding + +Use the provided script to generate your module structure: + +```bash +./scripts/new_module.sh [your-username]/[module-name] +cd registry/[your-username]/modules/[module-name] +``` + +This creates: + +- `main.tf` - Terraform configuration template +- `README.md` - Documentation template with frontmatter +- `run.sh` - Optional execution script + +### 3. Implement your module + +Edit `main.tf` to build your module's features. Here's an example based on the `git-clone` module structure: + +```terraform +terraform { + required_providers { + coder = { + source = "coder/coder" + } + } +} + +# Input variables +variable "agent_id" { + description = "The ID of a Coder agent" + type = string +} + +variable "url" { + description = "Git repository URL to clone" + type = string + validation { + condition = can(regex("^(https?://|git@)", var.url)) + error_message = "URL must be a valid git repository URL." + } +} + +variable "base_dir" { + description = "Directory to clone the repository into" + type = string + default = "~" +} + +# Resources +resource "coder_script" "clone_repo" { + agent_id = var.agent_id + display_name = "Clone Repository" + script = <<-EOT + #!/bin/bash + set -e + + # Ensure git is installed + if ! command -v git &> /dev/null; then + echo "Installing git..." + sudo apt-get update && sudo apt-get install -y git + fi + + # Clone repository if it doesn't exist + if [ ! -d "${var.base_dir}/$(basename ${var.url} .git)" ]; then + echo "Cloning ${var.url}..." + git clone ${var.url} ${var.base_dir}/$(basename ${var.url} .git) + fi + EOT + run_on_start = true +} + +# Outputs +output "repo_dir" { + description = "Path to the cloned repository" + value = "${var.base_dir}/$(basename ${var.url} .git)" +} +``` + +### 4. Write complete tests + +Create `main.test.ts` to test your module features: + +```typescript +import { runTerraformApply, runTerraformInit, testRequiredVariables } from "~test" + +describe("git-clone", async () => { + await testRequiredVariables("registry/[your-username]/modules/git-clone") + + it("should clone repository successfully", async () => { + await runTerraformInit("registry/[your-username]/modules/git-clone") + await runTerraformApply("registry/[your-username]/modules/git-clone", { + agent_id: "test-agent-id", + url: "https://github.com/coder/coder.git", + base_dir: "/tmp" + }) + }) + + it("should work with SSH URLs", async () => { + await runTerraformInit("registry/[your-username]/modules/git-clone") + await runTerraformApply("registry/[your-username]/modules/git-clone", { + agent_id: "test-agent-id", + url: "git@github.com:coder/coder.git" + }) + }) +}) +``` + +### 5. Document your module + +Update `README.md` with complete documentation: + +```markdown +--- +display_name: "Git Clone" +description: "Clone a Git repository into your Coder workspace" +icon: "../../../../.icons/git.svg" +verified: false +tags: ["git", "development", "vcs"] +--- + +# Git Clone + +This module clones a Git repository into your Coder workspace and ensures Git is installed. + +## Usage + +```tf +module "git_clone" { + source = "registry.coder.com/[your-username]/git-clone/coder" + version = "~> 1.0" + + agent_id = coder_agent.main.id + url = "https://github.com/coder/coder.git" + base_dir = "/home/coder/projects" +} +``` + +## Module best practices + +### Design principles + +- **Single responsibility**: Each module should have one clear purpose +- **Reusability**: Design for use across different workspace types +- **Flexibility**: Provide sensible defaults but allow customization +- **Safe to rerun**: Ensure modules can be applied multiple times safely + +### Terraform conventions + +- Use descriptive variable names and include descriptions +- Provide default values for optional variables +- Include helpful outputs for working with other modules +- Use proper resource dependencies +- Follow [Terraform style conventions](https://developer.hashicorp.com/terraform/language/syntax/style) + +### Documentation standards + +Your module README should include: + +- **Frontmatter**: Required metadata for the registry +- **Description**: Clear explanation of what the module does +- **Usage example**: Working Terraform code snippet +- **Additional context**: Setup requirements, known limitations, etc. + +> [!NOTE] +> Do not include variables tables in your README. The registry automatically generates variable documentation from your `main.tf` file. + +## Test your module + +Run tests to ensure your module works correctly: + +```bash +# Test your specific module +bun test -t 'git-clone' + +# Test all modules +bun test + +# Format code +bun fmt +``` + +> [!IMPORTANT] +> Tests require Docker with `--network=host` support, which typically requires Linux. macOS users can use [Colima](https://github.com/abiosoft/colima) or [OrbStack](https://orbstack.dev/) instead of Docker Desktop. + +## Contribute to existing modules + +### Types of contributions + +**Bug fixes**: + +- Fix installation or configuration issues +- Resolve compatibility problems +- Correct documentation errors + +**Feature additions**: + +- Add new configuration options +- Support additional platforms or versions +- Add new features + +**Maintenance**: + +- Update dependencies +- Improve error handling +- Optimize performance + +### Making changes + +1. **Identify the issue**: Reproduce the problem or identify the improvement needed +2. **Make focused changes**: Keep modifications minimal and targeted +3. **Maintain compatibility**: Ensure existing users aren't broken +4. **Add tests**: Test new features and edge cases +5. **Update documentation**: Reflect changes in the README + +### Backward compatibility + +When modifying existing modules: + +- Add new variables with sensible defaults +- Don't remove existing variables without a migration path +- Don't change variable types or meanings +- Test that basic configurations still work + +## Versioning + +When you modify a module, update its version following semantic versioning: + +- **Patch** (1.0.0 → 1.0.1): Bug fixes, documentation updates +- **Minor** (1.0.0 → 1.1.0): New features, new variables +- **Major** (1.0.0 → 2.0.0): Breaking changes, removing variables + +Use the version bump script to update versions: + +```bash +./.github/scripts/version-bump.sh patch|minor|major +``` + +## Submit your contribution + +1. **Create a feature branch**: + + ```bash + git checkout -b feat/modify-git-clone-module + ``` + +2. **Test thoroughly**: + + ```bash + bun test -t 'git-clone' + bun fmt + ``` + +3. **Commit with clear messages**: + + ```bash + git add . + git commit -m "feat(git-clone):add git-clone module" + ``` + +4. **Open a pull request**: + - Use a descriptive title + - Explain what the module does and why it's useful + - Reference any related issues + +## Common issues and solutions + +### Testing problems + +**Issue**: Tests fail with network errors +**Solution**: Ensure Docker is running with `--network=host` support + +### Module development + +**Issue**: Icon not displaying +**Solution**: Verify icon path is correct and file exists in `.icons/` directory + +### Documentation + +**Issue**: Code blocks not syntax highlighted +**Solution**: Use `tf` language identifier for Terraform code blocks + +## Get help + +- **Examples**: Review existing modules like [`code-server`](https://registry.coder.com/modules/coder/code-server), [`git-clone`](https://registry.coder.com/modules/coder/git-clone), and [`jetbrains-gateway`](https://registry.coder.com/modules/coder/jetbrains-gateway) +- **Issues**: Open an issue at [github.com/coder/registry](https://github.com/coder/registry/issues) +- **Community**: Join the [Coder Discord](https://discord.gg/coder) for questions +- **Documentation**: Check the [Coder docs](https://coder.com/docs) for help on Coder. + +## Next steps + +After creating your first module: + +1. **Share with the community**: Announce your module on Discord or social media +2. **Iterate based on feedback**: Improve based on user suggestions +3. **Create more modules**: Build a collection of related tools +4. **Contribute to existing modules**: Help maintain and improve the ecosystem + +Happy contributing! 🚀 diff --git a/docs/about/contributing/templates.md b/docs/about/contributing/templates.md new file mode 100644 index 0000000000000..321377bb0f8aa --- /dev/null +++ b/docs/about/contributing/templates.md @@ -0,0 +1,534 @@ +# Contributing templates + +Learn how to create and contribute complete Coder workspace templates to the Coder Registry. Templates provide ready-to-use workspace configurations that users can deploy directly to create development environments. + +## What are Coder templates + +Coder templates are complete Terraform configurations that define entire workspace environments. Unlike modules (which are reusable components), templates provide full infrastructure definitions that include: + +- Infrastructure setup (containers, VMs, cloud resources) +- Coder agent configuration +- Development tools and IDE integrations +- Networking and security settings +- Complete startup automation + +Templates appear on the Coder Registry and can be deployed directly by users. + +## Prerequisites + +Before contributing templates, ensure you have: + +- Strong Terraform knowledge +- [Terraform installed](https://developer.hashicorp.com/terraform/install) +- [Coder CLI installed](https://coder.com/docs/install) +- Access to your target infrastructure platform (Docker, AWS, GCP, etc.) +- [Bun installed](https://bun.sh/docs/installation) (for tooling) + +## Setup your development environment + +1. **Fork and clone the repository**: + + ```bash + git clone https://github.com/your-username/registry.git + cd registry + ``` + +2. **Install dependencies**: + + ```bash + bun install + ``` + +3. **Understand the structure**: + + ```text + registry/[namespace]/ + ├── templates/ # Your templates + ├── .images/ # Namespace avatar and screenshots + └── README.md # Namespace description + ``` + +## Create your first template + +### 1. Set up your namespace + +If you're a new contributor, create your namespace directory: + +```bash +mkdir -p registry/[your-username] +mkdir -p registry/[your-username]/.images +``` + +Add your namespace avatar by downloading your GitHub avatar and saving it as `avatar.png`: + +```bash +curl -o registry/[your-username]/.images/avatar.png https://github.com/[your-username].png +``` + +Create your namespace README at `registry/[your-username]/README.md`: + +```markdown +--- +display_name: "Your Name" +bio: "Brief description of what you do" +github: "your-username" +avatar: "./.images/avatar.png" +linkedin: "https://www.linkedin.com/in/your-username" +website: "https://your-website.com" +support_email: "support@your-domain.com" +status: "community" +--- + +# Your Name + +Brief description of who you are and what you do. +``` + +> [!NOTE] +> The `linkedin`, `website`, and `support_email` fields are optional and can be omitted or left empty if not applicable. + +### 2. Create your template directory + +Create a directory for your template: + +```bash +mkdir -p registry/[your-username]/templates/[template-name] +cd registry/[your-username]/templates/[template-name] +``` + +### 3. Build your template + +Create `main.tf` with your complete Terraform configuration: + +```terraform +terraform { + required_providers { + coder = { + source = "coder/coder" + } + docker = { + source = "kreuzwerker/docker" + } + } +} + +# Coder data sources +data "coder_workspace" "me" {} +data "coder_workspace_owner" "me" {} + +# Coder agent +resource "coder_agent" "main" { + arch = "amd64" + os = "linux" + startup_script_timeout = 180 + startup_script = <<-EOT + set -e + + # Install development tools + sudo apt-get update + sudo apt-get install -y curl wget git + + # Additional setup here + EOT +} + +# Registry modules for IDEs and tools +module "code-server" { + source = "registry.coder.com/coder/code-server/coder" + version = "~> 1.0" + agent_id = coder_agent.main.id +} + +module "git-clone" { + source = "registry.coder.com/coder/git-clone/coder" + version = "~> 1.0" + agent_id = coder_agent.main.id + url = "https://github.com/example/repo.git" +} + +# Infrastructure resources +resource "docker_image" "main" { + name = "codercom/enterprise-base:ubuntu" +} + +resource "docker_container" "workspace" { + count = data.coder_workspace.me.start_count + image = docker_image.main.name + name = "coder-${data.coder_workspace_owner.me.name}-${data.coder_workspace.me.name}" + + command = ["sh", "-c", coder_agent.main.init_script] + env = ["CODER_AGENT_TOKEN=${coder_agent.main.token}"] + + host { + host = "host.docker.internal" + ip = "host-gateway" + } +} + +# Metadata +resource "coder_metadata" "workspace_info" { + count = data.coder_workspace.me.start_count + resource_id = docker_container.workspace[0].id + + item { + key = "memory" + value = "4 GB" + } + + item { + key = "cpu" + value = "2 cores" + } +} +``` + +### 4. Document your template + +Create `README.md` with comprehensive documentation: + +```markdown +--- +display_name: "Ubuntu Development Environment" +description: "Complete Ubuntu workspace with VS Code, Git, and development tools" +icon: "../../../../.icons/ubuntu.svg" +verified: false +tags: ["ubuntu", "docker", "vscode", "git"] +--- + +# Ubuntu Development Environment + +A complete Ubuntu-based development workspace with VS Code, Git, and essential development tools pre-installed. + +## Features + +- **Ubuntu 24.04 LTS** base image +- **VS Code** with code-server for browser-based development +- **Git** with automatic repository cloning +- **Node.js** and **npm** for JavaScript development +- **Python 3** with pip +- **Docker** for containerized development + +## Requirements + +- Docker runtime +- 4 GB RAM minimum +- 2 CPU cores recommended + +## Usage + +1. Deploy this template in your Coder instance +2. Create a new workspace from the template +3. Access VS Code through the workspace dashboard +4. Start developing in your fully configured environment + +## Customization + +You can customize this template by: + +- Modifying the base image in `docker_image.main` +- Adding additional registry modules +- Adjusting resource allocations +- Including additional development tools + +## Troubleshooting + +**Issue**: Workspace fails to start +**Solution**: Ensure Docker is running and accessible + +**Issue**: VS Code not accessible +**Solution**: Check agent logs and ensure code-server module is properly configured +``` + +## Template best practices + +### Design principles + +- **Complete environments**: Templates should provide everything needed for development +- **Platform-specific**: Focus on one platform or use case per template +- **Production-ready**: Include proper error handling and resource management +- **User-friendly**: Provide clear documentation and sensible defaults + +### Infrastructure setup + +- **Resource efficiency**: Use appropriate resource allocations +- **Network configuration**: Ensure proper connectivity for development tools +- **Security**: Follow security best practices for your platform +- **Scalability**: Design for multiple concurrent users + +### Module integration + +Use registry modules for common features: + +```terraform +# VS Code in browser +module "code-server" { + count = data.coder_workspace.me.start_count + source = "registry.coder.com/coder/code-server/coder" + version = "1.3.0" + agent_id = coder_agent.example.id +} + +# JetBrains IDEs +module "jetbrains" { + count = data.coder_workspace.me.start_count + source = "registry.coder.com/coder/jetbrains/coder" + version = "1.0.0" + agent_id = coder_agent.example.id + folder = "/home/coder/project" +} + +# Git repository cloning +module "git-clone" { + count = data.coder_workspace.me.start_count + source = "registry.coder.com/coder/git-clone/coder" + version = "1.1.0" + agent_id = coder_agent.example.id + url = "https://github.com/coder/coder" + base_dir = "~/projects/coder" +} + +# File browser interface +module "filebrowser" { + count = data.coder_workspace.me.start_count + source = "registry.coder.com/coder/filebrowser/coder" + version = "1.1.1" + agent_id = coder_agent.example.id +} + +# Dotfiles management +module "dotfiles" { + count = data.coder_workspace.me.start_count + source = "registry.coder.com/coder/dotfiles/coder" + version = "1.2.0" + agent_id = coder_agent.example.id +} +``` + +### Variables + +Provide meaningful customization options: + +```terraform +variable "git_repo_url" { + description = "Git repository to clone" + type = string + default = "" +} + +variable "instance_type" { + description = "Instance type for the workspace" + type = string + default = "t3.medium" +} + +variable "workspace_name" { + description = "Name for the workspace" + type = string + default = "dev-workspace" +} +``` + +## Test your template + +### Local testing + +Test your template locally with Coder: + +```bash +# Navigate to your template directory +cd registry/[your-username]/templates/[template-name] + +# Push to Coder for testing +coder templates push test-template -d . + +# Create a test workspace +coder create test-workspace --template test-template +``` + +### Validation checklist + +Before submitting your template, verify: + +- [ ] Template provisions successfully +- [ ] Agent connects properly +- [ ] All registry modules work correctly +- [ ] VS Code/IDEs are accessible +- [ ] Networking functions properly +- [ ] Resource metadata is accurate +- [ ] Documentation is complete and accurate + +## Contribute to existing templates + +### Types of improvements + +**Bug fixes**: + +- Fix setup issues +- Resolve agent connectivity problems +- Correct resource configurations + +**Feature additions**: + +- Add new registry modules +- Include additional development tools +- Improve startup automation + +**Platform updates**: + +- Update base images or AMIs +- Adapt to new platform features +- Improve security configurations + +**Documentation improvements**: + +- Clarify setup requirements +- Add troubleshooting guides +- Improve usage examples + +### Making changes + +1. **Test thoroughly**: Always test template changes in a Coder instance +2. **Maintain compatibility**: Ensure existing workspaces continue to function +3. **Document changes**: Update the README with new features or requirements +4. **Follow versioning**: Update version numbers for significant changes +5. **Modernize**: Use latest provider versions, best practices, and current software versions + +## Submit your contribution + +1. **Create a feature branch**: + + ```bash + git checkout -b feat/add-python-template + ``` + +2. **Test thoroughly**: + + ```bash + # Test with Coder + coder templates push test-python-template -d . + coder create test-workspace --template test-python-template + + # Format code + bun fmt + ``` + +3. **Commit with clear messages**: + + ```bash + git add . + git commit -m "Add Python development template with FastAPI setup" + ``` + +4. **Open a pull request**: + - Use a descriptive title + - Explain what the template provides + - Include testing instructions + - Reference any related issues + +## Template examples + +### Docker-based template + +```terraform +# Simple Docker template +resource "docker_container" "workspace" { + count = data.coder_workspace.me.start_count + image = "ubuntu:24.04" + name = "coder-${data.coder_workspace_owner.me.name}-${data.coder_workspace.me.name}" + + command = ["sh", "-c", coder_agent.main.init_script] + env = ["CODER_AGENT_TOKEN=${coder_agent.main.token}"] +} +``` + +### AWS EC2 template + +```terraform +# AWS EC2 template +resource "aws_instance" "workspace" { + count = data.coder_workspace.me.start_count + ami = data.aws_ami.ubuntu.id + instance_type = var.instance_type + + user_data = coder_agent.main.init_script + + tags = { + Name = "coder-${data.coder_workspace_owner.me.name}-${data.coder_workspace.me.name}" + } +} +``` + +### Kubernetes template + +```terraform +# Kubernetes template +resource "kubernetes_pod" "workspace" { + count = data.coder_workspace.me.start_count + + metadata { + name = "coder-${data.coder_workspace_owner.me.name}-${data.coder_workspace.me.name}" + } + + spec { + container { + name = "workspace" + image = "ubuntu:24.04" + + command = ["sh", "-c", coder_agent.main.init_script] + env { + name = "CODER_AGENT_TOKEN" + value = coder_agent.main.token + } + } + } +} +``` + +## Common issues and solutions + +### Template development + +**Issue**: Template fails to create resources +**Solution**: Check Terraform syntax and provider configuration + +**Issue**: Agent doesn't connect +**Solution**: Verify agent token and network connectivity + +### Documentation + +**Issue**: Icon not displaying +**Solution**: Verify icon path and file existence + +### Platform-specific + +**Issue**: Docker containers not starting +**Solution**: Verify Docker daemon is running and accessible + +**Issue**: Cloud resources failing +**Solution**: Check credentials and permissions + +## Get help + +- **Examples**: Review real-world examples from the [official Coder templates](https://registry.coder.com/contributors/coder?tab=templates): + - [AWS EC2 (Devcontainer)](https://registry.coder.com/templates/aws-devcontainer) - AWS EC2 VMs with devcontainer support + - [Docker (Devcontainer)](https://registry.coder.com/templates/docker-devcontainer) - Envbuilder containers with dev container support + - [Kubernetes (Devcontainer)](https://registry.coder.com/templates/kubernetes-devcontainer) - Envbuilder pods on Kubernetes + - [Docker Containers](https://registry.coder.com/templates/docker) - Basic Docker container workspaces + - [AWS EC2 (Linux)](https://registry.coder.com/templates/aws-linux) - AWS EC2 VMs for Linux development + - [Google Compute Engine (Linux)](https://registry.coder.com/templates/gcp-vm-container) - GCP VM instances + - [Scratch](https://registry.coder.com/templates/scratch) - Minimal starter template +- **Modules**: Browse available modules at [registry.coder.com/modules](https://registry.coder.com/modules) +- **Issues**: Open an issue at [github.com/coder/registry](https://github.com/coder/registry/issues) +- **Community**: Join the [Coder Discord](https://discord.gg/coder) for questions +- **Documentation**: Check the [Coder docs](https://coder.com/docs) for template guidance + +## Next steps + +After creating your first template: + +1. **Share with the community**: Announce your template on Discord or social media +2. **Gather feedback**: Iterate based on user suggestions and issues +3. **Create variations**: Build templates for different use cases or platforms +4. **Contribute to existing templates**: Help maintain and improve the ecosystem + +Your templates help developers get productive faster by providing ready-to-use development environments. Happy contributing! 🚀 diff --git a/docs/manifest.json b/docs/manifest.json index 65555caa0df4f..4dd66e0b89d52 100644 --- a/docs/manifest.json +++ b/docs/manifest.json @@ -47,6 +47,18 @@ "path": "./about/contributing/documentation.md", "icon_path": "./images/icons/document.svg" }, + { + "title": "Modules", + "description": "Learn how to contribute modules to Coder", + "path": "./about/contributing/modules.md", + "icon_path": "./images/icons/gear.svg" + }, + { + "title": "Templates", + "description": "Learn how to contribute templates to Coder", + "path": "./about/contributing/templates.md", + "icon_path": "./images/icons/picture.svg" + }, { "title": "Backend", "description": "Our guide for backend development",