import { useState, useEffect } from 'react'; import Sidebar from './components/Sidebar'; import QueryPanel from './components/QueryPanel'; import { getStatus } from './api/client'; export default function App() { const [status, setStatus] = useState(null); const [accessToken, setAccessToken] = useState(null); const [showPrivacyInfo, setShowPrivacyInfo] = useState(false); const fetchStatus = async () => { try { const data = await getStatus(); setStatus(data); } catch (err) { console.error('Failed to fetch status:', err); } }; useEffect(() => { fetchStatus(); }, []); return (
{/* Left: App title */}

RAG Document Assistant

Search your documents with AI

{/* Right: Zero Storage Badge with Tooltip */}
{/* Privacy Info Dropdown */} {showPrivacyInfo && ( <>
setShowPrivacyInfo(false)} />

How Your Privacy Is Protected

  • No server storage - Your documents are never stored on our servers
  • Embeddings only - Text is converted to mathematical vectors, then immediately purged
  • Query-time re-fetch - Text is retrieved fresh from YOUR Dropbox for each search
  • LLM processing - Your text is sent to AI models for answer generation (not stored)
  • You control access - Disconnect Dropbox anytime to revoke all access
Embeddings cannot be reversed to reconstruct your original text.
)}
); }