From b3eec341586551023b05db7a82bf19446186c768 Mon Sep 17 00:00:00 2001 From: Jino Jose Date: Thu, 9 Jul 2026 11:11:38 +0530 Subject: [PATCH] Sync cezen-portal/ from live working copy (V1.0 GA polish + search-icon ordering fix) Brings the ISO-packaged portal copy current with the live cezen-portal/ working directory, which had drifted across the entire V1.0 GA polish initiative (Phases 1-10) plus this session's topnav icon-order bugfix. - 52 existing files updated, 2 new pages added (about.html, health.html) - cgit/cezen-portal/ is now byte-identical to cezen-portal/ - Backend files (rag_ingest.py, cezen_license.py) already in sync; main.py intentionally left as-is (cgit is ahead there with workstation-category commercial-fit logic not yet backported to the live working copy) Next: rebuild the ISO (bash autoinstall/build-iso.sh) to bake this in. --- cezen-portal/about.html | 243 ++++++++++++++++++++ cezen-portal/admin.html | 23 +- cezen-portal/agents.html | 211 +++++++++-------- cezen-portal/analytics.html | 105 ++------- cezen-portal/api-playground.html | 33 ++- cezen-portal/apikeys.html | 29 ++- cezen-portal/appliance.html | 17 +- cezen-portal/audit.html | 11 +- cezen-portal/auth.js | 12 +- cezen-portal/benchmark.html | 23 +- cezen-portal/branding.js | 362 ++++++++++++++++++++++++++++-- cezen-portal/change-password.html | 14 +- cezen-portal/chat-multi.html | 121 ++++++---- cezen-portal/chatrooms.html | 39 ++-- cezen-portal/connectors.html | 167 ++++++-------- cezen-portal/console.html | 11 +- cezen-portal/dashboard.html | 113 ++++++---- cezen-portal/documents.html | 175 ++++++++++----- cezen-portal/evals.html | 71 +++--- cezen-portal/faq.html | 17 +- cezen-portal/feedback.html | 28 +-- cezen-portal/glossary.html | 17 +- cezen-portal/guardrails.html | 37 +-- cezen-portal/health.html | 289 ++++++++++++++++++++++++ cezen-portal/index.html | 9 +- cezen-portal/knowledge.html | 46 ++-- cezen-portal/login.html | 34 +-- cezen-portal/meeting.html | 116 +++++----- cezen-portal/model-compare.html | 21 +- cezen-portal/models-admin.html | 58 +++-- cezen-portal/models.html | 29 +-- cezen-portal/notifications.html | 92 +++++--- cezen-portal/prompt-studio.html | 37 ++- cezen-portal/prompts.html | 85 +++---- cezen-portal/quickstart.html | 211 +++++++++++------ cezen-portal/rag-quality.html | 56 ++--- cezen-portal/router.html | 115 +++++----- cezen-portal/schedules.html | 66 +++--- cezen-portal/security.html | 27 +-- cezen-portal/settings.html | 25 ++- cezen-portal/style.css | 279 +++++++++++++++++++++++ cezen-portal/teams.html | 31 ++- cezen-portal/tool-chromadb.html | 29 +-- cezen-portal/tool-dcgm.html | 23 +- cezen-portal/tool-fastapi.html | 29 +-- cezen-portal/tool-jupyter.html | 29 +-- cezen-portal/tool-langchain.html | 27 +-- cezen-portal/tool-nvtop.html | 23 +- cezen-portal/tool-ollama.html | 29 +-- cezen-portal/tool-openwebui.html | 25 ++- cezen-portal/tool-qlora.html | 27 +-- cezen-portal/training.html | 27 +-- cezen-portal/troubleshooting.html | 33 +-- cezen-portal/usecases.html | 173 +++++++------- cezen-portal/users.html | 29 ++- cezen-portal/whats-new.html | 35 +-- cezen-portal/workflows.html | 143 +++++++----- 57 files changed, 2832 insertions(+), 1354 deletions(-) create mode 100644 cezen-portal/about.html create mode 100644 cezen-portal/health.html diff --git a/cezen-portal/about.html b/cezen-portal/about.html new file mode 100644 index 0000000..abd5b6e --- /dev/null +++ b/cezen-portal/about.html @@ -0,0 +1,243 @@ + + + + + + About — Nexus One AI + + + + + +
+ Nexus One AI + + +
+ +
+
Admin
+

