diff --git a/src/backend/src/routers/_default.js b/src/backend/src/routers/_default.js
index 6401f84c..072ec2ce 100644
--- a/src/backend/src/routers/_default.js
+++ b/src/backend/src/routers/_default.js
@@ -346,6 +346,10 @@ router.all('*', async function (req, res, next) {
else if ( path.startsWith('/settings') ) {
path = '/';
}
+ // /dashboard
+ else if ( path === '/dashboard' || path === '/dashboard/' ) {
+ path = '/';
+ }
// /app/
else if ( path.startsWith('/app/') ) {
app_name = path.replace('/app/', '');
diff --git a/src/gui/src/UI/Dashboard/TabApps.js b/src/gui/src/UI/Dashboard/TabApps.js
new file mode 100644
index 00000000..4a46bac9
--- /dev/null
+++ b/src/gui/src/UI/Dashboard/TabApps.js
@@ -0,0 +1,99 @@
+/**
+ * Copyright (C) 2024-present Puter Technologies Inc.
+ *
+ * This file is part of Puter.
+ *
+ * Puter is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+function buildAppsSection () {
+ let apps_str = '';
+ if ( window.launch_apps?.recommended?.length > 0 ) {
+ apps_str += '
';
+ for ( let index = 0; index < window.launch_apps.recommended.length; index++ ) {
+ const app_info = window.launch_apps.recommended[index];
+ apps_str += `
';
+ }
+
+ return apps_str;
+}
+
+const TabApps = {
+ id: 'apps',
+ label: 'My Apps',
+ icon: ``,
+
+ html () {
+ return '';
+ },
+
+ init ($el_window) {
+ // Load apps initially
+ this.loadApps($el_window);
+
+ // Handle app clicks - open in new browser tab
+ $el_window.on('click', '.dashboard-apps-container .start-app', function (e) {
+ e.preventDefault();
+ e.stopPropagation();
+
+ const appName = $(this).attr('data-app-name');
+ if ( appName ) {
+ const appUrl = `/app/${appName}`;
+ window.open(appUrl, '_blank');
+ }
+ });
+ },
+
+ async loadApps ($el_window) {
+ // If launch_apps is not populated yet, fetch from server
+ if ( !window.launch_apps || !window.launch_apps.recent || window.launch_apps.recent.length === 0 ) {
+ try {
+ window.launch_apps = await $.ajax({
+ url: `${window.api_origin}/get-launch-apps?icon_size=64`,
+ type: 'GET',
+ async: true,
+ contentType: 'application/json',
+ headers: {
+ 'Authorization': `Bearer ${window.auth_token}`,
+ },
+ });
+ } catch (e) {
+ console.error('Failed to load launch apps:', e);
+ }
+ }
+ // Populate the apps container
+ $el_window.find('.dashboard-apps-container').html(buildAppsSection());
+ },
+
+ onActivate ($el_window) {
+ // Refresh apps when navigating to apps section
+ this.loadApps($el_window);
+ },
+};
+
+export default TabApps;
+
diff --git a/src/gui/src/UI/Dashboard/TabFiles.js b/src/gui/src/UI/Dashboard/TabFiles.js
new file mode 100644
index 00000000..9cdcad1c
--- /dev/null
+++ b/src/gui/src/UI/Dashboard/TabFiles.js
@@ -0,0 +1,38 @@
+/**
+ * Copyright (C) 2024-present Puter Technologies Inc.
+ *
+ * This file is part of Puter.
+ *
+ * Puter is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+const TabFiles = {
+ id: 'files',
+ label: 'My Files',
+ icon: ``,
+
+ html () {
+ let h = '';
+ h += '
My Files
';
+ h += '
Your files will appear here.
';
+ return h;
+ },
+
+ init ($el_window) {
+ // Files tab initialization logic can go here
+ },
+};
+
+export default TabFiles;
+
diff --git a/src/gui/src/UI/Dashboard/UIDashboard.js b/src/gui/src/UI/Dashboard/UIDashboard.js
new file mode 100644
index 00000000..021be251
--- /dev/null
+++ b/src/gui/src/UI/Dashboard/UIDashboard.js
@@ -0,0 +1,281 @@
+/**
+ * Copyright (C) 2024-present Puter Technologies Inc.
+ *
+ * This file is part of Puter.
+ *
+ * Puter is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+import UIWindow from '../UIWindow.js';
+import UIContextMenu from '../UIContextMenu.js';
+import UIWindowSettings from '../Settings/UIWindowSettings.js';
+import UIAlert from '../UIAlert.js';
+import UIWindowSaveAccount from '../UIWindowSaveAccount.js';
+import UIWindowLogin from '../UIWindowLogin.js';
+import UIWindowFeedback from '../UIWindowFeedback.js';
+
+// Import tab modules
+import TabFiles from './TabFiles.js';
+import TabApps from './TabApps.js';
+
+// Registry of all available tabs
+const tabs = [
+ TabFiles,
+ TabApps,
+];
+
+async function UIDashboard (options) {
+ options = options ?? {};
+
+ let h = '';
+
+ h += '
';
+
+ // Mobile sidebar toggle
+ h += '';
+
+ // Sidebar
+ h += '
';
+ // Navigation items container
+ h += '
';
+ for ( let i = 0; i < tabs.length; i++ ) {
+ const tab = tabs[i];
+ const isActive = i === 0 ? ' active' : '';
+ h += `
`;
+ h += tab.icon;
+ h += tab.label;
+ h += '
';
+ }
+ h += '
';
+
+ // User options button at bottom
+ h += '
';
+ h += `
`;
+ h += ``;
+ h += `${html_encode(window.user?.username || 'User')}`;
+ h += ``;
+ h += `
`;
+ h += '
';
+ h += '
';
+
+ // Main content area
+ h += '
';
+ for ( let i = 0; i < tabs.length; i++ ) {
+ const tab = tabs[i];
+ const isActive = i === 0 ? ' active' : '';
+ h += `