## Changelog

### BREAKING CHANGES

- Remove prometheus-http port declaration from coderd service spec (#12214) (@johnstcn)
- Provisioners: only allow untagged provisioners to pick up untagged jobs (#12269) (@johnstcn)

### Features

#### Templates

- `coder_script` can to add binaries and files to `PATH` with a bin directory (#12205) (@mafredri)
- Add support for marking external auth providers as optional (#12021) (#12251) (@aslilac)
  > This is done via a [Terraform property](https://registry.terraform.io/providers/coder/coder/latest/docs/data-sources/external_auth#optional) in the template.
- Support custom order of agent metadata (#12066) (@mtojek)
- Support `order` property of `coder_app` resource (#12077) (@mtojek)
- Support `order` property of `coder_agent` (#12121) (@mtojek)
- Support custom validation errors for number-typed parameters (#12224) (@mtojek)

#### CLI

- Support `--header` and `--header-command` in config-ssh (#10413) (@JoshVee)
- Make URL optional for `coder login` (#10925) (#12466) (@elasticspoon)

#### Dashboard

- Add activity status and autostop reason to workspace overview (#11987) (@aslilac)
  ![Autostop Cause Display](https://raw.githubusercontent.com/coder/coder/main/docs/changelogs/images/autostop-visibility.png)
- Support any file extension in the template editor (#12000) (@BrunoQuaresma)
- Support creating templates from scratch (#12082) (@BrunoQuaresma)
- Show previous agent scripts logs (#12233) (@BrunoQuaresma)
- Show build logs on template creation (#12271) (@BrunoQuaresma)
- Support zip archives for template files (#12323) (@BrunoQuaresma)
- Show client errors in DERP Region health page (#12318) (@BrunoQuaresma)
- Display error messages on ws and access url health pages (#12430)
  (@BrunoQuaresma)
- Warn users if they leave the template editor without publishing (#12406) (@BrunoQuaresma)
- Add Confluence, NET, and MS Teams icons as static files (#12500) (#12512) (#12513) (@michaelbrewer)
- Render markdown in template update messages (#12273) (@aslilac)

#### Backend

- Expose DERP server debug metrics (#12135) (@spikecurtis)
- Add logSender for sending logs on agent v2 API (#12046) (@spikecurtis)
- Clean up organization handling (#12142) (#12143) (#12146) (@Emyrk)
- Change agent to use v2 API for reporting stats (#12024) (@spikecurtis)
- Send log limit exceeded in response, not error (#12078) (@spikecurtis)
- Add template activity_bump property (#11734) (@deansheather)
  ![Activity Bump](https://raw.githubusercontent.com/coder/coder/main/docs/changelogs/images/activity-bump.png)
- Add WaitUntilEmpty to LogSender (#12159) (@spikecurtis)
- Disable directory listings for static files (#12229) (@Emyrk)
- Switch agent to use v2 API for sending logs (#12068) (@spikecurtis)
- Use v2 API for agent lifecycle updates (#12278) (@spikecurtis)
- Use v2 API for agent metadata updates (#12281) (@spikecurtis)
- Show tailnet peer diagnostics after coder ping (#12314) (@spikecurtis)
- Add derp mesh health checking in workspace proxies (#12222) (@deansheather)
- Make agent stats' cardinality configurable (#12468) (@dannykopping)
- Server: Set sane default for gitea external auth (#12306) (@Emyrk)
- Server: Enable Prometheus endpoint for external provisioner (#12320) (@mtojek)
- Implement provisioner auth middleware and proper org params (#12330) (@Emyrk)

### Experimental features

The following features are hidden or disabled by default as we don't guarantee stability. Learn more about experiments in [our documentation](https://coder.com/docs/v2/latest/contributing/feature-stages#experimental-features).

- The `coder support` command generates a ZIP with deployment information, agent logs, and server config values for troubleshooting purposes. We will publish documentation on how it works (and un-hide the feature) in a future release (#12328) (@johnstcn)
- Port sharing: Allow users to share ports running in their workspace with other Coder users (#11939) (#12119) (#12383) (@deansheather) (@f0ssel)
  ![Port Sharing](https://raw.githubusercontent.com/coder/coder/main/docs/changelogs/images/sharable-ports.png)

### Bug fixes

- SSH: Allow scp to exit with zero status (#12028) (@mafredri)
- Web Terminal: Fix screen startup speed by disabling messages (#12190) (@mafredri)
- CLI: Avoid panic when external auth name isn't provided (#12177) (@coadler)
- CLI: Do not screenshot with `coder scaletest` if verbose=false (#12317) (@johnstcn)
- CLI: Generate correctly named file in DumpHandler (#12409) (@mafredri)
- CLI: Don't error on required flags with `--help` (#12181) (@coadler)
- Server: Do not redirect /healthz (#12080) (@johnstcn)
- SSH: Prevent reads/writes to stdin/stdout in stdio mode (#12045) (@mafredri)
- Server: Mark provisioner daemon psk as secret (#12322) (@johnstcn)
- Server: Use database.IsQueryCanceledError instead of xerrors.Is(err, context.Canceled) (#12325) (@johnstcn)
- Server: Pass block endpoints into servertailnet (#12149) (@coadler)
- Server: Prevent nil err deref (#12475) (@johnstcn)
- Server: Correctly handle tar dir entries with missing path separator (#12479) (@johnstcn)
- codersdk: Correctly log coordination error (#12176) (@coadler)
- Server: Add ability to synchronize with startup script via done file (#12058) (@mafredri)
- Server: Check provisionerd API version on connection (#12191) (@johnstcn)
- Dashboard: Print API backend calls for e2e tests (#12051) (@mtojek)
- Dashboard: Enable submit when auto start and stop are both disabled (#12055) (@BrunoQuaresma)
- Dashboard: Fix infinite loading when template has no previous version (#12059) (@BrunoQuaresma)
- Dashboard: Ignore fileInfo if file is missing (#12154) (@mtojek)
- Dashboard: Match activity bump text with template settings (#12170) (@BrunoQuaresma)
- Dashboard: Fix language detection for Dockerfile (#12188) (@BrunoQuaresma)
- Dashboard: Fix parameters field size (#12231) (@BrunoQuaresma)
- Dashboard: Fix bottom overflow on web terminal (#12228) (@BrunoQuaresma)
- Dashboard: Fix error when typing long number on ttl (#12249) (@BrunoQuaresma)
- Dashboard: Fix form layout for tablet viewports (#12369) (@BrunoQuaresma)
- Dashboard: Retry and debug passing build parameters options (#12384) (@BrunoQuaresma)
- Dashboard: Fix terminal size when displaying alerts (#12444) (@BrunoQuaresma)
- Dashboard: TemplateVersionEditor: allow triggering builds on non-dirtied template version (#12547) (@johnstcn)
- Dashboard: Warn when user leaves template editor with un-built changes (#12548) (@johnstcn)
- Tailnet: Enforce valid agent and client addresses (#12197) (@coadler)
- Server: Copy app ID in healthcheck (#12087) (@deansheather)
- Dashboard: Allow access to unhealthy/initializing apps (#12086) (@deansheather)
- Server: Do not query user_link for deleted accounts (#12112) (@Emyrk)
- Tailnet: Set node callback each time we reinit the coordinator in servertailnet (#12140) (@spikecurtis)
- Tailnet: Change servertailnet to register the DERP dialer before setting DERP map (#12137) (@spikecurtis)
- Server: Fix pgcoord to delete coordinator row last (#12155) (@spikecurtis)
- Dashboard: Improve clipboard support on HTTP connections and older browsers (#12178) (@Parkreiner)
- Server: Add postgres triggers to remove deleted users from user_links (#12117) (@Emyrk)
- Dashboard: Add tests and improve accessibility for useClickable (#12218) (@Parkreiner)
- Server: Ignore surronding whitespace for cli config (#12250) (@Emyrk)
- Tailnet: Stop waiting for Agent in a goroutine in ssh test (#12268) (@spikecurtis)
- d4d8424ce fix: fix GetOrganizationsByUserID error when multiple organizations exist (#12257) (@Emyrk)
- Server: Refresh entitlements after creating first user (#12285) (@mtojek)
- Server: Use default org over index [0] for new scim (#12284) (@Emyrk)
- Server: Avoid race between replicas on start (#12344) (@deansheather)
- Server: Use flag to enable Prometheus (#12345) (@mtojek)
- Dashboard: Increase license key rows (#12352) (@kylecarbs)
- Server: External auth device flow, check both queries for errors (#12367) (@Emyrk)
- Dashboard: Add service banner to workspace page (#12381) (@michaelbrewer)
- SDK: Always return count of workspaces (#12407) (@mtojek)
- SDK: Improve pagination parser (#12422) (@mtojek)
- SDK: Use timestamptz instead of timestamp (#12425) (@mtojek)
- Dashboard: Ensure auto-workspace creation waits until all parameters are ready (#12419) (@Parkreiner)
- CLI: Ensure ssh cleanup happens on cmd error (@spikecurtis)
- Dashboard: Display tooltip when selection is disabled (#12439) (@f0ssel)
- Server: Add `--block-direct-connections` to wsproxies (#12182) (@coadler)
- Examples: Fix directory for devcontainer-docker template (#12453) (@alv67)
- Dashboard: Make public menu item selectable (#12484) (@f0ssel)
- Server: Stop holding Pubsub mutex while calling pq.Listener (#12518) (@spikecurtis)

### Documentation

- Fix /audit & /insights params (#12043) (@ericpaulsen)
- Fix jetbrains reconnect faq (#12073) (@ericpaulsen)
- Update modules documentation (#11911) (@matifali)
- Add kubevirt coder template in list of community templates (#12113) (@sulo1337)
- Describe resource ordering in UI (#12185) (@mtojek)
- Simplify docker installation docs (#12187) (@matifali)
- Fix header font (#12193) (@mtojek)
- Document Terraform variables (#12270) (@mtojek)
- Add steps for postgres server verification (#12072) (@ericpaulsen)
- Add gitlab self-managed example (#12295) (@michaelbrewer)
- Add k8s security reference (#12334) (@ericpaulsen)
- Simplify install docs (#11946) (@bpmct)

Compare: [`v2.8.5...v2.9.0`](https://github.com/coder/coder/compare/v2.8.5...v2.9.0)

## Container image

- `docker pull ghcr.io/coder/coder:v2.9.0`

## Install/upgrade

Refer to our docs to [install](https://coder.com/docs/v2/latest/install) or [upgrade](https://coder.com/docs/v2/latest/admin/upgrade) Coder, or use a release asset below.
