feat: Passwordless cross-device authentication

- Arkitektur: docs/auth/passwordless-architecture.md
- Backend: iom/quixzoom-auth-service/ (FastAPI + Redis)
- Webb: quixzoom-market-pages/se/login/ (QR-kod + polling)
- App: iom/quixzoom-app/src/features/auth/ (push + deep links)

Flöde: QR-kod → app-godkännande → webb-inloggad
This commit is contained in:
Bernt
2026-07-07 07:11:50 +00:00
parent 4aa984ad74
commit 6989a98d75
61843 changed files with 5491611 additions and 872231 deletions
@@ -124,7 +124,7 @@
background: #e94560;
color: white;
padding: 1rem 2rem;
border-radius: 8px;
border-radius: var(--radius-md);
text-decoration: none;
font-weight: 600;
margin: 0.5rem;
@@ -177,7 +177,7 @@
.feature-card {
background: white;
padding: 2rem;
border-radius: 12px;
border-radius: var(--radius-md);
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}
.feature-card h3 {
@@ -194,7 +194,7 @@
margin-bottom: 1.5rem;
padding: 1.5rem;
background: #f8f9fa;
border-radius: 8px;
border-radius: var(--radius-md);
}
.faq-item h3 {
color: #1a1a2e;
@@ -356,73 +356,73 @@
<tbody>
<tr class="highlight">
<td><strong>AI-Powered Analysis</strong></td>
<td class="check"> Full AI orchestration</td>
<td class="cross"> Basic photo tagging</td>
<td class="cross"> None</td>
<td class="cross"> Manual only</td>
<td class="check"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Full AI orchestration</td>
<td class="cross"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Basic photo tagging</td>
<td class="cross"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> None</td>
<td class="cross"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Manual only</td>
</tr>
<tr>
<td><strong>Video Capture Quality</strong></td>
<td class="check"> 4K/8K video</td>
<td class="check"> Photos only</td>
<td class="cross"> Varies</td>
<td class="cross"> Paper/photos</td>
<td class="check"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> 4K/8K video</td>
<td class="check"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Photos only</td>
<td class="cross"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Varies</td>
<td class="cross"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Paper/photos</td>
</tr>
<tr class="highlight">
<td><strong>Predictive Scoring (0-100)</strong></td>
<td class="check"> Automated</td>
<td class="cross"> Manual</td>
<td class="cross"> None</td>
<td class="cross"> None</td>
<td class="check"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Automated</td>
<td class="cross"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Manual</td>
<td class="cross"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> None</td>
<td class="cross"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> None</td>
</tr>
<tr>
<td><strong>Real-time Intelligence</strong></td>
<td class="check"> Live updates</td>
<td class="cross"> Batch processing</td>
<td class="cross"> Delayed</td>
<td class="cross"> Weeks delay</td>
<td class="check"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Live updates</td>
<td class="cross"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Batch processing</td>
<td class="cross"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Delayed</td>
<td class="cross"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Weeks delay</td>
</tr>
<tr class="highlight">
<td><strong>Contradiction Detection</strong></td>
<td class="check"> AI-powered</td>
<td class="cross"> None</td>
<td class="cross"> None</td>
<td class="cross"> Manual review</td>
<td class="check"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> AI-powered</td>
<td class="cross"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> None</td>
<td class="cross"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> None</td>
<td class="cross"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Manual review</td>
</tr>
<tr>
<td><strong>GPS & Metadata</strong></td>
<td class="check"> Automatic</td>
<td class="check"> Basic GPS</td>
<td class="cross"> Limited</td>
<td class="cross"> Manual entry</td>
<td class="check"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Automatic</td>
<td class="check"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Basic GPS</td>
<td class="cross"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Limited</td>
<td class="cross"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Manual entry</td>
</tr>
<tr class="highlight">
<td><strong>Deployment Speed</strong></td>
<td class="check"> 24-72 hours</td>
<td class="cross"> 2-4 weeks</td>
<td class="cross"> 1-2 weeks</td>
<td class="cross"> Months</td>
<td class="check"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> 24-72 hours</td>
<td class="cross"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> 2-4 weeks</td>
<td class="cross"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> 1-2 weeks</td>
<td class="cross"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Months</td>
</tr>
<tr>
<td><strong>Knowledge Graph</strong></td>
<td class="check"> Built-in</td>
<td class="cross"> None</td>
<td class="cross"> None</td>
<td class="cross"> Spreadsheets</td>
<td class="check"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Built-in</td>
<td class="cross"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> None</td>
<td class="cross"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> None</td>
<td class="cross"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Spreadsheets</td>
</tr>
<tr class="highlight">
<td><strong>Active Learning (RALE)</strong></td>
<td class="check"> Continuous improvement</td>
<td class="cross"> Static models</td>
<td class="cross"> None</td>
<td class="cross"> N/A</td>
<td class="check"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Continuous improvement</td>
<td class="cross"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Static models</td>
<td class="cross"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> None</td>
<td class="cross"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> N/A</td>
</tr>
<tr>
<td><strong>Multi-source Capture</strong></td>
<td class="check"> Mobile, drone, body cam, vehicle</td>
<td class="cross"> Mobile only</td>
<td class="cross"> Varies</td>
<td class="cross"> Manual only</td>
<td class="check"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Mobile, drone, body cam, vehicle</td>
<td class="cross"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Mobile only</td>
<td class="cross"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Varies</td>
<td class="cross"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 4L12 12M12 4L4 12" stroke="#ef4444" stroke-width="2" stroke-linecap="round"/></svg> Manual only</td>
</tr>
</tbody>
</table>
@@ -434,27 +434,27 @@
<h2 class="section-title">Why LandveX RIOS Leads in 2026</h2>
<div class="features-grid">
<div class="feature-card">
<h3>🎯 AI Orchestration Engine</h3>
<h3> AI Orchestration Engine</h3>
<p>Every observation enters an orchestration engine that decides which specialist models execute. Scene classification, object detection, semantic segmentation, depth estimation, OCR, risk detection — all automated.</p>
</div>
<div class="feature-card">
<h3>📊 Predictive Scoring 0-100</h3>
<h3> Predictive Scoring 0-100</h3>
<p>LandveX reduces complex physical reality into a single comparable score. Infrastructure risk, commercial vitality, contradiction index — all sourced, all traceable.</p>
</div>
<div class="feature-card">
<h3>🔄 Continuous Learning (RALE)</h3>
<h3><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M2 8C2 11.3 4.7 14 8 14C10.5 14 12.7 12.5 13.7 10.3" stroke="#666" stroke-width="1.5" stroke-linecap="round"/><path d="M14 8C14 4.7 11.3 2 8 2C5.5 2 3.3 3.5 2.3 5.7" stroke="#666" stroke-width="1.5" stroke-linecap="round"/><path d="M13.5 7.5L14 10L11.5 9.5" stroke="#666" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M2.5 8.5L2 6L4.5 6.5" stroke="#666" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg> Continuous Learning (RALE)</h3>
<p>The system never asks unnecessary questions. Every human interaction maximizes future AI performance. Questions generated only when expected learning value exceeds threshold.</p>
</div>
<div class="feature-card">
<h3>🌍 100+ Cities Coverage</h3>
<h3> 100+ Cities Coverage</h3>
<p>Launching across 20+ countries from August 2026. No local staffing or coordination infrastructure required. Stockholm to Singapore, same rigour.</p>
</div>
<div class="feature-card">
<h3> 24-72 Hour Delivery</h3>
<h3><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M9 2L5 9H8L7 14L11 7H8L9 2Z" fill="#f59e0b"/></svg> 24-72 Hour Delivery</h3>
<p>From mission creation to structured data delivery in 24 to 72 hours. No lengthy procurement cycles. Real intelligence, real speed.</p>
</div>
<div class="feature-card">
<h3>🔗 Knowledge Graph</h3>
<h3> Knowledge Graph</h3>
<p>Every confirmed observation updates assets, relationships, ownership, condition, maintenance history. Reality itself becomes a continuously indexed database.</p>
</div>
</div>