From e8e3a4e6427e8aacdbc4937432fce4aab7a69ffb Mon Sep 17 00:00:00 2001 From: 35C4n0r <70096901+35C4n0r@users.noreply.github.com> Date: Thu, 8 Jan 2026 19:43:16 +0530 Subject: [PATCH 1/4] feat(cmd/tests): update tests to fail on invalid and absolute urls (#639) ## Description Updated the tests: - We now don't accept absolute urls (http / https) - We only accept urls that start with `../../../../.icons/*` and exists ## Type of Change - [ ] New module - [ ] New template - [x] Bug fix - [ ] Feature/enhancement - [ ] Documentation - [ ] Other ## Testing & Validation - [x] Tests pass (`bun test`) - [x] Code formatted (`bun fmt`) - [x] Changes tested locally --------- Co-authored-by: DevCats --- cmd/.icons/docker.svg | 3 + cmd/.icons/goose.svg | 4 + cmd/readmevalidation/codermodules_test.go | 117 +++++++++++++++-- cmd/readmevalidation/coderresources.go | 44 ++++--- .../modules/fail/absoluteIconPath.md | 22 ++++ .../modules/fail/wrongPathFormat.md | 19 +++ .../modules/pass/sampleModuleReadme.md | 56 ++++++++ .../testSamples/sampleReadmeBody.md | 121 ------------------ .../templates/fail/absoluteIconPath.md | 27 ++++ .../templates/fail/wrongPathFormat.md | 20 +++ .../templates/pass/sampleTemplateReadme.md | 56 ++++++++ 11 files changed, 340 insertions(+), 149 deletions(-) create mode 100644 cmd/.icons/docker.svg create mode 100644 cmd/.icons/goose.svg create mode 100644 cmd/readmevalidation/testSamples/modules/fail/absoluteIconPath.md create mode 100644 cmd/readmevalidation/testSamples/modules/fail/wrongPathFormat.md create mode 100644 cmd/readmevalidation/testSamples/modules/pass/sampleModuleReadme.md delete mode 100644 cmd/readmevalidation/testSamples/sampleReadmeBody.md create mode 100644 cmd/readmevalidation/testSamples/templates/fail/absoluteIconPath.md create mode 100644 cmd/readmevalidation/testSamples/templates/fail/wrongPathFormat.md create mode 100644 cmd/readmevalidation/testSamples/templates/pass/sampleTemplateReadme.md diff --git a/cmd/.icons/docker.svg b/cmd/.icons/docker.svg new file mode 100644 index 00000000..78e549ef --- /dev/null +++ b/cmd/.icons/docker.svg @@ -0,0 +1,3 @@ + + + diff --git a/cmd/.icons/goose.svg b/cmd/.icons/goose.svg new file mode 100644 index 00000000..cbbe8419 --- /dev/null +++ b/cmd/.icons/goose.svg @@ -0,0 +1,4 @@ + + + + diff --git a/cmd/readmevalidation/codermodules_test.go b/cmd/readmevalidation/codermodules_test.go index 194a861e..e9e88bfc 100644 --- a/cmd/readmevalidation/codermodules_test.go +++ b/cmd/readmevalidation/codermodules_test.go @@ -1,22 +1,117 @@ package main import ( - _ "embed" + "os" + "path/filepath" "testing" ) -//go:embed testSamples/sampleReadmeBody.md -var testBody string +type readmeTestCase struct { + filePath string + shouldPass bool +} -func TestValidateCoderResourceReadmeBody(t *testing.T) { +func loadTestCases(t *testing.T, dir string, shouldPass bool) []readmeTestCase { + t.Helper() + files, err := os.ReadDir(dir) + if err != nil { + t.Fatalf("Failed to read directory %s: %v", dir, err) + } + + var testCases []readmeTestCase + for _, file := range files { + testCases = append(testCases, readmeTestCase{ + filePath: filepath.Join(dir, file.Name()), + shouldPass: shouldPass, + }) + } + return testCases +} + +func TestValidateModuleReadmes(t *testing.T) { t.Parallel() - t.Run("Parses a valid README body with zero issues", func(t *testing.T) { - t.Parallel() + testCases := append( + loadTestCases(t, "testSamples/modules/pass", true), + loadTestCases(t, "testSamples/modules/fail", false)..., + ) - errs := validateCoderModuleReadmeBody(testBody) - for _, e := range errs { - t.Error(e) - } - }) + for _, tc := range testCases { + t.Run(tc.filePath, func(t *testing.T) { + t.Parallel() + + content, err := os.ReadFile(tc.filePath) + if err != nil { + t.Fatalf("Failed to read file: %v", err) + } + + rm := readme{ + filePath: tc.filePath, + rawText: string(content), + } + + resource, errs := parseCoderResourceReadme("modules", rm) + if len(errs) != 0 { + if tc.shouldPass { + for _, e := range errs { + t.Errorf("Unexpected parsing error: %v", e) + } + } + return + } + + validationErrs := validateCoderModuleReadme(resource) + if tc.shouldPass && len(validationErrs) != 0 { + for _, e := range validationErrs { + t.Errorf("Unexpected validation error: %v", e) + } + } else if !tc.shouldPass && len(validationErrs) == 0 { + t.Error("Expected validation errors but got none") + } + }) + } +} + +func TestValidateTemplateReadmes(t *testing.T) { + t.Parallel() + + testCases := append( + loadTestCases(t, "testSamples/templates/pass", true), + loadTestCases(t, "testSamples/templates/fail", false)..., + ) + + for _, tc := range testCases { + t.Run(tc.filePath, func(t *testing.T) { + t.Parallel() + + content, err := os.ReadFile(tc.filePath) + if err != nil { + t.Fatalf("Failed to read file: %v", err) + } + + rm := readme{ + filePath: tc.filePath, + rawText: string(content), + } + + resource, errs := parseCoderResourceReadme("templates", rm) + if len(errs) != 0 { + if tc.shouldPass { + for _, e := range errs { + t.Errorf("Unexpected parsing error: %v", e) + } + } + return + } + + validationErrs := validateCoderModuleReadme(resource) + if tc.shouldPass && len(validationErrs) != 0 { + for _, e := range validationErrs { + t.Errorf("Unexpected validation error: %v", e) + } + } else if !tc.shouldPass && len(validationErrs) == 0 { + t.Error("Expected validation errors but got none") + } + }) + } } diff --git a/cmd/readmevalidation/coderresources.go b/cmd/readmevalidation/coderresources.go index 818d73c8..ee723265 100644 --- a/cmd/readmevalidation/coderresources.go +++ b/cmd/readmevalidation/coderresources.go @@ -82,33 +82,43 @@ func validateCoderResourceDescription(description string) error { return nil } -func isPermittedRelativeURL(checkURL string) bool { - // Would normally be skittish about having relative paths like this, but it should be safe because we have - // guarantees about the structure of the repo, and where this logic will run. - return strings.HasPrefix(checkURL, "./") || strings.HasPrefix(checkURL, "/") || strings.HasPrefix(checkURL, "../../../../.icons") +func isPermittedRelativeURL(checkURL string, readmeFilePath string) error { + // Icon URLs must reference the top-level .icons directory + expectedPrefix := "../../../../.icons/" + if !strings.HasPrefix(checkURL, expectedPrefix) { + return xerrors.Errorf("icon URL %q must reference the top-level .icons directory using %q", checkURL, expectedPrefix) + } + + // Resolve the path relative to the README file and check if it exists + readmeDir := path.Dir(readmeFilePath) + resolvedPath := path.Join(readmeDir, checkURL) + + if _, err := os.Stat(resolvedPath); err != nil { + if os.IsNotExist(err) { + return xerrors.Errorf("icon file does not exist at resolved path %q (referenced as %q)", resolvedPath, checkURL) + } + return xerrors.Errorf("error checking icon file at %q: %v", resolvedPath, err) + } + + return nil } -func validateCoderResourceIconURL(iconURL string) []error { +func validateCoderResourceIconURL(iconURL string, filePath string) []error { if iconURL == "" { return []error{xerrors.New("icon URL cannot be empty")} } var errs []error - // If the URL does not have a relative path. - if !strings.HasPrefix(iconURL, ".") && !strings.HasPrefix(iconURL, "/") { - if _, err := url.ParseRequestURI(iconURL); err != nil { - errs = append(errs, xerrors.New("absolute icon URL is not correctly formatted")) - } - if strings.Contains(iconURL, "?") { - errs = append(errs, xerrors.New("icon URLs cannot contain query parameters")) - } + // Reject absolute HTTP/HTTPS URLs - all icons must be local to the repository + if strings.HasPrefix(iconURL, "http://") || strings.HasPrefix(iconURL, "https://") { + errs = append(errs, xerrors.Errorf("icon URL must reference the top-level .icons directory, not an absolute URL %q", iconURL)) return errs } - // If the URL has a relative path. - if !isPermittedRelativeURL(iconURL) { - errs = append(errs, xerrors.Errorf("relative icon URL %q must either be scoped to that module's directory, or the top-level /.icons directory (this can usually be done by starting the path with \"../../../.icons\")", iconURL)) + // Validate that the icon references ../../../../.icons/ and exists + if err := isPermittedRelativeURL(iconURL, filePath); err != nil { + errs = append(errs, err) } return errs @@ -153,7 +163,7 @@ func validateCoderResourceFrontmatter(resourceType string, filePath string, fm c errs = append(errs, addFilePathToError(filePath, err)) } - for _, err := range validateCoderResourceIconURL(fm.IconURL) { + for _, err := range validateCoderResourceIconURL(fm.IconURL, filePath) { errs = append(errs, addFilePathToError(filePath, err)) } for _, err := range validateSupportedOperatingSystems(fm.OperatingSystems) { diff --git a/cmd/readmevalidation/testSamples/modules/fail/absoluteIconPath.md b/cmd/readmevalidation/testSamples/modules/fail/absoluteIconPath.md new file mode 100644 index 00000000..d68264b0 --- /dev/null +++ b/cmd/readmevalidation/testSamples/modules/fail/absoluteIconPath.md @@ -0,0 +1,22 @@ +--- +display_name: "Goose" +description: "Run the Goose agent in your workspace to generate code and perform tasks" +icon: "https://github.com/coder/registry/pull/599.svg" +verified: false +tags: ["ai", "agent"] +--- + +# Goose + +Run the [Goose](https://block.github.io/goose/) agent in your workspace to generate code and perform tasks. + +```tf +module "goose" { + source = "registry.coder.com/coder/goose/coder" + version = "1.0.31" + agent_id = coder_agent.main.id + folder = "/home/coder" + install_goose = true + goose_version = "v1.0.16" +} +``` diff --git a/cmd/readmevalidation/testSamples/modules/fail/wrongPathFormat.md b/cmd/readmevalidation/testSamples/modules/fail/wrongPathFormat.md new file mode 100644 index 00000000..e9c671c4 --- /dev/null +++ b/cmd/readmevalidation/testSamples/modules/fail/wrongPathFormat.md @@ -0,0 +1,19 @@ +--- +display_name: "Wrong Path" +description: "Test module with wrong icon path format" +icon: "../../../../.icons/invalid.svg" +verified: false +tags: ["test"] +--- + +# Wrong Path + +This should fail validation. + +```tf +module "test" { + source = "registry.coder.com/coder/test/coder" + version = "1.0.0" + agent_id = coder_agent.main.id +} +``` diff --git a/cmd/readmevalidation/testSamples/modules/pass/sampleModuleReadme.md b/cmd/readmevalidation/testSamples/modules/pass/sampleModuleReadme.md new file mode 100644 index 00000000..b0db1f26 --- /dev/null +++ b/cmd/readmevalidation/testSamples/modules/pass/sampleModuleReadme.md @@ -0,0 +1,56 @@ +--- +display_name: "Docker Container" +description: "Develop in a container on a Docker host" +icon: "../../../../.icons/docker.svg" +verified: true +tags: ["docker", "container"] +supported_os: ["linux", "macos"] +--- + +# Docker Container + +Develop in a Docker container on a remote Docker host. + +```tf +terraform { + required_providers { + coder = { + source = "coder/coder" + version = "~> 1.0" + } + docker = { + source = "kreuzwerker/docker" + version = "~> 3.0" + } + } +} + +provider "docker" {} + +provider "coder" {} + +data "coder_workspace" "me" {} + +resource "coder_agent" "main" { + os = "linux" + arch = "amd64" +} + +resource "docker_container" "workspace" { + image = "codercom/enterprise-base:ubuntu" + name = "coder-${data.coder_workspace.me.owner}-${data.coder_workspace.me.name}" + + env = ["CODER_AGENT_TOKEN=${coder_agent.main.token}"] +} +``` + +## Getting Started + +This template creates a Docker container on your Docker host. You'll need: + +- A Docker host accessible from your Coder deployment +- The Docker provider configured with appropriate credentials + +## Customization + +You can customize the container image, resources, and configuration to match your needs. diff --git a/cmd/readmevalidation/testSamples/sampleReadmeBody.md b/cmd/readmevalidation/testSamples/sampleReadmeBody.md deleted file mode 100644 index b96662af..00000000 --- a/cmd/readmevalidation/testSamples/sampleReadmeBody.md +++ /dev/null @@ -1,121 +0,0 @@ -# Goose - -Run the [Goose](https://block.github.io/goose/) agent in your workspace to generate code and perform tasks. - -```tf -module "goose" { - source = "registry.coder.com/coder/goose/coder" - version = "1.0.31" - agent_id = coder_agent.main.id - folder = "/home/coder" - install_goose = true - goose_version = "v1.0.16" -} -``` - -## Prerequisites - -- `screen` must be installed in your workspace to run Goose in the background -- You must add the [Coder Login](https://registry.coder.com/modules/coder-login) module to your template - -The `codercom/oss-dogfood:latest` container image can be used for testing on container-based workspaces. - -## Examples - -Your workspace must have `screen` installed to use this. - -### Run in the background and report tasks (Experimental) - -> This functionality is in early access as of Coder v2.21 and is still evolving. -> For now, we recommend testing it in a demo or staging environment, -> rather than deploying to production -> -> Learn more in [the Coder documentation](https://coder.com/docs/tutorials/ai-agents) -> -> Join our [Discord channel](https://discord.gg/coder) or -> [contact us](https://coder.com/contact) to get help or share feedback. - -```tf -module "coder-login" { - count = data.coder_workspace.me.start_count - source = "registry.coder.com/coder/coder-login/coder" - version = "1.0.15" - agent_id = coder_agent.main.id -} - -variable "anthropic_api_key" { - type = string - description = "The Anthropic API key" - sensitive = true -} - -data "coder_parameter" "ai_prompt" { - type = "string" - name = "AI Prompt" - default = "" - description = "Write a prompt for Goose" - mutable = true -} - -# Set the prompt and system prompt for Goose via environment variables -resource "coder_agent" "main" { - # ... - env = { - GOOSE_SYSTEM_PROMPT = <<-EOT - You are a helpful assistant that can help write code. - - Run all long running tasks (e.g. npm run dev) in the background and not in the foreground. - - Periodically check in on background tasks. - - Notify Coder of the status of the task before and after your steps. - EOT - GOOSE_TASK_PROMPT = data.coder_parameter.ai_prompt.value - - # An API key is required for experiment_auto_configure - # See https://block.github.io/goose/docs/getting-started/providers - ANTHROPIC_API_KEY = var.anthropic_api_key # or use a coder_parameter - } -} - -module "goose" { - count = data.coder_workspace.me.start_count - source = "registry.coder.com/coder/goose/coder" - version = "1.0.31" - agent_id = coder_agent.main.id - folder = "/home/coder" - install_goose = true - goose_version = "v1.0.16" - - # Enable experimental features - experiment_report_tasks = true - - # Run Goose in the background - experiment_use_screen = true - - # Avoid configuring Goose manually - experiment_auto_configure = true - - # Required for experiment_auto_configure - experiment_goose_provider = "anthropic" - experiment_goose_model = "claude-3-5-sonnet-latest" -} -``` - -## Run standalone - -Run Goose as a standalone app in your workspace. This will install Goose and run it directly without using screen or any task reporting to the Coder UI. - -```tf -module "goose" { - source = "registry.coder.com/coder/goose/coder" - version = "1.0.31" - agent_id = coder_agent.main.id - folder = "/home/coder" - install_goose = true - goose_version = "v1.0.16" - - # Icon is not available in Coder v2.20 and below, so we'll use a custom icon URL - icon = "https://raw.githubusercontent.com/block/goose/refs/heads/main/ui/desktop/src/images/icon.svg" -} -``` diff --git a/cmd/readmevalidation/testSamples/templates/fail/absoluteIconPath.md b/cmd/readmevalidation/testSamples/templates/fail/absoluteIconPath.md new file mode 100644 index 00000000..879a2a83 --- /dev/null +++ b/cmd/readmevalidation/testSamples/templates/fail/absoluteIconPath.md @@ -0,0 +1,27 @@ +--- +display_name: "Docker Container" +description: "Develop in a container on a Docker host" +icon: "https://github.com/coder/registry/pull/599.jpeg" +verified: true +tags: ["docker", "container"] +supported_os: ["linux", "macos"] +--- + +# Docker Container + +Develop in a Docker container on a remote Docker host. + +```tf +terraform { + required_providers { + coder = { + source = "coder/coder" + version = "~> 1.0" + } + docker = { + source = "kreuzwerker/docker" + version = "~> 3.0" + } + } +} +``` diff --git a/cmd/readmevalidation/testSamples/templates/fail/wrongPathFormat.md b/cmd/readmevalidation/testSamples/templates/fail/wrongPathFormat.md new file mode 100644 index 00000000..7078cfb8 --- /dev/null +++ b/cmd/readmevalidation/testSamples/templates/fail/wrongPathFormat.md @@ -0,0 +1,20 @@ +--- +display_name: "Docker Container" +description: "Develop in a container on a Docker host" +icon: "../../../../.icons/invalid.svg" +verified: true +tags: ["docker", "container"] +supported_os: ["linux", "macos"] +--- + +# Wrong Path + +This should fail validation. + +```tf +module "test" { + source = "registry.coder.com/coder/test/coder" + version = "1.0.0" + agent_id = coder_agent.main.id +} +``` diff --git a/cmd/readmevalidation/testSamples/templates/pass/sampleTemplateReadme.md b/cmd/readmevalidation/testSamples/templates/pass/sampleTemplateReadme.md new file mode 100644 index 00000000..b0db1f26 --- /dev/null +++ b/cmd/readmevalidation/testSamples/templates/pass/sampleTemplateReadme.md @@ -0,0 +1,56 @@ +--- +display_name: "Docker Container" +description: "Develop in a container on a Docker host" +icon: "../../../../.icons/docker.svg" +verified: true +tags: ["docker", "container"] +supported_os: ["linux", "macos"] +--- + +# Docker Container + +Develop in a Docker container on a remote Docker host. + +```tf +terraform { + required_providers { + coder = { + source = "coder/coder" + version = "~> 1.0" + } + docker = { + source = "kreuzwerker/docker" + version = "~> 3.0" + } + } +} + +provider "docker" {} + +provider "coder" {} + +data "coder_workspace" "me" {} + +resource "coder_agent" "main" { + os = "linux" + arch = "amd64" +} + +resource "docker_container" "workspace" { + image = "codercom/enterprise-base:ubuntu" + name = "coder-${data.coder_workspace.me.owner}-${data.coder_workspace.me.name}" + + env = ["CODER_AGENT_TOKEN=${coder_agent.main.token}"] +} +``` + +## Getting Started + +This template creates a Docker container on your Docker host. You'll need: + +- A Docker host accessible from your Coder deployment +- The Docker provider configured with appropriate credentials + +## Customization + +You can customize the container image, resources, and configuration to match your needs. From 82a76de3fcfdc9f8e13d376dbee896097904f66e Mon Sep 17 00:00:00 2001 From: Anis Date: Thu, 8 Jan 2026 16:04:42 +0100 Subject: [PATCH 2/4] add vmware-linux template (#527) ## Description Add Vmware template to coder ## Type of Change - [ ] New module - [x] New template - [ ] Bug fix - [ ] Feature/enhancement - [ ] Documentation - [ ] Other ## Template Information **Path:** `registry/anis/templates/vmware-linux` ## Testing & Validation - [x] Tests pass (`bun test`) - [x] Code formatted (`bun fmt`) - [x] Changes tested locally https://github.com/user-attachments/assets/ffc787a8-4335-4602-a405-c475f0cad62b ## Related Issues Closes #211 /claim #211 --------- Signed-off-by: Anis KHALFALLAH Co-authored-by: DevCats --- .icons/vsphere.svg | 14 + registry/anis/.images/avatar.png | Bin 0 -> 73119 bytes registry/anis/README.md | 12 + .../anis/templates/vmware-linux/README.md | 81 ++++++ .../cloud-init/cloud-config.yaml.tftpl | 56 ++++ registry/anis/templates/vmware-linux/main.tf | 245 ++++++++++++++++++ 6 files changed, 408 insertions(+) create mode 100644 .icons/vsphere.svg create mode 100644 registry/anis/.images/avatar.png create mode 100644 registry/anis/README.md create mode 100644 registry/anis/templates/vmware-linux/README.md create mode 100644 registry/anis/templates/vmware-linux/cloud-init/cloud-config.yaml.tftpl create mode 100644 registry/anis/templates/vmware-linux/main.tf diff --git a/.icons/vsphere.svg b/.icons/vsphere.svg new file mode 100644 index 00000000..e50dd3ca --- /dev/null +++ b/.icons/vsphere.svg @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/registry/anis/.images/avatar.png b/registry/anis/.images/avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..3fb22a10d57ba56de181ed770094a5af8396888c GIT binary patch literal 73119 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
EBMu4{nZf{s&7Tm6yWF$aw;RCk`Qv6 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 Q(TF5kYWk{Ql Date: Thu, 8 Jan 2026 12:11:02 -0600 Subject: [PATCH 3/4] [ImgBot] Optimize images (#641) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Beep boop. Your images are optimized! Your image file size has been reduced 🎉

Details | File | Before | After | Percent reduction | |:--|:--|:--|:--| | /.icons/filebrowser.svg | 5.38kb | 3.08kb | 42.76% | | /.icons/nomad.svg | 0.38kb | 0.26kb | 31.79% | | /.icons/vault.svg | 0.49kb | 0.37kb | 24.31% | | /.icons/proxmox.svg | 12.52kb | 9.49kb | 24.23% | | /.icons/copyparty.svg | 8.28kb | 6.32kb | 23.71% | | /.icons/devcontainers.svg | 0.56kb | 0.44kb | 21.39% | | /.icons/openwebui.svg | 0.29kb | 0.23kb | 19.11% | | /.icons/scaleway.svg | 0.89kb | 0.77kb | 13.80% | | /.icons/perplexica.svg | 0.21kb | 0.19kb | 10.65% | | /.icons/positron.svg | 0.71kb | 0.64kb | 10.18% | | /.icons/azure.svg | 2.05kb | 1.86kb | 9.60% | | /.icons/lxc.svg | 1.22kb | 1.12kb | 8.01% | | /.icons/fleet.svg | 5.57kb | 5.23kb | 6.12% | | /.icons/gateway.svg | 4.20kb | 3.99kb | 4.86% | | /.icons/rustdesk.svg | 1.32kb | 1.26kb | 4.65% | | /.icons/tasks.svg | 0.44kb | 0.42kb | 4.42% | | /.icons/kasmvnc.svg | 0.80kb | 0.77kb | 4.27% | | /.icons/dotfiles.svg | 0.59kb | 0.56kb | 3.83% | | /.icons/vsphere.svg | 1.08kb | 1.04kb | 3.69% | | /.icons/rdp.svg | 4.63kb | 4.47kb | 3.40% | | /.icons/mux.svg | 1.75kb | 1.70kb | 2.46% | | /.icons/aws.svg | 3.22kb | 3.14kb | 2.34% | | /.icons/gemini.svg | 2.76kb | 2.71kb | 2.12% | | /.icons/kiro.svg | 1.21kb | 1.19kb | 1.69% | | /.icons/slack.svg | 1.00kb | 0.98kb | 1.37% | | /.icons/digital-ocean.svg | 0.93kb | 0.92kb | 1.15% | | /.icons/amazon-q.svg | 2.09kb | 2.07kb | 0.98% | | /.icons/akamai.svg | 0.83kb | 0.82kb | 0.94% | | /.icons/auto-dev-server.svg | 4.54kb | 4.49kb | 0.93% | | /.icons/desktop.svg | 0.53kb | 0.52kb | 0.93% | | /.icons/sourcegraph-amp.svg | 0.56kb | 0.56kb | 0.87% | | /.icons/nextflow.svg | 0.68kb | 0.67kb | 0.87% | | /registry/coder/.images/avatar.svg | 0.60kb | 0.59kb | 0.82% | | /.icons/coder.svg | 0.60kb | 0.59kb | 0.82% | | /.icons/electric-plug-emoji.svg | 0.24kb | 0.24kb | 0.81% | | /.icons/hetzner.svg | 5.47kb | 5.43kb | 0.80% | | /.icons/cmux.svg | 17.58kb | 17.46kb | 0.72% | | /.icons/box-emoji.svg | 4.62kb | 4.59kb | 0.66% | | /.icons/openai.svg | 2.89kb | 2.87kb | 0.61% | | /.icons/auggie.svg | 4.78kb | 4.75kb | 0.57% | | /.icons/airflow.svg | 3.24kb | 3.23kb | 0.57% | | /.icons/jetbrains.svg | 0.77kb | 0.76kb | 0.51% | | /.icons/git.svg | 0.78kb | 0.78kb | 0.50% | | /.icons/zed.svg | 0.88kb | 0.88kb | 0.44% | | /.icons/pgadmin.svg | 2.95kb | 2.94kb | 0.40% | | /registry/coder/.images/aws-devcontainer-architecture.svg | 123.63kb | 123.14kb | 0.39% | | /registry/coder/.images/gcp-devcontainer-architecture.svg | 123.63kb | 123.15kb | 0.39% | | /.icons/windsurf.svg | 1.11kb | 1.11kb | 0.35% | | /.icons/opencode.svg | 0.56kb | 0.56kb | 0.35% | | /.icons/folder.svg | 0.28kb | 0.28kb | 0.35% | | /registry/coder-labs/.images/avatar.svg | 3.69kb | 3.68kb | 0.32% | | /.icons/jupyter.svg | 6.50kb | 6.48kb | 0.32% | | /.icons/cloud-devops.svg | 35.08kb | 34.99kb | 0.26% | | /cmd/.icons/docker.svg | 1.14kb | 1.13kb | 0.26% | | /.icons/docker.svg | 1.14kb | 1.13kb | 0.26% | | /.icons/exoscale.svg | 0.42kb | 0.42kb | 0.23% | | /.icons/personalize.svg | 1.89kb | 1.89kb | 0.21% | | /cmd/.icons/goose.svg | 3.07kb | 3.07kb | 0.19% | | /.icons/goose.svg | 3.07kb | 3.07kb | 0.19% | | /.icons/nexus-repository.svg | 26.65kb | 26.60kb | 0.18% | | /.icons/claude.svg | 2.80kb | 2.80kb | 0.14% | | /.icons/kubernetes.svg | 7.54kb | 7.53kb | 0.09% | | /.icons/jfrog.svg | 6.76kb | 6.76kb | 0.04% | | /.icons/aider.svg | 14.16kb | 14.16kb | 0.03% | | /.icons/antigravity.svg | 2,346.99kb | 2,346.81kb | 0.01% | | | | | | | **Total :** | **2,827.25kb** | **2,816.16kb** | **0.39%** |
--- [📝 docs](https://imgbot.net/docs) | [:octocat: repo](https://github.com/imgbot/ImgBot) | [🙋🏾 issues](https://github.com/imgbot/ImgBot/issues) | [🏪 marketplace](https://github.com/marketplace/imgbot) ~Imgbot - Part of [Optimole](https://optimole.com/) family Signed-off-by: ImgBotApp Co-authored-by: ImgBotApp --- .icons/aider.svg | 4 +- .icons/airflow.svg | 19 +- .icons/akamai.svg | 5 +- .icons/amazon-q.svg | 14 +- .icons/antigravity.svg | 3 +- .icons/auggie.svg | 9 +- .icons/auto-dev-server.svg | 5 +- .icons/aws.svg | 14 +- .icons/azure.svg | 24 +- .icons/box-emoji.svg | 28 +-- .icons/claude.svg | 5 +- .icons/cloud-devops.svg | 30 +-- .icons/cmux.svg | 48 +--- .icons/coder.svg | 5 +- .icons/copyparty.svg | 211 +----------------- .icons/desktop.svg | 6 +- .icons/devcontainers.svg | 3 +- .icons/digital-ocean.svg | 11 +- .icons/docker.svg | 4 +- .icons/dotfiles.svg | 11 +- .icons/electric-plug-emoji.svg | 2 +- .icons/exoscale.svg | 2 +- .icons/filebrowser.svg | 148 +----------- .icons/fleet.svg | 61 +---- .icons/folder.svg | 2 +- .icons/gateway.svg | 65 +----- .icons/gemini.svg | 2 +- .icons/git.svg | 4 +- .icons/goose.svg | 5 +- .icons/hetzner.svg | 6 +- .icons/jetbrains.svg | 2 +- .icons/jfrog.svg | 4 +- .icons/jupyter.svg | 15 +- .icons/kasmvnc.svg | 8 +- .icons/kiro.svg | 2 +- .icons/kubernetes.svg | 5 +- .icons/lxc.svg | 22 +- .icons/mux.svg | 6 +- .icons/nextflow.svg | 7 +- .icons/nexus-repository.svg | 6 +- .icons/nomad.svg | 3 +- .icons/openai.svg | 16 +- .icons/opencode.svg | 2 +- .icons/openwebui.svg | 6 +- .icons/perplexica.svg | 9 +- .icons/personalize.svg | 2 +- .icons/pgadmin.svg | 2 +- .icons/positron.svg | 13 +- .icons/proxmox.svg | 138 +----------- .icons/rdp.svg | 36 +-- .icons/rustdesk.svg | 6 +- .icons/scaleway.svg | 3 +- .icons/slack.svg | 7 +- .icons/sourcegraph-amp.svg | 6 +- .icons/tasks.svg | 6 +- .icons/vault.svg | 3 +- .icons/vsphere.svg | 15 +- .icons/windsurf.svg | 4 +- .icons/zed.svg | 4 +- cmd/.icons/docker.svg | 4 +- cmd/.icons/goose.svg | 5 +- registry/coder-labs/.images/avatar.svg | 6 +- registry/coder/.images/avatar.svg | 5 +- .../.images/aws-devcontainer-architecture.svg | 9 +- .../.images/gcp-devcontainer-architecture.svg | 9 +- 65 files changed, 65 insertions(+), 1087 deletions(-) diff --git a/.icons/aider.svg b/.icons/aider.svg index 44e064ff..bb54e1fb 100644 --- a/.icons/aider.svg +++ b/.icons/aider.svg @@ -1,3 +1 @@ - - - \ No newline at end of file + \ No newline at end of file diff --git a/.icons/airflow.svg b/.icons/airflow.svg index 06b18bee..29a32e08 100644 --- a/.icons/airflow.svg +++ b/.icons/airflow.svg @@ -1,18 +1 @@ - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/.icons/akamai.svg b/.icons/akamai.svg index 4af3fe08..d5b778bc 100644 --- a/.icons/akamai.svg +++ b/.icons/akamai.svg @@ -1,4 +1 @@ - - Akamai - - +Akamai \ No newline at end of file diff --git a/.icons/amazon-q.svg b/.icons/amazon-q.svg index 4a9b3262..1c217bdc 100644 --- a/.icons/amazon-q.svg +++ b/.icons/amazon-q.svg @@ -1,13 +1 @@ - - - - - - - - - - - - - + \ No newline at end of file diff --git a/.icons/antigravity.svg b/.icons/antigravity.svg index a046b6b6..54eec2c4 100644 --- a/.icons/antigravity.svg +++ b/.icons/antigravity.svg @@ -1,2 +1 @@ - -Google_Antigravity-logo - brandlogos.net \ No newline at end of file +Google_Antigravity-logo - brandlogos.net \ No newline at end of file diff --git a/.icons/auggie.svg b/.icons/auggie.svg index 590bd5aa..180e1dee 100644 --- a/.icons/auggie.svg +++ b/.icons/auggie.svg @@ -1,8 +1 @@ - - - - - - - - + \ No newline at end of file diff --git a/.icons/auto-dev-server.svg b/.icons/auto-dev-server.svg index f043b56d..aae4a1a5 100644 --- a/.icons/auto-dev-server.svg +++ b/.icons/auto-dev-server.svg @@ -1,4 +1 @@ - - - - + \ No newline at end of file diff --git a/.icons/aws.svg b/.icons/aws.svg index 3244c974..828a8223 100644 --- a/.icons/aws.svg +++ b/.icons/aws.svg @@ -1,13 +1 @@ - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/.icons/azure.svg b/.icons/azure.svg index 645ac663..5e96a718 100644 --- a/.icons/azure.svg +++ b/.icons/azure.svg @@ -1,23 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/.icons/box-emoji.svg b/.icons/box-emoji.svg index a2595599..dc8ed58c 100644 --- a/.icons/box-emoji.svg +++ b/.icons/box-emoji.svg @@ -1,27 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/.icons/claude.svg b/.icons/claude.svg index 998fb0d5..22dcf464 100644 --- a/.icons/claude.svg +++ b/.icons/claude.svg @@ -1,4 +1 @@ - - - - + \ No newline at end of file diff --git a/.icons/cloud-devops.svg b/.icons/cloud-devops.svg index a3b6e82a..659dcc52 100644 --- a/.icons/cloud-devops.svg +++ b/.icons/cloud-devops.svg @@ -1,29 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/.icons/cmux.svg b/.icons/cmux.svg index 95b56bb0..012bff21 100644 --- a/.icons/cmux.svg +++ b/.icons/cmux.svg @@ -1,47 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/.icons/coder.svg b/.icons/coder.svg index 60d7eff6..5db19df6 100644 --- a/.icons/coder.svg +++ b/.icons/coder.svg @@ -1,4 +1 @@ - - - - + \ No newline at end of file diff --git a/.icons/copyparty.svg b/.icons/copyparty.svg index 2c4f0d04..bb8cf89e 100644 --- a/.icons/copyparty.svg +++ b/.icons/copyparty.svg @@ -1,210 +1 @@ - - - copyparty_logo - - - - - - - - - - - - image/svg+xml - - copyparty_logo - github.com/9001/copyparty - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +copyparty_logo \ No newline at end of file diff --git a/.icons/desktop.svg b/.icons/desktop.svg index 77d231ce..2dee883a 100644 --- a/.icons/desktop.svg +++ b/.icons/desktop.svg @@ -1,5 +1 @@ - - - - - + \ No newline at end of file diff --git a/.icons/devcontainers.svg b/.icons/devcontainers.svg index fb0443bd..72c2fc32 100644 --- a/.icons/devcontainers.svg +++ b/.icons/devcontainers.svg @@ -1,2 +1 @@ - -file_type_devcontainer \ No newline at end of file +file_type_devcontainer \ No newline at end of file diff --git a/.icons/digital-ocean.svg b/.icons/digital-ocean.svg index 6f10b237..7a3e8462 100644 --- a/.icons/digital-ocean.svg +++ b/.icons/digital-ocean.svg @@ -1,10 +1 @@ - - - - - - - - - - + \ No newline at end of file diff --git a/.icons/docker.svg b/.icons/docker.svg index 78e549ef..2a174a89 100644 --- a/.icons/docker.svg +++ b/.icons/docker.svg @@ -1,3 +1 @@ - - - + \ No newline at end of file diff --git a/.icons/dotfiles.svg b/.icons/dotfiles.svg index c57ef859..bc582549 100644 --- a/.icons/dotfiles.svg +++ b/.icons/dotfiles.svg @@ -1,10 +1 @@ - - - - - - - - + \ No newline at end of file diff --git a/.icons/electric-plug-emoji.svg b/.icons/electric-plug-emoji.svg index 15743822..d8b03f26 100644 --- a/.icons/electric-plug-emoji.svg +++ b/.icons/electric-plug-emoji.svg @@ -1 +1 @@ -🔌 \ No newline at end of file +🔌 \ No newline at end of file diff --git a/.icons/exoscale.svg b/.icons/exoscale.svg index c56a6154..dc4f8462 100644 --- a/.icons/exoscale.svg +++ b/.icons/exoscale.svg @@ -1 +1 @@ -Artboard 1 \ No newline at end of file +Artboard 1 \ No newline at end of file diff --git a/.icons/filebrowser.svg b/.icons/filebrowser.svg index 5e78eccf..42bcc8db 100644 --- a/.icons/filebrowser.svg +++ b/.icons/filebrowser.svg @@ -1,147 +1 @@ - -image/svg+xml - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/.icons/fleet.svg b/.icons/fleet.svg index ba910eb9..494c2406 100644 --- a/.icons/fleet.svg +++ b/.icons/fleet.svg @@ -1,60 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/.icons/folder.svg b/.icons/folder.svg index b718dea5..1759bfc4 100644 --- a/.icons/folder.svg +++ b/.icons/folder.svg @@ -1 +1 @@ - + \ No newline at end of file diff --git a/.icons/gateway.svg b/.icons/gateway.svg index b68e9490..238b4dda 100644 --- a/.icons/gateway.svg +++ b/.icons/gateway.svg @@ -1,64 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/.icons/gemini.svg b/.icons/gemini.svg index f1cf3575..33a088c1 100644 --- a/.icons/gemini.svg +++ b/.icons/gemini.svg @@ -1 +1 @@ -Gemini \ No newline at end of file +Gemini \ No newline at end of file diff --git a/.icons/git.svg b/.icons/git.svg index ceef1163..831d3100 100644 --- a/.icons/git.svg +++ b/.icons/git.svg @@ -1,3 +1 @@ - - - \ No newline at end of file + \ No newline at end of file diff --git a/.icons/goose.svg b/.icons/goose.svg index cbbe8419..e73ebc35 100644 --- a/.icons/goose.svg +++ b/.icons/goose.svg @@ -1,4 +1 @@ - - - - + \ No newline at end of file diff --git a/.icons/hetzner.svg b/.icons/hetzner.svg index 74bb87c1..24ac242e 100644 --- a/.icons/hetzner.svg +++ b/.icons/hetzner.svg @@ -1,5 +1 @@ - - - - - + \ No newline at end of file diff --git a/.icons/jetbrains.svg b/.icons/jetbrains.svg index b281f962..8a0d73e9 100644 --- a/.icons/jetbrains.svg +++ b/.icons/jetbrains.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/.icons/jfrog.svg b/.icons/jfrog.svg index e137700c..ad0050a3 100644 --- a/.icons/jfrog.svg +++ b/.icons/jfrog.svg @@ -1,3 +1 @@ - - - + \ No newline at end of file diff --git a/.icons/jupyter.svg b/.icons/jupyter.svg index 38350dfe..9beddb14 100644 --- a/.icons/jupyter.svg +++ b/.icons/jupyter.svg @@ -1,14 +1 @@ - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/.icons/kasmvnc.svg b/.icons/kasmvnc.svg index 958f2832..33d25197 100644 --- a/.icons/kasmvnc.svg +++ b/.icons/kasmvnc.svg @@ -1,7 +1 @@ - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/.icons/kiro.svg b/.icons/kiro.svg index e132ead1..823400d2 100644 --- a/.icons/kiro.svg +++ b/.icons/kiro.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/.icons/kubernetes.svg b/.icons/kubernetes.svg index 42bb9229..7f07a7f5 100644 --- a/.icons/kubernetes.svg +++ b/.icons/kubernetes.svg @@ -1,4 +1 @@ - - - - + \ No newline at end of file diff --git a/.icons/lxc.svg b/.icons/lxc.svg index 0e8e118f..13cd5c59 100644 --- a/.icons/lxc.svg +++ b/.icons/lxc.svg @@ -1,21 +1 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/.icons/mux.svg b/.icons/mux.svg index a6ce26f1..3ee3276d 100644 --- a/.icons/mux.svg +++ b/.icons/mux.svg @@ -1,5 +1 @@ - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/.icons/nextflow.svg b/.icons/nextflow.svg index bcc10553..e9a38072 100644 --- a/.icons/nextflow.svg +++ b/.icons/nextflow.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/.icons/nexus-repository.svg b/.icons/nexus-repository.svg index ca135cd5..45a2bf60 100644 --- a/.icons/nexus-repository.svg +++ b/.icons/nexus-repository.svg @@ -1,5 +1 @@ - - - - \ No newline at end of file + \ No newline at end of file diff --git a/.icons/nomad.svg b/.icons/nomad.svg index b4dc91c7..ff7d00d0 100644 --- a/.icons/nomad.svg +++ b/.icons/nomad.svg @@ -1,2 +1 @@ - - + \ No newline at end of file diff --git a/.icons/openai.svg b/.icons/openai.svg index ba36fc2a..ffa802de 100644 --- a/.icons/openai.svg +++ b/.icons/openai.svg @@ -1,15 +1 @@ - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/.icons/opencode.svg b/.icons/opencode.svg index b79c7332..790fbc49 100644 --- a/.icons/opencode.svg +++ b/.icons/opencode.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/.icons/openwebui.svg b/.icons/openwebui.svg index 06f67645..b4ac79b0 100644 --- a/.icons/openwebui.svg +++ b/.icons/openwebui.svg @@ -1,5 +1 @@ - - - - - + \ No newline at end of file diff --git a/.icons/perplexica.svg b/.icons/perplexica.svg index 0b3a85b5..e1e0226f 100644 --- a/.icons/perplexica.svg +++ b/.icons/perplexica.svg @@ -1,8 +1 @@ - - - - - + \ No newline at end of file diff --git a/.icons/personalize.svg b/.icons/personalize.svg index 76bc6780..3e402bc1 100644 --- a/.icons/personalize.svg +++ b/.icons/personalize.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/.icons/pgadmin.svg b/.icons/pgadmin.svg index 9fa5c4d5..f75dee65 100644 --- a/.icons/pgadmin.svg +++ b/.icons/pgadmin.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/.icons/positron.svg b/.icons/positron.svg index 590372e4..6d1282f5 100644 --- a/.icons/positron.svg +++ b/.icons/positron.svg @@ -1,12 +1 @@ - - - - - - - - - - - - + \ No newline at end of file diff --git a/.icons/proxmox.svg b/.icons/proxmox.svg index c18256e2..5758f8c5 100755 --- a/.icons/proxmox.svg +++ b/.icons/proxmox.svg @@ -1,137 +1 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/.icons/rdp.svg b/.icons/rdp.svg index a6722326..1e83ccdf 100644 --- a/.icons/rdp.svg +++ b/.icons/rdp.svg @@ -1,35 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/.icons/rustdesk.svg b/.icons/rustdesk.svg index 6c801233..fdc4e04c 100644 --- a/.icons/rustdesk.svg +++ b/.icons/rustdesk.svg @@ -1,5 +1 @@ - - - - - + \ No newline at end of file diff --git a/.icons/scaleway.svg b/.icons/scaleway.svg index ebe1ddf2..488c90c1 100644 --- a/.icons/scaleway.svg +++ b/.icons/scaleway.svg @@ -1,2 +1 @@ - -Scaleway icon \ No newline at end of file +Scaleway icon \ No newline at end of file diff --git a/.icons/slack.svg b/.icons/slack.svg index fb55f724..1f9731dd 100644 --- a/.icons/slack.svg +++ b/.icons/slack.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/.icons/sourcegraph-amp.svg b/.icons/sourcegraph-amp.svg index 83777bd2..5466803a 100644 --- a/.icons/sourcegraph-amp.svg +++ b/.icons/sourcegraph-amp.svg @@ -1,5 +1 @@ - - - - - + \ No newline at end of file diff --git a/.icons/tasks.svg b/.icons/tasks.svg index 67088c42..0ab7ea7f 100644 --- a/.icons/tasks.svg +++ b/.icons/tasks.svg @@ -1,5 +1 @@ - - - - - + \ No newline at end of file diff --git a/.icons/vault.svg b/.icons/vault.svg index c90525cd..d9c882a1 100644 --- a/.icons/vault.svg +++ b/.icons/vault.svg @@ -1,2 +1 @@ - - \ No newline at end of file + \ No newline at end of file diff --git a/.icons/vsphere.svg b/.icons/vsphere.svg index e50dd3ca..dd94f13d 100644 --- a/.icons/vsphere.svg +++ b/.icons/vsphere.svg @@ -1,14 +1 @@ - - - - - - - - + \ No newline at end of file diff --git a/.icons/windsurf.svg b/.icons/windsurf.svg index 2e4e4e49..f8164466 100644 --- a/.icons/windsurf.svg +++ b/.icons/windsurf.svg @@ -1,3 +1 @@ - - - + \ No newline at end of file diff --git a/.icons/zed.svg b/.icons/zed.svg index 06b5c183..d5910ecc 100644 --- a/.icons/zed.svg +++ b/.icons/zed.svg @@ -1,3 +1 @@ - - - + \ No newline at end of file diff --git a/cmd/.icons/docker.svg b/cmd/.icons/docker.svg index 78e549ef..2a174a89 100644 --- a/cmd/.icons/docker.svg +++ b/cmd/.icons/docker.svg @@ -1,3 +1 @@ - - - + \ No newline at end of file diff --git a/cmd/.icons/goose.svg b/cmd/.icons/goose.svg index cbbe8419..e73ebc35 100644 --- a/cmd/.icons/goose.svg +++ b/cmd/.icons/goose.svg @@ -1,4 +1 @@ - - - - + \ No newline at end of file diff --git a/registry/coder-labs/.images/avatar.svg b/registry/coder-labs/.images/avatar.svg index 8040fb06..676ccbf4 100644 --- a/registry/coder-labs/.images/avatar.svg +++ b/registry/coder-labs/.images/avatar.svg @@ -1,5 +1 @@ - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/registry/coder/.images/avatar.svg b/registry/coder/.images/avatar.svg index 60d7eff6..5db19df6 100644 --- a/registry/coder/.images/avatar.svg +++ b/registry/coder/.images/avatar.svg @@ -1,4 +1 @@ - - - - + \ No newline at end of file diff --git a/registry/coder/.images/aws-devcontainer-architecture.svg b/registry/coder/.images/aws-devcontainer-architecture.svg index be66c3f1..c9673a37 100644 --- a/registry/coder/.images/aws-devcontainer-architecture.svg +++ b/registry/coder/.images/aws-devcontainer-architecture.svg @@ -1,8 +1 @@ -AWSAWSHostingHostingVirtual MachineVirtual MachineLinux HardwareLinux HardwareCoder WorkspaceCoder WorkspaceDevcontainerDevcontainerenvbuilder created filesystemenvbuilder created filesystemA Clone of your repoA Clone of your repoSource codeSource codeLanguagesLanguagesPython. Go, etcPython. Go, etcToolingToolingExtensions, linting, formatting, etcExtensions, linting, formatting, etcCPUsCPUsDisk StorageDisk StorageCode EditorCode EditorVS Code DesktopVS Code DesktopLocal InstallationLocal InstallationVS Code DesktopVS Code DesktopLocal InstallationLocal Installationcode-servercode-serverA web IDEA web IDEJetBrains GatewayJetBrains GatewayLocal InstallationLocal InstallationCommand LineCommand LineSSH via Coder CLISSH via Coder CLI \ No newline at end of file +AWSAWSHostingHostingVirtual MachineVirtual MachineLinux HardwareLinux HardwareCoder WorkspaceCoder WorkspaceDevcontainerDevcontainerenvbuilder created filesystemenvbuilder created filesystemA Clone of your repoA Clone of your repoSource codeSource codeLanguagesLanguagesPython. Go, etcPython. Go, etcToolingToolingExtensions, linting, formatting, etcExtensions, linting, formatting, etcCPUsCPUsDisk StorageDisk StorageCode EditorCode EditorVS Code DesktopVS Code DesktopLocal InstallationLocal InstallationVS Code DesktopVS Code DesktopLocal InstallationLocal Installationcode-servercode-serverA web IDEA web IDEJetBrains GatewayJetBrains GatewayLocal InstallationLocal InstallationCommand LineCommand LineSSH via Coder CLISSH via Coder CLI \ No newline at end of file diff --git a/registry/coder/.images/gcp-devcontainer-architecture.svg b/registry/coder/.images/gcp-devcontainer-architecture.svg index c3dfd645..a53d48a7 100644 --- a/registry/coder/.images/gcp-devcontainer-architecture.svg +++ b/registry/coder/.images/gcp-devcontainer-architecture.svg @@ -1,8 +1 @@ -GCPGCPHostingHostingVirtual MachineVirtual MachineLinux HardwareLinux HardwareCoder WorkspaceCoder WorkspaceDevcontainerDevcontainerenvbuilder created filesystemenvbuilder created filesystemA Clone of your repoA Clone of your repoSource codeSource codeLanguagesLanguagesPython. Go, etcPython. Go, etcToolingToolingExtensions, linting, formatting, etcExtensions, linting, formatting, etcCPUsCPUsDisk StorageDisk StorageCode EditorCode EditorVS Code DesktopVS Code DesktopLocal InstallationLocal InstallationVS Code DesktopVS Code DesktopLocal InstallationLocal Installationcode-servercode-serverA web IDEA web IDEJetBrains GatewayJetBrains GatewayLocal InstallationLocal InstallationCommand LineCommand LineSSH via Coder CLISSH via Coder CLI \ No newline at end of file +GCPGCPHostingHostingVirtual MachineVirtual MachineLinux HardwareLinux HardwareCoder WorkspaceCoder WorkspaceDevcontainerDevcontainerenvbuilder created filesystemenvbuilder created filesystemA Clone of your repoA Clone of your repoSource codeSource codeLanguagesLanguagesPython. Go, etcPython. Go, etcToolingToolingExtensions, linting, formatting, etcExtensions, linting, formatting, etcCPUsCPUsDisk StorageDisk StorageCode EditorCode EditorVS Code DesktopVS Code DesktopLocal InstallationLocal InstallationVS Code DesktopVS Code DesktopLocal InstallationLocal Installationcode-servercode-serverA web IDEA web IDEJetBrains GatewayJetBrains GatewayLocal InstallationLocal InstallationCommand LineCommand LineSSH via Coder CLISSH via Coder CLI \ No newline at end of file From 8aa54bbee3eaf387dc6c31cb91c0589b88e5a234 Mon Sep 17 00:00:00 2001 From: Yevhenii Shcherbina Date: Thu, 8 Jan 2026 13:29:11 -0500 Subject: [PATCH 4/4] feat: move boundary configuration to file (#640) This pull request updates the `claude-code` module to version 4.3.0 and significantly simplifies the configuration and startup logic for the Boundary integration. The changes remove several Boundary-related configuration variables and options, streamlining both Terraform and shell script code. The documentation is updated to reflect these changes and the new version. **Boundary integration simplification:** * Removed multiple Boundary-related variables from `main.tf`, including log directory, log level, additional allowed URLs, proxy port, and pprof options, as well as their usage in the module and test files. (`registry/coder/modules/claude-code/main.tf` [[1]](diffhunk://#diff-e7adc2da34facfd5d16deb23876fca7ae4cb11c8a68a0cfbe37a044bb69932f0L213-L248) [[2]](diffhunk://#diff-e7adc2da34facfd5d16deb23876fca7ae4cb11c8a68a0cfbe37a044bb69932f0L377-L382); `registry/coder/modules/claude-code/main.tftest.hcl` [[3]](diffhunk://#diff-46ca9cfb5cdd077a9c42f7f62ab3f45583196a05edc29838eda0c6bd0ea63edcL198-L210) * Updated the Boundary startup logic in `start.sh` to remove handling and passing of the eliminated variables, resulting in a simpler and more maintainable script. (`registry/coder/modules/claude-code/scripts/start.sh` [[1]](diffhunk://#diff-decfa0cea699ba8bf5e89b60ee677c361d2e9cc8b4792ed54ac1da66b4bd9315L19-L23) [[2]](diffhunk://#diff-decfa0cea699ba8bf5e89b60ee677c361d2e9cc8b4792ed54ac1da66b4bd9315L39-L41) [[3]](diffhunk://#diff-decfa0cea699ba8bf5e89b60ee677c361d2e9cc8b4792ed54ac1da66b4bd9315L232-L260) **Documentation updates:** * Updated all usage examples in `README.md` to reference version 4.3.0 and reflect the new, simplified Boundary configuration. (`registry/coder/modules/claude-code/README.md` [[1]](diffhunk://#diff-3f433388cb775dcc77c38911e23acbd2eb64e26e26c25d46b045724dfe5136bbL16-R16) [[2]](diffhunk://#diff-3f433388cb775dcc77c38911e23acbd2eb64e26e26c25d46b045724dfe5136bbL48-R52) [[3]](diffhunk://#diff-3f433388cb775dcc77c38911e23acbd2eb64e26e26c25d46b045724dfe5136bbL75-R71) [[4]](diffhunk://#diff-3f433388cb775dcc77c38911e23acbd2eb64e26e26c25d46b045724dfe5136bbL111-R107) [[5]](diffhunk://#diff-3f433388cb775dcc77c38911e23acbd2eb64e26e26c25d46b045724dfe5136bbL133-R129) [[6]](diffhunk://#diff-3f433388cb775dcc77c38911e23acbd2eb64e26e26c25d46b045724dfe5136bbL206-R202) [[7]](diffhunk://#diff-3f433388cb775dcc77c38911e23acbd2eb64e26e26c25d46b045724dfe5136bbL263-R259) **Version bump:** * Bumped the module version from 4.2.9 to 4.3.0 throughout all documentation and configuration examples. (`registry/coder/modules/claude-code/README.md` [[1]](diffhunk://#diff-3f433388cb775dcc77c38911e23acbd2eb64e26e26c25d46b045724dfe5136bbL16-R16) [[2]](diffhunk://#diff-3f433388cb775dcc77c38911e23acbd2eb64e26e26c25d46b045724dfe5136bbL48-R52) [[3]](diffhunk://#diff-3f433388cb775dcc77c38911e23acbd2eb64e26e26c25d46b045724dfe5136bbL75-R71) [[4]](diffhunk://#diff-3f433388cb775dcc77c38911e23acbd2eb64e26e26c25d46b045724dfe5136bbL111-R107) [[5]](diffhunk://#diff-3f433388cb775dcc77c38911e23acbd2eb64e26e26c25d46b045724dfe5136bbL133-R129) [[6]](diffhunk://#diff-3f433388cb775dcc77c38911e23acbd2eb64e26e26c25d46b045724dfe5136bbL206-R202) [[7]](diffhunk://#diff-3f433388cb775dcc77c38911e23acbd2eb64e26e26c25d46b045724dfe5136bbL263-R259) --------- Co-authored-by: DevCats --- registry/coder/modules/claude-code/README.md | 28 ++++++------- registry/coder/modules/claude-code/main.tf | 42 ------------------- .../coder/modules/claude-code/main.tftest.hcl | 12 ++---- .../modules/claude-code/scripts/start.sh | 32 -------------- 4 files changed, 15 insertions(+), 99 deletions(-) diff --git a/registry/coder/modules/claude-code/README.md b/registry/coder/modules/claude-code/README.md index 9a9c062f..c0004504 100644 --- a/registry/coder/modules/claude-code/README.md +++ b/registry/coder/modules/claude-code/README.md @@ -13,7 +13,7 @@ Run the [Claude Code](https://docs.anthropic.com/en/docs/agents-and-tools/claude ```tf module "claude-code" { source = "registry.coder.com/coder/claude-code/coder" - version = "4.2.9" + version = "4.3.0" agent_id = coder_agent.main.id workdir = "/home/coder/project" claude_api_key = "xxxx-xxxxx-xxxx" @@ -44,16 +44,12 @@ This example shows how to configure the Claude Code module to run the agent behi ```tf module "claude-code" { - source = "dev.registry.coder.com/coder/claude-code/coder" - version = "4.2.9" - agent_id = coder_agent.main.id - workdir = "/home/coder/project" - enable_boundary = true - boundary_version = "main" - boundary_log_dir = "/tmp/boundary_logs" - boundary_log_level = "WARN" - boundary_additional_allowed_urls = ["GET *google.com"] - boundary_proxy_port = "8087" + source = "dev.registry.coder.com/coder/claude-code/coder" + version = "4.3.0" + agent_id = coder_agent.main.id + workdir = "/home/coder/project" + enable_boundary = true + boundary_version = "v0.5.1" } ``` @@ -72,7 +68,7 @@ data "coder_parameter" "ai_prompt" { module "claude-code" { source = "registry.coder.com/coder/claude-code/coder" - version = "4.2.9" + version = "4.3.0" agent_id = coder_agent.main.id workdir = "/home/coder/project" @@ -108,7 +104,7 @@ Run and configure Claude Code as a standalone CLI in your workspace. ```tf module "claude-code" { source = "registry.coder.com/coder/claude-code/coder" - version = "4.2.9" + version = "4.3.0" agent_id = coder_agent.main.id workdir = "/home/coder/project" install_claude_code = true @@ -130,7 +126,7 @@ variable "claude_code_oauth_token" { module "claude-code" { source = "registry.coder.com/coder/claude-code/coder" - version = "4.2.9" + version = "4.3.0" agent_id = coder_agent.main.id workdir = "/home/coder/project" claude_code_oauth_token = var.claude_code_oauth_token @@ -203,7 +199,7 @@ resource "coder_env" "bedrock_api_key" { module "claude-code" { source = "registry.coder.com/coder/claude-code/coder" - version = "4.2.9" + version = "4.3.0" agent_id = coder_agent.main.id workdir = "/home/coder/project" model = "global.anthropic.claude-sonnet-4-5-20250929-v1:0" @@ -260,7 +256,7 @@ resource "coder_env" "google_application_credentials" { module "claude-code" { source = "registry.coder.com/coder/claude-code/coder" - version = "4.2.9" + version = "4.3.0" agent_id = coder_agent.main.id workdir = "/home/coder/project" model = "claude-sonnet-4@20250514" diff --git a/registry/coder/modules/claude-code/main.tf b/registry/coder/modules/claude-code/main.tf index bd160ded..62f24c36 100644 --- a/registry/coder/modules/claude-code/main.tf +++ b/registry/coder/modules/claude-code/main.tf @@ -210,42 +210,6 @@ variable "boundary_version" { default = "main" } -variable "boundary_log_dir" { - type = string - description = "Directory for boundary logs" - default = "/tmp/boundary_logs" -} - -variable "boundary_log_level" { - type = string - description = "Log level for boundary process" - default = "WARN" -} - -variable "boundary_additional_allowed_urls" { - type = list(string) - description = "Additional URLs to allow through boundary (in addition to default allowed URLs)" - default = [] -} - -variable "boundary_proxy_port" { - type = string - description = "Port for HTTP Proxy used by Boundary" - default = "8087" -} - -variable "enable_boundary_pprof" { - type = bool - description = "Whether to enable coder boundary pprof server" - default = false -} - -variable "boundary_pprof_port" { - type = string - description = "Port for pprof server used by Boundary" - default = "6067" -} - variable "compile_boundary_from_source" { type = bool description = "Whether to compile boundary from source instead of using the official install script" @@ -374,12 +338,6 @@ module "agentapi" { ARG_REPORT_TASKS='${var.report_tasks}' \ ARG_ENABLE_BOUNDARY='${var.enable_boundary}' \ ARG_BOUNDARY_VERSION='${var.boundary_version}' \ - ARG_BOUNDARY_LOG_DIR='${var.boundary_log_dir}' \ - ARG_BOUNDARY_LOG_LEVEL='${var.boundary_log_level}' \ - ARG_BOUNDARY_ADDITIONAL_ALLOWED_URLS='${join("|", var.boundary_additional_allowed_urls)}' \ - ARG_BOUNDARY_PROXY_PORT='${var.boundary_proxy_port}' \ - ARG_ENABLE_BOUNDARY_PPROF='${var.enable_boundary_pprof}' \ - ARG_BOUNDARY_PPROF_PORT='${var.boundary_pprof_port}' \ ARG_COMPILE_FROM_SOURCE='${var.compile_boundary_from_source}' \ ARG_CODER_HOST='${local.coder_host}' \ /tmp/start.sh diff --git a/registry/coder/modules/claude-code/main.tftest.hcl b/registry/coder/modules/claude-code/main.tftest.hcl index adfca6d2..dd9e66a6 100644 --- a/registry/coder/modules/claude-code/main.tftest.hcl +++ b/registry/coder/modules/claude-code/main.tftest.hcl @@ -192,10 +192,9 @@ run "test_claude_code_with_boundary" { command = plan variables { - agent_id = "test-agent-boundary" - workdir = "/home/coder/boundary-test" - enable_boundary = true - boundary_log_dir = "/tmp/test-boundary-logs" + agent_id = "test-agent-boundary" + workdir = "/home/coder/boundary-test" + enable_boundary = true } assert { @@ -203,11 +202,6 @@ run "test_claude_code_with_boundary" { error_message = "Boundary should be enabled" } - assert { - condition = var.boundary_log_dir == "/tmp/test-boundary-logs" - error_message = "Boundary log dir should be set correctly" - } - assert { condition = local.coder_host != "" error_message = "Coder host should be extracted from access URL" diff --git a/registry/coder/modules/claude-code/scripts/start.sh b/registry/coder/modules/claude-code/scripts/start.sh index 061dce67..e14b26a6 100644 --- a/registry/coder/modules/claude-code/scripts/start.sh +++ b/registry/coder/modules/claude-code/scripts/start.sh @@ -16,11 +16,6 @@ ARG_AI_PROMPT=$(echo -n "${ARG_AI_PROMPT:-}" | base64 -d) ARG_REPORT_TASKS=${ARG_REPORT_TASKS:-true} ARG_ENABLE_BOUNDARY=${ARG_ENABLE_BOUNDARY:-false} ARG_BOUNDARY_VERSION=${ARG_BOUNDARY_VERSION:-"main"} -ARG_BOUNDARY_LOG_DIR=${ARG_BOUNDARY_LOG_DIR:-"/tmp/boundary_logs"} -ARG_BOUNDARY_LOG_LEVEL=${ARG_BOUNDARY_LOG_LEVEL:-"WARN"} -ARG_BOUNDARY_PROXY_PORT=${ARG_BOUNDARY_PROXY_PORT:-"8087"} -ARG_ENABLE_BOUNDARY_PPROF=${ARG_ENABLE_BOUNDARY_PPROF:-false} -ARG_BOUNDARY_PPROF_PORT=${ARG_BOUNDARY_PPROF_PORT:-"6067"} ARG_COMPILE_FROM_SOURCE=${ARG_COMPILE_FROM_SOURCE:-false} ARG_CODER_HOST=${ARG_CODER_HOST:-} @@ -36,9 +31,6 @@ printf "ARG_WORKDIR: %s\n" "$ARG_WORKDIR" printf "ARG_REPORT_TASKS: %s\n" "$ARG_REPORT_TASKS" printf "ARG_ENABLE_BOUNDARY: %s\n" "$ARG_ENABLE_BOUNDARY" printf "ARG_BOUNDARY_VERSION: %s\n" "$ARG_BOUNDARY_VERSION" -printf "ARG_BOUNDARY_LOG_DIR: %s\n" "$ARG_BOUNDARY_LOG_DIR" -printf "ARG_BOUNDARY_LOG_LEVEL: %s\n" "$ARG_BOUNDARY_LOG_LEVEL" -printf "ARG_BOUNDARY_PROXY_PORT: %s\n" "$ARG_BOUNDARY_PROXY_PORT" printf "ARG_COMPILE_FROM_SOURCE: %s\n" "$ARG_COMPILE_FROM_SOURCE" printf "ARG_CODER_HOST: %s\n" "$ARG_CODER_HOST" @@ -229,35 +221,11 @@ function start_agentapi() { if [ "${ARG_ENABLE_BOUNDARY:-false}" = "true" ]; then install_boundary - mkdir -p "$ARG_BOUNDARY_LOG_DIR" printf "Starting with coder boundary enabled\n" - # Build boundary args with conditional --unprivileged flag - BOUNDARY_ARGS=(--log-dir "$ARG_BOUNDARY_LOG_DIR") # Add default allowed URLs BOUNDARY_ARGS+=(--allow "domain=anthropic.com" --allow "domain=registry.npmjs.org" --allow "domain=sentry.io" --allow "domain=claude.ai" --allow "domain=$ARG_CODER_HOST") - # Add any additional allowed URLs from the variable - if [ -n "$ARG_BOUNDARY_ADDITIONAL_ALLOWED_URLS" ]; then - IFS='|' read -ra ADDITIONAL_URLS <<< "$ARG_BOUNDARY_ADDITIONAL_ALLOWED_URLS" - for url in "${ADDITIONAL_URLS[@]}"; do - # Quote the URL to preserve spaces within the allow rule - BOUNDARY_ARGS+=(--allow "$url") - done - fi - - # Set HTTP Proxy port used by Boundary - BOUNDARY_ARGS+=(--proxy-port "$ARG_BOUNDARY_PROXY_PORT") - - # Set log level for boundary - BOUNDARY_ARGS+=(--log-level "$ARG_BOUNDARY_LOG_LEVEL") - - if [ "${ARG_ENABLE_BOUNDARY_PPROF:-false}" = "true" ]; then - # Enable boundary pprof server on specified port - BOUNDARY_ARGS+=(--pprof) - BOUNDARY_ARGS+=(--pprof-port "$ARG_BOUNDARY_PPROF_PORT") - fi - agentapi server --type claude --term-width 67 --term-height 1190 -- \ boundary-run "${BOUNDARY_ARGS[@]}" -- \ claude "${ARGS[@]}"