Repository: ariga/atlas
Pull request #1580 (2023-04-12 07:35:00)

doc/website/blog: broken link on old post


Patch:
diff --git a/cmd/atlas/internal/cmdapi/migrate.go b/cmd/atlas/internal/cmdapi/migrate.go
index 5c91bf69..376a01e5 100644
--- a/cmd/atlas/internal/cmdapi/migrate.go
+++ b/cmd/atlas/internal/cmdapi/migrate.go
@@ -1614,6 +1614,9 @@ func setMigrateEnvFlags(cmd *cobra.Command, env *Env) error {
 		return err
 	}
 	for i, s := range srcs {
+		if isURL(s) {
+			continue
+		}
 		if s, err = filepath.Abs(s); err != nil {
 			return fmt.Errorf("finding abs path to source: %q: %w", s, err)
 		}
@@ -1628,6 +1631,13 @@ func setMigrateEnvFlags(cmd *cobra.Command, env *Env) error {
 	return nil
 }
 
+// isURL returns true if the given string
+// is an Atlas URL with a scheme.
+func isURL(s string) bool {
+	u, err := url.Parse(s)
+	return err == nil && u.Scheme != ""
+}
+
 // cmdEnvsRun executes a given command on each of the configured environment.
 func cmdEnvsRun[F any](
 	run func(*cobra.Command, []string, F) error,
diff --git a/cmd/atlas/internal/cmdapi/schema.go b/cmd/atlas/internal/cmdapi/schema.go
index 09237bfc..c2feadec 100644
--- a/cmd/atlas/internal/cmdapi/schema.go
+++ b/cmd/atlas/internal/cmdapi/schema.go
@@ -126,7 +126,7 @@ func schemaApplyRun(cmd *cobra.Command, _ []string, flags schemaApplyFlags) erro
 	// If the old -f flag is given convert them to the URL format. If both are given,
 	// cobra would throw an error since they are marked as mutually exclusive.
 	for _, p := range flags.paths {
-		if !strings.Contains(p, "://") {
+		if !isURL(p) {
 			p = "file://" + p
 		}
 		flags.toURLs = append(flags.toURLs, p)
@@ -395,7 +395,8 @@ func schemaDiffRun(cmd *cobra.Command, _ []string, flags schemaDiffFlags) error
 }
 
 type schemaInspectFlags struct {
-	url       string   // URL of database to apply the changes on.
+	url       string   // URL of resource to inspect.
+	devURL    string   // URL of the dev database.
 	logFormat string   // Format of the log output.
 	schemas   []string // Schemas to take into account when diffing.
 	exclude   []string // List of glob patterns used to filter resources from applying (see schema.InspectOptions).
@@ -435,6 +436,7 @@ flag.
 	)
 	cmd.Flags().SortFlags = false
 	addFlagURL(cmd.Flags(), &flags.url)
+	addFlagDevURL(cmd.Flags(), &flags.devURL)
 	addFlagSchemas(cmd.Flags(), &flags.schemas)
 	addFlagExclude(cmd.Flags(), &flags.exclude)
 	addFlagLog(cmd.Flags(), &flags.logFormat)
@@ -445,25 +447,40 @@ flag.
 }
 
 func schemaInspectRun(cmd *cobra.Command, _ []string, flags schemaInspectFlags) error {
-	client, err := sqlclient.Open(cmd.Context(), flags.url)
+	var (
+		ctx = cmd.Context()
+		dev *sqlclient.Client
+	)
+	if flags.devURL != "" {
+		var err error
+		dev, err = sqlclient.Open(ctx, flags.devURL)
+		if err != nil {
+			return err
+		}
+		defer dev.Close()
+	}
+	r, err := stateReader(ctx, &stateReaderConfig{
+		urls:    []string{flags.url},
+		dev:     dev,
+		vars:    GlobalFlags.Vars,
+		schemas: flags.schemas,
+		exclude: flags.exclude,
+	})
 	if err != nil {
 		return err
 	}
-	defer client.Close()
-	schemas := flags.schemas
-	if client.URL.Schema != "" {
-		schemas = append(schemas, client.URL.Schema)
+	defer r.Close()
+	client, ok := r.Closer.(*sqlclient.Client)
+	if !ok && dev != nil {
+		client = dev
 	}
-	s, err := client.InspectRealm(cmd.Context(), &schema.InspectRealmOption{
-		Schemas: schemas,
-		Exclude: flags.exclude,
-	})
 	format := cmdlog.SchemaInspectTemplate
 	if v := flags.logFormat; v != "" {
 		if format, err = template.New("format").Funcs(cmdlog.InspectTemplateFuncs).Parse(v); err != nil {
 			return fmt.Errorf("parse log format: %w", err)
 		}
 	}
+	s, err := r.ReadState(ctx)
 	return format.Execute(cmd.OutOrStdout(), &cmdlog.SchemaInspect{
 		Client: client,
 		Realm:  s,
diff --git a/doc/md/atlas-schema/projects.mdx b/doc/md/atlas-schema/projects.mdx
index 52a5c416..c466197e 100644
--- a/doc/md/atlas-schema/projects.mdx
+++ b/doc/md/atlas-schema/projects.mdx
@@ -20,8 +20,8 @@ environments when working with Atlas. A project file is a file named
 // Define an environment named "local"
 env "local" {
   // Declare where the schema definition resides.
-  // Also supported: ["multi.hcl", "file.hcl"].
-  src = "./project/schema.hcl"
+  // Also supported: ["file://multi.hcl", "file://schema.hcl"].
+  src = "file://project/schema.hcl"
 
   // Define the URL of the database which is managed
   // in this environment.
diff --git a/doc/md/concepts/url.mdx b/doc/md/concepts/url.mdx
index 9ee0942a..fdc3354d 100644
--- a/doc/md/concepts/url.mdx
+++ b/doc/md/concepts/url.mdx
@@ -37,6 +37,16 @@ mysql://user:pass@localhost
 mysql://user:pass@localhost:3306/database
 ```
 
+Connecting using Unix Sockets:
+
+```
+mysql+unix:///tmp/mysql.sock
+
+mysql+unix://user:pass@/tmp/mysql.sock
+
+mysql+unix://user@/tmp/mysql.sock?database=dbname
+```
+
 </TabItem>
 <TabItem value="maria">
 
@@ -48,6 +58,16 @@ maria://user:pass@localhost
 maria://user:pass@localhost:3306/database
 ```
 
+Connecting using Unix Sockets:
+
+```
+maria+unix:///tmp/mysql.sock
+
+maria+unix://user:pass@/tmp/mysql.sock
+
+maria+unix://user@/tmp/mysql.sock?database=dbname
+```
+
 </TabItem>
 <TabItem value="postgres">
 
diff --git a/doc/md/reference.md b/doc/md/reference.md
index 93b8bab4..89e28e52 100644
--- a/doc/md/reference.md
+++ b/doc/md/reference.md
@@ -516,6 +516,7 @@ flag.
 #### Flags
 ```
   -u, --url string        [driver://username:password@address/dbname?param=value] select a resource using the URL format
+      --dev-url string    [driver://username:password@address/dbname?param=value] select a dev database using the URL format
   -s, --schema strings    set schema names
       --exclude strings   list of glob patterns used to filter resources from applying
       --format string     Go template to use to format the output
diff --git a/doc/website/blog/2021-11-25-meet-atlas.md b/doc/website/blog/2021-11-25-meet-atlas.md
index 1f239ae3..e70813c3 100644
--- a/doc/website/blog/2021-11-25-meet-atlas.md
+++ b/doc/website/blog/2021-11-25-meet-atlas.md
@@ -37,7 +37,7 @@ known as [infrastructure-as-code](https://en.wikipedia.org/wiki/Infrastructure_a
 Atlas is at the core of Ariga's platform. In this post, I would like to share with you the work we've done so far to
 provide a solid foundation for managing databases in a way that's akin to infrastructure-as-code practices.
 
-* The [Atlas DDL](https://atlasgo.io/ddl) (Data-definition Language): we have created the Atlas DDL, a new configuration language designed
+* The [Atlas DDL](/guides/ddl) (Data-definition Language): we have created the Atlas DDL, a new configuration language designed
 to capture an organization's data topology - including relational database schemas.
 This language is currently described in an HCL syntax (similar to TerraForm),
 but will support more syntaxes such as JSON and TypeScript in the future. The Atlas DDL currently supports
diff --git a/doc/website/package-lock.json b/doc/website/package-lock.json
index 1e84ae17..fed89f6e 100644
--- a/doc/website/package-lock.json
+++ b/doc/website/package-lock.json
@@ -8,7 +8,7 @@
       "name": "website",
       "version": "0.0.0",
       "dependencies": {
-        "@ariga/atlas-website": "0.0.8",
+        "@ariga/atlas-website": "0.0.10",
         "@docusaurus/core": "^2.0.0-rc.1",
         "@docusaurus/plugin-client-redirects": "^2.0.0-rc.1",
         "@docusaurus/preset-classic": "^2.0.0-rc.1",
@@ -168,6 +168,52 @@
         "@algolia/requester-common": "4.13.1"
       }
     },
+    "node_modules/@amplitude/analytics-connector": {
+      "version": "1.4.6",
+      "resolved": "https://registry.npmjs.org/@amplitude/analytics-connector/-/analytics-connector-1.4.6.tgz",
+      "integrity": "sha512-6jD2pOosRD4y8DT8StUCz7yTd5ZDkdOU9/AWnlWKM5qk90Mz7sdZrdZ9H7sA/L3yOJEpQOYZgQplQdWWUzyWug==",
+      "dependencies": {
+        "@amplitude/ua-parser-js": "0.7.31"
+      }
+    },
+    "node_modules/@amplitude/types": {
+      "version": "1.10.2",
+      "resolved": "https://registry.npmjs.org/@amplitude/types/-/types-1.10.2.tgz",
+      "integrity": "sha512-I8qenRI7uU6wKNb9LiZrAosSHVoNHziXouKY81CrqxH9xhVTEIJFXeuCV0hbtBr0Al/8ejnGjQRx+S2SvU/pPg==",
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@amplitude/ua-parser-js": {
+      "version": "0.7.31",
+      "resolved": "https://registry.npmjs.org/@amplitude/ua-parser-js/-/ua-parser-js-0.7.31.tgz",
+      "integrity": "sha512-+z8UGRaj13Pt5NDzOnkTBy49HE2CX64jeL0ArB86HAtilpnfkPB7oqkigN7Lf2LxscMg4QhFD7mmCfedh3rqTg==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/ua-parser-js"
+        },
+        {
+          "type": "paypal",
+          "url": "https://paypal.me/faisalman"
+        }
+      ],
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/@amplitude/utils": {
+      "version": "1.10.2",
+      "resolved": "https://registry.npmjs.org/@amplitude/utils/-/utils-1.10.2.tgz",
+      "integrity": "sha512-tVsHXu61jITEtRjB7NugQ5cVDd4QDzne8T3ifmZye7TiJeUfVRvqe44gDtf55A+7VqhDhyEIIXTA1iVcDGqlEw==",
+      "dependencies": {
+        "@amplitude/types": "^1.10.2",
+        "tslib": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
     "node_modules/@ampproject/remapping": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
@@ -181,11 +227,13 @@
       }
     },
     "node_modules/@ariga/atlas-website": {
-      "version": "0.0.8",
-      "resolved": "https://registry.npmjs.org/@ariga/atlas-website/-/atlas-website-0.0.8.tgz",
-      "integrity": "sha512-8d57orIQpg0pOEFxP2ZQdtfMYrd4UXg2AQNCnoJyBL8Hs6yFVX/benBlzh3OAjL0x4IKEL0bQ7X9UWEbEoZprw==",
+      "version": "0.0.10",
+      "resolved": "https://registry.npmjs.org/@ariga/atlas-website/-/atlas-website-0.0.10.tgz",
+      "integrity": "sha512-0YNAs9V+uTVpkXOoXg7cd/vsHuNEUiZl16Ph9JiTd65Q2KCnCmUOP2QcZoSlrRGVqi1SKP540IcaRLj5zvMgQA==",
       "dependencies": {
+        "@types/amplitude-js": "^8.16.2",
         "@types/react-scroll": "^1.8.6",
+        "amplitude-js": "^8.21.6",
         "autoprefixer": "^10.4.13",
         "gh-pages": "^5.0.0",
         "postcss": "^8.4.21",
@@ -195,8 +243,11 @@
         "prettier-plugin-tailwindcss": "^0.2.2",
         "react": "^17.0.1",
         "react-dom": "^17.0.1",
+        "react-ga4": "^2.1.0",
+        "react-router-dom": "^6.9.0",
         "react-scroll": "^1.8.9",
         "react-scroll-parallax": "^3.3.2",
+        "react-use-intercom": "^5.0.0",
         "replace-in-file": "^6.3.5",
         "tailwind-scrollbar": "^2.1.0",
         "tailwindcss": "^3.2.6",
@@ -225,6 +276,36 @@
         "postcss": "^8.2.14"
       }
     },
+    "node_modules/@ariga/atlas-website/node_modules/react-router": {
+      "version": "6.9.0",
+      "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.9.0.tgz",
+      "integrity": "sha512-51lKevGNUHrt6kLuX3e/ihrXoXCa9ixY/nVWRLlob4r/l0f45x3SzBvYJe3ctleLUQQ5fVa4RGgJOTH7D9Umhw==",
+      "dependencies": {
+        "@remix-run/router": "1.4.0"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "peerDependencies": {
+        "react": ">=16.8"
+      }
+    },
+    "node_modules/@ariga/atlas-website/node_modules/react-router-dom": {
+      "version": "6.9.0",
+      "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.9.0.tgz",
+      "integrity": "sha512-/seUAPY01VAuwkGyVBPCn1OXfVbaWGGu4QN9uj0kCPcTyNYgL1ldZpxZUpRU7BLheKQI4Twtl/OW2nHRF1u26Q==",
+      "dependencies": {
+        "@remix-run/router": "1.4.0",
+        "react-router": "6.9.0"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "peerDependencies": {
+        "react": ">=16.8",
+        "react-dom": ">=16.8"
+      }
+    },
     "node_modules/@babel/code-frame": {
       "version": "7.18.6",
       "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
@@ -1872,11 +1953,11 @@
       }
     },
     "node_modules/@babel/runtime": {
-      "version": "7.18.6",
-      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.6.tgz",
-      "integrity": "sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz",
+      "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==",
       "dependencies": {
-        "regenerator-runtime": "^0.13.4"
+        "regenerator-runtime": "^0.13.11"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -3273,9 +3354,9 @@
       }
     },
     "node_modules/@esbuild/android-arm": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz",
-      "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.16.tgz",
+      "integrity": "sha512-baLqRpLe4JnKrUXLJChoTN0iXZH7El/mu58GE3WIA6/H834k0XWvLRmGLG8y8arTRS9hJJibPnF0tiGhmWeZgw==",
       "cpu": [
         "arm"
       ],
@@ -3289,9 +3370,9 @@
       }
     },
     "node_modules/@esbuild/android-arm64": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz",
-      "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.16.tgz",
+      "integrity": "sha512-QX48qmsEZW+gcHgTmAj+x21mwTz8MlYQBnzF6861cNdQGvj2jzzFjqH0EBabrIa/WVZ2CHolwMoqxVryqKt8+Q==",
       "cpu": [
         "arm64"
       ],
@@ -3305,9 +3386,9 @@
       }
     },
     "node_modules/@esbuild/android-x64": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz",
-      "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.16.tgz",
+      "integrity": "sha512-G4wfHhrrz99XJgHnzFvB4UwwPxAWZaZBOFXh+JH1Duf1I4vIVfuYY9uVLpx4eiV2D/Jix8LJY+TAdZ3i40tDow==",
       "cpu": [
         "x64"
       ],
@@ -3321,9 +3402,9 @@
       }
     },
     "node_modules/@esbuild/darwin-arm64": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz",
-      "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.16.tgz",
+      "integrity": "sha512-/Ofw8UXZxuzTLsNFmz1+lmarQI6ztMZ9XktvXedTbt3SNWDn0+ODTwxExLYQ/Hod91EZB4vZPQJLoqLF0jvEzA==",
       "cpu": [
         "arm64"
       ],
@@ -3337,9 +3418,9 @@
       }
     },
     "node_modules/@esbuild/darwin-x64": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz",
-      "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.16.tgz",
+      "integrity": "sha512-SzBQtCV3Pdc9kyizh36Ol+dNVhkDyIrGb/JXZqFq8WL37LIyrXU0gUpADcNV311sCOhvY+f2ivMhb5Tuv8nMOQ==",
       "cpu": [
         "x64"
       ],
@@ -3353,9 +3434,9 @@
       }
     },
     "node_modules/@esbuild/freebsd-arm64": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz",
-      "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.16.tgz",
+      "integrity": "sha512-ZqftdfS1UlLiH1DnS2u3It7l4Bc3AskKeu+paJSfk7RNOMrOxmeFDhLTMQqMxycP1C3oj8vgkAT6xfAuq7ZPRA==",
       "cpu": [
         "arm64"
       ],
@@ -3369,9 +3450,9 @@
       }
     },
     "node_modules/@esbuild/freebsd-x64": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz",
-      "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.16.tgz",
+      "integrity": "sha512-rHV6zNWW1tjgsu0dKQTX9L0ByiJHHLvQKrWtnz8r0YYJI27FU3Xu48gpK2IBj1uCSYhJ+pEk6Y0Um7U3rIvV8g==",
       "cpu": [
         "x64"
       ],
@@ -3385,9 +3466,9 @@
       }
     },
     "node_modules/@esbuild/linux-arm": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz",
-      "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.16.tgz",
+      "integrity": "sha512-n4O8oVxbn7nl4+m+ISb0a68/lcJClIbaGAoXwqeubj/D1/oMMuaAXmJVfFlRjJLu/ZvHkxoiFJnmbfp4n8cdSw==",
       "cpu": [
         "arm"
       ],
@@ -3401,9 +3482,9 @@
       }
     },
     "node_modules/@esbuild/linux-arm64": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz",
-      "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.16.tgz",
+      "integrity": "sha512-8yoZhGkU6aHu38WpaM4HrRLTFc7/VVD9Q2SvPcmIQIipQt2I/GMTZNdEHXoypbbGao5kggLcxg0iBKjo0SQYKA==",
       "cpu": [
         "arm64"
       ],
@@ -3417,9 +3498,9 @@
       }
     },
     "node_modules/@esbuild/linux-ia32": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz",
-      "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.16.tgz",
+      "integrity": "sha512-9ZBjlkdaVYxPNO8a7OmzDbOH9FMQ1a58j7Xb21UfRU29KcEEU3VTHk+Cvrft/BNv0gpWJMiiZ/f4w0TqSP0gLA==",
       "cpu": [
         "ia32"
       ],
@@ -3433,9 +3514,9 @@
       }
     },
     "node_modules/@esbuild/linux-loong64": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz",
-      "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.16.tgz",
+      "integrity": "sha512-TIZTRojVBBzdgChY3UOG7BlPhqJz08AL7jdgeeu+kiObWMFzGnQD7BgBBkWRwOtKR1i2TNlO7YK6m4zxVjjPRQ==",
       "cpu": [
         "loong64"
       ],
@@ -3449,9 +3530,9 @@
       }
     },
     "node_modules/@esbuild/linux-mips64el": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz",
-      "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.16.tgz",
+      "integrity": "sha512-UPeRuFKCCJYpBbIdczKyHLAIU31GEm0dZl1eMrdYeXDH+SJZh/i+2cAmD3A1Wip9pIc5Sc6Kc5cFUrPXtR0XHA==",
       "cpu": [
         "mips64el"
       ],
@@ -3465,9 +3546,9 @@
       }
     },
     "node_modules/@esbuild/linux-ppc64": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz",
-      "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.16.tgz",
+      "integrity": "sha512-io6yShgIEgVUhExJejJ21xvO5QtrbiSeI7vYUnr7l+v/O9t6IowyhdiYnyivX2X5ysOVHAuyHW+Wyi7DNhdw6Q==",
       "cpu": [
         "ppc64"
       ],
@@ -3481,9 +3562,9 @@
       }
     },
     "node_modules/@esbuild/linux-riscv64": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz",
-      "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.16.tgz",
+      "integrity": "sha512-WhlGeAHNbSdG/I2gqX2RK2gfgSNwyJuCiFHMc8s3GNEMMHUI109+VMBfhVqRb0ZGzEeRiibi8dItR3ws3Lk+cA==",
       "cpu": [
         "riscv64"
       ],
@@ -3497,9 +3578,9 @@
       }
     },
     "node_modules/@esbuild/linux-s390x": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz",
-      "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.16.tgz",
+      "integrity": "sha512-gHRReYsJtViir63bXKoFaQ4pgTyah4ruiMRQ6im9YZuv+gp3UFJkNTY4sFA73YDynmXZA6hi45en4BGhNOJUsw==",
       "cpu": [
         "s390x"
       ],
@@ -3513,9 +3594,9 @@
       }
     },
     "node_modules/@esbuild/linux-x64": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz",
-      "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.16.tgz",
+      "integrity": "sha512-mfiiBkxEbUHvi+v0P+TS7UnA9TeGXR48aK4XHkTj0ZwOijxexgMF01UDFaBX7Q6CQsB0d+MFNv9IiXbIHTNd4g==",
       "cpu": [
         "x64"
       ],
@@ -3529,9 +3610,9 @@
       }
     },
     "node_modules/@esbuild/netbsd-x64": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz",
-      "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.16.tgz",
+      "integrity": "sha512-n8zK1YRDGLRZfVcswcDMDM0j2xKYLNXqei217a4GyBxHIuPMGrrVuJ+Ijfpr0Kufcm7C1k/qaIrGy6eG7wvgmA==",
       "cpu": [
         "x64"
       ],
@@ -3545,9 +3626,9 @@
       }
     },
     "node_modules/@esbuild/openbsd-x64": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz",
-      "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.16.tgz",
+      "integrity": "sha512-lEEfkfsUbo0xC47eSTBqsItXDSzwzwhKUSsVaVjVji07t8+6KA5INp2rN890dHZeueXJAI8q0tEIfbwVRYf6Ew==",
       "cpu": [
         "x64"
       ],
@@ -3561,9 +3642,9 @@
       }
     },
     "node_modules/@esbuild/sunos-x64": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz",
-      "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.16.tgz",
+      "integrity": "sha512-jlRjsuvG1fgGwnE8Afs7xYDnGz0dBgTNZfgCK6TlvPH3Z13/P5pi6I57vyLE8qZYLrGVtwcm9UbUx1/mZ8Ukag==",
       "cpu": [
         "x64"
       ],
@@ -3577,9 +3658,9 @@
       }
     },
     "node_modules/@esbuild/win32-arm64": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz",
-      "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.16.tgz",
+      "integrity": "sha512-TzoU2qwVe2boOHl/3KNBUv2PNUc38U0TNnzqOAcgPiD/EZxT2s736xfC2dYQbszAwo4MKzzwBV0iHjhfjxMimg==",
       "cpu": [
         "arm64"
       ],
@@ -3593,9 +3674,9 @@
       }
     },
     "node_modules/@esbuild/win32-ia32": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz",
-      "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.16.tgz",
+      "integrity": "sha512-B8b7W+oo2yb/3xmwk9Vc99hC9bNolvqjaTZYEfMQhzdpBsjTvZBlXQ/teUE55Ww6sg//wlcDjOaqldOKyigWdA==",
       "cpu": [
         "ia32"
       ],
@@ -3609,9 +3690,9 @@
       }
     },
     "node_modules/@esbuild/win32-x64": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz",
-      "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.16.tgz",
+      "integrity": "sha512-xJ7OH/nanouJO9pf03YsL9NAFQBHd8AqfrQd7Pf5laGyyTt/gToul6QYOA/i5i/q8y9iaM5DQFNTgpi995VkOg==",
       "cpu": [
         "x64"
       ],
@@ -3906,6 +3987,14 @@
       "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz",
       "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g=="
     },
+    "node_modules/@remix-run/router": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.4.0.tgz",
+      "integrity": "sha512-BJ9SxXux8zAg991UmT8slpwpsd31K1dHHbD3Ba4VzD+liLQ4WAMSxQp2d2ZPRPfN0jN2NPRowcSSoM7lCaF08Q==",
+      "engines": {
+        "node": ">=14"
+      }
+    },
     "node_modules/@rollup/pluginutils": {
       "version": "5.0.2",
       "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz",
@@ -4436,6 +4525,11 @@
         "node": ">=10"
       }
     },
+    "node_modules/@types/amplitude-js": {
+      "version": "8.16.2",
+      "resolved": "https://registry.npmjs.org/@types/amplitude-js/-/amplitude-js-8.16.2.tgz",
+      "integrity": "sha512-a+tb/CEQOlrHRvEvAuYNOcoUy1POERANnAhfKgiTmsy0eACj3eukGP0ucA9t115QOPzVUhbnUfZqtyHp99IZyA=="
+    },
     "node_modules/@types/argparse": {
       "version": "1.0.38",
       "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz",
@@ -5021,6 +5115,19 @@
         "algoliasearch": ">= 3.1 < 6"
       }
     },
+    "node_modules/amplitude-js": {
+      "version": "8.21.7",
+      "resolved": "https://registry.npmjs.org/amplitude-js/-/amplitude-js-8.21.7.tgz",
+      "integrity": "sha512-qciiLxH1vR1+46DNzDLGQhtaS1fSAuv7WH73S+prYTiaUm1fuze+pVGl7hLdVBu7Tchi1RKfYxsqa2c9p/dfxQ==",
+      "dependencies": {
+        "@amplitude/analytics-connector": "^1.4.6",
+        "@amplitude/ua-parser-js": "0.7.31",
+        "@amplitude/utils": "^1.10.2",
+        "@babel/runtime": "^7.21.0",
+        "blueimp-md5": "^2.19.0",
+        "query-string": "8.1.0"
+      }
+    },
     "node_modules/ansi-align": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
@@ -5336,6 +5443,11 @@
         "node": ">=8"
       }
     },
+    "node_modules/blueimp-md5": {
+      "version": "2.19.0",
+      "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz",
+      "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w=="
+    },
     "node_modules/body-parser": {
       "version": "1.20.0",
       "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz",
@@ -6781,6 +6893,14 @@
         }
       }
     },
+    "node_modules/decode-uri-component": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.4.1.tgz",
+      "integrity": "sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==",
+      "engines": {
+        "node": ">=14.16"
+      }
+    },
     "node_modules/decompress-response": {
       "version": "3.3.0",
       "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
@@ -7276,9 +7396,9 @@
       }
     },
     "node_modules/esbuild": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz",
-      "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.16.tgz",
+      "integrity": "sha512-aeSuUKr9aFVY9Dc8ETVELGgkj4urg5isYx8pLf4wlGgB0vTFjxJQdHnNH6Shmx4vYYrOTLCHtRI5i1XZ9l2Zcg==",
       "hasInstallScript": true,
       "peer": true,
       "bin": {
@@ -7288,28 +7408,28 @@
         "node": ">=12"
       },
       "optionalDependencies": {
-        "@esbuild/android-arm": "0.16.17",
-        "@esbuild/android-arm64": "0.16.17",
-        "@esbuild/android-x64": "0.16.17",
-        "@esbuild/darwin-arm64": "0.16.17",
-        "@esbuild/darwin-x64": "0.16.17",
-        "@esbuild/freebsd-arm64": "0.16.17",
-        "@esbuild/freebsd-x64": "0.16.17",
-        "@esbuild/linux-arm": "0.16.17",
-        "@esbuild/linux-arm64": "0.16.17",
-        "@esbuild/linux-ia32": "0.16.17",
-        "@esbuild/linux-loong64": "0.16.17",
-        "@esbuild/linux-mips64el": "0.16.17",
-        "@esbuild/linux-ppc64": "0.16.17",
-        "@esbuild/linux-riscv64": "0.16.17",
-        "@esbuild/linux-s390x": "0.16.17",
-        "@esbuild/linux-x64": "0.16.17",
-        "@esbuild/netbsd-x64": "0.16.17",
-        "@esbuild/openbsd-x64": "0.16.17",
-        "@esbuild/sunos-x64": "0.16.17",
-        "@esbuild/win32-arm64": "0.16.17",
-        "@esbuild/win32-ia32": "0.16.17",
-        "@esbuild/win32-x64": "0.16.17"
+        "@esbuild/android-arm": "0.17.16",
+        "@esbuild/android-arm64": "0.17.16",
+        "@esbuild/android-x64": "0.17.16",
+        "@esbuild/darwin-arm64": "0.17.16",
+        "@esbuild/darwin-x64": "0.17.16",
+        "@esbuild/freebsd-arm64": "0.17.16",
+        "@esbuild/freebsd-x64": "0.17.16",
+        "@esbuild/linux-arm": "0.17.16",
+        "@esbuild/linux-arm64": "0.17.16",
+        "@esbuild/linux-ia32": "0.17.16",
+        "@esbuild/linux-loong64": "0.17.16",
+        "@esbuild/linux-mips64el": "0.17.16",
+        "@esbuild/linux-ppc64": "0.17.16",
+        "@esbuild/linux-riscv64": "0.17.16",
+        "@esbuild/linux-s390x": "0.17.16",
+        "@esbuild/linux-x64": "0.17.16",
+        "@esbuild/netbsd-x64": "0.17.16",
+        "@esbuild/openbsd-x64": "0.17.16",
+        "@esbuild/sunos-x64": "0.17.16",
+        "@esbuild/win32-arm64": "0.17.16",
+        "@esbuild/win32-ia32": "0.17.16",
+        "@esbuild/win32-x64": "0.17.16"
       }
     },
     "node_modules/escalade": {
@@ -7733,6 +7853,17 @@
         "node": ">=8"
       }
     },
+    "node_modules/filter-obj": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-5.1.0.tgz",
+      "integrity": "sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==",
+      "engines": {
+        "node": ">=14.16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/finalhandler": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
@@ -11535,6 +11666,22 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/query-string": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/query-string/-/query-string-8.1.0.tgz",
+      "integrity": "sha512-BFQeWxJOZxZGix7y+SByG3F36dA0AbTy9o6pSmKFcFz7DAj0re9Frkty3saBn3nHo3D0oZJ/+rx3r8H8r8Jbpw==",
+      "dependencies": {
+        "decode-uri-component": "^0.4.1",
+        "filter-obj": "^5.1.0",
+        "split-on-first": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=14.16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/querystringify": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
@@ -11786,6 +11933,11 @@
       "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz",
       "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA=="
     },
+    "node_modules/react-ga4": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/react-ga4/-/react-ga4-2.1.0.tgz",
+      "integrity": "sha512-ZKS7PGNFqqMd3PJ6+C2Jtz/o1iU9ggiy8Y8nUeksgVuvNISbmrQtJiZNvC/TjDsqD0QlU5Wkgs7i+w9+OjHhhQ=="
+    },
     "node_modules/react-helmet-async": {
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz",
@@ -11997,6 +12149,18 @@
         }
       }
     },
+    "node_modules/react-use-intercom": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/react-use-intercom/-/react-use-intercom-5.0.0.tgz",
+      "integrity": "sha512-qTPW3FbvzGwZUy6jmMPttK0T7Iy4cK93wDrWfOL36Cd4qPkozPVkXLcGNKYUfMsgaclyF+EXrbFQ135Wg5m0Zw==",
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "react": ">=16.8.0",
+        "react-dom": ">=16.8.0"
+      }
+    },
     "node_modules/read-cache": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
@@ -12073,9 +12237,9 @@
       }
     },
     "node_modules/regenerator-runtime": {
-      "version": "0.13.9",
-      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
-      "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
+      "version": "0.13.11",
+      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+      "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
     },
     "node_modules/regenerator-transform": {
       "version": "0.15.0",
@@ -12458,9 +12622,9 @@
       }
     },
     "node_modules/rollup": {
-      "version": "3.18.0",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.18.0.tgz",
-      "integrity": "sha512-J8C6VfEBjkvYPESMQYxKHxNOh4A5a3FlP+0BETGo34HEcE4eTlgCrO2+eWzlu2a/sHs2QUkZco+wscH7jhhgWg==",
+      "version": "3.20.3",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.20.3.tgz",
+      "integrity": "sha512-u6/O1X42CAZ79rbk+smyONJQLTpwFBL7InpRa/AVWia5lq60w5J/PUsVHCOgSolN0X9R2GjQ41fZm3x28Hk1lA==",
       "peer": true,
       "bin": {
         "rollup": "dist/bin/rollup"
@@ -13088,6 +13252,17 @@
         "wbuf": "^1.7.3"
       }
     },
+    "node_modules/split-on-first": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-3.0.0.tgz",
+      "integrity": "sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/sprintf-js": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
@@ -14104,15 +14279,15 @@
       }
     },
     "node_modules/vite": {
-      "version": "4.1.4",
-      "resolved": "https://registry.npmjs.org/vite/-/vite-4.1.4.tgz",
-      "integrity": "sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg==",
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-4.2.1.tgz",
+      "integrity": "sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==",
       "peer": true,
       "dependencies": {
-        "esbuild": "^0.16.14",
+        "esbuild": "^0.17.5",
         "postcss": "^8.4.21",
         "resolve": "^1.22.1",
-        "rollup": "^3.10.0"
+        "rollup": "^3.18.0"
       },
       "bin": {
         "vite": "bin/vite.js"
@@ -14953,6 +15128,33 @@
         "@algolia/requester-common": "4.13.1"
       }
     },
+    "@amplitude/analytics-connector": {
+      "version": "1.4.6",
+      "resolved": "https://registry.npmjs.org/@amplitude/analytics-connector/-/analytics-connector-1.4.6.tgz",
+      "integrity": "sha512-6jD2pOosRD4y8DT8StUCz7yTd5ZDkdOU9/AWnlWKM5qk90Mz7sdZrdZ9H7sA/L3yOJEpQOYZgQplQdWWUzyWug==",
+      "requires": {
+        "@amplitude/ua-parser-js": "0.7.31"
+      }
+    },
+    "@amplitude/types": {
+      "version": "1.10.2",
+      "resolved": "https://registry.npmjs.org/@amplitude/types/-/types-1.10.2.tgz",
+      "integrity": "sha512-I8qenRI7uU6wKNb9LiZrAosSHVoNHziXouKY81CrqxH9xhVTEIJFXeuCV0hbtBr0Al/8ejnGjQRx+S2SvU/pPg=="
+    },
+    "@amplitude/ua-parser-js": {
+      "version": "0.7.31",
+      "resolved": "https://registry.npmjs.org/@amplitude/ua-parser-js/-/ua-parser-js-0.7.31.tgz",
+      "integrity": "sha512-+z8UGRaj13Pt5NDzOnkTBy49HE2CX64jeL0ArB86HAtilpnfkPB7oqkigN7Lf2LxscMg4QhFD7mmCfedh3rqTg=="
+    },
+    "@amplitude/utils": {
+      "version": "1.10.2",
+      "resolved": "https://registry.npmjs.org/@amplitude/utils/-/utils-1.10.2.tgz",
+      "integrity": "sha512-tVsHXu61jITEtRjB7NugQ5cVDd4QDzne8T3ifmZye7TiJeUfVRvqe44gDtf55A+7VqhDhyEIIXTA1iVcDGqlEw==",
+      "requires": {
+        "@amplitude/types": "^1.10.2",
+        "tslib": "^2.0.0"
+      }
+    },
     "@ampproject/remapping": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
@@ -14963,11 +15165,13 @@
       }
     },
     "@ariga/atlas-website": {
-      "version": "0.0.8",
-      "resolved": "https://registry.npmjs.org/@ariga/atlas-website/-/atlas-website-0.0.8.tgz",
-      "integrity": "sha512-8d57orIQpg0pOEFxP2ZQdtfMYrd4UXg2AQNCnoJyBL8Hs6yFVX/benBlzh3OAjL0x4IKEL0bQ7X9UWEbEoZprw==",
+      "version": "0.0.10",
+      "resolved": "https://registry.npmjs.org/@ariga/atlas-website/-/atlas-website-0.0.10.tgz",
+      "integrity": "sha512-0YNAs9V+uTVpkXOoXg7cd/vsHuNEUiZl16Ph9JiTd65Q2KCnCmUOP2QcZoSlrRGVqi1SKP540IcaRLj5zvMgQA==",
       "requires": {
+        "@types/amplitude-js": "^8.16.2",
         "@types/react-scroll": "^1.8.6",
+        "amplitude-js": "^8.21.6",
         "autoprefixer": "^10.4.13",
         "gh-pages": "^5.0.0",
         "postcss": "^8.4.21",
@@ -14977,8 +15181,11 @@
         "prettier-plugin-tailwindcss": "^0.2.2",
         "react": "^17.0.1",
         "react-dom": "^17.0.1",
+        "react-ga4": "^2.1.0",
+        "react-router-dom": "^6.9.0",
         "react-scroll": "^1.8.9",
         "react-scroll-parallax": "^3.3.2",
+        "react-use-intercom": "^5.0.0",
         "replace-in-file": "^6.3.5",
         "tailwind-scrollbar": "^2.1.0",
         "tailwindcss": "^3.2.6",
@@ -14992,6 +15199,23 @@
           "requires": {
             "postcss-selector-parser": "^6.0.11"
           }
+        },
+        "react-router": {
+          "version": "6.9.0",
+          "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.9.0.tgz",
+          "integrity": "sha512-51lKevGNUHrt6kLuX3e/ihrXoXCa9ixY/nVWRLlob4r/l0f45x3SzBvYJe3ctleLUQQ5fVa4RGgJOTH7D9Umhw==",
+          "requires": {
+            "@remix-run/router": "1.4.0"
+          }
+        },
+        "react-router-dom": {
+          "version": "6.9.0",
+          "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.9.0.tgz",
+          "integrity": "sha512-/seUAPY01VAuwkGyVBPCn1OXfVbaWGGu4QN9uj0kCPcTyNYgL1ldZpxZUpRU7BLheKQI4Twtl/OW2nHRF1u26Q==",
+          "requires": {
+            "@remix-run/router": "1.4.0",
+            "react-router": "6.9.0"
+          }
         }
       }
     },
@@ -16100,11 +16324,11 @@
       }
     },
     "@babel/runtime": {
-      "version": "7.18.6",
-      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.6.tgz",
-      "integrity": "sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz",
+      "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==",
       "requires": {
-        "regenerator-runtime": "^0.13.4"
+        "regenerator-runtime": "^0.13.11"
       }
     },
     "@babel/runtime-corejs3": {
@@ -17003,156 +17227,156 @@
       }
     },
     "@esbuild/android-arm": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz",
-      "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.16.tgz",
+      "integrity": "sha512-baLqRpLe4JnKrUXLJChoTN0iXZH7El/mu58GE3WIA6/H834k0XWvLRmGLG8y8arTRS9hJJibPnF0tiGhmWeZgw==",
       "optional": true,
       "peer": true
     },
     "@esbuild/android-arm64": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz",
-      "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.16.tgz",
+      "integrity": "sha512-QX48qmsEZW+gcHgTmAj+x21mwTz8MlYQBnzF6861cNdQGvj2jzzFjqH0EBabrIa/WVZ2CHolwMoqxVryqKt8+Q==",
       "optional": true,
       "peer": true
     },
     "@esbuild/android-x64": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz",
-      "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.16.tgz",
+      "integrity": "sha512-G4wfHhrrz99XJgHnzFvB4UwwPxAWZaZBOFXh+JH1Duf1I4vIVfuYY9uVLpx4eiV2D/Jix8LJY+TAdZ3i40tDow==",
       "optional": true,
       "peer": true
     },
     "@esbuild/darwin-arm64": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz",
-      "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.16.tgz",
+      "integrity": "sha512-/Ofw8UXZxuzTLsNFmz1+lmarQI6ztMZ9XktvXedTbt3SNWDn0+ODTwxExLYQ/Hod91EZB4vZPQJLoqLF0jvEzA==",
       "optional": true,
       "peer": true
     },
     "@esbuild/darwin-x64": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz",
-      "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.16.tgz",
+      "integrity": "sha512-SzBQtCV3Pdc9kyizh36Ol+dNVhkDyIrGb/JXZqFq8WL37LIyrXU0gUpADcNV311sCOhvY+f2ivMhb5Tuv8nMOQ==",
       "optional": true,
       "peer": true
     },
     "@esbuild/freebsd-arm64": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz",
-      "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.16.tgz",
+      "integrity": "sha512-ZqftdfS1UlLiH1DnS2u3It7l4Bc3AskKeu+paJSfk7RNOMrOxmeFDhLTMQqMxycP1C3oj8vgkAT6xfAuq7ZPRA==",
       "optional": true,
       "peer": true
     },
     "@esbuild/freebsd-x64": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz",
-      "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.16.tgz",
+      "integrity": "sha512-rHV6zNWW1tjgsu0dKQTX9L0ByiJHHLvQKrWtnz8r0YYJI27FU3Xu48gpK2IBj1uCSYhJ+pEk6Y0Um7U3rIvV8g==",
       "optional": true,
       "peer": true
     },
     "@esbuild/linux-arm": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz",
-      "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.16.tgz",
+      "integrity": "sha512-n4O8oVxbn7nl4+m+ISb0a68/lcJClIbaGAoXwqeubj/D1/oMMuaAXmJVfFlRjJLu/ZvHkxoiFJnmbfp4n8cdSw==",
       "optional": true,
       "peer": true
     },
     "@esbuild/linux-arm64": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz",
-      "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.16.tgz",
+      "integrity": "sha512-8yoZhGkU6aHu38WpaM4HrRLTFc7/VVD9Q2SvPcmIQIipQt2I/GMTZNdEHXoypbbGao5kggLcxg0iBKjo0SQYKA==",
       "optional": true,
       "peer": true
     },
     "@esbuild/linux-ia32": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz",
-      "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.16.tgz",
+      "integrity": "sha512-9ZBjlkdaVYxPNO8a7OmzDbOH9FMQ1a58j7Xb21UfRU29KcEEU3VTHk+Cvrft/BNv0gpWJMiiZ/f4w0TqSP0gLA==",
       "optional": true,
       "peer": true
     },
     "@esbuild/linux-loong64": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz",
-      "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.16.tgz",
+      "integrity": "sha512-TIZTRojVBBzdgChY3UOG7BlPhqJz08AL7jdgeeu+kiObWMFzGnQD7BgBBkWRwOtKR1i2TNlO7YK6m4zxVjjPRQ==",
       "optional": true,
       "peer": true
     },
     "@esbuild/linux-mips64el": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz",
-      "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.16.tgz",
+      "integrity": "sha512-UPeRuFKCCJYpBbIdczKyHLAIU31GEm0dZl1eMrdYeXDH+SJZh/i+2cAmD3A1Wip9pIc5Sc6Kc5cFUrPXtR0XHA==",
       "optional": true,
       "peer": true
     },
     "@esbuild/linux-ppc64": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz",
-      "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.16.tgz",
+      "integrity": "sha512-io6yShgIEgVUhExJejJ21xvO5QtrbiSeI7vYUnr7l+v/O9t6IowyhdiYnyivX2X5ysOVHAuyHW+Wyi7DNhdw6Q==",
       "optional": true,
       "peer": true
     },
     "@esbuild/linux-riscv64": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz",
-      "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.16.tgz",
+      "integrity": "sha512-WhlGeAHNbSdG/I2gqX2RK2gfgSNwyJuCiFHMc8s3GNEMMHUI109+VMBfhVqRb0ZGzEeRiibi8dItR3ws3Lk+cA==",
       "optional": true,
       "peer": true
     },
     "@esbuild/linux-s390x": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz",
-      "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.16.tgz",
+      "integrity": "sha512-gHRReYsJtViir63bXKoFaQ4pgTyah4ruiMRQ6im9YZuv+gp3UFJkNTY4sFA73YDynmXZA6hi45en4BGhNOJUsw==",
       "optional": true,
       "peer": true
     },
     "@esbuild/linux-x64": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz",
-      "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.16.tgz",
+      "integrity": "sha512-mfiiBkxEbUHvi+v0P+TS7UnA9TeGXR48aK4XHkTj0ZwOijxexgMF01UDFaBX7Q6CQsB0d+MFNv9IiXbIHTNd4g==",
       "optional": true,
       "peer": true
     },
     "@esbuild/netbsd-x64": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz",
-      "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.16.tgz",
+      "integrity": "sha512-n8zK1YRDGLRZfVcswcDMDM0j2xKYLNXqei217a4GyBxHIuPMGrrVuJ+Ijfpr0Kufcm7C1k/qaIrGy6eG7wvgmA==",
       "optional": true,
       "peer": true
     },
     "@esbuild/openbsd-x64": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz",
-      "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.16.tgz",
+      "integrity": "sha512-lEEfkfsUbo0xC47eSTBqsItXDSzwzwhKUSsVaVjVji07t8+6KA5INp2rN890dHZeueXJAI8q0tEIfbwVRYf6Ew==",
       "optional": true,
       "peer": true
     },
     "@esbuild/sunos-x64": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz",
-      "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.16.tgz",
+      "integrity": "sha512-jlRjsuvG1fgGwnE8Afs7xYDnGz0dBgTNZfgCK6TlvPH3Z13/P5pi6I57vyLE8qZYLrGVtwcm9UbUx1/mZ8Ukag==",
       "optional": true,
       "peer": true
     },
     "@esbuild/win32-arm64": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz",
-      "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.16.tgz",
+      "integrity": "sha512-TzoU2qwVe2boOHl/3KNBUv2PNUc38U0TNnzqOAcgPiD/EZxT2s736xfC2dYQbszAwo4MKzzwBV0iHjhfjxMimg==",
       "optional": true,
       "peer": true
     },
     "@esbuild/win32-ia32": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz",
-      "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.16.tgz",
+      "integrity": "sha512-B8b7W+oo2yb/3xmwk9Vc99hC9bNolvqjaTZYEfMQhzdpBsjTvZBlXQ/teUE55Ww6sg//wlcDjOaqldOKyigWdA==",
       "optional": true,
       "peer": true
     },
     "@esbuild/win32-x64": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz",
-      "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.16.tgz",
+      "integrity": "sha512-xJ7OH/nanouJO9pf03YsL9NAFQBHd8AqfrQd7Pf5laGyyTt/gToul6QYOA/i5i/q8y9iaM5DQFNTgpi995VkOg==",
       "optional": true,
       "peer": true
     },
@@ -17384,6 +17608,11 @@
       "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz",
       "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g=="
     },
+    "@remix-run/router": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.4.0.tgz",
+      "integrity": "sha512-BJ9SxXux8zAg991UmT8slpwpsd31K1dHHbD3Ba4VzD+liLQ4WAMSxQp2d2ZPRPfN0jN2NPRowcSSoM7lCaF08Q=="
+    },
     "@rollup/pluginutils": {
       "version": "5.0.2",
       "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz",
@@ -17748,6 +17977,11 @@
         }
       }
     },
+    "@types/amplitude-js": {
+      "version": "8.16.2",
+      "resolved": "https://registry.npmjs.org/@types/amplitude-js/-/amplitude-js-8.16.2.tgz",
+      "integrity": "sha512-a+tb/CEQOlrHRvEvAuYNOcoUy1POERANnAhfKgiTmsy0eACj3eukGP0ucA9t115QOPzVUhbnUfZqtyHp99IZyA=="
+    },
     "@types/argparse": {
       "version": "1.0.38",
       "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz",
@@ -18287,6 +18521,19 @@
         "@algolia/events": "^4.0.1"
       }
     },
+    "amplitude-js": {
+      "version": "8.21.7",
+      "resolved": "https://registry.npmjs.org/amplitude-js/-/amplitude-js-8.21.7.tgz",
+      "integrity": "sha512-qciiLxH1vR1+46DNzDLGQhtaS1fSAuv7WH73S+prYTiaUm1fuze+pVGl7hLdVBu7Tchi1RKfYxsqa2c9p/dfxQ==",
+      "requires": {
+        "@amplitude/analytics-connector": "^1.4.6",
+        "@amplitude/ua-parser-js": "0.7.31",
+        "@amplitude/utils": "^1.10.2",
+        "@babel/runtime": "^7.21.0",
+        "blueimp-md5": "^2.19.0",
+        "query-string": "8.1.0"
+      }
+    },
     "ansi-align": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
@@ -18517,6 +18764,11 @@
       "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
       "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA=="
     },
+    "blueimp-md5": {
+      "version": "2.19.0",
+      "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz",
+      "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w=="
+    },
     "body-parser": {
       "version": "1.20.0",
       "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz",
@@ -19523,6 +19775,11 @@
         "ms": "2.1.2"
       }
     },
+    "decode-uri-component": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.4.1.tgz",
+      "integrity": "sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ=="
+    },
     "decompress-response": {
       "version": "3.3.0",
       "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
@@ -19903,33 +20160,33 @@
       }
     },
     "esbuild": {
-      "version": "0.16.17",
-      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz",
-      "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==",
+      "version": "0.17.16",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.16.tgz",
+      "integrity": "sha512-aeSuUKr9aFVY9Dc8ETVELGgkj4urg5isYx8pLf4wlGgB0vTFjxJQdHnNH6Shmx4vYYrOTLCHtRI5i1XZ9l2Zcg==",
       "peer": true,
       "requires": {
-        "@esbuild/android-arm": "0.16.17",
-        "@esbuild/android-arm64": "0.16.17",
-        "@esbuild/android-x64": "0.16.17",
-        "@esbuild/darwin-arm64": "0.16.17",
-        "@esbuild/darwin-x64": "0.16.17",
-        "@esbuild/freebsd-arm64": "0.16.17",
-        "@esbuild/freebsd-x64": "0.16.17",
-        "@esbuild/linux-arm": "0.16.17",
-        "@esbuild/linux-arm64": "0.16.17",
-        "@esbuild/linux-ia32": "0.16.17",
-        "@esbuild/linux-loong64": "0.16.17",
-        "@esbuild/linux-mips64el": "0.16.17",
-        "@esbuild/linux-ppc64": "0.16.17",
-        "@esbuild/linux-riscv64": "0.16.17",
-        "@esbuild/linux-s390x": "0.16.17",
-        "@esbuild/linux-x64": "0.16.17",
-        "@esbuild/netbsd-x64": "0.16.17",
-        "@esbuild/openbsd-x64": "0.16.17",
-        "@esbuild/sunos-x64": "0.16.17",
-        "@esbuild/win32-arm64": "0.16.17",
-        "@esbuild/win32-ia32": "0.16.17",
-        "@esbuild/win32-x64": "0.16.17"
+        "@esbuild/android-arm": "0.17.16",
+        "@esbuild/android-arm64": "0.17.16",
+        "@esbuild/android-x64": "0.17.16",
+        "@esbuild/darwin-arm64": "0.17.16",
+        "@esbuild/darwin-x64": "0.17.16",
+        "@esbuild/freebsd-arm64": "0.17.16",
+        "@esbuild/freebsd-x64": "0.17.16",
+        "@esbuild/linux-arm": "0.17.16",
+        "@esbuild/linux-arm64": "0.17.16",
+        "@esbuild/linux-ia32": "0.17.16",
+        "@esbuild/linux-loong64": "0.17.16",
+        "@esbuild/linux-mips64el": "0.17.16",
+        "@esbuild/linux-ppc64": "0.17.16",
+        "@esbuild/linux-riscv64": "0.17.16",
+        "@esbuild/linux-s390x": "0.17.16",
+        "@esbuild/linux-x64": "0.17.16",
+        "@esbuild/netbsd-x64": "0.17.16",
+        "@esbuild/openbsd-x64": "0.17.16",
+        "@esbuild/sunos-x64": "0.17.16",
+        "@esbuild/win32-arm64": "0.17.16",
+        "@esbuild/win32-ia32": "0.17.16",
+        "@esbuild/win32-x64": "0.17.16"
       }
     },
     "escalade": {
@@ -20249,6 +20506,11 @@
         "to-regex-range": "^5.0.1"
       }
     },
+    "filter-obj": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-5.1.0.tgz",
+      "integrity": "sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng=="
+    },
     "finalhandler": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
@@ -22804,6 +23066,16 @@
         "side-channel": "^1.0.4"
       }
     },
+    "query-string": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/query-string/-/query-string-8.1.0.tgz",
+      "integrity": "sha512-BFQeWxJOZxZGix7y+SByG3F36dA0AbTy9o6pSmKFcFz7DAj0re9Frkty3saBn3nHo3D0oZJ/+rx3r8H8r8Jbpw==",
+      "requires": {
+        "decode-uri-component": "^0.4.1",
+        "filter-obj": "^5.1.0",
+        "split-on-first": "^3.0.0"
+      }
+    },
     "querystringify": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
@@ -22985,6 +23257,11 @@
       "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz",
       "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA=="
     },
+    "react-ga4": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/react-ga4/-/react-ga4-2.1.0.tgz",
+      "integrity": "sha512-ZKS7PGNFqqMd3PJ6+C2Jtz/o1iU9ggiy8Y8nUeksgVuvNISbmrQtJiZNvC/TjDsqD0QlU5Wkgs7i+w9+OjHhhQ=="
+    },
     "react-helmet-async": {
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz",
@@ -23140,6 +23417,12 @@
         }
       }
     },
+    "react-use-intercom": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/react-use-intercom/-/react-use-intercom-5.0.0.tgz",
+      "integrity": "sha512-qTPW3FbvzGwZUy6jmMPttK0T7Iy4cK93wDrWfOL36Cd4qPkozPVkXLcGNKYUfMsgaclyF+EXrbFQ135Wg5m0Zw==",
+      "requires": {}
+    },
     "read-cache": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
@@ -23201,9 +23484,9 @@
       }
     },
     "regenerator-runtime": {
-      "version": "0.13.9",
-      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
-      "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
+      "version": "0.13.11",
+      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+      "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
     },
     "regenerator-transform": {
       "version": "0.15.0",
@@ -23493,9 +23776,9 @@
       }
     },
     "rollup": {
-      "version": "3.18.0",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.18.0.tgz",
-      "integrity": "sha512-J8C6VfEBjkvYPESMQYxKHxNOh4A5a3FlP+0BETGo34HEcE4eTlgCrO2+eWzlu2a/sHs2QUkZco+wscH7jhhgWg==",
+      "version": "3.20.3",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.20.3.tgz",
+      "integrity": "sha512-u6/O1X42CAZ79rbk+smyONJQLTpwFBL7InpRa/AVWia5lq60w5J/PUsVHCOgSolN0X9R2GjQ41fZm3x28Hk1lA==",
       "peer": true,
       "requires": {
         "fsevents": "~2.3.2"
@@ -23979,6 +24262,11 @@
         "wbuf": "^1.7.3"
       }
     },
+    "split-on-first": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-3.0.0.tgz",
+      "integrity": "sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA=="
+    },
     "sprintf-js": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
@@ -24672,16 +24960,16 @@
       }
     },
     "vite": {
-      "version": "4.1.4",
-      "resolved": "https://registry.npmjs.org/vite/-/vite-4.1.4.tgz",
-      "integrity": "sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg==",
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-4.2.1.tgz",
+      "integrity": "sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==",
       "peer": true,
       "requires": {
-        "esbuild": "^0.16.14",
+        "esbuild": "^0.17.5",
         "fsevents": "~2.3.2",
         "postcss": "^8.4.21",
         "resolve": "^1.22.1",
-        "rollup": "^3.10.0"
+        "rollup": "^3.18.0"
       }
     },
     "vite-plugin-dts": {
diff --git a/doc/website/package.json b/doc/website/package.json
index 3ba52464..1a184220 100644
--- a/doc/website/package.json
+++ b/doc/website/package.json
@@ -16,7 +16,7 @@
     "invalidate-cdn": "aws cloudfront create-invalidation --distribution-id E3VOJYSV9YO33D --paths \"/*\""
   },
   "dependencies": {
-    "@ariga/atlas-website": "0.0.8",
+    "@ariga/atlas-website": "0.0.10",
     "@docusaurus/core": "^2.0.0-rc.1",
     "@docusaurus/plugin-client-redirects": "^2.0.0-rc.1",
     "@docusaurus/preset-classic": "^2.0.0-rc.1",
diff --git a/doc/website/src/pages/index.js b/doc/website/src/pages/index.js
index 03bdef46..2a737b89 100644
--- a/doc/website/src/pages/index.js
+++ b/doc/website/src/pages/index.js
@@ -1,28 +1,13 @@
 import React from "react";
 import LayoutProvider from "@theme/Layout/Provider";
-import * as Atlas from "@ariga/atlas-website";
+import { AtlasGoWebsite } from "@ariga/atlas-website";
 
 import "@ariga/atlas-website/style.css";
 
 export default function () {
   return (
     <LayoutProvider>
-      <Atlas.WebsiteWrapper>
-        <Atlas.BackgroundWrapper>
-          <Atlas.ContentWrapper>
-            <Atlas.Header />
-            <Atlas.Intro />
-            <Atlas.CompaniesDesktop />
-            <Atlas.UseCase />
-            <Atlas.TestimonialsTablet />
-            <Atlas.Guides />
-            <Atlas.CompaniesMobile />
-            <Atlas.Newsletter />
-            <Atlas.Discover />
-            <Atlas.Footer />
-          </Atlas.ContentWrapper>
-        </Atlas.BackgroundWrapper>
-      </Atlas.WebsiteWrapper>
+      <AtlasGoWebsite />
     </LayoutProvider>
   );
 }
diff --git a/sql/mysql/driver.go b/sql/mysql/driver.go
index 30af0aad..eb76c16d 100644
--- a/sql/mysql/driver.go
+++ b/sql/mysql/driver.go
@@ -47,7 +47,7 @@ func init() {
 		DriverName,
 		sqlclient.DriverOpener(Open),
 		sqlclient.RegisterCodec(MarshalHCL, EvalHCL),
-		sqlclient.RegisterFlavours("maria", "mariadb"),
+		sqlclient.RegisterFlavours("mysql+unix", "maria", "maria+unix", "mariadb", "mariadb+unix"),
 		sqlclient.RegisterURLParser(parser{}),
 	)
 }
@@ -253,7 +253,10 @@ func (parser) ChangeSchema(u *url.URL, s string) *url.URL {
 // dsn returns the MySQL standard DSN for opening
 // the sql.DB from the user provided URL.
 func dsn(u *url.URL) string {
-	var b strings.Builder
+	var (
+		b      strings.Builder
+		values = u.Query()
+	)
 	b.WriteString(u.User.Username())
 	if p, ok := u.User.Password(); ok {
 		b.WriteByte(':')
@@ -262,19 +265,32 @@ func dsn(u *url.URL) string {
 	if b.Len() > 0 {
 		b.WriteByte('@')
 	}
-	if u.Host != "" {
-		b.WriteString("tcp(")
-		b.WriteString(u.Host)
-		b.WriteByte(')')
-	}
-	if u.Path != "" {
+	switch {
+	case strings.HasSuffix(u.Scheme, "+unix"):
+		b.WriteString("unix(")
+		// The path is always absolute, and
+		// therefore the host should be empty.
 		b.WriteString(u.Path)
-	} else {
-		b.WriteByte('/')
+		b.WriteString(")/")
+		if name := values.Get("database"); name != "" {
+			b.WriteString(name)
+			values.Del("database")
+		}
+	default:
+		if u.Host != "" {
+			b.WriteString("tcp(")
+			b.WriteString(u.Host)
+			b.WriteByte(')')
+		}
+		if u.Path != "" {
+			b.WriteString(u.Path)
+		} else {
+			b.WriteByte('/')
+		}
 	}
-	if u.RawQuery != "" {
+	if p := values.Encode(); p != "" {
 		b.WriteByte('?')
-		b.WriteString(u.RawQuery)
+		b.WriteString(p)
 	}
 	return b.String()
 }


Test patch:
diff --git a/cmd/atlas/internal/cmdapi/migrate_test.go b/cmd/atlas/internal/cmdapi/migrate_test.go
index 1594311a..bc9721b0 100644
--- a/cmd/atlas/internal/cmdapi/migrate_test.go
+++ b/cmd/atlas/internal/cmdapi/migrate_test.go
@@ -508,14 +508,12 @@ env "local" {
 				Tenant string
 				cmdlog.MigrateApply
 			}
-			fmt.Println(s)
 			require.NoError(t, json.Unmarshal([]byte(s), &r))
 			require.Empty(t, r.Pending)
 			require.Empty(t, r.Applied)
 			require.NotEmpty(t, r.Tenant)
 			require.Equal(t, "sqlite3", r.Driver)
 		}
-
 		_, err = db.Exec("INSERT INTO `tenants` (`name`) VALUES (NULL)")
 		require.NoError(t, err)
 		_, err = runCmd(
@@ -921,6 +919,49 @@ func TestMigrate_Diff(t *testing.T) {
 		require.Len(t, files, 1)
 		require.Equal(t, "CREATE TABLE `t` (`c` int NULL)", string(files[0].Bytes()))
 	})
+
+	t.Run("ProjectFile", func(t *testing.T) {
+		p := t.TempDir()
+		h := `
+variable "schema" {
+  type = string
+}
+
+variable "dir" {
+  type = string
+}
+
+env "local" {
+  src = "file://${var.schema}"
+  dev = "sqlite://ci?mode=memory&_fk=1"
+  migration {
+    dir = "file://${var.dir}"
+  }
+}
+`
+		pathC := filepath.Join(p, "atlas.hcl")
+		require.NoError(t, os.WriteFile(pathC, []byte(h), 0600))
+		pathS := filepath.Join(p, "schema.sql")
+		require.NoError(t, os.WriteFile(pathS, []byte(`CREATE TABLE t(c int);`), 0600))
+		pathD := t.TempDir()
+		cmd := migrateCmd()
+		cmd.AddCommand(migrateDiffCmd())
+		s, err := runCmd(
+			cmd, "diff",
+			"-c", "file://"+pathC,
+			"--env", "local",
+			"--var", "schema="+pathS,
+			"--var", "dir="+pathD,
+		)
+		require.NoError(t, err)
+		require.Empty(t, s)
+		d, err := migrate.NewLocalDir(pathD)
+		require.NoError(t, err)
+		files, err := d.Files()
+		require.NoError(t, err)
+		require.Len(t, files, 1)
+		require.Equal(t, "-- Create \"t\" table\nCREATE TABLE `t` (`c` int NULL);\n", string(files[0].Bytes()))
+	})
 }
 
 func TestMigrate_StatusJSON(t *testing.T) {
diff --git a/internal/integration/testdata/mysql/cli-inspect-file.txt b/internal/integration/testdata/mysql/cli-inspect-file.txt
new file mode 100644
index 00000000..9fff2193
--- /dev/null
+++ b/internal/integration/testdata/mysql/cli-inspect-file.txt
@@ -0,0 +1,38 @@
+only mysql8
+
+# inspect without dev-db will failed
+! atlas schema inspect -u file://a.sql
+stderr 'Error: --dev-url cannot be empty'
+
+# inspect file to HCL
+atlas schema inspect -u file://a.sql --dev-url URL > inspected.hcl
+cmp inspected.hcl script_cli_inspect.hcl
+
+# inspect file to SQL
+atlas schema inspect -u file://a.sql --dev-url URL --format '{{ sql . }}' > inspected.sql
+cmp inspected.sql script_cli_inspect.sql
+
+-- a.sql --
+create table users (
+  id int NOT NULL,
+  PRIMARY KEY (id)
+)
+
+-- script_cli_inspect.hcl --
+table "users" {
+  schema = schema.script_cli_inspect_file
+  column "id" {
+    null = false
+    type = int
+  }
+  primary_key {
+    columns = [column.id]
+  }
+}
+schema "script_cli_inspect_file" {
+  charset = "utf8mb4"
+  collate = "utf8mb4_0900_ai_ci"
+}
+-- script_cli_inspect.sql --
+-- Create "users" table
+CREATE TABLE `users` (`id` int NOT NULL, PRIMARY KEY (`id`)) CHARSET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
diff --git a/internal/integration/testdata/postgres/cli-inspect-file.txt b/internal/integration/testdata/postgres/cli-inspect-file.txt
new file mode 100644
index 00000000..4ea4b6b8
--- /dev/null
+++ b/internal/integration/testdata/postgres/cli-inspect-file.txt
@@ -0,0 +1,34 @@
+# inspect without dev-db will failed
+! atlas schema inspect -u file://a.sql
+stderr 'Error: --dev-url cannot be empty'
+
+# inspect file to HCL
+atlas schema inspect -u file://a.sql --dev-url URL > inspected.hcl
+cmp inspected.hcl script_cli_inspect.hcl
+
+# inspect file to SQL
+atlas schema inspect -u file://a.sql --dev-url URL --format '{{ sql . }}' > inspected.sql
+cmp inspected.sql script_cli_inspect.sql
+
+-- a.sql --
+create table users (
+  id int NOT NULL,
+  PRIMARY KEY (id)
+)
+
+-- script_cli_inspect.hcl --
+table "users" {
+  schema = schema.script_cli_inspect_file
+  column "id" {
+    null = false
+    type = integer
+  }
+  primary_key {
+    columns = [column.id]
+  }
+}
+schema "script_cli_inspect_file" {
+}
+-- script_cli_inspect.sql --
+-- Create "users" table
+CREATE TABLE "users" ("id" integer NOT NULL, PRIMARY KEY ("id"));
diff --git a/internal/integration/testdata/postgres/cli-inspect.txt b/internal/integration/testdata/postgres/cli-inspect.txt
new file mode 100644
index 00000000..4d83adeb
--- /dev/null
+++ b/internal/integration/testdata/postgres/cli-inspect.txt
@@ -0,0 +1,92 @@
+apply 1.hcl
+
+# test url flag
+atlas schema inspect -u URL > inspected.hcl
+cmp inspected.hcl script_cli_inspect.hcl
+
+# test exclude flag on table.
+atlas schema inspect -u URL --exclude "users" > inspected.hcl
+cmp inspected.hcl notable.hcl
+
+# test exclude flag on column.
+atlas schema inspect -u URL --exclude "*.[ab]*" > inspected.hcl
+cmp inspected.hcl id.hcl
+
+# test exclude flag on column.
+atlas schema inspect -u URL --exclude "*.*" > inspected.hcl
+cmp inspected.hcl nocolumn.hcl
+
+
+-- 1.hcl --
+table "users" {
+  schema = schema.$db
+  column "id" {
+    null = false
+    type = int
+  }
+  column "a" {
+    null = false
+    type = int
+  }
+  column "b" {
+    null = false
+    type = int
+  }
+  column "ab" {
+    null = false
+    type = int
+  }
+  column "ac" {
+    null = false
+    type = int4
+  }
+}
+schema "$db" {
+}
+
+-- script_cli_inspect.hcl --
+table "users" {
+  schema = schema.script_cli_inspect
+  column "id" {
+    null = false
+    type = integer
+  }
+  column "a" {
+    null = false
+    type = integer
+  }
+  column "b" {
+    null = false
+    type = integer
+  }
+  column "ab" {
+    null = false
+    type = integer
+  }
+  column "ac" {
+    null = false
+    type = integer
+  }
+}
+schema "script_cli_inspect" {
+}
+-- empty.hcl --
+-- notable.hcl --
+schema "script_cli_inspect" {
+}
+-- id.hcl --
+table "users" {
+  schema = schema.script_cli_inspect
+  column "id" {
+    null = false
+    type = integer
+  }
+}
+schema "script_cli_inspect" {
+}
+-- nocolumn.hcl --
+table "users" {
+  schema = schema.script_cli_inspect
+}
+schema "script_cli_inspect" {
+}
\ No newline at end of file
diff --git a/internal/integration/testdata/postgres/cli-migrate-apply.txt b/internal/integration/testdata/postgres/cli-migrate-apply.txt
index 715f8c86..1ca5f050 100644
--- a/internal/integration/testdata/postgres/cli-migrate-apply.txt
+++ b/internal/integration/testdata/postgres/cli-migrate-apply.txt
@@ -54,18 +54,18 @@ stderr 'unknown tx-mode "invalid"'
 
 ! atlas migrate apply --url URL --revisions-schema $db --tx-mode all
 stderr 'executing statement "THIS IS A FAILING STATEMENT;" from version "4"'
-atlas schema inspect --url URL --exclude $db.atlas_schema_revisions
+atlas schema inspect --url URL --exclude atlas_schema_revisions
 cmp stdout empty.hcl
 
 # Apply one migration, after rolling everything back, the first revision must still exist.
 atlas migrate apply --url URL --revisions-schema $db 1
-atlas schema inspect --url URL --exclude $db.atlas_schema_revisions --exclude $db.users
+atlas schema inspect --url URL --exclude atlas_schema_revisions --exclude users
 cmp stdout empty.hcl
 cmpshow users users_1.sql
 
 ! atlas migrate apply --url URL --revisions-schema $db --tx-mode all
 stderr 'executing statement "THIS IS A FAILING STATEMENT;" from version "4"'
-atlas schema inspect --url URL --exclude $db.atlas_schema_revisions --exclude $db.users
+atlas schema inspect --url URL --exclude atlas_schema_revisions --exclude users
 cmp stdout empty.hcl
 
 # If the broken migration is gone, we can apply everything without any problems.
@@ -75,7 +75,7 @@ atlas migrate hash
 atlas migrate apply --url URL --revisions-schema $db
 cmpshow users users.sql
 cmpshow pets pets.sql
-atlas schema inspect --url URL --exclude $db.atlas_schema_revisions --exclude $db.users --exclude $db.pets
+atlas schema inspect --url URL --exclude atlas_schema_revisions --exclude users --exclude pets
 cmp stdout empty.hcl
 
 clearSchema
@@ -87,12 +87,12 @@ atlas migrate hash
 
 ! atlas migrate apply --url URL --revisions-schema $db --tx-mode file
 stderr 'executing statement "THIS IS A FAILING STATEMENT;" from version "4"'
-atlas schema inspect --url URL --exclude $db.atlas_schema_revisions
+atlas schema inspect --url URL --exclude atlas_schema_revisions
 cmpshow users users.sql
 cmpshow pets pets.sql
 
 # Table "broken" does not exist since we rolled back that migration.
-atlas schema inspect --url URL --exclude $db.atlas_schema_revisions --exclude $db.users --exclude $db.pets
+atlas schema inspect --url URL --exclude atlas_schema_revisions --exclude users --exclude pets
 cmp stdout empty.hcl
 
 # If the broken migration is gone, we can apply everything without any problems.
@@ -102,7 +102,7 @@ atlas migrate hash
 atlas migrate apply --url URL --revisions-schema $db
 cmpshow users users.sql
 cmpshow pets pets.sql
-atlas schema inspect --url URL --exclude $db.atlas_schema_revisions --exclude $db.users --exclude $db.pets
+atlas schema inspect --url URL --exclude atlas_schema_revisions --exclude users --exclude pets
 cmp stdout empty.hcl
 
 clearSchema
@@ -114,12 +114,12 @@ atlas migrate hash
 
 ! atlas migrate apply --url URL --revisions-schema $db --tx-mode none
 stderr 'executing statement "THIS IS A FAILING STATEMENT;" from version "4"'
-atlas schema inspect --url URL --exclude $db.atlas_schema_revisions
+atlas schema inspect --url URL --exclude atlas_schema_revisions
 cmpshow users users.sql
 cmpshow pets pets.sql
 
 # Table "broken" does exist since we do not have transactions.
-atlas schema inspect --url URL --exclude $db.atlas_schema_revisions --exclude $db.users --exclude $db.pets
+atlas schema inspect --url URL --exclude atlas_schema_revisions --exclude users --exclude pets
 cmp stdout broken.hcl
 
 -- migrations/1_first.sql --
diff --git a/internal/integration/testdata/sqlite/cli-inspect.txt b/internal/integration/testdata/sqlite/cli-inspect.txt
index 227cbe55..000e974f 100644
--- a/internal/integration/testdata/sqlite/cli-inspect.txt
+++ b/internal/integration/testdata/sqlite/cli-inspect.txt
@@ -4,20 +4,16 @@ apply 1.hcl
 atlas schema inspect -u URL > inspected.hcl
 cmp inspected.hcl 1.hcl
 
-# test exclude flag on schema.
-atlas schema inspect -u URL --exclude "main" > inspected.hcl
-cmp inspected.hcl empty.hcl
-
 # test exclude flag on table.
-atlas schema inspect -u URL --exclude "*.users" > inspected.hcl
+atlas schema inspect -u URL --exclude "users" > inspected.hcl
 cmp inspected.hcl notable.hcl
 
 # test exclude flag on column.
-atlas schema inspect -u URL --exclude "main.*.[ab]*" > inspected.hcl
+atlas schema inspect -u URL --exclude "*.[ab]*" > inspected.hcl
 cmp inspected.hcl id.hcl
 
 # test exclude flag on column.
-atlas schema inspect -u URL --exclude "*.*.*" > inspected.hcl
+atlas schema inspect -u URL --exclude "*.*" > inspected.hcl
 cmp inspected.hcl nocolumn.hcl
 
 
diff --git a/internal/integration/testdata/sqlite/cli-migrate-apply.txt b/internal/integration/testdata/sqlite/cli-migrate-apply.txt
index f334ff23..508ffe28 100644
--- a/internal/integration/testdata/sqlite/cli-migrate-apply.txt
+++ b/internal/integration/testdata/sqlite/cli-migrate-apply.txt
@@ -48,18 +48,18 @@ stderr 'unknown tx-mode "invalid"'
 
 ! atlas migrate apply --url URL --tx-mode all
 stderr 'executing statement "THIS IS A FAILING STATEMENT;" from version "3"'
-atlas schema inspect --url URL --exclude $db.atlas_schema_revisions
+atlas schema inspect --url URL --exclude atlas_schema_revisions
 cmp stdout empty.hcl
 
 # Apply one migration, after rolling everything back, the first revision must still exist.
 atlas migrate apply --url URL 1
-atlas schema inspect --url URL --exclude $db.atlas_schema_revisions --exclude $db.users
+atlas schema inspect --url URL --exclude atlas_schema_revisions --exclude users
 cmp stdout empty.hcl
 cmpshow users users.sql
 
 ! atlas migrate apply --url URL --tx-mode all
 stderr 'executing statement "THIS IS A FAILING STATEMENT;" from version "3"'
-atlas schema inspect --url URL --exclude $db.atlas_schema_revisions --exclude $db.users
+atlas schema inspect --url URL --exclude atlas_schema_revisions --exclude users
 cmp stdout empty.hcl
 
 # If the broken migration is gone, we can apply everything without any problems.
@@ -69,7 +69,7 @@ atlas migrate hash
 atlas migrate apply --url URL --revisions-schema $db
 cmpshow users users.sql
 cmpshow pets pets.sql
-atlas schema inspect --url URL --exclude $db.atlas_schema_revisions --exclude $db.users --exclude $db.pets
+atlas schema inspect --url URL --exclude atlas_schema_revisions --exclude users --exclude pets
 cmp stdout empty.hcl
 
 clearSchema
@@ -81,12 +81,12 @@ atlas migrate hash
 
 ! atlas migrate apply --url URL --tx-mode file
 stderr 'executing statement "THIS IS A FAILING STATEMENT;" from version "3"'
-atlas schema inspect --url URL --exclude $db.atlas_schema_revisions
+atlas schema inspect --url URL --exclude atlas_schema_revisions
 cmpshow users users.sql
 cmpshow pets pets.sql
 
 # Table "broken" does not exist since we rolled back that migration.
-atlas schema inspect --url URL --exclude $db.atlas_schema_revisions --exclude $db.users --exclude $db.pets
+atlas schema inspect --url URL --exclude atlas_schema_revisions --exclude users --exclude pets
 cmp stdout empty.hcl
 
 # If the broken migration is gone, we can apply everything without any problems.
@@ -96,7 +96,7 @@ atlas migrate hash
 atlas migrate apply --url URL --revisions-schema $db
 cmpshow users users.sql
 cmpshow pets pets.sql
-atlas schema inspect --url URL --exclude $db.atlas_schema_revisions --exclude $db.users --exclude $db.pets
+atlas schema inspect --url URL --exclude atlas_schema_revisions --exclude users --exclude pets
 cmp stdout empty.hcl
 
 clearSchema
@@ -108,12 +108,12 @@ atlas migrate hash
 
 ! atlas migrate apply --url URL --tx-mode none
 stderr 'executing statement "THIS IS A FAILING STATEMENT;" from version "3"'
-atlas schema inspect --url URL --exclude $db.atlas_schema_revisions
+atlas schema inspect --url URL --exclude atlas_schema_revisions
 cmpshow users users.sql
 cmpshow pets pets.sql
 
 # Table "broken" does exist since we do not have transactions.
-atlas schema inspect --url URL --exclude $db.atlas_schema_revisions --exclude $db.users --exclude $db.pets
+atlas schema inspect --url URL --exclude atlas_schema_revisions --exclude users --exclude pets
 cmp stdout broken.hcl
 
 -- migrations/1_first.sql --
diff --git a/sql/mysql/driver_test.go b/sql/mysql/driver_test.go
index b88b6f53..bf01aa00 100644
--- a/sql/mysql/driver_test.go
+++ b/sql/mysql/driver_test.go
@@ -19,11 +19,26 @@ import (
 	"github.com/stretchr/testify/require"
 )
 
-func TestParser_ParseURLParseTime(t *testing.T) {
-	u, err := url.Parse("mysql://user:pass@localhost:3306/my_db?foo=bar")
-	require.NoError(t, err)
-	ac := parser{}.ParseURL(u)
-	require.Equal(t, "true", ac.Query().Get("parseTime"))
+func TestParser_ParseURL(t *testing.T) {
+	t.Run("ParseTime", func(t *testing.T) {
+		u, err := url.Parse("mysql://user:pass@localhost:3306/my_db?foo=bar")
+		require.NoError(t, err)
+		ac := parser{}.ParseURL(u)
+		require.Equal(t, "true", ac.Query().Get("parseTime"))
+	})
+	t.Run("UnixDSN", func(t *testing.T) {
+		for u, d := range map[string]string{
+			"mysql+unix:///path/to/socket":                                    "unix(/path/to/socket)/?parseTime=true",
+			"mysql+unix://user:pass@/path/to/socket":                          "user:pass@unix(/path/to/socket)/?parseTime=true",
+			"mysql+unix://user@/path/to/socket?database=dbname":               "user@unix(/path/to/socket)/dbname?parseTime=true",
+			"maria+unix:///path/to/file.socket?database=test&tls=skip-verify": "unix(/path/to/file.socket)/test?parseTime=true&tls=skip-verify",
+		} {
+			u1, err := url.Parse(u)
+			require.NoError(t, err)
+			p := parser{}.ParseURL(u1)
+			require.Equal(t, d, p.DSN)
+		}
+	})
 }
 
 func TestDriver_LockAcquired(t *testing.T) {