diff --git a/packages/web/src/app-router/AppRouter.tsx b/packages/web/src/app-router/AppRouter.tsx
index 8420c70..ad7d83b 100644
--- a/packages/web/src/app-router/AppRouter.tsx
+++ b/packages/web/src/app-router/AppRouter.tsx
@@ -7,6 +7,7 @@ const PickerPage = React.lazy(() => import('../pages/picker'));
const AuthLogin = React.lazy(() => import('../pages/auth/login'));
const MachineryNewSession = React.lazy(() => import('../pages/machinery/new-session'));
+const MachineryLogout = React.lazy(() => import('../pages/machinery/logout'));
const DevToolsSetApi = React.lazy(() => import('../pages/dev-tools/set-api'));
const DevToolsSessionDebug = React.lazy(() => import('../pages/dev-tools/session-debug'));
@@ -29,6 +30,7 @@ export const AppRouter = () => {
+
diff --git a/packages/web/src/pages/machinery/logout.spec.tsx b/packages/web/src/pages/machinery/logout.spec.tsx
new file mode 100644
index 0000000..0c963e9
--- /dev/null
+++ b/packages/web/src/pages/machinery/logout.spec.tsx
@@ -0,0 +1,15 @@
+import { render } from '@testing-library/react';
+import Logout from './logout';
+
+it('removes session state from storage', () => {
+ localStorage.setItem('rp_session_key', 'sessionKey');
+ sessionStorage.setItem(
+ 'rp_session_data',
+ JSON.stringify({ user: { name: 'okano', discriminator: '0001' }, guilds: [] })
+ );
+
+ render();
+
+ expect(localStorage.getItem('rp_session_key')).toBeNull();
+ expect(sessionStorage.getItem('rp_session_data')).toBeNull();
+});
diff --git a/packages/web/src/pages/machinery/logout.tsx b/packages/web/src/pages/machinery/logout.tsx
new file mode 100644
index 0000000..9c6e9f5
--- /dev/null
+++ b/packages/web/src/pages/machinery/logout.tsx
@@ -0,0 +1,13 @@
+import React from 'react';
+
+const Logout = () => {
+ React.useEffect(() => {
+ localStorage.removeItem('rp_session_key');
+ sessionStorage.clear();
+ window.location.href = '/';
+ }, []);
+
+ return
Logging you out...
;
+};
+
+export default Logout;