49 KiB
BotUI Full Product Implementation Plan
Budget: $200,000 USD
Goal: Complete enterprise-ready product for international market
Version: 6.1.0
Executive Summary
This document outlines the implementation of ~100+ missing API integrations in BotUI to create a complete enterprise productivity suite. All backend APIs already exist in BotServer - this work focuses purely on frontend UI integration using HTMX patterns.
Architecture Overview
┌─────────────────────────────────────────────────────────────────┐
│ BotUI Suite │
├─────────────┬─────────────┬─────────────┬─────────────┬─────────┤
│ Apps │ Admin │ Settings │ Monitoring │ Auth │
├─────────────┼─────────────┼─────────────┼─────────────┼─────────┤
│ Chat │ Users │ Profile │ Services │ Login │
│ Drive │ Groups │ Theme │ Resources │ OAuth │
│ Mail │ Permissions │ Sync │ Logs │ 2FA │
│ Calendar │ Audit │ Storage │ Metrics │ SSO │
│ Tasks │ DNS │ API Keys │ Health │ │
│ Meet │ Bots │ Webhooks │ Alerts │ │
│ Paper │ │ │ │ │
│ Research │ │ │ │ │
│ Sources │ │ │ │ │
│ Designer │ │ │ │ │
│ Analytics │ │ │ │ │
└─────────────┴─────────────┴─────────────┴─────────────┴─────────┘
Phase 1: Core Apps Completion ($45,000 - 3 weeks)
1.1 Paper App - Document Editor
Location: ui/suite/paper/
Priority: HIGH
Effort: 5 days
Wire existing /api/paper/* endpoints:
<!-- paper/paper.html -->
<div class="paper-app">
<!-- Document List Sidebar -->
<aside class="paper-sidebar">
<button hx-post="/api/paper/new" hx-target="#editor-area">New Document</button>
<div id="doc-list" hx-get="/api/paper/list" hx-trigger="load" hx-swap="innerHTML"></div>
<input type="search" hx-get="/api/paper/search" hx-trigger="keyup changed delay:300ms"
hx-target="#doc-list" name="q" placeholder="Search documents...">
</aside>
<!-- Editor Area -->
<main id="editor-area">
<div class="editor-toolbar">
<button hx-post="/api/paper/save" hx-include="#editor-content">Save</button>
<button hx-post="/api/paper/autosave" hx-trigger="keyup changed delay:5s from:#editor-content">Autosave</button>
</div>
<div id="editor-content" contenteditable="true"></div>
</main>
<!-- AI Assistant Panel -->
<aside class="ai-panel">
<button hx-post="/api/paper/ai/summarize" hx-include="#editor-content" hx-target="#ai-result">Summarize</button>
<button hx-post="/api/paper/ai/expand" hx-include="#editor-content" hx-target="#ai-result">Expand</button>
<button hx-post="/api/paper/ai/improve" hx-include="#editor-content" hx-target="#ai-result">Improve</button>
<button hx-post="/api/paper/ai/simplify" hx-include="#editor-content" hx-target="#ai-result">Simplify</button>
<button hx-post="/api/paper/ai/translate" hx-include="#editor-content" hx-target="#ai-result">Translate</button>
<div id="ai-result"></div>
</aside>
</div>
<!-- Templates Modal -->
<dialog id="template-modal">
<button hx-post="/api/paper/template/blank" hx-target="#editor-area">Blank</button>
<button hx-post="/api/paper/template/meeting" hx-target="#editor-area">Meeting Notes</button>
<button hx-post="/api/paper/template/todo" hx-target="#editor-area">Todo List</button>
<button hx-post="/api/paper/template/research" hx-target="#editor-area">Research</button>
</dialog>
<!-- Export Menu -->
<div class="export-menu">
<a hx-get="/api/paper/export/pdf" hx-include="#doc-id">Export PDF</a>
<a hx-get="/api/paper/export/docx" hx-include="#doc-id">Export DOCX</a>
<a hx-get="/api/paper/export/md" hx-include="#doc-id">Export Markdown</a>
<a hx-get="/api/paper/export/html" hx-include="#doc-id">Export HTML</a>
<a hx-get="/api/paper/export/txt" hx-include="#doc-id">Export Text</a>
</div>
API Endpoints to Wire:
POST /api/paper/newGET /api/paper/listGET /api/paper/searchPOST /api/paper/savePOST /api/paper/autosaveGET /api/paper/{id}POST /api/paper/{id}/deletePOST /api/paper/template/*(blank, meeting, todo, research)POST /api/paper/ai/*(summarize, expand, improve, simplify, translate, custom)GET /api/paper/export/*(pdf, docx, md, html, txt)
1.2 Research App - Knowledge Collection
Location: ui/suite/research/
Priority: HIGH
Effort: 4 days
<!-- research/research.html -->
<div class="research-app">
<aside class="collections-sidebar">
<button hx-post="/api/research/collections/new" hx-target="#collections-list">New Collection</button>
<div id="collections-list" hx-get="/api/research/collections" hx-trigger="load"></div>
</aside>
<main class="research-main">
<!-- Search Interface -->
<form hx-post="/api/research/search" hx-target="#search-results">
<input type="text" name="query" placeholder="Search across all sources...">
<button type="submit">Search</button>
</form>
<div id="search-results"></div>
<!-- Quick Access -->
<section>
<h3>Recent Searches</h3>
<div hx-get="/api/research/recent" hx-trigger="load"></div>
</section>
<section>
<h3>Trending Topics</h3>
<div hx-get="/api/research/trending" hx-trigger="load"></div>
</section>
<section>
<h3>Suggested Prompts</h3>
<div hx-get="/api/research/prompts" hx-trigger="load"></div>
</section>
</main>
<!-- Collection Detail -->
<aside class="collection-detail" id="collection-detail">
<div hx-get="/api/research/collections/{id}" hx-trigger="collection-selected"></div>
<button hx-get="/api/research/export-citations" hx-include="#collection-id">Export Citations</button>
</aside>
</div>
API Endpoints to Wire:
GET /api/research/collectionsPOST /api/research/collections/newGET /api/research/collections/{id}POST /api/research/searchGET /api/research/recentGET /api/research/trendingGET /api/research/promptsGET /api/research/export-citations
1.3 Sources App - Knowledge Management
Location: ui/suite/sources/
Priority: HIGH
Effort: 4 days
<!-- sources/sources.html -->
<div class="sources-app">
<nav class="sources-tabs">
<button hx-get="/api/sources/prompts" hx-target="#sources-content" class="active">Prompts</button>
<button hx-get="/api/sources/templates" hx-target="#sources-content">Templates</button>
<button hx-get="/api/sources/news" hx-target="#sources-content">News</button>
<button hx-get="/api/sources/mcp-servers" hx-target="#sources-content">MCP Servers</button>
<button hx-get="/api/sources/llm-tools" hx-target="#sources-content">LLM Tools</button>
<button hx-get="/api/sources/models" hx-target="#sources-content">Models</button>
</nav>
<div class="sources-toolbar">
<input type="search" hx-get="/api/sources/search" hx-trigger="keyup changed delay:300ms"
hx-target="#sources-content" name="q" placeholder="Search sources...">
</div>
<main id="sources-content" hx-get="/api/sources/prompts" hx-trigger="load">
<!-- Content loaded via HTMX -->
</main>
</div>
API Endpoints to Wire:
GET /api/sources/promptsGET /api/sources/templatesGET /api/sources/newsGET /api/sources/mcp-serversGET /api/sources/llm-toolsGET /api/sources/modelsGET /api/sources/search
1.4 Meet App - Video Conferencing
Location: ui/suite/meet/
Priority: HIGH
Effort: 6 days
<!-- meet/meet.html -->
<div class="meet-app">
<header class="meet-header">
<button hx-post="/api/meet/create" hx-target="#meeting-room">Start Instant Meeting</button>
<button onclick="showScheduleModal()">Schedule Meeting</button>
</header>
<!-- Active Rooms -->
<section class="rooms-list">
<h3>Active Rooms</h3>
<div hx-get="/api/meet/rooms" hx-trigger="load, every 10s" id="rooms-list"></div>
</section>
<!-- Meeting Room -->
<main id="meeting-room" hx-ext="ws" ws-connect="/ws/meet">
<div class="video-grid" id="video-grid"></div>
<div class="meeting-controls">
<button hx-post="/api/meet/rooms/{id}/join">Join</button>
<button hx-post="/api/voice/start">Unmute</button>
<button hx-post="/api/voice/stop">Mute</button>
<button hx-post="/api/meet/transcription/{id}">Start Transcription</button>
</div>
<!-- Invite Participants -->
<form hx-post="/api/meet/invite" hx-swap="none">
<input type="email" name="emails" placeholder="Invite by email...">
<button type="submit">Send Invite</button>
</form>
</main>
</div>
<!-- Schedule Modal -->
<dialog id="schedule-modal">
<form hx-post="/api/meet/create">
<input type="text" name="title" placeholder="Meeting Title">
<input type="datetime-local" name="scheduled_at">
<textarea name="description" placeholder="Description"></textarea>
<button type="submit">Schedule</button>
</form>
</dialog>
API Endpoints to Wire:
POST /api/meet/createGET /api/meet/roomsGET /api/meet/rooms/{room_id}POST /api/meet/rooms/{room_id}/joinPOST /api/meet/transcription/{room_id}POST /api/meet/tokenPOST /api/meet/inviteWebSocket /ws/meet
1.5 Conversations System (Chat Enhancement)
Location: ui/suite/chat/ (enhancement)
Priority: HIGH
Effort: 8 days
<!-- Conversations Panel (add to chat.html) -->
<aside class="conversations-panel">
<button hx-post="/conversations/create" hx-target="#conversation-list">New Conversation</button>
<div id="conversation-list" hx-get="/conversations/list" hx-trigger="load"></div>
</aside>
<!-- Active Conversation -->
<main class="conversation-main" hx-ext="ws" ws-connect="/ws/conversation/{id}">
<!-- Members -->
<div class="conversation-members" hx-get="/conversations/{id}/members" hx-trigger="load"></div>
<!-- Messages -->
<div class="conversation-messages" id="messages"
hx-get="/conversations/{id}/messages" hx-trigger="load"></div>
<!-- Message Input -->
<form ws-send class="message-form">
<textarea name="message" placeholder="Type a message..."></textarea>
<button type="submit">Send</button>
</form>
<!-- Message Actions (per message) -->
<template id="message-actions">
<button hx-post="/conversations/{id}/messages/{msg_id}/edit">Edit</button>
<button hx-post="/conversations/{id}/messages/{msg_id}/delete">Delete</button>
<button hx-post="/conversations/{id}/messages/{msg_id}/react">React</button>
<button hx-post="/conversations/{id}/messages/{msg_id}/pin">Pin</button>
</template>
<!-- Call Controls -->
<div class="call-controls">
<button hx-post="/conversations/{id}/calls/start">Start Call</button>
<button hx-post="/conversations/{id}/calls/join">Join Call</button>
<button hx-post="/conversations/{id}/calls/leave">Leave Call</button>
<button hx-post="/conversations/{id}/calls/mute">Mute</button>
<button hx-post="/conversations/{id}/calls/unmute">Unmute</button>
<button hx-post="/conversations/{id}/screen/share">Share Screen</button>
<button hx-post="/conversations/{id}/screen/stop">Stop Sharing</button>
<button hx-post="/conversations/{id}/recording/start">Start Recording</button>
<button hx-post="/conversations/{id}/recording/stop">Stop Recording</button>
</div>
<!-- Whiteboard -->
<div class="whiteboard-controls">
<button hx-post="/conversations/{id}/whiteboard/create">Create Whiteboard</button>
<button hx-post="/conversations/{id}/whiteboard/collaborate">Collaborate</button>
</div>
</main>
<!-- Search Messages -->
<div class="message-search">
<input type="search" hx-get="/conversations/{id}/messages/search"
hx-trigger="keyup changed delay:300ms" name="q">
</div>
API Endpoints to Wire (40+ endpoints):
POST /conversations/createPOST /conversations/{id}/joinPOST /conversations/{id}/leaveGET /conversations/{id}/membersGET /conversations/{id}/messagesPOST /conversations/{id}/messages/sendPOST /conversations/{id}/messages/{msg_id}/editPOST /conversations/{id}/messages/{msg_id}/deletePOST /conversations/{id}/messages/{msg_id}/reactPOST /conversations/{id}/messages/{msg_id}/pinGET /conversations/{id}/messages/searchPOST /conversations/{id}/calls/startPOST /conversations/{id}/calls/joinPOST /conversations/{id}/calls/leavePOST /conversations/{id}/calls/mutePOST /conversations/{id}/calls/unmutePOST /conversations/{id}/screen/sharePOST /conversations/{id}/screen/stopPOST /conversations/{id}/recording/startPOST /conversations/{id}/recording/stopPOST /conversations/{id}/whiteboard/createPOST /conversations/{id}/whiteboard/collaborate
1.6 Drive App Completion
Location: ui/suite/drive/ (enhancement)
Priority: MEDIUM
Effort: 5 days
Add missing file operations:
<!-- Add to drive/index.html -->
<!-- File Context Menu -->
<div id="file-context-menu" class="context-menu">
<button hx-post="/files/copy" hx-include="#selected-file">Copy</button>
<button hx-post="/files/move" hx-include="#selected-file">Move</button>
<button hx-get="/files/versions" hx-include="#selected-file" hx-target="#versions-modal">Versions</button>
<button hx-post="/files/restore" hx-include="#selected-file">Restore</button>
<button hx-get="/files/permissions" hx-include="#selected-file" hx-target="#permissions-modal">Permissions</button>
</div>
<!-- Sync Status Panel -->
<div class="sync-panel">
<div hx-get="/files/sync/status" hx-trigger="load, every 5s" id="sync-status"></div>
<button hx-post="/files/sync/start">Start Sync</button>
<button hx-post="/files/sync/stop">Stop Sync</button>
</div>
<!-- Storage Quota -->
<div class="storage-quota" hx-get="/files/quota" hx-trigger="load"></div>
<!-- Shared Files View -->
<div id="shared-files" hx-get="/files/shared" hx-trigger="revealed"></div>
<!-- Favorites View -->
<div id="favorites" hx-get="/files/favorite" hx-trigger="revealed"></div>
<!-- Document Processing -->
<dialog id="doc-processing-modal">
<form hx-post="/docs/merge" hx-include=".selected-files">
<button type="submit">Merge Documents</button>
</form>
<form hx-post="/docs/convert">
<select name="format">
<option value="pdf">PDF</option>
<option value="docx">DOCX</option>
<option value="html">HTML</option>
</select>
<button type="submit">Convert</button>
</form>
<form hx-post="/docs/fill" hx-include="#template-data">
<button type="submit">Fill Template</button>
</form>
</dialog>
API Endpoints to Wire:
POST /files/readPOST /files/writePOST /files/copyPOST /files/movePOST /files/shareFolderGET /files/sharedGET /files/permissionsGET /files/quotaGET /files/sync/statusPOST /files/sync/startPOST /files/sync/stopGET /files/versionsPOST /files/restorePOST /docs/mergePOST /docs/convertPOST /docs/fillPOST /docs/exportPOST /docs/import
1.7 Calendar App Completion
Location: ui/suite/calendar/ (enhancement)
Priority: MEDIUM
Effort: 3 days
<!-- Add to calendar/calendar.html -->
<!-- Event CRUD -->
<div class="event-actions">
<button hx-get="/api/calendar/events/{id}" hx-target="#event-detail">View</button>
<button hx-put="/api/calendar/events/{id}" hx-include="#event-form">Update</button>
<button hx-delete="/api/calendar/events/{id}" hx-confirm="Delete this event?">Delete</button>
</div>
<!-- Import/Export -->
<div class="calendar-io">
<a hx-get="/api/calendar/export.ics" download="calendar.ics">Export iCal</a>
<form hx-post="/api/calendar/import" hx-encoding="multipart/form-data">
<input type="file" name="ical" accept=".ics">
<button type="submit">Import iCal</button>
</form>
</div>
API Endpoints to Wire:
GET /api/calendar/events/{id}PUT /api/calendar/events/{id}DELETE /api/calendar/events/{id}GET /api/calendar/export.icsPOST /api/calendar/import
1.8 Email App Completion
Location: ui/suite/mail/ (enhancement)
Priority: MEDIUM
Effort: 4 days
<!-- Add to mail/mail.html -->
<!-- Account Management -->
<div class="email-accounts" hx-get="/api/email/accounts" hx-trigger="load">
<button hx-get="/api/email/compose" hx-target="#compose-modal">Compose</button>
</div>
<!-- Add Account -->
<dialog id="add-account-modal">
<form hx-post="/api/email/accounts/add" hx-target="#email-accounts">
<input type="email" name="email" placeholder="Email address">
<input type="password" name="password" placeholder="Password">
<select name="provider">
<option value="gmail">Gmail</option>
<option value="outlook">Outlook</option>
<option value="imap">Custom IMAP</option>
</select>
<button type="submit">Add Account</button>
</form>
</dialog>
<!-- Compose Email -->
<dialog id="compose-modal">
<form hx-post="/api/email/send" hx-swap="none">
<input type="email" name="to" placeholder="To">
<input type="email" name="cc" placeholder="Cc">
<input type="text" name="subject" placeholder="Subject">
<textarea name="body"></textarea>
<button type="submit">Send</button>
<button type="button" hx-post="/api/email/draft">Save Draft</button>
</form>
</dialog>
<!-- Tracking Stats -->
<div class="tracking-stats" hx-get="/api/email/tracking/stats" hx-trigger="load"></div>
API Endpoints to Wire:
GET /api/email/accountsPOST /api/email/accounts/addDELETE /api/email/accounts/{account_id}GET /api/email/composePOST /api/email/sendPOST /api/email/draftGET /api/email/folders/{account_id}GET /api/email/tracking/statsGET /api/email/tracking/status/{tracking_id}
Phase 2: Admin Panel ($55,000 - 4 weeks)
2.1 User Management
Location: ui/suite/admin/users.html
Priority: CRITICAL
Effort: 8 days
<!-- admin/users.html -->
<div class="admin-users">
<header class="admin-header">
<h1>User Management</h1>
<button hx-get="/users/create" hx-target="#user-modal-content">Add User</button>
</header>
<!-- User Search & Filter -->
<div class="user-filters">
<input type="search" hx-get="/users/search" hx-trigger="keyup changed delay:300ms"
hx-target="#users-table" name="q" placeholder="Search users...">
<select hx-get="/users/list" hx-target="#users-table" name="status">
<option value="">All Status</option>
<option value="active">Active</option>
<option value="inactive">Inactive</option>
<option value="suspended">Suspended</option>
</select>
</div>
<!-- Users Table -->
<table class="data-table">
<thead>
<tr>
<th>User</th>
<th>Email</th>
<th>Role</th>
<th>Status</th>
<th>Actions</th>
</tr>
</thead>
<tbody id="users-table" hx-get="/users/list" hx-trigger="load"></tbody>
</table>
<!-- User Modal -->
<dialog id="user-modal">
<div id="user-modal-content"></div>
</dialog>
</div>
<!-- User Form Template (returned by server) -->
<template id="user-form">
<form hx-post="/users/create" hx-target="#users-table">
<input type="text" name="name" placeholder="Full Name" required>
<input type="email" name="email" placeholder="Email" required>
<select name="role">
<option value="user">User</option>
<option value="admin">Admin</option>
<option value="manager">Manager</option>
</select>
<button type="submit">Create User</button>
</form>
</template>
<!-- User Detail View -->
<div class="user-detail" id="user-detail">
<div hx-get="/users/{user_id}/profile" hx-trigger="user-selected"></div>
<div class="user-tabs">
<button hx-get="/users/{user_id}/settings" hx-target="#user-tab-content">Settings</button>
<button hx-get="/users/{user_id}/permissions" hx-target="#user-tab-content">Permissions</button>
<button hx-get="/users/{user_id}/roles" hx-target="#user-tab-content">Roles</button>
<button hx-get="/users/{user_id}/activity" hx-target="#user-tab-content">Activity</button>
<button hx-get="/users/{user_id}/presence" hx-target="#user-tab-content">Presence</button>
</div>
<div id="user-tab-content"></div>
<!-- User Actions -->
<div class="user-actions">
<button hx-put="/users/{user_id}/update" hx-include="#user-form">Save Changes</button>
<button hx-delete="/users/{user_id}/delete" hx-confirm="Delete this user?">Delete User</button>
</div>
<!-- Security Section -->
<div class="user-security">
<h3>Security</h3>
<button hx-post="/users/{user_id}/security/2fa/enable">Enable 2FA</button>
<button hx-post="/users/{user_id}/security/2fa/disable">Disable 2FA</button>
<div hx-get="/users/{user_id}/security/devices" hx-trigger="load">Devices</div>
<div hx-get="/users/{user_id}/security/sessions" hx-trigger="load">Sessions</div>
</div>
<!-- Notifications -->
<div class="user-notifications">
<h3>Notification Preferences</h3>
<form hx-post="/users/{user_id}/notifications/preferences/update">
<!-- Notification settings -->
</form>
</div>
</div>
API Endpoints to Wire:
POST /users/createPUT /users/{user_id}/updateDELETE /users/{user_id}/deleteGET /users/listGET /users/searchGET /users/{user_id}/profileGET /users/{user_id}/settingsGET /users/{user_id}/permissionsGET /users/{user_id}/rolesGET /users/{user_id}/statusGET /users/{user_id}/presenceGET /users/{user_id}/activityPOST /users/{user_id}/security/2fa/enablePOST /users/{user_id}/security/2fa/disableGET /users/{user_id}/security/devicesGET /users/{user_id}/security/sessionsPOST /users/{user_id}/notifications/preferences/update
2.2 Group Management
Location: ui/suite/admin/groups.html
Priority: CRITICAL
Effort: 6 days
<!-- admin/groups.html -->
<div class="admin-groups">
<header class="admin-header">
<h1>Group Management</h1>
<button hx-post="/groups/create" hx-target="#groups-list">Create Group</button>
</header>
<!-- Groups List -->
<div class="groups-grid" id="groups-list" hx-get="/groups/list" hx-trigger="load"></div>
<!-- Group Search -->
<input type="search" hx-get="/groups/search" hx-trigger="keyup changed delay:300ms"
hx-target="#groups-list" name="q" placeholder="Search groups...">
<!-- Group Detail -->
<aside class="group-detail" id="group-detail">
<div class="group-info"></div>
<!-- Members -->
<section class="group-members">
<h3>Members</h3>
<div hx-get="/groups/{group_id}/members" hx-trigger="group-selected"></div>
<form hx-post="/groups/{group_id}/members/add">
<input type="text" name="user_id" placeholder="Add member...">
<button type="submit">Add</button>
</form>
</section>
<!-- Member Roles -->
<form hx-post="/groups/{group_id}/members/roles">
<select name="role">
<option value="member">Member</option>
<option value="moderator">Moderator</option>
<option value="admin">Admin</option>
</select>
<button type="submit">Update Role</button>
</form>
<!-- Group Settings -->
<section class="group-settings">
<div hx-get="/groups/{group_id}/settings" hx-trigger="load"></div>
<div hx-get="/groups/{group_id}/permissions" hx-trigger="load"></div>
<div hx-get="/groups/{group_id}/analytics" hx-trigger="load"></div>
</section>
<!-- Join Requests -->
<section class="join-requests">
<h3>Join Requests</h3>
<div hx-get="/groups/{group_id}/join/requests" hx-trigger="load"></div>
<button hx-post="/groups/{group_id}/join/approve">Approve</button>
<button hx-post="/groups/{group_id}/join/reject">Reject</button>
</section>
<!-- Invites -->
<section class="group-invites">
<h3>Invites</h3>
<form hx-post="/groups/{group_id}/invites/send">
<input type="email" name="email" placeholder="Email to invite">
<button type="submit">Send Invite</button>
</form>
<div hx-get="/groups/{group_id}/invites/list" hx-trigger="load"></div>
</section>
<!-- Group Actions -->
<div class="group-actions">
<button hx-put="/groups/{group_id}/update" hx-include="#group-form">Save</button>
<button hx-delete="/groups/{group_id}/delete" hx-confirm="Delete group?">Delete</button>
</div>
</aside>
</div>
API Endpoints to Wire:
POST /groups/createPUT /groups/{group_id}/updateDELETE /groups/{group_id}/deleteGET /groups/listGET /groups/searchGET /groups/{group_id}/membersPOST /groups/{group_id}/members/addPOST /groups/{group_id}/members/rolesDELETE /groups/{group_id}/members/removeGET /groups/{group_id}/permissionsGET /groups/{group_id}/settingsGET /groups/{group_id}/analyticsPOST /groups/{group_id}/join/requestPOST /groups/{group_id}/join/approvePOST /groups/{group_id}/join/rejectPOST /groups/{group_id}/invites/sendGET /groups/{group_id}/invites/list
2.3 DNS Management
Location: ui/suite/admin/dns.html
Priority: MEDIUM
Effort: 2 days
<!-- admin/dns.html -->
<div class="admin-dns">
<header class="admin-header">
<h1>Dynamic DNS Management</h1>
</header>
<!-- Register Hostname -->
<section class="dns-register">
<h2>Register Hostname</h2>
<form hx-post="/api/dns/register" hx-target="#dns-result">
<input type="text" name="hostname" placeholder="subdomain.yourdomain.com" required>
<input type="text" name="ip" placeholder="IP Address (leave empty for auto-detect)">
<select name="type">
<option value="A">A Record</option>
<option value="AAAA">AAAA Record</option>
<option value="CNAME">CNAME</option>
</select>
<button type="submit">Register</button>
</form>
</section>
<!-- Registered Hostnames -->
<section class="dns-list">
<h2>Registered Hostnames</h2>
<div id="dns-list" hx-get="/api/dns/list" hx-trigger="load"></div>
</section>
<!-- Remove Hostname -->
<form hx-post="/api/dns/remove" hx-target="#dns-result">
<input type="text" name="hostname" placeholder="Hostname to remove">
<button type="submit" class="btn-danger">Remove</button>
</form>
<div id="dns-result"></div>
</div>
API Endpoints to Wire:
POST /api/dns/registerPOST /api/dns/remove
2.4 Admin Dashboard & Navigation
Location: ui/suite/admin/index.html
Priority: HIGH
Effort: 3 days
<!-- admin/index.html -->
<div class="admin-layout">
<aside class="admin-sidebar">
<nav class="admin-nav">
<a hx-get="/admin/dashboard" hx-target="#admin-content" class="active">
<svg><!-- Dashboard icon --></svg>
Dashboard
</a>
<a hx-get="/admin/users" hx-target="#admin-content">
<svg><!-- Users icon --></svg>
Users
</a>
<a hx-get="/admin/groups" hx-target="#admin-content">
<svg><!-- Groups icon --></svg>
Groups
</a>
<a hx-get="/admin/bots" hx-target="#admin-content">
<svg><!-- Bot icon --></svg>
Bots
</a>
<a hx-get="/admin/dns" hx-target="#admin-content">
<svg><!-- DNS icon --></svg>
DNS
</a>
<a hx-get="/admin/audit" hx-target="#admin-content">
<svg><!-- Audit icon --></svg>
Audit Log
</a>
<a hx-get="/admin/billing" hx-target="#admin-content">
<svg><!-- Billing icon --></svg>
Billing
</a>
</nav>
</aside>
<main id="admin-content" hx-get="/admin/dashboard" hx-trigger="load">
<!-- Admin content loaded here -->
</main>
</div>
Phase 3: Settings Enhancement ($30,000 - 2 weeks)
3.1 Settings Subviews Structure
Location: ui/suite/settings/
Priority: HIGH
Effort: 10 days
ui/suite/settings/
├── index.html # Settings shell with navigation
├── profile.html # User profile settings
├── security.html # 2FA, sessions, devices
├── appearance.html # Theme, layout preferences
├── notifications.html # Email, push, in-app
├── storage.html # Cloud sync, quotas
├── integrations.html # API keys, webhooks, OAuth
├── privacy.html # Data export, deletion
└── billing.html # Subscription, invoices
<!-- settings/index.html -->
<div class="settings-layout">
<aside class="settings-nav">
<a hx-get="/settings/profile" hx-target="#settings-content" class="active">Profile</a>
<a hx-get="/settings/security" hx-target="#settings-content">Security</a>
<a hx-get="/settings/appearance" hx-target="#settings-content">Appearance</a>
<a hx-get="/settings/notifications" hx-target="#settings-content">Notifications</a>
<a hx-get="/settings/storage" hx-target="#settings-content">Storage & Sync</a>
<a hx-get="/settings/integrations" hx-target="#settings-content">Integrations</a>
<a hx-get="/settings/privacy" hx-target="#settings-content">Privacy</a>
<a hx-get="/settings/billing" hx-target="#settings-content">Billing</a>
</aside>
<main id="settings-content" hx-get="/settings/profile" hx-trigger="load">
<!-- Settings content loaded here -->
</main>
</div>
<!-- settings/security.html -->
<div class="settings-section">
<h2>Security Settings</h2>
<!-- Two-Factor Authentication -->
<div class="setting-card">
<h3>Two-Factor Authentication</h3>
<div hx-get="/api/user/2fa/status" hx-trigger="load" id="2fa-status"></div>
<button hx-post="/api/user/2fa/enable" hx-target="#2fa-setup">Enable 2FA</button>
<div id="2fa-setup"></div>
</div>
<!-- Active Sessions -->
<div class="setting-card">
<h3>Active Sessions</h3>
<div hx-get="/api/user/sessions" hx-trigger="load" id="sessions-list"></div>
<button hx-post="/api/user/sessions/revoke-all" hx-confirm="Sign out all other devices?">
Sign Out All Other Devices
</button>
</div>
<!-- Connected Devices -->
<div class="setting-card">
<h3>Connected Devices</h3>
<div hx-get="/api/user/devices" hx-trigger="load" id="devices-list"></div>
</div>
<!-- Password Change -->
<div class="setting-card">
<h3>Change Password</h3>
<form hx-post="/api/user/password/change" hx-swap="none">
<input type="password" name="current" placeholder="Current Password" required>
<input type="password" name="new" placeholder="New Password" required>
<input type="password" name="confirm" placeholder="Confirm New Password" required>
<button type="submit">Update Password</button>
</form>
</div>
</div>
<!-- settings/integrations.html -->
<div class="settings-section">
<h2>Integrations</h2>
<!-- API Keys -->
<div class="setting-card">
<h3>API Keys</h3>
<div hx-get="/api/user/api-keys" hx-trigger="load" id="api-keys-list"></div>
<form hx-post="/api/user/api-keys/create" hx-target="#api-keys-list" hx-swap="beforeend">
<input type="text" name="name" placeholder="Key Name" required>
<select name="scope">
<option value="read">Read Only</option>
<option value="write">Read/Write</option>
<option value="admin">Full Access</option>
</select>
<button type="submit">Generate Key</button>
</form>
</div>
<!-- Webhooks -->
<div class="setting-card">
<h3>Webhooks</h3>
<div hx-get="/api/user/webhooks" hx-trigger="load" id="webhooks-list"></div>
<form hx-post="/api/user/webhooks/create" hx-target="#webhooks-list">
<input type="url" name="url" placeholder="Webhook URL" required>
<select name="events" multiple>
<option value="message.created">New Message</option>
<option value="file.uploaded">File Uploaded</option>
<option value="meeting.started">Meeting Started</option>
</select>
<button type="submit">Add Webhook</button>
</form>
</div>
<!-- OAuth Connections -->
<div class="setting-card">
<h3>Connected Accounts</h3>
<div class="oauth-providers">
<button hx-get="/api/auth/oauth/google" class="oauth-btn google">Connect Google</button>
<button hx-get="/api/auth/oauth/microsoft" class="oauth-btn microsoft">Connect Microsoft</button>
<button hx-get="/api/auth/oauth/github" class="oauth-btn github">Connect GitHub</button>
</div>
<div hx-get="/api/user/oauth/connections" hx-trigger="load" id="oauth-connections"></div>
</div>
</div>
Phase 4: Monitoring Enhancement ($25,000 - 2 weeks)
4.1 Monitoring Subviews
Location: ui/suite/monitoring/
Priority: HIGH
Effort: 8 days
ui/suite/monitoring/
├── index.html # Main monitoring dashboard
├── services.html # Service health status
├── resources.html # CPU, Memory, Disk
├── logs.html # Real-time logs viewer
├── metrics.html # Prometheus metrics
├── alerts.html # Alert configuration
└── health.html # Health check endpoints
<!-- monitoring/services.html -->
<div class="monitoring-services">
<h2>Service Health</h2>
<!-- Service Status Grid -->
<div class="services-grid" hx-get="/api/services/status" hx-trigger="load, every 10s">
<!-- Rendered by server -->
</div>
<!-- Individual Service Details -->
<div class="service-details" id="service-details"></div>
</div>
<!-- monitoring/logs.html -->
<div class="monitoring-logs" hx-ext="ws" ws-connect="/ws/logs">
<div class="log-filters">
<select name="level" hx-get="/api/logs" hx-trigger="change" hx-target="#log-stream">
<option value="all">All Levels</option>
<option value="error">Error</option>
<option value="warn">Warning</option>
<option value="info">Info</option>
<option value="debug">Debug</option>
</select>
<select name="service" hx-get="/api/logs" hx-trigger="change" hx-target="#log-stream">
<option value="all">All Services</option>
<option value="api">API Server</option>
<option value="worker">Workers</option>
<option value="database">Database</option>
</select>
</div>
<div id="log-stream" class="log-stream">
<!-- Real-time logs via WebSocket -->
</div>
</div>
<!-- monitoring/metrics.html -->
<div class="monitoring-metrics">
<h2>System Metrics</h2>
<!-- Core Metrics -->
<div class="metrics-grid">
<div class="metric-card" hx-get="/api/analytics/dashboard" hx-trigger="load, every 30s">
<!-- Dashboard metrics -->
</div>
<div class="metric-card" hx-get="/api/analytics/metric?name=cpu" hx-trigger="load, every 5s">
<!-- CPU metrics -->
</div>
<div class="metric-card" hx-get="/api/analytics/metric?name=memory" hx-trigger="load, every 5s">
<!-- Memory metrics -->
</div>
<div class="metric-card" hx-get="/api/analytics/metric?name=disk" hx-trigger="load, every 30s">
<!-- Disk metrics -->
</div>
</div>
<!-- Prometheus Export -->
<a href="/metrics" target="_blank" class="btn">View Raw Metrics</a>
</div>
<!-- monitoring/alerts.html -->
<div class="monitoring-alerts">
<h2>Alert Configuration</h2>
<!-- Active Alerts -->
<div class="active-alerts" hx-get="/api/alerts/active" hx-trigger="load, every 30s">
<!-- Active alerts list -->
</div>
<!-- Alert Rules -->
<div class="alert-rules" hx-get="/api/alerts/rules" hx-trigger="load">
<!-- Alert rules list -->
</div>
<!-- Create Alert Rule -->
<form hx-post="/api/alerts/rules/create" hx-target=".alert-rules">
<input type="text" name="name" placeholder="Alert Name" required>
<select name="metric">
<option value="cpu">CPU Usage</option>
<option value="memory">Memory Usage</option>
<option value="disk">Disk Usage</option>
<option value="errors">Error Rate</option>
<option value="latency">Response Latency</option>
</select>
<select name="condition">
<option value="gt">Greater Than</option>
<option value="lt">Less Than</option>
<option value="eq">Equals</option>
</select>
<input type="number" name="threshold" placeholder="Threshold" required>
<select name="notify">
<option value="email">Email</option>
<option value="slack">Slack</option>
<option value="webhook">Webhook</option>
</select>
<button type="submit">Create Alert</button>
</form>
</div>
API Endpoints to Wire:
GET /api/services/statusGET /api/analytics/dashboardGET /api/analytics/metricGET /metricsWebSocket /ws/logs
Phase 5: Authentication & Security ($25,000 - 2 weeks)
5.1 Complete Auth Flow
Location: ui/suite/auth/
Priority: CRITICAL
Effort: 8 days
<!-- auth/login.html (enhance existing) -->
<div class="auth-page">
<div class="auth-card">
<h1>Sign In</h1>
<!-- Standard Login -->
<form hx-post="/api/auth/login" hx-target="#auth-result">
<input type="email" name="email" placeholder="Email" required>
<input type="password" name="password" placeholder="Password" required>
<button type="submit">Sign In</button>
</form>
<!-- OAuth Providers -->
<div class="oauth-buttons">
<button hx-get="/api/auth/oauth/google" class="oauth-btn google">
Continue with Google
</button>
<button hx-get="/api/auth/oauth/microsoft" class="oauth-btn microsoft">
Continue with Microsoft
</button>
</div>
<!-- 2FA Challenge (shown when required) -->
<div id="2fa-challenge" style="display: none;">
<form hx-post="/api/auth/2fa/verify" hx-target="#auth-result">
<input type="text" name="code" placeholder="2FA Code" maxlength="6" required>
<button type="submit">Verify</button>
</form>
</div>
<div id="auth-result"></div>
<!-- Links -->
<div class="auth-links">
<a href="/auth/forgot-password">Forgot Password?</a>
<a href="/auth/register">Create Account</a>
</div>
</div>
</div>
<!-- auth/register.html -->
<div class="auth-page">
<div class="auth-card">
<h1>Create Account</h1>
<form hx-post="/api/auth/register" hx-target="#register-result">
<input type="text" name="name" placeholder="Full Name" required>
<input type="email" name="email" placeholder="Email" required>
<input type="password" name="password" placeholder="Password" required>
<input type="password" name="password_confirm" placeholder="Confirm Password" required>
<label>
<input type="checkbox" name="terms" required>
I agree to the Terms of Service
</label>
<button type="submit">Create Account</button>
</form>
<div id="register-result"></div>
</div>
</div>
<!-- auth/forgot-password.html -->
<div class="auth-page">
<div class="auth-card">
<h1>Reset Password</h1>
<form hx-post="/api/auth/forgot-password" hx-target="#reset-result">
<input type="email" name="email" placeholder="Email" required>
<button type="submit">Send Reset Link</button>
</form>
<div id="reset-result"></div>
</div>
</div>
<!-- auth/reset-password.html -->
<div class="auth-page">
<div class="auth-card">
<h1>Set New Password</h1>
<form hx-post="/api/auth/reset-password" hx-target="#reset-result">
<input type="hidden" name="token" value="{{ token }}">
<input type="password" name="password" placeholder="New Password" required>
<input type="password" name="password_confirm" placeholder="Confirm Password" required>
<button type="submit">Reset Password</button>
</form>
<div id="reset-result"></div>
</div>
</div>
Phase 6: Polish & Integration ($20,000 - 2 weeks)
6.1 Navigation Updates
Update base.html to include all new apps and admin sections:
<!-- Add to base.html navigation -->
<nav class="app-nav">
<!-- Existing Apps -->
<a hx-get="/chat/chat.html" hx-target="#main-content">Chat</a>
<a hx-get="/drive/index.html" hx-target="#main-content">Drive</a>
<a hx-get="/mail/mail.html" hx-target="#main-content">Mail</a>
<a hx-get="/calendar/calendar.html" hx-target="#main-content">Calendar</a>
<a hx-get="/tasks/tasks.html" hx-target="#main-content">Tasks</a>
<!-- New Apps -->
<a hx-get="/meet/meet.html" hx-target="#main-content">Meet</a>
<a hx-get="/paper/paper.html" hx-target="#main-content">Paper</a>
<a hx-get="/research/research.html" hx-target="#main-content">Research</a>
<a hx-get="/sources/sources.html" hx-target="#main-content">Sources</a>
<!-- Tools -->
<a hx-get="/designer.html" hx-target="#main-content">Designer</a>
<a hx-get="/analytics/analytics.html" hx-target="#main-content">Analytics</a>
<!-- Admin (role-based visibility) -->
<a hx-get="/admin/index.html" hx-target="#main-content" class="admin-only">Admin</a>
<!-- User Menu -->
<a hx-get="/settings/index.html" hx-target="#main-content">Settings</a>
<a hx-get="/monitoring/index.html" hx-target="#main-content">Monitoring</a>
</nav>
6.2 Mobile Responsiveness
- Ensure all new views are mobile-friendly
- Add touch-friendly controls for Meet
- Responsive tables for Admin views
6.3 Accessibility
- ARIA labels on all interactive elements
- Keyboard navigation support
- Screen reader compatibility
6.4 Internationalization Preparation
- Extract all strings to translation files
- RTL layout support
- Date/time localization
File Structure Summary
botui/ui/suite/
├── admin/
│ ├── index.html # Admin dashboard shell
│ ├── users.html # User management
│ ├── groups.html # Group management
│ ├── dns.html # DNS management
│ ├── bots.html # Bot management
│ ├── audit.html # Audit logs
│ └── billing.html # Billing/subscription
├── auth/
│ ├── login.html # Enhanced login
│ ├── register.html # Registration
│ ├── forgot-password.html # Password reset request
│ └── reset-password.html # Password reset form
├── settings/
│ ├── index.html # Settings shell
│ ├── profile.html # Profile settings
│ ├── security.html # Security settings
│ ├── appearance.html # Theme settings
│ ├── notifications.html # Notification prefs
│ ├── storage.html # Storage & sync
│ ├── integrations.html # API keys, webhooks
│ ├── privacy.html # Privacy settings
│ └── billing.html # User billing
├── monitoring/
│ ├── index.html # Monitoring shell
│ ├── services.html # Service health
│ ├── resources.html # System resources
│ ├── logs.html # Log viewer
│ ├── metrics.html # Metrics dashboard
│ ├── alerts.html # Alert config
│ └── health.html # Health checks
├── paper/
│ └── paper.html # Document editor
├── research/
│ └── research.html # Research collections
├── sources/
│ └── sources.html # Knowledge sources
├── meet/
│ └── meet.html # Video conferencing
├── chat/
│ └── conversations.html # Enhanced conversations
├── drive/
│ └── index.html # Enhanced (add file ops)
├── calendar/
│ └── calendar.html # Enhanced (add CRUD)
└── mail/
└── mail.html # Enhanced (add compose)
Budget Breakdown
| Phase | Description | Duration | Cost |
|---|---|---|---|
| 1 | Core Apps (Paper, Research, Sources, Meet, Conversations, Drive, Calendar, Email) | 3 weeks | $45,000 |
| 2 | Admin Panel (Users, Groups, DNS, Dashboard) | 4 weeks | $55,000 |
| 3 | Settings Enhancement | 2 weeks | $30,000 |
| 4 | Monitoring Enhancement | 2 weeks | $25,000 |
| 5 | Authentication & Security | 2 weeks | $25,000 |
| 6 | Polish & Integration | 2 weeks | $20,000 |
| Total | 15 weeks | $200,000 |
Technical Requirements
Developer Skills Required
- Rust (Axum, Askama templates)
- HTMX patterns
- HTML5/CSS3 (responsive design)
- WebSocket integration
- OAuth 2.0 / OpenID Connect
Development Environment
- Rust 1.90.0+
- Node.js (for build tools only)
- PostgreSQL
- Redis
- MinIO
Quality Standards
- Zero warnings in Rust compilation
- All HTMX patterns - minimal JavaScript
- Local assets only (no CDN)
- Mobile-responsive design
- WCAG 2.1 AA accessibility
- Comprehensive error handling
Recommended Implementation Order
- Week 1-2: Paper App + Research App (high user value)
- Week 3-4: Sources App + Meet App (completes productivity suite)
- Week 5-6: Conversations System (enhances Chat)
- Week 7-8: User Management + Group Management (admin critical)
- Week 9-10: Settings Enhancement (user self-service)
- Week 11-12: Monitoring Enhancement (ops critical)
- Week 13-14: Auth Enhancement + DNS (security)
- Week 15: Polish, Testing, Documentation
Success Criteria
- All 100+ API endpoints wired to UI
- Full CRUD operations for all entities
- Real-time updates via WebSocket where applicable
- Mobile-responsive on all views
- Admin panel fully functional
- User self-service settings complete
- Monitoring dashboard operational
- OAuth providers working (Google, Microsoft)
- 2FA implementation complete
- Zero JavaScript where HTMX suffices
- Production-ready error handling
- Internationalization-ready strings
Notes for Developers
- HTMX First: Always prefer HTMX attributes over custom JavaScript
- Server Rendering: All dynamic content rendered server-side via Askama
- Local Assets: Never use CDN - all vendor JS/CSS in
ui/suite/js/vendor/ - Icons: Use existing icons from
ui/suite/assets/icons/- never generate new ones - Themes: Respect the 6-theme system via CSS variables
- Error Handling: Let errors bubble up - no silent failures
- Version: All work targets version 6.1.0