Skip to upload

📁 Upload Your Genetic Data

🧬

Drag & drop your raw data file(s) here, or click to browse

Supports: 23andMe (.txt), LivingDNA (.csv) — select multiple files at once for LivingDNA

🔒 Your data is processed securely. We do not share your genetic information with third parties.

🔬 Analysis Results

💬 Ask About Your Results

The AI has full context of your genetic report and can search your raw DNA data. Ask about specific SNPs, genes, health recommendations, drug interactions, lifestyle changes, etc.

🗳 Political Compass Test

Help us explore the link between genetics and political orientation. Take a 3-minute political compass test and your results will be anonymously linked with your genetic analysis.

TAKE THE TEST →

📋 How to Export Your Data

23andMe

  1. Go to 23andme.com → log in
  2. Click Settings (top right menu)
  3. Scroll to 23andMe Data section
  4. Click Download Raw Data
  5. Enter your password, complete verification
  6. Download the .txt file (may take a few minutes to generate)
  7. Upload that file here

LivingDNA

  1. Go to livingdna.com → log in to your account
  2. Navigate to DNA ResultsDownload
  3. Select Raw Data Download
  4. Download the .csv file
  5. Upload that file here

Other Services (AncestryDNA, MyHeritage)

  1. Export your raw data from the service (usually in Settings or DNA section)
  2. The file should be a .txt or .csv with SNP data (rsID, chromosome, position, genotype)
  3. Upload here — we auto-detect the format

🧬 What We Analyze

We screen for 50+ health-relevant SNPs across these categories:

Scroll:
Skip to upload\n' + '

\uD83E\uDDEC GeneAI - Genetic Analysis Report