About Nexus One AI

+

Product version, license status, and support information for this deployment — everything you'd need on a support call.

+
+ +
+ +
+
+
+
Nexus One AI
+
Powered by Cezen
+
+
+ +
+ +
+
+ + Product +
+
Version—
+
Tier—
+
Category—
+
Max Users—
+
+ +
+
+ + License +
+
Status—
+
Customer—
+
Support Until—
+
Install Type—
+
+ + + +
+ +
+ + + + + + + + + diff --git a/cezen-portal/admin.html b/cezen-portal/admin.html index 23973ca..b52c9fe 100644 --- a/cezen-portal/admin.html +++ b/cezen-portal/admin.html @@ -4,7 +4,7 @@ Admin Guide — Nexus One AI Portal - + @@ -40,6 +40,7 @@ Dashboard Usage Analytics Governance & Audit + Health Center Feedback & Ratings MANAGE / Users @@ -80,7 +81,7 @@ - 🔔 + Basic Tier @@ -94,7 +95,7 @@
- 🔐 This page is for system administrators only. All commands below require SSH access to the server. If you're an end user looking for help, visit Troubleshooting or FAQ instead. + This page is for system administrators only. All commands below require SSH access to the server. If you're an end user looking for help, visit Troubleshooting or FAQ instead.
@@ -522,7 +523,7 @@
- 🔄 + 01 Safe server reboot
@@ -539,7 +540,7 @@
- 🧠 + 02 Adding a new AI model
@@ -557,7 +558,7 @@
- 🗑️ + 03 Freeing up disk space
@@ -574,7 +575,7 @@
- 🔑 + 04 Resetting an admin password (Open WebUI)
@@ -590,7 +591,7 @@
-
📞
+

Need Cezen support?

For hardware issues, system-level failures, or anything beyond this guide, contact Cezen. Include: the service name, the error from journalctl, and the output of nvidia-smi and df -h.

