docs: add contribution documentation for modules and templates (#18820)

draft: add contribution docs for modules and templates individually to
be referenced in coder docs manifest.

---------

Co-authored-by: Atif Ali <atif@coder.com>
This commit is contained in:
DevCats
2025-07-17 16:23:42 -05:00
committed by GitHub
co-authored by Atif Ali
parent 183a6ebbdf
commit 6746e16502
3 changed files with 932 additions and 0 deletions
+386
View File
@@ -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! 🚀
+534
View File
@@ -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! 🚀
+12
View File
@@ -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",