\n' + '
Generated: ' + new Date().toLocaleString() + (meta ? '
' + meta.replace(/\n' + (isAnalyzing ? '
\u26A0\uFE0F This report was downloaded while analysis was still in progress. It may be incomplete.
\n' : '') + '
' + rendered + '
\n' + '\n' + ''; mime = 'text/html'; filename = getReportFilename('html'); } var blob = new Blob([content], {type: mime + ';charset=utf-8'}); var url = URL.createObjectURL(blob); var a = document.createElement('a'); a.href = url; a.download = filename; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); } // Load SNP grid fetch('/snps').then(function(r){return r.json()}).then(function(data) { var grid = document.getElementById('snpGrid'); var total = 0; Object.keys(data).sort().forEach(function(cat) { var div = document.createElement('div'); div.className = 'snp-cat'; div.innerHTML = '

' + cat + '

'; data[cat].forEach(function(s) { div.innerHTML += '
' + s.rsid + ' ' + s.gene + ' - ' + s.trait + '
'; total++; }); grid.appendChild(div); }); document.getElementById('snpCount').textContent = total; }); // Close modal on overlay click document.getElementById('authModal').addEventListener('click', function(e) { if (e.target === this) closeAuthModal(); }); // Enter key in auth inputs document.getElementById('authPassword').addEventListener('keydown', function(e) { if (e.key === 'Enter') submitAuth(); }); // ============== INIT ============== updateUserUI(); loadHistory(); function reanalyze(uid, filename) { isAnalyzing = true; analyzeBtn.disabled = true; analyzeBtn.textContent = 'ANALYZING...'; scrollControlEl.classList.add('visible'); userScrolledUp = false; smartScrollPaused = false; lastHeaderCount = 0; lastContentLen = 0; updateScrollIndicator(); updateDlButtons(); setStatus('Re-analyzing ' + filename + '...', 'info'); results.style.display = 'none'; analysisText.innerHTML = ''; progressSteps = {}; var modelKey = document.getElementById('modelSelect').value; fetch('/api/reanalyze/' + uid, { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({session_id: getSession(), model: modelKey}) }).then(function(resp) { if (!resp.ok) { return resp.json().then(function(err) { throw new Error(err.error || 'Reanalyze failed'); }); } var reader = resp.body.getReader(); var decoder = new TextDecoder(); var buffer = ''; var fullText = ''; window._geneaiFullText = ''; results.style.display = 'block'; function read() { reader.read().then(function(result) { if (result.done) { isAnalyzing = false; analyzeBtn.disabled = false; analyzeBtn.textContent = 'ANALYZE GENOME'; stopStatusUpdates(); if (!document.querySelector('.status.success')) setStatus('Analysis complete.', 'success'); showChat(); chatHistory = []; loadHistory(); updateDlButtons(); return; } buffer += decoder.decode(result.value, {stream: true}); var lines = buffer.split('\n'); buffer = lines.pop(); lines.forEach(function(line) { if (!line.startsWith('data: ')) return; try { var data = JSON.parse(line.substring(6)); if (data.type === 'meta') { setStatus('Analyzing ' + data.health_snps + ' health SNPs from ' + data.total_snps.toLocaleString() + ' total (' + data.format + ') using ' + friendlyModel(data.model) + '...', 'info'); startStatusUpdates(); resultsMeta.innerHTML = 'Format: ' + data.format + '' + 'Total SNPs: ' + data.total_snps.toLocaleString() + '' + 'Health SNPs: ' + data.health_snps + '' + 'Model: ' + friendlyModel(data.model) + ''; } else if (data.type === 'text') { fullText += data.content; window._geneaiFullText = fullText; analysisText.innerHTML = renderWithThinking(fullText) + ''; updateDlButtons(); smartScroll(); } else if (data.type === 'done') { analysisText.innerHTML = renderWithThinking(fullText); isAnalyzing = false; updateDlButtons(); stopStatusUpdates(); setStatus('Analysis complete.', 'success'); showChat(); chatHistory = []; analyzeBtn.disabled = false; analyzeBtn.textContent = 'ANALYZE GENOME'; loadHistory(); } else if (data.type === 'error') { isAnalyzing = false; stopStatusUpdates(); setStatus('Error: ' + data.content, 'error'); analyzeBtn.disabled = false; analyzeBtn.textContent = 'ANALYZE GENOME'; updateDlButtons(); } } catch(e) {} }); read(); }); } read(); }).catch(function(err) { isAnalyzing = false; setStatus('Error: ' + err.message, 'error'); analyzeBtn.disabled = false; analyzeBtn.textContent = 'ANALYZE GENOME'; updateDlButtons(); }); } // ============== CHAT ============== var chatHistory = []; var chatBusy = false; function showChat() { document.getElementById('chatSection').classList.add('visible'); } function addChatMsg(role, content) { var msgs = document.getElementById('chatMessages'); var div = document.createElement('div'); div.className = 'chat-msg ' + (role === 'user' ? 'user' : 'ai'); div.innerHTML = role === 'ai' ? formatMarkdown(content) : escapeHtml(content); msgs.appendChild(div); msgs.scrollTop = msgs.scrollHeight; return div; } function sendChat() { if (chatBusy) return; var input = document.getElementById('chatInput'); var msg = input.value.trim(); if (!msg) return; input.value = ''; input.style.height = 'auto'; addChatMsg('user', msg); chatHistory.push({role: 'user', content: msg}); chatBusy = true; document.getElementById('chatSend').disabled = true; var aiDiv = addChatMsg('ai', ''); aiDiv.innerHTML = 'Thinking...'; var reportText = window._geneaiFullText || ''; var modelKey = document.getElementById('chatModelSelect').value; // RAG: search user's SNP data for relevant terms before chatting fetch('/api/snp-search', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({ session_id: getSession(), query: msg }) }).then(function(r) { return r.json().catch(function() { return {results:[]}; }); }) .then(function(ragData) { var snpContext = ''; if (ragData.results && ragData.results.length > 0) { snpContext = '\n\nSNP search results from user raw data:\n'; ragData.results.forEach(function(s) { snpContext += s.rsid + ' (' + (s.gene || 'unknown gene') + ') = ' + s.genotype + (s.trait ? ' -- ' + s.trait : '') + '\n'; }); } return fetch('/api/chat', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({ model: modelKey, report: reportText, history: chatHistory, session_id: getSession(), snp_context: snpContext }) }); }).then(function(resp) { if (!resp.ok) throw new Error('Chat request failed'); var reader = resp.body.getReader(); var decoder = new TextDecoder(); var buffer = ''; var fullReply = ''; function readChat() { reader.read().then(function(result) { if (result.done) { chatHistory.push({role: 'assistant', content: fullReply}); chatBusy = false; document.getElementById('chatSend').disabled = false; document.getElementById('chatInput').focus(); return; } buffer += decoder.decode(result.value, {stream: true}); var lines = buffer.split('\n'); buffer = lines.pop(); lines.forEach(function(line) { if (!line.startsWith('data: ')) return; try { var data = JSON.parse(line.substring(6)); if (data.type === 'text') { fullReply += data.content; aiDiv.innerHTML = renderWithThinking(fullReply); var msgs = document.getElementById('chatMessages'); msgs.scrollTop = msgs.scrollHeight; } else if (data.type === 'done') { aiDiv.innerHTML = renderWithThinking(fullReply); } } catch(e) {} }); readChat(); }); } readChat(); }).catch(function(err) { aiDiv.innerHTML = 'Error: ' + escapeHtml(err.message) + ''; chatBusy = false; document.getElementById('chatSend').disabled = false; }); }