Email Cezen Support @@ -599,7 +600,7 @@
@@ -608,7 +609,7 @@ function copyCmd(id, btn) { const text = document.getElementById(id).textContent.trim(); navigator.clipboard.writeText(text).then(() => { const orig = btn.textContent; - btn.textContent = '✓'; + btn.textContent = 'Copied'; btn.classList.add('copied'); setTimeout(() => { btn.textContent = orig; btn.classList.remove('copied'); }, 2000); }); @@ -616,6 +617,6 @@ function copyCmd(id, btn) { - + diff --git a/cezen-portal/agents.html b/cezen-portal/agents.html index 9ada62f..b39d373 100644 --- a/cezen-portal/agents.html +++ b/cezen-portal/agents.html @@ -4,7 +4,7 @@ Agent Studio — Nexus One AI - + @@ -133,6 +134,7 @@ Dashboard Usage Analytics Governance & Audit + Health Center Feedback & Ratings MANAGE / Users @@ -172,7 +174,7 @@
- 🔔 + Basic Tier @@ -190,8 +192,8 @@ - - 🏢 Org-wide view + + Org-wide view
@@ -199,37 +201,37 @@
-
🔢
+
Q
—
Total Queries
-
🪙
+
T
—
Tokens Processed
-
⚡
+
A
—
Avg Response Time
-
👥
+
U
—
Active Users
-
📄
+
D
—
Documents Processed
-
🤖
+
R
—
Agent Runs
@@ -307,72 +309,6 @@ const _API = '/api'; let currentDays = 7; let currentData = null; -/* ── Mock data generator ─────────────────────────────────────────────────── */ -function mockData(days) { - const seed = days * 137; - const rng = (min, max, s=1) => min + Math.abs(Math.sin(seed * s) * (max - min)) | 0; - - const queries = rng(420, 980, 1) * (days / 7); - const tokens = queries * rng(280, 640, 2); - const daily = []; - const today = new Date(); - for (let i = days - 1; i >= 0; i--) { - const d = new Date(today); d.setDate(d.getDate() - i); - const key = d.toISOString().slice(0,10); - const weekday = d.getDay(); - const base = weekday === 0 || weekday === 6 ? rng(8,30,i+3) : rng(40,120,i+3); - daily.push({ day: key, queries: base }); - } - - return { - is_admin: true, - totals: { - total_queries: Math.round(queries), - total_tokens: Math.round(tokens), - avg_duration_ms: rng(820, 2400, 5), - active_users: rng(8, 24, 6), - docs_processed: rng(60, 340, 7), - agent_runs: rng(15, 80, 8), - }, - deltas: { - queries: '+12%', tokens: '+18%', avg: '−4%', users: '+3', docs: '+28%', agents: '+9%' - }, - daily, - models: [ - { model: 'llama3:70b', queries: rng(180, 420, 10) }, - { model: 'mistral:7b', queries: rng(90, 200, 11) }, - { model: 'llava:13b', queries: rng(40, 120, 12) }, - { model: 'codellama:34b', queries: rng(20, 80, 13) }, - { model: 'mixtral:8x7b', queries: rng(10, 50, 14) }, - ], - top_users: [ - { username: 'rajesh.k', queries: rng(80, 180, 20), dept: 'Finance' }, - { username: 'priya.m', queries: rng(60, 130, 21), dept: 'Legal' }, - { username: 'arun.s', queries: rng(40, 100, 22), dept: 'HR' }, - { username: 'deepa.v', queries: rng(30, 80, 23), dept: 'IT' }, - { username: 'kiran.p', queries: rng(20, 60, 24), dept: 'Operations' }, - ], - features: [ - { name: 'Multimodal Chat', icon: '💬', queries: rng(150, 400, 30), color: '#7C3AED' }, - { name: 'Document Intelligence', icon: '📄', queries: rng(80, 200, 31), color: '#EC4899' }, - { name: 'Agent Builder', icon: '🤖', queries: rng(40, 100, 32), color: '#0EA5E9' }, - { name: 'Workflows', icon: '⚙️', queries: rng(20, 80, 33), color: '#10B981' }, - { name: 'Meeting Assistant', icon: '🎙️', queries: rng(15, 60, 34), color: '#F59E0B' }, - { name: 'Knowledge Base', icon: '🧠', queries: rng(10, 40, 35), color: '#6366F1' }, - ], - peak_hours: Array.from({length:24}, (_,h) => { - const isWork = h >= 9 && h <= 18; - const isLunch = h === 13; - return isLunch ? rng(5,15,h+40) : isWork ? rng(20,80,h+40) : rng(0,8,h+40); - }), - token_budget: { - used: Math.round(tokens), - total: 50_000_000, - label: `${(tokens/1_000_000).toFixed(1)}M / 50M tokens` - } - }; -} - /* ── Period ──────────────────────────────────────────────────────────────── */ function setPeriod(days, btn) { currentDays = days; @@ -383,14 +319,19 @@ function setPeriod(days, btn) { /* ── Load ────────────────────────────────────────────────────────────────── */ async function loadAnalytics() { + const notice = document.getElementById('an-notice'); try { const res = await fetch(`${_API}/analytics/summary?days=${currentDays}`, {credentials:'include'}); if (!res.ok) throw new Error(); currentData = await res.json(); + notice.classList.remove('warn'); + render(currentData); } catch(e) { - currentData = mockData(currentDays); + notice.classList.add('warn'); + notice.textContent = "Couldn't reach the API to load usage analytics. The numbers below are not being shown — check API connectivity and reload."; + notice.style.display = ''; + document.getElementById('feature-usage').innerHTML = '
Data unavailable
'; } - render(currentData); } /* ── Render ──────────────────────────────────────────────────────────────── */ @@ -405,10 +346,10 @@ function render(d) { const badge = document.getElementById('scope-badge'); const notice = document.getElementById('an-notice'); if (d.is_admin) { - badge.textContent = '🏢 Org-wide view'; badge.className = 'an-scope-badge admin'; + badge.innerHTML = ' Org-wide view'; badge.className = 'an-scope-badge admin'; notice.style.display = 'none'; } else { - badge.textContent = '👤 My usage'; badge.className = 'an-scope-badge personal'; + badge.textContent = 'My usage'; badge.className = 'an-scope-badge personal'; notice.textContent = 'Showing your personal usage only. Admins see organisation-wide data.'; notice.style.display = ''; } @@ -506,7 +447,7 @@ function renderFeatureUsage(features) { el.innerHTML = features.map(f => { const pct = Math.round((f.queries/max)*100); return `
- ${f.icon||'🔹'} + ${f.icon||''} ${escHtml(f.name)}
${fmt(f.queries)} @@ -590,6 +531,6 @@ window.addEventListener('resize', () => { if(currentData) renderDailyChart(curre - + diff --git a/cezen-portal/api-playground.html b/cezen-portal/api-playground.html index 4a9e219..4e8214f 100644 --- a/cezen-portal/api-playground.html +++ b/cezen-portal/api-playground.html @@ -4,7 +4,7 @@ API Playground — Nexus One AI - + + + + +
+ Nexus One AI + + +
+ +
+
Admin Dashboard
+

Health Center

+

Unified status for every subsystem Nexus One AI depends on — GPU, drivers, CUDA, models, portal, API, scheduler, storage, backup, license, SSL and database.

+
+ +
+ +
+
+
+
Checking system health…
+
Contacting the API
+
+ +
+ + + +
+ +
+ +
+ + + + + + + + diff --git a/cezen-portal/index.html b/cezen-portal/index.html index aaffb33..a84a6d5 100644 --- a/cezen-portal/index.html +++ b/cezen-portal/index.html @@ -4,7 +4,7 @@ Nexus One AI Portal - + @@ -57,6 +57,7 @@ Dashboard Usage Analytics Governance & Audit + Health Center Feedback & Ratings MANAGE / Users @@ -145,7 +146,7 @@
- +
@@ -642,7 +643,7 @@ function renderCards(states) { const state = states[svc.id] || 'checking'; const isUp = state === 'up'; const openBtn = (isUp && svc.openLink) - ? `Open ↗` + ? `Open` : ''; const checking = state === 'checking' ? 'Checking…' @@ -821,7 +822,7 @@ fetchMetrics(); setInterval(fetchMetrics, 30000); - + - + diff --git a/cezen-portal/login.html b/cezen-portal/login.html index 17b1e68..2613d68 100644 --- a/cezen-portal/login.html +++ b/cezen-portal/login.html @@ -4,7 +4,7 @@ Sign In — Nexus One AI - + @@ -137,7 +137,7 @@ @@ -219,6 +219,6 @@ } }); - + diff --git a/cezen-portal/meeting.html b/cezen-portal/meeting.html index eab2f0f..6cc62af 100644 --- a/cezen-portal/meeting.html +++ b/cezen-portal/meeting.html @@ -4,7 +4,7 @@ Meeting Assistant — Nexus One AI - + @@ -181,6 +186,7 @@ Dashboard Usage Analytics Governance & Audit + Health Center Feedback & Ratings MANAGE / Users @@ -220,7 +226,9 @@
- 🔔 + + + Basic Tier @@ -232,13 +240,13 @@
-
🎙️ Audio / Transcript Input
+
Audio / Transcript Input
-
🎧
+
Drop audio file here
MP3, M4A, WAV, OGG, WEBM · up to 500MB
@@ -280,7 +288,7 @@
- +
@@ -299,9 +307,7 @@
- +
@@ -318,17 +324,17 @@
-
⚙️ Processing Meeting…
+
Processing Meeting...
-
🎙️
+
Meeting Assistant
Upload an audio recording or paste a transcript. The AI will extract a summary, decisions, action items, and generate formal minutes — ready to share.
- +
@@ -344,33 +350,33 @@
Export - - - + + +
- - - - - + + + + +
-
📋
Executive Summary
+
Executive Summary
-
🏷️
Key Topics
+
Key Topics
@@ -379,7 +385,7 @@
- ✅ +
Action Items
@@ -400,7 +406,7 @@
-
🏛️
Decisions Made
+
Decisions Made
@@ -409,7 +415,7 @@
- 📜 +
Full Transcript
@@ -422,7 +428,7 @@
-
📄
Formal Meeting Minutes
+
Formal Meeting Minutes
@@ -437,6 +443,20 @@ const _API = '/api'; let attendees = []; let currentResult = null; +function maIconSvg(name, sizeClass = 'icon-sm') { + const icons = { + music:'', + close:'', + user:'', + positive:'', + neutral:'', + concern:'', + negative:'', + mixed:'', + message:'' + }; + return ``; +} // ── Init ─────────────────────────────────────────────────────────────────────── document.getElementById('meeting-date').value = new Date().toISOString().slice(0,10); @@ -458,10 +478,10 @@ function setFile(file) { chip.style.display = 'flex'; chip.innerHTML = `
- 🎵 + ${maIconSvg('music')} ${esc(file.name)} ${(file.size/1024/1024).toFixed(1)} MB - +
`; window._selectedFile = file; // Auto-fill title from filename @@ -491,7 +511,7 @@ function renderAttendees() { document.getElementById('att-chips').innerHTML = attendees.map((a,i) => `
${esc(a)} - +
`).join(''); } @@ -515,7 +535,7 @@ function renderProgress(currentStep) { const activeIdx = STEPS.findIndex(s => s.key === currentStep); document.getElementById('progress-steps').innerHTML = STEPS.map((s,i) => { const cls = i < activeIdx ? 'done' : i === activeIdx ? 'running' : 'pending'; - const dot = i < activeIdx ? '✓' : i === activeIdx ? '⚙' : (i+1); + const dot = i < activeIdx ? 'Done' : i === activeIdx ? '...' : (i+1); return `
${dot}
${s.label}${i === activeIdx ? '…' : ''}
@@ -527,11 +547,11 @@ function renderProgress(currentStep) { async function runMeeting() { const hasPaste = document.getElementById('paste-transcript').value.trim().length > 10; const hasFile = !!window._selectedFile; - if (!hasPaste && !hasFile) { alert('Upload an audio file or paste a transcript first.'); return; } + if (!hasPaste && !hasFile) { showToast('Upload an audio file or paste a transcript first.', 'warn'); return; } const btn = document.getElementById('run-btn'); btn.disabled = true; - btn.textContent = '⚙ Processing…'; + btn.innerHTML = `Processing...`; const opts = { transcript: document.getElementById('opt-transcript').checked, @@ -577,7 +597,7 @@ async function runMeeting() { } btn.disabled = false; - btn.textContent = '✨ Process Meeting'; + btn.innerHTML = `Process Meeting`; } async function runTextPipeline(text, meta, opts) { @@ -643,7 +663,7 @@ function showResult(data, meta) {
${Object.entries(data.sentiment).map(([k,v])=>`
-
${sentimentEmoji(k)}
+
${maIconSvg(sentimentIcon(k), 'icon-lg')}
${Math.round(v*100)}%
${k}
`).join('')} @@ -655,7 +675,7 @@ function showResult(data, meta) { document.getElementById('action-count').textContent = `${actions.length} item${actions.length!==1?'s':''}`; document.getElementById('actions-body').innerHTML = actions.map(a => `
${esc(a.action)}
- ${a.owner ? `👤 ${esc(a.owner)}` : 'Unassigned'} + ${a.owner ? `${maIconSvg('user')} ${esc(a.owner)}` : 'Unassigned'}
${esc(a.due||'—')}
${capitalize(a.priority||'medium')} `).join(''); @@ -894,7 +914,7 @@ function renderHistory() { if (!hist.length) { el.innerHTML = '
No previous meetings
'; return; } el.innerHTML = hist.map((h,i) => `
-
📋
+
${esc(h.title||'Meeting')}
${h.date ? new Date(h.date).toLocaleDateString('en-GB',{day:'numeric',month:'short',year:'numeric'}) : 'Unknown date'}
@@ -918,20 +938,12 @@ function formatTranscript(text) { }).join('\n'); } -function sentimentEmoji(k) { - return {positive:'😊',neutral:'😐',concern:'😟',negative:'😔',mixed:'🤔'}[k]||'💬'; +function sentimentIcon(k) { + return {positive:'positive',neutral:'neutral',concern:'concern',negative:'negative',mixed:'mixed'}[k] || 'message'; } function capitalize(s) { return s ? s[0].toUpperCase()+s.slice(1) : ''; } -function showToast(msg) { - const t = document.createElement('div'); - t.textContent = msg; - t.style.cssText = 'position:fixed;bottom:24px;right:24px;background:#F0FDFA;color:#0F766E;border:1px solid #99F6E4;border-radius:10px;padding:11px 18px;font-size:13px;font-weight:600;z-index:9999;box-shadow:0 4px 16px rgba(0,0,0,.1)'; - document.body.appendChild(t); - setTimeout(()=>t.remove(),2500); -} - function esc(s) { return String(s||'').replace(/&/g,'&').replace(//g,'>').replace(/"/g,'"'); } @@ -941,6 +953,6 @@ renderHistory(); - + diff --git a/cezen-portal/model-compare.html b/cezen-portal/model-compare.html index 8ba7f56..af0d9a8 100644 --- a/cezen-portal/model-compare.html +++ b/cezen-portal/model-compare.html @@ -4,7 +4,7 @@ Model Comparison — Nexus One AI - + - + diff --git a/cezen-portal/rag-quality.html b/cezen-portal/rag-quality.html index 8821cd5..52bcbe8 100644 --- a/cezen-portal/rag-quality.html +++ b/cezen-portal/rag-quality.html @@ -4,7 +4,7 @@ RAG Quality Dashboard — Nexus One AI - + @@ -140,6 +142,7 @@ Dashboard Usage Analytics Governance & Audit + Health Center Feedback & Ratings MANAGE / Users @@ -179,7 +182,9 @@
- 🔔 + + + Basic Tier @@ -190,10 +195,10 @@ @@ -202,15 +207,15 @@
-
⏰
+
Scheduled AI Jobs
Run prompts or agent pipelines automatically on a schedule — every hour, every morning, or on a custom cron. Results are logged and viewable here.
- - - + + +
@@ -227,7 +232,7 @@
-
⚙️ Job Configuration
+
Job Configuration
@@ -260,8 +265,8 @@
- - + +
@@ -328,15 +333,15 @@
- - - + + +
@@ -349,7 +354,7 @@
Run Output - +
@@ -363,6 +368,15 @@ let models = []; let currentJobId = null; let schedType = 'interval'; let pollTimer = null; +function sjIconSvg(name, sizeClass = 'icon-sm') { + const icons = { + robot:'', + chat:'', + play:'', + spinner:'' + }; + return ``; +} // ── Sidebar ─────────────────────────────────────────────────────────────────── async function loadJobList() { @@ -376,7 +390,7 @@ async function loadJobList() { function renderSidebar() { const el = document.getElementById('job-list'); if (!jobs.length) { - el.innerHTML = '
No jobs yet
'; + el.innerHTML = '
No jobs yet — create your first one.
'; return; } el.innerHTML = jobs.map(j => { @@ -387,7 +401,7 @@ function renderSidebar() { ${esc(j.name)}
-
${j.job_type === 'agent' ? '🤖 Agent' : '💬 Prompt'} · ${fmtSched(j)}
+
${j.job_type === 'agent' ? 'Agent' : 'Prompt'} · ${fmtSched(j)}
${nextTxt ? `
${nextTxt}
` : ''}
`; }).join(''); @@ -585,7 +599,7 @@ async function triggerNow() { if (!currentJobId) return; const btn = document.getElementById('trigger-btn'); btn.disabled = true; - btn.textContent = '⏳ Running…'; + btn.innerHTML = `${sjIconSvg('spinner')}Running...`; try { const res = await fetch(`${_API}/schedules/${currentJobId}/run`, { method:'POST', credentials:'include' @@ -599,7 +613,7 @@ async function triggerNow() { alert('Trigger failed: ' + e.message); } btn.disabled = false; - btn.textContent = '▶ Run Now'; + btn.innerHTML = `${sjIconSvg('play')}Run Now`; } // ── Delete ──────────────────────────────────────────────────────────────────── @@ -630,7 +644,7 @@ async function loadHistory(jobId) { countEl.textContent = runs.length ? `(${runs.length} runs)` : ''; if (!runs.length) { - el.innerHTML = '
No runs yet — save the job and click ▶ Run Now to test it
'; + el.innerHTML = '
No runs yet. Save the job and click Run Now to test it.
'; return; } @@ -717,6 +731,6 @@ async function loadAgents() { - + diff --git a/cezen-portal/security.html b/cezen-portal/security.html index 77dbdfd..b3b5bc9 100644 --- a/cezen-portal/security.html +++ b/cezen-portal/security.html @@ -4,7 +4,7 @@ Security & Privacy — Nexus One AI Portal - + @@ -49,6 +49,7 @@ Guardrails Console Governance & Audit + Health Center Feedback & Ratings Settings
@@ -71,7 +72,7 @@
- 🔔 + Basic Tier @@ -87,27 +88,27 @@
-
🔒
+
Lock
Air-Gapped
Operates fully offline
-
🏛️
+
On
On-Premises
Your hardware, your network
-
🚫
+
No
No Cloud
Zero external API calls
-
📁
+
Local
Local Storage
All data stays on your server
-
👤
+
User
Access Control
User login & permissions
@@ -116,7 +117,7 @@
The most important question: where does my data go?
-
🏠
+

Nowhere. It stays on your server.

When you type a prompt, upload a document, or ask the AI a question, that data is processed entirely by the AI model running on your own server — the same server sitting in your data centre or server room. It does not travel to OpenAI, Anthropic, Google, or any other company. It does not touch the internet. The AI model itself is stored locally and runs locally.

@@ -227,8 +228,8 @@ Question - ✅ Nexus One AI (On-Premises) - ⚠️ Cloud AI (ChatGPT, Gemini, etc.) + Nexus One AI (On-Premises) + Cloud AI (ChatGPT, Gemini, etc.) @@ -299,7 +300,7 @@
-
🛡️
+
Support

Security questions or concerns?

If your organisation's security team needs technical documentation, architecture diagrams, or a briefing on the system's security posture, contact Cezen support.

Contact Cezen Support @@ -308,11 +309,11 @@
- + diff --git a/cezen-portal/settings.html b/cezen-portal/settings.html index ccb2c01..ee38868 100644 --- a/cezen-portal/settings.html +++ b/cezen-portal/settings.html @@ -4,7 +4,7 @@ Settings — Nexus One AI - +