Index: server/authjs-handler.ts
===================================================================
--- server/authjs-handler.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ server/authjs-handler.ts	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
@@ -3,92 +3,34 @@
 import type { Session } from "@auth/core/types";
 import { enhance, type UniversalHandler, type UniversalMiddleware } from "@universal-middleware/core";
-import {eq, or} from "drizzle-orm";
-import { db } from "../database/drizzle/db";
-import {adminsTable, usersTable} from "../database/drizzle/schema";
-import bcrypt from "bcrypt";
-import { AuthDrizzleAdapter } from "./drizzle/auth-adapter";
 
 const authjsConfig = {
   basePath: "/api/auth",
   trustHost: true,
-  secret: process.env.AUTH_SECRET,
-  adapter: AuthDrizzleAdapter(),
-  session: {
-    strategy: "jwt",
-  },
+  // TODO: Replace secret {@see https://authjs.dev/reference/core#secret}
+  secret: "MY_SECRET",
   providers: [
+    // TODO: Choose and implement providers
     CredentialsProvider({
       name: "Credentials",
       credentials: {
-        username: { label: "Username", type: "text" },
+        username: { label: "Username", type: "text", placeholder: "jsmith" },
         password: { label: "Password", type: "password" },
       },
-      async authorize(credentials) {
-        const username = typeof credentials?.username === "string" ? credentials.username : null;
-        const password = typeof credentials?.password === "string" ? credentials.password : null;
+      async authorize() {
+        // Add logic here to look up the user from the credentials supplied
+        const user = { id: "1", name: "J Smith", email: "jsmith@example.com" };
 
-        if(!username || !password || typeof username !== 'string' || typeof password !== 'string') { return null; }
-        
-        const trimmedUsername = username.trim();
-
-        const user = await db.query.usersTable.findFirst({
-            where: or(
-                eq(usersTable.username, trimmedUsername),
-                eq(usersTable.email, trimmedUsername)
-            ),
-          });
-
-        if(!user) return null;
-
-        let isPasswordValid = false;
-
-        if (user.passwordHash.startsWith('$2b$') || user.passwordHash.startsWith('$2a$')) {
-            isPasswordValid = await bcrypt.compare(password, user.passwordHash);
-        } else {
-            isPasswordValid = password === user.passwordHash;
-        }
-
-        if(!isPasswordValid) return null;
-
-          const admin = await db.query.adminsTable.findFirst({
-              where: eq(adminsTable.userId, user.id),
-          });
-
-        return {
-            id: String(user.id),
-            username: user.username,
-            email: user.email,
-            isAdmin: !!admin
-        }
+        // Any object returned will be saved in `user` property of the JWT
+        // If you return null then an error will be displayed advising the user to check their details.
+        // You can also Reject this callback with an Error thus the user will be sent to the error page with the error message as a query parameter
+        return user ?? null;
       },
     }),
   ],
-
-  callbacks: {
-      async jwt({ token, user }) {
-          if (user) {
-              token.sub = user.id;
-
-              const customUser = user as any;
-              token.username = customUser.username;
-              token.email = customUser.email;
-              token.isAdmin = customUser.isAdmin;
-          }
-          return token;
-      },
-      async session({ session, token }) {
-          if (session.user) {
-              session.user.id = token.sub!;
-              session.user.name = token.username as string;
-
-              const customToken = token as any;
-              session.user.email = customToken.email;
-              session.user.isAdmin = customToken.isAdmin;
-          }
-          return session;
-      },
-  },
 } satisfies Omit<AuthConfig, "raw">;
 
+/**
+ * Retrieve Auth.js session from Request
+ */
 export async function getSession(req: Request, config: Omit<AuthConfig, "raw">): Promise<Session | null> {
   setEnvDefaults(process.env, config);
@@ -107,4 +49,8 @@
 }
 
+/**
+ * Add Auth.js session to context
+ * @link {@see https://authjs.dev/getting-started/session-management/get-session}
+ **/
 export const authjsSessionMiddleware: UniversalMiddleware = enhance(
   async (request, context) => {
@@ -123,9 +69,13 @@
   },
   {
-    name: "pc-forge:authjs-middleware",
+    name: "my-app:authjs-middleware",
     immutable: false,
   },
 );
 
+/**
+ * Auth.js route
+ * @link {@see https://authjs.dev/getting-started/installation}
+ **/
 export const authjsHandler = enhance(
   async (request) => {
@@ -133,5 +83,5 @@
   },
   {
-    name: "pc-forge:authjs-handler",
+    name: "my-app:authjs-handler",
     path: "/api/auth/**",
     method: ["GET", "POST"],
Index: server/db-middleware.ts
===================================================================
--- server/db-middleware.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ server/db-middleware.ts	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
@@ -1,4 +1,3 @@
-import { db } from "../database/drizzle/db";
-import type { Database } from "../database/drizzle/db";
+import { dbSqlite } from "../database/drizzle/db";
 import { enhance, type UniversalMiddleware } from "@universal-middleware/core";
 
@@ -6,15 +5,21 @@
   namespace Universal {
     interface Context {
-      db: Database;
+      db: ReturnType<typeof dbSqlite>;
     }
   }
 }
+
+// Add `db` to the Context
 export const dbMiddleware: UniversalMiddleware = enhance(
-  async (_request, context) => ({
-    ...context,
-          db,
-  }),
+  async (_request, context, _runtime) => {
+    const db = dbSqlite();
+
+    return {
+      ...context,
+      db: db,
+    };
+  },
   {
-    name: "pc-forge:db-middleware",
+    name: "my-app:db-middleware",
     immutable: false,
   },
Index: server/drizzle/auth-adapter.ts
===================================================================
--- server/drizzle/auth-adapter.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,64 +1,0 @@
-import type { Adapter } from "@auth/core/adapters";
-import { db } from "../../database/drizzle/db";
-import { usersTable, adminsTable } from "../../database/drizzle/schema";
-import { eq } from "drizzle-orm";
-
-export function AuthDrizzleAdapter(): Adapter {
-    return {
-        async getUser(id) {
-            const userId = parseInt(id);
-            if (isNaN(userId)) return null;
-
-            const user = await db.query.usersTable.findFirst({
-                where: eq(usersTable.id, userId),
-            });
-
-            if (!user) return null;
-
-            const admin = await db.query.adminsTable.findFirst({
-                where: eq(adminsTable.userId, user.id),
-            });
-
-            return {
-                id: String(user.id),
-                email: user.email,
-                name: user.username,
-                emailVerified: null,
-                isAdmin: !!admin,
-            };
-        },
-
-        async getUserByEmail(email) {
-            const user = await db.query.usersTable.findFirst({
-                where: eq(usersTable.email, email),
-            });
-
-            if (!user) return null;
-
-            const admin = await db.query.adminsTable.findFirst({
-                where: eq(adminsTable.userId, user.id),
-            });
-
-            return {
-                id: String(user.id),
-                email: user.email,
-                name: user.username,
-                emailVerified: null,
-                isAdmin: !!admin,
-            };
-        },
-
-        async createUser() { return null as any; },
-        async updateUser() { return null as any; },
-        async deleteUser() {},
-        async getUserByAccount() { return null; },
-        async createSession() { return null as any; },
-        async getSessionAndUser() { return null; },
-        async updateSession() { return null; },
-        async deleteSession() {},
-        async linkAccount() { return null as any; },
-        async unlinkAccount() {},
-        async createVerificationToken() { return null as any; },
-        async useVerificationToken() { return null; },
-    };
-}
Index: server/entry.ts
===================================================================
--- server/entry.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ server/entry.ts	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
@@ -2,5 +2,5 @@
 import { authjsHandler, authjsSessionMiddleware } from "./authjs-handler";
 import { dbMiddleware } from "./db-middleware";
-import telefuncHandler from "./telefunc-handler";
+import { telefuncHandler } from "./telefunc-handler";
 import { apply, serve } from "@photonjs/hono";
 import { Hono } from "hono";
@@ -14,10 +14,14 @@
 
   apply(app, [
+    // Make database available in Context as `context.db`
     dbMiddleware,
 
+    // Append Auth.js session to context
     authjsSessionMiddleware,
 
+    // Auth.js route. See https://authjs.dev/getting-started/installation
     authjsHandler,
 
+    // Telefunc route. See https://telefunc.com
     telefuncHandler,
   ]);
@@ -25,5 +29,4 @@
   return serve(app, {
     port,
-      hostname: '0.0.0.0',
   });
 }
Index: server/telefunc-handler.ts
===================================================================
--- server/telefunc-handler.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ server/telefunc-handler.ts	(revision 8ee45534cd667e6cced2ed96968c95d8de3b1029)
@@ -1,8 +1,7 @@
-import type { Database } from "../database/drizzle/db";
+import type { dbSqlite } from "../database/drizzle/db";
 import { enhance, type UniversalHandler } from "@universal-middleware/core";
 import { telefunc } from "telefunc";
-import type { Session } from "@auth/core/types";
 
-const telefuncHandler: UniversalHandler = enhance(
+export const telefuncHandler: UniversalHandler = enhance(
   async (request, context, runtime) => {
     const httpResponse = await telefunc({
@@ -11,9 +10,7 @@
       body: await request.text(),
       context: {
-          ...(context as { db: Database; session?: Session | null }),
-          ...runtime,
-          session: (context as { session?: Session | null }).session ?? null,
-          request,
-      }
+        ...(context as { db: ReturnType<typeof dbSqlite> }),
+        ...runtime,
+      },
     });
     const { body, statusCode, contentType } = httpResponse;
@@ -26,5 +23,5 @@
   },
   {
-    name: "pc-forge:telefunc-handler",
+    name: "my-app:telefunc-handler",
     path: `/_telefunc`,
     method: ["GET", "POST"],
@@ -32,3 +29,2 @@
   },
 );
-export default telefuncHandler
Index: server/telefunc/ctx.ts
===================================================================
--- server/telefunc/ctx.ts	(revision ff3a6146e85f77e90dc322a0ad0c9d9eb048c629)
+++ 	(revision )
@@ -1,42 +1,0 @@
-import { Abort, getContext } from "telefunc";
-import * as drizzleQueries from "../../database/drizzle/queries";
-
-export function ctx() {
-    return getContext();
-}
-
-export function parseSessionUserId(sessionUserId: unknown): number | undefined {
-    if (typeof sessionUserId !== "string" && typeof sessionUserId !== "number") return undefined;
-    const n = Number(sessionUserId);
-    return Number.isInteger(n) && n > 0 ? n : undefined;
-}
-
-export function getAuthState() {
-    const c = ctx();
-    const userId = parseSessionUserId(c.session?.user?.id);
-    return {
-        isLoggedIn: Boolean(userId),
-        userId: userId ?? null,
-        username: c.session?.user?.name ?? null,
-        isAdmin: c.session?.user?.isAdmin,
-        session: c.session,
-    };
-}
-
-export function requireUser() {
-    const c = ctx();
-    const userId = parseSessionUserId(c.session?.user?.id);
-    if (!userId) throw Abort();
-    return { c, userId };
-}
-
-export async function requireAdmin() {
-    const { c, userId } = requireUser();
-
-    if(!c.session?.user?.isAdmin) throw Abort();
-
-    const isAdmin = await drizzleQueries.isAdmin(c.db, userId);
-    if (!isAdmin) throw Abort();
-
-    return { c, userId };
-}
