diff --git a/site/src/routes/_layout.svelte b/site/src/routes/_layout.svelte
index 4adbb9b0dc..55f4861880 100644
--- a/site/src/routes/_layout.svelte
+++ b/site/src/routes/_layout.svelte
@@ -1,11 +1,32 @@
diff --git a/site/src/routes/apps/index.json.js b/site/src/routes/apps/index.json.js
new file mode 100644
index 0000000000..dcc2205ee9
--- /dev/null
+++ b/site/src/routes/apps/index.json.js
@@ -0,0 +1,24 @@
+import send from '@polka/send';
+import { query } from '../../utils/db';
+
+export async function get(req, res) {
+ if (req.user) {
+ const offset = req.params.offset || 0;
+ const rows = await query(`
+ select g.uid, g.name, coalesce(g.updated_at, g.created_at) as updated_at
+ from gists g
+ where g.user_id = $1
+ order by updated_at desc
+ limit 100
+ offset $2
+ `, [req.user.id, offset]);
+
+ rows.forEach(row => {
+ row.uid = row.uid.replace(/-/g, '');
+ });
+
+ send(res, 200, rows);
+ } else {
+ send(res, 401);
+ }
+}
diff --git a/site/src/routes/apps/index.svelte b/site/src/routes/apps/index.svelte
new file mode 100644
index 0000000000..bbbe7d6391
--- /dev/null
+++ b/site/src/routes/apps/index.svelte
@@ -0,0 +1,130 @@
+
+
+
+
+
+ Your apps • Svelte
+
+
+
+ {#if user}
+
+
+
+ {:else}
+
Please log in to see your saved apps.
+ {/if}
+
+
+
\ No newline at end of file
diff --git a/site/src/routes/repl/[id]/_components/AppControls/UserMenu.svelte b/site/src/routes/repl/[id]/_components/AppControls/UserMenu.svelte
index 9b54e80f92..de400cbf29 100644
--- a/site/src/routes/repl/[id]/_components/AppControls/UserMenu.svelte
+++ b/site/src/routes/repl/[id]/_components/AppControls/UserMenu.svelte
@@ -1,14 +1,9 @@