diff --git a/.gitignore b/.gitignore
index 3c0bb3d..40fb450 100644
--- a/.gitignore
+++ b/.gitignore
@@ -28,7 +28,7 @@ yarn-error.log*
 # local env files
 .env*.local
 
-.env.prod
+.env.production
 
 # vercel
 .vercel
diff --git a/app/api/interactions/route.ts b/app/api/interactions/route.ts
index d332df3..73da142 100644
--- a/app/api/interactions/route.ts
+++ b/app/api/interactions/route.ts
@@ -3,17 +3,17 @@ import {
   InteractionType,
 } from "discord-api-types/v10";
 import { Bot } from "@/app/lib/discord/bot";
-import { discordClientPublicKey, discordToken } from "@/app/envs";
+import { getEnvironment } from "../../../envs";
 import createClient from "edgedb";
 import { verifyInteractionRequest } from "@/app/lib/discord/verify-interaction-request";
 
-const bot = new Bot(createClient(), discordToken);
+const bot = new Bot(createClient(), getEnvironment().discordToken);
 await bot.initialize();
 
 export async function POST(req: Request) {
   const verifyResult = await verifyInteractionRequest(
     req,
-    discordClientPublicKey
+    getEnvironment().discordClientPublicKey
   );
 
   if (!verifyResult.isValid || !verifyResult.interaction) {
diff --git a/app/envs.ts b/app/envs.ts
deleted file mode 100644
index 5c6c14d..0000000
--- a/app/envs.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-if (!process.env.DISCORD_CLIENT_ID) {
-  throw new Error("DISCORD_CLIENT_ID env var not configured");
-}
-export const discordClientId = process.env.DISCORD_CLIENT_ID;
-
-if (!process.env.DISCORD_CLIENT_PUBLIC_KEY) {
-  throw new Error("DISCORD_CLIENT_PUBLIC_KEY env var not configured");
-}
-export const discordClientPublicKey = process.env.DISCORD_CLIENT_PUBLIC_KEY;
-
-if (!process.env.DISCORD_TOKEN) {
-  throw new Error(`DISCORD_TOKEN env var not configured`);
-}
-export const discordToken = process.env.DISCORD_TOKEN;
-
-if (!process.env.DISCORD_GUILD_ID) {
-  throw new Error("DISCORD_GUILD_ID env var not configured");
-}
-export const discordGuildId = process.env.DISCORD_GUILD_ID;
-
-if (!process.env.DISCORD_MODERATION_ACCESS_ROLES) {
-  throw new Error("DISCORD_MODERATION_ACCESS_ROLES env var not configured");
-}
-export const authorizedRoleIds =
-  process.env.DISCORD_MODERATION_ACCESS_ROLES.split(",");
-
-if (!process.env.REVIEW_CHANNEL_ID) {
-  throw new Error("REVIEW_CHANNEL_ID env var not configured");
-}
-export const reviewChannelId = process.env.REVIEW_CHANNEL_ID;
diff --git a/app/lib/discord/auth.ts b/app/lib/discord/auth.ts
index f9670b6..ebf735d 100644
--- a/app/lib/discord/auth.ts
+++ b/app/lib/discord/auth.ts
@@ -3,7 +3,7 @@
 import { REST } from "@discordjs/rest";
 import { Routes, APIGuildMember, APIUser } from "discord-api-types/v10";
 import { client } from "../../lib/edgedb";
-import { discordGuildId, authorizedRoleIds } from "@/app/envs";
+import { getEnvironment } from "../../../envs";
 import { getCurrentUser } from "./queries/getCurrentUser.query";
 
 export async function discordSignin({
@@ -18,14 +18,18 @@ export async function discordSignin({
   );
 
   const discordUser = (await discordClient.get(
-    Routes.userGuildMember(discordGuildId)
+    Routes.userGuildMember(getEnvironment().discordGuildId)
   )) as APIGuildMember;
 
   if (!discordUser) {
     throw new Error("No guild member information for user");
   }
 
-  if (!discordUser.roles.some((role) => authorizedRoleIds.includes(role))) {
+  if (
+    !discordUser.roles.some((role) =>
+      getEnvironment().authorizedRoleIds.includes(role)
+    )
+  ) {
     throw new Error("Discord user does not have any authorized roles");
   }
 
diff --git a/app/lib/discord/bot.ts b/app/lib/discord/bot.ts
index 3ee25a6..ce189a3 100644
--- a/app/lib/discord/bot.ts
+++ b/app/lib/discord/bot.ts
@@ -14,7 +14,7 @@ import { REST, RESTOptions } from "@discordjs/rest";
 import { Client } from "edgedb";
 import { InteractionPromise } from "./interactionPromise";
 import { getHelpChannels } from "./queries/getHelpChannels.query";
-import { discordClientId } from "@/app/envs";
+import { getEnvironment } from "../../../envs";
 
 export class Bot extends REST {
   public readonly edgedb: Client;
@@ -27,7 +27,7 @@ export class Bot extends REST {
   constructor(edgedb: Client, token: string, options?: Partial<RESTOptions>) {
     super(options);
 
-    this.applicationId = discordClientId;
+    this.applicationId = getEnvironment().discordClientId;
 
     this.edgedb = edgedb;
     this.token = token;
diff --git a/app/lib/discord/utils/reviewCard.ts b/app/lib/discord/utils/reviewCard.ts
index f4790c7..1ae5288 100644
--- a/app/lib/discord/utils/reviewCard.ts
+++ b/app/lib/discord/utils/reviewCard.ts
@@ -6,7 +6,7 @@ import {
 } from "discord-api-types/v10";
 import { Bot } from "../bot";
 import { SuggestThreadReturns } from "../queries/suggestThread.query";
-import { reviewChannelId } from "@/app/envs";
+import { getEnvironment } from "../../../../envs";
 
 const createReviewCard = async (
   bot: Bot,
@@ -34,6 +34,9 @@ const createReviewCard = async (
     ],
     color: 0x0ccb93,
   };
+
+  const reviewChannelId = getEnvironment().reviewChannelId;
+
   const message = (await bot.post(Routes.channelMessages(reviewChannelId), {
     body: {
       embeds: [embed],
diff --git a/envs.ts b/envs.ts
new file mode 100644
index 0000000..6128a36
--- /dev/null
+++ b/envs.ts
@@ -0,0 +1,58 @@
+export interface Environment {
+  discordClientId: string;
+  discordClientPublicKey: string;
+  discordToken: string;
+  discordGuildId: string;
+  authorizedRoleIds: string[];
+  reviewChannelId: string;
+}
+
+let environment: Environment | null = null;
+
+export function getEnvironment(): Environment {
+  if (environment) {
+    return environment;
+  }
+
+  if (!process.env.DISCORD_CLIENT_ID) {
+    throw new Error("DISCORD_CLIENT_ID env var not configured");
+  }
+  const discordClientId = process.env.DISCORD_CLIENT_ID;
+
+  if (!process.env.DISCORD_CLIENT_PUBLIC_KEY) {
+    throw new Error("DISCORD_CLIENT_PUBLIC_KEY env var not configured");
+  }
+  const discordClientPublicKey = process.env.DISCORD_CLIENT_PUBLIC_KEY;
+
+  if (!process.env.DISCORD_TOKEN) {
+    throw new Error(`DISCORD_TOKEN env var not configured`);
+  }
+  const discordToken = process.env.DISCORD_TOKEN;
+
+  if (!process.env.DISCORD_GUILD_ID) {
+    throw new Error("DISCORD_GUILD_ID env var not configured");
+  }
+  const discordGuildId = process.env.DISCORD_GUILD_ID;
+
+  if (!process.env.DISCORD_MODERATION_ACCESS_ROLES) {
+    throw new Error("DISCORD_MODERATION_ACCESS_ROLES env var not configured");
+  }
+  const authorizedRoleIds =
+    process.env.DISCORD_MODERATION_ACCESS_ROLES.split(",");
+
+  if (!process.env.REVIEW_CHANNEL_ID) {
+    throw new Error("REVIEW_CHANNEL_ID env var not configured");
+  }
+  const reviewChannelId = process.env.REVIEW_CHANNEL_ID;
+
+  environment = {
+    discordClientId,
+    discordClientPublicKey,
+    discordToken,
+    discordGuildId,
+    authorizedRoleIds,
+    reviewChannelId,
+  };
+
+  return environment;
+}