Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
559b96d
WPB-23789: Wrap Galley updateLocalConversation (#5075)
blackheaven Mar 3, 2026
cff9ed8
WPB-23789: Split `performAction` in Galley (#5081)
blackheaven Mar 3, 2026
c2eb9ee
WPB-23789: Remove redundant constraints in Galley/Action (#5084)
blackheaven Mar 4, 2026
c47fb77
wire-subsystems: Make mock for UserSubsystem depend on UserStore (#5078)
akshaymankar Mar 4, 2026
a1b9819
[WPB-22549] Add curl to integration test failure reports. (#5048)
fisx Mar 4, 2026
44b15e1
Group ID parse error (#5089)
pcapriotti Mar 5, 2026
d14dee3
Makefile: Fix ci-safe target (#5090)
akshaymankar Mar 5, 2026
4008a8f
Move reading/writing of User passwords to UserStore (#5079)
akshaymankar Mar 5, 2026
505506f
background-worker: Remove unnecessary interpretation of user store (#…
akshaymankar Mar 5, 2026
8e3582f
Wire.PostgresMigrationOpts: remove unnecessary -ffrorce-recomp (#5093)
akshaymankar Mar 5, 2026
6d3849a
WPB-23896: Handle blockers and high warnings (#5096)
blackheaven Mar 6, 2026
dab5014
Suppress "user keyspace" warning in cassandra logs (#5083)
battermann Mar 6, 2026
3828059
Merge pull request #5099 from wireapp/master
stefanwire Mar 6, 2026
3e6fbb9
WPB-23789: Introduce type class for Galley/Action (#5086)
blackheaven Mar 6, 2026
f331271
WPB-23789: Migrate `ensureAllowed` to type class for Galley/Action (#…
blackheaven Mar 6, 2026
fe7ff70
charts/elasticsearch-index: Allow configuring postgresql (#5092)
akshaymankar Mar 9, 2026
77e7ee7
WPB-23896: Handle SonarQube last blocker and high/medium warnings (#5…
blackheaven Mar 9, 2026
f680b8b
WPB-23789: Migrate `skipConversationRoleCheck` & `channelAdminOverrid…
blackheaven Mar 9, 2026
844da78
brig: Remove adhocUserKeyStoreInterpreter (#5100)
akshaymankar Mar 9, 2026
266a025
WPB-23830 Merge service helm charts with wire-server chart (#5085)
battermann Mar 10, 2026
9dbc4d0
WPB-23789: Drop `Galley.Intra.Util` (#5101)
blackheaven Mar 10, 2026
7318ac6
WPB-23789: Drop `Galley.Effects` (#5102)
blackheaven Mar 10, 2026
fd0b5b5
WPB-23789: Drop `Galley.API.MLS.Commit` (#5103)
blackheaven Mar 10, 2026
19b48f7
WPB-23789: Drop `Galley.API.Push` (#5104)
blackheaven Mar 10, 2026
800293d
Stop querying the user table in integration tests (#5105)
akshaymankar Mar 11, 2026
ffde03c
Delete metallb chart (and related docs) (#5111)
supersven Mar 11, 2026
a27fe1b
WPB-23789: Break dependencies to `Opts`/`Env` (#5110)
blackheaven Mar 11, 2026
288c80b
fix swagger docs for create-access-token endpoint (#5107)
battermann Mar 11, 2026
4fb438c
WPB-23262 backoffice/stern: fix Swagger UI for comma-separated list q…
battermann Mar 11, 2026
44f7ee9
Script to render and diff wire-server manifest (#5106)
battermann Mar 11, 2026
80ea4c1
fix: adding Helm nil guards for optional values (#5112)
jschumacher-wire Mar 11, 2026
6ca9d96
WPB-23257 fix: claiming key package for a deleted user causes a 500 (…
battermann Mar 11, 2026
cadd47c
[WPB-23644] refactor user type in wire-subsystems (#5074)
fisx Mar 12, 2026
4042224
WPB-23441 fix: validate saml emails feature not correctly targeted (#…
battermann Mar 12, 2026
60134c5
updated renovate.json to enable nix (#5117)
battermann Mar 13, 2026
f1b7f17
[WPB-23644] add app data to `get /list-users` (#5070)
fisx Mar 16, 2026
14b3310
[WPB-23644] mopup (#5115)
fisx Mar 16, 2026
f147ee3
WPB-24006 rename validate sam lemails to require external email verif…
battermann Mar 16, 2026
8a3f985
Create new API version V16 and finalize API version V15. (#5121)
fisx Mar 17, 2026
b7f69ba
[WPB-23990] refactor category (#5120)
fisx Mar 17, 2026
2a8992a
WPB-21964: Add Wire Meetings list (#5109)
blackheaven Mar 17, 2026
3eac45e
Fix: re-generate finalized swagger-v15.json (#5125)
fisx Mar 17, 2026
db39288
SBOMs for Helmfile, docker-compose and Helm charts (#5122)
supersven Mar 17, 2026
150ce52
WPB-23816 log wire client and wire client verison headers in nginz (#…
battermann Mar 18, 2026
20f17db
added `code`, `label`, and `message` to group info diagnostics error
battermann Mar 18, 2026
600c779
changelog
battermann Mar 18, 2026
470bfe9
Revert "changelog"
battermann Mar 18, 2026
5d9def2
Revert "added `code`, `label`, and `message` to group info diagnostic…
battermann Mar 18, 2026
7c50a8d
WPB-24073: fix Wire Meetings list API Version (#5128)
blackheaven Mar 18, 2026
2dc579c
WPB-23953 be add error object fields to group info diagnostics (#5130)
battermann Mar 18, 2026
deae1dc
removed unused queries (#5131)
battermann Mar 19, 2026
b7f48de
WPB-24074: Add Wire Meetings add invitation endpoint (#5132)
blackheaven Mar 19, 2026
2278324
WPB-24152 move custom backends code to wire subsystems (#5135)
battermann Mar 19, 2026
c0a20a1
WPB-24075: Add Wire Meetings delete invitation endpoint (#5136)
blackheaven Mar 19, 2026
b2515b4
Fix `nix develop` (#5127)
supersven Mar 20, 2026
d68a52d
WPB-24149 move team search visibility to wire subsystems (#5137)
battermann Mar 20, 2026
fd0c062
Revert "Fix `nix develop` (#5127)" (#5142)
supersven Mar 20, 2026
fd11c92
WPB-24151 move team notifications store to wire subsystems (#5138)
battermann Mar 20, 2026
b7e4649
Fix `nix develop` (second attempt) (#5143)
supersven Mar 20, 2026
ef70106
Remove sbomqs from Nix dev env
supersven Mar 20, 2026
9591959
Revert "Remove sbomqs from Nix dev env"
supersven Mar 20, 2026
fe8a535
WPB-24178 move team member store to wire subsystems (#5140)
battermann Mar 20, 2026
7c01099
[WPB-21432] app refresh cookie requires password (#5129)
fisx Mar 20, 2026
49eeac6
De-flake `Wire.IdPSubsystem.Interpreter.IdPSubsystem.Interpreter.getS…
supersven Mar 20, 2026
9c16586
WPB-23789: Split `ConversationSubsystem.Interpreter` (#5145)
blackheaven Mar 23, 2026
37dc44c
WPB-23942 prevent rabbit mq queues creation for client notifications …
battermann Mar 23, 2026
79cb9a1
remove unused sbomqs (#5144)
supersven Mar 23, 2026
5b42332
Add security guidelines to AGENTS.md (#5146)
fisx Mar 23, 2026
5d0ff34
[WPB-24033] invalidate old app cookies (#5149)
fisx Mar 23, 2026
9ca52c4
WPB-23789: Split `Galley.API.Federation` (#5148)
blackheaven Mar 23, 2026
40a00a7
Change a few bits for SBOM creation on CI (#5141)
supersven Mar 24, 2026
b607dab
WPB-23913 rate limit http status code config for nginz and cannon (#5…
battermann Mar 24, 2026
408f4cf
Add changelog for Release 2026-03-24
zebot Mar 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
9 changes: 9 additions & 0 deletions .envrc
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,15 @@
# or any of the `default.nix` files change. We do this by adding all these files
# to the nix store and using the store paths as a cache key.

# FUTUREWORK: The speedhack saves only a couple of Seconds when cd'ing into the
# repo's directory. The price is some state we have to manage manually (e.g.
# `rm .direnv`) and a non-intuitive usage of flakes.
#
# The hack could be replaced by the line
# `use flake .\#`
#
# The env variable exports could then be added to the flake's devShell.

nix_files=$(find . -name '*.nix' | grep -v '^./dist-newstyle')
for nix_file in $nix_files; do
watch_file "$nix_file"
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -106,5 +106,8 @@ logs-integration
# BOM file - https://github.com/wireapp/tom-bombadil
sbom.json

# Temporary files
tmp/

# HLS config for haskell-tools plugin (Neovim)
hls.json
75 changes: 75 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -105,3 +105,78 @@ Build commands (e.g. `make c`, `cabal build` or `cabal test`) should always end
with this command line filter: `| grep -vE
'Compiling|Linking|Preprocessing|Configuring|Building'`. The filter ensures
that only relevant output is displayed.

# Security Guidelines

For all code generated in this chat, adhere to the following guidelines:

### 1. Be Explicit About Security Requirements
- Always request and enforce secure coding practices directly.
- Example prompts to follow:
- “Generate a Python function to query a database using parameterized queries and no string concatenation.”
- “Write input validation code for usernames using a whitelist approach.”
- Do **not** accept vague prompts such as:
- “Write code to query a database.”
- “Generate authentication logic.”

### 2. Prevent Sensitive Data Leaks
- Never generate production secrets, API keys, credentials, personal data, or customer-identifying information.
- Always use placeholders (e.g., `YOUR_API_KEY_HERE`) or synthetic/anonymized data.

### 3. Limit Scope & Keep It Modular
- Focus on narrow, well-defined tasks.
- Example: “Generate a secure password hashing function using Argon2id with parameters selected according to the OWASP Password Storage Cheat Sheet.”
- Reject overly broad requests like “Write a full secure authentication system.”
- Propose security requirements before generating code.
- Discuss alternatives, evaluate them, and provide a step-by-step implementation plan.

### 4. Specify Safe Practices & Standards
- Always reference frameworks, versions, and security guidelines.
- Example: “Use Flask 3.0 and follow OWASP secure coding practices.”
- Example: “Use your web framework’s built-in auto-escaping/output encoding to prevent XSS.”
- Example: “Sanitize user-provided rich HTML content on the client using DOMPurify before rendering.”
### 5. Control Library Choices
- Only use secure, widely adopted, actively maintained dependencies.
- Ensure libraries have no known high-severity CVEs.
- Example: “Suggest Node.js packages updated in the last 6 months.”

### 6. Request Validation & Error Handling
- Always include strict server-side validation.
- Error messages must be generic and never disclose sensitive details.
- Example: “Generate a file upload handler with size limits, MIME type checks, and safe error messages.”

### 7. Avoid Dangerous Features by Default
- Exclude risky features unless explicitly requested.
- Example:
- Do not use `eval`.
- Do not disable SSL/TLS verification.

### 8. Request Tests for Security
- Always generate tests verifying security protections.
- Integrate tests into CI/CD pipelines.
- Examples:
- “Write unit tests confirming rejection of invalid input and prevention of XSS.”
- “Generate a pytest suite covering edge cases, including malicious inputs.”

### 9. Ask for Explanations
- Always justify security decisions in generated code.
- Example: “Explain how this code prevents SQL injection.”
- Example: “List all security measures in your code.”

### 10. Avoid Blind Trust in Input Handling
- Do not assume inputs are safe.
- Explicitly include strict validation.
- Always use parameterized queries.

### 11. Constrain the Role
- Only fulfill narrowly scoped coding tasks.
- Example: “Generate input validation for email addresses only.”
- Reject broad, open-ended prompts like:
- “Write a secure web app.”

### 12. Follow Up Iteratively
- Treat the first response as a draft.
- Accept refinements and improvements from the user.
- Example refinements:
- “Improve error handling to avoid information disclosure.”
- “Replace insecure library X with a more secure alternative.”
123 changes: 123 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,126 @@
# [2026-03-24] (Chart Release 5.29.0)

## Release notes


* Helm chart refactoring: several core services were migrated from wire-server subcharts into the umbrella chart templates (`charts/wire-server/templates`).

Moved as core services:
- `background-worker`
- `brig`
- `cannon`
- `cargohold`
- `galley`
- `gundeck`
- `proxy`
- `spar`

As a result, dependency tags for moved services are obsolete for the current wire-server chart, because these services are no longer resolved through `requirements.yaml` dependencies. In particular, `tags.brig`, `tags.galley`, `tags.cannon`, `tags.cargohold`, `tags.gundeck`, `tags.proxy`, and `tags.spar` are no longer needed for wire-server deployments.

Operator note: during upgrade, rendered manifests will show metadata/source changes (for example chart labels and template source paths). This is expected from the inlining refactor and may trigger a one-time rollout due to checksum annotation changes.

Compatibility note: for standard wire-server deployments this is not expected to be breaking, because the moved core services were not toggled off via tags in default/in-repo environments. However, this is a breaking change for custom deployments that previously disabled any of these services via wire-server dependency tags (`tags.<service>: false`), because those tags are now obsolete after inlining. (#5085)

* Rate-limit status codes in `nginz` and cannon's embedded `nginz` are now configurable via Helm values.

Compatibility note: the default remains `420`, so this does not change behavior for existing deployments and requires no direct operator action. (#5124)

* Remove the old `metallb` wrapper chart. This hasn't been published or updated
for quite some time. Even the Docker images weren't available anymore. (#5111)


## API changes


* Require admin password for refreshing app cookies (`POST /teams/:tid/apps/:uid/cookies`). (#5129)

* Add `"app"` attribute to `GET /list-users`, `GET /users/:dom/:uid`; make `GET /teams/:tid/apps`, `GET /teams/:tid/apps/:uid` return same schema as `GET /list-users`. (#5070)

* `GET /teams/:tid/search` response contains user types now (app or regular). (#5074)

* - remove pict attribute from GetApp
- remove metadata attribute from GetApp
- inline GetApp fields into NewApp
- make CreatedApp.user contain UserProfile (which includes app info)
- rename GetApp to AppInfo
- remove AppInfo.{name,assets,accentId} (redundant user data) (#5115)

* Create new API version V16 and finalize API version V15. (#5121)


## Features


* Add meetings listings endpoint `/meetings/list`. (#5109)

* Add Wire Meetings add invitation endpoint `POST /meetings/:domain/:id/invitations` (#5132)

* Add Wire Meetings delete invitation endpoint `POST /meetings/:domain/:id/invitations/delete` (#5136)


## Bug fixes and other updates


* Claiming key packages for a deleted user now returns a client error instead of a server error (#5113)

* backoffice/stern: fix Swagger UI for comma-separated list query parameters (#5108)

* Streamlined and fixed team feature config `validateSAMLemails` (#5114)

* When the admin creates a new app cookie, all previous ones must be revoked. (#5149)

* charts/elasticsearch-index: Allow configuring postgresql (#5092)

* charts/wire-server: Fix nil pointer errors in merged subchart templates when optional values (brig.turn, rabbitmq TLS, cassandraBrig/cassandraGalley) are not provided (#5112)

* Improve error message when failing to parse group ID (#5089)


## Documentation


* Updated docs for the team feature `validateSAMLemails` (#5118)


## Internal changes


* The status code for rate limit responses from nginz and cannon is now configurable and set to 420 per default (#5124)

* Add curl to integration test failure reports. (#5048)

* Add `UserType` fields in various data types. (#5074)

* Progressively move away from singletons to type class to allow progressive migration to `wire-subsystems` of Galley's actions.
Drop `Galley.Intra.Util`,`Galley.Effects`, `Galley.API.MLS.Commit`, and `Galley.API.Push`.
Break dependencies to `Opts`/`Env`.
Split `ConversationSubsystem.Interpreter` `Galley.API.Federation` (#5075, #5081, #5086, #5087, #5098, #5101, #5102, #5103, #5104, #5110, #5145, #5148)

* Logging Wire-Client, Wire-Client-Version and Wire-Config-Hash headers in nginz (#5123)

* Refactor scripts to alleviate SonarQube warnings (#5097)

* Consumable notifications are now disabled (#5116)

* The fields `code`, `label`, and `message` where added to the inconsistent group state error response of `POST /mls/commit-bundels` (#PR_NOT_FOUND)

* Refactor Category: from ADT to Text. (#5120)

* Moved TeamVisibilityStore operations into TeamStore (#5137)

* Moved TeamNotificationStore to wire-subsystems (#5138)

* Moved CustomBackendStore to wire-subsystems (#5135)

* Moved TeamMemberStore, interpreter, and ListItems interpreters for Team to wire-subsystems (#5140)

* `sbomqs` has been unused for years now. Thus, dropping it from our Nix env. (#5144)

* Adjust the `default` Nix flake `devShell` such that `nix develop` is usable. (#5127)

* Create and upload SBOMs for Helmfile, docker-compose and Helm charts. (#5122)


# [2026-03-03] (Chart Release 5.28.0)

## Release notes
Expand Down
95 changes: 92 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ KIND_CLUSTER_NAME := wire-server
HELM_PARALLELISM ?= 1 # 1 for sequential tests; 6 for all-parallel tests
PSQL_DB ?= backendA
export PSQL_DB
DEPENDENCY_TRACK_PROJECT_NAME ?= wire-server

package ?= all
EXE_SCHEMA := ./dist/$(package)-schema
Expand Down Expand Up @@ -76,6 +77,7 @@ endif
# `/dist` and `.ghc.environment` shouldn't be created or used by anybody any more, we're just making sure here.
-rm -rf dist .ghc.environment
-rm -f "bill-of-materials.$(HELM_SEMVER).json"
-rm -rf tmp/sboms

.PHONY: clean-hint
clean-hint:
Expand Down Expand Up @@ -122,7 +124,7 @@ endif
.PHONY: ci-safe
ci-safe:
make c package=all
./hack/bin/cabal-run-integration.sh integration
make ci-fast

.PHONY: ci
ci:
Expand Down Expand Up @@ -347,9 +349,9 @@ postgres-schema-impl:

.PHONY: cqlsh
cqlsh:
$(eval CASSANDRA_CONTAINER := $(shell docker ps | grep '/cassandra:' | perl -ne '/^(\S+)\s/ && print $$1'))
$(eval CASSANDRA_CONTAINER := $(shell docker ps | grep 'cassandra' | perl -ne '/^(\S+)\s/ && print $$1'))
@echo "make sure you have ./deploy/dockerephemeral/run.sh running in another window!"
docker exec -it $(CASSANDRA_CONTAINER) /usr/bin/cqlsh
docker exec -it $(CASSANDRA_CONTAINER) cqlsh

.PHONY: psql
psql:
Expand Down Expand Up @@ -565,6 +567,11 @@ charts-serve-all: $(foreach chartName,$(CHARTS_RELEASE),chart-$(chartName))
.PHONY: charts-release
charts-release: $(foreach chartName,$(CHARTS_RELEASE),release-chart-$(chartName))

# Prepare .local/charts to be read by `helmfile`
.PHONY: .local/charts
.local/charts: charts-release
./hack/bin/prepare-local-charts.sh $(CHARTS_RELEASE)

.PHONY: clean-charts
clean-charts:
rm -rf .local/charts
Expand Down Expand Up @@ -674,6 +681,28 @@ kind-restart-%: .local/kind-kubeconfig
helm-template-%: clean-charts charts-integration
./hack/bin/helm-template.sh $(*)

# Render the wire-server manifest from an explicit values file.
# Usage:
# make render-manifest VALUES_FILE=/tmp/values.yaml
# make render-manifest VALUES_FILE=/tmp/values.yaml OUTPUT_FILE=/tmp/rendered.yaml
# (you can get the live values e.g. like this: helm get values wire-server -n wire -a)
render-manifest: clean-charts charts-integration
./hack/bin/render-manifest.sh "$(VALUES_FILE)"

# Render wire-server from live values and compare it with the live manifest.
# Usage:
# helm get values wire-server -n wire -a > /tmp/staging/live-values.yaml
# helm get manifest wire-server -n wire > /tmp/staging/live-manifest.yaml
# make diff-live-manifest LIVE_VALUES_FILE=/tmp/staging/live-values.yaml LIVE_MANIFEST_FILE=/tmp/staging/live-manifest.yaml
diff-live-manifest: clean-charts charts-integration
OUTPUT_FILE="/tmp/wire-server.yaml" ./hack/bin/render-manifest.sh "$(LIVE_VALUES_FILE)"; \
DIFF_OUTPUT_FILE="$(DIFF_OUTPUT_FILE)" ./hack/bin/diff-wire-server-manifests.sh "$(LIVE_MANIFEST_FILE)" /tmp/wire-server.yaml

render-ci-manifest: clean-charts charts-integration
VALUES_FILE="$${VALUES_FILE:-$$(mktemp).yaml}"; \
./hack/bin/helm-render-ci-values.sh \
./hack/bin/render-manifest.sh "$$VALUES_FILE"

sbom.json:
nix -Lv build '.#wireServer.bomDependencies' && \
nix run 'github:wireapp/tom-bombadil#create-sbom' -- --root-package-name "wire-server"
Expand All @@ -687,6 +716,66 @@ upload-bombon: sbom.json
--auto-create \
--bom-file ./sbom.json

# SBOM creation and uploading (Helm charts, Helmfile, docker-compose)
#
# For non-Nix environments (Kubernetes, docker-compose) and Helm charts we can
# use the usual tools and do not need tom-bombadil.
#
# There is a Nix `devShell` which provides an environment for these targets, `sbom`.
# E.g. to run the `sboms` target:
# `nix develop .\#sbom --command make sboms HELM_SEMVER=... DOCKER_TAG=...`
#
# Why don't we simply add this `nix develop` call to the Makefile targets?
# Targets should be independently executable and creating a Nix env in a Nix
# env doesn't play well.

# Generate all SBOMs (Helm + Docker Compose + Helmfile)
.PHONY: sboms
sboms: sboms-helm sboms-docker-compose sboms-helmfile

# Generate SBOMs for Helm charts
.PHONY: sboms-helm
sboms-helm: .local/charts
@if [ "$(HELM_SEMVER)" = "0.0.42" ]; then \
echo "Environment variable HELM_SEMVER not set to non-default value. Re-run with HELM_SEMVER=<version>"; \
exit 1; \
fi
./hack/bin/create-helm-sboms.sh tmp/sboms/helm $(HELM_SEMVER)

# Generate SBOMs for Docker Compose
.PHONY: sboms-docker-compose
sboms-docker-compose:
./hack/bin/create-docker-compose-sboms.sh tmp/sboms/docker-compose

# Generate SBOMs for Helmfile
.PHONY: sboms-helmfile
sboms-helmfile: .local/charts
@if [ "$(HELM_SEMVER)" = "0.0.42" ]; then \
echo "Environment variable HELM_SEMVER not set to non-default value. Re-run with HELM_SEMVER=<version>"; \
exit 1; \
fi
./hack/bin/create-helmfile-sboms.sh tmp/sboms/helmfile $(HELM_SEMVER)

# Validate all SBOM files using cyclonedx
.PHONY: validate-sboms
validate-sboms:
@echo "Validating SBOM files..."
@find tmp/sboms -name '*.json' -type f -not -path '*/.oci-cache/*' | while read sbom; do \
echo "Validating: $$sbom"; \
cyclonedx validate --input-file "$$sbom" --fail-on-errors; \
done
@echo "All SBOMs validated successfully"

# Upload all SBOMs to Dependency Track
# Requires DEPENDENCY_TRACK_API_KEY environment variable
.PHONY: upload-sboms
upload-sboms:
@if [ "$(HELM_SEMVER)" = "0.0.42" ]; then \
echo "Environment variable HELM_SEMVER not set to non-default value. Re-run with HELM_SEMVER=<version>"; \
exit 1; \
fi
./hack/bin/upload-all-sboms.sh $(DEPENDENCY_TRACK_PROJECT_NAME) "$(HELM_SEMVER)"

.PHONY: openapi-validate
openapi-validate:
@echo -e "Make sure you are running the backend in another terminal (make cr)\n"
Expand Down
Loading