diff --git a/web/scripts/build-locales.mjs b/web/scripts/build-locales.mjs
index 0fcb9dd0e6..5db60632b3 100644
--- a/web/scripts/build-locales.mjs
+++ b/web/scripts/build-locales.mjs
@@ -1,7 +1,3 @@
-import { spawnSync } from "node:child_process";
-import { readFileSync, statSync } from "node:fs";
-import path from "node:path";
-
/**
* @file Lit Localize build script.
*
@@ -13,9 +9,13 @@ import path from "node:path";
* long spew of "this string is not translated" and replacing it with a
* summary of how many strings are missing with respect to the source locale.
*
- * @import { ConfigFile } from "@lit/localize-tools/lib/types/config"
- * @import { Stats } from "fs";
+ * @import { ConfigFile } from "@lit/localize-tools/lib/types/config.js"
+ * @import { Stats } from "node:fs";
*/
+import { spawnSync } from "node:child_process";
+import { readFileSync, statSync } from "node:fs";
+import path from "node:path";
+
import { PackageRoot } from "#paths/node";
/**
diff --git a/web/scripts/build-web.mjs b/web/scripts/build-web.mjs
index a21f5f1e03..a184d2695c 100644
--- a/web/scripts/build-web.mjs
+++ b/web/scripts/build-web.mjs
@@ -1,12 +1,11 @@
-///
-import * as fs from "node:fs/promises";
-import * as path from "node:path";
-
/**
* @file ESBuild script for building the authentik web UI.
*
* @import { BuildOptions } from "esbuild";
*/
+import * as fs from "node:fs/promises";
+import * as path from "node:path";
+
import { mdxPlugin } from "#bundler/mdx-plugin/node";
import { createBundleDefinitions } from "#bundler/utils/node";
import { DistDirectory, EntryPoint, PackageRoot } from "#paths/node";
@@ -17,9 +16,11 @@ import { readBuildIdentifier } from "@goauthentik/core/version/node";
import { deepmerge } from "deepmerge-ts";
import esbuild from "esbuild";
-import copy from "esbuild-plugin-copy";
+import { copy } from "esbuild-plugin-copy";
import { polyfillNode } from "esbuild-plugin-polyfill-node";
+///
+
const logPrefix = "[Build]";
const patternflyPath = resolvePackage("@patternfly/patternfly", import.meta);
diff --git a/web/scripts/pseudolocalize.mjs b/web/scripts/pseudolocalize.mjs
index abd82152d9..a711b465ad 100644
--- a/web/scripts/pseudolocalize.mjs
+++ b/web/scripts/pseudolocalize.mjs
@@ -1,6 +1,3 @@
-import { readFileSync } from "node:fs";
-import path from "node:path";
-
/**
* @file Pseudo-localization script.
*
@@ -9,6 +6,10 @@ import path from "node:path";
* @import { ProgramMessage } from "@lit/localize-tools/src/messages.js"
* @import { Locale } from "@lit/localize-tools/src/types/locale.js"
*/
+
+import { readFileSync } from "node:fs"
+import path from "node:path";
+
import { PackageRoot } from "#paths/node";
import pseudolocale from "pseudolocale";
diff --git a/web/src/admin/applications/wizard/steps/providers/ApplicationWizardProviderForm.ts b/web/src/admin/applications/wizard/steps/providers/ApplicationWizardProviderForm.ts
index c704db0293..841691b813 100644
--- a/web/src/admin/applications/wizard/steps/providers/ApplicationWizardProviderForm.ts
+++ b/web/src/admin/applications/wizard/steps/providers/ApplicationWizardProviderForm.ts
@@ -14,7 +14,7 @@ import { HorizontalFormElement } from "#elements/forms/HorizontalFormElement";
import { property, query } from "lit/decorators.js";
import { styles as AwadStyles } from "../../ApplicationWizardFormStepStyles.styles.js";
-import { type ApplicationWizardState, type OneOfProvider } from "../../types";
+import { type ApplicationWizardState, type OneOfProvider } from "../../types.js";
export class ApplicationWizardProviderForm extends AKElement {
static get styles() {
diff --git a/web/src/admin/events/EventMap.ts b/web/src/admin/events/EventMap.ts
index 8cc5466806..3fb3be5aac 100644
--- a/web/src/admin/events/EventMap.ts
+++ b/web/src/admin/events/EventMap.ts
@@ -10,14 +10,14 @@ import { PaginatedResponse } from "#elements/table/Table";
import { Event } from "@goauthentik/api";
-import type OlLayerVector from "@openlayers-elements/core/ol-layer-vector";
-import OlMap from "@openlayers-elements/core/ol-map";
-import { isEmpty } from "ol/extent";
-import Feature from "ol/Feature";
-import { Point } from "ol/geom";
-import { fromLonLat } from "ol/proj";
-import Icon from "ol/style/Icon";
-import Style from "ol/style/Style";
+import type OlLayerVector from "@openlayers-elements/core/ol-layer-vector.js";
+import OlMap from "@openlayers-elements/core/ol-map.js";
+import { isEmpty } from "ol/extent.js";
+import Feature from "ol/Feature.js";
+import { Point } from "ol/geom.js";
+import { fromLonLat } from "ol/proj.js";
+import Icon from "ol/style/Icon.js";
+import Style from "ol/style/Style.js";
import { css, CSSResult, html, PropertyValues, TemplateResult } from "lit";
import { customElement, property, query } from "lit/decorators.js";
diff --git a/web/src/admin/flows/FlowForm.ts b/web/src/admin/flows/FlowForm.ts
index 1d4fd4f363..872a8254f7 100644
--- a/web/src/admin/flows/FlowForm.ts
+++ b/web/src/admin/flows/FlowForm.ts
@@ -18,7 +18,7 @@ import {
FlowLayoutEnum,
FlowsApi,
} from "@goauthentik/api";
-import { AuthenticationEnum } from "@goauthentik/api/dist/models/AuthenticationEnum";
+import { AuthenticationEnum } from "@goauthentik/api/dist/models/AuthenticationEnum.js";
import { msg } from "@lit/localize";
import { html, TemplateResult } from "lit";
diff --git a/web/src/admin/stages/user_write/UserWriteStageForm.ts b/web/src/admin/stages/user_write/UserWriteStageForm.ts
index 457e5f088a..77d7ba574c 100644
--- a/web/src/admin/stages/user_write/UserWriteStageForm.ts
+++ b/web/src/admin/stages/user_write/UserWriteStageForm.ts
@@ -15,7 +15,7 @@ import {
UserTypeEnum,
UserWriteStage,
} from "@goauthentik/api";
-import { UserCreationModeEnum } from "@goauthentik/api/dist/models/UserCreationModeEnum";
+import { UserCreationModeEnum } from "@goauthentik/api/dist/models/UserCreationModeEnum.js";
import { msg } from "@lit/localize";
import { html, TemplateResult } from "lit";
diff --git a/web/src/elements/ak-locale-context/configureLocale.ts b/web/src/elements/ak-locale-context/configureLocale.ts
index fde2682861..3e4b4b1682 100644
--- a/web/src/elements/ak-locale-context/configureLocale.ts
+++ b/web/src/elements/ak-locale-context/configureLocale.ts
@@ -1,6 +1,6 @@
import { configureLocalization } from "@lit/localize";
-import { sourceLocale, targetLocales } from "../../locale-codes";
+import { sourceLocale, targetLocales } from "../../locale-codes.js";
import { getBestMatchLocale } from "./helpers.js";
type LocaleGetter = ReturnType["getLocale"];
diff --git a/web/src/elements/buttons/TokenCopyButton/ak-token-copy-button.ts b/web/src/elements/buttons/TokenCopyButton/ak-token-copy-button.ts
index 5ee6117c1a..38e81eb142 100644
--- a/web/src/elements/buttons/TokenCopyButton/ak-token-copy-button.ts
+++ b/web/src/elements/buttons/TokenCopyButton/ak-token-copy-button.ts
@@ -9,7 +9,7 @@ import { CoreApi, ResponseError, TokenView } from "@goauthentik/api";
import { msg } from "@lit/localize";
import { customElement, property } from "lit/decorators.js";
-import { APIMessage } from "../../messages/Message";
+import { APIMessage } from "../../messages/Message.js";
import BaseTaskButton from "../SpinnerButton/BaseTaskButton.js";
/**
diff --git a/web/src/flow/stages/access_denied/AccessDeniedStage.stories.ts b/web/src/flow/stages/access_denied/AccessDeniedStage.stories.ts
index ffa1b4914f..d374c62e4d 100644
--- a/web/src/flow/stages/access_denied/AccessDeniedStage.stories.ts
+++ b/web/src/flow/stages/access_denied/AccessDeniedStage.stories.ts
@@ -1,5 +1,5 @@
import "@patternfly/patternfly/components/Login/login.css";
-import "../../../stories/flow-interface";
+import "../../../stories/flow-interface.js";
import "./AccessDeniedStage.js";
import { AccessDeniedChallenge, UiThemeEnum } from "@goauthentik/api";
diff --git a/web/src/flow/stages/authenticator_totp/AuthenticatorTOTPStage.stories.ts b/web/src/flow/stages/authenticator_totp/AuthenticatorTOTPStage.stories.ts
index ab9ecbb0ad..6581f424bd 100644
--- a/web/src/flow/stages/authenticator_totp/AuthenticatorTOTPStage.stories.ts
+++ b/web/src/flow/stages/authenticator_totp/AuthenticatorTOTPStage.stories.ts
@@ -1,5 +1,5 @@
import "@patternfly/patternfly/components/Login/login.css";
-import "../../../stories/flow-interface";
+import "../../../stories/flow-interface.js";
import "./AuthenticatorTOTPStage.js";
import { AuthenticatorTOTPChallenge, UiThemeEnum } from "@goauthentik/api";
diff --git a/web/src/flow/stages/captcha/CaptchaStage.stories.ts b/web/src/flow/stages/captcha/CaptchaStage.stories.ts
index ac2be5a68e..f3ff6a42c4 100644
--- a/web/src/flow/stages/captcha/CaptchaStage.stories.ts
+++ b/web/src/flow/stages/captcha/CaptchaStage.stories.ts
@@ -1,5 +1,5 @@
import "@patternfly/patternfly/components/Login/login.css";
-import "../../../stories/flow-interface";
+import "../../../stories/flow-interface.js";
import "./CaptchaStage.js";
import { CaptchaChallenge, UiThemeEnum } from "@goauthentik/api";
diff --git a/web/src/flow/stages/identification/IdentificationStage.stories.ts b/web/src/flow/stages/identification/IdentificationStage.stories.ts
index 6265895f0c..192ca80a4c 100644
--- a/web/src/flow/stages/identification/IdentificationStage.stories.ts
+++ b/web/src/flow/stages/identification/IdentificationStage.stories.ts
@@ -1,5 +1,5 @@
import "@patternfly/patternfly/components/Login/login.css";
-import "../../../stories/flow-interface";
+import "../../../stories/flow-interface.js";
import "./IdentificationStage.js";
import { FlowDesignationEnum, IdentificationChallenge, UiThemeEnum } from "@goauthentik/api";