diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index a7c098c2..f32eea9b 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -31,7 +31,7 @@ jobs: go run github.com/playwright-community/playwright-go/cmd/playwright install chromium --with-deps - run: make lint - - run: go test ./... + - run: go test -race ./... env: ORY_RATE_LIMIT_HEADER: ${{ secrets.ORY_RATE_LIMIT_HEADER }} ORY_CONSOLE_URL: https://console.staging.ory.dev diff --git a/Makefile b/Makefile index 6430e0aa..f4f7bf66 100644 --- a/Makefile +++ b/Makefile @@ -49,12 +49,6 @@ licenses: .bin/licenses node_modules # checks open-source licenses docker: docker build -f .docker/Dockerfile-build -t oryd/ory:latest-sqlite . - -# Runs tests in short mode, without database adapters -.PHONY: post-release -post-release: - echo "nothing to do" - node_modules: package-lock.json npm ci touch node_modules diff --git a/cmd/cloudx/testhelpers/testhelpers.go b/cmd/cloudx/testhelpers/testhelpers.go index 884758ea..bc7da3c9 100644 --- a/cmd/cloudx/testhelpers/testhelpers.go +++ b/cmd/cloudx/testhelpers/testhelpers.go @@ -241,6 +241,12 @@ func SetupPlaywright(t testing.TB) (playwright.Browser, playwright.Page, func()) page := NewPage(t, browser) return browser, page, func() { + // Drain any in-flight Route handlers (registered in NewPage) before closing + // the page; otherwise page.Close() can race the handler goroutine inside + // playwright-go. + t.Logf("unroute error: %+v", page.Context().UnrouteAll(playwright.BrowserContextUnrouteAllOptions{ + Behavior: playwright.UnrouteBehaviorWait, + })) t.Logf("page close error: %+v", page.Close()) t.Logf("browser close error: %+v", browser.Close()) t.Logf("playwright stop error: %+v", pw.Stop()) diff --git a/cmd/dev.go b/cmd/dev.go index a907ca3a..e79f0ed5 100644 --- a/cmd/dev.go +++ b/cmd/dev.go @@ -12,4 +12,6 @@ import ( "github.com/ory/cli/cmd/dev" ) -var devCommands = []*cobra.Command{dev.Main} +func newDevCommands() []*cobra.Command { + return []*cobra.Command{dev.NewCommand()} +} diff --git a/cmd/dev/ci/deps/main.go b/cmd/dev/ci/deps/main.go index 7f9221a8..20a14fb7 100644 --- a/cmd/dev/ci/deps/main.go +++ b/cmd/dev/ci/deps/main.go @@ -7,13 +7,14 @@ import ( "github.com/spf13/cobra" ) -var Main = &cobra.Command{ - Use: "deps", - Short: "Helpers for binary dependencies in Makefiles.", -} - -func init() { - Main.PersistentFlags().StringP("os", "o", "", "OS the binary should run on. Currently only 'linux' and 'darwin' are supported.") - Main.PersistentFlags().StringP("architecture", "a", "", "Architecture the binary should run on. Currently only 'amd64' is supported.") - Main.PersistentFlags().StringP("config", "c", "", "Path to config files.") +func NewCommand() *cobra.Command { + c := &cobra.Command{ + Use: "deps", + Short: "Helpers for binary dependencies in Makefiles.", + } + c.PersistentFlags().StringP("os", "o", "", "OS the binary should run on. Currently only 'linux' and 'darwin' are supported.") + c.PersistentFlags().StringP("architecture", "a", "", "Architecture the binary should run on. Currently only 'amd64' is supported.") + c.PersistentFlags().StringP("config", "c", "", "Path to config files.") + c.AddCommand(newURLCmd()) + return c } diff --git a/cmd/dev/ci/deps/url.go b/cmd/dev/ci/deps/url.go index 96af2ab9..6c8036c3 100644 --- a/cmd/dev/ci/deps/url.go +++ b/cmd/dev/ci/deps/url.go @@ -116,28 +116,26 @@ func (c *Component) getRenderedURL(osString string, archString string) (string, return buf.String(), nil } -var url = &cobra.Command{ - Use: "url", - Short: "Returns the download url based on the provided config file.", - Long: `Returns the download url based on the provided config file. This is used to simplify our Makefile logic when downloading binary dependencies. As the values used for os and arch as well as the structure of the download url for different binary tools are not standardized it makes it quite cumbersome to handle this efficiently in Makefiles.`, - RunE: func(cmd *cobra.Command, args []string) error { - component := Component{} - var pConfig = flagx.MustGetString(cmd, "config") - err := component.getComponentFromConfig(pConfig) - if err != nil { - return err - } - var pOS = flagx.MustGetString(cmd, "os") - var pArch = flagx.MustGetString(cmd, "architecture") - url, err := component.getRenderedURL(pOS, pArch) - if err != nil { - return err - } - fmt.Fprintln(os.Stdout, url) - return nil - }, -} - -func init() { - Main.AddCommand(url) +func newURLCmd() *cobra.Command { + return &cobra.Command{ + Use: "url", + Short: "Returns the download url based on the provided config file.", + Long: `Returns the download url based on the provided config file. This is used to simplify our Makefile logic when downloading binary dependencies. As the values used for os and arch as well as the structure of the download url for different binary tools are not standardized it makes it quite cumbersome to handle this efficiently in Makefiles.`, + RunE: func(cmd *cobra.Command, args []string) error { + component := Component{} + var pConfig = flagx.MustGetString(cmd, "config") + err := component.getComponentFromConfig(pConfig) + if err != nil { + return err + } + var pOS = flagx.MustGetString(cmd, "os") + var pArch = flagx.MustGetString(cmd, "architecture") + url, err := component.getRenderedURL(pOS, pArch) + if err != nil { + return err + } + fmt.Fprintln(os.Stdout, url) + return nil + }, + } } diff --git a/cmd/dev/ci/github/env.go b/cmd/dev/ci/github/env.go index 4e208fd7..29d5cbb8 100644 --- a/cmd/dev/ci/github/env.go +++ b/cmd/dev/ci/github/env.go @@ -18,47 +18,46 @@ import ( const tagPrefix = "refs/tags/" const branchPrefix = "refs/heads/" -var env = &cobra.Command{ - Use: "env", - Short: "Sets up environment variables", - Long: `Sets up environment variables. To load the environment variables use: +func newEnvCmd() *cobra.Command { + return &cobra.Command{ + Use: "env", + Short: "Sets up environment variables", + Long: `Sets up environment variables. To load the environment variables use: $ source $(ory dev ci github env)`, - Run: func(cmd *cobra.Command, args []string) { - if ref := os.Getenv("GITHUB_REF"); strings.HasPrefix(ref, tagPrefix) { - // it's a tag - fmt.Printf("export GIT_TAG=%s", - strings.ReplaceAll(ref, tagPrefix, "")) - } else if strings.HasPrefix(ref, branchPrefix) { - fmt.Printf("export GIT_BRANCH=%s", - strings.ReplaceAll(ref, branchPrefix, "")) - } else { - fmt.Printf("export GIT_BRANCH=%s", - strings.TrimSpace(pkg.CommandGetOutput("git", "rev-parse", "--abbrev-ref", "HEAD"))) - } - - repo := strings.Split(os.Getenv("GITHUB_REPOSITORY"), "/") - if len(repo) != 2 { - pkg.Fatalf("Malformed repository information in GITHUB_REPOSITORY: %s", os.Getenv("GITHUB_REPOSITORY")) - } - fmt.Printf("export GITHUB_ORG=%s\n", repo[0]) - fmt.Printf("export GITHUB_REPO=%s\n", repo[1]) - - caser := cases.Title(language.AmericanEnglish) - fmt.Printf("export SWAGGER_APP_NAME=%s_%s\n", - caser.String(strings.ToLower(repo[0])), - caser.String(strings.ToLower(repo[1])), - ) - - if ignorePkgs := strings.Split(os.Getenv("SWAGGER_SPEC_IGNORE_PKGS"), ","); len(ignorePkgs) > 0 { - for k, p := range ignorePkgs { - ignorePkgs[k] = "-x " + p + Run: func(cmd *cobra.Command, args []string) { + if ref := os.Getenv("GITHUB_REF"); strings.HasPrefix(ref, tagPrefix) { + // it's a tag + fmt.Printf("export GIT_TAG=%s", + strings.ReplaceAll(ref, tagPrefix, "")) + } else if strings.HasPrefix(ref, branchPrefix) { + fmt.Printf("export GIT_BRANCH=%s", + strings.ReplaceAll(ref, branchPrefix, "")) + } else { + fmt.Printf("export GIT_BRANCH=%s", + strings.TrimSpace(pkg.CommandGetOutput("git", "rev-parse", "--abbrev-ref", "HEAD"))) } - fmt.Printf(`export SWAGGER_SPEC_IGNORE_PKGS='%s'`, strings.Join(ignorePkgs, " ")) - } - }, -} -func init() { - Main.AddCommand(env) + repo := strings.Split(os.Getenv("GITHUB_REPOSITORY"), "/") + if len(repo) != 2 { + pkg.Fatalf("Malformed repository information in GITHUB_REPOSITORY: %s", os.Getenv("GITHUB_REPOSITORY")) + } + fmt.Printf("export GITHUB_ORG=%s\n", repo[0]) + fmt.Printf("export GITHUB_REPO=%s\n", repo[1]) + + caser := cases.Title(language.AmericanEnglish) + fmt.Printf("export SWAGGER_APP_NAME=%s_%s\n", + caser.String(strings.ToLower(repo[0])), + caser.String(strings.ToLower(repo[1])), + ) + + if raw := os.Getenv("SWAGGER_SPEC_IGNORE_PKGS"); raw != "" { + ignorePkgs := strings.Split(raw, ",") + for k, p := range ignorePkgs { + ignorePkgs[k] = "-x " + p + } + fmt.Printf(`export SWAGGER_SPEC_IGNORE_PKGS='%s'`, strings.Join(ignorePkgs, " ")) + } + }, + } } diff --git a/cmd/dev/ci/github/main.go b/cmd/dev/ci/github/main.go index c2d9ee5e..66c48146 100644 --- a/cmd/dev/ci/github/main.go +++ b/cmd/dev/ci/github/main.go @@ -7,7 +7,11 @@ import ( "github.com/spf13/cobra" ) -var Main = &cobra.Command{ - Use: "github", - Short: "Helpers for GitHub", +func NewCommand() *cobra.Command { + c := &cobra.Command{ + Use: "github", + Short: "Helpers for GitHub", + } + c.AddCommand(newEnvCmd()) + return c } diff --git a/cmd/dev/ci/main.go b/cmd/dev/ci/main.go index d898cccd..c738fb33 100644 --- a/cmd/dev/ci/main.go +++ b/cmd/dev/ci/main.go @@ -8,18 +8,18 @@ import ( "github.com/ory/cli/cmd/dev/ci/deps" "github.com/ory/cli/cmd/dev/ci/github" - "github.com/ory/cli/cmd/dev/ci/monorepo" "github.com/ory/cli/cmd/dev/ci/orbs" ) -var Main = &cobra.Command{ - Use: "ci", - Short: "Continuous Integration helpers", -} - -func init() { - Main.AddCommand(orbs.Main) - Main.AddCommand(github.Main) - Main.AddCommand(monorepo.Main) - Main.AddCommand(deps.Main) +func NewCommand() *cobra.Command { + c := &cobra.Command{ + Use: "ci", + Short: "Continuous Integration helpers", + } + c.AddCommand( + orbs.NewCommand(), + github.NewCommand(), + deps.NewCommand(), + ) + return c } diff --git a/cmd/dev/ci/monorepo/changes.go b/cmd/dev/ci/monorepo/changes.go deleted file mode 100644 index e8de586e..00000000 --- a/cmd/dev/ci/monorepo/changes.go +++ /dev/null @@ -1,184 +0,0 @@ -// Copyright © 2023 Ory Corp -// SPDX-License-Identifier: Apache-2.0 - -package monorepo - -import ( - "fmt" - "log" - "os/exec" - "regexp" - "sort" - "strings" - - "github.com/spf13/cobra" -) - -var changesMode string -var changeLog string -var gitOpts string - -const allChanges = "--name-only --oneline" -const lastCommitChanges = "-1 --name-only --oneline" - -var changes = &cobra.Command{ - Use: "changes", - Short: "List changes in the repository.", - Long: `List changes in the repository.`, - Run: func(cmd *cobra.Command, args []string) { - repoChanges := "[empty]" - switch changesMode { - case "full": - if len(gitOpts) == 0 { - if isPR() { - gitOpts = "--pretty=full" - } else { - gitOpts = "-1 --pretty=full" - } - } - - repoChanges, _ = getChangeLog(rootDirectory, revisionRange, gitOpts) - case "directories": - repoChanges, _ = getChangedDirectories(rootDirectory, revisionRange, gitOpts) - case "files": - repoChanges, _ = getChangedFiles(rootDirectory, revisionRange, gitOpts) - default: - log.Fatalf("Unknown ListMode '%s'", changesMode) - } - fmt.Println(repoChanges) - }, -} - -func getGitDefaults() string { - if isPR() { - return allChanges - } - return lastCommitChanges -} - -func getChangedFiles(rootDirectory string, revisionRange string, gitOpts string) (string, error) { - changeLog, err := getRepositoryChangeLog(rootDirectory, revisionRange, gitOpts) - if err != nil { - return "", fmt.Errorf("error getting changes from Git: %v", err) - } - cleansedChangeLogArray := strings.Split(removeCommitMessages(changeLog), "\n") - cleanseRepositoryChanges(&cleansedChangeLogArray, true, true) - caseInsensitiveSort(cleansedChangeLogArray) - - changedFiles := strings.Join(cleansedChangeLogArray, "\n") - if debug { - fmt.Printf("getChangedFiles: \n%s\n", changedFiles) - } - return changedFiles, nil -} - -func getChangedDirectories(rootDirectory string, revisionRange string, gitOpts string) (string, error) { - changeLog, err := getRepositoryChangeLog(rootDirectory, revisionRange, gitOpts) - if err != nil { - return "", fmt.Errorf("error getting changes from Git: %v", err) - } - cleansedChangeLogArray := strings.Split(removeCommitMessages(changeLog), "\n") - cleanseRepositoryChanges(&cleansedChangeLogArray, false, true) - caseInsensitiveSort(cleansedChangeLogArray) - changeDirectoriesString := strings.Join(cleansedChangeLogArray, "\n") - if debug { - fmt.Printf("getChangedDirectories: \n%s\n\n", changeDirectoriesString) - } - return changeDirectoriesString, nil -} - -func getChangeLog(rootDirectory string, revisionRange string, gitOpts string) (string, error) { - repoChanges, err := getRepositoryChangeLog(rootDirectory, revisionRange, gitOpts) - if err != nil { - return "", fmt.Errorf("error getting changes from Git: %v", err) - } - - return repoChanges, nil -} - -// cleanseRepositoryChanges currently support two cleansing operations. -// * lines []string representing the change list as produced by getRepositoryChanges -// * includeFiles if true, the returned output will include a list of all changed files (with the relative path) -func cleanseRepositoryChanges(lines *[]string, includeFiles bool, deduplicate bool) { - for i, line := range *lines { - //fmt.Printf("%d. [%s]\n", i, line) - if strings.Contains(line, "/") { - //if line contains '/', it represent a path with filename - //we remove everything starting from the last '/' - if !includeFiles { - (*lines)[i] = line[:strings.LastIndex(line, "/")] - } - } else { - //if line does not include any '/', it represent filename in the root directory - //we substitute the filename with '.' - if !includeFiles { - (*lines)[i] = "." - } - } - } - if deduplicate { - deduplicateChangelog(lines) - } -} - -func caseInsensitiveSort(data []string) []string { - sort.Slice(data, func(i, j int) bool { return strings.ToLower(data[i]) < strings.ToLower(data[j]) }) - return data -} - -func removeCommitMessages(changeLog string) string { - regex := regexp.MustCompile(`(?m)^([a-z0-9]{7} .*\s|\z)|\n$`) - cleansedChangeLog := regex.ReplaceAllString(changeLog, "") - return cleansedChangeLog -} - -func deduplicateChangelog(lines *[]string) { - found := make(map[string]bool) - j := 0 - for i, x := range *lines { - if !found[x] { - found[x] = true - (*lines)[j] = (*lines)[i] - j++ - } - } - *lines = (*lines)[:j] -} - -// getRepositoryChanges returns the changes in the specified local respository (via repositoryPath) towards the specified -func getRepositoryChangeLog(repositoryPath string, revisionRange string, gitOptions string) (string, error) { - //TODO: caching the changelog, ensure this does not lead to problems. - if len(changeLog) == 0 { - args := []string{"--no-pager", "log"} - if len(revisionRange) > 0 { - args = append(args, revisionRange) - } - if len(gitOptions) == 0 { - //apply default args - gitOptions = getGitDefaults() - } - gitOptionsArray := strings.Split(gitOptions, " ") - args = append(args, gitOptionsArray...) - if verbose { - fmt.Printf("getRepositoryChanges: '$ git %s'\n", args) - } - cmd := exec.Command("git", args...) - cmd.Dir = repositoryPath - - out, err := cmd.Output() - if err != nil { - return "", err - } - changeLog = string(out[:]) - } - if debug { - fmt.Printf("getRepositoryChangeLog: \n%s\n", changeLog) - } - return changeLog, nil -} - -func init() { - Main.AddCommand(changes) - changes.Flags().StringVarP(&changesMode, "mode", "m", "directories", "Define which which type of change information you want to get listed (full, files, directories). Default is 'directories'.") - changes.Flags().StringVarP(&gitOpts, "gitopts", "g", "", "Specify custom git arguments used to determine changes, e.g. '--pretty=oneline' Only supported if mode is 'full'.") -} diff --git a/cmd/dev/ci/monorepo/changes_test.go b/cmd/dev/ci/monorepo/changes_test.go deleted file mode 100644 index 077fb9ed..00000000 --- a/cmd/dev/ci/monorepo/changes_test.go +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright © 2023 Ory Corp -// SPDX-License-Identifier: Apache-2.0 - -package monorepo - -import ( - "strings" - "testing" - - "github.com/stretchr/testify/assert" -) - -var sampleGitOutput = `303599b feat: improve create migrations command (#16) -cmd/dev/pop/migration/create.go -ca21cb5 autogen: pin v0.0.24 release commit -cmd/dev/schema/render_version.go -cmd/dev/schema/render_version_test.go -cmd/pkg/repos.go -README.md -go.mod -go.sum -63fd21e chore: update deprecated goreleaser config and add goimports linter (#14) -.github/workflows/checks-go.yml -go.sum -test/changelog.md` - -var changelogWithoutCommitMessages = `cmd/dev/pop/migration/create.go -cmd/dev/schema/render_version.go -cmd/dev/schema/render_version_test.go -cmd/pkg/repos.go -README.md -go.mod -go.sum -.github/workflows/checks-go.yml -go.sum -test/changelog.md` - -var deduplicatedChangelogOutput = `303599b feat: improve create migrations command (#16) -cmd/dev/pop/migration/create.go -ca21cb5 autogen: pin v0.0.24 release commit -cmd/dev/schema/render_version.go -cmd/dev/schema/render_version_test.go -cmd/pkg/repos.go -README.md -go.mod -go.sum -63fd21e chore: update deprecated goreleaser config and add goimports linter (#14) -.github/workflows/checks-go.yml -test/changelog.md` - -var cleansedDirectoriesChangelogOutput = `cmd/dev/pop/migration -cmd/dev/schema -cmd/pkg -. -.github/workflows -test` - -var cleansedFilesChangelogOutput = `cmd/dev/pop/migration/create.go -cmd/dev/schema/render_version.go -cmd/dev/schema/render_version_test.go -cmd/pkg/repos.go -README.md -go.mod -go.sum -.github/workflows/checks-go.yml -test/changelog.md` - -var sortedCleansedFilesChangelogOutput = `.github/workflows/checks-go.yml -cmd/dev/pop/migration/create.go -cmd/dev/schema/render_version.go -cmd/dev/schema/render_version_test.go -cmd/pkg/repos.go -go.mod -go.sum -README.md -test/changelog.md` - -func TestDeduplication(t *testing.T) { - changelogArray := strings.Split(sampleGitOutput, "\n") - deduplicateChangelog(&changelogArray) - dedup := strings.Join(changelogArray, "\n") - assert.Equalf(t, deduplicatedChangelogOutput, dedup, "Deduplicated!", nil) -} - -func TestRemovingCommitMessages(t *testing.T) { - cleansedChangelog := removeCommitMessages(sampleGitOutput) - assert.Equalf(t, changelogWithoutCommitMessages, cleansedChangelog, "Cleansed!", nil) -} - -func TestCleanseChangelogFiles(t *testing.T) { - changelogArray := strings.Split(changelogWithoutCommitMessages, "\n") - cleanseRepositoryChanges(&changelogArray, true, true) - cleansedFilesChangelog := strings.Join(changelogArray, "\n") - assert.Equalf(t, cleansedFilesChangelogOutput, cleansedFilesChangelog, "Cleansed Files Changelog!", nil) -} - -func TestCleanseChangelogDirectories(t *testing.T) { - changelogArray := strings.Split(changelogWithoutCommitMessages, "\n") - cleanseRepositoryChanges(&changelogArray, false, true) - cleansedDirectoryChangelog := strings.Join(changelogArray, "\n") - assert.Equalf(t, cleansedDirectoriesChangelogOutput, cleansedDirectoryChangelog, "Cleansed Directory Changelog!", nil) -} - -func TestCaseInsensitiveSorting(t *testing.T) { - changelogArray := strings.Split(cleansedFilesChangelogOutput, "\n") - caseInsensitiveSort(changelogArray) - sortedChangelog := strings.Join(changelogArray, "\n") - assert.Equalf(t, sortedCleansedFilesChangelogOutput, sortedChangelog, "Sorted Cleansed Files Changelog!", nil) -} diff --git a/cmd/dev/ci/monorepo/components.go b/cmd/dev/ci/monorepo/components.go deleted file mode 100644 index 55878bb6..00000000 --- a/cmd/dev/ci/monorepo/components.go +++ /dev/null @@ -1,181 +0,0 @@ -// Copyright © 2023 Ory Corp -// SPDX-License-Identifier: Apache-2.0 - -package monorepo - -import ( - "fmt" - "log" - "os" - "path" - "strings" - - mapset "github.com/deckarep/golang-set" - "github.com/spf13/cobra" -) - -var componentMode string - -var components = &cobra.Command{ - Use: "components", - Short: "List components based on mode.", - Long: `List components based on mode by reading dependency configs and displaying the dependency graph.`, - Run: func(cmd *cobra.Command, args []string) { - - var graph ComponentGraph - _, _ = graph.getComponentGraph(rootDirectory) - - switch componentMode { - case "affected": - affectedComponents := getAffectedComponents(&graph) - displayComponents(affectedComponents) - case "all": - allComponents := graph.components - displayComponents(allComponents) - case "changed": - changedComponents := getChangedComponents(&graph) - displayComponents(changedComponents) - case "involved": - involvedComponents := getInvolvedComponents(&graph) - displayComponents(involvedComponents) - default: - log.Fatalf("Unknown ListMode '%s'", componentMode) - } - }, -} - -func displayComponents(components []*Component) { - for _, component := range components { - if verbose { - fmt.Println(component.String()) - } else { - fmt.Println(component.ID) - } - } -} - -func getInvolvedComponents(graph *ComponentGraph) []*Component { - components := append(getChangedComponents(graph), getAffectedComponents(graph)...) - componentSet := mapset.NewSet() - for _, comp := range components { - componentSet.Add(comp.ID) - } - - var involvedComponents []*Component - for componentID := range componentSet.Iter() { - involvedComponents = append(involvedComponents, graph.componentIDs[componentID.(string)]) - } - return involvedComponents -} - -func getChangedComponents(graph *ComponentGraph) []*Component { - changedDirectories, _ := getChangedDirectories(rootDirectory, revisionRange, gitOpts) - changeDirectoryArray := strings.Split(changedDirectories, "\n") - var changedComponents []*Component - componentPaths := graph.componentPaths - - changedComponentIds := mapset.NewSet() - - for _, changedPath := range changeDirectoryArray { - for path, component := range componentPaths { - if !changedComponentIds.Contains(component.ID) && strings.HasPrefix(changedPath, path) { - changedComponents = append(changedComponents, component) - changedComponentIds.Add(component.ID) - } - } - } - if debug { - fmt.Printf(" - adding changed components: %s\n", changedComponentIds.String()) - } - - return changedComponents -} - -func getAffectedComponents(graph *ComponentGraph) []*Component { - changedComponents := getChangedComponents(graph) - - affectedComponentIds := mapset.NewSet() - for _, changedComponent := range changedComponents { - dependentComponents := changedComponent.getDependentComponents(graph) - for _, dependentComponent := range dependentComponents { - affectedComponentIds.Add(dependentComponent.ID) - } - } - acs := 0 - i := 0 - for affectedComponentIds.Cardinality() > acs { - if verbose { - fmt.Printf("1) getAffectedComponents: i=%d, acs=%d, new acs=%d, comps: %s\n", i, acs, affectedComponentIds.Cardinality(), affectedComponentIds) - } - for id := range affectedComponentIds.Iter() { - affectedComponent := graph.componentIDs[id.(string)] - dependentComponents := affectedComponent.getDependentComponents(graph) - if verbose { - fmt.Printf("2) getAffectedComponents: affectedComponent id=%s, comps=%v\n", affectedComponent.ID, dependentComponents) - } - - for _, dependentComponent := range dependentComponents { - if verbose { - fmt.Printf("3) getAffectedComponents: adding dependent Component id=%s ....", dependentComponent.ID) - } - if !affectedComponentIds.Contains(dependentComponent.ID) { - affectedComponentIds.Add(dependentComponent.ID) - } - if verbose { - fmt.Println("done!") - } - } - } - acs = affectedComponentIds.Cardinality() - } - var affectedComponents []*Component - for componentID := range affectedComponentIds.Iter() { - affectedComponents = append(affectedComponents, graph.componentIDs[componentID.(string)]) - } - if debug { - fmt.Printf(" - adding affected components: %s\n", affectedComponentIds.String()) - } - return affectedComponents -} - -func (component *Component) isChanged(graph *ComponentGraph) bool { - changedComponents := getChangedComponents(graph) - for _, changedComponent := range changedComponents { - if component.ID == changedComponent.ID { - return true - } - } - return false -} - -func (component *Component) isAffected(graph *ComponentGraph) bool { - affectedComponents := getAffectedComponents(graph) - for _, affectedComponent := range affectedComponents { - if component.ID == affectedComponent.ID { - return true - } - } - return false -} - -func getCurrentComponent() (*Component, error) { - pwd, err := os.Getwd() - if err != nil { - return nil, err - } - return getComponent(pwd) -} - -func getComponent(wd string) (*Component, error) { - var c Component - _, err := c.getComponentFromConfig(path.Join(wd, configFile), rootDirectory) - if err != nil { - return nil, err - } - return &c, nil -} - -func init() { - Main.AddCommand(components) - components.Flags().StringVarP(&componentMode, "mode", "m", "involved", "Define which components you want to get listed (affected, all, changed, involved). Default is 'involved'.") -} diff --git a/cmd/dev/ci/monorepo/depgraph.go b/cmd/dev/ci/monorepo/depgraph.go deleted file mode 100644 index df10ad9a..00000000 --- a/cmd/dev/ci/monorepo/depgraph.go +++ /dev/null @@ -1,236 +0,0 @@ -// Copyright © 2023 Ory Corp -// SPDX-License-Identifier: Apache-2.0 - -package monorepo - -import ( - "errors" - "fmt" - "log" - "os" - "path/filepath" - "strings" - - mapset "github.com/deckarep/golang-set" - "gopkg.in/yaml.v2" -) - -const configFile = "monorepo.yml" - -// Component struct represent the configuration stored in yaml enriched by the relative path of the component in relation to the rootDirectory. -type Component struct { - ID string `yaml:"id"` - Name string `yaml:"name"` - Dependencies []string `yaml:"deps"` - Path string `yaml:"path"` -} - -func (component Component) String() string { - yamlOutput, err := yaml.Marshal(component) - if err != nil { - log.Fatalf("%v", err) - } - return string(yamlOutput[:]) -} - -// ComponentGraph struct represent the graph of all components found in the specified rootDirectory and its subdirectories. -type ComponentGraph struct { - components []*Component - componentIDs map[string]*Component - componentDependencies map[string]mapset.Set - componentPaths map[string]*Component -} - -func (graph *ComponentGraph) getComponentGraph(rootDirectory string) (*ComponentGraph, error) { - //fmt.Println("Scanning Directory Tree: ", rootDirectory) - isDirectory, err := isDirectory(rootDirectory) - if err != nil { - //log.Fatalf("Error accessing '%s': %s\n", rootDirectory, err) - return nil, err - } - if !isDirectory { - return nil, fmt.Errorf("provided path '%s' is not a directory", rootDirectory) - } - if err := filepath.Walk(rootDirectory, func(path string, fi os.FileInfo, err error) error { - if err != nil { - fmt.Println(err) // can't walk here, - return nil // but continue walking elsewhere - } - if fi.IsDir() { - return nil // not a file. ignore. - } - matched, err := filepath.Match(configFile, fi.Name()) - if err != nil { - fmt.Println(err) // malformed pattern - return err // this is fatal. - } - if matched { - if debug { - fmt.Printf("Reading config file '%s'\n", path) - } - var c Component - if _, err := c.getComponentFromConfig(path, rootDirectory); err != nil { - return err - } - graph.addComponent(&c) - } - return nil - }); err != nil { - return nil, err - } - return graph, nil -} - -func isDirectory(path string) (bool, error) { - fileInfo, err := os.Stat(path) - if err != nil { - return false, err - } - return fileInfo.IsDir(), err -} - -func (component *Component) getComponentFromConfig(configFilePath, rootDir string) (*Component, error) { - yamlFile, err := os.ReadFile(configFilePath) - if err != nil { - return nil, fmt.Errorf("config file not found: '%s'", configFilePath) - } - err = yaml.Unmarshal(yamlFile, component) - if err != nil { - return nil, fmt.Errorf("error reading config file '%s', invalid format: %v", configFilePath, err) - } - - configFilePath, err = filepath.Abs(configFilePath) - if err != nil { - return nil, fmt.Errorf("error determining absolute config file path '%s': %v", configFilePath, err) - } - rootDir, err = filepath.Abs(rootDir) - if err != nil { - return nil, fmt.Errorf("error determining absolute root directory path '%s': %v", rootDir, err) - } - rootDir = rootDir + "/" - component.Path = strings.TrimSuffix(strings.TrimPrefix(configFilePath, rootDir), "/"+configFile) - return component, nil -} - -// Resolves the dependency graph -func (graph *ComponentGraph) resolveGraph() (ComponentGraph, error) { - componentIDs := graph.componentIDs - componentDependencies := graph.componentDependencies - - //validating if all declared dependencies are part of the graph - for id, deps := range componentDependencies { - for dep := range deps.Iter() { - _, found := componentIDs[dep.(string)] - if !found { - log.Fatalf("Component '%s': dependency '%s' unknown!\n", id, dep.(string)) - } - } - } - - var resolved ComponentGraph - for len(componentDependencies) != 0 { - readySet := mapset.NewSet() - for id, deps := range componentDependencies { - if deps.Cardinality() == 0 { - //add components with no depedencies directly - readySet.Add(id) - } - } - - // if no components without dependencies were added, but there - // are still components in the componentDependencies map, there must be a circular - // dependency - if readySet.Cardinality() == 0 { - var g ComponentGraph - for id := range componentDependencies { - g.addComponent(graph.componentIDs[id]) - } - - return g, errors.New("circular dependency found") - } - - // remove ready components (without dependencies) from the - // componentDependencies map and add them to resolved graph - for id := range readySet.Iter() { - delete(componentDependencies, id.(string)) - resolved.addComponent(graph.componentIDs[id.(string)]) - } - - // cycle through the original componentDependencies and remove - // components which have been removed in this run from the dependencies - // of other components - for id, deps := range graph.componentDependencies { - diff := deps.Difference(readySet) - graph.componentDependencies[id] = diff - } - } - - return resolved, nil -} - -func (graph *ComponentGraph) listComponents() { - for _, component := range graph.components { - if verbose { - fmt.Printf("%v\n", component) - } else { - fmt.Printf("%s\n", component.ID) - } - } -} - -// displayGraph displays the ComponentGraph. TODO: not just listed the components in the graph, also add dependency -// information (not sure if this is easily doable in shell) -func (graph *ComponentGraph) displayGraph() { - graph.listComponents() -} - -func (graph ComponentGraph) len() int { - return len(graph.components) -} - -func (component *Component) isDependent(cid string) bool { - for _, dependencyID := range component.Dependencies { - if cid == dependencyID { - return true - } - } - return false -} - -func (component *Component) getDependentComponents(graph *ComponentGraph) []*Component { - var dependentComponents = mapset.NewSet() - for _, comp := range graph.components { - if comp.isDependent(component.ID) { - dependentComponents.Add(comp) - } - } - var dependentComponentsArray []*Component - for comp := range dependentComponents.Iter() { - dependentComponentsArray = append(dependentComponentsArray, comp.(*Component)) - } - return dependentComponentsArray -} - -// Adding component to the dependency graph -func (graph *ComponentGraph) addComponent(component *Component) { - //component.Graph = graph - graph.components = append(graph.components, component) - if graph.componentIDs == nil { - graph.componentIDs = make(map[string]*Component) - } - graph.componentIDs[component.ID] = component - - if graph.componentPaths == nil { - graph.componentPaths = make(map[string]*Component) - } - graph.componentPaths[component.Path] = component - - if graph.componentDependencies == nil { - graph.componentDependencies = make(map[string]mapset.Set) - } - dependencySet := mapset.NewSet() - for _, dep := range component.Dependencies { - dependencySet.Add(dep) - } - graph.componentDependencies[component.ID] = dependencySet -} diff --git a/cmd/dev/ci/monorepo/depgraph_test.go b/cmd/dev/ci/monorepo/depgraph_test.go deleted file mode 100644 index bc422f3a..00000000 --- a/cmd/dev/ci/monorepo/depgraph_test.go +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright © 2023 Ory Corp -// SPDX-License-Identifier: Apache-2.0 - -package monorepo - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestMonorepoInvalidFile(t *testing.T) { - var graph ComponentGraph - _, err := graph.getComponentGraph("test/invalidConfigFile") - //todo check for specific error - assert.Error(t, err) -} - -func TestMonorepoCirclular(t *testing.T) { - var graph ComponentGraph - g, err := graph.getComponentGraph("test/circular") - - //successfully read configurations - assert.Nil(t, err, "Successfully read configuration") - _, err = g.resolveGraph() - assert.NotNil(t, err, "Failed resolving graph because of circular dependency") -} - -func TestMonorepoWorking(t *testing.T) { - var graph ComponentGraph - - _, _ = graph.getComponentGraph("test/working") - graph.displayGraph() - - resolved, err := graph.resolveGraph() - assert.Nil(t, err) - assert.Equal(t, 6, resolved.len()) - /* - 1. Invalid Root Directory - 2. No Config Files - 3. Invalid Config Files - 4. Valid Graph - a) Parse - b) Resolved Graph - 5. Trigger - 5. Circular Dependencies - - */ -} diff --git a/cmd/dev/ci/monorepo/main.go b/cmd/dev/ci/monorepo/main.go deleted file mode 100644 index 8ecf766d..00000000 --- a/cmd/dev/ci/monorepo/main.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright © 2023 Ory Corp -// SPDX-License-Identifier: Apache-2.0 - -package monorepo - -import "github.com/spf13/cobra" - -var rootDirectory string -var verbose bool -var debug bool -var pr string -var revisionRange string -var branch string - -// Main cobra command for monorepo support -var Main = &cobra.Command{ - Use: "monorepo", - Short: "Helpers for CircleCI monorepo support", -} - -func isPR() bool { - return len(pr) > 0 -} - -func init() { - Main.PersistentFlags().StringVarP(&rootDirectory, "root", "r", ".", "Root directory to be used to traverse and search for dependency configurations.") - Main.PersistentFlags().BoolVarP(&verbose, "verbose", "v", false, "Verbose output") - Main.PersistentFlags().BoolVarP(&debug, "debug", "d", false, "Debug output") - Main.PersistentFlags().StringVar(&pr, "pr", "", "Pull Request") - Main.PersistentFlags().StringVar(&branch, "branch", "", "Branch") - Main.PersistentFlags().StringVar(&revisionRange, "revisionRange", "", "RevisionRange used to determine changes!") -} diff --git a/cmd/dev/ci/monorepo/run.go b/cmd/dev/ci/monorepo/run.go deleted file mode 100644 index f36d46ea..00000000 --- a/cmd/dev/ci/monorepo/run.go +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright © 2023 Ory Corp -// SPDX-License-Identifier: Apache-2.0 - -package monorepo - -import ( - "fmt" - "os" - "os/exec" - "strings" - - "github.com/spf13/cobra" -) - -var cmds string -var runMode string -var dryRun bool -var inverseMode bool - -// ModeCurrentAffected will execute the specified commands if any of the current components dependecies have changed -const ModeCurrentAffected = "current_affected" - -// ModeCurrentChanged will execute the specified commands if the current component has changed -const ModeCurrentChanged = "current_changed" - -// ModeCurrentInvolved will execute the specified commands if the current component or any of its dependecies have changed -const ModeCurrentInvolved = "current_involved" - -var run = &cobra.Command{ - Use: "run", - Short: "Runs the specified commands on changes", - Long: `Runs the specified commands if the current component (which is defined in the current work directory) is affected by any change in the repository.`, - RunE: func(cmd *cobra.Command, args []string) error { - var graph ComponentGraph - if _, err := graph.getComponentGraph(rootDirectory); err != nil { - return err - } - - c, err := getCurrentComponent() - if err != nil { - return err - } - isAffected := c.isAffected(&graph) - isChanged := c.isChanged(&graph) - isInvolved := isChanged || isAffected - - return runWrapper(c, cmds, runMode, isAffected, isChanged, isInvolved, inverseMode) - }, -} - -func runWrapper(c *Component, cmdLine string, mode string, affected bool, changed bool, involved bool, inverse bool) error { - switch mode { - case ModeCurrentInvolved: - fmt.Printf("%s runCmd: %t (affected: %t, changed: %t, involved: %t, inverse: %t)\n", c.ID, involved != inverse, affected, changed, involved, inverse) - if involved != inverse { - if err := runCmd(c, cmdLine, dryRun); err != nil { - return fmt.Errorf("failed to execute command '%s': %s", cmdLine, err) - } - } - - case ModeCurrentAffected: - fmt.Printf("%s runCmd: %t (affected: %t, inverse: %t)\n", c.ID, affected != inverse, affected, inverse) - if affected != inverse { - if err := runCmd(c, cmdLine, dryRun); err != nil { - return fmt.Errorf("failed to execute command '%s': %s", cmdLine, err) - } - } - - case ModeCurrentChanged: - fmt.Printf("%s runCmd: %t (changed: %t, inverse: %t)\n", c.ID, changed != inverse, changed, inverse) - if changed != inverse { - if err := runCmd(c, cmdLine, dryRun); err != nil { - return fmt.Errorf("failed to execute command '%s': %s", cmdLine, err) - } - } - - default: - return fmt.Errorf("unknown runMode: %s", runMode) - } - return nil -} - -func runCmd(component *Component, cmdLine string, dryRun bool) error { - if debug { - fmt.Printf("runCmd for '%s (%s)' component (dry-run: %t, cmds: '%s')\n", component.ID, component.Path, dryRun, cmdLine) - } - if dryRun { - fmt.Print("Skipping execution because --dry-run was set.") - return nil - } - - args := strings.Split(cmdLine, " ") - cmd := exec.Command(args[0], args[1:]...) - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - - return cmd.Run() -} - -func init() { - Main.AddCommand(run) - run.Flags().StringVarP(&cmds, "commands", "c", "", "Commands to be run if current component is affected.") - run.Flags().StringVarP(&runMode, "mode", "m", "current_involved", "Defines the mode of this run command. Supported values are: current_changed, current_affected, all_changed, all_affected. Default is current_involved.") - run.Flags().BoolVar(&dryRun, "dry-run", false, "If dry-run is used, commands are only displayed, but not executed!") - run.Flags().BoolVar(&inverseMode, "inverse", false, "If inverse is used, the specified commands will be executes if the current component is not affected/involved/changed (depending on mode)!") -} diff --git a/cmd/dev/ci/monorepo/run_test.go b/cmd/dev/ci/monorepo/run_test.go deleted file mode 100644 index 4021c305..00000000 --- a/cmd/dev/ci/monorepo/run_test.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright © 2023 Ory Corp -// SPDX-License-Identifier: Apache-2.0 - -package monorepo - -import ( - "fmt" - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestDryRun(t *testing.T) { - fmt.Println("TestDryRun") - c := Component{ID: "component1", Name: "", Path: "./"} - cmdLine := "UnknownCommand" - err := runCmd(&c, cmdLine, true) - assert.NoError(t, err, "Expected no error, as dryRun only prints out the command, but does not execute it!") - - err = runCmd(&c, cmdLine, false) - assert.Error(t, err, "Expected error as comannd specified does not exist!") -} - -func TestInverseRun(t *testing.T) { - fmt.Println("TestDryRun") - c := Component{ID: "component1", Name: "", Path: "./"} - - //not the nicest way to test, but for now the fastest. We use the error if a command gets executed to test if - //the conditions are handled correctly. In addition we can define a test struct with inputs and outputs to reduce - //code. - cmdLine := "unknowncmd" - err := runWrapper(&c, cmdLine, ModeCurrentAffected, true, false, false, false) - assert.Error(t, err, "Expected error, as component is affected and inverseMode set to false!") - err = runWrapper(&c, cmdLine, ModeCurrentAffected, false, false, false, true) - assert.Error(t, err, "Expected error, as component is not affected and inverseMode set to true!") - err = runWrapper(&c, cmdLine, ModeCurrentAffected, true, false, false, true) - assert.NoError(t, err, "Expected no error, as component is affected and inverseMode set to true!") - err = runWrapper(&c, cmdLine, ModeCurrentAffected, false, false, false, false) - assert.NoError(t, err, "Expected no error, as component is not affected and inverseMode set to false!") - - err = runWrapper(&c, cmdLine, ModeCurrentChanged, false, true, false, false) - assert.Error(t, err, "Expected error, as component has changed and inverseMode set to false!") - err = runWrapper(&c, cmdLine, ModeCurrentChanged, false, false, false, true) - assert.Error(t, err, "Expected error, as component has not changed and inverseMode set to true!") - err = runWrapper(&c, cmdLine, ModeCurrentChanged, false, true, false, true) - assert.NoError(t, err, "Expected no error, as component has changed and inverseMode set to true!") - err = runWrapper(&c, cmdLine, ModeCurrentChanged, false, false, false, false) - assert.NoError(t, err, "Expected no error, as component has not changed and inverseMode set to false!") - - err = runWrapper(&c, cmdLine, ModeCurrentChanged, false, true, true, false) - assert.Error(t, err, "Expected error, as component is involved and inverseMode set to false!") - err = runWrapper(&c, cmdLine, ModeCurrentChanged, false, false, false, true) - assert.Error(t, err, "Expected error, as component is not involved and inverseMode set to true!") - err = runWrapper(&c, cmdLine, ModeCurrentChanged, false, true, true, true) - assert.NoError(t, err, "Expected no error, as component is involved and inverseMode set to true!") - err = runWrapper(&c, cmdLine, ModeCurrentChanged, false, false, false, false) - assert.NoError(t, err, "Expected no error, as component is not involved and inverseMode set to false!") -} diff --git a/cmd/dev/ci/monorepo/test/circular/componentA/monorepo.yml b/cmd/dev/ci/monorepo/test/circular/componentA/monorepo.yml deleted file mode 100644 index 0440be50..00000000 --- a/cmd/dev/ci/monorepo/test/circular/componentA/monorepo.yml +++ /dev/null @@ -1,4 +0,0 @@ -name: Component A -id: component-a -deps: - - component-b diff --git a/cmd/dev/ci/monorepo/test/circular/componentB/monorepo.yml b/cmd/dev/ci/monorepo/test/circular/componentB/monorepo.yml deleted file mode 100644 index cb31ca61..00000000 --- a/cmd/dev/ci/monorepo/test/circular/componentB/monorepo.yml +++ /dev/null @@ -1,4 +0,0 @@ -name: Component B -id: component-b -deps: - - component-a diff --git a/cmd/dev/ci/monorepo/test/invalidConfigFile/monorepo.yml b/cmd/dev/ci/monorepo/test/invalidConfigFile/monorepo.yml deleted file mode 100644 index e466dcbd..00000000 --- a/cmd/dev/ci/monorepo/test/invalidConfigFile/monorepo.yml +++ /dev/null @@ -1 +0,0 @@ -invalid \ No newline at end of file diff --git a/cmd/dev/ci/monorepo/test/working/backoffice/docker/monorepo.yml b/cmd/dev/ci/monorepo/test/working/backoffice/docker/monorepo.yml deleted file mode 100644 index c75801d2..00000000 --- a/cmd/dev/ci/monorepo/test/working/backoffice/docker/monorepo.yml +++ /dev/null @@ -1,5 +0,0 @@ -name: Backoffice Docker Container -id: backoffice-docker -deps: - - backoffice - - terraform diff --git a/cmd/dev/ci/monorepo/test/working/backoffice/helm/monorepo.yml b/cmd/dev/ci/monorepo/test/working/backoffice/helm/monorepo.yml deleted file mode 100644 index 61115639..00000000 --- a/cmd/dev/ci/monorepo/test/working/backoffice/helm/monorepo.yml +++ /dev/null @@ -1,2 +0,0 @@ -name: Backoffice Helm Chart -id: backoffice-helm diff --git a/cmd/dev/ci/monorepo/test/working/backoffice/src/monorepo.yml b/cmd/dev/ci/monorepo/test/working/backoffice/src/monorepo.yml deleted file mode 100644 index 37bd3f76..00000000 --- a/cmd/dev/ci/monorepo/test/working/backoffice/src/monorepo.yml +++ /dev/null @@ -1,2 +0,0 @@ -name: Backoffice -id: backoffice \ No newline at end of file diff --git a/cmd/dev/ci/monorepo/test/working/console/helm/monorepo.yml b/cmd/dev/ci/monorepo/test/working/console/helm/monorepo.yml deleted file mode 100644 index a13abcb4..00000000 --- a/cmd/dev/ci/monorepo/test/working/console/helm/monorepo.yml +++ /dev/null @@ -1,2 +0,0 @@ -name: Console Helm Chart -id: console-helm diff --git a/cmd/dev/ci/monorepo/test/working/console/src/monorepo.yml b/cmd/dev/ci/monorepo/test/working/console/src/monorepo.yml deleted file mode 100644 index 22bc0ef1..00000000 --- a/cmd/dev/ci/monorepo/test/working/console/src/monorepo.yml +++ /dev/null @@ -1,2 +0,0 @@ -name: Console -id: console \ No newline at end of file diff --git a/cmd/dev/ci/monorepo/test/working/stack/monorepo.yml b/cmd/dev/ci/monorepo/test/working/stack/monorepo.yml deleted file mode 100644 index 5c57be15..00000000 --- a/cmd/dev/ci/monorepo/test/working/stack/monorepo.yml +++ /dev/null @@ -1,2 +0,0 @@ -name: Terraform -id: terraform \ No newline at end of file diff --git a/cmd/dev/ci/orbs/bump.go b/cmd/dev/ci/orbs/bump.go index ab341388..74840472 100644 --- a/cmd/dev/ci/orbs/bump.go +++ b/cmd/dev/ci/orbs/bump.go @@ -27,44 +27,48 @@ var orbs = []string{ var orbLatestRegex = regexp.MustCompile(`(?im)^Latest:\s(.*)$`) -var bump = &cobra.Command{ - Use: "bump <[.circleci/config.yml]>", - Args: cobra.RangeArgs(0, 1), - Short: "Bump CircleCI Orb versions", - Long: `Bumps ORY's CircleCI Orb versions to their newest version. +func newBumpCmd() *cobra.Command { + c := &cobra.Command{ + Use: "bump <[.circleci/config.yml]>", + Args: cobra.RangeArgs(0, 1), + Short: "Bump CircleCI Orb versions", + Long: `Bumps ORY's CircleCI Orb versions to their newest version. If no argument is supplied, this command uses the default ".circleci/config.yml" location. `, - Run: func(cmd *cobra.Command, args []string) { - path := ".circleci/config.yml" - if len(args) == 1 { - path = args[0] - } - - var wg sync.WaitGroup - var lock sync.Mutex - versions := map[string]string{} - for _, id := range orbs { - wg.Add(1) - go getVersion(id, versions, &lock, &wg) - } - wg.Wait() - - config, err := os.ReadFile(path) - pkg.Check(err) - - for k, r := range versions { - replace := regexp.MustCompile(fmt.Sprintf("(?im)^(\\s\\s[^:]+:\\s)(%s@[0-9a-zA-Z\\.]+)$", k)) - config = []byte(replace.ReplaceAllString(string(config), "${1}"+r)) - } - - if flagx.MustGetBool(cmd, "write") { - pkg.Check(os.WriteFile(path, config, 0666)) - fmt.Printf("Successfully wrote new orb versions to CircleCI config file: %s\n", path) - } else { - fmt.Println(string(config)) - } - }, + Run: func(cmd *cobra.Command, args []string) { + path := ".circleci/config.yml" + if len(args) == 1 { + path = args[0] + } + + var wg sync.WaitGroup + var lock sync.Mutex + versions := map[string]string{} + for _, id := range orbs { + wg.Add(1) + go getVersion(id, versions, &lock, &wg) + } + wg.Wait() + + config, err := os.ReadFile(path) + pkg.Check(err) + + for k, r := range versions { + replace := regexp.MustCompile(fmt.Sprintf("(?im)^(\\s\\s[^:]+:\\s)(%s@[0-9a-zA-Z\\.]+)$", k)) + config = []byte(replace.ReplaceAllString(string(config), "${1}"+r)) + } + + if flagx.MustGetBool(cmd, "write") { + pkg.Check(os.WriteFile(path, config, 0666)) + fmt.Printf("Successfully wrote new orb versions to CircleCI config file: %s\n", path) + } else { + fmt.Println(string(config)) + } + }, + } + c.Flags().BoolP("write", "w", false, "Write output to CircleCI config file instead of stdout.") + return c } func getVersion(id string, versions map[string]string, l *sync.Mutex, wg *sync.WaitGroup) { @@ -85,8 +89,3 @@ but got: versions[id] = matches[0][1] l.Unlock() } - -func init() { - Main.AddCommand(bump) - bump.Flags().BoolP("write", "w", false, "Write output to CircleCI config file instead of stdout.") -} diff --git a/cmd/dev/ci/orbs/main.go b/cmd/dev/ci/orbs/main.go index d7de9f03..8ae42774 100644 --- a/cmd/dev/ci/orbs/main.go +++ b/cmd/dev/ci/orbs/main.go @@ -7,7 +7,11 @@ import ( "github.com/spf13/cobra" ) -var Main = &cobra.Command{ - Use: "orbs", - Short: "Helpers for CircleCI", +func NewCommand() *cobra.Command { + c := &cobra.Command{ + Use: "orbs", + Short: "Helpers for CircleCI", + } + c.AddCommand(newBumpCmd()) + return c } diff --git a/cmd/dev/headers/copyright.go b/cmd/dev/headers/copyright.go index b6387918..1f1ca274 100644 --- a/cmd/dev/headers/copyright.go +++ b/cmd/dev/headers/copyright.go @@ -104,41 +104,38 @@ func fileTypeNeedsCopyrightHeader(path string) bool { return !comments.ContainsFileType(noHeadersFor, comments.GetFileType(path)) } -var copyright = &cobra.Command{ - Use: "copyright", - Short: "Adds the copyright header to all files in the current directory", - Long: `Adds the copyright header to all files that need one in the current directory. - -Does not add the header to files listed in .gitignore and .prettierignore.`, - RunE: func(cmd *cobra.Command, args []string) error { - year, _, _ := time.Now().Date() - var template string - switch headerType { - case headerTypeProprietary: - template = HEADER_TEMPLATE_PROPRIETARY - case headerTypeOpenSource: - template = HEADER_TEMPLATE_OPEN_SOURCE - default: - return fmt.Errorf("unknown value for type, expected one of %q or %q", headerTypeOpenSource, headerTypeProprietary) - } - return AddHeaders(".", fmt.Sprintf(template, year), exclude, regexp.MustCompile(HEADER_REGEXP)) - }, -} - -func init() { - Main.AddCommand(copyright) - copyright.Flags().StringSliceVarP(&exclude, "exclude", "e", []string{}, "folders to exclude, provide comma-separated values or multiple instances of this flag") - copyright.Flags().StringVarP(&headerType, "type", "t", headerTypeOpenSource, fmt.Sprintf("type of header to create (%q, %q)", headerTypeOpenSource, headerTypeProprietary)) -} - -// contains the folders to exclude -var exclude []string - -// indicates whether to create a headerType header -var headerType string - -// the possible values for `headerType` variable +// the possible values for the --type CLI flag const ( headerTypeOpenSource string = "open-source" headerTypeProprietary string = "proprietary" ) + +func newCopyrightCmd() *cobra.Command { + var ( + exclude []string + headerType string + ) + c := &cobra.Command{ + Use: "copyright", + Short: "Adds the copyright header to all files in the current directory", + Long: `Adds the copyright header to all files that need one in the current directory. + +Does not add the header to files listed in .gitignore and .prettierignore.`, + RunE: func(cmd *cobra.Command, args []string) error { + year, _, _ := time.Now().Date() + var template string + switch headerType { + case headerTypeProprietary: + template = HEADER_TEMPLATE_PROPRIETARY + case headerTypeOpenSource: + template = HEADER_TEMPLATE_OPEN_SOURCE + default: + return fmt.Errorf("unknown value for type, expected one of %q or %q", headerTypeOpenSource, headerTypeProprietary) + } + return AddHeaders(".", fmt.Sprintf(template, year), exclude, regexp.MustCompile(HEADER_REGEXP)) + }, + } + c.Flags().StringSliceVarP(&exclude, "exclude", "e", []string{}, "folders to exclude, provide comma-separated values or multiple instances of this flag") + c.Flags().StringVarP(&headerType, "type", "t", headerTypeOpenSource, fmt.Sprintf("type of header to create (%q, %q)", headerTypeOpenSource, headerTypeProprietary)) + return c +} diff --git a/cmd/dev/headers/cp.go b/cmd/dev/headers/cp.go index 6d4f49fb..7586a64a 100644 --- a/cmd/dev/headers/cp.go +++ b/cmd/dev/headers/cp.go @@ -126,29 +126,26 @@ func folderExists(path string) (bool, error) { return dstStat.IsDir(), nil } -var copy = &cobra.Command{ - Use: "cp", - Short: "Behaves like cp but adds a header pointing to the original to copied files.", - Args: cobra.ExactArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - if recursive { - return CopyFiles(args[0], args[1]) - } else if noOverride { - return CopyFileNoOverwrite(args[0], args[1]) - } else { - return CopyFile(args[0], args[1]) - } - }, -} - -func init() { - Main.AddCommand(copy) - copy.Flags().BoolVarP(&recursive, "recursive", "r", false, "Whether to copy files in subdirectories") - copy.Flags().BoolVarP(&recursive, "no-clobber", "n", false, "Do not overwrite an existing file") +func newCpCmd() *cobra.Command { + var ( + recursive bool + noOverride bool + ) + c := &cobra.Command{ + Use: "cp", + Short: "Behaves like cp but adds a header pointing to the original to copied files.", + Args: cobra.ExactArgs(2), + RunE: func(cmd *cobra.Command, args []string) error { + if recursive { + return CopyFiles(args[0], args[1]) + } else if noOverride { + return CopyFileNoOverwrite(args[0], args[1]) + } else { + return CopyFile(args[0], args[1]) + } + }, + } + c.Flags().BoolVarP(&recursive, "recursive", "r", false, "Whether to copy files in subdirectories") + c.Flags().BoolVarP(&noOverride, "no-clobber", "n", false, "Do not overwrite an existing file") + return c } - -// contains the value of the "-r" CLI flag -var recursive bool - -// contains the value of the "-n" CLI flag -var noOverride bool diff --git a/cmd/dev/headers/main.go b/cmd/dev/headers/main.go index b465a73c..7e195097 100644 --- a/cmd/dev/headers/main.go +++ b/cmd/dev/headers/main.go @@ -5,7 +5,11 @@ package headers import "github.com/spf13/cobra" -var Main = &cobra.Command{ - Use: "headers", - Short: "Adds language-specific headers to files", +func NewCommand() *cobra.Command { + c := &cobra.Command{ + Use: "headers", + Short: "Adds language-specific headers to files", + } + c.AddCommand(newCopyrightCmd(), newCpCmd()) + return c } diff --git a/cmd/dev/main.go b/cmd/dev/main.go index 97d4d815..23a15fab 100644 --- a/cmd/dev/main.go +++ b/cmd/dev/main.go @@ -16,23 +16,23 @@ import ( "github.com/ory/cli/cmd/dev/swagger" ) -var Main = &cobra.Command{ - Use: "dev", - Short: "Developer tools for writing Ory software", - Long: `Developer tools and convenience functions for writing Ory software. +func NewCommand() *cobra.Command { + c := &cobra.Command{ + Use: "dev", + Short: "Developer tools for writing Ory software", + Long: `Developer tools and convenience functions for writing Ory software. Please check the individual commands for more information!`, - Hidden: true, -} - -func init() { - Main.AddCommand( - newsletter.Main, - markdown.Main, - release.Main, - swagger.Main, - ci.Main, - schema.Main, - openapi.Main, - headers.Main, + Hidden: true, + } + c.AddCommand( + newsletter.NewCommand(), + markdown.NewCommand(), + release.NewCommand(), + swagger.NewCommand(), + ci.NewCommand(), + schema.NewCommand(), + openapi.NewCommand(), + headers.NewCommand(), ) + return c } diff --git a/cmd/dev/markdown/main.go b/cmd/dev/markdown/main.go index a16a45ea..3fecacee 100644 --- a/cmd/dev/markdown/main.go +++ b/cmd/dev/markdown/main.go @@ -7,7 +7,11 @@ import ( "github.com/spf13/cobra" ) -var Main = &cobra.Command{ - Use: "markdown", - Short: "Utilities for working with markdown", +func NewCommand() *cobra.Command { + c := &cobra.Command{ + Use: "markdown", + Short: "Utilities for working with markdown", + } + c.AddCommand(newRenderCmd()) + return c } diff --git a/cmd/dev/markdown/render.go b/cmd/dev/markdown/render.go index 067ca0f6..309b7330 100644 --- a/cmd/dev/markdown/render.go +++ b/cmd/dev/markdown/render.go @@ -17,20 +17,18 @@ import ( "github.com/ory/cli/cmd/pkg" ) -func init() { - Main.AddCommand(render) -} - -var render = &cobra.Command{ - Use: "render ", - Args: cobra.ExactArgs(1), - Short: "Render a Markdown file", - Run: func(cmd *cobra.Command, args []string) { - changelogRaw, err := os.ReadFile(args[0]) - pkg.Check(err) - - fmt.Println(renderMarkdown(changelogRaw)) - }, +func newRenderCmd() *cobra.Command { + return &cobra.Command{ + Use: "render ", + Args: cobra.ExactArgs(1), + Short: "Render a Markdown file", + Run: func(cmd *cobra.Command, args []string) { + changelogRaw, err := os.ReadFile(args[0]) + pkg.Check(err) + + fmt.Println(renderMarkdown(changelogRaw)) + }, + } } func renderMarkdown(source []byte) template.HTML { diff --git a/cmd/dev/newsletter/.snapshots/TestRenderMarkdownLong.json b/cmd/dev/newsletter/.snapshots/TestRenderMarkdownLong.json index 1dea1aeb..e7d787df 100644 --- a/cmd/dev/newsletter/.snapshots/TestRenderMarkdownLong.json +++ b/cmd/dev/newsletter/.snapshots/TestRenderMarkdownLong.json @@ -1 +1 @@ -"\n\n\n\u003c!DOCTYPE html\u003e\n\n\u003chtml lang='en'\u003e\n\u003chead\u003e\n \u003ctitle\u003eOry Kratos v0.1.0 is here!\u003c/title\u003e\n \u003cmeta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /\u003e\n \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1\"\u003e\n \u003cmeta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" /\u003e\n \u003cstyle type=\"text/css\"\u003e\n #outlook a {\n padding: 0;\n }\n pre {\n background-color: #f5f5f5;\n padding: 8px;\n }\n code {\n background-color: #f5f5f5;\n padding: 2px 4px;\n }\n body {\n margin: 0;\n padding: 0;\n -webkit-text-size-adjust: 100%;\n -ms-text-size-adjust: 100%;\n }\n table,\n td {\n border-collapse: collapse;\n mso-table-lspace: 0pt;\n mso-table-rspace: 0pt;\n }\n img {\n border: 0;\n height: auto;\n line-height: 100%;\n outline: none;\n text-decoration: none;\n -ms-interpolation-mode: bicubic;\n }\n p {\n display: block;\n margin: 0;\n }\n \u003c/style\u003e\n \u003clink\n href=\"https://fonts.googleapis.com/css?family=Inter:700,400,600\"\n rel=\"stylesheet\"\n type=\"text/css\"\n /\u003e\n \u003cstyle type=\"text/css\"\u003e\u003c/style\u003e\n \u003cstyle type=\"text/css\"\u003e\n @media only screen and (min-width: 599px) {\n .pc100 {\n width: 100% !important;\n max-width: 100%;\n }\n .pc48-30508474576271 {\n width: 48.30508474576271% !important;\n max-width: 48.30508474576271%;\n }\n .pc3-389830508474576 {\n width: 3.389830508474576% !important;\n max-width: 3.389830508474576%;\n }\n .xc600 {\n width: 1200px !important;\n max-width: 1200px;\n }\n .xc32 {\n width: 32px !important;\n max-width: 32px;\n }\n .xc16 {\n width: 16px !important;\n max-width: 16px;\n }\n .xc440 {\n \n \n }\n }\n \u003c/style\u003e\n \u003cstyle media=\"screen and (min-width:599px)\"\u003e\n .moz-text-html .pc100 {\n width: 100% !important;\n max-width: 100%;\n }\n .moz-text-html .pc48-30508474576271 {\n width: 48.30508474576271% !important;\n max-width: 48.30508474576271%;\n }\n .moz-text-html .pc3-389830508474576 {\n width: 3.389830508474576% !important;\n max-width: 3.389830508474576%;\n }\n .moz-text-html .xc600 {\n width: 1200px !important;\n max-width: 1200px;\n }\n .moz-text-html .xc32 {\n width: 32px !important;\n max-width: 32px;\n }\n .moz-text-html .xc16 {\n width: 16px !important;\n max-width: 16px;\n }\n .moz-text-html .xc440 {\n \n \n }\n \u003c/style\u003e\n \u003cstyle type=\"text/css\"\u003e\n @media only screen and (max-width: 599px) {\n table.fwm {\n width: 100% !important;\n }\n td.fwm {\n width: auto !important;\n }\n }\n \u003c/style\u003e\n \u003cstyle type=\"text/css\"\u003e\n u + .emailify a,\n #MessageViewBody a,\n a[x-apple-data-detectors] {\n color: inherit !important;\n text-decoration: none !important;\n font-size: inherit !important;\n font-family: inherit !important;\n font-weight: inherit !important;\n line-height: inherit !important;\n }\n span.MsoHyperlink {\n mso-style-priority: 99;\n color: inherit;\n }\n span.MsoHyperlinkFollowed {\n mso-style-priority: 99;\n color: inherit;\n }\n u + .emailify .glist {\n margin-left: 0 !important;\n }\n @media only screen and (max-width: 599px) {\n .emailify {\n height: 100% !important;\n margin: 0 !important;\n padding: 0 !important;\n width: 100% !important;\n }\n u + .emailify .glist {\n margin-left: 25px !important;\n }\n td.x {\n padding-left: 0 !important;\n padding-right: 0 !important;\n }\n .fwm img {\n max-width: 100% !important;\n height: auto !important;\n }\n td.stk {\n border: 0 !important;\n }\n br.sb {\n display: none !important;\n }\n .thd-1 .i-thumbnail {\n display: inline-block !important;\n height: auto !important;\n overflow: hidden !important;\n }\n .hd-1 {\n display: block !important;\n height: auto !important;\n overflow: visible !important;\n }\n .ht-1 {\n display: table !important;\n height: auto !important;\n overflow: visible !important;\n }\n .hr-1 {\n display: table-row !important;\n height: auto !important;\n overflow: visible !important;\n }\n .hc-1 {\n display: table-cell !important;\n height: auto !important;\n overflow: visible !important;\n }\n div.r.pr-16 \u003e table \u003e tbody \u003e tr \u003e td,\n div.r.pr-16 \u003e div \u003e table \u003e tbody \u003e tr \u003e td {\n padding-right: 16px !important;\n }\n div.r.pl-16 \u003e table \u003e tbody \u003e tr \u003e td,\n div.r.pl-16 \u003e div \u003e table \u003e tbody \u003e tr \u003e td {\n padding-left: 16px !important;\n }\n td.i.w-60 img {\n width: 60px !important;\n }\n td.i.h-30 img {\n height: 30px !important;\n }\n div.r.pt-0 \u003e table \u003e tbody \u003e tr \u003e td,\n div.r.pt-0 \u003e div \u003e table \u003e tbody \u003e tr \u003e td {\n padding-top: 0px !important;\n }\n div.r.pr-0 \u003e table \u003e tbody \u003e tr \u003e td,\n div.r.pr-0 \u003e div \u003e table \u003e tbody \u003e tr \u003e td {\n padding-right: 0px !important;\n }\n div.r.pb-0 \u003e table \u003e tbody \u003e tr \u003e td,\n div.r.pb-0 \u003e div \u003e table \u003e tbody \u003e tr \u003e td {\n padding-bottom: 0px !important;\n }\n div.r.pl-0 \u003e table \u003e tbody \u003e tr \u003e td,\n div.r.pl-0 \u003e div \u003e table \u003e tbody \u003e tr \u003e td {\n padding-left: 0px !important;\n }\n .hm-1 {\n display: none !important;\n max-width: 0 !important;\n max-height: 0 !important;\n overflow: hidden !important;\n mso-hide: all !important;\n }\n div.g.mb-16 \u003e table \u003e tbody \u003e tr \u003e td {\n padding-bottom: 16px !important;\n }\n }\n \u003c/style\u003e\n \u003cmeta name=\"color-scheme\" content=\"light dark\" /\u003e\n \u003cmeta name=\"supported-color-schemes\" content=\"light dark\" /\u003e\n\n\u003c/head\u003e\n\u003cbody\nlink=\"#3d53f5\"\nvlink=\"#3d53f5\"\nclass=\"emailify\"\nstyle=\"word-spacing: normal; background-color: #e5e5e5\"\n\u003e\n\u003cdiv class=\"bg\" style=\"background-color: #e5e5e5\"\u003e\n\n \u003cdiv\n class=\"r pr-16 pl-16\"\n style=\"\n background: #fffffe;\n background-color: #fffffe;\n margin: 0px auto;\n border-radius: 0;\n max-width: 1200px;\n \"\n \u003e\n \u003ctable\n align=\"center\"\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"\n background: #fffffe;\n background-color: #fffffe;\n width: 100%;\n border-radius: 0;\n \"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n style=\"\n border: none;\n direction: ltr;\n font-size: 0;\n padding: 16px 64px 16px 64px;\n text-align: left;\n \"\n \u003e′¨\n \u003cdiv\n class=\"pc100 ogf\"\n style=\"\n font-size: 0;\n line-height: 0;\n text-align: left;\n display: inline-block;\n width: 100%;\n direction: ltr;\n \"\n \u003e\n \u003cdiv\n class=\"pc48-30508474576271 ogf m c\"\n style=\"\n font-size: 0;\n text-align: left;\n direction: ltr;\n display: inline-block;\n vertical-align: middle;\n width: 48.30508474576271%;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"\n background-color: transparent;\n border: none;\n vertical-align: middle;\n \"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n align=\"left\"\n class=\"i w-60 h-30\"\n style=\"\n font-size: 0;\n padding: 0;\n padding-bottom: 0;\n word-break: break-word;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"\n border-collapse: collapse;\n border-spacing: 0;\n \"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd style=\"width: 80px\"\u003e\n \u003ca\n href=\"https://www.ory.sh/\"\n target=\"_blank\"\n \u003e\n \u003cimg\n alt=\"\"\n height=\"auto\"\n src=\"https://f002.backblazeb2.com/file/emailify/879566e4ded61f9133eb4ae85666e0f8.png\"\n style=\"\n border: 0;\n border-radius: 0;\n display: block;\n outline: none;\n text-decoration: none;\n height: auto;\n width: 100%;\n font-size: 13px;\n \"\n width=\"80\"\n /\u003e\u003c/a\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n \u003cdiv\n class=\"pc3-389830508474576 ogf g\"\n style=\"\n font-size: 0;\n text-align: left;\n direction: ltr;\n display: inline-block;\n vertical-align: top;\n width: 3.389830508474576%;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd style=\"vertical-align: top; padding: 0\"\u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n \u003cdiv\n class=\"pc48-30508474576271 ogf c\"\n style=\"\n font-size: 0;\n text-align: left;\n direction: ltr;\n display: inline-block;\n vertical-align: middle;\n width: 48.30508474576271%;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"\n background-color: transparent;\n border: none;\n vertical-align: middle;\n \"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n align=\"right\"\n class=\"x\"\n style=\"\n font-size: 0;\n padding: 0;\n padding-bottom: 0;\n word-break: break-word;\n \"\n \u003e\n \u003cdiv\n style=\"\n font-family: Inter, Arial, sans-serif;\n font-size: 16px;\n line-height: 28px;\n text-align: right;\n color: #000000;\n \"\n \u003e\n \u003cp style=\"margin: 0; text-align: right\"\u003e\n \u003cspan\n style=\"\n mso-line-height-rule: exactly;\n font-size: 16px;\n font-family: Inter, Arial, sans-serif;\n font-weight: 700;\n color: #171717;\n line-height: 28px;\n \"\n \u003eOry Security Newsletter\u003c/span\n \u003e\n \u003c/p\u003e\n \u003c/div\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n \u003c/div\u003e\n\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n\n \n \u003cdiv\n class=\"r pr-16 pl-16\"\n style=\"\n background: #fcfcfc;\n background-color: #fcfcfc;\n margin: 0px auto;\n border-radius: 0;\n max-width: 1200px;\n \"\n \u003e\n \u003ctable\n align=\"center\"\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"\n background: #fcfcfc;\n background-color: #fcfcfc;\n width: 100%;\n border-radius: 0;\n \"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n style=\"\n border: none;\n direction: ltr;\n font-size: 0;\n padding: 48px 32px 48px 32px;\n text-align: left;\n \"\n \u003e\n \n \u003cdiv\n class=\"xc32 ogf m\"\n style=\"\n font-size: 0;\n text-align: left;\n direction: ltr;\n display: inline-block;\n vertical-align: middle;\n width: 100%;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd style=\"vertical-align: middle; padding: 0 0 0 0\"\u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n align=\"left\"\n class=\"i hm-1\"\n style=\"\n font-size: 0;\n padding: 0;\n word-break: break-word;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"\n border-collapse: collapse;\n border-spacing: 0;\n \"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd style=\"width: 32px\"\u003e\n \u003cimg\n alt=\"\"\n height=\"auto\"\n src=\"https://f002.backblazeb2.com/file/emailify/150a8c06dcaa45901e3887296457cc12.jpg\"\n style=\"\n border: 0;\n border-radius: 0;\n display: block;\n outline: none;\n text-decoration: none;\n height: auto;\n width: 100%;\n font-size: 13px;\n \"\n width=\"32\"\n /\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n \n \u003cdiv\n class=\"xc16 ogf g mb-16\"\n style=\"\n font-size: 0;\n text-align: left;\n direction: ltr;\n display: inline-block;\n vertical-align: top;\n width: 100%;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd style=\"vertical-align: top; padding: 0\"\u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n \n \u003cdiv\n class=\"xc440 ogf m c\"\n style=\"\n font-size: 0;\n text-align: left;\n direction: ltr;\n display: inline-block;\n vertical-align: middle;\n width: 100%;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"\n background-color: transparent;\n border: none;\n vertical-align: middle;\n \"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n align=\"left\"\n class=\"x m\"\n style=\"\n font-size: 0;\n padding: 0;\n padding-bottom: 16px;\n word-break: break-word;\n \"\n \u003e\n \u003cdiv\n style=\"\n font-family: Inter, Arial, sans-serif;\n font-size: 37px;\n line-height: 52px;\n text-align: left;\n color: #000000;\n \"\n \u003e\n \u003cp style=\"margin: 0; text-align: center\"\u003e\n \u003cspan\n style=\"\n mso-line-height-rule: exactly;\n font-size: 37px;\n font-family: Inter, Arial, sans-serif;\n font-weight: 400;\n color: #171717;\n line-height: 52px;\n \"\n \u003eOry Kratos v0.1.0\u003c/span\n \u003e \u003cbr\u003e \u003cspan style=\"font-size: 16px; font-weight: 400;\"\u003eis here!\u003c/span\u003e\u003cbr\u003e\n \u003cspan style=\"font-size: 16px; font-weight: 400;\"\u003e\u003ca href=\"https://www.ory.sh/ory/kratos\" target=\"_blank\"\u003eWebsite\u003c/a\u003e\u0026nbsp;| \u003ca href=\"https://github.com/ory/ory/kratos\" target=\"_blank\"\u003eGitHub\u003c/a\u003e |\u0026nbsp;\u003ca href=\"https://github.com/ory/ory/kratos/blob/master/CHANGELOG.md\" target=\"_blank\"\u003eChangelog\u003c/a\u003e\u0026nbsp;|\u0026nbsp;\u003ca href=\"https://github.com/ory/ory/kratos/blob/master/UPGRADE.md\" target=\"_blank\"\u003eUpgrade Guide\u003c/a\u003e\u003cbr\u003e\u003c/span\u003e\n\n \u003c/p\u003e\n \u003c/div\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\n class=\"s m\"\n style=\"\n font-size: 0;\n padding: 0;\n padding-bottom: 16px;\n word-break: break-word;\n \"\n \u003e\n \u003cdiv style=\"height: 4px; line-height: 4px\"\u003e\n \u0026#8202;\n \u003c/div\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\n vertical-align=\"top\"\n class=\"c\"\n style=\"\n font-size: 0;\n padding-bottom: 0;\n word-break: break-word;\n \"\n \u003e\n \u003cdiv\n class=\"xc440 ogf c\"\n style=\"\n font-size: 0;\n text-align: left;\n direction: ltr;\n display: inline-block;\n vertical-align: top;\n width: 100%;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n style=\"\n background-color: transparent;\n border: none;\n vertical-align: top;\n padding-bottom: 0;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n align=\"left\"\n class=\"x m\"\n style=\"\n font-size: 0;\n padding: 0;\n padding-bottom: 16px;\n word-break: break-word;\n \"\n \u003e\n \u003cdiv\n style=\"\n font-family: Inter, Arial,\n sans-serif;\n font-size: 16px;\n line-height: 28px;\n text-align: left;\n color: #000000;\n \"\n \u003e\n \u003cp\n style=\"\n margin: 0;\n text-align: left;\n \"\n \u003e\n \u003cspan\n style=\"\n mso-line-height-rule: exactly;\n font-size: 16px;\n font-family: Inter, Arial,\n sans-serif;\n font-weight: 400;\n color: #616161;\n line-height: 28px;\n \"\n \u003eiuaw4hri\u003cbr\u003e\n \u003c/span\u003e\n \u003c/p\u003e\n \u003c/div\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\n align=\"left\"\n class=\"x m\"\n style=\"\n font-size: 0;\n padding: 0;\n padding-bottom: 16px;\n word-break: break-word;\n \"\n \u003e\n \u003cdiv\n style=\"\n font-family: Inter, Arial,\n sans-serif;\n font-size: 16px;\n line-height: 28px;\n text-align: left;\n color: #000000;\n \"\n \u003e\n \u003cp\n style=\"\n margin: 0;\n text-align: left;\n \"\n \u003e\n \u003cspan\n style=\"\n mso-line-height-rule: exactly;\n font-size: 16px;\n font-family: Inter, Arial,\n sans-serif;\n font-weight: 400;\n color: #616161;\n line-height: 28px;\n \"\n \u003e\u003ch2\u003eBreaking Changes\u003c/h2\u003e\n\n\u003cp\u003eWe listened to your feedback and have improved the naming of the SDK method \u003ccode\u003einitializeSelfServiceRecoveryForNativeApps\u003c/code\u003e to better match what it does: \u003ccode\u003einitializeSelfServiceRecoveryWithoutBrowser\u003c/code\u003e. As in the previous release you may still use the old SDK if you do not want to deal with the SDK breaking changes for now.\nWe listened to your feedback and have improved the naming of the SDK method \u003ccode\u003einitializeSelfServiceVerificationForNativeApps\u003c/code\u003e to better match what it does: \u003ccode\u003einitializeSelfServiceVerificationWithoutBrowser\u003c/code\u003e. As in the previous release you may still use the old SDK if you do not want to deal with the SDK breaking changes for now.\nWe listened to your feedback and have improved the naming of the SDK method \u003ccode\u003einitializeSelfServiceSettingsForNativeApps\u003c/code\u003e to better match what it does: \u003ccode\u003einitializeSelfServiceSettingsWithoutBrowser\u003c/code\u003e. As in the previous release you may still use the old SDK if you do not want to deal with the SDK breaking changes for now.\nWe listened to your feedback and have improved the naming of the SDK method \u003ccode\u003einitializeSelfServiceregistrationForNativeApps\u003c/code\u003e to better match what it does: \u003ccode\u003einitializeSelfServiceregistrationWithoutBrowser\u003c/code\u003e. As in the previous release you may still use the old SDK if you do not want to deal with the SDK breaking changes for now.\nWe listened to your feedback and have improved the naming of the SDK method \u003ccode\u003einitializeSelfServiceLoginForNativeApps\u003c/code\u003e to better match what it does: \u003ccode\u003einitializeSelfServiceLoginWithoutBrowser\u003c/code\u003e. As in the previous release you may still use the old SDK if you do not want to deal with the SDK breaking changes for now.\u003c/p\u003e\n\n\u003cp\u003e\u003cstrong\u003eBug Fixes:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003e\u003cp\u003eAdd json detection to setting error subbranches (\u003ca href=\"https://github.com/ory/kratos/commit/fb83dcb8ae7463079ddb33c04673cf4556f6058c\" target=\"_blank\"\u003efb83dcb\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eCache migration status (\u003ca href=\"https://github.com/ory/kratos/commit/5be2f149cd79ddfbe8496eccf5d5aacb6a9a0b8e\" target=\"_blank\"\u003e5be2f14\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1337\" target=\"_blank\"\u003e#1337\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eChange SMTP config validation from URI to a Regex pattern (\u003ca href=\"https://github.com/ory/kratos/issues/1436\" target=\"_blank\"\u003e#1436\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/5ab1e8f17bcbc229fada2c584b2c1f576b819761\" target=\"_blank\"\u003e5ab1e8f\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1435\" target=\"_blank\"\u003e#1435\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eCheck filesystem before fallback to bundled templates (\u003ca href=\"https://github.com/ory/kratos/issues/1401\" target=\"_blank\"\u003e#1401\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/22d999e78eb4f67d2f3ba07e62fd28ffb3331d6d\" target=\"_blank\"\u003e22d999e\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eContinue button for oidc registration step (\u003ca href=\"https://github.com/ory/kratos/commit/2aad5ac8f7055f39f4f434d26fbca74cdbe75337\" target=\"_blank\"\u003e2aad5ac\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1422\" target=\"_blank\"\u003e#1422\u003c/a\u003e \u003ca href=\"https://github.com/ory/kratos/issues/1320\" target=\"_blank\"\u003e#1320\u003c/a\u003e:\u003c/p\u003e\n\n\u003cp\u003eWhen signing up with an OIDC provider and the traits model is missing some fields, the submit button shows all OIDC options. Instead, it should show just one option called \u0026ldquo;Continue\u0026rdquo;.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eDeprecate sessionCookie (\u003ca href=\"https://github.com/ory/kratos/issues/1428\" target=\"_blank\"\u003e#1428\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/eccad741a1702181d4b207aad954a950906a808b\" target=\"_blank\"\u003eeccad74\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1426\" target=\"_blank\"\u003e#1426\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eDo not cache incomplete migrations (\u003ca href=\"https://github.com/ory/kratos/issues/1434\" target=\"_blank\"\u003e#1434\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/154c26f6da4bb7040deabdc352c90cdae42c69fe\" target=\"_blank\"\u003e154c26f\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eDo not run network migrations when booting (\u003ca href=\"https://github.com/ory/kratos/commit/12bbab9d3cf788998cd4a9be50ac8c7a9d2232bd\" target=\"_blank\"\u003e12bbab9\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1399\" target=\"_blank\"\u003e#1399\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eImprove identity list performance (\u003ca href=\"https://github.com/ory/kratos/commit/f76886fe7436f71fbef00081888a2f8d0106ba98\" target=\"_blank\"\u003ef76886f\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1412\" target=\"_blank\"\u003e#1412\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eIncorrect openapi specification for verification submission (\u003ca href=\"https://github.com/ory/kratos/issues/1431\" target=\"_blank\"\u003e#1431\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/ecb0a01f61441aa97751943b5e9ddcc28f783d91\" target=\"_blank\"\u003eecb0a01\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1368\" target=\"_blank\"\u003e#1368\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eMark ui node message as optional (\u003ca href=\"https://github.com/ory/kratos/issues/1365\" target=\"_blank\"\u003e#1365\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/7b8d59f48ed14a6d0672238645d8675d4bf7fd77\" target=\"_blank\"\u003e7b8d59f\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1361\" target=\"_blank\"\u003e#1361\u003c/a\u003e \u003ca href=\"https://github.com/ory/kratos/issues/1362\" target=\"_blank\"\u003e#1362\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eMark verified_at as omitempty (\u003ca href=\"https://github.com/ory/kratos/commit/77b258e57a3d53fe437838a5e9c57805e9c970aa\" target=\"_blank\"\u003e77b258e\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eCloses \u003ca href=\"https://github.com/ory/sdk/issues/46\" target=\"_blank\"\u003ehttps://github.com/ory/sdk/issues/46\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003ePanic if contextualizer is not set (\u003ca href=\"https://github.com/ory/kratos/commit/760035a6c5efa08561b93daff57ebb4655032b2a\" target=\"_blank\"\u003e760035a\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003ePanic on error in issue session (\u003ca href=\"https://github.com/ory/kratos/commit/5fbd8557e1f907dd400bfcd26c187db16dc344ba\" target=\"_blank\"\u003e5fbd855\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1384\" target=\"_blank\"\u003e#1384\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003ePrometheus metrics fix (\u003ca href=\"https://github.com/ory/kratos/issues/1299\" target=\"_blank\"\u003e#1299\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/ac5d00d472a87ab51e7c6834e2cb59f107fc3b3b\" target=\"_blank\"\u003eac5d00d\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRecovery email case sensitive (\u003ca href=\"https://github.com/ory/kratos/issues/1357\" target=\"_blank\"\u003e#1357\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/bce14c487450bd668859f362b98704644fa4c72a\" target=\"_blank\"\u003ebce14c4\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1329\" target=\"_blank\"\u003e#1329\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRemove typing from node.attribute.value (\u003ca href=\"https://github.com/ory/kratos/commit/63a5e08afab76dafbfe13e6126e165af28492aad\" target=\"_blank\"\u003e63a5e08\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eCloses \u003ca href=\"https://github.com/ory/sdk/issues/75\" target=\"_blank\"\u003ehttps://github.com/ory/sdk/issues/75\u003c/a\u003e\nCloses \u003ca href=\"https://github.com/ory/sdk/issues/74\" target=\"_blank\"\u003ehttps://github.com/ory/sdk/issues/74\u003c/a\u003e\nCloses \u003ca href=\"https://github.com/ory/sdk/issues/72\" target=\"_blank\"\u003ehttps://github.com/ory/sdk/issues/72\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRename client package for external consumption (\u003ca href=\"https://github.com/ory/kratos/commit/cba8b00c8b755cc0bdc7818bc9d7390ff3532ce1\" target=\"_blank\"\u003ecba8b00\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve driver issues (\u003ca href=\"https://github.com/ory/kratos/commit/47b1c8dce57a023e89a2b178bc8a033496ef4ff2\" target=\"_blank\"\u003e47b1c8d\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve network regression (\u003ca href=\"https://github.com/ory/kratos/commit/8f96b1fe4d0846a3ad97a45bc972ece04109289d\" target=\"_blank\"\u003e8f96b1f\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve network regressions (\u003ca href=\"https://github.com/ory/kratos/commit/8fc52c034ed9978c2a04cc66bccc9b795c9bbefa\" target=\"_blank\"\u003e8fc52c0\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eTesthelper regressions (\u003ca href=\"https://github.com/ory/kratos/commit/bf3b04fd2c7f9162073cb584d6fb0d59e868ecbf\" target=\"_blank\"\u003ebf3b04f\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUse correct url in submitSelfServiceVerificationFlow (\u003ca href=\"https://github.com/ory/kratos/commit/ab8a600080ac0d6a6235806b74c5b9e3dc1c2d60\" target=\"_blank\"\u003eab8a600\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUse STARTTLS for smtps connections (\u003ca href=\"https://github.com/ory/kratos/issues/1430\" target=\"_blank\"\u003e#1430\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/c21bb80a749df7b224a8ac3f15fa62523a78d805\" target=\"_blank\"\u003ec21bb80\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/781\" target=\"_blank\"\u003e#781\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eVersion schema (\u003ca href=\"https://github.com/ory/kratos/issues/1359\" target=\"_blank\"\u003e#1359\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/8c4bac71674e45e440d916c6c947ed018a8ea29a\" target=\"_blank\"\u003e8c4bac7\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1331\" target=\"_blank\"\u003e#1331\u003c/a\u003e \u003ca href=\"https://github.com/ory/kratos/issues/1101\" target=\"_blank\"\u003e#1101\u003c/a\u003e \u003ca href=\"https://github.com/ory/hydra/issues/2427\" target=\"_blank\"\u003eory/hydra#2427\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eCode Refactoring:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eCorp package (\u003ca href=\"https://github.com/ory/kratos/issues/1402\" target=\"_blank\"\u003e#1402\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/0202dc57aacc0d48e4c1ee4e68c91654451f63fa\" target=\"_blank\"\u003e0202dc5\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eIntroduce DefaultContextualizer in corp package (\u003ca href=\"https://github.com/ory/kratos/issues/1390\" target=\"_blank\"\u003e#1390\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/944d045aa7fc59eadfdd18951f0d4937b1ea79df\" target=\"_blank\"\u003e944d045\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1363\" target=\"_blank\"\u003e#1363\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eMove cleansql to separate package (\u003ca href=\"https://github.com/ory/kratos/commit/7c203dc8219afe07f180143f832158615b51f60a\" target=\"_blank\"\u003e7c203dc\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eDocumentation:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eAdd docs for registration SPA flow (\u003ca href=\"https://github.com/ory/kratos/commit/84458f1a9dfe8be6a97bddd832fcc508b60b8498\" target=\"_blank\"\u003e84458f1\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd go sdk examples (\u003ca href=\"https://github.com/ory/kratos/commit/e948faddce3a1f52df964c701f6ba2a28f5dfe03\" target=\"_blank\"\u003ee948fad\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd replit instructions (\u003ca href=\"https://github.com/ory/kratos/commit/8ab8607dee433f6e708ade296a6c26d0a87d0aae\" target=\"_blank\"\u003e8ab8607\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd tested and running go sdk examples (\u003ca href=\"https://github.com/ory/kratos/commit/3b56bb5fd37d0e7d4479967aa0b5721a68a267f2\" target=\"_blank\"\u003e3b56bb5\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix typo in \u0026ldquo;Sign in/up with ID \u0026amp; assword\u0026rdquo; (\u003ca href=\"https://github.com/ory/kratos/issues/1383\" target=\"_blank\"\u003e#1383\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/f39739d94e97f20b94630b957371d11294dc8300\" target=\"_blank\"\u003ef39739d\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eMark login endpoints as experimental (\u003ca href=\"https://github.com/ory/kratos/commit/6faf0f65bb05bbafdee6b1274a719695fd5b4173\" target=\"_blank\"\u003e6faf0f6\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUpdate docs for all flows (\u003ca href=\"https://github.com/ory/kratos/commit/d29ea69f6bb908b529502030942b1ced52227372\" target=\"_blank\"\u003ed29ea69\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUpdate documentation for plaintext templates (\u003ca href=\"https://github.com/ory/kratos/issues/1369\" target=\"_blank\"\u003e#1369\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/419784dd0d4ddc338830ed0d77a7d99f8f440777\" target=\"_blank\"\u003e419784d\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1351\" target=\"_blank\"\u003e#1351\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpdate path (\u003ca href=\"https://github.com/ory/kratos/commit/f0384d9c11085230fd16290c524d22fac6002870\" target=\"_blank\"\u003ef0384d9\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUpdate sdk use (\u003ca href=\"https://github.com/ory/kratos/commit/bcb8c06ee324c639e548fc06315d9e952f470582\" target=\"_blank\"\u003ebcb8c06\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUse correct path (\u003ca href=\"https://github.com/ory/kratos/issues/1333\" target=\"_blank\"\u003e#1333\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/e401135cf415d7e3e6a8ca463dd47e46fe399b33\" target=\"_blank\"\u003ee401135\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eFeatures:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003e\u003cp\u003eAdd GetContextualizer (\u003ca href=\"https://github.com/ory/kratos/commit/ac3271742c9c2b968b08dd2b35a5d120c5befcd9\" target=\"_blank\"\u003eac32717\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd instana as possible tracing provider (\u003ca href=\"https://github.com/ory/kratos/issues/1429\" target=\"_blank\"\u003e#1429\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/abe48a97ee75567979a70f00dd73ff698efcc75d\" target=\"_blank\"\u003eabe48a9\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1385\" target=\"_blank\"\u003e#1385\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd vk and yandex providers to oidc providers and documentation (\u003ca href=\"https://github.com/ory/kratos/issues/1339\" target=\"_blank\"\u003e#1339\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/22a3ef98181eb5922cc0f1c016d42ce46732d0a2\" target=\"_blank\"\u003e22a3ef9\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1234\" target=\"_blank\"\u003e#1234\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eImprove contextualization in serve/daemon (\u003ca href=\"https://github.com/ory/kratos/commit/f83cd355422fb4b422f703406473bda914d8419c\" target=\"_blank\"\u003ef83cd35\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eInclude Credentials Metadata in admin api (\u003ca href=\"https://github.com/ory/kratos/issues/1274\" target=\"_blank\"\u003e#1274\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/c8b62190fca53db4e1b3a4ddb5253fbd2fd46002\" target=\"_blank\"\u003ec8b6219\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/820\" target=\"_blank\"\u003e#820\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eInclude Credentials Metadata in admin api Missing changes in handler (\u003ca href=\"https://github.com/ory/kratos/issues/1366\" target=\"_blank\"\u003e#1366\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/a71c2208dedac45d32dab578e62a5e3105c8dee0\" target=\"_blank\"\u003ea71c220\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eNatively support SPA for login flows (\u003ca href=\"https://github.com/ory/kratos/commit/6ff67afa8b0fc0a95cec44d3dda2cbc1987b51dd\" target=\"_blank\"\u003e6ff67af\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1138\" target=\"_blank\"\u003e#1138\u003c/a\u003e \u003ca href=\"https://github.com/ory/kratos/issues/668\" target=\"_blank\"\u003e#668\u003c/a\u003e:\u003c/p\u003e\n\n\u003cp\u003eThis patch adds the long-awaited capabilities for natively working with SPAs and AJAX requests. Previously, requests to the \u003ccode\u003e/self-service/login/browser\u003c/code\u003e endpoint would always end up in a redirect. Now, if the \u003ccode\u003eAccept\u003c/code\u003e header is set to \u003ccode\u003eapplication/json\u003c/code\u003e, the login flow will be returned as JSON instead. Accordingly, changes to the error and submission flow have been made to support \u003ccode\u003eapplication/json\u003c/code\u003e content types and SPA / AJAX requests.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eNatively support SPA for recovery flows (\u003ca href=\"https://github.com/ory/kratos/commit/5461244943286081e13c304a3b38413b8ee6fdf2\" target=\"_blank\"\u003e5461244\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eThis patch adds the long-awaited capabilities for natively working with SPAs and AJAX requests. Previously, requests to the \u003ccode\u003e/self-service/recovery/browser\u003c/code\u003e endpoint would always end up in a redirect. Now, if the \u003ccode\u003eAccept\u003c/code\u003e header is set to \u003ccode\u003eapplication/json\u003c/code\u003e, the registration flow will be returned as JSON instead. Accordingly, changes to the error and submission flow have been made to support \u003ccode\u003eapplication/json\u003c/code\u003e content types and SPA / AJAX requests.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eNatively support SPA for registration flows (\u003ca href=\"https://github.com/ory/kratos/commit/57d3c5786a88f0648e7fa57f181f060a057ec19f\" target=\"_blank\"\u003e57d3c57\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1138\" target=\"_blank\"\u003e#1138\u003c/a\u003e \u003ca href=\"https://github.com/ory/kratos/issues/668\" target=\"_blank\"\u003e#668\u003c/a\u003e:\u003c/p\u003e\n\n\u003cp\u003eThis patch adds the long-awaited capabilities for natively working with SPAs and AJAX requests. Previously, requests to the \u003ccode\u003e/self-service/registration/browser\u003c/code\u003e endpoint would always end up in a redirect. Now, if the \u003ccode\u003eAccept\u003c/code\u003e header is set to \u003ccode\u003eapplication/json\u003c/code\u003e, the registration flow will be returned as JSON instead. Accordingly, changes to the error and submission flow have been made to support \u003ccode\u003eapplication/json\u003c/code\u003e content types and SPA / AJAX requests.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eNatively support SPA for settings flows (\u003ca href=\"https://github.com/ory/kratos/commit/ea4395ed25d5668e4ce365336cd7a5e13e0ba1cc\" target=\"_blank\"\u003eea4395e\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eThis patch adds the long-awaited capabilities for natively working with SPAs and AJAX requests. Previously, requests to the \u003ccode\u003e/self-service/settings/browser\u003c/code\u003e endpoint would always end up in a redirect. Now, if the \u003ccode\u003eAccept\u003c/code\u003e header is set to \u003ccode\u003eapplication/json\u003c/code\u003e, the registration flow will be returned as JSON instead. Accordingly, changes to the error and submission flow have been made to support \u003ccode\u003eapplication/json\u003c/code\u003e content types and SPA / AJAX requests.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eNatively support SPA for verification flows (\u003ca href=\"https://github.com/ory/kratos/commit/c1515009dcd1b5946a93733feedb01753de91c3d\" target=\"_blank\"\u003ec151500\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eThis patch adds the long-awaited capabilities for natively working with SPAs and AJAX requests. Previously, requests to the \u003ccode\u003e/self-service/verification/browser\u003c/code\u003e endpoint would always end up in a redirect. Now, if the \u003ccode\u003eAccept\u003c/code\u003e header is set to \u003ccode\u003eapplication/json\u003c/code\u003e, the registration flow will be returned as JSON instead. Accordingly, changes to the error and submission flow have been made to support \u003ccode\u003eapplication/json\u003c/code\u003e content types and SPA / AJAX requests.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eSign in with Auth0 (\u003ca href=\"https://github.com/ory/kratos/issues/1352\" target=\"_blank\"\u003e#1352\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/f618a53fb971ad16121aa8728cfec54253bb3f44\" target=\"_blank\"\u003ef618a53\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/609\" target=\"_blank\"\u003e#609\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eSupport api in settings error (\u003ca href=\"https://github.com/ory/kratos/commit/23105dbb836d920b8766536b65de58932f53d6f6\" target=\"_blank\"\u003e23105db\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eSupport reading session token from X-Session-Token HTTP header (\u003ca href=\"https://github.com/ory/kratos/commit/dcaefd94a0b2cf819424f2e10b3bdae63b256726\" target=\"_blank\"\u003edcaefd9\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eTeam id in slack oidc (\u003ca href=\"https://github.com/ory/kratos/issues/1409\" target=\"_blank\"\u003e#1409\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/e4d021a037a6b44f8bd66372e9c260c640e87b9d\" target=\"_blank\"\u003ee4d021a\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1408\" target=\"_blank\"\u003e#1408\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate openapi specs and regenerate (\u003ca href=\"https://github.com/ory/kratos/commit/cac507eb5b1f39d003d72e57912dbbfe6f92deb1\" target=\"_blank\"\u003ecac507e\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003e\u003cstrong\u003eidentities:\u003c/strong\u003e Add a state to identities (\u003ca href=\"https://github.com/ory/kratos/issues/1312\" target=\"_blank\"\u003e#1312\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/d22954e2fdb7b2dd5206651b6dd5cf96185a33ba\" target=\"_blank\"\u003ed22954e\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/598\" target=\"_blank\"\u003e#598\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eTests:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003e\u003cp\u003eAdd tests for cookie behavior of API and browser endpoints (\u003ca href=\"https://github.com/ory/kratos/commit/d1b15217867cfb92a615c793b26fad288f5e5742\" target=\"_blank\"\u003ed1b1521\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRemove obsolete console.log (\u003ca href=\"https://github.com/ory/kratos/commit/3ecc869ebfef5c97334ae4334fb4af98ca9baf97\" target=\"_blank\"\u003e3ecc869\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve e2e regressions (\u003ca href=\"https://github.com/ory/kratos/commit/b0d3b82f301942bebe3c0027c8b3160749f907af\" target=\"_blank\"\u003eb0d3b82\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve migratest panic (\u003ca href=\"https://github.com/ory/kratos/commit/89d05ae0c376c4ea1f23708cccf95c9754a29c94\" target=\"_blank\"\u003e89d05ae\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003e\u003cstrong\u003ee2e:\u003c/strong\u003e Greatly improve test performance (\u003ca href=\"https://github.com/ory/kratos/issues/1421\" target=\"_blank\"\u003e#1421\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/2ffad9ee751471451e2151719a2e70d5f89437b0\" target=\"_blank\"\u003e2ffad9e\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eInstead of running the individual profiles as separate Cypress instances, we now use one singular instance which updates the Ory Kratos configuration depending on the test context. This ensures that hot-reloading is properly working while also signficantly reducing the amount of time spent on booting up the service dependencies.\u003c/p\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eUnclassified:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eadd CoC shield (#1439) (\u003ca href=\"https://github.com/ory/kratos/commit/826ed1a6deafdc2631a5c72f0bfacc91b06a3435\" target=\"_blank\"\u003e826ed1a\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1439\" target=\"_blank\"\u003e#1439\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eu (\u003ca href=\"https://github.com/ory/kratos/commit/b03549b6340ec0bf4f9d741ce145ca90bbc09968\" target=\"_blank\"\u003eb03549b\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFormat (\u003ca href=\"https://github.com/ory/kratos/commit/5cc9fc3a6e91a96225d016d60c8da5cef647ac18\" target=\"_blank\"\u003e5cc9fc3\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eu (\u003ca href=\"https://github.com/ory/kratos/commit/318a31d400b97653b4f377c67df4ae0afea189d9\" target=\"_blank\"\u003e318a31d\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFormat (\u003ca href=\"https://github.com/ory/kratos/commit/e525805246431075d26c3f47596ae93f6580d8ee\" target=\"_blank\"\u003ee525805\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFormat (\u003ca href=\"https://github.com/ory/kratos/commit/4a692acc7db160068ed7d81461b173bc957e4736\" target=\"_blank\"\u003e4a692ac\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFormat (\u003ca href=\"https://github.com/ory/kratos/commit/169c0cd8d424babef69a52ddf65e2b75ded09a46\" target=\"_blank\"\u003e169c0cd\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003ch2\u003eBreaking Changes\u003c/h2\u003e\n\n\u003cp\u003eUnfortunately, some method signatures have changed in the SDKs. Below is a list of changed entries:\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eError \u003ccode\u003egenericError\u003c/code\u003e was renamed to \u003ccode\u003ejsonError\u003c/code\u003e and now includes more information and better typing for errors;\u003c/li\u003e\n\u003cli\u003eThe following functions have been renamed:\n\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003einitializeSelfServiceLoginViaAPIFlow\u003c/code\u003e -\u0026gt; \u003ccode\u003einitializeSelfServiceLoginForNativeApps\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einitializeSelfServiceLoginViaBrowserFlow\u003c/code\u003e -\u0026gt; \u003ccode\u003einitializeSelfServiceLoginForBrowsers\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einitializeSelfServiceRegistrationViaAPIFlow\u003c/code\u003e -\u0026gt; \u003ccode\u003einitializeSelfServiceRegistrationForNativeApps\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einitializeSelfServiceRegistrationViaBrowserFlow\u003c/code\u003e -\u0026gt; \u003ccode\u003einitializeSelfServiceRegistrationForBrowsers\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einitializeSelfServiceSettingsViaAPIFlow\u003c/code\u003e -\u0026gt; \u003ccode\u003einitializeSelfServiceSettingsForNativeApps\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einitializeSelfServiceSettingsViaBrowserFlow\u003c/code\u003e -\u0026gt; \u003ccode\u003einitializeSelfServiceSettingsForBrowsers\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einitializeSelfServiceRecoveryViaAPIFlow\u003c/code\u003e -\u0026gt; \u003ccode\u003einitializeSelfServiceRecoveryForNativeApps\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einitializeSelfServiceRecoveryViaBrowserFlow\u003c/code\u003e -\u0026gt; \u003ccode\u003einitializeSelfServiceRecoveryForBrowsers\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einitializeSelfServiceVerificationViaAPIFlow\u003c/code\u003e -\u0026gt; \u003ccode\u003einitializeSelfServiceVerificationForNativeApps\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einitializeSelfServiceVerificationViaBrowserFlow\u003c/code\u003e -\u0026gt; \u003ccode\u003einitializeSelfServiceVerificationForBrowsers\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\u003c/li\u003e\n\u003cli\u003eSome type names have changed, for example \u003ccode\u003etraits\u003c/code\u003e -\u0026gt; \u003ccode\u003eidentityTraits\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eBug Fixes:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eProperly handle CSRF for API flows in recovery and verification strategies (\u003ca href=\"https://github.com/ory/kratos/commit/461c829dc4d7f7b70620abee2263efba78ce463a\" target=\"_blank\"\u003e461c829\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1141\" target=\"_blank\"\u003e#1141\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003esession:\u003c/strong\u003e Use specific headers before bearer use (\u003ca href=\"https://github.com/ory/kratos/commit/82c0b545b29b30fcf3521d9621ec5c5f1a23dc96\" target=\"_blank\"\u003e82c0b54\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eImprove settings oas definition (\u003ca href=\"https://github.com/ory/kratos/commit/867abfc813b08142786f71bfe28e373d4754c959\" target=\"_blank\"\u003e867abfc\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUse correct api spec path (\u003ca href=\"https://github.com/ory/kratos/commit/5f41f87bea2919cdf4e9f55c6ad938c5bc08b619\" target=\"_blank\"\u003e5f41f87\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUse correct openapi path for validation (\u003ca href=\"https://github.com/ory/kratos/issues/1340\" target=\"_blank\"\u003e#1340\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/a0f5673d6aa4e60bab06ef699dce231f0bf4aeff\" target=\"_blank\"\u003ea0f5673\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eCode Generation:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003ePin v0.6.3-alpha.1 release commit (\u003ca href=\"https://github.com/ory/kratos/commit/5edf9524d812795ac5712e4a9541b34359234724\" target=\"_blank\"\u003e5edf952\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eCode Refactoring:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003e\u003cp\u003eImprove SDK experience (\u003ca href=\"https://github.com/ory/kratos/commit/71b8511ae1f6f77b2996a01a55accc99d171cfaf\" target=\"_blank\"\u003e71b8511\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eThis patch resolves UX issues in the auto-generated SDKs by using consistent naming and introducing a test suite for the Ory SaaS.\u003c/p\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eCode Generation:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003ePin v0.6.2-alpha.1 release commit (\u003ca href=\"https://github.com/ory/kratos/commit/99c1b1d674df3bd8263f7cbf1ed2bdfae6281f69\" target=\"_blank\"\u003e99c1b1d\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eDocumentation:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eUpdate link to example email template. (\u003ca href=\"https://github.com/ory/kratos/issues/1326\" target=\"_blank\"\u003e#1326\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/28a17234b557cabf17b592ee68041aec695f6d20\" target=\"_blank\"\u003e28a1723\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eCode Generation:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003ePin v0.6.1-alpha.1 release commit (\u003ca href=\"https://github.com/ory/kratos/commit/1df82daaf3f9cfd3a470d7c9bf8d96abbd52b872\" target=\"_blank\"\u003e1df82da\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eFeatures:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eAllow changing password validation API DNS name (\u003ca href=\"https://github.com/ory/kratos/issues/1009\" target=\"_blank\"\u003e#1009\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/ced85e8091b06d864cc55c9975f8b006f6be1ce4\" target=\"_blank\"\u003eced85e8\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eBug Fixes:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eUpdate node image (\u003ca href=\"https://github.com/ory/kratos/commit/eef307e6bc33c9ec36ed9138f99c19f72c7be575\" target=\"_blank\"\u003eeef307e\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eCode Generation:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003ePin v0.6.0-alpha.2 release commit (\u003ca href=\"https://github.com/ory/kratos/commit/a3658badb848656b61d54b3ee35114972afc1f35\" target=\"_blank\"\u003ea3658ba\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eFeatures:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eFix unexpected emails when update profile (\u003ca href=\"https://github.com/ory/kratos/issues/1300\" target=\"_blank\"\u003e#1300\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/7b2448566f82e69d555997654ee410f9b4ff3939\" target=\"_blank\"\u003e7b24485\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1221\" target=\"_blank\"\u003e#1221\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003ch2\u003eBreaking Changes\u003c/h2\u003e\n\n\u003cp\u003eBCrypt is now the default hashing alogrithm. If you wish to continue using Argon2id please set \u003ccode\u003ehashers.algorithm\u003c/code\u003e to \u003ccode\u003eargon2\u003c/code\u003e.\nThis implies a significant breaking change in the verification flow payload. Please consult the new ui documentation. In essence, the login flow\u0026rsquo;s \u003ccode\u003emethods\u003c/code\u003e key was replaced with a generic \u003ccode\u003eui\u003c/code\u003e key which provides information for the UI that needs to be rendered.\u003c/p\u003e\n\n\u003cp\u003eTo apply this patch you must apply SQL migrations. These migrations will drop the flow method table implying that all verification flows that are ongoing will become invalid. We recommend purging the flow table manually as well after this migration has been applied, if you have users doing at least one self-service flow per minute.\nThis implies a significant breaking change in the recovery flow payload. Please consult the new ui documentation. In essence, the login flow\u0026rsquo;s \u003ccode\u003emethods\u003c/code\u003e key was replaced with a generic \u003ccode\u003eui\u003c/code\u003e key which provides information for the UI that needs to be rendered.\u003c/p\u003e\n\n\u003cp\u003eTo apply this patch you must apply SQL migrations. These migrations will drop the flow method table implying that all recovery flows that are ongoing will become invalid. We recommend purging the flow table manually as well after this migration has been applied, if you have users doing at least one self-service flow per minute.\nThis implies a significant breaking change in the settings flow payload. Please consult the new ui documentation. In essence, the login flow\u0026rsquo;s \u003ccode\u003emethods\u003c/code\u003e key was replaced with a generic \u003ccode\u003eui\u003c/code\u003e key which provides information for the UI that needs to be rendered.\u003c/p\u003e\n\n\u003cp\u003eTo apply this patch you must apply SQL migrations. These migrations will drop the flow method table implying that all settings flows that are ongoing will become invalid. We recommend purging the flow table manually as well after this migration has been applied, if you have users doing at least one self-service flow per minute.\nThis implies a significant breaking change in the registration flow payload. Please consult the new ui documentation. In essence, the login flow\u0026rsquo;s \u003ccode\u003emethods\u003c/code\u003e key was replaced with a generic \u003ccode\u003eui\u003c/code\u003e key which provides information for the UI that needs to be rendered.\u003c/p\u003e\n\n\u003cp\u003eTo apply this patch you must apply SQL migrations. These migrations will drop the flow method table implying that all registration flows that are ongoing will become invalid. We recommend purging the flow table manually as well after this migration has been applied, if you have users doing at least one self-service flow per minute.\nThis implies a significant breaking change in the login flow payload. Please consult the new ui documentation. In essence, the login flow\u0026rsquo;s \u003ccode\u003emethods\u003c/code\u003e key was replaced with a generic \u003ccode\u003eui\u003c/code\u003e key which provides information for the UI that needs to be rendered.\u003c/p\u003e\n\n\u003cp\u003eTo apply this patch you must apply SQL migrations. These migrations will drop the flow method table implying that all login flows that are ongoing will become invalid. We recommend purging the flow table manually as well after this migration has been applied, if you have users doing at least one self-service flow per minute.\nThis change introduces a new feature: UI Nodes. Previously, all self-service flows (login, registration, \u0026hellip;) included form fields (e.g. \u003ccode\u003emethods.password.config.fields\u003c/code\u003e). However, these form fields lacked support for other types of UI elements such as links (for e.g. \u0026ldquo;Sign in with Google\u0026rdquo;), images (e.g. QR codes), javascript (e.g. WebAuthn), or text (e.g. recovery codes). With this patch, these new features have been introduced. Please be aware that this introduces significant breaking changes which you will need to adopt to in your UI. Please refer to the most recent documentation to see what has changed. Conceptionally, most things stayed the same - you do however need to update how you access and render the form fields.\u003c/p\u003e\n\n\u003cp\u003ePlease be also aware that this patch includes SQL migrations which \u003cstrong\u003epurge existing self-service forms\u003c/strong\u003e from the database. This means that users will need to re-start the login/registration/\u0026hellip; flow after the SQL migrations have been applied! If you wish to keep these records, make a back up of your database prior!\nThis change introduces a new feature: UI Nodes. Previously, all self-service flows (login, registration, \u0026hellip;) included form fields (e.g. \u003ccode\u003emethods.password.config.fields\u003c/code\u003e). However, these form fields lacked support for other types of UI elements such as links (for e.g. \u0026ldquo;Sign in with Google\u0026rdquo;), images (e.g. QR codes), javascript (e.g. WebAuthn), or text (e.g. recovery codes). With this patch, these new features have been introduced. Please be aware that this introduces significant breaking changes which you will need to adopt to in your UI. Please refer to the most recent documentation to see what has changed. Conceptionally, most things stayed the same - you do however need to update how you access and render the form fields.\u003c/p\u003e\n\n\u003cp\u003ePlease be also aware that this patch includes SQL migrations which \u003cstrong\u003epurge existing self-service forms\u003c/strong\u003e from the database. This means that users will need to re-start the login/registration/\u0026hellip; flow after the SQL migrations have been applied! If you wish to keep these records, make a back up of your database prior!\nThe configuration value for \u003ccode\u003ehashers.argon2.memory\u003c/code\u003e is now a string representation of the memory amount including the unit of measurement. To convert the value divide your current setting (KB) by 1024 to get a result in MB or 1048576 to get a result in GB. Example: \u003ccode\u003e131072\u003c/code\u003e would now become \u003ccode\u003e128MB\u003c/code\u003e.\u003c/p\u003e\n\n\u003cp\u003eCo-authored-by: aeneasr \u003ca href=\"mailto:3372410+aeneasr@users.noreply.github.com\" target=\"_blank\"\u003e3372410+aeneasr@users.noreply.github.com\u003c/a\u003e\nCo-authored-by: aeneasr \u003ca href=\"mailto:aeneas@ory.sh\" target=\"_blank\"\u003eaeneas@ory.sh\u003c/a\u003e\nPlease run SQL migrations when applying this patch.\nThe following configuration keys were updated:\u003c/p\u003e\n\n\u003cpre style=\"word-break: break-all; white-space: pre-wrap\"\u003e\u003ccode class=\"language-patch\"\u003eselfservice.methods.password.config.max_breaches\n\u003c/code\u003e\u003c/pre\u003e\n\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003epassword.max_breaches\u003c/code\u003e -\u0026gt; \u003ccode\u003eselfservice.methods.password.config.max_breaches\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epassword.ignore_network_errors\u003c/code\u003e -\u0026gt; \u003ccode\u003eselfservice.methods.password.config.ignore_network_errors\u003c/code\u003e\nAfter battling with \u003ca href=\"https://github.com/spf13/viper\" target=\"_blank\"\u003espf13/viper\u003c/a\u003e for several years we finally found a viable alternative with \u003ca href=\"https://github.com/knadh/koanf\" target=\"_blank\"\u003eknadh/koanf\u003c/a\u003e. The complete internal configuration infrastructure has changed, with several highlights:\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003col\u003e\n\u003cli\u003eConfiguration sourcing works from all sources (file, env, cli flags) with validation against the configuration schema, greatly improving developer experience when changing or updating configuration.\u003c/li\u003e\n\u003cli\u003eConfiguration reloading has improved significantly and works flawlessly on Kubernetes.\u003c/li\u003e\n\u003cli\u003ePerformance increased dramatically, completely removing the need for a cache layer between the configuration system and ORY Hydra.\u003c/li\u003e\n\u003cli\u003eIt is now possible to load several config files using the \u003ccode\u003e--config\u003c/code\u003e flag.\u003c/li\u003e\n\u003cli\u003eConfiguration values are now sent to the tracer (e.g. Jaeger) if tracing is enabled.\u003c/li\u003e\n\u003c/ol\u003e\n\n\u003cp\u003ePlease be aware that ORY Kratos might complain about an invalid configuration, because the validation process has improved significantly.\u003c/p\u003e\n\n\u003cp\u003e\u003cstrong\u003eBug Fixes:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003e\u003cp\u003eAdd include stub go files (\u003ca href=\"https://github.com/ory/kratos/commit/6d725b1461a26d99c8b179be8ca219ba83ba0f17\" target=\"_blank\"\u003e6d725b1\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd index to migration status (\u003ca href=\"https://github.com/ory/kratos/commit/8c6ec2741535c090aae16f02a744f56c15923e2b\" target=\"_blank\"\u003e8c6ec27\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd node_modules to format tasks (\u003ca href=\"https://github.com/ory/kratos/commit/e5f6b36caeff080905d15566cf55f8fe4905dbc0\" target=\"_blank\"\u003ee5f6b36\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd titles to identity schema (\u003ca href=\"https://github.com/ory/kratos/commit/73c15d23840aa83d2c99c013cad52ad7df285f18\" target=\"_blank\"\u003e73c15d2\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdopt to new go-swagger changes (\u003ca href=\"https://github.com/ory/kratos/commit/5c45bd9f354bfe19b8cbcd7eb4eaebf22c441f42\" target=\"_blank\"\u003e5c45bd9\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAllow absolute file URLs as config values (\u003ca href=\"https://github.com/ory/kratos/issues/1069\" target=\"_blank\"\u003e#1069\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/4bb4f679d1fe0a49edb0c0189bb7a2188d4f850d\" target=\"_blank\"\u003e4bb4f67\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAllow hashtag in ui urls (\u003ca href=\"https://github.com/ory/kratos/issues/1040\" target=\"_blank\"\u003e#1040\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/7591f07f7d48376a03e9eacfdb6f4a93fd26c0d5\" target=\"_blank\"\u003e7591f07\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAvoid unicode-escaping ampersand in recovery URL query string (\u003ca href=\"https://github.com/ory/kratos/issues/1212\" target=\"_blank\"\u003e#1212\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/d17236870af490f043d87e220179b35c9eb2dd4e\" target=\"_blank\"\u003ed172368\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eBcrypt regression in credentials counting (\u003ca href=\"https://github.com/ory/kratos/commit/23fc13ba778e0045ca30c00d673ebd6c2f2b7fb7\" target=\"_blank\"\u003e23fc13b\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eBroken make quickstart-dev task (\u003ca href=\"https://github.com/ory/kratos/issues/980\" target=\"_blank\"\u003e#980\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/999828ae036f20bde6d12fe89851e1fde9bdaca6\" target=\"_blank\"\u003e999828a\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/965\" target=\"_blank\"\u003e#965\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eBroken make sdk task (\u003ca href=\"https://github.com/ory/kratos/issues/977\" target=\"_blank\"\u003e#977\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/5b01c7a368c5bcfaa3af218d42f15288f51ab3e4\" target=\"_blank\"\u003e5b01c7a\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/950\" target=\"_blank\"\u003e#950\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eCall contextualized test helpers (\u003ca href=\"https://github.com/ory/kratos/commit/e1f3f7835696b039409c9d05f63665aba7a179ae\" target=\"_blank\"\u003ee1f3f78\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eCode integer parsing bit size (\u003ca href=\"https://github.com/ory/kratos/issues/1178\" target=\"_blank\"\u003e#1178\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/31e9632bcd6ec3bdeabe862a4cce89021c6dd361\" target=\"_blank\"\u003e31e9632\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eIn some cases we had a wrong bitsize of \u003ccode\u003e64\u003c/code\u003e, while the var was later cast to \u003ccode\u003eint\u003c/code\u003e. Replaced with a bitsize of \u003ccode\u003e0\u003c/code\u003e, which is the value to cast to \u003ccode\u003eint\u003c/code\u003e.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eContextualize identity persister (\u003ca href=\"https://github.com/ory/kratos/commit/f8640c04f0c5873c39c8af4652d16bfbd347b79e\" target=\"_blank\"\u003ef8640c0\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eConvert all identifiers to lower case on login (\u003ca href=\"https://github.com/ory/kratos/issues/815\" target=\"_blank\"\u003e#815\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/d64b5757c710c436d6789dbdb33ed04dc11cbdf9\" target=\"_blank\"\u003ed64b575\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/814\" target=\"_blank\"\u003e#814\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eCourier adress (\u003ca href=\"https://github.com/ory/kratos/issues/1198\" target=\"_blank\"\u003e#1198\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/ebe4e643150f7603a1e3a3cf6f909135097b3f49\" target=\"_blank\"\u003eebe4e64\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1194\" target=\"_blank\"\u003e#1194\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eCourier message dequeue race condition (\u003ca href=\"https://github.com/ory/kratos/issues/1024\" target=\"_blank\"\u003e#1024\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/5396a82c34eef5d42444b5c4371bd4f820fe3eb0\" target=\"_blank\"\u003e5396a82\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/652\" target=\"_blank\"\u003e#652\u003c/a\u003e \u003ca href=\"https://github.com/ory/kratos/issues/732\" target=\"_blank\"\u003e#732\u003c/a\u003e:\u003c/p\u003e\n\n\u003cp\u003eFixes the courier message dequeuing race condition by modifying \u003ccode\u003e*sql.Persister.NextMessages(ctx context.Context, limit uint8)\u003c/code\u003e to retrieve only messages with status \u003ccode\u003eMessageStatusQueued\u003c/code\u003e and update the status of the retrieved messages to \u003ccode\u003eMessageStatusProcessing\u003c/code\u003e within a transaction. On message send failure, the message\u0026rsquo;s status is reset to \u003ccode\u003eMessageStatusQueued\u003c/code\u003e, so that the message can be dequeued in a subsequent \u003ccode\u003eNextMessages\u003c/code\u003e call. On message send success, the status is updated to \u003ccode\u003eMessageStatusSent\u003c/code\u003e (no change there).\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eDefine credentials types as sql template and resolve crdb issue (\u003ca href=\"https://github.com/ory/kratos/commit/a2d6eeb2928c9750741237f559197fd80494310d\" target=\"_blank\"\u003ea2d6eeb\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eDereference pointer types from new flow structures (\u003ca href=\"https://github.com/ory/kratos/issues/1019\" target=\"_blank\"\u003e#1019\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/efedc920e592bd6e963726e6b123ddc40df93a59\" target=\"_blank\"\u003eefedc92\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eDo not include smtp in tracing (\u003ca href=\"https://github.com/ory/kratos/issues/1268\" target=\"_blank\"\u003e#1268\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/bbfcbf9ce595d842a53a3ea21c286d5899eeb28f\" target=\"_blank\"\u003ebbfcbf9\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eDo not publish version at public endpoint (\u003ca href=\"https://github.com/ory/kratos/commit/3726ed4d145a949b25f5b5da5f58d4f448a2a90f\" target=\"_blank\"\u003e3726ed4\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eDo not reset registration method (\u003ca href=\"https://github.com/ory/kratos/commit/554bb0b4e62e4ac2a321fa4dbf89ffdf37b188df\" target=\"_blank\"\u003e554bb0b\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eDo not return system errors for missing identifiers (\u003ca href=\"https://github.com/ory/kratos/commit/1fcc8557bfee0f7ba562a635670b61dc9acb3530\" target=\"_blank\"\u003e1fcc855\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1286\" target=\"_blank\"\u003e#1286\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eExport mailhog dockertest runner (\u003ca href=\"https://github.com/ory/kratos/commit/138414873ad319c6c32c6cc64a73547540dffc74\" target=\"_blank\"\u003e1384148\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix random delay norm distribution math (\u003ca href=\"https://github.com/ory/kratos/issues/1131\" target=\"_blank\"\u003e#1131\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/bd9d28fe354710957f4ebaf71d1fffeae3968364\" target=\"_blank\"\u003ebd9d28f\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFork audit logger from root logger (\u003ca href=\"https://github.com/ory/kratos/commit/68a09e7f3dc3ded9a477bb309c68ac8c4e2c2836\" target=\"_blank\"\u003e68a09e7\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eGitlab oidc flow (\u003ca href=\"https://github.com/ory/kratos/issues/1159\" target=\"_blank\"\u003e#1159\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/0bb3eb6db1144a09f4ac356cc45e1644d862bb70\" target=\"_blank\"\u003e0bb3eb6\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1157\" target=\"_blank\"\u003e#1157\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eGive specific message instead of only 404 when method is disabled (\u003ca href=\"https://github.com/ory/kratos/issues/1025\" target=\"_blank\"\u003e#1025\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/2f62041a62588f5b3b062092c57053facb858e62\" target=\"_blank\"\u003e2f62041\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eEnabled strategies are not only used for handlers but also in other areas\n(e.g. populating the flow methods). So we should keep the logic to get\nenabled strategies and add new functions for getting all strategies.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eIgnore unset domain aliases (\u003ca href=\"https://github.com/ory/kratos/commit/ada6997ff3dc7e48fd098e40267db5f231a5201f\" target=\"_blank\"\u003eada6997\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eImprove cli error output (\u003ca href=\"https://github.com/ory/kratos/commit/43e967887280b57639565dabd92a07f02fbddeb5\" target=\"_blank\"\u003e43e9678\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eImprove error stack trace (\u003ca href=\"https://github.com/ory/kratos/commit/43517737109088eda3b1d7f5b42f78bd5eb701d2\" target=\"_blank\"\u003e4351773\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eImprove error tracing (\u003ca href=\"https://github.com/ory/kratos/issues/1005\" target=\"_blank\"\u003e#1005\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/456fd254485fc80b9ae02dfca672a9fea8ae0134\" target=\"_blank\"\u003e456fd25\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eImprove test contextualization (\u003ca href=\"https://github.com/ory/kratos/commit/2f92a7066d72535d32146a98207996fda45e0b96\" target=\"_blank\"\u003e2f92a70\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eInitialize randomdelay with seeded source (\u003ca href=\"https://github.com/ory/kratos/commit/9896289216f10b808a8c78b86d9c27b8d74379de\" target=\"_blank\"\u003e9896289\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eInsert credentials type constants as part of migrations (\u003ca href=\"https://github.com/ory/kratos/issues/865\" target=\"_blank\"\u003e#865\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/92b79b86762edddf2ad6529b98b3383b641148d5\" target=\"_blank\"\u003e92b79b8\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/861\" target=\"_blank\"\u003e#861\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eLinking a connection may result in system error (\u003ca href=\"https://github.com/ory/kratos/issues/990\" target=\"_blank\"\u003e#990\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/be02a70c3cd60adbcc13559e1cb5dc01a8572da4\" target=\"_blank\"\u003ebe02a70\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/694\" target=\"_blank\"\u003e#694\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eMarking whoami auhorization parameter as \u0026lsquo;in header\u0026rsquo; (\u003ca href=\"https://github.com/ory/kratos/issues/1244\" target=\"_blank\"\u003e#1244\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/62d8b85223a0535b07620b08d35c6c3f6b127642\" target=\"_blank\"\u003e62d8b85\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1215\" target=\"_blank\"\u003e#1215\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eMove schema loaders to correct file (\u003ca href=\"https://github.com/ory/kratos/commit/029781f69448e8abc85607a03b4bd2055158cf2c\" target=\"_blank\"\u003e029781f\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eMove to new transaction-safe migrations (\u003ca href=\"https://github.com/ory/kratos/issues/1063\" target=\"_blank\"\u003e#1063\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/2588fb489d76939aeec2986d30fde9075b373831\" target=\"_blank\"\u003e2588fb4\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eThis patch introduces a new SQL transaction model for running SQL migrations. This fix is particularly targeted at CockroachDB which has limited support for mixing DDL and DML statements.\u003c/p\u003e\n\n\u003cp\u003ePreviously it could happen that migrations failure needed manual intervention. This has now been resolved. The new migration model is compatible with the old one and should work without a problem.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003ePass down context to registry (\u003ca href=\"https://github.com/ory/kratos/commit/08794461ed95965a9e5460ded2b4c04ab0f5e2e8\" target=\"_blank\"\u003e0879446\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRe-enable SDK generation (\u003ca href=\"https://github.com/ory/kratos/commit/1d5854d6298e3d21f85a8fa01d3004166c4b3f50\" target=\"_blank\"\u003e1d5854d\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRecord cypress runs (\u003ca href=\"https://github.com/ory/kratos/commit/db35d8ff6bb44dc9e9acf131cb0a14a7f4a7d160\" target=\"_blank\"\u003edb35d8f\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRehydrate settings form on successful submission (\u003ca href=\"https://github.com/ory/kratos/commit/3457e1a46f48ed79eabff76f8af08b82f12ecc89\" target=\"_blank\"\u003e3457e1a\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1305\" target=\"_blank\"\u003e#1305\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRemove absolete \u0026lsquo;make pack\u0026rsquo; from Dockerfile (\u003ca href=\"https://github.com/ory/kratos/issues/1172\" target=\"_blank\"\u003e#1172\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/b8eb908529cc72a3147ad28e4eeee71850a8e431\" target=\"_blank\"\u003eb8eb908\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRemove continuity cookies on errors (\u003ca href=\"https://github.com/ory/kratos/commit/85eea6748be6ae8cdfc10cabaa6b677e4efd63eb\" target=\"_blank\"\u003e85eea67\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRemove include stubs (\u003ca href=\"https://github.com/ory/kratos/commit/1764e3a08a24db82dc391a77fdea09a91faffb5f\" target=\"_blank\"\u003e1764e3a\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRemove obsolete clihelpers (\u003ca href=\"https://github.com/ory/kratos/commit/230fd138d1bc7ec57647ea8eeca8e17baaacce0a\" target=\"_blank\"\u003e230fd13\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRemove record from bash script (\u003ca href=\"https://github.com/ory/kratos/commit/84a9315a824cacd29d30b98b65725343af22732d\" target=\"_blank\"\u003e84a9315\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRemove stray non-ctx configs (\u003ca href=\"https://github.com/ory/kratos/issues/1053\" target=\"_blank\"\u003e#1053\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/1fe137e0d6314bd0af47a29c00e2f72564e71cef\" target=\"_blank\"\u003e1fe137e\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRemove trailing double-dot from error (\u003ca href=\"https://github.com/ory/kratos/commit/59581e3fede0fd43028a5f064c350c3cc833b5b0\" target=\"_blank\"\u003e59581e3\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRemove unused sql migration (\u003ca href=\"https://github.com/ory/kratos/commit/1445d1d1b4b0b5e8ef3426a98ced9573063d8646\" target=\"_blank\"\u003e1445d1d\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRemove unused var (\u003ca href=\"https://github.com/ory/kratos/commit/30a8cee22238d9f400e6d315a9bc99f710945f81\" target=\"_blank\"\u003e30a8cee\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRemove verify hook (\u003ca href=\"https://github.com/ory/kratos/commit/98cfec6d72c2e7bf2db2e8dd6f8875e885923ba8\" target=\"_blank\"\u003e98cfec6\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1302\" target=\"_blank\"\u003e#1302\u003c/a\u003e:\u003c/p\u003e\n\n\u003cp\u003eThe verify hook is automatically used when verification is enabled and has been removed as a configuration option.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eReplace jwt module (\u003ca href=\"https://github.com/ory/kratos/issues/1254\" target=\"_blank\"\u003e#1254\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/3803c8ce43e35c51a9c1d7ab55bc662c398cf0d8\" target=\"_blank\"\u003e3803c8c\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1250\" target=\"_blank\"\u003e#1250\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve build and release issues (\u003ca href=\"https://github.com/ory/kratos/commit/fb582aa06ad55ca3fd4e2b083e1e9bbb4ba7c715\" target=\"_blank\"\u003efb582aa\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve clidoc issues (\u003ca href=\"https://github.com/ory/kratos/commit/599e9f773a743f811329cc57cea2748831105e58\" target=\"_blank\"\u003e599e9f7\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve compile issues (\u003ca href=\"https://github.com/ory/kratos/commit/63063c15c17f4d3aca96b106275a3478a8ed717e\" target=\"_blank\"\u003e63063c1\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve contextualized table issues (\u003ca href=\"https://github.com/ory/kratos/commit/5a4f0d92800df7fb5ca0df18203a6d73416814e1\" target=\"_blank\"\u003e5a4f0d9\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve crdb migration issue (\u003ca href=\"https://github.com/ory/kratos/commit/9f6edfd1f544d5f85e5f5558a08672f40e928136\" target=\"_blank\"\u003e9f6edfd\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve double hook invokation for registration (\u003ca href=\"https://github.com/ory/kratos/commit/032322c66fb6925d8f1473746cb4bfd800d60590\" target=\"_blank\"\u003e032322c\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve incorrect field types on oidc sign up completion (\u003ca href=\"https://github.com/ory/kratos/commit/f88b6abe202605739092a8230fbdebaebcd4407a\" target=\"_blank\"\u003ef88b6ab\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve lint issues (\u003ca href=\"https://github.com/ory/kratos/commit/03488250bcdbfda6ef6a536b4de6117fa8924dc8\" target=\"_blank\"\u003e0348825\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve lint issues (\u003ca href=\"https://github.com/ory/kratos/commit/75a995b3f69778655611929b65ae22bd77c5370b\" target=\"_blank\"\u003e75a995b\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve linting issues and disable nancy (\u003ca href=\"https://github.com/ory/kratos/commit/c8396f6007831240d83f77433876c5971a2191ef\" target=\"_blank\"\u003ec8396f6\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve mail queue issues (\u003ca href=\"https://github.com/ory/kratos/commit/b968bc4ed8962d421175adbcaa2dba6eaeea2245\" target=\"_blank\"\u003eb968bc4\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve merge regressions (\u003ca href=\"https://github.com/ory/kratos/commit/9862ac72e0877df4cf17c93e140c354e1ddbd0e7\" target=\"_blank\"\u003e9862ac7\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve oidc e2e regressions (\u003ca href=\"https://github.com/ory/kratos/commit/f28087aaf133c116a81213f787dc6f2e982564c0\" target=\"_blank\"\u003ef28087a\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve oidc regressions and e2e tests (\u003ca href=\"https://github.com/ory/kratos/commit/f5091fac161db0b1401b340a002278bc26891251\" target=\"_blank\"\u003ef5091fa\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve potential fsnotify leaks (\u003ca href=\"https://github.com/ory/kratos/commit/3159c0abe109ea4e3832770278c4e9bc4ca3b3e1\" target=\"_blank\"\u003e3159c0a\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve regressions and test failures (\u003ca href=\"https://github.com/ory/kratos/commit/8bae3565ea5410b60c3e638a49f5454fac8e63d3\" target=\"_blank\"\u003e8bae356\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve regressions in cookies and payloads (\u003ca href=\"https://github.com/ory/kratos/commit/9e34bf2f6a2f3b007069a5415643c448798207a6\" target=\"_blank\"\u003e9e34bf2\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve settings sudo regressions (\u003ca href=\"https://github.com/ory/kratos/commit/4b611f34755369eafcbafa2fc16da13ea3b82370\" target=\"_blank\"\u003e4b611f3\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve test regressions (\u003ca href=\"https://github.com/ory/kratos/commit/e3fb0281dd9be123271d11f2934cfb08fdc470b7\" target=\"_blank\"\u003ee3fb028\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve ui issues with nested form objects (\u003ca href=\"https://github.com/ory/kratos/commit/8e744b931954283cf5f5cbf3ebaca3fa94e035ed\" target=\"_blank\"\u003e8e744b9\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve update regression (\u003ca href=\"https://github.com/ory/kratos/commit/d0d661aaffcba8b039738b773c891ee6e8f6449e\" target=\"_blank\"\u003ed0d661a\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eReturn delay instead of sleeping to improve tests (\u003ca href=\"https://github.com/ory/kratos/commit/27b977ebbaa25b95caa7e3e4536a09ea0bfa61c3\" target=\"_blank\"\u003e27b977e\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRevert generator changes (\u003ca href=\"https://github.com/ory/kratos/commit/c18b97f333a638d4b4495678013c55faca4b04d0\" target=\"_blank\"\u003ec18b97f\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRun correct error handler for registration hooks (\u003ca href=\"https://github.com/ory/kratos/commit/0d80447102d5092e310ca728012f083147c0c5c9\" target=\"_blank\"\u003e0d80447\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eSimplify data breaches password error reason (\u003ca href=\"https://github.com/ory/kratos/issues/1136\" target=\"_blank\"\u003e#1136\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/33d29bf72af03aea77f1d318c19f5087a506719f\" target=\"_blank\"\u003e33d29bf\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eThis PR simplifies the error reason given when a password has appeared in data breaches to not include the actual number and rather just show \u0026ldquo;this password has appeared in data breaches and must not be used\u0026rdquo;.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eSupport form and json formats in decoder (\u003ca href=\"https://github.com/ory/kratos/commit/d420fe6e8a491b20063d4bfeaa0a841058087d32\" target=\"_blank\"\u003ed420fe6\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate openapi definitions for signup (\u003ca href=\"https://github.com/ory/kratos/commit/eb0b69d50ce834b170186a39bbc9cda4d3366c36\" target=\"_blank\"\u003eeb0b69d\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate quickstart node image (\u003ca href=\"https://github.com/ory/kratos/commit/c19b2f4c57307e27ce289d44eff34f5aec1341da\" target=\"_blank\"\u003ec19b2f4\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eSee \u003ca href=\"https://github.com/ory/kratos/discussions/1301\" target=\"_blank\"\u003ehttps://github.com/ory/kratos/discussions/1301\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003e\u003cstrong\u003ecmd:\u003c/strong\u003e Make HTTP calls resilient (\u003ca href=\"https://github.com/ory/kratos/commit/e8ed61fc3e806453f78b8fa629e96ff7b320bf95\" target=\"_blank\"\u003ee8ed61f\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003e\u003cstrong\u003ehashing:\u003c/strong\u003e Make bcrypt default hashing algorithm (\u003ca href=\"https://github.com/ory/kratos/commit/04abe774ada1ef4bf318658fcf84c1d39a2a922d\" target=\"_blank\"\u003e04abe77\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate to new goreleaser config (\u003ca href=\"https://github.com/ory/kratos/commit/4c2a1b7f5a0059a6e0c28779808ffb27e8910553\" target=\"_blank\"\u003e4c2a1b7\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate to new healthx (\u003ca href=\"https://github.com/ory/kratos/commit/6ec987ae81ef0c05f2c4d1eb836c40f9d15950b2\" target=\"_blank\"\u003e6ec987a\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUse equalfold (\u003ca href=\"https://github.com/ory/kratos/commit/1c0e52ec36ff95b53e3537c5ef457f1c818d7f6b\" target=\"_blank\"\u003e1c0e52e\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUse new TB interface (\u003ca href=\"https://github.com/ory/kratos/commit/d75a378e700a206753f2cb17032315f2981960e7\" target=\"_blank\"\u003ed75a378\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUse numerical User ID instead of name to avoid k8s security warnings (\u003ca href=\"https://github.com/ory/kratos/issues/1151\" target=\"_blank\"\u003e#1151\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/468a12e56f22cfdf7bd05d68159cc735e75211b2\" target=\"_blank\"\u003e468a12e\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eOur docker image scanner does not allow running processes inside\ncontainer using non-numeric User spec (to determine if we are trying\nto run docker image as root).\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUse remote dependencies (\u003ca href=\"https://github.com/ory/kratos/commit/1e56457d49e1cde69baa41e3111ca113aa49ee3c\" target=\"_blank\"\u003e1e56457\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eCode Generation:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003ePin v0.6.0-alpha.1 release commit (\u003ca href=\"https://github.com/ory/kratos/commit/507d13a8ec9cd89c9933fc8814a8a99921da69fb\" target=\"_blank\"\u003e507d13a\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eCode Refactoring:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003e\u003cp\u003eAdapt new sdk in testhelpers (\u003ca href=\"https://github.com/ory/kratos/commit/6e15f6f86c0f146e846a384ffd6eac78406178bc\" target=\"_blank\"\u003e6e15f6f\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd nid everywhere (\u003ca href=\"https://github.com/ory/kratos/commit/407fd95889f416f0d76d6f3f43644a6fafa13b44\" target=\"_blank\"\u003e407fd95\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eContextualize everything (\u003ca href=\"https://github.com/ory/kratos/commit/7ebc3a9a1a2cd85d28c5a9adf2c0c8c10cbd072e\" target=\"_blank\"\u003e7ebc3a9\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eThis patch contextualizes all configuration and DBAL models.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eDo not use prefixed node names (\u003ca href=\"https://github.com/ory/kratos/commit/fc42ece24107dcb6e6a416cc54a2fb5de524fd94\" target=\"_blank\"\u003efc42ece\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eImprove Argon2 tooling (\u003ca href=\"https://github.com/ory/kratos/issues/961\" target=\"_blank\"\u003e#961\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/315118720419194be8baf5e5e64d7bf190179568\" target=\"_blank\"\u003e3151187\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/955\" target=\"_blank\"\u003e#955\u003c/a\u003e:\u003c/p\u003e\n\n\u003cp\u003eThis adds a load testing CLI that allows to adjust the hasher parameters under simulated load.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eMove faker to exportable module (\u003ca href=\"https://github.com/ory/kratos/commit/09f8ae5755c9978574e91676bf5df6a23a2feb78\" target=\"_blank\"\u003e09f8ae5\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eMove migratest helpers to ory/x (\u003ca href=\"https://github.com/ory/kratos/commit/7eca67eb9ec3e4ab065af7221911a74ed16c7c48\" target=\"_blank\"\u003e7eca67e\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eMove password config to selfservice (\u003ca href=\"https://github.com/ory/kratos/commit/cd0e0ebb0de372ff31c982ef023fe1979addb05a\" target=\"_blank\"\u003ecd0e0eb\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eMove to go 1.16 embed (\u003ca href=\"https://github.com/ory/kratos/commit/43c4a13c25be4a3a23a1ffdbecfaa0f9eda1a11d\" target=\"_blank\"\u003e43c4a13\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eThis patch replaces packr and pkged with the Go 1.16 embed feature.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRemove password node attribute prefix (\u003ca href=\"https://github.com/ory/kratos/commit/e27fae4b0d7a91ff3964804963d4885178b80803\" target=\"_blank\"\u003ee27fae4\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRemove profile node attribute prefix (\u003ca href=\"https://github.com/ory/kratos/commit/a3ff6f7eec45b1a9a1e7eb8569793fbc6a047d4f\" target=\"_blank\"\u003ea3ff6f7\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRename config structs and interfaces (\u003ca href=\"https://github.com/ory/kratos/commit/4a2f41977439354415118df3e37dd0cde8dac1aa\" target=\"_blank\"\u003e4a2f419\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRename form to container (\u003ca href=\"https://github.com/ory/kratos/commit/5da155a07d3737cefabaf98c4ff650115f662480\" target=\"_blank\"\u003e5da155a\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eReplace flow\u0026rsquo;s forms with new ui node module (\u003ca href=\"https://github.com/ory/kratos/commit/647eb1e66850c67e539d0338cca6cb8ae476ee55\" target=\"_blank\"\u003e647eb1e\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eReplace flow\u0026rsquo;s forms with new ui node module (\u003ca href=\"https://github.com/ory/kratos/commit/f74a5c25af60936b59caee0866a21637a5c0ae6f\" target=\"_blank\"\u003ef74a5c2\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eReplace login flow methods with ui container (\u003ca href=\"https://github.com/ory/kratos/commit/d4ca364fd8905cfb205ee047a9cb831064a6b9d0\" target=\"_blank\"\u003ed4ca364\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eReplace recovery flow methods with ui container (\u003ca href=\"https://github.com/ory/kratos/commit/cac04562f2e4e77875275fcfd82c039d787607fb\" target=\"_blank\"\u003ecac0456\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eReplace registration flow methods with ui container (\u003ca href=\"https://github.com/ory/kratos/commit/3f6388d03f91cfad17bd74ebca4d924b4b546668\" target=\"_blank\"\u003e3f6388d\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eReplace settings flow methods with ui container (\u003ca href=\"https://github.com/ory/kratos/commit/0efd17e76ba0a0cbd46916a7644b7bdf19bd4ab4\" target=\"_blank\"\u003e0efd17e\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eReplace verification flow methods with ui container (\u003ca href=\"https://github.com/ory/kratos/commit/dbf2668747922c93dd967961cd843354afbecfde\" target=\"_blank\"\u003edbf2668\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eReplace viper with koanf config management (\u003ca href=\"https://github.com/ory/kratos/commit/5eb1bc0bff7c5d0f83c604484b8e845701112cad\" target=\"_blank\"\u003e5eb1bc0\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate RegisterFakes calls (\u003ca href=\"https://github.com/ory/kratos/commit/626831069ab4f971094ba0bc0b43ac9ff618d91d\" target=\"_blank\"\u003e6268310\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUse underscore in webhook auth types (\u003ca href=\"https://github.com/ory/kratos/commit/26829d21911cccd4a87c8693b6089af661c1bfe3\" target=\"_blank\"\u003e26829d2\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eDocumentation:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003e\u003cp\u003eAdd docker to docs main (\u003ca href=\"https://github.com/ory/kratos/commit/8ce8b785e2246557253420ea97cf6b7d5ee75d58\" target=\"_blank\"\u003e8ce8b78\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd docker to sidebar (\u003ca href=\"https://github.com/ory/kratos/commit/ed38c88bdbadcdcd2527a2b5270390251742bbe4\" target=\"_blank\"\u003eed38c88\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd dotnet sdk (\u003ca href=\"https://github.com/ory/kratos/issues/1183\" target=\"_blank\"\u003e#1183\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/32d874a04bb384259aeb544a3fcd6b3a8b23acdd\" target=\"_blank\"\u003e32d874a\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd faq sidebar (\u003ca href=\"https://github.com/ory/kratos/issues/1105\" target=\"_blank\"\u003e#1105\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/10697aa4ab5dc3e2ab90d1c037dfbe3492bf2bdf\" target=\"_blank\"\u003e10697aa\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd log docs to schema config (\u003ca href=\"https://github.com/ory/kratos/commit/4967f11d8df177ebdae855eb745e90d21ce38e9f\" target=\"_blank\"\u003e4967f11\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd more HA docs (\u003ca href=\"https://github.com/ory/kratos/commit/cbb2e27f8919a8991c4797a3f1c192ec364f0dd3\" target=\"_blank\"\u003ecbb2e27\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd Rust and Dart SDKs (\u003ca href=\"https://github.com/ory/kratos/commit/6d969528e13350ef099669510d3d37df1c007c82\" target=\"_blank\"\u003e6d96952\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eWe now support for Rust and Dart SDKs!\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd SameSite help (\u003ca href=\"https://github.com/ory/kratos/commit/2df6729b4acc70532024658e8874682de64b06b3\" target=\"_blank\"\u003e2df6729\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd shell-session language (\u003ca href=\"https://github.com/ory/kratos/commit/d16db87802ae2f230a02e4deed189f473588552c\" target=\"_blank\"\u003ed16db87\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd ui node docs (\u003ca href=\"https://github.com/ory/kratos/commit/e48a07d03c19a0677d3a56f9e57294b358f24501\" target=\"_blank\"\u003ee48a07d\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdding double colons (\u003ca href=\"https://github.com/ory/kratos/issues/1187\" target=\"_blank\"\u003e#1187\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/fc712f4530066c429242491c19d1534ffb267b0c\" target=\"_blank\"\u003efc712f4\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eBcrypt is default and add 72 char warning (\u003ca href=\"https://github.com/ory/kratos/commit/29ae53a96b4472ff549b34241894d72d439c8ea1\" target=\"_blank\"\u003e29ae53a\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eBetter import identities examples (\u003ca href=\"https://github.com/ory/kratos/issues/997\" target=\"_blank\"\u003e#997\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/2e2880ac057b5c98cd69481c4f6f36b564b5871d\" target=\"_blank\"\u003e2e2880a\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eChange forum to discussions readme (\u003ca href=\"https://github.com/ory/kratos/issues/1220\" target=\"_blank\"\u003e#1220\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/ae399561ea6ed89aaadd4128bc564254984520e8\" target=\"_blank\"\u003eae39956\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eDescribe more about Kratos login/browser flow on quickstart doc (\u003ca href=\"https://github.com/ory/kratos/issues/1047\" target=\"_blank\"\u003e#1047\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/fe725ad12b5aed5faa8f95bec24ed3aa82512de8\" target=\"_blank\"\u003efe725ad\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eDocker file links (\u003ca href=\"https://github.com/ory/kratos/issues/1182\" target=\"_blank\"\u003e#1182\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/4d9b6a3fd5de81310016a811126e40a263ecd27c\" target=\"_blank\"\u003e4d9b6a3\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eDocument hash timing attack mitigation (\u003ca href=\"https://github.com/ory/kratos/commit/ec869930a9c0e6f6f56c2614835894e0a6a3eaab\" target=\"_blank\"\u003eec86993\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eExplain how to use \u003ccode\u003eafter_verification_return_to\u003c/code\u003e (\u003ca href=\"https://github.com/ory/kratos/commit/7e1546be1fd20baca10507d642d4f209eb88dcbc\" target=\"_blank\"\u003e7e1546b\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFAQ improvements (\u003ca href=\"https://github.com/ory/kratos/issues/1135\" target=\"_blank\"\u003e#1135\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/44d0bc968a7c0ba5c0793b2349820fa8133bada3\" target=\"_blank\"\u003e44d0bc9\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFAQ item \u0026amp; minor changes (\u003ca href=\"https://github.com/ory/kratos/issues/1174\" target=\"_blank\"\u003e#1174\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/11cf630082b56c80d12f5915f8e34aa03a7e8c54\" target=\"_blank\"\u003e11cf630\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix broken link (\u003ca href=\"https://github.com/ory/kratos/issues/1037\" target=\"_blank\"\u003e#1037\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/6b9aae8af5aa3bd614c99b32e341fbd533caf116\" target=\"_blank\"\u003e6b9aae8\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix failing build (\u003ca href=\"https://github.com/ory/kratos/commit/0de328ff0053605e6bded589a79d3ab938d55b31\" target=\"_blank\"\u003e0de328f\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix formatting (\u003ca href=\"https://github.com/ory/kratos/issues/966\" target=\"_blank\"\u003e#966\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/687251a24e796322b43f8aed6b1fb3d7900e3271\" target=\"_blank\"\u003e687251a\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix identity state bullets (\u003ca href=\"https://github.com/ory/kratos/issues/1095\" target=\"_blank\"\u003e#1095\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/f476334c4693277656ad88e768f66b59cbcba126\" target=\"_blank\"\u003ef476334\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix known/unknown email account recovery (\u003ca href=\"https://github.com/ory/kratos/issues/1211\" target=\"_blank\"\u003e#1211\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/e208ca50ba4f03d5410c9644aaa3b04bdf1b8dbd\" target=\"_blank\"\u003ee208ca5\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix link (\u003ca href=\"https://github.com/ory/kratos/commit/7f6d7f501d7118dfe6868c9d923fb5ecc5eded48\" target=\"_blank\"\u003e7f6d7f5\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix link (\u003ca href=\"https://github.com/ory/kratos/issues/1128\" target=\"_blank\"\u003e#1128\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/e7043e9b99260eaff2b48ca6f457af46a1521654\" target=\"_blank\"\u003ee7043e9\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix link to blogpost (\u003ca href=\"https://github.com/ory/kratos/issues/949\" target=\"_blank\"\u003e#949\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/4622e3228fb12231222c7e6b602458111f35f727\" target=\"_blank\"\u003e4622e32\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/945\" target=\"_blank\"\u003e#945\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix link to self-service flows overview (\u003ca href=\"https://github.com/ory/kratos/issues/995\" target=\"_blank\"\u003e#995\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/2be877847644a3df2645ac3be4bbd7704db30b17\" target=\"_blank\"\u003e2be8778\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix note block in third party login guide (\u003ca href=\"https://github.com/ory/kratos/issues/920\" target=\"_blank\"\u003e#920\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/745cea02d0e9940f689e668bbd814b29fd53bf37\" target=\"_blank\"\u003e745cea0\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eAllows the document to render properly\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix npm links (\u003ca href=\"https://github.com/ory/kratos/issues/991\" target=\"_blank\"\u003e#991\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/4ce4468132dde21c1692e3a834ad7780bee12b90\" target=\"_blank\"\u003e4ce4468\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix self-service code flows labels (\u003ca href=\"https://github.com/ory/kratos/issues/1253\" target=\"_blank\"\u003e#1253\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/f2ed424289cdd2a0edc1736888dd15be6df65f11\" target=\"_blank\"\u003ef2ed424\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix typo in README (\u003ca href=\"https://github.com/ory/kratos/issues/1122\" target=\"_blank\"\u003e#1122\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/e5007078c3cd597cea669827b96c7e6f205f2f32\" target=\"_blank\"\u003ee500707\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eLink to argon2 blogpost and add cross-references (\u003ca href=\"https://github.com/ory/kratos/issues/1038\" target=\"_blank\"\u003e#1038\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/9ab7c3df59ecd94a74a7bf18af9c0ded5305e042\" target=\"_blank\"\u003e9ab7c3d\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eMake explicit the ID of the default schema (\u003ca href=\"https://github.com/ory/kratos/issues/1173\" target=\"_blank\"\u003e#1173\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/cc6e9ffbac7118436d85078720cde2de98a68044\" target=\"_blank\"\u003ecc6e9ff\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eMinor cosmetics (\u003ca href=\"https://github.com/ory/kratos/issues/1050\" target=\"_blank\"\u003e#1050\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/34db06fd4f83d415c09109b06dfd3b82ce03705e\" target=\"_blank\"\u003e34db06f\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eMinor improvements (\u003ca href=\"https://github.com/ory/kratos/issues/1052\" target=\"_blank\"\u003e#1052\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/f0672b5cb8cca41fa914db21798d20f00a5699f9\" target=\"_blank\"\u003ef0672b5\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eORY -\u0026gt; Ory (\u003ca href=\"https://github.com/ory/kratos/commit/ea309797bf59f3da5c5cd184e45f2e585144be56\" target=\"_blank\"\u003eea30979\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eReformat settings code samples (\u003ca href=\"https://github.com/ory/kratos/commit/cdbbf4df5fa3fa667a78d5cf682bc7fa36693e9d\" target=\"_blank\"\u003ecdbbf4d\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRemove unnecessary and wrong docker pull commands (\u003ca href=\"https://github.com/ory/kratos/issues/1203\" target=\"_blank\"\u003e#1203\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/2b0342ad7607d705bcebfafd5a78e4e09e57a940\" target=\"_blank\"\u003e2b0342a\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve duplication error (\u003ca href=\"https://github.com/ory/kratos/commit/a3d8284ab20ae76bccba361601b7290af20bdde6\" target=\"_blank\"\u003ea3d8284\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate build from source (\u003ca href=\"https://github.com/ory/kratos/commit/9b5754f36661f6de9c95f30c06f28164fe5be48b\" target=\"_blank\"\u003e9b5754f\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/979\" target=\"_blank\"\u003e#979\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate email template docs (\u003ca href=\"https://github.com/ory/kratos/commit/1778cb9a293feb2c91c0b1921ab78a0395cdca98\" target=\"_blank\"\u003e1778cb9\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/897\" target=\"_blank\"\u003e#897\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate identity-data-model links (\u003ca href=\"https://github.com/ory/kratos/commit/b5fd9a3a0821215f94da168c9c6f87dceba8c8f4\" target=\"_blank\"\u003eb5fd9a3\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate identity.ID field documentation (\u003ca href=\"https://github.com/ory/kratos/commit/4624f03a5e9249a5449992a1f0b7ec80dc3499fd\" target=\"_blank\"\u003e4624f03\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eSee \u003ca href=\"https://github.com/ory/kratos/discussions/956\" target=\"_blank\"\u003ehttps://github.com/ory/kratos/discussions/956\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate kratos video link (\u003ca href=\"https://github.com/ory/kratos/issues/1073\" target=\"_blank\"\u003e#1073\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/e86178f4ee66e5053e0da2fab2c21ecb2e730ada\" target=\"_blank\"\u003ee86178f\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate login code samples (\u003ca href=\"https://github.com/ory/kratos/commit/695a30f6c80f277676bf04b4665efeb7ea4db618\" target=\"_blank\"\u003e695a30f\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate login code samples (\u003ca href=\"https://github.com/ory/kratos/commit/ce6c75587bea80ef83855d764fed79a9d6c948d3\" target=\"_blank\"\u003ece6c755\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate quickstart samples (\u003ca href=\"https://github.com/ory/kratos/commit/c3fcaba65899d9d46a08ca8b60ec0c010f70b16c\" target=\"_blank\"\u003ec3fcaba\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate recovery code samples (\u003ca href=\"https://github.com/ory/kratos/commit/d9fbb62faff5144f587136935f15d24b6399f29c\" target=\"_blank\"\u003ed9fbb62\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate registration code samples (\u003ca href=\"https://github.com/ory/kratos/commit/317810ffd8ba6faf87f2248263b6c82cf4e9ffd8\" target=\"_blank\"\u003e317810f\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate self-service code samples (\u003ca href=\"https://github.com/ory/kratos/commit/6415011ab83a19972c6f52467055fbdcef23a0cc\" target=\"_blank\"\u003e6415011\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate settings code samples (\u003ca href=\"https://github.com/ory/kratos/commit/bbd6266c22097fae195654957cbab589d04892c7\" target=\"_blank\"\u003ebbd6266\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate verification code samples (\u003ca href=\"https://github.com/ory/kratos/commit/4285dec59a8fc31fa3416b594c765f5da9a9de1c\" target=\"_blank\"\u003e4285dec\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUse correct extension for identity-data-model (\u003ca href=\"https://github.com/ory/kratos/commit/acab3e8b489d9865e4bf0805895f0b7ae9e6f1b8\" target=\"_blank\"\u003eacab3e8\u003c/a\u003e), closes \u003ca href=\"https://github.com//github.com/ory/kratos/pull/1197/issues/issuecomment-819455322\" target=\"_blank\"\u003e/github.com/ory/kratos/pull/1197#issuecomment-819455322\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003e\u003cstrong\u003eprometheus:\u003c/strong\u003e Update codedoc (\u003ca href=\"https://github.com/ory/kratos/commit/47146ea8ce169ee908aa4d33b59a01e9df4bae10\" target=\"_blank\"\u003e47146ea\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eFeatures:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003e\u003cp\u003eAdd email template specification in doc (\u003ca href=\"https://github.com/ory/kratos/issues/898\" target=\"_blank\"\u003e#898\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/4230d9e0fc35c651b0d2cbdbbf9e1f1c514743f8\" target=\"_blank\"\u003e4230d9e\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd error for when no login strategy was found (\u003ca href=\"https://github.com/ory/kratos/commit/6bae66cde362c4e2995c9d06a0d3ffee403feb74\" target=\"_blank\"\u003e6bae66c\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd facebook provider to oidc providers and documentation (\u003ca href=\"https://github.com/ory/kratos/issues/1035\" target=\"_blank\"\u003e#1035\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/905bb032520189212bd88f29641903945ae03608\" target=\"_blank\"\u003e905bb03\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1034\" target=\"_blank\"\u003e#1034\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd FAQ to docs (\u003ca href=\"https://github.com/ory/kratos/issues/1096\" target=\"_blank\"\u003e#1096\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/9c6b68c454f472b26c34e1975b6a67b24b218f47\" target=\"_blank\"\u003e9c6b68c\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd gh login to claims (\u003ca href=\"https://github.com/ory/kratos/commit/49deb2e166362a5d051bc08523ef44425f144bdd\" target=\"_blank\"\u003e49deb2e\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd login strategy text message (\u003ca href=\"https://github.com/ory/kratos/commit/7468c835d4800c207035897fc9962860d8ab7803\" target=\"_blank\"\u003e7468c83\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd more tests for multi domain args (\u003ca href=\"https://github.com/ory/kratos/commit/e99803b62a847bcee52bcd87fa8088124b4deae2\" target=\"_blank\"\u003ee99803b\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd Prometheus monitoring to Public APIs (\u003ca href=\"https://github.com/ory/kratos/issues/1022\" target=\"_blank\"\u003e#1022\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/75a4f1a5472ffd780fed43a7395a191ed495c6e9\" target=\"_blank\"\u003e75a4f1a\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd random delay to login flow (\u003ca href=\"https://github.com/ory/kratos/issues/1088\" target=\"_blank\"\u003e#1088\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/cb9894fefc694a4092215d3981e80f287021542f\" target=\"_blank\"\u003ecb9894f\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/832\" target=\"_blank\"\u003e#832\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd return_url to verification flow (\u003ca href=\"https://github.com/ory/kratos/issues/1149\" target=\"_blank\"\u003e#1149\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/bb99912d823e9bcffa41edf50a01dcae40117fe6\" target=\"_blank\"\u003ebb99912\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1123\" target=\"_blank\"\u003e#1123\u003c/a\u003e \u003ca href=\"https://github.com/ory/kratos/issues/1133\" target=\"_blank\"\u003e#1133\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd sql migrations for new login flow (\u003ca href=\"https://github.com/ory/kratos/commit/e947edf497b36bc576061c9ae38049e84ee48575\" target=\"_blank\"\u003ee947edf\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd sql tracing (\u003ca href=\"https://github.com/ory/kratos/commit/3c4cc1cec170df14331288170a94ada770d3289f\" target=\"_blank\"\u003e3c4cc1c\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd tracing to config schema (\u003ca href=\"https://github.com/ory/kratos/commit/007dde4482d11f22b8527c94b002da675152a872\" target=\"_blank\"\u003e007dde4\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd transporter with host modification (\u003ca href=\"https://github.com/ory/kratos/commit/2c41b81be947f9972638d082105f0f5c83078b91\" target=\"_blank\"\u003e2c41b81\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd workaround template for go openapi (\u003ca href=\"https://github.com/ory/kratos/commit/5d72d10f6c6948c48c5701fe348084a668c8311a\" target=\"_blank\"\u003e5d72d10\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdds slack sogial login (\u003ca href=\"https://github.com/ory/kratos/issues/974\" target=\"_blank\"\u003e#974\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/7c66053390b3086fe7233625038a78431a61e507\" target=\"_blank\"\u003e7c66053\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/953\" target=\"_blank\"\u003e#953\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAllow session cookie name configuration (\u003ca href=\"https://github.com/ory/kratos/commit/77ce3162ba97cf5c516c26ef499d9fa892162f0a\" target=\"_blank\"\u003e77ce316\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/268\" target=\"_blank\"\u003e#268\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAllow specifying sender name in smtp.from_address (\u003ca href=\"https://github.com/ory/kratos/issues/1100\" target=\"_blank\"\u003e#1100\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/5904fe319f75f8138783434d568db6fc7c55b301\" target=\"_blank\"\u003e5904fe3\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eBcrypt algorithm support (\u003ca href=\"https://github.com/ory/kratos/issues/1169\" target=\"_blank\"\u003e#1169\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/b2612eefbad98d29482d364f670549f470d0a6f5\" target=\"_blank\"\u003eb2612ee\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eThis patch adds the ability to use BCrypt instead of Argon2id for password hashing. We recommend using BCrypt for web workloads where password hashing should take around 200ms. For workloads where login takes \u0026gt;= 2 seconds, we recommend to continue using Argon2id.\u003c/p\u003e\n\n\u003cp\u003eTo use bcrypt for password hashing, set your config as follows:\u003c/p\u003e\n\n\u003cpre style=\"word-break: break-all; white-space: pre-wrap\"\u003e\u003ccode\u003ehashers:\n bcrypt:\n cost: 12\n algorithm: bcrypt\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eSwitching the hashing algorithm will not break existing passwords!\u003c/p\u003e\n\n\u003cp\u003eCo-authored-by: Patrik \u003ca href=\"mailto:zepatrik@users.noreply.github.com\" target=\"_blank\"\u003ezepatrik@users.noreply.github.com\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eCheck migrations in health check (\u003ca href=\"https://github.com/ory/kratos/commit/c6ef7ad16b70310c645550f7e41b3c8aff847de3\" target=\"_blank\"\u003ec6ef7ad\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eConfigure domain alias as query param (\u003ca href=\"https://github.com/ory/kratos/commit/9d8563eeb3293c42cce440ad74f025b304cccbbe\" target=\"_blank\"\u003e9d8563e\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eContextualize configuration (\u003ca href=\"https://github.com/ory/kratos/commit/d3d5327a3622318265a063be4782caa25e645a05\" target=\"_blank\"\u003ed3d5327\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eContextualize health checks (\u003ca href=\"https://github.com/ory/kratos/commit/8145a1c9acaeab441e787118d40ccd448ea82fe4\" target=\"_blank\"\u003e8145a1c\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eContextualize http client in cli calls (\u003ca href=\"https://github.com/ory/kratos/commit/3b3ef8f025d75b244d9285036e66f79af7d5ee35\" target=\"_blank\"\u003e3b3ef8f\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eContextualize persitence testers (\u003ca href=\"https://github.com/ory/kratos/commit/64403736ad9f8b264567e1f8eed1af710cab6046\" target=\"_blank\"\u003e6440373\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eCourier foreground worker with \u0026ldquo;kratos courier watch\u0026rdquo; (\u003ca href=\"https://github.com/ory/kratos/issues/1062\" target=\"_blank\"\u003e#1062\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/500b8bacd9fd541afd053f42fec66443cfebabda\" target=\"_blank\"\u003e500b8ba\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1033\" target=\"_blank\"\u003e#1033\u003c/a\u003e \u003ca href=\"https://github.com/ory/kratos/issues/1024\" target=\"_blank\"\u003e#1024\u003c/a\u003e:\u003c/p\u003e\n\n\u003cp\u003eBREACKING CHANGES: This patch moves the courier watcher (responsible for sending mail) to its own foreground worker, which can be executed as a, for example, Kubernetes job.\u003c/p\u003e\n\n\u003cp\u003eIt is still possible to have the previous behaviour which would run the worker as a background task when running \u003ccode\u003ekratos serve\u003c/code\u003e by using the \u003ccode\u003e--watch-courier\u003c/code\u003e flag.\u003c/p\u003e\n\n\u003cp\u003eTo run the foreground worker, use \u003ccode\u003ekratos courier watch -c your/config.yaml\u003c/code\u003e.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eDo not enforce bcrypt 12 for dev envs (\u003ca href=\"https://github.com/ory/kratos/commit/bbf44d887ae5cdb5975516149c74b3ba10896209\" target=\"_blank\"\u003ebbf44d8\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eEmail input validation (\u003ca href=\"https://github.com/ory/kratos/issues/1287\" target=\"_blank\"\u003e#1287\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/cd56b73df363dd37485f07d31fef11fd4d9f40a6\" target=\"_blank\"\u003ecd56b73\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1285\" target=\"_blank\"\u003e#1285\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eExport and add config options (\u003ca href=\"https://github.com/ory/kratos/commit/4391fe572eb6a766afe9808396847ca5fdca07f5\" target=\"_blank\"\u003e4391fe5\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eExpose courier worker (\u003ca href=\"https://github.com/ory/kratos/commit/f50969ecba757dea558e9e8b9dd142f5f564d53a\" target=\"_blank\"\u003ef50969e\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eExpose crdb ui (\u003ca href=\"https://github.com/ory/kratos/commit/504d5181f5e391bb8d67768b314a0348ed252c8b\" target=\"_blank\"\u003e504d518\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eGlobal docs sidebar (\u003ca href=\"https://github.com/ory/kratos/issues/1258\" target=\"_blank\"\u003e#1258\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/71082624e093b8c100e71ae59050f89b35ac20a2\" target=\"_blank\"\u003e7108262\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eImplement and test domain aliasing (\u003ca href=\"https://github.com/ory/kratos/commit/1516a54657df485627251de4e7019bc16353c956\" target=\"_blank\"\u003e1516a54\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eThis patch adds a feature called domain aliasing. For more information, head over to \u003ca href=\"http://ory.sh/docs/kratos/next/guides/multi-domain-cookies\" target=\"_blank\"\u003ehttp://ory.sh/docs/kratos/next/guides/multi-domain-cookies\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eImprove oas spec and fix mobile tests (\u003ca href=\"https://github.com/ory/kratos/commit/4ead2c826a2f1a307e327b9736dd8ac99ef52743\" target=\"_blank\"\u003e4ead2c8\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eImprove sorting of ui fields (\u003ca href=\"https://github.com/ory/kratos/commit/797b49d0175280f85f568014cf3083e9bc42d354\" target=\"_blank\"\u003e797b49d\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eSee \u003ca href=\"https://github.com/ory/kratos/discussions/1196\" target=\"_blank\"\u003ehttps://github.com/ory/kratos/discussions/1196\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eInclude schema (\u003ca href=\"https://github.com/ory/kratos/commit/348a493c9e5381830b76e57cad803a308e6ce53a\" target=\"_blank\"\u003e348a493\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eMake cli commands consumable in Ory Cloud (\u003ca href=\"https://github.com/ory/kratos/issues/926\" target=\"_blank\"\u003e#926\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/fed790b0f71f028f6d92e8ebceee188dbdb20770\" target=\"_blank\"\u003efed790b\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eMigrate to openapi v3 (\u003ca href=\"https://github.com/ory/kratos/commit/595224b1efd5a225702ef236a87f08180a7118b8\" target=\"_blank\"\u003e595224b\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003ePopulate email templates at delivery time, add plaintext defaults (\u003ca href=\"https://github.com/ory/kratos/issues/1155\" target=\"_blank\"\u003e#1155\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/7749c7a75a4386c1fd53db57626355467b698c2f\" target=\"_blank\"\u003e7749c7a\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1065\" target=\"_blank\"\u003e#1065\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eSort and label nodes with easy to use defaults (\u003ca href=\"https://github.com/ory/kratos/commit/cbec27c957a733411e4c1d511ed5854855b7236e\" target=\"_blank\"\u003ecbec27c\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eOry Kratos takes a guess based on best practices for\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eordering UI nodes (e.g. email, password, submit button)\u003c/li\u003e\n\u003cli\u003egrouping UI nodes (e.g. keep password and oidc nodes together)\u003c/li\u003e\n\u003cli\u003elabeling UI nodes (e.g. \u0026ldquo;Sign in with GitHub\u0026rdquo;)\u003c/li\u003e\n\u003cli\u003eusing the \u0026ldquo;title\u0026rdquo; attribute from the identity schema to label trait fields\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003eThis greatly simplifies front-end code on your end and makes it even easier to integrate with Ory Kratos! If you want a custom experience with e.g. translations or other things you can always adjust this in your UI integration!\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eSupport base64 inline schemas (\u003ca href=\"https://github.com/ory/kratos/commit/815a24890a118f4128ac083241a93d8df27042f7\" target=\"_blank\"\u003e815a248\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eSupport contextual csrf cookies (\u003ca href=\"https://github.com/ory/kratos/commit/957ef38b69fc6ab071b91262736e6c191be3a4b8\" target=\"_blank\"\u003e957ef38\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eSupport domain aliasing in session cookie (\u003ca href=\"https://github.com/ory/kratos/commit/0681c123f2d856ca27caee645dadc9e6e3731d2c\" target=\"_blank\"\u003e0681c12\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eSupport label in oidc config (\u003ca href=\"https://github.com/ory/kratos/commit/a99cdcddaa0c4bd7b679884b232c2ef8f2dcd978\" target=\"_blank\"\u003ea99cdcd\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eSupport retryable CRDB transactions (\u003ca href=\"https://github.com/ory/kratos/commit/f0c21d7e0a6ed85818d0e9025a451cb8cbdee086\" target=\"_blank\"\u003ef0c21d7\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUnix sockets support (\u003ca href=\"https://github.com/ory/kratos/issues/1255\" target=\"_blank\"\u003e#1255\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/ad010de240ddd9219f0cfb2ca3fbb180d2d3a697\" target=\"_blank\"\u003ead010de\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eWeb hooks support (recovery) (\u003ca href=\"https://github.com/ory/kratos/issues/1289\" target=\"_blank\"\u003e#1289\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/3e181fe3d7750a715ab31eb8347fbb4bdb89d6e6\" target=\"_blank\"\u003e3e181fe\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/271\" target=\"_blank\"\u003e#271\u003c/a\u003e:\u003c/p\u003e\n\n\u003cp\u003efeat: web hooks for self-service flows\u003c/p\u003e\n\n\u003cp\u003eThis feature adds the ability to define web-hooks using a mixture of configuration and JsonNet. This allows integration with services like Mailchimp, Stripe, CRMs, and all other APIs that support REST requests. Additional to these new changes it is now possible to define hooks for verification and recovery as well!\u003c/p\u003e\n\n\u003cp\u003eFor more information, head over to the \u003ca href=\"https://www.ory.sh/kratos/docs/self-service/hooks\" target=\"_blank\"\u003ehooks documentation\u003c/a\u003e.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003e\u003cstrong\u003ecourier:\u003c/strong\u003e Allow sending individual messages (\u003ca href=\"https://github.com/ory/kratos/commit/cbb2c0bef63323a177589e9d2a809c84b4f1acdd\" target=\"_blank\"\u003ecbb2c0b\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003e\u003cstrong\u003eoidc:\u003c/strong\u003e Support google hd claim (\u003ca href=\"https://github.com/ory/kratos/issues/1097\" target=\"_blank\"\u003e#1097\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/1f20a5ceba7682719112d24a3b18bf046fb2ac22\" target=\"_blank\"\u003e1f20a5c\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003e\u003cstrong\u003eschema:\u003c/strong\u003e Add totp errors (\u003ca href=\"https://github.com/ory/kratos/commit/a61f8814101401dbb422967e37b6c6c1ae85d113\" target=\"_blank\"\u003ea61f881\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eTests:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eAdd case to ensure correct behavior when verifying a different email address (\u003ca href=\"https://github.com/ory/kratos/issues/999\" target=\"_blank\"\u003e#999\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/f95a117677c9c59436ad10aa8951fe875c39a64f\" target=\"_blank\"\u003ef95a117\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/998\" target=\"_blank\"\u003e#998\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd oasis test case (\u003ca href=\"https://github.com/ory/kratos/commit/f80691b9dd77566857c4284e2639cc94d5b8c333\" target=\"_blank\"\u003ef80691b\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eBump poll interval (\u003ca href=\"https://github.com/ory/kratos/commit/b3dc925a5d43557293745ee81c0ffb3db37b6342\" target=\"_blank\"\u003eb3dc925\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eBump video quality (\u003ca href=\"https://github.com/ory/kratos/commit/b7f8d042646037e1589ae2d03602bd63a5cec2fe\" target=\"_blank\"\u003eb7f8d04\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eBump wait times (\u003ca href=\"https://github.com/ory/kratos/commit/b2e43f8b0b64784f60e5f57d9a0f5d2928c2b891\" target=\"_blank\"\u003eb2e43f8\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eClean up hydra env before restart (\u003ca href=\"https://github.com/ory/kratos/commit/cf494149e6a46b15e3b174185e1e87cfcd6f9f7a\" target=\"_blank\"\u003ecf49414\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eLonger wait times (\u003ca href=\"https://github.com/ory/kratos/commit/4bec9ef50f14f22342a311f09ba1b59cde47befc\" target=\"_blank\"\u003e4bec9ef\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eReliable migration tests on crdb (\u003ca href=\"https://github.com/ory/kratos/commit/2e3764ba66c156d810de66fba2b0e142dced6f4d\" target=\"_blank\"\u003e2e3764b\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRemove old noop test (\u003ca href=\"https://github.com/ory/kratos/commit/16dca3f78b2021c09ec83e81ab6d2e68c42ca081\" target=\"_blank\"\u003e16dca3f\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eResolve compile issues (\u003ca href=\"https://github.com/ory/kratos/commit/c1b5ba42171ec522579df9dfaff27b5b74a1566a\" target=\"_blank\"\u003ec1b5ba4\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eResolve flaky tests (\u003ca href=\"https://github.com/ory/kratos/commit/cb670a854cbb09b8437bfed7e4a6908ff6dcfd27\" target=\"_blank\"\u003ecb670a8\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eResolve json parser test regression (\u003ca href=\"https://github.com/ory/kratos/commit/a1b9b9a95d58583dc7ecf6d2a501da52f84dd6bb\" target=\"_blank\"\u003ea1b9b9a\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eResolve login integration regressions (\u003ca href=\"https://github.com/ory/kratos/commit/388b5b27d6dee7770e5f37d6d83c532044a4e984\" target=\"_blank\"\u003e388b5b2\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eResolve migration regression (\u003ca href=\"https://github.com/ory/kratos/commit/2051a716cb4b8cf334dd65f2ccddb31e5fbed545\" target=\"_blank\"\u003e2051a71\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eResolve more json parser test regressions (\u003ca href=\"https://github.com/ory/kratos/commit/ff791c41a1d9ce25af4e883469d3f8c0ef9eb302\" target=\"_blank\"\u003eff791c4\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eResolve regression (\u003ca href=\"https://github.com/ory/kratos/commit/e2b0ad3c1845da80f078b11b327b9a0376cbb7c5\" target=\"_blank\"\u003ee2b0ad3\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUpdate schema tests for webhooks (\u003ca href=\"https://github.com/ory/kratos/commit/d1ddfa80742728b28dc5710ca5b6e7282a2dec55\" target=\"_blank\"\u003ed1ddfa8\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ee2e:\u003c/strong\u003e Significantly reduce wait and idle times (\u003ca href=\"https://github.com/ory/kratos/commit/f525fc53afec6f5232ce507fe25ddec1b9069196\" target=\"_blank\"\u003ef525fc5\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eResolve more regressions (\u003ca href=\"https://github.com/ory/kratos/commit/c5a23af81427480088651833d904e3403a969fab\" target=\"_blank\"\u003ec5a23af\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eResolve order regression (\u003ca href=\"https://github.com/ory/kratos/commit/40a849ca35f4700185322e9ac4f6a4b70132851c\" target=\"_blank\"\u003e40a849c\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eResolve regression (\u003ca href=\"https://github.com/ory/kratos/commit/f0c9e5ff105d76d6bc9478c98522b2440c7181df\" target=\"_blank\"\u003ef0c9e5f\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eResolve regressions (\u003ca href=\"https://github.com/ory/kratos/commit/4b9da3c9d98d40f7b71a56c51543fc115974630d\" target=\"_blank\"\u003e4b9da3c\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eResolve stub regressions (\u003ca href=\"https://github.com/ory/kratos/commit/82650cf1843f6bfde015f556f4452a7b6fd52b11\" target=\"_blank\"\u003e82650cf\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eResolve test migrations (\u003ca href=\"https://github.com/ory/kratos/commit/de0b65d96daef0e31c12b3b6915f283a8e71244b\" target=\"_blank\"\u003ede0b65d\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eResolve test regression issues (\u003ca href=\"https://github.com/ory/kratos/commit/ccf9feddade11f9fcaaf1c37dd3efeb2c4df6649\" target=\"_blank\"\u003eccf9fed\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSpeed up tests (\u003ca href=\"https://github.com/ory/kratos/commit/a16737cccc36a14444711660f1737913ffd7ba01\" target=\"_blank\"\u003ea16737c\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUpdate test description (\u003ca href=\"https://github.com/ory/kratos/commit/55fb37f62fc3ab7c0d5324ed31ef3e7f66a73aa2\" target=\"_blank\"\u003e55fb37f\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUse bcrypt cost 4 to reduce CI times (\u003ca href=\"https://github.com/ory/kratos/commit/cabe97d0656858fd1ee0442b40881417e91294f3\" target=\"_blank\"\u003ecabe97d\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUse fast bcrypt for e2e (\u003ca href=\"https://github.com/ory/kratos/commit/d90cf13230632e76eb74965c0945573b4f2e98ff\" target=\"_blank\"\u003ed90cf13\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eUnclassified:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eFormat (\u003ca href=\"https://github.com/ory/kratos/commit/e4b7e79f4ee91dadfcd008a5b3e318b6bfedad10\" target=\"_blank\"\u003ee4b7e79\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFormat (\u003ca href=\"https://github.com/ory/kratos/commit/193d2668ae0955a1346390057539a8b796d17afd\" target=\"_blank\"\u003e193d266\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFormat (\u003ca href=\"https://github.com/ory/kratos/commit/1ebfbdea75f27c8eeafa7d3aff45de133ea340bb\" target=\"_blank\"\u003e1ebfbde\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFormat (\u003ca href=\"https://github.com/ory/kratos/commit/ba1eeef4f232c4ab59343a2ca3c7cf0eb6dfd110\" target=\"_blank\"\u003eba1eeef\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFormat (\u003ca href=\"https://github.com/ory/kratos/commit/ada5dbb58c45502b8275850a3bc0876debc66888\" target=\"_blank\"\u003eada5dbb\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eInitial documentation tests via Text-Runner (\u003ca href=\"https://github.com/ory/kratos/issues/567\" target=\"_blank\"\u003e#567\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/c30eb26f76ab70a6098c0b40c9a04726d36d72f2\" target=\"_blank\"\u003ec30eb26\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix: resolve clidoc issues (#976) (\u003ca href=\"https://github.com/ory/kratos/commit/346bc73921655d52861b8803eb3351c4205657ee\" target=\"_blank\"\u003e346bc73\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/976\" target=\"_blank\"\u003e#976\u003c/a\u003e \u003ca href=\"https://github.com/ory/kratos/issues/951\" target=\"_blank\"\u003e#951\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFormat (\u003ca href=\"https://github.com/ory/kratos/commit/17a0bf5872b33eac615afc675c7d92d7c7441b2e\" target=\"_blank\"\u003e17a0bf5\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e:bug: fix ory home directory path (#897) (\u003ca href=\"https://github.com/ory/kratos/commit/2fca2bedaa907691bef324c11545e007b51d4881\" target=\"_blank\"\u003e2fca2be\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/897\" target=\"_blank\"\u003e#897\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix typo in config schema (\u003ca href=\"https://github.com/ory/kratos/commit/16337f13e4388a715c8109c29cf198c82a848a16\" target=\"_blank\"\u003e16337f1\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eBug Fixes:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003e\u003cp\u003eCSRF token is required when using the Revoke Session API endpoint (\u003ca href=\"https://github.com/ory/kratos/issues/839\" target=\"_blank\"\u003e#839\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/d3218a0f23de7293b0a4a966ad21369a92b68b1a\" target=\"_blank\"\u003ed3218a0\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/838\" target=\"_blank\"\u003e#838\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eIncorrect home path (\u003ca href=\"https://github.com/ory/kratos/issues/848\" target=\"_blank\"\u003e#848\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/5265af00c92fe505819300caddfcc64004d45c65\" target=\"_blank\"\u003e5265af0\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eMake password policy configurable (\u003ca href=\"https://github.com/ory/kratos/issues/888\" target=\"_blank\"\u003e#888\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/7a00483908bb623efdf281e76005c4485ea6b1ab\" target=\"_blank\"\u003e7a00483\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/450\" target=\"_blank\"\u003e#450\u003c/a\u003e \u003ca href=\"https://github.com/ory/kratos/issues/316\" target=\"_blank\"\u003e#316\u003c/a\u003e:\u003c/p\u003e\n\n\u003cp\u003eAllows configuring password breach thresholds and optionally enforces checks against the HIBP API.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRemove obsolete types (\u003ca href=\"https://github.com/ory/kratos/issues/887\" target=\"_blank\"\u003e#887\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/b8bac7aa56c16cd98f76a95a5e0d01fb1bbde6b7\" target=\"_blank\"\u003eb8bac7a\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/716\" target=\"_blank\"\u003e#716\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eSet samesite attribute to lax if in dev mode (\u003ca href=\"https://github.com/ory/kratos/issues/824\" target=\"_blank\"\u003e#824\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/91d6698e4ce05ee59bb72fc84b54af9d1d204b41\" target=\"_blank\"\u003e91d6698\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/821\" target=\"_blank\"\u003e#821\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUse working cache-control header for cdn/proxies/cache (\u003ca href=\"https://github.com/ory/kratos/issues/869\" target=\"_blank\"\u003e#869\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/d8e3d40001ffdc64da2288f3cffd53cf3bfdf781\" target=\"_blank\"\u003ed8e3d40\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/601\" target=\"_blank\"\u003e#601\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eCode Generation:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003ePin v0.5.5-alpha.1 release commit (\u003ca href=\"https://github.com/ory/kratos/commit/83aedcb885acb96c5deb39fff675d5f0528af32d\" target=\"_blank\"\u003e83aedcb\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eDocumentation:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003e\u003cp\u003eAdd contributing to sidebar (\u003ca href=\"https://github.com/ory/kratos/issues/866\" target=\"_blank\"\u003e#866\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/44f33f97d43f2a3c553a65ebb2986e0731c0e5f2\" target=\"_blank\"\u003e44f33f9\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eThe same change as in \u003ca href=\"https://github.com/ory/hydra/pull/2209\" target=\"_blank\"\u003ehttps://github.com/ory/hydra/pull/2209\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd newsletter to config (\u003ca href=\"https://github.com/ory/kratos/commit/1735ca2ced104971de4e97524d0a23d57ba045f2\" target=\"_blank\"\u003e1735ca2\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd recovery flow (\u003ca href=\"https://github.com/ory/kratos/issues/868\" target=\"_blank\"\u003e#868\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/d95cfe9759d3ffc08c24048a064c0c800abdf4b4\" target=\"_blank\"\u003ed95cfe9\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/864\" target=\"_blank\"\u003e#864\u003c/a\u003e:\u003c/p\u003e\n\n\u003cp\u003eAdded a short section for the recovery flow on managing-user-identities.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix account recovery click instruction (\u003ca href=\"https://github.com/ory/kratos/issues/870\" target=\"_blank\"\u003e#870\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/383de9ecf6f6504dbb9c20fb4cb984e934f0751e\" target=\"_blank\"\u003e383de9e\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix broken link (\u003ca href=\"https://github.com/ory/kratos/issues/893\" target=\"_blank\"\u003e#893\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/dec38a28964aaa13827d356e5bfa12c2a6d1400e\" target=\"_blank\"\u003edec38a2\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/835\" target=\"_blank\"\u003e#835\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix oidc config example structure (\u003ca href=\"https://github.com/ory/kratos/issues/845\" target=\"_blank\"\u003e#845\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/c102a6844db29f994b67d23bb04e64ee71376264\" target=\"_blank\"\u003ec102a68\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix redirect (\u003ca href=\"https://github.com/ory/kratos/issues/802\" target=\"_blank\"\u003e#802\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/b86878229f343e6b11521596b04040f892d1e2c3\" target=\"_blank\"\u003eb868782\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix typo (\u003ca href=\"https://github.com/ory/kratos/issues/847\" target=\"_blank\"\u003e#847\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/9b3da9f0fe2ce71743115844d8c91a1dc9c4cbae\" target=\"_blank\"\u003e9b3da9f\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix typo (\u003ca href=\"https://github.com/ory/kratos/issues/881\" target=\"_blank\"\u003e#881\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/3078293717a2ce21c4b939de4c2c4886c75303b5\" target=\"_blank\"\u003e3078293\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix typo MKFA to MFA (\u003ca href=\"https://github.com/ory/kratos/issues/826\" target=\"_blank\"\u003e#826\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/a5613d08aa21f90f4d192e5663ba4977b3de16c3\" target=\"_blank\"\u003ea5613d0\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRemove workaround note (\u003ca href=\"https://github.com/ory/kratos/issues/886\" target=\"_blank\"\u003e#886\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/05409bc13f527398e3de01f29437e5d4353ef8d4\" target=\"_blank\"\u003e05409bc\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/718\" target=\"_blank\"\u003e#718\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eSwagger specs for selfservice settings browser flow (\u003ca href=\"https://github.com/ory/kratos/issues/825\" target=\"_blank\"\u003e#825\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/28d50f45ab14d561609be7047cac13902394b547\" target=\"_blank\"\u003e28d50f4\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate oidc provider with json conf support (\u003ca href=\"https://github.com/ory/kratos/issues/833\" target=\"_blank\"\u003e#833\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/670eb37d19674f33a36402cd9a88d61ca7327751\" target=\"_blank\"\u003e670eb37\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eFeatures:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eAdd return_to parameter to logout flow (\u003ca href=\"https://github.com/ory/kratos/issues/823\" target=\"_blank\"\u003e#823\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/1c146dd21d616a56f510019abadd37402782bb39\" target=\"_blank\"\u003e1c146dd\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/702\" target=\"_blank\"\u003e#702\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd selinux compatible quickstart config (\u003ca href=\"https://github.com/ory/kratos/issues/889\" target=\"_blank\"\u003e#889\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/0f879481df209ed96b778799adcc2a9424449b37\" target=\"_blank\"\u003e0f87948\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/831\" target=\"_blank\"\u003e#831\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eTests:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eEnsure registration runs only once (\u003ca href=\"https://github.com/ory/kratos/issues/872\" target=\"_blank\"\u003e#872\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/5ffc036ac82f36ad6ef499e217971275a35fc23a\" target=\"_blank\"\u003e5ffc036\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eUnclassified:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003edocs: fix link and typo in Configuring Cookies (#883) (\u003ca href=\"https://github.com/ory/kratos/commit/c51ed6b789d2e3a8fe4e93565c3bded37d298f98\" target=\"_blank\"\u003ec51ed6b\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/883\" target=\"_blank\"\u003e#883\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eBug Fixes:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003e\u003cp\u003eCase in settings handler method (\u003ca href=\"https://github.com/ory/kratos/issues/798\" target=\"_blank\"\u003e#798\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/83eb4e0021621014d2b543e57a01401381f07fe4\" target=\"_blank\"\u003e83eb4e0\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eForce brew install statement (\u003ca href=\"https://github.com/ory/kratos/issues/796\" target=\"_blank\"\u003e#796\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/ad542ad5919205ac26a757145474e5a46f3937ec\" target=\"_blank\"\u003ead542ad\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eCloses \u003ca href=\"https://github.com/ory/homebrew-kratos/issues/1\" target=\"_blank\"\u003ehttps://github.com/ory/homebrew-kratos/issues/1\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eCode Generation:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003ePin v0.5.4-alpha.1 release commit (\u003ca href=\"https://github.com/ory/kratos/commit/b02926c42aee2748bc37ce2600596bd0c2537a0d\" target=\"_blank\"\u003eb02926c\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eCode Refactoring:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eMove pkger and ioutil helpers to ory/x (\u003ca href=\"https://github.com/ory/kratos/commit/60a0fc449d90ead6065ca00926536a989d8b2a2b\" target=\"_blank\"\u003e60a0fc4\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eDocumentation:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eFix another broken link (\u003ca href=\"https://github.com/ory/kratos/commit/15bae9f893c2e2910167326d987455246c110001\" target=\"_blank\"\u003e15bae9f\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix broken links (\u003ca href=\"https://github.com/ory/kratos/issues/795\" target=\"_blank\"\u003e#795\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/0ab0e7eca8e95d6c26d028c177cbbd1f06b68871\" target=\"_blank\"\u003e0ab0e7e\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/793\" target=\"_blank\"\u003e#793\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix broken relative link (\u003ca href=\"https://github.com/ory/kratos/issues/812\" target=\"_blank\"\u003e#812\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/b32b173fe30b7c5c43700abfa4ddb3409a33556b\" target=\"_blank\"\u003eb32b173\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix links (\u003ca href=\"https://github.com/ory/kratos/issues/800\" target=\"_blank\"\u003e#800\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/5fcc272e625de9e583b2ec24d5679895a6d24c1b\" target=\"_blank\"\u003e5fcc272\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix oidc config examples (\u003ca href=\"https://github.com/ory/kratos/issues/799\" target=\"_blank\"\u003e#799\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/8a4f480121995d9899668f037382086fcdd2da4c\" target=\"_blank\"\u003e8a4f480\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix self-service recovery flow typo (\u003ca href=\"https://github.com/ory/kratos/issues/807\" target=\"_blank\"\u003e#807\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/800110d87c9df70a5ec79b58d9fcb9ae39ff76b9\" target=\"_blank\"\u003e800110d\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRemove duplicate words \u0026amp; fix spelling (\u003ca href=\"https://github.com/ory/kratos/issues/810\" target=\"_blank\"\u003e#810\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/4e1b96667d9f08dbafeb2f5ce144ca43309de8e0\" target=\"_blank\"\u003e4e1b966\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRemove leftover category from reference sidebar (\u003ca href=\"https://github.com/ory/kratos/issues/813\" target=\"_blank\"\u003e#813\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/94fde5101d00b9e1f7228e9d122ef0a8e4719355\" target=\"_blank\"\u003e94fde51\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUse correct links (\u003ca href=\"https://github.com/ory/kratos/issues/797\" target=\"_blank\"\u003e#797\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/a4de29399e4f1b5d0a33acc85478f2d38579a174\" target=\"_blank\"\u003ea4de293\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eFeatures:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003e\u003cp\u003eAdd helper for choosing argon2 parameters (\u003ca href=\"https://github.com/ory/kratos/issues/803\" target=\"_blank\"\u003e#803\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/ca5a69b798635d0e5361fd5b0cc369b035dca738\" target=\"_blank\"\u003eca5a69b\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/723\" target=\"_blank\"\u003e#723\u003c/a\u003e \u003ca href=\"https://github.com/ory/kratos/issues/572\" target=\"_blank\"\u003e#572\u003c/a\u003e \u003ca href=\"https://github.com/ory/kratos/issues/647\" target=\"_blank\"\u003e#647\u003c/a\u003e:\u003c/p\u003e\n\n\u003cp\u003eThis patch adds the new command \u0026ldquo;hashers argon2 calibrate\u0026rdquo; which allows one to pick the desired hashing time for password hashing and then chooses the optimal parameters for the hardware the command is running on:\u003c/p\u003e\n\n\u003cpre style=\"word-break: break-all; white-space: pre-wrap\"\u003e\u003ccode\u003e$ kratos hashers argon2 calibrate 500ms\nIncreasing memory to get over 500ms:\n took 2.846592732s in try 0\n took 6.006488824s in try 1\n took 4.42657975s with 4.00GB of memory\n[...]\nDecreasing iterations to get under 500ms:\n took 484.257775ms in try 0\n took 488.784192ms in try 1\n took 486.534204ms with 3 iterations\nSettled on 3 iterations.\n\n\n{\n \u0026quot;memory\u0026quot;: 1048576,\n \u0026quot;iterations\u0026quot;: 3,\n \u0026quot;parallelism\u0026quot;: 32,\n \u0026quot;salt_length\u0026quot;: 16,\n \u0026quot;key_length\u0026quot;: 32\n}\n\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eBug Fixes:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003e\u003cp\u003eAdd \u0026ldquo;x-session-token\u0026rdquo; to default allowed headers (\u003ca href=\"https://github.com/ory/kratos/commit/3c912e4c7d46fd45c00cabb68ed7770bd44f7d07\" target=\"_blank\"\u003e3c912e4\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eDo not set cookies on api endpoints (\u003ca href=\"https://github.com/ory/kratos/commit/2f67c28718856ea03ea2effa89b28a8c4b3b8ae0\" target=\"_blank\"\u003e2f67c28\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eDo not set csrf cookies on potential api endpoints (\u003ca href=\"https://github.com/ory/kratos/commit/4d97a95d084ea99f5aca158609e197acd256cdd7\" target=\"_blank\"\u003e4d97a95\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eIgnore unsupported migration dialects (\u003ca href=\"https://github.com/ory/kratos/commit/12bb8d14ae1edef18591996411be67d5693e5101\" target=\"_blank\"\u003e12bb8d1\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/778\" target=\"_blank\"\u003e#778\u003c/a\u003e:\u003c/p\u003e\n\n\u003cp\u003eSkips sqlite3 migrations when support is lacking.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eImprove semver regex (\u003ca href=\"https://github.com/ory/kratos/commit/584c0b5043e85e88ac2648cf699d60fed3e775a9\" target=\"_blank\"\u003e584c0b5\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eProperly set nosurf context even when ignored (\u003ca href=\"https://github.com/ory/kratos/commit/0dcb774157bcbfd41a5d9df3914c31162226da75\" target=\"_blank\"\u003e0dcb774\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate cypress (\u003ca href=\"https://github.com/ory/kratos/commit/ba8b1729477233f79d099e5d7b397430ac1c6ace\" target=\"_blank\"\u003eba8b172\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUse correct regex for version replacement (\u003ca href=\"https://github.com/ory/kratos/commit/ce870ababdf089344a9428d3a405e18504a3c906\" target=\"_blank\"\u003ece870ab\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/787\" target=\"_blank\"\u003e#787\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eCode Generation:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003ePin v0.5.3-alpha.1 release commit (\u003ca href=\"https://github.com/ory/kratos/commit/64dc91af54cdf3eba158a50690240cdc8f7cb43b\" target=\"_blank\"\u003e64dc91a\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eDocumentation:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eFix docosaurus admonitions (\u003ca href=\"https://github.com/ory/kratos/issues/788\" target=\"_blank\"\u003e#788\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/281a7c9289570d4bee33447655281b610cbe7e52\" target=\"_blank\"\u003e281a7c9\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePin download script version (\u003ca href=\"https://github.com/ory/kratos/commit/e4137a6a41d68b1480af2075bda8c5f46c42cd22\" target=\"_blank\"\u003ee4137a6\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRemove trailing garbage from quickstart (\u003ca href=\"https://github.com/ory/kratos/issues/787\" target=\"_blank\"\u003e#787\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/7e709242ada28b7781c6ace272f60f9d1b9d5b2f\" target=\"_blank\"\u003e7e70924\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eFeatures:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eImprove makefile install process and update deps (\u003ca href=\"https://github.com/ory/kratos/commit/d1eb37f5d9d0f16e7864b5f8f08a44ba80853fa5\" target=\"_blank\"\u003ed1eb37f\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eTests:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eAdd e2e tests for mobile (\u003ca href=\"https://github.com/ory/kratos/commit/d481d51f5f4de96cbbc7c347f5dbff381b44462d\" target=\"_blank\"\u003ed481d51\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd option to disable csrf protection in apis (\u003ca href=\"https://github.com/ory/kratos/commit/a0077f12adf94ff428b502b69bbb0eaafd05be66\" target=\"_blank\"\u003ea0077f1\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eBump wait time (\u003ca href=\"https://github.com/ory/kratos/commit/7a719e17c5641f4df47314f6f0ac2cf73dddc8bb\" target=\"_blank\"\u003e7a719e1\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eInstall expo-cli globally (\u003ca href=\"https://github.com/ory/kratos/commit/db21cfa1c589a2dab829a4c8eaf1db15d14d965e\" target=\"_blank\"\u003edb21cfa\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eInstall expo-cli in cci config with sudo (\u003ca href=\"https://github.com/ory/kratos/commit/d255f462402f2d2c2278dcba1a139d0064343b22\" target=\"_blank\"\u003ed255f46\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eLog wait-on output (\u003ca href=\"https://github.com/ory/kratos/commit/62b5ba92d56e9f6b98adb8fb9c4daff03be08f2e\" target=\"_blank\"\u003e62b5ba9\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eOutput web server address (\u003ca href=\"https://github.com/ory/kratos/commit/cb41ca78367b1943d230fa9ac116fcf3cf69b1c1\" target=\"_blank\"\u003ecb41ca7\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eResolve csrf test issues in settings (\u003ca href=\"https://github.com/ory/kratos/commit/ef8ba7dc93d6ba84f22b7aa65d00797e33b520a3\" target=\"_blank\"\u003eef8ba7d\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eResolve test panic (\u003ca href=\"https://github.com/ory/kratos/commit/6f6461fe3690576015ded9146c065a1e5d950be1\" target=\"_blank\"\u003e6f6461f\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRevert delay increase and improve install scripts (\u003ca href=\"https://github.com/ory/kratos/commit/1eafcaa86be194e412b0470a759bff6afc6c21af\" target=\"_blank\"\u003e1eafcaa\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eBug Fixes:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eAdd debug quickstart yml (\u003ca href=\"https://github.com/ory/kratos/issues/780\" target=\"_blank\"\u003e#780\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/16e6b4d76d297182ea9a1f5dc6367570f02f7b42\" target=\"_blank\"\u003e16e6b4d\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eGracefully handle double slashes in URLs (\u003ca href=\"https://github.com/ory/kratos/commit/aeb941477910b5ab54429a6aab7a3e1e388c48c5\" target=\"_blank\"\u003eaeb9414\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/779\" target=\"_blank\"\u003e#779\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eMerge gobuffalo CGO fix (\u003ca href=\"https://github.com/ory/kratos/commit/fea2e77ca0f9b20185c7a7704854fdcf29b7ab33\" target=\"_blank\"\u003efea2e77\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRemove obsolete recovery_token and add link to schema (\u003ca href=\"https://github.com/ory/kratos/commit/acf6ac4e11c755e56c7d40728088257de367f7ff\" target=\"_blank\"\u003eacf6ac4\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eReturn correct error in login csrf (\u003ca href=\"https://github.com/ory/kratos/commit/dd9cab0e02400c88e89877f755f03c6179013123\" target=\"_blank\"\u003edd9cab0\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/785\" target=\"_blank\"\u003e#785\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUse correct assert package (\u003ca href=\"https://github.com/ory/kratos/commit/76be5b0a5d94c251f5f07eee9f700ec11b341e2e\" target=\"_blank\"\u003e76be5b0\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eCode Generation:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003ePin v0.5.2-alpha.1 release commit (\u003ca href=\"https://github.com/ory/kratos/commit/79fcd8a6949886f847f7be0c9ba2aba7554ab204\" target=\"_blank\"\u003e79fcd8a\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eDocumentation:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eSmall improvements to discord oidc provider guide (\u003ca href=\"https://github.com/ory/kratos/issues/783\" target=\"_blank\"\u003e#783\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/6a3c45330885eb95015fa7ee9b58a72c38132499\" target=\"_blank\"\u003e6a3c453\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eTests:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eAdd tests for csrf behavior (\u003ca href=\"https://github.com/ory/kratos/commit/48993e2c496fb8af7e7b9e2752ba7078a134a75a\" target=\"_blank\"\u003e48993e2\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/785\" target=\"_blank\"\u003e#785\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eMark link as enabled in e2e test (\u003ca href=\"https://github.com/ory/kratos/commit/c214b81a7026b06aaca062b2aa77951d01b0e237\" target=\"_blank\"\u003ec214b81\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eResolve schema test regression (\u003ca href=\"https://github.com/ory/kratos/commit/bb7af1b759d6c812755956ef872bcbd31b9c50be\" target=\"_blank\"\u003ebb7af1b\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/span\u003e\n \u003c/p\u003e\n \u003c/div\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n\n \u003ctr\u003e\n \u003ctd\n align=\"left\"\n class=\"x m\"\n style=\"\n font-size: 0;\n padding: 0;\n padding-bottom: 16px;\n word-break: break-word;\n \"\n \u003e\n \u003cdiv\n style=\"\n font-family: Inter, Arial,\n sans-serif;\n font-size: 16px;\n line-height: 28px;\n text-align: left;\n color: #000000;\n \"\n \u003e\n \u003cp\n style=\"\n margin: 0;\n text-align: left;\n \"\n \u003e\n \u003cspan\n style=\"\n mso-line-height-rule: exactly;\n font-size: 16px;\n font-family: Inter, Arial,\n sans-serif;\n font-weight: 400;\n color: #616161;\n line-height: 28px;\n \"\n \u003eChanges requiring your attention may have been introduced since the last release, please read the\u0026nbsp;\u003ca style=\"color:#3d53f5\" href=\"https://github.com/ory/ory/kratos/blob/master/CHANGELOG.md\" target=\"_blank\"\u003echangelog\u003c/a\u003e\u0026nbsp;with care.\n \u003c/span\u003e\n \u003c/p\u003e\n \u003c/div\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\n class=\"s m\"\n style=\"\n font-size: 0;\n padding: 0;\n padding-bottom: 16px;\n word-break: break-word;\n \"\n \u003e\n \u003cdiv\n style=\"\n height: 4px;\n line-height: 4px;\n \"\n \u003e\n \u0026#8202;\n \u003c/div\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\n align=\"left\"\n class=\"i fw-1\"\n style=\"\n font-size: 0;\n padding: 0;\n padding-bottom: 0;\n word-break: break-word;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"\n border-collapse: collapse;\n border-spacing: 0;\n \"\n class=\"fwm\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n style=\"width: 440px\"\n class=\"fwm\"\n \u003e\n \u003cimg\n alt=\"\"\n height=\"auto\"\n src=\"https://f002.backblazeb2.com/file/emailify/06243b93e25d257b7fbf205634f697bb.png\"\n style=\"\n border: 0;\n border-radius: 10px 10px\n 10px 10px;\n display: block;\n outline: none;\n text-decoration: none;\n height: auto;\n width: 100%;\n font-size: 13px;\n \"\n width=\"440\"\n /\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n \n \u003cdiv\n class=\"xc16 ogf g mb-16\"\n style=\"\n font-size: 0;\n text-align: left;\n direction: ltr;\n display: inline-block;\n vertical-align: top;\n width: 100%;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd style=\"vertical-align: top; padding: 0\"\u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n \n \u003cdiv\n class=\"xc32 ogf\"\n style=\"\n font-size: 0;\n text-align: left;\n direction: ltr;\n display: inline-block;\n vertical-align: middle;\n width: 100%;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd style=\"vertical-align: middle; padding: 0 0 0 0\"\u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n align=\"left\"\n class=\"i hm-1\"\n style=\"\n font-size: 0;\n padding: 0;\n word-break: break-word;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"\n border-collapse: collapse;\n border-spacing: 0;\n \"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd style=\"width: 32px\"\u003e\n \u003cimg\n alt=\"\"\n height=\"auto\"\n src=\"https://f002.backblazeb2.com/file/emailify/150a8c06dcaa45901e3887296457cc12.jpg\"\n style=\"\n border: 0;\n border-radius: 0;\n display: block;\n outline: none;\n text-decoration: none;\n height: auto;\n width: 100%;\n font-size: 13px;\n \"\n width=\"32\"\n /\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n \n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n\n \n \u003cdiv\n class=\"r pr-16 pl-16\"\n style=\"\n background: #eeeeee;\n background-color: #eeeeee;\n margin: 0px auto;\n border-radius: 0;\n max-width: 1200px;\n \"\n \u003e\n \u003ctable\n align=\"center\"\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"\n background: #eeeeee;\n background-color: #eeeeee;\n width: 100%;\n border-radius: 0;\n \"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n style=\"\n border: none;\n direction: ltr;\n font-size: 0;\n padding: 32px 32px 48px 32px;\n text-align: left;\n \"\n \u003e\n \n \u003cdiv\n class=\"xc32 ogf m\"\n style=\"\n font-size: 0;\n text-align: left;\n direction: ltr;\n display: inline-block;\n vertical-align: middle;\n width: 100%;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd style=\"vertical-align: middle; padding: 0 0 0 0\"\u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n align=\"left\"\n class=\"i hm-1\"\n style=\"\n font-size: 0;\n padding: 0;\n word-break: break-word;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"\n border-collapse: collapse;\n border-spacing: 0;\n \"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd style=\"width: 32px\"\u003e\n \u003cimg\n alt=\"\"\n height=\"auto\"\n src=\"https://f002.backblazeb2.com/file/emailify/c026cf429700701f40428f478d349306.jpg\"\n style=\"\n border: 0;\n border-radius: 0;\n display: block;\n outline: none;\n text-decoration: none;\n height: auto;\n width: 100%;\n font-size: 13px;\n \"\n width=\"32\"\n /\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n \n \u003cdiv\n class=\"xc16 ogf g mb-16\"\n style=\"\n font-size: 0;\n text-align: left;\n direction: ltr;\n display: inline-block;\n vertical-align: top;\n width: 100%;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd style=\"vertical-align: top; padding: 0\"\u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n \n \u003cdiv\n class=\"xc440 ogf m c\"\n style=\"\n font-size: 0;\n text-align: left;\n direction: ltr;\n display: inline-block;\n vertical-align: middle;\n width: 100%;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"\n background-color: transparent;\n border: none;\n vertical-align: middle;\n \"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n align=\"left\"\n class=\"x m\"\n style=\"\n font-size: 0;\n padding: 0;\n padding-bottom: 16px;\n word-break: break-word;\n \"\n \u003e\n \u003cdiv\n style=\"\n font-family: Inter, Arial, sans-serif;\n font-size: 31px;\n line-height: 48px;\n text-align: left;\n color: #000000;\n \"\n \u003e\n \u003cp style=\"margin: 0; text-align: left\"\u003e\n \u003cspan\n style=\"\n mso-line-height-rule: exactly;\n font-size: 31px;\n font-family: Inter, Arial, sans-serif;\n font-weight: 400;\n color: #171717;\n line-height: 48px;\n \"\n \u003eYour opinion matters!\u003c/span\n \u003e\n \u003c/p\u003e\n \u003cp style=\"margin: 0\"\u003e\n \u003cspan\n style=\"\n mso-line-height-rule: exactly;\n font-size: 31px;\n font-family: Inter, Arial, sans-serif;\n font-weight: 400;\n color: #171717;\n line-height: 48px;\n \"\n \u003e\u003c/span\n \u003e\u003cspan\n style=\"\n mso-line-height-rule: exactly;\n font-size: 31px;\n font-family: Inter, Arial, sans-serif;\n font-weight: 400;\n color: #3d53f5;\n line-height: 48px;\n \"\n \u003eOry usage survey\u003c/span\n \u003e\n \u003c/p\u003e\n \u003c/div\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\n class=\"s m\"\n style=\"\n font-size: 0;\n padding: 0;\n padding-bottom: 16px;\n word-break: break-word;\n \"\n \u003e\n \u003cdiv style=\"height: 4px; line-height: 4px\"\u003e\n \u0026#8202;\n \u003c/div\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\n align=\"left\"\n vertical-align=\"middle\"\n class=\"b\"\n style=\"\n font-size: 0;\n padding: 0;\n padding-bottom: 0;\n word-break: break-word;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"\n border-collapse: separate;\n width: 132px;\n line-height: 100%;\n \"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n align=\"center\"\n bgcolor=\"#3d53f5\"\n style=\"\n border: none;\n border-radius: 0;\n cursor: auto;\n mso-padding-alt: 12px 0px 12px 0px;\n background: #3d53f5;\n \"\n valign=\"middle\"\n \u003e\n \u003ca\n href=\"https://form.typeform.com/to/Igq7038O\"\n style=\"\n display: inline-block;\n width: 132px;\n background: #3d53f5;\n color: #ffffff;\n font-family: Inter, Arial, sans-serif;\n font-size: 13px;\n font-weight: normal;\n line-height: 100%;\n margin: 0;\n text-decoration: none;\n text-transform: none;\n padding: 12px 0px 12px 0px;\n mso-padding-alt: 0;\n border-radius: 0;\n \"\n target=\"_blank\"\n \u003e\n \u003cspan\n style=\"\n mso-line-height-rule: exactly;\n font-size: 14px;\n font-family: Inter, Arial, sans-serif;\n font-weight: 600;\n color: #ffffff;\n line-height: 20px;\n \"\n \u003eTake Survey\u003c/span\n \u003e\u003c/a\n \u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n \n \u003cdiv\n class=\"xc16 ogf g mb-16\"\n style=\"\n font-size: 0;\n text-align: left;\n direction: ltr;\n display: inline-block;\n vertical-align: top;\n width: 100%;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd style=\"vertical-align: top; padding: 0\"\u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n \n \u003cdiv\n class=\"xc32 ogf\"\n style=\"\n font-size: 0;\n text-align: left;\n direction: ltr;\n display: inline-block;\n vertical-align: middle;\n width: 100%;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd style=\"vertical-align: middle; padding: 0 0 0 0\"\u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n align=\"left\"\n class=\"i hm-1\"\n style=\"\n font-size: 0;\n padding: 0;\n word-break: break-word;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"\n border-collapse: collapse;\n border-spacing: 0;\n \"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd style=\"width: 32px\"\u003e\n \u003cimg\n alt=\"\"\n height=\"auto\"\n src=\"https://f002.backblazeb2.com/file/emailify/c026cf429700701f40428f478d349306.jpg\"\n style=\"\n border: 0;\n border-radius: 0;\n display: block;\n outline: none;\n text-decoration: none;\n height: auto;\n width: 100%;\n font-size: 13px;\n \"\n width=\"32\"\n /\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n \n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n\n \n \u003cdiv\n class=\"r pr-16 pl-16\"\n style=\"\n background: #171717;\n background-color: #171717;\n margin: 0px auto;\n border-radius: 0;\n max-width: 1200px;\n \"\n \u003e\n \u003ctable\n align=\"center\"\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"\n background: #171717;\n background-color: #171717;\n width: 100%;\n border-radius: 0;\n \"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n style=\"\n border: none;\n direction: ltr;\n font-size: 0;\n padding: 32px 64px 32px 64px;\n text-align: left;\n \"\n \u003e\n \n \u003cdiv\n class=\"pc100 ogf\"\n style=\"\n font-size: 0;\n line-height: 0;\n text-align: left;\n display: inline-block;\n width: 100%;\n direction: ltr;\n \"\n \u003e\n \n \u003cdiv\n class=\"pc100 ogf c\"\n style=\"\n font-size: 0;\n text-align: left;\n direction: ltr;\n display: inline-block;\n vertical-align: middle;\n width: 100%;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"\n background-color: transparent;\n border: none;\n vertical-align: middle;\n \"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n align=\"left\"\n class=\"i w-60 h-30 m\"\n style=\"\n font-size: 0;\n padding: 0;\n padding-bottom: 8px;\n word-break: break-word;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"\n border-collapse: collapse;\n border-spacing: 0;\n \"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd style=\"width: 80px\"\u003e\n \u003ca\n href=\"https://www.ory.sh/\"\n target=\"_blank\"\n \u003e\n \u003cimg\n alt=\"Ory Logo\"\n height=\"auto\"\n src=\"https://f002.backblazeb2.com/file/emailify/879566e4ded61f9133eb4ae85666e0f8.png\"\n style=\"\n border: 0;\n border-radius: 0;\n display: block;\n outline: none;\n text-decoration: none;\n height: auto;\n width: 100%;\n font-size: 13px;\n \"\n width=\"80\"\n /\u003e\u003c/a\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\n align=\"left\"\n class=\"x m\"\n style=\"\n font-size: 0;\n padding: 0;\n padding-bottom: 8px;\n word-break: break-word;\n \"\n \u003e\n \u003cdiv\n style=\"\n font-family: Inter, Arial, sans-serif;\n font-size: 10px;\n line-height: 16px;\n text-align: left;\n color: #000000;\n \"\n \u003e\n \u003cp style=\"margin: 0; text-align: left\"\u003e\n \u003cspan\n style=\"\n mso-line-height-rule: exactly;\n font-size: 10px;\n font-family: Inter, Arial, sans-serif;\n font-weight: 400;\n color: #ffffff;\n line-height: 16px;\n \"\n \u003eCopyright © *|CURRENT_YEAR|* *|LIST:COMPANY|*, All rights reserved.\u003cbr\u003e*|IFNOT:ARCHIVE_PAGE|* *|LIST:DESCRIPTION|*\u003cbr\u003e\n \u003cbr\u003e\n You subscribed to this newsletter on \u003ca href=\"https://www.ory.sh/\" target=\"_blank\"\u003ewww.ory.sh\u003c/a\u003e.\u003cbr\u003e\n \u003cbr\u003e\n Want to change how you receive these emails?\u003cbr\u003e\n You can \u003ca href=\"*|UPDATE_PROFILE|*\"\u003eupdate your preferences\u003c/a\u003e or \u003ca href=\"*|UNSUB|*\"\u003eunsubscribe from this list\u003c/a\u003e.*|END:IF|*\u003cbr\u003e\n \u003cbr\u003e*|IF:REWARDS|* *|HTML:REWARDS|* *|END:IF|*\u003c/span\n \u003e\n \u003c/p\u003e\n \u003c/p\u003e\n \u003cp style=\"margin: 0\"\u003e\n\n \u003c/p\u003e\n \u003c/div\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\n class=\"s m\"\n style=\"\n font-size: 0;\n padding: 0;\n padding-bottom: 8px;\n word-break: break-word;\n \"\n \u003e\n \u003cdiv style=\"height: 4px; line-height: 4px\"\u003e\n \u0026#8202;\n \u003c/div\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\n class=\"s m\"\n style=\"\n font-size: 0;\n padding: 0;\n padding-bottom: 8px;\n word-break: break-word;\n \"\n \u003e\n \u003cdiv style=\"height: 4px; line-height: 4px\"\u003e\n \u0026#8202;\n \u003c/div\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\n align=\"left\"\n class=\"o\"\n style=\"\n font-size: 0;\n padding: 0;\n padding-bottom: 0;\n word-break: break-word;\n \"\n \u003e\n \n \u003ctable\n align=\"left\"\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"float: none; display: inline-table\"\n \u003e\n \u003ctbody\u003e\n \u003ctr class=\"e m\"\u003e\n \u003ctd\n style=\"\n padding: 0 16px 0 0;\n vertical-align: middle;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"border-radius: 0; width: 24px\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n style=\"\n font-size: 0;\n height: 24px;\n vertical-align: middle;\n width: 24px;\n \"\n \u003e\n \u003ca\n href=\"https://github.com/ory\"\n target=\"_blank\"\n \u003e\n \u003cimg\n alt=\"GitHub\"\n height=\"24\"\n src=\"https://f002.backblazeb2.com/file/emailify/ef512130ade0d301c30989f4c913c8ee.png\"\n style=\"\n border-radius: 0;\n display: block;\n \"\n width=\"24\"\n /\u003e\u003c/a\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \n \u003ctable\n align=\"left\"\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"float: none; display: inline-table\"\n \u003e\n \u003ctbody\u003e\n \u003ctr class=\"e m\"\u003e\n \u003ctd\n style=\"\n padding: 0 16px 0 0;\n vertical-align: middle;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"border-radius: 0; width: 24px\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n style=\"\n font-size: 0;\n height: 24px;\n vertical-align: middle;\n width: 24px;\n \"\n \u003e\n \u003ca\n href=\"https://slack.ory.sh/\"\n target=\"_blank\"\n \u003e\n \u003cimg\n alt=\"Slack\"\n height=\"24\"\n src=\"https://f002.backblazeb2.com/file/emailify/eb766218760449f56561ca1eced33dbf.png\"\n style=\"\n border-radius: 0;\n display: block;\n \"\n width=\"24\"\n /\u003e\u003c/a\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \n \u003ctable\n align=\"left\"\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"float: none; display: inline-table\"\n \u003e\n \u003ctbody\u003e\n \u003ctr class=\"e m\"\u003e\n \u003ctd\n style=\"\n padding: 0 16px 0 0;\n vertical-align: middle;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"border-radius: 0; width: 24px\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n style=\"\n font-size: 0;\n height: 24px;\n vertical-align: middle;\n width: 24px;\n \"\n \u003e\n \u003ca\n href=\"https://www.youtube.com/channel/UC9hCxZZeviexX0GclD0brrw\"\n target=\"_blank\"\n \u003e\n \u003cimg\n alt=\"YouTube\"\n height=\"24\"\n src=\"https://f002.backblazeb2.com/file/emailify/3da01c1f1191eb2b71d7a649e51e29e5.png\"\n style=\"\n border-radius: 0;\n display: block;\n \"\n width=\"24\"\n /\u003e\u003c/a\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \n \u003ctable\n align=\"left\"\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"float: none; display: inline-table\"\n \u003e\n \u003ctbody\u003e\n \u003ctr class=\"e m\"\u003e\n \u003ctd\n style=\"\n padding: 0 16px 0 0;\n vertical-align: middle;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"border-radius: 0; width: 24px\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n style=\"\n font-size: 0;\n height: 24px;\n vertical-align: middle;\n width: 24px;\n \"\n \u003e\n \u003ca\n href=\"https://twitter.com/orycorp\"\n target=\"_blank\"\n \u003e\n \u003cimg\n alt=\"Twitter\"\n height=\"24\"\n src=\"https://f002.backblazeb2.com/file/emailify/eb45c141aa72d90251c7419d68d6d64d.png\"\n style=\"\n border-radius: 0;\n display: block;\n \"\n width=\"24\"\n /\u003e\u003c/a\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \n \u003ctable\n align=\"left\"\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"float: none; display: inline-table\"\n \u003e\n \u003ctbody\u003e\n \u003ctr class=\"e\"\u003e\n \u003ctd\n style=\"padding: 0; vertical-align: middle\"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"border-radius: 0; width: 24px\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n style=\"\n font-size: 0;\n height: 24px;\n vertical-align: middle;\n width: 24px;\n \"\n \u003e\n \u003ca\n href=\"https://www.linkedin.com/company/ory-corp/\"\n target=\"_blank\"\n \u003e\n \u003cimg\n alt=\"LinkedIn\"\n height=\"24\"\n src=\"https://f002.backblazeb2.com/file/emailify/0cb3b6717df0a6d08795de6808ab115e.png\"\n style=\"\n border-radius: 0;\n display: block;\n \"\n width=\"24\"\n /\u003e\u003c/a\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n \n \u003c/div\u003e\n \n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n\n\u003c/div\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n" +"\n\n\n\u003c!DOCTYPE html\u003e\n\n\u003chtml lang='en'\u003e\n\u003chead\u003e\n \u003ctitle\u003eOry Kratos v0.1.0 is here!\u003c/title\u003e\n \u003cmeta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /\u003e\n \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1\"\u003e\n \u003cmeta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" /\u003e\n \u003cstyle type=\"text/css\"\u003e\n #outlook a {\n padding: 0;\n }\n pre {\n background-color: #f5f5f5;\n padding: 8px;\n }\n code {\n background-color: #f5f5f5;\n padding: 2px 4px;\n }\n body {\n margin: 0;\n padding: 0;\n -webkit-text-size-adjust: 100%;\n -ms-text-size-adjust: 100%;\n }\n table,\n td {\n border-collapse: collapse;\n mso-table-lspace: 0pt;\n mso-table-rspace: 0pt;\n }\n img {\n border: 0;\n height: auto;\n line-height: 100%;\n outline: none;\n text-decoration: none;\n -ms-interpolation-mode: bicubic;\n }\n p {\n display: block;\n margin: 0;\n }\n \u003c/style\u003e\n \u003clink\n href=\"https://fonts.googleapis.com/css?family=Inter:700,400,600\"\n rel=\"stylesheet\"\n type=\"text/css\"\n /\u003e\n \u003cstyle type=\"text/css\"\u003e\u003c/style\u003e\n \u003cstyle type=\"text/css\"\u003e\n @media only screen and (min-width: 599px) {\n .pc100 {\n width: 100% !important;\n max-width: 100%;\n }\n .pc48-30508474576271 {\n width: 48.30508474576271% !important;\n max-width: 48.30508474576271%;\n }\n .pc3-389830508474576 {\n width: 3.389830508474576% !important;\n max-width: 3.389830508474576%;\n }\n .xc600 {\n width: 1200px !important;\n max-width: 1200px;\n }\n .xc32 {\n width: 32px !important;\n max-width: 32px;\n }\n .xc16 {\n width: 16px !important;\n max-width: 16px;\n }\n .xc440 {\n \n \n }\n }\n \u003c/style\u003e\n \u003cstyle media=\"screen and (min-width:599px)\"\u003e\n .moz-text-html .pc100 {\n width: 100% !important;\n max-width: 100%;\n }\n .moz-text-html .pc48-30508474576271 {\n width: 48.30508474576271% !important;\n max-width: 48.30508474576271%;\n }\n .moz-text-html .pc3-389830508474576 {\n width: 3.389830508474576% !important;\n max-width: 3.389830508474576%;\n }\n .moz-text-html .xc600 {\n width: 1200px !important;\n max-width: 1200px;\n }\n .moz-text-html .xc32 {\n width: 32px !important;\n max-width: 32px;\n }\n .moz-text-html .xc16 {\n width: 16px !important;\n max-width: 16px;\n }\n .moz-text-html .xc440 {\n \n \n }\n \u003c/style\u003e\n \u003cstyle type=\"text/css\"\u003e\n @media only screen and (max-width: 599px) {\n table.fwm {\n width: 100% !important;\n }\n td.fwm {\n width: auto !important;\n }\n }\n \u003c/style\u003e\n \u003cstyle type=\"text/css\"\u003e\n u + .emailify a,\n #MessageViewBody a,\n a[x-apple-data-detectors] {\n color: inherit !important;\n text-decoration: none !important;\n font-size: inherit !important;\n font-family: inherit !important;\n font-weight: inherit !important;\n line-height: inherit !important;\n }\n span.MsoHyperlink {\n mso-style-priority: 99;\n color: inherit;\n }\n span.MsoHyperlinkFollowed {\n mso-style-priority: 99;\n color: inherit;\n }\n u + .emailify .glist {\n margin-left: 0 !important;\n }\n @media only screen and (max-width: 599px) {\n .emailify {\n height: 100% !important;\n margin: 0 !important;\n padding: 0 !important;\n width: 100% !important;\n }\n u + .emailify .glist {\n margin-left: 25px !important;\n }\n td.x {\n padding-left: 0 !important;\n padding-right: 0 !important;\n }\n .fwm img {\n max-width: 100% !important;\n height: auto !important;\n }\n td.stk {\n border: 0 !important;\n }\n br.sb {\n display: none !important;\n }\n .thd-1 .i-thumbnail {\n display: inline-block !important;\n height: auto !important;\n overflow: hidden !important;\n }\n .hd-1 {\n display: block !important;\n height: auto !important;\n overflow: visible !important;\n }\n .ht-1 {\n display: table !important;\n height: auto !important;\n overflow: visible !important;\n }\n .hr-1 {\n display: table-row !important;\n height: auto !important;\n overflow: visible !important;\n }\n .hc-1 {\n display: table-cell !important;\n height: auto !important;\n overflow: visible !important;\n }\n div.r.pr-16 \u003e table \u003e tbody \u003e tr \u003e td,\n div.r.pr-16 \u003e div \u003e table \u003e tbody \u003e tr \u003e td {\n padding-right: 16px !important;\n }\n div.r.pl-16 \u003e table \u003e tbody \u003e tr \u003e td,\n div.r.pl-16 \u003e div \u003e table \u003e tbody \u003e tr \u003e td {\n padding-left: 16px !important;\n }\n td.i.w-60 img {\n width: 60px !important;\n }\n td.i.h-30 img {\n height: 30px !important;\n }\n div.r.pt-0 \u003e table \u003e tbody \u003e tr \u003e td,\n div.r.pt-0 \u003e div \u003e table \u003e tbody \u003e tr \u003e td {\n padding-top: 0px !important;\n }\n div.r.pr-0 \u003e table \u003e tbody \u003e tr \u003e td,\n div.r.pr-0 \u003e div \u003e table \u003e tbody \u003e tr \u003e td {\n padding-right: 0px !important;\n }\n div.r.pb-0 \u003e table \u003e tbody \u003e tr \u003e td,\n div.r.pb-0 \u003e div \u003e table \u003e tbody \u003e tr \u003e td {\n padding-bottom: 0px !important;\n }\n div.r.pl-0 \u003e table \u003e tbody \u003e tr \u003e td,\n div.r.pl-0 \u003e div \u003e table \u003e tbody \u003e tr \u003e td {\n padding-left: 0px !important;\n }\n .hm-1 {\n display: none !important;\n max-width: 0 !important;\n max-height: 0 !important;\n overflow: hidden !important;\n mso-hide: all !important;\n }\n div.g.mb-16 \u003e table \u003e tbody \u003e tr \u003e td {\n padding-bottom: 16px !important;\n }\n }\n \u003c/style\u003e\n \u003cmeta name=\"color-scheme\" content=\"light dark\" /\u003e\n \u003cmeta name=\"supported-color-schemes\" content=\"light dark\" /\u003e\n\n\u003c/head\u003e\n\u003cbody\nlink=\"#3d53f5\"\nvlink=\"#3d53f5\"\nclass=\"emailify\"\nstyle=\"word-spacing: normal; background-color: #e5e5e5\"\n\u003e\n\u003cdiv class=\"bg\" style=\"background-color: #e5e5e5\"\u003e\n\n \u003cdiv\n class=\"r pr-16 pl-16\"\n style=\"\n background: #fffffe;\n background-color: #fffffe;\n margin: 0px auto;\n border-radius: 0;\n max-width: 1200px;\n \"\n \u003e\n \u003ctable\n align=\"center\"\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"\n background: #fffffe;\n background-color: #fffffe;\n width: 100%;\n border-radius: 0;\n \"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n style=\"\n border: none;\n direction: ltr;\n font-size: 0;\n padding: 16px 64px 16px 64px;\n text-align: left;\n \"\n \u003e′¨\n \u003cdiv\n class=\"pc100 ogf\"\n style=\"\n font-size: 0;\n line-height: 0;\n text-align: left;\n display: inline-block;\n width: 100%;\n direction: ltr;\n \"\n \u003e\n \u003cdiv\n class=\"pc48-30508474576271 ogf m c\"\n style=\"\n font-size: 0;\n text-align: left;\n direction: ltr;\n display: inline-block;\n vertical-align: middle;\n width: 48.30508474576271%;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"\n background-color: transparent;\n border: none;\n vertical-align: middle;\n \"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n align=\"left\"\n class=\"i w-60 h-30\"\n style=\"\n font-size: 0;\n padding: 0;\n padding-bottom: 0;\n word-break: break-word;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"\n border-collapse: collapse;\n border-spacing: 0;\n \"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd style=\"width: 80px\"\u003e\n \u003ca\n href=\"https://www.ory.sh/\"\n target=\"_blank\"\n \u003e\n \u003cimg\n alt=\"\"\n height=\"auto\"\n src=\"https://f002.backblazeb2.com/file/emailify/879566e4ded61f9133eb4ae85666e0f8.png\"\n style=\"\n border: 0;\n border-radius: 0;\n display: block;\n outline: none;\n text-decoration: none;\n height: auto;\n width: 100%;\n font-size: 13px;\n \"\n width=\"80\"\n /\u003e\u003c/a\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n \u003cdiv\n class=\"pc3-389830508474576 ogf g\"\n style=\"\n font-size: 0;\n text-align: left;\n direction: ltr;\n display: inline-block;\n vertical-align: top;\n width: 3.389830508474576%;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd style=\"vertical-align: top; padding: 0\"\u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n \u003cdiv\n class=\"pc48-30508474576271 ogf c\"\n style=\"\n font-size: 0;\n text-align: left;\n direction: ltr;\n display: inline-block;\n vertical-align: middle;\n width: 48.30508474576271%;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"\n background-color: transparent;\n border: none;\n vertical-align: middle;\n \"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n align=\"right\"\n class=\"x\"\n style=\"\n font-size: 0;\n padding: 0;\n padding-bottom: 0;\n word-break: break-word;\n \"\n \u003e\n \u003cdiv\n style=\"\n font-family: Inter, Arial, sans-serif;\n font-size: 16px;\n line-height: 28px;\n text-align: right;\n color: #000000;\n \"\n \u003e\n \u003cp style=\"margin: 0; text-align: right\"\u003e\n \u003cspan\n style=\"\n mso-line-height-rule: exactly;\n font-size: 16px;\n font-family: Inter, Arial, sans-serif;\n font-weight: 700;\n color: #171717;\n line-height: 28px;\n \"\n \u003eOry Security Newsletter\u003c/span\n \u003e\n \u003c/p\u003e\n \u003c/div\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n \u003c/div\u003e\n\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n\n \n \u003cdiv\n class=\"r pr-16 pl-16\"\n style=\"\n background: #fcfcfc;\n background-color: #fcfcfc;\n margin: 0px auto;\n border-radius: 0;\n max-width: 1200px;\n \"\n \u003e\n \u003ctable\n align=\"center\"\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"\n background: #fcfcfc;\n background-color: #fcfcfc;\n width: 100%;\n border-radius: 0;\n \"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n style=\"\n border: none;\n direction: ltr;\n font-size: 0;\n padding: 48px 32px 48px 32px;\n text-align: left;\n \"\n \u003e\n \n \u003cdiv\n class=\"xc32 ogf m\"\n style=\"\n font-size: 0;\n text-align: left;\n direction: ltr;\n display: inline-block;\n vertical-align: middle;\n width: 100%;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd style=\"vertical-align: middle; padding: 0 0 0 0\"\u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n align=\"left\"\n class=\"i hm-1\"\n style=\"\n font-size: 0;\n padding: 0;\n word-break: break-word;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"\n border-collapse: collapse;\n border-spacing: 0;\n \"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd style=\"width: 32px\"\u003e\n \u003cimg\n alt=\"\"\n height=\"auto\"\n src=\"https://f002.backblazeb2.com/file/emailify/150a8c06dcaa45901e3887296457cc12.jpg\"\n style=\"\n border: 0;\n border-radius: 0;\n display: block;\n outline: none;\n text-decoration: none;\n height: auto;\n width: 100%;\n font-size: 13px;\n \"\n width=\"32\"\n /\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n \n \u003cdiv\n class=\"xc16 ogf g mb-16\"\n style=\"\n font-size: 0;\n text-align: left;\n direction: ltr;\n display: inline-block;\n vertical-align: top;\n width: 100%;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd style=\"vertical-align: top; padding: 0\"\u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n \n \u003cdiv\n class=\"xc440 ogf m c\"\n style=\"\n font-size: 0;\n text-align: left;\n direction: ltr;\n display: inline-block;\n vertical-align: middle;\n width: 100%;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"\n background-color: transparent;\n border: none;\n vertical-align: middle;\n \"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n align=\"left\"\n class=\"x m\"\n style=\"\n font-size: 0;\n padding: 0;\n padding-bottom: 16px;\n word-break: break-word;\n \"\n \u003e\n \u003cdiv\n style=\"\n font-family: Inter, Arial, sans-serif;\n font-size: 37px;\n line-height: 52px;\n text-align: left;\n color: #000000;\n \"\n \u003e\n \u003cp style=\"margin: 0; text-align: center\"\u003e\n \u003cspan\n style=\"\n mso-line-height-rule: exactly;\n font-size: 37px;\n font-family: Inter, Arial, sans-serif;\n font-weight: 400;\n color: #171717;\n line-height: 52px;\n \"\n \u003eOry Kratos v0.1.0\u003c/span\n \u003e \u003cbr\u003e \u003cspan style=\"font-size: 16px; font-weight: 400;\"\u003eis here!\u003c/span\u003e\u003cbr\u003e\n \u003cspan style=\"font-size: 16px; font-weight: 400;\"\u003e\u003ca href=\"https://www.ory.sh/ory/kratos\" target=\"_blank\"\u003eWebsite\u003c/a\u003e\u0026nbsp;| \u003ca href=\"https://github.com/ory/ory/kratos\" target=\"_blank\"\u003eGitHub\u003c/a\u003e |\u0026nbsp;\u003ca href=\"https://github.com/ory/ory/kratos/blob/master/CHANGELOG.md\" target=\"_blank\"\u003eChangelog\u003c/a\u003e\u0026nbsp;|\u0026nbsp;\u003ca href=\"https://github.com/ory/ory/kratos/blob/master/UPGRADE.md\" target=\"_blank\"\u003eUpgrade Guide\u003c/a\u003e\u003cbr\u003e\u003c/span\u003e\n\n \u003c/p\u003e\n \u003c/div\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\n class=\"s m\"\n style=\"\n font-size: 0;\n padding: 0;\n padding-bottom: 16px;\n word-break: break-word;\n \"\n \u003e\n \u003cdiv style=\"height: 4px; line-height: 4px\"\u003e\n \u0026#8202;\n \u003c/div\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\n vertical-align=\"top\"\n class=\"c\"\n style=\"\n font-size: 0;\n padding-bottom: 0;\n word-break: break-word;\n \"\n \u003e\n \u003cdiv\n class=\"xc440 ogf c\"\n style=\"\n font-size: 0;\n text-align: left;\n direction: ltr;\n display: inline-block;\n vertical-align: top;\n width: 100%;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n style=\"\n background-color: transparent;\n border: none;\n vertical-align: top;\n padding-bottom: 0;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n align=\"left\"\n class=\"x m\"\n style=\"\n font-size: 0;\n padding: 0;\n padding-bottom: 16px;\n word-break: break-word;\n \"\n \u003e\n \u003cdiv\n style=\"\n font-family: Inter, Arial,\n sans-serif;\n font-size: 16px;\n line-height: 28px;\n text-align: left;\n color: #000000;\n \"\n \u003e\n \u003cp\n style=\"\n margin: 0;\n text-align: left;\n \"\n \u003e\n \u003cspan\n style=\"\n mso-line-height-rule: exactly;\n font-size: 16px;\n font-family: Inter, Arial,\n sans-serif;\n font-weight: 400;\n color: #616161;\n line-height: 28px;\n \"\n \u003eiuaw4hri\u003cbr\u003e\n \u003c/span\u003e\n \u003c/p\u003e\n \u003c/div\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\n align=\"left\"\n class=\"x m\"\n style=\"\n font-size: 0;\n padding: 0;\n padding-bottom: 16px;\n word-break: break-word;\n \"\n \u003e\n \u003cdiv\n style=\"\n font-family: Inter, Arial,\n sans-serif;\n font-size: 16px;\n line-height: 28px;\n text-align: left;\n color: #000000;\n \"\n \u003e\n \u003cp\n style=\"\n margin: 0;\n text-align: left;\n \"\n \u003e\n \u003cspan\n style=\"\n mso-line-height-rule: exactly;\n font-size: 16px;\n font-family: Inter, Arial,\n sans-serif;\n font-weight: 400;\n color: #616161;\n line-height: 28px;\n \"\n \u003e\u003ch2\u003eBreaking Changes\u003c/h2\u003e\n\n\u003cp\u003eWe listened to your feedback and have improved the naming of the SDK method \u003ccode\u003einitializeSelfServiceRecoveryForNativeApps\u003c/code\u003e to better match what it does: \u003ccode\u003einitializeSelfServiceRecoveryWithoutBrowser\u003c/code\u003e. As in the previous release you may still use the old SDK if you do not want to deal with the SDK breaking changes for now.\nWe listened to your feedback and have improved the naming of the SDK method \u003ccode\u003einitializeSelfServiceVerificationForNativeApps\u003c/code\u003e to better match what it does: \u003ccode\u003einitializeSelfServiceVerificationWithoutBrowser\u003c/code\u003e. As in the previous release you may still use the old SDK if you do not want to deal with the SDK breaking changes for now.\nWe listened to your feedback and have improved the naming of the SDK method \u003ccode\u003einitializeSelfServiceSettingsForNativeApps\u003c/code\u003e to better match what it does: \u003ccode\u003einitializeSelfServiceSettingsWithoutBrowser\u003c/code\u003e. As in the previous release you may still use the old SDK if you do not want to deal with the SDK breaking changes for now.\nWe listened to your feedback and have improved the naming of the SDK method \u003ccode\u003einitializeSelfServiceregistrationForNativeApps\u003c/code\u003e to better match what it does: \u003ccode\u003einitializeSelfServiceregistrationWithoutBrowser\u003c/code\u003e. As in the previous release you may still use the old SDK if you do not want to deal with the SDK breaking changes for now.\nWe listened to your feedback and have improved the naming of the SDK method \u003ccode\u003einitializeSelfServiceLoginForNativeApps\u003c/code\u003e to better match what it does: \u003ccode\u003einitializeSelfServiceLoginWithoutBrowser\u003c/code\u003e. As in the previous release you may still use the old SDK if you do not want to deal with the SDK breaking changes for now.\u003c/p\u003e\n\n\u003cp\u003e\u003cstrong\u003eBug Fixes:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003e\u003cp\u003eAdd json detection to setting error subbranches (\u003ca href=\"https://github.com/ory/kratos/commit/fb83dcb8ae7463079ddb33c04673cf4556f6058c\" target=\"_blank\"\u003efb83dcb\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eCache migration status (\u003ca href=\"https://github.com/ory/kratos/commit/5be2f149cd79ddfbe8496eccf5d5aacb6a9a0b8e\" target=\"_blank\"\u003e5be2f14\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1337\" target=\"_blank\"\u003e#1337\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eChange SMTP config validation from URI to a Regex pattern (\u003ca href=\"https://github.com/ory/kratos/issues/1436\" target=\"_blank\"\u003e#1436\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/5ab1e8f17bcbc229fada2c584b2c1f576b819761\" target=\"_blank\"\u003e5ab1e8f\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1435\" target=\"_blank\"\u003e#1435\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eCheck filesystem before fallback to bundled templates (\u003ca href=\"https://github.com/ory/kratos/issues/1401\" target=\"_blank\"\u003e#1401\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/22d999e78eb4f67d2f3ba07e62fd28ffb3331d6d\" target=\"_blank\"\u003e22d999e\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eContinue button for oidc registration step (\u003ca href=\"https://github.com/ory/kratos/commit/2aad5ac8f7055f39f4f434d26fbca74cdbe75337\" target=\"_blank\"\u003e2aad5ac\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1422\" target=\"_blank\"\u003e#1422\u003c/a\u003e \u003ca href=\"https://github.com/ory/kratos/issues/1320\" target=\"_blank\"\u003e#1320\u003c/a\u003e:\u003c/p\u003e\n\n\u003cp\u003eWhen signing up with an OIDC provider and the traits model is missing some fields, the submit button shows all OIDC options. Instead, it should show just one option called \u0026ldquo;Continue\u0026rdquo;.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eDeprecate sessionCookie (\u003ca href=\"https://github.com/ory/kratos/issues/1428\" target=\"_blank\"\u003e#1428\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/eccad741a1702181d4b207aad954a950906a808b\" target=\"_blank\"\u003eeccad74\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1426\" target=\"_blank\"\u003e#1426\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eDo not cache incomplete migrations (\u003ca href=\"https://github.com/ory/kratos/issues/1434\" target=\"_blank\"\u003e#1434\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/154c26f6da4bb7040deabdc352c90cdae42c69fe\" target=\"_blank\"\u003e154c26f\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eDo not run network migrations when booting (\u003ca href=\"https://github.com/ory/kratos/commit/12bbab9d3cf788998cd4a9be50ac8c7a9d2232bd\" target=\"_blank\"\u003e12bbab9\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1399\" target=\"_blank\"\u003e#1399\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eImprove identity list performance (\u003ca href=\"https://github.com/ory/kratos/commit/f76886fe7436f71fbef00081888a2f8d0106ba98\" target=\"_blank\"\u003ef76886f\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1412\" target=\"_blank\"\u003e#1412\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eIncorrect openapi specification for verification submission (\u003ca href=\"https://github.com/ory/kratos/issues/1431\" target=\"_blank\"\u003e#1431\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/ecb0a01f61441aa97751943b5e9ddcc28f783d91\" target=\"_blank\"\u003eecb0a01\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1368\" target=\"_blank\"\u003e#1368\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eMark ui node message as optional (\u003ca href=\"https://github.com/ory/kratos/issues/1365\" target=\"_blank\"\u003e#1365\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/7b8d59f48ed14a6d0672238645d8675d4bf7fd77\" target=\"_blank\"\u003e7b8d59f\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1361\" target=\"_blank\"\u003e#1361\u003c/a\u003e \u003ca href=\"https://github.com/ory/kratos/issues/1362\" target=\"_blank\"\u003e#1362\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eMark verified_at as omitempty (\u003ca href=\"https://github.com/ory/kratos/commit/77b258e57a3d53fe437838a5e9c57805e9c970aa\" target=\"_blank\"\u003e77b258e\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eCloses \u003ca href=\"https://github.com/ory/sdk/issues/46\" target=\"_blank\"\u003ehttps://github.com/ory/sdk/issues/46\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003ePanic if contextualizer is not set (\u003ca href=\"https://github.com/ory/kratos/commit/760035a6c5efa08561b93daff57ebb4655032b2a\" target=\"_blank\"\u003e760035a\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003ePanic on error in issue session (\u003ca href=\"https://github.com/ory/kratos/commit/5fbd8557e1f907dd400bfcd26c187db16dc344ba\" target=\"_blank\"\u003e5fbd855\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1384\" target=\"_blank\"\u003e#1384\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003ePrometheus metrics fix (\u003ca href=\"https://github.com/ory/kratos/issues/1299\" target=\"_blank\"\u003e#1299\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/ac5d00d472a87ab51e7c6834e2cb59f107fc3b3b\" target=\"_blank\"\u003eac5d00d\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRecovery email case sensitive (\u003ca href=\"https://github.com/ory/kratos/issues/1357\" target=\"_blank\"\u003e#1357\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/bce14c487450bd668859f362b98704644fa4c72a\" target=\"_blank\"\u003ebce14c4\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1329\" target=\"_blank\"\u003e#1329\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRemove typing from node.attribute.value (\u003ca href=\"https://github.com/ory/kratos/commit/63a5e08afab76dafbfe13e6126e165af28492aad\" target=\"_blank\"\u003e63a5e08\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eCloses \u003ca href=\"https://github.com/ory/sdk/issues/75\" target=\"_blank\"\u003ehttps://github.com/ory/sdk/issues/75\u003c/a\u003e\nCloses \u003ca href=\"https://github.com/ory/sdk/issues/74\" target=\"_blank\"\u003ehttps://github.com/ory/sdk/issues/74\u003c/a\u003e\nCloses \u003ca href=\"https://github.com/ory/sdk/issues/72\" target=\"_blank\"\u003ehttps://github.com/ory/sdk/issues/72\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRename client package for external consumption (\u003ca href=\"https://github.com/ory/kratos/commit/cba8b00c8b755cc0bdc7818bc9d7390ff3532ce1\" target=\"_blank\"\u003ecba8b00\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve driver issues (\u003ca href=\"https://github.com/ory/kratos/commit/47b1c8dce57a023e89a2b178bc8a033496ef4ff2\" target=\"_blank\"\u003e47b1c8d\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve network regression (\u003ca href=\"https://github.com/ory/kratos/commit/8f96b1fe4d0846a3ad97a45bc972ece04109289d\" target=\"_blank\"\u003e8f96b1f\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve network regressions (\u003ca href=\"https://github.com/ory/kratos/commit/8fc52c034ed9978c2a04cc66bccc9b795c9bbefa\" target=\"_blank\"\u003e8fc52c0\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eTesthelper regressions (\u003ca href=\"https://github.com/ory/kratos/commit/bf3b04fd2c7f9162073cb584d6fb0d59e868ecbf\" target=\"_blank\"\u003ebf3b04f\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUse correct url in submitSelfServiceVerificationFlow (\u003ca href=\"https://github.com/ory/kratos/commit/ab8a600080ac0d6a6235806b74c5b9e3dc1c2d60\" target=\"_blank\"\u003eab8a600\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUse STARTTLS for smtps connections (\u003ca href=\"https://github.com/ory/kratos/issues/1430\" target=\"_blank\"\u003e#1430\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/c21bb80a749df7b224a8ac3f15fa62523a78d805\" target=\"_blank\"\u003ec21bb80\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/781\" target=\"_blank\"\u003e#781\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eVersion schema (\u003ca href=\"https://github.com/ory/kratos/issues/1359\" target=\"_blank\"\u003e#1359\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/8c4bac71674e45e440d916c6c947ed018a8ea29a\" target=\"_blank\"\u003e8c4bac7\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1331\" target=\"_blank\"\u003e#1331\u003c/a\u003e \u003ca href=\"https://github.com/ory/kratos/issues/1101\" target=\"_blank\"\u003e#1101\u003c/a\u003e \u003ca href=\"https://github.com/ory/hydra/issues/2427\" target=\"_blank\"\u003eory/hydra#2427\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eCode Refactoring:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eCorp package (\u003ca href=\"https://github.com/ory/kratos/issues/1402\" target=\"_blank\"\u003e#1402\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/0202dc57aacc0d48e4c1ee4e68c91654451f63fa\" target=\"_blank\"\u003e0202dc5\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eIntroduce DefaultContextualizer in corp package (\u003ca href=\"https://github.com/ory/kratos/issues/1390\" target=\"_blank\"\u003e#1390\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/944d045aa7fc59eadfdd18951f0d4937b1ea79df\" target=\"_blank\"\u003e944d045\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1363\" target=\"_blank\"\u003e#1363\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eMove cleansql to separate package (\u003ca href=\"https://github.com/ory/kratos/commit/7c203dc8219afe07f180143f832158615b51f60a\" target=\"_blank\"\u003e7c203dc\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eDocumentation:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eAdd docs for registration SPA flow (\u003ca href=\"https://github.com/ory/kratos/commit/84458f1a9dfe8be6a97bddd832fcc508b60b8498\" target=\"_blank\"\u003e84458f1\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd go sdk examples (\u003ca href=\"https://github.com/ory/kratos/commit/e948faddce3a1f52df964c701f6ba2a28f5dfe03\" target=\"_blank\"\u003ee948fad\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd replit instructions (\u003ca href=\"https://github.com/ory/kratos/commit/8ab8607dee433f6e708ade296a6c26d0a87d0aae\" target=\"_blank\"\u003e8ab8607\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd tested and running go sdk examples (\u003ca href=\"https://github.com/ory/kratos/commit/3b56bb5fd37d0e7d4479967aa0b5721a68a267f2\" target=\"_blank\"\u003e3b56bb5\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix typo in \u0026ldquo;Sign in/up with ID \u0026amp; assword\u0026rdquo; (\u003ca href=\"https://github.com/ory/kratos/issues/1383\" target=\"_blank\"\u003e#1383\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/f39739d94e97f20b94630b957371d11294dc8300\" target=\"_blank\"\u003ef39739d\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eMark login endpoints as experimental (\u003ca href=\"https://github.com/ory/kratos/commit/6faf0f65bb05bbafdee6b1274a719695fd5b4173\" target=\"_blank\"\u003e6faf0f6\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUpdate docs for all flows (\u003ca href=\"https://github.com/ory/kratos/commit/d29ea69f6bb908b529502030942b1ced52227372\" target=\"_blank\"\u003ed29ea69\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUpdate documentation for plaintext templates (\u003ca href=\"https://github.com/ory/kratos/issues/1369\" target=\"_blank\"\u003e#1369\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/419784dd0d4ddc338830ed0d77a7d99f8f440777\" target=\"_blank\"\u003e419784d\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1351\" target=\"_blank\"\u003e#1351\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpdate path (\u003ca href=\"https://github.com/ory/kratos/commit/f0384d9c11085230fd16290c524d22fac6002870\" target=\"_blank\"\u003ef0384d9\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUpdate sdk use (\u003ca href=\"https://github.com/ory/kratos/commit/bcb8c06ee324c639e548fc06315d9e952f470582\" target=\"_blank\"\u003ebcb8c06\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUse correct path (\u003ca href=\"https://github.com/ory/kratos/issues/1333\" target=\"_blank\"\u003e#1333\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/e401135cf415d7e3e6a8ca463dd47e46fe399b33\" target=\"_blank\"\u003ee401135\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eFeatures:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003e\u003cp\u003eAdd GetContextualizer (\u003ca href=\"https://github.com/ory/kratos/commit/ac3271742c9c2b968b08dd2b35a5d120c5befcd9\" target=\"_blank\"\u003eac32717\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd instana as possible tracing provider (\u003ca href=\"https://github.com/ory/kratos/issues/1429\" target=\"_blank\"\u003e#1429\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/abe48a97ee75567979a70f00dd73ff698efcc75d\" target=\"_blank\"\u003eabe48a9\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1385\" target=\"_blank\"\u003e#1385\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd vk and yandex providers to oidc providers and documentation (\u003ca href=\"https://github.com/ory/kratos/issues/1339\" target=\"_blank\"\u003e#1339\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/22a3ef98181eb5922cc0f1c016d42ce46732d0a2\" target=\"_blank\"\u003e22a3ef9\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1234\" target=\"_blank\"\u003e#1234\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eImprove contextualization in serve/daemon (\u003ca href=\"https://github.com/ory/kratos/commit/f83cd355422fb4b422f703406473bda914d8419c\" target=\"_blank\"\u003ef83cd35\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eInclude Credentials Metadata in admin api (\u003ca href=\"https://github.com/ory/kratos/issues/1274\" target=\"_blank\"\u003e#1274\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/c8b62190fca53db4e1b3a4ddb5253fbd2fd46002\" target=\"_blank\"\u003ec8b6219\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/820\" target=\"_blank\"\u003e#820\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eInclude Credentials Metadata in admin api Missing changes in handler (\u003ca href=\"https://github.com/ory/kratos/issues/1366\" target=\"_blank\"\u003e#1366\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/a71c2208dedac45d32dab578e62a5e3105c8dee0\" target=\"_blank\"\u003ea71c220\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eNatively support SPA for login flows (\u003ca href=\"https://github.com/ory/kratos/commit/6ff67afa8b0fc0a95cec44d3dda2cbc1987b51dd\" target=\"_blank\"\u003e6ff67af\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1138\" target=\"_blank\"\u003e#1138\u003c/a\u003e \u003ca href=\"https://github.com/ory/kratos/issues/668\" target=\"_blank\"\u003e#668\u003c/a\u003e:\u003c/p\u003e\n\n\u003cp\u003eThis patch adds the long-awaited capabilities for natively working with SPAs and AJAX requests. Previously, requests to the \u003ccode\u003e/self-service/login/browser\u003c/code\u003e endpoint would always end up in a redirect. Now, if the \u003ccode\u003eAccept\u003c/code\u003e header is set to \u003ccode\u003eapplication/json\u003c/code\u003e, the login flow will be returned as JSON instead. Accordingly, changes to the error and submission flow have been made to support \u003ccode\u003eapplication/json\u003c/code\u003e content types and SPA / AJAX requests.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eNatively support SPA for recovery flows (\u003ca href=\"https://github.com/ory/kratos/commit/5461244943286081e13c304a3b38413b8ee6fdf2\" target=\"_blank\"\u003e5461244\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eThis patch adds the long-awaited capabilities for natively working with SPAs and AJAX requests. Previously, requests to the \u003ccode\u003e/self-service/recovery/browser\u003c/code\u003e endpoint would always end up in a redirect. Now, if the \u003ccode\u003eAccept\u003c/code\u003e header is set to \u003ccode\u003eapplication/json\u003c/code\u003e, the registration flow will be returned as JSON instead. Accordingly, changes to the error and submission flow have been made to support \u003ccode\u003eapplication/json\u003c/code\u003e content types and SPA / AJAX requests.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eNatively support SPA for registration flows (\u003ca href=\"https://github.com/ory/kratos/commit/57d3c5786a88f0648e7fa57f181f060a057ec19f\" target=\"_blank\"\u003e57d3c57\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1138\" target=\"_blank\"\u003e#1138\u003c/a\u003e \u003ca href=\"https://github.com/ory/kratos/issues/668\" target=\"_blank\"\u003e#668\u003c/a\u003e:\u003c/p\u003e\n\n\u003cp\u003eThis patch adds the long-awaited capabilities for natively working with SPAs and AJAX requests. Previously, requests to the \u003ccode\u003e/self-service/registration/browser\u003c/code\u003e endpoint would always end up in a redirect. Now, if the \u003ccode\u003eAccept\u003c/code\u003e header is set to \u003ccode\u003eapplication/json\u003c/code\u003e, the registration flow will be returned as JSON instead. Accordingly, changes to the error and submission flow have been made to support \u003ccode\u003eapplication/json\u003c/code\u003e content types and SPA / AJAX requests.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eNatively support SPA for settings flows (\u003ca href=\"https://github.com/ory/kratos/commit/ea4395ed25d5668e4ce365336cd7a5e13e0ba1cc\" target=\"_blank\"\u003eea4395e\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eThis patch adds the long-awaited capabilities for natively working with SPAs and AJAX requests. Previously, requests to the \u003ccode\u003e/self-service/settings/browser\u003c/code\u003e endpoint would always end up in a redirect. Now, if the \u003ccode\u003eAccept\u003c/code\u003e header is set to \u003ccode\u003eapplication/json\u003c/code\u003e, the registration flow will be returned as JSON instead. Accordingly, changes to the error and submission flow have been made to support \u003ccode\u003eapplication/json\u003c/code\u003e content types and SPA / AJAX requests.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eNatively support SPA for verification flows (\u003ca href=\"https://github.com/ory/kratos/commit/c1515009dcd1b5946a93733feedb01753de91c3d\" target=\"_blank\"\u003ec151500\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eThis patch adds the long-awaited capabilities for natively working with SPAs and AJAX requests. Previously, requests to the \u003ccode\u003e/self-service/verification/browser\u003c/code\u003e endpoint would always end up in a redirect. Now, if the \u003ccode\u003eAccept\u003c/code\u003e header is set to \u003ccode\u003eapplication/json\u003c/code\u003e, the registration flow will be returned as JSON instead. Accordingly, changes to the error and submission flow have been made to support \u003ccode\u003eapplication/json\u003c/code\u003e content types and SPA / AJAX requests.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eSign in with Auth0 (\u003ca href=\"https://github.com/ory/kratos/issues/1352\" target=\"_blank\"\u003e#1352\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/f618a53fb971ad16121aa8728cfec54253bb3f44\" target=\"_blank\"\u003ef618a53\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/609\" target=\"_blank\"\u003e#609\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eSupport api in settings error (\u003ca href=\"https://github.com/ory/kratos/commit/23105dbb836d920b8766536b65de58932f53d6f6\" target=\"_blank\"\u003e23105db\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eSupport reading session token from X-Session-Token HTTP header (\u003ca href=\"https://github.com/ory/kratos/commit/dcaefd94a0b2cf819424f2e10b3bdae63b256726\" target=\"_blank\"\u003edcaefd9\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eTeam id in slack oidc (\u003ca href=\"https://github.com/ory/kratos/issues/1409\" target=\"_blank\"\u003e#1409\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/e4d021a037a6b44f8bd66372e9c260c640e87b9d\" target=\"_blank\"\u003ee4d021a\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1408\" target=\"_blank\"\u003e#1408\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate openapi specs and regenerate (\u003ca href=\"https://github.com/ory/kratos/commit/cac507eb5b1f39d003d72e57912dbbfe6f92deb1\" target=\"_blank\"\u003ecac507e\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003e\u003cstrong\u003eidentities:\u003c/strong\u003e Add a state to identities (\u003ca href=\"https://github.com/ory/kratos/issues/1312\" target=\"_blank\"\u003e#1312\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/d22954e2fdb7b2dd5206651b6dd5cf96185a33ba\" target=\"_blank\"\u003ed22954e\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/598\" target=\"_blank\"\u003e#598\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eTests:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003e\u003cp\u003eAdd tests for cookie behavior of API and browser endpoints (\u003ca href=\"https://github.com/ory/kratos/commit/d1b15217867cfb92a615c793b26fad288f5e5742\" target=\"_blank\"\u003ed1b1521\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRemove obsolete console.log (\u003ca href=\"https://github.com/ory/kratos/commit/3ecc869ebfef5c97334ae4334fb4af98ca9baf97\" target=\"_blank\"\u003e3ecc869\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve e2e regressions (\u003ca href=\"https://github.com/ory/kratos/commit/b0d3b82f301942bebe3c0027c8b3160749f907af\" target=\"_blank\"\u003eb0d3b82\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve migratest panic (\u003ca href=\"https://github.com/ory/kratos/commit/89d05ae0c376c4ea1f23708cccf95c9754a29c94\" target=\"_blank\"\u003e89d05ae\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003e\u003cstrong\u003ee2e:\u003c/strong\u003e Greatly improve test performance (\u003ca href=\"https://github.com/ory/kratos/issues/1421\" target=\"_blank\"\u003e#1421\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/2ffad9ee751471451e2151719a2e70d5f89437b0\" target=\"_blank\"\u003e2ffad9e\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eInstead of running the individual profiles as separate Cypress instances, we now use one singular instance which updates the Ory Kratos configuration depending on the test context. This ensures that hot-reloading is properly working while also signficantly reducing the amount of time spent on booting up the service dependencies.\u003c/p\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eUnclassified:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eadd CoC shield (#1439) (\u003ca href=\"https://github.com/ory/kratos/commit/826ed1a6deafdc2631a5c72f0bfacc91b06a3435\" target=\"_blank\"\u003e826ed1a\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1439\" target=\"_blank\"\u003e#1439\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eu (\u003ca href=\"https://github.com/ory/kratos/commit/b03549b6340ec0bf4f9d741ce145ca90bbc09968\" target=\"_blank\"\u003eb03549b\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFormat (\u003ca href=\"https://github.com/ory/kratos/commit/5cc9fc3a6e91a96225d016d60c8da5cef647ac18\" target=\"_blank\"\u003e5cc9fc3\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eu (\u003ca href=\"https://github.com/ory/kratos/commit/318a31d400b97653b4f377c67df4ae0afea189d9\" target=\"_blank\"\u003e318a31d\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFormat (\u003ca href=\"https://github.com/ory/kratos/commit/e525805246431075d26c3f47596ae93f6580d8ee\" target=\"_blank\"\u003ee525805\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFormat (\u003ca href=\"https://github.com/ory/kratos/commit/4a692acc7db160068ed7d81461b173bc957e4736\" target=\"_blank\"\u003e4a692ac\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFormat (\u003ca href=\"https://github.com/ory/kratos/commit/169c0cd8d424babef69a52ddf65e2b75ded09a46\" target=\"_blank\"\u003e169c0cd\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003ch2\u003eBreaking Changes\u003c/h2\u003e\n\n\u003cp\u003eUnfortunately, some method signatures have changed in the SDKs. Below is a list of changed entries:\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eError \u003ccode\u003egenericError\u003c/code\u003e was renamed to \u003ccode\u003ejsonError\u003c/code\u003e and now includes more information and better typing for errors;\u003c/li\u003e\n\u003cli\u003eThe following functions have been renamed:\n\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003einitializeSelfServiceLoginViaAPIFlow\u003c/code\u003e -\u0026gt; \u003ccode\u003einitializeSelfServiceLoginForNativeApps\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einitializeSelfServiceLoginViaBrowserFlow\u003c/code\u003e -\u0026gt; \u003ccode\u003einitializeSelfServiceLoginForBrowsers\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einitializeSelfServiceRegistrationViaAPIFlow\u003c/code\u003e -\u0026gt; \u003ccode\u003einitializeSelfServiceRegistrationForNativeApps\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einitializeSelfServiceRegistrationViaBrowserFlow\u003c/code\u003e -\u0026gt; \u003ccode\u003einitializeSelfServiceRegistrationForBrowsers\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einitializeSelfServiceSettingsViaAPIFlow\u003c/code\u003e -\u0026gt; \u003ccode\u003einitializeSelfServiceSettingsForNativeApps\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einitializeSelfServiceSettingsViaBrowserFlow\u003c/code\u003e -\u0026gt; \u003ccode\u003einitializeSelfServiceSettingsForBrowsers\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einitializeSelfServiceRecoveryViaAPIFlow\u003c/code\u003e -\u0026gt; \u003ccode\u003einitializeSelfServiceRecoveryForNativeApps\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einitializeSelfServiceRecoveryViaBrowserFlow\u003c/code\u003e -\u0026gt; \u003ccode\u003einitializeSelfServiceRecoveryForBrowsers\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einitializeSelfServiceVerificationViaAPIFlow\u003c/code\u003e -\u0026gt; \u003ccode\u003einitializeSelfServiceVerificationForNativeApps\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einitializeSelfServiceVerificationViaBrowserFlow\u003c/code\u003e -\u0026gt; \u003ccode\u003einitializeSelfServiceVerificationForBrowsers\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\u003c/li\u003e\n\u003cli\u003eSome type names have changed, for example \u003ccode\u003etraits\u003c/code\u003e -\u0026gt; \u003ccode\u003eidentityTraits\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eBug Fixes:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eProperly handle CSRF for API flows in recovery and verification strategies (\u003ca href=\"https://github.com/ory/kratos/commit/461c829dc4d7f7b70620abee2263efba78ce463a\" target=\"_blank\"\u003e461c829\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1141\" target=\"_blank\"\u003e#1141\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003esession:\u003c/strong\u003e Use specific headers before bearer use (\u003ca href=\"https://github.com/ory/kratos/commit/82c0b545b29b30fcf3521d9621ec5c5f1a23dc96\" target=\"_blank\"\u003e82c0b54\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eImprove settings oas definition (\u003ca href=\"https://github.com/ory/kratos/commit/867abfc813b08142786f71bfe28e373d4754c959\" target=\"_blank\"\u003e867abfc\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUse correct api spec path (\u003ca href=\"https://github.com/ory/kratos/commit/5f41f87bea2919cdf4e9f55c6ad938c5bc08b619\" target=\"_blank\"\u003e5f41f87\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUse correct openapi path for validation (\u003ca href=\"https://github.com/ory/kratos/issues/1340\" target=\"_blank\"\u003e#1340\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/a0f5673d6aa4e60bab06ef699dce231f0bf4aeff\" target=\"_blank\"\u003ea0f5673\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eCode Generation:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003ePin v0.6.3-alpha.1 release commit (\u003ca href=\"https://github.com/ory/kratos/commit/5edf9524d812795ac5712e4a9541b34359234724\" target=\"_blank\"\u003e5edf952\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eCode Refactoring:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003e\u003cp\u003eImprove SDK experience (\u003ca href=\"https://github.com/ory/kratos/commit/71b8511ae1f6f77b2996a01a55accc99d171cfaf\" target=\"_blank\"\u003e71b8511\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eThis patch resolves UX issues in the auto-generated SDKs by using consistent naming and introducing a test suite for the Ory SaaS.\u003c/p\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eCode Generation:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003ePin v0.6.2-alpha.1 release commit (\u003ca href=\"https://github.com/ory/kratos/commit/99c1b1d674df3bd8263f7cbf1ed2bdfae6281f69\" target=\"_blank\"\u003e99c1b1d\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eDocumentation:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eUpdate link to example email template. (\u003ca href=\"https://github.com/ory/kratos/issues/1326\" target=\"_blank\"\u003e#1326\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/28a17234b557cabf17b592ee68041aec695f6d20\" target=\"_blank\"\u003e28a1723\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eCode Generation:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003ePin v0.6.1-alpha.1 release commit (\u003ca href=\"https://github.com/ory/kratos/commit/1df82daaf3f9cfd3a470d7c9bf8d96abbd52b872\" target=\"_blank\"\u003e1df82da\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eFeatures:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eAllow changing password validation API DNS name (\u003ca href=\"https://github.com/ory/kratos/issues/1009\" target=\"_blank\"\u003e#1009\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/ced85e8091b06d864cc55c9975f8b006f6be1ce4\" target=\"_blank\"\u003eced85e8\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eBug Fixes:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eUpdate node image (\u003ca href=\"https://github.com/ory/kratos/commit/eef307e6bc33c9ec36ed9138f99c19f72c7be575\" target=\"_blank\"\u003eeef307e\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eCode Generation:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003ePin v0.6.0-alpha.2 release commit (\u003ca href=\"https://github.com/ory/kratos/commit/a3658badb848656b61d54b3ee35114972afc1f35\" target=\"_blank\"\u003ea3658ba\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eFeatures:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eFix unexpected emails when update profile (\u003ca href=\"https://github.com/ory/kratos/issues/1300\" target=\"_blank\"\u003e#1300\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/7b2448566f82e69d555997654ee410f9b4ff3939\" target=\"_blank\"\u003e7b24485\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1221\" target=\"_blank\"\u003e#1221\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003ch2\u003eBreaking Changes\u003c/h2\u003e\n\n\u003cp\u003eBCrypt is now the default hashing alogrithm. If you wish to continue using Argon2id please set \u003ccode\u003ehashers.algorithm\u003c/code\u003e to \u003ccode\u003eargon2\u003c/code\u003e.\nThis implies a significant breaking change in the verification flow payload. Please consult the new ui documentation. In essence, the login flow\u0026rsquo;s \u003ccode\u003emethods\u003c/code\u003e key was replaced with a generic \u003ccode\u003eui\u003c/code\u003e key which provides information for the UI that needs to be rendered.\u003c/p\u003e\n\n\u003cp\u003eTo apply this patch you must apply SQL migrations. These migrations will drop the flow method table implying that all verification flows that are ongoing will become invalid. We recommend purging the flow table manually as well after this migration has been applied, if you have users doing at least one self-service flow per minute.\nThis implies a significant breaking change in the recovery flow payload. Please consult the new ui documentation. In essence, the login flow\u0026rsquo;s \u003ccode\u003emethods\u003c/code\u003e key was replaced with a generic \u003ccode\u003eui\u003c/code\u003e key which provides information for the UI that needs to be rendered.\u003c/p\u003e\n\n\u003cp\u003eTo apply this patch you must apply SQL migrations. These migrations will drop the flow method table implying that all recovery flows that are ongoing will become invalid. We recommend purging the flow table manually as well after this migration has been applied, if you have users doing at least one self-service flow per minute.\nThis implies a significant breaking change in the settings flow payload. Please consult the new ui documentation. In essence, the login flow\u0026rsquo;s \u003ccode\u003emethods\u003c/code\u003e key was replaced with a generic \u003ccode\u003eui\u003c/code\u003e key which provides information for the UI that needs to be rendered.\u003c/p\u003e\n\n\u003cp\u003eTo apply this patch you must apply SQL migrations. These migrations will drop the flow method table implying that all settings flows that are ongoing will become invalid. We recommend purging the flow table manually as well after this migration has been applied, if you have users doing at least one self-service flow per minute.\nThis implies a significant breaking change in the registration flow payload. Please consult the new ui documentation. In essence, the login flow\u0026rsquo;s \u003ccode\u003emethods\u003c/code\u003e key was replaced with a generic \u003ccode\u003eui\u003c/code\u003e key which provides information for the UI that needs to be rendered.\u003c/p\u003e\n\n\u003cp\u003eTo apply this patch you must apply SQL migrations. These migrations will drop the flow method table implying that all registration flows that are ongoing will become invalid. We recommend purging the flow table manually as well after this migration has been applied, if you have users doing at least one self-service flow per minute.\nThis implies a significant breaking change in the login flow payload. Please consult the new ui documentation. In essence, the login flow\u0026rsquo;s \u003ccode\u003emethods\u003c/code\u003e key was replaced with a generic \u003ccode\u003eui\u003c/code\u003e key which provides information for the UI that needs to be rendered.\u003c/p\u003e\n\n\u003cp\u003eTo apply this patch you must apply SQL migrations. These migrations will drop the flow method table implying that all login flows that are ongoing will become invalid. We recommend purging the flow table manually as well after this migration has been applied, if you have users doing at least one self-service flow per minute.\nThis change introduces a new feature: UI Nodes. Previously, all self-service flows (login, registration, \u0026hellip;) included form fields (e.g. \u003ccode\u003emethods.password.config.fields\u003c/code\u003e). However, these form fields lacked support for other types of UI elements such as links (for e.g. \u0026ldquo;Sign in with Google\u0026rdquo;), images (e.g. QR codes), javascript (e.g. WebAuthn), or text (e.g. recovery codes). With this patch, these new features have been introduced. Please be aware that this introduces significant breaking changes which you will need to adopt to in your UI. Please refer to the most recent documentation to see what has changed. Conceptionally, most things stayed the same - you do however need to update how you access and render the form fields.\u003c/p\u003e\n\n\u003cp\u003ePlease be also aware that this patch includes SQL migrations which \u003cstrong\u003epurge existing self-service forms\u003c/strong\u003e from the database. This means that users will need to re-start the login/registration/\u0026hellip; flow after the SQL migrations have been applied! If you wish to keep these records, make a back up of your database prior!\nThis change introduces a new feature: UI Nodes. Previously, all self-service flows (login, registration, \u0026hellip;) included form fields (e.g. \u003ccode\u003emethods.password.config.fields\u003c/code\u003e). However, these form fields lacked support for other types of UI elements such as links (for e.g. \u0026ldquo;Sign in with Google\u0026rdquo;), images (e.g. QR codes), javascript (e.g. WebAuthn), or text (e.g. recovery codes). With this patch, these new features have been introduced. Please be aware that this introduces significant breaking changes which you will need to adopt to in your UI. Please refer to the most recent documentation to see what has changed. Conceptionally, most things stayed the same - you do however need to update how you access and render the form fields.\u003c/p\u003e\n\n\u003cp\u003ePlease be also aware that this patch includes SQL migrations which \u003cstrong\u003epurge existing self-service forms\u003c/strong\u003e from the database. This means that users will need to re-start the login/registration/\u0026hellip; flow after the SQL migrations have been applied! If you wish to keep these records, make a back up of your database prior!\nThe configuration value for \u003ccode\u003ehashers.argon2.memory\u003c/code\u003e is now a string representation of the memory amount including the unit of measurement. To convert the value divide your current setting (KB) by 1024 to get a result in MB or 1048576 to get a result in GB. Example: \u003ccode\u003e131072\u003c/code\u003e would now become \u003ccode\u003e128MB\u003c/code\u003e.\u003c/p\u003e\n\n\u003cp\u003eCo-authored-by: aeneasr \u003ca href=\"mailto:3372410+aeneasr@users.noreply.github.com\" target=\"_blank\"\u003e3372410+aeneasr@users.noreply.github.com\u003c/a\u003e\nCo-authored-by: aeneasr \u003ca href=\"mailto:aeneas@ory.sh\" target=\"_blank\"\u003eaeneas@ory.sh\u003c/a\u003e\nPlease run SQL migrations when applying this patch.\nThe following configuration keys were updated:\u003c/p\u003e\n\n\u003cpre style=\"word-break: break-all; white-space: pre-wrap\"\u003e\u003ccode class=\"language-patch\"\u003eselfservice.methods.password.config.max_breaches\n\u003c/code\u003e\u003c/pre\u003e\n\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003epassword.max_breaches\u003c/code\u003e -\u0026gt; \u003ccode\u003eselfservice.methods.password.config.max_breaches\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epassword.ignore_network_errors\u003c/code\u003e -\u0026gt; \u003ccode\u003eselfservice.methods.password.config.ignore_network_errors\u003c/code\u003e\nAfter battling with \u003ca href=\"https://github.com/spf13/viper\" target=\"_blank\"\u003espf13/viper\u003c/a\u003e for several years we finally found a viable alternative with \u003ca href=\"https://github.com/knadh/koanf\" target=\"_blank\"\u003eknadh/koanf\u003c/a\u003e. The complete internal configuration infrastructure has changed, with several highlights:\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003col\u003e\n\u003cli\u003eConfiguration sourcing works from all sources (file, env, cli flags) with validation against the configuration schema, greatly improving developer experience when changing or updating configuration.\u003c/li\u003e\n\u003cli\u003eConfiguration reloading has improved significantly and works flawlessly on Kubernetes.\u003c/li\u003e\n\u003cli\u003ePerformance increased dramatically, completely removing the need for a cache layer between the configuration system and ORY Hydra.\u003c/li\u003e\n\u003cli\u003eIt is now possible to load several config files using the \u003ccode\u003e--config\u003c/code\u003e flag.\u003c/li\u003e\n\u003cli\u003eConfiguration values are now sent to the tracer (e.g. Jaeger) if tracing is enabled.\u003c/li\u003e\n\u003c/ol\u003e\n\n\u003cp\u003ePlease be aware that ORY Kratos might complain about an invalid configuration, because the validation process has improved significantly.\u003c/p\u003e\n\n\u003cp\u003e\u003cstrong\u003eBug Fixes:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003e\u003cp\u003eAdd include stub go files (\u003ca href=\"https://github.com/ory/kratos/commit/6d725b1461a26d99c8b179be8ca219ba83ba0f17\" target=\"_blank\"\u003e6d725b1\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd index to migration status (\u003ca href=\"https://github.com/ory/kratos/commit/8c6ec2741535c090aae16f02a744f56c15923e2b\" target=\"_blank\"\u003e8c6ec27\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd node_modules to format tasks (\u003ca href=\"https://github.com/ory/kratos/commit/e5f6b36caeff080905d15566cf55f8fe4905dbc0\" target=\"_blank\"\u003ee5f6b36\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd titles to identity schema (\u003ca href=\"https://github.com/ory/kratos/commit/73c15d23840aa83d2c99c013cad52ad7df285f18\" target=\"_blank\"\u003e73c15d2\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdopt to new go-swagger changes (\u003ca href=\"https://github.com/ory/kratos/commit/5c45bd9f354bfe19b8cbcd7eb4eaebf22c441f42\" target=\"_blank\"\u003e5c45bd9\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAllow absolute file URLs as config values (\u003ca href=\"https://github.com/ory/kratos/issues/1069\" target=\"_blank\"\u003e#1069\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/4bb4f679d1fe0a49edb0c0189bb7a2188d4f850d\" target=\"_blank\"\u003e4bb4f67\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAllow hashtag in ui urls (\u003ca href=\"https://github.com/ory/kratos/issues/1040\" target=\"_blank\"\u003e#1040\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/7591f07f7d48376a03e9eacfdb6f4a93fd26c0d5\" target=\"_blank\"\u003e7591f07\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAvoid unicode-escaping ampersand in recovery URL query string (\u003ca href=\"https://github.com/ory/kratos/issues/1212\" target=\"_blank\"\u003e#1212\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/d17236870af490f043d87e220179b35c9eb2dd4e\" target=\"_blank\"\u003ed172368\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eBcrypt regression in credentials counting (\u003ca href=\"https://github.com/ory/kratos/commit/23fc13ba778e0045ca30c00d673ebd6c2f2b7fb7\" target=\"_blank\"\u003e23fc13b\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eBroken make quickstart-dev task (\u003ca href=\"https://github.com/ory/kratos/issues/980\" target=\"_blank\"\u003e#980\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/999828ae036f20bde6d12fe89851e1fde9bdaca6\" target=\"_blank\"\u003e999828a\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/965\" target=\"_blank\"\u003e#965\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eBroken make sdk task (\u003ca href=\"https://github.com/ory/kratos/issues/977\" target=\"_blank\"\u003e#977\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/5b01c7a368c5bcfaa3af218d42f15288f51ab3e4\" target=\"_blank\"\u003e5b01c7a\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/950\" target=\"_blank\"\u003e#950\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eCall contextualized test helpers (\u003ca href=\"https://github.com/ory/kratos/commit/e1f3f7835696b039409c9d05f63665aba7a179ae\" target=\"_blank\"\u003ee1f3f78\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eCode integer parsing bit size (\u003ca href=\"https://github.com/ory/kratos/issues/1178\" target=\"_blank\"\u003e#1178\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/31e9632bcd6ec3bdeabe862a4cce89021c6dd361\" target=\"_blank\"\u003e31e9632\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eIn some cases we had a wrong bitsize of \u003ccode\u003e64\u003c/code\u003e, while the var was later cast to \u003ccode\u003eint\u003c/code\u003e. Replaced with a bitsize of \u003ccode\u003e0\u003c/code\u003e, which is the value to cast to \u003ccode\u003eint\u003c/code\u003e.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eContextualize identity persister (\u003ca href=\"https://github.com/ory/kratos/commit/f8640c04f0c5873c39c8af4652d16bfbd347b79e\" target=\"_blank\"\u003ef8640c0\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eConvert all identifiers to lower case on login (\u003ca href=\"https://github.com/ory/kratos/issues/815\" target=\"_blank\"\u003e#815\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/d64b5757c710c436d6789dbdb33ed04dc11cbdf9\" target=\"_blank\"\u003ed64b575\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/814\" target=\"_blank\"\u003e#814\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eCourier adress (\u003ca href=\"https://github.com/ory/kratos/issues/1198\" target=\"_blank\"\u003e#1198\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/ebe4e643150f7603a1e3a3cf6f909135097b3f49\" target=\"_blank\"\u003eebe4e64\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1194\" target=\"_blank\"\u003e#1194\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eCourier message dequeue race condition (\u003ca href=\"https://github.com/ory/kratos/issues/1024\" target=\"_blank\"\u003e#1024\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/5396a82c34eef5d42444b5c4371bd4f820fe3eb0\" target=\"_blank\"\u003e5396a82\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/652\" target=\"_blank\"\u003e#652\u003c/a\u003e \u003ca href=\"https://github.com/ory/kratos/issues/732\" target=\"_blank\"\u003e#732\u003c/a\u003e:\u003c/p\u003e\n\n\u003cp\u003eFixes the courier message dequeuing race condition by modifying \u003ccode\u003e*sql.Persister.NextMessages(ctx context.Context, limit uint8)\u003c/code\u003e to retrieve only messages with status \u003ccode\u003eMessageStatusQueued\u003c/code\u003e and update the status of the retrieved messages to \u003ccode\u003eMessageStatusProcessing\u003c/code\u003e within a transaction. On message send failure, the message\u0026rsquo;s status is reset to \u003ccode\u003eMessageStatusQueued\u003c/code\u003e, so that the message can be dequeued in a subsequent \u003ccode\u003eNextMessages\u003c/code\u003e call. On message send success, the status is updated to \u003ccode\u003eMessageStatusSent\u003c/code\u003e (no change there).\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eDefine credentials types as sql template and resolve crdb issue (\u003ca href=\"https://github.com/ory/kratos/commit/a2d6eeb2928c9750741237f559197fd80494310d\" target=\"_blank\"\u003ea2d6eeb\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eDereference pointer types from new flow structures (\u003ca href=\"https://github.com/ory/kratos/issues/1019\" target=\"_blank\"\u003e#1019\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/efedc920e592bd6e963726e6b123ddc40df93a59\" target=\"_blank\"\u003eefedc92\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eDo not include smtp in tracing (\u003ca href=\"https://github.com/ory/kratos/issues/1268\" target=\"_blank\"\u003e#1268\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/bbfcbf9ce595d842a53a3ea21c286d5899eeb28f\" target=\"_blank\"\u003ebbfcbf9\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eDo not publish version at public endpoint (\u003ca href=\"https://github.com/ory/kratos/commit/3726ed4d145a949b25f5b5da5f58d4f448a2a90f\" target=\"_blank\"\u003e3726ed4\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eDo not reset registration method (\u003ca href=\"https://github.com/ory/kratos/commit/554bb0b4e62e4ac2a321fa4dbf89ffdf37b188df\" target=\"_blank\"\u003e554bb0b\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eDo not return system errors for missing identifiers (\u003ca href=\"https://github.com/ory/kratos/commit/1fcc8557bfee0f7ba562a635670b61dc9acb3530\" target=\"_blank\"\u003e1fcc855\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1286\" target=\"_blank\"\u003e#1286\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eExport mailhog dockertest runner (\u003ca href=\"https://github.com/ory/kratos/commit/138414873ad319c6c32c6cc64a73547540dffc74\" target=\"_blank\"\u003e1384148\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix random delay norm distribution math (\u003ca href=\"https://github.com/ory/kratos/issues/1131\" target=\"_blank\"\u003e#1131\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/bd9d28fe354710957f4ebaf71d1fffeae3968364\" target=\"_blank\"\u003ebd9d28f\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFork audit logger from root logger (\u003ca href=\"https://github.com/ory/kratos/commit/68a09e7f3dc3ded9a477bb309c68ac8c4e2c2836\" target=\"_blank\"\u003e68a09e7\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eGitlab oidc flow (\u003ca href=\"https://github.com/ory/kratos/issues/1159\" target=\"_blank\"\u003e#1159\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/0bb3eb6db1144a09f4ac356cc45e1644d862bb70\" target=\"_blank\"\u003e0bb3eb6\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1157\" target=\"_blank\"\u003e#1157\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eGive specific message instead of only 404 when method is disabled (\u003ca href=\"https://github.com/ory/kratos/issues/1025\" target=\"_blank\"\u003e#1025\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/2f62041a62588f5b3b062092c57053facb858e62\" target=\"_blank\"\u003e2f62041\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eEnabled strategies are not only used for handlers but also in other areas\n(e.g. populating the flow methods). So we should keep the logic to get\nenabled strategies and add new functions for getting all strategies.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eIgnore unset domain aliases (\u003ca href=\"https://github.com/ory/kratos/commit/ada6997ff3dc7e48fd098e40267db5f231a5201f\" target=\"_blank\"\u003eada6997\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eImprove cli error output (\u003ca href=\"https://github.com/ory/kratos/commit/43e967887280b57639565dabd92a07f02fbddeb5\" target=\"_blank\"\u003e43e9678\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eImprove error stack trace (\u003ca href=\"https://github.com/ory/kratos/commit/43517737109088eda3b1d7f5b42f78bd5eb701d2\" target=\"_blank\"\u003e4351773\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eImprove error tracing (\u003ca href=\"https://github.com/ory/kratos/issues/1005\" target=\"_blank\"\u003e#1005\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/456fd254485fc80b9ae02dfca672a9fea8ae0134\" target=\"_blank\"\u003e456fd25\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eImprove test contextualization (\u003ca href=\"https://github.com/ory/kratos/commit/2f92a7066d72535d32146a98207996fda45e0b96\" target=\"_blank\"\u003e2f92a70\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eInitialize randomdelay with seeded source (\u003ca href=\"https://github.com/ory/kratos/commit/9896289216f10b808a8c78b86d9c27b8d74379de\" target=\"_blank\"\u003e9896289\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eInsert credentials type constants as part of migrations (\u003ca href=\"https://github.com/ory/kratos/issues/865\" target=\"_blank\"\u003e#865\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/92b79b86762edddf2ad6529b98b3383b641148d5\" target=\"_blank\"\u003e92b79b8\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/861\" target=\"_blank\"\u003e#861\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eLinking a connection may result in system error (\u003ca href=\"https://github.com/ory/kratos/issues/990\" target=\"_blank\"\u003e#990\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/be02a70c3cd60adbcc13559e1cb5dc01a8572da4\" target=\"_blank\"\u003ebe02a70\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/694\" target=\"_blank\"\u003e#694\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eMarking whoami auhorization parameter as \u0026lsquo;in header\u0026rsquo; (\u003ca href=\"https://github.com/ory/kratos/issues/1244\" target=\"_blank\"\u003e#1244\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/62d8b85223a0535b07620b08d35c6c3f6b127642\" target=\"_blank\"\u003e62d8b85\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1215\" target=\"_blank\"\u003e#1215\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eMove schema loaders to correct file (\u003ca href=\"https://github.com/ory/kratos/commit/029781f69448e8abc85607a03b4bd2055158cf2c\" target=\"_blank\"\u003e029781f\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eMove to new transaction-safe migrations (\u003ca href=\"https://github.com/ory/kratos/issues/1063\" target=\"_blank\"\u003e#1063\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/2588fb489d76939aeec2986d30fde9075b373831\" target=\"_blank\"\u003e2588fb4\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eThis patch introduces a new SQL transaction model for running SQL migrations. This fix is particularly targeted at CockroachDB which has limited support for mixing DDL and DML statements.\u003c/p\u003e\n\n\u003cp\u003ePreviously it could happen that migrations failure needed manual intervention. This has now been resolved. The new migration model is compatible with the old one and should work without a problem.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003ePass down context to registry (\u003ca href=\"https://github.com/ory/kratos/commit/08794461ed95965a9e5460ded2b4c04ab0f5e2e8\" target=\"_blank\"\u003e0879446\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRe-enable SDK generation (\u003ca href=\"https://github.com/ory/kratos/commit/1d5854d6298e3d21f85a8fa01d3004166c4b3f50\" target=\"_blank\"\u003e1d5854d\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRecord cypress runs (\u003ca href=\"https://github.com/ory/kratos/commit/db35d8ff6bb44dc9e9acf131cb0a14a7f4a7d160\" target=\"_blank\"\u003edb35d8f\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRehydrate settings form on successful submission (\u003ca href=\"https://github.com/ory/kratos/commit/3457e1a46f48ed79eabff76f8af08b82f12ecc89\" target=\"_blank\"\u003e3457e1a\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1305\" target=\"_blank\"\u003e#1305\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRemove absolete \u0026lsquo;make pack\u0026rsquo; from Dockerfile (\u003ca href=\"https://github.com/ory/kratos/issues/1172\" target=\"_blank\"\u003e#1172\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/b8eb908529cc72a3147ad28e4eeee71850a8e431\" target=\"_blank\"\u003eb8eb908\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRemove continuity cookies on errors (\u003ca href=\"https://github.com/ory/kratos/commit/85eea6748be6ae8cdfc10cabaa6b677e4efd63eb\" target=\"_blank\"\u003e85eea67\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRemove include stubs (\u003ca href=\"https://github.com/ory/kratos/commit/1764e3a08a24db82dc391a77fdea09a91faffb5f\" target=\"_blank\"\u003e1764e3a\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRemove obsolete clihelpers (\u003ca href=\"https://github.com/ory/kratos/commit/230fd138d1bc7ec57647ea8eeca8e17baaacce0a\" target=\"_blank\"\u003e230fd13\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRemove record from bash script (\u003ca href=\"https://github.com/ory/kratos/commit/84a9315a824cacd29d30b98b65725343af22732d\" target=\"_blank\"\u003e84a9315\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRemove stray non-ctx configs (\u003ca href=\"https://github.com/ory/kratos/issues/1053\" target=\"_blank\"\u003e#1053\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/1fe137e0d6314bd0af47a29c00e2f72564e71cef\" target=\"_blank\"\u003e1fe137e\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRemove trailing double-dot from error (\u003ca href=\"https://github.com/ory/kratos/commit/59581e3fede0fd43028a5f064c350c3cc833b5b0\" target=\"_blank\"\u003e59581e3\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRemove unused sql migration (\u003ca href=\"https://github.com/ory/kratos/commit/1445d1d1b4b0b5e8ef3426a98ced9573063d8646\" target=\"_blank\"\u003e1445d1d\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRemove unused var (\u003ca href=\"https://github.com/ory/kratos/commit/30a8cee22238d9f400e6d315a9bc99f710945f81\" target=\"_blank\"\u003e30a8cee\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRemove verify hook (\u003ca href=\"https://github.com/ory/kratos/commit/98cfec6d72c2e7bf2db2e8dd6f8875e885923ba8\" target=\"_blank\"\u003e98cfec6\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1302\" target=\"_blank\"\u003e#1302\u003c/a\u003e:\u003c/p\u003e\n\n\u003cp\u003eThe verify hook is automatically used when verification is enabled and has been removed as a configuration option.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eReplace jwt module (\u003ca href=\"https://github.com/ory/kratos/issues/1254\" target=\"_blank\"\u003e#1254\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/3803c8ce43e35c51a9c1d7ab55bc662c398cf0d8\" target=\"_blank\"\u003e3803c8c\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1250\" target=\"_blank\"\u003e#1250\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve build and release issues (\u003ca href=\"https://github.com/ory/kratos/commit/fb582aa06ad55ca3fd4e2b083e1e9bbb4ba7c715\" target=\"_blank\"\u003efb582aa\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve clidoc issues (\u003ca href=\"https://github.com/ory/kratos/commit/599e9f773a743f811329cc57cea2748831105e58\" target=\"_blank\"\u003e599e9f7\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve compile issues (\u003ca href=\"https://github.com/ory/kratos/commit/63063c15c17f4d3aca96b106275a3478a8ed717e\" target=\"_blank\"\u003e63063c1\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve contextualized table issues (\u003ca href=\"https://github.com/ory/kratos/commit/5a4f0d92800df7fb5ca0df18203a6d73416814e1\" target=\"_blank\"\u003e5a4f0d9\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve crdb migration issue (\u003ca href=\"https://github.com/ory/kratos/commit/9f6edfd1f544d5f85e5f5558a08672f40e928136\" target=\"_blank\"\u003e9f6edfd\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve double hook invokation for registration (\u003ca href=\"https://github.com/ory/kratos/commit/032322c66fb6925d8f1473746cb4bfd800d60590\" target=\"_blank\"\u003e032322c\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve incorrect field types on oidc sign up completion (\u003ca href=\"https://github.com/ory/kratos/commit/f88b6abe202605739092a8230fbdebaebcd4407a\" target=\"_blank\"\u003ef88b6ab\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve lint issues (\u003ca href=\"https://github.com/ory/kratos/commit/03488250bcdbfda6ef6a536b4de6117fa8924dc8\" target=\"_blank\"\u003e0348825\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve lint issues (\u003ca href=\"https://github.com/ory/kratos/commit/75a995b3f69778655611929b65ae22bd77c5370b\" target=\"_blank\"\u003e75a995b\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve linting issues and disable nancy (\u003ca href=\"https://github.com/ory/kratos/commit/c8396f6007831240d83f77433876c5971a2191ef\" target=\"_blank\"\u003ec8396f6\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve mail queue issues (\u003ca href=\"https://github.com/ory/kratos/commit/b968bc4ed8962d421175adbcaa2dba6eaeea2245\" target=\"_blank\"\u003eb968bc4\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve merge regressions (\u003ca href=\"https://github.com/ory/kratos/commit/9862ac72e0877df4cf17c93e140c354e1ddbd0e7\" target=\"_blank\"\u003e9862ac7\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve oidc e2e regressions (\u003ca href=\"https://github.com/ory/kratos/commit/f28087aaf133c116a81213f787dc6f2e982564c0\" target=\"_blank\"\u003ef28087a\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve oidc regressions and e2e tests (\u003ca href=\"https://github.com/ory/kratos/commit/f5091fac161db0b1401b340a002278bc26891251\" target=\"_blank\"\u003ef5091fa\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve potential fsnotify leaks (\u003ca href=\"https://github.com/ory/kratos/commit/3159c0abe109ea4e3832770278c4e9bc4ca3b3e1\" target=\"_blank\"\u003e3159c0a\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve regressions and test failures (\u003ca href=\"https://github.com/ory/kratos/commit/8bae3565ea5410b60c3e638a49f5454fac8e63d3\" target=\"_blank\"\u003e8bae356\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve regressions in cookies and payloads (\u003ca href=\"https://github.com/ory/kratos/commit/9e34bf2f6a2f3b007069a5415643c448798207a6\" target=\"_blank\"\u003e9e34bf2\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve settings sudo regressions (\u003ca href=\"https://github.com/ory/kratos/commit/4b611f34755369eafcbafa2fc16da13ea3b82370\" target=\"_blank\"\u003e4b611f3\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve test regressions (\u003ca href=\"https://github.com/ory/kratos/commit/e3fb0281dd9be123271d11f2934cfb08fdc470b7\" target=\"_blank\"\u003ee3fb028\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve ui issues with nested form objects (\u003ca href=\"https://github.com/ory/kratos/commit/8e744b931954283cf5f5cbf3ebaca3fa94e035ed\" target=\"_blank\"\u003e8e744b9\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve update regression (\u003ca href=\"https://github.com/ory/kratos/commit/d0d661aaffcba8b039738b773c891ee6e8f6449e\" target=\"_blank\"\u003ed0d661a\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eReturn delay instead of sleeping to improve tests (\u003ca href=\"https://github.com/ory/kratos/commit/27b977ebbaa25b95caa7e3e4536a09ea0bfa61c3\" target=\"_blank\"\u003e27b977e\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRevert generator changes (\u003ca href=\"https://github.com/ory/kratos/commit/c18b97f333a638d4b4495678013c55faca4b04d0\" target=\"_blank\"\u003ec18b97f\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRun correct error handler for registration hooks (\u003ca href=\"https://github.com/ory/kratos/commit/0d80447102d5092e310ca728012f083147c0c5c9\" target=\"_blank\"\u003e0d80447\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eSimplify data breaches password error reason (\u003ca href=\"https://github.com/ory/kratos/issues/1136\" target=\"_blank\"\u003e#1136\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/33d29bf72af03aea77f1d318c19f5087a506719f\" target=\"_blank\"\u003e33d29bf\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eThis PR simplifies the error reason given when a password has appeared in data breaches to not include the actual number and rather just show \u0026ldquo;this password has appeared in data breaches and must not be used\u0026rdquo;.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eSupport form and json formats in decoder (\u003ca href=\"https://github.com/ory/kratos/commit/d420fe6e8a491b20063d4bfeaa0a841058087d32\" target=\"_blank\"\u003ed420fe6\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate openapi definitions for signup (\u003ca href=\"https://github.com/ory/kratos/commit/eb0b69d50ce834b170186a39bbc9cda4d3366c36\" target=\"_blank\"\u003eeb0b69d\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate quickstart node image (\u003ca href=\"https://github.com/ory/kratos/commit/c19b2f4c57307e27ce289d44eff34f5aec1341da\" target=\"_blank\"\u003ec19b2f4\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eSee \u003ca href=\"https://github.com/ory/kratos/discussions/1301\" target=\"_blank\"\u003ehttps://github.com/ory/kratos/discussions/1301\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003e\u003cstrong\u003ecmd:\u003c/strong\u003e Make HTTP calls resilient (\u003ca href=\"https://github.com/ory/kratos/commit/e8ed61fc3e806453f78b8fa629e96ff7b320bf95\" target=\"_blank\"\u003ee8ed61f\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003e\u003cstrong\u003ehashing:\u003c/strong\u003e Make bcrypt default hashing algorithm (\u003ca href=\"https://github.com/ory/kratos/commit/04abe774ada1ef4bf318658fcf84c1d39a2a922d\" target=\"_blank\"\u003e04abe77\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate to new goreleaser config (\u003ca href=\"https://github.com/ory/kratos/commit/4c2a1b7f5a0059a6e0c28779808ffb27e8910553\" target=\"_blank\"\u003e4c2a1b7\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate to new healthx (\u003ca href=\"https://github.com/ory/kratos/commit/6ec987ae81ef0c05f2c4d1eb836c40f9d15950b2\" target=\"_blank\"\u003e6ec987a\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUse equalfold (\u003ca href=\"https://github.com/ory/kratos/commit/1c0e52ec36ff95b53e3537c5ef457f1c818d7f6b\" target=\"_blank\"\u003e1c0e52e\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUse new TB interface (\u003ca href=\"https://github.com/ory/kratos/commit/d75a378e700a206753f2cb17032315f2981960e7\" target=\"_blank\"\u003ed75a378\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUse numerical User ID instead of name to avoid k8s security warnings (\u003ca href=\"https://github.com/ory/kratos/issues/1151\" target=\"_blank\"\u003e#1151\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/468a12e56f22cfdf7bd05d68159cc735e75211b2\" target=\"_blank\"\u003e468a12e\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eOur docker image scanner does not allow running processes inside\ncontainer using non-numeric User spec (to determine if we are trying\nto run docker image as root).\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUse remote dependencies (\u003ca href=\"https://github.com/ory/kratos/commit/1e56457d49e1cde69baa41e3111ca113aa49ee3c\" target=\"_blank\"\u003e1e56457\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eCode Generation:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003ePin v0.6.0-alpha.1 release commit (\u003ca href=\"https://github.com/ory/kratos/commit/507d13a8ec9cd89c9933fc8814a8a99921da69fb\" target=\"_blank\"\u003e507d13a\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eCode Refactoring:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003e\u003cp\u003eAdapt new sdk in testhelpers (\u003ca href=\"https://github.com/ory/kratos/commit/6e15f6f86c0f146e846a384ffd6eac78406178bc\" target=\"_blank\"\u003e6e15f6f\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd nid everywhere (\u003ca href=\"https://github.com/ory/kratos/commit/407fd95889f416f0d76d6f3f43644a6fafa13b44\" target=\"_blank\"\u003e407fd95\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eContextualize everything (\u003ca href=\"https://github.com/ory/kratos/commit/7ebc3a9a1a2cd85d28c5a9adf2c0c8c10cbd072e\" target=\"_blank\"\u003e7ebc3a9\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eThis patch contextualizes all configuration and DBAL models.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eDo not use prefixed node names (\u003ca href=\"https://github.com/ory/kratos/commit/fc42ece24107dcb6e6a416cc54a2fb5de524fd94\" target=\"_blank\"\u003efc42ece\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eImprove Argon2 tooling (\u003ca href=\"https://github.com/ory/kratos/issues/961\" target=\"_blank\"\u003e#961\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/315118720419194be8baf5e5e64d7bf190179568\" target=\"_blank\"\u003e3151187\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/955\" target=\"_blank\"\u003e#955\u003c/a\u003e:\u003c/p\u003e\n\n\u003cp\u003eThis adds a load testing CLI that allows to adjust the hasher parameters under simulated load.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eMove faker to exportable module (\u003ca href=\"https://github.com/ory/kratos/commit/09f8ae5755c9978574e91676bf5df6a23a2feb78\" target=\"_blank\"\u003e09f8ae5\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eMove migratest helpers to ory/x (\u003ca href=\"https://github.com/ory/kratos/commit/7eca67eb9ec3e4ab065af7221911a74ed16c7c48\" target=\"_blank\"\u003e7eca67e\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eMove password config to selfservice (\u003ca href=\"https://github.com/ory/kratos/commit/cd0e0ebb0de372ff31c982ef023fe1979addb05a\" target=\"_blank\"\u003ecd0e0eb\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eMove to go 1.16 embed (\u003ca href=\"https://github.com/ory/kratos/commit/43c4a13c25be4a3a23a1ffdbecfaa0f9eda1a11d\" target=\"_blank\"\u003e43c4a13\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eThis patch replaces packr and pkged with the Go 1.16 embed feature.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRemove password node attribute prefix (\u003ca href=\"https://github.com/ory/kratos/commit/e27fae4b0d7a91ff3964804963d4885178b80803\" target=\"_blank\"\u003ee27fae4\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRemove profile node attribute prefix (\u003ca href=\"https://github.com/ory/kratos/commit/a3ff6f7eec45b1a9a1e7eb8569793fbc6a047d4f\" target=\"_blank\"\u003ea3ff6f7\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRename config structs and interfaces (\u003ca href=\"https://github.com/ory/kratos/commit/4a2f41977439354415118df3e37dd0cde8dac1aa\" target=\"_blank\"\u003e4a2f419\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRename form to container (\u003ca href=\"https://github.com/ory/kratos/commit/5da155a07d3737cefabaf98c4ff650115f662480\" target=\"_blank\"\u003e5da155a\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eReplace flow\u0026rsquo;s forms with new ui node module (\u003ca href=\"https://github.com/ory/kratos/commit/647eb1e66850c67e539d0338cca6cb8ae476ee55\" target=\"_blank\"\u003e647eb1e\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eReplace flow\u0026rsquo;s forms with new ui node module (\u003ca href=\"https://github.com/ory/kratos/commit/f74a5c25af60936b59caee0866a21637a5c0ae6f\" target=\"_blank\"\u003ef74a5c2\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eReplace login flow methods with ui container (\u003ca href=\"https://github.com/ory/kratos/commit/d4ca364fd8905cfb205ee047a9cb831064a6b9d0\" target=\"_blank\"\u003ed4ca364\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eReplace recovery flow methods with ui container (\u003ca href=\"https://github.com/ory/kratos/commit/cac04562f2e4e77875275fcfd82c039d787607fb\" target=\"_blank\"\u003ecac0456\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eReplace registration flow methods with ui container (\u003ca href=\"https://github.com/ory/kratos/commit/3f6388d03f91cfad17bd74ebca4d924b4b546668\" target=\"_blank\"\u003e3f6388d\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eReplace settings flow methods with ui container (\u003ca href=\"https://github.com/ory/kratos/commit/0efd17e76ba0a0cbd46916a7644b7bdf19bd4ab4\" target=\"_blank\"\u003e0efd17e\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eReplace verification flow methods with ui container (\u003ca href=\"https://github.com/ory/kratos/commit/dbf2668747922c93dd967961cd843354afbecfde\" target=\"_blank\"\u003edbf2668\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eReplace viper with koanf config management (\u003ca href=\"https://github.com/ory/kratos/commit/5eb1bc0bff7c5d0f83c604484b8e845701112cad\" target=\"_blank\"\u003e5eb1bc0\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate RegisterFakes calls (\u003ca href=\"https://github.com/ory/kratos/commit/626831069ab4f971094ba0bc0b43ac9ff618d91d\" target=\"_blank\"\u003e6268310\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUse underscore in webhook auth types (\u003ca href=\"https://github.com/ory/kratos/commit/26829d21911cccd4a87c8693b6089af661c1bfe3\" target=\"_blank\"\u003e26829d2\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eDocumentation:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003e\u003cp\u003eAdd docker to docs main (\u003ca href=\"https://github.com/ory/kratos/commit/8ce8b785e2246557253420ea97cf6b7d5ee75d58\" target=\"_blank\"\u003e8ce8b78\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd docker to sidebar (\u003ca href=\"https://github.com/ory/kratos/commit/ed38c88bdbadcdcd2527a2b5270390251742bbe4\" target=\"_blank\"\u003eed38c88\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd dotnet sdk (\u003ca href=\"https://github.com/ory/kratos/issues/1183\" target=\"_blank\"\u003e#1183\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/32d874a04bb384259aeb544a3fcd6b3a8b23acdd\" target=\"_blank\"\u003e32d874a\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd faq sidebar (\u003ca href=\"https://github.com/ory/kratos/issues/1105\" target=\"_blank\"\u003e#1105\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/10697aa4ab5dc3e2ab90d1c037dfbe3492bf2bdf\" target=\"_blank\"\u003e10697aa\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd log docs to schema config (\u003ca href=\"https://github.com/ory/kratos/commit/4967f11d8df177ebdae855eb745e90d21ce38e9f\" target=\"_blank\"\u003e4967f11\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd more HA docs (\u003ca href=\"https://github.com/ory/kratos/commit/cbb2e27f8919a8991c4797a3f1c192ec364f0dd3\" target=\"_blank\"\u003ecbb2e27\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd Rust and Dart SDKs (\u003ca href=\"https://github.com/ory/kratos/commit/6d969528e13350ef099669510d3d37df1c007c82\" target=\"_blank\"\u003e6d96952\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eWe now support for Rust and Dart SDKs!\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd SameSite help (\u003ca href=\"https://github.com/ory/kratos/commit/2df6729b4acc70532024658e8874682de64b06b3\" target=\"_blank\"\u003e2df6729\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd shell-session language (\u003ca href=\"https://github.com/ory/kratos/commit/d16db87802ae2f230a02e4deed189f473588552c\" target=\"_blank\"\u003ed16db87\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd ui node docs (\u003ca href=\"https://github.com/ory/kratos/commit/e48a07d03c19a0677d3a56f9e57294b358f24501\" target=\"_blank\"\u003ee48a07d\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdding double colons (\u003ca href=\"https://github.com/ory/kratos/issues/1187\" target=\"_blank\"\u003e#1187\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/fc712f4530066c429242491c19d1534ffb267b0c\" target=\"_blank\"\u003efc712f4\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eBcrypt is default and add 72 char warning (\u003ca href=\"https://github.com/ory/kratos/commit/29ae53a96b4472ff549b34241894d72d439c8ea1\" target=\"_blank\"\u003e29ae53a\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eBetter import identities examples (\u003ca href=\"https://github.com/ory/kratos/issues/997\" target=\"_blank\"\u003e#997\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/2e2880ac057b5c98cd69481c4f6f36b564b5871d\" target=\"_blank\"\u003e2e2880a\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eChange forum to discussions readme (\u003ca href=\"https://github.com/ory/kratos/issues/1220\" target=\"_blank\"\u003e#1220\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/ae399561ea6ed89aaadd4128bc564254984520e8\" target=\"_blank\"\u003eae39956\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eDescribe more about Kratos login/browser flow on quickstart doc (\u003ca href=\"https://github.com/ory/kratos/issues/1047\" target=\"_blank\"\u003e#1047\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/fe725ad12b5aed5faa8f95bec24ed3aa82512de8\" target=\"_blank\"\u003efe725ad\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eDocker file links (\u003ca href=\"https://github.com/ory/kratos/issues/1182\" target=\"_blank\"\u003e#1182\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/4d9b6a3fd5de81310016a811126e40a263ecd27c\" target=\"_blank\"\u003e4d9b6a3\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eDocument hash timing attack mitigation (\u003ca href=\"https://github.com/ory/kratos/commit/ec869930a9c0e6f6f56c2614835894e0a6a3eaab\" target=\"_blank\"\u003eec86993\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eExplain how to use \u003ccode\u003eafter_verification_return_to\u003c/code\u003e (\u003ca href=\"https://github.com/ory/kratos/commit/7e1546be1fd20baca10507d642d4f209eb88dcbc\" target=\"_blank\"\u003e7e1546b\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFAQ improvements (\u003ca href=\"https://github.com/ory/kratos/issues/1135\" target=\"_blank\"\u003e#1135\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/44d0bc968a7c0ba5c0793b2349820fa8133bada3\" target=\"_blank\"\u003e44d0bc9\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFAQ item \u0026amp; minor changes (\u003ca href=\"https://github.com/ory/kratos/issues/1174\" target=\"_blank\"\u003e#1174\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/11cf630082b56c80d12f5915f8e34aa03a7e8c54\" target=\"_blank\"\u003e11cf630\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix broken link (\u003ca href=\"https://github.com/ory/kratos/issues/1037\" target=\"_blank\"\u003e#1037\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/6b9aae8af5aa3bd614c99b32e341fbd533caf116\" target=\"_blank\"\u003e6b9aae8\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix failing build (\u003ca href=\"https://github.com/ory/kratos/commit/0de328ff0053605e6bded589a79d3ab938d55b31\" target=\"_blank\"\u003e0de328f\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix formatting (\u003ca href=\"https://github.com/ory/kratos/issues/966\" target=\"_blank\"\u003e#966\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/687251a24e796322b43f8aed6b1fb3d7900e3271\" target=\"_blank\"\u003e687251a\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix identity state bullets (\u003ca href=\"https://github.com/ory/kratos/issues/1095\" target=\"_blank\"\u003e#1095\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/f476334c4693277656ad88e768f66b59cbcba126\" target=\"_blank\"\u003ef476334\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix known/unknown email account recovery (\u003ca href=\"https://github.com/ory/kratos/issues/1211\" target=\"_blank\"\u003e#1211\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/e208ca50ba4f03d5410c9644aaa3b04bdf1b8dbd\" target=\"_blank\"\u003ee208ca5\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix link (\u003ca href=\"https://github.com/ory/kratos/commit/7f6d7f501d7118dfe6868c9d923fb5ecc5eded48\" target=\"_blank\"\u003e7f6d7f5\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix link (\u003ca href=\"https://github.com/ory/kratos/issues/1128\" target=\"_blank\"\u003e#1128\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/e7043e9b99260eaff2b48ca6f457af46a1521654\" target=\"_blank\"\u003ee7043e9\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix link to blogpost (\u003ca href=\"https://github.com/ory/kratos/issues/949\" target=\"_blank\"\u003e#949\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/4622e3228fb12231222c7e6b602458111f35f727\" target=\"_blank\"\u003e4622e32\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/945\" target=\"_blank\"\u003e#945\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix link to self-service flows overview (\u003ca href=\"https://github.com/ory/kratos/issues/995\" target=\"_blank\"\u003e#995\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/2be877847644a3df2645ac3be4bbd7704db30b17\" target=\"_blank\"\u003e2be8778\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix note block in third party login guide (\u003ca href=\"https://github.com/ory/kratos/issues/920\" target=\"_blank\"\u003e#920\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/745cea02d0e9940f689e668bbd814b29fd53bf37\" target=\"_blank\"\u003e745cea0\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eAllows the document to render properly\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix npm links (\u003ca href=\"https://github.com/ory/kratos/issues/991\" target=\"_blank\"\u003e#991\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/4ce4468132dde21c1692e3a834ad7780bee12b90\" target=\"_blank\"\u003e4ce4468\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix self-service code flows labels (\u003ca href=\"https://github.com/ory/kratos/issues/1253\" target=\"_blank\"\u003e#1253\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/f2ed424289cdd2a0edc1736888dd15be6df65f11\" target=\"_blank\"\u003ef2ed424\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix typo in README (\u003ca href=\"https://github.com/ory/kratos/issues/1122\" target=\"_blank\"\u003e#1122\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/e5007078c3cd597cea669827b96c7e6f205f2f32\" target=\"_blank\"\u003ee500707\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eLink to argon2 blogpost and add cross-references (\u003ca href=\"https://github.com/ory/kratos/issues/1038\" target=\"_blank\"\u003e#1038\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/9ab7c3df59ecd94a74a7bf18af9c0ded5305e042\" target=\"_blank\"\u003e9ab7c3d\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eMake explicit the ID of the default schema (\u003ca href=\"https://github.com/ory/kratos/issues/1173\" target=\"_blank\"\u003e#1173\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/cc6e9ffbac7118436d85078720cde2de98a68044\" target=\"_blank\"\u003ecc6e9ff\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eMinor cosmetics (\u003ca href=\"https://github.com/ory/kratos/issues/1050\" target=\"_blank\"\u003e#1050\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/34db06fd4f83d415c09109b06dfd3b82ce03705e\" target=\"_blank\"\u003e34db06f\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eMinor improvements (\u003ca href=\"https://github.com/ory/kratos/issues/1052\" target=\"_blank\"\u003e#1052\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/f0672b5cb8cca41fa914db21798d20f00a5699f9\" target=\"_blank\"\u003ef0672b5\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eORY -\u0026gt; Ory (\u003ca href=\"https://github.com/ory/kratos/commit/ea309797bf59f3da5c5cd184e45f2e585144be56\" target=\"_blank\"\u003eea30979\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eReformat settings code samples (\u003ca href=\"https://github.com/ory/kratos/commit/cdbbf4df5fa3fa667a78d5cf682bc7fa36693e9d\" target=\"_blank\"\u003ecdbbf4d\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRemove unnecessary and wrong docker pull commands (\u003ca href=\"https://github.com/ory/kratos/issues/1203\" target=\"_blank\"\u003e#1203\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/2b0342ad7607d705bcebfafd5a78e4e09e57a940\" target=\"_blank\"\u003e2b0342a\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eResolve duplication error (\u003ca href=\"https://github.com/ory/kratos/commit/a3d8284ab20ae76bccba361601b7290af20bdde6\" target=\"_blank\"\u003ea3d8284\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate build from source (\u003ca href=\"https://github.com/ory/kratos/commit/9b5754f36661f6de9c95f30c06f28164fe5be48b\" target=\"_blank\"\u003e9b5754f\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/979\" target=\"_blank\"\u003e#979\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate email template docs (\u003ca href=\"https://github.com/ory/kratos/commit/1778cb9a293feb2c91c0b1921ab78a0395cdca98\" target=\"_blank\"\u003e1778cb9\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/897\" target=\"_blank\"\u003e#897\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate identity-data-model links (\u003ca href=\"https://github.com/ory/kratos/commit/b5fd9a3a0821215f94da168c9c6f87dceba8c8f4\" target=\"_blank\"\u003eb5fd9a3\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate identity.ID field documentation (\u003ca href=\"https://github.com/ory/kratos/commit/4624f03a5e9249a5449992a1f0b7ec80dc3499fd\" target=\"_blank\"\u003e4624f03\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eSee \u003ca href=\"https://github.com/ory/kratos/discussions/956\" target=\"_blank\"\u003ehttps://github.com/ory/kratos/discussions/956\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate kratos video link (\u003ca href=\"https://github.com/ory/kratos/issues/1073\" target=\"_blank\"\u003e#1073\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/e86178f4ee66e5053e0da2fab2c21ecb2e730ada\" target=\"_blank\"\u003ee86178f\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate login code samples (\u003ca href=\"https://github.com/ory/kratos/commit/695a30f6c80f277676bf04b4665efeb7ea4db618\" target=\"_blank\"\u003e695a30f\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate login code samples (\u003ca href=\"https://github.com/ory/kratos/commit/ce6c75587bea80ef83855d764fed79a9d6c948d3\" target=\"_blank\"\u003ece6c755\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate quickstart samples (\u003ca href=\"https://github.com/ory/kratos/commit/c3fcaba65899d9d46a08ca8b60ec0c010f70b16c\" target=\"_blank\"\u003ec3fcaba\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate recovery code samples (\u003ca href=\"https://github.com/ory/kratos/commit/d9fbb62faff5144f587136935f15d24b6399f29c\" target=\"_blank\"\u003ed9fbb62\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate registration code samples (\u003ca href=\"https://github.com/ory/kratos/commit/317810ffd8ba6faf87f2248263b6c82cf4e9ffd8\" target=\"_blank\"\u003e317810f\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate self-service code samples (\u003ca href=\"https://github.com/ory/kratos/commit/6415011ab83a19972c6f52467055fbdcef23a0cc\" target=\"_blank\"\u003e6415011\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate settings code samples (\u003ca href=\"https://github.com/ory/kratos/commit/bbd6266c22097fae195654957cbab589d04892c7\" target=\"_blank\"\u003ebbd6266\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate verification code samples (\u003ca href=\"https://github.com/ory/kratos/commit/4285dec59a8fc31fa3416b594c765f5da9a9de1c\" target=\"_blank\"\u003e4285dec\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUse correct extension for identity-data-model (\u003ca href=\"https://github.com/ory/kratos/commit/acab3e8b489d9865e4bf0805895f0b7ae9e6f1b8\" target=\"_blank\"\u003eacab3e8\u003c/a\u003e), closes \u003ca href=\"https://github.com//github.com/ory/kratos/pull/1197/issues/issuecomment-819455322\" target=\"_blank\"\u003e/github.com/ory/kratos/pull/1197#issuecomment-819455322\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003e\u003cstrong\u003eprometheus:\u003c/strong\u003e Update codedoc (\u003ca href=\"https://github.com/ory/kratos/commit/47146ea8ce169ee908aa4d33b59a01e9df4bae10\" target=\"_blank\"\u003e47146ea\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eFeatures:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003e\u003cp\u003eAdd email template specification in doc (\u003ca href=\"https://github.com/ory/kratos/issues/898\" target=\"_blank\"\u003e#898\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/4230d9e0fc35c651b0d2cbdbbf9e1f1c514743f8\" target=\"_blank\"\u003e4230d9e\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd error for when no login strategy was found (\u003ca href=\"https://github.com/ory/kratos/commit/6bae66cde362c4e2995c9d06a0d3ffee403feb74\" target=\"_blank\"\u003e6bae66c\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd facebook provider to oidc providers and documentation (\u003ca href=\"https://github.com/ory/kratos/issues/1035\" target=\"_blank\"\u003e#1035\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/905bb032520189212bd88f29641903945ae03608\" target=\"_blank\"\u003e905bb03\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1034\" target=\"_blank\"\u003e#1034\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd FAQ to docs (\u003ca href=\"https://github.com/ory/kratos/issues/1096\" target=\"_blank\"\u003e#1096\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/9c6b68c454f472b26c34e1975b6a67b24b218f47\" target=\"_blank\"\u003e9c6b68c\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd gh login to claims (\u003ca href=\"https://github.com/ory/kratos/commit/49deb2e166362a5d051bc08523ef44425f144bdd\" target=\"_blank\"\u003e49deb2e\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd login strategy text message (\u003ca href=\"https://github.com/ory/kratos/commit/7468c835d4800c207035897fc9962860d8ab7803\" target=\"_blank\"\u003e7468c83\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd more tests for multi domain args (\u003ca href=\"https://github.com/ory/kratos/commit/e99803b62a847bcee52bcd87fa8088124b4deae2\" target=\"_blank\"\u003ee99803b\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd Prometheus monitoring to Public APIs (\u003ca href=\"https://github.com/ory/kratos/issues/1022\" target=\"_blank\"\u003e#1022\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/75a4f1a5472ffd780fed43a7395a191ed495c6e9\" target=\"_blank\"\u003e75a4f1a\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd random delay to login flow (\u003ca href=\"https://github.com/ory/kratos/issues/1088\" target=\"_blank\"\u003e#1088\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/cb9894fefc694a4092215d3981e80f287021542f\" target=\"_blank\"\u003ecb9894f\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/832\" target=\"_blank\"\u003e#832\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd return_url to verification flow (\u003ca href=\"https://github.com/ory/kratos/issues/1149\" target=\"_blank\"\u003e#1149\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/bb99912d823e9bcffa41edf50a01dcae40117fe6\" target=\"_blank\"\u003ebb99912\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1123\" target=\"_blank\"\u003e#1123\u003c/a\u003e \u003ca href=\"https://github.com/ory/kratos/issues/1133\" target=\"_blank\"\u003e#1133\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd sql migrations for new login flow (\u003ca href=\"https://github.com/ory/kratos/commit/e947edf497b36bc576061c9ae38049e84ee48575\" target=\"_blank\"\u003ee947edf\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd sql tracing (\u003ca href=\"https://github.com/ory/kratos/commit/3c4cc1cec170df14331288170a94ada770d3289f\" target=\"_blank\"\u003e3c4cc1c\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd tracing to config schema (\u003ca href=\"https://github.com/ory/kratos/commit/007dde4482d11f22b8527c94b002da675152a872\" target=\"_blank\"\u003e007dde4\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd transporter with host modification (\u003ca href=\"https://github.com/ory/kratos/commit/2c41b81be947f9972638d082105f0f5c83078b91\" target=\"_blank\"\u003e2c41b81\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd workaround template for go openapi (\u003ca href=\"https://github.com/ory/kratos/commit/5d72d10f6c6948c48c5701fe348084a668c8311a\" target=\"_blank\"\u003e5d72d10\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdds slack sogial login (\u003ca href=\"https://github.com/ory/kratos/issues/974\" target=\"_blank\"\u003e#974\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/7c66053390b3086fe7233625038a78431a61e507\" target=\"_blank\"\u003e7c66053\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/953\" target=\"_blank\"\u003e#953\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAllow session cookie name configuration (\u003ca href=\"https://github.com/ory/kratos/commit/77ce3162ba97cf5c516c26ef499d9fa892162f0a\" target=\"_blank\"\u003e77ce316\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/268\" target=\"_blank\"\u003e#268\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAllow specifying sender name in smtp.from_address (\u003ca href=\"https://github.com/ory/kratos/issues/1100\" target=\"_blank\"\u003e#1100\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/5904fe319f75f8138783434d568db6fc7c55b301\" target=\"_blank\"\u003e5904fe3\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eBcrypt algorithm support (\u003ca href=\"https://github.com/ory/kratos/issues/1169\" target=\"_blank\"\u003e#1169\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/b2612eefbad98d29482d364f670549f470d0a6f5\" target=\"_blank\"\u003eb2612ee\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eThis patch adds the ability to use BCrypt instead of Argon2id for password hashing. We recommend using BCrypt for web workloads where password hashing should take around 200ms. For workloads where login takes \u0026gt;= 2 seconds, we recommend to continue using Argon2id.\u003c/p\u003e\n\n\u003cp\u003eTo use bcrypt for password hashing, set your config as follows:\u003c/p\u003e\n\n\u003cpre style=\"word-break: break-all; white-space: pre-wrap\"\u003e\u003ccode\u003ehashers:\n bcrypt:\n cost: 12\n algorithm: bcrypt\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eSwitching the hashing algorithm will not break existing passwords!\u003c/p\u003e\n\n\u003cp\u003eCo-authored-by: Patrik \u003ca href=\"mailto:zepatrik@users.noreply.github.com\" target=\"_blank\"\u003ezepatrik@users.noreply.github.com\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eCheck migrations in health check (\u003ca href=\"https://github.com/ory/kratos/commit/c6ef7ad16b70310c645550f7e41b3c8aff847de3\" target=\"_blank\"\u003ec6ef7ad\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eConfigure domain alias as query param (\u003ca href=\"https://github.com/ory/kratos/commit/9d8563eeb3293c42cce440ad74f025b304cccbbe\" target=\"_blank\"\u003e9d8563e\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eContextualize configuration (\u003ca href=\"https://github.com/ory/kratos/commit/d3d5327a3622318265a063be4782caa25e645a05\" target=\"_blank\"\u003ed3d5327\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eContextualize health checks (\u003ca href=\"https://github.com/ory/kratos/commit/8145a1c9acaeab441e787118d40ccd448ea82fe4\" target=\"_blank\"\u003e8145a1c\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eContextualize http client in cli calls (\u003ca href=\"https://github.com/ory/kratos/commit/3b3ef8f025d75b244d9285036e66f79af7d5ee35\" target=\"_blank\"\u003e3b3ef8f\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eContextualize persitence testers (\u003ca href=\"https://github.com/ory/kratos/commit/64403736ad9f8b264567e1f8eed1af710cab6046\" target=\"_blank\"\u003e6440373\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eCourier foreground worker with \u0026ldquo;kratos courier watch\u0026rdquo; (\u003ca href=\"https://github.com/ory/kratos/issues/1062\" target=\"_blank\"\u003e#1062\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/500b8bacd9fd541afd053f42fec66443cfebabda\" target=\"_blank\"\u003e500b8ba\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1033\" target=\"_blank\"\u003e#1033\u003c/a\u003e \u003ca href=\"https://github.com/ory/kratos/issues/1024\" target=\"_blank\"\u003e#1024\u003c/a\u003e:\u003c/p\u003e\n\n\u003cp\u003eBREACKING CHANGES: This patch moves the courier watcher (responsible for sending mail) to its own foreground worker, which can be executed as a, for example, Kubernetes job.\u003c/p\u003e\n\n\u003cp\u003eIt is still possible to have the previous behaviour which would run the worker as a background task when running \u003ccode\u003ekratos serve\u003c/code\u003e by using the \u003ccode\u003e--watch-courier\u003c/code\u003e flag.\u003c/p\u003e\n\n\u003cp\u003eTo run the foreground worker, use \u003ccode\u003ekratos courier watch -c your/config.yaml\u003c/code\u003e.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eDo not enforce bcrypt 12 for dev envs (\u003ca href=\"https://github.com/ory/kratos/commit/bbf44d887ae5cdb5975516149c74b3ba10896209\" target=\"_blank\"\u003ebbf44d8\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eEmail input validation (\u003ca href=\"https://github.com/ory/kratos/issues/1287\" target=\"_blank\"\u003e#1287\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/cd56b73df363dd37485f07d31fef11fd4d9f40a6\" target=\"_blank\"\u003ecd56b73\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1285\" target=\"_blank\"\u003e#1285\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eExport and add config options (\u003ca href=\"https://github.com/ory/kratos/commit/4391fe572eb6a766afe9808396847ca5fdca07f5\" target=\"_blank\"\u003e4391fe5\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eExpose courier worker (\u003ca href=\"https://github.com/ory/kratos/commit/f50969ecba757dea558e9e8b9dd142f5f564d53a\" target=\"_blank\"\u003ef50969e\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eExpose crdb ui (\u003ca href=\"https://github.com/ory/kratos/commit/504d5181f5e391bb8d67768b314a0348ed252c8b\" target=\"_blank\"\u003e504d518\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eGlobal docs sidebar (\u003ca href=\"https://github.com/ory/kratos/issues/1258\" target=\"_blank\"\u003e#1258\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/71082624e093b8c100e71ae59050f89b35ac20a2\" target=\"_blank\"\u003e7108262\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eImplement and test domain aliasing (\u003ca href=\"https://github.com/ory/kratos/commit/1516a54657df485627251de4e7019bc16353c956\" target=\"_blank\"\u003e1516a54\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eThis patch adds a feature called domain aliasing. For more information, head over to \u003ca href=\"http://ory.sh/docs/kratos/next/guides/multi-domain-cookies\" target=\"_blank\"\u003ehttp://ory.sh/docs/kratos/next/guides/multi-domain-cookies\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eImprove oas spec and fix mobile tests (\u003ca href=\"https://github.com/ory/kratos/commit/4ead2c826a2f1a307e327b9736dd8ac99ef52743\" target=\"_blank\"\u003e4ead2c8\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eImprove sorting of ui fields (\u003ca href=\"https://github.com/ory/kratos/commit/797b49d0175280f85f568014cf3083e9bc42d354\" target=\"_blank\"\u003e797b49d\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eSee \u003ca href=\"https://github.com/ory/kratos/discussions/1196\" target=\"_blank\"\u003ehttps://github.com/ory/kratos/discussions/1196\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eInclude schema (\u003ca href=\"https://github.com/ory/kratos/commit/348a493c9e5381830b76e57cad803a308e6ce53a\" target=\"_blank\"\u003e348a493\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eMake cli commands consumable in Ory Cloud (\u003ca href=\"https://github.com/ory/kratos/issues/926\" target=\"_blank\"\u003e#926\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/fed790b0f71f028f6d92e8ebceee188dbdb20770\" target=\"_blank\"\u003efed790b\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eMigrate to openapi v3 (\u003ca href=\"https://github.com/ory/kratos/commit/595224b1efd5a225702ef236a87f08180a7118b8\" target=\"_blank\"\u003e595224b\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003ePopulate email templates at delivery time, add plaintext defaults (\u003ca href=\"https://github.com/ory/kratos/issues/1155\" target=\"_blank\"\u003e#1155\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/7749c7a75a4386c1fd53db57626355467b698c2f\" target=\"_blank\"\u003e7749c7a\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/1065\" target=\"_blank\"\u003e#1065\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eSort and label nodes with easy to use defaults (\u003ca href=\"https://github.com/ory/kratos/commit/cbec27c957a733411e4c1d511ed5854855b7236e\" target=\"_blank\"\u003ecbec27c\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eOry Kratos takes a guess based on best practices for\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eordering UI nodes (e.g. email, password, submit button)\u003c/li\u003e\n\u003cli\u003egrouping UI nodes (e.g. keep password and oidc nodes together)\u003c/li\u003e\n\u003cli\u003elabeling UI nodes (e.g. \u0026ldquo;Sign in with GitHub\u0026rdquo;)\u003c/li\u003e\n\u003cli\u003eusing the \u0026ldquo;title\u0026rdquo; attribute from the identity schema to label trait fields\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003eThis greatly simplifies front-end code on your end and makes it even easier to integrate with Ory Kratos! If you want a custom experience with e.g. translations or other things you can always adjust this in your UI integration!\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eSupport base64 inline schemas (\u003ca href=\"https://github.com/ory/kratos/commit/815a24890a118f4128ac083241a93d8df27042f7\" target=\"_blank\"\u003e815a248\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eSupport contextual csrf cookies (\u003ca href=\"https://github.com/ory/kratos/commit/957ef38b69fc6ab071b91262736e6c191be3a4b8\" target=\"_blank\"\u003e957ef38\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eSupport domain aliasing in session cookie (\u003ca href=\"https://github.com/ory/kratos/commit/0681c123f2d856ca27caee645dadc9e6e3731d2c\" target=\"_blank\"\u003e0681c12\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eSupport label in oidc config (\u003ca href=\"https://github.com/ory/kratos/commit/a99cdcddaa0c4bd7b679884b232c2ef8f2dcd978\" target=\"_blank\"\u003ea99cdcd\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eSupport retryable CRDB transactions (\u003ca href=\"https://github.com/ory/kratos/commit/f0c21d7e0a6ed85818d0e9025a451cb8cbdee086\" target=\"_blank\"\u003ef0c21d7\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUnix sockets support (\u003ca href=\"https://github.com/ory/kratos/issues/1255\" target=\"_blank\"\u003e#1255\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/ad010de240ddd9219f0cfb2ca3fbb180d2d3a697\" target=\"_blank\"\u003ead010de\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eWeb hooks support (recovery) (\u003ca href=\"https://github.com/ory/kratos/issues/1289\" target=\"_blank\"\u003e#1289\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/3e181fe3d7750a715ab31eb8347fbb4bdb89d6e6\" target=\"_blank\"\u003e3e181fe\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/271\" target=\"_blank\"\u003e#271\u003c/a\u003e:\u003c/p\u003e\n\n\u003cp\u003efeat: web hooks for self-service flows\u003c/p\u003e\n\n\u003cp\u003eThis feature adds the ability to define web-hooks using a mixture of configuration and JsonNet. This allows integration with services like Mailchimp, Stripe, CRMs, and all other APIs that support REST requests. Additional to these new changes it is now possible to define hooks for verification and recovery as well!\u003c/p\u003e\n\n\u003cp\u003eFor more information, head over to the \u003ca href=\"https://www.ory.sh/kratos/docs/self-service/hooks\" target=\"_blank\"\u003ehooks documentation\u003c/a\u003e.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003e\u003cstrong\u003ecourier:\u003c/strong\u003e Allow sending individual messages (\u003ca href=\"https://github.com/ory/kratos/commit/cbb2c0bef63323a177589e9d2a809c84b4f1acdd\" target=\"_blank\"\u003ecbb2c0b\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003e\u003cstrong\u003eoidc:\u003c/strong\u003e Support google hd claim (\u003ca href=\"https://github.com/ory/kratos/issues/1097\" target=\"_blank\"\u003e#1097\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/1f20a5ceba7682719112d24a3b18bf046fb2ac22\" target=\"_blank\"\u003e1f20a5c\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003e\u003cstrong\u003eschema:\u003c/strong\u003e Add totp errors (\u003ca href=\"https://github.com/ory/kratos/commit/a61f8814101401dbb422967e37b6c6c1ae85d113\" target=\"_blank\"\u003ea61f881\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eTests:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eAdd case to ensure correct behavior when verifying a different email address (\u003ca href=\"https://github.com/ory/kratos/issues/999\" target=\"_blank\"\u003e#999\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/f95a117677c9c59436ad10aa8951fe875c39a64f\" target=\"_blank\"\u003ef95a117\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/998\" target=\"_blank\"\u003e#998\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd oasis test case (\u003ca href=\"https://github.com/ory/kratos/commit/f80691b9dd77566857c4284e2639cc94d5b8c333\" target=\"_blank\"\u003ef80691b\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eBump poll interval (\u003ca href=\"https://github.com/ory/kratos/commit/b3dc925a5d43557293745ee81c0ffb3db37b6342\" target=\"_blank\"\u003eb3dc925\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eBump video quality (\u003ca href=\"https://github.com/ory/kratos/commit/b7f8d042646037e1589ae2d03602bd63a5cec2fe\" target=\"_blank\"\u003eb7f8d04\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eBump wait times (\u003ca href=\"https://github.com/ory/kratos/commit/b2e43f8b0b64784f60e5f57d9a0f5d2928c2b891\" target=\"_blank\"\u003eb2e43f8\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eClean up hydra env before restart (\u003ca href=\"https://github.com/ory/kratos/commit/cf494149e6a46b15e3b174185e1e87cfcd6f9f7a\" target=\"_blank\"\u003ecf49414\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eLonger wait times (\u003ca href=\"https://github.com/ory/kratos/commit/4bec9ef50f14f22342a311f09ba1b59cde47befc\" target=\"_blank\"\u003e4bec9ef\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eReliable migration tests on crdb (\u003ca href=\"https://github.com/ory/kratos/commit/2e3764ba66c156d810de66fba2b0e142dced6f4d\" target=\"_blank\"\u003e2e3764b\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRemove old noop test (\u003ca href=\"https://github.com/ory/kratos/commit/16dca3f78b2021c09ec83e81ab6d2e68c42ca081\" target=\"_blank\"\u003e16dca3f\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eResolve compile issues (\u003ca href=\"https://github.com/ory/kratos/commit/c1b5ba42171ec522579df9dfaff27b5b74a1566a\" target=\"_blank\"\u003ec1b5ba4\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eResolve flaky tests (\u003ca href=\"https://github.com/ory/kratos/commit/cb670a854cbb09b8437bfed7e4a6908ff6dcfd27\" target=\"_blank\"\u003ecb670a8\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eResolve json parser test regression (\u003ca href=\"https://github.com/ory/kratos/commit/a1b9b9a95d58583dc7ecf6d2a501da52f84dd6bb\" target=\"_blank\"\u003ea1b9b9a\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eResolve login integration regressions (\u003ca href=\"https://github.com/ory/kratos/commit/388b5b27d6dee7770e5f37d6d83c532044a4e984\" target=\"_blank\"\u003e388b5b2\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eResolve migration regression (\u003ca href=\"https://github.com/ory/kratos/commit/2051a716cb4b8cf334dd65f2ccddb31e5fbed545\" target=\"_blank\"\u003e2051a71\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eResolve more json parser test regressions (\u003ca href=\"https://github.com/ory/kratos/commit/ff791c41a1d9ce25af4e883469d3f8c0ef9eb302\" target=\"_blank\"\u003eff791c4\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eResolve regression (\u003ca href=\"https://github.com/ory/kratos/commit/e2b0ad3c1845da80f078b11b327b9a0376cbb7c5\" target=\"_blank\"\u003ee2b0ad3\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUpdate schema tests for webhooks (\u003ca href=\"https://github.com/ory/kratos/commit/d1ddfa80742728b28dc5710ca5b6e7282a2dec55\" target=\"_blank\"\u003ed1ddfa8\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ee2e:\u003c/strong\u003e Significantly reduce wait and idle times (\u003ca href=\"https://github.com/ory/kratos/commit/f525fc53afec6f5232ce507fe25ddec1b9069196\" target=\"_blank\"\u003ef525fc5\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eResolve more regressions (\u003ca href=\"https://github.com/ory/kratos/commit/c5a23af81427480088651833d904e3403a969fab\" target=\"_blank\"\u003ec5a23af\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eResolve order regression (\u003ca href=\"https://github.com/ory/kratos/commit/40a849ca35f4700185322e9ac4f6a4b70132851c\" target=\"_blank\"\u003e40a849c\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eResolve regression (\u003ca href=\"https://github.com/ory/kratos/commit/f0c9e5ff105d76d6bc9478c98522b2440c7181df\" target=\"_blank\"\u003ef0c9e5f\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eResolve regressions (\u003ca href=\"https://github.com/ory/kratos/commit/4b9da3c9d98d40f7b71a56c51543fc115974630d\" target=\"_blank\"\u003e4b9da3c\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eResolve stub regressions (\u003ca href=\"https://github.com/ory/kratos/commit/82650cf1843f6bfde015f556f4452a7b6fd52b11\" target=\"_blank\"\u003e82650cf\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eResolve test migrations (\u003ca href=\"https://github.com/ory/kratos/commit/de0b65d96daef0e31c12b3b6915f283a8e71244b\" target=\"_blank\"\u003ede0b65d\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eResolve test regression issues (\u003ca href=\"https://github.com/ory/kratos/commit/ccf9feddade11f9fcaaf1c37dd3efeb2c4df6649\" target=\"_blank\"\u003eccf9fed\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSpeed up tests (\u003ca href=\"https://github.com/ory/kratos/commit/a16737cccc36a14444711660f1737913ffd7ba01\" target=\"_blank\"\u003ea16737c\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUpdate test description (\u003ca href=\"https://github.com/ory/kratos/commit/55fb37f62fc3ab7c0d5324ed31ef3e7f66a73aa2\" target=\"_blank\"\u003e55fb37f\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUse bcrypt cost 4 to reduce CI times (\u003ca href=\"https://github.com/ory/kratos/commit/cabe97d0656858fd1ee0442b40881417e91294f3\" target=\"_blank\"\u003ecabe97d\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUse fast bcrypt for e2e (\u003ca href=\"https://github.com/ory/kratos/commit/d90cf13230632e76eb74965c0945573b4f2e98ff\" target=\"_blank\"\u003ed90cf13\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eUnclassified:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eFormat (\u003ca href=\"https://github.com/ory/kratos/commit/e4b7e79f4ee91dadfcd008a5b3e318b6bfedad10\" target=\"_blank\"\u003ee4b7e79\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFormat (\u003ca href=\"https://github.com/ory/kratos/commit/193d2668ae0955a1346390057539a8b796d17afd\" target=\"_blank\"\u003e193d266\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFormat (\u003ca href=\"https://github.com/ory/kratos/commit/1ebfbdea75f27c8eeafa7d3aff45de133ea340bb\" target=\"_blank\"\u003e1ebfbde\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFormat (\u003ca href=\"https://github.com/ory/kratos/commit/ba1eeef4f232c4ab59343a2ca3c7cf0eb6dfd110\" target=\"_blank\"\u003eba1eeef\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFormat (\u003ca href=\"https://github.com/ory/kratos/commit/ada5dbb58c45502b8275850a3bc0876debc66888\" target=\"_blank\"\u003eada5dbb\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eInitial documentation tests via Text-Runner (\u003ca href=\"https://github.com/ory/kratos/issues/567\" target=\"_blank\"\u003e#567\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/c30eb26f76ab70a6098c0b40c9a04726d36d72f2\" target=\"_blank\"\u003ec30eb26\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix: resolve clidoc issues (#976) (\u003ca href=\"https://github.com/ory/kratos/commit/346bc73921655d52861b8803eb3351c4205657ee\" target=\"_blank\"\u003e346bc73\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/976\" target=\"_blank\"\u003e#976\u003c/a\u003e \u003ca href=\"https://github.com/ory/kratos/issues/951\" target=\"_blank\"\u003e#951\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFormat (\u003ca href=\"https://github.com/ory/kratos/commit/17a0bf5872b33eac615afc675c7d92d7c7441b2e\" target=\"_blank\"\u003e17a0bf5\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e:bug: fix ory home directory path (#897) (\u003ca href=\"https://github.com/ory/kratos/commit/2fca2bedaa907691bef324c11545e007b51d4881\" target=\"_blank\"\u003e2fca2be\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/897\" target=\"_blank\"\u003e#897\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix typo in config schema (\u003ca href=\"https://github.com/ory/kratos/commit/16337f13e4388a715c8109c29cf198c82a848a16\" target=\"_blank\"\u003e16337f1\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eBug Fixes:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003e\u003cp\u003eCSRF token is required when using the Revoke Session API endpoint (\u003ca href=\"https://github.com/ory/kratos/issues/839\" target=\"_blank\"\u003e#839\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/d3218a0f23de7293b0a4a966ad21369a92b68b1a\" target=\"_blank\"\u003ed3218a0\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/838\" target=\"_blank\"\u003e#838\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eIncorrect home path (\u003ca href=\"https://github.com/ory/kratos/issues/848\" target=\"_blank\"\u003e#848\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/5265af00c92fe505819300caddfcc64004d45c65\" target=\"_blank\"\u003e5265af0\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eMake password policy configurable (\u003ca href=\"https://github.com/ory/kratos/issues/888\" target=\"_blank\"\u003e#888\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/7a00483908bb623efdf281e76005c4485ea6b1ab\" target=\"_blank\"\u003e7a00483\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/450\" target=\"_blank\"\u003e#450\u003c/a\u003e \u003ca href=\"https://github.com/ory/kratos/issues/316\" target=\"_blank\"\u003e#316\u003c/a\u003e:\u003c/p\u003e\n\n\u003cp\u003eAllows configuring password breach thresholds and optionally enforces checks against the HIBP API.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRemove obsolete types (\u003ca href=\"https://github.com/ory/kratos/issues/887\" target=\"_blank\"\u003e#887\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/b8bac7aa56c16cd98f76a95a5e0d01fb1bbde6b7\" target=\"_blank\"\u003eb8bac7a\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/716\" target=\"_blank\"\u003e#716\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eSet samesite attribute to lax if in dev mode (\u003ca href=\"https://github.com/ory/kratos/issues/824\" target=\"_blank\"\u003e#824\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/91d6698e4ce05ee59bb72fc84b54af9d1d204b41\" target=\"_blank\"\u003e91d6698\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/821\" target=\"_blank\"\u003e#821\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUse working cache-control header for cdn/proxies/cache (\u003ca href=\"https://github.com/ory/kratos/issues/869\" target=\"_blank\"\u003e#869\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/d8e3d40001ffdc64da2288f3cffd53cf3bfdf781\" target=\"_blank\"\u003ed8e3d40\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/601\" target=\"_blank\"\u003e#601\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eCode Generation:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003ePin v0.5.5-alpha.1 release commit (\u003ca href=\"https://github.com/ory/kratos/commit/83aedcb885acb96c5deb39fff675d5f0528af32d\" target=\"_blank\"\u003e83aedcb\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eDocumentation:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003e\u003cp\u003eAdd contributing to sidebar (\u003ca href=\"https://github.com/ory/kratos/issues/866\" target=\"_blank\"\u003e#866\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/44f33f97d43f2a3c553a65ebb2986e0731c0e5f2\" target=\"_blank\"\u003e44f33f9\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eThe same change as in \u003ca href=\"https://github.com/ory/hydra/pull/2209\" target=\"_blank\"\u003ehttps://github.com/ory/hydra/pull/2209\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd newsletter to config (\u003ca href=\"https://github.com/ory/kratos/commit/1735ca2ced104971de4e97524d0a23d57ba045f2\" target=\"_blank\"\u003e1735ca2\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eAdd recovery flow (\u003ca href=\"https://github.com/ory/kratos/issues/868\" target=\"_blank\"\u003e#868\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/d95cfe9759d3ffc08c24048a064c0c800abdf4b4\" target=\"_blank\"\u003ed95cfe9\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/864\" target=\"_blank\"\u003e#864\u003c/a\u003e:\u003c/p\u003e\n\n\u003cp\u003eAdded a short section for the recovery flow on managing-user-identities.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix account recovery click instruction (\u003ca href=\"https://github.com/ory/kratos/issues/870\" target=\"_blank\"\u003e#870\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/383de9ecf6f6504dbb9c20fb4cb984e934f0751e\" target=\"_blank\"\u003e383de9e\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix broken link (\u003ca href=\"https://github.com/ory/kratos/issues/893\" target=\"_blank\"\u003e#893\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/dec38a28964aaa13827d356e5bfa12c2a6d1400e\" target=\"_blank\"\u003edec38a2\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/835\" target=\"_blank\"\u003e#835\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix oidc config example structure (\u003ca href=\"https://github.com/ory/kratos/issues/845\" target=\"_blank\"\u003e#845\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/c102a6844db29f994b67d23bb04e64ee71376264\" target=\"_blank\"\u003ec102a68\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix redirect (\u003ca href=\"https://github.com/ory/kratos/issues/802\" target=\"_blank\"\u003e#802\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/b86878229f343e6b11521596b04040f892d1e2c3\" target=\"_blank\"\u003eb868782\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix typo (\u003ca href=\"https://github.com/ory/kratos/issues/847\" target=\"_blank\"\u003e#847\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/9b3da9f0fe2ce71743115844d8c91a1dc9c4cbae\" target=\"_blank\"\u003e9b3da9f\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix typo (\u003ca href=\"https://github.com/ory/kratos/issues/881\" target=\"_blank\"\u003e#881\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/3078293717a2ce21c4b939de4c2c4886c75303b5\" target=\"_blank\"\u003e3078293\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eFix typo MKFA to MFA (\u003ca href=\"https://github.com/ory/kratos/issues/826\" target=\"_blank\"\u003e#826\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/a5613d08aa21f90f4d192e5663ba4977b3de16c3\" target=\"_blank\"\u003ea5613d0\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eRemove workaround note (\u003ca href=\"https://github.com/ory/kratos/issues/886\" target=\"_blank\"\u003e#886\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/05409bc13f527398e3de01f29437e5d4353ef8d4\" target=\"_blank\"\u003e05409bc\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/718\" target=\"_blank\"\u003e#718\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eSwagger specs for selfservice settings browser flow (\u003ca href=\"https://github.com/ory/kratos/issues/825\" target=\"_blank\"\u003e#825\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/28d50f45ab14d561609be7047cac13902394b547\" target=\"_blank\"\u003e28d50f4\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate oidc provider with json conf support (\u003ca href=\"https://github.com/ory/kratos/issues/833\" target=\"_blank\"\u003e#833\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/670eb37d19674f33a36402cd9a88d61ca7327751\" target=\"_blank\"\u003e670eb37\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eFeatures:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eAdd return_to parameter to logout flow (\u003ca href=\"https://github.com/ory/kratos/issues/823\" target=\"_blank\"\u003e#823\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/1c146dd21d616a56f510019abadd37402782bb39\" target=\"_blank\"\u003e1c146dd\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/702\" target=\"_blank\"\u003e#702\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd selinux compatible quickstart config (\u003ca href=\"https://github.com/ory/kratos/issues/889\" target=\"_blank\"\u003e#889\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/0f879481df209ed96b778799adcc2a9424449b37\" target=\"_blank\"\u003e0f87948\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/831\" target=\"_blank\"\u003e#831\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eTests:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eEnsure registration runs only once (\u003ca href=\"https://github.com/ory/kratos/issues/872\" target=\"_blank\"\u003e#872\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/5ffc036ac82f36ad6ef499e217971275a35fc23a\" target=\"_blank\"\u003e5ffc036\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eUnclassified:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003edocs: fix link and typo in Configuring Cookies (#883) (\u003ca href=\"https://github.com/ory/kratos/commit/c51ed6b789d2e3a8fe4e93565c3bded37d298f98\" target=\"_blank\"\u003ec51ed6b\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/883\" target=\"_blank\"\u003e#883\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eBug Fixes:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003e\u003cp\u003eCase in settings handler method (\u003ca href=\"https://github.com/ory/kratos/issues/798\" target=\"_blank\"\u003e#798\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/83eb4e0021621014d2b543e57a01401381f07fe4\" target=\"_blank\"\u003e83eb4e0\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eForce brew install statement (\u003ca href=\"https://github.com/ory/kratos/issues/796\" target=\"_blank\"\u003e#796\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/ad542ad5919205ac26a757145474e5a46f3937ec\" target=\"_blank\"\u003ead542ad\u003c/a\u003e):\u003c/p\u003e\n\n\u003cp\u003eCloses \u003ca href=\"https://github.com/ory/homebrew-kratos/issues/1\" target=\"_blank\"\u003ehttps://github.com/ory/homebrew-kratos/issues/1\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eCode Generation:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003ePin v0.5.4-alpha.1 release commit (\u003ca href=\"https://github.com/ory/kratos/commit/b02926c42aee2748bc37ce2600596bd0c2537a0d\" target=\"_blank\"\u003eb02926c\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eCode Refactoring:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eMove pkger and ioutil helpers to ory/x (\u003ca href=\"https://github.com/ory/kratos/commit/60a0fc449d90ead6065ca00926536a989d8b2a2b\" target=\"_blank\"\u003e60a0fc4\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eDocumentation:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eFix another broken link (\u003ca href=\"https://github.com/ory/kratos/commit/15bae9f893c2e2910167326d987455246c110001\" target=\"_blank\"\u003e15bae9f\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix broken links (\u003ca href=\"https://github.com/ory/kratos/issues/795\" target=\"_blank\"\u003e#795\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/0ab0e7eca8e95d6c26d028c177cbbd1f06b68871\" target=\"_blank\"\u003e0ab0e7e\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/793\" target=\"_blank\"\u003e#793\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix broken relative link (\u003ca href=\"https://github.com/ory/kratos/issues/812\" target=\"_blank\"\u003e#812\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/b32b173fe30b7c5c43700abfa4ddb3409a33556b\" target=\"_blank\"\u003eb32b173\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix links (\u003ca href=\"https://github.com/ory/kratos/issues/800\" target=\"_blank\"\u003e#800\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/5fcc272e625de9e583b2ec24d5679895a6d24c1b\" target=\"_blank\"\u003e5fcc272\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix oidc config examples (\u003ca href=\"https://github.com/ory/kratos/issues/799\" target=\"_blank\"\u003e#799\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/8a4f480121995d9899668f037382086fcdd2da4c\" target=\"_blank\"\u003e8a4f480\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix self-service recovery flow typo (\u003ca href=\"https://github.com/ory/kratos/issues/807\" target=\"_blank\"\u003e#807\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/800110d87c9df70a5ec79b58d9fcb9ae39ff76b9\" target=\"_blank\"\u003e800110d\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRemove duplicate words \u0026amp; fix spelling (\u003ca href=\"https://github.com/ory/kratos/issues/810\" target=\"_blank\"\u003e#810\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/4e1b96667d9f08dbafeb2f5ce144ca43309de8e0\" target=\"_blank\"\u003e4e1b966\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRemove leftover category from reference sidebar (\u003ca href=\"https://github.com/ory/kratos/issues/813\" target=\"_blank\"\u003e#813\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/94fde5101d00b9e1f7228e9d122ef0a8e4719355\" target=\"_blank\"\u003e94fde51\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUse correct links (\u003ca href=\"https://github.com/ory/kratos/issues/797\" target=\"_blank\"\u003e#797\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/a4de29399e4f1b5d0a33acc85478f2d38579a174\" target=\"_blank\"\u003ea4de293\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eFeatures:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003e\u003cp\u003eAdd helper for choosing argon2 parameters (\u003ca href=\"https://github.com/ory/kratos/issues/803\" target=\"_blank\"\u003e#803\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/ca5a69b798635d0e5361fd5b0cc369b035dca738\" target=\"_blank\"\u003eca5a69b\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/723\" target=\"_blank\"\u003e#723\u003c/a\u003e \u003ca href=\"https://github.com/ory/kratos/issues/572\" target=\"_blank\"\u003e#572\u003c/a\u003e \u003ca href=\"https://github.com/ory/kratos/issues/647\" target=\"_blank\"\u003e#647\u003c/a\u003e:\u003c/p\u003e\n\n\u003cp\u003eThis patch adds the new command \u0026ldquo;hashers argon2 calibrate\u0026rdquo; which allows one to pick the desired hashing time for password hashing and then chooses the optimal parameters for the hardware the command is running on:\u003c/p\u003e\n\n\u003cpre style=\"word-break: break-all; white-space: pre-wrap\"\u003e\u003ccode\u003e$ kratos hashers argon2 calibrate 500ms\nIncreasing memory to get over 500ms:\n took 2.846592732s in try 0\n took 6.006488824s in try 1\n took 4.42657975s with 4.00GB of memory\n[...]\nDecreasing iterations to get under 500ms:\n took 484.257775ms in try 0\n took 488.784192ms in try 1\n took 486.534204ms with 3 iterations\nSettled on 3 iterations.\n\n{\n \u0026quot;memory\u0026quot;: 1048576,\n \u0026quot;iterations\u0026quot;: 3,\n \u0026quot;parallelism\u0026quot;: 32,\n \u0026quot;salt_length\u0026quot;: 16,\n \u0026quot;key_length\u0026quot;: 32\n}\n\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eBug Fixes:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003e\u003cp\u003eAdd \u0026ldquo;x-session-token\u0026rdquo; to default allowed headers (\u003ca href=\"https://github.com/ory/kratos/commit/3c912e4c7d46fd45c00cabb68ed7770bd44f7d07\" target=\"_blank\"\u003e3c912e4\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eDo not set cookies on api endpoints (\u003ca href=\"https://github.com/ory/kratos/commit/2f67c28718856ea03ea2effa89b28a8c4b3b8ae0\" target=\"_blank\"\u003e2f67c28\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eDo not set csrf cookies on potential api endpoints (\u003ca href=\"https://github.com/ory/kratos/commit/4d97a95d084ea99f5aca158609e197acd256cdd7\" target=\"_blank\"\u003e4d97a95\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eIgnore unsupported migration dialects (\u003ca href=\"https://github.com/ory/kratos/commit/12bb8d14ae1edef18591996411be67d5693e5101\" target=\"_blank\"\u003e12bb8d1\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/778\" target=\"_blank\"\u003e#778\u003c/a\u003e:\u003c/p\u003e\n\n\u003cp\u003eSkips sqlite3 migrations when support is lacking.\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eImprove semver regex (\u003ca href=\"https://github.com/ory/kratos/commit/584c0b5043e85e88ac2648cf699d60fed3e775a9\" target=\"_blank\"\u003e584c0b5\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eProperly set nosurf context even when ignored (\u003ca href=\"https://github.com/ory/kratos/commit/0dcb774157bcbfd41a5d9df3914c31162226da75\" target=\"_blank\"\u003e0dcb774\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUpdate cypress (\u003ca href=\"https://github.com/ory/kratos/commit/ba8b1729477233f79d099e5d7b397430ac1c6ace\" target=\"_blank\"\u003eba8b172\u003c/a\u003e)\u003c/p\u003e\u003c/li\u003e\n\n\u003cli\u003e\u003cp\u003eUse correct regex for version replacement (\u003ca href=\"https://github.com/ory/kratos/commit/ce870ababdf089344a9428d3a405e18504a3c906\" target=\"_blank\"\u003ece870ab\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/787\" target=\"_blank\"\u003e#787\u003c/a\u003e\u003c/p\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eCode Generation:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003ePin v0.5.3-alpha.1 release commit (\u003ca href=\"https://github.com/ory/kratos/commit/64dc91af54cdf3eba158a50690240cdc8f7cb43b\" target=\"_blank\"\u003e64dc91a\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eDocumentation:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eFix docosaurus admonitions (\u003ca href=\"https://github.com/ory/kratos/issues/788\" target=\"_blank\"\u003e#788\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/281a7c9289570d4bee33447655281b610cbe7e52\" target=\"_blank\"\u003e281a7c9\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePin download script version (\u003ca href=\"https://github.com/ory/kratos/commit/e4137a6a41d68b1480af2075bda8c5f46c42cd22\" target=\"_blank\"\u003ee4137a6\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRemove trailing garbage from quickstart (\u003ca href=\"https://github.com/ory/kratos/issues/787\" target=\"_blank\"\u003e#787\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/7e709242ada28b7781c6ace272f60f9d1b9d5b2f\" target=\"_blank\"\u003e7e70924\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eFeatures:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eImprove makefile install process and update deps (\u003ca href=\"https://github.com/ory/kratos/commit/d1eb37f5d9d0f16e7864b5f8f08a44ba80853fa5\" target=\"_blank\"\u003ed1eb37f\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eTests:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eAdd e2e tests for mobile (\u003ca href=\"https://github.com/ory/kratos/commit/d481d51f5f4de96cbbc7c347f5dbff381b44462d\" target=\"_blank\"\u003ed481d51\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd option to disable csrf protection in apis (\u003ca href=\"https://github.com/ory/kratos/commit/a0077f12adf94ff428b502b69bbb0eaafd05be66\" target=\"_blank\"\u003ea0077f1\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eBump wait time (\u003ca href=\"https://github.com/ory/kratos/commit/7a719e17c5641f4df47314f6f0ac2cf73dddc8bb\" target=\"_blank\"\u003e7a719e1\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eInstall expo-cli globally (\u003ca href=\"https://github.com/ory/kratos/commit/db21cfa1c589a2dab829a4c8eaf1db15d14d965e\" target=\"_blank\"\u003edb21cfa\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eInstall expo-cli in cci config with sudo (\u003ca href=\"https://github.com/ory/kratos/commit/d255f462402f2d2c2278dcba1a139d0064343b22\" target=\"_blank\"\u003ed255f46\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eLog wait-on output (\u003ca href=\"https://github.com/ory/kratos/commit/62b5ba92d56e9f6b98adb8fb9c4daff03be08f2e\" target=\"_blank\"\u003e62b5ba9\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eOutput web server address (\u003ca href=\"https://github.com/ory/kratos/commit/cb41ca78367b1943d230fa9ac116fcf3cf69b1c1\" target=\"_blank\"\u003ecb41ca7\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eResolve csrf test issues in settings (\u003ca href=\"https://github.com/ory/kratos/commit/ef8ba7dc93d6ba84f22b7aa65d00797e33b520a3\" target=\"_blank\"\u003eef8ba7d\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eResolve test panic (\u003ca href=\"https://github.com/ory/kratos/commit/6f6461fe3690576015ded9146c065a1e5d950be1\" target=\"_blank\"\u003e6f6461f\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRevert delay increase and improve install scripts (\u003ca href=\"https://github.com/ory/kratos/commit/1eafcaa86be194e412b0470a759bff6afc6c21af\" target=\"_blank\"\u003e1eafcaa\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eBug Fixes:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eAdd debug quickstart yml (\u003ca href=\"https://github.com/ory/kratos/issues/780\" target=\"_blank\"\u003e#780\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/16e6b4d76d297182ea9a1f5dc6367570f02f7b42\" target=\"_blank\"\u003e16e6b4d\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eGracefully handle double slashes in URLs (\u003ca href=\"https://github.com/ory/kratos/commit/aeb941477910b5ab54429a6aab7a3e1e388c48c5\" target=\"_blank\"\u003eaeb9414\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/779\" target=\"_blank\"\u003e#779\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eMerge gobuffalo CGO fix (\u003ca href=\"https://github.com/ory/kratos/commit/fea2e77ca0f9b20185c7a7704854fdcf29b7ab33\" target=\"_blank\"\u003efea2e77\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRemove obsolete recovery_token and add link to schema (\u003ca href=\"https://github.com/ory/kratos/commit/acf6ac4e11c755e56c7d40728088257de367f7ff\" target=\"_blank\"\u003eacf6ac4\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eReturn correct error in login csrf (\u003ca href=\"https://github.com/ory/kratos/commit/dd9cab0e02400c88e89877f755f03c6179013123\" target=\"_blank\"\u003edd9cab0\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/785\" target=\"_blank\"\u003e#785\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUse correct assert package (\u003ca href=\"https://github.com/ory/kratos/commit/76be5b0a5d94c251f5f07eee9f700ec11b341e2e\" target=\"_blank\"\u003e76be5b0\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eCode Generation:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003ePin v0.5.2-alpha.1 release commit (\u003ca href=\"https://github.com/ory/kratos/commit/79fcd8a6949886f847f7be0c9ba2aba7554ab204\" target=\"_blank\"\u003e79fcd8a\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eDocumentation:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eSmall improvements to discord oidc provider guide (\u003ca href=\"https://github.com/ory/kratos/issues/783\" target=\"_blank\"\u003e#783\u003c/a\u003e) (\u003ca href=\"https://github.com/ory/kratos/commit/6a3c45330885eb95015fa7ee9b58a72c38132499\" target=\"_blank\"\u003e6a3c453\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp\u003e\u003cstrong\u003eTests:\u003c/strong\u003e\u003c/p\u003e\n\n\u003cul\u003e\n\u003cli\u003eAdd tests for csrf behavior (\u003ca href=\"https://github.com/ory/kratos/commit/48993e2c496fb8af7e7b9e2752ba7078a134a75a\" target=\"_blank\"\u003e48993e2\u003c/a\u003e), closes \u003ca href=\"https://github.com/ory/kratos/issues/785\" target=\"_blank\"\u003e#785\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eMark link as enabled in e2e test (\u003ca href=\"https://github.com/ory/kratos/commit/c214b81a7026b06aaca062b2aa77951d01b0e237\" target=\"_blank\"\u003ec214b81\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eResolve schema test regression (\u003ca href=\"https://github.com/ory/kratos/commit/bb7af1b759d6c812755956ef872bcbd31b9c50be\" target=\"_blank\"\u003ebb7af1b\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/span\u003e\n \u003c/p\u003e\n \u003c/div\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n\n \u003ctr\u003e\n \u003ctd\n align=\"left\"\n class=\"x m\"\n style=\"\n font-size: 0;\n padding: 0;\n padding-bottom: 16px;\n word-break: break-word;\n \"\n \u003e\n \u003cdiv\n style=\"\n font-family: Inter, Arial,\n sans-serif;\n font-size: 16px;\n line-height: 28px;\n text-align: left;\n color: #000000;\n \"\n \u003e\n \u003cp\n style=\"\n margin: 0;\n text-align: left;\n \"\n \u003e\n \u003cspan\n style=\"\n mso-line-height-rule: exactly;\n font-size: 16px;\n font-family: Inter, Arial,\n sans-serif;\n font-weight: 400;\n color: #616161;\n line-height: 28px;\n \"\n \u003eChanges requiring your attention may have been introduced since the last release, please read the\u0026nbsp;\u003ca style=\"color:#3d53f5\" href=\"https://github.com/ory/ory/kratos/blob/master/CHANGELOG.md\" target=\"_blank\"\u003echangelog\u003c/a\u003e\u0026nbsp;with care.\n \u003c/span\u003e\n \u003c/p\u003e\n \u003c/div\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\n class=\"s m\"\n style=\"\n font-size: 0;\n padding: 0;\n padding-bottom: 16px;\n word-break: break-word;\n \"\n \u003e\n \u003cdiv\n style=\"\n height: 4px;\n line-height: 4px;\n \"\n \u003e\n \u0026#8202;\n \u003c/div\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\n align=\"left\"\n class=\"i fw-1\"\n style=\"\n font-size: 0;\n padding: 0;\n padding-bottom: 0;\n word-break: break-word;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"\n border-collapse: collapse;\n border-spacing: 0;\n \"\n class=\"fwm\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n style=\"width: 440px\"\n class=\"fwm\"\n \u003e\n \u003cimg\n alt=\"\"\n height=\"auto\"\n src=\"https://f002.backblazeb2.com/file/emailify/06243b93e25d257b7fbf205634f697bb.png\"\n style=\"\n border: 0;\n border-radius: 10px 10px\n 10px 10px;\n display: block;\n outline: none;\n text-decoration: none;\n height: auto;\n width: 100%;\n font-size: 13px;\n \"\n width=\"440\"\n /\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n \n \u003cdiv\n class=\"xc16 ogf g mb-16\"\n style=\"\n font-size: 0;\n text-align: left;\n direction: ltr;\n display: inline-block;\n vertical-align: top;\n width: 100%;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd style=\"vertical-align: top; padding: 0\"\u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n \n \u003cdiv\n class=\"xc32 ogf\"\n style=\"\n font-size: 0;\n text-align: left;\n direction: ltr;\n display: inline-block;\n vertical-align: middle;\n width: 100%;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd style=\"vertical-align: middle; padding: 0 0 0 0\"\u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n align=\"left\"\n class=\"i hm-1\"\n style=\"\n font-size: 0;\n padding: 0;\n word-break: break-word;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"\n border-collapse: collapse;\n border-spacing: 0;\n \"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd style=\"width: 32px\"\u003e\n \u003cimg\n alt=\"\"\n height=\"auto\"\n src=\"https://f002.backblazeb2.com/file/emailify/150a8c06dcaa45901e3887296457cc12.jpg\"\n style=\"\n border: 0;\n border-radius: 0;\n display: block;\n outline: none;\n text-decoration: none;\n height: auto;\n width: 100%;\n font-size: 13px;\n \"\n width=\"32\"\n /\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n \n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n\n \n \u003cdiv\n class=\"r pr-16 pl-16\"\n style=\"\n background: #eeeeee;\n background-color: #eeeeee;\n margin: 0px auto;\n border-radius: 0;\n max-width: 1200px;\n \"\n \u003e\n \u003ctable\n align=\"center\"\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"\n background: #eeeeee;\n background-color: #eeeeee;\n width: 100%;\n border-radius: 0;\n \"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n style=\"\n border: none;\n direction: ltr;\n font-size: 0;\n padding: 32px 32px 48px 32px;\n text-align: left;\n \"\n \u003e\n \n \u003cdiv\n class=\"xc32 ogf m\"\n style=\"\n font-size: 0;\n text-align: left;\n direction: ltr;\n display: inline-block;\n vertical-align: middle;\n width: 100%;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd style=\"vertical-align: middle; padding: 0 0 0 0\"\u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n align=\"left\"\n class=\"i hm-1\"\n style=\"\n font-size: 0;\n padding: 0;\n word-break: break-word;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"\n border-collapse: collapse;\n border-spacing: 0;\n \"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd style=\"width: 32px\"\u003e\n \u003cimg\n alt=\"\"\n height=\"auto\"\n src=\"https://f002.backblazeb2.com/file/emailify/c026cf429700701f40428f478d349306.jpg\"\n style=\"\n border: 0;\n border-radius: 0;\n display: block;\n outline: none;\n text-decoration: none;\n height: auto;\n width: 100%;\n font-size: 13px;\n \"\n width=\"32\"\n /\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n \n \u003cdiv\n class=\"xc16 ogf g mb-16\"\n style=\"\n font-size: 0;\n text-align: left;\n direction: ltr;\n display: inline-block;\n vertical-align: top;\n width: 100%;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd style=\"vertical-align: top; padding: 0\"\u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n \n \u003cdiv\n class=\"xc440 ogf m c\"\n style=\"\n font-size: 0;\n text-align: left;\n direction: ltr;\n display: inline-block;\n vertical-align: middle;\n width: 100%;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"\n background-color: transparent;\n border: none;\n vertical-align: middle;\n \"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n align=\"left\"\n class=\"x m\"\n style=\"\n font-size: 0;\n padding: 0;\n padding-bottom: 16px;\n word-break: break-word;\n \"\n \u003e\n \u003cdiv\n style=\"\n font-family: Inter, Arial, sans-serif;\n font-size: 31px;\n line-height: 48px;\n text-align: left;\n color: #000000;\n \"\n \u003e\n \u003cp style=\"margin: 0; text-align: left\"\u003e\n \u003cspan\n style=\"\n mso-line-height-rule: exactly;\n font-size: 31px;\n font-family: Inter, Arial, sans-serif;\n font-weight: 400;\n color: #171717;\n line-height: 48px;\n \"\n \u003eYour opinion matters!\u003c/span\n \u003e\n \u003c/p\u003e\n \u003cp style=\"margin: 0\"\u003e\n \u003cspan\n style=\"\n mso-line-height-rule: exactly;\n font-size: 31px;\n font-family: Inter, Arial, sans-serif;\n font-weight: 400;\n color: #171717;\n line-height: 48px;\n \"\n \u003e\u003c/span\n \u003e\u003cspan\n style=\"\n mso-line-height-rule: exactly;\n font-size: 31px;\n font-family: Inter, Arial, sans-serif;\n font-weight: 400;\n color: #3d53f5;\n line-height: 48px;\n \"\n \u003eOry usage survey\u003c/span\n \u003e\n \u003c/p\u003e\n \u003c/div\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\n class=\"s m\"\n style=\"\n font-size: 0;\n padding: 0;\n padding-bottom: 16px;\n word-break: break-word;\n \"\n \u003e\n \u003cdiv style=\"height: 4px; line-height: 4px\"\u003e\n \u0026#8202;\n \u003c/div\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\n align=\"left\"\n vertical-align=\"middle\"\n class=\"b\"\n style=\"\n font-size: 0;\n padding: 0;\n padding-bottom: 0;\n word-break: break-word;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"\n border-collapse: separate;\n width: 132px;\n line-height: 100%;\n \"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n align=\"center\"\n bgcolor=\"#3d53f5\"\n style=\"\n border: none;\n border-radius: 0;\n cursor: auto;\n mso-padding-alt: 12px 0px 12px 0px;\n background: #3d53f5;\n \"\n valign=\"middle\"\n \u003e\n \u003ca\n href=\"https://form.typeform.com/to/Igq7038O\"\n style=\"\n display: inline-block;\n width: 132px;\n background: #3d53f5;\n color: #ffffff;\n font-family: Inter, Arial, sans-serif;\n font-size: 13px;\n font-weight: normal;\n line-height: 100%;\n margin: 0;\n text-decoration: none;\n text-transform: none;\n padding: 12px 0px 12px 0px;\n mso-padding-alt: 0;\n border-radius: 0;\n \"\n target=\"_blank\"\n \u003e\n \u003cspan\n style=\"\n mso-line-height-rule: exactly;\n font-size: 14px;\n font-family: Inter, Arial, sans-serif;\n font-weight: 600;\n color: #ffffff;\n line-height: 20px;\n \"\n \u003eTake Survey\u003c/span\n \u003e\u003c/a\n \u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n \n \u003cdiv\n class=\"xc16 ogf g mb-16\"\n style=\"\n font-size: 0;\n text-align: left;\n direction: ltr;\n display: inline-block;\n vertical-align: top;\n width: 100%;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd style=\"vertical-align: top; padding: 0\"\u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n \n \u003cdiv\n class=\"xc32 ogf\"\n style=\"\n font-size: 0;\n text-align: left;\n direction: ltr;\n display: inline-block;\n vertical-align: middle;\n width: 100%;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd style=\"vertical-align: middle; padding: 0 0 0 0\"\u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n align=\"left\"\n class=\"i hm-1\"\n style=\"\n font-size: 0;\n padding: 0;\n word-break: break-word;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"\n border-collapse: collapse;\n border-spacing: 0;\n \"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd style=\"width: 32px\"\u003e\n \u003cimg\n alt=\"\"\n height=\"auto\"\n src=\"https://f002.backblazeb2.com/file/emailify/c026cf429700701f40428f478d349306.jpg\"\n style=\"\n border: 0;\n border-radius: 0;\n display: block;\n outline: none;\n text-decoration: none;\n height: auto;\n width: 100%;\n font-size: 13px;\n \"\n width=\"32\"\n /\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n \n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n\n \n \u003cdiv\n class=\"r pr-16 pl-16\"\n style=\"\n background: #171717;\n background-color: #171717;\n margin: 0px auto;\n border-radius: 0;\n max-width: 1200px;\n \"\n \u003e\n \u003ctable\n align=\"center\"\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"\n background: #171717;\n background-color: #171717;\n width: 100%;\n border-radius: 0;\n \"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n style=\"\n border: none;\n direction: ltr;\n font-size: 0;\n padding: 32px 64px 32px 64px;\n text-align: left;\n \"\n \u003e\n \n \u003cdiv\n class=\"pc100 ogf\"\n style=\"\n font-size: 0;\n line-height: 0;\n text-align: left;\n display: inline-block;\n width: 100%;\n direction: ltr;\n \"\n \u003e\n \n \u003cdiv\n class=\"pc100 ogf c\"\n style=\"\n font-size: 0;\n text-align: left;\n direction: ltr;\n display: inline-block;\n vertical-align: middle;\n width: 100%;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"\n background-color: transparent;\n border: none;\n vertical-align: middle;\n \"\n width=\"100%\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n align=\"left\"\n class=\"i w-60 h-30 m\"\n style=\"\n font-size: 0;\n padding: 0;\n padding-bottom: 8px;\n word-break: break-word;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"\n border-collapse: collapse;\n border-spacing: 0;\n \"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd style=\"width: 80px\"\u003e\n \u003ca\n href=\"https://www.ory.sh/\"\n target=\"_blank\"\n \u003e\n \u003cimg\n alt=\"Ory Logo\"\n height=\"auto\"\n src=\"https://f002.backblazeb2.com/file/emailify/879566e4ded61f9133eb4ae85666e0f8.png\"\n style=\"\n border: 0;\n border-radius: 0;\n display: block;\n outline: none;\n text-decoration: none;\n height: auto;\n width: 100%;\n font-size: 13px;\n \"\n width=\"80\"\n /\u003e\u003c/a\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\n align=\"left\"\n class=\"x m\"\n style=\"\n font-size: 0;\n padding: 0;\n padding-bottom: 8px;\n word-break: break-word;\n \"\n \u003e\n \u003cdiv\n style=\"\n font-family: Inter, Arial, sans-serif;\n font-size: 10px;\n line-height: 16px;\n text-align: left;\n color: #000000;\n \"\n \u003e\n \u003cp style=\"margin: 0; text-align: left\"\u003e\n \u003cspan\n style=\"\n mso-line-height-rule: exactly;\n font-size: 10px;\n font-family: Inter, Arial, sans-serif;\n font-weight: 400;\n color: #ffffff;\n line-height: 16px;\n \"\n \u003eCopyright © *|CURRENT_YEAR|* *|LIST:COMPANY|*, All rights reserved.\u003cbr\u003e*|IFNOT:ARCHIVE_PAGE|* *|LIST:DESCRIPTION|*\u003cbr\u003e\n \u003cbr\u003e\n You subscribed to this newsletter on \u003ca href=\"https://www.ory.sh/\" target=\"_blank\"\u003ewww.ory.sh\u003c/a\u003e.\u003cbr\u003e\n \u003cbr\u003e\n Want to change how you receive these emails?\u003cbr\u003e\n You can \u003ca href=\"*|UPDATE_PROFILE|*\"\u003eupdate your preferences\u003c/a\u003e or \u003ca href=\"*|UNSUB|*\"\u003eunsubscribe from this list\u003c/a\u003e.*|END:IF|*\u003cbr\u003e\n \u003cbr\u003e*|IF:REWARDS|* *|HTML:REWARDS|* *|END:IF|*\u003c/span\n \u003e\n \u003c/p\u003e\n \u003c/p\u003e\n \u003cp style=\"margin: 0\"\u003e\n\n \u003c/p\u003e\n \u003c/div\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\n class=\"s m\"\n style=\"\n font-size: 0;\n padding: 0;\n padding-bottom: 8px;\n word-break: break-word;\n \"\n \u003e\n \u003cdiv style=\"height: 4px; line-height: 4px\"\u003e\n \u0026#8202;\n \u003c/div\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\n class=\"s m\"\n style=\"\n font-size: 0;\n padding: 0;\n padding-bottom: 8px;\n word-break: break-word;\n \"\n \u003e\n \u003cdiv style=\"height: 4px; line-height: 4px\"\u003e\n \u0026#8202;\n \u003c/div\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\n align=\"left\"\n class=\"o\"\n style=\"\n font-size: 0;\n padding: 0;\n padding-bottom: 0;\n word-break: break-word;\n \"\n \u003e\n \n \u003ctable\n align=\"left\"\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"float: none; display: inline-table\"\n \u003e\n \u003ctbody\u003e\n \u003ctr class=\"e m\"\u003e\n \u003ctd\n style=\"\n padding: 0 16px 0 0;\n vertical-align: middle;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"border-radius: 0; width: 24px\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n style=\"\n font-size: 0;\n height: 24px;\n vertical-align: middle;\n width: 24px;\n \"\n \u003e\n \u003ca\n href=\"https://github.com/ory\"\n target=\"_blank\"\n \u003e\n \u003cimg\n alt=\"GitHub\"\n height=\"24\"\n src=\"https://f002.backblazeb2.com/file/emailify/ef512130ade0d301c30989f4c913c8ee.png\"\n style=\"\n border-radius: 0;\n display: block;\n \"\n width=\"24\"\n /\u003e\u003c/a\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \n \u003ctable\n align=\"left\"\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"float: none; display: inline-table\"\n \u003e\n \u003ctbody\u003e\n \u003ctr class=\"e m\"\u003e\n \u003ctd\n style=\"\n padding: 0 16px 0 0;\n vertical-align: middle;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"border-radius: 0; width: 24px\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n style=\"\n font-size: 0;\n height: 24px;\n vertical-align: middle;\n width: 24px;\n \"\n \u003e\n \u003ca\n href=\"https://slack.ory.sh/\"\n target=\"_blank\"\n \u003e\n \u003cimg\n alt=\"Slack\"\n height=\"24\"\n src=\"https://f002.backblazeb2.com/file/emailify/eb766218760449f56561ca1eced33dbf.png\"\n style=\"\n border-radius: 0;\n display: block;\n \"\n width=\"24\"\n /\u003e\u003c/a\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \n \u003ctable\n align=\"left\"\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"float: none; display: inline-table\"\n \u003e\n \u003ctbody\u003e\n \u003ctr class=\"e m\"\u003e\n \u003ctd\n style=\"\n padding: 0 16px 0 0;\n vertical-align: middle;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"border-radius: 0; width: 24px\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n style=\"\n font-size: 0;\n height: 24px;\n vertical-align: middle;\n width: 24px;\n \"\n \u003e\n \u003ca\n href=\"https://www.youtube.com/channel/UC9hCxZZeviexX0GclD0brrw\"\n target=\"_blank\"\n \u003e\n \u003cimg\n alt=\"YouTube\"\n height=\"24\"\n src=\"https://f002.backblazeb2.com/file/emailify/3da01c1f1191eb2b71d7a649e51e29e5.png\"\n style=\"\n border-radius: 0;\n display: block;\n \"\n width=\"24\"\n /\u003e\u003c/a\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \n \u003ctable\n align=\"left\"\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"float: none; display: inline-table\"\n \u003e\n \u003ctbody\u003e\n \u003ctr class=\"e m\"\u003e\n \u003ctd\n style=\"\n padding: 0 16px 0 0;\n vertical-align: middle;\n \"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"border-radius: 0; width: 24px\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n style=\"\n font-size: 0;\n height: 24px;\n vertical-align: middle;\n width: 24px;\n \"\n \u003e\n \u003ca\n href=\"https://twitter.com/orycorp\"\n target=\"_blank\"\n \u003e\n \u003cimg\n alt=\"Twitter\"\n height=\"24\"\n src=\"https://f002.backblazeb2.com/file/emailify/eb45c141aa72d90251c7419d68d6d64d.png\"\n style=\"\n border-radius: 0;\n display: block;\n \"\n width=\"24\"\n /\u003e\u003c/a\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \n \u003ctable\n align=\"left\"\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"float: none; display: inline-table\"\n \u003e\n \u003ctbody\u003e\n \u003ctr class=\"e\"\u003e\n \u003ctd\n style=\"padding: 0; vertical-align: middle\"\n \u003e\n \u003ctable\n border=\"0\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n style=\"border-radius: 0; width: 24px\"\n \u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\n style=\"\n font-size: 0;\n height: 24px;\n vertical-align: middle;\n width: 24px;\n \"\n \u003e\n \u003ca\n href=\"https://www.linkedin.com/company/ory-corp/\"\n target=\"_blank\"\n \u003e\n \u003cimg\n alt=\"LinkedIn\"\n height=\"24\"\n src=\"https://f002.backblazeb2.com/file/emailify/0cb3b6717df0a6d08795de6808ab115e.png\"\n style=\"\n border-radius: 0;\n display: block;\n \"\n width=\"24\"\n /\u003e\u003c/a\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n \n \u003c/div\u003e\n \n \u003c/td\u003e\n \u003c/tr\u003e\n \u003c/tbody\u003e\n \u003c/table\u003e\n \u003c/div\u003e\n\n\u003c/div\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n" diff --git a/cmd/dev/newsletter/draft.go b/cmd/dev/newsletter/draft.go index f9303934..1f67bffb 100644 --- a/cmd/dev/newsletter/draft.go +++ b/cmd/dev/newsletter/draft.go @@ -23,11 +23,12 @@ import ( "github.com/ory/x/flagx" ) -var draft = &cobra.Command{ - Use: "draft list-id path/to/tag-message path/to/changelog.md", - Args: cobra.ExactArgs(3), - Short: "Creates a draft release notification via the Mailchimp Campaign / Newsletter API", - Long: `Creates a draft release notification via the Mailchimp Campaign / Newsletter API. TL;DR +func newDraftCmd() *cobra.Command { + c := &cobra.Command{ + Use: "draft list-id path/to/tag-message path/to/changelog.md", + Args: cobra.ExactArgs(3), + Short: "Creates a draft release notification via the Mailchimp Campaign / Newsletter API", + Long: `Creates a draft release notification via the Mailchimp Campaign / Newsletter API. TL;DR $ git tag -l --format='%(contents)' v0.0.103 > tag-message.txt $ # run changelog generator > changelog.md @@ -56,24 +57,28 @@ If you want to send only to a segment within that list, add the Segment ID as we release notify --segment 1234 ... `, - Run: func(cmd *cobra.Command, args []string) { - listID := args[0] - tagMessagePath := args[1] - changelogPath := args[2] + Run: func(cmd *cobra.Command, args []string) { + listID := args[0] + tagMessagePath := args[1] + changelogPath := args[2] - tagMessageRaw, err := os.ReadFile(tagMessagePath) - pkg.Check(err) - changelogRaw, err := os.ReadFile(changelogPath) - pkg.Check(err) + tagMessageRaw, err := os.ReadFile(tagMessagePath) + pkg.Check(err) + changelogRaw, err := os.ReadFile(changelogPath) + pkg.Check(err) - chimpCampaign, err := Draft(listID, flagx.MustGetInt(cmd, "segment"), tagMessageRaw, changelogRaw, flagx.MustGetBool(cmd, "dry")) - pkg.Check(err) + chimpCampaign, err := Draft(listID, flagx.MustGetInt(cmd, "segment"), tagMessageRaw, changelogRaw, flagx.MustGetBool(cmd, "dry")) + pkg.Check(err) - fmt.Printf(`Created campaign "%s" (%s)`, chimpCampaign.Settings.Title, chimpCampaign.ID) - fmt.Println() + fmt.Printf(`Created campaign "%s" (%s)`, chimpCampaign.Settings.Title, chimpCampaign.ID) + fmt.Println() - fmt.Println("Campaign drafted") - }, + fmt.Println("Campaign drafted") + }, + } + c.Flags().Int("segment", 0, "The Mailchimp Segment ID") + c.Flags().Bool("dry", false, "Dry run") + return c } func Draft(listID string, segmentID int, tagMessageRaw, changelogRaw []byte, dry bool) (*gochimp3.CampaignResponse, error) { @@ -176,9 +181,3 @@ func Draft(listID string, segmentID int, tagMessageRaw, changelogRaw []byte, dry return chimpCampaign, err } - -func init() { - Main.AddCommand(draft) - draft.Flags().Int("segment", 0, "The Mailchimp Segment ID") - draft.Flags().Bool("dry", false, "Dry run") -} diff --git a/cmd/dev/newsletter/main.go b/cmd/dev/newsletter/main.go index 0e1b8f73..e8c996c8 100644 --- a/cmd/dev/newsletter/main.go +++ b/cmd/dev/newsletter/main.go @@ -7,7 +7,11 @@ import ( "github.com/spf13/cobra" ) -var Main = &cobra.Command{ - Use: "newsletter", - Short: "Draft and send release newsletters using Mailchimp", +func NewCommand() *cobra.Command { + c := &cobra.Command{ + Use: "newsletter", + Short: "Draft and send release newsletters using Mailchimp", + } + c.AddCommand(newSendCmd(), newDraftCmd()) + return c } diff --git a/cmd/dev/newsletter/send.go b/cmd/dev/newsletter/send.go index 31a2fc6d..a2566c0c 100644 --- a/cmd/dev/newsletter/send.go +++ b/cmd/dev/newsletter/send.go @@ -13,10 +13,11 @@ import ( "github.com/ory/x/flagx" ) -var send = &cobra.Command{ - Use: "send ", - Args: cobra.ExactArgs(1), - Long: `Send a drafted campaign. +func newSendCmd() *cobra.Command { + c := &cobra.Command{ + Use: "send ", + Args: cobra.ExactArgs(1), + Long: `Send a drafted campaign. Example: @@ -26,15 +27,12 @@ Example: CIRCLE_PROJECT_REPONAME=... \ # This is set automatically in CircleCI Jobs release campaign send 12345 `, - Run: func(cmd *cobra.Command, args []string) { - SendCampaign(args[0], flagx.MustGetBool(cmd, "dry")) - }, -} - -func init() { - Main.AddCommand(send) - - send.Flags().Bool("dry", false, "Do not actually send the campaign") + Run: func(cmd *cobra.Command, args []string) { + SendCampaign(args[0], flagx.MustGetBool(cmd, "dry")) + }, + } + c.Flags().Bool("dry", false, "Do not actually send the campaign") + return c } func SendCampaign(listID string, dry bool) { diff --git a/cmd/dev/openapi/main.go b/cmd/dev/openapi/main.go index f6d771b4..a7cb9ad1 100644 --- a/cmd/dev/openapi/main.go +++ b/cmd/dev/openapi/main.go @@ -7,13 +7,11 @@ import ( "github.com/spf13/cobra" ) -var Main = &cobra.Command{ - Use: "openapi", - Short: "Helpers for OpenAPI 3.0", -} - -func init() { - Main.AddCommand( - migrateCmd, - ) +func NewCommand() *cobra.Command { + c := &cobra.Command{ + Use: "openapi", + Short: "Helpers for OpenAPI 3.0", + } + c.AddCommand(newMigrateCmd()) + return c } diff --git a/cmd/dev/openapi/migrate.go b/cmd/dev/openapi/migrate.go index 3d7a3851..9c3009b3 100644 --- a/cmd/dev/openapi/migrate.go +++ b/cmd/dev/openapi/migrate.go @@ -17,10 +17,11 @@ import ( "github.com/ory/x/flagx" ) -var migrateCmd = &cobra.Command{ - Use: "migrate [path/to/swagger2.json] [path/to/output.json]", - Short: "Migrates Swagger 2.0 to OpenAPI 3.0", - Long: `Migrates Swagger 2.0 to OpenAPI 3.0. Prints the OpenAPI 3.0 spec to std out. +func newMigrateCmd() *cobra.Command { + c := &cobra.Command{ + Use: "migrate [path/to/swagger2.json] [path/to/output.json]", + Short: "Migrates Swagger 2.0 to OpenAPI 3.0", + Long: `Migrates Swagger 2.0 to OpenAPI 3.0. Prints the OpenAPI 3.0 spec to std out. This command can also apply a JSON Patch (https://tools.ietf.org/html/rfc7396) to the OpenAPI 3.0 output using the --patch flag. The path can be a file:// or https:// path. @@ -53,53 +54,57 @@ Example: version: >- {{ .Version }} `, - Args: cobra.ExactArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - var oas2 openapi2.T - - in, err := os.ReadFile(args[0]) - if err != nil { - return errors.WithStack(err) - } - - if err := json.Unmarshal(in, &oas2); err != nil { - return errors.WithStack(err) - } - - oas3, err := openapi2conv.ToV3(&oas2) - if err != nil { - return errors.WithStack(err) - } - - result, err := json.MarshalIndent(oas3, "", " ") - if err != nil { - return errors.WithStack(err) - } - - patches := flagx.MustGetStringSlice(cmd, "patches") - if len(patches) == 0 { - return renderFile(args[1], result) - } + Args: cobra.ExactArgs(2), + RunE: func(cmd *cobra.Command, args []string) error { + var oas2 openapi2.T - for _, path := range patches { - content, err := pkg.RenderOASPatch(cmd, path) + in, err := os.ReadFile(args[0]) if err != nil { return errors.WithStack(err) } - patch, err := jsonpatch.DecodePatch(content) + if err := json.Unmarshal(in, &oas2); err != nil { + return errors.WithStack(err) + } + + oas3, err := openapi2conv.ToV3(&oas2) if err != nil { return errors.WithStack(err) } - result, err = patch.Apply(result) + result, err := json.MarshalIndent(oas3, "", " ") if err != nil { return errors.WithStack(err) } - } - return renderFile(args[1], result) - }, + patches := flagx.MustGetStringSlice(cmd, "patches") + if len(patches) == 0 { + return renderFile(args[1], result) + } + + for _, path := range patches { + content, err := pkg.RenderOASPatch(cmd, path) + if err != nil { + return errors.WithStack(err) + } + + patch, err := jsonpatch.DecodePatch(content) + if err != nil { + return errors.WithStack(err) + } + + result, err = patch.Apply(result) + if err != nil { + return errors.WithStack(err) + } + } + + return renderFile(args[1], result) + }, + } + c.Flags().StringSliceP("patches", "p", []string{}, "JSON Patch file(s) to apply to the final OpenAPI v3.0 spec.") + c.Flags().StringSlice("health-path-tags", []string{"admin"}, "Which tags to set for the /health/* and /version endpoints.") + return c } func renderFile(path string, content []byte) error { @@ -110,8 +115,3 @@ func renderFile(path string, content []byte) error { return errors.WithStack(os.WriteFile(path, indented, 0644)) } - -func init() { - migrateCmd.Flags().StringSliceP("patches", "p", []string{}, "JSON Patch file(s) to apply to the final OpenAPI v3.0 spec.") - migrateCmd.Flags().StringSlice("health-path-tags", []string{"admin"}, "Which tags to set for the /health/* and /version endpoints.") -} diff --git a/cmd/dev/release/compile.go b/cmd/dev/release/compile.go index d2e63551..da5038b9 100644 --- a/cmd/dev/release/compile.go +++ b/cmd/dev/release/compile.go @@ -14,25 +14,24 @@ import ( "github.com/ory/x/flagx" ) -var compile = &cobra.Command{ - Use: "compile", - Args: cobra.ExactArgs(0), - Short: "Compiles the current project using oryd/xgoreleaser a new release", - Run: func(cmd *cobra.Command, args []string) { - wd, err := os.Getwd() - pkg.Check(err) +func newCompileCmd() *cobra.Command { + c := &cobra.Command{ + Use: "compile", + Args: cobra.ExactArgs(0), + Short: "Compiles the current project using oryd/xgoreleaser a new release", + Run: func(cmd *cobra.Command, args []string) { + wd, err := os.Getwd() + pkg.Check(err) - pkg.Check(pkg.NewCommand("docker", "run", "--mount", - fmt.Sprintf(`type=bind,source=%s,target=/project`, wd), - "oryd/xgoreleaser:"+flagx.MustGetString(cmd, "tag"), - "--timeout", "60m", - "--skip-publish", "--snapshot", "--rm-dist", "--parallelism", - strconv.Itoa(flagx.MustGetInt(cmd, "parallelism"))).Run()) - }, -} - -func init() { - Main.AddCommand(compile) - compile.Flags().StringP("tag", "t", "1.14.4-0.139.0", "Set the xgoreleaser version tag.") - compile.Flags().IntP("parallelism", "p", 4, "Build parallelism.") + pkg.Check(pkg.NewCommand("docker", "run", "--mount", + fmt.Sprintf(`type=bind,source=%s,target=/project`, wd), + "oryd/xgoreleaser:"+flagx.MustGetString(cmd, "tag"), + "--timeout", "60m", + "--skip-publish", "--snapshot", "--rm-dist", "--parallelism", + strconv.Itoa(flagx.MustGetInt(cmd, "parallelism"))).Run()) + }, + } + c.Flags().StringP("tag", "t", "1.14.4-0.139.0", "Set the xgoreleaser version tag.") + c.Flags().IntP("parallelism", "p", 4, "Build parallelism.") + return c } diff --git a/cmd/dev/release/main.go b/cmd/dev/release/main.go index 3433fe1a..70d85c9a 100644 --- a/cmd/dev/release/main.go +++ b/cmd/dev/release/main.go @@ -9,13 +9,15 @@ import ( "github.com/ory/cli/cmd/dev/release/notify" ) -var Main = &cobra.Command{ - Use: "release", - Short: "Release infrastructure for ORY and related components", -} - -func init() { - Main.AddCommand( - notify.Main, +func NewCommand() *cobra.Command { + c := &cobra.Command{ + Use: "release", + Short: "Release infrastructure for ORY and related components", + } + c.AddCommand( + notify.NewCommand(), + newCompileCmd(), + newPublishCmd(), ) + return c } diff --git a/cmd/dev/release/notify/draft.go b/cmd/dev/release/notify/draft.go index 72e97b3c..57753932 100644 --- a/cmd/dev/release/notify/draft.go +++ b/cmd/dev/release/notify/draft.go @@ -21,69 +21,70 @@ import ( var gitCommitMessageBaseRegex = regexp.MustCompile("(?im)^" + pkg.GitCommitMessagePreviousVersion + "\\sv([0-9a-zA-Z\\-\\._]+)$") -var draft = &cobra.Command{ - Use: "draft [list-id]", - Short: "Create a Mailchimp draft campaign for the release notification", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - gitHash := pkg.GitHubSHA() - circleTag := pkg.GitHubTag() - - // Required by conventional-changelog-generator - if _, err := os.Stat("package.json"); os.IsNotExist(err) { - pkg.Check(os.WriteFile("package.json", - []byte(`{"private": true, "version": "0.0.0"}`), 0600)) - } - - presetDir := pkg.GitClone("git@github.com:ory/changelog.git") - pkg.Check(pkg.NewCommandIn(presetDir, "npm", "i").Run()) +func newDraftCmd() *cobra.Command { + c := &cobra.Command{ + Use: "draft [list-id]", + Short: "Create a Mailchimp draft campaign for the release notification", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + gitHash := pkg.GitHubSHA() + circleTag := pkg.GitHubTag() + + // Required by conventional-changelog-generator + if _, err := os.Stat("package.json"); os.IsNotExist(err) { + pkg.Check(os.WriteFile("package.json", + []byte(`{"private": true, "version": "0.0.0"}`), 0600)) + } - commitMessage := pkg.CommandGetOutput("git", "log", "--format=%B", "-n", "1", gitHash) - tagMessage := pkg.CommandGetOutput("git", "tag", "-l", "--format=%(contents)", circleTag) + presetDir := pkg.GitClone("git@github.com:ory/changelog.git") + pkg.Check(pkg.NewCommandIn(presetDir, "npm", "i").Run()) - pkg.Check(pkg.NewCommand("npm", "--no-git-tag-version", "--allow-same-version", "version", circleTag).Run()) + commitMessage := pkg.CommandGetOutput("git", "log", "--format=%B", "-n", "1", gitHash) + tagMessage := pkg.CommandGetOutput("git", "tag", "-l", "--format=%(contents)", circleTag) - changelogFile, err := os.MkdirTemp(os.TempDir(), "ory-release-cf-*") - pkg.Check(err) - changelogFile = path.Join(changelogFile, "changelog-email.md") + pkg.Check(pkg.NewCommand("npm", "--no-git-tag-version", "--allow-same-version", "version", circleTag).Run()) - count := 2 - if cliFromVersion := flagx.MustGetString(cmd, "from-version"); len(cliFromVersion) > 0 { - cv, err := semver.StrictNewVersion(strings.TrimPrefix(cliFromVersion, "v")) + changelogFile, err := os.MkdirTemp(os.TempDir(), "ory-release-cf-*") pkg.Check(err) - count = changelogGeneratorReleaseCount(cv, pkg.GitListTags()) - } else if cliFromTag, ok := getPreviousVersionFromGitCommitMessage(commitMessage); ok { - count = changelogGeneratorReleaseCount(cliFromTag, pkg.GitListTags()) - } + changelogFile = path.Join(changelogFile, "changelog-email.md") + + count := 2 + if cliFromVersion := flagx.MustGetString(cmd, "from-version"); len(cliFromVersion) > 0 { + cv, err := semver.StrictNewVersion(strings.TrimPrefix(cliFromVersion, "v")) + pkg.Check(err) + count = changelogGeneratorReleaseCount(cv, pkg.GitListTags()) + } else if cliFromTag, ok := getPreviousVersionFromGitCommitMessage(commitMessage); ok { + count = changelogGeneratorReleaseCount(cliFromTag, pkg.GitListTags()) + } - pkg.Check(pkg.NewCommand("npx", "conventional-changelog-cli@v2.1.1", "--config", - path.Join(presetDir, "email.js"), "-r", strconv.Itoa(count), "-o", changelogFile).Run()) + pkg.Check(pkg.NewCommand("npx", "conventional-changelog-cli@v2.1.1", "--config", + path.Join(presetDir, "email.js"), "-r", strconv.Itoa(count), "-o", changelogFile).Run()) - pkg.Check(pkg.NewCommand("npx", "prettier", "-w", changelogFile).Run()) + pkg.Check(pkg.NewCommand("npx", "prettier", "-w", changelogFile).Run()) - changelog, err := os.ReadFile(changelogFile) - pkg.Check(err) + changelog, err := os.ReadFile(changelogFile) + pkg.Check(err) - if strings.TrimSpace(tagMessage) == strings.TrimSpace(commitMessage) { - fmt.Println("Git tag does not include any release notes.") - if strings.Contains(string(changelog), "no significant changes") { - fmt.Println("Changelog would be empty, skipping campaign send!") - return nil + if strings.TrimSpace(tagMessage) == strings.TrimSpace(commitMessage) { + fmt.Println("Git tag does not include any release notes.") + if strings.Contains(string(changelog), "no significant changes") { + fmt.Println("Changelog would be empty, skipping campaign send!") + return nil + } } - } - campaign, err := newsletter.Draft( - args[0], - flagx.MustGetInt(cmd, "segment"), - []byte(tagMessage), - changelog, - false, - ) - pkg.Check(err) - fmt.Printf(`Created campaign "%s" (%s)`, campaign.Settings.Title, campaign.ID) - fmt.Println() + campaign, err := newsletter.Draft( + args[0], + flagx.MustGetInt(cmd, "segment"), + []byte(tagMessage), + changelog, + false, + ) + pkg.Check(err) + fmt.Printf(`Created campaign "%s" (%s)`, campaign.Settings.Title, campaign.ID) + fmt.Println() - fmt.Printf(`Campaign drafted with contents: + fmt.Printf(`Campaign drafted with contents: ## Release Notes @@ -94,14 +95,12 @@ var draft = &cobra.Command{ %s `, tagMessage, changelog) - return nil - }, -} - -func init() { - Main.AddCommand(draft) - draft.Flags().Int("segment", 0, "The Mailchimp segment ID.") - draft.Flags().String("from-version", "", "Use this as the previous version for changelog generation.") + return nil + }, + } + c.Flags().Int("segment", 0, "The Mailchimp segment ID.") + c.Flags().String("from-version", "", "Use this as the previous version for changelog generation.") + return c } func getPreviousVersionFromGitCommitMessage(message string) (*semver.Version, bool) { diff --git a/cmd/dev/release/notify/main.go b/cmd/dev/release/notify/main.go index ec1f3f27..338cf54f 100644 --- a/cmd/dev/release/notify/main.go +++ b/cmd/dev/release/notify/main.go @@ -7,7 +7,11 @@ import ( "github.com/spf13/cobra" ) -var Main = &cobra.Command{ - Use: "notify", - Short: "Notify subscribers about new releases", +func NewCommand() *cobra.Command { + c := &cobra.Command{ + Use: "notify", + Short: "Notify subscribers about new releases", + } + c.AddCommand(newSendCmd(), newDraftCmd()) + return c } diff --git a/cmd/dev/release/notify/send.go b/cmd/dev/release/notify/send.go index 8ab8e088..ef8bc842 100644 --- a/cmd/dev/release/notify/send.go +++ b/cmd/dev/release/notify/send.go @@ -10,17 +10,16 @@ import ( "github.com/ory/x/flagx" ) -var send = &cobra.Command{ - Use: "send [list-id]", - Short: "Send the release notification Mailchimp campaign", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - newsletter.SendCampaign(args[0], flagx.MustGetBool(cmd, "dry")) - return nil - }, -} - -func init() { - Main.AddCommand(send) - send.Flags().Bool("dry", false, "Do not actually send the campaign") +func newSendCmd() *cobra.Command { + c := &cobra.Command{ + Use: "send [list-id]", + Short: "Send the release notification Mailchimp campaign", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + newsletter.SendCampaign(args[0], flagx.MustGetBool(cmd, "dry")) + return nil + }, + } + c.Flags().Bool("dry", false, "Do not actually send the campaign") + return c } diff --git a/cmd/dev/release/publish.go b/cmd/dev/release/publish.go index 7abb2b86..b2d107cc 100644 --- a/cmd/dev/release/publish.go +++ b/cmd/dev/release/publish.go @@ -22,11 +22,12 @@ import ( var isTestRelease = regexp.MustCompile(`^(([a-zA-Z0-9\.\-]+\.)|)pre\.[0-9]+$`) -var publish = &cobra.Command{ - Use: "publish [version] [git-hash]", - Args: cobra.RangeArgs(1, 2), - Short: "Publish a new release", - Long: `Publishes a new release. Performs git magic and other automated tasks such as tagging the example applications for ORY Kratos and ORY Hydra as well. +func newPublishCmd() *cobra.Command { + c := &cobra.Command{ + Use: "publish [version] [git-hash]", + Args: cobra.RangeArgs(1, 2), + Short: "Publish a new release", + Long: `Publishes a new release. Performs git magic and other automated tasks such as tagging the example applications for ORY Kratos and ORY Hydra as well. To publish a release, you first have to create a pre-release: @@ -54,66 +55,66 @@ In case where the release pipeline failed and you re-create another release wher 1. Assuming release "v0.1.0" failed 2. You wish to create "v0.1.1" and include the changelog of "v0.1.0" as well 3. Run ` + "`ory dev release publish v0.1.1 --include-changelog-since v0.1.0`", - Run: func(cmd *cobra.Command, args []string) { - wd, err := os.Getwd() - pkg.Check(err) - - cfg, err := pkg.ReadConfig() - pkg.Check(err) - - dry := flagx.MustGetBool(cmd, "dry") - - gitCleanTags() - if len(args) == 2 { - pkg.Check(pkg.NewCommand("git", "checkout", "-b", randx.MustString(8, randx.AlphaLowerNum), args[1]).Run()) - } - - var latestTag string - if cfg.IgnoreTags != nil && len(cfg.IgnoreTags.String()) > 0 { - for { - var o, e bytes.Buffer - args := []string{"describe", "--abbrev=0", "--tags"} - if latestTag != "" { - args = append(args, latestTag+"^") - } - cmd := pkg.NewCommand("git", args...) - cmd.Stdout = &o - cmd.Stderr = &e - if cmd.Run() != nil { - pkg.Fatalf("could not get git tag: %s%s", o.String(), e.String()) - } - latestTag = strings.TrimSpace(o.String()) + Run: func(cmd *cobra.Command, args []string) { + wd, err := os.Getwd() + pkg.Check(err) + + cfg, err := pkg.ReadConfig() + pkg.Check(err) + + dry := flagx.MustGetBool(cmd, "dry") - if !cfg.IgnoreTags.MatchString(latestTag) { - break + gitCleanTags() + if len(args) == 2 { + pkg.Check(pkg.NewCommand("git", "checkout", "-b", randx.MustString(8, randx.AlphaLowerNum), args[1]).Run()) + } + + var latestTag string + if cfg.IgnoreTags != nil && len(cfg.IgnoreTags.String()) > 0 { + for { + var o, e bytes.Buffer + args := []string{"describe", "--abbrev=0", "--tags"} + if latestTag != "" { + args = append(args, latestTag+"^") + } + cmd := pkg.NewCommand("git", args...) + cmd.Stdout = &o + cmd.Stderr = &e + if cmd.Run() != nil { + pkg.Fatalf("could not get git tag: %s%s", o.String(), e.String()) + } + latestTag = strings.TrimSpace(o.String()) + + if !cfg.IgnoreTags.MatchString(latestTag) { + break + } } + } else { + latestTag = pkg.GitGetCurrentTag() } - } else { - latestTag = pkg.GitGetCurrentTag() - } - - currentVersion, err := semver.StrictNewVersion(strings.TrimPrefix(latestTag, "v")) - pkg.Check(err, "Unable to parse current git tag %s: %s", latestTag, err) - - var nextVersion semver.Version - switch args[0] { - case "major": - nextVersion = currentVersion.IncMajor() - case "minor": - nextVersion = currentVersion.IncMinor() - case "patch": - nextVersion = currentVersion.IncPatch() - default: - nv, err := semver.StrictNewVersion(strings.TrimPrefix(args[0], "v")) - pkg.Check(err) - nextVersion = *nv - } - checkForDuplicateTag(&nextVersion) + currentVersion, err := semver.StrictNewVersion(strings.TrimPrefix(latestTag, "v")) + pkg.Check(err, "Unable to parse current git tag %s: %s", latestTag, err) + + var nextVersion semver.Version + switch args[0] { + case "major": + nextVersion = currentVersion.IncMajor() + case "minor": + nextVersion = currentVersion.IncMinor() + case "patch": + nextVersion = currentVersion.IncPatch() + default: + nv, err := semver.StrictNewVersion(strings.TrimPrefix(args[0], "v")) + pkg.Check(err) + nextVersion = *nv + } + + checkForDuplicateTag(&nextVersion) - if !isTestRelease.MatchString(currentVersion.Prerelease()) && - !isTestRelease.MatchString(nextVersion.Prerelease()) { - pkg.Confirm(`You should create a test release before publishing the real release or vice versa: + if !isTestRelease.MatchString(currentVersion.Prerelease()) && + !isTestRelease.MatchString(nextVersion.Prerelease()) { + pkg.Confirm(`You should create a test release before publishing the real release or vice versa: - Current version: v%s - Next version: v%s @@ -121,57 +122,61 @@ In case where the release pipeline failed and you re-create another release wher Please check "ory help dev release publish". Are you sure you want to proceed without creating a pre version first?`, currentVersion, nextVersion) - } + } - if ov := flagx.MustGetString(cmd, "include-changelog-since"); len(ov) == 0 && !isTestRelease.MatchString(nextVersion.Prerelease()) { - pkg.Confirm("You are about to release a non-test release v%s but did not include the --include-changelog-since flag. Are you sure you want to continue?", nextVersion) - } + if ov := flagx.MustGetString(cmd, "include-changelog-since"); len(ov) == 0 && !isTestRelease.MatchString(nextVersion.Prerelease()) { + pkg.Confirm("You are about to release a non-test release v%s but did not include the --include-changelog-since flag. Are you sure you want to continue?", nextVersion) + } - pkg.Check(pkg.NewCommand("goreleaser", "check", "--soft").Run()) + pkg.Check(pkg.NewCommand("goreleaser", "check", "--soft").Run()) - if dry { - fmt.Println("Don't worry, this is a dry run!") - } - pkg.Confirm("Are you sure you want to bump to v%s? Previous version was v%s.", nextVersion, currentVersion) + if dry { + fmt.Println("Don't worry, this is a dry run!") + } + pkg.Confirm("Are you sure you want to bump to v%s? Previous version was v%s.", nextVersion, currentVersion) - if len(cfg.PreReleaseHooks) != 0 { - fmt.Println("Running pre-release hooks...") + if len(cfg.PreReleaseHooks) != 0 { + fmt.Println("Running pre-release hooks...") - for _, h := range cfg.PreReleaseHooks { - parts := strings.Split(h, " ") + for _, h := range cfg.PreReleaseHooks { + parts := strings.Split(h, " ") - var err error - if len(parts) > 1 { - err = pkg.NewCommand(parts[0], parts[1:]...).Run() - } else { - err = pkg.NewCommand(parts[0]).Run() - } + var err error + if len(parts) > 1 { + err = pkg.NewCommand(parts[0], parts[1:]...).Run() + } else { + err = pkg.NewCommand(parts[0]).Run() + } - if err != nil { - pkg.Fatalf("Pre-release hook failed: %s\nAborting release.", err.Error()) + if err != nil { + pkg.Fatalf("Pre-release hook failed: %s\nAborting release.", err.Error()) + } } } - } - - var fromVersion *semver.Version - if ov := flagx.MustGetString(cmd, "include-changelog-since"); len(ov) > 0 { - fromVersion, err = semver.StrictNewVersion(strings.TrimPrefix(ov, "v")) - pkg.Check(err, "Unable to parse include-changelog-since git tag v%s: %s", ov, err) - checkIfTagExists(fromVersion) - } - - pkg.GitTagRelease(wd, !isTestRelease.MatchString(nextVersion.Prerelease()), dry, nextVersion, fromVersion) - - switch cfg.Project { - case "hydra": - pkg.GitTagRelease(pkg.GitClone("git@github.com:ory/hydra-login-consent-node.git"), false, dry, nextVersion, nil) - case "kratos": - pkg.GitTagRelease(pkg.GitClone("git@github.com:ory/kratos-selfservice-ui-node.git"), false, dry, nextVersion, nil) - pkg.GitTagRelease(pkg.GitClone("git@github.com:ory/kratos-selfservice-ui-react-native.git"), false, dry, nextVersion, nil) - } - - fmt.Printf("Successfully released version: v%s\n", nextVersion.String()) - }, + + var fromVersion *semver.Version + if ov := flagx.MustGetString(cmd, "include-changelog-since"); len(ov) > 0 { + fromVersion, err = semver.StrictNewVersion(strings.TrimPrefix(ov, "v")) + pkg.Check(err, "Unable to parse include-changelog-since git tag v%s: %s", ov, err) + checkIfTagExists(fromVersion) + } + + pkg.GitTagRelease(wd, !isTestRelease.MatchString(nextVersion.Prerelease()), dry, nextVersion, fromVersion) + + switch cfg.Project { + case "hydra": + pkg.GitTagRelease(pkg.GitClone("git@github.com:ory/hydra-login-consent-node.git"), false, dry, nextVersion, nil) + case "kratos": + pkg.GitTagRelease(pkg.GitClone("git@github.com:ory/kratos-selfservice-ui-node.git"), false, dry, nextVersion, nil) + pkg.GitTagRelease(pkg.GitClone("git@github.com:ory/kratos-selfservice-ui-react-native.git"), false, dry, nextVersion, nil) + } + + fmt.Printf("Successfully released version: v%s\n", nextVersion.String()) + }, + } + c.Flags().Bool("dry", false, "Make changes only locally and do not push to remotes.") + c.Flags().String("include-changelog-since", "", "If set includes all changelog entries for all git tags up to and including the specified git tag") + return c } func checkForDuplicateTag(v *semver.Version) { @@ -194,9 +199,3 @@ func gitCleanTags() { pkg.Check(pkg.NewCommand("git", "pull", "-ff").Run()) pkg.Check(pkg.NewCommand("git", "diff", "--exit-code").Run()) } - -func init() { - Main.AddCommand(publish) - publish.Flags().Bool("dry", false, "Make changes only locally and do not push to remotes.") - publish.Flags().String("include-changelog-since", "", "If set includes all changelog entries for all git tags up to and including the specified git tag") -} diff --git a/cmd/dev/schema/main.go b/cmd/dev/schema/main.go index e465b348..a8a115a6 100644 --- a/cmd/dev/schema/main.go +++ b/cmd/dev/schema/main.go @@ -7,13 +7,11 @@ import ( "github.com/spf13/cobra" ) -var Main = &cobra.Command{ - Use: "schema", - Short: "JSON Schema related helpers", -} - -func init() { - Main.AddCommand( - RenderVersion, - ) +func NewCommand() *cobra.Command { + c := &cobra.Command{ + Use: "schema", + Short: "JSON Schema related helpers", + } + c.AddCommand(newRenderVersionCmd()) + return c } diff --git a/cmd/dev/schema/render_version.go b/cmd/dev/schema/render_version.go index 4b735395..8c8024fe 100644 --- a/cmd/dev/schema/render_version.go +++ b/cmd/dev/schema/render_version.go @@ -23,11 +23,13 @@ import ( "github.com/ory/x/jsonschemax" ) -var RenderVersion = &cobra.Command{ - Use: "render-version ", - Args: cobra.ExactArgs(3), - Short: "Renders the version schema for and in the current directory. The `$ref` is pointing to the relative to the repo root.", - Run: addVersionToSchema, +func newRenderVersionCmd() *cobra.Command { + return &cobra.Command{ + Use: "render-version ", + Args: cobra.ExactArgs(3), + Short: "Renders the version schema for and in the current directory. The `$ref` is pointing to the relative to the repo root.", + Run: addVersionToSchema, + } } var preReleaseVersion = regexp.MustCompile(`.*[-.]pre\.`) diff --git a/cmd/dev/swagger/main.go b/cmd/dev/swagger/main.go index 74f2358c..fc66c4c3 100644 --- a/cmd/dev/swagger/main.go +++ b/cmd/dev/swagger/main.go @@ -7,7 +7,11 @@ import ( "github.com/spf13/cobra" ) -var Main = &cobra.Command{ - Use: "swagger", - Short: "Helpers for Swagger 2.0 / OpenAPI spec", +func NewCommand() *cobra.Command { + c := &cobra.Command{ + Use: "swagger", + Short: "Helpers for Swagger 2.0 / OpenAPI spec", + } + c.AddCommand(newSanitizeCmd()) + return c } diff --git a/cmd/dev/swagger/sanitize.go b/cmd/dev/swagger/sanitize.go index f6a67962..77a5f546 100644 --- a/cmd/dev/swagger/sanitize.go +++ b/cmd/dev/swagger/sanitize.go @@ -14,17 +14,15 @@ import ( "github.com/tidwall/sjson" ) -var sanitizeCmd = &cobra.Command{ - Use: "sanitize [path/to/swagger.file.json]", - Short: "Cleans up swagger spec files generated by go-swagger", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - return sanitize(args[0], args[0]) - }, -} - -func init() { - Main.AddCommand(sanitizeCmd) +func newSanitizeCmd() *cobra.Command { + return &cobra.Command{ + Use: "sanitize [path/to/swagger.file.json]", + Short: "Cleans up swagger spec files generated by go-swagger", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + return sanitize(args[0], args[0]) + }, + } } func escapeKey(key gjson.Result) string { diff --git a/cmd/nodev.go b/cmd/nodev.go index 53f3b894..40dc388f 100644 --- a/cmd/nodev.go +++ b/cmd/nodev.go @@ -10,4 +10,4 @@ import ( "github.com/spf13/cobra" ) -var devCommands []*cobra.Command +func newDevCommands() []*cobra.Command { return nil } diff --git a/cmd/root.go b/cmd/root.go index e5e55d33..d62302a5 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -24,7 +24,7 @@ func NewRootCmd() *cobra.Command { Short: "The Ory CLI", } - c.AddCommand(devCommands...) + c.AddCommand(newDevCommands()...) c.AddCommand( cloudx.NewAuthCmd(), cloudx.NewCreateCmd(), @@ -46,7 +46,7 @@ func NewRootCmd() *cobra.Command { cloudx.NewRevokeCmd(), cloudx.NewIntrospectCmd(), cloudx.NewIsCmd(), - versionCmd, + newVersionCmd(), ) cmdx.EnableUsageTemplating(c) diff --git a/cmd/root_race_test.go b/cmd/root_race_test.go new file mode 100644 index 00000000..97e55190 --- /dev/null +++ b/cmd/root_race_test.go @@ -0,0 +1,36 @@ +// Copyright © 2023 Ory Corp +// SPDX-License-Identifier: Apache-2.0 + +package cmd + +import ( + "bytes" + "sync" + "testing" +) + +// TestNewRootCmdConcurrent guards against data races in NewRootCmd. The command +// executer (github.com/ory/x/cmdx.CommandExecuter) calls New() for every command +// invocation, and the cloudx test suites run those invocations in parallel, so +// NewRootCmd must be safe to call concurrently and must return fully independent +// command trees. Run with -race to detect regressions. +func TestNewRootCmdConcurrent(t *testing.T) { + const goroutines = 16 + + // Mix of args so we exercise both command execution and full-tree help + // rendering, which walks every (shared) subcommand. + argSets := [][]string{{"version"}, {"--help"}, {"dev", "--help"}} + + var wg sync.WaitGroup + for i := range goroutines { + wg.Go(func() { + args := argSets[i%len(argSets)] + c := NewRootCmd() + c.SetArgs(args) + c.SetOut(&bytes.Buffer{}) + c.SetErr(&bytes.Buffer{}) + _ = c.Execute() + }) + } + wg.Wait() +} diff --git a/cmd/version.go b/cmd/version.go index 680ffb1e..7eb1b84c 100644 --- a/cmd/version.go +++ b/cmd/version.go @@ -11,12 +11,14 @@ import ( "github.com/spf13/cobra" ) -var versionCmd = &cobra.Command{ - Use: "version", - Short: "Display this binary's version, build time, and git hash of this build", - Run: func(cmd *cobra.Command, args []string) { - fmt.Printf("Version: %s\n", buildinfo.Version) - fmt.Printf("Git Hash: %s\n", buildinfo.GitHash) - fmt.Printf("Build Time: %s\n", buildinfo.Time) - }, +func newVersionCmd() *cobra.Command { + return &cobra.Command{ + Use: "version", + Short: "Display this binary's version, build time, and git hash of this build", + Run: func(cmd *cobra.Command, args []string) { + fmt.Printf("Version: %s\n", buildinfo.Version) + fmt.Printf("Git Hash: %s\n", buildinfo.GitHash) + fmt.Printf("Build Time: %s\n", buildinfo.Time) + }, + } } diff --git a/go.mod b/go.mod index 52700c5e..42608ab5 100644 --- a/go.mod +++ b/go.mod @@ -7,24 +7,23 @@ replace github.com/gorilla/sessions => github.com/ory/sessions v1.2.2-0.20220110 require ( dario.cat/mergo v1.0.2 github.com/Masterminds/semver/v3 v3.5.0 - github.com/deckarep/golang-set v1.8.0 github.com/evanphx/json-patch v5.9.0+incompatible github.com/getkin/kin-openapi v0.131.0 github.com/ghodss/yaml v1.0.0 github.com/go-jose/go-jose/v3 v3.0.5 github.com/gofrs/uuid v4.4.0+incompatible - github.com/gomarkdown/markdown v0.0.0-20240730141124-034f12af3bf6 + github.com/gomarkdown/markdown v0.0.0-20260417124207-7d523f7318df github.com/hashicorp/go-retryablehttp v0.7.8 github.com/ory/client-go v1.22.41 github.com/ory/gochimp3 v0.0.0-20200417124117-ccd242db3655 github.com/ory/graceful v0.2.0 github.com/ory/herodot v0.10.9-0.20260330111132-da75ef0fbc22 github.com/ory/hydra-client-go/v2 v2.4.0-alpha.1.0.20251107123905-f3d35665821b - github.com/ory/hydra/v2 v2.3.1-0.20260521102426-2e62d4d951ef + github.com/ory/hydra/v2 v2.3.1-0.20260608173701-e93cfd611f53 github.com/ory/jsonschema/v3 v3.0.9-0.20250317235931-280c5fc7bf0e - github.com/ory/keto v0.14.1-0.20260521082736-bcf74421eaf2 - github.com/ory/kratos v1.3.1-0.20260521101516-8b2f33bd5c3d - github.com/ory/x v0.0.730-0.20260521082735-5aba9539f9e9 + github.com/ory/keto v0.14.1-0.20260609063042-5da3a68a58d9 + github.com/ory/kratos v1.3.1-0.20260608173705-6611397deb2b + github.com/ory/x v0.0.730-0.20260608173703-f144602ce3cf github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c github.com/pkg/errors v0.9.1 github.com/playwright-community/playwright-go v0.4702.0 @@ -37,7 +36,7 @@ require ( github.com/tidwall/sjson v1.2.5 github.com/urfave/negroni v1.0.0 golang.org/x/oauth2 v0.36.0 - golang.org/x/text v0.37.0 + golang.org/x/text v0.38.0 gopkg.in/yaml.v2 v2.4.0 ) @@ -77,7 +76,6 @@ require ( github.com/dghubble/oauth1 v0.7.3 // indirect github.com/dgraph-io/ristretto/v2 v2.4.0 // indirect github.com/distribution/reference v0.6.0 // indirect - github.com/docker/docker v28.5.2+incompatible // indirect github.com/docker/go-connections v0.7.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect @@ -206,7 +204,7 @@ require ( github.com/ory/dockertest/v4 v4.0.0 // indirect github.com/ory/go-acc v0.2.9-0.20230103102148-6b1c9a70dbbe // indirect github.com/ory/go-convenience v0.1.1-0.20251022160015-e2a1f648d0b1 // indirect - github.com/ory/keto/proto v0.13.0-alpha.0.0.20260521082736-bcf74421eaf2 // indirect + github.com/ory/keto/proto v0.13.0-alpha.0.0.20260609063042-5da3a68a58d9 // indirect github.com/ory/kratos-client-go v1.3.9-0.20251107123727-a6ddbd382e38 // indirect github.com/ory/mail/v3 v3.0.1-0.20260416102637-e762925f059d // indirect github.com/ory/nosurf v1.2.7 // indirect @@ -279,12 +277,12 @@ require ( go.uber.org/multierr v1.11.0 // indirect go.yaml.in/yaml/v2 v2.4.4 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/crypto v0.51.0 // indirect + golang.org/x/crypto v0.53.0 // indirect golang.org/x/exp v0.0.0-20260508232706-74f9aab9d74a // indirect golang.org/x/mod v0.36.0 // indirect - golang.org/x/net v0.54.0 // indirect - golang.org/x/sync v0.20.0 // indirect - golang.org/x/sys v0.44.0 // indirect + golang.org/x/net v0.55.0 // indirect + golang.org/x/sync v0.21.0 // indirect + golang.org/x/sys v0.46.0 // indirect golang.org/x/telemetry v0.0.0-20260508192327-42602be52be6 // indirect golang.org/x/tools v0.45.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20260519071638-aa98bba5eb94 // indirect diff --git a/go.sum b/go.sum index 4143042e..4e3cad8a 100644 --- a/go.sum +++ b/go.sum @@ -41,8 +41,6 @@ dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7 filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= filippo.io/edwards25519 v1.2.0 h1:crnVqOiS4jqYleHd9vaKZ+HKtHfllngJIiOpNpoJsjo= filippo.io/edwards25519 v1.2.0/go.mod h1:xzAOLCNug/yB62zG1bQ8uziwrIqIuxhctzJT18Q77mc= -github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg= -github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= @@ -114,8 +112,6 @@ github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE= github.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk= -github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= -github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= github.com/coreos/go-oidc/v3 v3.18.0 h1:V9orjXynvu5wiC9SemFTWnG4F45v403aIcjWo0d41+A= github.com/coreos/go-oidc/v3 v3.18.0/go.mod h1:DYCf24+ncYi+XkIH97GY1+dqoRlbaSI26KVTCI9SrY4= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= @@ -126,8 +122,6 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= -github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.1 h1:5RVFMOWjMyRy8cARdy79nAmgYw3hK/4HUq48LQ6Wwqo= @@ -140,8 +134,6 @@ github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa5 github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/docker v28.5.2+incompatible h1:DBX0Y0zAjZbSrm1uzOkdr1onVghKaftjlSWt4AFexzM= -github.com/docker/docker v28.5.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.7.0 h1:6SsRfJddP22WMrCkj19x9WKjEDTB+ahsdiGYf0mN39c= github.com/docker/go-connections v0.7.0/go.mod h1:no1qkHdjq7kLMGUXYAduOhYPSJxxvgWBh7ogVvptn3Q= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -302,8 +294,8 @@ github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/gomarkdown/markdown v0.0.0-20240730141124-034f12af3bf6 h1:ZPy+2XJ8u0bB3sNFi+I72gMEMS7MTg7aZCCXPOjV8iw= -github.com/gomarkdown/markdown v0.0.0-20240730141124-034f12af3bf6/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA= +github.com/gomarkdown/markdown v0.0.0-20260417124207-7d523f7318df h1:Mwihr/o+v4L5h56rwHLOE20+hh7Okhwno5BHz3zDuao= +github.com/gomarkdown/markdown v0.0.0-20260417124207-7d523f7318df/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.1.1-0.20171103154506-982329095285/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -535,18 +527,10 @@ github.com/moby/moby/api v1.54.2 h1:wiat9QAhnDQjA7wk1kh/TqHz2I1uUA7M7t9SAl/JNXg= github.com/moby/moby/api v1.54.2/go.mod h1:+RQ6wluLwtYaTd1WnPLykIDPekkuyD/ROWQClE83pzs= github.com/moby/moby/client v0.4.1 h1:DMQgisVoMkmMs7fp3ROSdiBnoAu8+vo3GggFl06M/wY= github.com/moby/moby/client v0.4.1/go.mod h1:z52C9O2POPOsnxZAy//WtKcQ32P+jT/NGeXu/7nfjGQ= -github.com/moby/sys/atomicwriter v0.1.0 h1:kw5D/EqkBwsBFi0ss9v1VG3wIkVhzGvLklJ+w3A14Sw= -github.com/moby/sys/atomicwriter v0.1.0/go.mod h1:Ul8oqv2ZMNHOceF643P6FKPXeCmYtlQMvpizfsSoaWs= -github.com/moby/sys/sequential v0.6.0 h1:qrx7XFUd/5DxtqcoH1h438hF5TmOvzC/lspjy7zgvCU= -github.com/moby/sys/sequential v0.6.0/go.mod h1:uyv8EUTrca5PnDsdMGXhZe6CCe8U/UiTWd+lL+7b/Ko= -github.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ= -github.com/moby/term v0.5.2/go.mod h1:d3djjFCrjnB+fl8NJux+EJzu0msscUP+f8it8hPkFLc= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/montanaflynn/stats v0.9.0 h1:tsBJ0RXwph9BmAuFoCmqGv6e8xa0MENQ8m0ptKq29mQ= github.com/montanaflynn/stats v0.9.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/ncruces/go-strftime v1.0.0 h1:HMFp8mLCTPp341M/ZnA4qaf7ZlsbTc+miZjCLOFAw7w= @@ -586,16 +570,16 @@ github.com/ory/herodot v0.10.9-0.20260330111132-da75ef0fbc22 h1:xSbAB0yH2CUPqf9t github.com/ory/herodot v0.10.9-0.20260330111132-da75ef0fbc22/go.mod h1:by6EjQDF4bDC2OuWOBd9EBRrTjtl0+kxSzyvuizM0Iw= github.com/ory/hydra-client-go/v2 v2.4.0-alpha.1.0.20251107123905-f3d35665821b h1:2mfIv+P6sCUIEVNgGCrj0EBtyxudxXIoGdYBk6V7HMo= github.com/ory/hydra-client-go/v2 v2.4.0-alpha.1.0.20251107123905-f3d35665821b/go.mod h1:7jEdxEF8ZgjU3PJ4yGvSGv7nptAvMeuX2EQdfHxKOGo= -github.com/ory/hydra/v2 v2.3.1-0.20260521102426-2e62d4d951ef h1:jqmiddO2cy5IvE8asCbnjUGDk1dLy2DCQpQWzyowZJk= -github.com/ory/hydra/v2 v2.3.1-0.20260521102426-2e62d4d951ef/go.mod h1:tPaZlvf6nYlo9hxikWNeUqjEe6C8mXbj6Zqyn8xamNs= +github.com/ory/hydra/v2 v2.3.1-0.20260608173701-e93cfd611f53 h1:Vg8jvbR1A+F2n/ecV+VDHbp9gFHOlBHlMR5FN54G3Lc= +github.com/ory/hydra/v2 v2.3.1-0.20260608173701-e93cfd611f53/go.mod h1:AsvHHY4xwfpWuiAkggR8Ygj/W3jp1F2/njTEc9aeabs= github.com/ory/jsonschema/v3 v3.0.9-0.20250317235931-280c5fc7bf0e h1:4tUrC7x4YWRVMFp+c64KACNSGchW1zXo4l6Pa9/1hA8= github.com/ory/jsonschema/v3 v3.0.9-0.20250317235931-280c5fc7bf0e/go.mod h1:XWLxVK4un/iuIcrw+6lCeanbF3NZwO5k6RdLeu/loQk= -github.com/ory/keto v0.14.1-0.20260521082736-bcf74421eaf2 h1:LAwRpzYRbD07uZZ2egqUuU395S3TCcUSTwQNSSUXDyY= -github.com/ory/keto v0.14.1-0.20260521082736-bcf74421eaf2/go.mod h1:zEGNe/Xjms5kioJ81AduPA+bwQxrr3JnmC2TQiELjGk= -github.com/ory/keto/proto v0.13.0-alpha.0.0.20260521082736-bcf74421eaf2 h1:QonPC/GoZCV7lgKeCycF+/kXcdyp2vRPBlbEwA3yQso= -github.com/ory/keto/proto v0.13.0-alpha.0.0.20260521082736-bcf74421eaf2/go.mod h1:c2UboItfGpqIzXoXlxBRMCp3rQqO+Wx2ecsH25jcWxU= -github.com/ory/kratos v1.3.1-0.20260521101516-8b2f33bd5c3d h1:fBqMbUbDfHKrLTiVs8OKSnhaJEmHZtneGEx2x71B+fI= -github.com/ory/kratos v1.3.1-0.20260521101516-8b2f33bd5c3d/go.mod h1:9B3U/szFU3Xj1kSIKBKX/Efq8SAZeX6Xv4gAwU3cm58= +github.com/ory/keto v0.14.1-0.20260609063042-5da3a68a58d9 h1:7yJhDvsX68+8DDX/Boso8Y6NhzTwTyCtkY90HynmMyg= +github.com/ory/keto v0.14.1-0.20260609063042-5da3a68a58d9/go.mod h1:1K+RoaXLOsctwZ36aF9CVNn2R6VKONUZ7uiOtzryZcc= +github.com/ory/keto/proto v0.13.0-alpha.0.0.20260609063042-5da3a68a58d9 h1:tFb+Zp8wh1sx7oAGwzo/4VteInE8ASyPnLTSY/Y9ffY= +github.com/ory/keto/proto v0.13.0-alpha.0.0.20260609063042-5da3a68a58d9/go.mod h1:c2UboItfGpqIzXoXlxBRMCp3rQqO+Wx2ecsH25jcWxU= +github.com/ory/kratos v1.3.1-0.20260608173705-6611397deb2b h1:xGpxHAxXxWphirdARCKXY3MZzBkwBZdK+0uXfRIdQwU= +github.com/ory/kratos v1.3.1-0.20260608173705-6611397deb2b/go.mod h1:MR0LOBj9fDQXjHEz61hb9dHZRAo5wi6iq9dpqDDbEOQ= github.com/ory/kratos-client-go v1.3.9-0.20251107123727-a6ddbd382e38 h1:2u3D5JnacWSGQJPtJtVh5uGAfXc6k3v0k/DNrEvf4ZY= github.com/ory/kratos-client-go v1.3.9-0.20251107123727-a6ddbd382e38/go.mod h1:r9UvPdbehDWNyqSI/0NRv79OQab9xJK9Q/Q+G7Htiq8= github.com/ory/mail/v3 v3.0.1-0.20260416102637-e762925f059d h1:bjIHhznjsse5IQyH6oNxZU7bY52dClidFpO0PZHY0YM= @@ -606,8 +590,8 @@ github.com/ory/pop/v6 v6.4.2-0.20260507161217-89126558d369 h1:ThuxYV66E8HKj36IFV github.com/ory/pop/v6 v6.4.2-0.20260507161217-89126558d369/go.mod h1:vd8H2inBRK+ZF+r5jDdx/fYPwqWrbVoAD4t7vAfXeA4= github.com/ory/sessions v1.2.2-0.20220110165800-b09c17334dc2 h1:zm6sDvHy/U9XrGpixwHiuAwpp0Ock6khSVHkrv6lQQU= github.com/ory/sessions v1.2.2-0.20220110165800-b09c17334dc2/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= -github.com/ory/x v0.0.730-0.20260521082735-5aba9539f9e9 h1:VVDhptEDNLZ6SiM2X42YnsXzMtFcghm5YquYohBfmWg= -github.com/ory/x v0.0.730-0.20260521082735-5aba9539f9e9/go.mod h1:mgqttBuDgwH8STQlHVnG6Vn8WsVUR9MKEb3UbS6/nUE= +github.com/ory/x v0.0.730-0.20260608173703-f144602ce3cf h1:dj8lEpI29D0c6HgS9/gxf9BF3ZF9bNv7uySJ0nRBO34= +github.com/ory/x v0.0.730-0.20260608173703-f144602ce3cf/go.mod h1:Mv/cc261EcPIInHw6Lp2N+tbP80zgd6wiTZcj5XoNUY= github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw= github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= @@ -840,8 +824,8 @@ golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2Uz golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI= -golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8= +golang.org/x/crypto v0.53.0 h1:QZ4Muo8THX6CizN2vPPd5fBGHyogrdK9fG4wLPFUsto= +golang.org/x/crypto v0.53.0/go.mod h1:DNLU434OwVakk9PzuwV8w62mAJpRJL3vsgcfp4Qnsio= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -919,8 +903,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/net v0.54.0 h1:2zJIZAxAHV/OHCDTCOHAYehQzLfSXuf/5SoL/Dv6w/w= -golang.org/x/net v0.54.0/go.mod h1:Sj4oj8jK6XmHpBZU/zWHw3BV3abl4Kvi+Ut7cQcY+cQ= +golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= +golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= golang.org/x/oauth2 v0.0.0-20170912212905-13449ad91cb2/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -944,8 +928,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= -golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM= +golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -988,8 +972,8 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ= -golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw= +golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/telemetry v0.0.0-20260508192327-42602be52be6 h1:HjU6IWBiAgRIdAJ9/y1rwCn+UELEmwV+VsTLzj/W4sE= golang.org/x/telemetry v0.0.0-20260508192327-42602be52be6/go.mod h1:Eqhaxk/wZsWEH8CRxLwj6xzEJbz7k1EFGqx7nyCoabE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -1012,14 +996,12 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= -golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= +golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE= +golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4= golang.org/x/time v0.0.0-20170424234030-8be79e1e0910/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= -golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=